/*
 * NB Hosting WHMCS theme
 * Matches the NB Dynamics product site (Inter, purple #6457f6, green #1bc48a)
 * Loaded on top of the twenty-one base theme (Bootstrap 4-based).
 */

/* ─── DESIGN TOKENS ─── */
:root {
  --bg: #07090f;
  --bg2: #0d1120;
  --card: rgba(255, 255, 255, .035);
  --card-hover: rgba(255, 255, 255, .06);
  --border: rgba(255, 255, 255, .08);
  --border-hover: rgba(255, 255, 255, .16);
  --text: #dde3f0;
  --text-strong: #f1f4fb;
  --muted: rgba(221, 227, 240, .6);
  --muted2: rgba(221, 227, 240, .4);
  --accent: #6457f6;
  --accent-light: #8a7dff;
  --accent-glow: rgba(100, 87, 246, .18);
  --green: #1bc48a;
  --green-glow: rgba(27, 196, 138, .12);
  --red: #f06868;
  --amber: #f4b740;
  --max: 1180px;
  --radius-sm: 10px;
  --radius: 14px;
  --radius-lg: 20px;
}

/* ─── RESET-ISH ─── */
* { box-sizing: border-box; }
html { scroll-behavior: smooth; background: var(--bg); height: 100%; }

body,
html body {
  font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif !important;
  font-size: 15px;
  color: var(--text);
  line-height: 1.6;
  background-color: var(--bg) !important;
  background-image:
    radial-gradient(ellipse 90vw 70vh at 50% -15%, rgba(100, 87, 246, .15) 0%, transparent 65%),
    radial-gradient(ellipse 60vw 50vh at 100% 90%, rgba(27, 196, 138, .05) 0%, transparent 70%);
  background-attachment: fixed;
  -webkit-font-smoothing: antialiased;
  min-height: 100vh;
  position: relative;
  /* Sticky footer: body is a column flexbox so .nb-main can flex-grow and pin the footer to the bottom even on short pages. */
  display: flex;
  flex-direction: column;
}

body::before {
  content: '';
  position: fixed;
  inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, .022) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, .022) 1px, transparent 1px);
  background-size: 64px 64px;
  -webkit-mask-image: radial-gradient(ellipse 80vw 80vh at 50% 30%, #000 30%, transparent 80%);
  mask-image: radial-gradient(ellipse 80vw 80vh at 50% 30%, #000 30%, transparent 80%);
  pointer-events: none;
  z-index: 0;
}

a { color: var(--accent-light); text-decoration: none; }
a:hover { color: var(--text-strong); text-decoration: none; }

::selection { background: rgba(100, 87, 246, .4); color: #fff; }

p { color: var(--text); line-height: 1.65; }
small, .small { color: var(--muted); }
hr { border-color: var(--border); }

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
  color: var(--text-strong);
  font-weight: 700;
  letter-spacing: -.018em;
}
h1, .h1 { font-size: 32px; }
h2, .h2 { font-size: 26px; }
h3, .h3 { font-size: 20px; }
h4, .h4 { font-size: 17px; }
h5, .h5 { font-size: 15px; }

/* ─── ICONS (svg sprite) ─── */
.ic {
  width: 18px;
  height: 18px;
  display: inline-block;
  flex-shrink: 0;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
  vertical-align: -3px;
}

/* ─── LAYOUT WRAP ─── */
.container,
.container-fluid {
  width: 100%;
  max-width: var(--max);
  margin-right: auto !important;
  margin-left: auto !important;
  padding-right: 24px;
  padding-left: 24px;
  position: relative;
  z-index: 1;
  box-sizing: border-box;
}
@media (min-width: 1200px) {
  .container { max-width: var(--max); }
}
@media (max-width: 560px) {
  .container,
  .container-fluid { padding-right: 16px; padding-left: 16px; }
}

/* ─── TOPBAR / NAV ─── */
header.header,
nav.navbar,
.main-header,
.navbar-main {
  background: rgba(7, 9, 15, .78) !important;
  -webkit-backdrop-filter: blur(18px) saturate(1.4);
  backdrop-filter: blur(18px) saturate(1.4);
  border-bottom: 1px solid var(--border) !important;
  box-shadow: none !important;
}

.nb-topbar {
  position: sticky;
  top: 0;
  z-index: 1030;
  background: rgba(7, 9, 15, .78);
  -webkit-backdrop-filter: blur(18px) saturate(1.4);
  backdrop-filter: blur(18px) saturate(1.4);
  border-bottom: 1px solid var(--border);
}
.nb-topbar-inner {
  max-width: var(--max);
  margin: 0 auto;
  padding: 0 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 64px;
  gap: 16px;
}
.nb-brand {
  display: flex;
  align-items: center;
  gap: 11px;
  font-weight: 700;
  font-size: 15px;
  letter-spacing: -.01em;
  color: var(--text-strong) !important;
  flex-shrink: 0;
}
.nb-brand:hover { color: var(--text-strong) !important; }
.nb-logo-mark {
  width: 34px;
  height: 34px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  line-height: 0;
}
.nb-logo-mark img,
.nb-logo-mark svg { width: 100%; height: 100%; display: block; object-fit: contain; }

.nb-nav { display: flex; gap: 2px; align-items: center; flex: 1; justify-content: center; }
.nb-nav a {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--muted) !important;
  padding: 7px 12px;
  border-radius: 9px;
  transition: color .15s, background .15s;
}
.nb-nav a:hover,
.nb-nav a.active {
  color: var(--text-strong) !important;
  background: rgba(255, 255, 255, .05);
}

.nb-topbar-actions { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }

/* v1.43: cart link in topbar. Position the count badge over the
 * top-right of the cart icon. The badge uses the accent purple so
 * it matches the rest of the brand and stays visible on the dark
 * topbar background. */
.nb-cart-link-topbar { position: relative; }
.nb-cart-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 999px;
  background: var(--accent);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  line-height: 18px;
  text-align: center;
  box-shadow: 0 0 0 2px var(--bg);
}

/* user menu dropdown */
.nb-user-menu {
  position: relative;
}
.nb-user-menu .dropdown-menu {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 8px;
  margin-top: 8px;
  box-shadow: 0 18px 50px rgba(0, 0, 0, .55);
}
.nb-user-menu .dropdown-item {
  color: var(--text);
  border-radius: 8px;
  padding: 8px 12px;
  font-size: 13.5px;
}
.nb-user-menu .dropdown-item:hover,
.nb-user-menu .dropdown-item:focus {
  background: var(--card-hover);
  color: var(--text-strong);
}
.nb-user-menu .dropdown-divider {
  border-color: var(--border);
  margin: 6px 4px;
}

@media (max-width: 880px) {
  .nb-nav { display: none; }
}
@media (max-width: 560px) {
  .nb-topbar-actions .btn-ghost { display: none; }
  .nb-topbar-inner { padding: 0 16px; }
}

/* ─── BUTTONS (override Bootstrap) ─── */
.btn,
button.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 9px 16px;
  border-radius: 10px;
  font-size: 13.5px;
  font-weight: 600;
  cursor: pointer;
  transition: transform .12s, background .15s, border-color .15s, box-shadow .15s, color .15s;
  white-space: nowrap;
  border: 1px solid var(--border);
  background: var(--card);
  color: var(--text);
  user-select: none;
  font-family: inherit;
  text-decoration: none;
  line-height: 1.2;
}
.btn:hover,
.btn:focus {
  background: var(--card-hover);
  border-color: var(--border-hover);
  color: var(--text-strong);
  text-decoration: none;
  outline: none;
  box-shadow: none;
}
.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.btn:disabled, .btn.disabled { opacity: .5; cursor: not-allowed; }

.btn-primary,
.btn.btn-primary,
button.btn-primary {
  background: var(--accent) !important;
  border-color: transparent !important;
  color: #fff !important;
  box-shadow: 0 4px 18px rgba(100, 87, 246, .32);
}
.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active {
  background: var(--accent-light) !important;
  border-color: transparent !important;
  color: #fff !important;
  transform: translateY(-1px);
  box-shadow: 0 6px 22px rgba(100, 87, 246, .42) !important;
}

.btn-success,
button.btn-success {
  background: var(--green) !important;
  border-color: transparent !important;
  color: #04261b !important;
  box-shadow: 0 4px 18px rgba(27, 196, 138, .25);
}
.btn-success:hover { background: #2bd99c !important; color: #04261b !important; }

.btn-danger,
button.btn-danger {
  background: #e95252 !important;
  border-color: transparent !important;
  color: #fff !important;
}
.btn-danger:hover { background: #f06868 !important; color: #fff !important; }

.btn-warning,
.btn-info {
  background: var(--card) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

.btn-default,
.btn-secondary,
.btn-light {
  background: var(--card) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.btn-default:hover,
.btn-secondary:hover,
.btn-light:hover {
  background: var(--card-hover) !important;
  border-color: var(--border-hover) !important;
  color: var(--text-strong) !important;
}

.btn-link { color: var(--accent-light) !important; }
.btn-link:hover { color: var(--text-strong) !important; }

.btn-ghost { background: transparent !important; border-color: var(--border) !important; }

.btn-lg, .btn-large {
  padding: 12px 20px !important;
  font-size: 14px !important;
  border-radius: 11px !important;
}
.btn-sm, .btn-small {
  padding: 6px 12px !important;
  font-size: 12.5px !important;
  border-radius: 8px !important;
}
.btn .ic { width: 16px; height: 16px; }

.btn-block { width: 100%; }

/* btn-group */
.btn-group .btn { border-radius: 0; }
.btn-group .btn:first-child { border-top-left-radius: 10px; border-bottom-left-radius: 10px; }
.btn-group .btn:last-child { border-top-right-radius: 10px; border-bottom-right-radius: 10px; }

/* ─── CARDS / PANELS ─── */
.card,
.panel,
.well,
.nb-card {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  box-shadow: none !important;
  color: var(--text);
}
.card-header,
.panel-heading {
  background: rgba(255, 255, 255, .015) !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong);
  font-weight: 600;
  padding: 16px 20px;
  border-top-left-radius: var(--radius) !important;
  border-top-right-radius: var(--radius) !important;
}
.card-body,
.panel-body { padding: 20px; color: var(--text); }
.card-footer,
.panel-footer {
  background: rgba(255, 255, 255, .015) !important;
  border-top: 1px solid var(--border) !important;
  color: var(--muted);
  padding: 14px 20px;
  border-bottom-left-radius: var(--radius) !important;
  border-bottom-right-radius: var(--radius) !important;
}
.card-title { color: var(--text-strong); font-weight: 700; margin-bottom: 8px; }

.nb-card-hover { transition: border-color .2s, transform .15s, box-shadow .2s; }
.nb-card-hover:hover {
  border-color: var(--border-hover) !important;
  transform: translateY(-2px);
  box-shadow: 0 14px 40px rgba(0, 0, 0, .35);
}

/* WHMCS service / panel cards */
.client-home-panels,
.home-shortcuts {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 14px;
  float: none !important;
  width: 100% !important;
}
.client-home-panels > div,
.home-shortcuts > div {
  width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  float: none !important;
}

/* ─── FORMS ─── */
.form-control,
input[type=text],
input[type=email],
input[type=password],
input[type=number],
input[type=tel],
input[type=url],
input[type=search],
input[type=date],
input[type=time],
select,
textarea {
  background: rgba(0, 0, 0, .25) !important;
  border: 1px solid var(--border) !important;
  border-radius: 10px !important;
  color: var(--text) !important;
  font-size: 14px;
  padding: 10px 14px;
  height: auto;
  box-shadow: none !important;
  transition: border-color .15s, box-shadow .15s, background .15s;
  font-family: inherit;
  /* v1.43: explicit display + width. Bootstrap 4's stock form-control
   * sets these and twenty-one inherits them, but on some installs
   * (and inside our overridden cart account-form grid) the stock
   * rules don't apply - inputs end up display:inline-block at their
   * intrinsic width and labels render on the same line as the input
   * inside each .col-sm-* column ("Create your account" form looked
   * collapsed for the v1.42 user). Forcing block + 100% width here
   * matches Bootstrap behaviour and lets the col-sm grid lay the
   * fields out properly. */
  display: block;
  width: 100%;
}
.form-control:focus,
input:focus,
select:focus,
textarea:focus {
  border-color: var(--accent) !important;
  box-shadow: 0 0 0 3px var(--accent-glow) !important;
  background: rgba(0, 0, 0, .35) !important;
  color: var(--text-strong) !important;
  outline: none;
}
.form-control::placeholder,
input::placeholder,
textarea::placeholder { color: var(--muted2) !important; }

select.form-control,
select {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23dde3f0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m6 9 6 6 6-6'/></svg>") !important;
  background-repeat: no-repeat !important;
  background-position: right 12px center !important;
  background-size: 16px !important;
  padding-right: 38px !important;
}
select option { background: var(--bg2); color: var(--text); }

label,
.control-label {
  color: var(--text-strong);
  font-weight: 500;
  font-size: 13.5px;
  margin-bottom: 6px;
  /* v1.43: block by default. Without this, labels are inline so
   * `<label>...</label><input>` lays out side-by-side instead of
   * stacked, which is what produced the broken "Create your account"
   * layout. The inline checkbox/radio pattern overrides this back to
   * `display:inline-flex` on its parent .form-check / wrapping label
   * via the .nb-checkbox-inline helper below. */
  display: block;
}

/* For inline checkbox/radio labels (e.g. TOS acceptance, payment
 * gateway radios) the parent label is meant to wrap an input + text
 * on the same row. Use the helper class .nb-inline-label to opt in. */
label.nb-inline-label,
.nb-form-check label,
.form-check label,
.nb-cart-gateway {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.form-group { margin-bottom: 18px; }

.input-group-addon,
.input-group-text {
  background: rgba(255, 255, 255, .04) !important;
  border: 1px solid var(--border) !important;
  color: var(--muted) !important;
  border-radius: 10px;
}

.help-block,
.form-text,
small.form-text {
  color: var(--muted2);
  font-size: 12.5px;
}

.has-error .form-control { border-color: var(--red) !important; }
.has-error .control-label,
.has-error .help-block { color: var(--red) !important; }

/* checkbox / radio */
.form-check-input,
input[type=checkbox],
input[type=radio] {
  accent-color: var(--accent);
}

/* ─── TABLES ─── */
.table,
table.table,
.nb-table,
table.nb-table {
  color: var(--text);
  border-color: var(--border);
  width: 100% !important;
  max-width: 100% !important;
  margin: 0;
  border-collapse: collapse;
}
table { color: var(--text); border-color: var(--border); }
.table > thead > tr > th,
.table thead th,
table thead th {
  border-bottom: 1px solid var(--border) !important;
  border-top: 0 !important;
  color: var(--muted);
  font-weight: 600;
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .08em;
  padding: 14px 16px;
  background: transparent !important;
}
.table > tbody > tr > td,
.table td,
table tbody td {
  border-top: 1px solid var(--border) !important;
  padding: 14px 16px;
  vertical-align: middle;
  color: var(--text);
}
.table-striped > tbody > tr:nth-of-type(odd),
.table-striped tbody tr:nth-child(odd) td {
  background: rgba(255, 255, 255, .015) !important;
}
.table-hover > tbody > tr:hover,
.table-hover tbody tr:hover td {
  background: rgba(100, 87, 246, .06) !important;
}

.table-bordered,
.table-bordered td,
.table-bordered th { border-color: var(--border) !important; }

.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate { color: var(--muted) !important; padding: 12px 0; }

.dataTables_wrapper .dataTables_paginate .paginate_button {
  color: var(--text) !important;
  border: 1px solid var(--border) !important;
  border-radius: 8px !important;
  margin: 0 2px;
  background: transparent !important;
}
.dataTables_wrapper .dataTables_paginate .paginate_button.current,
.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
  background: var(--accent) !important;
  border-color: transparent !important;
  color: #fff !important;
}

/* ─── BADGES / LABELS ─── */
.badge,
.label {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .02em;
  padding: 4px 9px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .06);
  color: var(--text);
  border: 1px solid var(--border);
}
.badge-primary, .label-primary {
  background: rgba(100, 87, 246, .18) !important;
  color: var(--accent-light) !important;
  border-color: rgba(100, 87, 246, .35) !important;
}
.badge-success, .label-success, .status-active, .label-active {
  background: rgba(27, 196, 138, .14) !important;
  color: var(--green) !important;
  border-color: rgba(27, 196, 138, .35) !important;
}
.badge-danger, .label-danger, .status-cancelled, .status-terminated, .label-cancelled {
  background: rgba(240, 104, 104, .14) !important;
  color: var(--red) !important;
  border-color: rgba(240, 104, 104, .35) !important;
}
.badge-warning, .label-warning, .status-pending, .label-pending {
  background: rgba(244, 183, 64, .14) !important;
  color: var(--amber) !important;
  border-color: rgba(244, 183, 64, .35) !important;
}
.badge-info, .label-info {
  background: rgba(96, 165, 250, .14) !important;
  color: #93c5fd !important;
  border-color: rgba(96, 165, 250, .3) !important;
}

/* WHMCS status helpers commonly applied */
.text-success { color: var(--green) !important; }
.text-danger { color: var(--red) !important; }
.text-warning { color: var(--amber) !important; }
.text-info { color: #93c5fd !important; }
.text-primary { color: var(--accent-light) !important; }
.text-muted { color: var(--muted) !important; }

/* ─── ALERTS ─── */
.alert {
  border-radius: var(--radius);
  border: 1px solid var(--border);
  padding: 14px 18px;
  font-size: 14px;
  background: var(--card);
  color: var(--text);
  display: flex;
  align-items: flex-start;
  gap: 10px;
}
.alert .ic { margin-top: 2px; }
.alert-success {
  background: rgba(27, 196, 138, .08) !important;
  border-color: rgba(27, 196, 138, .3) !important;
  color: #b5f1d8 !important;
}
.alert-danger,
.alert-error {
  background: rgba(240, 104, 104, .08) !important;
  border-color: rgba(240, 104, 104, .3) !important;
  color: #ffd0d0 !important;
}
.alert-warning {
  background: rgba(244, 183, 64, .08) !important;
  border-color: rgba(244, 183, 64, .3) !important;
  color: #ffe4b3 !important;
}
.alert-info {
  background: rgba(100, 87, 246, .08) !important;
  border-color: rgba(100, 87, 246, .3) !important;
  color: #d9d3ff !important;
}

/* ─── BREADCRUMBS ─── */
.breadcrumb {
  background: transparent !important;
  padding: 16px 0 !important;
  margin: 0 0 12px;
  font-size: 13px;
  color: var(--muted);
}
.breadcrumb a { color: var(--muted) !important; }
.breadcrumb a:hover { color: var(--text-strong) !important; }
.breadcrumb-item.active,
.breadcrumb > .active { color: var(--text-strong) !important; }
.breadcrumb-item + .breadcrumb-item::before { color: var(--muted2) !important; content: "/" !important; }

/* ─── SIDEBAR (WHMCS panel/sidebar) ─── */
.panel-sidebar,
.sidebar,
aside.sidebar {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  margin-bottom: 18px;
}
.panel-sidebar .panel-heading,
.sidebar .panel-heading {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  padding: 14px 16px !important;
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--muted) !important;
  font-weight: 700;
}
.panel-sidebar .list-group,
.sidebar .list-group { border-radius: 0; padding: 8px; }
.panel-sidebar .list-group-item,
.sidebar .list-group-item,
.list-group-item {
  background: transparent !important;
  border: 0 !important;
  color: var(--text) !important;
  border-radius: 8px !important;
  padding: 9px 12px !important;
  font-size: 13.5px;
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 2px;
}
.list-group-item .ic { width: 15px; height: 15px; color: var(--muted); }
.list-group-item:hover {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--text-strong) !important;
}
.list-group-item.active,
.list-group-item.active:hover {
  background: var(--accent-glow) !important;
  color: var(--text-strong) !important;
  border-color: rgba(100, 87, 246, .3) !important;
}
.list-group-item.active .ic { color: var(--accent-light); }
.list-group-item .badge { margin-left: auto; }

/* ─── PAGINATION ─── */
.pagination > li > a,
.pagination > li > span,
.page-link {
  background: transparent !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: 8px !important;
  margin: 0 2px;
  padding: 7px 12px !important;
}
.pagination > li.active > a,
.pagination > li.active > span,
.page-item.active .page-link {
  background: var(--accent) !important;
  border-color: transparent !important;
  color: #fff !important;
}
.pagination > li > a:hover,
.page-link:hover {
  background: var(--card-hover) !important;
  color: var(--text-strong) !important;
}

/* ─── TABS ─── */
.nav-tabs,
.nav-pills {
  border-bottom: 1px solid var(--border) !important;
  margin-bottom: 18px;
  gap: 4px;
}
.nav-tabs > li > a,
.nav-tabs .nav-link,
.nav-pills > li > a,
.nav-pills .nav-link {
  background: transparent !important;
  color: var(--muted) !important;
  border: 0 !important;
  border-bottom: 2px solid transparent !important;
  border-radius: 0 !important;
  padding: 10px 16px !important;
  font-weight: 500;
  font-size: 14px;
  margin-bottom: -1px;
}
.nav-tabs > li.active > a,
.nav-tabs > li > a:hover,
.nav-tabs .nav-link.active,
.nav-tabs .nav-link:hover,
.nav-pills > li.active > a,
.nav-pills .nav-link.active {
  background: transparent !important;
  color: var(--text-strong) !important;
  border-bottom: 2px solid var(--accent) !important;
}
.tab-content { padding: 6px 0; }

/* ─── MODALS ─── */
/* v1.44: Bootstrap's stock CSS hides .modal by default until JS opens
 * it (display:none + position:fixed). Twenty-one inherits Bootstrap so
 * stock WHMCS pages work, but on this user's install those rules
 * weren't winning the cascade so the "Remove Item" / "Empty Cart"
 * confirm modals from stock standard_cart/viewcart.tpl rendered as
 * inline content cards at the bottom of the page (most visibly on the
 * Renew Domains page where there's nothing else to fill the area).
 * We restore the Bootstrap default explicitly: hidden until JS adds
 * the .show class, then displayed as a centered fixed overlay.
 * .modal.in covers Bootstrap 3 / pre-v4 shows as well. .fade is the
 * Bootstrap-managed transition class — leave the opacity transition
 * alone, only force display values. */
.modal {
  display: none;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 1050;
  width: 100%;
  height: 100%;
  overflow: hidden;
  outline: 0;
}
.modal.show,
.modal.in,
.modal[style*="display: block"] {
  display: block;
}
.modal.show .modal-dialog,
.modal.in .modal-dialog {
  margin: 1.75rem auto;
}
.modal-dialog {
  position: relative;
  max-width: 500px;
  margin: 1.75rem auto;
  pointer-events: none;
}
.modal-content { pointer-events: auto; }
.modal-content {
  background: var(--bg2) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius-lg) !important;
  box-shadow: 0 30px 80px rgba(0, 0, 0, .7);
  color: var(--text);
}
.modal-header {
  border-bottom: 1px solid var(--border) !important;
  padding: 18px 22px;
}
.modal-header .modal-title { color: var(--text-strong); font-weight: 700; }
.modal-header .close { color: var(--muted); opacity: 1; text-shadow: none; }
.modal-header .close:hover { color: var(--text-strong); }
.modal-body { padding: 20px 22px; }
.modal-footer { border-top: 1px solid var(--border) !important; padding: 16px 22px; }
.modal-backdrop.show { opacity: .7; background: #000; }

/* ─── DROPDOWNS ─── */
.dropdown-menu {
  background: var(--bg2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 8px;
  box-shadow: 0 18px 50px rgba(0, 0, 0, .55);
}
.dropdown-item,
.dropdown-menu > li > a {
  color: var(--text) !important;
  border-radius: 8px;
  padding: 8px 12px !important;
  font-size: 13.5px;
}
.dropdown-item:hover,
.dropdown-menu > li > a:hover {
  background: var(--card-hover) !important;
  color: var(--text-strong) !important;
}
.dropdown-divider,
.dropdown-menu .divider {
  background-color: var(--border);
  border-color: var(--border);
}

/* ─── PROGRESS ─── */
.progress {
  background: rgba(255, 255, 255, .05);
  border-radius: 999px;
  height: 8px;
  overflow: hidden;
}
.progress-bar {
  background: var(--accent);
  border-radius: 999px;
}
.progress-bar-success { background: var(--green); }
.progress-bar-warning { background: var(--amber); }
.progress-bar-danger { background: var(--red); }

/* ─── TOOLTIPS / POPOVERS ─── */
.tooltip-inner {
  background: var(--bg2) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  border-radius: 8px;
  font-size: 12px;
  padding: 6px 10px;
}
.popover {
  background: var(--bg2) !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: var(--radius);
}
.popover .popover-title,
.popover-header {
  background: rgba(255, 255, 255, .03) !important;
  color: var(--text-strong) !important;
  border-bottom: 1px solid var(--border) !important;
}

/* ─── HERO / PAGE HEAD (used inside login, home, kb etc.) ─── */
.nb-page-hero {
  padding: 56px 0 28px;
  text-align: center;
}
.nb-page-hero h1 {
  font-size: clamp(28px, 3vw, 40px);
  letter-spacing: -.025em;
  font-weight: 700;
  margin-bottom: 10px;
  color: var(--text-strong);
}
.nb-page-hero p {
  color: var(--muted);
  font-size: 15.5px;
  max-width: 60ch;
  margin: 0 auto;
}
.nb-section-label {
  display: inline-block;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--accent-light);
  margin-bottom: 10px;
}

/* ─── DASHBOARD-STYLE STAT CARDS ─── */
.nb-stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 18px;
  margin-bottom: 28px;
}
.nb-stat {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 22px 24px;
  display: flex;
  align-items: flex-start;
  gap: 16px;
  transition: border-color .2s, transform .15s;
  min-height: 100px;
}
/* v1.47: middle text column needs min-width:0 so its child .nb-stat-label
 * can actually apply text-overflow:ellipsis when it would otherwise wrap.
 * Without this, the flex child's intrinsic min-content keeps it wide
 * enough to hold the full label, and the label wraps to a second line
 * (which is what made "Outstanding Invoices" look ugly in v1.46). */
