/* Navish Ops — maroon and gold, IBM Plex for data, Instrument Serif for headings.
   Mono is used for anything countable: bed codes, dates, money. The sidebar
   wordmark is the hostel's own logo file (assets/logo/), not live text, so
   its brand typography travels with the image rather than a web font. */

/* --maroon is THE brand red - default to it for anything bold: buttons,
   filled/selected states, active-nav highlights, big numbers. --maroon-deep
   only for two specific jobs: the hover/pressed state of something already
   --maroon, and small-scale text accents (mono labels, sort-header hover,
   table-row highlight text) where full-strength red would be too loud.
   When in doubt, --maroon - it's the one used everywhere staff actually
   looks (buttons, active states), so an unsure pick should match that, not
   the muted one. Getting this backwards is what put --maroon-deep, the
   hover shade, into the date picker's "selected day" as if it were the
   base color - see datepicker.js's .dp-sel. */
:root{
  --ink:#1E0E10; --maroon:#E10000; --maroon-deep:#990000; --gold:#C8A24A;
  --sand:#F2EBDF; --paper:#FBF8F2; --line:#DED2BE; --line-soft:#EDE4D5;
  --green:#2E6B4F; --amber:#B57A16; --slate:#8A8378; --slate-deep:#5C5648;

  --fill-booked:#F5DCDE; --fill-inhouse:#DCEAE1; --fill-departed:#E9E5DC; --fill-cxl:#F0EDE6;
  --we:#E9DEC9; --we-soft:#FAF6EC;

  --row-h:36px;
  --r:6px;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--paper); color:var(--ink);
  /* SF Pro Rounded isn't a font file Apple licenses for embedding - `ui-rounded`
     is the standards-track generic name that resolves to it natively on
     Safari and Chrome/Edge on macOS & iOS. Everywhere else (Windows, Linux,
     older browsers - this app ships a run-windows.bat, so that's a real
     audience, not a hypothetical) it's simply ignored and falls through to
     the system UI font, then back to the original IBM Plex Sans stack. */
  font-family:ui-rounded,-apple-system,BlinkMacSystemFont,'SF Pro Rounded',
    'IBM Plex Sans',system-ui,sans-serif;
  font-size:14px; line-height:1.45; -webkit-font-smoothing:antialiased;
}
.mono{font-family:'IBM Plex Mono',ui-monospace,Menlo,monospace}
.muted{color:var(--slate)}
.sm{font-size:11.5px}
.sub{font-size:11px;color:var(--slate)}
.wide{max-width:74ch}
.r{text-align:right}

/* ---------- shell ---------- */
.shell{display:flex;min-height:100vh}
/* Rail background matches the main page (--paper) rather than standing apart
   in dark maroon - the red is reserved for the current-page highlight, so it
   still reads as "you are here" rather than being just decorative chrome. */
.rail{width:196px;flex:0 0 196px;background:var(--paper);color:var(--ink);
  border-right:1px solid var(--line);position:relative;
  padding:20px 0 24px;display:flex;flex-direction:column;
  transition:width .16s ease,flex-basis .16s ease}
.rail-toggle{position:absolute;top:18px;right:-11px;width:22px;height:22px;border-radius:50%;
  border:1px solid var(--line);background:#fff;color:var(--maroon-deep);cursor:pointer;
  display:flex;align-items:center;justify-content:center;font-size:12px;line-height:1;
  padding:0;z-index:5;transition:transform .16s ease}
.rail-toggle:hover{background:var(--sand)}

.brand{padding:0 20px 16px;border-bottom:1px solid var(--line)}
/* Two different logo files, not one image resized: the full lockup (boat +
   wordmark) reads fine at rail width but its "HOSTEL" line and underline
   would blur into mush at 40px, and the circular token loses its own
   wordmark entirely if stretched wide - so each state gets the file actually
   drawn for that shape, and only one is ever in the document flow at once. */
.brand-full{display:block;width:100%;height:auto}
.brand-icon{display:none}
.brand .sub{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--slate);margin-top:10px}

nav{padding:14px 10px;flex:1}
nav button{display:flex;align-items:center;gap:10px;width:100%;background:none;border:0;
  cursor:pointer;padding:9px 12px;margin-bottom:1px;border-radius:var(--r);
  color:var(--ink);font:inherit;font-size:12.5px;text-align:left;white-space:nowrap;
  text-transform:uppercase;letter-spacing:.04em}
nav button:hover{background:var(--sand)}
nav button.on{background:var(--maroon);color:#fff}
nav button .icon{flex:0 0 auto;width:18px;height:18px;line-height:0}
nav button .icon svg{width:100%;height:100%;display:block}
.rail .foot{padding:0 20px;font-size:10.5px;color:var(--slate);line-height:1.5}
main{flex:1;min-width:0;padding:26px 30px 60px}

/* -- folded rail: icon only, top-left -- */
.rail.folded{width:64px;flex:0 0 64px}
.rail.folded .brand{padding:0 0 16px;display:flex;justify-content:center}
.rail.folded .brand-full{display:none}
.rail.folded .brand-icon{display:block;width:40px;height:40px}
.rail.folded .brand .sub,
.rail.folded nav button .label,.rail.folded .foot{display:none}
.rail.folded nav button{justify-content:center;padding:10px 0}
.rail.folded .rail-toggle{transform:rotate(180deg)}

.head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;
  flex-wrap:wrap;margin-bottom:20px}
.head h2{font-family:'IBM Plex Mono',monospace;font-weight:600;font-size:26px;margin:0;
  line-height:1;text-transform:uppercase;letter-spacing:.01em}
.eyebrow{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.17em;
  text-transform:uppercase;color:var(--slate);margin-bottom:7px}
/* Today's date, moved out of the eyebrow slot and onto the title's own
   line (.head's flex row + align-items:flex-end already sits it there) -
   big enough to read at a glance, not a caption anymore. */
