/* ==========================================================================
   typography.css — TheGuestDesk typography system
   --------------------------------------------------------------------------
   Purpose
   -------
   One place that decides every font family, font size, weight and line-height
   in the app, so the sidebar, page headers, cards, tables, forms and buttons
   all read at consistent sizes (the way YouTube Studio does it).

   Why this file exists
   --------------------
   Today font sizes are set ad-hoc per view with inline `style="font-size: ..."`
   attributes, a handful of `fs-*` theme utilities, and `!important` overrides
   in generatebill.css / app.blade.php. That is what makes things look uneven.

   Current status
   --------------
   SECTION 8 (sidebar) is LIVE: typography.css is linked in
   layouts/app.blade.php, so the left rail already follows these tokens.
   Everything else in this file is opt-in and still inactive — linking it
   changes nothing except the sidebar.

   How to apply more of it later
   -----------------------------
   1. It is already linked AFTER theme.min.css and custom.css, so it sits last
      in the cascade and wins ties by load order. Keep it there.
   2. Two ways to apply the rest:
      a) Opt-in per element: add `tg-` role classes in markup, e.g.
             <h5 class="card-title tg-card-title">Filters</h5>
             <span class="tg-caption">Narrow down the invoice list below.</span>
      b) App-wide switch: add `tg-type` to <body> in layouts/app.blade.php.
         That maps the tokens onto the existing theme markup (sidebar, cards,
         tables, forms, buttons, footer) in one shot — see SECTION 8.
   3. Change sizes in ONE place: the role tokens in SECTION 4. Any element
      using the matching class follows automatically.

   Naming
   ------
   Everything is namespaced `tg-` (TheGuestDesk) so it can never collide with
   the theme's own `fs-*`, `font-*` utilities or Bootstrap classes.

   Note on !important
   ------------------
   Exactly one declaration in the live rules uses `!important`: the form label
   size. The theme itself ships `.form-label { font-size: 1rem !important }`,
   and a normal declaration cannot beat that. The old `!important` form sizes in
   custom.css, generatebill.css and the inline <style> in app.blade.php have all
   been removed, so form sizes now come from SECTION 9 alone.

   TABLE OF CONTENTS
   -----------------
   1. Font families
   2. Type scale (px-derived rem steps)
   3. Weights, line-heights, tracking
   4. Semantic role tokens        <-- tune sizes here
   5. Size / family / weight utilities
   6. Role classes (use in markup)
   7. Component helpers (stat, summary, table, form, badges)
   8. Sidebar — LIVE now
   9. Forms — LIVE now
  10. App-wide opt-in for everything else (body.tg-type)
  11. Responsive scale-down
  12. Migration notes (commented)
   ========================================================================== */


/* ==========================================================================
   1. FONT FAMILIES
   Inter is the theme's own body font (see theme.scss `$font-inter`), so it
   stays the base. Keep the stacks in one variable each so a future font swap
   is a one-line change.
   ========================================================================== */
:root {
  --tg-font-sans: "Inter", system-ui, -apple-system, "Segoe UI", Roboto,
    "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif,
    "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  --tg-font-heading: var(--tg-font-sans);
  --tg-font-mono: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
    "Courier New", monospace;
  --tg-font-numeric: var(--tg-font-sans);
}


/* ==========================================================================
   2. TYPE SCALE
   Hardware-like steps (10 / 11 / 12 / 13 / 14 / 15 / 16 / 18 / 20 / 24 ...).
   rem is relative to the browser's 16px default, so 0.875rem = 14px.
   ========================================================================== */
:root {
  --tg-fs-10: 0.625rem;   /* 10px */
  --tg-fs-11: 0.6875rem;  /* 11px */
  --tg-fs-12: 0.75rem;    /* 12px */
  --tg-fs-13: 0.8125rem;  /* 13px */
  --tg-fs-14: 0.875rem;   /* 14px */
  --tg-fs-15: 0.9375rem;  /* 15px */
  --tg-fs-16: 1rem;       /* 16px */
  --tg-fs-18: 1.125rem;   /* 18px */
  --tg-fs-20: 1.25rem;    /* 20px */
  --tg-fs-22: 1.375rem;   /* 22px */
  --tg-fs-24: 1.5rem;     /* 24px */
  --tg-fs-28: 1.75rem;    /* 28px */
  --tg-fs-32: 2rem;       /* 32px */
}