.nb-stat > div:not([class*="nb-stat-ic"]) {
  flex: 1 1 auto;
  min-width: 0;
}
.nb-stat:hover { border-color: var(--border-hover); transform: translateY(-2px); }
.nb-stat-ic {
  width: 38px;
  height: 38px;
  border-radius: 10px;
  background: var(--accent-glow);
  border: 1px solid rgba(100, 87, 246, .28);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--accent-light);
  flex-shrink: 0;
}
.nb-stat-ic .ic { width: 18px; height: 18px; }
.nb-stat-ic.green { background: var(--green-glow); border-color: rgba(27, 196, 138, .3); color: var(--green); }
.nb-stat-ic.amber { background: rgba(244, 183, 64, .12); border-color: rgba(244, 183, 64, .3); color: var(--amber); }
.nb-stat-ic.red { background: rgba(240, 104, 104, .12); border-color: rgba(240, 104, 104, .3); color: var(--red); }
.nb-stat-label {
  font-size: 12px;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: .08em;
  font-weight: 600;
  margin-bottom: 4px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nb-stat-value {
  font-size: 24px;
  font-weight: 800;
  color: var(--text-strong);
  letter-spacing: -.02em;
  line-height: 1.1;
}
.nb-stat-sub { font-size: 12.5px; color: var(--muted); margin-top: 2px; }

/* ─── FOOTER ─── */
.nb-footer {
  margin-top: 80px;
  padding: 56px 0 32px;
  border-top: 1px solid var(--border);
  background: rgba(0, 0, 0, .25);
  position: relative;
  z-index: 1;
  color: var(--muted);
}
.nb-footer-inner {
  max-width: var(--max);
  margin: 0 auto;
  padding: 0 24px;
}
.nb-footer-grid {
  display: grid;
  grid-template-columns: 1.2fr 1fr 1fr 1fr;
  gap: 32px;
  margin-bottom: 28px;
}
.nb-footer-brand { display: flex; align-items: center; gap: 11px; margin-bottom: 12px; color: var(--text-strong); font-weight: 700; }
.nb-footer-brand img,
.nb-footer-brand .nb-logo-mark { width: 28px; height: 28px; }
.nb-footer p { font-size: 13.5px; color: var(--muted); line-height: 1.6; }
.nb-footer h5 {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .12em;
  color: var(--muted2);
  font-weight: 700;
  margin-bottom: 14px;
}
.nb-footer ul { list-style: none; padding: 0; margin: 0; }
.nb-footer ul li { margin-bottom: 8px; }
.nb-footer ul li a { color: var(--muted); font-size: 13.5px; transition: color .15s; }
.nb-footer ul li a:hover { color: var(--text-strong); }
.nb-footer-bottom {
  border-top: 1px solid var(--border);
  padding-top: 18px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 12.5px;
  color: var(--muted2);
  flex-wrap: wrap;
  gap: 10px;
}

@media (max-width: 880px) {
  .nb-footer-grid { grid-template-columns: 1fr 1fr; gap: 24px; }
}
@media (max-width: 560px) {
  .nb-footer-grid { grid-template-columns: 1fr; gap: 18px; }
}

/* ─── MAIN CONTAINER WRAP ─── */
.main-content,
.nb-main {
  padding: 40px 0 64px;
  position: relative;
  z-index: 1;
  /* Sticky footer: this element grows to fill all remaining vertical space so the footer stays at the bottom of short pages (support index, success states, etc.). */
  flex: 1 0 auto;
  display: block;
  width: 100%;
  min-height: calc(100vh - 64px - 320px);
}
.nb-main > .container {
  width: 100%;
  max-width: var(--max);
  margin-left: auto !important;
  margin-right: auto !important;
}
.nb-footer { flex-shrink: 0; }

/* ─── LOGIN / REGISTER CENTRED CARD ─── */
.nb-auth-shell {
  min-height: calc(100vh - 64px - 140px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px 16px;
}
.nb-auth-card {
  width: 100%;
  max-width: 460px;
  background:
    radial-gradient(ellipse 100% 70% at 50% 0%, rgba(100, 87, 246, .12), transparent 70%),
    var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 32px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, .45);
}
.nb-auth-card h1 {
  font-size: 24px;
  font-weight: 700;
  letter-spacing: -.02em;
  margin-bottom: 6px;
  color: var(--text-strong);
}
.nb-auth-card .nb-auth-sub {
  color: var(--muted);
  font-size: 14px;
  margin-bottom: 24px;
}
.nb-auth-logo {
  width: 56px;
  height: 56px;
  display: block;
  margin: 0 auto 16px;
  object-fit: contain;
}
.nb-auth-card .form-group {
  margin-bottom: 14px;
  display: block;
  width: 100%;
}
.nb-auth-card .form-group label,
.nb-auth-card .form-group .control-label {
  display: block;
  width: 100%;
  text-align: left;
  margin-bottom: 6px;
  padding: 0;
  float: none;
}
.nb-auth-card .form-group .form-control,
.nb-auth-card .form-group input,
.nb-auth-card .form-group select,
.nb-auth-card .form-group textarea {
  display: block;
  width: 100%;
  max-width: 100%;
}
.nb-auth-card .row,
.nb-auth-card [class*="col-"] {
  display: block;
  width: 100%;
  max-width: 100%;
  flex: none;
  padding-left: 0;
  padding-right: 0;
  margin-left: 0;
  margin-right: 0;
}
.nb-auth-card .btn-block { width: 100%; margin-top: 6px; }

.nb-auth-divider {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 22px 0 18px;
  color: var(--muted2);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .12em;
}
.nb-auth-divider::before,
.nb-auth-divider::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--border);
}

.nb-signin-buttons {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.nb-signin-buttons a,
.nb-signin-buttons button,
.nb-signin-buttons .btn {
  display: flex !important;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 11px 16px !important;
  background: rgba(255, 255, 255, .04) !important;
  border: 1px solid var(--border) !important;
  border-radius: 10px !important;
  color: var(--text-strong) !important;
  font-weight: 500 !important;
  font-size: 14px !important;
  text-decoration: none !important;
  transition: background .15s, border-color .15s;
}
.nb-signin-buttons a:hover,
.nb-signin-buttons button:hover,
.nb-signin-buttons .btn:hover {
  background: rgba(255, 255, 255, .08) !important;
  border-color: var(--accent) !important;
}
.nb-signin-buttons img,
.nb-signin-buttons svg { width: 18px; height: 18px; }

.nb-signin-fallback { margin-top: 18px; }
.nb-signin-fallback:empty { display: none; }
.nb-signin-fallback .btn { width: 100%; margin-bottom: 8px; }
.nb-signin-fallback .btn:last-child { margin-bottom: 0; }

.nb-auth-foot {
  margin-top: 18px;
  text-align: center;
  font-size: 13px;
  color: var(--muted);
}
.nb-auth-foot a { color: var(--accent-light); font-weight: 500; }
.nb-auth-foot a:hover { color: var(--text-strong); }

/* ─── TICKET / ANNOUNCEMENT ITEMS ─── */
.nb-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.nb-list-item {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px 18px;
  display: flex;
  gap: 14px;
  align-items: flex-start;
  transition: border-color .2s, background .2s;
}
.nb-list-item:hover {
  border-color: var(--border-hover);
  background: var(--card-hover);
}
.nb-list-item .nb-list-meta {
  font-size: 12px;
  color: var(--muted2);
  margin-top: 4px;
}
.nb-list-item h4 {
  font-size: 15px;
  margin-bottom: 2px;
  color: var(--text-strong);
}

/* ─── FEATURED CARD VARIANT (for the homepage panels) ─── */
.nb-feature-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 22px;
  transition: border-color .2s, transform .15s, box-shadow .2s;
}
.nb-feature-card:hover {
  border-color: var(--border-hover);
  transform: translateY(-2px);
  box-shadow: 0 14px 40px rgba(0, 0, 0, .35);
}
.nb-feature-card .nb-feat-ic {
  width: 36px;
  height: 36px;
  border-radius: 10px;
  background: var(--accent-glow);
  border: 1px solid rgba(100, 87, 246, .28);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--accent-light);
  margin-bottom: 14px;
}
.nb-feature-card h3 {
  font-size: 15.5px;
  font-weight: 700;
  letter-spacing: -.01em;
  color: var(--text-strong);
  margin-bottom: 6px;
}
.nb-feature-card p { font-size: 13.5px; color: var(--muted); line-height: 1.55; margin: 0; }

/* ─── MISC ─── */
hr { border-top: 1px solid var(--border) !important; margin: 24px 0; }
code, pre, kbd, samp {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  background: rgba(255, 255, 255, .05);
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 2px 6px;
  font-size: 12.5px;
  color: var(--text-strong);
}
pre { padding: 14px 16px; overflow-x: auto; }

blockquote {
  border-left: 3px solid var(--accent);
  background: var(--card);
  padding: 12px 16px;
  margin: 14px 0;
  border-radius: 0 var(--radius) var(--radius) 0;
  color: var(--text);
}

/* hide bootstrap card "row" gutters and floats that twenty-one ships */
.row.equal-height-row { display: flex; flex-wrap: wrap; }
.row.equal-height-row > [class*="col-"] { display: flex; }
.row.equal-height-row > [class*="col-"] > .card,
.row.equal-height-row > [class*="col-"] > .panel { width: 100%; }

/* WHMCS-specific: marketplace tiles, status tiles, knowledgebase items */
.kb-article-list .panel,
.kb-article-list .card { margin-bottom: 14px; }
.kb-article-list a.panel-link { color: var(--text-strong) !important; }

/* small spinner */
.fa-spin, .fa-spinner { color: var(--accent-light); }

/* Hide twenty-one's "powered by WHMCS" branding gracefully (still readable) */
.text-center.small.text-muted a[href*="whmcs.com"] { color: var(--muted2) !important; }

/* Bootstrap container/row spacing tweaks */
.row { margin-left: -8px; margin-right: -8px; }
.row > [class*="col-"] { padding-left: 8px; padding-right: 8px; }

/* ──────────────────────────────────────────────────────────────────
 * v1.9 POLISH PASS
 *  - clickable dashboard stats (with arrow)
 *  - top-right user dropdown spacing
 *  - table responsiveness wrapper
 *  - register / submit-ticket two-column grids
 *  - service detail hero + facts strip + key/value grid
 *  - dashboard sections (services list, recent invoices, quick links)
 *  - small utility helpers (nb-optional, nb-feature-grid go arrow)
 * ────────────────────────────────────────────────────────────────── */

/* === Dashboard stat cards as anchor links === */
a.nb-stat,
a.nb-stat:hover,
a.nb-stat:focus {
  color: inherit;
  text-decoration: none !important;
  cursor: pointer;
  position: relative;
  align-items: center;
}
a.nb-stat .nb-stat-arrow {
  margin-left: auto;
  width: 16px;
  height: 16px;
  color: var(--muted2);
  transition: color .15s, transform .15s;
  flex-shrink: 0;
}
a.nb-stat:hover .nb-stat-arrow {
  color: var(--accent-light);
  transform: translateX(2px);
}
a.nb-stat:hover { background: var(--card-hover); }

/* === Top-right user dropdown spacing fix ===
   The parent twenty-one Bootstrap CSS makes dropdown items lay out as
   inline blocks with no gap between SVG + label - they look bunched.
   Force flex with proper gap and padding. */
.nb-user-dropdown {
  display: none;
  position: absolute;
  right: 0;
  left: auto;
  top: 100%;
  min-width: 240px;
  margin-top: 8px;
  background: var(--bg2) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  padding: 8px !important;
  box-shadow: 0 18px 50px rgba(0, 0, 0, .55);
  z-index: 1040;
}
.nb-user-dropdown.show { display: block; }
.nb-user-dropdown .dropdown-item,
.nb-user-dropdown > a {
  display: flex !important;
  align-items: center;
  gap: 12px;
  padding: 10px 14px !important;
  font-size: 13.5px;
  line-height: 1.3;
  color: var(--text) !important;
  border-radius: 8px;
  text-decoration: none !important;
  white-space: nowrap;
}
.nb-user-dropdown .dropdown-item .ic { width: 16px; height: 16px; color: var(--muted); flex-shrink: 0; }
.nb-user-dropdown .dropdown-item span { flex: 1; }
.nb-user-dropdown .dropdown-item:hover,
.nb-user-dropdown .dropdown-item:focus {
  background: var(--card-hover) !important;
  color: var(--text-strong) !important;
}
.nb-user-dropdown .dropdown-item:hover .ic { color: var(--accent-light); }
.nb-user-dropdown .dropdown-divider {
  height: 1px;
  margin: 6px 4px;
  background: var(--border);
  border: 0;
}

/* === Server-side active nav already styled by .nb-nav a.active above,
   but make sure the JS-applied class wins too === */
.nb-nav a.active,
.nb-nav a.active:hover { color: var(--text-strong) !important; background: rgba(255, 255, 255, .06) !important; }

/* === Responsive table wrapper === */
.nb-table-wrap {
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.nb-table-wrap > table { min-width: 560px; }

/* === Register / submit-ticket two-column page grid === */
.nb-register-grid,
.nb-form-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 22px;
  align-items: start;
}
@media (max-width: 960px) {
  .nb-register-grid,
  .nb-form-grid { grid-template-columns: 1fr; }
}
.nb-register-form,
.nb-form-grid > .card { min-width: 0; }
.nb-register-aside,
.nb-form-aside { display: flex; flex-direction: column; gap: 14px; }
.nb-register-aside .card,
.nb-form-aside .card { margin-bottom: 0 !important; }

/* small "(optional)" label hint */
.nb-optional {
  font-weight: 400;
  font-size: 12px;
  color: var(--muted2);
  margin-left: 4px;
  text-transform: none;
  letter-spacing: 0;
}

/* === Submit-ticket department grid + go arrow === */
.nb-feature-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 14px;
  margin-bottom: 22px;
}
.nb-feature-card .nb-feature-go {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 14px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--accent-light);
  text-transform: uppercase;
  letter-spacing: .06em;
  transition: color .15s, transform .15s;
}
.nb-feature-card:hover .nb-feature-go { color: var(--text-strong); transform: translateX(2px); }

/* === Service detail page === */
.nb-service-hero {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 22px;
  flex-wrap: wrap;
  background:
    radial-gradient(ellipse 60% 100% at 0% 50%, rgba(100, 87, 246, .15), transparent 70%),
    var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 24px 28px;
  margin-bottom: 18px;
}
.nb-service-hero-main { flex: 1 1 320px; min-width: 0; }
.nb-service-hero-side {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 10px;
}
.nb-service-price {
  display: flex;
  align-items: baseline;
  gap: 4px;
  color: var(--text-strong);
}
.nb-service-price-amount {
  font-size: 26px;
  font-weight: 800;
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
}
.nb-service-price-cycle {
  font-size: 13px;
  color: var(--muted);
  font-weight: 500;
  text-transform: lowercase;
}

/* facts strip - 4 small tiles */
.nb-fact-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px;
  margin-bottom: 18px;
}
.nb-fact {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 14px 18px;
}
.nb-fact-label {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--muted);
  font-weight: 600;
  margin-bottom: 4px;
}
.nb-fact-value {
  font-size: 14.5px;
  color: var(--text-strong);
  font-weight: 600;
}

/* key/value pairs grid */
.nb-kv-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px 28px;
}
.nb-kv {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 4px 0;
}
.nb-kv-k {
  font-size: 11.5px;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--muted);
  font-weight: 600;
}
.nb-kv-v {
  color: var(--text-strong);
  font-size: 14px;
  font-weight: 500;
  word-break: break-all;
}
.nb-kv-v code {
  background: rgba(0, 0, 0, .25);
  padding: 3px 8px;
  font-size: 12.5px;
}

/* === Dashboard sections === */
.nb-dash-section { margin-bottom: 22px; }
.nb-dash-section-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 12px;
}
.nb-dash-section-header h2 {
  font-size: 18px;
  margin: 0;
  letter-spacing: -.015em;
}
.nb-dash-cols {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 22px;
  align-items: start;
}
@media (max-width: 880px) {
  .nb-dash-cols { grid-template-columns: 1fr; }
}

/* When list-group items are inside a dashboard card, give them more breathing room */
.nb-dash-section .list-group-item,
.nb-form-aside .list-group-item,
.nb-register-aside .list-group-item {
  padding: 12px 12px !important;
  gap: 12px;
  align-items: center;
}
.nb-dash-section .list-group-item .nb-stat-ic { margin: 0; }

/* === Better .list-group spacing for clickable items with icons === */
a.list-group-item {
  cursor: pointer;
  text-decoration: none !important;
}
a.list-group-item:hover {
  background: var(--card-hover) !important;
  text-decoration: none !important;
}
a.list-group-item:hover .ic { color: var(--accent-light); }

/* Ensure card-body padding=0 still lets tables breathe at the edges */
.card > .card-body > .nb-table-wrap > .table > thead > tr > th:first-child,
.card > .card-body > .nb-table-wrap > .table > tbody > tr > td:first-child { padding-left: 20px; }
.card > .card-body > .nb-table-wrap > .table > thead > tr > th:last-child,
.card > .card-body > .nb-table-wrap > .table > tbody > tr > td:last-child { padding-right: 20px; }

/* === Auth card slight extra width for OAuth section === */
.nb-auth-card { max-width: 480px; }

/* === Responsive tweaks === */
@media (max-width: 600px) {
  .nb-service-hero { padding: 20px; }
  .nb-service-hero-side { align-items: flex-start; }
  .nb-stat { padding: 18px 20px; }
  .nb-stat-value { font-size: 22px; }
  h1 { font-size: 24px !important; }
}

/* ──────────────────────────────────────────────────────────────────
 * v1.10 ROUND-TWO AUDIT FIXES
 *  - Discord community alert banner
 *  - Account snapshot grid (replaces always-empty Recent Invoices)
 *  - Force grid layouts to actually apply (defend against parent CSS)
 *  - Hide empty WHMCS form artifacts (passwordstrength, .help-block)
 *  - Order page: reflow the standard cart so it isn't all over the place
 *  - Stronger Bootstrap .row defence so .col-md-N still flexes
 * ────────────────────────────────────────────────────────────────── */

/* Make body templates always span the full container width. The parent
 * twenty-one Bootstrap layer sometimes wraps body in .col-md-9 etc.;
 * anything sitting directly inside .nb-main > .container should fill it. */
.nb-main > .container > .row,
.nb-main > .container > .nb-page,
.nb-main > .container > .nb-page-hero,
.nb-main > .container > .nb-stat-grid,
.nb-main > .container > .nb-dash-cols,
.nb-main > .container > .nb-dash-section,
.nb-main > .container > .nb-feature-grid,
.nb-main > .container > .nb-register-grid,
.nb-main > .container > .nb-form-grid,
.nb-main > .container > .nb-service-hero,
.nb-main > .container > .nb-fact-grid,
.nb-main > .container > .nb-table-wrap,
.nb-main > .container > .card,
.nb-main > .container > .alert,
.nb-main > .container > form { width: 100%; max-width: 100%; }

/* Bootstrap 5 .row should be a flex container - re-assert it in case
 * a stray vendor stylesheet drops display:block on it. Scoped to
 * .nb-main so we never override .row anywhere outside the body of our
 * theme (avoids breaking parent twenty-one chrome or any third-party
 * module markup that lives outside .nb-main). */
.nb-main .row {
  display: flex !important;
  flex-wrap: wrap !important;
  margin-left: -8px;
  margin-right: -8px;
}
.nb-main .row > [class*="col-"] {
  padding-left: 8px;
  padding-right: 8px;
  width: 100%;
}
@media (min-width: 768px) {
  .nb-main .row > .col-md-12 { flex: 0 0 100%; max-width: 100%; }
  .nb-main .row > .col-md-9  { flex: 0 0 75%;  max-width: 75%; }
  .nb-main .row > .col-md-8  { flex: 0 0 66.666667%; max-width: 66.666667%; }
  .nb-main .row > .col-md-6  { flex: 0 0 50%;  max-width: 50%; }
  .nb-main .row > .col-md-4  { flex: 0 0 33.333333%; max-width: 33.333333%; }
  .nb-main .row > .col-md-3  { flex: 0 0 25%;  max-width: 25%; }
}

/* v1.42: matching col-sm-* rules for the >= 576px breakpoint. The
 * checkout.tpl "Create your account" card uses a Bootstrap col-sm-6
 * / col-sm-12 / col-sm-3 grid for the firstname/lastname/city/state
 * fields. Without these rules every field collapses to display:block
 * full-width and stacks down the left edge ("squished to the left"
 * issue the user reported in v1.41). */