.head-date{font-family:'IBM Plex Mono',monospace;font-size:22px;font-weight:600;
  letter-spacing:.01em;text-transform:uppercase;color:var(--ink);line-height:1}
/* Bed Board puts the eyebrow under the title instead of above it - flip the
   margin only for that ordering, so every other page's eyebrow-first layout
   (Bookings, Rooms, Data, Today) keeps its own spacing untouched. */
.head h2 + .eyebrow{margin-top:7px;margin-bottom:0}

/* ---------- controls ---------- */
.btn{font:inherit;font-size:13px;cursor:pointer;border-radius:var(--r);padding:7px 14px;
  border:1px solid var(--maroon);background:var(--maroon);color:#fff;
  text-transform:uppercase;letter-spacing:.03em}
.btn:hover{background:var(--maroon-deep);border-color:var(--maroon-deep)}
.btn.ghost{background:transparent;color:var(--maroon)}
.btn.ghost:hover{background:var(--sand)}
.btn.quiet{background:transparent;color:var(--slate);border-color:var(--line)}
.btn.quiet:hover{background:var(--sand);color:var(--ink)}
.btn.quiet.on{background:var(--maroon);border-color:var(--maroon);color:#fff}
.btn:disabled{opacity:.4;cursor:not-allowed}
.btn:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,
nav button:focus-visible,.roomrow:focus-visible,[data-open]:focus-visible{
  outline:2px solid var(--gold);outline-offset:1px}

input,select,textarea{font:inherit;font-size:13.5px;color:var(--ink);background:#fff;
  border:1px solid var(--line);border-radius:var(--r);padding:7px 9px;width:100%}
/* Placeholder text (e.g. "As written on the booking") defaulted to a color
   close enough to --ink that it read as already-typed content, not a hint.
   Muted and italic so an empty field never looks filled in. */
input::placeholder,textarea::placeholder{color:var(--slate);opacity:.75;font-style:italic}
/* Amount/Prepaid/Collected are type=number for numeric-keyboard-on-mobile
   and browser validation, not for the spin buttons - those render at a
   different width depending on browser/hover state, which is exactly what
   threw the three boxes out of alignment with each other. Typing is the
   only intended way to change these. */
input[type=number]{-moz-appearance:textfield}
input[type=number]::-webkit-outer-spin-button,
input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
/* Every date field in the app opens datepicker.js's shared calendar
   popover on click rather than being typed into - readonly, plus a
   calendar glyph so it reads as a picker trigger, not a stray locked
   field. */
.date-field{cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238A8378' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='3'/%3E%3Cpath d='M3 9h18M8 2v4M16 2v4'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 8px center;background-size:15px;padding-right:30px}
.date-field:disabled{cursor:default;opacity:.6}
label.f,div.f{display:block;margin-bottom:12px}
label.f>span,div.f>span{display:block;font-family:'IBM Plex Mono',monospace;font-size:9.5px;
  letter-spacing:.13em;text-transform:uppercase;color:var(--slate);margin-bottom:5px}
label.f>span.strong,div.f>span.strong{font-weight:700;color:var(--ink)}
/* Themed replacement for a bare <input type=file> - the native control is
   visually hidden (not display:none, or label-click-to-open and keyboard
   focus both stop working in some browsers) and driven entirely through
   its <label>, so a click anywhere in the pill opens the file dialog with
   no JS needed. app.js's delegated change listener keeps .file-name in
   sync with whatever got picked. */
.file-field{display:flex;align-items:stretch;border:1px solid var(--line);
  border-radius:var(--r);overflow:hidden;cursor:pointer;background:#fff}
.file-field input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.file-field .file-btn{flex:0 0 auto;background:var(--maroon);color:#fff;font:inherit;
  font-size:12.5px;font-weight:600;padding:7px 12px;text-transform:uppercase;
  letter-spacing:.03em;white-space:nowrap}
.file-field:hover .file-btn{background:var(--maroon-deep)}
.file-field .file-name{flex:1;min-width:0;padding:7px 10px;font-size:12.5px;color:var(--slate);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-self:center}
.file-field.has-file .file-name{color:var(--ink)}
.file-field.disabled{cursor:not-allowed;opacity:.55}
/* Passport photo row: the file picker and the manager-only "view" button
   share one line instead of stacking, so the button reads as an action on
   the field next to it rather than a trailing element of its own. */
.photo-row{display:flex;gap:8px}
.photo-row .file-field{flex:1;min-width:0}
.photo-row .btn{flex:0 0 auto}
.hintline{font-size:11.5px;color:var(--slate);margin:-6px 0 12px}
/* Overrides label.f's block-with-full-width-input layout, which is right
   for text/select fields but would stretch a checkbox to the full row
   width and pad it like a text input otherwise. */
label.f.chk{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink)}
/* Nationality search box: a positioned wrapper so the suggestion list can
   drop below it without disturbing the form's own layout/height. */
label.f.combo{position:relative}
.combo-list{position:absolute;top:100%;left:0;right:0;z-index:10;background:#fff;
  border:1px solid var(--line);border-top:0;border-radius:0 0 var(--r) var(--r);
  max-height:180px;overflow:auto;box-shadow:0 4px 10px rgba(0,0,0,.1)}
.combo-opt{padding:6px 9px;font-size:12.5px;cursor:pointer}
.combo-opt:hover{background:var(--sand)}
.combo-empty{padding:6px 9px;font-size:12.5px;color:var(--slate)}
label.f.chk input[type=checkbox]{width:auto;padding:0;accent-color:var(--maroon)}
.row{display:grid;gap:12px}
.r2{grid-template-columns:1fr 1fr}
.r3{grid-template-columns:1fr 1fr 1fr}
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.toolbar .sp{flex:1}
.toolbar input,.toolbar select{width:auto;min-width:130px}

/* ---------- cards & stats ---------- */
.card{background:#fff;border:1px solid var(--line-soft);border-radius:var(--r);padding:18px}
.card.flush{padding:0;overflow:auto;max-height:70vh}
.card h3{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.15em;
  text-transform:uppercase;color:var(--slate-deep);margin:0 0 12px;font-weight:500}
.card h3.lg{font-size:14px;letter-spacing:.08em}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;
  margin-bottom:22px}
.stat{background:#fff;padding:15px 16px;border:1px solid var(--line-soft);border-radius:var(--r)}
.stat .lbl{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--slate-deep);font-weight:600}
.stat .val{font-family:'IBM Plex Mono',monospace;font-size:25px;font-weight:500;
  margin-top:6px;letter-spacing:-.02em}
.stat .val.sm{font-size:20px}
.stat .val small{font-size:13px;color:var(--slate-deep);font-weight:400}
.stat .note{font-size:11.5px;color:var(--slate-deep);margin-top:3px}
.stat.accent .val{color:var(--maroon)}
/* Its own modifier, not a reuse of the generic .warn banner class - .warn
   carries its own padding/margin sized for an inline form message, which
   fought with .stat's own box model and threw this one card out of line
   with its siblings. Same tan/amber treatment, none of that baggage. */
.stat.stat-warn{background:#FBF0D8;border-color:#E8D097}
.stat.stat-warn .val{color:var(--amber)}

/* ---------- Front Desk page (Today) ---------- */
/* A dedicated .fd- namespace rather than reusing .stats/.stat/table.list -
   those are shared with the Numbers and Bookings pages, and this redesign
   (icon-badge stats, card-style list rows) is scoped to Front Desk only;
   touching the shared classes would have restyled pages nobody asked to
   change. Icon glyphs come from icons.js - .ic sizes/colors whatever glyph
   it's given via currentColor, so one icon definition works in every tint. */
.ic{display:inline-flex;flex:0 0 auto;line-height:0}
.ic svg{width:100%;height:100%;display:block}

.fd-head{display:flex;align-items:center;justify-content:space-between;gap:16px;
  flex-wrap:wrap;margin-bottom:22px}
.fd-head h2{font-family:ui-rounded,-apple-system,'SF Pro Rounded','IBM Plex Sans',sans-serif;
  font-weight:700;font-size:26px;margin:0;letter-spacing:-.01em;color:var(--ink);
  text-transform:none}
.fd-date{display:flex;align-items:center;gap:8px;font-family:'IBM Plex Mono',monospace;
  font-size:13px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--slate-deep)}
.fd-date .ic{width:17px;height:17px;color:var(--slate)}

/* -- icon badges: a tinted circle behind any glyph, color set by a modifier
   class so the same badge markup works for every stat/section header. -- */
.fd-icon{display:flex;align-items:center;justify-content:center;flex:0 0 auto;
  width:42px;height:42px;border-radius:50%}
.fd-icon .ic{width:21px;height:21px}
.fd-icon.red{background:var(--fill-booked);color:var(--maroon)}
.fd-icon.slate{background:var(--line-soft);color:var(--slate-deep)}
.fd-icon.green{background:var(--fill-inhouse);color:var(--green)}
.fd-icon.amber{background:#FBF0D8;color:var(--amber)}

/* align-items:stretch (grid's own default) already equalizes every card's
   OUTER box to the row's tallest, but that alone left the three cards
   without a progress bar looking bottom-misaligned against the one that
   has it (their content simply ran shorter). Fixed at the source instead:
   views.js's stat() always renders the .fd-stat-track div for every card,
   just empty for the three with no percentage to show - so every card has
   the identical stack of elements (icon row, value, note, track) and takes
   the identical natural height, no flexbox/auto-margin trick required.
   :empty only drops the visible bar color, not the space it occupies. */
.fd-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;
  margin-bottom:16px;align-items:stretch}
.fd-stat{background:#fff;border:1px solid var(--line-soft);border-radius:14px;
  padding:16px 18px 15px;overflow:hidden}
.fd-stat-row{display:flex;align-items:center;gap:11px;margin-bottom:13px}
.fd-stat-row .fd-icon{width:36px;height:36px}
.fd-stat-row .fd-icon .ic{width:18px;height:18px}
.fd-stat-lbl{font-family:'IBM Plex Mono',monospace;font-size:19px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--slate-deep);font-weight:600}
.fd-stat-val{font-family:'IBM Plex Mono',monospace;font-size:26px;font-weight:600;
  letter-spacing:-.02em;color:var(--ink)}
.fd-stat-val.sm{font-size:21px}
.fd-stat-val small{font-size:13px;color:var(--slate-deep);font-weight:400}
.fd-stat-note{font-size:11.5px;color:var(--slate-deep);margin-top:2px}
/* fd-stat-warn, not the bare .warn class (an unrelated inline-banner style
   defined later in this file, see the "drawer" section) - .fd-stat and
   .warn are both single-class selectors, so with equal specificity the
   later one in source order was silently winning and clobbering this
   card's padding/border-radius/background with the banner's own values,
   which is what threw its whole box height off from the other three
   cards. Scoped compound class instead, same fix as .stat.stat-warn
   already uses for this exact collision on the Numbers page. */
.fd-stat.fd-stat-warn{background:#FBF0D8;border-color:#E8D097}
.fd-stat.fd-stat-warn .fd-stat-val{color:var(--amber)}
.fd-stat-track{height:3px;background:var(--line-soft);border-radius:2px;margin-top:13px}
.fd-stat-track:empty{background:none}
.fd-stat-fill{height:100%;background:var(--maroon);border-radius:2px}

/* -- rate card: one card per rate type/channel, each listing every room's
   rate stacked inside it (see rates.js's viewRatesSection()) -- */
.ratecard{margin-top:16px;border-radius:14px;padding:20px 22px}
.ratecard-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px}
.ratecard-head h3{margin:0;font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:600;
  letter-spacing:.13em;text-transform:uppercase;color:var(--ink)}
.ratecard-head .err{margin:0 0 0 12px;flex:1}
.ratecard-note{margin-top:16px;color:var(--slate)}
.ratetype-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px}
.ratetype-card{border:1px solid var(--line-soft);border-radius:10px;padding:14px 16px 16px}
.ratetype-head{display:flex;align-items:center;justify-content:space-between;gap:8px;
  font-family:'IBM Plex Mono',monospace;font-size:10.5px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink);padding-bottom:12px}