/* ==========================================================================
   3. WEIGHTS, LINE-HEIGHTS, TRACKING
   ========================================================================== */
:root {
  --tg-fw-regular: 400;
  --tg-fw-medium: 500;
  --tg-fw-semibold: 600;
  --tg-fw-bold: 700;

  --tg-lh-tight: 1.2;     /* large headings, stat numbers */
  --tg-lh-snug: 1.35;     /* card/section titles */
  --tg-lh-normal: 1.5;    /* sidebar, buttons, forms */
  --tg-lh-relaxed: 1.6;   /* body copy */

  --tg-ls-none: 0;
  --tg-ls-caps: 0.05em;   /* ALL-CAPS labels */
  --tg-ls-wide: 0.08em;   /* tiny uppercase captions */
}


/* ==========================================================================
   4. SEMANTIC ROLE TOKENS  <-- change sizes HERE, not in the rules below
   Every role class in SECTION 6/7 just points at these.
   ========================================================================== */
:root {
  /* --- Page / layout chrome --- */
  --tg-text-page-title: var(--tg-fs-22);
  --tg-text-breadcrumb: var(--tg-fs-13);
  --tg-text-footer: var(--tg-fs-12);

  /* --- Sidebar (like YouTube Studio's left rail) — LIVE, see SECTION 8 ---
     custom.css used to force 1rem here. Dropped one step so the rail stops
     out-sizing the page content. To restore the old 1rem rail, change the
     first line to var(--tg-fs-16). */
  --tg-text-nav-link: var(--tg-fs-14);
  --tg-text-nav-submenu: var(--tg-fs-13);
  --tg-text-nav-caption: var(--tg-fs-11);
  --tg-fw-nav-link: var(--tg-fw-medium); /* theme shipped 600; 500 reads lighter */

  /* --- Headings / content --- */
  --tg-text-section-title: var(--tg-fs-20); /* "Customer Details", "Extras" */
  --tg-text-card-title: var(--tg-fs-20);    /* card headers */
  --tg-text-subsection-title: var(--tg-fs-15);
  --tg-text-body: var(--tg-fs-14);          /* default content text */
  --tg-text-body-sm: var(--tg-fs-13);
  --tg-text-caption: var(--tg-fs-12);       /* helper + muted text */
  --tg-text-micro: var(--tg-fs-11);         /* "Optional", tiny hints */

  /* --- Forms --- */
  --tg-text-label: var(--tg-fs-13);
  --tg-text-input: var(--tg-fs-14);
  --tg-text-input-sm: var(--tg-fs-14);
  --tg-text-help: var(--tg-fs-12);
  --tg-text-select: var(--tg-fs-14);

  /* --- Tables --- */
  --tg-text-table-head: var(--tg-fs-12);
  --tg-text-table-cell: var(--tg-fs-14);

  /* --- Buttons / badges / icons --- */
  --tg-text-btn: var(--tg-fs-14);
  --tg-text-btn-sm: var(--tg-fs-13);
  --tg-text-badge: var(--tg-fs-12);
  --tg-text-icon: var(--tg-fs-16);

  /* --- Numbers / money --- */
  --tg-text-stat-value: var(--tg-fs-24);    /* dashboard stat number */
  --tg-text-stat-label: var(--tg-fs-12);    /* dashboard stat label */
  --tg-text-summary-row: var(--tg-fs-14);   /* Bill Summary lines */
  --tg-text-summary-total: var(--tg-fs-18); /* Grand Total line */
}


/* ==========================================================================
   5. UTILITIES
   Size, family and weight helpers. Use these in markup instead of inline
   `style="font-size: 0.875rem"`. No !important — they lose to nothing and
   read naturally in the cascade.
   ========================================================================== */

/* --- family --- */
.tg-font-sans    { font-family: var(--tg-font-sans); }
.tg-font-heading { font-family: var(--tg-font-heading); }
.tg-font-mono    { font-family: var(--tg-font-mono); }
.tg-font-numeric { font-family: var(--tg-font-numeric); font-variant-numeric: tabular-nums; }