@media (min-width: 576px) {
  .nb-main .row > .col-sm-12 { flex: 0 0 100%; max-width: 100%; }
  .nb-main .row > .col-sm-7  { flex: 0 0 58.333333%; max-width: 58.333333%; }
  .nb-main .row > .col-sm-6  { flex: 0 0 50%;  max-width: 50%; }
  .nb-main .row > .col-sm-5  { flex: 0 0 41.666667%; max-width: 41.666667%; }
  .nb-main .row > .col-sm-3  { flex: 0 0 25%;  max-width: 25%; }
}

/* Force the two-col grid layouts to apply with !important, in case the
 * parent twenty-one Bootstrap drops display:block on .nb-register-grid /
 * .nb-form-grid (it ships rules like `.nb-register-grid { display: block; }`
 * from generic resets on some installs). */
.nb-register-grid,
.nb-form-grid {
  display: grid !important;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 22px;
  align-items: start;
  width: 100%;
}
.nb-register-grid > *,
.nb-form-grid > * { min-width: 0; }
.nb-register-form,
.nb-form-grid > .card,
.nb-form-grid > form { width: 100%; min-width: 0; }
@media (max-width: 960px) {
  .nb-register-grid,
  .nb-form-grid { grid-template-columns: 1fr !important; }
}

/* Hide the empty password-strength UI WHMCS injects after new-password
 * inputs. It often renders as an empty grey box right under the field. */
.password-strength,
.password-strength-bar,
.passwordstrength,
.using-password-strength + .password-strength-meter:empty,
.help-block:empty,
small.help-block:empty,
small.form-text:empty {
  display: none !important;
}
.password-strength-meter {
  background: transparent !important;
  border: 0 !important;
  padding: 0 !important;
  min-height: 0 !important;
}

/* === Discord community banner === */
.alert.nb-discord-alert {
  display: flex;
  flex-direction: column;
  gap: 12px;
  background: linear-gradient(135deg, rgba(88, 101, 242, .14), rgba(88, 101, 242, .06)) !important;
  border: 1px solid rgba(88, 101, 242, .35) !important;
  color: var(--text) !important;
  padding: 14px 18px !important;
  margin-bottom: 18px;
  border-radius: var(--radius);
}
@media (min-width: 768px) {
  .alert.nb-discord-alert { flex-direction: row; align-items: center; justify-content: space-between; }
}
.nb-discord-msg { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.nb-discord-msg strong { color: var(--text-strong); font-weight: 700; font-size: 14.5px; }
.nb-discord-msg span { color: var(--muted); font-size: 13px; }
.nb-discord-actions { display: flex; gap: 8px; flex-wrap: wrap; flex-shrink: 0; }
.nb-discord-actions .btn { white-space: nowrap; }
.nb-discord-actions .btn .ic { width: 14px; height: 14px; }

/* === Account snapshot grid (replaces the misleading "no invoices yet" empty card) === */
.nb-snap-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 14px;
}
.nb-snap {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 14px;
  background: rgba(255, 255, 255, .02);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}
.nb-snap-label {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--muted);
  font-weight: 600;
}
.nb-snap-value {
  font-size: 22px;
  font-weight: 800;
  letter-spacing: -.02em;
  color: var(--text-strong);
  font-variant-numeric: tabular-nums;
}
.nb-snap-cta {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  color: var(--accent-light);
  text-decoration: none !important;
  margin-top: 4px;
}
.nb-snap-cta .ic { width: 12px; height: 12px; transition: transform .15s; }
.nb-snap-cta:hover .ic { transform: translateX(2px); }

/* === Order/cart pages: ensure the big two-col layout works.
   Standard cart is row > col-md-8 + col-md-4. The .row defence above
   already makes it flex; below adds spacing breathing room. === */
form .row > [class*="col-"] > .card { margin-bottom: 14px; }
.nb-main .row { row-gap: 0; }

/* Ensure form table rows in the cart aren't crammed */
.nb-main table.table > tbody > tr > td,
.nb-main table.table > thead > tr > th {
  padding: 12px 16px;
  vertical-align: middle;
}

/* === Login: Google button polish === */
.nb-signin-btn.nb-signin-google {
  background: #fff !important;
  color: #1f1f1f !important;
  border: 1px solid #dadce0 !important;
  font-weight: 600;
}
.nb-signin-btn.nb-signin-google:hover {
  background: #f8f9fa !important;
  color: #1f1f1f !important;
}
.nb-signin-btn { display: inline-flex; align-items: center; justify-content: center; gap: 10px; }
.nb-signin-buttons { display: flex; flex-direction: column; gap: 10px; }
.nb-signin-buttons .g_id_signin { width: 100%; }

/* === v1.56: Discord OAuth button. Sits below the Google sign-in
   on login.tpl + register.tpl. Uses Discord's brand "blurple" so it
   reads as Discord at a glance, with a slightly darker hover state.
   Width + spacing inherit from .nb-signin-buttons / .nb-signin-btn
   above so it lines up with the Google button visually. === */
.nb-signin-btn.nb-btn-discord {
  background: #5865F2 !important;
  color: #fff !important;
  border: 1px solid #5865F2 !important;
  font-weight: 600;
}
.nb-signin-btn.nb-btn-discord:hover,
.nb-signin-btn.nb-btn-discord:focus {
  background: #4752c4 !important;
  border-color: #4752c4 !important;
  color: #fff !important;
}
.nb-signin-btn.nb-btn-discord svg { color: #fff; }

/* === Section label inside a hero block doesn't need text-align centre === */
.nb-page-hero { text-align: left; }
.nb-page-hero h1 { margin-top: 4px; }

/* === Mini icon size for inline alerts === */
.alert .ic { width: 18px; height: 18px; flex-shrink: 0; }

/* === Make sure .nb-feature-grid is always a grid (not a flex from Bootstrap reset) === */
.nb-feature-grid {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 14px;
}

/* === Feature card consistency === */
.nb-feature-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 22px;
  transition: border-color .15s, transform .15s, background .15s;
}
.nb-feature-card:hover {
  border-color: rgba(100, 87, 246, .4);
  background: var(--card-hover);
}
.nb-feature-card h3 {
  margin: 12px 0 6px;
  font-size: 16px;
  color: var(--text-strong);
  letter-spacing: -.01em;
}
.nb-feature-card p {
  margin: 0;
  font-size: 13.5px;
  color: var(--muted);
  line-height: 1.55;
}
.nb-feat-ic {
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background: var(--accent-glow);
  border: 1px solid rgba(100, 87, 246, .25);
  color: var(--accent-light);
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.nb-feat-ic .ic { width: 18px; height: 18px; }

/* === Aside cards in form-grid don't get squashed === */
.nb-form-aside,
.nb-register-aside { width: 100%; min-width: 0; }
@media (min-width: 961px) {
  .nb-form-aside,
  .nb-register-aside { max-width: 320px; }
}

/* === GIS slot - keep WHMCS-injected widget tidy === */
#g_id_onload:empty { display: none; }
.g_id_signin:empty { display: none; }

/* ============================================================
   v1.11 fixes
   ============================================================ */

/*
 * Stop the WHMCS register-page oauth status leak.
 * Twenty-one's stock register.tpl/header partials drop a long list of
 * "is unavailable", "Please complete sign in", "Account is already
 * connected" status messages above the form, expecting JS to toggle
 * the right one based on URL state. On installs where that JS doesn't
 * fire (or runs before our DOM is ready) every single message is
 * visible at once. We scope these to .nb-register-page so the rest of
 * the site is untouched, and hide every container WHMCS / Bootstrap is
 * known to use for these messages.
 */
.nb-register-page > .row > [class*="col-"] > div[id*="oauth-status"],
.nb-register-page #signin-status-msg,
.nb-register-page #signin-status-msg-container,
.nb-register-page .signin-status-msg,
.nb-register-page .signin-status-message,
.nb-register-page .oauth-status-msg,
.nb-register-page .oauth-status-message,
.nb-register-page .client-status-message,
.nb-register-page .registration-info-messages,
.nb-register-page #registration-info-messages,
.nb-register-page #signin-prompt-messages,
.nb-register-page .signin-prompt-messages,
.nb-register-page #thirdPartyOAuthMessage,
.nb-register-page .thirdPartyOAuthMessage,
.nb-register-page > p:first-child,
.nb-register-page > h2:first-child {
  display: none !important;
}

/*
 * Same idea, but specifically for unstyled wrappers WHMCS renders
 * above the form on the register page. SCOPED TO .nb-register-page so
 * legitimate top-level <p> / status containers on other pages
 * (announcements, knowledgebase, contact) are NOT hidden by mistake.
 */
.nb-register-page .alert-info[style*="display:none"],
.nb-register-page .signin-status-msg,
.nb-register-page [class*="signin-prompt"],
.nb-register-page .signin-prompt-messages {
  display: none !important;
}

/*
 * v1.26 - the actual culprit revealed by user's pasted source. WHMCS
 * 9.x renders the OAuth pre-link status messages inside
 * <div id="providerLinkingMessages" class="w-hidden"> with each <p>
 * carrying a class like .providerLinkingMsg-preLink-<state>. WHMCS
 * intends .w-hidden to hide it, but on this install that class isn't
 * actually hiding anything (parent twenty-one's CSS rule for it is
 * either missing or overridden). The fix is dead simple: hide it
 * ourselves with !important. UNSCOPED because:
 *   1. These IDs/classes are uniquely WHMCS-OAuth-specific so won't
 *      collide with anything legitimate elsewhere.
 *   2. The element appears at body-level BEFORE .nb-register-page
 *      renders, so scoping to .nb-register-page wouldn't catch it.
 *   3. Even if WHMCS later clones a message into a visible container,
 *      the cloned <p> retains its providerLinkingMsg- class and gets
 *      hidden too.
 * Also keeps .w-hidden honored globally as a defensive belt-and-braces.
 */
/* Universal .w-hidden hide. WHMCS uses this class as a "hide me until
 * JS removes the class to reveal" utility. Restored after v1.27 review
 * narrowing because that left other widgets (e.g. #passwdFeedback) as
 * empty visible alerts. The OAuth provider-linking message paragraphs
 * (.providerLinkingMsg-*) are no longer individually hidden here -
 * their parent #providerLinkingMessages has .w-hidden so the parent
 * rule already hides them, and individually hiding them would block
 * WHMCS from ever showing a specific error/status message. */
#providerLinkingMessages,
.w-hidden,
#passwdFeedback:empty {
  display: none !important;
}

/*
 * "Open New Ticket" CTA on the support index. Make sure the button
 * is visually unmissable so the v1.11 fix is obvious in screenshots.
 */
.nb-support-hero .btn-primary {
  box-shadow: 0 4px 16px -4px rgba(100, 87, 246, .35);
}
.nb-support-hero .btn-primary:hover {
  box-shadow: 0 6px 20px -4px rgba(100, 87, 246, .5);
}

/* === Cart / order forms === */

/*
 * Force any inherited Bootstrap/twenty-one ".cart" wrappers, white
 * "well" panels and modal-style inner backgrounds to follow our dark
 * theme. The "going through order" screenshot showed white blocks
 * overlapping dark blocks because parent CSS rules survived.
 */
.nb-main .well,
.nb-main .panel,
.nb-main .panel-default,
.nb-main .order-summary,
.nb-main .ordersummary,
.nb-main .order-summary-bar,
.nb-main .pull-right.product-pricing,
.nb-main .product-pricing,
.nb-main .product-info-pricing,
.nb-main .price,
.nb-main .pricing-block,
.nb-main .product-detail,
.nb-main .product-row,
.nb-main .cart-summary {
  background: var(--card) !important;
  background-color: var(--card) !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: var(--radius);
}
.nb-main .well h3,
.nb-main .well h4,
.nb-main .panel-heading,
.nb-main .panel-title,
.nb-main .order-summary h3,
.nb-main .order-summary h4 {
  color: var(--text-strong) !important;
  background: transparent !important;
  border: 0 !important;
}
.nb-main .panel-body,
.nb-main .panel-heading {
  background: transparent !important;
  color: inherit !important;
  border-color: var(--border) !important;
}
.nb-main .product-pricing-cycle,
.nb-main .product-cycle,
.nb-main .price-cycle {
  color: var(--muted) !important;
}

/*
 * Cart "Browse Services" comparison cards. Stretch them to a uniform
 * height, give them a subtle gradient border and lift the active card.
 */
.nb-cart-products {
  display: grid;
  gap: 18px;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  margin: 6px 0 22px;
}
.nb-cart-product {
  position: relative;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 22px 22px 20px;
  display: flex;
  flex-direction: column;
  gap: 12px;
  transition: border-color .15s, transform .15s, box-shadow .15s;
}
.nb-cart-product::before {
  content: "";
  position: absolute; inset: -1px;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(140deg, rgba(100,87,246,.45), transparent 55%, rgba(27,196,138,.3));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  opacity: .35;
  pointer-events: none;
  transition: opacity .15s;
}
.nb-cart-product:hover { transform: translateY(-2px); box-shadow: 0 12px 30px -16px rgba(100,87,246,.45); }
.nb-cart-product:hover::before { opacity: .9; }
.nb-cart-product h3 {
  margin: 0;
  font-size: 17px;
  color: var(--text-strong);
  letter-spacing: -.015em;
}
.nb-cart-product .nb-cart-desc {
  font-size: 13.5px;
  color: var(--muted);
  line-height: 1.55;
  flex: 1;
}
.nb-cart-product .nb-cart-features {
  margin: 6px 0 4px;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 6px;
}
.nb-cart-product .nb-cart-features li {
  font-size: 13px;
  color: var(--text);
  display: flex;
  align-items: flex-start;
  gap: 8px;
}
.nb-cart-product .nb-cart-features li::before {
  content: "";
  width: 14px; height: 14px;
  flex-shrink: 0;
  margin-top: 3px;
  background: var(--green);
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M13.5 4.5 6 12 2.5 8.5 3.9 7.1 6 9.2l6.1-6.1z'/></svg>") center/contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M13.5 4.5 6 12 2.5 8.5 3.9 7.1 6 9.2l6.1-6.1z'/></svg>") center/contain no-repeat;
}
.nb-cart-product .nb-cart-price {
  display: flex;
  align-items: baseline;
  gap: 4px;
  border-top: 1px solid var(--border);
  padding-top: 14px;
  margin-top: auto;
}
.nb-cart-product .nb-cart-price-amt {
  font-size: 22px;
  font-weight: 700;
  color: var(--text-strong);
  letter-spacing: -.02em;
}
.nb-cart-product .nb-cart-price-cyc {
  font-size: 13px;
  color: var(--muted);
}
.nb-cart-product .nb-cart-actions {
  display: flex;
  gap: 8px;
  margin-top: 10px;
}
.nb-cart-product .nb-cart-actions .btn { flex: 1; justify-content: center; }

/*
 * Added-to-cart confirmation. Hide the empty WHMCS "Based on this
 * product, we recommend:" wrapper unless we actually have something
 * to suggest.
 */
.nb-cart-recommend:empty,
.nb-cart-recommend.is-empty {
  display: none !important;
}

/* Configure-product page on standard_cart - tighten parent layout */
.nb-cart-config .form-group label,
.nb-cart-config .control-label {
  color: var(--text);
  font-weight: 500;
  font-size: 13.5px;
  margin-bottom: 6px;
}
.nb-cart-config .product-pricing-display {
  background: var(--card-elevated, var(--card));
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 18px;
  color: var(--text-strong);
}
.nb-cart-config table.table { background: transparent !important; }
.nb-cart-config table.table > tbody > tr > td,
.nb-cart-config table.table > tbody > tr > th {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text);
}



/* ──────────────────────────────────────────────────────────────────
 * v1.12 EMERGENCY FIX PASS
 *  - Account Details was anchored hard to the left because
 *    .nb-form-grid uses a fixed 320px right column. On wide viewports
 *    the form column stretched but the whole grid was still pinned to
 *    the left edge of .nb-main > .container - making the form FEEL
 *    anchored. Force the grid (and its children) to fill the container
 *    width so the form spans the full reading area.
 *  - .row gutter was only 8px which made Contact-Us and similar two-
 *    column forms (col-md-8 + col-md-4) look squished together with
 *    no breathing room. Bump to 12px each side (24px total).
 *  - Hide the empty WHMCS errormessage `<div></div>` that occasionally
 *    renders above forms with no text inside.
 * ────────────────────────────────────────────────────────────────── */

/* ── A. Account Details: widen + space ── */
.nb-account-details { width: 100%; }
.nb-account-details .nb-form-grid {
  /* Widen the form column. 360px aside is enough room for the shortcut
   * list without dwarfing the main form. */
  grid-template-columns: minmax(0, 1fr) 360px !important;
  gap: 28px;
}
.nb-account-details .card { width: 100%; }
.nb-account-details .card-body { padding: 22px; }
@media (max-width: 1024px) {
  .nb-account-details .nb-form-grid {
    grid-template-columns: 1fr !important;
  }
}

/* ── B. Contact / SubmitTicket: bigger row gutter ── */
.nb-main > .container > .row,
.nb-main .row { margin-left: -12px; margin-right: -12px; }
.nb-main > .container > .row > [class*="col-"],
.nb-main .row > [class*="col-"] { padding-left: 12px; padding-right: 12px; }

/* Contact page specifically: force the form column and the "other ways"
 * sidebar to feel like distinct cards with breathing room between them. */
.nb-main .row > .col-md-8 > .card,
.nb-main .row > .col-md-4 > .card { margin-bottom: 16px; }

/* ── C. Hide the empty errormessage ghost div WHMCS prints above some
 *    forms (a `<div class="errormessage"></div>` with no content). Only
 *    hide if it has no visible text. *but* using :empty matches content
 *    with no elements, while WHMCS may render a stray <br> - cover both. */
.errormessage:empty,
.errorMessages:empty,
div[id*="error"]:empty { display: none !important; }

/* ── D. Cart product cards: make the action row stick to the bottom of
 *    each card so a 3-card / 2-card grid lines up neatly even when the
 *    descriptions are different lengths. Also push the price to the
 *    bottom-with-actions zone. */
.nb-cart-product .nb-cart-actions { margin-top: auto; display: flex; gap: 8px; flex-wrap: wrap; }
.nb-cart-product .nb-cart-actions .btn { flex: 1; justify-content: center; }

/* ──────────────────────────────────────────────────────────────────
 * v1.13 FIX PASS
 *  - Catalogue category pill strip
 *  - Cart product description block (paragraphs + bullet feature list)
 *  - Cart pages dark-theme overrides for WHMCS-leaked widgets
 *  - Wider register grid on desktop, single column on tablet
 *  - GIS slot hide-when-empty
 * ────────────────────────────────────────────────────────────────── */

/* === Catalogue category pill strip ===
 * Lives at the top of cart.php?gid=X.
 * Desktop (>=768px): wraps to multiple rows so every category is visible.
 * Mobile (<768px): horizontal scroll inside an overflow strip, with a
 * subtle right-edge fade hint to signal more is offscreen, and the
 * scrollbar muted so it doesn't dominate the chrome. */
.nb-cart-cats {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0 0 22px;
  padding: 0;
}
@media (max-width: 767px) {
  .nb-cart-cats {
    flex-wrap: nowrap;
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: thin;
    padding-bottom: 6px;
    margin-right: -16px;
    padding-right: 16px;
    mask-image: linear-gradient(to right, #000 0, #000 90%, transparent 100%);
    -webkit-mask-image: linear-gradient(to right, #000 0, #000 90%, transparent 100%);
  }
  .nb-cart-cats::-webkit-scrollbar { height: 4px; }
  .nb-cart-cats::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
  .nb-cart-cat { flex-shrink: 0; }
}
.nb-cart-cat {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--card);
  color: var(--muted);
  font-size: 13px;
  font-weight: 500;
  text-decoration: none !important;
  transition: border-color .15s, color .15s, background .15s;
  white-space: nowrap;
}
.nb-cart-cat:hover {
  border-color: var(--border-hover);
  color: var(--text-strong);
  background: var(--card-hover);
}
.nb-cart-cat.is-active {
  background: var(--accent-glow) !important;
  border-color: rgba(100, 87, 246, .4) !important;
  color: var(--accent-light) !important;
  font-weight: 600;
}

/* === Cart product description block ===
 * Container around the parsed description. The parser emits a mix of
 * <p> and <ul class="nb-cart-features"> elements; this wrapper just
 * gives them sensible vertical rhythm and lets the feature list stay
 * flush with paragraph text. */
.nb-cart-desc-block { display: flex; flex-direction: column; gap: 8px; flex: 1; }
.nb-cart-desc-block > p,
.nb-cart-desc-block > p.nb-cart-desc {
  margin: 0;
  font-size: 13.5px;
  color: var(--muted);
  line-height: 1.55;
}
.nb-cart-desc-block > ul.nb-cart-features { margin: 2px 0; }

/* === Cart-pages dark-theme overrides ===
 * The standard_cart code path drags in the parent twenty-one cart CSS
 * which gives every widget (promo box, gateway list, totals panel,
 * "we recommend" cards) a hard white background. We scope these
 * overrides under .nb-cart-config / .nb-cart-view / .nb-cart-added so
 * they CANNOT leak elsewhere in the theme. !important is needed because
 * some twenty-one rules use #shopping-cart .panel etc. with higher
 * specificity than ours. */
.nb-cart-view,
.nb-cart-view *,
.nb-cart-added,
.nb-cart-added *,
.nb-cart-config,
.nb-cart-config * {
  /* Inherit the dark text by default so nothing falls back to #333 */
  color: inherit;
}

.nb-cart-view .panel,
.nb-cart-view .well,
.nb-cart-view .box,
.nb-cart-view .panel-default,
.nb-cart-added .panel,
.nb-cart-added .well,
.nb-cart-added .box,
.nb-cart-added .panel-default,
.nb-cart-config .panel,
.nb-cart-config .well,
.nb-cart-config .box,
.nb-cart-config .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-cart-view .panel-heading,
.nb-cart-view .panel-title,
.nb-cart-added .panel-heading,
.nb-cart-added .panel-title,
.nb-cart-config .panel-heading,
.nb-cart-config .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}

.nb-cart-view .panel-body,
.nb-cart-added .panel-body,
.nb-cart-config .panel-body { padding: 18px !important; background: transparent !important; }

.nb-cart-view input[type="text"],
.nb-cart-view input[type="email"],
.nb-cart-view input[type="number"],
.nb-cart-view input[type="password"],
.nb-cart-view select,
.nb-cart-view textarea,
.nb-cart-added input[type="text"],
.nb-cart-added input[type="email"],
.nb-cart-added select,
.nb-cart-config input[type="text"],
.nb-cart-config input[type="email"],
.nb-cart-config input[type="number"],
.nb-cart-config input[type="password"],
.nb-cart-config select,
.nb-cart-config textarea {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
}

/* Tables inside the cart pages */
.nb-cart-view table,
.nb-cart-view .table,
.nb-cart-added table,
.nb-cart-added .table,
.nb-cart-config table,
.nb-cart-config .table {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-cart-view .table > thead > tr > th,
.nb-cart-view .table th,
.nb-cart-added .table > thead > tr > th,
.nb-cart-added .table th,
.nb-cart-config .table > thead > tr > th,
.nb-cart-config .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
}
.nb-cart-view .table > tbody > tr > td,
.nb-cart-view .table td,
.nb-cart-added .table > tbody > tr > td,
.nb-cart-added .table td,
.nb-cart-config .table > tbody > tr > td,
.nb-cart-config .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
}