.ratetype-head .ic{width:16px;height:16px}
.ratetype-head .ic.muted{color:var(--slate)}
.ratetype-div{border-top:1px solid var(--line-soft);margin:10px 0}
.ratetype-room-lbl{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--slate);margin-bottom:5px}
.ratetype-room-val{font-family:'IBM Plex Mono',monospace;font-size:19px;font-weight:600;
  color:var(--ink);letter-spacing:-.01em}
.ratetype-room-val .muted{font-family:inherit;font-size:12px;font-weight:400}
.ratecell-input{width:100%;font-size:16px;font-weight:600;padding:6px 8px}

/* -- Arrivals / In house / Departures cards -- */
.fd-lists{margin-top:16px}
.fd-listcard{background:#fff;border:1px solid var(--line-soft);border-radius:14px;
  padding:18px 18px 16px;display:flex;flex-direction:column}
.fd-listcard-head{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.fd-listcard-head .fd-icon{width:34px;height:34px}
.fd-listcard-head .fd-icon .ic{width:17px;height:17px}
.fd-listcard-head h3{margin:0;font-family:ui-rounded,-apple-system,'SF Pro Rounded','IBM Plex Sans',sans-serif;
  font-size:14.5px;font-weight:700;color:var(--ink);text-transform:none}
.fd-rows{display:flex;flex-direction:column;gap:9px}
.fd-row{display:block;width:100%;text-align:left;background:none;border:1px solid var(--line-soft);
  border-radius:10px;padding:11px 12px;cursor:pointer;font:inherit;color:inherit}
.fd-row:hover{background:#FCFAF6;border-color:var(--line)}
.fd-row-top{display:flex;align-items:center;justify-content:space-between;gap:10px}
.fd-row-name{font-weight:600;font-size:13px;color:var(--ink)}
.fd-row-sub{font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:var(--slate);margin-top:5px}
.fd-row-tags{display:flex;align-items:center;gap:6px;margin-top:8px;flex-wrap:wrap}
.fd-viewall{display:flex;align-items:center;gap:4px;justify-content:center;margin-top:14px;
  padding-top:2px;font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:600;
  letter-spacing:.04em;text-transform:uppercase;color:var(--maroon);background:none;border:0;
  cursor:pointer;width:100%}
.fd-viewall:hover{color:var(--maroon-deep)}
.fd-viewall .ic{width:13px;height:13px}
.fd-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:26px 10px;min-height:150px}
.fd-empty .fd-icon{width:56px;height:56px;margin-bottom:12px}
.fd-empty .fd-icon .ic{width:27px;height:27px}
.fd-empty p{margin:0;color:var(--slate);font-size:12.5px;max-width:20ch}

/* ---------- board ---------- */
/* Three-plus separate <table>s (head, availability bar, one per room card)
   stacked in one scrolling container. They stay column-aligned because
   board.js gives every one of them the identical <colgroup> and inline
   width, not because anything syncs them at runtime — see board.js. */
.wrap{overflow:auto;border-radius:var(--r);background:var(--paper);max-height:80vh;padding:2px 0 4px}
.wrap table{border-collapse:separate;border-spacing:0;font-size:11.5px;table-layout:fixed}
/* table-layout:fixed is inert unless the table has a width — board.js sets it inline,
   and <colgroup> pins each column. Without both, long nowrap names widen columns. */
.wrap th,.wrap td{padding:0;overflow:hidden;
  border-right:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft)}