/* --- size (matches the scale names) --- */
.tg-fs-10 { font-size: var(--tg-fs-10); }
.tg-fs-11 { font-size: var(--tg-fs-11); }
.tg-fs-12 { font-size: var(--tg-fs-12); }
.tg-fs-13 { font-size: var(--tg-fs-13); }
.tg-fs-14 { font-size: var(--tg-fs-14); }
.tg-fs-15 { font-size: var(--tg-fs-15); }
.tg-fs-16 { font-size: var(--tg-fs-16); }
.tg-fs-18 { font-size: var(--tg-fs-18); }
.tg-fs-20 { font-size: var(--tg-fs-20); }
.tg-fs-22 { font-size: var(--tg-fs-22); }
.tg-fs-24 { font-size: var(--tg-fs-24); }
.tg-fs-28 { font-size: var(--tg-fs-28); }
.tg-fs-32 { font-size: var(--tg-fs-32); }

/* --- weight --- */
.tg-fw-regular  { font-weight: var(--tg-fw-regular); }
.tg-fw-medium   { font-weight: var(--tg-fw-medium); }
.tg-fw-semibold { font-weight: var(--tg-fw-semibold); }
.tg-fw-bold     { font-weight: var(--tg-fw-bold); }

/* --- line-height --- */
.tg-lh-tight   { line-height: var(--tg-lh-tight); }
.tg-lh-snug    { line-height: var(--tg-lh-snug); }
.tg-lh-normal  { line-height: var(--tg-lh-normal); }
.tg-lh-relaxed { line-height: var(--tg-lh-relaxed); }

/* --- tracking --- */
.tg-ls-caps { letter-spacing: var(--tg-ls-caps); }
.tg-ls-wide { letter-spacing: var(--tg-ls-wide); }


/* ==========================================================================
   6. ROLE CLASSES
   Point-and-shoot semantic classes. Example:
       <h5 class="card-title tg-card-title">Invoice Report</h5>
       <p class="tg-caption">A complete record of all generated invoices.</p>
   ========================================================================== */

/* --- page chrome --- */
.tg-page-title { font-family: var(--tg-font-heading); font-size: var(--tg-text-page-title); font-weight: var(--tg-fw-bold); line-height: var(--tg-lh-tight); }
.tg-breadcrumb { font-size: var(--tg-text-breadcrumb); font-weight: var(--tg-fw-medium); }

/* --- sidebar --- */
.tg-sidebar-link    { font-family: var(--tg-font-sans); font-size: var(--tg-text-nav-link); font-weight: var(--tg-fw-nav-link); line-height: var(--tg-lh-normal); }
.tg-sidebar-submenu { font-size: var(--tg-text-nav-submenu); font-weight: var(--tg-fw-medium); }
.tg-sidebar-caption { font-size: var(--tg-text-nav-caption); font-weight: var(--tg-fw-semibold); line-height: var(--tg-lh-normal); text-transform: uppercase; letter-spacing: var(--tg-ls-wide); }

/* --- headings / content --- */
.tg-section-title    { font-family: var(--tg-font-heading); font-size: var(--tg-text-section-title); font-weight: var(--tg-fw-bold); line-height: var(--tg-lh-snug); }
.tg-card-title       { font-family: var(--tg-font-heading); font-size: var(--tg-text-card-title); font-weight: var(--tg-fw-bold); line-height: var(--tg-lh-snug); }
.tg-subsection-title { font-size: var(--tg-text-subsection-title); font-weight: var(--tg-fw-semibold); line-height: var(--tg-lh-snug); }
.tg-body             { font-size: var(--tg-text-body); font-weight: var(--tg-fw-regular); line-height: var(--tg-lh-relaxed); }
.tg-body-sm          { font-size: var(--tg-text-body-sm); line-height: var(--tg-lh-normal); }
.tg-caption          { font-size: var(--tg-text-caption); font-weight: var(--tg-fw-medium); line-height: var(--tg-lh-normal); }
.tg-micro            { font-size: var(--tg-text-micro); font-weight: var(--tg-fw-medium); line-height: var(--tg-lh-normal); }

/* --- numbers / money --- */
.tg-stat-value  { font-size: var(--tg-text-stat-value); font-weight: var(--tg-fw-bold); line-height: var(--tg-lh-tight); font-variant-numeric: tabular-nums; }
.tg-stat-label  { font-size: var(--tg-text-stat-label); font-weight: var(--tg-fw-medium); line-height: var(--tg-lh-normal); }
.tg-money       { font-variant-numeric: tabular-nums; }


/* ==========================================================================
   7. COMPONENT HELPERS
   For the pieces that repeat on every page (tables, forms, buttons, badges,
   Bill Summary rows). Safe to add as extra classes; they assume the element
   also keeps its component class (e.g. `class="form-control tg-input"`).
   ========================================================================== */