/* Discount / fee text helpers in the cart that twenty-one paints green
 * on a white background - keep the green but transparent the chip. */
.nb-cart-view .text-success,
.nb-cart-view .text-info,
.nb-cart-added .text-success,
.nb-cart-added .text-info { background: transparent !important; }

/* Force WHMCS list-group leaks dark too */
.nb-cart-view .list-group,
.nb-cart-added .list-group,
.nb-cart-config .list-group { background: transparent !important; }
.nb-cart-view .list-group-item,
.nb-cart-added .list-group-item,
.nb-cart-config .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

/* === Register grid: widen on desktop, single column on tablet ===
 * v1.12 used 22px gap. The form column visually crashes into the aside
 * on 13" screens. 28px gap (and an explicit 1024px breakpoint) restores
 * breathing room while keeping the existing two-column shape. */
@media (min-width: 1024px) {
  .nb-register-grid,
  .nb-form-grid {
    grid-template-columns: minmax(0, 1fr) 320px;
    gap: 28px;
  }
}
@media (max-width: 1023px) {
  .nb-register-grid,
  .nb-form-grid {
    grid-template-columns: 1fr;
    gap: 18px;
  }
}
.nb-register-form,
.nb-register-aside,
.nb-form-grid > .card,
.nb-form-aside { width: 100%; min-width: 0; }
.nb-register-aside .card,
.nb-form-aside .card { width: 100%; }

/* === GIS slot: hide gracefully when no JS populated it ===
 * The Google Identity Services divs are emitted unconditionally on
 * login.tpl. We use the universally-supported `:empty` pseudo-class
 * (IE9+, every modern engine) instead of `:has()` so this works on
 * older browsers too:
 *   - #g_id_onload is a config-only element, never has children, so
 *     hide it always.
 *   - .g_id_signin starts empty and is populated by Google's JS once
 *     it loads. While empty, hide it - which removes its margin-top
 *     too, so the wrapper produces zero visual whitespace.
 * When GSI loads and inserts content, the children appear and the
 * widget renders normally. No `:has()` needed - works everywhere. */
.nb-gis-slot {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.nb-gis-slot #g_id_onload { display: none; }
.nb-gis-slot .g_id_signin:empty { display: none; }
.nb-gis-slot .g_id_signin { margin-top: 14px; }

/* === v1.14: Order result pages (complete / pending / failed) ===
 * The standard_cart terminal pages (cart.php?a=complete / pending /
 * failed) used to render with twenty-one's white widgets the moment
 * checkout finished, visibly breaking the dark theme the rest of the
 * cart now uses. We wrap each terminal template in .nb-cart-result and
 * scope dark-theme overrides under that class so any leaked twenty-one
 * widget (panel, alert, list-group) gets re-painted, while the
 * overrides cannot bleed outside the cart. !important is needed for
 * the same specificity reasons noted in the .nb-cart-view block above. */
.nb-cart-result,
.nb-cart-result * { color: inherit; }

.nb-cart-result {
  max-width: 640px;
  margin: 0 auto;
  padding: 0 16px;
}

.nb-cart-result .nb-page-hero {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.nb-cart-result .nb-page-hero .nb-section-label { margin-bottom: 14px; }
.nb-cart-result-ic {
  width: 56px !important;
  height: 56px !important;
  margin-bottom: 18px;
}
.nb-cart-result-ic .ic { width: 26px; height: 26px; }
.nb-cart-result .nb-page-hero h1 {
  font-size: clamp(24px, 2.4vw, 30px);
  color: var(--text-strong);
}
.nb-cart-result .nb-page-hero p { margin: 6px auto 0; }

.nb-cart-result-body {
  display: flex;
  flex-direction: column;
  gap: 18px;
  margin-top: 8px;
}

.nb-cart-result-card .card-body {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.nb-cart-result-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding: 12px 0;
  border-bottom: 1px solid var(--border);
}
.nb-cart-result-row:last-child { border-bottom: 0; }
.nb-cart-result-row-label { color: var(--muted); font-size: 14px; }
.nb-cart-result-row-value { color: var(--text-strong); font-weight: 600; }
.nb-cart-result-row-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--accent-light);
  text-decoration: none;
  font-weight: 600;
}
.nb-cart-result-row-link:hover { text-decoration: underline; }
.nb-cart-result-row-link .ic { width: 14px; height: 14px; }

.nb-cart-result-alert { text-align: left; margin: 0; }

.nb-cart-result-actions {
  display: flex;
  gap: 10px;
  justify-content: center;
  flex-wrap: wrap;
  margin-top: 6px;
}

/* Scoped twenty-one neutralisation, mirroring the .nb-cart-view block.
 * The terminal pages rarely emit panels/tables of their own, but
 * gateway-driven payment instructions occasionally inject .alert /
 * .panel markup, so we cover the same surface area for safety. */
.nb-cart-result .panel,
.nb-cart-result .well,
.nb-cart-result .box,
.nb-cart-result .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-cart-result .panel-heading,
.nb-cart-result .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}
.nb-cart-result .panel-body {
  padding: 18px !important;
  background: transparent !important;
}
.nb-cart-result table,
.nb-cart-result .table {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-cart-result .table > thead > tr > th,
.nb-cart-result .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
}
.nb-cart-result .table > tbody > tr > td,
.nb-cart-result .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
}
.nb-cart-result .list-group { background: transparent !important; }
.nb-cart-result .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}


/* === v1.15: Client-area invoice view ===
 * Stock twenty-one viewinvoice.tpl rendered the line-item table,
 * totals panel, payment-method selector and gateway forms on a
 * white background with light Bootstrap widgets, visibly breaking
 * the dark theme the moment customers landed here from the cart's
 * "Update payment & retry" CTA (v1.14). We wrap the override in
 * .nb-invoice-view and scope dark-theme overrides under that class
 * so any twenty-one / gateway-injected widget (panel, well, list-
 * group, alert, input, table) gets re-painted, while the overrides
 * cannot bleed outside the invoice page. !important is needed for
 * the same specificity reasons noted in the .nb-cart-view block. */
.nb-invoice-view,
.nb-invoice-view * { color: inherit; }

.nb-invoice-pay {
  background: linear-gradient(135deg, var(--accent-glow), transparent 60%), var(--card);
  border-color: rgba(100, 87, 246, .35);
}

/* v1.50: WHMCS pre-renders the entire pay-now control into the
 * Smarty variable $paymentbutton - we output it as nofilter HTML
 * inside .nb-invoice-paybtn. That HTML can be a redirect <form>
 * with a submit button (PayPal, Worldpay), an inline widget mount
 * point (Stripe Elements, Adyen, etc), a manual-bank-transfer
 * instruction block, or a plain <a class="btn"> link. Style each
 * shape so the gateway widget matches the rest of the dark card
 * without needing per-gateway tweaks. */
.nb-invoice-paybtn { text-align: left; }
.nb-invoice-paybtn form { margin: 0; display: inline-block; }
.nb-invoice-paybtn .btn,
.nb-invoice-paybtn input[type="submit"],
.nb-invoice-paybtn button[type="submit"] {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 12px 22px;
  font-size: 15px;
  font-weight: 700;
  border-radius: 12px;
  background: var(--accent);
  border: 1px solid var(--accent);
  color: #fff !important;
  cursor: pointer;
  transition: background .15s ease, transform .05s ease;
}
.nb-invoice-paybtn .btn:hover,
.nb-invoice-paybtn input[type="submit"]:hover,
.nb-invoice-paybtn button[type="submit"]:hover {
  background: var(--accent-hover, #5346e8);
  border-color: var(--accent-hover, #5346e8);
  color: #fff !important;
}
.nb-invoice-paybtn .btn:active,
.nb-invoice-paybtn input[type="submit"]:active,
.nb-invoice-paybtn button[type="submit"]:active { transform: translateY(1px); }
.nb-invoice-paybtn p { color: var(--text); margin: 0 0 10px; }
.nb-invoice-paybtn p:last-child { margin-bottom: 0; }
.nb-invoice-paybtn iframe { background: #fff; border-radius: 8px; }

/* v1.54: pay-now layout. Balance on the left, the WHMCS-rendered
 * launcher button {$paymentbutton} on the right.
 *
 * Why no gateway dropdown:
 *   On this WHMCS 9.x install, $paymentbutton renders a small
 *   green "Pay Now" launcher form posting to /invoice/{id}/pay.
 *   That endpoint is the modern Pay Methods picker - it's where
 *   the customer actually chooses PayPal vs card vs saved method.
 *   So a gateway dropdown on the invoice page is redundant
 *   (gateway choice belongs on the picker page) AND broken (the
 *   POST didn't switch the active gateway because $selectedGateway
 *   isn't a variable WHMCS exposes here - dropdown always reverted
 *   to the first option, ie PayPal).
 *
 * What we DO style:
 *   .nb-paymentbutton-wrap is the wrapper around $paymentbutton.
 *   Its descendant .btn rules upgrade WHMCS's tiny btn-success-sm
 *   to a proper themed primary button that matches the rest of
 *   the page. The min-height reserves room in case some gateways
 *   render an SDK widget instead of a launcher (PayPal SDK
 *   buttons typically take ~45-50px). */
.nb-paynow-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
}
.nb-paynow-balance-label {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--muted);
  font-weight: 700;
  margin-bottom: 4px;
}
.nb-paynow-balance-amount {
  font-size: 28px;
  font-weight: 800;
  color: var(--text-strong);
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}

/* Wrapper for the WHMCS-rendered {$paymentbutton} output. We
 * upgrade the default btn-success btn-sm into a themed primary
 * button so the launcher visually matches the rest of the page. */
.nb-paymentbutton-wrap {
  min-height: 48px;
  display: flex;
  align-items: center;
}
.nb-paymentbutton-wrap > form {
  margin: 0;
  display: inline-block;
}
.nb-paymentbutton-wrap iframe {
  background: #fff;
  border-radius: 8px;
}
/* Override WHMCS's btn-success btn-sm launcher so it looks like
 * a primary action, not a tiny utility button. We target the
 * actual button WHMCS renders rather than restyling .btn-success
 * globally, to avoid affecting any other btn-success badge in
 * the page. */
.nb-paymentbutton-wrap .btn,
.nb-paymentbutton-wrap button#btnPayNow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--accent);
  background-image: linear-gradient(135deg, var(--accent), var(--accent-2, #8b7eff));
  color: #fff;
  border: 0;
  font-size: 16px;
  font-weight: 700;
  padding: 14px 32px;
  border-radius: 10px;
  box-shadow: 0 4px 14px rgba(100, 87, 246, .3);
  cursor: pointer;
  transition: transform .12s, box-shadow .12s, filter .12s;
  text-transform: none;
  letter-spacing: 0;
}
.nb-paymentbutton-wrap .btn:hover,
.nb-paymentbutton-wrap button#btnPayNow:hover {
  transform: translateY(-1px);
  box-shadow: 0 6px 20px rgba(100, 87, 246, .42);
  filter: brightness(1.05);
  color: #fff;
}
.nb-paymentbutton-wrap .btn:active,
.nb-paymentbutton-wrap button#btnPayNow:active {
  transform: translateY(0);
  box-shadow: 0 2px 8px rgba(100, 87, 246, .3);
}
.nb-paymentbutton-wrap .btn:focus,
.nb-paymentbutton-wrap button#btnPayNow:focus {
  outline: none;
  box-shadow: 0 4px 14px rgba(100, 87, 246, .3), 0 0 0 3px rgba(100, 87, 246, .25);
}

/* Hint text under the Pay Now button explaining the picker flow. */
.nb-paynow-hint {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
  padding: 10px 14px;
  background: rgba(100, 87, 246, .06);
  border: 1px solid rgba(100, 87, 246, .18);
  border-radius: 8px;
  font-size: 13px;
  color: var(--text);
  line-height: 1.5;
}
.nb-paynow-hint .ic {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  color: var(--accent);
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.nb-paynow-hint strong {
  color: var(--text-strong);
  font-weight: 700;
}

.nb-invoice-view .panel,
.nb-invoice-view .well,
.nb-invoice-view .box,
.nb-invoice-view .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-invoice-view .panel-heading,
.nb-invoice-view .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}
.nb-invoice-view .panel-body {
  padding: 18px !important;
  background: transparent !important;
}

.nb-invoice-view input[type="text"],
.nb-invoice-view input[type="email"],
.nb-invoice-view input[type="number"],
.nb-invoice-view input[type="password"],
.nb-invoice-view input[type="tel"],
.nb-invoice-view select,
.nb-invoice-view textarea {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
}

.nb-invoice-view table,
.nb-invoice-view .table {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-invoice-view .table > thead > tr > th,
.nb-invoice-view .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 12px 16px;
}
.nb-invoice-view .table > tbody > tr > td,
.nb-invoice-view .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
  padding: 12px 16px;
  vertical-align: top;
}

.nb-invoice-view .list-group { background: transparent !important; }
.nb-invoice-view .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

/* Payment-method selector that gateways commonly emit as an inline
 * radio list: re-paint the labels/inputs to match the dark theme
 * without changing layout. */
.nb-invoice-view .paymentmethod,
.nb-invoice-view .payment-methods,
.nb-invoice-view #paymentMethodForm {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-invoice-view label { color: var(--text) !important; }
.nb-invoice-view code {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--accent-light) !important;
  border: 1px solid var(--border);
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 12px;
}

/* Gateway-injected alerts (e.g. "Please complete the form below to
 * pay") sometimes come through with stock Bootstrap colour. Inherit
 * the theme alert styling. */
.nb-invoice-view .alert {
  background: rgba(255, 255, 255, .03) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.nb-invoice-view .alert-info { border-left: 3px solid var(--accent) !important; }
.nb-invoice-view .alert-success { border-left: 3px solid var(--green) !important; }
.nb-invoice-view .alert-warning { border-left: 3px solid var(--amber) !important; }
.nb-invoice-view .alert-danger { border-left: 3px solid var(--red) !important; }

/* === v1.51: /invoice/N/process card-form fixes ===
 * The Pay Methods route (WHMCS 8.6+) renders templates from
 * payment/card/*.tpl and payment/bank/*.tpl. Stock twenty-one ships
 * with .field-error-msg defaulted to display:none and only shown
 * when validation fails (jquery.payment.js calls .show() on it).
 *
 * v1.50 was missing this rule, so the inline error spans
 * ("Expiry date not valid", "CVC number not valid") rendered
 * permanently visible the moment the page loaded - the user
 * reported "Expiry/CVC permanently invalid" and a fake "card
 * declined" because the form validator saw the error spans as
 * already-shown and refused to submit.
 *
 * Hide them by default everywhere (this is the missing stock rule),
 * and add a visible-state trigger so showInputError() still works.
 * Then dark-theme the rest of the card form widgets, scoped under
 * .nb-invoice-process so we don't touch anything outside the
 * invoice payment flow. */

.field-error-msg { display: none; }
.has-error .field-error-msg,
.field-error-msg.field-error-msg-visible,
.form-group.has-error .field-error-msg { display: block; color: var(--red, #ff5874); font-size: 12px; margin-top: 4px; }

.nb-invoice-process {
  color: var(--text);
}
.nb-invoice-process .card {
  background: var(--card-bg, #0f1218) !important;
  border: 1px solid var(--border) !important;
  border-radius: 12px;
  box-shadow: 0 2px 12px rgba(0, 0, 0, .25);
}
.nb-invoice-process .card-body { padding: 22px !important; }
.nb-invoice-process .card-title {
  color: var(--text-strong) !important;
  font-weight: 700;
  font-size: 18px;
  margin-bottom: 18px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--border);
}

.nb-invoice-process .form-group { margin-bottom: 16px; }
.nb-invoice-process .control-label,
.nb-invoice-process .col-form-label,
.nb-invoice-process label {
  color: var(--text) !important;
  font-weight: 500;
}

.nb-invoice-process input[type="text"],
.nb-invoice-process input[type="email"],
.nb-invoice-process input[type="number"],
.nb-invoice-process input[type="password"],
.nb-invoice-process input[type="tel"],
.nb-invoice-process select,
.nb-invoice-process textarea,
.nb-invoice-process .form-control {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 8px 12px;
  border-radius: 6px;
  transition: border-color .15s, background .15s;
}
.nb-invoice-process input[type="text"]:focus,
.nb-invoice-process input[type="email"]:focus,
.nb-invoice-process input[type="number"]:focus,
.nb-invoice-process input[type="password"]:focus,
.nb-invoice-process input[type="tel"]:focus,
.nb-invoice-process select:focus,
.nb-invoice-process textarea:focus,
.nb-invoice-process .form-control:focus {
  border-color: var(--accent) !important;
  background: rgba(255, 255, 255, .05) !important;
  outline: none !important;
  box-shadow: 0 0 0 3px var(--accent-glow, rgba(100, 87, 246, .15)) !important;
}

/* Saved card / pay-method radio cards */
.nb-invoice-process .three-column-grid {
  display: grid;
  grid-template-columns: auto auto 1fr auto auto;
  gap: 8px 12px;
  align-items: center;
  background: rgba(255, 255, 255, .02);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 12px;
  margin-bottom: 12px;
}
.nb-invoice-process .paymethod-info { color: var(--text); }
.nb-invoice-process .paymethod-info label {
  margin: 0;
  cursor: pointer;
  color: var(--text);
}
.nb-invoice-process .paymethod-info i {
  font-size: 18px;
  color: var(--text-strong);
}

/* Submit button - mirror the .nb-invoice-paybtn styling */
.nb-invoice-process .btn-primary,
.nb-invoice-process #btnSubmit {
  background: linear-gradient(135deg, var(--accent), var(--accent-strong, #7d6ff8)) !important;
  border: 0 !important;
  color: #fff !important;
  font-weight: 600;
  padding: 12px 28px !important;
  border-radius: 8px !important;
  font-size: 14px;
  letter-spacing: .02em;
  box-shadow: 0 4px 14px rgba(100, 87, 246, .25);
  transition: transform .12s, box-shadow .15s;
}
.nb-invoice-process .btn-primary:hover,
.nb-invoice-process #btnSubmit:hover {
  transform: translateY(-1px);
  box-shadow: 0 6px 18px rgba(100, 87, 246, .35);
}
.nb-invoice-process .btn-primary:active,
.nb-invoice-process #btnSubmit:active {
  transform: translateY(1px);
  box-shadow: 0 2px 8px rgba(100, 87, 246, .25);
}
.nb-invoice-process .btn-link { color: var(--accent-light, #a89dff) !important; }

/* Stripe Elements / hosted iframes need a light backdrop to render
 * their internal black text correctly. Force light bg only on
 * iframes injected by gateways inside the card form. */
.nb-invoice-process iframe {
  background: #fff;
  border-radius: 6px;
}
.nb-invoice-process .auth3d-area {
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 8px;
}

/* Gateway-injected error banner */
.nb-invoice-process .gateway-errors {
  background: rgba(255, 88, 116, .08) !important;
  border: 1px solid rgba(255, 88, 116, .3) !important;
  color: #ffb3c0 !important;
  border-radius: 8px;
  padding: 12px 16px;
}
.nb-invoice-process .gateway-errors.w-hidden { display: none; }

/* Invoice summary panel on the right column */
.nb-invoice-process .invoice-summary,
.nb-invoice-process .col-md-5 .card {
  position: sticky;
  top: 80px;
}

/* iCheck radio replacement leaves bare inputs visible if the JS
 * hasn't initialised yet. Show them styled so the form still works
 * even before iCheck enhances. */
.nb-invoice-process input[type="radio"].icheck-button,
.nb-invoice-process input[type="checkbox"].toggle-switch-success {
  accent-color: var(--accent);
  width: 16px;
  height: 16px;
  vertical-align: middle;
}

/* === v1.16: Checkout step gateway selector ===
 * The standard_cart's checkout.tpl (the page WHMCS shows after the
 * customer clicks "Complete Order" but before the gateway redirect)
 * renders gateway radios as cards. Inline styles handle the resting
 * state, but :hover and :checked selection states need real CSS to
 * mirror the .nb-gateway behaviour used by nb-standard. Scoped under
 * .nb-cart-view so the rule cannot leak outside the cart. */
.nb-cart-view .nb-cart-gateway {
  transition: border-color .15s, background .15s, color .15s;
}
.nb-cart-view .nb-cart-gateway:hover {
  border-color: var(--border-hover) !important;
  background: var(--card-hover) !important;
}
.nb-cart-view .nb-cart-gateway:has(input[type="radio"]:checked) {
  border-color: var(--accent) !important;
  background: var(--accent-glow) !important;
  color: var(--text-strong) !important;
}

/* The checkout step's custom-field rows render WHMCS-injected
 * descriptions inside <small class="help-block">. Stock twenty-one
 * paints those #777 on white. Re-paint them with the dark-theme
 * muted token, scoped to the cart so unrelated help-blocks elsewhere
 * keep their existing styling. */
.nb-cart-view .help-block {
  color: var(--muted) !important;
}

/* The captcha widget (reCAPTCHA / hCaptcha / image captcha) and
 * gateway modules occasionally inject .checkbox / .radio wrapper
 * markup that twenty-one styles for a light backdrop. Make sure the
 * label text and helper text inherit the dark-theme palette. */
.nb-cart-view .checkbox label,
.nb-cart-view .radio label,
.nb-cart-view label.control-label {
  color: var(--text) !important;
}

/* === v1.16: Mass-pay + add-funds billing pages ===
 * Stock twenty-one masspay.tpl and clientareaaddfunds.tpl rendered
 * the gateway dropdown, totals panel, deposit-limits table and any
 * gateway-injected widgets on a white background with light
 * Bootstrap chrome, visibly breaking the dark theme the moment a
 * customer chose "Pay all unpaid invoices" from the invoice list or
 * "Add credit" from the dashboard. We wrap each override in
 * .nb-masspay-view / .nb-addfunds-view and scope dark-theme overrides
 * under those classes so any twenty-one / gateway-injected widget
 * (panel, well, list-group, alert, input, table, select) gets re-
 * painted, while the overrides cannot bleed outside these pages.
 * !important is needed for the same specificity reasons noted in the
 * .nb-cart-view / .nb-invoice-view blocks. */
.nb-masspay-view,
.nb-masspay-view *,
.nb-addfunds-view,
.nb-addfunds-view * { color: inherit; }

.nb-masspay-view .panel,
.nb-masspay-view .well,
.nb-masspay-view .box,
.nb-masspay-view .panel-default,
.nb-addfunds-view .panel,
.nb-addfunds-view .well,
.nb-addfunds-view .box,
.nb-addfunds-view .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-masspay-view .panel-heading,
.nb-masspay-view .panel-title,
.nb-addfunds-view .panel-heading,
.nb-addfunds-view .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}
.nb-masspay-view .panel-body,
.nb-addfunds-view .panel-body {
  padding: 18px !important;
  background: transparent !important;
}

.nb-masspay-view input[type="text"],
.nb-masspay-view input[type="email"],
.nb-masspay-view input[type="number"],
.nb-masspay-view input[type="password"],
.nb-masspay-view input[type="tel"],
.nb-masspay-view select,
.nb-masspay-view textarea,
.nb-addfunds-view input[type="text"],
.nb-addfunds-view input[type="email"],
.nb-addfunds-view input[type="number"],
.nb-addfunds-view input[type="password"],
.nb-addfunds-view input[type="tel"],
.nb-addfunds-view select,
.nb-addfunds-view textarea {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  border-radius: 8px !important;
  padding: 8px 12px !important;
  min-height: 38px;
}
.nb-masspay-view select,
.nb-addfunds-view select {
  appearance: none;
  -webkit-appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%) !important;
  background-position: calc(100% - 16px) center, calc(100% - 11px) center !important;
  background-size: 5px 5px, 5px 5px !important;
  background-repeat: no-repeat !important;
  padding-right: 32px !important;
}

.nb-masspay-view table,
.nb-masspay-view .table,
.nb-addfunds-view table,
.nb-addfunds-view .table {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-masspay-view .table > thead > tr > th,
.nb-masspay-view .table th,
.nb-addfunds-view .table > thead > tr > th,
.nb-addfunds-view .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 12px 16px;
}
.nb-masspay-view .table > tbody > tr > td,
.nb-masspay-view .table td,
.nb-addfunds-view .table > tbody > tr > td,
.nb-addfunds-view .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
  padding: 12px 16px;
  vertical-align: middle;
}

.nb-masspay-view .list-group,
.nb-addfunds-view .list-group { background: transparent !important; }
.nb-masspay-view .list-group-item,
.nb-addfunds-view .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

.nb-masspay-view label,
.nb-addfunds-view label { color: var(--text) !important; }

/* Gateway-injected payment widgets (Stripe Elements, PayPal buttons,
 * etc.) commonly arrive wrapped in .paymentmethod / .payment-methods /
 * #paymentMethodForm. Strip the stock background so they sit on the
 * dark card naturally. */
.nb-masspay-view .paymentmethod,
.nb-masspay-view .payment-methods,
.nb-masspay-view #paymentMethodForm,
.nb-addfunds-view .paymentmethod,
.nb-addfunds-view .payment-methods,
.nb-addfunds-view #paymentMethodForm {
  background: transparent !important;
  color: var(--text) !important;
}