/* td.bedcol,th.bedcol (not plain .bedcol): needs to tie .wrap th/.wrap td's
   specificity (element+class) to actually win the padding via source order -
   a bare class selector loses that tie-break and silently renders at 0
   padding despite this rule, which is exactly what was happening to
   td.availlbl (no third, more-specific rule to rescue it the way
   td.bedlbl's own padding-left already did for bed-code cells).
   Not horizontally sticky: the board is desktop-only for now, sized to fit
   the viewport width (see computeBoardDays in app.js), so there's normally
   nothing to scroll sideways through in the first place. If mobile support
   comes back and the table can genuinely overflow horizontally again, this
   needs `position:sticky;left:0` restored here (and see .roomrow's own
   comment below for its half of the same tradeoff). */
td.bedcol,th.bedcol{background:#fff;padding:0 10px;
  text-align:left;white-space:nowrap;border-right:1px solid var(--line)}
thead .bedcol{background:var(--paper)}
/* The corner header cell shows the date range (with paging arrows) instead
   of the word "Bed" - two stacked lines with a divider so it fits BED_W
   without needing to widen that column. */
.hrange{display:flex;align-items:center;justify-content:center;gap:10px;width:100%}
.hrange-dates{display:flex;flex-direction:column;align-items:center;min-width:0;
  background:none;border:none;padding:2px 6px;border-radius:var(--r);cursor:pointer;font:inherit}
.hrange-dates:hover{background:var(--paper)}
.hrange-dates span{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:500;
  color:var(--maroon-deep);letter-spacing:.01em;line-height:1.5;white-space:nowrap}
.hrange-dates span:first-child{border-bottom:1px solid var(--line);margin-bottom:1px}

/* -- shared date header, its own table so it stays put while cards scroll --
   The table itself is sticky, not just its <th> cells: this table only ever
   contains a <thead> (no body rows), so it's ~64px tall on its own. Sticky
   on the th alone gets bounded by that tiny table as its containing block
   and stops working the moment you scroll past 64px - it needs to be the
   TABLE that sticks to .wrap's top so the th's have something tall enough
   to stick within. (The classic "sticky thead th" pattern works because
   thead and tbody normally share one tall table; here they're deliberately
   separate tables, so that assumption doesn't hold.) */