/* --- buttons --- */
.tg-btn    { font-size: var(--tg-text-btn); font-weight: var(--tg-fw-medium); line-height: var(--tg-lh-normal); }
.tg-btn-sm { font-size: var(--tg-text-btn-sm); font-weight: var(--tg-fw-medium); }
.tg-btn-icon i { font-size: var(--tg-text-icon); line-height: 1; }

/* --- forms --- */
.tg-label  { font-size: var(--tg-text-label); font-weight: var(--tg-fw-medium); line-height: var(--tg-lh-normal); }
.tg-input,
.tg-select { font-size: var(--tg-text-input); line-height: var(--tg-lh-normal); }
.tg-input-sm { font-size: var(--tg-text-input-sm); }
.tg-help   { font-size: var(--tg-text-help); font-weight: var(--tg-fw-regular); }
.tg-check-label { font-size: var(--tg-text-body); font-weight: var(--tg-fw-regular); }

/* --- tables ---
   Deliberately written as `.table.tg-table …`: the theme styles table headers
   through `.table-responsive .table thead th`, which is specificity 0,2,2, so a
   plain `.tg-table thead th` (0,1,2) would lose to it. Requiring both classes
   ties the specificity and this file wins by loading last.

   What this replaces: the theme renders table headers at 10px / weight 700
   (already uppercase) and leaves body cells to inherit ~13.44px. Here headers
   become --tg-text-table-head (12px / 600) and cells --tg-text-table-cell (14px). */
.table.tg-table thead th {
  font-size: var(--tg-text-table-head);
  font-weight: var(--tg-fw-semibold);
  text-transform: uppercase;
  letter-spacing: var(--tg-ls-caps);
  white-space: nowrap;
}
.table.tg-table tbody td {
  font-size: var(--tg-text-table-cell);
  line-height: var(--tg-lh-normal);
}
.table.tg-table tbody td .tg-cell-sub { font-size: var(--tg-text-caption); }
.table.tg-table .tg-cell-strong { font-weight: var(--tg-fw-semibold); }
.table.tg-table th.tg-cell-num,
.table.tg-table td.tg-cell-num { font-variant-numeric: tabular-nums; text-align: right; }

/* --- badges --- */
.tg-badge { font-size: var(--tg-text-badge); font-weight: var(--tg-fw-semibold); line-height: var(--tg-lh-tight); letter-spacing: var(--tg-ls-none); }