.nb-masspay-view code,
.nb-addfunds-view code {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--accent-light) !important;
  border: 1px solid var(--border);
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 12px;
}

.nb-masspay-view .alert,
.nb-addfunds-view .alert {
  background: rgba(255, 255, 255, .03) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.nb-masspay-view .alert-info,
.nb-addfunds-view .alert-info { border-left: 3px solid var(--accent) !important; }
.nb-masspay-view .alert-success,
.nb-addfunds-view .alert-success { border-left: 3px solid var(--green) !important; }
.nb-masspay-view .alert-warning,
.nb-addfunds-view .alert-warning { border-left: 3px solid var(--amber) !important; }
.nb-masspay-view .alert-danger,
.nb-addfunds-view .alert-danger { border-left: 3px solid var(--red) !important; }

/* === v1.16: Client-area quote view ===
 * Sibling of the v1.15 .nb-invoice-view block. Stock twenty-one
 * viewquote.tpl rendered the line-item table, totals panel and
 * accept/decline buttons on a white background with light Bootstrap
 * widgets, so customers who landed here from the quote email got a
 * jarring theme break. We mirror the .nb-invoice-view scoping
 * exactly under .nb-quote-view: any twenty-one / WHMCS-injected
 * panel/well/list-group/alert/input/table gets re-painted, and the
 * overrides cannot bleed outside the quote page. !important matches
 * the .nb-invoice-view specificity policy. */
.nb-quote-view,
.nb-quote-view * { color: inherit; }

.nb-quote-pay {
  background: linear-gradient(135deg, var(--accent-glow), transparent 60%), var(--card);
  border-color: rgba(100, 87, 246, .35);
}

.nb-quote-view .panel,
.nb-quote-view .well,
.nb-quote-view .box,
.nb-quote-view .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-quote-view .panel-heading,
.nb-quote-view .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}
.nb-quote-view .panel-body {
  padding: 18px !important;
  background: transparent !important;
}

.nb-quote-view input[type="text"],
.nb-quote-view input[type="email"],
.nb-quote-view input[type="number"],
.nb-quote-view input[type="password"],
.nb-quote-view input[type="tel"],
.nb-quote-view select,
.nb-quote-view textarea {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
}

.nb-quote-view table,
.nb-quote-view .table {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-quote-view .table > thead > tr > th,
.nb-quote-view .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 12px 16px;
}
.nb-quote-view .table > tbody > tr > td,
.nb-quote-view .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
  padding: 12px 16px;
  vertical-align: top;
}

.nb-quote-view .list-group { background: transparent !important; }
.nb-quote-view .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

.nb-quote-view label { color: var(--text) !important; }
.nb-quote-view code {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--accent-light) !important;
  border: 1px solid var(--border);
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 12px;
}

.nb-quote-view .alert {
  background: rgba(255, 255, 255, .03) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.nb-quote-view .alert-info { border-left: 3px solid var(--accent) !important; }
.nb-quote-view .alert-success { border-left: 3px solid var(--green) !important; }
.nb-quote-view .alert-warning { border-left: 3px solid var(--amber) !important; }
.nb-quote-view .alert-danger { border-left: 3px solid var(--red) !important; }

/* nb-dynamics v1.17 - domain renewals page (action=domainrenewals).
 * v1.16 dark-themed mass-pay and add-funds, but the domain renewals
 * page was still inheriting stock twenty-one. We wrap that page in
 * .nb-domainrenewals-view and scope dark-theme overrides under that
 * class so any twenty-one / gateway-injected widget (panel, well,
 * list-group, alert, input, select, table) gets re-painted, while
 * the overrides cannot bleed outside the page. !important is needed
 * for the same specificity reasons noted in the .nb-cart-view /
 * .nb-invoice-view / .nb-masspay-view blocks. */
.nb-domainrenewals-view,
.nb-domainrenewals-view * { color: inherit; }

.nb-domainrenewals-view .panel,
.nb-domainrenewals-view .well,
.nb-domainrenewals-view .box,
.nb-domainrenewals-view .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-domainrenewals-view .panel-heading,
.nb-domainrenewals-view .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}
.nb-domainrenewals-view .panel-body {
  padding: 18px !important;
  background: transparent !important;
}

.nb-domainrenewals-view input[type="text"],
.nb-domainrenewals-view input[type="email"],
.nb-domainrenewals-view input[type="number"],
.nb-domainrenewals-view input[type="password"],
.nb-domainrenewals-view input[type="tel"],
.nb-domainrenewals-view select,
.nb-domainrenewals-view textarea {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  border-radius: 8px !important;
  padding: 8px 12px !important;
  min-height: 38px;
}
.nb-domainrenewals-view select {
  appearance: none;
  -webkit-appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%) !important;
  background-position: calc(100% - 16px) center, calc(100% - 11px) center !important;
  background-size: 5px 5px, 5px 5px !important;
  background-repeat: no-repeat !important;
  padding-right: 32px !important;
}

.nb-domainrenewals-view table,
.nb-domainrenewals-view .table {
  background: transparent !important;
  color: var(--text) !important;
}
.nb-domainrenewals-view .table > thead > tr > th,
.nb-domainrenewals-view .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 12px 16px;
}
.nb-domainrenewals-view .table > tbody > tr > td,
.nb-domainrenewals-view .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
  padding: 12px 16px;
  vertical-align: middle;
}

.nb-domainrenewals-view .list-group { background: transparent !important; }
.nb-domainrenewals-view .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

.nb-domainrenewals-view label { color: var(--text) !important; }

.nb-domainrenewals-view code {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--accent-light) !important;
  border: 1px solid var(--border);
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 12px;
}

.nb-domainrenewals-view .alert {
  background: rgba(255, 255, 255, .03) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.nb-domainrenewals-view .alert-info { border-left: 3px solid var(--accent) !important; }
.nb-domainrenewals-view .alert-success { border-left: 3px solid var(--green) !important; }
.nb-domainrenewals-view .alert-warning { border-left: 3px solid var(--amber) !important; }
.nb-domainrenewals-view .alert-danger { border-left: 3px solid var(--red) !important; }


/* === v1.18: Standalone domain search / TLD pricing pages ===
 * domainregister.tpl, domaintransfer.tpl and domainoptions.tpl all
 * wrap their content in .nb-cart-config so the existing dark-theme
 * scoped overrides cover panels, inputs and tables. These rules are
 * the small extras needed for the bits unique to those pages:
 *  - the per-TLD "results" rows (we want no trailing border on the
 *    last one and a subtle hover affordance)
 *  - the TLD pricing table (a hover row hint + sticky-feel header
 *    weight to make the comparison readable on a long list)
 *  - the "primary domain" availability hero (hover lift + nicely
 *    aligned content on narrow viewports). */
.nb-cart-config .nb-domain-results > div:last-child {
  border-bottom: 0 !important;
}
.nb-cart-config .nb-domain-results > div {
  transition: background .15s;
}
.nb-cart-config .nb-domain-results > div:hover {
  background: var(--card-hover) !important;
}

.nb-cart-config .table thead th {
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 12px 16px !important;
}
.nb-cart-config .table tbody tr {
  transition: background .15s;
}
.nb-cart-config .table tbody tr:hover {
  background: var(--card-hover) !important;
}
.nb-cart-config .table tbody tr:hover td {
  background: transparent !important;
}

.nb-cart-config .nb-domain-primary {
  transition: transform .2s, box-shadow .2s;
}
.nb-cart-config .nb-domain-primary:hover {
  transform: translateY(-1px);
  box-shadow: 0 6px 24px rgba(0, 0, 0, .25);
}
@media (max-width: 540px) {
  .nb-cart-config .nb-domain-primary .card-body {
    flex-direction: column;
    align-items: flex-start !important;
  }
  .nb-cart-config .nb-domain-primary .card-body > form,
  .nb-cart-config .nb-domain-primary .card-body > .badge {
    align-self: flex-start;
  }
}

/* ──────────────────────────────────────────────────────────────────
 * v1.18 register-page polish + login OAuth fallback styling
 *
 * Goals:
 *  - Replace the flat text hero on /register.php with a gradient
 *    .nb-register-hero card mirroring .nb-service-hero / .nb-cart-result.
 *  - Style the new "Quick signup" OAuth card on register.tpl plus its
 *    divider so it sits above the long form without looking glued on.
 *  - Style the new aside cards (sign-in CTA, benefits with stat-icons,
 *    Discord rail).
 *  - Style the v1.18 fallback Google button container on login.tpl.
 *  - Style the .nb-oauth-injected wrapper for WHMCS-rendered OAuth
 *    HTML so any inherited Bootstrap widgets stay dark.
 * Scoped to .nb-register-page / .nb-auth-card / .nb-auth-shell so the
 * rest of the site is unaffected.
 * ────────────────────────────────────────────────────────────────── */

/* === register-page hero === */
.nb-register-page .nb-register-hero {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  background:
    radial-gradient(ellipse 60% 100% at 0% 50%, rgba(100, 87, 246, .18), transparent 70%),
    radial-gradient(ellipse 40% 80% at 100% 100%, rgba(27, 196, 138, .10), transparent 70%),
    var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 28px 32px;
  margin-bottom: 22px;
}
.nb-register-page .nb-register-hero-main { flex: 1 1 auto; min-width: 0; }
.nb-register-page .nb-register-hero h1 {
  font-size: 30px;
  letter-spacing: -.025em;
  margin: 4px 0 8px;
  color: var(--text-strong);
}
.nb-register-page .nb-register-hero p {
  margin: 0 0 14px;
  max-width: 640px;
  color: var(--muted);
  font-size: 15px;
  line-height: 1.55;
}
.nb-register-page .nb-register-hero-stats {
  display: flex;
  gap: 18px;
  flex-wrap: wrap;
  margin-top: 14px;
}
.nb-register-page .nb-register-hero-stat {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--text);
  background: rgba(255, 255, 255, .03);
  border: 1px solid var(--border);
  padding: 7px 12px;
  border-radius: 999px;
}
.nb-register-page .nb-register-hero-stat .ic {
  width: 14px;
  height: 14px;
  color: var(--accent-light);
}
.nb-register-page .nb-register-hero-side { flex: 0 0 auto; }
.nb-register-page .nb-register-hero-glyph {
  width: 84px;
  height: 84px;
  border-radius: 20px;
  background: rgba(100, 87, 246, .08);
  border: 1px solid rgba(100, 87, 246, .25);
  display: flex;
  align-items: center;
  justify-content: center;
}
@media (max-width: 720px) {
  .nb-register-page .nb-register-hero { padding: 22px; flex-direction: column; align-items: flex-start; }
  .nb-register-page .nb-register-hero h1 { font-size: 24px; }
  .nb-register-page .nb-register-hero-side { display: none; }
}

/* === register-page form section cards with numbered step badge === */
.nb-register-page .nb-register-section {
  margin-bottom: 16px;
  transition: border-color .15s, box-shadow .15s;
}
.nb-register-page .nb-register-section:hover {
  border-color: rgba(100, 87, 246, .35);
}
.nb-register-page .nb-register-section .card-header {
  display: flex;
  align-items: center;
  gap: 12px;
}
.nb-register-page .nb-register-step {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 8px;
  background: var(--accent-glow);
  border: 1px solid rgba(100, 87, 246, .35);
  color: var(--accent-light);
  font-size: 12.5px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  flex-shrink: 0;
}

/* === register-page OAuth (Quick signup) card === */
.nb-register-page .nb-register-oauth {
  margin-bottom: 18px;
  border-color: rgba(100, 87, 246, .25);
  background:
    radial-gradient(ellipse 80% 60% at 100% 0%, rgba(100, 87, 246, .12), transparent 70%),
    var(--card);
}
.nb-register-page .nb-register-oauth .card-body { padding-top: 16px; padding-bottom: 18px; }
.nb-register-page .nb-register-oauth .nb-auth-divider {
  margin-top: 16px;
  margin-bottom: 0;
}
.nb-register-page .nb-register-oauth .nb-signin-buttons + .nb-gis-slot { margin-top: 10px; }
.nb-register-page .nb-register-oauth .nb-gis-slot:has(.g_id_signin:empty) { display: none; }

.nb-register-page .nb-register-oauth .nb-gis-slot,
.nb-register-page .nb-register-oauth .providerPreLinking,
.nb-register-page .nb-register-oauth .social-signin-btns {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
  margin: 0 auto;
}
.nb-register-page .nb-register-oauth .g_id_signin,
.nb-register-page .nb-register-oauth .social-signin-btns iframe {
  margin: 6px auto 0 !important;
  display: inline-block;
}
.nb-register-page .nb-register-oauth .nb-gis-slot::before,
.nb-register-page .nb-register-oauth .providerPreLinking::before {
  content: 'Continue with one click';
  display: block;
  font-size: 12.5px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 10px;
  text-align: center;
  font-weight: 600;
}
.nb-register-page .nb-register-oauth .nb-gis-slot:has(.g_id_signin:empty)::before,
.nb-register-page .nb-register-oauth .providerPreLinking:empty::before { display: none; }

/* === register-page submit footer card === */
.nb-register-page .nb-register-submit {
  background:
    radial-gradient(ellipse 60% 100% at 0% 100%, rgba(27, 196, 138, .08), transparent 70%),
    var(--card);
  border-color: rgba(27, 196, 138, .25);
}
.nb-register-page .nb-register-submit .card-body { padding: 22px 24px; }
.nb-register-page .nb-register-secure-note {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 14px 0 0;
  font-size: 12.5px;
  color: var(--muted);
  justify-content: center;
}
.nb-register-page .nb-register-secure-note .ic {
  width: 14px;
  height: 14px;
  color: var(--accent-2);
}

/* === register-page aside cards === */
.nb-register-page .nb-register-signin .card-body {
  display: grid;
  grid-template-columns: 44px 1fr;
  grid-template-rows: auto auto;
  gap: 4px 14px;
  align-items: start;
  padding: 18px 20px;
}
.nb-register-page .nb-register-signin-icon {
  grid-row: 1 / span 2;
  width: 44px;
  height: 44px;
  border-radius: 12px;
  background: var(--accent-glow);
  border: 1px solid rgba(100, 87, 246, .3);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--accent-light);
}
.nb-register-page .nb-register-signin-icon .ic { width: 20px; height: 20px; }
.nb-register-page .nb-register-signin-title {
  color: var(--text-strong);
  font-weight: 700;
  font-size: 14.5px;
  letter-spacing: -.005em;
}
.nb-register-page .nb-register-signin p {
  margin: 4px 0 0;
  font-size: 13px;
  color: var(--muted);
  line-height: 1.5;
}
.nb-register-page .nb-register-signin .btn {
  grid-column: 1 / span 2;
  margin-top: 12px;
}

.nb-register-page .nb-register-benefits .card-body { padding: 8px 8px; }
.nb-register-page .nb-register-benefit {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 10px 12px;
  border-radius: 10px;
  transition: background .15s;
}
.nb-register-page .nb-register-benefit + .nb-register-benefit {
  margin-top: 2px;
}
.nb-register-page .nb-register-benefit:hover {
  background: rgba(255, 255, 255, .025);
}
.nb-register-page .nb-register-benefit .nb-stat-ic {
  width: 32px;
  height: 32px;
  flex-shrink: 0;
}
.nb-register-page .nb-register-benefit .nb-stat-ic .ic { width: 14px; height: 14px; }
.nb-register-page .nb-register-benefit-title {
  color: var(--text-strong);
  font-weight: 600;
  font-size: 13.5px;
  line-height: 1.3;
}
.nb-register-page .nb-register-benefit-sub {
  font-size: 12.5px;
  color: var(--muted);
  margin-top: 2px;
  line-height: 1.4;
}

.nb-register-page .nb-register-discord {
  background:
    radial-gradient(ellipse 100% 80% at 100% 0%, rgba(88, 101, 242, .15), transparent 70%),
    var(--card);
  border-color: rgba(88, 101, 242, .3);
}
.nb-register-page .nb-register-discord .card-body {
  display: grid;
  grid-template-columns: 40px 1fr;
  gap: 14px;
  align-items: start;
  padding: 18px 20px;
}
.nb-register-page .nb-register-discord-icon {
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background: rgba(88, 101, 242, .15);
  border: 1px solid rgba(88, 101, 242, .35);
  color: #8794ff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.nb-register-page .nb-register-discord-title {
  color: var(--text-strong);
  font-weight: 700;
  font-size: 14.5px;
}
.nb-register-page .nb-register-discord p {
  margin: 4px 0 12px;
  font-size: 13px;
  color: var(--muted);
  line-height: 1.5;
}
.nb-register-page .nb-register-discord .btn {
  grid-column: 1 / span 2;
}

/* === .nb-oauth-injected: dark-theme any WHMCS-rendered OAuth HTML ===
 * WHMCS may render its OAuth section using inherited Bootstrap chrome
 * (.btn-default, .btn-google, .well, etc.) which would visually break
 * our dark theme. Force the wrapper's children to inherit colour and
 * hide any panel/well backgrounds the parent theme injects. */
.nb-oauth-injected {
  display: block;
  margin: 0;
}
.nb-oauth-injected .well,
.nb-oauth-injected .panel,
.nb-oauth-injected .panel-default,
.nb-oauth-injected .panel-body,
.nb-oauth-injected .panel-heading {
  background: transparent !important;
  border: 0 !important;
  padding: 0 !important;
  box-shadow: none !important;
  color: inherit !important;
}
.nb-oauth-injected .btn,
.nb-oauth-injected button,
.nb-oauth-injected a.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  margin-bottom: 10px;
}
.nb-oauth-injected .btn:last-child,
.nb-oauth-injected button:last-child,
.nb-oauth-injected a.btn:last-child { margin-bottom: 0; }
.nb-oauth-injected .btn-google,
.nb-oauth-injected .btn[data-provider="google"],
.nb-oauth-injected .btn[class*="google"] {
  background: #fff !important;
  color: #1f1f1f !important;
  border: 1px solid #dadce0 !important;
  font-weight: 600;
}
.nb-oauth-injected h1,
.nb-oauth-injected h2,
.nb-oauth-injected h3,
.nb-oauth-injected h4 {
  font-size: 13px;
  font-weight: 600;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: .06em;
  margin: 0 0 12px;
}

/* === v1.18 login fallback Google button spacing === */
.nb-auth-card .nb-signin-fallback-google {
  margin-top: 10px;
}
.nb-auth-card .nb-signin-fallback-google .btn {
  width: 100%;
}

/* === v1.18 hide Path 5 fallback Google button when GIS populates ===
   Modern :has() lets us reactively hide the always-rendered fallback
   the moment Google Identity Services injects content into
   .g_id_signin. Falls back gracefully on browsers without :has()
   (the fallback button just stays visible alongside GIS) - this is
   acceptable since both buttons land on the same Google flow. */
.nb-auth-shell:has(.nb-gis-slot .g_id_signin > *) .nb-signin-fallback-google,
.nb-register-page:has(.nb-gis-slot .g_id_signin > *) .nb-signin-fallback-google {
  display: none;
}

/* nb-dynamics v1.18 - per-domain management subpages
 * (action=domaindetails / domainnameservers / domaincontacts /
 * domaindns / domainemailforwarding / domainaddons / domaingetepp /
 * domainregisterns). v1.17 dark-themed the cross-domain renewals
 * page, but every per-domain action page reached from the My Domains
 * list was still inheriting stock twenty-one - white panels and tab
 * strips for Registrar Lock, Nameservers, Auto-Renew, Contact
 * Information, EPP, DNS, Email Forwarding, Addons and Child NS. We
 * wrap every override in .nb-domain-view and scope dark-theme
 * overrides under that class so any twenty-one / registrar-injected
 * widget (panel, well, list-group, alert, input, select, table) gets
 * re-painted, while the overrides cannot bleed outside the page.
 * Same containment pattern as .nb-invoice-view / .nb-masspay-view /
 * .nb-domainrenewals-view from v1.15-v1.17. The .nb-domain-tabs
 * piggybacks on the catalogue's .nb-cart-cats pill strip so the
 * sub-tabs match the dark category strip rather than stock Bootstrap
 * .nav-tabs. !important is needed for the same specificity reasons
 * noted in the .nb-cart-view / .nb-invoice-view blocks. */
.nb-domain-view,
.nb-domain-view * { color: inherit; }

.nb-domain-view .panel,
.nb-domain-view .well,
.nb-domain-view .box,
.nb-domain-view .panel-default {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}
.nb-domain-view .panel-heading,
.nb-domain-view .panel-title {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  padding: 14px 18px !important;
}
.nb-domain-view .panel-body {
  padding: 18px !important;
  background: transparent !important;
}

.nb-domain-view input[type="text"],
.nb-domain-view input[type="email"],
.nb-domain-view input[type="number"],
.nb-domain-view input[type="password"],
.nb-domain-view input[type="tel"],
.nb-domain-view input[type="url"],
.nb-domain-view input[type="search"],
.nb-domain-view select,
.nb-domain-view textarea,
.nb-domain-view .form-control {
  background: rgba(255, 255, 255, .03) !important;
  border: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  border-radius: 8px !important;
  padding: 8px 12px !important;
  min-height: 38px;
  box-shadow: none !important;
}
.nb-domain-view input:focus,
.nb-domain-view select:focus,
.nb-domain-view textarea:focus,
.nb-domain-view .form-control:focus {
  border-color: rgba(100, 87, 246, .5) !important;
  outline: none !important;
}
.nb-domain-view select {
  appearance: none;
  -webkit-appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%) !important;
  background-position: calc(100% - 16px) center, calc(100% - 11px) center !important;
  background-size: 5px 5px, 5px 5px !important;
  background-repeat: no-repeat !important;
  padding-right: 32px !important;
}
.nb-domain-view input[type="checkbox"],
.nb-domain-view input[type="radio"] {
  accent-color: var(--accent);
  width: 16px;
  height: 16px;
  min-height: 0;
  margin: 0;
  vertical-align: middle;
}