/* Rounds only its TOP corners, not all four - table.boardavail sits flush
   underneath it (no gap) to form what reads as one combined header unit,
   and a fully-rounded boardhead would round ITS bottom corners too, right
   above boardavail's own square top corners: two mismatched curves stacked
   at the same seam, which is exactly the "two borders, only one rounded"
   look. Squaring off the shared seam on both sides (see table.boardavail's
   matching top-corner reset below) makes the pair read as a single rounded
   card instead.
   overflow:hidden is the other half of this fix, at EVERY corner (not just
   the shared seam): with border-collapse:separate, a table's border-radius
   only bends the outer 1px border STROKE - it does nothing to the actual
   cell backgrounds underneath (th.bedcol's own background, .we's tint,
   etc.), which stay sharp rectangles and visibly poke past the curve at
   each corner unless something clips them. overflow:hidden makes the table
   itself that clip boundary. Safe with position:sticky here specifically
   because the overflow lives ON the sticky element, not on an ancestor of
   it - it's an ancestor's overflow that breaks sticky, not its own. */
table.boardhead{position:sticky;top:0;z-index:4;border:1px solid var(--line);
  border-radius:var(--r) var(--r) 0 0;background:var(--paper);overflow:hidden}
table.boardhead th{background:var(--paper);
  font-family:'IBM Plex Mono',monospace;font-weight:500;font-size:9px;letter-spacing:.05em;
  text-transform:uppercase;color:var(--maroon-deep);padding:7px 2px 8px;text-align:center;
  line-height:1.25;border-bottom:1px solid var(--line)}
table.boardhead th .dd{display:block;margin-top:4px}
table.boardhead th .dnum{display:inline-flex;align-items:center;justify-content:center;
  width:21px;height:21px;border-radius:50%;font-family:'IBM Plex Sans',sans-serif;
  font-size:12.5px;font-weight:600;color:var(--ink);letter-spacing:0;text-transform:none}