/* --- bill summary rows (generatebill) --- */
.tg-summary-row   { font-size: var(--tg-text-summary-row); line-height: var(--tg-lh-normal); }
.tg-summary-row .tg-summary-label { color: #6b7280; font-weight: var(--tg-fw-regular); }
.tg-summary-row .tg-summary-value { font-weight: var(--tg-fw-semibold); font-variant-numeric: tabular-nums; }
.tg-summary-total { font-size: var(--tg-text-summary-total); font-weight: var(--tg-fw-bold); font-variant-numeric: tabular-nums; }

/* --- empty states --- */
.tg-empty-state       { font-size: var(--tg-text-body); font-weight: var(--tg-fw-semibold); }
.tg-empty-state .tg-empty-hint { font-size: var(--tg-text-caption); font-weight: var(--tg-fw-regular); }


/* ==========================================================================
   8. SIDEBAR — LIVE
   The one part of the app this stylesheet currently owns. Active as soon as
   typography.css is linked (it is, in layouts/app.blade.php) — no `tg-type`
   class needed.

   Specificity note: these match or beat the rules the theme and custom.css
   used for the same elements, and win ties by being loaded last. That is why
   no !important is needed here.

   Only size / weight / tracking are set. Font-FAMILY is deliberately left
   alone so the theme customizer's font picker keeps working on the rail.
   ========================================================================== */
.nxl-navigation .navbar-content .nxl-link {
  font-size: var(--tg-text-nav-link);
  font-weight: var(--tg-fw-nav-link);
  line-height: var(--tg-lh-normal);
}

.nxl-navigation .navbar-content .nxl-submenu .nxl-link {
  font-size: var(--tg-text-nav-submenu);
  font-weight: var(--tg-fw-nav-link);
}

.nxl-navigation .navbar-content .nxl-caption label {
  font-size: var(--tg-text-nav-caption);
  font-weight: var(--tg-fw-semibold);
  line-height: var(--tg-lh-normal);
  text-transform: uppercase;
  letter-spacing: var(--tg-ls-wide);
}


/* ==========================================================================
   9. FORMS — LIVE
   Form typography is owned here instead of being re-forced by custom.css,
   generatebill.css and the inline <style> in layouts/app.blade.php at the
   same time (all three previously set the same 0.875rem with !important).

   Why the label rule still needs !important: the theme itself ships
       .form-label, .col-form-label { font-size: 1rem !important }
   so a normal declaration can never win against it. Everything else below is
   a plain declaration that wins by source order, because this file loads
   after bootstrap.min.css and theme.min.css. Label weight stays the theme's
   600; only the size is taken over here.

   Bootstrap defaults being replaced (they only showed through where nothing
   else forced a size): .form-control .845rem, .form-select 1rem,
   .input-group-text .845rem, .form-control-sm/.form-select-sm .875rem.
   ========================================================================== */
.form-label,
.col-form-label {
  font-size: var(--tg-text-label) !important; /* must out-rank the theme */
}

.form-control,
.form-select,
.input-group-text {
  font-size: var(--tg-text-input);
}

.form-control-sm,
.form-select-sm,
.input-group-sm .form-control {
  font-size: var(--tg-text-input-sm);
}

.form-check-label {
  font-size: var(--tg-text-body);
}

.form-text {
  font-size: var(--tg-text-help);
}


/* ==========================================================================
  10. APP-WIDE OPT-IN — <body class="tg-type">
   Everything except the sidebar. Maps the tokens above onto the markup the
   theme already ships, so adding one class to <body> normalises the rest of
   the app at once. Without `tg-type` on <body>, none of this applies.

   The sidebar is deliberately not repeated here — see SECTION 8.

   Form controls use !important here because generatebill.css / app.blade.php
   already force those sizes with !important; without it they would still win.
   ========================================================================== */

/* Font family is not set here on purpose: the theme's customizer already owns
   `html.app-font-family-* body`, so it stays the single source of truth. */
body.tg-type {
  font-size: var(--tg-text-body);
  line-height: var(--tg-lh-relaxed);
}

/* --- header + page header --- */
body.tg-type .nxl-header .nxl-head-link i,
body.tg-type .nxl-header .feather { font-size: var(--tg-text-icon); }
body.tg-type .nxl-header .dropdown-item { font-size: var(--tg-text-body); }
body.tg-type .nxl-header .dropdown-header h6 { font-size: var(--tg-text-body); }
body.tg-type .nxl-header .dropdown-header span { font-size: var(--tg-text-caption); }
body.tg-type .page-header .breadcrumb { font-size: var(--tg-text-breadcrumb); }
body.tg-type .page-header .breadcrumb a { font-weight: var(--tg-fw-medium); }

/* --- headings + content --- */
body.tg-type .card-title,
body.tg-type .section-title { font-size: var(--tg-text-card-title); font-weight: var(--tg-fw-bold); line-height: var(--tg-lh-snug); }
body.tg-type .main-content p,
body.tg-type .main-content label:not(.form-label) { font-size: var(--tg-text-body); }
body.tg-type small,
body.tg-type .small { font-size: var(--tg-text-caption); }

/* --- forms: owned by SECTION 9 for every page, so not repeated here --- */

/* --- buttons + badges --- */
body.tg-type .btn { font-size: var(--tg-text-btn); font-weight: var(--tg-fw-medium); }
body.tg-type .btn-sm { font-size: var(--tg-text-btn-sm); }
body.tg-type .btn i { font-size: var(--tg-text-icon); line-height: 1; }
body.tg-type .badge { font-size: var(--tg-text-badge); font-weight: var(--tg-fw-semibold); }

/* --- tables --- */
body.tg-type .table thead th {
  font-size: var(--tg-text-table-head);
  font-weight: var(--tg-fw-semibold);
  text-transform: uppercase;
  letter-spacing: var(--tg-ls-caps);
}
body.tg-type .table tbody td { font-size: var(--tg-text-table-cell); }

/* --- generatebill specifics (previously hard-coded inline) --- */
body.tg-type #addonList td,
body.tg-type #addonList th { font-size: var(--tg-text-table-cell); }
body.tg-type #checkInDisplayText,
body.tg-type #checkOutDisplayText { font-size: var(--tg-text-body) !important; }
body.tg-type .stats-label { font-size: var(--tg-text-subsection-title) !important; }
body.tg-type .stats-count { font-size: var(--tg-text-body) !important; }
body.tg-type .extra-tile-label { font-size: var(--tg-text-body-sm); font-weight: var(--tg-fw-semibold); }

/* --- footer --- */
body.tg-type .footer p,
body.tg-type .footer .copyright { font-size: var(--tg-text-footer) !important; }


/* ==========================================================================
  11. RESPONSIVE SCALE-DOWN
   Tighter type on small screens, the way Studio compacts its chrome on mobile.
   The first block affects the live sidebar (SECTION 8) too, so the rail stays
   readable on tablets; the rest applies once `tg-type` is enabled.
   ========================================================================== */
@media (max-width: 767.98px) {
  :root {
    --tg-text-page-title: var(--tg-fs-20);
    --tg-text-section-title: var(--tg-fs-18);
    --tg-text-card-title: var(--tg-fs-18);
    --tg-text-stat-value: var(--tg-fs-20);
    --tg-text-summary-total: var(--tg-fs-16);
  }
}

@media (max-width: 575.98px) {
  :root {
    --tg-text-body: var(--tg-fs-13);
    --tg-text-table-cell: var(--tg-fs-13);
    --tg-text-nav-link: var(--tg-fs-15);
  }
}


/* ==========================================================================
  12. MIGRATION NOTES (reference only — nothing here is a live rule)
   --------------------------------------------------------------------------
   Migrated so far
   ---------------
   - Sidebar link / submenu / caption sizes  -> SECTION 8 (removed from custom.css).
   - generatebill.blade.php: every inline font size replaced with a tg- class,
     including the JS-generated markup (room cards, selected rooms, tax options,
     booking picker); remaining inline picker styles use var(--tg-fs-14).
   - public/assets/css/generatebill.css: every hard-coded size repointed at the
     tokens above (form controls, addon rows, extra tiles, stats labels), and the
     stray .addon-section .section-title weight now uses --tg-fw-bold.
   - layouts/app.blade.php inline <style> #addonList sizes now use tokens, and
     its form rules were dropped (SECTION 9 owns .form-control and
     .input-group-text for every page).
   - Forms: custom.css and layouts/app.blade.php no longer force form sizes and
     generatebill.css no longer re-declares them, so SECTION 9 is the single owner.

   - reports/index.blade.php: every inline font size replaced with a role class.
     Stat cards use .tg-stat-value / .tg-stat-label, card titles .tg-section-title,
     helper text .tg-caption, and the invoices table carries .tg-table with
     .tg-cell-num on the money columns. This is the first page to use .tg-table,
     which is why SECTION 7's table rules are now written as `.table.tg-table …`
     (to out-rank the theme's `.table-responsive .table thead th`).

   - The four list pages — room-types.blade.php, manage-extras.blade.php,
     tax.blade.php and tax-rules.blade.php — are done: stat cards, card title and
     empty state all tokenized (plus tax's modal mode cards), and the shared
     public/assets/css/room-types.css whose table rules now read
     --tg-text-table-head (12px) and --tg-text-table-cell (14px) for Room Types,
     Manage Extras, Tax Settings and Tax Slab Rules. Those #id selectors out-rank
     both the theme and `.tg-table`, which is why this family does not need a role
     class on its <table>.

   Unrelated bug fixed while migrating tax.blade.php
   -----------------------------------------------
   - tax.css was referenced by no view, yet tax.blade.php used its .tax-badge and
     .tax-option-card classes, so the Mode column pills and the modal's mode picker
     rendered unstyled. The view now links tax.css, its duplicate #taxTableWrap
     table rule was dropped (room-types.css owns it) and its button-icon rule moved
     into room-types.css. .tax-card / .tax-stat / .tax-empty / .icon-wrap in that
     file are still unused by the markup.

   Still to do
   -----------
   - Nothing in this family; all four pages are migrated.
   - layouts/app.blade.php: the two footer paragraphs still set 0.875rem inline.
   - public/assets/css/custom.css: .text-body-md, .extra-tile-label and the two
     icon rules (which already land on 14px = --tg-fs-14, just not token-driven).
   - public/assets/css/tax.css: three raw sizes.
   - invoice-settings.blade.php (9), invoice-pdf.blade.php (16) and
     generatebill-preview.blade.php (28) still hold inline sizes. invoice-pdf is a
     dompdf template, so its sizes are print-specific — decide separately whether
     it should join this scale at all.
   - Enabling `tg-type` on <body> for the remaining pages is still optional.
   ========================================================================== */