.nb-domain-view table,
.nb-domain-view .table {
  background: transparent !important;
  color: var(--text) !important;
  margin: 0 !important;
}
.nb-domain-view .table > thead > tr > th,
.nb-domain-view .table th {
  background: transparent !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--muted) !important;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 12px 16px;
}
.nb-domain-view .table > tbody > tr > td,
.nb-domain-view .table td {
  background: transparent !important;
  border-top: 1px solid var(--border) !important;
  color: var(--text) !important;
  padding: 12px 16px;
  vertical-align: middle;
}

.nb-domain-view .list-group { background: transparent !important; }
.nb-domain-view .list-group-item {
  background: transparent !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

.nb-domain-view label { color: var(--text) !important; }

.nb-domain-view code {
  background: rgba(255, 255, 255, .04) !important;
  color: var(--accent-light) !important;
  border: 1px solid var(--border);
  padding: 1px 6px;
  border-radius: 4px;
  font-size: 12px;
}

.nb-domain-view .alert {
  background: rgba(255, 255, 255, .03) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.nb-domain-view .alert-info { border-left: 3px solid var(--accent) !important; }
.nb-domain-view .alert-success { border-left: 3px solid var(--green) !important; }
.nb-domain-view .alert-warning { border-left: 3px solid var(--amber) !important; }
.nb-domain-view .alert-danger { border-left: 3px solid var(--red) !important; }

/* Re-paint stock Bootstrap .nav-tabs / .nav-pills if a registrar
 * module or stock twenty-one fragment renders one inside the page,
 * so it doesn't punch a white strip through the dark chrome. */
.nb-domain-view .nav-tabs,
.nb-domain-view .nav-pills {
  border-bottom: 1px solid var(--border) !important;
  background: transparent !important;
  margin-bottom: 14px;
}
.nb-domain-view .nav-tabs > li > a,
.nb-domain-view .nav-pills > li > a,
.nb-domain-view .nav-tabs .nav-link,
.nb-domain-view .nav-pills .nav-link {
  background: transparent !important;
  border-color: transparent !important;
  color: var(--muted) !important;
  border-radius: 8px 8px 0 0 !important;
  padding: 8px 14px !important;
}
.nb-domain-view .nav-tabs > li.active > a,
.nb-domain-view .nav-tabs .nav-link.active,
.nb-domain-view .nav-pills > li.active > a,
.nb-domain-view .nav-pills .nav-link.active {
  background: var(--card) !important;
  border-color: var(--border) var(--border) var(--card) !important;
  color: var(--accent-light) !important;
}

/* The catalogue pill strip already handles its own active state, but
 * give the per-domain instance a touch more breathing room and keep
 * it horizontally scrollable on narrow viewports. */
.nb-domain-view .nb-domain-tabs {
  margin-bottom: 18px;
}
.nb-domain-view .nb-domain-tabs .ic {
  width: 14px;
  height: 14px;
  vertical-align: -2px;
  opacity: .85;
}

/* Subdued helper for any inline help text that twenty-one or a
 * registrar module emits as <small> / .help-block. */
.nb-domain-view small,
.nb-domain-view .help-block {
  color: var(--muted) !important;
  font-size: 12px;
}

/* ==========================================================================
 * v1.27 - WHMCS cart-flow signup page (/register.php).
 *
 * Diagnosis: on this install /register.php does NOT render our
 * register.tpl. WHMCS routes the standalone signup through its
 * shopping-cart signup flow, so the rendered template is the system
 * signup partial, identifiable by its top-level <div id="registration">
 * + form#frmCheckout + #containerNewUserSignup. Our register.tpl
 * (.nb-register-page wrapper) was effectively dead code on this site.
 *
 * Rather than try to force WHMCS to use register.tpl, we style what's
 * actually rendered. Every rule below is scoped to #registration so it
 * cannot bleed into the real cart checkout pages (which also use
 * #frmCheckout / .card.mb-4 / .form-group.prepend-icon).
 *
 * Visual goal: make this page feel like the rest of the theme - dark
 * card surfaces, purple accent, centered constrained width, properly
 * framed Google sign-in widget at the top, and a clear "or" divider
 * between OAuth and the manual form.
 * ========================================================================= */

#registration {
  max-width: 880px;
  margin: 0 auto;
  padding: 28px 0 60px;
}

/* "Sign Up" sub-heading - turn it into a proper hero block. */
#registration .sub-heading {
  text-align: center;
  margin: 0 0 26px;
  padding: 0;
  position: relative;
}
#registration .sub-heading::before {
  content: 'Get started';
  display: block;
  font-size: 12.5px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--accent-light);
  font-weight: 700;
  margin-bottom: 8px;
}
#registration .sub-heading > span {
  display: inline-block;
  font-family: 'Inter', sans-serif;
  font-size: 34px;
  font-weight: 800;
  line-height: 1.15;
  color: var(--text-strong);
  letter-spacing: -.02em;
  background: linear-gradient(135deg, var(--text-strong) 0%, var(--accent-light) 100%);
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
}
#registration .sub-heading::after {
  content: 'Set up your account to manage services, billing and support in one place.';
  display: block;
  margin: 10px auto 0;
  max-width: 520px;
  font-size: 14.5px;
  line-height: 1.55;
  font-weight: 400;
  color: var(--muted);
  -webkit-text-fill-color: var(--muted);
  letter-spacing: 0;
  background: none;
  -webkit-background-clip: initial;
  background-clip: initial;
  text-transform: none;
}

/* OAuth/Google card - wrap .providerPreLinking as a framed card. */
#registration .providerPreLinking {
  display: block;
  margin: 0 0 18px;
  padding: 22px 24px 24px;
  background:
    radial-gradient(ellipse 80% 60% at 100% 0%, rgba(100, 87, 246, .14), transparent 70%),
    var(--card);
  border: 1px solid rgba(100, 87, 246, .28);
  border-radius: var(--radius);
  box-shadow: 0 4px 18px -8px rgba(100, 87, 246, .25);
  position: relative;
}
#registration .providerPreLinking::before {
  content: 'Quick signup';
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-size: 12.5px;
  letter-spacing: .08em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent-light);
  margin-bottom: 14px;
  text-align: center;
}
#registration .providerPreLinking::after {
  content: 'One click. No password to remember.';
  display: block;
  text-align: center;
  margin-top: 12px;
  font-size: 12.5px;
  color: var(--muted);
  letter-spacing: .01em;
}
#registration .providerPreLinking .social-signin-btns {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  width: 100%;
  gap: 10px;
  margin: 0;
}
#registration .providerPreLinking .g_id_signin,
#registration .providerPreLinking #btnGoogleSignin1 {
  margin: 0 auto !important;
  display: flex !important;
  justify-content: center;
  min-height: 44px;
}
#registration .providerPreLinking .g_id_signin > div,
#registration .providerPreLinking #btnGoogleSignin1 > div {
  margin: 0 auto !important;
}
#registration .providerPreLinking .g_id_signin iframe,
#registration .providerPreLinking #btnGoogleSignin1 iframe {
  margin: 0 auto !important;
  display: block;
}

/* Hide the empty .providerLinkingFeedback wrapper that WHMCS leaves
 * behind below the OAuth widget - it has no padding/border/content
 * and just creates a confusing empty gap. */
#registration .providerLinkingFeedback:empty { display: none; }

/* "or fill out the form below" divider injected via ::before on the
 * first card after the OAuth section. */
#registration .providerPreLinking + .providerLinkingFeedback + .card,
#registration .providerPreLinking + .card {
  position: relative;
  margin-top: 32px;
}
#registration .providerPreLinking + .providerLinkingFeedback + .card::before,
#registration .providerPreLinking + .card::before {
  content: 'or fill out the form below';
  position: absolute;
  top: -22px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--bg);
  padding: 0 14px;
  font-size: 11.5px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 600;
  white-space: nowrap;
  z-index: 2;
}
#registration .providerPreLinking + .providerLinkingFeedback + .card::after,
#registration .providerPreLinking + .card::after {
  content: '';
  position: absolute;
  top: -10px;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent 0%, var(--border) 30%, var(--border) 70%, transparent 100%);
  z-index: 1;
}

/* Section cards: Personal Info, Billing Address, Additional Info,
 * Account Security, Mailing list. Polish the title and spacing. */
#registration .card.mb-4 {
  margin-bottom: 18px !important;
  border-color: var(--border) !important;
  background:
    linear-gradient(180deg, rgba(255, 255, 255, .015) 0%, transparent 60px),
    var(--card) !important;
  overflow: hidden;
}
#registration .card.mb-4 .card-body { padding: 22px 26px 24px; }
#registration .card.mb-4 .card-body.p-4 { padding: 22px 26px 24px !important; }
#registration .card.mb-4 .card-title {
  font-size: 17px;
  font-weight: 700;
  color: var(--text-strong);
  margin: 0 0 18px;
  padding: 0 0 14px;
  border-bottom: 1px solid var(--border);
  letter-spacing: -.01em;
  display: flex;
  align-items: center;
  gap: 10px;
}
#registration .card.mb-4 .card-title::before {
  content: '';
  display: inline-block;
  width: 4px;
  height: 18px;
  border-radius: 2px;
  background: linear-gradient(180deg, var(--accent) 0%, var(--accent-light) 100%);
  flex-shrink: 0;
}
#registration .card.mb-4 .card-title small,
#registration .card.mb-4 .card-title i {
  font-size: 12px;
  font-weight: 400;
  color: var(--muted);
  letter-spacing: 0;
}
#registration .card.mb-4 .card-title br { display: none; }
#registration .card.mb-4 .card-title i { font-style: normal; }

/* Form inputs with the WHMCS .prepend-icon / .field-icon pattern.
 * The icon sits absolutely positioned on the LEFT of the input; we
 * pad the input to clear it and theme the icon for our dark surface. */
#registration .form-group {
  margin-bottom: 14px;
  position: relative;
}
#registration .form-group.prepend-icon {
  position: relative;
}
#registration .form-group.prepend-icon .field-icon {
  position: absolute;
  top: 50%;
  left: 14px;
  transform: translateY(-50%);
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 0;
  pointer-events: none;
  color: var(--muted);
  z-index: 2;
}
#registration .form-group.prepend-icon .field-icon i {
  font-size: 14px;
  color: var(--muted);
  line-height: 1;
}
#registration .form-group .field,
#registration .form-group .form-control,
#registration .form-group select.form-control,
#registration .form-group input[type="text"],
#registration .form-group input[type="email"],
#registration .form-group input[type="tel"],
#registration .form-group input[type="password"] {
  width: 100% !important;
  height: 44px;
  padding: 10px 14px 10px 40px;
  background: var(--input-bg, rgba(255, 255, 255, .02)) !important;
  border: 1px solid var(--border) !important;
  border-radius: 10px !important;
  color: var(--text) !important;
  font-size: 14px;
  line-height: 1.4;
  transition: border-color .15s, box-shadow .15s, background .15s;
  box-shadow: none !important;
  outline: none;
}
#registration .form-group .field:focus,
#registration .form-group .form-control:focus,
#registration .form-group select.form-control:focus {
  border-color: var(--accent) !important;
  background: rgba(100, 87, 246, .04) !important;
  box-shadow: 0 0 0 3px rgba(100, 87, 246, .18) !important;
}
#registration .form-group .field::placeholder,
#registration .form-group .form-control::placeholder { color: var(--muted); opacity: .7; }
#registration .form-group select.form-control {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23a8aab3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right 14px center !important;
  background-size: 12px !important;
  padding-right: 36px;
}
#registration .form-group select.form-control:focus {
  background: rgba(100, 87, 246, .04) url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23a8aab3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") right 14px center / 12px no-repeat !important;
}

/* Hide WHMCS's stacked duplicate state icon labels - they emit two
 * .field-icon elements (#inputStateIcon) for the dropdown vs text
 * input variants and we don't want them stacking. */
#registration .form-group.prepend-icon label.field-icon + label.field-icon { display: none; }

/* Password strength meter (Account Security card). */
#registration .password-strength-meter { margin-top: 8px; }
#registration .password-strength-meter .progress {
  height: 6px;
  border-radius: 3px;
  background: rgba(255, 255, 255, .04);
  overflow: hidden;
}
#registration .password-strength-meter .progress-bar {
  background: linear-gradient(90deg, var(--accent) 0%, var(--green, #1bc48a) 100%) !important;
  border-radius: 3px;
  transition: width .25s;
}
#registration #passwordStrengthTextLabel,
#registration .text-muted { color: var(--muted) !important; font-size: 12px; }
#registration .alert-info {
  background: rgba(100, 87, 246, .08) !important;
  border: 1px solid rgba(100, 87, 246, .25) !important;
  color: var(--text) !important;
  border-radius: 10px;
  padding: 10px 14px;
}

/* "Generate Password" secondary button. */
#registration .btn-default,
#registration .btn-sm {
  background: rgba(255, 255, 255, .04) !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: 8px !important;
  font-size: 12.5px;
  font-weight: 600;
  padding: 8px 14px;
  height: auto;
  transition: border-color .15s, background .15s;
}
#registration .btn-default:hover,
#registration .btn-sm:hover {
  background: rgba(100, 87, 246, .08) !important;
  border-color: rgba(100, 87, 246, .4) !important;
  color: var(--text-strong) !important;
}

/* Mailing list toggle - show as a labelled checkbox. */
#registration input[name="marketingoptin"] {
  width: 18px;
  height: 18px;
  vertical-align: middle;
  accent-color: var(--accent);
}

/* Captcha block. */
#registration #default-captcha-domainchecker {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 20px;
  margin-bottom: 18px;
}
#registration #default-captcha-domainchecker p {
  color: var(--muted);
  font-size: 13px;
  margin-bottom: 12px;
}
#registration #default-captcha-domainchecker .captchaimage img {
  border-radius: 8px;
  max-width: 100%;
  height: auto;
}

/* Terms of Service checkbox. */
#registration .form-check {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--muted);
  font-size: 14px;
}
#registration .form-check .form-check-input,
#registration .form-check input.accepttos {
  width: 18px;
  height: 18px;
  margin: 0;
  accent-color: var(--accent);
  vertical-align: middle;
}
#registration .form-check a {
  color: var(--accent-light);
  font-weight: 600;
  text-decoration: none;
}
#registration .form-check a:hover { text-decoration: underline; }

/* Submit button. */
#registration p.text-center .btn-primary[type="submit"],
#registration p.text-center input.btn-primary[type="submit"] {
  display: inline-block;
  min-width: 240px;
  height: 50px;
  padding: 0 32px;
  font-size: 15px;
  font-weight: 700;
  letter-spacing: .01em;
  border-radius: 12px;
  margin-top: 6px;
  box-shadow: 0 8px 24px -6px rgba(100, 87, 246, .45);
}

/* Note: the "Powered by WHMCompleteSolution" line the cart signup
 * appends is intentionally left visible. WHMCS branding-removal is a
 * licensed entitlement and CSS-hiding it without that entitlement is
 * a license violation - safer to leave it. */

/* ==========================================================================
 * v1.28: validation styling for required fields.
 *
 * Used by theme.js, applied as .is-invalid class on the input. Also
 * paint native :invalid state once the user has touched the field so
 * we don't shout red from the moment the page loads.
 * ========================================================================= */
#registration .form-group .field.is-invalid,
#registration .form-group .form-control.is-invalid,
#registration .form-group input.is-invalid,
#registration .form-group select.is-invalid,
.nb-form-scope .form-group .field.is-invalid,
.nb-form-scope .form-group .form-control.is-invalid,
.nb-form-scope .form-group input.is-invalid,
.nb-form-scope .form-group select.is-invalid {
  border-color: #ef4444 !important;
  background: rgba(239, 68, 68, .05) !important;
  box-shadow: 0 0 0 3px rgba(239, 68, 68, .18) !important;
}
#registration .form-group .field.is-invalid:focus,
#registration .form-group .form-control.is-invalid:focus,
.nb-form-scope .form-group .field.is-invalid:focus,
.nb-form-scope .form-group .form-control.is-invalid:focus {
  border-color: #ef4444 !important;
  box-shadow: 0 0 0 3px rgba(239, 68, 68, .28) !important;
}
#registration .form-check.is-invalid,
.nb-form-scope .form-check.is-invalid {
  color: #ef4444 !important;
}
#registration .form-check.is-invalid .form-check-input,
#registration .form-check input.is-invalid,
.nb-form-scope .form-check.is-invalid .form-check-input,
.nb-form-scope .form-check input.is-invalid {
  outline: 2px solid #ef4444;
  outline-offset: 2px;
  border-radius: 3px;
}

/* Password strength meter colour states (from theme.js scorePassword). */
#passwordStrengthMeterBar.nb-pw-empty { background: rgba(255, 255, 255, .08) !important; }
#passwordStrengthMeterBar.nb-pw-weak { background: linear-gradient(90deg, #ef4444 0%, #f87171 100%) !important; }
#passwordStrengthMeterBar.nb-pw-moderate { background: linear-gradient(90deg, #f59e0b 0%, #fbbf24 100%) !important; }
#passwordStrengthMeterBar.nb-pw-strong { background: linear-gradient(90deg, var(--accent, #6457f6) 0%, var(--green, #1bc48a) 100%) !important; }

/* ==========================================================================
 * v1.28: extend the cart-flow signup card/input theming to all the
 * other "client form" pages - account details, contacts, change
 * password, email preferences, security questions, cancel request,
 * password reset, contact us, submit ticket. Header.tpl adds the
 * .nb-form-scope class to <main> when $bodyclass matches one of these
 * pages, so every selector below is rooted at .nb-form-scope and is
 * safe to ship - never touches dashboard, services, billing or cart.
 *
 * Mirrors the #registration rules from v1.27 so the look is identical.
 * ========================================================================= */

.nb-form-scope > .container { max-width: 920px; padding-top: 8px; }
.nb-form-scope .container > h1,
.nb-form-scope .container > h2,
.nb-form-scope .container > h3 {
  text-align: center;
  font-size: 28px;
  font-weight: 800;
  color: var(--text-strong);
  letter-spacing: -.02em;
  margin: 6px 0 22px;
}

/* ==========================================================================
 * v1.29: card-title rounded-corner clip fix.
 *
 * Problem reported: on the cart-flow signup the gradient-bar `::before`
 * prefix on `.card-title` is clipped by the card's rounded top-left
 * corner, and the title text hugs the corner. Root cause: WHMCS renders
 * some cards with `<h3 class="card-title">` as a DIRECT child of the
 * card (no `.card-body` wrapper), so the title sits flush at top:0
 * left:0 and its bar prefix runs straight into the curved corner that
 * `overflow:hidden + border-radius` clips.
 *
 * Fix: when `.card-title` is a direct child of `.card`, give it edge
 * padding (22px top, 26px left) so it (and its bar prefix) clear the
 * 14-18px corner radius. When wrapped in `.card-body`, the body
 * provides the padding, so we keep the no-edge-padding rule there.
 * ========================================================================= */
#registration .card.mb-4 > .card-title,
#registration .card > .card-title,
.nb-form-scope .card > .card-title,
.nb-form-scope .card > .card-header {
  padding: 22px 26px 14px !important;
  margin: 0 0 18px !important;
}
/* When card-title is INSIDE card-body, body provides edge padding. */
#registration .card .card-body > .card-title,
#registration .card .card-body .card-title,
.nb-form-scope .card .card-body > .card-title,
.nb-form-scope .card .card-body .card-title,
.nb-form-scope .card .card-body > .card-header,
.nb-form-scope .card .card-body .card-header {
  padding: 0 0 14px !important;
  margin: 0 0 18px !important;
}

/* Card surfaces, identical to #registration cards. */
.nb-form-scope .card,
.nb-form-scope .card.mb-4 {
  margin-bottom: 18px !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, .015) 0%, transparent 60px),
    var(--card) !important;
  overflow: hidden;
}
.nb-form-scope .card .card-body { padding: 22px 26px 24px; }
.nb-form-scope .card .card-body.p-4 { padding: 22px 26px 24px !important; }
.nb-form-scope .card-title,
.nb-form-scope .card .card-header {
  font-size: 17px;
  font-weight: 700;
  color: var(--text-strong);
  margin: 0 0 18px;
  padding: 0 0 14px;
  border-bottom: 1px solid var(--border);
  letter-spacing: -.01em;
  display: flex;
  align-items: center;
  gap: 10px;
  background: transparent;
}
.nb-form-scope .card-title::before,
.nb-form-scope .card .card-header::before {
  content: '';
  display: inline-block;
  width: 4px;
  height: 18px;
  border-radius: 2px;
  background: linear-gradient(180deg, var(--accent) 0%, var(--accent-light) 100%);
  flex-shrink: 0;
}
.nb-form-scope .card-title small,
.nb-form-scope .card-title i,
.nb-form-scope .card-title .text-muted {
  font-size: 12px;
  font-weight: 400;
  color: var(--muted);
  letter-spacing: 0;
}

/* Form inputs - identical to #registration inputs. */
.nb-form-scope .form-group { margin-bottom: 14px; position: relative; }
.nb-form-scope .form-group.prepend-icon { position: relative; }
.nb-form-scope .form-group.prepend-icon .field-icon {
  position: absolute;
  top: 50%;
  left: 14px;
  transform: translateY(-50%);
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 0;
  pointer-events: none;
  color: var(--muted);
  z-index: 2;
}
.nb-form-scope .form-group.prepend-icon .field-icon i {
  font-size: 14px;
  color: var(--muted);
  line-height: 1;
}
.nb-form-scope .form-group .field,
.nb-form-scope .form-group .form-control,
.nb-form-scope .form-group select.form-control,
.nb-form-scope .form-group input[type="text"],
.nb-form-scope .form-group input[type="email"],
.nb-form-scope .form-group input[type="tel"],
.nb-form-scope .form-group input[type="password"],
.nb-form-scope .form-group textarea {
  width: 100% !important;
  min-height: 44px;
  padding: 10px 14px;
  background: var(--input-bg, rgba(255, 255, 255, .02)) !important;
  border: 1px solid var(--border) !important;
  border-radius: 10px !important;
  color: var(--text) !important;
  font-size: 14px;
  line-height: 1.4;
  transition: border-color .15s, box-shadow .15s, background .15s;
  box-shadow: none !important;
  outline: none;
  font-family: inherit;
}
.nb-form-scope .form-group.prepend-icon .field,
.nb-form-scope .form-group.prepend-icon .form-control,
.nb-form-scope .form-group.prepend-icon input[type="text"],
.nb-form-scope .form-group.prepend-icon input[type="email"],
.nb-form-scope .form-group.prepend-icon input[type="tel"],
.nb-form-scope .form-group.prepend-icon input[type="password"],
.nb-form-scope .form-group.prepend-icon select.form-control {
  padding-left: 40px;
}
.nb-form-scope .form-group textarea { min-height: 110px; padding-top: 12px; }
.nb-form-scope .form-group .field:focus,
.nb-form-scope .form-group .form-control:focus,
.nb-form-scope .form-group select.form-control:focus,
.nb-form-scope .form-group textarea:focus {
  border-color: var(--accent) !important;
  background: rgba(100, 87, 246, .04) !important;
  box-shadow: 0 0 0 3px rgba(100, 87, 246, .18) !important;
}
.nb-form-scope .form-group .field::placeholder,
.nb-form-scope .form-group .form-control::placeholder,
.nb-form-scope .form-group textarea::placeholder { color: var(--muted); opacity: .7; }
.nb-form-scope .form-group select.form-control {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23a8aab3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right 14px center !important;
  background-size: 12px !important;
  padding-right: 36px;
}
.nb-form-scope .form-group select.form-control:focus {
  background: rgba(100, 87, 246, .04) url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23a8aab3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") right 14px center / 12px no-repeat !important;
}