table.boardhead th.we{background:var(--we)}
table.boardhead th.today .dnum{background:var(--maroon);color:#fff}

/* Rounded-rect, not circle: a circular hover fill around a glyph this small
   claims a lot more visual real estate than the glyph itself needs. Stays
   transparent in both states - hover reads via the arrow itself darkening,
   not a background fill - so there's no shape at all until you look for it. */
.arrow{width:20px;height:22px;padding:0;border:0;background:transparent;color:var(--maroon);
  border-radius:5px;font-size:14px;line-height:1;display:flex;align-items:center;justify-content:center;
  cursor:pointer}
.arrow:hover:not(:disabled){color:var(--maroon-deep)}
.arrow:disabled{opacity:.3;cursor:not-allowed}

tr.bedrow{height:var(--row-h)}
/* Extra left indent (on top of .bedcol's own 10px) so a bed code reads as
   nested under its room name above, rather than flush with the left edge
   like a heading of its own. */
td.bedlbl{font-family:'IBM Plex Mono',monospace;font-size:10.5px;padding-left:20px}
td.bedlbl .pos{color:var(--slate);font-size:9px;margin-left:7px}

/* -- one bordered, rounded card per room --
   Border AND rounding live on .roomrow and .roomtbl directly, not on
   .roomcard itself, for two independent reasons: (1) a wrapping border here
   would sit outside .roomtbl and shift its left edge by the border width,
   breaking pixel alignment with .boardhead/.boardavail; (2) .roomcard must
   never get `overflow` set to anything but visible - overflow:hidden here
   silently breaks position:sticky on .roomrow below (top:81px) and on
   every .bedcol inside .roomtbl, because it becomes a new "nearest
   scrolling ancestor" that those sticky elements latch onto instead of
   .wrap, even though .roomcard itself never actually scrolls.
   Cost 30 minutes to find once; don't reintroduce it. */
.roomcard{background:#fff;border-radius:var(--r);margin:10px 0}
/* .roomrow is the full WIDTH (same as .roomtbl below it) so its colored bar
   covers every column - and, being desktop-only-sized to fit the viewport
   (see computeBoardDays in app.js), that full width is normally also the
   entire visible area, so a plain (non-horizontally-sticky) flex row here
   already keeps the room name on screen without any extra trick. It only
   needs to stick vertically: top so the name stays readable while its beds
   scroll past underneath - releasing automatically once the card scrolls
   out, since it's bounded by its own containing block, .roomcard, no JS
   needed. top is header height + the "available" bar height stacked below
   it (see table.boardhead / table.boardavail) - measured, not guessed; if
   either of those change height, this has to move with them.
   (This used to need a second, narrower "-inner" wrapper with its own
   `position:sticky;left:0` so the name could slide within the full-width
   bar as you scrolled sideways - removed along with the rest of the
   horizontal-scroll machinery now that the board doesn't need it. If
   mobile support brings horizontal overflow back, that wrapper is the
   piece to reintroduce, the same way .bedcol's own comment describes for
   the bed-code column.) */
.roomrow{cursor:pointer;background:var(--sand);border:1px solid var(--line);border-bottom:0;
  border-radius:var(--r) var(--r) 0 0;position:sticky;top:81px;z-index:3;
  display:flex;align-items:center;gap:9px;padding:9px 12px}
.roomrow:hover{background:var(--we-soft)}
.roomrow .cv{width:10px;flex:0 0 auto;color:var(--maroon);font-size:9px}
.roomrow .rc-name{font-weight:600;font-size:13px;color:var(--ink);white-space:nowrap}
.roomrow .rc-meta{font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:var(--slate);white-space:nowrap}
.roomrow .rc-chip{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--maroon-deep);
  background:#fff;border:1px solid var(--line);border-radius:999px;padding:3px 10px;
  white-space:nowrap}
/* Left-aligned, not pushed to the far edge with margin-left:auto: .roomrow is as wide
   as the full date range, same as .roomtbl beneath it, which on a narrow window (or a
   phone, if the rail's mobile stack ever gets an occupancy view) can still run wider
   than the screen - right-aligning here would put the chip/tag off in that overflow
   instead of next to the name where it's always visible. */
/* overflow:hidden for the same reason as table.boardhead/boardavail above:
   .wrap table{border-collapse:separate} (this table included) means its own
   cells - the last bed row, the AVAILABLE row's tinted backgrounds - paint
   as sharp rectangles that ignore this table's own border-radius unless
   something clips them. Safe on the table itself, unlike on .roomcard (see
   that class's own comment) - this table has no sticky descendants of its
   own to break. */
table.roomtbl{background:#fff;border:1px solid var(--line);border-top:0;
  border-radius:0 0 var(--r) var(--r);overflow:hidden}

td.n{text-align:center;color:#DAD0BE;font-family:'IBM Plex Mono',monospace}
td.n.we{background:var(--we-soft)}
td.pip{padding:0}
td.pip.we{background:var(--we-soft)}
.pipbar{height:9px;margin:4px 3px;border-radius:2px;background:var(--line-soft)}
.pipbar.f{background:var(--maroon)}
.pipbar.h{background:var(--green)}

td.blk{padding:0 7px;text-align:left;cursor:pointer;
  border-top:2px solid transparent;border-bottom:2px solid transparent}
td.blk:hover{filter:brightness(.955)}
/* Only a not-yet-arrived (status Booked) block is draggable - see board.js.
   grab/grabbing overrides the plain pointer cursor .blk gets by default. */
td.blk.movable{cursor:grab}
td.blk.movable:active{cursor:grabbing}
td.blk.dragging{opacity:.35}
/* Highlighted while a drag is over it - JS only ever adds this to a row in
   the SAME room as the drag's source (see app.js dragover), so its mere
   presence already means "this bed, this room, would work". A soft tinted
   band across the row plus a slim top/bottom accent line, not a dashed box
   around every individual cell - reads as one continuous target, and the
   background transition makes it track the mouse smoothly instead of
   snapping cell to cell. */
tr.drop-ok td{background:rgba(46,107,79,.1);
  border-top:1.5px solid var(--green);border-bottom:1.5px solid var(--green);
  transition:background .12s ease}
tr.drop-ok td.bedcol{background:rgba(46,107,79,.16)}
/* Keeping a long booking bar's name visible while scrolling past its start
   is handled in JS (app.js stickyNames()), not CSS position:sticky - sticky
   inside a colspan'd <td> turned out to size and position inconsistently
   between rows (measured: some cells landed at their natural position,
   others partway across, others at the fully-stuck offset, with no CSS
   difference between them) rather than a browser-support gap, so it wasn't
   safe to build on. A `transform: translateX()` recomputed on scroll has no
   such ambiguity - it's just arithmetic. */
.nm{font-weight:600;font-size:11px;display:inline-block;max-width:100%;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1}
td.st-Booked{background:var(--fill-booked);border-top-color:var(--maroon)}
td.st-In-house{background:var(--fill-inhouse);border-top-color:var(--green)}
td.st-Departed{background:var(--fill-departed);border-top-color:var(--slate)}
td.st-Cancelled,td.st-No-show{background:var(--fill-cxl);border-top-color:var(--line);color:var(--slate)}
td.st-Cancelled .nm,td.st-No-show .nm{text-decoration:line-through}
.pre{color:var(--slate);font-weight:400;font-size:9px}

.dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle;
  box-sizing:content-box}
.dot.p{background:var(--green)}
/* Not-collected needs to catch the eye more than paid does - money still owed
   is the thing worth noticing at a glance, so it gets a halo on top of the
   same inset white ring (kept for contrast against the colored booking-block
   backgrounds it sits on), not just the same-weight dot as .p.
   The halo is a real `border`, not a `box-shadow` spread: .nm (the name
   label it sits inside) needs `overflow:hidden` for its own ellipsis
   truncation, which clips anything a box-shadow paints outside the box's
   own edges - a border doesn't have that problem, since it's part of the
   element's actual layout box rather than painted beyond it. */
.dot.u{background:var(--maroon);background-clip:padding-box;
  border:3px solid rgba(225,0,0,.32);box-shadow:0 0 0 1px #fff inset}

/* -- "available" row: one property-wide bar right under the date header,
   plus the same row shape reused as the last row of every room card's own
   table, so free-bed count is visible both at a glance and per room without
   scrolling to a footer. */
table.boardavail{position:sticky;top:54px;z-index:3;border:1px solid var(--line);
  border-top:0;border-radius:0 0 var(--r) var(--r);margin-bottom:4px;overflow:hidden}
tr.availrow{height:26px;border-top:1px solid var(--line)}
tr.availrow td{background:#FCFAF6;font-family:'IBM Plex Mono',monospace;text-align:center;
  font-size:11px;color:var(--slate)}
tr.availrow td.we{background:#F8F3E8}
tr.availrow td.availlbl{text-align:left;font-size:9px;letter-spacing:.12em;text-transform:uppercase;
  background:var(--paper);color:var(--maroon-deep)}

.legend{display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--slate);margin-top:11px}
.legend .sw{display:inline-block;width:11px;height:11px;border-radius:2px;margin-right:5px;
  vertical-align:-1px;border:1px solid rgba(0,0,0,.09)}
.legend .sw.dep{background:var(--fill-departed)}
.legend .sw.inh{background:var(--fill-inhouse)}
.legend .sw.bkd{background:var(--fill-booked)}

/* ---------- lists ---------- */
table.list{width:100%;border-collapse:collapse;font-size:13px;background:#fff}
table.list th{text-align:left;font-family:'IBM Plex Mono',monospace;font-weight:500;font-size:9.5px;
  letter-spacing:.12em;text-transform:uppercase;color:var(--slate);padding:9px 10px;
  border-bottom:1px solid var(--line);background:var(--sand);position:sticky;top:0}
table.list th[data-sort]{cursor:pointer;user-select:none;white-space:nowrap}
table.list th[data-sort]:hover{color:var(--maroon-deep)}
table.list td{padding:9px 10px;border-bottom:1px solid var(--line-soft);vertical-align:top}
table.list tr[data-open]{cursor:pointer}
table.list tr:hover td{background:#FCFAF6}
table.list td.num{font-family:'IBM Plex Mono',monospace;text-align:right;white-space:nowrap}
.tag{display:inline-block;font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.06em;
  padding:2px 6px;border-radius:2px;white-space:nowrap;background:var(--sand);
  color:var(--maroon-deep);border:1px solid var(--line)}
.tag.g{background:var(--fill-inhouse);border-color:#BFD6C7;color:var(--green)}
.tag.a{background:#FBF0D8;border-color:#E8D097;color:var(--amber)}
.tag.r{background:var(--fill-booked);border-color:#E2BEC2;color:var(--maroon)}
.tag.s{background:var(--fill-departed);color:var(--slate)}

.bars{display:flex;flex-direction:column;gap:9px}
.bar{display:grid;grid-template-columns:104px 1fr 92px;align-items:center;gap:10px;font-size:12.5px}
.bar .t{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--slate);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bar .track{background:var(--sand);height:15px;border-radius:2px;overflow:hidden}
.bar .fill{height:100%;background:var(--maroon)}
.bar .fill.g{background:var(--gold)}
.bar .v{font-family:'IBM Plex Mono',monospace;text-align:right;font-size:11.5px}

.empty{text-align:center;padding:70px 20px;border:1px dashed var(--line);
  border-radius:var(--r);background:#fff}
.empty h4{font-family:'Instrument Serif',serif;font-weight:400;font-size:22px;margin:0 0 8px}
.empty p{color:var(--slate);margin:0 0 16px}

/* ---------- rooms manager ---------- */
.roomsmgr{display:grid;grid-template-columns:220px 1fr;gap:20px;align-items:start}
.roomsmgr-list{display:flex;flex-direction:column;gap:6px}
.roomsmgr-item{border:1px solid var(--line);border-radius:var(--r);padding:9px 11px;
  cursor:pointer;background:#fff}
.roomsmgr-item:hover{background:var(--sand)}
.roomsmgr-item.on{border-color:var(--maroon);background:var(--fill-booked)}
.roomsmgr-item.archived{opacity:.6}
.roomsmgr-item.archived.on{opacity:1}
.rmi-name{font-weight:600;font-size:13px}
.rmi-meta{font-family:'IBM Plex Mono',monospace;font-size:10.5px;color:var(--slate);margin-top:2px}
.roomsmgr-form{min-height:260px}
.roomsmgr-form h3{font-family:'Instrument Serif',Georgia,serif;font-weight:400;font-size:20px;
  text-transform:none;letter-spacing:0;color:var(--ink);margin-bottom:16px}
.bedrow-edit{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.bedrow-edit .bedcode{flex:0 0 34px;font-size:11px;color:var(--maroon-deep);
  background:var(--sand);border-radius:var(--r);padding:6px 0;text-align:center}
.bedrow-edit input{flex:1}
@media(max-width:820px){.roomsmgr{grid-template-columns:1fr}}

/* ---------- drawer ---------- */
.scrim{position:fixed;inset:0;background:rgba(30,14,16,.42);z-index:40;display:none}
.scrim.on{display:block}
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(470px,100vw);background:var(--paper);
  border-left:1px solid var(--line);z-index:50;transform:translateX(100%);
  transition:transform .22s ease;display:flex;flex-direction:column}
.drawer.on{transform:translateX(0)}
@media(prefers-reduced-motion:reduce){.drawer{transition:none}}
.drawer .dh{padding:18px 22px;border-bottom:1px solid var(--line);display:flex;
  align-items:center;justify-content:space-between;background:#fff}
.drawer .dh h3{font-family:'Instrument Serif',serif;font-size:23px;margin:0;font-weight:400}
.drawer .db{padding:20px 22px;overflow:auto;flex:1}
.drawer .df{padding:14px 22px;border-top:1px solid var(--line);background:#fff;
  display:flex;gap:8px;justify-content:flex-end}
.x{background:none;border:0;font-size:22px;cursor:pointer;color:var(--slate);line-height:1;padding:0 4px}
.x:hover{color:var(--ink)}

.bedpick{display:flex;flex-wrap:wrap;gap:5px}
.bedpick label{font-family:'IBM Plex Mono',monospace;font-size:11px;cursor:pointer;
  border:1px solid var(--line);border-radius:var(--r);padding:5px 8px;background:#fff;
  display:flex;align-items:center;gap:5px}
.bedpick label.sel{background:var(--maroon);color:#fff;border-color:var(--maroon)}
.bedpick label.busy{opacity:.34;cursor:not-allowed;text-decoration:line-through}
.bedpick input{width:auto;margin:0;display:none}
.roomlbl{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--slate);margin:12px 0 6px}

.grow{border:1px solid var(--line);border-radius:var(--r);padding:12px 12px 2px;margin-bottom:10px;background:var(--paper)}
.grow.noshow{background:var(--sand)}
.grow.noshow .gwho{color:var(--slate)}
.grow.noshow input:disabled,.grow.noshow select:disabled{opacity:.5}
.gwho{font-family:'IBM Plex Mono',monospace;font-size:10px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--maroon-deep);margin-bottom:8px}

.calc{background:var(--sand);border:1px solid var(--line);border-radius:var(--r);
  padding:12px 14px;margin:14px 0}
.calc div{display:flex;justify-content:space-between;font-family:'IBM Plex Mono',monospace;
  font-size:12px;padding:2.5px 0}
.calc div.tot{border-top:1px solid var(--line);margin-top:6px;padding-top:7px;
  font-weight:600;font-size:13.5px}
.calc span.k{color:var(--slate)}

.warn{background:#FBF0D8;border:1px solid #E8D097;color:#7A5310;padding:9px 11px;
  border-radius:var(--r);font-size:12.5px;margin-bottom:12px}
.err{background:var(--fill-booked);border:1px solid #E2BEC2;color:var(--maroon-deep);
  padding:9px 11px;border-radius:var(--r);font-size:12.5px;margin-bottom:12px}

/* ---------- hover card ---------- */
#pop{position:fixed;z-index:70;pointer-events:none;opacity:0;background:#fff;
  border:1px solid var(--line);border-radius:var(--r);box-shadow:0 6px 22px rgba(30,14,16,.16);
  padding:11px 13px;min-width:214px;max-width:280px;transition:opacity .09s ease}
#pop.on{opacity:1}
/* .bookingcard reuses this same read-only content in the Board/Today
   Details view (see drawer.js's openDetails()) - shared rules, not
   duplicated ones, so the click-details and hover-preview never drift. */
#pop .pg, .bookingcard .pg{font-family:'Instrument Serif',Georgia,serif;font-size:18px;line-height:1.15;
  margin-bottom:2px;word-break:break-word}
#pop .pc, .bookingcard .pc{font-family:'IBM Plex Mono',monospace;font-size:9.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--slate);margin-bottom:9px}
#pop dl, .bookingcard dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:3px 12px;
  font-size:11.5px;align-items:baseline}
#pop dt, .bookingcard dt{color:var(--slate);white-space:nowrap}
#pop dd, .bookingcard dd{margin:0;font-family:'IBM Plex Mono',monospace;text-align:right}
#pop .sep, .bookingcard .sep{grid-column:1/-1;border-top:1px solid var(--line-soft);margin:5px 0 2px}
#pop .owe, .bookingcard .owe{color:var(--amber);font-weight:600}
#pop .set, .bookingcard .set{color:var(--green)}
#pop .nt, .bookingcard .nt{grid-column:1/-1;color:var(--slate);font-size:11px;text-align:left;
  font-family:'IBM Plex Sans',sans-serif;margin-top:5px;font-style:italic}

/* ---------- calendar-month date picker ---------- */
#datepicker{position:fixed;z-index:71;opacity:0;pointer-events:none;background:#fff;
  border:1px solid var(--line-soft);border-radius:20px;box-shadow:0 12px 32px rgba(30,14,16,.18);
  padding:18px 20px 12px;width:296px;transition:opacity .09s ease,transform .09s ease;
  transform:translateY(-2px)}
#datepicker.on{opacity:1;pointer-events:auto;transform:translateY(0)}
.dp-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.dp-title{font-family:'IBM Plex Sans',sans-serif;font-size:16px;font-weight:600;color:var(--ink)}
.dp-navs{display:flex;gap:2px}
.dp-arrow{background:none;border:none;cursor:pointer;font-size:17px;line-height:1;
  color:var(--maroon);width:26px;height:26px;border-radius:50%}
.dp-arrow:hover{background:var(--sand);color:var(--maroon-deep)}
.dp-grid{border-collapse:collapse;width:100%}
.dp-grid th{font-family:'IBM Plex Sans',sans-serif;font-size:10.5px;font-weight:600;
  color:var(--slate);text-transform:uppercase;letter-spacing:.03em;padding:0 0 8px;width:36px}
.dp-grid td{padding:2px 0;text-align:center}
.dp-grid button{width:34px;height:34px;border:none;background:none;border-radius:50%;
  font-family:'IBM Plex Sans',sans-serif;font-size:13.5px;color:var(--ink);cursor:pointer}
.dp-grid button:hover:not(:disabled){background:var(--sand)}
.dp-grid button:disabled{color:var(--line);cursor:default}
.dp-grid button.dp-today{color:var(--maroon);font-weight:700}
.dp-grid button.dp-sel{background:var(--maroon);color:#fff;font-weight:600}
.dp-grid button.dp-sel:hover:not(:disabled){background:var(--maroon-deep)}
.dp-foot{margin-top:8px;display:flex;align-items:center;border-top:1px solid var(--line-soft);
  padding-top:8px}
.dp-foot-sp{flex:1}
.dp-todaybtn{background:none;border:none;cursor:pointer;font-family:'IBM Plex Sans',sans-serif;
  font-size:12.5px;font-weight:600;color:var(--slate);padding:7px 10px;border-radius:var(--r)}
.dp-todaybtn:hover{background:var(--sand);color:var(--ink)}
.dp-textbtn{background:none;border:none;cursor:pointer;font-family:'IBM Plex Sans',sans-serif;
  font-size:12.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  color:var(--slate);padding:7px 10px;border-radius:var(--r)}
.dp-textbtn:hover{background:var(--sand);color:var(--ink)}
.dp-textbtn.dp-ok{color:var(--maroon)}
.dp-textbtn.dp-ok:hover{color:var(--maroon-deep)}

@media(max-width:820px){
  .shell{flex-direction:column}
  .rail,.rail.folded{width:100%;flex:none;padding-bottom:10px}
  nav{display:flex;flex-wrap:wrap;padding:10px}
  nav button{width:auto}
  .rail .foot{display:none}
  main{padding:20px 16px 50px}
  .r2,.r3{grid-template-columns:1fr}
  /* Folding is a desktop-rail concept - below this width the rail already
     collapses to a horizontal bar, so there's no vertical space to reclaim
     and no "top-left" for a folded icon to live in. A folded state carried
     over (via localStorage) from a wider screen still needs to show
     everything here, not stay stuck icon-only. */
  .rail-toggle{display:none}
  .rail.folded .brand-full{display:block;width:160px}
  .rail.folded .brand-icon{display:none}
  .rail.folded .brand .sub,
  .rail.folded nav button .label{display:block}
}