/* Labels above standalone inputs (account details uses these). */
.nb-form-scope .form-group > label:not(.field-icon):not(.form-check):not(.custom-control-label) {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 6px;
  letter-spacing: .01em;
}
.nb-form-scope .form-group > label .text-danger,
.nb-form-scope .form-group > label .required { color: #ef4444; }

/* Help text. */
.nb-form-scope .help-block,
.nb-form-scope .form-text,
.nb-form-scope small.text-muted {
  font-size: 12px;
  color: var(--muted) !important;
  margin-top: 4px;
  display: block;
}

/* Checkbox / radio rows (email preferences uses these heavily). */
.nb-form-scope .form-check {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0;
  margin: 8px 0;
  font-size: 14px;
  color: var(--text);
}
.nb-form-scope .form-check .form-check-input,
.nb-form-scope .form-check input[type="checkbox"],
.nb-form-scope .form-check input[type="radio"] {
  width: 18px;
  height: 18px;
  margin: 0;
  accent-color: var(--accent);
  flex-shrink: 0;
}
.nb-form-scope .form-check .form-check-label,
.nb-form-scope .form-check label { color: var(--text); font-weight: 400; cursor: pointer; }

/* iCheck / toggle-switch widgets if any. */
.nb-form-scope .toggle-switch-success,
.nb-form-scope input.no-icheck { accent-color: var(--accent); }

/* Row layouts - tighten gutters so 2-col rows don't sprawl. */
.nb-form-scope .row { margin-left: -8px; margin-right: -8px; }
.nb-form-scope .row > [class*="col-"] { padding-left: 8px; padding-right: 8px; }

/* Button bar at the bottom of forms. */
.nb-form-scope .btn-container,
.nb-form-scope .form-actions,
.nb-form-scope .text-center > .btn-primary,
.nb-form-scope .text-right > .btn-primary {
  margin-top: 18px;
}
.nb-form-scope .btn-primary[type="submit"],
.nb-form-scope input.btn-primary[type="submit"],
.nb-form-scope button.btn-primary[type="submit"] {
  min-width: 200px;
  height: 48px;
  padding: 0 28px;
  font-size: 14.5px;
  font-weight: 700;
  border-radius: 12px;
  box-shadow: 0 8px 24px -6px rgba(100, 87, 246, .45);
}
.nb-form-scope .btn-default,
.nb-form-scope .btn-secondary,
.nb-form-scope .btn-sm {
  background: rgba(255, 255, 255, .04) !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: 8px !important;
  font-size: 12.5px;
  font-weight: 600;
  padding: 8px 14px;
  height: auto;
  transition: border-color .15s, background .15s;
}
.nb-form-scope .btn-default:hover,
.nb-form-scope .btn-secondary:hover,
.nb-form-scope .btn-sm:hover {
  background: rgba(100, 87, 246, .08) !important;
  border-color: rgba(100, 87, 246, .4) !important;
  color: var(--text-strong) !important;
}

/* Alerts inside form pages. */
.nb-form-scope .alert {
  border-radius: 10px;
  padding: 12px 16px;
  font-size: 14px;
  border: 1px solid transparent;
  margin-bottom: 18px;
}
.nb-form-scope .alert-info {
  background: rgba(100, 87, 246, .08);
  border-color: rgba(100, 87, 246, .25);
  color: var(--text);
}
.nb-form-scope .alert-success {
  background: rgba(27, 196, 138, .08);
  border-color: rgba(27, 196, 138, .25);
  color: var(--text);
}
.nb-form-scope .alert-warning {
  background: rgba(245, 158, 11, .08);
  border-color: rgba(245, 158, 11, .3);
  color: var(--text);
}
.nb-form-scope .alert-danger {
  background: rgba(239, 68, 68, .08);
  border-color: rgba(239, 68, 68, .3);
  color: var(--text);
}

/* Tabs bar (account details uses left-side or top tabs). */
.nb-form-scope .nav-tabs,
.nb-form-scope .nav-pills {
  border-bottom: 1px solid var(--border);
  margin-bottom: 18px;
  gap: 4px;
}
.nb-form-scope .nav-tabs .nav-link,
.nb-form-scope .nav-pills .nav-link {
  color: var(--muted);
  background: transparent;
  border: none;
  border-bottom: 2px solid transparent;
  border-radius: 0;
  padding: 10px 16px;
  font-size: 13.5px;
  font-weight: 600;
  transition: color .15s, border-color .15s, background .15s;
}
.nb-form-scope .nav-tabs .nav-link:hover,
.nb-form-scope .nav-pills .nav-link:hover {
  color: var(--text-strong);
  background: transparent;
}
.nb-form-scope .nav-tabs .nav-link.active,
.nb-form-scope .nav-pills .nav-link.active {
  color: var(--accent-light);
  background: transparent;
  border-bottom-color: var(--accent);
}

/* List groups (security activity log etc). */
.nb-form-scope .list-group .list-group-item {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: 10px !important;
  margin-bottom: 6px;
  color: var(--text);
  padding: 12px 14px;
  font-size: 13.5px;
}

/* Section headers in <h4>/<h5> within cards. */
.nb-form-scope .card h4,
.nb-form-scope .card h5 {
  font-size: 14px;
  font-weight: 700;
  color: var(--text-strong);
  margin: 18px 0 8px;
  letter-spacing: .01em;
}
.nb-form-scope .card h4:first-child,
.nb-form-scope .card h5:first-child { margin-top: 0; }

/* Headline pattern - detail pages often have a hero before the cards. */
.nb-form-scope .container > .row > .col-md-12 > h1,
.nb-form-scope .page-header h1 {
  font-size: 26px;
  font-weight: 800;
  letter-spacing: -.02em;
  margin: 0 0 22px;
}

/* ==========================================================================
 * v1.29: cart pages visual consistency.
 *
 * The cart-flow templates (viewcart.tpl, checkout.tpl, configureproduct.tpl,
 * configuredomains.tpl, domainregister.tpl, addedtocart.tpl, complete.tpl)
 * use generic `.card` + `.card-header` markup. Up to v1.28 these got the
 * dark-theme bg/border via the `.nb-cart-view *` / `.nb-cart-config *`
 * sweep, but the headers were plain text without the gradient-bar prefix
 * that #registration / .nb-form-scope cards have. Result: the cart pages
 * felt visually disconnected from the form pages even though they shared
 * the same dark surface.
 *
 * This block:
 * 1. Adds the gradient-bar `::before` prefix to every .card .card-header
 *    inside .nb-cart-view / .nb-cart-config / .nb-cart-added / .nb-cart-result.
 * 2. Standardises card-header padding (22px 26px 14px) so the bar prefix
 *    clears the rounded corner.
 * 3. Polishes the form inputs and select chevron in the cart pages.
 * 4. Polishes the totals/gateway list block in viewcart.tpl/checkout.tpl
 *    with consistent spacing and accent colours.
 * 5. Themes the WHMCS-injected domain availability widget (the white block
 *    that renders inline in domainregister.tpl).
 * ========================================================================= */

/* All cart card headers get the gradient bar prefix. Same look as the
 * form-page card titles. The card-header in these templates is always a
 * direct child of .card (no .card-body wrapper around it), so we apply
 * edge padding so the bar clears the rounded corner. */
.nb-cart-view .card > .card-header,
.nb-cart-config .card > .card-header,
.nb-cart-added .card > .card-header,
.nb-cart-result .card > .card-header,
.nb-cart-view .card .card-header,
.nb-cart-config .card .card-header,
.nb-cart-added .card .card-header,
.nb-cart-result .card .card-header {
  padding: 18px 22px 14px !important;
  background: transparent !important;
  border: 0 !important;
  border-bottom: 1px solid var(--border) !important;
  font-size: 15px;
  font-weight: 700;
  color: var(--text-strong);
  letter-spacing: -.01em;
  display: flex;
  align-items: center;
  gap: 10px;
  position: relative;
}
.nb-cart-view .card > .card-header::before,
.nb-cart-config .card > .card-header::before,
.nb-cart-added .card > .card-header::before,
.nb-cart-result .card > .card-header::before,
.nb-cart-view .card .card-header::before,
.nb-cart-config .card .card-header::before,
.nb-cart-added .card .card-header::before,
.nb-cart-result .card .card-header::before {
  content: '';
  display: inline-block;
  width: 4px;
  height: 18px;
  border-radius: 2px;
  background: linear-gradient(180deg, var(--accent) 0%, var(--accent-light) 100%);
  flex-shrink: 0;
}

/* The inline span (with WHMCS icon SVG) inside our card-header markup
 * still aligns left of the title text. Make sure it doesn't fight the
 * bar prefix layout. */
.nb-cart-view .card .card-header > span,
.nb-cart-config .card .card-header > span,
.nb-cart-added .card .card-header > span,
.nb-cart-result .card .card-header > span {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

/* Card body inside cart contexts - consistent padding. */
.nb-cart-view .card .card-body,
.nb-cart-config .card .card-body,
.nb-cart-added .card .card-body,
.nb-cart-result .card .card-body { padding: 18px 22px 20px; }

/* Inputs in cart pages get the same focus halo as the form pages. */
.nb-cart-view input[type="text"]:focus,
.nb-cart-view input[type="email"]:focus,
.nb-cart-view input[type="number"]:focus,
.nb-cart-view input[type="password"]:focus,
.nb-cart-view select:focus,
.nb-cart-view textarea:focus,
.nb-cart-config input[type="text"]:focus,
.nb-cart-config input[type="email"]:focus,
.nb-cart-config input[type="number"]:focus,
.nb-cart-config input[type="password"]:focus,
.nb-cart-config select:focus,
.nb-cart-config textarea:focus {
  border-color: var(--accent) !important;
  background: rgba(100, 87, 246, .04) !important;
  box-shadow: 0 0 0 3px rgba(100, 87, 246, .18) !important;
  outline: none !important;
}
.nb-cart-view input[type="text"],
.nb-cart-view input[type="email"],
.nb-cart-view input[type="number"],
.nb-cart-view input[type="password"],
.nb-cart-view select,
.nb-cart-view textarea,
.nb-cart-config input[type="text"],
.nb-cart-config input[type="email"],
.nb-cart-config input[type="number"],
.nb-cart-config input[type="password"],
.nb-cart-config select,
.nb-cart-config textarea {
  min-height: 44px;
  padding: 10px 14px;
  border-radius: 10px !important;
  font-size: 14px;
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.nb-cart-view select,
.nb-cart-config select {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23a8aab3' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right 14px center !important;
  background-size: 12px !important;
  padding-right: 36px !important;
}
.nb-cart-view input[type="checkbox"],
.nb-cart-view input[type="radio"],
.nb-cart-config input[type="checkbox"],
.nb-cart-config input[type="radio"] {
  width: 18px;
  height: 18px;
  accent-color: var(--accent);
  margin: 0;
  flex-shrink: 0;
}

/* Buttons inside cart pages - primary stays as-is (themed already), make
 * sure default/secondary/sm buttons match the form-page secondary look. */
.nb-cart-view .btn:not(.btn-primary):not(.btn-ghost):not(.btn-block):not(.btn-lg),
.nb-cart-config .btn:not(.btn-primary):not(.btn-ghost):not(.btn-block):not(.btn-lg) {
  background: rgba(255, 255, 255, .04) !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: 8px !important;
  font-size: 12.5px;
  font-weight: 600;
  padding: 8px 14px;
  height: auto;
  transition: border-color .15s, background .15s;
}
.nb-cart-view .btn:not(.btn-primary):not(.btn-ghost):not(.btn-block):not(.btn-lg):hover,
.nb-cart-config .btn:not(.btn-primary):not(.btn-ghost):not(.btn-block):not(.btn-lg):hover {
  background: rgba(100, 87, 246, .08) !important;
  border-color: rgba(100, 87, 246, .4) !important;
  color: var(--text-strong) !important;
}
.nb-cart-view .btn-primary.btn-lg.btn-block,
.nb-cart-config .btn-primary.btn-lg.btn-block,
.nb-cart-view .btn-primary[type="submit"],
.nb-cart-config .btn-primary[type="submit"] {
  width: 100%;
  height: 48px;
  font-size: 14.5px;
  font-weight: 700;
  border-radius: 12px;
  box-shadow: 0 8px 24px -6px rgba(100, 87, 246, .45);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
}

/* Totals card polish in viewcart.tpl. */
.nb-cart-view .col-md-4 .card .card-body { padding: 16px 20px 18px; }

/* Payment method radio rows look better with hover state. */
.nb-cart-view .col-md-4 .card .card-body label {
  border-radius: 8px;
  margin: 0 -10px;
  padding: 8px 10px !important;
  transition: background .12s;
}
.nb-cart-view .col-md-4 .card .card-body label:hover {
  background: rgba(100, 87, 246, .06);
}

/* Alerts inside cart - tighten and theme. */
.nb-cart-view .alert,
.nb-cart-config .alert,
.nb-cart-added .alert,
.nb-cart-result .alert {
  border-radius: 10px;
  padding: 12px 16px;
  font-size: 14px;
  border: 1px solid transparent;
  display: flex;
  align-items: flex-start;
  gap: 10px;
}
.nb-cart-view .alert .ic,
.nb-cart-config .alert .ic,
.nb-cart-added .alert .ic,
.nb-cart-result .alert .ic { flex-shrink: 0; margin-top: 2px; }
.nb-cart-view .alert-success,
.nb-cart-config .alert-success,
.nb-cart-added .alert-success {
  background: rgba(27, 196, 138, .08) !important;
  border-color: rgba(27, 196, 138, .25) !important;
  color: var(--text) !important;
}
.nb-cart-view .alert-danger,
.nb-cart-config .alert-danger,
.nb-cart-added .alert-danger {
  background: rgba(239, 68, 68, .08) !important;
  border-color: rgba(239, 68, 68, .3) !important;
  color: var(--text) !important;
}
.nb-cart-view .alert-warning,
.nb-cart-config .alert-warning,
.nb-cart-added .alert-warning {
  background: rgba(245, 158, 11, .08) !important;
  border-color: rgba(245, 158, 11, .3) !important;
  color: var(--text) !important;
}
.nb-cart-view .alert-info,
.nb-cart-config .alert-info,
.nb-cart-added .alert-info {
  background: rgba(100, 87, 246, .08) !important;
  border-color: rgba(100, 87, 246, .25) !important;
  color: var(--text) !important;
}

/* WHMCS-leaked domain availability widget on /cart.php?a=add&domain=register.
 * This is the AJAX panel that appears under the search bar with TLD
 * results. WHMCS injects it as `.domain-lookup-result` (or .domain-result
 * /.tld-lookup-result depending on version) with a white background.
 * Force dark and add our card chrome. */
.nb-cart-config .domain-lookup-result,
.nb-cart-config .tld-lookup-result,
.nb-cart-config .domain-lookup-results,
.nb-cart-config .domain-suggestions,
.nb-cart-config .domain-lookup,
.nb-cart-config .domain-result-row,
.nb-cart-config .panel-tld-pricing,
.nb-cart-config .domain-pricing-table-wrapper,
.nb-cart-config #lookup-result,
.nb-cart-config #lookupSuggestions {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius) !important;
  color: var(--text) !important;
  padding: 14px 18px !important;
  margin-top: 14px !important;
}
.nb-cart-config .domain-lookup-result *,
.nb-cart-config .tld-lookup-result *,
.nb-cart-config .domain-lookup-results *,
.nb-cart-config .domain-suggestions *,
.nb-cart-config .domain-result-row *,
.nb-cart-config .panel-tld-pricing *,
.nb-cart-config .domain-pricing-table-wrapper *,
.nb-cart-config #lookup-result *,
.nb-cart-config #lookupSuggestions * {
  background-color: transparent !important;
  color: inherit !important;
}
.nb-cart-config .domain-lookup-result strong,
.nb-cart-config .domain-lookup-result h4,
.nb-cart-config .domain-lookup-result h5,
.nb-cart-config .tld-lookup-result strong,
.nb-cart-config .domain-result-row strong { color: var(--text-strong) !important; }
.nb-cart-config .domain-lookup-result .available,
.nb-cart-config .domain-result-available,
.nb-cart-config .text-success { color: var(--green) !important; }
.nb-cart-config .domain-lookup-result .unavailable,
.nb-cart-config .domain-result-unavailable,
.nb-cart-config .text-danger { color: #ef4444 !important; }
.nb-cart-config .label,
.nb-cart-config .badge {
  background: rgba(100, 87, 246, .12) !important;
  color: var(--accent-light) !important;
  border-radius: 6px;
  padding: 3px 8px;
  font-size: 11.5px;
  font-weight: 600;
}

/* Catch-all for any remaining white panels WHMCS injects in the cart
 * flow (e.g. configurable-options widgets, addon picker). */
.nb-cart-config .well,
.nb-cart-config .panel,
.nb-cart-view .well,
.nb-cart-view .panel,
.nb-cart-config .form-control[readonly],
.nb-cart-view .form-control[readonly] {
  background: var(--card) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}

/* The inline subtotal/cycle pricing widget WHMCS renders as
 * .product-pricing-display - re-theme to match. */
.nb-cart-config .product-pricing-display,
.nb-cart-config .pricing-display,
.nb-cart-config .pricing-summary {
  background: rgba(100, 87, 246, .04) !important;
  border: 1px solid rgba(100, 87, 246, .2) !important;
  border-radius: 10px !important;
  padding: 14px 16px !important;
  color: var(--text-strong) !important;
}

/* ============================================================
 * v1.30 - Cart landing (cart.tpl) and stuck-loader suppression
 * ============================================================ */

/* The new cart.tpl landing page renders all categories as a feature
 * grid. Each card is a flex column so the "Browse" CTA always sits at
 * the bottom regardless of how much description text the category has.
 */
.nb-cart-landing { padding: 4px 0 12px; }
.nb-cart-landing .nb-feature-grid { gap: 16px; }
.nb-cart-landing .nb-feature-card { display: flex; flex-direction: column; }
.nb-cart-landing .nb-feature-card h3 {
  margin: 10px 0 6px;
  font-size: 17px;
  letter-spacing: -.01em;
}
.nb-cart-landing .nb-feature-card p {
  margin: 0;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--muted);
}
.nb-cart-landing .nb-cart-grouplist {
  border-top: 1px solid var(--border);
  margin-top: 14px !important;
  padding-top: 12px !important;
}
.nb-cart-landing .nb-feature-go {
  margin-top: auto;
  padding-top: 16px;
}

/* WHMCS / twenty-one parent theme injects loading overlays via
 * $headeroutput / $footeroutput on certain pages. On the support
 * tickets page the user reported the page never finished rendering
 * and just showed an infinite "Loading" scroll. Our static
 * supporttickets.tpl renders the ticket table server-side so the
 * AJAX-completion handler that would normally hide the loader never
 * fires, leaving the spinner visible forever.
 *
 * SCOPING: every rule below is scoped to a support-page bodyclass
 * (`.supporttickets`, `.viewticket`, `.submitticket`,
 * `.knowledgebase`, `.announcements`, `.downloads`, `.serverstatus`).
 * This is deliberately narrow - we do NOT want to suppress the
 * legitimate loaders that fire during checkout (3DS challenges,
 * fraud check, gateway tokenisation) or during async actions on
 * the dashboard. Code review v1.30 flagged the previous unscoped
 * version as commerce-flow risky; this scoped version cannot affect
 * cart/checkout/clientarea pages.
 */
/* v1.31: scope changed from individual WHMCS bodyclasses to a single
 * `nb-support-page` class added by header.tpl based on REQUEST_URI.
 * The user's WHMCS install was rendering an empty $bodyclass attribute
 * (visible in dev tools: <body class="nb-body">) so the v1.30 selectors
 * never matched and the loader stayed visible. The new class is set
 * server-side in the template, so it's present on first paint and the
 * CSS can reliably target it.
 *
 * Still scoped: cart, checkout, clientarea, payment flows are NOT
 * affected - only pages whose URL ends in supporttickets.php /
 * submitticket.php / viewticket.php / knowledgebase.php /
 * announcements.php / downloads.php / serverstatus.php.
 */
body.nb-support-page #loadingDiv,
body.nb-support-page .loadingDiv,
body.nb-support-page #ajaxLoader,
body.nb-support-page .ajax-loader,
body.nb-support-page .dataTables_processing,
body.nb-support-page #preloader,
body.nb-support-page .preloader,
body.nb-support-page .se-pre-con {
  display: none !important;
  visibility: hidden !important;
  opacity: 0 !important;
  pointer-events: none !important;
}

/* Some twenty-one builds wrap the entire page in a fixed-position
 * loading screen with class .loading-screen / #loading-screen / etc.
 * On support pages, hide those wrappers too. */
body.nb-support-page .loading-screen,
body.nb-support-page #loading-screen,
body.nb-support-page .page-loader,
body.nb-support-page #page-loader,
body.nb-support-page .full-page-loader,
body.nb-support-page #full-page-loader {
  display: none !important;
}

/* Some loaders dim the body via a class. Force back to visible on
 * support pages only. */
body.nb-support-page.loading,
body.nb-support-page.is-loading,
body.nb-support-page.page-loading {
  overflow: auto !important;
}
body.nb-support-page.loading > *,
body.nb-support-page.is-loading > *,
body.nb-support-page.page-loading > * {
  filter: none !important;
  opacity: 1 !important;
}


/* ================================================================
 * v1.32 - Order-form categories sidebar.
 *
 * Used by orderforms/nb-cart/sidebar-categories.tpl which is
 * included on products.tpl, configureproduct.tpl, configuredomains.tpl,
 * domainoptions.tpl, viewcart.tpl. Renders a left-rail navigation
 * showing every $productGroup so the customer can hop between
 * Web Hosting / Reseller / VPS / Domains without leaving the funnel.
 *
 * The user reported that on their install /cart.php gets rewritten
 * to /index.php?rp=/store/{slug} (WHMCS friendly URL routing) and
 * therefore the cart.tpl categories landing page is never rendered.
 * The sidebar gives them a way back into category navigation from
 * any per-category /store/{slug} page.
 * ================================================================ */
.nb-cart-sidebar-col {
  margin-bottom: 18px;
}
.nb-cart-sidebar {
  position: sticky;
  top: 96px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.nb-cart-sidebar-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 14px;
}
.nb-cart-sidebar-h {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--muted);
  padding: 0 4px 10px;
  margin-bottom: 8px;
  border-bottom: 1px solid var(--border);
}
.nb-cart-sidebar-h .ic {
  width: 14px;
  height: 14px;
  color: var(--accent);
}
.nb-cart-sidebar-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.nb-cart-sidebar-list li {
  margin: 0;
  padding: 0;
}
.nb-cart-sidebar-link {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 10px;
  border-radius: 8px;
  color: var(--text);
  font-size: 13.5px;
  font-weight: 500;
  text-decoration: none !important;
  transition: background-color .15s ease, color .15s ease;
}
.nb-cart-sidebar-link:hover,
.nb-cart-sidebar-link:focus-visible {
  background: rgba(100, 87, 246, 0.08);
  color: var(--text-strong);
}
.nb-cart-sidebar-link.is-active {
  background: rgba(100, 87, 246, 0.14);
  color: var(--text-strong);
  font-weight: 600;
}
.nb-cart-sidebar-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--border);
  flex-shrink: 0;
  transition: background-color .15s ease;
}
.nb-cart-sidebar-link:hover .nb-cart-sidebar-dot {
  background: var(--accent);
}
.nb-cart-sidebar-link.is-active .nb-cart-sidebar-dot {
  background: var(--accent);
  box-shadow: 0 0 0 3px rgba(100, 87, 246, 0.18);
}
.nb-cart-sidebar-label {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nb-cart-sidebar-go {
  width: 14px;
  height: 14px;
  color: var(--accent);
  flex-shrink: 0;
}
.nb-cart-sidebar-help-p {
  font-size: 12.5px;
  color: var(--muted);
  margin: 0 0 10px;
  padding: 0 4px;
  line-height: 1.5;
}

/* Mobile: collapse sidebar above content, no longer sticky. */
@media (max-width: 991px) {
  .nb-cart-sidebar { position: static; }
  .nb-cart-sidebar-list { flex-direction: row; flex-wrap: wrap; }
  .nb-cart-sidebar-list li { flex: 1 1 auto; }
  .nb-cart-sidebar-link { padding: 8px 12px; }
  .nb-cart-sidebar-help { display: none; }
}

/* v1.32: ensure WHMCS standard_cart's $domain.fields injected HTML
 * (TLD-specific custom fields, EPP / nameserver inputs, anything
 * the registrar plugin renders) inherits our dark theme inside the
 * .nb-cart-config wrapper. The stock markup uses .form-control,
 * .form-group, label.control-label, plus raw <input>/<select>/
 * <textarea> with no class. */
.nb-cart-config .form-control,
.nb-cart-config input[type="text"],
.nb-cart-config input[type="email"],
.nb-cart-config input[type="password"],
.nb-cart-config input[type="number"],
.nb-cart-config input[type="tel"],
.nb-cart-config input[type="url"],
.nb-cart-config select,
.nb-cart-config textarea {
  background: var(--input-bg, rgba(255,255,255,.04)) !important;
  color: var(--text-strong) !important;
  border: 1px solid var(--border) !important;
  border-radius: 8px !important;
  padding: 9px 12px !important;
  font-size: 13.5px !important;
  width: 100%;
  max-width: 100%;
}
.nb-cart-config select {
  appearance: none;
  -webkit-appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%),
                    linear-gradient(135deg, var(--muted) 50%, transparent 50%);
  background-position: calc(100% - 18px) 50%, calc(100% - 13px) 50%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  padding-right: 32px !important;
}
.nb-cart-config .form-control:focus,
.nb-cart-config input:focus,
.nb-cart-config select:focus,
.nb-cart-config textarea:focus {
  outline: none !important;
  border-color: var(--accent) !important;
  box-shadow: 0 0 0 3px rgba(100, 87, 246, 0.18) !important;
}
.nb-cart-config label,
.nb-cart-config .control-label {
  color: var(--text);
  font-weight: 500;
  font-size: 13px;
  margin-bottom: 6px;
}
.nb-cart-config .help-block,
.nb-cart-config small {
  color: var(--muted);
  font-size: 12px;
}
.nb-cart-config .form-group {
  margin-bottom: 14px;
}

/* === v1.56: standalone viewinvoice.tpl page (.nb-invoice-page body)
 * The viewinvoice.tpl is a STANDALONE page in WHMCS — it has its
 * own <head>/<body>/<html> and does NOT use header.tpl/footer.tpl.
 * Twenty-one's invoice.min.css paints it light. Repaint dark and
 * theme the gateway dropdown so the user can switch between
 * paypal_ppcpv (PayPal wallet) and paypal_acdc (Credit/Debit Card)
 * via stock WHMCS's $availableGateways select before clicking
 * Pay Now. Scoped to body.nb-invoice-page so this CSS only fires
 * on the standalone viewinvoice page. */
body.nb-invoice-page {
  background: var(--bg, #07090f) !important;
  color: var(--text, #cfd3dc) !important;
  font-family: 'Inter', system-ui, -apple-system, sans-serif !important;
  min-height: 100vh;
  padding: 24px 0;
}
body.nb-invoice-page .invoice-container {
  max-width: 980px;
  margin: 0 auto;
  background: var(--card, #0f1218);
  border: 1px solid var(--border, rgba(255,255,255,.08));
  border-radius: 14px;
  padding: 32px;
  box-shadow: 0 10px 40px rgba(0,0,0,.4);
}
body.nb-invoice-page .invoice-header h2,
body.nb-invoice-page .invoice-header h3,
body.nb-invoice-page strong,
body.nb-invoice-page .card-title {
  color: var(--text-strong, #fff) !important;
}
body.nb-invoice-page .invoice-status .unpaid { color: var(--amber, #ffb454) !important; }
body.nb-invoice-page .invoice-status .paid { color: var(--green, #1bc48a) !important; }
body.nb-invoice-page .invoice-status .draft { color: var(--muted, #9ba3b4) !important; }
body.nb-invoice-page .invoice-status .cancelled,
body.nb-invoice-page .invoice-status .refunded { color: var(--red, #ff5874) !important; }

body.nb-invoice-page hr {
  border-color: var(--border, rgba(255,255,255,.08)) !important;
}
body.nb-invoice-page .card,
body.nb-invoice-page .card.bg-default {
  background: rgba(255,255,255,.02) !important;
  border: 1px solid var(--border, rgba(255,255,255,.08)) !important;
  color: var(--text, #cfd3dc) !important;
  border-radius: 10px;
}
body.nb-invoice-page .card-header {
  background: rgba(255,255,255,.03) !important;
  border-bottom: 1px solid var(--border, rgba(255,255,255,.08)) !important;
  color: var(--text-strong, #fff) !important;
}
body.nb-invoice-page .card-title.bg-info {
  background: linear-gradient(135deg, var(--accent, #6457f6), var(--accent-hover, #5346e8)) !important;
  color: #fff !important;
}

body.nb-invoice-page .table,
body.nb-invoice-page .table-sm {
  background: transparent !important;
  color: var(--text, #cfd3dc) !important;
}
body.nb-invoice-page .table thead td,
body.nb-invoice-page .table thead th {
  color: var(--text-strong, #fff) !important;
  border-bottom: 1px solid var(--border, rgba(255,255,255,.08)) !important;
}
body.nb-invoice-page .table tbody td {
  border-color: var(--border, rgba(255,255,255,.08)) !important;
}
body.nb-invoice-page .table tbody tr:hover td {
  background: rgba(255,255,255,.02) !important;
}
body.nb-invoice-page .total-row {
  background: rgba(100, 87, 246, .08) !important;
  font-weight: 600;
  color: var(--text-strong, #fff) !important;
}

body.nb-invoice-page address,
body.nb-invoice-page .small-text {
  color: var(--text, #cfd3dc);
}
body.nb-invoice-page address {
  font-style: normal;
  line-height: 1.6;
}

/* Gateway dropdown - the critical control. Stock WHMCS gives you
 * a <select> populated from $availableGateways, gated by
 * $allowchangegateway. This is how the user switches from card
 * to PayPal at payment time. Theme it to match. */
body.nb-invoice-page select.custom-select,
body.nb-invoice-page select[name="gateway"] {
  background: rgba(255,255,255,.04) !important;
  border: 1px solid var(--border, rgba(255,255,255,.18)) !important;
  color: var(--text-strong, #fff) !important;
  padding: 8px 32px 8px 12px !important;
  border-radius: 8px !important;
  font-size: 14px !important;
  cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6' fill='none'%3E%3Cpath d='M1 1L5 5L9 1' stroke='%239BA3B4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat !important;
  background-position: right 10px center !important;
}
body.nb-invoice-page select.custom-select:focus,
body.nb-invoice-page select[name="gateway"]:focus {
  outline: none !important;
  border-color: var(--accent, #6457f6) !important;
  box-shadow: 0 0 0 3px rgba(100, 87, 246, .18) !important;
}
body.nb-invoice-page select option {
  background: #0f1218 !important;
  color: var(--text-strong, #fff) !important;
}

/* The {$paymentbutton} container. WHMCS injects either a launcher
 * <form> with a Pay Now button, OR an inline gateway widget (PayPal
 * SDK buttons, etc). Style both cases consistently. */
body.nb-invoice-page .payment-btn-container {
  margin-top: 16px;
}
body.nb-invoice-page .payment-btn-container form {
  display: inline-block;
  margin: 0;
}
body.nb-invoice-page .payment-btn-container .btn,
body.nb-invoice-page .payment-btn-container button[type="submit"],
body.nb-invoice-page .payment-btn-container button#btnPayNow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  background: linear-gradient(135deg, var(--accent, #6457f6), var(--accent-hover, #7d6ff8)) !important;
  color: #fff !important;
  border: 0 !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  padding: 14px 36px !important;
  border-radius: 10px !important;
  box-shadow: 0 4px 14px rgba(100, 87, 246, .3) !important;
  cursor: pointer;
  transition: transform .12s, box-shadow .15s, filter .12s;
}
body.nb-invoice-page .payment-btn-container .btn:hover,
body.nb-invoice-page .payment-btn-container button#btnPayNow:hover {
  transform: translateY(-1px);
  box-shadow: 0 6px 20px rgba(100, 87, 246, .42) !important;
  filter: brightness(1.05);
  color: #fff !important;
}

/* Buttons + links */
body.nb-invoice-page .btn-default {
  background: rgba(255,255,255,.05) !important;
  border: 1px solid var(--border, rgba(255,255,255,.18)) !important;
  color: var(--text, #cfd3dc) !important;
}
body.nb-invoice-page .btn-default:hover {
  background: rgba(255,255,255,.08) !important;
  border-color: var(--border-hover, rgba(255,255,255,.28)) !important;
  color: var(--text-strong, #fff) !important;
}
body.nb-invoice-page a {
  color: var(--accent-light, #a89dff);
}
body.nb-invoice-page a:hover {
  color: var(--accent, #6457f6);
}

/* Alert panels (paymentSuccess / paymentFailed / pendingReview etc) */
body.nb-invoice-page .alert {
  background: rgba(255,255,255,.03) !important;
  border-color: var(--border, rgba(255,255,255,.08)) !important;
  color: var(--text, #cfd3dc) !important;
  border-radius: 8px;
}
body.nb-invoice-page .alert-success { border-left: 3px solid var(--green, #1bc48a) !important; }
body.nb-invoice-page .alert-info { border-left: 3px solid var(--accent, #6457f6) !important; }
body.nb-invoice-page .alert-warning { border-left: 3px solid var(--amber, #ffb454) !important; }
body.nb-invoice-page .alert-danger { border-left: 3px solid var(--red, #ff5874) !important; }
body.nb-invoice-page .panel.panel-success > .panel-heading {
  background: rgba(27, 196, 138, .12) !important;
  color: var(--green, #1bc48a) !important;
  border-color: rgba(27, 196, 138, .3) !important;
}
body.nb-invoice-page .panel.panel-danger > .panel-heading {
  background: rgba(255, 88, 116, .12) !important;
  color: var(--red, #ff5874) !important;
  border-color: rgba(255, 88, 116, .3) !important;
}
body.nb-invoice-page .panel.panel-info > .panel-heading {
  background: rgba(100, 87, 246, .12) !important;
  color: var(--accent-light, #a89dff) !important;
  border-color: rgba(100, 87, 246, .3) !important;
}

@media print {
  body.nb-invoice-page {
    background: #fff !important;
    color: #000 !important;
  }
  body.nb-invoice-page .invoice-container {
    background: #fff !important;
    color: #000 !important;
    border: 0 !important;
    box-shadow: none !important;
  }
  body.nb-invoice-page * { color: #000 !important; }
}

/* === v1.57: PayPal prompt button on viewinvoice + PayPal-only UI on invoice-payment === */

/* Prominent "Pay with PayPal instead" prompt under the Pay Now button on viewinvoice */
body.nb-invoice-page .nb-paypal-prompt {
  margin-top: 14px;
  text-align: center;
}
body.nb-invoice-page .nb-paypal-prompt form {
  margin: 0;
}
body.nb-invoice-page .nb-btn-paypal-prompt {
  display: inline-block;
  padding: 10px 22px;
  border: 1px solid rgba(100, 87, 246, 0.55);
  background: rgba(100, 87, 246, 0.12);
  color: #cdc5ff;
  border-radius: 10px;
  font-family: 'Inter', system-ui, sans-serif;
  font-weight: 600;
  font-size: 14px;
  letter-spacing: 0.01em;
  cursor: pointer;
  transition: all 0.18s ease;
}
body.nb-invoice-page .nb-btn-paypal-prompt:hover {
  background: rgba(100, 87, 246, 0.22);
  color: #ffffff;
  border-color: rgba(100, 87, 246, 0.85);
  transform: translateY(-1px);
}
body.nb-invoice-page .nb-btn-paypal-prompt:active {
  transform: translateY(0);
}

/* PayPal-only flow on invoice-payment page (gateway = paypal_ppcpv) */
.nb-invoice-process .nb-paypal-only .nb-paypal-instruction {
  text-align: center;
  padding: 24px 16px 8px;
}
.nb-invoice-process .nb-paypal-only .nb-paypal-headline {
  font-family: 'Inter', system-ui, sans-serif;
  font-size: 18px;
  font-weight: 700;
  color: #ffffff;
  margin: 0 0 8px;
}
.nb-invoice-process .nb-paypal-only .nb-paypal-sub {
  font-size: 14px;
  color: rgba(255, 255, 255, 0.72);
  margin: 0 auto;
  max-width: 460px;
  line-height: 1.55;
}
.nb-invoice-process .nb-paypal-only em {
  font-style: normal;
  color: #cdc5ff;
  font-weight: 600;
}

/* The PayPal SDK widget container is injected by the paypal_ppcpv module
   into the page outside our template. Make sure it's visible & themed when
   it does appear. The module sets display:none initially, then unhides via JS. */
.nb-invoice-process #paypal_ppcpv_input_container,
body.nb-invoice-page #paypal_ppcpv_input_container {
  margin: 16px auto 8px;
  padding: 16px;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 12px;
  max-width: 520px;
}

/* "Switch to PayPal" helper button shown under the card form when on paypal_acdc */
.nb-invoice-process .nb-switch-to-paypal {
  margin-top: 16px;
  padding: 14px 16px;
  background: rgba(100, 87, 246, 0.06);
  border: 1px solid rgba(100, 87, 246, 0.22);
  border-radius: 10px;
  text-align: center;
}
.nb-invoice-process .nb-switch-to-paypal form {
  margin: 0;
}
.nb-invoice-process .nb-switch-to-paypal .nb-switch-text {
  margin: 0 0 10px;
  font-size: 13px;
  color: rgba(255, 255, 255, 0.78);
}
.nb-invoice-process .nb-btn-paypal-switch {
  display: inline-block;
  padding: 9px 20px;
  border: 1px solid rgba(100, 87, 246, 0.65);
  background: rgba(100, 87, 246, 0.16);
  color: #ffffff;
  border-radius: 8px;
  font-family: 'Inter', system-ui, sans-serif;
  font-weight: 600;
  font-size: 13px;
  cursor: pointer;
  transition: all 0.18s ease;
}
.nb-invoice-process .nb-btn-paypal-switch:hover {
  background: rgba(100, 87, 246, 0.28);
  border-color: rgba(100, 87, 246, 0.95);
  transform: translateY(-1px);
}

/* =========================================================
   v2.0 Domain-search dark overrides
   ---------------------------------------------------------
   WHMCS standard_cart's domain-search step renders some of
   its results via the AJAX availability checker, which
   injects raw bootstrap-3 markup directly into the DOM at
   runtime - bypassing our domainregister.tpl/domainoptions.
   tpl templates. v1.x left those AJAX-injected nodes in
   stock light styling, which was the source of the
   "choose domain pages are unformatted" report.
   Scope everything to .nb-cart-config so we don't touch the
   client area, and use !important since the AJAX markup
   often ships its own inline-equivalent classes.
   ========================================================= */
.nb-cart-config .domain-search-results,
.nb-cart-config .domain-lookup-result,
.nb-cart-config .domain-lookup-results,
.nb-cart-config .lookup-result,
.nb-cart-config .ajax-search-result,
.nb-cart-config .ajax-search-domain-result,
.nb-cart-config .domain-result-row,
.nb-cart-config .domain-result {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius, 12px) !important;
  color: var(--text) !important;
  padding: 14px 18px;
  margin-bottom: 10px;
}
.nb-cart-config .lookup-result.available,
.nb-cart-config .domain-lookup-result.available,
.nb-cart-config .ajax-search-result.available,
.nb-cart-config .domain-result.available,
.nb-cart-config .lookup-status-success,
.nb-cart-config .domain-available {
  border-color: rgba(27, 196, 138, 0.35) !important;
  background: var(--green-glow, rgba(27, 196, 138, 0.08)) !important;
  color: var(--text-strong) !important;
}
.nb-cart-config .lookup-result.unavailable,
.nb-cart-config .domain-lookup-result.unavailable,
.nb-cart-config .ajax-search-result.unavailable,
.nb-cart-config .domain-result.unavailable,
.nb-cart-config .lookup-status-unavailable,
.nb-cart-config .lookup-status-error,
.nb-cart-config .domain-unavailable {
  border-color: rgba(240, 104, 104, 0.3) !important;
  background: rgba(240, 104, 104, 0.06) !important;
  color: var(--text) !important;
}
.nb-cart-config .domain-search-results h3,
.nb-cart-config .domain-search-results h4,
.nb-cart-config .domain-lookup-result h3,
.nb-cart-config .domain-lookup-result h4,
.nb-cart-config .lookup-result strong,
.nb-cart-config .lookup-result h3 {
  color: var(--text-strong) !important;
}
.nb-cart-config .spotlight-tld,
.nb-cart-config .domain-suggestion,
.nb-cart-config .suggestion-row,
.nb-cart-config .suggested-domain {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  color: var(--text) !important;
  border-radius: 10px !important;
  padding: 10px 14px;
}
.nb-cart-config .spotlight-tld strong,
.nb-cart-config .domain-suggestion strong,
.nb-cart-config .suggestion-row strong,
.nb-cart-config .suggested-domain strong { color: var(--text-strong) !important; }

/* TLD pricing / pricing-row tables WHMCS may render outside our .card wrapper */
.nb-cart-config .pricing-table,
.nb-cart-config .tld-pricing-table,
.nb-cart-config table.table-striped,
.nb-cart-config table.table-bordered,
.nb-cart-config table.table-hover {
  background: transparent !important;
  color: var(--text) !important;
  border-color: var(--border) !important;
}
.nb-cart-config table.table-striped > thead > tr > th,
.nb-cart-config table.table-bordered > thead > tr > th,
.nb-cart-config table.table-hover > thead > tr > th,
.nb-cart-config .pricing-table thead th,
.nb-cart-config .tld-pricing-table thead th {
  background: rgba(255, 255, 255, 0.02) !important;
  border-bottom: 1px solid var(--border) !important;
  color: var(--text-strong) !important;
  text-transform: uppercase;
  font-size: 11px;
  letter-spacing: 0.08em;
}
.nb-cart-config table.table-striped > tbody > tr,
.nb-cart-config table.table-bordered > tbody > tr,
.nb-cart-config table.table-hover > tbody > tr,
.nb-cart-config .pricing-table tbody tr,
.nb-cart-config .tld-pricing-table tbody tr {
  background: transparent !important;
  border-color: var(--border) !important;
}
.nb-cart-config table.table-striped > tbody > tr:nth-of-type(odd),
.nb-cart-config table.table-striped > tbody > tr:nth-of-type(odd) > td {
  background-color: rgba(255, 255, 255, 0.02) !important;
}
.nb-cart-config table.table-striped > tbody > tr:hover,
.nb-cart-config table.table-bordered > tbody > tr:hover,
.nb-cart-config table.table-hover > tbody > tr:hover,
.nb-cart-config .pricing-table tbody tr:hover,
.nb-cart-config .tld-pricing-table tbody tr:hover {
  background: rgba(100, 87, 246, 0.06) !important;
}
.nb-cart-config table.table-striped td,
.nb-cart-config table.table-bordered td,
.nb-cart-config table.table-hover td,
.nb-cart-config .pricing-table td,
.nb-cart-config .tld-pricing-table td {
  border-color: var(--border) !important;
  color: var(--text) !important;
}

/* Stock list-group rows WHMCS sometimes uses for the recommended-TLD strip */
.nb-cart-config .list-group {
  background: transparent !important;
  border: 0 !important;
}
.nb-cart-config .list-group-item {
  background: var(--card) !important;
  border-color: var(--border) !important;
  color: var(--text) !important;
}
.nb-cart-config .list-group-item.active,
.nb-cart-config .list-group-item:hover {
  background: rgba(100, 87, 246, 0.08) !important;
  border-color: rgba(100, 87, 246, 0.35) !important;
  color: var(--text-strong) !important;
}

/* WHMCS sometimes wraps the search box itself in a stock .well that lands inside our card */
.nb-cart-config .well,
.nb-cart-config .well-lg,
.nb-cart-config .well-sm {
  background: var(--card) !important;
  border: 1px solid var(--border) !important;
  border-radius: var(--radius, 12px) !important;
  color: var(--text) !important;
  box-shadow: none !important;
}

/* Status pills the AJAX markup commonly uses */
.nb-cart-config .label-success,
.nb-cart-config .badge-success,
.nb-cart-config .text-success {
  background: rgba(27, 196, 138, 0.18) !important;
  color: #1bc48a !important;
  border-radius: 999px;
  padding: 2px 10px;
  font-weight: 600;
  font-size: 12px;
}
.nb-cart-config .label-danger,
.nb-cart-config .badge-danger,
.nb-cart-config .text-danger {
  background: rgba(240, 104, 104, 0.16) !important;
  color: #f06868 !important;
  border-radius: 999px;
  padding: 2px 10px;
  font-weight: 600;
  font-size: 12px;
}
.nb-cart-config .label-warning,
.nb-cart-config .badge-warning,
.nb-cart-config .text-warning {
  background: rgba(244, 183, 64, 0.14) !important;
  color: #f4b740 !important;
  border-radius: 999px;
  padding: 2px 10px;
  font-weight: 600;
  font-size: 12px;
}

/* Make sure any leftover text rendered without a wrapping element still reads on the dark bg */
.nb-cart-config p,
.nb-cart-config li,
.nb-cart-config span,
.nb-cart-config div { color: inherit; }
.nb-cart-config a { color: var(--accent-light, #8a7fff); }
.nb-cart-config a:hover { color: var(--text-strong); }
