/* The "server is restarting" banner (services/outage).

   Bottom-pinned, and that is the whole point of its placement: `.update-notification` from
   ember-cli-new-version is fixed to the TOP with z-index 9999, and the restart that raises this
   banner is usually the same deploy that raises that one. Sharing the top edge would have this
   message covering the Reload button somebody needs to press. z-index stays below 9999 as a
   second line of defence. */
.outage-banner {
  position: fixed;
  z-index: 9000;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 12px 16px;
  color: #8a6d3b;
  text-align: center;
  background-color: #fcf8e3;
  border-top: 1px solid #faebcc;
}
/*! Reset indents */
h1,
h2,
h3,
h4,
h5,
h6,
p {
    margin-top: 0;
    margin-bottom: 0
}
ul,
ol {
    padding-left: 0;
    margin-top: 0;
    margin-bottom: 0;
}
figure {
    margin: 0;
}
input,
textarea {
    background-clip: padding-box;
}
button {
    cursor: pointer;
}
button[disabled] {
        cursor: not-allowed;
        opacity: 0.5;
    }
/* Hide Arrows From Input Number */
/* Chrome, Safari, Edge, Opera */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
/* Firefox */
input[type=number] {
  -moz-appearance:textfield;
}
[disabled] {
  pointer-events: none !important;
  opacity: 0.5 !important;
  cursor: default !important;
}
input[disabled] {
  background-color: #eeeeee;
}
video:focus {
  outline: none;
}
/*https://stackoverflow.com/questions/2989263/disable-auto-zoom-in-input-text-tag-safari-on-iphone*/
/*Disable Auto Zoom in Input “Text” tag - Safari on iPhone*/
@supports (-webkit-overflow-scrolling: touch) {
   input {
     font-size: 16px !important;
   }
}
/* Font */
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-Bold.eot');
    src: local('Euclid Circular A Bold'), local('EuclidCircularA-Bold'),
        url('fonts/circular/EuclidCircularA-Bold.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-Bold.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-Bold.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-Bold.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-Light.eot');
    src: local('Euclid Circular A Light'), local('EuclidCircularA-Light'),
        url('fonts/circular/EuclidCircularA-Light.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-Light.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-Light.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-Light.ttf') format('truetype');
    font-weight: 300;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-BoldItalic.eot');
    src: local('Euclid Circular A Bold Italic'), local('EuclidCircularA-BoldItalic'),
        url('fonts/circular/EuclidCircularA-BoldItalic.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-BoldItalic.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-BoldItalic.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-BoldItalic.ttf') format('truetype');
    font-weight: bold;
    font-style: italic;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-LightItalic.eot');
    src: local('Euclid Circular A Light Italic'), local('EuclidCircularA-LightItalic'),
        url('fonts/circular/EuclidCircularA-LightItalic.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-LightItalic.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-LightItalic.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-LightItalic.ttf') format('truetype');
    font-weight: 300;
    font-style: italic;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-Regular.eot');
    src: local('Euclid Circular A Regular'), local('EuclidCircularA-Regular'),
        url('fonts/circular/EuclidCircularA-Regular.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-Regular.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-Regular.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-SemiBold.eot');
    src: local('Euclid Circular A SemiBold'), local('EuclidCircularA-SemiBold'),
        url('fonts/circular/EuclidCircularA-SemiBold.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-SemiBold.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-SemiBold.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-SemiBold.ttf') format('truetype');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-Medium.eot');
    src: local('Euclid Circular A Medium'), local('EuclidCircularA-Medium'),
        url('fonts/circular/EuclidCircularA-Medium.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-Medium.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-Medium.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-Medium.ttf') format('truetype');
    font-weight: 500;
    font-style: normal;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-Italic.eot');
    src: local('Euclid Circular A Italic'), local('EuclidCircularA-Italic'),
        url('fonts/circular/EuclidCircularA-Italic.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-RegularItalic.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-RegularItalic.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-Italic.ttf') format('truetype');
    font-weight: normal;
    font-style: italic;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-SemiBoldItalic.eot');
    src: local('Euclid Circular A SemiBold Italic'), local('EuclidCircularA-SemiBoldItalic'),
        url('fonts/circular/EuclidCircularA-SemiBoldItalic.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-SemiBoldItalic.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-SemiBoldItalic.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-SemiBoldItalic.ttf') format('truetype');
    font-weight: 600;
    font-style: italic;
    font-display: swap;
}
@font-face {
    font-family: 'Euclid Circular A';
    src: url('fonts/circular/EuclidCircularA-MediumItalic.eot');
    src: local('Euclid Circular A Medium Italic'), local('EuclidCircularA-MediumItalic'),
        url('fonts/circular/EuclidCircularA-MediumItalic.eot?#iefix') format('embedded-opentype'),
        url('fonts/circular/EuclidCircularA-MediumItalic.woff2') format('woff2'),
        url('fonts/circular/EuclidCircularA-MediumItalic.woff') format('woff'),
        url('fonts/circular/EuclidCircularA-MediumItalic.ttf') format('truetype');
    font-weight: 500;
    font-style: italic;
    font-display: swap;
}
/* Signature */
@font-face {
    font-family: 'Ms Madi';
    src: local('Ms Madi Regular'), local('MsMadi-Regular'),
        url('fonts/msmadi/MsMadi-Regular.woff2') format('woff2'),
        url('fonts/msmadi/MsMadi-Regular.woff') format('woff'),
        url('fonts/msmadi/MsMadi-Regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
}
/* Document Text */
@font-face {
    font-family: 'Ubuntu';
    src: url('fonts/ubuntu/ubuntu-italic.ttf') format('truetype');
    font-weight: normal;
    font-style: italic;
}
@font-face {
    font-family: 'Ubuntu';
    src: url('fonts/ubuntu/ubuntu-bold.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
}
@font-face {
    font-family: 'Ubuntu';
    src: url('fonts/ubuntu/ubuntu-bolditalic.ttf') format('truetype');
    font-weight: bold;
    font-style: italic;
}
@font-face {
    font-family: 'Ubuntu';
    src: url('fonts/ubuntu/ubuntu-regular.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
/* Media */
/*
  Media queries are belong to the size of the device not the screen
  See max-devide vs max-device-width
*/
/*@custom-media --phone-viewport (max-width: 640px);*/
/*
  A window wide enough to carry a column the table can do without. Deliberately min-WIDTH, not
  min-device-width like the two above: a 1920 monitor running a half-width window has the device
  size and not the room, and the column it would add pushes the status cell off the edge.
*/
/*! Styles */
:root {
    font-weight: 400;
    font-size: 16px;
    line-height: 1.2;
    font-family: 'Euclid Circular A', sans-serif;
    -webkit-text-size-adjust: 100%;
    -ms-text-size-adjust: 100%;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}
@font-face {
  font-family: "icomoon";
  src: url("fonts/icomoon/icomoon.eot?5314vf");
  src: url("fonts/icomoon/icomoon.eot?5314vf#iefix")
      format("embedded-opentype"),
    url("fonts/icomoon/icomoon.ttf?5314vf") format("truetype"),
    url("fonts/icomoon/icomoon.woff?5314vf") format("woff"),
    url("fonts/icomoon/icomoon-f8be8c7a877487626e48ba46b5425c1e.svg?5314vf#icomoon") format("svg");
  font-weight: normal;
  font-style: normal;
  font-display: block;
}
[class^="icon-"],
[class*=" icon-"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: "icomoon" !important;
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.icon-image-cloud-line:before {
  content: "\e932";
}
.icon-account-circle:before {
  content: "\e926";
  color: #2da032;
}
.icon-alpha-x-circle:before {
  content: "\e927";
  color: #2da032;
}
.icon-briefcase-account:before {
  content: "\e928";
  color: #2da032;
}
.icon-calendar-month:before {
  content: "\e929";
  color: #2da032;
}
.icon-domain:before {
  content: "\e92a";
  color: #2da032;
}
.icon-file-check:before {
  content: "\e92b";
  color: #4e4e4e;
}
.icon-format-text:before {
  content: "\e92c";
  color: #2da032;
}
.icon-image-outline:before {
  content: "\e92d";
  color: #1a7fad;
}
.icon-signature-freehand:before {
  content: "\e92e";
  color: #4e4e4e;
}
.icon-stamper:before {
  content: "\e92f";
  color: #4e4e4e;
}
.icon-text-subject:before {
  content: "\e930";
  color: #e57a42;
}
.icon-water-outline:before {
  content: "\e931";
  color: #1a7fad;
}
.icon-calendar:before {
  content: "\e921";
}
.icon-delete_sweep:before {
  content: "\e918";
}
.icon-edit:before {
  content: "\e919";
}
.icon-empty-image:before {
  content: "\e91a";
  color: #dbd5d5;
}
.icon-eraser:before {
  content: "\e91b";
}
.icon-visibility:before {
  content: "\e91d";
}
.icon-dropdown:before {
  content: "\e915";
}
.icon-msg-done:before {
  content: "\e916";
  color: #061f45;
}
.icon-search:before {
  content: "\e917";
}
.icon-printer:before {
  content: "\e90f";
}
.icon-email-unread:before {
  content: "\e910";
}
.icon-email-read:before {
  content: "\e911";
}
.icon-menu-chat:before {
  content: "\e900";
  color: #4e4e4e;
}
.icon-menu-mail:before {
  content: "\e901";
  color: #4e4e4e;
}
.icon-menu-sign:before {
  content: "\e902";
  color: #4e4e4e;
}
.icon-menu-valut:before {
  content: "\e903";
  color: #4e4e4e;
}
.icon-file_download:before {
  content: "\e923";
}
.icon-arrow_forward:before {
  content: "\e922";
}
.icon-icon-help:before {
  content: "\e920";
  color: #4e4e4e;
}
.icon-account-badge:before {
  content: "\e91f";
}
.icon-business:before {
  content: "\e91e";
}
.icon-star:before {
  content: "\e912";
}
.icon-cloud:before {
  content: "\e913";
}
.icon-attach_file:before {
  content: "\e914";
}
.icon-minus:before {
  content: "\e90a";
}
.icon-arrow-right:before {
  content: "\e90d";
}
.icon-arrow-left:before {
  content: "\e90e";
}
.icon-arrow-up:before {
  content: "\e90b";
}
.icon-arrow-down:before {
  content: "\e90c";
}
.icon-plus:before {
  content: "\e909";
}
.icon-folder-open:before {
  content: "\e907";
}
.icon-folder:before {
  content: "\e908";
}
.icon-clock-fill:before {
  content: "\e925";
}
.icon-check-circle:before {
  content: "\e91c";
}
.icon-dots:before {
  content: "\e905";
}
.icon-close:before {
  content: "\e906";
}
.icon-check:before {
  content: "\e904";
}
.icon-clock:before {
  content: "\e94e";
}
.icon-circle:before {
  content: "\e924";
}
.badge {
	position: relative;
	display: inline-block;
	cursor: pointer;
	width: 12px;
	height: 12px;
	font-size: 12px;
	z-index: 2;
}
.badge__tooltip {
		position: absolute;
		width: 150px;
		background-color: #fff;
		box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
		border: solid 0.5px #c7c7c7;
		color: #000;
		padding: 10px;
		font-size: 10px;
		transition: all 0.25s ease-in-out;
		opacity: 0;
		visibility: hidden;
	}
.badge__tooltip--bottom-right {
				top: 100%;
				right: auto;
				left: 6px;
			}
.badge__tooltip--bottom-left {
				top: 100%;
				left: auto;
				right: 6px;
			}
.badge__tooltip--top-right {
				bottom: 100%;
				right: auto;
				left: 6px;
			}
.badge__tooltip--top-left {
				bottom: 100%;
				left: auto;
				right: 6px;
			}
.badge:hover .badge__tooltip {
			opacity: 1;
			visibility: visible;
		}
.public-promo {
	width: 100%;
	height: 100%;
	display: flex;
	align-items: center;
	justify-content: center;
}
.public__container {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-direction: column;
	font-size: 14px;
	padding: 20px;
}
/* The panel's width is not only the panel's concern: `.container` reserves
   exactly this much room on its left, and the two must never be able to
   disagree. One number, read by both — and re-pointed as a whole on `.page`
   when the panel collapses, so the offset moves with the panel instead of
   being a second hard-coded 175 somebody has to remember. */
:root {
  --nav-width: 175px;
  --nav-width-collapsed: 64px;
}
.nav {
    box-sizing: border-box;
    position: fixed;
    top: calc(60px + var(--banner-height));
    bottom: 0;
    width: var(--nav-width);
    max-height: 100vh;
    background-color: var(--nav-panel-bg);
    display: flex;
    flex-direction: column;
    align-items: center;
    z-index: 10;
    transition: width 0.18s ease;
}
@media only screen and (max-device-width: 640px) {
.nav {
      display: none
}
    }
.nav__content {
      box-sizing: border-box;
      height: 100%;
      padding: 22px 22px 0;
      display: flex;
      flex-direction: column;
      align-items: center;
      flex: 1 1;
    }
/* Collapse/expand. Parked on the trailing edge with a negative margin so it
       sits in the panel's own padding rather than taking a row of its own. */
.nav__collapse {
      box-sizing: border-box;
      flex: none;
      align-self: flex-end;
      display: flex;
      align-items: center;
      justify-content: center;
      width: 26px;
      height: 26px;
      margin: -8px -8px 6px;
      padding: 0;
      border: 0;
      border-radius: 6px;
      background-color: transparent;
      cursor: pointer;
      transition: background-color 0.15s ease;
    }
.nav__collapse svg {
        width: 16px;
        height: 16px;
        fill: var(--colour-brand);
        transition: transform 0.18s ease;
      }
.nav__collapse:hover {
        background-color: var(--nav-item-hover-bg);
      }
.nav__collapse:focus-visible {
        outline: 2px solid var(--colour-brand);
        outline-offset: 2px;
      }
/* A menu row and the sub-menu that belongs to it, kept together. Expanded
       this is a plain full-width block and changes nothing; collapsed it is the
       positioning context the sub-menu flies out from. */
.nav__group {
      position: relative;
      width: 100%;
    }
/* The row's text, in an element of its own so the collapsed panel has
       something to hide. It used to be a bare text node, which CSS cannot
       address without blanking the icon and the count along with it. */
.nav__label {
      min-width: 0;
    }
.nav__search {
      box-sizing: border-box;
      display: block;
      width: 100%;
      font-size: 12px;
      /* Themed: this is the files filter and the two nav search boxes, all of
         which carry `search-input`-style exemptions from the app-wide control
         rule and so paint themselves. Hardcoded, they stayed white on dark. */
      color: var(--field-fg);
      background-color: var(--field-bg);
      outline: none;
      padding: 5px 28px 6px 9px;
      border-radius: 5px;
      border: solid 0.5px var(--field-border);
      margin-bottom: 10px;
    }
.nav__search::placeholder {
        font-style: italic;
      }
.nav__search-wrap {
        position: relative;
        cursor: pointer;
      }
.nav__search-icon {
        position: absolute;
        right: 8px;
        top: 6px;
      }
/* The two call-to-action buttons share one shape. They used to differ in
       padding (7px 30px 7px 13px vs 7px 28px 7px 24px) and in text-align, with
       `space-between` pushing the icon and the label to opposite edges — so the
       two buttons sitting one above the other lined up on neither their icons
       nor their labels. Centred content with a gap makes them a pair. */
.nav__invite,
    .nav__meetings {
      box-sizing: border-box;
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 8px;
      width: 100%;
      padding: 9px 12px;
      font-size: 12px;
      font-weight: 600;
      color: var(--white);
      border: 0;
      border-radius: 8px;
      cursor: pointer;
      transition: box-shadow 0.15s ease, transform 0.15s ease, filter 0.15s ease;
    }
.nav__invite svg, .nav__meetings svg {
        flex: none;
      }
.nav__invite:hover, .nav__meetings:hover {
        transform: translateY(-1px);
        box-shadow: 0 4px 10px rgb(0 0 0 / 18%);
      }
.nav__invite:active, .nav__meetings:active {
        transform: translateY(0);
        box-shadow: 0 1px 3px rgb(0 0 0 / 18%);
      }
.nav__invite:focus-visible, .nav__meetings:focus-visible {
        outline: 2px solid var(--colour-brand);
        outline-offset: 2px;
      }
.nav__invite:disabled, .nav__meetings:disabled {
        opacity: 0.55;
        cursor: default;
        transform: none;
        box-shadow: none;
      }
.nav__invite {
      background-color: var(--blue-font);
    }
.nav__invite--lynx {
        width: 140px;
      }
.nav__meetings {
      background-color: var(--colour-brand-dark);
      margin-bottom: 14px;
    }
.nav__menu {
      flex: 1 1;
      display: flex;
      align-items: flex-start;
      flex-direction: column;
      width: 100%;
      margin-top: 12px;
      /* margin-bottom: 5px; */
      font-size: 12px;
      /* color: var(--nav-panel-links-color); */
    }
/* overflow: auto; */
.nav__menu--contacts-open {
        flex: 0 1;
      }
/* Each row is a pill: padded, rounded, and filled on hover and when active.
       The item is the full width of the panel content and the negative margin
       lets the fill bleed to the panel's own padding, so the pill looks inset
       rather than floating in a gutter. */
.nav__menu-item {
      box-sizing: border-box;
      position: relative;
      width: calc(100% + 16px);
      margin: 0 -8px 2px;
      padding: 9px 8px 9px 10px;
      display: flex;
      align-items: center;
      justify-content: flex-start;
      border-radius: 8px;
      font-weight: 600;
      line-height: 1.15;
      cursor: pointer;
      -webkit-user-select: none;
      user-select: none;
      transition: background-color 0.15s ease, color 0.15s ease;
    }
/* Fixed icon column: the icons are not all the same width, so without
         this the labels started at a different x on every row. */
.nav__menu-item svg {
        flex: none;
        width: 18px;
        margin-right: 10px;
        fill: var(--colour-brand);
      }
.nav__menu-item:hover {
        background-color: var(--nav-item-hover-bg);
      }
.nav__menu-item:focus-visible {
        outline: 2px solid var(--colour-brand);
        outline-offset: -2px;
      }
/* Was declared on every link in the template and styled nowhere, so the
         route you were on looked exactly like the ones you were not. */
.nav__menu-item--active {
        background-color: var(--nav-item-active-bg);
        color: var(--nav-item-active-color);
      }
/* Accent on the leading edge — the one cue that survives at a glance
           when several rows share the same tint. */
.nav__menu-item--active::before {
          content: '';
          position: absolute;
          left: 0;
          top: 50%;
          transform: translateY(-50%);
          width: 3px;
          height: 18px;
          border-radius: 0 2px 2px 0;
          background-color: var(--colour-brand);
        }
/* Unread/pending count. `margin-left: auto` parks it on the trailing edge,
       so the counts line up in a column of their own however long the labels
       are — rather than trailing the label at a different x on every row.
       Tabular figures stop a 1 and a 7 changing the pill's width. */
.nav__badge {
      box-sizing: border-box;
      flex: none;
      margin-left: auto;
      min-width: 18px;
      padding: 0 5px;
      border-radius: 9px;
      background-color: var(--nav-badge-bg);
      color: var(--nav-badge-color);
      font-size: 10px;
      font-weight: 600;
      line-height: 16px;
      text-align: center;
      font-variant-numeric: tabular-nums;
    }
/* Sub-items hang off a hairline rail aligned with the parent's icon, so the
       group reads as one branch instead of an indented list. */
.nav__sub-menu {
      box-sizing: border-box;
      width: 100%;
      margin: 2px 0 6px 10px;
      padding-left: 16px;
      border-left: 1px solid var(--nav-rule-color);
    }
.nav__sub-menu-item {
      box-sizing: border-box;
      padding: 5px 8px;
      margin-bottom: 1px;
      border-radius: 6px;
      cursor: pointer;
      font-weight: 400;
      transition: background-color 0.15s ease, color 0.15s ease;
    }
.nav__sub-menu-item--active {
        color: var(--colour-brand);
        font-weight: 600;
      }
.nav__sub-menu-item:hover {
        background-color: var(--nav-item-hover-bg);
      }
.nav__sub-menu-item:focus-visible {
        outline: 2px solid var(--colour-brand);
        outline-offset: -2px;
      }
.nav--is-hidden {
      display: none;
    }
.nav__close {
      position: absolute;
      top: -9px;
      right: -8px;
      font-size: 8px;
      padding: 4px;
      border-radius: 50%;
      background-color: #707070;
      color: #fff;
      cursor: pointer;
    }
.nav__subscription {
  box-sizing: border-box;
  width: 100%;
  padding: 0 10px 22px 10px;
}
.nav__plan {
  border-bottom: 0.5px solid #333;
  padding-bottom: 2px;
  margin-bottom: 2px;
  font-size: 12px;
  font-weight: 500;
}
.nav__logo {
  width: 100%;
  text-align: center;
  padding-bottom: 10px;
}
.nav__contacts {
  flex: 1 1;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  border: 0.5px solid #606060;
  background-color: var(--nav-panel-contacts-bg);
  border-radius: 5px;
  padding: 9px;
  width: 151px;
  margin-left: -10px;
  margin-right: -10px;
  margin-bottom: 10px;
}
.nav__contact {
  position: relative;
  padding-left: 9px;
  border-left: 2px solid #737373;
  box-sizing: border-box;
  margin-bottom: 10px;
  cursor: default;
}
.nav__contact--online {
    border-left-color: #2EA953;
  }
.nav__contact:hover .contact__actions {
      right: 0;
    }
.contact__divider {
  background-color: #B5B5B5;
  height: 0.5px;
  width: 100%;
  margin-bottom: 10px;
}
.contact__name {
  font-size: 10px;
  font-style: normal;
  font-weight: 700;
  line-height: normal;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.contact__email {
  color: var(--secondary-font);
  font-size: 10px;
  font-style: normal;
  font-weight: 400;
  line-height: normal;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.contact__actions {
  box-sizing: border-box;
  display: flex;
  position: absolute;
  right: 0;
  align-items: center;
  justify-content: space-between;
  height: 100%;
  background: linear-gradient(90deg, rgba(237, 244, 255, 0.00) 0%, var(--nav-panel-contacts-bg) 24.48%);
  top: 0;
  padding-left: 20px;
  right: -85px;
  transition: right 0.25s ease-in-out;
}
.contact__actions svg {
    fill: var(--colour-brand);
  }
.contact__action {
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  line-height: 0;
  margin-left: 10px;
}
/* ---------------------------------------------------------------------------
   COLLAPSED

   Driven from `.page`, not from the panel, because the same flag has to narrow
   the content offset — see `--nav-width` at the top of this file and the
   `.container` rules that read it. `.page--nav-collapsed` is only set on screens
   that actually render this panel, so the areas carrying their own nav card
   (settings, tenancy manager, system management) keep the full 175px gutter.

   Nothing is dropped, only deferred: each row keeps its name in a `title`, the
   unread counts move onto the icons, and a section's sub-menu flies out beside
   it on hover. One click on the chevron brings the labels back for good.
   --------------------------------------------------------------------------- */
.page--nav-collapsed {
  --nav-width: var(--nav-width-collapsed);
}
/* `.nav` centres its children and never sized this column, so expanded it is
     as wide as the longest label happens to be. At icon width that would make
     the rail's own width depend on whichever child is widest — the chevron, as
     it turns out — so pin it: 12px each side leaves a 40px content box, the rows
     bleed 8px into it either way, and a row spans 4px..60px in the 64px rail. */
.page--nav-collapsed .nav .nav__content {
    width: 100%;
    padding: 22px 12px 0;
  }
.page--nav-collapsed .nav .nav__collapse {
    align-self: center;
    margin: -8px 0 6px;
  }
.page--nav-collapsed .nav .nav__collapse svg {
      transform: rotate(180deg);
    }
/* The label is the one thing the collapse actually trades away. */
.page--nav-collapsed .nav .nav__label {
    display: none;
  }
.page--nav-collapsed .nav .nav__invite,
  .page--nav-collapsed .nav .nav__meetings {
    padding: 9px 0;
    gap: 0;
  }
.page--nav-collapsed .nav .nav__menu-item {
    justify-content: center;
    padding: 9px 0;
  }
.page--nav-collapsed .nav .nav__menu-item svg {
      margin-right: 0;
    }
/* `margin-left: auto` had the count park on the trailing edge of a row that no
     longer has one. On the icon's shoulder it stays readable and stays a count —
     hiding it would be the one piece of information a tooltip cannot give back. */
.page--nav-collapsed .nav .nav__badge {
    position: absolute;
    top: 2px;
    right: 4px;
    margin-left: 0;
    min-width: 14px;
    padding: 0 3px;
    font-size: 9px;
    line-height: 14px;
  }
/* The contacts disclosure arrow points at a label that isn't there. */
.page--nav-collapsed .nav .selectbox__arrow {
    display: none;
  }
/* Sub-items have no icons of their own, so they cannot simply shrink. They
     become a flyout anchored to their section's icon — available on hover
     rather than only after expanding. `::before` bridges the 12px between the
     row and the card so the pointer can cross without the card closing. */
.page--nav-collapsed .nav .nav__sub-menu {
    display: none;
    position: absolute;
    top: 0;
    left: calc(100% + 12px);
    z-index: 20;
    width: max-content;
    min-width: 150px;
    margin: 0;
    padding: 6px;
    border-left: 0;
    border-radius: 8px;
    background-color: var(--nav-panel-bg);
    box-shadow: 0 6px 18px rgb(0 0 0 / 28%);
  }
.page--nav-collapsed .nav .nav__sub-menu::before {
      content: '';
      position: absolute;
      top: 0;
      bottom: 0;
      left: -12px;
      width: 12px;
    }
.page--nav-collapsed .nav .nav__group:hover .nav__sub-menu,
  .page--nav-collapsed .nav .nav__group:focus-within .nav__sub-menu {
    display: block;
  }
/* Search goes with its field. A lone magnifier at the bottom of the rail was
     a control that could not do the thing it depicts — there is nowhere to type
     at this width — and it read as a ninth navigation icon. */
.page--nav-collapsed .nav .nav__search-wrap {
    display: none;
  }
/* The contacts card is a 151px panel; in a 64px rail it hung out over the
     page. It stays open — expanding the panel brings it straight back. */
.page--nav-collapsed .nav .nav__contacts {
    display: none;
  }
/* A 100px wordmark in a 40px column. It is a link to the marketing site, not
     navigation, and it comes straight back on expand. */
.page--nav-collapsed .nav .nav__logo {
    display: none;
  }
/* ---------------------------------------------------------------------------
   Panel typography and states, on the refresh palette.
   --------------------------------------------------------------------------- */
.nav__menu-item {
  border-radius: var(--r-r-inner);
  font-size: 13px;
  color: var(--r-navy);
}
.nav__menu-item:hover { background: var(--r-hover); }
.nav__menu-item--active,
.nav__menu-item.active {
  background: var(--r-tint);
  color: var(--r-brand);
}
.nav__sub-menu-item {
  border-radius: 6px;
  font-size: 12px;
  color: var(--r-grey);
}
.nav__sub-menu-item:hover { background: var(--r-hover); }
.nav__sub-menu-item--active {
  color: var(--r-brand);
  font-weight: 600;
}
.nav__badge {
  padding: 1px 7px;
  border-radius: var(--r-r-pill);
  background: var(--r-tint);
  font-size: 10.5px;
  font-weight: 700;
  color: var(--r-brand);
}
.selectbox {
  outline: none;
  cursor: pointer;
  position: relative;
  min-width: 180px;
}
/* color: var(--colour-black); */
@media (max-width: 900px) {
.selectbox {
    min-width: 170px
}
  }
.selectbox--menu {
    font-weight: 500;
    font-size: 13px;
    text-transform: uppercase;
  }
@media (max-width: 1024px) {
.selectbox--menu {
      font-size: 12px
  }
    }
@media (max-width: 900px) {
.selectbox--menu {
      font-size: 11px
  }
    }
/*  &:hover {

    & .selectbox__list {
      visibility: visible;
      opacity: 1;
    }

    & .selectbox__arrow {

      &--up {
        display: inline-block;
      }

      &--down {
        display: none;
      }
    }
  }*/
.selectbox__head {
    outline: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 15px;
    font-size: 13px;
    border: 2px solid #000;
    border-radius: 4px;
    background-color: var(--body-bg);
  }
/* Two width-stepped overrides used to live here — `padding: 13px` and
       `font-size: 11px !important` under 1336px, and another padding under
       900px. They sized the control before it had one size, and they were
       quietly overriding the refresh on every screen under 1336px; the
       `!important` meant nothing downstream could take it back, which is why a
       select on a phone came out 37px tall next to a 32px one.

       The default size is now one rule — `.selectbox__head` in design-system/,
       which is imported after this file and so wins at EQUAL specificity:
       `5px 10px` with a 32px floor, at every width. A stepped font-size here
       would be dead code rather than a smaller font, so there isn't one.

       It only wins at equal specificity, though. Six place-scoped rules at
       (0,2,0) still set their own padding or font-size and outrank it:
       `.chat__actions`, `.menu--setting`/`.menu--search`, `.user__select`
       (twice, one of them `font-size: 10px`), `.hub-setting__form--branding`
       and `.setting__form--branding`. A select in one of those places is not
       the 32px control the refresh draws everywhere else. Folding them in
       needs each of those screens looked at, so they are still outstanding —
       do not read this block as "every select is the same size now". */
.selectbox__head--style-2 {
      padding: 15px 25px;
      border-width: 1px;
      border-color: #0d2136;
    }
.selectbox__head--style-3 {
      max-width: 100% !important;
      -webkit-user-select: none;
      user-select: none;
    }
/* The caret is an L of border in the bottom-right of an 8x8 box, so rotating
     it swings the visible chevron off the box's own centre — about 1.8px down
     when it points down, the same amount up when it points up. The old fix
     nudged only the up state, by 3px, which is why the caret hopped as a menu
     opened. Half the correction each way leaves the ink in the same place in
     both states, so it flips without moving. */
.selectbox__arrow {
    position: relative;
    margin-left: 20px;
    border: solid var(--selectbox-arrow-bg);
    border-width: 0 2px 2px 0;
    display: inline-block;
    padding: 3px;
  }
.selectbox__arrow--up {
      transform: rotate(-135deg);
      top: 2px;
    }
.selectbox__arrow--down {
      transform: rotate(45deg);
      top: -2px;
    }
.selectbox__list {
    z-index: 3;
    position: absolute;
    top: 100%;
    width: 100%;
    top: 100%;
    background-color: var(--body-bg);
    max-height: 33vh;
    overflow: auto;
    border: 1px solid var(--colour-brand);
    border-radius: 8px;
  }
@media (min-width: 901px) and (max-width: 1336px) {
.selectbox__list {
      max-height: calc(50vh - 97px)
  }
    }
@media (max-width: 900px) {
.selectbox__list {
      max-height: calc(50vh - 124px)
  }
    }
/* Shape, padding and hover come from the menu rules at the foot of this file,
     which every menu in the app shares. What was here was a 16px/24px row ruled
     off from the next with a 1px brand-blue line — a divider under every option,
     drawn in a colour the rest of the menu does not use. The three "Select HUB"
     dialogs were a stack of blue-underlined rows because of it. */
.selectbox__item {
    word-break: break-word;
    transition: ease 0.15s all;
  }
.selectbox--style-1 {
    min-width: 110px;
    font-size: 13px;
  }
.selectbox--style-1 .selectbox__head {
        font-size: 13px;
        padding: 10px 12px;
        border-width: 1px;
      }
.selectbox--style-1 .selectbox__arrow {
        margin-left: 8px;
        padding: 2px;
      }
.ember-basic-dropdown-content {
  transform: translate3d(0,0,0);
  background-color: var(--body-bg);
}
.ember-power-select-trigger[aria-disabled=true] {
  pointer-events: none !important;
  opacity: 0.5 !important;
  cursor: default !important;
}
.ember-power-select-trigger {
  cursor: pointer;
  background-color: var(--body-bg);
  box-sizing: border-box;
}
.ember-power-select-dropdown.ember-power-select-typeahead-dropdown {
  border: 0;
}
.ember-power-select-option {
  font-weight: 500;
  font-size: 14px;
  padding: 5px 8px;
}
.ember-power-select-option[aria-current="true"] {
  background-color: var(--colour-brand);
}
.ember-power-select-option.ember-power-select-option--loading-message {
  padding: 0 8px;
  color: var(--dark-font);
}
.ember-power-select-dropdown.selectbox-orange {
  border: 1px solid var(--colour-brand);
}
/* Region protection country typeahead (tenancy policies) */
.ember-power-select-dropdown.region-protection-dropdown {
  border: solid 1px rgba(0, 0, 0, 0.15);
  border-radius: 0 0 6px 6px;
  background-color: var(--body-bg);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.10);
}
.ember-power-select-dropdown.region-protection-dropdown .ember-power-select-options {
    max-height: 16em;
    overflow-y: auto;
  }
/* ---------------------------------------------------------------------------
   One select control. The app shipped four sizes of it and a 2px black border
   on `.selectbox__head`.

   `box-sizing` is the load-bearing line: the app sets an explicit height on a
   content-box element, so its padding and border were ADDED to that height and
   a control asking for 30px measured 46px. The same mistake — content-box plus
   an explicit size — is what made the Data Clearout warning overshoot its
   dialog by exactly its own padding.
   --------------------------------------------------------------------------- */
.selectbox__head,
.ember-power-select-trigger {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  min-height: 32px;
  height: auto;
  padding: 5px 10px;
  border: 1px solid var(--r-ctl);
  border-radius: var(--r-r-ctl);
  background: #fff;
  font-size: 12.5px;
  color: var(--r-navy);
}
.selectbox__head:hover,
.ember-power-select-trigger:hover {
  border-color: var(--r-ctl-hi);
  background: var(--r-hover);
}
/* Push the caret to the trailing edge of a full-width select head. Scoped to
   the head it belongs to: unscoped, this also hit the header's Hub picker,
   whose trigger is a centred flex row with a min-width — so `auto` ate the
   leftover space there and the gap before the caret shrank to nothing as the
   Hub name got longer. */
.selectbox__head > .selectbox__arrow,
.ember-power-select-trigger > .selectbox__arrow {
  margin-left: auto;
  flex: none;
}
.selectbox__list,
.ember-power-select-dropdown {
  padding: 4px;
  border: 1px solid var(--r-edge);
  border-radius: var(--r-r-inner);
  background: #fff;
  box-shadow: var(--r-shadow-md);
}
.selectbox__item,
.ember-power-select-option {
  padding: 7px 10px;
  border-radius: 7px;
  font-size: 12.5px;
  color: var(--r-navy);
}
.selectbox__item:hover,
.ember-power-select-option:hover {
  background: var(--r-tint);
  color: var(--r-brand);
}
/* An open trigger. Replaces the `border-color: #000 !important` earlier in this
   file, which was the only way the old rule could win and made every open
   select a black box. */
.ember-power-select-trigger[aria-expanded="true"],
.ember-basic-dropdown-trigger[aria-expanded="true"] {
  border-color: var(--r-brand);
  box-shadow: var(--r-focus);
}
/* The share dialog's recipient typeahead is both things at once: the input is
   marked `--flat` because the field shell was once expected to draw the box,
   and it is also a power-select trigger, which draws its own. `--flat` is
   declared later at the same weight, so it won and the field had no box at all.
   The trigger wins here — it is the control a person clicks and types into, and
   a text field with no edge does not read as one. */
.ember-power-select-trigger.field__input--flat {
  padding: 5px 10px;
  border: 1px solid var(--r-ctl);
  background: #fff;
}
/* The option that is already chosen, so an open menu says where you are as well
   as where you could go — the same cue the tenancy manager's filter menus use. */
.selectbox__item--selected {
  font-weight: 600;
  color: var(--r-brand);
}
/* ---------------------------------------------------------------------------
   `@triggerClass="… text-ellipsis"` — make it do what nine call sites ask for.
   ---------------------------------------------------------------------------
   Nine places pass `text-ellipsis` in a power-select `@triggerClass` (the
   fusion attribute value and filter inputs, manage-attribute, the catalog
   sort, hub branding) and not one of them got an ellipsis. `text-overflow`
   applies to the box that actually overflows, and that box is the inner
   `.ember-power-select-selected-item`, not the trigger the class lands on: the
   span ships `overflow: visible; text-overflow: clip`, so it grew to its
   content width and the class above it did nothing.

   The trigger is already `display: flex`, so the span only needed `min-width:
   0` — a flex item refuses to shrink below its content without it. The
   `padding-right` is for the two controls: power-select positions the clear
   button and the caret ABSOLUTELY (right: 25px and 5px), so they take no part
   in the flex layout and text will happily run underneath them.

   Reproduced on the fusion Attributes modal with a "Name (email)" author
   label in a 362px field: the value was cut mid-address with no ellipsis and
   its closing bracket sat on top of the clear button, which is what made the
   field look like it had no way to clear it. Measured after: the text
   ellipsises, and the × and the caret are clear of it.
   --------------------------------------------------------------------------- */
.ember-power-select-trigger.text-ellipsis > .ember-power-select-selected-item,
.ember-power-select-trigger.text-ellipsis > .ember-power-select-placeholder {
  box-sizing: border-box;
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  /* Room for the clear button and the caret, which power-select positions
     ABSOLUTELY (right: 25px and 5px) and which therefore take no part in this
     flex row — without it the text runs underneath both. */
  padding-right: 34px;
}
/* The other half of the problem: a long value STRETCHING the field.
 *
 * With a content flex-basis the span asks for its full text width, and that
 * demand travels up — the wrappers are flex COLUMNS, where shrink does not
 * apply on the cross axis, so nothing absorbs it. Measured with a
 * 111-character "Name (email)": the span wanted 745px and dragged its row and
 * the trigger out to 783px inside a 550px sheet, hanging the field off the
 * side of the dialog. `min-width: 0` up the chain does NOT help, because it is
 * not a minimum that is driving the width.
 *
 * A zero basis fixes it — the span stops asking for anything and fills the
 * width the trigger already has — but only where the trigger HAS a width to
 * fill. So it is scoped to `full-width` (the two fusion attribute inputs) and
 * kept away from the content-sized triggers: the catalog control is
 * `max-w-150px` with no width of its own, and a zero basis there collapsed it
 * from 148px to 72px and truncated "All attributes" to "All att…". */
.ember-power-select-trigger.text-ellipsis.full-width > .ember-power-select-selected-item,
.ember-power-select-trigger.text-ellipsis.full-width > .ember-power-select-placeholder {
  flex-basis: 0;
  width: 0;
}
/* A tenancy's name over its hubs in the upload dialog's hub menu (modal/select-domain) — the same grouping and
   the same small-caps label as the header's hub menus. */
.selectbox__group-label {
  padding: 8px 10px 4px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: rgba(0, 0, 0, 0.5);
  text-align: left;
}
.selectbox__group-label ~ .selectbox__group-label {
    margin-top: 4px;
    border-top: 1px solid var(--r-edge);
    padding-top: 10px;
  }
/* The dark panel: the header's hub menus use the same light-on-dark label (header.css). */
[data-theme="dark"] .selectbox__group-label {
  color: rgba(255, 255, 255, 0.6);
}
.user-menu {
  position: relative;
}
.user-menu__img {
    outline: none;
    overflow: hidden;
    position: relative;
    z-index: 1;
    width: 65px;
    height: 65px;
    border: 1px solid #061f45;
    border-radius: 50%;
  }
@media (min-width: 901px) and (max-width: 1280px) {
.user-menu__img {
      width: 55px;
      height: 55px
  }
    }
@media (max-width: 900px) {
.user-menu__img {
      width: 50px;
      height: 50px
  }
    }
.user-menu__img img {
      display: block;
      width: 100%;
      max-width: 100%;
    }
.user-menu__trigger {
  display: flex;
  align-items: center;
  cursor: pointer;
  padding: 15px 10px;
  border-bottom: solid 1px var(--colour-brand);
  font-weight: 300;
  line-height: 1.25;
}
/* color: var(--black); */
.user-menu__trigger:hover {
    background-color: var(--button-bg-hover);
  }
.user-menu__trigger .icon-plus {
    font-size: 20px;
    color: #0658f9;
    margin-right: 5px;
  }
.user-menu__item {
  padding: 0 10px;
  cursor: pointer;
}
.user-menu__item:hover {
    background-color: var(--button-bg-hover);
  }
.user-menu__item--active {
    color: var(--colour-brand);
    text-decoration: underline;
  }
.user-menu__inner {
  padding: 10px 0;
  border-bottom: solid 1px var(--colour-brand);
}
.user-menu__inner--no-border {
    border: 0 !important;;
  }
.vltheader {
  z-index: 3;
  position: fixed;
  display: flex;
  height: 60px;
  padding: 15px;
  box-sizing: border-box;
  width: 100%;
  top: var(--banner-height);
  justify-content: space-between;
  align-items: center;
  background-color: var(--header-menu-bg);
  border-bottom: 1px solid var(--header-menu-line);
}
.vltheader__logo {
  text-align: center;
  width: 150px;
  margin-right: 20px;
}
.vltheader__logo img {
    max-height: 30px;
  }
@media (max-width: 900px) {
.vltheader__logo {
    position: initial;
    transform: none;
    left: 0;
    top: 0
}
  }
@media only screen and (max-device-width: 640px) {
.vltheader__logo {
    display: none
}
  }
.vltheader__dropdown-trigger {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--colour-brand);
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
  font-size: 12px;
  font-weight: 500;
  padding: 0 15px;
}
.vltheader__dropdown-trigger .selectbox__arrow {
    margin-left: 10px;
  }
.vltheader__dropdown-trigger .selectbox__arrow--down {
    border-color: var(--selectbox-arrow-bg);
  }
.vltheader__dropdown-trigger .selectbox__arrow--up {
    border-color: var(--hero-white);
  }
/* Every other trigger in this row is an `<a>` or a `<div>`. The invite one is a real `<button>` — it
   performs an action rather than going anywhere — and a button arrives with a grey face and a border
   that the anchors never had. */
button.vltheader__dropdown-trigger {
  border: 0;
  background: none;
  outline: none;
  font: inherit;
}
button.vltheader__dropdown-trigger:disabled {
    cursor: default;
    opacity: 0.4;
  }
/* ---------------------------------------------------------------------------
   Hub tabs: Classic hubs and Projects (fusion hubs), in the middle of the bar.

   They sit on the header's bottom edge. The active one takes the page's own
   background and covers the header's bottom border, so it opens into the page
   under it, with a brand-blue line along its top; the other is flat on the bar.
   Each opens its kind's hub list. Classic comes first whichever is selected:
   the selection moving must not make them trade places under the pointer.

   Local colours rather than the refresh tokens: those are scoped to modals and
   dropdown panels in the dark theme, and the header is neither.
   --------------------------------------------------------------------------- */
.hubtabs {
  --hubtab-ink: var(--r-navy, #1c205c);
  --hubtab-muted: var(--r-muted, #667085);
  --hubtab-line: #e3e7ee;
  --hubtab-hover: rgba(16, 24, 40, 0.04);
  --hubtab-count-bg: rgba(16, 24, 40, 0.06);
  --hubtab-classic-tile: #e9effb;
  --hubtab-project-tile: #f0ebfc;

  position: absolute;
  left: 50%;
  bottom: -1px;
  transform: translateX(-50%);
  display: flex;
  align-items: flex-end;
  gap: 4px;
  /* Room kept on BOTH sides for the widest of them — the right-hand icons, about
     280px with the transfers icon — so the row stays centred and the tabs shrink
     (their names truncate) rather than run into the logo or the icons. */
  max-width: calc(100vw - 2 * 290px);
}
[data-theme="dark"] .hubtabs {
  --hubtab-ink: var(--hero-white);
  --hubtab-muted: #a8a8a8;
  --hubtab-line: rgba(255, 255, 255, 0.12);
  --hubtab-hover: rgba(255, 255, 255, 0.05);
  --hubtab-count-bg: rgba(255, 255, 255, 0.10);
  --hubtab-classic-tile: rgba(83, 144, 255, 0.18);
  --hubtab-project-tile: rgba(116, 68, 224, 0.26);
}
.hubtab {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
  width: 300px;
  height: 48px;
  padding: 0 16px;
  border: 1px solid transparent;
  border-bottom: 0;
  border-radius: 10px 10px 0 0;
  color: var(--hubtab-ink);
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
  outline: 0;
  transition: background-color 150ms ease;
}
.hubtab:hover {
    background-color: var(--hubtab-hover);
  }
.hubtab:focus-visible {
    box-shadow: inset 0 0 0 2px var(--colour-brand);
  }
.hubtab .selectbox__arrow {
    flex: none;
    margin-left: 2px;
  }
/* Open into the page: its background, the header's line along its sides, and a
   top line in the brand colour. 1px taller than the others and flush with the
   header's bottom edge, so it covers the border under it. */
.hubtab--active {
  height: 50px;
  background-color: var(--body-bg);
  border-color: var(--hubtab-line);
  box-shadow: inset 0 3px 0 var(--colour-brand);
}
.hubtab--active:hover {
    background-color: var(--body-bg);
  }
.hubtab__icon {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 9px;
  background-color: var(--hubtab-classic-tile);
}
.hubtab__icon svg {
    display: block;
  }
.hubtab--project .hubtab__icon {
  background-color: var(--hubtab-project-tile);
  color: var(--purple);
}
.hubtab__text {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  justify-content: center;
  min-width: 0;
  text-align: left;
}
.hubtab__kind {
  font-size: 10.5px;
  font-weight: 700;
  line-height: 14px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--hubtab-muted);
}
.hubtab__name {
  overflow: hidden;
  font-size: 15px;
  font-weight: 600;
  line-height: 20px;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Only the kind's name on the inactive tab: the same size, one weight lighter, so
   the selected hub is the strongest text in the bar. */
.hubtab:not(.hubtab--active) .hubtab__name {
  font-weight: 500;
}
.hubtab__count {
  flex: none;
  min-width: 22px;
  padding: 1px 7px;
  border-radius: 999px;
  background-color: var(--hubtab-count-bg);
  font-size: 11.5px;
  font-weight: 600;
  line-height: 17px;
  text-align: center;
}
/* A project's icon in its list is the layers icon in the house purple. */
.vltheader__row-avatar--fusion {
  color: var(--purple);
}
/* Narrower than this the tabs are shrinking, and the count is what gives way:
   the name is what the tab is for. */
@media (max-width: 1100px) {
  .hubtab {
    gap: 8px;
    padding: 0 10px;
  }

  .hubtab__count {
    display: none;
  }
}
/* Too narrow to keep the tabs centred over everything: they join the row
   instead, after the logo, and shrink to the room left before the icons. Above
   this the centred row still fits, because it reserves 290px each side; below it
   that reservation would leave the tabs no width at all, and they spilled over
   the icons. By WINDOW width, so a narrow desktop window gets it too. */
@media (max-width: 860px) {
  .hubtabs {
    position: static;
    flex: 0 1 auto;
    min-width: 0;
    max-width: none;
    margin: 0 12px -16px;
    align-self: flex-end;
    transform: none;
  }

  .hubtab {
    width: auto;
    flex: 0 1 240px;
  }
}
/* Narrower still, the logo goes as it does on a phone: the tabs need the room
   more than the mark does, and would otherwise shrink past reading. */
@media (max-width: 700px) {
  .vltheader__logo {
    display: none;
  }
}
.vltheader__row-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  margin-right: 12px;
  border-radius: 50%;
  background-color: rgba(0, 0, 0, 0.06);
  flex-shrink: 0;
  overflow: hidden;
}
.vltheader__row-avatar img {
    width: 24px;
    height: 24px;
    border-radius: 50%;
    object-fit: cover;
  }
.vltheader__dropdown-content {
  max-height: 40vh;
  overflow: auto;
  max-width: 220px;
  min-width: 170px;
  top: 40px;
  font-size: 12px;
  font-weight: 500;
  line-height: 1.25;
  border-radius: 7px;
  box-shadow: 0 1px 4px 1px rgba(0, 0, 0, 0.25);
  border: solid 1px var(--colour-brand);
  background-color: var(--body-bg);
}
.vltheader__dropdown-content .user-info__name, .vltheader__dropdown-content .user-info__dscr {
    max-width: 150px;
  }
.vltheader__dropdown-content--domain {
  color: var(--header-hub-color);
  border: solid 1px rgba(0, 0, 0, 0.10);
  background-color: var(--body-bg);
  text-align: center;
  /* Its tab's width (`matchTriggerWidth`), but never narrower than a hub name can be
     read in: between about 700 and 1000 px a tab is 130-200 px wide, and the list
     at that width showed every name as "revi…". */
  min-width: 260px;
  /* Always below its trigger, never pulled up over it: covering the trigger hides
     the hub you are switching FROM, which is half the decision. */
  margin-top: 4px;
  max-width: 500px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.10);
}
@media only screen and (max-device-width: 640px) {
.vltheader__dropdown-content--domain {
    max-width: 100%
}
  }
.vltheader__dropdown-content--domain .selectbox__arrow {
    border-color: var(--colour-brand);
    margin-left: 5px;
  }
.vltheader__dropdown-content--domain .user-menu__item {
    padding: 0 21px;
  }
.vltheader__dropdown-content--domain .user-menu__inner {
    display: flex;
    align-items: center;
    border-bottom: solid 1px rgba(0, 0, 0, 0.06);
    cursor: pointer;
    text-align: left;
    padding: 8px 0;
  }
.vltheader__dropdown-content--domain .user-menu__item:hover {
    background-color: rgba(0, 0, 0, 0.04);
  }
.vltheader__dropdown-content--domain .vltheader__domain-name:hover {
    color: var(--colour-brand);
    text-decoration: none;
  }
.vltheader__dropdown-content--domain .user-menu__item--active {
    background-color: rgba(91, 141, 247, 0.10);
  }
.vltheader__dropdown-content--domain .user-menu__item--active .vltheader__domain-row-name {
      font-weight: 600;
      color: var(--colour-brand);
    }
.vltheader__dropdown-content--domain .vltheader__search {
    display: flex;
    align-items: center;
    margin: 8px 12px 4px;
    padding: 0 10px;
    border-radius: 6px;
    background-color: rgba(0, 0, 0, 0.04);
  }
.vltheader__dropdown-content--domain .vltheader__search-icon {
    display: inline-flex;
    align-items: center;
    color: rgba(0, 0, 0, 0.5);
    margin-right: 8px;
  }
.vltheader__dropdown-content--domain .vltheader__search-input {
    flex: 1 1;
    background: transparent;
    border: none;
    outline: none;
    color: inherit;
    font-size: 12px;
    padding: 8px 0;
  }
.vltheader__dropdown-content--domain .vltheader__search-input::placeholder {
      color: rgba(0, 0, 0, 0.4);
    }
.vltheader__dropdown-content--domain .vltheader__section-label {
    padding: 8px 21px 4px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: 0.5px;
    color: rgba(0, 0, 0, 0.5);
    text-align: left;
  }
/* A tenancy's name over its hubs. Uppercase like the label it replaced; a rule above every group but the
     first, so where one tenancy ends is visible without reading the names. */
.vltheader__dropdown-content--domain .vltheader__section-label--tenancy {
    text-transform: uppercase;
    padding-top: 12px;
  }
.vltheader__dropdown-content--domain .vltheader__section-label--tenancy ~ .vltheader__section-label--tenancy {
      border-top: 1px solid rgba(0, 0, 0, 0.08);
      margin-top: 4px;
    }
.vltheader__dropdown-content--domain .vltheader__empty-state {
    padding: 16px 21px;
    text-align: center;
    font-size: 12px;
    color: rgba(0, 0, 0, 0.45);
  }
.vltheader__dropdown-content--domain .vltheader__row-check {
    display: inline-flex;
    align-items: center;
    margin-left: 8px;
    color: var(--colour-brand);
    flex-shrink: 0;
  }
.vltheader__dropdown-content--domain .vltheader__row-text {
    display: flex;
    flex-direction: column;
    flex: 1 1;
    min-width: 0;
  }
.vltheader__dropdown-content--domain .vltheader__row-meta {
    font-size: 11px;
    font-weight: 400;
    color: rgba(0, 0, 0, 0.55);
    line-height: 1.2;
    margin-top: 2px;
  }
.vltheader__dropdown-content--domain .vltheader__dropdown-footer {
    display: flex;
    align-items: stretch;
    border-top: solid 1px rgba(0, 0, 0, 0.08);
    margin-top: 4px;
    position: sticky;
    bottom: 0;
    background-color: var(--body-bg);
    z-index: 1;
  }
.vltheader__dropdown-content--domain .vltheader__footer-action {
    flex: 1 1;
    padding: 10px 12px;
    text-align: center;
    cursor: pointer;
    font-size: 12px;
    font-weight: 500;
    color: var(--colour-brand);
  }
.vltheader__dropdown-content--domain .vltheader__footer-action a {
      color: inherit;
      text-decoration: none;
    }
.vltheader__dropdown-content--domain .vltheader__footer-action:hover {
      background-color: rgba(91, 141, 247, 0.06);
    }
.vltheader__dropdown-content--domain .vltheader__footer-action--disabled {
    opacity: 0.5;
    cursor: not-allowed;
    color: rgba(0, 0, 0, 0.5);
  }
.vltheader__dropdown-content--domain .vltheader__footer-action--disabled:hover {
      background-color: transparent;
    }
.vltheader__dropdown-content--domain .vltheader__footer-action + .vltheader__footer-action {
    border-left: solid 1px rgba(0, 0, 0, 0.08);
  }
.vltheader__dropdown-content--domain .vltheader__domain-row-name {
    flex: 1 1;
    min-width: 0;
  }
/* Region protection: hub is blocked for the current user's country */
.vltheader__dropdown-content--domain .vltheader__domain-name--restricted {
    background-color: #fcf0e4;
    cursor: not-allowed;
  }
.vltheader__dropdown-content--domain .vltheader__domain-name--restricted .user-menu__inner {
      cursor: not-allowed;
    }
.vltheader__dropdown-content--domain .vltheader__domain-name--restricted:hover {
      background-color: #fcf0e4;
      color: inherit;
    }
.vltheader__dropdown-content--domain .vltheader__row-meta--unavailable {
    color: var(--colour-fg-danger);
  }
/* Admin bypass: hub has a region policy that excludes the user's country,
     visible only thanks to DekkoAdmin / TenantAdmin rights */
.vltheader__dropdown-content--domain .vltheader__row-meta--restricted-hint {
    opacity: 0.55;
  }
/* Dark theme: flip the hardcoded rgba(0, 0, 0, ...) decorations
   so the dropdown panel stays legible on a dark bg. */
[data-theme="dark"] .vltheader__row-avatar {
    background-color: rgba(255, 255, 255, 0.10);
  }
[data-theme="dark"] .vltheader__dropdown-content--domain {
    border-color: rgba(255, 255, 255, 0.16);
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.40);
  }
[data-theme="dark"] .vltheader__dropdown-content--domain .user-menu__inner {
      border-bottom-color: rgba(255, 255, 255, 0.10);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .user-menu__item:hover {
      background-color: rgba(255, 255, 255, 0.06);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .user-menu__item--active {
      background-color: rgba(91, 141, 247, 0.20);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__search {
      background-color: rgba(255, 255, 255, 0.08);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__search-icon {
      color: rgba(255, 255, 255, 0.6);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__search-input::placeholder {
      color: rgba(255, 255, 255, 0.5);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__section-label {
      color: rgba(255, 255, 255, 0.6);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__section-label--tenancy ~ .vltheader__section-label--tenancy {
      border-top-color: rgba(255, 255, 255, 0.12);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__empty-state {
      color: rgba(255, 255, 255, 0.55);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__row-meta {
      color: rgba(255, 255, 255, 0.65);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__domain-name--restricted {
      background-color: rgba(238, 196, 163, 0.12);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__domain-name--restricted:hover {
        background-color: rgba(238, 196, 163, 0.12);
      }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__row-meta--unavailable {
      color: #ff8da1;
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__dropdown-footer {
      border-top-color: rgba(255, 255, 255, 0.12);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__footer-action:hover {
      background-color: rgba(91, 141, 247, 0.16);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__footer-action--disabled {
      color: rgba(255, 255, 255, 0.5);
    }
[data-theme="dark"] .vltheader__dropdown-content--domain .vltheader__footer-action + .vltheader__footer-action {
      border-left-color: rgba(255, 255, 255, 0.12);
    }
.header {
  z-index: 3;
  box-sizing: border-box;
  position: fixed;
  top: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  padding: 20px 40px 20px 40px;
}
.header .menu {
    max-width: 100%;
  }
@media (max-width: 1024px) {
.header {
    padding: 20px
}
  }
.header__logo {
    /*width: 50px;*/
    height: 50px;
    margin-right: 20px;
    flex-shrink: 0;
    cursor: pointer;
  }
@media (max-width: 1440px) {
.header__logo {
      max-width: 180px;
      height: auto
  }
    }
/*     @media (max-width: 900px) {
      display: none;
    }

    @media (--phone-viewport) {
      display: none;
    } */
.header__logo img {
      height: 100%;
    }
.header__logo--lynx {
      display: block;
    }
@media only screen and (max-device-width: 640px) {
        .header__logo--lynx svg {
          width: 195px;
        }
      }
.header--style-2 {
    position: initial;
    padding-bottom: 0;
    background: none;
  }
.header--style-2 .header__logo {
        width: 200px;
      }
.header--style-2 .header__logo img {
          width: 100%;
          height: auto;
        }
.header--style-3 {
    position: fixed;;
    background: none;
  }
.header--style-3 .header__logo {
        width: 343px;
      }
.header--style-3 .header__logo img {
          width: 100%;
          height: auto;
        }
.header--style-4 {
    position: fixed;;
    background: none;
  }
.header--style-4 .header__logo {
        width: 200px;
      }
.header--style-4 .header__logo img {
          width: 100%;
          height: auto;
        }
.menu {
  display: flex;
  align-items: center;
}
.menu__icons-bell {
      position: relative;
    }
.menu__icons-bell--active:after {
          display: block;
          content: '';
          position: absolute;
          top: 12px;
          right: -5px;
          width: 10px;
          height: 10px;
          background-color: #ed3521;
          border-radius: 50%;
        }
.menu__icons-chat--active:after {
      top: 0;
      right: 0;
    }
@media only screen and (max-device-width: 640px) {
  /* The Hub menu is the main way around the app on a phone, so it gets the
     width the screen has rather than the 220px a desktop popover needs. */
  .vltheader__dropdown-content,
  .vltheader__dropdown-content--domain {
    width: calc(100vw - 24px);
    min-width: 0;
    max-width: none;
  }

  /* The tab's width is written inline and wins over the width above, so the floor
     is the minimum; capped by the screen for the narrowest phones. */
  .vltheader__dropdown-content--domain {
    min-width: min(260px, calc(100vw - 24px));
  }
}
/* The tick keeps its place on every row, hidden with `visibility` where it does
   not apply, so the column stays straight. */
.vltheader__row-check--placeholder {
  visibility: hidden;
}
/* The tenancy's information banner (components/information-banner), fixed above the header.

   Everything placed from the top of the window — the header, the nav, the content's room for them, the side
   panels — adds `--banner-height` to its offset. It is 0 without a banner; the banner sets it to its own height
   on `:root` while it is shown, and clears it when it goes. */
:root {
  --banner-height: 0px;
}
.information-banner {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 4;
  box-sizing: border-box;
  padding: 6px 16px;
  text-align: center;
  font-size: 13px;
  font-weight: 500;
  line-height: 18px;
  overflow-wrap: anywhere;
}
/* The same notice inside the upload dialog's "Select HUB" (modal/select-domain), for the hub chosen there: the
   page's own banner is hidden in "All", which is where that dialog is opened from. In the flow, not fixed.
   `width: 0; min-width: 100%` so it wraps to the dialog rather than widening it: the dialog is as wide as its
   content, and a 200-character notice on one line stretched it to most of the window. */
.select-domain__banner {
  box-sizing: border-box;
  width: 0;
  min-width: 100%;
  margin: 12px 0 4px;
  padding: 8px 12px;
  border-radius: 8px;
  text-align: center;
  font-size: 13px;
  font-weight: 500;
  line-height: 18px;
  overflow-wrap: anywhere;
}
.breadcrumbs {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  padding-bottom: 20px;
}
@media only screen and (max-device-width: 640px) {
.breadcrumbs {
    overflow-x: auto;
    overflow-y: hidden;
    padding: 15px;
    justify-content: flex-start
}
  }
.breadcrumbs--is-hidden {
    display: block;
  }
.breadcrumbs__item {
    cursor: pointer;
    display: flex;
    align-items: center;
    margin-left: 0;
  }
@media (max-width: 1112px) {
.breadcrumbs__item {
      max-width: 170px
  }
    }
.breadcrumbs__item:first-child { margin-left: 0; }
.breadcrumbs__item-arrow {
      font-size: 24px;
      color: #000;
      margin-right: 10px;
    }
@media only screen and (max-device-width: 640px) {
.breadcrumbs__item-arrow {
        font-size: 15px
    }
      }
.breadcrumbs__item-folder {
      height: auto;
    }
.breadcrumbs__item-content {
      margin-left: 15px;
    }
@media (max-width: 1112px) {
.breadcrumbs__item-content {
        margin-left: 10px
    }
      }
.breadcrumbs__item-title {
      font-weight: 500;
      font-size: 16px;
      /* color: #000; */
      line-height: 1.5;
    }
@media (max-width: 1112px) {
.breadcrumbs__item-title {
        font-size: 12px;
        line-height: 1
    }
      }
/* Width of the standard right-hand sidebar. Declared here, next to the block it
   sizes, because it is not only a sidebar concern: the conference dock in
   _blocks/room reserves exactly this much room so the chat panel sits beside the
   call instead of over it. Two hard-coded 400s in two files is how that quietly
   breaks the next time someone widens the sidebar. */
:root {
  --sidebar-width: 400px;
}
.container {
  box-sizing: border-box;
  /* Room reserved for the fixed left nav. Reads the nav's own token so a
     collapse moves the content with the panel — see _blocks/nav/nav.css. */
  margin-left: var(--nav-width);
  transition: margin-left 0.18s ease;
  padding: calc(180px + var(--banner-height)) 0 40px 40px;
  height: 100vh;
  overflow: auto;
}
.container__sidebar {
    /* NOTE: We have global contacts-widget component, it has z-index: 10; */
    /* And We should have sidebar on top of it */
    box-sizing: border-box;
    z-index: 20;
    position: relative;
    width: var(--sidebar-width);
    /* color: var(--black); */
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
    background-color: var(--body-bg);
    border-radius: 10px 0 0 0;
  }
.container__sidebar-close {
      cursor: pointer;
      display: block;
/*      margin-bottom: 5px;
      padding-top: 15px;*/
      color: #000;
      text-align: right;
    }
.container__sidebar-close--chat {
        position: absolute;
        top: 10px;
        right: 15px;
      }
.container__sidebar-tab {
      padding: 30px 0;
    }
.container__sidebar-accordion {
      margin-top: 20px;
    }
.container__sidebar-column {
      flex: 1 1;
      padding: 25px 10px 10px;
      box-sizing: border-box;
    }
.container__sidebar-column--buttons {
        flex: 1 1;
        padding: 0 10px;
      }
@media only screen and (max-device-width: 640px) {
.container__sidebar {
      width: 100%;
      box-sizing: border-box;
      right: -100% !important
  }
    }
.container--valut, .container--mail, .container--chat, .container--settings, .container--search, .container--tenancy {
    display: flex;
    margin-left: var(--nav-width);
    padding: calc(130px + var(--banner-height)) 0 30px 40px;
    height: 100vh;
    max-height: 100vh;
  }
.container--valut .container__content, .container--mail .container__content, .container--chat .container__content, .container--settings .container__content, .container--search .container__content, .container--tenancy .container__content {
      display: flex;
      flex-direction: column;
    }
.container--valut .container__sidebar, .container--mail .container__sidebar, .container--chat .container__sidebar, .container--settings .container__sidebar, .container--search .container__sidebar, .container--tenancy .container__sidebar {
      /* NOTE: We have global contacts-widget component, it has z-index: 10; */
      /* And We should have sidebar on top of it */
      z-index: 20;
      position: fixed;
      flex-shrink: 0;
      height: calc(100vh - 60px - var(--banner-height));
      overflow: auto;
      right: -415px;
      padding: 20px 30px 30px 40px;
      transition: ease .5s all;
    }
@media (max-width: 1440px) {
.container--valut .container__sidebar, .container--mail .container__sidebar, .container--chat .container__sidebar, .container--settings .container__sidebar, .container--search .container__sidebar, .container--tenancy .container__sidebar {
        display: block;
        box-shadow: 3px 3px 3px 3px rgba(0, 0, 0, 0.2)
    }
      }
@media (min-width: 1281px) and (max-width: 1440px) {
.container--valut .container__sidebar, .container--mail .container__sidebar, .container--chat .container__sidebar, .container--settings .container__sidebar, .container--search .container__sidebar, .container--tenancy .container__sidebar {
        top: calc(60px + var(--banner-height));
        max-height: calc(100vh - 60px - var(--banner-height))
    }
      }
@media (max-width: 1280px) {
.container--valut .container__sidebar, .container--mail .container__sidebar, .container--chat .container__sidebar, .container--settings .container__sidebar, .container--search .container__sidebar, .container--tenancy .container__sidebar {
        top: calc(60px + var(--banner-height));
        max-height: calc(100vh - 60px - var(--banner-height))
    }
      }
@media (max-width: 900px) {
.container--valut .container__sidebar, .container--mail .container__sidebar, .container--chat .container__sidebar, .container--settings .container__sidebar, .container--search .container__sidebar, .container--tenancy .container__sidebar {
        padding: 20px;
        border-radius: 0
    }
      }
.container--valut .container__sidebar--is-opened, .container--mail .container__sidebar--is-opened, .container--chat .container__sidebar--is-opened, .container--settings .container__sidebar--is-opened, .container--search .container__sidebar--is-opened, .container--tenancy .container__sidebar--is-opened {
        transform: translateX(-415px);
      }
@media only screen and (max-device-width: 640px) {
.container--valut .container__sidebar--is-opened, .container--mail .container__sidebar--is-opened, .container--chat .container__sidebar--is-opened, .container--settings .container__sidebar--is-opened, .container--search .container__sidebar--is-opened, .container--tenancy .container__sidebar--is-opened {
          transform: translateX(-100%);
          width: 100%
      }
        }
.container--valut .container__sidebar--is-opened.container__sidebar--is-new, .container--mail .container__sidebar--is-opened.container__sidebar--is-new, .container--chat .container__sidebar--is-opened.container__sidebar--is-new, .container--settings .container__sidebar--is-opened.container__sidebar--is-new, .container--search .container__sidebar--is-opened.container__sidebar--is-new, .container--tenancy .container__sidebar--is-opened.container__sidebar--is-new {
          transform: translateX(-803px);
        }
@media only screen and (max-device-width: 640px) {
.container--valut .container__sidebar--is-opened.container__sidebar--is-new, .container--mail .container__sidebar--is-opened.container__sidebar--is-new, .container--chat .container__sidebar--is-opened.container__sidebar--is-new, .container--settings .container__sidebar--is-opened.container__sidebar--is-new, .container--search .container__sidebar--is-opened.container__sidebar--is-new, .container--tenancy .container__sidebar--is-opened.container__sidebar--is-new {
            transform: translateX(-100%);
            width: 100%
        }

            .container--valut .container__sidebar--is-opened.container__sidebar--is-new .conference__content, .container--mail .container__sidebar--is-opened.container__sidebar--is-new .conference__content, .container--chat .container__sidebar--is-opened.container__sidebar--is-new .conference__content, .container--settings .container__sidebar--is-opened.container__sidebar--is-new .conference__content, .container--search .container__sidebar--is-opened.container__sidebar--is-new .conference__content, .container--tenancy .container__sidebar--is-opened.container__sidebar--is-new .conference__content {
              flex-direction: column;
            }

            .container--valut .container__sidebar--is-opened.container__sidebar--is-new .container__sidebar-column:last-child, .container--mail .container__sidebar--is-opened.container__sidebar--is-new .container__sidebar-column:last-child, .container--chat .container__sidebar--is-opened.container__sidebar--is-new .container__sidebar-column:last-child, .container--settings .container__sidebar--is-opened.container__sidebar--is-new .container__sidebar-column:last-child, .container--search .container__sidebar--is-opened.container__sidebar--is-new .container__sidebar-column:last-child, .container--tenancy .container__sidebar--is-opened.container__sidebar--is-new .container__sidebar-column:last-child {
              padding-top: 0;
            }
          }
.container--valut .container__sidebar--is-chat, .container--mail .container__sidebar--is-chat, .container--chat .container__sidebar--is-chat, .container--settings .container__sidebar--is-chat, .container--search .container__sidebar--is-chat, .container--tenancy .container__sidebar--is-chat {
        padding: 0;
        border-radius: 0;
      }
.container--valut .container__sidebar--is-new, .container--mail .container__sidebar--is-new, .container--chat .container__sidebar--is-new, .container--settings .container__sidebar--is-new, .container--search .container__sidebar--is-new, .container--tenancy .container__sidebar--is-new {
        width: 800px;
        right: -803px;
      }
.container--valut {
    padding: 0;
    padding-top: calc(60px + var(--banner-height));
  }
@media (min-width: 901px) and (max-width: 1280px) {
.container--valut {
      /* margin-top: 60px; */
      /* height: calc(100vh - 60px) !important; */
      /* max-height: calc(100vh - 60px) !important; */
      height: 100vh;
      max-height: 100vh
  }
    }
@media (max-width: 900px) {
.container--valut {
      padding-top: calc(60px + var(--banner-height));
      height: 100vh;
      max-height: 100vh
  }
    }
@media only screen and (max-device-width: 640px) {
.container--valut {
      margin-left: 0
  }
    }
.container--valut .container__content {
      box-sizing: border-box;
      width: 100%;
      padding: 20px;
    }
@media only screen and (max-device-width: 640px) {
.container--valut .container__content {
        padding: 0
    }
      }
@media (min-width: 901px) and (max-width: 1280px) {
.container--valut .container__sidebar {
        top: calc(60px + var(--banner-height));
        height: calc(100vh - 60px - var(--banner-height));
        max-height: calc(100vh - 60px - var(--banner-height))
    }
      }
@media (max-width: 900px) {
.container--valut .container__sidebar {
        top: calc(60px + var(--banner-height)) !important;
        height: calc(100vh - 60px - var(--banner-height));
        max-height: calc(100vh - 60px - var(--banner-height)) !important
    }
      }
@media only screen and (max-device-width: 640px) {
.container--valut .container__sidebar {
        padding-bottom: 100px
    }
      }
.container--mail, .container--chat, .container--settings, .container--search, .container--tenancy {
    padding-right: 40px;
  }
@media (max-width: 1024px) {
.container--mail, .container--chat, .container--settings, .container--search, .container--tenancy {
      padding-right: 20px
  }
    }
.container--mail, .container--chat, .container--settings, .container--search, .container--tenancy {
    height: 100vh;
    max-height: 100vh;
}
.container--mail .container__content, .container--chat .container__content, .container--settings .container__content, .container--search .container__content, .container--tenancy .container__content {
      width: 100%;
    }
.container--search, .container--mail {
    padding-bottom: 0;
  }
.container--mail {
    padding-top: calc(60px + var(--banner-height));
  }
.container--tenancy {
    padding-right: 0;
  }
.container--sign {
    display: flex;
    align-items: center;
    justify-content: center;
    /*padding: 30px;*/
    padding: 0;
    flex: 1 1;
    margin-left: 0;
    overflow: auto;
    max-height: none;
    height: auto;
  }
.container--sign .container__content {
      position: relative;
      max-width: 900px;
/*      height: auto;
      overflow: auto;*/
      flex: 1 1;
      box-sizing: border-box;
    }
.container--sign .container__content--email-verify {
        max-width: 250px;
      }
.container--signup .container__content {
      max-width: 1150px;
    }
/* The Meetings (LYNX) window has no nav, so no nav margin. Two classes, not one: the production build merges a lone
     `.container--no-nav { margin-left: 0 }` into an earlier rule with the same declaration, which put it BEFORE
     `&--valut`'s `margin-left: var(--nav-width)` above. At equal specificity the later rule won, and the window kept a
     175 px gap that pushed Join/Cancel/Edit off the list below ~1300 px. A higher specificity wins in any order. */
.container--no-nav,
  .container--valut.container--no-nav {
    margin-left: 0;
  }
/* The same for the sign pages (recovery, not-found): `&--sign`'s own `margin-left: 0` lost to `.container`'s nav
     margin once the build merged it into an earlier rule. Two classes win in any order. */
.container.container--sign {
    margin-left: 0;
  }
.container--no-nav .valut__container-stickyhead {
      padding: 0;
    }
@media (max-width: 1440px) {
.container--no-nav .valut__container-stickyhead {
        padding-left: 20px
    }
      }
@media only screen and (max-device-width: 640px) {
.container--no-nav .valut__container-stickyhead {
        padding-left: 0
    }
      }
/* Create-meeting (conference) sidebar inputs: pin an explicit light background so the
   native form controls stay legible under the browser's dark colour scheme
   (prefers-color-scheme: dark). Without this, inputs that don't declare their own
   background — .sign__form-input on the Topic/Duration fields and the flat
   participants input — inherit Chrome's dark user-agent styling and render dark text
   on a dark box (the typed meeting name became invisible). */
.conference__content .sign__form-input,
.conference__content .field__input,
.conference__content .field__input--flat input {
  background-color: var(--panel-field-bg);
}
.conference__content .field__input--flat input {
  color: var(--panel-field-color);
}
@media only screen and (max-device-width: 640px) {
  /* The scroll container has no bottom padding, so the last thing on the page —
     a pagination row, the end of a card — sits flush against the very edge of
     the screen and reads as cut in half. Padding also gives the container a
     scroll range past its content, so if the visible height is ever a little
     short of what was measured, the last row can still be brought up. */
  /* `.p-header` is a generated utility — `padding: 60px 0 0 0` — and it lands
     18,000 lines further down the bundle than this file, so a `.container`
     longhand at the same weight loses to its shorthand. Naming both is what
     carries it, and it also says which containers this is for: the four admin
     shells, the ones whose bottom padding that utility zeroes. */
  .container.p-header {
    padding-bottom: 24px;
  }
}
.valut__head {
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    /*margin-bottom: 20px;*/
    height: 63px;
  }
@media only screen and (max-device-width: 640px) {
.valut__head {
      height: auto;
      justify-content: center;
      flex-direction: column
  }
    }
.valut__head-files-nav {
      display: none;
    }
.valut__head-deselect {
      flex: 1 1;
      display: flex;
      align-items: center;
      justify-content: flex-start;
      font-size: 14px;
    }
/* Shape, size and colour come from `.button` — this used to draw its own
         box, at (0,1,1), which silently outranked every button rule and is why
         "deselect" was the one button in the toolbar with no outline. Only the
         width override is still this element's business: it is a two-word
         button and `.button` reserves 110px. */
.valut__head-deselect button {
        min-width: auto;
      }
/* color: var(--colour-black); */
@media (max-width: 1024px) {
.valut__head-deselect {
        margin-bottom: 10px;
        margin-top: 5px
    }
      }
.valut__head-deselect span {
        margin-right: 10px;
      }
@media only screen and (max-device-width: 640px) {
.valut__head-tabs {
        justify-content: center;
        flex-wrap: wrap;
        margin-bottom: 10px
    }
      }
.valut-menu {
    display: flex;
  }
.valut-menu__button {
      margin-left: 30px;
    }
.valut-menu__button:first-child { margin-left: 0; }
.valut__container {
    display: flex;
    flex-direction: column;
    flex-grow: 1;
    height: 100%;
  }
@media (max-width: 1024px) {
.valut__container {
      max-width: unset
  }
    }
.valut__container-stickyhead {
    height: 100px;
    z-index: 2;
    width: calc(100% - 115px);
  }
@media (max-width: 1440px) {
.valut__container-stickyhead {
      width: calc(100% - 20px)
  }
    }
@media only screen and (max-device-width: 640px) {
.valut__container-stickyhead {
      width: 100%;
      height: auto
  }
    }
.valut__container-stickyfooter {
    position: fixed;
    width: calc(100% - 555px);
    bottom: 20px;
    z-index: 2;
  }
@media (max-width: 1440px) {
.valut__container-stickyfooter {
      width: calc(100% - 115px)
  }
    }
/* NEW */
.vlt__head {
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;

  /* Named buttons need about 1520px of toolbar, and the two clusters meet exactly at
     a 1440 laptop — anything narrower and they overlap, because the labels are
     `nowrap` and the stacking rule below does not arrive until 1024px. So the row
     wraps: the actions cluster drops to a second line rather than colliding, and no
     button is compressed, clipped or dropped on the way. It is a `wrap` rather than
     a new breakpoint because the width it needs depends on which buttons that hub,
     folder and selection actually produce — the fusion toolbar carries a different
     set again — and a hard-coded number would be wrong for most of them. */
  flex-wrap: wrap;
  row-gap: 8px;
}
/* Wrapped, the two clusters are each alone on a line, and `space-between` puts a
     lone item at the start — so the second row sat hard against the left edge under
     a full-width first row. Centred from the width where the wrap becomes possible.

     A threshold rather than a cleverer trick because CSS cannot ask "did you wrap":
     1750px is just above the ~1734px the fully-labelled classic toolbar needs. The
     number cannot be exactly right for every toolbar — the fusion one carries a
     different set, and a selection swaps the upload cluster for the shorter "N files
     selected" — but it is wrong in the harmless direction. Too high only means the
     clusters are centred while still sharing one line, which reads as deliberate;
     too low would leave the wrapped row left-aligned, which is the bug. */
@media (max-width: 1750px) {
.vlt__head {
    justify-content: center;
    column-gap: 24px
}
  }
.vlt__head {
  margin-top: -8px;
  margin-bottom: 33px;
}
/* Up 8px, and the 8px handed straight back below so nothing but the toolbar
     moves — the 25px it sits above the table was not the problem.
     The gap being closed belongs to `.container__content`'s 20px top padding,
     which every screen in the app shares; taking it out there would lift mail,
     chat and settings by 8px to fix a toolbar. So it is closed here, on the one
     element that asked for it.
     The phone re-declares `margin-top` below and therefore opts out, which is
     right: at that width the toolbar stacks into two rows and needs the room. */
@media (max-width: 1024px) {
.vlt__head {
    flex-direction: column;
    margin-bottom: 10px
}

    .vlt__head .vlt__buttons:first-child {
      margin-bottom: 10px;
    }
  }
@media only screen and (max-device-width: 640px) {
.vlt__head {
    margin-top: 5px
}
  }
.vlt__buttons {
  display: flex;
  align-items: stretch;
  justify-content: center;
}
.vlt__hubname {
  font-size: 19px;
  font-weight: 600;
  line-height: 1.42;
  letter-spacing: 0.19px;
  text-align: left;
  color: var(--colour-black);
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  text-align: left;
}
@media (max-width: 1440px) {
.vlt__hubname {
    max-width: 250px
}
  }
@media (max-width: 1024px) {
.vlt__hubname {
    /* position: initial; */
    /* transform: none; */
    /* left: 0; */
    /* order: -1; */
    font-size: 20px;
    margin-bottom: 10px
}
  }
/* NEW */
.valut-file-info {
  display: none;
  position: absolute;
  bottom: 0;
  width: 100%;
  background-color: var(--white);
  color: var(--black);
  font-size: 14px;
  line-height: 1.6;
}
@media only screen and (max-device-width: 640px) {
.valut-file-info {
    display: block;
    box-shadow: 0 -3px 6px 0 rgb(0 0 0 / 16%)
}
  }
.valut-file-info__row {
    display: flex;
    align-items: center;
    justify-content: center;
  }
.valut-file-info__row--values {
      padding: 0 12px 15px;
    }
.valut-file-info__row--arrow {
      font-size: 25px;
    }
.valut-file-info__column {
    flex: 1 1;
  }
.valut-file-info__value {
    max-width: 115px;
  }
/* The generic block, unchanged. It is shared with the draggable chat widget
   (`_blocks/widget/widget-chat`, `_blocks/chat-modal`), which builds its own
   80px `#4E4E4E` header on top of these values and paints the participant's
   name `#fff` to suit it. Everything the chat PAGE header wants is scoped to
   `.chat__content` below, so none of it reaches that widget — a near-white
   chip under the widget's white name text left the name invisible. */
.chat__head {
		position: relative;
		display: flex;
		align-items: center;
		justify-content: space-between;
		padding: 16px 16px 16px 32px;
	}
.chat__head .user {
			display: flex;
			max-width: calc(100% - 50px);
		}
.chat__head .chat__members {
			width: 100%;
			flex-wrap: wrap;
		}
.chat__head .chat__members .user {
				flex-shrink: 0;
				width: auto;
				margin-right: 10px;
			}
.chat__head .chat__members .user-img {
					width: 31px!important;
					height: 31px!important;
					margin-right: 5px;
				}
.chat__subhead {
		position: relative;
		display: flex;
		justify-content: space-between;
		margin-bottom: 10px;
	}
.chat__attributes {
	  position: absolute;
	  top: 20px;
	  left: 50%;
	  transform: translate(-50%, 0);
	}
/* ---- The chat page's header ---- */
.chat__content .chat__head {
	gap: 12px;
	padding: 0 4px 12px;
}
/* Who is in this conversation: one chip per person rather than a bare
	   avatar-and-name pair per person. With three or four participants the run
	   of unbounded names had nothing separating one from the next. */
.chat__content .chat__head .chat__members {
		display: flex;
		gap: 6px;
	}
.chat__content .chat__head .chat__members .user {
			align-items: center;
			margin-right: 0;
			padding: 3px 10px 3px 3px;
			border: 1px solid var(--msg-edge);
			border-radius: var(--r-r-pill);
			background-color: var(--msg-chip-bg);
		}
.chat__content .chat__head .chat__members .user-img {
				width: 24px !important;
				height: 24px !important;
				margin-right: 7px;
				border-width: 0;
				background-color: var(--msg-avatar-bg);
			}
.chat__content .chat__head .chat__members .user-name {
				font-size: 13px;
				font-weight: 600;
				color: var(--msg-fg);
			}
/* The generic block, unchanged — shared with the draggable chat widget, which
   overrides the box entirely (`padding: 16px 16px 60px`, `margin-top: -50px`,
   `max-height: calc(100% - 25px)`, all against a `#F7F7F7` wrap). The card
   treatment below is scoped to the chat page so those numbers keep meaning
   what they say. */
.chat__body {
		position: relative;
		border-radius: 4px;
		box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
		background-color: var(--body-bg);
		padding: 32px;
		height: 100%;
		max-height: calc(100% - 140px);
		overflow: hidden;
	}
/* The card the conversation lives in, on the chat page. A column, so the
   message stack can claim the space left over and scroll inside it while the
   composer keeps its place at the bottom — previously both were sized by hand
   against the card height (`calc(100% - 140px)` above, `calc(100% - 150px)` on
   the stack) and the two numbers had to be kept in step by eye. */
.chat__content .chat__body {
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	border: 1px solid var(--msg-edge);
	border-radius: var(--r-r-inner);
	box-shadow: var(--r-shadow);
	max-height: calc(100% - 96px);

	/* Room for the composer, which is positioned against this card. */
	padding: 20px 20px 82px;
}
.chat__content .chat__body .dialog {
		flex: 1 1 auto;
		min-height: 0;
	}
.chat__wrap {
		position: relative;
		display: block;
	}
.chat__actions {
		display: inline-flex;
		justify-content: flex-end;
		align-items: center;
	}
.chat__actions .button--chat-action {
			min-width: 20px;
		}
.chat__actions .button--chat-action .icon {
				font-size: 12px;
			}
.chat__actions .button--chat-action .icon-search {
				font-size: 14px;
			}
.chat__actions .selectbox {
			z-index: 1;
			min-width: 20px;
		}
.chat__actions .selectbox__arrow {
				min-width: 20px;
			}
.chat__actions .selectbox__arrow:not(:last-child) {
					margin-right: 80px;
				}
.chat__actions .selectbox__arrow-icon.icon-dropdown {
						font-size: 10px;
					}
.chat__actions .selectbox__head {
				padding: 0;
				background-color: transparent;
				border: none;
			}
.chat__actions .selectbox__list {
				min-width: 200px;
				left: 10px;
			}
.chat__actions .selectbox__item {
				font-size: 14px;
				line-height: 1.21;
				letter-spacing: 0.21px;
				color: #000;
				font-weight: 500;
				padding: 16px 16px;
			}
.chat__form {
		width: 100%;
		display: flex;
		align-items: flex-end;
		gap: 10px;
		text-align: left;
	}
/* Send. It was `padding: 12px 40px` with a 30px right margin, which put a
		   slab of a button beside the field and then held it 30px clear of the
		   card's own padding. It is sized to the field it sits next to now. */
.chat__form .button {
			flex: 0 0 auto;
			font-weight: 600;
			text-transform: none;
			padding: 10px 20px;
			margin: 0;
		}
.chat__form .field__input {
				flex: 1 1 auto;
				min-width: 0;
			}
.chat__status {
		display: inline-flex;
		align-items: center;
		font-size: 10px;
		line-height: 1.21;
		letter-spacing: 0;
		color: #6B6B6B;
		font-weight: normal;
	}
.chat__status-icon {
			border-radius: 100%;
			position: relative;
			display: inline-block;
			border: 2px solid;
			margin-right: 8px;
			width: 8px;
			height: 8px;
			margin-right: 8px;
		}
.chat__status-icon--active {
				background-color: var(--green);
				border-color: var(--green);
			}
.chat__status-icon--away {
				background-color: #FDCD02;
				border-color: #FDCD02;
			}
.chat__status-icon--dont {
				background-color: #FC0808;
				border-color: #FC0808;
			}
.chat__status-icon--invisible {
				background-color: transparent;
				border-color: #707070;
			}
.chat__container {
    display: flex;
    width: 100%;
    height: 100%;
  }
.chat__content {
    position: relative;
    width: 100%;
    height: 100%;
    padding-left: var(--r-gutter);
    max-width: 960px;
  }
.chat__content--limited {
      /*height: calc(100% - 70px);*/
    }
/* The generic composer bar, kept for the draggable chat widget, which pins
     its own `position: absolute; padding: 0 16px 16px` and a white background
     on top of this. The chat page's version is scoped below.

     The `:before` this used to carry is gone: an absolutely positioned 1px
     strip inset by 64px, so the rule stopped short of the card on both sides
     and read as a stray line floating above the input rather than as the edge
     of the composer. A `border-top` is the same line, always the full width of
     the thing it divides, and it moves when the padding does. (widget-chat.css
     still repositions that `:before`; with no `content` it draws nothing.) */
.chat__footer {
    position: absolute;
    bottom: 0;
    left: 0;
    width: calc(100% - 64px);
    background-color: var(--body-bg);
    padding: 32px;
  }
/* The chat page's composer, pinned to the bottom of its card. */
.chat__content .chat__footer {
  box-sizing: border-box;
  width: 100%;
  border-top: 1px solid var(--msg-divider);
  padding: 14px 20px 18px;
  border-radius: 0 0 var(--r-r-inner) var(--r-r-inner);
}
/* ---- The message stack ----
 *
 * `.dialog` is shared by three screens: the chat page, and the conference
 * panel's chat and speech sidebars. All three already mark up who sent what
 * (`--from` / `--to`), but only the conference panel ever styled the
 * difference — it carries a full set of overrides that give sent messages the
 * panel's navy and received ones its tint, with a 12px radius and one squared
 * corner on the sender's side.
 *
 * That treatment is not panel-specific, and the chat page was the screen that
 * needed it most: every bubble there was the same flat `--gray` in white text,
 * so a conversation gave no clue which half was yours. So the shape of it
 * lives HERE now, in the block all three share, and the panel keeps only what
 * is genuinely its own — its dark palette, and the 22px avatar a 400px column
 * needs. Those overrides are more specific than these rules, so they still
 * win where they exist.
 *
 * Gone with the rewrite: `&__status-icon` and `&__status--read`, a read-receipt
 * tick absolutely positioned into the bubble's bottom-right corner. No
 * template has ever rendered either class — the 32px of right padding every
 * bubble reserved for that glyph was the only trace of it left.
 */
.dialog {
  display: flex;
  flex-direction: column;
  padding: 4px 0 24px;
  overflow: auto;
  word-wrap: break-word;
}
/* Messages sit at the BOTTOM of the scrollport, the way every chat does: a
     short conversation should start above the composer, not leave a screen of
     white between the last message and the input. `margin-top: auto` on the
     first child eats the free space when there is any and resolves to 0 when
     there is not, so a long conversation still scrolls from the top normally.
     (`justify-content: flex-end` looks equivalent and is not — it pushes
     overflow past the top of the scrollport, where it cannot be scrolled to.) */
.dialog > *:first-child {
    margin-top: auto;
  }
.dialog__msg {
    position: relative;
    display: flex;
    flex-wrap: wrap;
  }
.dialog__msg:not(:last-child) {
      margin-bottom: 14px;
    }
/* Received, and sent. The near corner — the one beside the avatar — is the
       square one, so the bubble points back at whoever sent it. */
.dialog__msg--to .dialog__body {
          padding-left: 36px;
        }
.dialog__msg--to .dialog__text {
          background-color: var(--msg-bubble-in-bg);
          color: var(--msg-bubble-in-fg);
          border-radius: 4px 14px 14px 14px;
        }
.dialog__msg--to .dialog-img {
          margin-right: 8px;
        }
.dialog__msg--from .dialog__head {
          flex-direction: row-reverse;
        }
.dialog__msg--from .dialog-img {
          margin-left: 8px;
        }
.dialog__msg--from .dialog__body {
          padding-right: 36px;
        }
.dialog__msg--from .dialog__text {
          background-color: var(--msg-bubble-out-bg);
          color: var(--msg-bubble-out-fg);
          border-radius: 14px 4px 14px 14px;
        }
.dialog__msg--from .dialog__status {
          text-align: left;
        }
/* Sender line: avatar, name, time. 28px and an 8px gap, because at 32px over
     a 16px margin this line was taller than most of the messages under it. */
.dialog__head {
    width: 100%;
    display: flex;
    position: relative;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
    gap: 8px;
    min-height: 0;
    margin-bottom: 5px;
  }
.dialog-img {
    position: relative;
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    border-radius: 100%;
    overflow: hidden;
  }
.dialog-img img {
      width: 100%;
      height: 100%;
      position: absolute;
      left: 0;
      top: 0;
      object-fit: cover;
    }
.dialog-name {
    position: relative;
    max-width: calc(100% - 96px);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 600;
    font-size: 12px;
    line-height: 1.25;
    color: var(--msg-fg);
  }
/* A bubble is as wide as it needs to be, up to about three quarters of the
     column. Without a cap a one-line message ran the full width of the pane
     and the from/to alignment stopped being readable at all. */
.dialog__body {
    max-width: 76%;
  }
.dialog__text {
    position: relative;
    padding: 9px 13px;
    font-size: 14px;
    font-weight: normal;
    line-height: 1.55;
  }
.dialog__text p:not(:last-child) {
      margin-bottom: 4px;
    }
.dialog__text p span {
      display: block;
      word-break: break-word;
    }
/* The time a message was sent. No `margin-left: auto` here: this selector is
     `.dialog__status-text`, not `.dialog .dialog__status-text`, so it also
     reaches the conference sidebars — which override the type but not the
     margin, and would have had their timestamps yanked to the far edge of a
     400px panel. The alignment is scoped below instead. */
.dialog__status-text {
      flex: 0 0 auto;
      font-size: 11px;
      line-height: 1.2;
      color: var(--msg-fg-muted);
      font-weight: 500;
      font-variant-numeric: tabular-nums;
    }
/* Chat-page only — `.dialog` is the message stack's own class and the
   conference sidebars do not use it, they only reuse the `.dialog__*` parts.
   Anything here is a property those sidebars have their own answer for. */
/* Push the time to the end of the sender line, so a column of messages has a
     column of times rather than one trailing each name at a different offset. */
.dialog .dialog__status-text {
    margin-left: auto;
  }
.dialog .dialog-img {
    background-color: var(--msg-avatar-bg);
  }
.widget__contacts--list {
      display: flex;
      flex-direction: column;
      min-width: 150px;
      background-color: var(--body-bg);
      border-radius: 8px;
      max-width: 200px;
      overflow: auto;
      border: 1px solid var(--colour-brand);
    }
.widget__contacts--list .selectbox__item {
        padding: 16px 24px;
        font-weight: 500;
        font-size: 14px;
        border: 0;
        border-top: 1px solid var(--colour-brand);
        outline: none;
        background-color: var(--body-bg);
        color: var(--button-color);
      }
.widget__contacts--list .selectbox__item:first-child {
          border-top: 0;
        }
.widget__contacts--list .selectbox__item:hover {
          background-color: var(--button-bg-hover);
        }
.file-actions__menu.domain__dropdown--content {
  z-index: 11;
  max-height: 305px;
  max-width: 200px;
  overflow: auto;
  border: 1px solid var(--colour-brand);
  box-sizing: border-box;
}
/* A menu short enough to have nothing to scroll.
 *
 * The 305px cap above belongs to the classic row's menu, which really can run to a dozen entries. A
 * fusion row's holds at most seven, and at 52px a piece six of them come to 315px — ten over the cap, so
 * the shortest menu in the app was drawn with a scrollbar down the side of it. Uncapped it sizes to its
 * own content; `overflow: auto` stays, so nothing is lost if a longer one ever lands here. */
.file-actions__menu--fits.domain__dropdown--content {
  max-height: none;
}
.widget__chat {
		z-index: 1;
		position: absolute;
		right: 300px;
		min-width: 350px;
		min-height: 350px;
		width: 350px;
		height: 800px;
		display: flex;
		flex-wrap: wrap;
		flex-direction: column;
		justify-content: flex-end;
	}
.widget__chat .chat__wrap {
				padding: 20px;
				background-color: #F7F7F7;
				border: 1px solid #EDEDED;
				border-radius: 2px 2px 0px 0px;
				height: calc(100% - 248px);
			}
.widget__chat .chat__head {
				height: 80px;
				background-color: #4E4E4E;
				padding-left: 0;
				padding-right: 0;
				padding-bottom: 70px;
			}
/* position: absolute;
					top: -30px;
					left: 0;
					right: 0;
					margin: 0 auto;
					z-index: 1;
					width: 100%;
					max-width: calc(100% - 120px);
					flex-direction: column; */
.widget__chat .chat__head .user-img {
						width: 58px;
						height: 58px;
						border-color: #061F45;
						margin-right: 0;
						/* Made for group chat view */
						/* margin-bottom: 14px; */
					}
/* Made for group chat view */
.widget__chat .chat__head .user__info {
						text-align: left;
					}
.widget__chat .chat__head .user-name, .widget__chat .chat__head .user-dscr {
						color: #fff;
					}
.widget__chat .chat__head .user-dscr {
						font-size: 11px;
					}
.widget__chat .chat__head .chat__actions {
					position: absolute;
					right: 10px;
					top: 10px;
				}
.widget__chat .chat__head .chat__actions .button--chat-action {
						width: 8px;
						height: 8px;
						min-width: 8px;
						font-size: 8px;
						color: #fff;
					}
.widget__chat .chat__head .chat__actions .button--chat-action:not(:last-child) {
							margin-right: 20px;
						}
.widget__chat .chat__body {
				overflow: hidden;
				margin-top: -80px;
				padding: 16px 16px 75px 16px;
				max-height: 100%;
			}
.widget__chat .chat__footer {
				position: absolute;
				bottom: 0;
				left: 0;
				right: 0;
				padding: 0 16px 16px 16px;
				background-color: #fff;
				width: calc(100% - 32px);
			}
.widget__chat .chat__footer:before {
					top: -1px;
					width: calc(100% - 32px);
				}
.widget__chat .chat__form {
				display: flex;
				align-items: center;
				justify-content: space-between;
			}
.widget__chat .chat__form .field__input {
						border: none;
						/* Removed send button, from chat-popup component */
						/* max-width: calc(100% - 60px)!important; */
						padding-right: 7px;
					}
.widget__chat .chat__form .field__input::-webkit-input-placeholder { /* WebKit browsers */
						font-size: 12px;
					}
.widget__chat .chat__form .field__input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
						font-size: 12px;
					}
.widget__chat .chat__form .field__input::-moz-placeholder { /* Mozilla Firefox 19+ */
						font-size: 12px;
					}
.widget__chat .chat__form .button {
					margin-right: 0;
					font-weight: 500;
					min-width: 50px;
					width: 60px;
					height: 30px;
					line-height: 1;
					text-align: center;
					padding: 7px 0;
				}
.widget__chat .dialog {
			max-height: calc(100% - 20px);
			overflow: auto;
			padding-bottom: 0;
			border-color: #F2F2F2;
		}
.widget__chat .dialog-img {
				width: 18px;
				height: 18px;
			}
.widget__chat .dialog-name {
				font-size: 10px;
			}
.widget__chat .dialog__text {
				font-size: 10px;
				line-height: 18px;
			}
.widget__chat .dialog__msg:not(:last-child) {
					margin-bottom: 2px;
				}
.widget__chat .dialog__msg--to .dialog-img {
							margin-right: 8px;
						}
.widget__chat .dialog__msg--to .dialog__body {
							padding-left: 28px;
						}
.widget__chat .dialog__msg--from .dialog-img {
							margin-left: 8px;
						}
.widget__chat .dialog__msg--from .dialog__body {
							padding-right: 28px;
						}
.widget__chat--style-1 {
			min-width: 300px;
			width: 300px;
			height: 450px;
			display: block;
			bottom: 0;
		}
.widget__chat--style-1 .chat__head {
					padding-bottom: 29px;
				}
.widget__chat--style-1 .chat__head .user {
						/* Made for group chat view */
					}
/* top: -23px; */
.widget__chat--style-1 .chat__head .user-img {
							width: 46px;
							height: 46px;
							/* Made for group chat view */
							/* margin-bottom: 10px; */
							margin-right: 5px;
						}
.widget__chat--style-1 .chat__body {
					padding: 16px 16px 60px 16px;
					margin-top: -50px;
					max-height: calc(100% - 25px);
				}
.widget__chat--style-1 .chat__wrap {
					height: calc(100% - 165px);
				}
.widget__chat--style-1 .dialog__head {
					margin-bottom: 0px;
				}
.widget__chat--style-1 .dialog__msg--to .dialog__body {
						padding-left: 15px;
					}
.widget__chat--style-1 .dialog__msg--from .dialog__body {
						padding-right: 15px;
					}
.widget {
	z-index: 10;
}
.widget--chat {
		position: fixed;
		bottom: 0;
		right: 40px;
		width: auto;
		display: flex;
		align-items: flex-end;
		justify-content: flex-end;
		flex-direction: row;
	}
.widget--chat .button {
			right: 40px;
		}
.widget--chat.menu--open .button--chat {
					/* display: none; */
				}
.widget .menu-input::-webkit-input-placeholder { /* WebKit browsers */
			font-style: italic;
			color: #707070;
		}
.widget .menu-input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
			font-style: italic;
			color: #707070;
		}
.widget .menu-input::-moz-placeholder { /* Mozilla Firefox 19+ */
			font-style: italic;
			color: #707070;
		}
.mail__head {
    box-sizing: border-box;
		position: relative;
		display: flex;
		align-items: center;
		justify-content: space-between;
		flex-wrap: wrap;
		min-height: 48px;
		position: sticky;
		top: 0;
		background-color: var(--mail-head-bg);
    border-radius: var(--r-r-inner);
		z-index: 1;
	}
.mail__head > .mail__head {
			width: 100%;
			position: relative;
		}
/* The thread's own title bar. `background: none` because the outer
		   `.mail__head` already paints the tint; both painting it stacked one
		   pale blue on another and left a visible seam where they met. */
.mail__head--inbox {
			padding: 10px 14px;
			min-height: 10px;
			flex-wrap: nowrap;
      align-items: center;
      background: none;
      border-radius: 0;
		}
.mail__head--all {
			justify-content: flex-end;
			margin-bottom: 18px;
		}
.mail__head--button {
			justify-content: flex-end;
			padding-bottom: 5px;
		}
.mail__head--send {
			min-height: 68px;
		}
.mail__body {
		position: relative;
	}
.mail__body__head--inbox {
				display: flex;
				width: 100%;
				justify-content: space-between;
        align-items: center;
				flex-wrap: wrap;
			}
.mail__body__head--inbox .user {
					width: auto;
				}
.mail__body .user {
			width: 100%;
			align-items: flex-end;
		}
.mail__body .user-img {
				border-width: 0.5px;
			}
.mail__body .user__info {
				max-width: calc(100% - 66px);
			}
.mail__body .user-name {
				/* color: #000; */
				margin-bottom: 8px;
			}
/* The reply / reply-all / forward row at the foot of an expanded message,
	   and Revoke pushed to the right. It was indented 30px from the card's own
	   padding for no reason the card explains, so the controls sat adrift of
	   the message they act on. */
.mail__footer {
		position: relative;
		width: auto;
		display: flex;
		align-items: center;
		justify-content: flex-start;
		flex-wrap: wrap;
	}
.mail__footer--inbox {
			padding-left: 0;
			padding-top: 10px;
			margin-top: 4px;
			border-top: 1px solid var(--msg-divider);
		}
.mail__footer--inbox .button {
				margin: 0;
				text-transform: none;
				font-weight: 600;
			}
.mail__branches {
		position: relative;
		width: 100%;
	}
.mail__branches--items {
			display: block;
		}
/* One message in a thread. The border was `--colour-bg-brand-subtle` —
		   the same pale blue the page uses as a fill — so the card had no edge
		   worth seeing and a thread read as unseparated blocks of text. A
		   neutral hairline plus the refresh shadow gives it one. */
.mail__branches--item {
			width: auto;
      padding: 14px 16px;
      border: 1px solid var(--msg-edge);
      background-color: var(--body-bg);
      border-radius: var(--r-r-inner);
      box-shadow: var(--r-shadow);
		}
.mail__branches--item:not(:last-child) {
				margin-bottom: 10px;
			}
.mail__branches .mail__attach, .mail__branches .mail__footer {
				padding-left: 0;
			}
.mail__branch {
		position: relative;
		width: 100%;
	}
.mail__item {
		display: flex;
		flex-wrap: wrap;
		width: auto;
	}
.mail__item--all {
			align-items: center;
			padding: 17px 34px;
			background-color: var(--colour-bg-default);
			border: solid 1px var(--msg-edge);
			border-radius: var(--border-radius-sm);
		}
.mail__item--all:not(:last-child) {
				margin-bottom: 4px;
			}
.mail__item--all .user {
				max-width: calc(100% - 120px);
			}
.mail__item--all .user__info {
					max-width: calc(100% - 66px);
				}
.mail__item--all .user-name {
					color: #000;
					margin-bottom: 8px;
				}
.mail__item--all .mail-date {
					width: 100px;
				}
.mail__body__head--inbox .user {
					max-width: calc(100% - 200px);
				}
.mail-title {
		position: relative;
		width: 100%;
		padding-right: 15px;
		font-size: 15px;
		line-height: 1.35;
		font-weight: 600;
		color: var(--msg-fg);
	}
.mail-hub {

  }
/* The message itself. Capped at 74 characters rather than running the full
	   940px of the pane: a line that long makes the eye lose its place coming
	   back to the left edge, and a handover note is the kind of message people
	   actually read to the end. */
.mail__text {
		position: relative;
		width: 100%;
		max-width: 74ch;
		font-size: 14px;
		line-height: 1.6;
		font-weight: normal;
		margin: 4px 0 0;
		padding: 12px 0;
		border-top: 1px solid var(--msg-divider);
		overflow: auto;
	}
.mail__text ul, .mail__text ol {
			padding-left: 20px;
		}
.mail-date {
		display: flex;
		flex: 1 0 100px;
		align-items: center;
		justify-content: flex-end;
		font-size: 12px;
		line-height: 1.17;
		color: var(--msg-fg-muted);
		font-weight: 500;
		font-variant-numeric: tabular-nums;
	}
.mail-message {
		display: flex;
    flex: 1 0 100px;
    align-items: center;
    justify-content: flex-start;
    font-size: 13px;
    line-height: 1.17;
    color: var(--msg-fg-muted);
    font-weight: 400;
		margin-top: 0;
	}
.mail__actions {
		position: relative;
		display: flex;
		justify-content: flex-end;
	}
.mail__actions--send {
			justify-content: space-between;
			align-items: flex-start;
			padding: 12px;
			flex-shrink: 0;
		}
.mail__form {
		position: relative;
		width: 100%;
    border: solid 1px var(--colour-bg-brand-subtle);
    border-radius: var(--border-radius-default);
    box-sizing: border-box;
	}
.mail__wrap {
		position: relative;
		width: auto;
		padding: 10px 12px;
		border-radius: 2px;
		font-size: 13px;
	}
.mail__wrap input {
			font-size: 13px;
			color: var(--body-color);
		}
.mail__files {
		display: flex;
/*		position: relative;
		flex: 1 0 250px;*/
	}
.mail__file {
		position: relative;
		display: inline-flex;
		width: 20px;
		/*height: 50px;*/
		align-items: center;
		align-content: center;
		justify-content: center;
		margin: 8px 8px;
    border: 0;
    background: none;
	}
.mail__file label {
			cursor: pointer;
		}
.mail__file input {
			display: none;
		}
.mail__buttons {
		/*width: 100%;*/
		position: relative;
		display: flex;
		align-items: center;
		justify-content: flex-end;
		flex-wrap: wrap;
	}
.mail__buttons .button {
			/*font-weight: 500;*/
			margin: 8px;
			text-transform: none;
		}
.mail__types {
		width: 100%;
		position: relative;
		display: flex;
		justify-content: flex-end;
		flex: 1 0 auto;
	}
.mail__fields {
		position: relative;
		width: 100%;
	}
.mail .field__input {
			padding: 8px 0;
			border-radius: 0;
			border: none;
			border-bottom: 1px solid #707070;
			background-color: transparent;
			width: 100%;
			position: relative;
			font-weight: 500;
			font-size: 13px;
			line-height: 1.13;
			margin-top: 0;
		}
.mail .field__input--textarea {
				/* min-height: 200px; */
				padding: 10px 14px;
				font-size: 12px;
				color: var(--body-color);
				background-color: var(--body-bg);
				border-radius: 4px;
				border: 1px solid #c7c7c7;
			}
.mail .field__input--subject {
				padding: 16px 0;
			}
.mail .field__input::-webkit-input-placeholder { /* WebKit browsers */
			color: #b7b7b7;
			font-size: 12px;
			line-height: 1.13;
			font-weight: normal;
			font-style: italic;
		}
.mail .field__input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
			color: #b7b7b7;
			font-size: 12px;
			line-height: 1.13;
			font-weight: normal;
			font-style: italic;
		}
.mail .field__input::-moz-placeholder { /* Mozilla Firefox 19+ */
			color: #b7b7b7;
			font-size: 12px;
			line-height: 1.13;
			font-weight: normal;
			font-style: italic;
		}
.mail__container {
		display: flex;
		width: 100%;
		height: calc(100% - 48px);
	}
.mail__content {
		position: relative;
		width: 100%;
		padding-left: var(--r-gutter);
		margin-top: -41px;
    overflow: auto;
	}
.mail--wrap {
		max-width: 940px;
		position: relative;
	}
/* The reading pane with nothing selected, and the same box the "no messages
	   yet" copy uses. It was 18px with `letter-spacing: 0.9px` — tracking that
	   wide on body copy at that size is what dated it, and it was applied to a
	   whole paragraph rather than a heading. Two tiers now, no tracking, and a
	   measure narrow enough to read. */
.mail__info {
		max-width: 420px;
		width: 100%;
		position: relative;
		text-align: center;
		flex-direction: column;
		align-items: center;
		justify-content: center;
		margin: 96px auto;
	}
.mail__info-icon {
			display: block;
			margin: 0 auto 18px;
			fill: var(--msg-icon-faint);
		}
.mail__info-title {
			font-size: 16px;
			font-weight: 600;
			line-height: 1.4;
			color: var(--msg-fg);
			margin-bottom: 8px;
			position: relative;
		}
.mail__info-subtitle {
			font-size: 13px;
			font-weight: normal;
			line-height: 1.55;
			color: var(--msg-fg-muted);
			position: relative;
		}
.mail__tabs {
		max-width: 1250px;
    position: relative;
		justify-content: space-between;
	}
.mail__tabs .mail__head--button {
			padding-bottom: 0;
			background: none;
		}
.mail--empty {
		display: flex;
		align-items: center;
		justify-content: center;
	}
.mail--empty .mail__info {
			display: flex;
			text-align: center;
		}
.mail--empty .mail__head, .mail--empty .mail__body, .mail--empty .mail__footer {
			display: none;
		}
/* The conversation list column, on both the mail and the chat screens.
 *
 * Scoped to `.container--mail` rather than changed on `.menu--users` itself,
 * because `.menu` is shared with the settings and search sidebars and they are
 * sized for their own content.
 *
 * 300px rather than 250px: at 250px a subject clipped at about thirty
 * characters, which on the mail list meant every row ended in an ellipsis and
 * none of them said what the message was about. The rule on the right edge is
 * what makes it a column at all — the list and the reading pane had no
 * boundary between them, so the rows read as text loose on the page. */
.container--mail .menu--users {
	box-sizing: border-box;
	flex: 1 0 300px;
	max-width: 300px;
	padding-right: 16px;
	border-right: 1px solid var(--msg-divider);
}
.tabs {
  display: flex;
  align-items: center;
}
.tabs--small .tabs__item {
      padding: 9px 20px;
    }
.tabs--small .tabs__item-title {
        font-size: 14px;
      }
.tabs--small .tabs__item-subtitle {
        font-size: 11px;
      }
.tabs--vertical .tabs__items {
        flex-direction: column;
        flex-wrap: wrap;
      }
.tabs--vertical .tabs__item {
        border-bottom: 0.5px solid #4e4e4e;
      }
.tabs--vertical .tabs__item:after {
          display: none;
        }
.tabs__items {
    display: flex;
    align-items: center;
  }
.tabs__items--mail .tabs__item {
          padding: 10px 0;
          width: 110px;
          font-size: 13px;
          line-height: 1.14;
          font-weight: normal;
          letter-spacing: 0.34px;
          text-transform: uppercase;
        }
/* color: #707070; */
.tabs__items--mail .tabs__item--active {
            font-weight: 700;
            color: #fff;
          }
.tabs__items--users {
      width: 100%;
    }
.tabs__items--users .tabs__item {
          cursor: pointer;
          position: relative;
          padding: 0px 16px;
          height: 50px;
          display: flex;
          align-items: center;
          align-content: center;
          justify-content: flex-start;
          font-weight: 700;
          font-size: 10px;
          /*color: #707070;*/
          text-transform: uppercase;
          width: calc(100% - 32px);
        }
.tabs__items--users .tabs__item:after {
            display: none;
          }
.tabs__items--users .tabs__item:hover {
            background-color: var(--gray);
            color: var(--white);
          }
.tabs__items--users .tabs__item:hover .user__info {
              color: var(--white);
            }
.tabs__items--users .tabs__item:hover .user-name, .tabs__items--users .tabs__item:hover .user-dscr {
                color: #fff;
              }
.tabs__items--users .tabs__item:hover .chat__status {
              color: #6B6B6B;
            }
.tabs__items--users .tabs__item:hover .chat__status .chat__status-dscr {
                color: #6B6B6B;
              }
.tabs__items--users .tabs__item--active {
            color: #fff;
            background-color: #4e4e4e;
            border-radius: 0;
          }
.tabs__items--users .tabs__item--active:hover {
              background-color: #4e4e4e;
            }
.tabs__items--users .tabs__item--active .user-img {
                border-color: #f3f3f9;
              }
.tabs__items--users .tabs__item--active .user-name, .tabs__items--users .tabs__item--active .user-dscr {
                color: #fff;
              }
.tabs__items--users .tabs__item--active:hover {
              opacity: 1;
            }
.tabs__items--users .user-img {
          width: 31px!important;
          height: 31px!important;
          margin-right: 16px;
        }
.tabs__items--users .user-name {
          font-size: 15px;
          margin-bottom: 3px;
        }
.tabs__items--users .user-dscr {
          font-size: 11px;
        }
.tabs__items--account .tabs__item {
          padding: 5px 15px;
          /* color: #4e4e4e; */
        }
.tabs__items--setting .tabs__item {
        width: calc(100% - 28px);
        /* color: #000; */
        text-align: left;
        /*padding: 12px 14px 12px 28px;*/
        padding: 0 14px 0 14px;
        height: 50px;
        display: flex;
        align-items: center;
        align-content: center;
        justify-content: flex-start;
        flex-wrap: wrap;
        text-decoration: none;
      }
.tabs__items--setting .tabs__item--active {
          background-color: var(--gray);
          /*color: #000!important;*/
        }
.tabs__items--setting .tabs__item:hover {
           background-color: var(--gray);
           color: var(--white);
        }
.tabs__items--setting .tabs__item-title {
          font-size: 15px;
        }
.tabs__items--setting .tabs__item-subtitle {
          font-size: 11px;
        }
.tabs__items--search .tabs__item {
        width: calc(100% - 56px);
        /* color: #000; */
        text-align: left;
        padding: 18px 28px 18px 28px;
        text-decoration: none;
      }
.tabs__items--search .tabs__item--active {
          background-color: var(--gray);
          /*color: #000!important;*/
        }
.tabs__items--search .tabs__item:hover {
           background-color: var(--gray);
           color: var(--white);
        }
.tabs__items--search .tabs__item:last-child {
          border-bottom: none;
        }
.tabs__item {
    cursor: pointer;
    position: relative;
    padding: 16px 20px;
    font-weight: 700;
    font-size: 14px;
    color: var(--body-color);
    text-align: center;
    text-transform: uppercase;
  }
@media (max-width: 1280px) {
.tabs__item {
      padding: 12px;
      font-size: 13px
  }
    }
.tabs__item-title {
      font-size: 15px;
      line-height: 1.21;
      font-weight: 500;
      margin-bottom: 2px;
      letter-spacing: 0.34px;
      text-transform: none;
      position: relative;
      width: 100%;
    }
.tabs__item-subtitle {
      font-size: 11px;
      line-height: 9px;
      font-weight: 400;
      letter-spacing: 0;
      text-transform: none;
    }
.tabs__item:hover {
      opacity: 0.8;
    }
.tabs__item.contact__preview--item .ember-basic-dropdown {
        width: 100%;
      }
.tabs__item.contact__preview--item:hover {
        opacity: inherit;
      }
.tabs__item + .tabs__item:after {
        position: absolute;
        top: calc(50% - 8px);
        left: -2px;
        content: '';
        width: 2px;
        height: 16px;
        background-color: #4e4e4e;
      }
.tabs__item--preactive:after { background-color: transparent; }
.tabs__item--active {
      color: #fff!important;
      background-color: #4e4e4e;
      border-radius: 4px 4px 0 0;
    }
.tabs__item--active:after {
        opacity: 0;
      }
.tabs__item--active:hover {
        opacity: 1;
      }
.checkbox {
  cursor: pointer;
  position: relative;
}
.checkbox--big {
    display: block;
    width: 30px;
    height: 30px;
    padding: 1px;
    border: 1px solid transparent;
    border-radius: 50%;
  }
.checkbox--big .checkbox__custom {
      width: 28px;
      height: 28px;
    }
.checkbox--big .checkbox__input:checked {
        background-color: #4e4e4e;
      }
.checkbox--big .checkbox__input:checked + .checkbox__custom:after {
          font-size: 22px;
        }
.checkbox--is-active {
    border-color: var(--black);
  }
.checkbox--style-1 {
    padding: 0;
    width: 46px;
    height: 46px;
  }
.checkbox--style-1 .checkbox__input {
      cursor: pointer;
      opacity: 0;
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
    }
.checkbox--style-1 .checkbox__input:checked + .checkbox__custom {
          background-color: #4E4E4E;
        }
.checkbox--style-1 .checkbox__input:checked + .checkbox__custom:after {
            /*font-size: 17px;*/
          }
.checkbox--style-1 .checkbox__input:checked + .checkbox__custom:after {
          font-family: 'IcoMoon';
          color: #fff;
        }
.checkbox--style-1 .checkbox__custom {
      width: 100%;
      height: 100%;
    }
.checkbox--style-1 .checkbox__custom:after {
        font-family: 'IcoMoon';
        content: "\e91a";
        color: #dbd5d5;
      }
.checkbox--icon-vault .checkbox__input:checked + .checkbox__custom:after {
          content: '\e903';
        }
.checkbox--icon-sign .checkbox__input:checked + .checkbox__custom:after {
          content: '\e902';
        }
.checkbox--icon-chat .checkbox__input:checked + .checkbox__custom:after {
          content: '\e900';
        }
.checkbox--icon-mail .checkbox__input:checked + .checkbox__custom:after {
          content: '\e901';
        }
.checkbox__input {
    cursor: pointer;
    opacity: 0 !important;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
.checkbox__input:checked + .checkbox__custom {
        background-color: var(--checkbox-checked-bg);
        border-color: var(--checkbox-checked-bg);
      }
.checkbox__input:checked + .checkbox__custom:after {
        font-family: 'IcoMoon';
        content: '\e904';
        color: var(--checkbox-tick);
      }
/* The input is transparent and sits over the box, so a keyboard focus ring
       on it is invisible — the box has to wear it. Without this there was no
       way to see which row the keyboard was on. */
.checkbox__input:focus-visible + .checkbox__custom {
      outline: 2px solid var(--colour-brand);
      outline-offset: 2px;
    }
.checkbox__input:hover + .checkbox__custom {
      border-color: var(--checkbox-border-hover);
    }
.checkbox__custom {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    border: 1.5px solid var(--checkbox-border);
    /* A rounded square, not a circle: in a list where several rows can be
       picked at once, a circle reads as single-select. */
    border-radius: 5px;
    background-color: var(--checkbox-bg);
    transition: background-color 0.12s ease, border-color 0.12s ease;
  }
/* The two modifiers that were deliberately round keep their shape. */
.checkbox--big .checkbox__custom,
  .checkbox--style-1 .checkbox__custom {
    border-radius: 50%;
  }
.checkbox-set {
  display: flex;
}
@media (max-width: 900px) {
.checkbox-set {
    justify-content: space-between
}
  }
.checkbox-set__item {
    display: inline-block;
    max-width: 60px;
    margin-left: 60px;
    text-align: center;

  }
@media (max-width: 900px) {
.checkbox-set__item {
      margin-left: 0

  }
    }
.checkbox-set__item:first-child { margin-left: 0; }
.checkbox-set__item--disabled {
      opacity: 0.5;
    }
.checkbox-set__dscr {
    margin-top: 8px;
    font-size: 10px;
    color: #000000;
  }
.checkbox-set .checkbox { margin: 0 auto; }
/* One box, and a tick state that lives on a SIBLING of the input rather than on
   the input itself — which is why a rule written against `:checked` alone never
   applied. */
.checkbox__custom,
.checkbox-input {
  border: 1px solid var(--r-ctl);
  border-radius: 5px;
}
.checkbox__input:checked + .checkbox__custom,
.checkbox__input:checked ~ .checkbox__custom {
  border-color: var(--r-brand);
  background: var(--r-brand);
}
.checkbox__input:focus-visible ~ .checkbox__custom {
  box-shadow: var(--r-focus);
}
.user-info {
  display: flex;
  align-items: center;
}
.user-info__img {
    flex-shrink: 0;
    /* 28px, shared with `.user-card__img`. Two initials do not need a
       32px ground to read, and the smaller square sits better against the
       single line of text beside it. Dialogs keep their own 26px. */
    width: 28px;
    height: 28px;
    max-width: 48px;
    max-height: 48px;
    margin-right: 10px;
    /* A squircle, not a circle. The avatar is usually two initials on the brand
       tint rather than a face, and a circle crops the corners of a photo harder
       than it needs to for the sake of a shape that suits neither. No ring
       either: it was there to separate a photo from the page, and a tinted
       ground does that on its own. */
    border: 0;
    border-radius: 30%;
    overflow: hidden;
  }
@media (max-width: 900px) {
.user-info__img {
      display: none
  }
    }
.user-info__img img {
      display: block;
      width: 100%;
      height: 100%;
      /* Non-square photos were being letterboxed by max-width alone. */
      object-fit: cover;
    }
.user-info__content { line-height: 1.2; }
.user-info__name {
    font-size: 16px;
  }
/* color: #000; */
@media (max-width: 1920px) {
.user-info__name {
      font-size: 15px
  }
    }
.user-info__name--150 {
      max-width: 150px;
    }
.user-info__name--175 {
      max-width: 175px;
    }
.user-info__name--240 {
      max-width: 210px;
    }
.user-info__dscr {
    font-size: 12px;
    color: var(--secondary-font);
  }
@media (max-width: 1920px) {
.user-info__dscr {
      font-size: 11px
  }
    }
/* Name (or address, for someone who has no name yet) with whatever qualifies
   it sitting alongside — today that is the "New" badge on a recipient who is
   not in this Hub yet. The badge was previously stacked above the user-type
   select in a block of its own, which read as a stray coloured box rather than
   as something belonging to the address above it.

   `min-width: 0` on the text so it keeps ellipsising: the badge is `flex: none`
   and takes its width first, and the name gives. */
.user-info__ident {
  display: flex;
  align-items: baseline;
  gap: 6px;
  min-width: 0;
}
.user-info__ident .user-info__name {
  min-width: 0;
}
.user-info__new {
  flex: none;
  font-size: 10.5px;
  padding: 1px 6px;
}
/* The one-line-versus-stacked arrangement for a new recipient lives in
   _blocks/modal, next to `.modal .user-info__content` — that rule sets
   `flex-direction: column` at the same weight, so a rule here loses to it. */
/* Sizing for the phone row only. On a desktop this control is `width: auto`
   with a 104px floor, so it already fits its longest option and already sits
   comfortably beside the permission select — none of the below is needed
   there, and applying it anyway would shorten a desktop control by 4px for a
   reason that does not exist on a desktop. */
@media only screen and (max-device-width: 640px) {
  /* On a phone there is no such room: 128px of select plus an address plus a
     badge does not fit beside a 122px permission select, so it goes back under
     them. The badge reaches the full height of its line, so without the margin
     it would sit directly on the control. */
  .user-info__ident + .permissions__block {
    margin-top: 6px;
  }

  /* A second, subordinate control on a row that already has one: the permission
     select to its right is the decision, this only says what kind of account is
     being created. Smaller, so the row does not read as two equals. */
  .permissions__block .permissions__head--new {
    min-height: 28px;
    padding: 3px 9px;
    /* "External member" is the longest of the two options and measures 89px at
       this size; with the 18px of padding, the 8px caret and the gap before it
       the control needs 128px to hold it on one line. It was inheriting the
       permission select's 122px and falling three pixels short — the one width
       at which a label wraps for no visible reason. The row can spare it:
       there is 168px on this line. */
    width: 128px;
  }
}
/* One of the app's several badge shapes, used by the conference dialogs. It
   was a 10px capitalised white-on-#d50505 square; it joins the `.label` family
   here in shape, and its numbered colours map onto the refresh status pairs
   below so a "colour-1" tag reads as critical rather than as raw red. */
.tag {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  gap: var(--spacer-1);
  padding: 3px 9px;
  font-size: 11.5px;
  line-height: 16px;
  letter-spacing: 0;
  text-transform: none;
  white-space: normal;
  border: 1px solid transparent;
  border-radius: var(--r-r-pill);
  font-weight: 600;
}
.tag--icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
.tag--icon svg {
      margin-right: 3px;
    }
@media only screen and (max-device-width: 640px) {
      .tag--icon svg {
        margin-right: 0;
      }
    }
.tag--color-1 {
    background-color: #d50505;
  }
.tag--color-2 {
    background-color: var(--blue-links);
  }
.tag--color-3 {
    background-color: var(--orange);
  }
.tag--color-4 {
    background-color: var(--blue-medium);
  }
.tag--color-5 {
    background-color: var(--green);
  }
.tag--color-6 {
    background-color: var(--grey-light);
  }
.tag--color-7 {
    background-color: #cf0519;
  }
.tag--color-8 {
    background-color: #5ac1ee;
  }
.tag--color-9 {
    background-color: #f23e3e;
  }
.tag--color-10 {
    background-color: #333333;
  }
.tag--color-11 {
    background-color: var(--purple);
  }
/* The numbered colours, mapped onto the semantic pairs. Nine arbitrary hues
   became four meanings; each pair has a foreground picked to be legible on its
   own background, which the raw fills did not. */
.tag--color-1,
.tag--color-7,
.tag--color-9 { background-color: var(--r-crit-bg); color: var(--r-crit-fg); }
.tag--color-5 { background-color: var(--r-ok-bg); color: var(--r-ok-fg); }
.tag--color-3 { background-color: var(--r-warn-bg); color: var(--r-warn-fg); }
.tag--color-2,
.tag--color-4,
.tag--color-8 { background-color: var(--r-tint-2); color: var(--r-brand); }
.tag--color-6 { background-color: var(--r-fill); color: var(--r-grey); }
.tag svg,
.label svg,
.filename__tag svg { width: 13px; height: 13px; }
/* The Permission column's tag, on the fusion listing.
 *
 * Shaped after `.vltheader__kind` — the "Fusion" mark in the hub dropdown — rather than after `.tag` above,
 * and the metrics below are that rule's, copied on purpose: both are a small capsule naming a KIND beside a
 * name in a row, the reader meets them within a few inches of each other, and two capsules of different
 * sizes in one header would read as two different kinds of thing. It takes `.tag`'s pill shape and weight
 * and overrides the size.
 *
 * What it does not take from `.vltheader__kind` is the one fixed colour. That badge answers yes-or-no — a
 * hub is Fusion or it is not — so one tint says it. This answers "how much", across seven seeded levels, so
 * the tint carries the answer: `--r-step-*`, in the order the role ids run. Five of those steps are a red
 * to green ramp; Manager and Full permissions leave it for blue and purple, because they are the levels
 * that can reshare and delete and that is a difference in kind, not in degree — `refresh.css` has the
 * reasoning. The word is still there and still the authority; the colour is what makes a column of them
 * scannable without it. */
.tag--perm {
  flex: none;
  display: inline-block;
  max-width: 100%;
  padding: 1px 7px;
  border: 0;
  border-radius: var(--r-r-pill, 999px);
  font-size: 10.5px;
  font-weight: 600;
  line-height: 15px;
  letter-spacing: 0.01em;

  /* The cell is narrow and a compound label is long ("Manager + Download + Upload"), so the capsule
     ellipsises inside its own width rather than pushing the column or wrapping to two lines. The full
     wording stays reachable on the `title` the template sets. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: middle;
}
.tag--perm-1 { background-color: var(--r-step-1-bg); color: var(--r-step-1-fg); }
.tag--perm-2 { background-color: var(--r-step-2-bg); color: var(--r-step-2-fg); }
.tag--perm-3 { background-color: var(--r-step-3-bg); color: var(--r-step-3-fg); }
.tag--perm-4 { background-color: var(--r-step-4-bg); color: var(--r-step-4-fg); }
.tag--perm-5 { background-color: var(--r-step-5-bg); color: var(--r-step-5-fg); }
.tag--perm-6 { background-color: var(--r-step-6-bg); color: var(--r-step-6-fg); }
.tag--perm-7 { background-color: var(--r-step-7-bg); color: var(--r-step-7-fg); }
/* The part of a cell a search actually matched.
 *
 * The register is searched by substring — "123" finds ABC-123-REV2 — so a result list is a screen of rows
 * that each matched somewhere inside a long identifier, and without this the reader has to find the match
 * themselves in every one. Outlook's treatment, because it is the one people already know: a yellow wash
 * behind the characters, the text itself unchanged.
 *
 * The palette's warning tint rather than a hue of its own: it is the only yellow here, it carries the
 * contrast ratio the rest of the design system was checked at, and it follows the theme. `color: inherit`
 * so the cell keeps its own colour — a mark that recoloured the text would make a matched row read as a
 * different KIND of row, which is exactly what it is not. The browser's default `<mark>` is black on a
 * fixed yellow and is unreadable in dark mode. */
mark.term-match {
  padding: 0 1px;
  border-radius: 2px;
  background-color: var(--r-warn-bg);
  color: inherit;
  font-weight: 600;
}
.filename {
  display: flex;
  align-items: center;
  max-width: 600px;
}
@media (max-width: 1400px) {
.filename {
    max-width: 450px
}
  }
@media (max-width: 900px) {
.filename {
    max-width: 400px
}
  }
@media only screen and (max-device-width: 640px) {
.filename {
    max-width: 260px
}
  }
.filename__icon {
    flex-shrink: 0;
    margin-right: 15px;
    height: auto;
  }
@media (max-width: 900px) {
.filename__icon {
      margin-right: 10px
  }
    }
@media only screen and (max-device-width: 640px) {
.filename__icon {
      width: 26px
  }
    }
.filename__dscr {
    word-break: break-word;
    font-weight: 500;
    font-size: 15px;
    line-height: 1.2;
  }
@media (max-width: 900px) {
.filename__dscr {
      margin-top: 5px
      /*font-size: 14px;*/
  }
    }
.valut-table .tag.filename__tag {
    margin-top: 6px;
  }
/* The protective-marking classification tag. It needs both classes to match —
   `.filename__tag` alone is never styled — which is why an earlier attempt at
   this rule silently did nothing. */
.filename__tag.tag {
  background-color: var(--r-tint-2);
  color: #1a4f9c;
}
.button-dots {
  outline: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 18px;
  color: #000;
  border-radius: 4px;
}
@media (max-width: 900px) {
.button-dots {
    width: 34px;
    height: 14px
}
  }
.button {
  min-width: 110px;
  outline: none;
  /* The base sets NO border on purpose — the variants below draw their own, and
     a border here outranks them. See the note above the refresh section. */
  border: 0;
  padding: 8px 14px;
  text-align: center;
  /* Was `capitalize`, which re-cased the label the template asked for: "Request
     Signature" and "request signature" rendered identically, so the copy could
     not be trusted to say what appears on screen. */
  text-transform: none;
  border-radius: var(--r-r-ctl);
  text-decoration: none;
  cursor: pointer;
  font-size: 12.5px;
  font-weight: 600;
}
.button--small {
    font-size: 9px;
    padding: 12px 15px;
    color: #fff;
    background-color: #4e4e4e;
  }
.button--style-1,
  .button--style-2,
  .button--style-3,
  .button--style-4,
  .button--style-5,
  .button--style-6,
  .button--style-7,
  .button--style-10,
  .button--style-11 {
    font-size: 15px;
    line-height: 1.1;
    padding: 7px 11px;
  }
.button--style-1:hover, .button--style-2:hover, .button--style-3:hover, .button--style-4:hover, .button--style-5:hover, .button--style-6:hover, .button--style-7:hover, .button--style-10:hover, .button--style-11:hover {
      box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
    }
.button--style-3 {
    background-color: transparent;
    border: 1px solid #4e4e4e;
    color: #0f1a34;
    transition: color 0.25s ease-in-out, background-color 0.25s ease-in-out;
  }
.button--style-3--active, .button--style-3:hover {
      background-color: #4e4e4e;
      color: #fff;
    }
.button--style-5, .button--style-6, .button--style-10 {
    position: relative;
    display: inline-flex;
    align-items: center;
    align-content: center;
    justify-content: center;
    border-radius: 4px;
    background-color: transparent;
    font-weight: 700;
    color: var(--white);
  }
.button--style-1 {
    color: var(--white);
    font-weight: 500;
    background-color: var(--black);
  }
.button--style-2 {
    color: #fff;
    background-color: #4e4e4e;
    border-color: #4e4e4e;
  }
.button--style-4 {
    border: 1px solid var(--gray);
    background-color: var(--gray);
    color: #0F1A34;
  }
.button--style-5 {
    background-color: var(--colour-brand);
  }
.button--style-6 {
    background-color: var(--black);
  }
.button--style-7 {
    background-color: var(--button-bg);
    color: var(--button-color);
    border: 1px solid #ea5d32;
  }
.button--style-8 {
    padding: 10px;
    font-size: 10px;
    font-weight: 500;
    color: #4e4e4e;
    border: 2px solid #4e4e4e;
    background-color: transparent;
    transition: ease 0.15s all;
  }
.button--style-8:hover {
      color: #fff;
      background-color: #4e4e4e;
    }
.button--style-9 {
    padding: 11px 15px;
    color: #fff;
    background-color: #4e4e4e;
    border-color: #4e4e4e;
  }
.button--style-10 {
    background-color: var(--office365);
  }
.button--style-11 {
    background-color: var(--solitude);
  }
.button--close-circle {
    padding: 10px;
    font-size: 10px;
    font-weight: 500;
    color: #4e4e4e;
    border: 2px solid #4e4e4e;
    background-color: transparent;
    transition: ease 0.15s all;

  }
.button--close-circle:hover {
      color: #fff;
      background-color: #4e4e4e;
    }
.button--close-circle .button__icon {
      display: none;
    }
@media (max-width: 900px) {
.button--close-circle {
      min-width: unset;
      padding: 4px;
      font-size: 14px;
      line-height: 0;
      font-weight: 500;
      color: #000;
      background-color: transparent;
      border: 2px solid #000;
      border-radius: 50%;
      transition: ease 0.15s all

  }

      .button--close-circle:hover {
        color: #fff;
        background-color: #000;
      }

      .button--close-circle .button__text {display: none; }

      .button--close-circle .button__icon { display: block; }
    }
.button--mail-type {
    background-color: transparent;
    position: relative;
    display: inline-block;
    width: auto;
    border: none;
    padding: 0;
    font-size: 13px;
    line-height: 1.19;
    font-weight: 500;
    color: #4e4e4e;
    min-width: 10px;
  }
.button--mail-type:not(:last-child) {
      margin-right: 11px;
    }
.button--chat {
    display: flex;
    align-items: center;
    justify-content: center;
    position: fixed;
    padding: 7px 15px;
    color: #fff;
    background-color: #4e4e4e;
    border-radius: 4px 4px 0 0;
    text-align: center;
    width: 175px;
    right: 80px;
    bottom: 0;
    z-index: 10;
    letter-spacing: 0.38px;
    font-size: 13px;
    height: 45px;
  }
.button--chat i {
      font-size: 30px;
      margin-right: 10px;
    }
.button--chat i:before {
        color: #fff;
      }
.button--mail-action, .button--chat-action {
    width: 20px;
    height: 20px;
    background-color: transparent;
    border: none;
    padding: 0;
    cursor: pointer;
    display: flex;
    align-items: center;
    align-content: center;
    justify-content: center;
    transition: opacity 0.25s ease-in-out;
  }
.button--mail-action.menu__trigger, .button--chat-action.menu__trigger {
      border-radius: 4px;
      border: 2px solid #707070;
    }
.button--mail-action .icon, .button--chat-action .icon {
      position: relative;
      font-size: 20px;
    }
.button--mail-action .icon.icon-star:before, .button--chat-action .icon.icon-star:before {
            color: #f2cb78;
          }
.button--mail-action .icon.icon-dots, .button--chat-action .icon.icon-dots {
          font-size: 75%;
        }
.button--mail-action:not(:last-child), .button--chat-action:not(:last-child) {
      margin-right: 48px;
    }
.button--mail-action:hover, .button--chat-action:hover {
      opacity: 0.8;
    }
.button-remove {
    width: 29px;
    height: 29px;
    font-size: 20px;
    color: #707070;
    padding: 0;
    background-color: transparent;
    border: none;
    position: relative;
    right: 0;
    top: 0;
    z-index: 1;
  }
.button--colour, .button--link-action {
    flex-direction: column;
    position: relative;
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: center;
    width: 34px;
    min-width: 64px;
    height: auto;
    border: none;
    background-color: transparent;
    padding: 0;
    font-weight: normal;
    font-size: 9px;
    color: #000;
    letter-spacing: 0;
    text-align: center;
  }
.button--colour:not(:last-child), .button--link-action:not(:last-child) {
      margin-right: 20px;
    }
.button--colour .button-icon, .button--link-action .button-icon {
      width: 30px;
      height: 30px;
      border-radius: 100%;
      border: 1px solid #0F1A34;
      display: inline-flex;
      background-color: #fff;
      align-items: center;
      justify-content: center;
      margin-bottom: 6px;
    }
.button--colour .button-icon i, .button--link-action .button-icon i {
        opacity: 0.5;
        color: #DBD5D5;
        font-size: 100%;
      }
.button--arrow {
    background-color: transparent;
    min-width: 28px;
    height: 28px;
    width: 28px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 24px;
    color: #5ac1ee;
    margin-top: -6px;
  }
.button--no-transform {
    text-transform: none;
  }
.button-file {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  outline: none;
  /* max-width: 90px; */
  text-align: center;
  /* Filled rather than outlined, following fusion: the cyan 1px outline made
     every button in both toolbars compete equally for attention. The fill is
     split by cluster below — blue for the upload group, green for the actions. */
  background-color: var(--colour-action-bg);
  padding: 5px 10px;
  /* min-width: 70px; */
  border-radius: 4px;
  box-shadow: 0 2px 5px rgb(0 0 0 / 13%);
  border: solid 1px transparent;
}
/* `--request` used to pin its label to a 48px column, which forced "Request
     Signature" onto two lines, and then shaved 2px off the vertical padding to
     absorb the second line — so the one button with the longest label was also
     the only one a different height from the rest of its cluster. The label
     sizes to its content now, so neither half is needed and it inherits the
     padding above like every other button. */
@media only screen and (max-device-width: 640px) {
.button-file {
    min-width: 60px
}
  }
.button-file svg {
    display: block;
    max-width: 100%;
    min-width: 18px;
  }
.button-file__wrap {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    /* Match .button-file so the hover fill follows the button's shape. */
    border-radius: 4px;
  }
.button-file__wrap:not(:first-child) {
      margin-left: 5px;
    }
.button-file__wrap:hover {
      background-color: var(--colour-action-bg-hover);
    }
.button-file__wrap:hover .button-file {
        background-color: var(--colour-action-bg-hover);
      }
.button-file__dscr {
    font-size: 10px;
    font-weight: 500;
    line-height: 1.2;
    text-align: left;
    color: var(--button-color);
  }
@media only screen and (max-device-width: 640px) {
.button-file__dscr {
      display: none
  }
    }
/* The cluster split — a paler blue fill on the upload group, green on the actions
   group — was how the two halves of `.vlt__head` were told apart while every button
   was a filled chip. The toolbar is a row of icons now and the colour has moved onto
   the icon itself, one per action rather than one per cluster, so both rules are gone
   from here. `_blocks/toolbar/toolbar.css` owns everything inside `.vlt__head`.

   `.button-file`'s own fill above stays: it is still a chip on the guest-access page,
   which is not a `.vlt__head` and did not ask to change. */
.actions-button {
  width: 44px;
  height: 44px;
  position: relative;
  display: inline-flex;
  align-items: center;
  align-content: center;
  justify-content: center;
  border: 1px solid #C7C7C7;
  border-radius: 2px;
  color: #0F1A34;
  padding: 0;
  outline: none;
}
.actions-button i {
    width: 18px;
    font-size: 20px;
  }
.actions-button--active {
    border-color: #0F1A34;
  }
.actions-button:not(:last-child) {
    margin-right: 8px;
  }
.actions-button--reset {
    margin-left: auto;
  }
/* Tooltip host for a disabled button. The global reset gives [disabled] elements
   `pointer-events: none`, and disabled buttons take no focus, so a tooltip whose
   parent IS the button can never trigger (EmberTooltip binds hover/focus on its
   parentElement). Wrapping keeps the explanation reachable — same approach as the
   Button component, which hangs @disabledTooltip on its enabled outer div. */
.button-tooltip-host {
  position: relative;
  display: inline-flex;
}
/* ---------------------------------------------------------------------------
   The eleven `--style-N` variants above are historical: they are numbered, not
   named, so nothing about `--style-4` says what it is for, and over time five
   of them came to mean "the confirm action" and three "the secondary action"
   while looking nothing like each other. They are grouped by meaning here
   rather than renamed, because the numbers are spread across 57 dialogs and
   renaming them is a separate change.

   THE BASE MUST NOT SET A BORDER — see `.button` at the top of this file,
   which sets `border: 0`. An earlier attempt gave the base
   `border: 1px solid transparent`, and at (0,2,0) that outranked every
   variant's border-colour at (0,1,0): every variant whose shape comes from its
   border rendered as bare text on white — `deselect`, Recording Player, Join
   and Cancel on the conference dialogs, Try Again on the uploader dialog.

   `--style-7`, `--style-10` and `--style-11` keep their own colours: they sit
   over dark grounds (the conference bar, the meeting sidebar, the Office 365
   button) where a white fill would be wrong.
   --------------------------------------------------------------------------- */
.button--style-1,
.button--style-2,
.button--style-3,
.button--style-4,
.button--style-5,
.button--style-6,
.button--style-8,
.button--style-9,
.button--primary,
.button--black,
.button--dark {
  padding: 8px 14px;
  border-radius: var(--r-r-ctl);
  font-size: 12.5px;
  font-weight: 600;
  line-height: 1.1;
  text-transform: none;
}
/* Filled: five numbered variants that all mean "the confirm action". */
.button--style-1,
.button--style-2,
.button--style-4,
.button--style-5,
.button--style-9,
.button--primary {
  border: 1px solid var(--r-button-bg);
  background-color: var(--r-button-bg);
  color: #fff;
}
.button--style-1:hover,
.button--style-2:hover,
.button--style-4:hover,
.button--style-5:hover,
.button--style-9:hover,
.button--primary:hover {
  border-color: var(--r-button-hover-bg);
  background-color: var(--r-button-hover-bg);
}
/* Outlined: the secondary action, including a bare `.button` with no variant
   at all — which is what `deselect` is. `[class*="--"]` is how a variant is
   detected, since the variants are all `--`-prefixed modifiers. */
.button--style-3,
.button--style-6,
.button--style-8,
.button--black,
.button--dark,
.button:not([class*="--"]) {
  border: 1px solid var(--r-ctl);
  background-color: #fff;
  color: #3a4763;
}
.button--style-3:hover,
.button--style-6:hover,
.button--style-8:hover,
.button--black:hover,
.button--dark:hover,
.button:not([class*="--"]):hover {
  border-color: var(--r-brand);
  background-color: var(--r-hover);
  color: var(--r-brand);
  box-shadow: none;
}
/* `--style-3--active` is how modal-confirm marks its OK button. It has to come
   after the outlined group at the same specificity, so order settles it:
   without this the confirm and the cancel in every confirm dialog looked
   identical. */
.button--style-3--active,
.button--style-3--active:hover {
  border-color: var(--r-button-bg);
  background-color: var(--r-button-bg);
  color: #fff;
}
.button:disabled,
.button[disabled],
.button--disabled {
  border-color: transparent;
  background-color: var(--r-div);
  color: var(--r-faint);
  opacity: 1;
}
.button:focus-visible {
  outline: none;
  box-shadow: var(--r-focus);
}
/* `.btn-thin` has no CSS anywhere in the app, so the tenancy buttons carrying
   it render unstyled. Give them the same treatment, one size down. */
.btn-thin {
  padding: 7px 12px;
  border-radius: var(--r-r-ctl);
  font-size: 12.5px;
  font-weight: 600;
}
/* The toolbar's two-line buttons (label + description). The two-tone fill is
   deliberate and is left alone; Request Signature wrapped to two lines because
   the description column was a fixed width. */
.button-file,
.button-file__dscr {
  font-size: 12.5px;
  font-weight: 600;
  line-height: 1.2;
}
.button-file__wrap { border-radius: var(--r-r-ctl); }
.event-tooltip {
  position: relative;
}
.event-tooltip__icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    font-size: 22px;
    color: #707070;
    border: 2px solid #707070;
    border-radius: 50%;
    background-color: #fff;
  }
.event-tooltip__icon--download {
      font-size: 24px;
    }
.event-tooltip__icon--view {
      font-size: 14px;
    }
.events-list {
  display: flex;
  align-items: center;
  justify-content: flex-start;
}
.events-list__item {
    margin-top: 5px;
  }
.events-list__item + .events-list__item {
      margin-left: 5px;
    }
/* Both toolbar menus take the house neutral border. They used to take the tint of
   the cluster whose button opened them — blue for the upload half, green for the
   actions half — which was of a piece with a toolbar made of tinted chips. The
   toolbar is icons now and its colour is on the icons, so a coloured edge around a
   menu was the last thing still arguing for the old scheme, and it competed with
   the items inside it. Grey edge, coloured contents. */
.files-nav__dropdown--content {
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-top: 8px;
  padding: 4px;
  border: 1px solid var(--colour-border-default);
  border-radius: var(--r-r-inner);
  background-color: var(--body-bg);
  box-shadow: var(--r-shadow-md);

  /* No dividers. They were a `border-bottom` on a rounded box, so each one
     curved away at its ends, and they were drawn in the other cluster's colour.
     The rows are menu items with a hover fill — they do not need ruling off
     from each other as well. */
}
.files-nav__dropdown--content .button-file__wrap {
    margin: 0;
  }
.files-nav__dropdown--content .button-file__wrap button {
      padding: 10px 5px;
      border-radius: 0;
      box-shadow: none;
      border: 0;
      width: 100%;
      justify-content: flex-start;
    }
/* `--actions` no longer changes the edge — both menus are grey. The class stays
   because `_blocks/toolbar/toolbar.css` uses it to colour the items inside, and
   because the More menu still needs telling apart from the New file one. */
.file-tabs {
  display: flex;
  padding: 8px 0;
  font-size: 14px;
  /* color: #000; */
  border-bottom: 1px solid #707070;
}
.file-tabs__item {
    cursor: pointer;
    position: relative;
    flex: 1 1;
    transition: ease 0.15s all;
  }
/* The 20px margin+padding that used to space the first tab from the second
       is the container's `gap` now — see below. Left here it wins on
       `:first-child` and puts 40px between two tabs and none between the rest. */
.file-tabs__item--active {
      font-weight: 500;
    }
.file-tabs__item--active:after {
        position: absolute;
        bottom: -15px;
        left: 0;
        content: '';
        width: 100%;
        height: 7px;
        background-color: #4e4e4e;
      }
/* The existing `::after` indicator is restyled rather than replaced — adding a
   second one draws a doubled underline. */
.file-tabs {
  justify-content: flex-start;
  gap: 22px;
  border: 0;
}
.file-tabs__item {
  position: relative;
  flex: 0 0 auto;
  width: auto;
  padding: 0 0 7px;
  border: 0;
  box-shadow: none;
  opacity: 1;
  font-size: 12.5px;
  font-weight: 600;
  text-align: left;
  color: var(--r-muted);
}
.file-tabs__item--active { color: var(--r-brand); }
.file-tabs__item--active::after {
  top: auto;
  right: 0;
  bottom: 0;
  left: 0;
  width: auto;
  height: 2px;
  border-radius: 2px;
  background: var(--r-brand);
}
.file-tabs__item::before { display: none; }
.valut-filedata__block {
    margin-bottom: 30px;
    font-size: 14px;
  }
.valut-filedata__title {
    font-weight: 500;
    /* color: #000; */
    text-transform: uppercase;
  }
.valut-filedata__subtitle {
    margin-top: 10px;
    font-weight: 500;
    /* color: var(--secondary-font); */
  }
.valut-filedata__text {
    margin-top: 5px;
    font-size: 14px;
    color: var(--secondary-font);
    line-height: 1.5;
  }
.valut-filedata__dscr {
    color: var(--secondary-font);
  }
.valut-filedata__dscr--pre {
      white-space: pre-line;
    }
.valut-filedata__list {
    margin-top: 30px;
  }
.valut-filedata__list-item {
      padding: 15px 0;
      border-bottom: 1px solid #707070;
    }
.valut-filedata__button {
    width: 100%;
  }
.valut-filedata__upload {
    margin-top: 25px;
  }
/* ---------------------------------------------------------------------------
   The details panel.

   Two stacked spacings put 75px of nothing between the "General info" heading
   and the first row: the panel's own 30px padding-top plus a 30px margin-top on
   the first block. The label/value hierarchy was also inverted — a 15px bold
   navy label above a 12.5px grey value, so the field name shouted and the
   answer whispered.
   --------------------------------------------------------------------------- */
.container__sidebar .valut-filedata { padding-top: 0; }
.container__sidebar .valut-filedata__block:first-child { margin-top: 0; }
.container__sidebar .file-tabs { margin-bottom: 10px; }
.container__sidebar .valut-filedata__block {
  padding: 14px 0;
  border-top: 1px solid var(--r-div);
}
.container__sidebar .valut-filedata__list { padding-top: 6px; }
.container__sidebar .valut-filedata__list-item {
  display: flex;
  justify-content: space-between;
  gap: 14px;
  padding: 9px 0;
}
.container__sidebar .valut-filedata__list-item .valut-filedata__title {
  flex: 0 0 auto;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .05em;
  color: var(--r-muted);
}
.container__sidebar .valut-filedata__list-item .valut-filedata__dscr {
  font-size: 12.5px;
  font-weight: 500;
  text-align: right;
  color: var(--r-navy);
}
.valut-filedata__title {
  font-size: 15px;
  font-weight: 700;
  color: var(--r-navy);
}
.valut-filedata__subtitle {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--r-muted);
}
.valut-filedata__dscr,
.valut-filedata__text {
  font-size: 12.5px;
  color: var(--r-grey);
}
.file-actions {
  box-sizing: border-box;
  position: relative;
  /* padding: 11px 0; */
  cursor: pointer;
}
.file-actions:focus {
    outline: none;
  }
.file-actions--right .file-actions__button {
      margin-right: 0;
    }
.file-actions__menu {
    z-index: 2;
    display: block;
    position: absolute;
    left: auto;
    right: 0;
    min-width: 150px;
    background-color: var(--body-bg);
    border-radius: 8px;
    overflow: hidden;
    max-height: 295px;
    max-width: 200px;
    overflow-y: scroll;
  }
.file-actions__menu-is-opened {
      display: block;
    }
.file-actions__button {
    margin: auto;
  }
.file-actions__item {
    cursor: pointer;
    padding: 16px 24px;
    font-weight: 500;
    font-size: 14px;
    /* color: var(--colour-black); */
    border-top: 1px solid var(--colour-brand);
    transition: ease 0.15s all;
  }
.file-actions__item:hover {
      background-color: var(--button-bg-hover);
    }
.file-actions__item:first-child { border-top: 0; }
.file-inviter {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-bottom: 25px;
  border-bottom: 2px dashed var(--platinum);
}
.file-inviter__title {
    font-weight: 500;
    font-size: 16px;
  }
.file-inviter__dscr {
    margin-top: 5px;
    font-size: 10px;
  }
.accordion__item {
    border: 1px solid #000;
    border-radius: 4px;
    background-color: var(--gray);
  }
.accordion__item--is-opened {
      border-radius: 4px 4px 0 0;
    }
.accordion__item + .accordion__item {
      margin-top: 10px;
    }
.accordion__item-title {
      cursor: pointer;
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 3px;
      padding: 12px 20px;
      font-weight: 500;
      font-size: 16px;
      color: var(--white);
    }
.accordion__item-title .icon { font-size: 20px; }
.accordion__item-content {
      border: 1px solid #000;
      border-top: 0;
      padding: 10px;
      border-radius: 0 0 4px 4px;
    }
.accordion__item-content + .accordion__item {
        margin-top: 10px;
      }
.user-details__remove {
    cursor: pointer;
    font-size: 18px;
    /* color: var(--colour-brand-dark); */
  }
.user-details__person { margin-left: 20px; }
.user-details__main {
    display: flex;
    align-items: center;
    cursor: pointer;
  }
.user-details__main .icon {
      cursor: pointer;
      display: inline-block;
      margin-right: 20px;
      margin-left: auto;
      font-size: 20px;
    }
.user-details__main .icon-arrow-up { display: block; }
.user-details__main .icon-arrow-down { display: block; }
.user-details__main--conference {
      padding-bottom: 10px;
    }
.user-details__permissions {
    padding: 15px;
  }
.user-details__permissions-title {
      margin-bottom: 10px;
      font-size: 12px;
    }
.user-details__type {
    padding: 30px 0;
    border-top: 2px dashed var(--platinum);
    border-bottom: 2px dashed var(--platinum);
  }
.user-details__type-title {
      margin-bottom: 10px;
      font-size: 12px;
    }
.user-details__conference {
    border: 1px var(--grey-light) solid;
    padding: 5px;
    margin: 2px;
    border-radius: 5px;
    cursor: default;
    font-size: 12px;
  }
.user-details__conference .icon-close {
      font-size: 12px;
      cursor: pointer;
      color: var(--colour-brand);
    }
.users-list--sharing {
    max-height: calc(100vh - 500px);
    overflow-y: auto;
  }
.users-list__item {
    margin-bottom: 10px;
  }
.file-sharing__users {
    padding-top: 20px;
  }
.file-sharing__add {
    padding: 15px 0 8px;
  }
.file-sharing__add--more {
      border-top: 2px dashed var(--platinum);
    }
.file-sharing__form {
    margin-top: 10px;
  }
.file-sharing__form-item {
      margin-top: 20px;
    }
.file-sharing__form-button {
      width: 100%;
      margin-top: 30px;
    }
.file-sharing__members {
    display: flex;
    flex-wrap: wrap;
    max-height: 125px;
    overflow: auto;
    font-size: 14px;
    margin-top: 10px;
    line-height: 1.3;
  }
.file-sharing__label {
  padding: 10px;
  text-align: center;
  font-weight: 500;
  font-size: 14px;
  box-shadow: 0 3px 6px 0 rgb(0 0 0 / 16%);
  background-color: var(--solitude);
  border-radius: 10px;
  color: var(--black);
  margin-top: 15px;
}
.file-status {
  display: flex;
  align-items: center;
}
.file-status__icon {
    margin-right: 5px;
    font-size: 14px;
  }
.file-status__title {
    font-weight: 500;
    font-size: 10px;
    color: #000;
    text-transform: uppercase;
  }
/* approved green*/
.file-status--style-1 .file-status__icon { color: #009900; }
/* awating yellow*/
.file-status--style-2 .file-status__icon { color: #fbdb65; }
/* awaiting red */
.file-status--style-3 .file-status__icon { color: #d50505; }
/* supporting */
.file-status--style-4 .file-status__icon { color: #4e4e4e; }
/* Progress under a row. The component sizes this in pixels against the ROW, not
   the cell it lives in (file-loader/component.js), so at 100% it runs the full
   width of the row — which is why it only gets noticed at the end of a transfer,
   where a 2px hard-edged dark line flush against the row's bottom edge reads as a
   scrollbar appearing rather than as progress finishing.
   Taller, rounded at the leading edge, and on the brand palette so it reads as
   content. The colours also now say which direction the transfer is going. */
.file-loader {
  position: absolute;
  bottom: 0;
  left: 0;
  height: 3px;
  border-radius: 0 2px 2px 0;
  background-color: var(--colour-brand);
  transition: width ease 0.3s;
}
.file-loader--upload {
    background-color: var(--colour-brand-dark);
  }
/* Left alone: this one appears in the transfer summary panel, not under a
     table row, so it never had the scrollbar problem. */
.file-loader--summary {
    background-color: #52c76d;
  }
/* The status cell. Every label a document can carry lands here, including the
   status tags a tenancy names itself — so its natural width is unbounded, and
   one long tag used to widen the whole column and squeeze the file names.
   The cap follows the window rather than being a fixed number, and the labels
   inside it ellipsise; utils/truncation.js gives the full text back on hover
   whenever one actually clips, so nothing is lost, only deferred.

   The cap has to live on this wrapper, not the cell: a table cell's max-width
   is ignored under automatic layout, but a capped block inside it bounds what
   the cell can ask the column for. */
.labels-list {
  display: flex;
  align-items: center;
  flex-direction: row;
  justify-content: flex-start;
  flex-wrap: wrap;
  gap: 6px;
  /* Follows the window rather than a fixed number, and generously: the cap is
     only there to stop one long tag widening the column without limit, so on a
     wide screen it should let the tags sit on one line rather than stacking
     them into three while the row has space to spare. The table is auto-layout,
     so the column still only takes what its content asks for, up to this. */
  max-width: clamp(140px, 26vw, 640px);
}
/* Was `margin: 4px 4px 4px 0` on every child, which meant the spacing between
     two labels depended on which of them was a plain label and which was the
     status-tag dropdown — the gap before "Re-share required" was half the rest.
     One `gap` on the container spaces all of them the same. */
.labels-list > * {
    min-width: 0;
    max-width: 100%;
  }
/* Ember leaves zero-width placeholder nodes between dropdown triggers. As flex
   children they take a share of the `gap`, which shows up as phantom space
   between two labels that look adjacent. */
.labels-list > .ember-basic-dropdown-content-placeholder { display: none; }
/* On a phone the status column is a sliver, and most of what can appear in it
   is detail rather than state: the tenancy's own status tags, the add-a-tag
   slot, notes, admin, expiry, malware progress, submission and guest flags.
   Four states are worth the width — shared, shared with me, signature pending,
   signed — and they show as their icon alone, because `.label__text` already
   carries `hide-on-phone`.

   Hide-then-restore rather than marking each of the twenty that go: a label
   added later is invisible on a phone until someone decides it earns the room,
   which is the safer default for a column this narrow. `:has()` is what lets a
   keeper survive inside a wrapper — the signature-pending label is wrapped in a
   link to the document. */
@media only screen and (max-device-width: 640px) {
  .labels-list {
    gap: 4px;
  }

  /* One rule with the exception built into it, rather than hide-all followed by
     restore-some: `.label` sets `display: inline-flex` from the design system,
     which loads after this file, so a bare `.labels-list > *` sits at the same
     weight and loses. The two `:not()`s carry it clear, and there is no second
     rule that has to be kept in step with the first. */
  .labels-list > *:not(.show-on-phone):not(:has(.show-on-phone)) {
    display: none;
  }

  /* Icon-only, so the pill is a square with the icon centred rather than a
     stretched oval with the padding of a label that has text in it. */
  .labels-list .label {
    gap: 0;
    padding: 3px 5px;
  }
}
.valut-table {
  display: table;
  width: 100%;
  /*margin-top: 117px;*/
  overflow-x: auto;
}
/* Above 1440px this used to be calc(100% - 115px), so the table stopped 115px
     short of its scroller: a band of empty page on the right while the Status
     column wrapped its chips onto two and three lines. Below 1440px it was
     already 100%, so wide screens were the only ones paying for it.
     Now full width everywhere. The scroller's own 15px scrollbar gutter is the
     visual right margin, which also lines the table up with the toolbar above it
     (it was 130px short of those buttons before, now 15px).
     Auto table layout gives the reclaimed width to the column with unmet demand:
     measured, Status went 233px -> 340px while Owner held at 214px and Name at
     614-622px. */
.valut-table__wrapper {
    flex: 1 1;
    height: 100%;
    overflow: auto;
  }
.valut-table__wrapper .custom-scroll {
      height: 100%;
      overflow: auto;
    }
@mediaonly screen and (max-device-width: 640px) {
.valut-table__wrapper {
      padding-right: 0
  }
    }
.valut-table--is-empty {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    margin: 0;
  }
.valut-table__head {
    z-index: 2;
    display: table-row;
    font-weight: 600;
    font-size: 14px;
    /* color: var(--table-head-color); */
    text-transform: capitalize;
  }
.valut-table__head .icon {
      display: inline-block;
      vertical-align: middle;
      font-size: 20px;
      line-height: 0.5;
    }
@media (max-width: 900px) {
.valut-table__head .icon {
        font-size: 18px;
        margin-top: 3px
    }
      }
.valut-table__head .valut-table__cell {
      z-index: 1;
      position: sticky;
      top: -1px;
      border: 0;
      background-color: var(--table-cell-bg);
    }
.valut-table__head .valut-table__cell--events {
        padding-left: 30px;
      }
.valut-table__cell {
    position: relative;
    display: table-cell;
    padding: 3px;
    vertical-align: middle;
    border-top: 1px solid var(--table-cell-border-bg);
    border-bottom: 1px solid var(--table-cell-border-bottom-bg);
  }
@media (max-width: 1920px) {
.valut-table__cell {
      padding: 7px
  }
    }
.valut-table__cell--filename {
      cursor: pointer;
    }
.valut-table__cell--date {
      cursor: pointer;
    }
/* Holds the row checkbox, and during an upload the progress readout instead.
       70px was sized for the progress content laid out in a row; `--loading`
       below stacks it into a column, so the widest thing this cell ever has to
       fit is "100%" at 14px — a little over 30px. The rest was dead space
       between the checkbox and the owner column. */
.valut-table__cell--progress {
      width: 46px;
      box-sizing: border-box;
    }
@media only screen and (max-device-width: 640px) {
.valut-table__cell--progress {
        width: auto
    }
      }
.valut-table__cell-title {
      display: inline-block;
      vertical-align: middle;
    }
.valut-table__cell .tag { margin: 1px 0; }
.valut-table__cell--loading {
      padding: 0;
    }
.valut-table__cell--loading .user-info {
        flex-direction: column;
      }
/* The arrow and the percentage sit in one flex ROW inside .user-info, so
         the column rule above never applied to them — together they want ~56px
         and the cell is 46px, which made the column jump wider the moment an
         upload started. Stacking them is what the loading cell was already
         trying to do one level up. */
.valut-table__cell--loading .df-ac-jc {
        flex-direction: column;
      }
.valut-table__cell--loading .user-info__name {
        font-size: 14px;
      }
.valut-table__cell--right {
      width: 55px;
      box-sizing: border-box;
    }
.valut-table__cell:first-child {
      border-left: 1px solid var(--table-cell-border-bg);
    }
.valut-table__cell:last-child {
      border-right: 1px solid var(--table-cell-border-bg);
    }
.valut-table__item {
    cursor: pointer;
    display: table-row;
  }
.valut-table__item--is-active {
      background-color: var(--table-cell-active);
    }
.valut-table__item--is-active .valut-table__cell{
        border-top-color: var(--table-cell-active);
      }
.valut-table__item:hover .valut-table__cell {
        border-color: var(--colour-brand);
      }
.valut-table__item:hover .valut-table__cell--left {
        border-top-left-radius: 7px;
        border-bottom-left-radius: 7px;
      }
.valut-table__item:hover .valut-table__cell--right {
        border-bottom-right-radius: 7px;
        border-top-right-radius: 7px;
      }
.valut-table__item--is-empty .valut-table__cell {
        padding: 20px 0;
        border-bottom: 0;
      }
.valut-table__item--is-empty:hover .valut-table__cell {
          border-color: var(--table-cell-border-bg);
        }
.valut-table__item--virus .valut-table__cell {
        border-color: var(--red);
      }
.valut-table__item--virus:hover .valut-table__cell {
          border-color: var(--red);
        }
/* Published as a guest link: anyone holding the URL can browse this folder without an account,
       so the row is tinted across its whole width rather than badged only. Deliberately a wash and
       not the --virus treatment: this is a state the owner chose, not a problem to fix. Literal rgba
       because a tint needs alpha, which the solid --red token cannot provide; both values sit over
       the light and dark table surfaces without hiding the text. */
.valut-table__item--public {
      background-color: rgba(217, 83, 79, 0.1);
    }
.valut-table__item--public .valut-table__cell {
        border-color: rgba(217, 83, 79, 0.45);
      }
/* The leftmost cell carries the accent, so the row reads as flagged even at a glance down a
         long list. The extra left padding keeps the checkbox off the bar — the cell's own 3-7px
         would otherwise put them almost touching. */
.valut-table__item--public .valut-table__cell--left {
        box-shadow: inset 3px 0 0 0 var(--red);
        padding-left: 12px;
      }
.valut-table__item--public:hover {
        background-color: rgba(217, 83, 79, 0.16);
      }
.valut-table__item--public:hover .valut-table__cell {
          border-color: rgba(217, 83, 79, 0.6);
        }
.valut-table__date {
    display: inline-block;
    min-width: 100px;
    font-weight: 500;
    font-size: 15px;
  }
.valut-table__preview {
    box-sizing: border-box;
    display: flex;
    justify-content: center;
    flex-direction: column;
    gap: var(--spacer-2);
    width: 102px;
    height: 124px;
    padding: 6px;
    border-radius: 3px;
    border: 1px solid var(--table-cell-border-bg);
    text-align: center;
  }
.valut-table__preview svg {
      margin: 0 auto;
    }
.valut-table__preview-image-wrapper {
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
    }
.valut-table__preview-image-wrapper img  {
        width: 100%;
        height: 100%;
        object-fit: contain;
        object-position: center;
      }
.valut-table__preview-loader {
      box-sizing: border-box;
      min-width: 54px;
      align-items: center;
      justify-content: center;
      font-size: 14px;
      display: flex;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      background-color: var(--white);
      border: 0.5px solid var(--black);
      border-radius: 3px;
    }
.valut-table__preview-loader svg {
        margin: 0;
      }
.valut-table__preview:hover {
      border-color: var(--colour-brand);
      cursor: pointer;
    }
.valut-table__preview--is-active {
      background-color: var(--table-cell-active);
      border-color: var(--colour-brand);
    }
.valut-table__preview--virus {
      border-color: var(--red);
    }
/* Same guest-link flag as the table row, for the grid view — the state has to be as obvious in
       whichever view the owner happens to be using. */
.valut-table__preview--public {
      background-color: rgba(217, 83, 79, 0.1);
      border-color: rgba(217, 83, 79, 0.5);
    }
.valut-table .file-status {
    margin: 2px 0;
  }
.valut-table .tag {
    margin: 2px 0;
  }
.valut-empty {
  line-height: 1.8;
  text-align: center;
}
.valut-empty__icon {

  }
.valut-empty__title {
    font-weight: 500;
  }
.valut-table__loadmore {
  /* Matches .valut-table above — these two must agree or the load-more row sits
     off the table's right edge. */
  max-width: 100%;
  width: 100%;
  text-align: center;
  font-size: 16px;
  padding-bottom: 40px;
}
@media (max-width: 1440px) {
.valut-table__loadmore {
    max-width: 100%;
    width: 100%
}
  }
.valut-table__loadmore button {
    background-color: #fff;
    outline: 0;
    border: 0;
    margin: 0;
    border-radius: 5px;
    box-shadow: 0 1px 2px 0 rgb(0 0 0 / 5%);
    border: solid 1px var(--colour-brand);
    padding: 5px 10px;
  }
.valut-table__loadmore button:hover {
      background-color: #f0f0f0;
    }
/* ---------------------------------------------------------------------------
   The files table, outside dialogs.
   --------------------------------------------------------------------------- */
.valut-table__head,
.vlt-table__head {
  background: var(--r-thead);
  border-bottom: 1px solid var(--r-edge);
}
.valut-table__head .valut-table__cell {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--r-muted);
}
.valut-table__row:hover,
.vlt-table__row:hover { background: var(--r-row-hover); }
.valut-table__cell {
  font-size: 12.5px;
  color: var(--r-navy);
}
.valut-table__wrapper {
  border: 0;
  border-radius: 0;
  background: #fff;
  box-shadow: none;
}
.valut-table__title {
  font-weight: 600;
  color: var(--r-navy);
}
.valut-table__date { color: var(--r-grey); }
.valut-table__cell-title {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .05em;
  text-transform: uppercase;
  color: var(--r-muted);
}
.link {
	cursor: pointer;
	font-size: 12px;
	color: var(--link-color);
	text-decoration: underline;
	font-weight: 500;
}
.link:hover {
		text-decoration: underline;
	}
.link--no-underline {
		text-decoration: none;
	}
.link--no-underline:hover {
			text-decoration: none;
		}
.link--black {
		font-weight: bold;
		color: #393939;
	}
.menu {
	max-width: 250px;
	 flex: 1 0 250px;
}
.menu--users {
		display: block;
		overflow: auto;
		max-height: 100%;
	}
.menu--users .user-name, .menu--users .user-dscr {
				text-align: left;
			}
.menu--setting, .menu--search {
		flex-wrap: wrap;
		align-items: flex-start;
		align-content: flex-start;
		flex: 1 0 275px;
		max-width: 275px;
	}
.menu--setting .selectbox, .menu--search .selectbox {
			min-width: 100%;
			z-index: 1;
			margin-bottom: 26px;
		}
.menu--setting .selectbox__head, .menu--search .selectbox__head {
				border-color: #0D2136;
				padding: 14px 30px;
			}
.menu--setting .tabs, .menu--setting .tabs__items, .menu--setting .selectbox, .menu--search .tabs, .menu--search .tabs__items, .menu--search .selectbox {
			width: 100%;
		}
.menu__search {
		position: relative;
		display: block;
		padding: 16px;
		width: calc(100% - 32px);
	}
.menu-input {
		box-sizing: border-box;
		display: block;
		width: 100%;
		background-color: #fff;
		border-radius: 4px;
		border: 1px solid #4e4e4e;
		outline: none;
		margin-top: 0;
		font-size: 10px;
		line-height: 1.2;
		color: #707070;
		font-weight: normal;
		padding: 10px 16px;
	}
.menu-input--textarea {
			resize: none;
		}
.menu__info {
		padding-top: 77px;
		position: relative;
		text-align: center;
		font-size: 15px;
		line-height: 1.5;
		letter-spacing: 0.9px;
		/* color: #363636; */
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
.menu__info-title {
			font-weight: 500;
			position: relative;
			max-width: 245px;
		}
.menu__info-subtitle {
			font-weight: normal;
			position: relative;
			max-width: 245px;
		}
.menu--empty .menu__search {
			display: none;
		}
.menu--empty .tabs {
			display: none;
		}
.menu--empty .menu__info {
			display: flex;
			text-align: center;
		}
.menu-title {
		font-size: 24px;
		font-weight: 500;
		line-height: 1.21;
		/* color: #000; */
		letter-spacing: 0;
		margin-bottom: 48px;
	}
.attach {
	padding: 4px 35px;
	position: relative;
	width: auto;
	display: flex;
	align-items: center;
	align-content: center;
	justify-content: flex-start;
	flex-wrap: wrap;
}
.attach-title {
		position: relative;
		width: 100%;
		font-size: 12px;
		font-weight: 500;
		line-height: 1.19;
		color: #191919;
		margin-bottom: 16px;
	}
.attach-items {
		position: relative;
		width: 100%;
		display: flex;
		align-items: flex-start;
		align-content: flex-start;
		justify-content: flex-start;
	}
.attach-item {
		width: 28px;
		height: 28px;
		position: relative;
		display: inline-flex;
		align-items: center;
		align-content: center;
		justify-content: center;
		margin: 0 8px;
	}
.attach-item img {
			width: 100%;
			height: auto;
		}
.attach .button {
		margin: 12px;
	}
.attach .button--style-2 {
			text-transform: none;
			font-weight: 700;
			line-height: 1.19;
			color: #fff;
			border: 1px solid #4e4e4e;
		}
.user__dropdown {
		min-width: 100px;
	}
.user__dropdown .dropdown__list {
				z-index: 5;
			}
.user__dropdown .dropdown__head {
				padding: 0;
				border: none;
				text-transform: none;
				font-size: 11px;
				font-weight: 400;
				display: flex;
				align-items: center;
				justify-content: flex-start;
				/* color: #0d2136; */
			}
.user__dropdown .dropdown-icon {
				font-size: 10px;
				margin-right: 6px;
			}
.user__dropdown .dropdown-icon.icon-dropdown {
					font-size: 6px;
				}
.user__dropdown .dropdown__item {
				padding: 10px 15px;
				font-size: 12px;
				line-height: 1.21;
				text-transform: none;
			}
.user__dropdown .dropdown__arrow {
				margin-left: 10px;
				padding: 2px;
				cursor: pointer;
			}
.user__select {
		width: 40px;
		height: 33px;
		min-width: 30px!important;
	}
.user__select--right .selectbox__list {
					left: 0!important;
					right: auto!important;
				}
.user__select.selectbox--small .selectbox__arrow {
					position: absolute;
					right: 5px;
					bottom: 0;
					width: 8px;
					height: 8px;
					border: 1px solid #000;
					background-color: #fff;
					border-radius: 100%;
					padding: 2px;
					cursor: pointer;
					font-size: 3px;
					display: flex;
					align-items: center;
					justify-content: center;
				}
.user__select.selectbox--big .selectbox__arrow {
					position: absolute;
					right: 5px;
					bottom: 0;
					width: 24px;
					height: 24px;
					border: 1px solid #fff;
					background-color: transparent;
					border-radius: 100%;
					padding: 2px;
					cursor: pointer;
					font-size: 16px;
					display: flex;
					align-items: center;
					justify-content: center;
					color: #fff;
				}
.user__select.selectbox--big .selectbox__list {
					right: 8px;
					left: auto;
				}
.user__select.selectbox--normal {
			width: auto !important;
			height: auto;
		}
.user__select.selectbox--normal .selectbox {
				min-width: 220px;
				background-color: #fff;
			}
.user__select.selectbox--normal .selectbox__head {
					font-size: 14px;
					line-height: 1.2;
					padding: 14px 22px;
					border: 1px solid #000;
				}
.user__select.selectbox--normal .selectbox__arrow {
					border: none;
					font-size: 7px;
				}
.user__select.selectbox--normal .selectbox__List {
					width: 100%;
				}
.user__select .selectbox {
			z-index: 2;
		}
.user__select .selectbox__list {
				z-index: 5;
				width: 200px;
				background-color: transparent;
			}
.user__select .selectbox__head {
				padding: 0;
				border: none;
				text-transform: none;
				font-size: 10px;
				font-weight: 400;
				display: flex;
				align-items: center;
				justify-content: flex-start;
				color: #0d2136;
			}
.user__select .selectbox-icon {
				font-size: 10px;
				margin-right: 6px;
			}
.user__select .selectbox-icon.icon-dropdown {
					font-size: 6px;
				}
.user__select .selectbox__item {
				width: 100%;
				text-align: left;
				padding: 20px 15px;
				font-size: 14px;
				letter-spacing: 0.21px;
				color: #000;
				font-weight: 500;
				line-height: 1.21;
				text-transform: none;
				-webkit-appearance: none;
				background-color: #fff;
				border-radius: 0;
				border: 1px solid #e4e4e4;
				display: flex;
				align-items: center;
			}
.user__select .selectbox__item:hover {
					background-color: var(--gray);
				}
.user__select .selectbox__item:not(:last-child) {
					border-bottom: none;
				}
.user {
	width: 100%;
	display: flex;
	align-items: center;
}
.user__content {
		display: flex;
		align-items: center;
	}
.user__info {
		line-height: 1.2;
		/* color: #4E4E4E; */
	}
.user-img {
		z-index: 0;
		min-width: 30px;
		min-height: 30px;
		width: 30px;
		height: 30px;
		position: relative;
		margin-right: 16px;
		border-radius: 100%;
		overflow: hidden;
		position: relative;
		display: inline-flex;
		align-items: center;
		align-content: center;
		justify-content: center;
		border: 0.5px solid #061f45;
	}
.user-img img {
			position: absolute;
			left: 0;
			top: 0;
			width: 100%;
			height: 100%;
			object-fit: cover;
			z-index: 1;
		}
.user-img i {
			font-size: 50%;
			color: #DBD5D5;
			opacity: 0;
		}
.user-img--empty img {
				opacity: 0;
			}
.user-img--empty i.icon-empty-image {
				opacity: 0.5;
			}
.user-name {
		font-size: 12px;
		text-transform: none;
		line-height: 1.21;
		font-weight: 500;
		letter-spacing: normal;
		margin-bottom: 4px;
	}
.user-name--with-icon {
			display: flex;;
			align-items: center;
		}
.user-name--with-icon svg {
				margin-left: 5px;
				fill: #fff;
			}
.user-dscr {
		font-size: 8px;
		text-transform: none;
		line-height: 1.13;
		font-weight: 400;
	}
.user__action {
		width: 30px;
		height: 30px;
		border-radius: 100%;
		font-size: 20px;
		border: 1px solid #4e4e4e;
		color: #4e4e4e;
	}
.user__action-button {
			background-color: transparent;
			position: relative;
			width: 100%;
			height: 100%;
			border: none;
			outline: none;
			padding: 0;
			display: flex;
			align-items: center;
			justify-content: center;
		}
.user__action .user__select {
			min-width: 100%;
			width: 100%;
			height: 100%;
		}
.user__action .user__select .selectbox__arrow {
					color: #4e4e4e;
					bottom: 0;
					right: 0;
				}
.user__action--buttons {
			width: auto;
			border: none;
			height: auto;
		}
.user--main {
		width: auto;
		display: flex;
		justify-content: space-between;
		padding: 0 16px;
	}
.user--main .user-name {
				font-size: 14px;
				margin-bottom: 4px;
			}
.user--main .user-dscr {
				font-size: 8px;
			}
.user--style-1 .user {
			min-height: 46px;
		}
.user--style-1 .user-img {
				width: 46px;
				height: 46px;

			}
.user--style-1 .user-name {
				/* color: #000; */
				margin-bottom: 5px;
				font-size: 15px;
			}
.user--style-1 .user-dscr {
				color: var(--secondary-font);
			}
.field {

  /* `.field .field__label` at (0,2,0) quietly outranked every `.field__label`
     rule, so a label could not be given a weight anywhere else in the app. The
     weight is the label system's own now — see the refresh section below. */
}
.field__label {
    display: block;
    font-size: 16px;
  }
/* color: #707070; */
.field__label--file {
      font-size: 10px;
      text-align: center;
      color: #0f1a34;
      display: block;
    }
.field__label--warning {
      color: #d06c2c;
      font-size: 12px;
      margin-top: 5px;
    }
/* A password with a show/hide button inside it (Create user; the same control as Security's set-password form).
     The wrapper takes the input's top margin, so the button centres on the input itself. */
.field__secret {
    position: relative;
    margin-top: 15px;
  }
.field__secret .field__input {
      margin-top: 0;
      padding-right: 44px;
    }
.field__reveal {
    position: absolute;
    top: 0;
    right: 0;
    width: 44px;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0;
    border: 0;
    background: transparent;
    color: #8a93a6;
    font-size: 16px;
    cursor: pointer;
  }
.field__reveal:hover {
      color: #2f6fed;
    }
.field__reveal:disabled {
      cursor: default;
      opacity: 0.5;
    }
.field__input {
    box-sizing: border-box;
    display: block;
    width: 100%;
    margin-top: 15px;
    padding: 13px 20px;
    font-size: 16px;
    /* Left as literals on purpose. Unlike the control rule at the foot of this
       file, these values are NOT the refresh palette — they are this block's
       own older set (#707070 text, a black border), and the only elements that
       reach them are the ones the control rule excludes. Swapping them for the
       themed tokens would have changed those inputs in LIGHT as well, which is
       not what a dark-theme fix should do. Dark handles them in themes/dark.css
       instead. */
    color: #707070;
    background-color: #fff;
    border-radius: 4px;
    border: 1px solid #000;
    outline: none;
  }
.field__input::placeholder {
      font-size: 11px;
      font-style: italic;
      color: #c7c7c7;
    }
.field__input--textarea {
      resize: none;
    }
.field__input--date {
      padding-right: 50px!important;
    }
.field__input[type="password"] {
      padding-right: 48px!important;
    }
.field__input--flat {
      outline: none;
      padding-right: 0;
      background: transparent;
      border: 0;
    }
.field__input--flat input {
        font-size: 14px;
        box-sizing: border-box;
        /* color: var(--font-black); */
        line-height: 1;
        outline: none;
        margin: 0;
        border-radius: 3px;
        border: solid 1px var(--colour-brand);
        padding: 9px;
      }
.field__input--flat input::placeholder {
          font-size: 14px;
          font-style: italic;
          color: var(--font-black);
          opacity: 0.5;
        }
.field__input--flat input:focus {
          border: 0;
          border: solid 1px var(--colour-brand);
        }
.field__input--subscription {
      outline: none;
      padding-right: 0;
      background: transparent;
      border: 0;
    }
.field__input--subscription input {
        font-size: 14px;
        box-sizing: border-box;
        color: var(--hero-white);
        line-height: 1;
        outline: none;
        margin: 0;
        border-radius: 0;
        border: 0;
        border-bottom: 1px solid var(--hero-white);;
        padding: 9px 0;
        background: transparent;
      }
.field__input--subscription input::placeholder {
          font-size: 14px;
          font-style: italic;
          opacity: 0.5;
          color: #A4A4A4;
        }
.field__input--subscription input:focus {
          border: 0;
          border-bottom: 1px solid var(--hero-white);;
        }
.field__input--manage-users {
      outline: none;
      padding-right: 0;
      background: transparent;
      border: 0;
    }
.field__input--manage-users input {
        font-size: 14px;
        box-sizing: border-box;
        color: var(--black);
        line-height: 1;
        outline: none;
        margin: 0;
        border-radius: 0;
        border: 0;
        border-bottom: 1px solid var(--black);;
        padding: 9px 0;
        background: transparent;
      }
.field__input--manage-users input::placeholder {
          font-size: 14px;
          font-style: italic;
          opacity: 0.5;
          color: #A4A4A4;
        }
.field__input--manage-users input:focus {
          border: 0;
          border-bottom: 1px solid var(--black);;
        }
.field__checkbox {
    margin-top: 15px;
    margin-bottom: 4px;
  }
.field__selectbox {
    margin-top: 15px;
  }
.field__clear {
    position: absolute;
    right: -10px;
    top: 0;
    font-size: 10px;
    height: 10px;
    width: 10px;
    z-index: 1;
    cursor: pointer;
    outline: none;
    background-color: transparent;
    border: none;
    padding: 0;
  }
.field__with-icon {
    position: relative;
  }
.field__with-icon .icon {
      position: absolute;
      bottom: 0;
      top: 0;
      margin: auto 0;
      right: 16px;
      width: 22px;
      height: 15px;
      z-index: 1;
      font-size: 15px;
      color: #000;
      outline: none;
      background-color: transparent;
      border: none;
      padding: 0;
      cursor: pointer;
    }
.field__with-icon .icon:hover {
        opacity: 0.8;
      }
.field__with-icon--date .icon {
        width: 25px;
        height: 25px;
        font-size: 25px;
      }
.field__with-buttons {
    position: relative;
  }
.field__with-buttons .field-button {
      position: absolute;
      right: 5px;
      width: 20px;
      height: 50%;
      display: flex;
      -ms-align-items: center;
      align-items: center;
      justify-content: center;
      background-color: transparent;
      border: none;
      outline: none;
      font-size: 100%;
      padding: 0;
      vertical-align: middle;
    }
.field__with-buttons .field-button--up {
        top: 2px;
      }
.field__with-buttons .field-button--down {
        bottom: 2px;
      }
.field__with-buttons .field__input {
      padding-right: 30px;
    }
.field__date-type {
    position: relative;
  }
.field__date-type .link {
      font-size: 12px;
    }
.field__image {
    width: 70px;
    height: 70px;
    border-radius: 100%;
    overflow: hidden;
    border: 1px solid #707070;
    position: relative;
    display: inline-flex;
    align-items: center;
    align-content: center;
    justify-content: center;
    background-color: #fff;
  }
.field__image img {
      width: 100%;
      height: 100%;
      position: absolute;
      left: 0;
      top: 0;
      object-fit: cover;
      z-index: 1;
    }
.field__image i {
      font-size: 30px;
      color: #DBD5D5;
      opacity: 0;
    }
.field--style-2 .field__input {
      margin-top: 8px;
      padding: 12px 20px 14px;
    }
.field--style-2 .field__input::placeholder {
        font-size: 11px;
        font-style: italic;
        color: #c7c7c7;
      }
.field--style-3 .field__input {
      margin-top: 8px;
      padding: 8px 20px 10px;
    }
.field--style-3 .field__input::placeholder {
        font-size: 11px;
        font-style: italic;
        color: #c7c7c7;
      }
.field--style-4 .field__label {
      font-weight: 500;
      /* color: #000; */
    }
.field--style-4 .field__input-wr {
      position: relative;
    }
.field--style-4 .field__input-wr .icon {
        position: absolute;
        right: 15px;
        font-size: 24px;
        top: calc(50% - 12px);
        cursor: pointer;
      }
.field--style-4 .field__input {
      margin-top: 10px;
      padding-right: 40px;
    }
.field--style-5 .field__input-wr-icons {
      position: absolute;
      right: 15px;
      top: calc(50% - 12px);
    }
.field--style-5 .field__input-wr-icons .copy-to-clipboard {
        outline: none;
        background: none;
        border: none;
      }
.field--style-5 .field__input-wr-icons svg {
        width: 24px;
        height: auto;
      }
.field--style-5 .field__input-wr-icons svg path {
          fill: #000;
        }
.field--style-5 .field__input {
      padding-right: 80px;
    }
.field--setting .field__label {
        position: relative;
        display: block;
        font-size: 14px;
        line-height: 1.2;
        letter-spacing: 0;
        /* color: #000; */
        margin-bottom: 8px;
      }
.field--setting .field__input {
        margin-top: 0;
        border-color: #000;
        padding: 10px 16px;
        font-size: 14px;
        color: #707070;
        min-height: 46px;
      }
.field--setting .field__input::placeholder {
          font-size: 11px;
          font-style: italic;
          font-weight: normal;
          color: #c7c7c7;
        }
.field--textbutton .button {
      margin-top: 20px;
    }
.field--add-user .ember-power-select-trigger {
      outline: none;
      padding-right: 0;
      background: transparent;
      border: 0;
    }
.field--add-user input,
    .field--add-user .ember-power-select-search-input:focus {
      outline: none;
      box-sizing: border-box;
      margin-top: 15px;
      padding: 9px 20px;
      font-size: 16px;
      color: #707070;
      line-height: 1;
      background-color: transparent;
      border-radius: 4px;
      border: 1px solid #000;
      outline: none;
    }
.field--add-user input::placeholder, .field--add-user .ember-power-select-search-input:focus::placeholder {
        font-size: 11px;
        font-style: italic;
        color: #c7c7c7;
      }
.field--add-user .ember-power-select-option {
      padding: 6px;
      font-size: 14px;
    }
.field-signature__buttons {
    display: flex;
    justify-content: space-between;
  }
.field-signature__actions {
    display: flex;
    align-items: center;
    margin-top: 20px;
  }
.field-signature__canvas {
    box-sizing: border-box;
    position: relative;
    flex: 1 1;
    width: 100%;
    border-radius: 10px;
    border: 1px solid #000;
    height: 294px;
    width: 450px;
    display: flex;
    overflow: hidden;
  }
.field-signature__canvas canvas {
      width: 100%;
      height: 100%;
      background-color: #fff;
      margin: 0 auto;
    }
.field-signature__canvas--square {
      width: 294px;
    }
.field-signature__signature {
    width: 450px;
  }
.field-signature__stamp {
    width: 294px;
  }
.field-signature__loader {
    position: absolute;
    height: 100%;
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: rgba(0, 0, 0, 0.1);
  }
.divider {
  height: 24px;
  width: 100%;
  position: relative;
  display: flex;
  border-radius: 2px;
  background-color: #c7c7c7;
  margin: 16px 0;
}
.signature__button{
  font-size: 12px;
  font-weight: bold;
  color: var(--button-color);
  background: none;
  border-bottom: 1px solid var(--button-color);
  border-radius: 0;
  min-width: auto;
  padding: 0;
}
.signature__button:hover {
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
  }
.signature__tabs {
  display: flex;
  justify-content: space-evenly;
  margin-bottom: 15px;
}
.signature__tab {
  padding: 9px 13px 9px 12px;
  border-radius: 3px;
  background-color: var(--signature-tab-bg);
  font-size: 12px;
  font-weight: normal;
  letter-spacing: normal;
  text-align: center;
  color: var(--button-color);
}
.signature__tab--active {
  background-color: var(--signature-tab-active-bg);
  color: var(--hero-white);
  font-weight: bold;
}
.signature__buttons {
  display: flex;
  align-items: center;
  justify-content: space-evenly;
  /* width: 200px; */
  margin: 0 auto;
  height: 80px;
}
.signature__input {
  display: block;
  padding: 10px;
  border-radius: 3px;
  border: solid 1px var(--colour-brand);
  font-size: 12px;
  color: #1b1b1b;
  min-width: 200px;
  margin: 0 auto;
}
.signature__input:focus {
    outline: 0;
  }
.signature__save {
  padding: 8px 44px 8px 42px;
  border-radius: 5px;
  background-color: var(--colour-brand);
  min-width: auto;
  font-size: 14px;
  font-weight: 600;
  font-style: normal;
  line-height: normal;
  color: var(--white);
  margin: 0 auto;
  display: block;
}
.signature__save:hover {
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
  }
.signature__preload-font {
  font-family: 'Ms Madi';
  height: 0;
  overflow: hidden;
}
/* ---------------------------------------------------------------------------
   One text control.

   The exclusion chain is load-bearing. Some inputs are chrome-less BY DESIGN
   because a wrapper draws the control around them: the Hub switcher's search
   sits inside a grey pill, the share typeahead inside a field shell, and the
   date picker's helper input is 0px tall — giving that one a border draws a
   hairline across the dialog. If a class says flat / search-input /
   power-select / calendar-input, the box is somebody else's job.

   `dform-field` is the same bargain, and it is the one exclusion that was
   missing. A form field is drawn ON TOP of a rendered PDF page, so
   `_blocks/dform` gives it a translucent tint keyed to the field's type
   (`rgba(var(--f), .18)`) rather than a white box that would blank the page
   underneath. This rule outranked it — `input[type="text"]` plus four `:not()`
   is (0,4,1) against the (0,3,0) of `.dform-field--fill .dform-field__comb
   .dform-field__comb-input` — so every fill field was quietly getting `#fff`
   and `--r-navy` instead.

   On the comb ("Boxes") field that was not a cosmetic loss but invisible text.
   Its input deliberately paints nothing (`-webkit-text-fill-color:
   transparent`, which no rule here sets, so it survived) while the cells
   beneath draw each character in its own printed box. An opaque white
   background on top of those cells hid them: you typed an employee number and
   the field stayed blank.
   --------------------------------------------------------------------------- */
input[type="text"]:not([class*="--flat"]):not([class*="search-input"]):not([class*="power-select"]):not([class*="calendar-input"]):not([class*="dform-field"]),
input[type="email"]:not([class*="--flat"]):not([class*="search-input"]),
input[type="search"]:not([class*="--flat"]):not([class*="search-input"]),
input[type="password"]:not([class*="--flat"]),
textarea:not([class*="--flat"]):not([class*="dform-field"]),
.field__input:not([class*="--flat"]):not([class*="search-input"]):not([class*="calendar-input"]),
.input:not([class*="--flat"]) {
  border: 1px solid var(--field-border);
  border-radius: var(--r-r-ctl);
  background: var(--field-bg);
  font-size: 12.5px;
  color: var(--field-fg);
}
input::placeholder,
textarea::placeholder {
  color: var(--field-placeholder);
}
/* Same exclusion, same reason: `_blocks/dform` gives a fill field its own focus treatment
   (a 2px outline in the field's type colour), and this border + box-shadow drew a second,
   differently-coloured one around it. */
input[type="text"]:not([class*="dform-field"]):focus,
input[type="email"]:focus,
input[type="search"]:focus,
textarea:not([class*="dform-field"]):focus {
  border-color: var(--field-border-focus);
  box-shadow: var(--field-focus-ring);
  outline: none;
}
/* The date picker's hidden helper: zero height, so any border is a stray line
   drawn across whatever dialog it sits in. */
.permissions__calendar-input {
  height: 0;
  margin: 0;
  padding: 0;
  border: 0;
  box-shadow: none;
}
/* `.field__label` is used for whole sentences as well as for labels, so it must
   never be uppercased — a sentence in caps is not a label, it is shouting. */
.field__label {
  margin-bottom: 7px;
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  color: var(--field-label);
}
/* Inline links. */
.link {
  border: 0;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--field-link);
  text-decoration: none;
}
.link:hover {
  text-decoration: underline;
}
/* Two fields side by side (Create user: the ID beside the name, the password beside its confirmation), stacked
   again where the dialog is narrow. */
.field-pair {
  display: flex;
  gap: 12px;
}
.field-pair > .field {
    flex: 1 1;
    min-width: 0;
  }
@media (max-width: 575px) {
.field-pair {
    flex-direction: column
}
  }
/* A denser field, for a dialog that has to fit on one screen: the label's own margin is the only gap above the
   input, and the input is shorter. */
.field--compact .field__label {
    margin-bottom: 4px;
  }
.field--compact .field__input,
  .field--compact .field__secret {
    margin-top: 0;
  }
.field--compact .field__input {
    padding: 8px 12px;
  }
.field--compact .field__secret .field__input {
    padding-right: 44px;
  }
.structure {
  padding: 13px;
  font-size: 15px;
  /* color: #707070; */
  line-height: 1.5;
  border: solid 1px #4e4e4e;
  border-radius: 4px;

  /**
   * The tree decides its own size — one request per expanded folder, arriving whenever — so the box it
   * lives in must not. Without these three the dialog resized under the cursor: it opened short, grew when
   * the root folders landed, and grew again on every expansion, which moves the button the user was
   * reaching for.
   *
   * min-height reserves the space the first answer will need, so the initial spinner does not sit in a box
   * that then doubles; max-height + scrolling keeps a deep tree inside the dialog instead of stretching it
   * past the viewport.
   */
  min-height: 148px;
  max-height: 264px;
  overflow-y: auto;
}
.structure__step {
    padding-left: 20px;
  }
.structure__spinner {
    flex: none;
    margin-left: 8px;
    width: 14px;
    height: 14px;
  }
.structure__item {
    cursor: pointer;
    position: relative;
    padding-top: 4px;
    /* So the per-folder spinner sits beside the name rather than below it. */
    display: flex;
    align-items: center;
  }
.structure__item:before {
      position: absolute;
      top: calc(50% - 9px);
      left: -20px;
      font-family: icomoon;
    }
.structure__item--is-opened:before {
        content: '\e90a';
      }
.structure__item--is-closed:before {
        content: '\e909';
      }
.structure__item--without-children:before {
        content: '';
      }
.structure__folder, .structure__file {
    display: flex;
    align-items: center;
  }
.structure__folder--is-chosen, .structure__file--is-chosen { color: #5ac1ee; }
/* Shown but not choosable: a fusion folder the caller may not add to. Half-lit rather than gone,
       because the folder is on the way to ones they can add to and hiding it would hide those too. */
.structure__folder--is-locked, .structure__file--is-locked {
      opacity: .45;
      cursor: default;
    }
.structure__folder:before, .structure__file:before {
      padding-right: 8px;
      font-family: icomoon;
      font-size: 18px;
      content: '\e907';
    }
.structure__folder--is-opened:before, .structure__file--is-opened:before { content: '\e908'; }
.structure__file:before {
      content: '\e914';
    }
.exists-option {
  cursor: pointer;
  position: relative;
  margin-top: 30px;
  padding: 25px;
  /* color: #707070; */
  border: 1px solid #0d2136;
  border-radius: 4px;
}
.exists-option:hover {
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
  }
.exists-option--is-active {
    border-color: #5ac1ee;
  }
.exists-option__title {
    z-index: 1;
    position: absolute;
    top: -14px;
    padding: 5px 10px;
    font-weight: 700;
    font-size: 16px;
    color: #000;
    background-color: #fff;
  }
.exists-option__filename {
    font-weight: 500;
  }
.exists-option__filename,
  .exists-option__data {
    margin-top: 10px;
  }
.exists-options__all {
    display: flex;
    justify-content: center;
    align-items: center;
    margin: 20px auto 0;
    font-size: 18px;
    color: #000;
  }
.exists-options__all .checkbox { margin-right: 25px; }
.exists-options__all label {
      cursor: pointer;
    }
.field-img {
  display: flex;
  align-items: center;
}
.field-img__close {
    font-size: 10px;
    color: #707070;
    background-color: transparent;
    border: 0;
  }
.field-img__file {
    cursor: pointer;
    margin-left: 30px;
  }
.field-img__content {
    display: flex;
    align-items: flex-start;
  }
.field-img__image {
    width: 70px;
    height: 70px;
    border-radius: 100%;
    overflow: hidden;
    border: 1px solid #707070;
    position: relative;
    display: inline-flex;
    align-items: center;
    align-content: center;
    justify-content: center;
    background-color: #fff;
    transform: translate3d(0, 0, 0);
  }
.field-img__image img {
      width: 100%;
      height: 100%;
      position: absolute;
      left: 0;
      top: 0;
      object-fit: cover;
      z-index: 1;
    }
.field-img__image i {
      font-size: 30px;
      color: #DBD5D5;
      opacity: 0;
    }
.field-img__image--empty img {
        opacity: 0;
      }
.field-img__image--empty i.icon-empty-image {
        opacity: 0.5;
      }
.hub-setting {
  position: relative;
  display: flex;
  justify-content: space-between;
  /*max-width: 900px;*/
  height: 100%;
}
@media (max-width: 1024px) {
.hub-setting {
    flex-wrap: wrap
}
  }
.hub-setting__item {
    width: 40%;
  }
.hub-setting__item--form {
      width: 55%;
    }
.hub-setting__block {
    position: relative;
    display: block;
    border-top: 0.5px dashed #C7C7C7;
    padding: 18px 0;
  }
.hub-setting__block:first-child {
      border: 0;
    }
.hub-setting__block--auto {
      max-width: 100%;
    }
.hub-setting__block--double {
      display: flex;
      justify-content: space-between;
      flex-wrap: wrap;
    }
.hub-setting__block--double .hub-setting__block-item {
        margin-right: 20px;
        margin-bottom: 20px;
      }
.hub-setting__block--double .hub-setting__block-item:last-child {
          margin-right: 0;
          margin-bottom: 0;
        }
.hub-setting__line {
    width: 100%;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
  }
.hub-setting__line .field {
      /* max-width: 175px; */
      margin-bottom: 0!important;
      margin-right: 30px;
    }
.hub-setting__line .field__input {
        height: 38px;
        font-size: 10px;
      }
.hub-setting__line .setting__form-buttons {
      margin-top: 30px;
    }
.hub-setting__line:not(:last-child) {
      margin-bottom: 24px;
    }
.hub-setting__line .button {
      text-transform: uppercase !important;
    }
.hub-setting__line .button--link-action {
        text-transform: none !important;
      }
.hub-setting__title {
    position: relative;
    display: flex;
    align-items: center;
    color: #0f1a34;
    text-align: left;
    font-size: 14px;
    font-weight: 500;
    margin-bottom: 14px;
  }
.hub-setting__title .badge { margin-left: 5px; }
.hub-setting__textarea {
    margin-top: 20px !important;
    height: 260px;
  }
@media (min-width: 1025px) and (max-width: 1480px) {
.hub-setting__textarea {
      height: 280px
  }
    }
@media (max-width: 1024px) {
.hub-setting__textarea {
      height: 330px
  }
    }
.hub-setting__form-description {
			font-size: 14px;
			line-height: 18px;
			color: #707070;
			letter-spacing: 0;
			margin-bottom: 16px;
			max-width: 400px;
		}
.hub-setting__form-description--about {
				color: #0F1A34;
			}
.hub-setting__form-description--about span {
					display: block;
					width: 100%;
					text-align: left;
				}
.hub-setting__form-description--hub {
				font-style: italic;
				color: #C7C7C7;
			}
.hub-setting__form .field {
			width: 100%;
			max-width: 225px;
			position: relative;
			display: inline-block;
		}
.hub-setting__form .field--map {
				max-width: 450px;
			}
.hub-setting__form .field--map .selectbox {
					max-width: 220px;
					z-index: 1;
				}
.hub-setting__form .field--hub {
				max-width: 550px;
			}
.hub-setting__form .field--branding {
				max-width: 100%;
			}
.hub-setting__form .field--branding .field__input--italic {
					font-size: 11px;
					font-size: 12px;
					min-height: 230px;
				}
@media (max-width: 991px) {
.hub-setting__form .field--branding .field__input--italic {
						min-height: 50px
				}
					}
.hub-setting__form .field:not(:last-child) {
				margin-bottom: 15px;
			}
.hub-setting__form .field__label {
				cursor: pointer;
			}
.hub-setting__form .field__label--file {
					width: 78px;
				}
.hub-setting__form .field__input--italic{
					font-style: italic;
				}
.hub-setting__form .field__input--italic[type="email"] {
						background-color: var(--gray);
					}
.hub-setting__form .field__input--textarea {
					color: #C7C7C7;
				}
.hub-setting__form .field__input:not(:last-child) {
					margin-bottom: 15px;
				}
.hub-setting__form .field__with-icon .icon {
					display: flex;
					-ms-align-items: center;
					align-items: center;
					justify-content: center;
					right: 10px;
					font-size: 20px;
					width: 18px;
					height: 18px;
				}
.hub-setting__form .field__with-icon .icon .icon-visibility {
						font-size: 16px;
					}
.hub-setting__form .field__painting {
				max-width: 450px;
			}
.hub-setting__form .field__painting-actions {
					margin: 15px 0;
					position: relative;
					display: flex;
					align-items: center;
					justify-content: flex-start;
				}
.hub-setting__form .field__painting-actions .actions__button {
							width: 24px;
							height: 24px;
							position: relative;
							display: inline-flex;
							align-items: center;
							align-content: center;
							justify-content: center;
							border: 1px solid #C7C7C7;
							border-radius: 2px;
							color: #0F1A34;
							padding: 0;
						}
.hub-setting__form .field__painting-actions .actions__button i {
								width: 18px;
								font-size: 12px;
							}
.hub-setting__form .field__painting-actions .actions__button i.icon-redo {
									font-size: 6px;
								}
.hub-setting__form .field__painting-actions .actions__button--active {
								border-color: #0F1A34;
							}
.hub-setting__form .field__painting-actions .actions__button:not(:last-child) {
								margin-right: 8px;
							}
.hub-setting__form .field__painting-wrap {
					width: 100%;
					position: relative;
					display: flex;
					align-items: center;
					justify-content: center;
					align-content: center;
					height: 235px;
					border-radius: 4px;
					border: 1px solid #000;
					overflow: hidden;
					background-color: #fff;
				}
.hub-setting__form .field__painting-wrap img {
						position: relative;
						z-index: 1;
						height: 100%;
						max-height: 140px;
						width: auto;
						display: none;
					}
.hub-setting__form .field__painting-wrap--filled img {
							display: block;
						}
.hub-setting__form .field__painting-wrap--empty img {
							display: none;
						}
.hub-setting__form .field__painting-wrap--empty .field__painting-pad {
							display: block;
						}
.hub-setting__form .field__painting-pad {
					position: absolute;
					left: 0;
					top: 0;
					width: 100%;
					height: 100%;
					background-color: #fff;
					display: none;
				}
.hub-setting__form .field__image {
				margin-bottom: 8px;
			}
.hub-setting__form .field.image {
				width: 78px;
			}
.hub-setting__form .field.image .field__file {
					display: none;
				}
.hub-setting__form .map {
			margin: 15px 0;
			position: relative;
			display: block;
			width: 100%;
		}
.hub-setting__form .map figure {
				width: 100%;
				position: relative;
				display: block;
			}
.hub-setting__form .map figure img, .hub-setting__form .map figure svg {
					width: 100%;
					height: auto;
				}
.hub-setting__form--branding {
			display: flex;
			flex-wrap: wrap;
		}
.hub-setting__form--branding .selectbox {
				z-index: 1;
				width: 180px;
			}
.hub-setting__form--branding .selectbox__head {
					padding: 14px;
					font-size: 14px;
					font-weight: 500;
					border: 1px solid #4E4E4E;
				}
.hub-setting__form--logs .setting__form-line {

			}
.hub-setting__form .checkbox-set__item {
				max-width: 64px;
				margin: 10px;
			}
.hub-setting__form .checkbox-set__dscr {
				color: #000;
			}
.hub-setting__send {
    display: block;
    margin: 20px 0 0 auto;
  }
.hub-setting__template-selectbox {
    width: 230px;
  }
.hub-branding__users {
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	padding: 10px;
  height: 320px;
  width: 300px;
	gap: var(--spacer-2);
	border: 1px solid var(--colour-fg-muted);
	border-radius: 3px;
	overflow-y: auto;
	overflow-x: hidden;
}
.hub-branding__users--share {
	height: 270px;
	width: 100%;
}
/* The list of meetings currently running, offered when you click the meetings
   badge in the header. One row per meeting: what it is on the left, the way in
   on the right.

   Its own block rather than the shared `.valut-table` it used to borrow. That
   table draws a border on every cell, which put a rule under the last row with
   nothing beneath it, and it lays out in three columns — so the row needed an
   empty middle cell to push the button right, and the button was aligned by
   accident rather than on purpose. */
.pending-conferences {
  display: flex;
  flex-direction: column;
}
.pending-conferences__item {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 12px 0;
}
.pending-conferences__item + .pending-conferences__item {
  border-top: 1px solid var(--r-div);
}
/* `min-width: 0` so a long meeting name ellipsises rather than pushing the
   Join button off the row — a flex item's automatic minimum is its content. */
.pending-conferences__detail {
  flex: 1 1 auto;
  min-width: 0;
}
.pending-conferences__name {
  overflow: hidden;
  font-size: 13px;
  font-weight: 600;
  color: var(--r-navy);
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Host, time and headcount read as one sentence, separated rather than
   labelled: three labels for three short values is more furniture than
   information at this size. */
.pending-conferences__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  margin-top: 3px;
  font-size: 11.5px;
  color: var(--r-muted);
}
.pending-conferences__meta > span + span::before {
  content: "·";
  margin: 0 6px;
  color: var(--r-ctl);
}
.pending-conferences__item .button {
  flex: none;
  min-width: 0;
}
.pending-conferences__empty {
  padding: 8px 0;
  font-size: 12.5px;
  color: var(--r-muted);
}
.modal-bg {
  z-index: 25;
  position: fixed;
  top: 0;
  left: 0;
  display: flex;
  justify-content: center;
  /* `flex-start` plus `margin: auto` on the dialog, NOT `align-items: center`.
     They look identical while the dialog fits — auto margins centre it — but a
     centred flex item taller than its container overflows equally in both
     directions and the top of it becomes unreachable, because the overflow
     starts above the scroll origin. This way a dialog that outgrows the screen
     scrolls instead of being cropped at both ends. */
  align-items: flex-start;
  box-sizing: border-box;
  width: 100%;
  /* The inset lives here, as padding, rather than being subtracted from the
     dialog's own height below. One element measures the space; the dialog just
     fits inside what it is given. */
  padding: 32px 0;
  height: 100vh;
  /* The bar at the top of a mobile browser is counted by `vh` but not shown, so
     anything sized in `vh` extends under it. The backdrop's job is to COVER, so
     it takes `dvh` — whatever is on screen right now. The dialog's job is to
     FIT, so it takes `svh` below: the viewport at its SMALLEST, with the bar
     showing. A dialog sized to `dvh` while the bar is hidden is the right size
     until the bar comes back, and then its footer is underneath it. The plain
     `vh` lines stay in front as the fallback. */
  height: 100dvh;
  overflow-y: auto;
  background-color: rgba(0, 0, 0, 0.3);
  transform: translate3d(0, 0, 0);
  outline: none;
}
.modal-bg--low {
  z-index: 20;
}
/* A phone has no room to spare for a decorative inset. */
@media only screen and (max-device-width: 640px) {
  .modal-bg {
    padding: 12px 0;
  }
}
/* And a full-bleed dialog wants none at all. */
.modal-bg:has(.modal--blocked) {
  padding: 0;
}
/* THE DIALOG CONTRACT
   ===================
   Enforced in the templates, not inferred here:

     1. A dialog is `.modal`. Its heading is `.modal__title`, optionally
        followed by one `.modal__subtitles` row. Its body is `.modal__content`.
     2. A dialog WITH actions has exactly ONE `.modal__footer`, holding 1-3
        buttons, and it is a DIRECT CHILD of `.modal` — a sibling of
        `.modal__content`, never inside it. A dialog with no actions has no
        footer, and none is drawn.
     3. There are no exceptions.

   Both halves of rule 2 matter. One class, because five mechanisms
   (`.modal__buttons`, two flavours of `.df-ac-jc`, a bare trailing button)
   meant five selectors and a specificity race instead of a contract. One
   position, because a footer inside the body is inside the dialog's single
   scroll region: it scrolls away with the content — the defect that hid
   Save/Cancel and a compliance disclosure in the share dialog — and it sits
   inside the body's gutter, so it can never be flush. As a sibling it is
   pinned and flush by construction, with no negative-margin compensation
   anywhere in this file.

   The shell is a flex column: header, one scrolling body, pinned footer. That
   is why `.modal--share-docs` and `.modal--scrollable-content` are gone — both
   were this arrangement, hand-applied to the two dialogs that needed it most,
   and every other dialog went without. */
/* A dialog holding nothing but a wait is sized to the sentence rather than to the 560px a form needs.
   Both classes, deliberately: `min-width` on `.modal` is what makes every other dialog a consistent width,
   and a single class here would be the same specificity — so which of the two won would be decided by
   which came later in the file, which is not a thing to leave to chance. */
.modal.modal--waiting {
  min-width: 0;
}
.modal {
  box-sizing: border-box;
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 560px;
  margin: auto;
  /* Against the BACKDROP, not against the viewport. The dialog used to compute
     its own height from viewport units — `calc(100vh - 64px)`, then `dvh`, then
     `svh` — which meant two elements were separately guessing at how tall the
     screen is, and the footer is pinned to the bottom of this one. Whenever the
     two disagreed, the dialog's bottom landed past the backdrop's and the
     footer went with it: scrolling the backdrop then revealed a few pixels of
     it, which is exactly what it looked like.

     `100%` of a parent with a definite height cannot disagree with that parent.
     The backdrop is now the only thing that has to know the viewport, and if it
     is right the dialog is right — on any device, whatever `vh` is doing. */
  max-height: 100%;
  /* The gutter is the body's and the footer's, not the shell's — see the rule
     below for the elements that predate them. */
  padding: 0;
  overflow: hidden;
  background-color: var(--body-bg);
  border: 1px solid var(--r-edge);
  border-radius: var(--r-r-card);
  box-shadow: var(--r-shadow-lg);
}
@media only screen and (max-device-width: 640px) {
.modal {
    min-width: 100%
}
  }
.modal--wide {
    width: 980px;
  }
@media (max-width: 1024px) {
.modal--wide {
      width: 100%
  }
    }
.modal--crop {
    width: 545px;
    max-height: initial;
  }
.modal--crop .field {
      height: 442px;
      display: flex;
      justify-content: center;
      position: relative;
      flex: 1 1 auto;
    }
.modal--crop .cropped-image {
      display: block;
      height: auto;
      width: auto;
      max-width: 100%;
      max-height: 100%;
    }
.modal__close {
    cursor: pointer;
    position: absolute;
    top: 20px;
    right: 20px;
    font-size: 15px;
    color: var(--r-faint);
  }
.modal__close:hover {
      color: var(--r-navy);
    }
.modal__header {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
.modal__header-export {display: none; }
.modal__header--state-logs .modal__header-export { display: block; }
/* RULE 2. One class, one treatment, 1-3 buttons. A dialog with no
     `.modal__footer` gets no footer — nothing here guesses at one. An earlier
     attempt used `:last-child:has(.btn)` and matched the Hub Memberships hub
     list, laying a vertical list out horizontally. */
.modal__footer {
    box-sizing: border-box;
    display: flex;
    flex: none;
    align-items: center;
    justify-content: flex-end;
    gap: 9px;
    width: 100%;
    margin: 0;
    padding: 14px var(--r-gutter);
    border-top: 1px solid var(--r-edge);
    background: var(--r-head);
  }
.modal__footer .button,
    .modal__footer .btn,
    .modal__footer .modal__button {
      margin: 0;
      min-width: 0;
    }
/* <Button> renders `.btn` inside a `.w-fill` wrapper, which would stretch it */
.modal__footer .w-fill {
      width: auto;
      flex: none;
    }
.modal__footer > p {
      margin: 0;
    }
/* A footer holding a sentence rather than buttons — Device Status — centres
       it instead of right-aligning a paragraph against the edge. */
.modal__footer:not(:has(button)):not(:has(.btn)):not(:has(.button)) {
      justify-content: center;
      text-align: center;
      color: var(--r-grey);
    }
/* A footer whose first action is kept away from the rest — a Save on one
       side, the two that break every URL already handed out on the other. It is
       a variant of the footer rather than a dialog reaching in and restyling
       it: guest access did the latter, and ended up the one dialog in the app
       whose buttons sat flush against the shell with no gutter at all. */
.modal__footer--split {
      justify-content: space-between;
    }
@media only screen and (max-device-width: 640px) {
      .modal__footer .df-ac-jc {
        flex-direction: column;
      }
    }
/* A dialog that is only a wait: a spinner and one line, side by side and centred.

     It exists because the alternative was reaching for `&__title`, which is a HEADING — left-aligned, with
     top padding and room for content beneath it. Used on its own it drew a card the full 560px wide with a
     sentence pinned to one corner and a void where the content would have been. A wait has no content, so
     it should not be shaped like something that does. */
.modal__waiting {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    padding: 28px 32px;
    font-size: 15px;
    font-weight: 600;
    color: var(--r-navy);
    text-align: center;
  }
.modal__title {
    margin: 0;
    padding-top: 22px;
    padding-bottom: 3px;
    font-size: 17px;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: var(--r-navy);
  }
.modal__title--no-margin {
      margin-bottom: 0;
    }
.modal__subtitle {
    margin: 0;
    padding: 0;
    font-size: 12.5px;
    font-weight: 400;
    line-height: 1.55;
    text-align: left;
    color: var(--r-muted);
    /* A file name is what this line usually carries, and a file name has no spaces to break at — so a long
       one is a single unbreakable token that stretches the dialog or runs out of its side. `anywhere` lets
       it wrap mid-name; `min-width: 0` is what lets it, since `.modal` is a flex column and a flex item's
       automatic minimum size is its content, which for one long word is the whole word.

       Wrapped rather than ellipsed on purpose: the name is WHICH FILE you are about to replace or re-file,
       so hiding half of it to keep the box tidy hides the one fact that makes the dialog answerable. */
    min-width: 0;
    overflow-wrap: anywhere;
  }
/* The same problem inside the body: a file name set in a sentence is still one unbreakable token, and
     `Replace file` puts the INCOMING name there. Scoped to the body's own text so nothing else in a dialog
     starts breaking words mid-way. */
.modal__content p {
    overflow-wrap: anywhere;
  }
/* Facts that belong together go on one line — the Hub a share is scoped to
     and the de-identification cue are one statement, not two headings. The
     wrapper is required: `.modal` is a flex column, and a flex container
     blockifies its children, so `display: inline` on two sibling subtitles
     computes back to `block`. */
.modal__subtitles {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    column-gap: 0;
  }
.modal__subtitles > .modal__subtitle + .modal__subtitle::before {
      content: "·";
      margin: 0 6px;
      color: var(--r-ctl);
    }
/* The ONE scroll region. Everything above and below it is pinned, so a long
     dialog scrolls its content rather than running off the bottom of the
     screen taking its actions with it. */
.modal__content {
    flex: 1 1 auto;
    min-height: 0;
    display: block;
    box-sizing: border-box;
    margin-top: 18px;
    padding: 16px var(--r-gutter);
    overflow-x: hidden;
    overflow-y: auto;
    border: 0;
    border-top: 1px solid var(--r-edge);
    border-radius: 0;
    box-shadow: none;
    max-height: none;
  }
/* border-box at ANY depth, not just on direct children. `> *` was the bug:
       the Data Clearout warning sits inside a `.field`, so it kept
       `content-box`, and `width: 100%` (550px) plus its own 12px/14px padding
       made it 578px — overshooting the body's content edge by exactly 28px and
       running to the dialog's right edge. The same content-box-plus-explicit-
       size mistake is what made a "30px" select 46px tall. */
.modal__content,
    .modal__content * {
      box-sizing: border-box;
    }
/* Safe zones: no block may touch the one above it. */
.modal__content > * + * {
      margin-top: 14px;
    }
/* An open in-place menu must not be clipped. The conference selects use
       `@renderInPlace`, so the menu is a child of this scroll region and was
       cut off at the dialog's edge with a scrollbar instead of showing its
       options. */
.modal__content:has(.ember-basic-dropdown-content) {
      overflow: visible;
    }
.modal__content--grey {
      color: #707070;
    }
.modal__content--update-browser p {
        max-width: 600px;
        text-align: center;
        margin-right: auto;
        margin-left: auto;
      }
.modal__content--update-browser img {
        max-width: 700px;
      }
/* Was 25px, which predates the body's own `> * + *` spacing and now fights
     it — a direct-child field would be spaced differently from every other
     block beside it. One number for both. */
.modal .modal__content .field { margin-top: 14px; }
.modal__button {
    display: block;
    margin: 15px auto 0;
  }
.modal__button--wide {
      width: 100%;
    }
.modal__settings {
    margin-top: 30px;
  }
.modal__shared {
    margin-top: 15px;
  }
.modal__select {
    width: 200px;
    margin: 30px auto 0;
  }
.modal__structure {
    margin-top: 20px;
  }
.modal__selected-folder {
    margin-top: 15px;
  }
.modal__table {
    width: 100%;
    margin-top: 40px;
  }
.modal__period {
    display: flex;
    align-items: flex-end;
    margin-top: 40px;
  }
.modal__period-field {
      margin-top: 0;
      margin-right: 40px;
    }
.modal__painting {
    max-width: 450px;
  }
.modal--style-1 {
    min-width: 376px;
  }
/* `&` is not optional here even though postcss-nested would infer a
       descendant without it: an unprefixed nested selector reads as a new
       root, and a root that is not the modal block is exactly the third
       prefix this file has one rule against. */
.modal--style-1 .field {
      margin-top: 15px;
      display: flex;
      align-items: center;
    }
.modal--style-1 .field__label {
        font-size: 10px;
        min-width: 36px;
      }
.modal--style-1 .field__input {
        margin: 0;
        padding: 10px 15px;
        font-size: 10px;
        margin-left: 5px;
      }
.modal--style-1 .modal__button {
        margin: 30px auto 0;
      }
.modal--create-hub {
    width: 1065px;
    overflow: auto;
  }
@media (max-width: 1100px) {
.modal--create-hub {
      width: calc(100% - 100px)
  }
    }
.modal--create-hub .modal__title {
      margin-bottom: 0;
    }
.modal--create-hub .modal__content .modal__button {
        min-width: 200px;
      }
.modal--create-hub .modal__content .field {
        margin-top: 0;
      }
.modal--already-exist .modal__title {
      margin-bottom: 0;
    }
/* Full-bleed: the forced password change, the 2FA block. It fills the
     backdrop rather than measuring the viewport itself — the backdrop is the
     one thing that knows how tall the screen really is, and the inset it now
     carries is exactly what this variant does not want. */
.modal--blocked {
    height: 100%;
    width: 100%;
    max-height: 100%;
    overflow: auto;
    border: none;
    border-radius: 0;
  }
.modal--align-center {
    display: flex;
    align-items: center;
    justify-content: center;
  }
.modal--subscriptions {
    height: 100vh;
    max-height: 100vh;
    width: 100vw;
    max-width: 100vw;
  }
.modal--subscriptions .modal__title {
      margin-bottom: 10px;
    }
/* The share dialog was the one place the flex-column-with-a-scrolling-body
   arrangement existed: it was written here, for this dialog, because it was the
   dialog where the footer visibly fell off the bottom of the screen. It is the
   shell's own behaviour now — see the contract at the top of this file — so the
   special case is gone. What it proved is worth keeping: both overlays that
   open from inside the body escape the scroll container on their own, so
   scrolling the body does not re-clip them. The permission selects render into
   `#ember-basic-dropdown-wormhole`, and the xdsoft datepicker positions itself
   against the page. Verified at a 560px-tall viewport, the height at which the
   footer used to disappear. */
/* Tighten the stack below the recipient list. `.modal .modal__content .field { margin-top: 25px }`
   spaces every field in every modal the same, which put 25px between each of expiry, notes and the two
   checkboxes — 60px of air in the one dialog that has none to spare. (The checkboxes even ask for 10px
   with an `m-t-10` in the template and have never got it: a bare utility class loses to that selector.)

   Everything except the users field, which is the anchor at the top of the stack and is the only one
   carrying `field--style-2`. Done here rather than in the markup because expiry and notes are
   `Modal::ShareDocs::{ExpiryDate,DocNotes}`, shared with the approval-request modal, which is not
   short of room and is not what we are fixing. */
/* A deliberate width, because it did not have one. `.modal` sets a 560px floor
   and no ceiling, so this dialog was sized by whatever its widest line happened
   to be — and the widest line is the oversight banner, a single sentence that
   only appears for a tenancy with central-access accounts. So the same dialog
   was 573px for most tenancies and 827px for those, and every row inside it had
   250px more or less to work with depending on a setting that has nothing to do
   with layout.

   720px holds a recipient row — address, badge, user-type select, permission
   select — on one line without the banner having to be there to make room, and
   the banner wraps to two lines inside it, which it should have been allowed to
   do all along. */
.modal--share-docs {
  width: 720px;
  max-width: 100%;
}
.modal--share-docs .modal__content .field:not(.field--style-2) {
  margin-top: 10px;
}
/* ---------------------------------------------------------------------------
   THE SPECIFICITY RULE

   Every rule below begins with the same prefix, character for character:

       .modal

   so there are exactly two tiers — root and root-plus-one-class — and source
   order is the only tiebreak. Nothing here may introduce a third prefix. An
   earlier pass had four prefixes and nine tiers, and four separate fixes were
   silently outranked by earlier rules written in the same file. That is the one
   failure this convention exists to prevent.

   A deliberate variant appends ONE `:not()`/`:has()` to the shared prefix, so
   it sits exactly one step above the base it overrides — never more.
   --------------------------------------------------------------------------- */
/* The gutter belongs to the body and the footer. Everything else at the top
   level — title, subtitles, a header row — predates them and has none of its
   own, so it gets the gutter here rather than each element carrying a copy.
   On the children, not on `.modal`, because a shell with horizontal padding
   cannot have a flush footer or a body whose scrollbar sits at its edge. */
.modal > *:not(.modal__content):not(.modal__footer) {
  box-sizing: border-box;
  padding-left: var(--r-gutter);
  padding-right: var(--r-gutter);
}
/* Status banners. `colour-bg-*` is how the app marks one, and they arrived in
   four different shapes — full-bleed, inset, square-cornered, centred. */
.modal [class*="colour-bg-"] {
  width: 100%;
  max-width: none;
  margin-top: 16px;
  margin-bottom: 16px;
  padding: 12px 14px;
  border: 0;
  border-radius: var(--r-r-ctl);
  font-size: 12.5px;
  font-weight: 500;
  text-align: left;
}
/* The Data Expiration banner has its own class and its own radius. */
.modal .data-expiration__banner {
  margin-top: 16px;
  margin-bottom: 16px;
  padding: 12px 14px;
  border-radius: var(--r-r-ctl);
  font-size: 12.5px;
}
/* Body children that shrink-wrap instead of filling: the submission note came
   out 256px wide where every sibling was 304. */
.modal .modal__content > .font-0,
.modal .modal__content > [class*="colour-fg-muted"],
.modal .modal__content > div:not([class]) {
  display: block;
  width: 100%;
  max-width: none;
  box-sizing: border-box;
}
/* ---- Deliberate variants: exactly one qualifier above the base ---- */
/* A dialog with no title — the close control shares the row with the first
   piece of content, so the header rule would cut through it.

   An EMPTY title element counts as no title. `modal-prompt` renders
   `<div class="modal__title">{{this.title}}</div>` whether or not a title was
   passed, so "New file" produced an empty 25px div, then the body's margin and
   its header rule: a rule and 42px of nothing between the close control and the
   first line of copy. `:empty` matches because Glimmer leaves no comment node. */
.modal:not(:has(.modal__title)) .modal__close,
.modal:has(.modal__title:empty) .modal__close {
  top: 16px;
  right: 16px;
}
.modal:has(.modal__title:empty) .modal__title {
  display: none;
}
.modal:not(:has(.modal__title)) .modal__content,
.modal:has(.modal__title:empty) .modal__content {
  margin-top: 0;
  padding-top: 26px;
  border-top: 0;
}
/* The shell clips, so an in-place menu opened inside the body needs the shell
   unclipped too, not just the body. */
.modal:has(.modal__content .ember-basic-dropdown-content) {
  overflow: visible;
}
/* ---- Shared blocks that need dialog-specific treatment --------------------
   These blocks appear both inside and outside dialogs, and what they should
   look like differs. Scoped, so the page keeps its own version. */
/* Option lists — join with audio/video, recording resolution. The row is
   `display: table-row`, which IGNORES padding: it has to go on the cells. */
.modal .valut-table { border: 0; }
.modal .valut-table__item { border-bottom: 0; }
/* The cell carries a top AND a bottom border of its own, which in a dialog
   draws a rule under the last row with nothing beneath it — a line floating
   under the final button. The separation between rows is the next rule's job;
   the cell brings none of its own. */
.modal .valut-table__item > .valut-table__cell { padding: 9px 0; border: 0; }
.modal .valut-table__item > .valut-table__cell:first-child { padding-right: 10px; }
.modal .valut-table__item + .valut-table__item > .valut-table__cell { border-top: 1px solid var(--r-div); }
/* The audit-log dialog is the only modal using `.tabs`: 14px uppercase labels
   on a #4e4e4e slab with a 2px divider drawn between items. */
.modal .tabs {
  gap: 6px;
  border: 0;
  align-items: stretch;
}
.modal .tabs__item {
  padding: 9px 13px;
  border: 0;
  border-radius: var(--r-r-ctl);
  background: transparent;
  color: var(--r-grey);
  text-align: left;
  text-transform: none;
  opacity: 1;
}
.modal .tabs__item:hover { background: var(--r-hover); color: var(--r-navy); }
.modal .tabs__item + .tabs__item::after { display: none; }
.modal .tabs__item--active { background: var(--r-tint); color: var(--r-brand); }
.modal .tabs__item-title {
  margin-bottom: 2px;
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}
.modal .tabs__item-subtitle {
  font-size: 11px;
  font-weight: 400;
  line-height: 1.35;
  color: var(--r-muted);
}
.modal .tabs__item--active .tabs__item-title { color: var(--r-brand); }
.modal .tabs__item--active .tabs__item-subtitle { color: #6d90dd; }
/* A tab strip with ONE tab is not a tab strip. The log-details dialog has a
   single "Log Details / View detailed information" item, and the audit dialog
   shows one when a file has no version history — a selected-looking card that
   cannot be switched, restating the title above it, drawn more prominently than
   the data it sits over. With one item it is a heading, so it is drawn as one. */
.modal .tabs:not(:has(.tabs__item ~ .tabs__item)) .tabs__item,
.modal .tabs:not(:has(.tabs__item ~ .tabs__item)) .tabs__item--active {
  padding: 0;
  border-radius: 0;
  background: transparent;
}
.modal .tabs:not(:has(.tabs__item ~ .tabs__item)) .tabs__item-title {
  font-size: 13px;
  font-weight: 600;
  color: var(--r-navy);
}
.modal .tabs:not(:has(.tabs__item ~ .tabs__item)) .tabs__item-subtitle {
  color: var(--r-muted);
}
/* The recording player's <video> has no source until a file is chosen, only a
   wide, short logo as its poster — sized to that, it was a 558x88 letterbox. */
.modal video {
  width: 100%;
  max-width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
  object-fit: contain;
  border-radius: var(--r-r-ctl);
  background: #0f1424;
}
/* Ember leaves zero-width placeholder nodes between dropdown triggers, and the
   labels list used to space children with margins — they stacked into phantom
   gaps. It is a gapped flex row now; this keeps the dialog's copy in step. */
.modal .labels-list { display: flex; flex-wrap: wrap; gap: 6px; }
.modal .labels-list > * { margin: 0; }
/* The bordered list box shared by Hub Memberships and Manage Status Tags. */
.modal .statustags__container {
  padding: 2px;
  border: 1px solid var(--r-edge);
  border-radius: var(--r-r-inner);
  background: #fff;
}
.modal .statustags__item {
  gap: 10px;
  padding: 7px 10px;
  border: 0;
}
.modal .statustags__item + .statustags__item { border-top: 1px solid var(--r-div-2); }
/* The role selects in Hub Memberships. A design-system <Button @dropdownTrigger>
   sits INSIDE the trigger, so the box was drawn twice — the trigger's border
   plus `.btn-outlined`'s own border and hover background, which is the "blue
   ring" — and its padding held the caret 20px off the right edge. `.btn` is
   neutralised only here, where it is a select face rather than a button. Equal
   width comes from the trigger: the template asks for it with `min-w-170px`, a
   class that has no CSS anywhere in the app. */
.modal .statustags__item .ember-basic-dropdown-trigger:not(:has(> svg)) {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  width: 190px;
  flex: 0 0 190px;
  min-height: 32px;
  padding: 5px 10px;
  border: 1px solid var(--r-ctl);
  border-radius: var(--r-r-ctl);
  background: #fff;
  font-size: 12.5px;
  font-weight: 600;
  color: #3a4763;
}
.modal .statustags__item .ember-basic-dropdown-trigger:not(:has(> svg)):hover {
  border-color: var(--r-ctl-hi);
  background: var(--r-hover);
  box-shadow: none;
}
.modal .statustags__item .ember-basic-dropdown-trigger > div,
.modal .statustags__item .ember-basic-dropdown-trigger .btn {
  width: 100%;
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
}
.modal .statustags__item .ember-basic-dropdown-trigger .text-ellipsis { flex: 1 1 auto; }
.modal .statustags__item .ember-basic-dropdown-trigger .ml-auto { margin-left: auto; }
/* Row icon buttons — reorder, settings, delete. `:has(> svg)` is a DIRECT
   child: with a descendant `:has(svg)` this also matched the membership selects
   above and stripped their borders. */
.modal .statustags__item .ember-basic-dropdown-trigger:has(> svg),
.modal .statustags__item .cursor-pointer {
  width: auto;
  flex: none;
  padding: 5px;
  border: 0;
  border-radius: var(--r-r-ctl);
  background: transparent;
}
.modal .statustags__item .ember-basic-dropdown-trigger:has(> svg):hover {
  background: var(--r-hover);
  color: var(--r-brand);
}
/* Memberships filter tabs. The track is `--r-fill`, so an `--r-tint` active
   pill was light blue on light grey, and the count pill on the INACTIVE tabs
   was the same colour as the track — an invisible square. Inverted. */
.modal .memberships__tabs { gap: 6px; }
.modal .memberships__tab {
  padding: 7px 12px;
  border-radius: var(--r-r-ctl);
  font-size: 12.5px;
  font-weight: 600;
  color: var(--r-grey);
}
.modal .memberships__tab--active {
  background: #fff;
  color: var(--r-brand);
  box-shadow: 0 1px 2px rgba(8, 12, 35, .10);
}
.modal .memberships__tab-count {
  padding: 1px 6px;
  border-radius: var(--r-r-pill);
  background: #fff;
  font-size: 10.5px;
  font-weight: 700;
  color: var(--r-grey);
  box-shadow: inset 0 0 0 1px var(--r-edge);
}
.modal .memberships__tab--active .memberships__tab-count {
  background: var(--r-tint);
  color: var(--r-brand);
  box-shadow: none;
}
/* The share dialog's recipient list is the only scroll region inside the body.
   The app capped it with `calc(100vh - 500px)` against about 325px of real
   chrome — at 768px tall that scrolled Save/Cancel and the oversight disclosure
   out of view. The body is the scroll region now, so this just takes the slack. */
.modal .users-list--sharing {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;
  margin: 4px 0 14px;
  overflow-y: auto;
  border: 0;
  border-top: 1px solid var(--r-div);
  border-bottom: 1px solid var(--r-div);
}
.modal .users-list__item {
  align-items: center;
  margin-bottom: 0;
  padding: 5px 0;
}
.modal .user-info__img {
  width: 26px;
  height: 26px;
  border-radius: var(--r-r-ctl);
  overflow: hidden;
  background: var(--r-tint);
}
.modal .user-info__content { display: flex; flex-direction: column; gap: 0; }
/* A recipient who is not in this Hub yet carries a user-type select as well as
   an address and a badge. On a desktop all three sit on one line, and stacking
   them made a new recipient twice the height of every other row for no reason.
   Written here rather than in the user-info block because the rule above sets
   `column` at the same weight and would otherwise win. */
.modal .user-info__content:has(.permissions__block) {
  flex-direction: row;
  align-items: center;
  gap: 10px;
}
/* "The dialog is 720px, there is room" is what this used to say, and it was
   wrong by 34px. Measured 13.09.2026: the row wants 704px — 210px of address
   cap, a `New` badge, and TWO selects held open at `min-width: 180px` — inside
   a 670px list. The 34px did not just hang over the edge either: the list
   carries `overflow-y: auto`, and a box with one axis scrollable computes the
   other from `visible` to `auto`, so the overshoot fitted the whole dialog with
   a horizontal scrollbar for the sake of one address.

   A flex item's automatic minimum is its own content, so `min-width: 0` on
   EVERY box between the row and the text is what lets the address ellipsise
   instead — the same chain the phone block below already relies on, and for the
   same reason. It only gives when it has to: with room to spare nothing is
   trimmed. The selects keep their own `min-width`, so the address is what
   yields, and the whole of it stays on the row's `title`. */
.modal .users-list__item > .user-details__main,
.modal .users-list__item .user-info,
.modal .users-list__item .user-info__content {
  min-width: 0;
}
.modal .user-info__name {
  font-size: 12.5px;
  font-weight: 600;
  line-height: 1.35;
  color: var(--r-navy);
}
.modal .user-info__dscr {
  font-size: 11px;
  line-height: 1.3;
  color: var(--r-muted);
}
.modal .user-details__main,
.modal .user-details__person { align-items: center; }
/* The badge and the select in a recipient row share one baseline. */
.modal .users-list__item .label,
.modal .users-list__item .selectbox__head,
.modal .users-list__item .permissions__head--new {
  align-self: center;
  margin-top: 0;
  margin-bottom: 0;
}
/* ---- Phone: one scroll region per dialog --------------------------------- */
/* The contract says the body is the dialog's single scroll region, and on a
   desktop that is very nearly true — but three blocks that appear inside a body
   bring their own `overflow`, so a dialog can end up with two. The Hub
   Memberships list is capped at 400px, the share dialog's recipients at
   `calc(100vh - 500px)`, the folder picker at 264px.

   With a mouse that is survivable: both scrollbars are visible and you can aim
   at one. Under a thumb it is not. A swipe lands on the inner list, the list
   scrolls, the dialog stays exactly where it was, and the content below the
   list — including whatever the footer is asking you to confirm — never comes
   up. The dialog reads as stuck.

   So on a phone the inner caps come off and the body does all of it, which is
   what the contract said in the first place. */
@media only screen and (max-device-width: 640px) {
  .modal .statustags__container,
  .modal .users-list--sharing,
  .modal .structure {
    flex: none;
    min-height: 0;
    max-height: none;
    overflow: visible;
  }
}
/* A recipient row is [person][role select], and it stays one line on a phone —
   a row that wraps turns six recipients into twelve lines and pushes the
   disclosure and the footer off the bottom.

   It fits by making the select narrower rather than by letting it hang off the
   edge, which is what it did before: the select was a fixed 170px and the
   person sized to their address, so a long address pushed the select past the
   dialog. Now the select is fixed and small, and the person takes what is left
   and ellipsises — `min-width: 0` is what allows that, since a flex item's
   automatic minimum is its content and without it the row cannot shrink at
   all. The name stays whole; the address is the part that gives. */
@media only screen and (max-device-width: 640px) {
  /* On a phone there is no such room: 128px of select plus an address plus a
     badge does not fit beside a 122px permission select, so it goes back under
     them. */
  .modal .user-info__content:has(.permissions__block) {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
  }

  .modal .users-list__item > .user-details__main {
    flex: 1 1 auto;
    min-width: 0;
  }

  /* `min-width` on EVERY box between the row and the text, not just the ends.
     A flex item's automatic minimum is its own content, so one link in the
     chain left at `auto` holds the whole thing open and the ellipsis never
     engages — the address just runs on underneath the select. */
  .modal .users-list__item .user-info,
  .modal .users-list__item .user-info__content {
    min-width: 0;
  }

  .modal .users-list__item .user-info__name,
  .modal .users-list__item .user-info__dscr {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  /* The name and address carry a fixed cap — `--240` is 210px — which is wider
     than the room left beside a select on a phone. Fixed caps cannot shrink, so
     the text kept its 210px and overlapped rather than ellipsising. The row is
     flexible now; the cap is what the flex chain is for. */
  .modal .users-list__item .user-info__name--150,
  .modal .users-list__item .user-info__name--175,
  .modal .users-list__item .user-info__name--240 {
    max-width: none;
  }

  /* The permission select only — `>` matters. Without it this also caught the
     user-type select nested inside the row, pinning a second control to a width
     chosen for the first, and at (0,3,0) it outranked anything that tried to
     give that one the room its longest option needs. One rule per control. */
  .modal .users-list__item > .selectbox,
  .modal .users-list__item > .selectbox .selectbox__head {
    flex: 0 0 auto;
    width: 122px;
    min-width: 0;
  }
}
/* What the FILES say about their own classification, under the field that asks it — the classic-hub
 * counterpart of `.fusion-attr-sheet__label` in design-system/components/fusion-filters.css.
 *
 * SHARED, and named neutrally so it can be. It started as its own block to avoid a classic modal
 * borrowing `fusion-*`, and the fusion sheet then borrowed THIS — it draws the whole `classification-list`
 * from here — so the dependency the split was avoiding exists, in the other direction. Its own
 * `&__label-mark` was a byte-identical copy of `__mark` below and is gone: two copies meant fixing the
 * dark-theme bug in that rule twice, and one of the two would have been missed.
 *
 * Quiet on purpose. It is a fact offered, not an answer given, and it sits directly beneath a control the
 * person still owns — at field weight it would read as the value, which is exactly the confusion worth
 * avoiding when the subject is a security marking. */
.classification-hint {
  margin: var(--spacer-1, 4px) 0 0;
  font-size: var(--font-size-0, 12px);
  line-height: 1.5;
  color: var(--colour-fg-subtle, #6b7280);
}
/* The marking itself, set into the sentence. A tinted chip rather than a colour of its own: a
 * classification rendered in the palette's danger red would be this app asserting a severity on behalf of
 * a taxonomy that is not ours to read.
 *
 * 3px of side padding, not the 5 a chip would normally take — a comma or a full stop follows this
 * immediately in every one of these sentences, and at 5px the punctuation floats away from the word it
 * belongs to: "OFFICIAL SENSITIVE , which is". */
.classification-hint__mark {
  display: inline-block;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--colour-fg-default, #111827);
  padding: 0 3px;
  border-radius: 3px;
  /* A translucent neutral rather than `--colour-bg-subtle`, and the difference is the whole rule.
   * `dark.css` overrides component tokens only, never the base palette, so that token stays a LIGHT
   * #ebebeb in dark mode — under a `--colour-fg-default` that DOES move, to near-white, the marking
   * painted itself out. The same value and the same reasoning as `.statustags__item--standing`, which
   * had exactly this bug: grey at 8% darkens a light surface and lightens a dark one, so one
   * declaration is right in both themes and light mode is unchanged. */
  background: rgba(128, 128, 128, 0.08);
}
/* The trigger showing "Mixed – each file keeps its own" or "Choose one". Not a value, so it must not be
   set like one — the same weight the control uses for genuine emptiness. */
.classification-hint__placeholder {
  color: var(--colour-fg-subtle, #6b7280);
}
.classification-hint__required {
  color: var(--colour-fg-danger, #dc2626);
  margin-left: 2px;
}
/* Recovering the field after an override. A button because it acts, styled as the link it reads as. */
.classification-hint__clear {
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  /* The app's link colour, which is theme-swapped for contrast — it leaves #2f6fed for the cyan on
   * dark, where that blue measures 3.0:1 and fails. `--colour-fg-link` was the token this reached for
   * first and it is declared nowhere, so the hard-coded fallback was the only thing ever painted. */
  color: var(--field-link);
  cursor: pointer;
  text-decoration: underline;
}
/* The second question, spaced off the first so the two do not read as one field with two controls. */
.classification-hint__remainder {
  margin-top: var(--spacer-2, 8px);
}
/* The classification prompt, once it carries prose as well as a control.
 *
 * Two overrides, both scoped to this dialog so nothing else moves. `.modal` declares only `min-width:
 * 560px`, so every dialog shrink-wraps its widest child — which was fine while this one held a label and
 * a select, and stretched it to 1162px on a 1539px window once a summary sentence went in. A fixed width
 * gives the sentence a readable measure; 560px is the shell's own minimum and the width the fusion
 * attribute sheet settled on for the same reason.
 *
 * And `.modal__select` centres the control at a fixed 200px (see `&__select` above). That is right for a
 * dialog whose only content IS the select — it was the original shape of this one — but here there is a
 * label above and a sentence below, both full width, and a centred 200px control lines up with neither.
 * The 30px top margin belongs to that centred layout too: under a label of its own it reads as a gap
 * where something is missing. */
.modal--select-attributes {
  width: 560px;
}
@media (max-width: 600px) {
.modal--select-attributes {
    width: 100%
}
  }
.modal--select-attributes .modal__select {
    width: 100%;
    margin: var(--spacer-1, 4px) 0 0;
  }
/* `_pages/authenticated.css` caps EVERY dropdown trigger in the app at `max-width: 200px`, with no
     stated reason. Widening the wrapper alone therefore did nothing visible: the wrapper went to 510px
     and the control stayed at 200, which is why "Mixed – using each file's embedded marking" wrapped onto
     two lines inside a box with 300px of empty room beside it. Overridden here rather than there — that cap
     is load-bearing for menus elsewhere in the app and is not this feature's to lift. */
.modal--select-attributes .modal__select .selectbox__head {
    width: 100%;
    max-width: 100%;
  }
/* The markings the upload carries, one row per group of files.
 *
 * This was a sentence, and the sentence was the problem: "these files carry more than one Purview marking
 * — OFFICIAL SENSITIVE x6, OFFICIAL x1, PROTECTED x1" reads as one clause per group, so answering "what
 * happens to what" meant parsing all of it. As rows the count and the outcome line up in two columns and
 * the eye can run down either one.
 *
 * Every file appears in exactly one row — matched markings, then markings this Hub has no option for,
 * then the genuinely unmarked — so the counts visibly add up to the total the sentence below states. */
.classification-list {
  list-style: none;
  margin: var(--spacer-2, 8px) 0 0;
  padding: 0;
  font-size: var(--font-size-0, 12px);
  line-height: 1.5;
  border: 1px solid var(--r-edge, rgba(0, 0, 0, 0.1));
  border-radius: var(--r-r-ctl, 4px);
  overflow: hidden;
}
.classification-list__row {
  display: flex;
  align-items: baseline;
  gap: var(--spacer-2, 8px);
  padding: 6px 10px;
}
/* A rule between rows rather than around each: the group is one object. */
.classification-list__row + .classification-list__row {
    border-top: 1px solid var(--r-edge, rgba(0, 0, 0, 0.08));
  }
/* Fixed width and right-aligned so the numbers form a column that can be read down without the eye
   tracking left and right around names of different lengths. */
.classification-list__count {
  flex: 0 0 auto;
  width: 56px;
  text-align: right;
  color: var(--colour-fg-subtle, #6b7280);
  font-variant-numeric: tabular-nums;
}
.classification-list__what {
  flex: 1 1 auto;
  min-width: 0;
}
/* The Purview spelling, when it differs from the Hub's. Secondary to the marking it explains — it is
   provenance, not the answer. */
.classification-list__found {
  color: var(--colour-fg-subtle, #6b7280);
}
/* A row that has no classification yet. Not a warning: the control below is where it gets one, and this
   is simply the count of files waiting on it. */
.classification-list__none {
  color: var(--colour-fg-subtle, #6b7280);
  font-style: italic;
}
/* A row whose marking is above anything this Hub holds. Unlike `__none` this IS a warning — the file is
   skipped — so it takes the alert's colour and weight, tying the row to the box above the field. */
.classification-list__out-of-list {
  color: var(--r-crit-fg, #b42318);
  font-weight: 600;
}
/* A row whose classification is in another marking scheme: uploaded, with the classification chosen below.
   Amber like the notice it belongs to — something to answer, not something refused. */
.classification-list__foreign {
  color: var(--r-warn-fg, #b45309);
  font-weight: 600;
}
/* Files whose detected classification is in another marking scheme (modal/select-attributes) — OFFICIAL into an
   export control Hub. The quieter sibling of `.classification-alert`: same shape, amber, thinner edge, because
   nothing is refused; the files go up with the classification chosen below. */
.classification-notice {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  margin-bottom: var(--spacer-3, 16px);
  padding: 12px 16px;
  border: 1px solid #f3c56b;
  border-left: 4px solid var(--r-warn-fg, #b45309);
  border-radius: var(--r-r-ctl, 6px);
  background: var(--r-warn-bg, #fef3c7);
  color: var(--r-warn-fg, #b45309);
  text-align: left;
}
.classification-notice__title {
  font-size: 14px;
  font-weight: 700;
  line-height: 1.35;
  color: #92400e;
}
.classification-notice__body {
  margin: 4px 0 0;
  font-size: 13px;
  line-height: 1.45;
  color: #78350f;
}
/* Files marked above anything this Hub holds, which are skipped (modal/select-attributes). The loudest thing in
   the dialog on purpose: it sits above the question because it changes how the question should be answered,
   and a quiet row was how a PROTECTED file got answered OFFICIAL. */
.classification-alert {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  margin-bottom: var(--spacer-3, 16px);
  padding: 14px 16px;
  border: 1px solid var(--r-crit-fg, #b42318);
  border-left-width: 5px;
  border-radius: var(--r-r-ctl, 6px);
  background: var(--r-crit-bg, #fdecea);
  color: var(--r-crit-fg, #b42318);
  text-align: left;
}
.classification-alert__icon {
  flex: 0 0 auto;
  fill: currentColor;
  margin-top: 1px;
}
.classification-alert__title {
  font-size: 15px;
  font-weight: 700;
  line-height: 1.35;
}
.classification-alert__body {
  margin: 6px 0 0;
  font-size: 13px;
  line-height: 1.45;
  color: #7a1a12;
}
/* A dialog's footnote: why what you are about to do will take a while.
 *
 * INSET with a radius rather than run full-bleed across the body — the footer is the only full-bleed
 * block in these dialogs, and a coloured band inside the body reads as a section boundary rather than as
 * a remark about the content above it.
 *
 * Quiet rather than a warning colour, on purpose. This is not a warning: the dialog above it already
 * carries the consequence, and colouring an explanation of TIMING like a hazard would compete with the
 * part that says what is about to be deleted.
 *
 * `--r-hover` is the SURFACE and `--r-grey` the text, and both names are load-bearing. `--r-faint` reads
 * like a background and is not one — it is `#9aa6b8`, a mid grey-blue meant for text and borders, and a
 * note set on it measured 2.02:1, which is a footnote nobody can read. This pair measures 5.46:1. */
.modal__note {
  padding: 10px 12px;
  border-radius: var(--r-r-inner);
  background: var(--r-hover);
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--r-grey);
}
/* A footer's own progress line — how far a long job has got, beside the button that started it.
 *
 * In the footer rather than in the button's label because a disabled button is not a readable surface:
 * `button--style-2` disabled measures 2.18:1 and then has `opacity: .5` applied over that, so a count put
 * in the label is present and unreadable. Here it is body colour on the footer's own ground.
 *
 * `margin-right: auto` is what puts it at the left: `.modal__footer` is already a flex row ending at
 * `flex-end`, so one auto margin pushes the buttons away without the footer needing a different layout
 * for the one dialog that has this. Tabular figures so a climbing count does not jiggle the line. */
.modal__progress {
  margin-right: auto;
  /* The name in this line is a file name, which has no spaces to break at, so a long one is a single
     unbreakable token — and this sits in a flex row whose other child is a button. `min-width: 0` is what
     lets it shrink at all; without it a flex item's automatic minimum size is its content, and one long
     name would push the button off the footer's right edge. Wrapped rather than ellipsed, per the rule
     that nothing in these dialogs is truncated.

     `max-width` is what stops the DIALOG resizing, and it is the part that is easy to leave out. `.modal`
     is a flex column with a 560px floor and no ceiling, so it sizes to its widest child: an unwrapped
     62-character name in this footer grew it to 647px — measured — and since the name changes with every
     item, the dialog would jump wider and narrower on each one. `min-width: 0` does not prevent that; it
     governs shrinking under pressure, not the max-content width the container sizes itself to, and
     `flex: 1 1 0` does not prevent it either. A ceiling does. 320px leaves a 560px dialog its gutters,
     the button and the gap with room to spare, and a name past it wraps to a second line — which costs
     3px of footer height, against 87px of dialog width. */
  min-width: 0;
  max-width: 320px;
  overflow-wrap: anywhere;
  font-size: 12.5px;
  line-height: 1.4;
  color: var(--r-grey);
  font-variant-numeric: tabular-nums;
}
/* The count, secondary to the name it follows — it says how far through a multi-item job this is, where
   the name says what is happening right now. Only rendered when there is more than one item.

   Secondary by one step, not by disappearing: `--r-muted` against the name's `--r-grey` is 4.85:1 and
   5.66:1 on the footer's `--r-head`, so both clear 4.5:1 and the hierarchy is still visible. This was
   `--r-ctl` — which is the CONTROL BORDER colour, `#cdd5e2`, and measured 1.44:1 here. The palette has
   several names that read like quiet greys and are actually borders (`--r-ctl`) or mid-tone text
   (`--r-faint`, `#9aa6b8`); check one against its background before using it as either ink or a surface.

   And do not let `var(--name, #fallback)` stand in for that check. `--colour-fg-subtle` resolves to
   `#9b9b9b` — 2.71:1 — so four rules written as `var(--colour-fg-subtle, #6b7280)` were failing while
   LOOKING careful: the fallback reads like a safety net and is dead code the moment the variable exists,
   which it does. Secondary text in these dialogs is `--r-muted`. */
.modal__progress-count {
  margin-left: 8px;
  color: var(--r-muted);
}
/* The sharing dialog's progress, in place of the bare "Processing file: …" line it used to show.
 *
 * A bar per GROUP — one folder's direct children, or the selection itself — because that is the only
 * total that exists while a share runs: a folder's contents are discovered by querying for them, and a
 * folder can hold folders, so the tree is walked by the very loop whose length a whole-share bar would
 * have to state. See `shareProgress` in share-docs/component.js. */
.share-progress {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-1, 4px);
  width: 100%;
  padding: 16px 0;
}
.share-progress__row {
  display: flex;
  align-items: center;
  gap: var(--spacer-2, 8px);
}
.share-progress__label {
  min-width: 0;
  font-weight: 600;
  color: var(--r-navy, #0f1a34);
}
/* Tabular figures so the count does not jiggle the row as it climbs through the tens and hundreds. */
.share-progress__count {
  flex: 0 0 auto;
  font-variant-numeric: tabular-nums;
  color: var(--r-muted);
}
/* Reserves its line whether or not a name is in it, so the bar does not hop when one arrives. */
.share-progress__file {
  min-height: 1.4em;
  font-size: var(--font-size-0, 12px);
  line-height: 1.4;
}
.share-progress__note {
  font-size: var(--font-size-0, 12px);
  line-height: 1.5;
  color: var(--r-muted);
}
.shared-list__item {
    margin-top: 5px;
    font-weight: 500;
    pointer-events: none;
  }
.shared-list__item:before {
      content: '\e906';
      margin-right: 10px;
      font-family: icomoon;
      font-size: 10px;
      color: #5ac1ee;
      pointer-events: auto;
      cursor: pointer;
    }
.setting__form {
		position: relative;
		max-width: 900px;
		height: 100%;
	}
.setting__form-line {
			width: 100%;
			display: flex;
			flex-wrap: wrap;
			align-items: center;
		}
.setting__form-line .field {
				margin-bottom: 0!important;
				margin-right: 30px;
			}
.setting__form-line:not(:last-child) {
				margin-bottom: 24px;
			}
.setting__form-line .button {
				text-transform: uppercase !important;
			}
.setting__form-line .button--link-action {
					text-transform: none !important;
				}
.setting__form-title {
			position: relative;
			display: block;
			/* color: #0f1a34; */
			text-align: left;
			font-size: 14px;
			line-height: 1.21;
			font-weight: 500;
			margin-bottom: 14px;
			min-height: 16px;
		}
.setting__form-description {
			font-size: 14px;
			line-height: 18px;
			/* color: #707070; */
			letter-spacing: 0;
			margin-bottom: 16px;
			max-width: 400px;
		}
.setting__form-description--about span {
					display: block;
					width: 100%;
					text-align: left;
				}
.setting__form-description--hub {
				font-style: italic;
				color: var(--black);
			}
.setting__form-group {
			max-width: 450px;
			position: relative;
			display: block;
		}
.setting__form-group:not(:last-child) {
				margin-bottom: 30px;
			}
.setting__form-group--auto {
				max-width: 100%;
			}
.setting__form-group .setting__form-buttons {
				padding-right: 0;
			}
.setting__form .field {
			width: 100%;
			max-width: 225px;
			position: relative;
			display: inline-block;
		}
.setting__form .field--map {
				max-width: 450px;
			}
.setting__form .field--map .selectbox {
					max-width: 220px;
					z-index: 1;
				}
.setting__form .field--hub {
				max-width: 550px;
			}
.setting__form .field--branding {
				max-width: 100%;
			}
.setting__form .field--branding .field__input--italic {
					font-size: 11px;
					font-size: 12px;
					min-height: 230px;
				}
@media (max-width: 991px) {
.setting__form .field--branding .field__input--italic {
						min-height: 50px
				}
					}
.setting__form .field:not(:last-child) {
				margin-bottom: 15px;
			}
.setting__form .field__label {
				cursor: pointer;
			}
.setting__form .field__label--file {
					width: 78px;
				}
.setting__form .field__input--italic{
					font-style: italic;
				}
.setting__form .field__input--italic[type="email"] {
						background-color: var(--gray);
						color: var(--white);
					}
.setting__form .field__input--textarea {
					color: #C7C7C7;
				}
.setting__form .field__input:not(:last-child) {
					margin-bottom: 15px;
				}
.setting__form .field__with-icon .icon {
					display: flex;
					-ms-align-items: center;
					align-items: center;
					justify-content: center;
					right: 10px;
					font-size: 20px;
					width: 18px;
					height: 18px;
				}
.setting__form .field__with-icon .icon .icon-visibility {
						font-size: 16px;
					}
.setting__form .field__painting {
				max-width: 450px;
			}
.setting__form .field__painting-actions {
					margin: 15px 0;
					position: relative;
					display: flex;
					align-items: center;
					justify-content: flex-start;
				}
.setting__form .field__painting-actions .actions__button {
							width: 24px;
							height: 24px;
							position: relative;
							display: inline-flex;
							align-items: center;
							align-content: center;
							justify-content: center;
							border: 1px solid #C7C7C7;
							border-radius: 2px;
							color: #0F1A34;
							padding: 0;
						}
.setting__form .field__painting-actions .actions__button i {
								width: 18px;
								font-size: 12px;
							}
.setting__form .field__painting-actions .actions__button i.icon-redo {
									font-size: 6px;
								}
.setting__form .field__painting-actions .actions__button--active {
								border-color: #0F1A34;
							}
.setting__form .field__painting-actions .actions__button:not(:last-child) {
								margin-right: 8px;
							}
.setting__form .field__painting-wrap {
					width: 100%;
					position: relative;
					display: flex;
					align-items: center;
					justify-content: center;
					align-content: center;
					height: 235px;
					border-radius: 4px;
					border: 1px solid #000;
					overflow: hidden;
					background-color: #fff;
				}
.setting__form .field__painting-wrap img {
						position: relative;
						z-index: 1;
						height: 100%;
						max-height: 140px;
						width: auto;
						display: none;
					}
.setting__form .field__painting-wrap--filled img {
							display: block;
						}
.setting__form .field__painting-wrap--empty img {
							display: none;
						}
.setting__form .field__painting-wrap--empty .field__painting-pad {
							display: block;
						}
.setting__form .field__painting-pad {
					position: absolute;
					left: 0;
					top: 0;
					width: 100%;
					height: 100%;
					background-color: #fff;
					display: none;
				}
.setting__form .field__image {
				margin-bottom: 8px;
			}
.setting__form .field.image {
				width: 78px;
			}
.setting__form .field.image .field__file {
					display: none;
				}
.setting__form .map {
			margin: 15px 0;
			position: relative;
			display: block;
			width: 100%;
		}
.setting__form .map figure {
				width: 100%;
				position: relative;
				display: block;
			}
.setting__form .map figure img, .setting__form .map figure svg {
					width: 100%;
					height: auto;
				}
.setting__form--branding {
			display: flex;
			flex-wrap: wrap;
		}
.setting__form--branding .setting__form-groups {
					flex-grow: 1;
					flex-shrink: 0;
					flex-basis: calc(50% - 30px);
					width: 100%;
					padding-right: 30px;
				}
.setting__form--branding .setting__form-groups:last-child .setting__form-group:last-child {
								border: none;
							}
.setting__form--branding .setting__form-groups:last-child .setting__form-buttons:last-child {
							padding-top: 100px;
						}
@media (max-width: 991px) {
.setting__form--branding .setting__form-groups:last-child .setting__form-buttons:last-child {
								padding-top: 40px
						}
							}
.setting__form--branding .setting__form-groups:last-child .setting__form-buttons:last-child .button {
								max-width: 200px!important;
							}
.setting__form--branding .setting__form .field {
					width: auto;
				}
.setting__form--branding .setting__form-group {
					max-width: 300px;
					border-bottom: 0.5px dashed #C7C7C7;
					padding-bottom: 18px;
					margin-bottom: 18px;
				}
.setting__form--branding .selectbox {
				z-index: 1;
				width: 180px;
			}
.setting__form--branding .selectbox__head {
					padding: 14px;
					font-size: 14px;
					font-weight: 500;
					border: 1px solid #4E4E4E;
				}
.setting__form--logs .setting__form-line .field {
					max-width: 175px;
				}
.setting__form--logs .setting__form-line .field__input {
						height: 38px;
						font-size: 10px;
					}
.setting__form--logs .setting__form-line .setting__form-buttons {
					margin-top: 30px;
				}
.setting__form--links {
			max-width: 510px;
		}
.setting__form--links .field {
				max-width: 100%;
			}
.setting__form .checkbox-set__item {
				max-width: 64px;
				margin: 10px;
			}
.setting__form .checkbox-set__dscr {
				color: #000;
			}
.setting__form-select-photo {
			margin: 0;
		}
.wildcard {
	padding: 5px 14px;
  border-radius: 20px;
  color: var(--colour-fg-default);
  background: var(--colour-bg-default);
  border: 1px solid var(--colour-border-default);
  -webkit-user-select: none;
  user-select: none;
  margin-bottom: 5px;
}
.wildcard i {
  	cursor: pointer;
  	color: var(--red);
  	font-size: 12px;
  	margin-right: 5px;
  }
.setting__table {
		width: max-content;
	}
.setting__table-wrap {
			width: 100%;
			height: 100%;
			position: relative;
		}
.setting__table td, .setting__table th {
			height: 48px;
		}
.setting__table-title {
			font-size: 14px;
			line-height: 17px;
			font-weight: 500;
		}
.setting__table-subtitle {
			font-size: 8px;
			line-height: 9px;
			font-weight: normal;
		}
.setting__table thead {
			text-align: left;
			letter-spacing: 0.34px;
			/* color: #0F1A34; */
		}
.setting__table tbody td {
				padding: 0 20px;
				text-align: right;
				background-color: #C5DAEF;
			}
/* color: var(--white); */
.setting__table tbody td:first-child {
					text-align: left;
					background-color: var(--gray);
				}
.setting__table tbody td.setting__table-hubname {
				max-width: 320px;
			}
.setting__table tfoot td {
				padding: 0 20px;
				text-align: right;
				background-color: #4E4E4E;
				color: #fff;
			}
.setting__table tfoot td:first-child {
					text-align: left;
				}
.setting__table--style-1 {
			margin-bottom: 30px;
		}
.setting__table--style-1 th, .setting__table--style-1 td {
				height: auto;
			}
.setting__table--style-1 .user {
				padding: 10px 0;
			}
.setting__table--style-1 .user-img {
					width: 46px;
					height: 46px;
					border: 1px solid #000;
					margin-right: 16px;
				}
.setting__table--style-1 .user-name {
					font-size: 16px;
					font-weight: 500;
					/* color: #000; */
				}
.setting__table--style-1 .user-dscr {
					font-size: 12px;
					font-weight: normal;
					color: var(--secondary-font);
				}
.setting__table--style-1 thead .setting__table-title {
					padding: 20px 20px 20px 0;
					text-align: left;
					font-weight: 500;
					font-size: 14px;
					/* color: #000; */
				}
.setting__table--style-1 thead th {
					border-bottom: 1px dashed #C7C7C7;
					border-collapse:separate;
					border-spacing:5px 5px;
				}
.setting__table--style-1 tbody td {
					padding-left: 0;
					text-align: center;
					background-color: transparent !important;
				}
.setting__table--style-1 tbody .selectbox:hover {
						z-index: 2;
					}
.setting__table--style-2 th, .setting__table--style-2 td {
				padding: 10px 0 !important;
				text-align: center !important;
				color: var(--black) !important;
			}
.setting__table--style-2 th:first-child, .setting__table--style-2 td:first-child {
					text-align: left !important;
				}
.setting__form-buttons {
		position: relative;
		max-width: 480px;
		padding-right: 40px;
		display: flex;
		align-items: center;
		justify-content: flex-start;
		flex-wrap: wrap;
	}
.setting__form-buttons--hub {
			border: none!important;
		}
.setting__form-buttons--hub .button {
				max-width: calc(50% - 20px)!important;
			}
.setting__form-buttons--right {
			justify-content: flex-end;
		}
.setting__form-buttons--right .button {
				max-width: 240px;
			}
.setting__form-buttons .button {
			position: relative;
			display: inline-flex;
			align-items: center;
			align-content: center;
			justify-content: center;
			flex-wrap: wrap;
			width: 225px;
			min-width: 110px;
			text-transform: none;
			text-align: center;
			letter-spacing: 0.38px;
			font-weight: 500;
			max-width: 240px;
		}
.setting__form-buttons .button[type="submit"] {
				width: 100%;
				text-transform: uppercase;
			}
.setting__form-buttons .button:not(:last-child) {
				margin-right: 15px;
			}
.setting__form-group .setting__form-buttons {
			padding-top: 20px;
		}
.setting__form-group .setting__form-buttons--hub {
				padding-right: 0;
			}
.setting__form-group .setting__form-buttons--twofa .button {
				width: auto;
			}
.setting__form--branding .setting__form-buttons--hub {
			border-top: 0.5px dashed #C7C7C7!important;
		}
.setting .field__painting-buttons .button:not(:last-child) {
					margin-right: 20px;
				}
.setting .field__painting-buttons .button {
				text-transform: none;
}
.setting__container {
    display: flex;
    /* width: 100%; */
    align-items: flex-start;
    padding-top: 25px;
    height: 100%;
    width: calc(100% - 20px);
  }
.setting__container .ember-basic-dropdown-trigger.selectbox__head {
      max-width: inherit;
    }
.setting__content {
    padding-left: 45px;
    width: 100%;
    flex: 1 1 auto;
    margin-bottom: 50px;
  }
.setting__contacts {
    display: flex;
  }
/* flex-wrap: wrap; */
.setting__contacts .menu {
      min-height: 350px;
      padding-right: 45px;
      border-right: 1px dashed #4E4E4E;
    }
.setting__contacts .menu--users {
        height: calc(100vh - 244px);
        overflow: auto;
      }
.setting__contacts--empty .menu__info {
          display: flex;
          text-align: center;
        }
.setting__contact {
    position: relative;
    padding-left: 45px;
    max-width: 500px;
    flex: 1 0 300px;
  }
@media (max-width: 1280px) {
.setting__contact {
      max-width: 270px
  }
    }
.setting__contact .contact__head {
        position: relative;
        padding-right: 30px;
        padding-top: 20px;
      }
.setting__contact .contact__footer {
        position: relative;
        padding-top: 26px;
      }
.setting__contact .contact__footer .button {
          font-weight: 700;
          text-transform: none;
        }
.setting__contact .contact-name {
        font-weight: 500;
        font-size: 24px;
        line-height: 1.2;
        color: #000;
        letter-spacing: 0;
      }
.setting__contact .contact-close {
        width: 29px;
        height: 29px;
        font-size: 20px;
        color: #707070;
        padding: 0;
        background-color: transparent;
        border: none;
        position: absolute;
        right: 0;
        top: 0;
        z-index: 1;
      }
.setting__contact .contact__icon {
        position: relative;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 36px;
        height: 36px;
        font-size: 26px;
        color: #707070;
        margin-right: 14px;
      }
.setting__contact .contact__icon .trust {
          position: relative;
          display: inline-flex;
          align-items: center;
          justify-content: center;
          width: 26px;
          height: 26px;
          border-radius: 100%;
          background-color: #4e4e4e;
          color: #fff;
          font-size: 18px;
        }
.setting__contact .contact__info {
        color: #707070;
        font-size: 16px;
        line-height: 1.5;
        font-weight: normal;
      }
.setting__contact .contact__info > div {
          position: relative;
          display: flex;
          align-items: center;
          padding: 14px 0;
        }
.setting__contact .contact__info-trust {
          font-size: 18px;
          color: #000;
        }
.setting__actions {
    position: relative;
    display: inline-flex;
    align-items: flex-start;
    align-content: flex-start;
    flex: 1 0 200px;
  }
.setting__actions .checkbox-set .checkbox-set__item.checkbox-set__item--horiz {
        display: flex;
        align-items: center;
        max-width: unset;
        margin-left: 0;
      }
.setting__actions .checkbox-set .checkbox-set__item.checkbox-set__item--horiz .checkbox.checkbox--big {
          margin: 0 0 0 10px;
        }
.setting__actions .checkbox-set .checkbox-set__item.checkbox-set__item--horiz .checkbox-set__dscr.checkbox-set__dscr--tenancy {
          margin-left: 10px;
          margin-top: 0;
          font-size: 12px;
        }
.setting__branding {
    padding: 0;
    max-width: 500px;
  }
.setting__branding .modal__button {
      /* margin: 0; */
    }
@media (max-width: 1024px) {
.setting__branding {
      padding-bottom: 45px

/*       .hub-setting {
        flex-direction: column;
      } */
  }

      .setting__branding .hub-setting__item--form {
        width: 100%;
      }

      .setting__branding .hub-setting__send {
        margin: 15px 0;
      }
    }
@media screen and (max-width: 1600px) {
			.chat__actions .selectbox__list {
				left: auto;
				right: 10px;
			}
}
@media screen and (max-width: 1460px) {
		.mail__content {
			padding-left: 40px;
		}
		.chat__content {
			padding-left: 0;
			max-width: 100%;
		}
}
@media screen and (max-width: 1199px) {
		.setting__content {
			margin-bottom: 0;
		}
	.container--mail, .container--chat, .container--settings, .container--search, .container--tenancy {
		padding-left: 40px;
	}
				.valut-table--tenancy .valut-table__cell--style-ten1check {
					padding-left: 10px;
				}
				/* &__icons {
					margin-right: 20px;
					&-item {
						margin-left: 20px;
					}
				} */
				.header--style-1 .menu__select {
					margin: 0 20px;
				}
				.header--style-1 .menu__settings {
					display: none;
				}
		.mail__content {
			padding-left: 40px;
		}
			.mail__head--all {
				min-height: 35px;
				margin-bottom: 16px;
			}
			.mail__head--inbox {
				/*flex-wrap: wrap;*/
				padding-left: 16px;
			}
			.mail__body--inbox {
				padding-left: 16px;
			}
			.mail__body .user {
				width: 100%;
				max-width: calc(100% - 100px);
			}
			.mail__footer--inbox {
				padding-left: 16px;
			}
				.mail__footer--inbox .button {
					margin: 8px;
					min-width: 50px;
				}
				.mail__actions .button--mail-action:not(:last-child) {
					margin-right: 14px;
				}
			.mail__buttons .button {
				min-width: 50px;
			}
		.mail-date {
			font-size: 10px;
			margin-top: 2px;
		}
			.mail__item--all {
				padding: 16px 16px;
			}
					.mail__branches--single .mail__body--inbox {
						padding-left: 16px;
						padding-right: 16px;
					}
					.mail__branches--all .mail-close {
						right: -8px;
					}
						.mail__branches--all .mail__branches--item {
							padding: 16px 16px;
						}
					.mail__branches--all .mail__body {
						padding-left: 0;
					}
		.chat__content {
			padding-left: 0;
		}
/*		.dialog {
			padding-bottom: 75px;
		}*/
		.chat__head {
			padding-left: 16px;
/*			.user {
				max-width: calc(100% - 175px);
			}*/
		}
		.chat__body {
			padding: 32px;
		}
			.chat__form .button {
				margin-right: 0;
			}
			.chat__actions .button {
				min-width: 20px;
			}
				.chat__actions .button:not(:last-child) {
					margin-right: 24px;
				}
		.setting__content {
			padding-left: 45px;
		}
			.setting__contacts .menu {
				max-width: 200px;
				flex: 1 0 200px;
				padding-right: 20px;
			}
		.setting__contact {
			padding-left: 20px;
			max-width: 250px;
			flex: 1 0 300px;
		}
					.setting__form--branding .setting__form-group {
						max-width: 225px;
					}
						.setting__form--branding .setting__form-groups:last-child {
							padding-right: 0;
						}
				.setting__form-line .field {
					margin-bottom: 10px!important;
				}
			.setting__form-group {
				padding-right: 40px;
			}
				.setting__form-group--with-table {
					padding-right: 0;
				}
					.setting__form-group--with-table .setting__form-title, .setting__form-group--with-table .setting__form-description {
						padding-right: 40px;
					}
					.setting__form--logs .setting__form-line .setting__form-buttons {
						margin-top: 10px;
					}
					.setting__form--logs .setting__form-line:not(:last-child) {
						margin-bottom: 15px;
					}
}
@media screen and (max-width: 991px) {
		.mail__content {
			margin-top: 30px;
			padding-left: 30px;
		}
			.mail__content--all {
				margin-top: 15px;
			}
			.mail__head--send {
				min-height: 1px;
			}
			.mail__body .user {
				max-width: 100%;
			}
		.mail-date {
			justify-content: flex-start;
			padding-left: 65px;
		}
			.mail__actions--send {
				flex-wrap: wrap;
			}
		.setting__content {
			padding-left: 40px;
			/* max-width: calc(100% - 215px); */
		}
			/* flex-direction: column; */
			.setting__contacts .menu {
				max-width: 250px;
				min-height: 100px;
				padding-bottom: 30px;
				margin-bottom: 30px;
				border-right: 0;
				border-bottom: 1px dashed #4E4E4E;
				flex: 1 1;
			}

				.setting__contacts .menu--contact-active {
					max-height: 450px;
				}
			.setting__form .field__painting-buttons {
				margin-left: -8px;
			}
				.setting__form .field__painting-buttons .button {
					margin: 8px!important;
				}
			.sign__text__line {
				font-size: 14px;
			}
}
.sign--dark {
    color: var(--colour-black);
  }
.sign--dark .login__input {
      background: var(--colour-white);
      border-color: var(--colour-black);
      color: var(--colour-black);
    }
.sign-banner {
    display: inline-block;
    border-radius: 5px;
    box-shadow: 0 0 4px 0 rgb(0 0 0 / 25%);
    background-color: #eec4a3;
    padding: 13px 24px 13px 25px;
    font-size: 14px;
    font-weight: bold;
    text-align: center;
    color: #373737;
    margin: 15px 0 30px;
  }
.sign-title {
    position: relative;
    /* color: #000; */
    font-size: 32px;
    font-weight: 500;
    line-height: 1.22;
    text-align: center;
  }
.sign__wrap {
    position: relative;
    display: flex;
    align-items: stretch;
    justify-content: center;
    padding-top: 50px;
    padding-bottom: 50px;
  }
@media only screen and (max-device-width: 640px) {
.sign__wrap {
      flex-direction: column-reverse
  }
    }
@media (max-width: 1440px) {
.sign__wrap {
      padding: 0
  }
    }
@media only screen and (max-device-width: 640px) {
.sign__wrap-column {
        flex-direction: column;
        margin-top: var(--spacer-3)
    }
      }
.sign__wrap--half {
      position: relative;
      flex: 1 1 50%;
      padding: 0 30px;
      box-sizing: border-box;
    }
.sign__wrap--half:nth-child(1):after {
          content: '';
          position: absolute;
          top: 0;
          right: 0;
          bottom: 0;
          margin: auto 0;
          width: 1px;
          background-color: var(--hero-white);
        }
.sign__wrap--half--no-border:after {
          display: none;
        }
@media only screen and (max-device-width: 640px) {
.sign__wrap--half {
        padding: 50px 42px
    }
      }
.sign__wrap--text {
      padding-right: 0!important;
    }
@media (max-width: 801px) {
.sign__wrap.signup {
        flex-direction: column-reverse
    }
      }
.sign__form {
    position: relative;
    display: block;
    width: auto;
    text-align: center;
    margin: 0 auto;
  }
.sign__form-title {
      /* color: #000; */
      font-size: 20px;
      font-weight: 500;
      line-height: 1.21;
      margin-bottom: 40px;
    }
@media only screen and (max-device-width: 640px) {
.sign__form-title {
        margin-bottom: 20px
    }
      }
.sign__form-subtitle {
      color: #000;
      font-size: 16px;
      font-weight: 500;
      line-height: 1.78;
      margin-bottom: 16px;
    }
.sign__form-image {
      position: relative;
      display: flex;
      /*align-items: center;*/
      justify-content: center;
      width: 100%;
      text-align: center;
      max-height: 400px;
      margin-bottom: 16px;
    }
.sign__form-image img {
        width: auto;
        height: auto;
        max-width: 100%;
        max-height: 100%;
        max-height: 150px;
      }
.sign__form-image svg {
        width: 343px;
        height: auto;
      }
.sign__form-buttons .button {
        width: 100%;
      }
.sign__form-fields {
      position: relative;
      display: block;
    }
.sign__form-field {
      position: relative;
      width: 100%;
    }
.sign__form-field:not(:last-child) {
        margin-bottom: 16px;
      }
.sign__form-input {
      width: 100%;
      padding: 14px 18px;
      border-radius: 4px;
      border: 0.5px solid #000;
      color: #3c3c3c;
      font-size: 14px;
      font-weight: normal;
      line-height: 1.43;
      text-align: left;
      box-sizing: border-box;
    }
.sign__form-input--error {
        border-color: #ed3521;
        outline: none;
      }
.sign__form-label {
      position: absolute;
      left: 21px;
      background-color: #fff;
      color: #000;
      font-size: 12px;
      font-weight: 500;
      line-height: 1.3;
      padding: 0 2px;
      top: -7px;
    }
.sign__form-help-tooltip {
      position: absolute;
      top: 50%;
      transform: translateY(-50%);
      right: -50px;
      color: var(--hero-blue);
      cursor: help;
    }
.sign__footer {
    font-size: 14px;
    text-align: center;
    padding: 30px;
    z-index: 1;
  }
.sign__links {
    display: flex;
    justify-content: center;
    margin: 0 auto;
    background-color: #f2e4d7;
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
    font-size: 14px;
    line-height: 1.43;
    text-align: center;
    color: var(--black);
    border-radius: 15px 15px 0 0;
  }
@media only screen and (max-device-width: 640px) {
.sign__links {
      flex-direction: column;
      margin: 0;
      padding: 10px
  }
    }
.sign__link {
    padding: 30px 25px;
    display: flex;
    flex-direction: column;
  }
@media only screen and (max-device-width: 640px) {
.sign__link {
      padding: 5px
  }
    }
.sign__link a {
      color: var(--colour-brand);
      text-decoration: none;
      font-weight: bold;
    }
.sign__text {
    text-align: center;
    color: #000;
    font-size: 14px;
    line-height: 1.43;
  }
/*   &__back {
    display: flex;
    color: #000;
    justify-content: flex-start;
    align-items: center;
    font-weight: bold;
    position: absolute;
    cursor: pointer;
    z-index: 1;
    top: 0;
    left: -50px;

    & i {
      margin-right: 5px;
    }
  } */
.sign__browser-black {
    font-size: 16px;
    font-weight: bold;
    line-height: 1.25;
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
    background-color: #000;
    text-align: center;
    color: #fff;
    border-radius: 5px 5px 0 0;
    padding: 20px 10px;
    box-sizing: border-box;
  }
.sign__browser-black--top {
      margin-top: 60px;
    }
.sign__browser-white {
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
    background-color: #f7f7f7;
    text-align: center;
    font-weight: bold;
    border-radius: 0 0 5px 5px;
    padding: 20px 10px;
    box-sizing: border-box;
    margin-bottom: 45px;
  }
.sign__browser-white p {
      max-width: 300px;
      margin: 0 auto;
      color: #000;
      font-weight: normal;
    }
@media (max-width: 1440px) {
.sign__logo {
      max-width: 350px
  }
    }
@media only screen and (max-device-width: 640px) {
.sign__logo {
      max-width: 250px
  }
    }
.sign__under-logo {
    font-size: 18px;
    font-weight: 500;
    line-height: 1.26;
    text-align: center;
    color: var(--hero-white);
  }
.sign__under-logo-text {
    font-size: 14px;
    color: var(--black);
    max-width: 350px;
    text-align: center;
    line-height: 1.43;
  }
.sign__table-plans {
    box-sizing: border-box;
    overflow-y: hidden;
    padding: 20px;
  }
.signup__title {
  font-size: 24px;
  text-align: center;
  color: #212121;
  margin-bottom: 55px;
}
.signup__indicator {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  color: var(--hero-white);
  margin-bottom: 20px;
}
@media only screen and (max-device-width: 640px) {
.signup__indicator {
    display: none
}
  }
.signup__indicator--active {
  font-weight: bold;
  color: var(--colour-brand);
}
.signup__line {
  height: 5px;
  border-bottom: 1px dashed var(--hero-white);
  width: 50px;
  margin: 0 10px;
}
.signup__line--active {
    border-bottom: 1px solid var(--hero-white);
  }
.signup__plan-period {
  display: flex;
  justify-content: space-between;
  margin: 30px 0 16px;
  font-size: 12px;
  line-height: 1.6;
  text-align: center;
  color: #393939;
}
.signup__period {
  border-radius: 3px;
  border: solid 1px var(--hero-white);
  padding: 5px 10px 6px;
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
  min-width: 140px;
  width: 100%;
}
.signup__period--active {
    border-color: var(--colour-brand);
  }
.signup__period--width-auto {
    width: auto;
  }
.signup__period + .signup__period {
    margin-left: 16px;
  }
.signup__period-button {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-left: 20px;
}
.signup-container {
  display: flex;
  height: 100%;
  width: 100%;
  min-height: 100vh;
}
@media only screen and (max-device-width: 640px) {
.signup-container {
    flex-direction: column
}
  }
.signup-container__column {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}
@media only screen and (max-device-width: 640px) {
.signup-container__column {
    padding: 30px 0
}
  }
.signup-container__column:first-child {
    width: 35%;
    min-width: 450px;
  }
@media only screen and (max-device-width: 640px) {
.signup-container__column:first-child {
      width: 100%;
      min-width: 100%
  }
    }
.signup-container__column:last-child {
    width: 65%;
    box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.16);
    background-color: #f8ede8;
  }
@media only screen and (max-device-width: 640px) {
.signup-container__column:last-child {
      width: 100%
  }
    }
.sign__desc {
  max-width: 800px;
  font-weight: bold;
  margin-bottom: 20px;
  text-align: center;
  line-height: 1.29;
  padding: 0 40px;
}
@media (max-width: 1440px) {
.sign__desc {
    max-width: 500px
}
  }
.signup__divider {
  height: 5px;
  border-bottom: 1px solid #393939;
  width: 60%;
  max-width: 500px;
  margin: 10px 0 20px;
}
@media only screen and (max-device-width: 640px) {
.signup__divider {
    width: 335px
}
  }
@media only screen and (max-device-width: 640px) {
.signup__options {
    padding: 0 40px
}
  }
.signuppayment__content {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  width: 100vw;
  max-height: 100vh;
  overflow: hidden;
  border: none;
  border-radius: 0;
  background-color: var(--colour-brand-dark);
  color: var( --hero-white);
}
.signuppayment__content .signup__plan-period, .signuppayment__content .subscription__total {
    color: var( --hero-white);
  }
.signuppayment__content .login__graphic {
    opacity: 0.3;
  }
.signup__confirmcode {
  width: 120px;
  margin: 0 auto;
}
.signup-phone-title {
  display: none;
  text-align: left;
  font-size: 25px;
  font-weight: bold;
  margin-bottom: 15px;
}
@media only screen and (max-device-width: 640px) {
.signup-phone-title {
    display: block
}
  }
.signup__policy {
  margin-left: calc(var(--spacer-5) * -1);
  margin-right: calc(var(--spacer-5) * -1);
  margin-bottom: calc(var(--spacer-5) * -1 - 1px);
  margin-top: var(--spacer-3);
  font-size: var(--font-size-1);
  text-align: center;
  border-radius: 0 0 var(--border-radius-rounder) var(--border-radius-rounder);
  padding: var(--spacer-3) var(--spacer-5) var(--spacer-3) var(--spacer-5);
  background-color: var(--gray);
  color: var(--hero-white);
  font-weight: bold;
}
.signup__policy a {
    color: var(--hero-white);
  }
.search__result-table--wrap {
				width: 100%;
				height: 100%;
				position: relative;
			}
.search__result-table th, .search__result-table td {
				/*min-width: 120px;*/
				text-align: left;
				padding: 10px 30px 10px 0px;
				letter-spacing: 0;
				font-size: 11px;
				line-height: 1.5;
				/* color: #707070; */
				vertical-align: top;
				max-width: 250px;
				overflow: hidden;
				text-overflow: ellipsis;
				white-space: nowrap;
			}
.search__result-table th span, .search__result-table td span {
					color: #5ac1ee;
				}
.search__result-table th {
				font-size: 13px;
			}
.search__result-table thead th {
					font-weight: 700;
					padding-top: 0;
					position: sticky;
					top: 0;
					/* background-color: #f3f3f9; */
				}
.search__container {
		display: flex;
		height: 100%;
		align-items: flex-start;
	}
.search__content {
		padding-left: 65px;
		width: 100%;
		max-width: calc(100% - 300px);
		height: 100%;
	}
.search-category {
		position: relative;
		display: flex;
		justify-content: space-between;
		text-transform: none;
		font-size: 14px;
	}
.search__head {
		position: relative;
		display: flex;
		align-items: center;
		align-content: center;
		justify-content: flex-start;
		margin-bottom: 48px;
		min-height: 29px;
	}
.search__head-text {
			font-size: 16px;
			font-weight: 500;
			line-height: 1.21;
		}
/* color: #000; */
.search__head-text span {
				font-weight: normal;
			}
.search__head-text:not(:last-child) {
				margin-right: 26px;
			}
.search__body {
		position: relative;
		max-height: calc(100% - 82px);
		height: 100%;
		overflow: auto;
	}
.history-table {
  font-size: 16px;
}
.history-table__th {
    text-align: left;
    font-weight: 500;
  }
.history-table__td {
    padding: 4px;
    color: #707070;
    line-height: 1.5;
  }
.dropdown__body {
  padding: 12px;
  border: 1px solid var(--colour-border-default);
  border-radius: var(--border-radius-default);
  font-size: 14px;
  background-color: var(--body-bg);
}
.dropdown__body__user-info {
    display: flex;
    margin-bottom: 5px;
    padding: 5px;
  }
.dropdown__body__user-info .info__title {
      margin-right: 10px;
    }
.field__input--reply-all {
      cursor: pointer;
      min-height: 110px;
    }
.reply-item .reply-expanded-attachments {
    line-height: 19px;
    font-weight: 500;
    color: var(--colour-fg-default);
    border: solid 1px var(--colour-bg-brand-subtle);
    border-radius: var(--border-radius-sm);
    margin-bottom: 1rem;
    margin-bottom: 12px;
  }
.reply-item .reply-expanded-attachments .reply-expanded-attachments-header {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      margin-right: 0;
      margin-left: 0;
      border-top-right-radius: var(--border-radius-sm);
      border-top-left-radius: var(--border-radius-sm);
      background-color: var(--colour-bg-brand-subtle);
      color: var(--colour-fg-default);
      font-size: 14px;
      padding: 8px 12px;
    }
.reply-item .reply-expanded-attachments .attachment-row {
      margin-right: 0;
      margin-left: 0;
      align-items: center;
      display: flex;
      flex-wrap: no-wrap;
      font-size: 14px;
      padding: 8px 12px;
      max-width: 100%;
      box-sizing: border;
    }
.reply-item .reply-expanded-attachments .attachment-row:not(:first-of-type) {
        border-top: 0;
      }
.reply-item .reply-expanded-attachments .attachment-row .col {
        flex-grow: 0;
        flex-shrink: 1;
        flex-basis: auto;
      }
.reply-item .reply-expanded-attachments .attachment-row .reply-attachment-preview {
        padding: .25rem;
        width: 80px;
        min-width: 0;
      }
.reply-item .reply-expanded-attachments .attachment-row .reply-attachment-preview img {
          width: auto;
          height: auto;
          max-width: 70px;
          max-height: 70px;
          border: 1px solid #ced4da;
          cursor: pointer;
        }
.reply-item .reply-expanded-attachments .attachment-row .reply-attachment-text {
        flex-grow: 1;
        max-width: 100%;
        width: calc(100% - 400px);  /* TEST */
        padding-left: .25rem !important;
        color: var(--colour-fg-default);
      }
.reply-item .reply-expanded-attachments .attachment-row .reply-expanded-attachments-middle-col {
        flex-basis: 165px;
        max-width: 165px;
        text-align: right;
      }
.reply-item .reply-expanded-attachments .attachment-row .reply-expanded-attachments-last-col {
        flex-basis: 120px;
        max-width: 120px;
        text-align: center;
      }
/*  padding-bottom: 40px;
  height: calc(100% - 45px);*/
.chat__content.new__chat .mail__field.mail__compose--tinymce {
    min-height: 0;
    height: 100%;
  }
.chat__content.new__chat .full-page {
    height: 100%;
    display: flex;
    flex-direction: column;
    min-height: 400px;
    flex: 1 1;
    position: relative;
  }
.chat__content.new__chat .full-page .mail__body.mail__body--send {
      height: 100%;
      display: flex;
      flex-direction: column;
      min-height: 400px;
      flex: 1 1;
    }
.chat__content.new__chat .full-page .mail__body.mail__body--send .mail__form {
        height: 100%;
        display: flex;
        flex-direction: column;
        min-height: 400px;
        flex: 1 1;
      }
.chat__content.new__chat .full-page .mail__body.mail__body--send .mail__form .mail__actions {
          /*flex: 0 0 auto;*/
          width: auto;
          max-width: none;
        }
.chat__content.new__chat .full-page .mail__body.mail__body--send .mail__form .mail__wrap {
          height: 100%;
          display: flex;
          flex-direction: column;
        }
.chat__content.new__chat .full-page .mail__body.mail__body--send .mail__form .mail__wrap .mail__field.chat__textarea {
            min-height: 0;
            height: 100%;
          }
.chat__content.new__chat .full-page .mail__body.mail__body--send .mail__form .mail__wrap .mail__field.chat__textarea textarea {
              height: 100%;
              font-size: 13px;
            }
.chat__content.new__chat .full-page .mail__body.mail__body--send .mail__form .mail__wrap .mail__field.chat__textarea--with-attributes {
            min-height: 0;
            height: 100%;
          }
.chat__content.new__chat .full-page.mail__compose--view .mail__wrap {
        height: 100%;
        display: flex;
        flex-direction: column;
      }
.chat__content.new__chat .full-page.mail__compose--view .mail__wrap .mail__fields {
          /*height: 100%;*/
        }
.compose-mail-to .ember-power-select-trigger {
    outline: none;
    padding-right: 0;
    background: transparent;
    border: 0;
  }
.compose-mail-to .ember-power-select-multiple-options .ember-power-select-multiple-option {
      border: 1px solid #ced0da;
      border-radius: 3px;
      color: #434343;
      background-color: #fff;
      padding: 0 4px;
      line-height: 1.45;
      display: flex;
      justify-content: center;
      align-items: center;
    }
.compose-mail-to .ember-power-select-multiple-options .ember-power-select-multiple-option span {
        margin-right: 5px;
        color: #5ac1ee;
      }
.compose-mail-to .ember-basic-dropdown-trigger .ember-power-select-selected-item,.compose-mail-to .ember-basic-dropdown-trigger .ember-power-select-placeholder {
      margin-left: 0;
    }
.subject__field .input-group .ember-text-field {
    border-radius: 0;
    border: none;
    outline: none;
    border-bottom: 1px solid #707070;
    background-color: transparent;
    color: var(--body-color);
    width: 100%;
    position: relative;
    font-weight: 500;
    font-size: 12px;
    line-height: 1.13;
    padding: 12px 0;
    margin-top: 0;
  }
.mail__actions__feedback {
    display: inline-flex;
    color: #707070;
  }
.mce-container-body div[aria-label="Font Sizes"] button{
    width:60px;
  }
.mail__select-content {
  z-index: 9;
}
/* ---------------------------------------------------------------------------
   Compose — mail and chat, full page and inline in a thread.
   =========================================================

   The form was a bordered card whose every field drew its own border inside
   it, so To, Subject and the message each read as a box within a box; and
   nothing named the rows, because they were placeholder-only and a
   placeholder is gone the moment you type. With Cc and Bcc open that was four
   unlabelled boxes stacked in a column, and Send was the fifth icon button in
   a row of five identical ones.

   It is one card of labelled rows now, divided by hairlines. Three rules:

     one box   — the card. Nothing inside it draws a border of its own.
     one voice — a quiet label in a fixed column, the value in full contrast.
     one verb  — Send is the only filled control on the screen.

   Specificity note, because it is not decoration: `_blocks/forms/forms.css`
   styles every input in the app from one selector list, and it reaches these
   fields at (0,4,1) via `input[type="text"]:not()...` and at (0,4,0) via
   `.field__input:not()...`. A four-class selector here LOSES to that. Each
   reset below therefore carries five classes plus the element.
   --------------------------------------------------------------------------- */
.compose .mail__form {
  border: 1px solid var(--msg-edge);
  border-radius: var(--r-r-card);
  box-shadow: var(--r-shadow);
  background-color: var(--body-bg);
  overflow: hidden;
}
.compose .mail__wrap {
  padding: 0;
  border-radius: 0;
}
/* ---- One labelled row ---- */
.compose__row {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  min-height: 44px;
  padding: 4px 16px;
  border-bottom: 1px solid var(--msg-divider);
}
/* A fixed label column, so To / Cc / Bcc / Subject start at one x and the
   values line up in a column of their own. `padding-top` rather than
   centring: a recipient row grows as chips wrap, and a centred label drifts
   down the row as it does. */
.compose__label {
  flex: 0 0 66px;
  padding-top: 13px;
  font-size: 12.5px;
  font-weight: 500;
  line-height: 1.2;
  color: var(--msg-fg-muted);
}
.compose__control {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
}
/* Cc / Bcc: quiet text actions at the end of the To row, because what they do
   is add a row to the card they sit on. They were buttons floating above the
   form, right-aligned, attached to nothing. */
.compose__add-fields {
  flex: 0 0 auto;
  display: flex;
  gap: 2px;
  width: auto;
  padding-top: 9px;
}
.compose__add-field.button--mail-type {
  min-width: 0;
  margin: 0;
  padding: 4px 9px;
  border: 0;
  border-radius: var(--r-r-pill);
  background: none;
  color: var(--msg-fg-muted);
  font-size: 12.5px;
  font-weight: 500;
  text-transform: none;
  letter-spacing: 0;
  transition: background-color 80ms ease-in-out, color 80ms ease-in-out;
}
.compose__add-field.button--mail-type:hover {
    background: var(--msg-row-hover);
    color: var(--msg-fg);
  }
/* Validation and hub warnings, indented to the values so they read as being
   about the field above rather than about the card. */
.compose__note {
  margin: 0;
  padding: 2px 16px 8px 94px;
  border-bottom: 1px solid var(--msg-divider);
  font-size: 12px;
}
/* ---- The field reset: five classes + the element, per the note above ---- */
.compose .mail__form .compose__row .compose__control input.field__input,
.compose .mail__form .compose__row .compose__control input.ember-text-field,
.compose .mail__form .compose__body textarea.field__input.field__input--textarea {
  width: 100%;
  margin: 0;
  padding: 11px 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
  font-size: 14px;
  line-height: 1.5;
  color: var(--msg-fg);
}
.compose .mail__form .compose__row .compose__control input.field__input:hover,
  .compose .mail__form .compose__row .compose__control input.field__input:focus,
  .compose .mail__form .compose__row .compose__control input.ember-text-field:hover,
  .compose .mail__form .compose__row .compose__control input.ember-text-field:focus,
  .compose .mail__form .compose__body textarea.field__input.field__input--textarea:hover,
  .compose .mail__form .compose__body textarea.field__input.field__input--textarea:focus {
    border: 0;
    background: transparent;
    box-shadow: none;
    outline: none;
  }
.compose .mail__form .compose__row .compose__control input.field__input::placeholder, .compose .mail__form .compose__row .compose__control input.ember-text-field::placeholder, .compose .mail__form .compose__body textarea.field__input.field__input--textarea::placeholder {
    color: var(--msg-fg-muted);
    font-size: 14px;
    font-style: normal;
    opacity: 1;
  }
/* The recipient typeahead. Its own trigger declares no border; what it needs
   is to stop reserving a chip-sized empty box when nothing is typed, and to
   let the chips wrap onto a second line. */
.compose .mail__form .compose-mail-to {
  padding: 0;
  border: 0;
  background: transparent;
  min-height: 42px;
  display: flex;
  align-items: center;
}
.compose .mail__form .compose-mail-to .ember-power-select-trigger {
  width: 100%;
  min-height: 0;
  padding: 5px 0;
  border: 0;
  background: transparent;
}
.compose .mail__form .compose-mail-to .ember-power-select-multiple-options {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 5px;
}
/* One recipient. A readable name, a quiet remove, and no hairline box fighting
   the chip beside it. */
.compose .mail__form .compose-mail-to .ember-power-select-multiple-option {
  margin: 0;
  padding: 3px 9px;
  border: 1px solid var(--msg-edge);
  border-radius: var(--r-r-pill);
  background-color: var(--msg-chip-bg);
  color: var(--msg-fg);
  font-size: 13px;
  line-height: 1.45;
}
.compose .mail__form .compose-mail-to .ember-power-select-multiple-option span {
    margin-right: 6px;
    color: var(--msg-fg-muted);
  }
/* The search input inside the trigger. Left at a chip height it drew an empty
   rounded box beside the chips that read as a recipient with no name. */
.compose .mail__form .compose-mail-to .ember-power-select-trigger-multiple-input {
  height: 24px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  font-size: 14px;
  color: var(--msg-fg);
}
/* ---- The message ----
   A sheet, not a form control: no border of its own, and the room to be read
   in. The card is the box. */
.compose__body {
  padding: 6px 16px 14px;
  margin: 0;
  border-bottom: 1px solid var(--msg-divider);
}
.compose .mail__form .compose__body textarea.field__input.field__input--textarea {
  padding: 8px 0;
  min-height: 220px;
  line-height: 1.65;
  resize: none;
}
/* ---- Attachments ----
   A column of full-width bordered rows read as a table of files bolted under
   the form. One chip per file, wrapping, reads as a property of the message.

   Targeted as a DESCENDANT: `ComposeAttachments` renders its own
   `.compose-attachments-wraper` inside the element carrying the class passed
   to it, so the two are never the same node. */
.compose .compose__attachments .compose-attachments-wraper {
  padding: 12px 16px !important;
  border: 0;
  border-bottom: 1px solid var(--msg-divider);
}
.compose .compose__attachments .custom-scroll {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  max-height: 120px;
}
.compose .compose__attachments .compose-attachment {
  border: 1px solid var(--msg-edge);
  border-radius: var(--r-r-ctl);
  background: var(--msg-chip-bg);
  overflow: hidden;
}
/* The stacked-rows look came from collapsing the top border of every chip
     after the first. Each one is its own object now. */
.compose .compose__attachments .compose-attachment:not(:first-child) {
    border-top: 1px solid var(--msg-edge);
  }
.compose .compose__attachments .compose-attachment .file-info {
  gap: 10px;
  padding: 5px 8px 5px 12px;
  font-size: 13px;
  color: var(--msg-fg);
}
.compose .compose__attachments .compose-attachment .file-info .text-secondary {
    color: var(--msg-fg-muted) !important;
    font-size: 12px;
  }
/* The remove control: a 24px target that only colours up under the pointer,
     so a list of attachments is not a row of crosses demanding attention. */
.compose .compose__attachments .compose-attachment .file-info [role="button"] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    border-radius: 100%;
    transition: background-color 80ms ease-in-out;
  }
.compose .compose__attachments .compose-attachment .file-info [role="button"] svg {
      fill: var(--msg-fg-muted);
    }
.compose .compose__attachments .compose-attachment .file-info [role="button"]:hover {
      background: var(--msg-row-hover);
    }
.compose .compose__attachments .compose-attachment .file-info [role="button"]:hover svg {
        fill: var(--msg-fg);
      }
/* ---- Action bar ---- */
.compose__actions.mail__actions--send {
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  background: var(--msg-chip-bg);
}
.compose__tools {
  align-items: center;
  gap: 4px;
}
.compose__status {
  display: inline-flex;
  gap: 6px;
  align-items: center;
  padding-left: 8px;
  font-size: 12px;
  color: var(--msg-fg-muted);
}
.compose__buttons {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: nowrap;
}
/* Send — the one filled control on the screen. `.mail__buttons .button` adds
   `margin: 8px`, which on a row that already has a gap pushed the primary out
   of line with the icon buttons beside it.

   The class lands on the `.btn` ITSELF, not on a wrapper around it: `Button`
   spreads `...attributes` onto its inner div, so a nested `& .btn` here
   matches nothing. */
.compose__buttons .compose__send.btn {
  margin: 0;
  padding-left: 18px;
  padding-right: 18px;
  border-radius: var(--r-r-pill);
  font-weight: 600;
}
/* Inline in a thread (`mail/inbox/discussion`) the reply card sits inside the
   thread list, which already carries a card edge and a gutter. */
.mail__branches .compose .mail__form {
  box-shadow: none;
}
/* ---- Opting out of the global input box, the way forms.css asks ----
 *
 * The recipient wrappers, the subject input and the message textarea all
 * carry `field__input--flat` now. That is not a styling class here, it is the
 * exclusion token every selector in forms.css's control rule tests for:
 * "If a class says flat / search-input / power-select / calendar-input, the
 * box is somebody else's job." On a compose row the box IS somebody else's
 * job — the row draws it.
 *
 * This replaces an arms race. That rule reaches an input at (0,6,1) — one
 * element, one attribute and five `:not()` — so a block trying to out-specify
 * it needs seven classes and would still lose the next time a `:not()` is
 * added. Opting out is stable.
 *
 * What `--flat` brings with it is one nested rule of its own:
 * `.field__input--flat & input { border: solid 1px var(--colour-brand);
 * padding: 9px }`. Inside the recipient wrapper that lands on the typeahead's
 * search field and draws a brand-bordered box inside the row — the "two
 * fields inside each other" this whole change is removing. Overridden below
 * at (0,3,1).
 */
.compose .mail__form .compose-mail-to .ember-power-select-trigger input,
.compose .mail__form .compose-mail-to input.ember-power-select-trigger-multiple-input {
  height: 26px;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
  font-size: 14px;
  line-height: 1.5;
  color: var(--msg-fg);
}
.compose .mail__form .compose-mail-to .ember-power-select-trigger input:focus, .compose .mail__form .compose-mail-to input.ember-power-select-trigger-multiple-input:focus {
    border: 0;
    box-shadow: none;
    outline: none;
  }
.compose .mail__form .compose-mail-to .ember-power-select-trigger input::placeholder, .compose .mail__form .compose-mail-to input.ember-power-select-trigger-multiple-input::placeholder {
    color: var(--msg-fg-muted);
    font-size: 14px;
    font-style: normal;
    opacity: 1;
  }
/* The wrapper itself, now that nothing paints it. */
.compose .mail__form .compose__control .compose-mail-to.field__input--flat {
  width: 100%;
  min-height: 42px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
}
/* Focus has to be visible, and with no field borders left there is nothing to
   colour. So the ROW answers instead of the control: the line you are typing
   on lifts slightly. Cheaper than reintroducing a box, and it reads on both
   themes because it is the same wash the conversation list uses for hover. */
.compose__row:focus-within {
  background: var(--msg-row-hover);
}
/* The subject is the message's title, so it carries a little more weight than
   the body — the one place in the card where the value is emphasised. */
.compose .mail__form .compose__row .compose__control input.ember-text-field {
  font-size: 15px;
  font-weight: 600;
}
/* The typeahead's dropdown caret. It sat at the far right of the To row,
   separated from the chips by the whole width of the card and pointing at
   nothing: this select has no list to drop down until you type into it
   (`@searchEnabled` with a `@search` action, and an empty options list until
   then), so the one thing the caret promises is the one thing it cannot do. */
.compose .mail__form .compose-mail-to .ember-power-select-status-icon {
  display: none;
}
.compose-attachments-wraper {
  padding: 1rem 0!important;
}
.compose-attachments-wraper .custom-scroll {
    max-height: 140px;
    overflow: auto;
  }
.compose-attachments-wraper .compose-attachment {
    position: relative;
    border: 1px solid #e3e4e8;
  }
.compose-attachments-wraper .compose-attachment:not(:first-child) {
      border-top: 0;
    }
.compose-attachments-wraper .compose-attachment .file-info {
      padding: .5rem;
      display: flex;
      justify-content: space-between;
      align-items: center;
      /* color: #707070; */
    }
.recipients-list-item {
  margin-right: 5px;
}
.msg-preview-list .infinite-scroller.custom-scroll {
    width: 100%;
    position: relative;
    overflow: auto;
    height: calc(100vh - 175px - var(--banner-height));
  }
.msg-preview-list .infinite-scroller.custom-scroll .loader-wrapper {
      position: relative;
      height: 60px;
    }
/* One row of the mail / chat conversation list.
 *
 * The three states this row can be in were not distinguishable before:
 *
 *   selected  shared its background with :hover, so as soon as the pointer
 *             moved anywhere in the list two rows claimed to be open at once;
 *   unread    was styled — `&.new { .user-name, .user-dscr { font-weight:
 *             bold } }` — against class names this template does not render
 *             (it renders `--username` and `--description`), so the rule had
 *             no effect and read and unread rows looked identical;
 *   hover     was the only one that worked.
 *
 * They are now three different things: a neutral wash for hover, the brand
 * tint plus a left accent for the open conversation, and weight plus a dot
 * for unread. Unread is deliberately carried by the TEXT rather than the
 * background, so it survives being both unread and open at the same time.
 */
.discussion-summary {
  box-sizing: border-box;
  position: relative;
  display: flex;
  flex-direction: row;
  align-items: flex-start;
  gap: 10px;
  cursor: pointer;
  padding: 10px 12px 10px 13px;
  border-radius: var(--r-r-inner);
  border-left: 3px solid transparent;
  transition: background-color 80ms ease-in-out;
}
/* A hairline between rows instead of a 4px gap, so the list reads as one
     column of conversations rather than a stack of loose cards. */
.discussion-summary:not(:last-child) {
    border-bottom: 1px solid var(--msg-divider);
  }
.discussion-summary:hover {
    background: var(--msg-row-hover);
  }
.discussion-summary--active,
  .discussion-summary--active:hover {
    background: var(--msg-row-active);
    border-left-color: var(--msg-accent);
  }
.discussion-summary__avatar {
    flex: 0 0 auto;
    width: 34px;
    height: 34px;
    margin-top: 1px;
    border-radius: 100%;
    overflow: hidden;
    background-color: var(--msg-avatar-bg);
  }
.discussion-summary__avatar img {
      width: 100%;
      height: 100%;
      object-fit: cover;
      display: block;
    }
/* `min-width: 0` is what lets the ellipsis work at all: a flex item's
     default `min-width: auto` is its content width, so a long subject would
     push the date off the row instead of truncating. */
.discussion-summary__main {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
  }
/* The alignment lives here rather than on the `flex-align-center` class the
     markup carries, because that class is not defined in app/styles — it is a
     no-op this template has been asking for all along. */
.discussion-summary--row {
    display: flex;
    flex-direction: row;
    align-items: center;
    min-width: 0;
  }
/* The name and its unread dot. `.wrapper-text-ellipsis` supplies the
       `flex: 1; min-width: 0` that lets the name truncate; the row treatment
       here is what puts the dot beside it instead of above it. */
.discussion-summary--row > .wrapper-text-ellipsis {
      display: flex;
      align-items: center;
    }
.discussion-summary--username {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 13px;
    font-weight: 500;
    color: var(--msg-fg);
  }
/* The subject, and under it the first line of the message. Two tiers, and
     the gap between them is weight and colour, not size — at 12px against
     12px the list had no hierarchy to read. */
.discussion-summary--description {
    font-size: 13px;
    font-weight: 500;
    color: var(--msg-fg-secondary);
  }
.discussion-summary--preview {
    font-size: 12px;
    font-weight: 400;
    color: var(--msg-fg-muted);
  }
.discussion-summary--date {
    flex: 0 0 auto;
    padding-left: 8px;
    font-size: 11px;
    font-weight: 500;
    color: var(--msg-fg-muted);
    margin-left: auto;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
  }
.discussion-summary--attachment {
    flex: 0 0 auto;
    fill: var(--msg-fg-muted);
    margin-left: auto;
    rotate: 90deg;
  }
/* Hidden until the row is unread; `.new` below turns it on. */
.discussion-summary--unread-dot {
    flex: 0 0 auto;
    width: 7px;
    height: 7px;
    margin-right: 7px;
    border-radius: 100%;
    background-color: var(--msg-accent);
    display: none;
  }
.discussion-summary .icon-group-chat {
    margin-left: 5px;
    vertical-align: text-bottom;
  }
.discussion-summary.new .discussion-summary--unread-dot {
      display: block;
    }
.discussion-summary.new .discussion-summary--username {
      font-weight: 700;
      color: var(--msg-fg);
    }
.discussion-summary.new .discussion-summary--description {
      font-weight: 700;
      color: var(--msg-fg);
    }
.discussion-summary.new .discussion-summary--date {
      color: var(--msg-accent);
      font-weight: 600;
    }
/* The chat composer's textarea.
 *
 * It used to be a borderless transparent 12px field with an italic #d5d5d5
 * placeholder — 1.9:1 on white, so the prompt telling you what to do was the
 * least legible thing on the screen, and nothing marked out where the input
 * began. It is a real field now: its own surface, a border that thickens into
 * a focus ring, and a placeholder that clears 4.5:1.
 *
 * The selector is deeper than it looks like it needs to be, and the depth is
 * load-bearing. `_blocks/forms/forms.css` styles every input in the app from
 * one list of selectors whose `.field__input:not(--flat):not(search-input)
 * :not(calendar-input)` branch is (0,4,0) — and it hardcodes `background:
 * #fff` with `color: var(--r-navy)`, so on the dark theme it paints a white
 * slab with navy text. A plain `.chat__form.field .field__input--textarea` is
 * (0,3,0) and loses to it. Walking up to `.chat__body .chat__footer` makes
 * this (0,5,0), which wins on specificity rather than on import order.
 *
 * NOTE this only fixes the composer. That forms.css rule is light-only for
 * EVERY input in the app, which is a pre-existing dark-theme bug well outside
 * this block — the real fix is a themed token there, and a pass over every
 * screen that has an input in it. */
.chat__body .chat__footer .chat__form.field .field__input--textarea {
    box-sizing: border-box;
    width: 100%;
    margin: 0;
    padding: 10px 14px;
    min-height: 42px;
    max-height: 140px;
    resize: none;
    border: 1px solid var(--msg-field-border);
    border-radius: var(--r-r-ctl);
    background-color: var(--body-bg);
    color: var(--body-color);
    font-weight: 400;
    font-size: 14px;
    line-height: 1.45;
    text-align: left;
    transition: border-color 80ms ease-in-out, box-shadow 80ms ease-in-out;
  }
.chat__body .chat__footer .chat__form.field .field__input--textarea::placeholder {
      color: var(--msg-fg-muted);
      font-size: 14px;
      font-style: normal;
      opacity: 1;
    }
.chat__body .chat__footer .chat__form.field .field__input--textarea:hover {
      border-color: var(--msg-field-border-hover);
    }
.chat__body .chat__footer .chat__form.field .field__input--textarea:focus {
      outline: none;
      border-color: var(--msg-accent);
      box-shadow: var(--r-focus);
    }
/* The date a run of messages belongs to. A centred label on a hairline that
   runs the width of the stack, rather than a bare grey line of text floating
   between two bubbles with nothing to say it is a divider. */
.chat-replies-day {
  display: flex;
  align-items: center;
  gap: 12px;
  position: relative;
  margin: 6px 0 14px;
}
.chat-replies-day:before,
  .chat-replies-day:after {
    content: '';
    flex: 1 1 auto;
    height: 1px;
    background-color: var(--msg-divider);
  }
.chat-replies-day span {
    flex: 0 0 auto;
    padding: 2px 10px;
    border-radius: var(--r-r-pill);
    background-color: var(--msg-pill-bg);
    color: var(--msg-fg-muted);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-transform: uppercase;
  }
.widget__chat.widget__chat--draggable {
  width: 300px;
  height: 450px;
  min-width: 300px;
  min-height: 450px;
  top: auto;
  right: auto;
  bottom: auto;
  left: auto;
  flex-direction: column;
  position: absolute;
  z-index: 10;
  touch-action: none;
  margin: 0;
  transform-style: preserve-3d;
  backface-visibility: hidden;
  box-sizing: border-box;
}
.widget__chat.widget__chat--draggable .chat__head .chat__members {
      margin: 0 20px;
    }
.widget__chat.widget__chat--draggable .chat__head .chat__members .user.user--style-1 {
        flex-shrink: 0;
        width: auto;
        margin-right: 10px;
      }
.form-group .invalid-feedback {
    color: #ed3521;
    margin-top: 5px;
    font-size: 13px;
  }
@keyframes progress-bar-stripes {
  from { background-position: 2px 0; }
  to { background-position: 0 0; }
}
.progress {
  display: flex;
  overflow: hidden;
  font-size: .75rem;
  background-color: #e9ecef;
  border-radius: .25rem;
  height: 2px;
  transition: width 2s;
}
.progress-bar-animated {
  animation: progress-bar-stripes 1s linear infinite;
}
.progress-bar-striped {
  background-image: linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);
  background-size: 1rem 1rem;
}
.progress-bar {
  display: flex;
  flex-direction: column;
  justify-content: center;
  overflow: hidden;
  color: #fff;
  text-align: center;
  white-space: nowrap;
  background-color: #007bff;
  transition: width .6s ease;
}
/*transition: width 2s;*/
.progress-bar .bg-success {
    background-color: #28a745;
  }
.progress-bar .bg-info {
    background-color: #17a2b8;
  }
.progress-bar .bg-warning {
    background-color: #ffc107;
  }
.progress-bar .bg-danger {
    background-color: #dc3545;
  }
/* One progress bar. The striped animated Bootstrap default read as an error
   state next to the rest of the chrome. */
.progress {
  border-radius: var(--r-r-pill);
  background: var(--r-div);
}
.progress-bar {
  border-radius: var(--r-r-pill);
  background-color: var(--r-brand);
  background-image: none;
}
.progress-bar-animated { animation: none; }
.progress-bar .bg-success { background-color: var(--r-ok-fg); }
.progress-bar .bg-warning { background-color: var(--r-warn-fg); }
.progress-bar .bg-danger { background-color: var(--r-crit-fg); }
.tooltip {
  position: absolute;
  z-index: 1070;
  display: block;
  /* A hint is not a target. It is rendered into `#tooltip-wormhole` at the top of the document, so it
     lies over whatever is beneath it — and since the toolbar became two rows of icons (02.09.2026) the
     hint of a bottom-row button opens upward across the row above it, swallowing clicks on Create folder
     and its neighbours. Two Playwright specs died there, sixty seconds each: "element is visible, enabled
     and stable … tooltip-inner intercepts pointer events".
     Safe for every hint this app has: they carry `@title` text and nothing else — `html` is never set,
     and there is no anchor or button inside one to reach. */
  pointer-events: none;
  margin: 0;
  font-style: normal;
  font-weight: 400;
  line-height: 1.4;
  text-align: left;
  text-align: start;
  text-decoration: none;
  text-shadow: none;
  text-transform: none;
  letter-spacing: normal;
  word-break: normal;
  word-spacing: normal;
  white-space: normal;
  line-break: auto;
  font-size: 0.82rem;
  word-wrap: break-word;
  opacity: 0;
}
.tooltip.show {
  opacity: 1;
}
.tooltip .arrow {
  position: absolute;
  display: block;
  width: 0.8rem;
  height: 0.4rem;
}
.tooltip .arrow::before {
  position: absolute;
  content: "";
  border-color: transparent;
  border-style: solid;
}
.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] {
  padding: 0.4rem 0;
}
.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow {
  bottom: 0;
}
.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before {
  top: 0;
  border-width: 0.4rem 0.4rem 0;
  border-top-color: #3a3c47;
}
.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] {
  padding: 0 0.4rem;
}
.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow {
  left: 0;
  width: 0.4rem;
  height: 0.8rem;
}
.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before {
  right: 0;
  border-width: 0.4rem 0.4rem 0.4rem 0;
  border-right-color: #3a3c47;
}
.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] {
  padding: 0.4rem 0;
}
.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow {
  top: 0;
}
.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before {
  bottom: 0;
  border-width: 0 0.4rem 0.4rem;
  border-bottom-color: #3a3c47;
}
.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] {
  padding: 0 0.4rem;
}
.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow {
  right: 0;
  width: 0.4rem;
  height: 0.8rem;
}
.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before {
  left: 0;
  border-width: 0.4rem 0 0.4rem 0.4rem;
  border-left-color: #3a3c47;
}
.tooltip-inner {
  max-width: 200px;
  padding: 0.25rem 0.5rem;
  color: #fff;
  text-align: center;
  background-color: #3a3c47;
  border-radius: 3px;
}
.tooltip-seehow {
  width: 320px;
  max-width: 320px;
  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
}
.tooltip-seehow__content {
    padding: 15px 20px;
    font-size: 11px;
    line-height: 1.15;
    background-color: #fff;
  }
.tooltip-seehow__title {
    margin-bottom: 10px;
    font-weight: 500;
    font-size: 17px;
  }
.tooltip-seehow__hide {
    cursor: pointer;
    padding: 10px;
    font-size: 11px;
    line-height: 1.15;
    text-align: center;
    background-color: #f8f9fa;
  }
/* Base */
.ember-cli-notifications-notification__container {
  position: fixed;
  margin: 0 auto;
  width: 80%;
  max-width: 450px;
}
/* Position */
.ember-cli-notifications-notification__container--top {
  top: 10px;
  right: 0;
  left: 0;
}
.ember-cli-notifications-notification__container--top-left {
  top: 10px;
  right: auto;
  left: 10px;
}
.ember-cli-notifications-notification__container--top-right {
  top: 10px;
  right: 10px;
  left: auto;
}
.ember-cli-notifications-notification__container--bottom {
  right: 0;
  bottom: 10px;
  left: 0;
}
.ember-cli-notifications-notification__container--bottom-left {
  right: auto;
  bottom: 10px;
  left: 10px;
}
.ember-cli-notifications-notification__container--bottom-right {
  right: 10px;
  bottom: 10px;
  left: auto;
}
.c-notification {
  position: relative;
  overflow: hidden;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 8px 20px;
  font-size: 20px;
  line-height: 1.2;
  background-color: rgba(255, 102, 0, 0.85);
  border-radius: 6px;
  animation: notification-hide 250ms cubic-bezier(.33859, -.42, 1, -.22), notification-shrink 250ms 250ms cubic-bezier(.5, 0, 0, 1);
  animation-fill-mode: forwards;
  color: #fff;
  max-height: 800px;
  border-bottom: 1rem;
  margin-bottom: 1rem;
}
.c-notification__icon {
    font-weight: 700;
    font-size: 25px;
    font-style: italic;
  }
.c-notification__content {
    flex: 1 1 auto;
    text-align: left;
    margin-left: 15px;
    overflow: hidden;
    text-overflow: ellipsis;
  }
.c-notification__close {
    font-size: 16px;
    cursor: pointer;
  }
.c-notification__countdown {
    position: absolute;
    bottom: 0;
    left: 0;
    background-color: #fff;
    width: 0;
    height: 5px;
    opacity: 0.5;
    animation: notification-countdown linear 1;
  }
.c-notification--success {
    background-color: var(--black);
  }
.c-notification--info, .c-notification--warning {
    background-color: rgba(0, 158, 224, 0.85);
  }
.c-notification--error {
    background-color: rgba(255, 102, 0, 0.85);
  }
.c-notification--clickable {
  cursor: pointer;
}
.c-notification--in {
  animation: notification-show 180ms cubic-bezier(.175, .885, .32, 1.27499);
}
/* Keyframes */
@keyframes notification-show {
  0% {
    opacity: 0;
    transform: perspective(450px) translate(0, -30px) rotateX(90deg);
  }

  100% {
    opacity: 1;
    transform: perspective(450px) translate(0, 0) rotateX(0deg);
  }
}
@keyframes notification-shrink {
  0% {
    opacity: 0;
    max-height: var(--ecn-notification-max-height);
    transform: scale(.8);
  }

  100% {
    opacity: 0;
    max-height: 0;
    transform: scale(.8);
  }
}
@keyframes notification-hide {
  0% {
    opacity: 1;
    transform: scale(1);
  }

  100% {
    opacity: 0;
    transform: scale(.8);
  }
}
@keyframes notification-countdown {
  0% {
    width: 100%;
  }

  100% {
    width: 0%;
  }
}
.loader-wrapper {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  top: 0px;
  left: 0px;
  width: 100%;
  height: 100%;
}
/* Modernised 2FA setup modal — matches the DekkoCORE auth pages.
   The .twofa--modal class sits on .modal (the white box) and styles
   it as a wide rounded card with the brand pill at the top. */
/* Full-screen overlay that hides the app underneath — same cube image
   as the registration page but darkened 50% via a stacked black layer
   so the foreground content reads cleanly. */
.modal-bg.twofa-bg {
    background-color: #05071a;
    background-image:
        linear-gradient(rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.75)),
        url("/assets/images/core-bg-87fd99310933d708385899e5847352fa.jpg");
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    z-index: 1000;
}
/* Dark panel matching the registration / login background — keeps the
   2FA modal visually continuous with the page the user just came from. */
.twofa--modal {
    background-color: transparent;
    border-radius: 0;
    box-shadow: none;
    min-width: 0;
    width: 100%;
    max-width: none;
    padding: 40px 56px;
    color: #e7ecff;
    box-sizing: border-box;
}
.twofa.twofa--modern {
    display: block;
    color: #ffffff;
    font-size: 14px;
    line-height: 1.6;
    text-align: left;
}
.twofa.twofa--modern .twofa__title {
    margin: 0 0 16px;
    font-size: 24px;
    font-weight: 700;
    text-align: center;
    color: #ffffff;
    line-height: 1.2;
}
.twofa.twofa--modern .twofa__intro {
    margin: 0 0 10px;
    text-align: center;
}
.twofa.twofa--modern .twofa__warning {
    max-width: 650px;
    margin: 12px auto 8px;
    padding: 10px 14px;
    background: rgba(255, 244, 224, 0.12);
    border: 1px solid rgba(255, 217, 158, 0.5);
    color: #ffd9a3;
    border-radius: 6px;
    text-align: center;
}
.twofa.twofa--modern a {
    color: #8ea9ff;
    text-decoration: none;
}
.twofa.twofa--modern a:hover {
    text-decoration: underline;
}
/* QR + 6-digit code + Approve button block. */
.twofa.twofa--modern .twofa__setup {
    display: flex;
    justify-content: center;
    margin: 28px 0 32px;
}
.twofa.twofa--modern .twofa__setup-inner {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 18px;
    padding: 24px 28px;
    background: #ffffff;
    border: 1px solid #d3d8ea;
    border-radius: 12px;
    width: 320px;
    box-sizing: border-box;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
    color: #0a1130;
}
/* Force visible QR size to 150x150 regardless of what the QR library
   picks for its canvas/img intrinsic dimensions. The library may
   render at higher resolution for crispness; CSS owns the visible
   size. */
.twofa.twofa--modern .twofa__setup-inner .dekko-qrcode {
    display: flex;
    justify-content: center;
    align-items: center;
    margin: 0;
    width: 150px;
    height: 150px;
}
.twofa.twofa--modern .twofa__setup-inner .dekko-qrcode canvas,
.twofa.twofa--modern .twofa__setup-inner .dekko-qrcode img,
.twofa.twofa--modern .twofa__setup-inner .dekko-qrcode table {
    width: 150px !important;
    height: 150px !important;
    display: block;
}
.twofa.twofa--modern .twofa__setup-inner .field {
    width: 100%;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.twofa.twofa--modern .twofa__setup-inner .field__label {
    font-size: 13px;
    font-weight: 500;
    color: #4a5072;
    text-align: center;
}
.twofa.twofa--modern .twofa__setup-inner .field__input {
    width: 100%;
    box-sizing: border-box;
    padding: 10px 12px;
    border: 1px solid #d3d8ea;
    border-radius: 6px;
    background: #ffffff;
    color: #0a1130;
    font-size: 14px;
    line-height: 1.4;
    outline: none;
    height: auto;
    min-height: 0;
}
.twofa.twofa--modern .twofa__setup-inner .field__input:focus {
    border-color: #3b6dff;
    box-shadow: 0 0 0 3px rgba(59, 109, 255, 0.15);
}
.twofa.twofa--modern .twofa__setup-inner .button {
    width: 100%;
    padding: 10px 16px;
    background: #3b6dff;
    color: #ffffff;
    border: none;
    border-radius: 6px;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    height: auto;
    transition: background-color 0.15s ease;
}
.twofa.twofa--modern .twofa__setup-inner .button:hover {
    background: #2a58e6;
}
/* Two-column step grid (one per authenticator app). */
.twofa.twofa--modern .twofa__steps-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 24px;
    margin: 16px auto 0;
    max-width: 1280px;
}
.twofa.twofa--modern .twofa__steps {
    background: rgba(10, 17, 48, 0.65);
    border: 1px solid rgba(255, 255, 255, 0.15);
    border-radius: 10px;
    padding: 18px 20px;
    backdrop-filter: blur(2px);
}
.twofa.twofa--modern .twofa__steps-title {
    margin: 0 0 12px;
    font-size: 16px;
    font-weight: 700;
    color: #ffffff;
}
.twofa.twofa--modern .twofa__steps-list {
    margin: 0;
    padding-left: 18px;
    font-size: 14px;
    line-height: 1.6;
    color: #ffffff;
}
.twofa.twofa--modern .twofa__steps-list li {
    margin-bottom: 6px;
}
.twofa.twofa--modern .twofa__steps-list ul {
    margin: 4px 0 4px;
    padding-left: 16px;
    list-style: disc;
}
.twofa.twofa--modern .twofa__footnote {
    margin: 22px 0 0;
    text-align: center;
    font-size: 14px;
    color: #ffffff;
}
/* Responsive — collapse the step grid and tighten padding under 760px. */
@media (max-width: 760px) {
    .twofa--modal {
        padding: 32px 24px;
    }
    .twofa.twofa--modern .twofa__steps-grid {
        grid-template-columns: 1fr;
    }
}
/* Settings-page 2FA setup — component `qr-code-2fa` (full / two-step card
   variant) on /settings/account/twofa. The enforced enrollment MODAL passes
   compact=true and is styled by twofa-modal.css (.twofa--modern). */
/* Comfortable column width; left-aligned like every other settings tab. */
.twofa-page {
    max-width: 640px;
}
.setting__form-group.twofa-setup__group {
    max-width: 640px;
}
.twofa-setup__group .setting__form-description {
    max-width: none;
}
/* "Works with…" line with a green check. */
.twofa-setup__apps-note {
    margin-top: 8px;
    font-size: 13px;
    color: #5b6678;
}
.twofa-setup__apps-check {
    color: #0a8a4f;
    font-weight: 700;
    margin-right: 2px;
}
/* ---- Two-step sub-cards ---- */
.twofa-step {
    display: flex;
    align-items: flex-start;
    gap: 16px;
    border: 1px solid #e3e8f0;
    border-radius: 12px;
    padding: 20px;
    background: #fff;
    margin-bottom: 16px;
}
.twofa-step__num {
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: #2f6fed;
    color: #fff;
    font-size: 14px;
    font-weight: 700;
    display: flex;
    align-items: center;
    justify-content: center;
}
.twofa-step__main {
    flex: 1 1 auto;
    min-width: 0;
}
.twofa-step__title {
    margin: 2px 0 6px;
    font-size: 15px;
    font-weight: 700;
    color: #1c205c;
}
.twofa-step__body {
    margin: 0 0 12px;
    font-size: 13.5px;
    line-height: 1.5;
    color: #5b6678;
}
/* QR box on the right of step 1. */
.twofa-step__aside {
    flex: 0 0 auto;
    border: 1px solid #e3e8f0;
    border-radius: 8px;
    padding: 8px;
    background: #fff;
}
.twofa-step__aside .dekko-qrcode {
    width: 132px;
    height: 132px;
    display: flex;
    align-items: center;
    justify-content: center;
}
.twofa-step__aside .dekko-qrcode canvas,
.twofa-step__aside .dekko-qrcode img,
.twofa-step__aside .dekko-qrcode table {
    width: 132px !important;
    height: 132px !important;
    display: block;
}
/* Code + verify row in step 2. */
.twofa-step__verify {
    display: flex;
    align-items: center;
    gap: 10px;
}
.twofa-step__verify .field__input {
    width: 170px;
    margin: 0;
    padding: 10px 12px;
    border: 1px solid #cdd5e2;
    border-radius: 8px;
    font-size: 16px;
    letter-spacing: 3px;
}
/* .setting__form .field__input:not(:last-child) (dekkoSetting-form.css,
   specificity 0,3,0) re-adds a 15px bottom margin — the flex row centres the
   margin box, so the input rides ~8px above the button without this. */
.twofa-step__verify .field__input.twofa-step__code {
    margin: 0;
}
.twofa-step__verify-btn {
    flex: 0 0 auto;
    border: 0;
    border-radius: 8px;
    padding: 11px 20px;
    background: #2f6fed;
    color: #fff;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
}
.twofa-step__verify-btn:hover {
    background: #2a5fd0;
}
/* Quiet escape hatch next to Verify — abandoning setup is harmless. */
.twofa-step__cancel {
    border: 0;
    background: none;
    padding: 10px 6px;
    color: #5b6678;
    font-size: 14px;
    font-weight: 600;
    text-decoration: underline;
    cursor: pointer;
}
.twofa-step__cancel:hover {
    color: #1c2433;
}
.twofa-visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
}
/* "Don't have an app?" link (inside step 1) — visible throughout setup,
   unlike the page-level button row, which hides once setup opens. */
.twofa-step__get-app-row {
    margin: 0 0 6px;
}
.twofa-step__get-app {
    font-size: 13px;
    font-weight: 600;
    color: #1b4fc4;
    text-decoration: none;
}
.twofa-step__get-app:hover {
    text-decoration: underline;
}
/* "Can't scan? Use setup key" disclosure (inside step 1). */
.twofa-setup__manual {
    margin-top: 4px;
}
.twofa-setup__manual-toggle {
    list-style: none;
    cursor: pointer;
    font-size: 13px;
    font-weight: 600;
    color: #1b4fc4;
}
.twofa-setup__manual-toggle::-webkit-details-marker {
    display: none;
}
.twofa-setup__manual-toggle::after {
    content: " \25BE";
}
.twofa-setup__manual[open] .twofa-setup__manual-toggle::after {
    content: " \25B4";
}
.twofa-setup__manual-body {
    margin-top: 8px;
    font-size: 12.5px;
    color: #3a4763;
}
.twofa-setup__manual-key {
    font-family: ui-monospace, Consolas, monospace;
    font-size: 12.5px;
    letter-spacing: 1px;
    color: #1c205c;
    word-break: break-all;
    -webkit-user-select: all;
    user-select: all;
}
.twofa-setup__copy {
    border: 0;
    background: none;
    padding: 0;
    margin-left: 8px;
    color: #1b4fc4;
    font-weight: 600;
    font-size: 12px;
    text-decoration: underline;
    cursor: pointer;
}
/* Clock tip. */
.twofa-setup__tip {
    margin: 4px 0 0;
    font-size: 13px;
    line-height: 1.5;
    color: #0a5e34;
    background: #e9f7ef;
    border: 1px solid #bfe6cf;
    border-radius: 10px;
    padding: 12px 14px;
}
.twofa-setup__tip strong {
    color: #0a5e34;
}
.twofa-setup__tip-list {
    margin: 6px 0 0;
    padding-left: 18px;
}
.twofa-setup__tip-list li {
    margin-top: 4px;
}
/* ---- Status pill in the section title ---- */
.twofa-title {
    display: flex;
    align-items: center;
    gap: 10px;
}
.twofa-pill {
    font-size: 12px;
    font-weight: 700;
    line-height: 1;
    border-radius: 999px;
    padding: 5px 12px;
    white-space: nowrap;
}
.twofa-pill--on {
    color: #0c7a43;
    background: #e9f7ef;
    border: 1px solid #bfe6cf;
}
.twofa-pill--off {
    color: #5b6678;
    background: #f3f5f9;
    border: 1px solid #e3e8f0;
}
/* ---- Inline verification diagnosis (under the code field) ---- */
.twofa-alert {
    margin-top: 12px;
    border-radius: 8px;
    padding: 10px 14px;
    font-size: 13px;
    line-height: 1.5;
}
.twofa-alert strong {
    display: block;
    margin-bottom: 2px;
}
.twofa-alert--info {
    color: #1b4fc4;
    background: #eef3fe;
    border: 1px solid #c7d7f7;
}
.twofa-alert--warn {
    color: #b54708;
    background: #fff4ec;
    border: 1px solid #f5cba7;
}
.twofa-alert--error {
    color: #b42318;
    background: #fdf0ef;
    border: 1px solid #f2c4c0;
}
/* ---- Manage-state notes (2FA already enabled) ---- */
.twofa-manage-note {
    margin-top: 14px;
    font-size: 12.5px;
    line-height: 1.5;
    color: #1b4fc4;
    background: #eef3fe;
    border: 1px solid #c7d7f7;
    border-radius: 8px;
    padding: 10px 14px;
}
.twofa-manage-note--muted {
    color: #5b6678;
    background: #f3f5f9;
    border-color: #e3e8f0;
}
@media (max-width: 560px) {
    .twofa-step {
        flex-wrap: wrap;
    }
    .twofa-step__aside {
        order: 3;
    }
}
@keyframes blink {
  from, to {
    opacity: 0;
  }
  50% {
    opacity: 1;
  }
}
.room__promt {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  flex: 1 1 auto;
  /* color: #0f1a34; */
  padding: 90px;
  padding-top: 0;
  text-align: center;
  line-height: 1.75;
  font-size: 16px;
}
@media only screen and (max-device-width: 640px) {
.room__promt {
    padding: 0
}
  }
.room__promt p {
    margin-bottom: 30px;
  }
/* The in-call surface is deliberately dark in both themes: video reads against
   near-black, and a light call UI would fight every participant's webcam. So
   these are fixed values rather than light/dark theme tokens. The one exception
   is --room-accent, which stays on the DekkoCORE brand cyan.
 *
 * Global rather than scoped to .room-conference, unlike every other block here,
 * because the call UI is spread across three sibling subtrees of <body>: the
 * call surface inside .page, the header (.page--conference .vltheader), and the
 * meeting name and recording badge, which are wormholed into #conference-wormhole
 * at the end of the document. :root is their only common ancestor. The --room-
 * prefix is what keeps them out of everyone else's way. */
:root {
  --room-bg: #15181f;
  --room-tile-bg: #1e232c;
  --room-control-bg: rgba(255, 255, 255, 0.12);
  --room-control-bg-hover: rgba(255, 255, 255, 0.22);
  --room-control-fg: #ffffff;
  --room-control-muted-fg: #93a0b4;
  --room-danger: #d5372b;
  --room-danger-hover: #e2493d;
  --room-accent: var(--colour-brand);
  --room-accent-fg: #0b1030;
  --room-panel-bg: #1b2029;
  --room-panel-border: rgba(255, 255, 255, 0.14);
  --room-tile-radius: 12px;
}
.room-conference {
  position: relative;
  width: 100%;
  height: 100%;
  background-color: var(--room-bg);
  overflow: hidden;
}
/* The control bar used to be revealed by `:hover` alone. That meant it stayed
     hidden for anyone watching without moving the mouse, and never appeared at
     all on a device that cannot hover. The component now tracks pointer activity
     and toggles --controls-visible; `:hover` is kept as a fallback for the window
     between render and the first pointer event. */
.room-conference--controls-visible .room__new-toolbox, .room-conference--controls-visible .room__toolbox-background, .room-conference:hover .room__new-toolbox, .room-conference:hover .room__toolbox-background {
      bottom: 0;
    }
/* Nothing to hover with, so the controls simply stay up. */
@media (hover: none) {
    .room-conference .room__new-toolbox, .room-conference .room__toolbox-background {
      bottom: 0;
    }
  }
/* Chat and transcription dock beside the call instead of covering it, the way
     Teams does. The panel is a fixed overlay pinned to the right edge, so the
     call surface simply stops short of it — reading its width from the token the
     sidebar itself is sized by, rather than repeating the number here.

     Width rather than padding on purpose: the tile maths measures clientWidth,
     which includes padding, so padding here would have reserved nothing.

     The transition is safe alongside the ResizeObserver that watches this
     element: Ember's `debounce` is trailing-edge, so the resize events fired on
     every frame of the animation coalesce into a single recomputation once it
     settles. */
.room-conference--docked {
    width: calc(100% - var(--sidebar-width));
    transition: width 0.5s ease;
  }
.room__new-toolbox {
  bottom: calc((40px * 2) * -1);
  left: 0;
  position: absolute;
  right: 0;
  transition: bottom .3s ease-in;
  width: 100%;
  z-index: 2;
}
@media only screen and (max-device-width: 640px) {
.room__new-toolbox {
    bottom: calc((40px * 4) * -1)
}
  }
.room__toolbox-background {
  background-image: linear-gradient(to top,rgba(0,0,0,.6),rgba(0,0,0,0));
  transition: bottom .3s ease-in;
  height: 160px;
  width: 100%;
  bottom: -160px;
  pointer-events: none;
  position: absolute;
}
/* Three-part bar: secondary controls left, core controls centred, panel toggles
   right. A grid with symmetric 1fr side tracks is what actually keeps the centre
   group centred — with plain flex the centre drifts as the side groups change
   width (the owner-only buttons appear for hosts only, the transcription button
   only when a language was chosen).

   Note the breakpoints below are window-width, NOT `--phone-viewport`. That
   custom media is `max-device-width`, so a narrowed desktop window never matched
   it and the bar got no responsive treatment at all — which is how the controls
   ended up squashed. */
.room__toolbox-content {
  box-sizing: border-box;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 12px;
  margin-left: auto;
  margin-right: auto;
  padding: 16px 16px 20px;
  position: relative;
  width: 100%;
}
.room__toolbox-group {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}
/* Columns AND the row are assigned explicitly rather than left to document
     order. The `display: contents` wrapper below hoists both secondary groups
     into the grid as items 1 and 2, so without this the core controls land in
     column 3 and the bar sits visibly off-centre. The row matters just as much:
     grid auto-placement only moves forwards, so once the --end group has claimed
     column 3, placing --center back in column 2 pushes it onto a second row. */
.room__toolbox-group--start {
    grid-row: 1;
    grid-column: 1;
    justify-content: flex-start;
  }
/* The core controls sit in their own translucent pill so the actions that
     matter read as one object. */
.room__toolbox-group--center {
    grid-row: 1;
    grid-column: 2;
    justify-content: center;
    gap: 10px;
    padding: 8px;
    background-color: rgba(10, 12, 17, 0.55);
    border: 1px solid var(--room-panel-border);
    border-radius: 999px;
    backdrop-filter: blur(8px);
  }
.room__toolbox-group--end {
    grid-row: 1;
    grid-column: 3;
    justify-content: flex-end;
  }
/* Wraps the two secondary groups so they can collapse into a single popover.
   `display: contents` makes this element vanish from layout at wide widths, so
   its two children remain direct grid items of .room__toolbox-content and the
   three-part layout is unaffected. */
.room__toolbox-secondary {
  display: contents;
}
/* The overflow trigger only exists below the breakpoint, where the secondary
   groups leave the grid and column 3 is free. */
.room__toolbox-more {
  display: none;
  grid-row: 1;
  grid-column: 3;
  justify-content: flex-end;
}
@media (max-width: 1180px) {
  .room__toolbox-group { gap: 8px; }
  .room__toolbox-group--center { gap: 8px; padding: 7px; }
}
/* Below this the three groups no longer fit side by side, so the secondary
   controls fold into a popover above the More button and the pill keeps the
   full width it needs. */
@media (max-width: 900px) {
  .room__toolbox-content {
    grid-template-columns: 1fr auto 1fr;
    padding: 12px 12px 16px;
  }

  .room__toolbox-secondary {
    display: none;
    position: absolute;
    right: 12px;
    bottom: calc(100% - 4px);
    flex-direction: column;
    align-items: stretch;
    gap: 4px;
    /* Sized to its own content instead of stretching across the bar. */
    width: max-content;
    min-width: 210px;
    max-width: calc(100vw - 24px);
    /* Eight rows is ~350px. That fits above the bar in a normal window, but a
       short one would push the first entries off the top of the screen where
       they cannot be reached. */
    max-height: calc(100vh - 150px - var(--banner-height));
    overflow-y: auto;
    padding: 8px;
    background-color: var(--room-panel-bg);
    border: 1px solid var(--room-panel-border);
    border-radius: 14px;
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);
  }

  .room__toolbox--overflow-open .room__toolbox-secondary {
    display: flex;
  }

  /* Each group is a row of circular buttons at wide widths; in the popover they
     have to become a column of full-width rows, or only the first button of each
     group is visible and the rest overflow the panel. The grid placement from the
     wide layout must be dropped too — these are flex children here, not grid
     items, and `grid-column: 3` would otherwise still apply if the element were
     ever laid out in a grid context. */
  .room__toolbox-secondary .room__toolbox-group {
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: 4px;
    grid-column: auto;
    grid-row: auto;
  }

  .room__toolbox-more {
    display: flex;
  }
}
@media (max-width: 560px) {
  .room__toolbox-group--center {
    gap: 6px;
    padding: 6px;
  }
}
.room__toolbox-button {
  position: relative;
  box-sizing: border-box;
  display: flex;
  justify-content: center;
  align-items: center;
  /* These are real <button>s now, so the user-agent's font, padding and outline
     have to be reset before the styling below applies. */
  font: inherit;
  appearance: none;
  outline: none;
  /* The whole reason the controls squashed into ellipses at narrow widths: these
     are flex items with a fixed width and the default `flex-shrink: 1`, so they
     were compressed below 40px while height held, and `border-radius: 50%` turned
     each circle into an oval. Nothing about a control button should ever shrink. */
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  margin: 0;
  cursor: pointer;
  color: var(--room-control-fg);
  background-color: var(--room-control-bg);
  border: 0;
  border-radius: 50%;
  line-height: 1;
  text-align: center;
  transition: background-color 0.15s ease, color 0.15s ease, transform 0.15s ease;
}
/* The new icon set is stroked, not filled, and takes its colour from the
     button via currentColor. */
.room__toolbox-button svg {
    width: 22px;
    height: 22px;
    fill: none;
    stroke: currentColor;
    pointer-events: none;
  }
.room__toolbox-button:hover {
    background-color: var(--room-control-bg-hover);
  }
.room__toolbox-button:active {
    transform: scale(0.94);
  }
/* Keyboard focus has to be obvious against video of unknown brightness, hence
     a ring plus a dark halo rather than a single hairline. `:focus-visible` so
     it appears for keyboard users without ringing every mouse click. */
.room__toolbox-button:focus-visible {
    box-shadow: 0 0 0 2px var(--room-bg), 0 0 0 4px var(--room-accent);
  }
.room__toolbox-button:disabled {
    cursor: not-allowed;
  }
/* A control whose panel is open, or whose feature is on (screen share). */
.room__toolbox-button--active {
    background-color: var(--room-accent);
    color: var(--room-accent-fg);
  }
.room__toolbox-button--active:hover {
      background-color: var(--room-accent);
    }
/* Mic or camera off. Previously the *unmuted* state was the loud one — a pale
     filled circle — and muted was a quiet dark circle, so the state that needs
     noticing was the state that disappeared. Inverted to match every other
     conferencing tool. */
.room__toolbox-button--muted {
    background-color: var(--room-danger);
    color: #fff;
  }
.room__toolbox-button--muted:hover {
      background-color: var(--room-danger-hover);
    }
/* Present but not usable here (e.g. transcription on Edge). */
.room__toolbox-button--unavailable {
    color: var(--room-control-muted-fg);
    background-color: rgba(255, 255, 255, 0.06);
    cursor: not-allowed;
  }
.room__toolbox-button--unavailable:hover {
      background-color: rgba(255, 255, 255, 0.06);
    }
.room__toolbox-button--phone {
    width: 52px;
    background-color: var(--room-danger);
    border-radius: 999px;
    color: #fff;
  }
.room__toolbox-button--phone:hover {
      background-color: var(--room-danger-hover);
    }
/* Unread group-chat messages. */
.room__toolbox-button--badge:after {
    content: '';
    position: absolute;
    top: 4px;
    right: 4px;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background-color: var(--room-accent);
    box-shadow: 0 0 0 2px var(--room-bg);
  }
/* Status glyphs in a tile's overlay strip — not interactive. */
.room__toolbox-button--remote {
    width: 22px;
    height: 22px;
    background: none;
    cursor: auto;
  }
.room__toolbox-button--remote svg {
      width: 16px;
      height: 16px;
    }
.room__toolbox-button--remote:hover {
      background: none;
    }
.room__toolbox-button--remote.room__toolbox-button--muted {
      width: 22px;
      background: none;
      color: var(--room-danger);
    }
.room__toolbox-button--chat {
    background: none;
    cursor: pointer;
  }
.room__toolbox-button--chat:hover {
      background: none;
      color: var(--room-accent);
    }
/* Inside the narrow-width overflow popover the buttons become full-width rows
     so they can carry a label. */
@media (max-width: 900px) {
.room__toolbox-secondary .room__toolbox-button {
      width: 100%;
      justify-content: flex-start;
      gap: 10px;
      padding: 0 12px;
      border-radius: 10px;
      background: none;
      /* The circular treatment for --active paints a cyan disc with a navy glyph.
         In the popover the disc is gone, so that navy would be an invisible icon
         on a near-black panel; the accent moves to the glyph itself. */
      color: var(--room-control-fg)
  }

      .room__toolbox-secondary .room__toolbox-button:hover {
        background-color: var(--room-control-bg);
      }

      .room__toolbox-secondary .room__toolbox-button.room__toolbox-button--active {
        background: none;
        color: var(--room-accent);
      }

      .room__toolbox-secondary .room__toolbox-button.room__toolbox-button--muted {
        background: none;
        color: var(--room-danger);
      }
    }
/* ---------- Participants panel ---------- */
/* The live in-call roster. Distinct from the sidebar's "Attendees" tab, which
   lists who was *invited*; this lists who is actually connected right now, with
   their live mute state. */
.room__participants {
  position: absolute;
  top: 16px;
  right: 16px;
  bottom: 104px;
  z-index: 3;
  display: flex;
  flex-direction: column;
  width: 300px;
  max-width: calc(100% - 32px);
  background-color: var(--room-panel-bg);
  border: 1px solid var(--room-panel-border);
  border-radius: 16px;
  box-shadow: 0 16px 40px rgba(0, 0, 0, 0.55);
  color: var(--room-control-fg);
  overflow: hidden;
}
.room__participants-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--room-panel-border);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--room-control-muted-fg);
}
.room__participants-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: none;
  cursor: pointer;
  color: var(--room-control-fg);
  font: inherit;
  font-size: 12px;
  outline: none;
}
.room__participants-close:hover {
    background-color: var(--room-control-bg);
  }
.room__participants-close:focus-visible {
    box-shadow: 0 0 0 2px var(--room-panel-bg), 0 0 0 4px var(--room-accent);
  }
.room__participants-list {
  flex: 1 1;
  overflow-y: auto;
  padding: 8px;
  scrollbar-width: thin;
}
.room__participants-list::-webkit-scrollbar {
    width: 6px;
  }
.room__participants-list::-webkit-scrollbar-thumb {
    border-radius: 3px;
    background-color: rgba(255, 255, 255, 0.2);
  }
.room__participants-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: 10px;
}
.room__participants-row:hover {
    background-color: rgba(255, 255, 255, 0.06);
  }
.room__participants-name {
  flex: 1 1;
  min-width: 0;
  font-size: 13px;
}
.room__participants-you {
  font-size: 11px;
  color: var(--room-control-muted-fg);
}
.room__participants-state {
  display: flex;
  align-items: center;
  gap: 4px;
  flex: 0 0 auto;
}
/* Label shown only when a control is folded into the overflow popover. */
.room__toolbox-button-label {
  display: none;
  font-size: 13px;
  font-weight: 500;
  white-space: nowrap;
  color: var(--room-control-fg);
}
@media (max-width: 900px) {
    .room__toolbox-secondary .room__toolbox-button-label {
      display: inline;
    }
  }
.room__video {
  width: 100%;
  height: 100%;
}
.room__video video {
    display: inline-block;
    vertical-align: baseline;
    object-fit: cover;
    width: 100%;
    height: 100%;
  }
.room__audio {
  display: none;
}
.room__flip-video {
  transform: scale(-1, 1);
}
/* Speaker view: focused video beside the filmstrip, laid out as a row. */
.room__stage {
  display: flex;
  align-items: stretch;
  width: 100%;
  height: 100%;
}
.room__large-video {
  position: relative;
  /* Takes whatever width the filmstrip leaves. `min-width: 0` because a flex
     item otherwise refuses to shrink below its content's intrinsic width. */
  flex: 1 1;
  min-width: 0;
  height: 100%;
  margin: 0;
}
/* The focused video now fills an area of arbitrary shape rather than a box cut
   to its own aspect ratio, so it has to letterbox. `cover` would crop the
   speaker — and would hide the edges of a shared screen, which is the whole
   point of looking at one. Thumbnails keep `cover`: they are fixed 4:3 and a
   crop there is unobjectionable. */
.room__large-video .room__video video {
  object-fit: contain;
}
/* Speaker-view filmstrip. A column in the flex row above, not an overlay: as an
   absolutely positioned layer it sat on top of padding reserved by
   .room-conference--camera, which meant its width had to be duplicated in CSS
   and in JS, and it went on covering things whenever the two drifted apart. */
.room__remote-tracks {
  position: static;
  /* 200px tile (150 * 4/3) plus the 16px padding either side. */
  flex: 0 0 auto;
  width: 232px;
  height: 100%;
  overflow-x: hidden;
  overflow-y: auto;
  display: flex;
  align-items: center;
  flex-direction: column;
  gap: 10px;
  /* Bottom clearance so the last tile does not sit underneath the control bar
     once it slides up. */
  padding: 16px 16px 104px;
  box-sizing: border-box;
  z-index: 1;
  scrollbar-width: thin;
}
.room__remote-tracks::-webkit-scrollbar {
    width: 6px;
  }
.room__remote-tracks::-webkit-scrollbar-thumb {
    border-radius: 3px;
    background-color: rgba(255, 255, 255, 0.2);
  }
.room__remote-video-container {
  position: relative;
  background-color: var(--room-tile-bg);
  height: 150px;
  min-height: 150px;
  width: calc(150px * 4/3);
  /* Clips the video element to the tile's corners; without it the radius on
     .room__tile-thumbnail was drawn behind a square video. */
  overflow: hidden;
  border-radius: var(--room-tile-radius);
}
/* Active speaker. A hard blue glow bleeding 3px past the tile read as a
     selection artefact; a ring in the brand cyan sits inside the tile instead and
     survives tiles being packed 10px apart.

     It has to be a pseudo-element: the <video> fills the tile and paints over an
     `inset` box-shadow on the container, so the ring was invisible in exactly the
     case it exists for. */
.room__remote-video-container--dominant {
    z-index: 1;
  }
.room__remote-video-container--dominant:after {
      content: '';
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 2;
      border: 2px solid var(--room-accent);
      border-radius: inherit;
      pointer-events: none;
    }
/* Per-tile status strip. It used to be a full-width 30%-black band pinned across
   the top of every tile, which covered the top of each participant's face — the
   one part of the frame worth seeing. Moved to the bottom, over a gradient that
   fades to nothing, so it reads without hiding anything. */
.room__remote-toolbox-content {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  top: auto;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  gap: 6px;
  width: 100%;
  padding: 16px 10px 7px;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.72), rgba(0, 0, 0, 0));
  pointer-events: none;
  z-index: 1;
}
/* The strip is a pass-through layer so it cannot eat clicks meant for the
     video; the two controls inside it opt back in. */
.room__remote-toolbox-content .room__toolbox-button {
    pointer-events: auto;
  }
.room__toolbox-name {
  display: flex;
  align-items: center;
  /* Takes the strip's remaining width so a long name ellipsises instead of
     pushing the status glyphs out of the tile. */
  flex: 1 1;
  min-width: 0;
  margin: 0;
  padding-left: 6px;
  font-size: 12px;
  font-weight: 500;
  color: var(--white);
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
}
.room__toolbox-name svg {
    margin: 0 6px;
  }
.room__offline-container {
  padding: 50px;
  overflow: hidden;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  text-align: center;
}
.room__copy {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  text-transform: uppercase;
  font-size: 40px;
  letter-spacing: 0.5px;
  color: var(--white);
}
.room__copy--small {
    font-size: 20px;
    overflow: hidden;
    text-align: center;
  }
.icon-wifi {
  width: 20px;
  height: 20px;
}
.icon-wifi path {
    fill: transparent;
    transition: fill 0.5s;
  }
.icon-wifi--high path {
    fill: green;
  }
.icon-wifi--medium path:nth-child(1),
    .icon-wifi--medium path:nth-child(2) {
     fill: #FFD740;
    }
.icon-wifi--low path:nth-child(1) {
      fill: #BF2117;
    }
.room__tile-container {
  height: 100%;
  width: 100%;
  align-content: center;
  align-items: center;
  box-sizing: border-box;
  /* An explicit column count, set as --tile-columns by the component, rather
     than `flex-wrap` deciding for itself. The tile sizing maths is computed for
     a specific number of columns; letting CSS wrap to a different number is what
     put three tiles sized for a 2-column grid onto a single row, with the height
     maths still reserving space for two rows. */
  display: grid;
  /* Explicit track width rather than max-content, so the offset that centres a
     partial last row can be expressed in the same units. */
  grid-template-columns: repeat(var(--tile-columns, 1), var(--tile-width, max-content));
  /* 30px matches `sideMargins` / `topBottomPadding` in utils/jitsi/tile.js, which
     already subtracts 30*2 on each axis when sizing a thumbnail. The padding was
     never actually applied, so that reserved space sat unused and every tile came
     out 60px narrower than it needed to be. */
  padding: 30px;
  /* Replaces `margin: 5px` on each thumbnail. 10px is MARGIN_BEETWEN_TILE_ITEM
     from the same module — the sizing math depends on this number, so the two
     must be changed together. */
  gap: 10px;
  margin-top: auto;
  margin-bottom: auto;
  justify-content: center;
  overflow-x: hidden;
  overflow-y: auto;
}
.room__tile-thumbnail {
  margin: 0;
  border-radius: var(--room-tile-radius);
}
/* Centres a last row that does not fill its columns. Grid packs the leftovers
   into the first columns, which left a lone third tile sitting under the
   left-hand one instead of between the two above it. Each pair below matches an
   orphan count to the item that starts that row — :nth-last-child(n) where n is
   the number stranded — and nudges it right by half the missing width; the rest
   of the row follows it. Ten columns is the maximum, so nine is the most that
   can ever be left over. */
.room__tile-container--orphans-1 > *:nth-last-child(1),
.room__tile-container--orphans-2 > *:nth-last-child(2),
.room__tile-container--orphans-3 > *:nth-last-child(3),
.room__tile-container--orphans-4 > *:nth-last-child(4),
.room__tile-container--orphans-5 > *:nth-last-child(5),
.room__tile-container--orphans-6 > *:nth-last-child(6),
.room__tile-container--orphans-7 > *:nth-last-child(7),
.room__tile-container--orphans-8 > *:nth-last-child(8),
.room__tile-container--orphans-9 > *:nth-last-child(9) {
  margin-left: var(--tile-last-offset, 0px);
}
/* In-call header. The app's white bar with its blue underline read as a strip of
   a different product sitting on top of the call, so during a meeting it takes
   the call surface's own colour. Scoped to .page--conference, which the
   authenticated template only sets on the conference route — every other page
   keeps the standard header. */
.page--conference .vltheader {
    background-color: var(--room-bg);
    border-bottom: 1px solid rgba(255, 255, 255, 0.10);
  }
/* `.theme-icon` forces its fill with !important, so matching it needs the same. */
.page--conference .vltheader .theme-icon {
    fill: var(--room-control-fg) !important;
  }
.page--conference .vltheader__dropdown-trigger {
    color: var(--room-control-fg);
  }
.page--conference .vltheader__dropdown-trigger:hover {
      background-color: rgba(255, 255, 255, 0.10);
      border-radius: 8px;
    }
/* Meeting name and elapsed time, wormholed into the header strip.

   Was a 24px name with a 24px clock stacked underneath it, which made the two
   read as equally important and pushed the block taller than the 60px bar it
   sits in. One line now: the name leads, the clock follows as a quiet chip. */
.room__timer {
  position: absolute;
  left: 50%;
  top: 0;
  height: 60px;
  z-index: 4;
  transform: translateX(-50%);
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 0 16px;
  max-width: min(560px, 50vw);
  font-weight: 600;
  font-size: 15px;
  color: var(--room-control-fg);
}
.room__timer--name {
    top: 0;
  }
.room__timer-name {
  min-width: 0;
  max-width: 380px;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0.01em;
}
.room__timer-clock {
  flex: 0 0 auto;
  padding: 3px 9px;
  border-radius: 999px;
  background-color: rgba(255, 255, 255, 0.12);
  font-size: 12px;
  font-weight: 600;
  /* The clock ticks every second; without tabular figures the chip jitters. */
  font-variant-numeric: tabular-nums;
  color: var(--room-control-fg);
}
.room__chat-tab {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  padding: 0;
  height: calc(100% - 50px);
  overflow-x: hidden;
  background: var(--body-bg);
}
.room__chat-container {
  box-sizing: border-box;
  flex: 1 1 auto;
  overflow-y: auto;
  width: 100%;
  padding: 0 30px;
}
.room__chat-container .dialog__head {
    margin-bottom: 0;
  }
.room__chat-container .dialog__msg:not(:last-child) {
    margin-bottom: 0;
  }
.room__chat-footer {
  width: 100%;
}
.room__chat-footer textarea {
    border: 0;
    border-radius: 0;
    box-shadow: 0 -1px 5px 0 rgb(0 0 0 / 16%);
  }
.room__chat-footer textarea::placeholder {
      font-size: 13px;
    }
.room__footer-notification {
  position: relative;
  width: 370px;
  margin: 0 auto;
  font-size: 15px;
  color: var(--white);
  text-align: center;
  padding: 12px;
  line-height: 28px;
  border-radius: 4px;
  background-color: var(--black);
}
.room__chat-title {
  box-sizing: border-box;
  font-weight: bold;
  padding: 15px 10px;
  text-align: center;
  width: 100%;
  background: var(--body-bg);
}
.room__quality-label {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  text-align: center;
  color: #fff;
  font-size: 22px;
}
.room__recording {
  position: absolute;
  top: 15px;
  left: 190px;
  z-index: 4;
  height: 30px;
  padding: 0 12px 0 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2px;
  border-radius: 999px;
  background-color: rgba(213, 55, 43, 0.16);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: #ff9d94;
}
.room__blinking {
  animation: 1s blink ease infinite;
}
.room__icon-help {
  display: inline-block;
  height: 20px;
  color: var(--hero-blue);
  cursor: pointer;
  margin-left: 5px;
}
/* transform: translateY(5px); */
@media only screen and (max-device-width: 640px) {
.room__icon-help {
    display: none
}
  }
.room__icon-help svg {
    fill: var(--hero-blue);
  }
.room__icon-help--with-text {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-top: 10px;
  }
/* transform: none; */
.room__icon-help--with-text svg {
      margin-left: 5px;
    }
.room__banner {
  box-sizing: border-box;
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
  background-color: var(--solitude);
  font-size: 14px;
  text-align: center;
  color: var(--black);
  padding: 20px 20px 0;
  border-radius: 10px 10px 0 0;
}
.room__banner-blue-title {
  font-size: 16px;
  font-weight: bold;
  color: var(--hero-blue);
  margin: 5px 0 10px;
}
.room__banner-list {
  font-weight: bold;
  line-height: 1.79;
}
.room__banner-logo {
  padding: 0 20px 20px 0;
}
.recovery__wrap {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  padding: 0 80px;
}
@media only screen and (max-device-width: 640px) {
.recovery__wrap {
    padding: 0 10px
}
  }
.recovery__title {
  font-size: 20px;
  font-weight: 700;
  letter-spacing: 0.02em;
  margin-bottom: 20px;
}
.recovery__copy {
  font-size: 16px;
  font-weight: 400;
  letter-spacing: 0.02em;
  text-align: center;
}
.recovery__divider {
  height: 1px;
  margin: 40px;
  background-color: var(--black);
}
.recovery__divider--big {
    width: 440px;
  }
@media only screen and (max-device-width: 640px) {
.recovery__divider--big {
      width: 250px
  }
    }
.recovery__divider--small {
    width: 225px;
  }
.recovery__form {
  max-width: 350px;
  margin: 20px auto;
}
.recovery__link {
  color: var(--colour-info-8);
  font-size: 14px;
  font-weight: 700;
  letter-spacing: 0.02em;
  text-align: center;
}
.recovery__card {
  box-sizing: border-box;
  background: #CFF5F6;
  border: 1px solid #0055BC;
  border-radius: 3px;
  padding: 17px 20px;
  margin: 20px 0 40px;
  max-width: 460px;
}
.recovery__card--pink {
    background-color: var(--pink);
    border-color: var(--colour-danger-4);
    margin-bottom: 10px;
  }
/*
.recovery__copy {
  font-size: 16px;
  line-height: 1.43;
  text-align: center;
  margin-bottom: 25px;

  &--bold {
    font-weight: bold;
  }
}



.recovery__checkbox {
  display: flex;
  justify-content: center;
  cursor: pointer;

  & .checkbox {
    margin-right: 10px;
  }
}
 */
/* New styles for the redesigned recovery form */
.recovery-v2__option {
  background-color: #E7FEFF;
  border: 1px solid #0055BC;
  border-radius: 8px;
  padding: 20px;
  margin: 20px 0;
  width: 100%;
  box-sizing: border-box;
}
.recovery-v2__option-title {
  font-size: 18px;
  font-weight: 700;
  margin-bottom: 15px;
  color: #000;
  text-align: center;
}
.recovery-v2__copy {
  font-size: 16px;
  font-weight: 400;
  letter-spacing: 0.02em;
  text-align: center;
  margin-bottom: 10px;
  line-height: 1.4;
}
.recovery-v2__form {
  max-width: 100%;
  margin: 20px 0;
}
.recovery-v2__form .sign__form-field {
  max-width: 350px;
  margin: 0 auto;
}
.recovery-v2__divider {
  height: 1px;
  margin: 20px 0;
  background-color: var(--black);
  width: 100%;
}
.recovery-v2__checkbox-container {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 15px 0;
  gap: 8px;
}
.recovery-v2__checkbox-label {
  font-size: 14px;
  line-height: 1.4;
  cursor: pointer;
  margin: 0;
  text-align: center;
}
.recovery-v2__submit-btn {
  margin-top: 15px;
  width: 100%;
  max-width: 200px;
  display: block;
  margin-left: auto;
  margin-right: auto;
}
.recovery-v2__back-link {
  margin-top: 20px;
  text-align: center;
  display: block;
}
/* Settings → Passkeys (/settings/account/passkeys). Palette matches the 2FA settings page. */
.passkeys {
    max-width: 640px;
    /* Keep the last control (e.g. Remove password) off the bottom edge / footer. */
    padding-bottom: 28px;
}
/* ---- Security status banner ---- */
.passkeys__status {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 16px 0 4px;
    padding: 12px 14px;
    border-radius: 10px;
    font-size: 13.5px;
    font-weight: 600;
    color: #5b6678;
    background: #f3f5f9;
    border: 1px solid #e3e8f0;
}
.passkeys__status-dot {
    flex: 0 0 auto;
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: #9aa6b8;
}
.passkeys__status--ok {
    color: #0c7a43;
    background: #e9f7ef;
    border-color: #bfe6cf;
}
.passkeys__status--ok .passkeys__status-dot {
    background: #16a34a;
}
.passkeys__status--alert {
    color: #92400e;
    background: #fef3c7;
    border-color: #fde68a;
}
.passkeys__status--alert .passkeys__status-dot {
    background: #d97706;
}
/* ---- Sections ---- */
.passkeys__section {
    margin-top: 22px;
    padding-top: 18px;
    border-top: 1px solid #eef1f6;
}
.passkeys__section-title {
    font-size: 15px;
    font-weight: 700;
    color: #1c205c;
    margin-bottom: 6px;
}
/* ---- Passkey cards ---- */
.passkeys__list {
    margin: 12px 0;
}
.passkey-card {
    display: flex;
    align-items: center;
    gap: 14px;
    border: 1px solid #e3e8f0;
    border-radius: 12px;
    padding: 14px 16px;
    background: #fff;
    margin-bottom: 10px;
}
.passkey-card__icon {
    flex: 0 0 auto;
    width: 38px;
    height: 38px;
    border-radius: 10px;
    background: #eef3fe;
    color: #2f6fed;
    display: flex;
    align-items: center;
    justify-content: center;
}
/* Key icon (swap for the official FIDO passkey SVG for exact branding). Inherits color via currentColor. */
.passkey-icon {
    display: inline-block;
    vertical-align: middle;
}
/* In the "Sign in with a passkey" button. */
.login__button .passkey-icon {
    margin-right: 8px;
    margin-top: -2px;
}
/* Small icon in the Settings → Passkeys nav tab title. */
.passkey-icon--nav {
    margin-right: 6px;
    vertical-align: -2px;
    color: #2f6fed;
}
.passkey-card__body {
    flex: 1 1 auto;
    min-width: 0;
}
.passkey-card__name {
    font-size: 14.5px;
    font-weight: 700;
    color: #1c205c;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.passkey-card__meta {
    font-size: 12.5px;
    color: #5b6678;
    margin-top: 2px;
}
.passkey-card__remove {
    flex: 0 0 auto;
}
.passkeys__empty {
    font-size: 13.5px;
    color: #5b6678;
    padding: 14px 0;
}
/* ---- Add-a-passkey card (Settings → Passkeys). Palette matches the post-signup
   passkey-suggest modal: brand blue #2f6fed, navy #1c205c, body grey #5b6678. ---- */
.passkey-add {
    margin-top: 16px;
    padding: 20px;
    border: 1px solid #e3e8f0;
    border-radius: 14px;
    background: linear-gradient(180deg, #fbfcff 0%, #f5f8fd 100%);
}
.passkey-add__head {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    margin-bottom: 18px;
}
.passkey-add__icon {
    flex: 0 0 auto;
    width: 44px;
    height: 44px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #2f6fed;
    background: #eaf1ff;
}
.passkey-add__icon--muted {
    color: #8a93a6;
    background: #eef1f6;
}
.passkey-add__title {
    font-size: 15.5px;
    font-weight: 700;
    color: #1c205c;
    line-height: 1.3;
}
.passkey-add__sub {
    margin-top: 3px;
    font-size: 13px;
    line-height: 1.45;
    color: #5b6678;
}
.passkey-add__field {
    margin-bottom: 16px;
}
.passkey-add__label {
    display: flex;
    align-items: center;
    gap: 9px;
    margin-bottom: 8px;
    font-size: 13px;
    font-weight: 600;
    color: #3a4763;
}
.passkey-add__req {
    font-size: 10.5px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: #2f6fed;
    background: #eaf1ff;
    border-radius: 999px;
    padding: 2px 9px;
}
.passkey-add__input {
    width: 100%;
    box-sizing: border-box;
    padding: 11px 13px;
    border: 1px solid #cdd5e2;
    border-radius: 9px;
    background: #fff;
    font-size: 14px;
    color: #1c205c;
    outline: none;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.passkey-add__input::placeholder {
    color: #9aa6b8;
}
.passkey-add__input:focus {
    border-color: #2f6fed;
    box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.15);
}
.passkey-add__input--invalid {
    border-color: #d9342b;
}
.passkey-add__input--invalid:focus {
    box-shadow: 0 0 0 3px rgba(217, 52, 43, 0.15);
}
/* Show/hide password toggle inside the field. */
.passkey-add__input-wrap {
    position: relative;
}
.passkey-add__input--with-toggle {
    padding-right: 44px;
}
.passkey-add__reveal {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 42px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: transparent;
    color: #8a93a6;
    font-size: 16px;
    cursor: pointer;
    transition: color 0.15s ease;
}
.passkey-add__reveal:hover {
    color: #2f6fed;
}
.passkey-add__msg {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-top: 8px;
    font-size: 12.5px;
    line-height: 1.4;
}
.passkey-add__msg--hint {
    color: #5b6678;
}
.passkey-add__msg--error {
    color: #b42318;
}
.passkey-add__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 11px 20px;
    border: 0;
    border-radius: 9px;
    background: #2f6fed;
    color: #fff;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    transition: background-color 0.15s ease;
}
.passkey-add__btn:hover:not(:disabled) {
    background: #2559c9;
}
.passkey-add__btn:disabled {
    background: #b9c6e6;
    cursor: not-allowed;
}
.passkey-add__btn-icon {
    margin-top: -1px;
}
.passkey-add__spinner {
    width: 14px;
    height: 14px;
    border: 2px solid rgba(255, 255, 255, 0.45);
    border-top-color: #fff;
    border-radius: 50%;
    animation: passkey-add-spin 0.7s linear infinite;
}
@keyframes passkey-add-spin {
    to { transform: rotate(360deg); }
}
.passkey-add--unsupported {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    background: #f6f8fc;
}
.passkey-add--unsupported .passkey-add__head-text {
    padding-top: 2px;
}
@media (max-width: 560px) {
    .passkey-add__btn {
        width: 100%;
    }
}
.passkeys__row-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 12px;
}
.passkeys__confirm {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    margin-top: 14px;
    font-size: 13px;
    line-height: 1.4;
    color: #3a4763;
    cursor: pointer;
}
.passkeys__confirm input {
    margin-top: 2px;
}
/* ---- One-time recovery code ---- */
.recovery-key__code {
    margin: 14px 0;
    padding: 14px 16px;
    border-radius: 10px;
    background: #f3f5f9;
    border: 1px dashed #cdd5e2;
    font-family: ui-monospace, Consolas, monospace;
    font-size: 15px;
    letter-spacing: 2px;
    color: #1c205c;
    word-break: break-all;
    -webkit-user-select: all;
    user-select: all;
}
/* ---- Danger (remove password) ---- */
.passkeys__danger {
    border-top-color: #f2c4c0;
}
.passkeys__danger .passkeys__section-title {
    color: #b42318;
}
.passkeys__danger-btn {
    border: 0;
    border-radius: 8px;
    padding: 10px 18px;
    background: #d9342b;
    color: #fff;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
}
.passkeys__danger-btn:hover {
    background: #b42318;
}
.passkeys__danger-btn:disabled {
    background: #e8a9a4;
    cursor: not-allowed;
}
/* ---- Tenant-admin "Reset passkey" dialog ---- */
.modal.reset-passkey__dialog {
    min-width: 0;
    width: 460px;
    max-width: calc(100vw - 32px);
    padding: 30px 32px;
    border-radius: 16px;
}
.reset-passkey__header {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    margin-bottom: 20px;
}
.reset-passkey__icon {
    flex: 0 0 auto;
    width: 44px;
    height: 44px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #2f6fed;
    background: #eaf1ff;
}
.reset-passkey__title {
    font-size: 18px;
    font-weight: 700;
    color: #1c205c;
    line-height: 1.25;
}
.reset-passkey__subtitle {
    margin-top: 2px;
    font-size: 13px;
    color: #5b6678;
}
.reset-passkey__loading {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 0;
    font-size: 14px;
    color: #5b6678;
}
.reset-passkey__spinner {
    width: 16px;
    height: 16px;
    border: 2px solid #d3d8ea;
    border-top-color: #2f6fed;
    border-radius: 50%;
    animation: passkey-add-spin 0.7s linear infinite;
}
.reset-passkey__warn {
    display: flex;
    gap: 11px;
    padding: 12px 14px;
    margin-bottom: 18px;
    background: #fff8ec;
    border: 1px solid #f3d19e;
    border-radius: 10px;
    font-size: 13px;
    line-height: 1.5;
    color: #7a4a12;
}
.reset-passkey__warn-icon {
    flex: 0 0 auto;
    margin-top: 1px;
    color: #d9852b;
}
.reset-passkey__warn strong {
    color: #5c3608;
}
.reset-passkey__confirm-note {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 20px;
    font-size: 13.5px;
    color: #3a4763;
}
.reset-passkey__confirm-icon {
    color: #2f6fed;
}
.reset-passkey__field {
    margin-bottom: 18px;
}
.reset-passkey__label {
    display: block;
    margin-bottom: 8px;
    font-size: 13px;
    font-weight: 600;
    color: #3a4763;
}
.reset-passkey__input-wrap {
    position: relative;
}
.reset-passkey__input {
    width: 100%;
    box-sizing: border-box;
    padding: 11px 44px 11px 13px;
    border: 1px solid #cdd5e2;
    border-radius: 9px;
    background: #fff;
    font-size: 14px;
    color: #1c205c;
    outline: none;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.reset-passkey__input::placeholder {
    color: #9aa6b8;
}
.reset-passkey__input:focus {
    border-color: #2f6fed;
    box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.15);
}
.reset-passkey__input--invalid {
    border-color: #d9342b;
}
.reset-passkey__reveal {
    position: absolute;
    top: 0;
    right: 0;
    height: 100%;
    width: 42px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: transparent;
    color: #8a93a6;
    font-size: 16px;
    cursor: pointer;
    transition: color 0.15s ease;
}
.reset-passkey__reveal:hover {
    color: #2f6fed;
}
.reset-passkey__error {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 16px;
    font-size: 12.5px;
    line-height: 1.4;
    color: #b42318;
}
.reset-passkey__error--block {
    margin-bottom: 20px;
}
.reset-passkey__code-label {
    font-size: 13px;
    font-weight: 600;
    color: #3a4763;
    margin-bottom: 8px;
}
.reset-passkey__code-wrap {
    position: relative;
    margin-bottom: 14px;
}
.reset-passkey__code {
    display: block;
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 16px;
    letter-spacing: .04em;
    word-break: break-all;
    padding: 14px 52px 14px 16px;
    background: #f3f5f9;
    border: 1px dashed #cdd5e2;
    border-radius: 10px;
    color: #1c205c;
    -webkit-user-select: all;
    user-select: all;
}
.reset-passkey__copy {
    position: absolute;
    top: 50%;
    right: 8px;
    transform: translateY(-50%);
    width: 34px;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid #d3d8ea;
    border-radius: 8px;
    background: #fff;
    color: #5b6678;
    cursor: pointer;
    transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease;
}
.reset-passkey__copy:hover {
    color: #2f6fed;
    border-color: #b9c6e6;
    background: #f6f8fc;
}
.reset-passkey__note {
    margin: 0 0 18px;
    font-size: 13px;
    line-height: 1.5;
    color: #5b6678;
}
.reset-passkey__actions {
    display: flex;
    gap: 10px;
}
.reset-passkey__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 11px 18px;
    border: 1px solid transparent;
    border-radius: 9px;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.reset-passkey__btn--primary {
    background: #2f6fed;
    color: #fff;
}
.reset-passkey__btn--primary:hover:not(:disabled) {
    background: #2559c9;
}
.reset-passkey__btn--primary:disabled {
    background: #b9c6e6;
    cursor: not-allowed;
}
.reset-passkey__btn--ghost {
    background: #fff;
    border-color: #cdd5e2;
    color: #3a4763;
}
.reset-passkey__btn--ghost:hover {
    background: #f1f4f9;
}
/* One-time "Add a passkey" suggestion modal shown right after an invite/join
   registration. Palette matches Settings → Passkeys and the 2FA pages:
   brand blue #2f6fed, navy #1c205c, body grey #5b6678. */
/* Slightly darker overlay than the default modal so the card pops. */
.modal-bg.passkey-suggest-bg {
  background-color: rgba(8, 12, 35, 0.55);
}
/* The white card itself (sits on .modal). Override the wide default modal box. */
.modal.passkey-suggest__dialog {
  min-width: 0;
  width: 440px;
  max-width: calc(100vw - 32px);
  padding: 40px 40px 30px;
  border-radius: 16px;
  box-shadow: 0 24px 60px rgba(8, 12, 35, 0.28);
}
@media only screen and (max-device-width: 640px) {
.modal.passkey-suggest__dialog {
    padding: 32px 22px 24px
}
  }
.passkey-suggest__close {
  top: 18px;
  right: 18px;
  font-size: 14px;
  color: #9aa6b8;
  transition: color 0.15s ease;
}
.passkey-suggest__close:hover {
  color: #5b6678;
}
.passkey-suggest {
  text-align: center;
  color: #5b6678;
}
/* Hero badge with the passkey/key glyph. */
.passkey-suggest__badge {
  width: 76px;
  height: 76px;
  margin: 2px auto 22px;
  border-radius: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #2f6fed;
  background: linear-gradient(145deg, #eaf1ff 0%, #dbe7ff 100%);
  box-shadow: 0 0 0 6px rgba(47, 111, 237, 0.08);
}
.passkey-suggest__badge-icon {
  display: block;
}
.passkey-suggest__title {
  margin: 0 0 10px;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.25;
  color: #1c205c;
}
.passkey-suggest__subtitle {
  margin: 0 auto 22px;
  max-width: 340px;
  font-size: 14.5px;
  line-height: 1.55;
  color: #5b6678;
}
/* Benefit list — centred block, left-aligned rows. */
.passkey-suggest__benefits {
  list-style: none;
  margin: 0 auto 26px;
  padding: 16px 18px;
  max-width: 360px;
  text-align: left;
  background: #f6f8fc;
  border: 1px solid #e8edf6;
  border-radius: 12px;
}
.passkey-suggest__benefit {
  display: flex;
  align-items: flex-start;
  gap: 11px;
  font-size: 13.5px;
  line-height: 1.45;
  color: #2c3650;
}
.passkey-suggest__benefit + .passkey-suggest__benefit {
  margin-top: 12px;
}
.passkey-suggest__benefit-icon {
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  margin-top: 1px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  background: #16a34a;
}
.passkey-suggest__benefit-text {
  flex: 1 1 auto;
}
/* Actions — primary CTA stacked above a quiet "Maybe later". */
.passkey-suggest__actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.passkey-suggest__btn {
  width: 100%;
  box-sizing: border-box;
  padding: 12px 18px;
  border: 1px solid transparent;
  border-radius: 10px;
  font-size: 14.5px;
  font-weight: 600;
  cursor: pointer;
  transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.passkey-suggest__btn--primary {
  background: #2f6fed;
  color: #fff;
}
.passkey-suggest__btn--primary:hover {
  background: #2559c9;
}
.passkey-suggest__btn--ghost {
  background: transparent;
  color: #5b6678;
}
.passkey-suggest__btn--ghost:hover {
  background: #f1f4f9;
  color: #1c205c;
}
.passkey-suggest__footnote {
  margin: 18px 0 0;
  font-size: 12px;
  line-height: 1.4;
  color: #9098a8;
}
/* System administration (Settings → System management): tenants, users, email domains.
   Palette matches the passkeys / settings cards: brand #2f6fed, navy #1c205c, grey #5b6678. */
.sysadmin {
    display: flex;
    gap: 24px;
    align-items: flex-start;
    width: 100%;
    box-sizing: border-box;
    /* Breathing room below the app header + off the left/right edges
       (restores the pl-4/pr-4 the old layout had; keeps the Export button off the edge). */
    padding: 24px 24px 0;
}
/* ---- Left nav ---- */
.sysadmin__nav {
    flex: 0 0 248px;
    background: #fff;
    border: 1px solid #e3e8f0;
    border-radius: 14px;
    padding: 14px;
    box-sizing: border-box;
}
/* ---- Nav header: back link + area switcher ---- */
/* Sit above the nav label, in the same card as the items. Used by the tenancy
   manager (back to files + tenant switcher) and by both settings shells (back
   to files, plus a Hub switcher on Hub settings). System admin has neither and
   simply omits the block. `.tenancy-admin__*` rides along as a compatibility
   alias for the markup that already uses it. */
.sysadmin__nav-head,
.tenancy-admin__nav-head {
    padding: 2px 2px 12px;
    border-bottom: 1px solid #e3e8f0;
    margin-bottom: 12px;
}
.sysadmin__back,
.tenancy-admin__back {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 8px;
    margin-bottom: 10px;
    border-radius: 8px;
    font-size: 13px;
    font-weight: 600;
    color: #5b6678;
    text-decoration: none;
}
.sysadmin__back svg, .tenancy-admin__back svg {
        fill: currentColor;
    }
.sysadmin__back:hover, .tenancy-admin__back:hover {
        background: #f6f8fc;
        color: #2f6fed;
    }
/* The switcher is a SelectMenu; only its trigger is restyled, so the menu keeps
   whatever the component renders. */
.sysadmin__switcher,
.tenancy-admin__tenant {
    padding: 0 2px;
}
.sysadmin__switcher .select-menu__button,
    .sysadmin__switcher .button,
    .tenancy-admin__tenant .select-menu__button,
    .tenancy-admin__tenant .button {
        width: 100%;
        justify-content: space-between;
        box-sizing: border-box;
        padding: 9px 12px;
        border: 1px solid #e3e8f0;
        border-radius: 10px;
        background: #fff;
        color: #1c205c;
        font-size: 14px;
        font-weight: 600;
        min-width: 0;
    }
.sysadmin__switcher .button:hover, .tenancy-admin__tenant .button:hover {
        border-color: #c7d2e6;
        background: #f6f8fc;
        box-shadow: none;
    }
/* A single tenancy: its name where the switcher would be, as text — a box shaped like the trigger would
   promise a menu there is nothing in. The trigger's type, and its offsets with the 2px wrapper and the
   1px border folded in, so the text sits exactly where its label would. */
.tenancy-admin__tenant-name {
    padding: 10px 15px;
    color: #1c205c;
    font-size: 14px;
    font-weight: 600;
    overflow-wrap: anywhere;
}
/* ---- Section card (grouped form) ---- */
/* A titled card holding a run of related controls — tenancy policies and
   integrations, and every settings page. */
.sysadmin__group,
.tenancy-admin__group {
    background: #fff;
    border: 1px solid #e3e8f0;
    border-radius: 14px;
    overflow: hidden;
}
.sysadmin__group + .sysadmin__group,
.tenancy-admin__group + .tenancy-admin__group {
    margin-top: 20px;
}
.sysadmin__group-head,
.tenancy-admin__group-head {
    display: flex;
    gap: 14px;
    align-items: center;
    padding: 16px 22px;
    border-bottom: 1px solid #e3e8f0;
    background: #fbfcfe;
}
.sysadmin__group-icon,
.tenancy-admin__group-icon {
    flex: 0 0 auto;
    width: 36px;
    height: 36px;
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #eef3fe;
    color: #2f6fed;
}
.sysadmin__group-icon svg, .tenancy-admin__group-icon svg {
        fill: currentColor;
    }
.sysadmin__group-title,
.tenancy-admin__group-title {
    font-size: 15px;
    font-weight: 700;
    color: #1c205c;
}
.sysadmin__group-sub,
.tenancy-admin__group-sub {
    display: block;
    font-size: 12px;
    color: #8a93a6;
    margin-top: 2px;
}
/* Pushes a control to the far end of the section header. */
.sysadmin__group-action {
    margin-left: auto;
}
/* One row inside a section. Rows divide rather than float apart, so a long
   group reads as a single list instead of a stack of cards. */
.sysadmin__row,
.tenancy-admin__policy {
    padding: 16px 22px;
}
.sysadmin__row + .sysadmin__row,
.tenancy-admin__policy + .tenancy-admin__policy {
    border-top: 1px solid #eef1f6;
}
/* A run of form controls inside a card. Both TextInput and CheckboxInput are
   `@tagName('')` components that render a bare flex div with no margin of their
   own, so consecutive fields sit flush and a label reads as belonging to the
   control above it. The stack supplies the rhythm they don't carry. */
.sysadmin__fields,
.tenancy-admin__fields {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 20px;
    padding: 20px 22px;
}
.sysadmin__fields > .flex-group.flex-column,
.tenancy-admin__fields > .flex-group.flex-column {
    gap: 6px;
}
/* Explanatory copy inside a section, above its controls. */
.sysadmin__group-copy {
    font-size: 13.5px;
    line-height: 1.5;
    color: #5b6678;
    max-width: 640px;
    margin: 0;
}
.sysadmin__group-copy + .sysadmin__group-copy {
    margin-top: 10px;
}
/* Actions at the foot of a section row. */
.sysadmin__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    margin-top: 14px;
}
.sysadmin__btn--danger {
    background: #b42318;
    color: #fff;
}
.sysadmin__btn--danger:hover {
    background: #8f1d13;
    color: #fff;
}
.sysadmin__nav-label {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: #9098a8;
    padding: 6px 10px 10px;
}
.sysadmin__nav-item {
    display: flex;
    gap: 12px;
    align-items: flex-start;
    padding: 11px 12px;
    border-radius: 10px;
    text-decoration: none;
    cursor: pointer;
}
.sysadmin__nav-item + .sysadmin__nav-item {
    margin-top: 4px;
}
.sysadmin__nav-item:hover {
    background: #f6f8fc;
}
.sysadmin__nav-item--active {
    background: #eef3fe;
}
.sysadmin__nav-icon {
    flex: 0 0 auto;
    width: 34px;
    height: 34px;
    border-radius: 9px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #f0f3f9;
    color: #5b6678;
}
.sysadmin__nav-item--active .sysadmin__nav-icon {
    background: #2f6fed;
    color: #fff;
}
/* System admin and the settings shells inline their nav icons as
   `<svg fill="currentColor">`, so the white-on-blue active state just works.
   The tenancy manager's come through `{{svg-jar}}` from files that hard-code
   their own fill — `fill="#000000"` on the material set, `fill="#5390ff"` on
   hub.svg — which ignores the `color` the active rule sets and paints a black
   icon on the blue tile. A CSS `fill` beats the presentation attribute, so this
   hands the icons back to `currentColor`: grey when idle, white when active.
   Only the root `<svg>` is targeted — the material files use `fill="none"`
   spacer rects whose own attribute must survive, which it does, while the real
   paths declare no fill and inherit. */
.sysadmin__nav-icon svg {
    fill: currentColor;
}
.sysadmin__nav-title {
    display: block;
    font-size: 14px;
    font-weight: 600;
    color: #1c205c;
}
.sysadmin__nav-item--active .sysadmin__nav-title {
    color: #2f6fed;
}
.sysadmin__nav-sub {
    display: block;
    font-size: 12px;
    color: #8a93a6;
    margin-top: 2px;
}
/* ---- Nav footer: jumps to the other settings areas ---- */
/* Mirrors the nav head: a divided strip at the foot of the same card, holding
   links OUT of this area rather than within it. Deliberately quieter than a
   nav item — these are not pages of the section you are in. */
.sysadmin__nav-foot {
    margin-top: 14px;
    padding-top: 12px;
    border-top: 1px solid #e3e8f0;
}
.sysadmin__nav-jump {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 12px;
    border-radius: 10px;
    font-size: 13px;
    font-weight: 600;
    color: #5b6678;
    text-decoration: none;
    cursor: pointer;
}
.sysadmin__nav-jump:hover {
    background: #f6f8fc;
    color: #2f6fed;
}
.sysadmin__nav-jump-icon {
    flex: 0 0 auto;
    display: flex;
    color: #9aa6b8;
}
.sysadmin__nav-jump:hover .sysadmin__nav-jump-icon {
    color: #2f6fed;
}
.sysadmin__main {
    flex: 1 1 auto;
    min-width: 0;
}
/* ---- Page header ---- */
.sysadmin__page-head {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: 16px;
    margin-bottom: 18px;
}
.sysadmin__title {
    font-size: 22px;
    font-weight: 700;
    color: #1c205c;
}
.sysadmin__sub {
    margin-top: 4px;
    font-size: 13.5px;
    color: #5b6678;
}
.sysadmin__btn {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 16px;
    border-radius: 9px;
    font-size: 13.5px;
    font-weight: 600;
    cursor: pointer;
    border: 1px solid transparent;
    text-decoration: none;
}
.sysadmin__btn:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}
.sysadmin__btn--primary {
    background: #2f6fed;
    color: #fff;
}
.sysadmin__btn--primary:hover {
    background: #2559c9;
    color: #fff;
}
.sysadmin__btn--outline {
    background: #fff;
    border-color: #cdd5e2;
    color: #3a4763;
}
.sysadmin__btn--outline:hover {
    background: #f6f8fc;
}
/* ---- Card + toolbar ---- */
.sysadmin__card {
    background: #fff;
    border: 1px solid #e3e8f0;
    border-radius: 14px;
    box-shadow: 0 1px 2px rgba(8, 12, 35, 0.04);
    overflow: hidden;
}
.sysadmin__toolbar {
    display: flex;
    gap: 12px;
    padding: 16px 18px;
    border-bottom: 1px solid #eef1f6;
}
.sysadmin__search {
    position: relative;
    flex: 1 1;
}
.sysadmin__search-icon {
    position: absolute;
    left: 12px;
    top: 50%;
    transform: translateY(-50%);
    color: #9aa6b8;
    display: flex;
}
.sysadmin__search-input {
    width: 100%;
    box-sizing: border-box;
    padding: 9px 34px 9px 36px;
    border: 1px solid var(--field-border);
    border-radius: 9px;
    font-size: 13.5px;
    color: var(--field-fg);
    /* Pin an explicit light background so the field stays legible under the browser's
       dark colour scheme (prefers-color-scheme: dark). Without it the native input
       inherits Chrome's dark user-agent background and the #1c205c text is invisible. */
    background-color: var(--field-bg);
    outline: none;
}
.sysadmin__search-input::placeholder {
    color: var(--field-placeholder);
}
.sysadmin__search-input:focus {
    border-color: #2f6fed;
    box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.15);
}
/* Clear ("cross") button at the trailing edge of a search field; shown only
   while the field has a value. Mirrors the leading .sysadmin__search-icon. */
.sysadmin__search-clear {
    position: absolute;
    right: 8px;
    top: 50%;
    transform: translateY(-50%);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 2px;
    border: 0;
    background: transparent;
    color: #9aa6b8;
    cursor: pointer;
    border-radius: 6px;
}
.sysadmin__search-clear:hover {
    color: #1c205c;
    background: #eef1f6;
}
.sysadmin__search-clear:focus-visible {
    outline: none;
    color: #1c205c;
    box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.15);
}
/* ---- Table ---- */
.sysadmin__table {
    width: 100%;
    border-collapse: collapse;
}
.sysadmin__table thead th {
    text-align: left;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #8a93a6;
    padding: 12px 18px;
    background: #f8fafd;
    border-bottom: 1px solid #eef1f6;
    white-space: nowrap;
}
.sysadmin__table th.is-center,
.sysadmin__table td.is-center {
    text-align: center;
}
.sysadmin__table tbody td {
    padding: 13px 18px;
    border-bottom: 1px solid #f1f4f9;
    font-size: 13.5px;
    vertical-align: middle;
    color: #1c205c;
}
.sysadmin__table tbody tr:last-child td {
    border-bottom: 0;
}
.sysadmin__table tbody tr:hover {
    background: #f9fbfe;
}
.sysadmin__cell-name {
    font-weight: 600;
    color: #1c205c;
    text-decoration: none;
}
.sysadmin__cell-name:hover {
    color: #2f6fed;
}
.sysadmin__cell-muted {
    color: #5b6678;
    text-decoration: none;
}
.sysadmin__empty {
    padding: 28px 18px;
    text-align: center;
    color: #8a93a6;
    font-size: 13.5px;
}
/* ---- Look up by ID (users page) ---- */
.sysadmin__lookup {
    margin-bottom: 16px;
}
/* The toolbar's divider only separates it from a result below; alone, it is the whole card. */
.sysadmin__lookup .sysadmin__toolbar:only-child {
    border-bottom: 0;
}
.sysadmin__lookup-note,
.sysadmin__lookup-result {
    padding: 14px 18px;
    font-size: 13.5px;
}
.sysadmin__lookup-note {
    color: #8a93a6;
}
.sysadmin__lookup-result {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
}
/* ---- Copyable id (Sysadmin::CopyId) ---- */
.sysadmin__copy-id {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    white-space: nowrap;
}
.sysadmin__copy-id-text {
    font-size: 12.5px;
    color: #5b6678;
    cursor: help;
}
.sysadmin__copy-id-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    padding: 0;
    border: 1px solid transparent;
    border-radius: 7px;
    background: transparent;
    color: #8a93a6;
    cursor: pointer;
}
.sysadmin__copy-id-btn:hover,
.sysadmin__copy-id-btn:focus-visible {
    background: #f1f4f9;
    border-color: #e3e8f0;
    color: #2f6fed;
}
/* "Tenant ID  1a2b3c4d… [copy]" under a detail page's title */
.sysadmin__id-line {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 4px 0 16px;
}
.sysadmin__lookup-id {
    margin-left: auto;
    font-size: 12px;
    color: #8a93a6;
    overflow-wrap: anywhere;
}
/* ---- Switch ---- */
.sysadmin__switch {
    position: relative;
    display: inline-block;
    width: 38px;
    height: 22px;
    vertical-align: middle;
}
.sysadmin__switch input {
    position: absolute;
    opacity: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    cursor: pointer;
}
.sysadmin__switch-track {
    position: absolute;
    inset: 0;
    background: #cdd5e2;
    border-radius: 999px;
    transition: background 0.15s ease;
    pointer-events: none;
}
.sysadmin__switch-track::after {
    content: "";
    position: absolute;
    top: 2px;
    left: 2px;
    width: 18px;
    height: 18px;
    background: #fff;
    border-radius: 50%;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
    transition: transform 0.15s ease;
}
.sysadmin__switch input:checked + .sysadmin__switch-track {
    background: #2f6fed;
}
.sysadmin__switch input:checked + .sysadmin__switch-track::after {
    transform: translateX(16px);
}
.sysadmin__switch--danger input:checked + .sysadmin__switch-track {
    background: #d9342b;
}
/* A switch that states a value rather than offering one — a row you are not
   allowed to change (your own, or an account governed by tenancy policy). No
   input, so there is nothing to press and nothing to look half-enabled: it is
   simply the track, muted. */
.sysadmin__switch--static {
    cursor: default;
    opacity: 0.55;
}
.sysadmin__switch--static.is-on .sysadmin__switch-track {
    background: #2f6fed;
}
.sysadmin__switch--static.is-on .sysadmin__switch-track::after {
    transform: translateX(16px);
}
/* ---- Badges / flags ---- */
.sysadmin__flags {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.sysadmin__badge {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font-size: 11.5px;
    font-weight: 600;
    padding: 3px 9px;
    border-radius: 999px;
    white-space: nowrap;
}
.sysadmin__badge--ad,
.sysadmin__badge--key,
.sysadmin__badge--brand {
    color: #2f6fed;
    background: #eaf1ff;
}
.sysadmin__badge--ok {
    color: #0c7a43;
    background: #e9f7ef;
}
.sysadmin__badge--warn {
    color: #b45309;
    background: #fef3c7;
}
.sysadmin__badge--none {
    color: #5b6678;
    background: #f0f3f9;
}
/* ---- Icon button (delete) ---- */
.sysadmin__icon-btn {
    width: 32px;
    height: 32px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid #e3e8f0;
    border-radius: 8px;
    background: #fff;
    color: #b42318;
    cursor: pointer;
}
.sysadmin__icon-btn:hover {
    background: #fdf1f0;
    border-color: #f2c4c0;
}
/* ---- Footer / pagination ---- */
.sysadmin__foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px;
    padding: 14px 18px;
}
.sysadmin__foot .paginator {
    margin: 0;
}
/* ---- Detail page ---- */
.sysadmin__detail-card {
    background: #fff;
    border: 1px solid #e3e8f0;
    border-radius: 14px;
    box-shadow: 0 1px 2px rgba(8, 12, 35, 0.04);
    margin-bottom: 18px;
    overflow: hidden;
}
.sysadmin__detail-title {
    font-size: 14px;
    font-weight: 700;
    color: #1c205c;
    padding: 16px 22px;
    border-bottom: 1px solid #eef1f6;
}
.sysadmin__detail-body {
    padding: 20px 22px;
}
.sysadmin__crumbs {
    font-size: 13px;
    color: #8a93a6;
    margin-bottom: 14px;
}
.sysadmin__crumbs a {
    color: #2f6fed;
    text-decoration: none;
}
.sysadmin__ident {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 20px 22px;
}
.sysadmin__ident-avatar {
    flex: 0 0 auto;
    width: 56px;
    height: 56px;
    border-radius: 14px;
    background: linear-gradient(145deg, #3b78ff, #2f6fed);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 20px;
    font-weight: 700;
}
.sysadmin__ident-name {
    font-size: 20px;
    font-weight: 700;
    color: #1c205c;
    word-break: break-word;
}
.sysadmin__ident-email {
    font-size: 13.5px;
    color: #5b6678;
    margin-top: 2px;
    word-break: break-word;
}
.sysadmin__ident-chips {
    display: flex;
    gap: 8px;
    margin-left: auto;
    flex-wrap: wrap;
    justify-content: flex-end;
}
.sysadmin__chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 12px;
    font-weight: 600;
    padding: 4px 10px;
    border-radius: 999px;
}
.sysadmin__chip--ok {
    color: #0c7a43;
    background: #e9f7ef;
}
.sysadmin__chip--no {
    color: #8a93a6;
    background: #f0f3f9;
}
.sysadmin__chip--brand {
    color: #2f6fed;
    background: #eaf1ff;
}
.sysadmin__chip-dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: currentColor;
}
.sysadmin__info-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 18px 24px;
}
.sysadmin__info-label {
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: #9098a8;
    margin-bottom: 6px;
}
.sysadmin__info-value {
    font-size: 14px;
    color: #1c205c;
}
@media (max-width: 900px) {
    .sysadmin__info-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}
/* ---- Phone -------------------------------------------------------------- */
/* A phone gets the Users page of each admin area and nothing else, so the
   section nav stays hidden (`hide-on-phone` in the four shells) and there is no
   chip row standing in for it. What is left has to fit 390px. */
@media only screen and (max-device-width: 640px) {
  .sysadmin {
    flex-direction: column;
    gap: 12px;
    padding: 12px 12px 0;
  }

  /* Two search fields side by side need 424px before the gap. `flex: 1 1 0`
     cannot shrink them below their intrinsic minimum, so they stack instead —
     `min-width: 0` is what lets each one then take the full row. */
  .sysadmin__toolbar {
    flex-wrap: wrap;
    padding: 12px;
  }

  .sysadmin__search {
    flex: 1 1 100%;
    min-width: 0;
  }

  /* The table is `width: 100%` but `table-layout: auto`, so a column whose
     content will not break — an email is one unbroken token — sizes to that
     content and pushes the rest past the edge. The card clips with
     `overflow: hidden`, so 2FA and Delete were not merely off-screen, they were
     unreachable: no scroll could bring them back.

     Fixed layout takes the widths from the header row instead, so the two
     control columns keep their 56px and the email column gets whatever is left
     and wraps inside it. Wrapping rather than ellipsising because an address is
     what identifies the row, and half an address identifies nothing. */
  .sysadmin__card {
    max-width: 100%;
  }

  .sysadmin__table {
    table-layout: fixed;
  }

  .sysadmin__table th.is-center,
  .sysadmin__table td.is-center {
    width: 56px;
    padding-left: 0;
    padding-right: 0;
  }

  .sysadmin__table td {
    overflow-wrap: anywhere;
  }

  /* A row of four controls cannot be four columns at 390px: each cell gets
     about 50px, and "Domain" comes out one letter per line inside a select
     that is narrower than its own caret. The row becomes a card, and each
     field takes its column heading as its own label — which is the job the
     header row was doing for it, and the header row is what a stacked table
     has no room for. */
  .sysadmin__table--stacked thead {
    display: none;
  }

  .sysadmin__table--stacked,
  .sysadmin__table--stacked tbody,
  .sysadmin__table--stacked tr,
  .sysadmin__table--stacked td {
    display: block;
    width: 100%;
  }

  .sysadmin__table--stacked tr {
    box-sizing: border-box;
    margin-bottom: 10px;
    padding: 12px;
    border: 1px solid var(--r-edge);
    border-radius: var(--r-r-inner);
  }

  /* `.sysadmin__table tbody td` is (0,1,2) and sets `padding: 13px 18px`, so it
     outranks a plain `--stacked td` and the 36px of horizontal padding stayed.
     Against a `content-box` cell at `width: 100%` that put every cell 36px wider
     than the card, which clips — so each control was cut off at its right edge.
     Matched on weight, and `border-box` so the padding can never do it again. */
  .sysadmin__table--stacked tbody td {
    box-sizing: border-box;
    padding: 6px 0;
    border: 0;
  }

  .sysadmin__table--stacked td[data-label]::before {
    content: attr(data-label);
    display: block;
    margin-bottom: 4px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--r-muted);
  }

  /* The trailing "Add permission" row is one button, not a record. */
  .sysadmin__table--stacked td[colspan] {
    padding: 0;
  }

  .sysadmin__table--stacked tr:last-child {
    padding: 0;
    border: 0;
  }
}
.switcher {
  position: relative;
  display: inline-block;
  width: 40px;
  height: 24px;
}
/* Hide default HTML checkbox */
.switcher input {
    opacity: 0;
    width: 0;
    height: 0;
  }
.switcher input:checked + .switcher__slider {
      background-color: var(--hero-blue);
    }
.switcher input:focus + .switcher__slider {
      box-shadow: 0 0 1px var(--hero-blue);
    }
.switcher input:checked + .switcher__slider:before {
      transform: translateX(16px);
    }
.switcher__slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #ccc;
  transition: .4s;
  border-radius: 24px;
}
.switcher__slider:before {
    position: absolute;
    content: "";
    height: 16px;
    width: 16px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    transition: .4s;
    border-radius: 50%;
  }
.lynx-devices-checker__state {
  padding: 40px;
  padding-left: 0;
  width: 100px;
  box-sizing: border-box;
  display: flex;
  justify-content: center;
}
.lynx-devices-checker__permission {
  flex: 1 1;
}
.lynx-devices-checker__device {
  padding-right: 10px;
  box-sizing: border-box;
  max-width: 250px;
}
.lynx-devices-checker__total {
  max-width: 250px;
  text-align: center;
  font-weight: bold;
}
.supported-browsers__item {
  box-sizing: border-box;
  padding: 20px 40px;
}
.supported-browsers__row .supported-browsers__item {
  flex-direction: row;
  padding: 0;
  font-size: 14px;
  padding: 30px 10px 20px 10px;
 }
.supported-browsers__row .supported-browsers__item svg {
    width: 28px;
    height: 28px;
    margin-right: 10px;
  }
/* ---------------------------------------------------------------------------
   A hexagon of nineteen dots: a bright head runs round its outer ring with a
   short trail, the dots inside echo it, and the centre pulses. The transfers'
   "moving" mark.

   A port of dotm-hex-4 from dot-matrix (github.com/zzzzshawn/matrix,
   (c) 2026 dot-matrix contributors, used under its licence, which permits use
   inside a product): the same formula, sampled 45 times a cycle into one
   keyframe list per dot, so it runs in CSS with no script. GENERATED by
   scripts/generate-dot-hex-css.js; rerun it rather than editing by hand.
   --------------------------------------------------------------------------- */
.dot-hex {
  --dot-hex-dot: 2.5px;
  --dot-hex-gap: 1px;

  display: inline-flex;
  flex: none;
  flex-direction: column;
  align-items: center;
  gap: var(--dot-hex-gap);
}
.dot-hex__row {
  display: flex;
  gap: var(--dot-hex-gap);
}
.dot-hex__dot {
  width: var(--dot-hex-dot);
  height: var(--dot-hex-dot);
  border-radius: 50%;
  background: currentColor;
  animation: 1100ms linear infinite;
}
/* Slowed, not stopped, when the system asks for less motion: it is the header's
   only sign that a transfer is alive, and a shimmer of opacity in a 16px icon is
   about the gentlest motion there is. Windows sends "reduce" whenever its
   animation effects are off, the default on a remote-desktop session. */
@media (prefers-reduced-motion: reduce) {
  .dot-hex__dot {
    animation-duration: 3300ms;
  }
}
.dot-hex__dot--0-0{animation-name:dot-hex-0-0}
@keyframes dot-hex-0-0{0%{opacity:0.586}13.333%{opacity:0.095}86.667%{opacity:0.095}88.889%{opacity:0.98}91.111%{opacity:0.913}100%{opacity:0.586}}
.dot-hex__dot--0-1{animation-name:dot-hex-0-1}
@keyframes dot-hex-0-1{0%{opacity:0.465}2.222%{opacity:0.501}4.444%{opacity:0.573}6.667%{opacity:0.608}22.222%{opacity:0.106}86.667%{opacity:0.106}88.889%{opacity:0.429}93.333%{opacity:0.573}95.556%{opacity:0.608}100%{opacity:0.465}}
.dot-hex__dot--0-2{animation-name:dot-hex-0-2}
@keyframes dot-hex-0-2{0%{opacity:0.98}2.222%{opacity:0.913}24.444%{opacity:0.095}97.778%{opacity:0.095}100%{opacity:0.98}}
.dot-hex__dot--1-0{animation-name:dot-hex-1-0}
@keyframes dot-hex-1-0{0%{opacity:0.188}2.222%{opacity:0.106}75.556%{opacity:0.106}77.778%{opacity:0.98}80%{opacity:0.924}100%{opacity:0.188}}
.dot-hex__dot--1-1{animation-name:dot-hex-1-1}
@keyframes dot-hex-1-1{0%{opacity:0.496}11.111%{opacity:0.137}75.556%{opacity:0.137}77.778%{opacity:0.46}82.222%{opacity:0.604}84.444%{opacity:0.64}88.889%{opacity:0.496}91.111%{opacity:0.532}93.333%{opacity:0.604}95.556%{opacity:0.64}100%{opacity:0.496}}
.dot-hex__dot--1-2{animation-name:dot-hex-1-2}
@keyframes dot-hex-1-2{0%{opacity:0.46}4.444%{opacity:0.604}6.667%{opacity:0.64}11.111%{opacity:0.496}13.333%{opacity:0.532}15.556%{opacity:0.604}17.778%{opacity:0.64}33.333%{opacity:0.137}97.778%{opacity:0.137}100%{opacity:0.46}}
.dot-hex__dot--1-3{animation-name:dot-hex-1-3}
@keyframes dot-hex-1-3{0%{opacity:0.106}8.889%{opacity:0.106}11.111%{opacity:0.98}13.333%{opacity:0.924}35.556%{opacity:0.106}100%{opacity:0.106}}
.dot-hex__dot--2-0{animation-name:dot-hex-2-0}
@keyframes dot-hex-2-0{0%{opacity:0.095}64.444%{opacity:0.095}66.667%{opacity:0.98}68.889%{opacity:0.913}91.111%{opacity:0.095}100%{opacity:0.095}}
.dot-hex__dot--2-1{animation-name:dot-hex-2-1}
@keyframes dot-hex-2-1{0%{opacity:0.137}53.333%{opacity:0.137}55.556%{opacity:0.46}60%{opacity:0.604}62.222%{opacity:0.64}66.667%{opacity:0.496}68.889%{opacity:0.532}71.111%{opacity:0.604}73.333%{opacity:0.64}77.778%{opacity:0.496}80%{opacity:0.532}82.222%{opacity:0.604}84.444%{opacity:0.64}100%{opacity:0.137}}
.dot-hex__dot--2-2{animation-name:dot-hex-2-2}
@keyframes dot-hex-2-2{0%{opacity:0.57}2.222%{opacity:0.635}4.444%{opacity:0.675}6.667%{opacity:0.675}8.889%{opacity:0.635}13.333%{opacity:0.505}15.556%{opacity:0.465}17.778%{opacity:0.465}20%{opacity:0.505}24.444%{opacity:0.635}26.667%{opacity:0.675}28.889%{opacity:0.682}31.111%{opacity:0.635}35.556%{opacity:0.505}37.778%{opacity:0.465}40%{opacity:0.465}42.222%{opacity:0.505}46.667%{opacity:0.635}48.889%{opacity:0.675}51.111%{opacity:0.675}53.333%{opacity:0.635}57.778%{opacity:0.505}60%{opacity:0.465}62.222%{opacity:0.465}64.444%{opacity:0.505}68.889%{opacity:0.635}71.111%{opacity:0.675}73.333%{opacity:0.682}75.556%{opacity:0.635}80%{opacity:0.505}82.222%{opacity:0.465}84.444%{opacity:0.465}86.667%{opacity:0.505}91.111%{opacity:0.635}93.333%{opacity:0.675}95.556%{opacity:0.675}97.778%{opacity:0.635}100%{opacity:0.57}}
.dot-hex__dot--2-3{animation-name:dot-hex-2-3}
@keyframes dot-hex-2-3{0%{opacity:0.137}8.889%{opacity:0.137}11.111%{opacity:0.46}15.556%{opacity:0.604}17.778%{opacity:0.64}22.222%{opacity:0.496}24.444%{opacity:0.532}26.667%{opacity:0.604}28.889%{opacity:0.64}33.333%{opacity:0.496}35.556%{opacity:0.532}37.778%{opacity:0.604}40%{opacity:0.64}55.556%{opacity:0.137}100%{opacity:0.137}}
.dot-hex__dot--2-4{animation-name:dot-hex-2-4}
@keyframes dot-hex-2-4{0%{opacity:0.095}20%{opacity:0.095}22.222%{opacity:0.98}24.444%{opacity:0.913}46.667%{opacity:0.095}100%{opacity:0.095}}
.dot-hex__dot--3-0{animation-name:dot-hex-3-0}
@keyframes dot-hex-3-0{0%{opacity:0.106}53.333%{opacity:0.106}55.556%{opacity:0.98}57.778%{opacity:0.924}80%{opacity:0.106}100%{opacity:0.106}}
.dot-hex__dot--3-1{animation-name:dot-hex-3-1}
@keyframes dot-hex-3-1{0%{opacity:0.137}53.333%{opacity:0.137}55.556%{opacity:0.46}60%{opacity:0.604}62.222%{opacity:0.64}77.778%{opacity:0.137}100%{opacity:0.137}}
.dot-hex__dot--3-2{animation-name:dot-hex-3-2}
@keyframes dot-hex-3-2{0%{opacity:0.137}31.111%{opacity:0.137}33.333%{opacity:0.46}37.778%{opacity:0.604}40%{opacity:0.64}44.444%{opacity:0.496}46.667%{opacity:0.532}48.889%{opacity:0.604}51.111%{opacity:0.64}66.667%{opacity:0.137}100%{opacity:0.137}}
.dot-hex__dot--3-3{animation-name:dot-hex-3-3}
@keyframes dot-hex-3-3{0%{opacity:0.106}31.111%{opacity:0.106}33.333%{opacity:0.98}35.556%{opacity:0.924}57.778%{opacity:0.106}100%{opacity:0.106}}
.dot-hex__dot--4-0{animation-name:dot-hex-4-0}
@keyframes dot-hex-4-0{0%{opacity:0.095}100%{opacity:0.095}}
.dot-hex__dot--4-1{animation-name:dot-hex-4-1}
@keyframes dot-hex-4-1{0%{opacity:0.106}42.222%{opacity:0.106}44.444%{opacity:0.429}48.889%{opacity:0.573}51.111%{opacity:0.608}66.667%{opacity:0.106}100%{opacity:0.106}}
.dot-hex__dot--4-2{animation-name:dot-hex-4-2}
@keyframes dot-hex-4-2{0%{opacity:0.095}42.222%{opacity:0.095}44.444%{opacity:0.98}46.667%{opacity:0.913}68.889%{opacity:0.095}100%{opacity:0.095}}
/* ---------------------------------------------------------------------------
   Transfers: one icon in the header (`Header::Transfers`), and a panel under
   the bar with a section per queue — its head the queue's figures and controls,
   its body the files.
   --------------------------------------------------------------------------- */
.transfers__toggle {
  position: relative;
  padding: 0 10px;
  color: var(--colour-brand);
}
/* While something moves, two rings round the icon: the outer the data, the inner
   the files done. At rest, none. */
.transfers__ring {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
}
.transfers__ring > svg {
    display: block;
  }
.transfers__toggle--running .transfers__ring::before,
.transfers__toggle--running .transfers__ring::after {
  content: "";
  position: absolute;
  border-radius: 50%;
  /* Only the outer 2.5px of each disc: rings, not pies behind the glyph. */
  mask: radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 2px));
}
.transfers__toggle--running .transfers__ring::before {
  inset: 0;
  background: conic-gradient(
    var(--colour-brand) calc(var(--transfers-progress, 0) * 1%),
    rgba(0, 167, 231, 0.18) 0
  );
}
.transfers__toggle--running .transfers__ring::after {
  inset: 4px;
  background: conic-gradient(
    #1f9d55 calc(var(--transfers-files, 0) * 1%),
    rgba(31, 157, 85, 0.18) 0
  );
}
/* Nothing it can count (only an archive in flight): no files ring at all, rather than an empty one. */
.transfers__toggle--running .transfers__ring--no-files::after {
  display: none;
}
/* Finished: a green tick on the icon. Failed: a red dot, which outranks it. */
.transfers__badge {
  position: absolute;
  top: 2px;
  right: 6px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 2px solid var(--header-menu-bg);
  border-radius: 50%;
}
.transfers__badge--done {
  width: 14px;
  height: 14px;
  background-color: #1f9d55;
  color: #fff;
}
.transfers__badge--done svg {
    fill: currentColor;
  }
.transfers__badge--failed {
  width: 10px;
  height: 10px;
  background-color: #d92d20;
}
/* Under the whole bar, against the window's right edge — not hung off the icon,
   whose place in the row moves with whatever else the header is showing.
   ember-basic-dropdown writes its own top/left inline, hence the !important.
   The bar sits below the tenancy's banner when there is one, so both add its height. */
.ember-basic-dropdown-content.transfers__panel {
  position: fixed !important;
  top: calc(68px + var(--banner-height)) !important;
  right: 16px !important;
  left: auto !important;
  box-sizing: border-box;
  width: 380px;
  max-width: calc(100vw - 32px);
  max-height: calc(100vh - 88px - var(--banner-height));
  overflow-y: auto;
  overflow-x: hidden;
  border: 1px solid var(--r-edge);
  border-radius: var(--r-r-card, 10px);
  box-shadow: 0 8px 24px rgba(8, 12, 35, .14);
  font-size: 12px;
}
/* On its own, one class deep, so the dark theme's rule for dropdown panels wins. */
.transfers__panel {
  background: #fff;
}
.loads__section + .loads__section {
  border-top: 1px solid var(--r-edge);
}
/* Which way, how far, and cancel or clear. `.loads__bar` runs along its foot. */
.loads__head {
  position: relative;
  display: flex;
  align-items: center;
  gap: 2px;
  padding: 4px 8px;
  background: var(--r-head);
  font-size: 11.5px;
  font-weight: 600;
  color: #3a4763;
}
.loads__head .loads__count,
  .loads__head > .font-500 {
    flex: 1 1 auto;
    text-align: left;
  }
/* Which queue this is. */
.loads__title {
  flex: none;
  margin-right: 8px;
  color: var(--r-navy);
  font-size: 12px;
  font-weight: 700;
}
.loads__summary {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px;
  border-top: 1px solid var(--r-edge);
  border-bottom: 1px solid var(--r-edge);
  font-weight: 600;
  color: var(--r-navy);
}
.loads__row {
  position: relative;
  box-sizing: border-box;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 16px;
  font-size: 12px;
}
.loads__row + .loads__row { border-top: 1px solid var(--r-div-2); }
.loads__filename {
  flex: 1 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  margin-right: 10px;
  font-weight: 500;
  color: var(--r-navy);
}
.loads__icon {
  display: flex;
  padding: 5px 8px;
}
.loads__icon svg { fill: currentColor; }
.loads__clear {
  box-sizing: border-box;
  padding: 12px;
  border-top: 1px solid var(--r-edge);
  background: var(--r-head);
  text-align: center;
  text-decoration: underline;
  cursor: pointer;
}
/* The queue's progress along the foot of its section head — a line rather than a fill, so the figures
 * over it stay readable. Width from `uploadBarStyle`/`downloadBarStyle`, weighted by work like the summary
 * it reads. Not rendered once the transfer ends, so it never has to run back to zero. */
.loads__bar {
  position: absolute;
  bottom: 0;
  left: 0;
  height: 3px;
  border-radius: 0 2px 2px 0;
  background-color: var(--colour-brand);
  transition: width ease 0.3s;
}
/* Why a big transfer is taking a while: a footnote to the summary above it, so on the summary's own
 * background and inset to its padding, and bordered from the first file row below. */
.loads__note {
  padding: 10px 16px;
  border-bottom: 1px solid var(--r-edge);
  font-size: var(--font-size-0, 12px);
  line-height: 1.5;
  color: var(--r-muted);
}
/* The pill's own figures. Tabular so the digits occupy the same width whatever they are — without it the
 * text still shifts inside a fixed pill as 9% becomes 10%, which is the same complaint one level down.
 * Truncates rather than widening: the pill's width is the promise being kept here. */
.loads__count {
  /* Sized by its own text, which is padded to a constant width — so the pill fits the figures rather than
     the figures being cut to fit the pill. `tabular-nums` makes every digit the same width; the padding in
     `utils/transfer-pill` makes every VALUE the same width. Both are needed: one stops `1` and `9` from
     differing, the other stops `1/900` and `699/900` from differing. */
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  text-align: center;
  font-variant-numeric: tabular-nums;
}
/* The percentage, in a box that does not change size when the figure does.
 *
 * `tabular-nums` on the parent holds every DIGIT to one width, and `utils/transfer-pill` pads every value
 * to the same character count — but a decimal point is not a digit, and is narrower than one. `0.3%` and
 * ` 10%` are both four characters and are NOT the same width: measured on this header, the decimal form
 * runs about 3px short, which is a visible step at the single moment the figure crosses 10% and stops
 * carrying a decimal.
 *
 * 5ch, and the spare is deliberate. `ch` is the advance of a DIGIT, and the widest form — `100%` — is
 * three digits plus a percent sign, which is not a digit either: measured here at 9.69px against a digit's
 * 6.38px, so `100%` needs about 4.5ch and a 4ch box still clips it. Sized in whole `ch` to the next stop
 * above that, so the box holds every form on any face where a percent sign is under two digits wide,
 * rather than to a fractional value tuned to this one font.
 *
 * Every form is then centred inside that box rather than shrinking it, so the bytes beside it never move.
 * This is the one part of the pill's width promise that characters alone cannot keep. */
.loads__percent {
  display: inline-block;
  min-width: 5ch;
  text-align: center;
}
.lynx-phone__container {
  display: none !important;
}
@media only screen and (max-device-width: 640px) {
.lynx-phone__container {
    display: block !important
};
  }
.lynx-phone__head {
  margin-bottom: 15px;
}
.lynx-phone__new {
  position: absolute;
  bottom: 0;
  text-align: center;
  padding: 20px;
  width: 100%;
  box-sizing: border-box;
}
.lynx-phone__cell {
  display: none;
  box-sizing: border-box;
  border: 0;
  padding: 10px;
}
@media only screen and (max-device-width: 640px) {
.lynx-phone__cell {
    display: table-cell
}
  }
.lynx-phone__cell--phone-date {
    width: 140px;
  }
.lynx-phone__cell--buttons {
    text-align: right;
  }
.lynx-phone__cell--buttons span {
      display: inline-block;
      width: 24px;
      height: 24px;
    }
.lynx-phone__row--checked {
    background-color: var(--solitude);
  }
.validator {
  display: flex;
  flex-direction: column;
  padding: 40px;
  height: 100vh;
  width: 100vw;
  overflow: auto;
  box-sizing: border-box;
}
.validator__head {
  display: flex;
  align-items: center;
}
.validator__logo {
  flex: 1 1;
}
@media only screen and (max-device-width: 640px) {
.validator__logo {
    display: none
}
  }
.validator__title {
  font-size: 16px;
  font-weight: bold;
  line-height: 1.19;
  color: var(--colour-fg-default);
  text-align: center;
  height: 50px;
}
.validator__content {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  flex: 1 1;
}
.validator__upload {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 100px;
  border-radius: 10px;
  border: solid 1px var(--colour-bg-default);
  background: var(--colour-white);
  color: var(--colour-fg-default);
  box-sizing: border-box;
  font-size: 12px;
  line-height: 1.29;
  cursor: pointer;
  text-align: center;
  transition: 0.5s;
}
.validator__upload--over {
    background-color: var(--colour-bg-default);
    transform: scale(1.1);
  }
.validator__footer {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.validator__copy {
  margin-bottom: 20px;
}
.validator__file {
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 5px;
  border: solid 1px var(--colour-bg-default);
  background: var(--colour-bg-default);
  color: var(--colour-fg-default);
  box-sizing: border-box;
  padding: 10px 20px;
}
.validator__file-name {
  display: inline-block;
  max-width: 300px;
}
.permissions__head {
  border-radius: 3px;
  background-color: var(--permission-bg);
  border: none;
  -webkit-user-select: none;
  user-select: none;
}
.permissions__head--full {
  color: crimson;
  background-color: antiquewhite;
}
.permissions__head--new {
  font-size: 10px;
  line-height: 1.3;
  width: 90px;
  padding: 5px;
}
.permissions__head--new .selectbox__arrow {
    padding: 2px;
    margin-left: 0;
  }
.permissions__list {
  width: 400px;
  border-radius: 5px;
  box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
  border: solid 0.5px #c7c7c7;
  background-color: var(--permission-bg);
  overflow: hidden;
}
.permissions__item {
  box-sizing: border-box;
  padding: 5px 10px;
  cursor: pointer;
}
.permissions__item + .permissions__item {
    border-top: solid 0.5px #c7c7c7;
  }
.permissions__item--selected {
    background-color: var(--permission-bg-hover);
  }
.permissions__item--full {
    color: crimson;
    background-color: antiquewhite;
  }
.permissions__item--no-hover {
    cursor: default;
  }
.permissions__item:hover:not(.permissions__item--no-hover) {
    background-color: var(--permission-bg-hover);
  }
.permissions__calendar-input {
  height: 0;
  padding: 0;
  margin: 0;
  border: 0;
  display: block;
}
.permission__title {
  font-size: 12px;
  font-weight: 500;
  line-height: 1.25;
}
.permission__desc {
  font-size: 10px;
  line-height: 1.3;
}
.permissions__block {
  display: flex;
  align-items: center;
  justify-content: center;
}
@media only screen and (max-device-width: 640px) {
.permissions__block {
    flex-direction: column;
    align-items: flex-start
}
  }
/* ---------------------------------------------------------------------------
   The role menu.

   It is PORTALED: ember-basic-dropdown renders an open menu into a wormhole at
   body level, so it is not inside `.modal` in the DOM and a rule written as
   `.modal .permissions__list` matches nothing. That mistake is what once left
   this menu showing the app's own `crimson` on `antiquewhite`.

   The surface is white with a tinted selection. The app's own `--permission-bg`
   is anti-flash-white with a WHITE hover, so the resting rows were the grey
   ones and the description sat grey-on-grey at about 2.9:1.
   --------------------------------------------------------------------------- */
.permissions__list {
  /* Wider than the 400px it inherits, and that is a HEIGHT fix rather than a width preference. Each row is
   * a title over a description, and at 400px most descriptions wrapped to three lines; at 460px they wrap
   * to two. Measured in the browser with all seven levels: 522px at 400/8px, 428px at 460/6px — a menu
   * shorter than the six-level one used to be, so nowhere it used to fit has stopped fitting.
   *
   * The HEIGHT is not set here, and deliberately so. It was, twice — `100vh - 220px`, then a flat 440px —
   * and both failed the same way, because a cap written in CSS cannot know where the trigger sits. The
   * menu is portaled to a body-level wormhole and positioned absolutely, so a cap larger than the space
   * actually left below the trigger never bites: nothing scrolls and the overflow is simply off-screen.
   * At 440px against the 288px that remained in a 673px window, that cost a person `Manager` and
   * `Full permissions` with no way to reach either (13.09.2026).
   *
   * The bound is now computed per open, from the room that is really there, by
   * `utils/dropdown-fit` — wired in as `@calculatePosition={{dropdown-fit}}` on every menu that
   * wears this class. `overflow-y: auto` below is what lets that bound scroll when it bites. */
  width: 460px;
  padding: 4px;
  border: 1px solid var(--r-edge);
  border-radius: var(--r-r-inner);
  background: #fff;
  box-shadow: var(--r-shadow-md);
  overflow-x: hidden;
  overflow-y: auto;
}
.permissions__item {
  /* 6px, not 8px: four pixels a row is 28px over seven, which is the difference between a menu that fits
   * under its trigger and one that hangs off the bottom of the window. */
  padding: 6px 10px;
  border: 0;
  border-radius: 7px;
}
.permissions__item + .permissions__item { border-top: 0; }
.permissions__item--selected { background: #f4f8ff; }
.permissions__item:hover:not(.permissions__item--no-hover) { background: var(--r-tint); }
.permission__title {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--r-navy);
}
/* This is the copy a person reads to decide what access to grant, not a
   caption — so it takes the body grey rather than the secondary tier. */
.permission__desc {
  font-size: 11.5px;
  line-height: 1.45;
  white-space: normal;
  color: var(--r-grey);
}
/* The level, wearing the Permission column's capsule, inside the widget that GRANTS it (the fusion share
 * panel and the hub's Default sharing). The colour and the pill are `.tag--perm`'s and are not repeated
 * here — this only sizes it: the column's 10.5px is set for a table cell read down a screenful of rows,
 * and the same capsule in a menu you are reading one line at a time comes out looking like a footnote.
 *
 * Scoped to these two containers rather than given to `.tag--perm` generally, so the column keeps its own
 * size. Nothing here sets `color`, which is what lets `.tag--perm-1` … `-7` paint each step without a
 * specificity fight — the reason the capsule is NOT wrapped in `.permission__title` any more. */
.permissions__item .tag--perm,
.permissions__head .tag--perm {
  padding: 2px 9px;
  font-size: 11.5px;
  line-height: 16px;
}
/* The classic share dialog's danger treatment for Full permissions
 * (`components/modal/share-docs/selectbox-permissions`). The two FUSION dropdowns no longer use it: their
 * levels wear the red-to-purple scale above, which ends at purple, and a red "Full permissions" beside a
 * purple one said two different things about one level. */
.permissions__item--full,
.permissions__head--full {
  background: var(--r-crit-bg);
  color: var(--r-crit-fg);
}
.permissions__item--full .permission__title,
.permissions__item--full .permission__desc { color: var(--r-crit-fg); }
/* The closed trigger, inside the share dialog. */
.permissions__head {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 32px;
  padding: 5px 10px;
  border: 1px solid var(--r-ctl);
  border-radius: var(--r-r-ctl);
  background: #fff;
}
.permissions__head:hover {
  border-color: var(--r-ctl-hi);
  background: var(--r-hover);
}
.permissions__head--new {
  width: auto;
  min-width: 104px;
  padding: 5px 9px;
  font-size: 11px;
}
@media only screen and (max-device-width: 640px) {
  /* Both menus that use this class are wider than a phone: the role menu is a
     fixed 400px, and the user-type menu beside it carries whole paragraphs.
     Capping the width alone is not enough, because ember-basic-dropdown writes
     `left` inline from the trigger's own position — the role menu opens
     right-aligned and spills off the LEFT, the user-type menu opens
     left-aligned from a trigger already 63px in and spills off the RIGHT. A
     width that survives both would be too narrow to read.

     So on a phone the menu stops following its trigger horizontally and spans
     the screen instead. `!important` is the only thing that beats an inline
     style, and the position is written by JavaScript rather than by a rule
     this one could simply outrank. Vertical placement is left alone — that
     part ember-basic-dropdown gets right. */
  .permissions__list {
    left: 12px !important;
    width: calc(100vw - 24px) !important;
    max-width: none;
  }
}
.login__container {
  box-sizing: border-box;
  margin-left: 0;
  padding: 50px 100px;
  background-color: var(--colour-brand-dark);
  overflow: hidden;
  position: relative;
}
@media only screen and (max-device-width: 640px) {
.login__container {
    padding: 50px 42px
}
  }
.login__box {
  box-sizing: border-box;
  width: 300px;
  margin-right: auto;
  display: flex;
  flex-direction: column;
  color: var(--hero-white);
  z-index: 1;
  transform: translate3d(0, 0, 0);
}
@media only screen and (max-device-width: 640px) {
.login__box {
    width: 100%;
    height: 100%
}
  }
.login__graphic {
  position: absolute;
  right: -350px;
  bottom: -1000px;
  display: block;
  width: 1979px;
  height: 2754.25px;
}
@media (max-width: 900px) {
.login__graphic {
    bottom: -550px;
    width: 1170px;
    height: 1628.32px
}
  }
@media only screen and (max-device-width: 640px) {
.login__graphic {
    left: -100px;
    width: 650px;
    height: 904.625px;
    top: -405px
}
  }
.login__logo {
  width: 200px;
  margin-bottom: 100px;
}
@media only screen and (max-device-width: 640px) {
.login__logo {
    flex: 1 1;
    margin-bottom: 0
}
  }
.login__title {
  font-size: 38px;
  font-weight: bold;
  line-height: 1.18;
  text-align: left;
  margin-bottom: 25px;
}
.login__field {
  position: relative;
  padding-bottom: 15px;
}
.login__field:last-of-type {
    margin-bottom: 10px;
  }
.login__label {
  display: inline-block;
  font-size: 12px;
  font-weight: 500;
  text-align: left;
  margin-bottom: 5px;
}
.login__input {
  width: 100%;
  box-sizing: border-box;
  padding: 8px 14px 6px 12.2px;
  border-radius: 3px;
  border: 1px solid var(--blue-white);
  transition: 0.5s;
  outline: none;
  font-weight: 500;
  font-size: 12px;
  background: transparent;
  color: var(--hero-white);
}
.login__input:focus {
    border-color: var(--colour-brand);
  }
.login__input[disabled] {
    background: transparent;
  }
/* White-on-card input variant. Base rules are defined here so the class
   is valid in isolation; the auth shell (.dekkodems-auth__card) overrides
   sizing and focus styles to match the modernised auth pages. */
.login__input-white {
  width: 100%;
  box-sizing: border-box;
  padding: 8px 14px 6px 12.2px;
  border-radius: 3px;
  border: 0.5px solid #000;
  font-weight: 500;
  font-size: 12px;
  outline: none;
  background: var(--white) !important;
  color: var(--black);
}
.login__input-white::placeholder {
    color: #737373;
  }
.login__input-white:-webkit-autofill {
    -webkit-text-fill-color: var(--black);
  }
.login__error {
  margin-top: 4px;
  font-size: 10px;
  color: var(--red);
}
.login__icon {
  position: absolute;
  top: 26px;
  right: 15px;
  font-weight: 500;
  cursor: help;
  color: var(--blue-white);
  font-size: 20px;
}
.login__icon--eye {
  right: 11px;
  cursor: pointer;
  top: 31px;
  font-size: 13px;
}
.login__button {
  padding: 9px 30px;
  border-radius: 3px;
  background-color: var(--colour-brand);
  font-size: 12px;
  font-weight: 600;
  text-align: center;
  color: var(--white);
  outline: none;
  text-decoration: none;
  border: 0;
}
@media only screen and (max-device-width: 640px) {
.login__button {
    width: 100%
}
  }
.login__button--ad {
  border: solid 1px var(--white);
  background-color: var(--black);
  margin-bottom: 30px;
}
.login__divider {
  margin: 30px 0;
  height: 1px;
  background-color: var(--white);
}
.login__link {
  font-size: 12px;
  font-weight: 600;
  text-align: left;
  color: var(--colour-brand);
  text-decoration: none;
  margin-bottom: 15px;
  background: var(--colour-brand-dark);
  border-radius: 3px;
  display: inline-block;
  width: -moz-fit-content;
  width: fit-content;
}
@media only screen and (max-device-height: 700px) {
.login__link {
    margin-bottom: 5px
}
  }
.login__bg-padding {
  padding: 6px 12px;
}
/* Inline "where do I find my 2FA code?" helper under the 2FA field.
   Collapsed one-liner by default; expands in place (no modal) so the code
   box stays visible while the user glances between phone and screen.
   Metrics are pixel-exact to the approved design (2fa-help-design.html). */
.login__twofa-help-toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 2px 0 12px;
  padding: 0;
  border: 0;
  background: none;
  font-size: 13.5px;
  font-weight: 400;
  color: #1b4fc4; /* design blue-dark — AA contrast on the white card */
  text-decoration: underline;
  text-underline-offset: 2px;
  cursor: pointer;
}
.login__twofa-help-chevron {
  display: inline-block;
  text-decoration: none;
  transition: transform 0.15s ease;
}
.login__twofa-help-chevron--open {
  transform: rotate(90deg);
}
.login__twofa-help {
  margin: 0 0 14px;
  padding: 14px 16px;
  border: 1px solid #e3e8f0;
  border-left: 3px solid #2f6fed; /* design blue accent */
  border-radius: 8px;
  background-color: #f7faff;
  font-size: 13.5px;
  line-height: 1.55;
  text-align: left;
  color: #1c2433;
}
.login__twofa-help-title {
  font-size: 13.5px;
  font-weight: 700;
  color: #0f1e3d;
  margin: 0 0 6px;
}
.login__twofa-help-steps {
  margin: 6px 0 10px;
  padding-left: 20px;
}
.login__twofa-help-steps li {
  margin-bottom: 4px;
}
.login__twofa-help-qr-note {
  margin: 10px 0;
  padding: 8px 10px;
  border: 1px solid #bfe6cf;
  border-radius: 6px;
  background-color: #e9f7ef;
  color: #0c7a43;
  font-weight: 600;
  font-size: 13px;
}
.login__twofa-help-support {
  margin-top: 10px;
  border-top: 1px dashed #e3e8f0;
  padding-top: 10px;
  color: #5b6678;
}
.login__twofa-help-support a {
  color: #1b4fc4; /* design blue-dark — AA contrast on the white card */
  font-weight: 600;
  text-decoration: underline;
}
.placement__content {
  box-sizing: border-box;
  padding: 20px 27px 20px 28px;
}
.placement__title {
  font-size: 14px;
  font-weight: bold;
  text-align: center;
  /* color: #373737; */
  width: 100%;
  margin-bottom: 17px;
}
.placement__users {
  max-height: 300px;
  overflow-y: auto;
  overflow-x: hidden;
  margin-bottom: 7px;
}
.placement__user {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  margin-bottom: 5px;
  cursor: pointer;
  padding: 5px;
  border-radius: 3px;
  border: solid 1px #fff;
}
.placement__user-img {
    width: 20px;
    height: 20px;
    margin-right: 5px;
    border-radius: 50%;
    overflow: hidden;
  }
.placement__user-email {
    font-size: 12px;
    text-align: left;
    /* color: #373737; */
    max-width: 230px;
  }
.placement__user--active {
    border-color: #00a3ff;
  }
.placement__user--active .placement__user-email {
      font-weight: bold;
    }
.placement__divider {
  height: 1px;
  border-bottom: 1px solid var(--black);
  margin-bottom: 20px;
}
.placement__fields {
  display: flex;
  justify-content: space-around;
}
.placement__fields + .placement__fields {
    margin-top: 17px;
  }
.placement__fields svg {
    cursor: pointer;
  }
.placement__group {
  display: flex;
  flex-direction: column;
  margin-bottom: 17px;
  position: relative;
}
.placement__group--lock {
    display: block;
  }
.placement__group--lock .placement__fields {
      opacity: 0.2;
    }
.placement__group--lock .placement__lock {
      display: flex;
    }
.placement__blocks {
  flex: 1 1;
  overflow-y: auto;
  font-size: 12px;
  /* color: #373737; */
}
.placement__lock {
  display: none;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  align-items: center;
  justify-content: center;
  flex: 1 1;
  border-radius: 3px;
  background-color: rgba(0, 0, 0, 0.1);
  font-size: 12px;
  font-style: normal;
  line-height: 1.24;
  /* color: #373737; */
}
.placement__block {
  display: flex;
  align-items: center;
  margin-bottom: 5px;
  margin-bottom: 5px;
  cursor: pointer;
  font-size: 14px;
  text-transform: capitalize;
  border-radius: 3px;
  padding: 5px;
}
.placement__block-remove {
    margin-left: auto;
  }
.placement__block--active {
    background-color: rgba(0, 163, 255, 1) !important;
  }
.placement__block i {
    margin-right: 5px;
  }
.placement__block i:before {
    color: var(--body-color);
  }
.placement__icon {
  display: inline-block;
  font-size: 25px;
  cursor: pointer;
}
.placement__icon i:before {
    color: var(--body-color);
  }
#audio-viewer {
  width: 100%;
}
#video-viewer {
  width: 100%;
  max-height: 600px;
  background-color: var(--colour-neutral-1);
}
@media (max-width: 1440px) {
#video-viewer {
    max-height: 450px
}
  }
@media (max-width: 1024px) {
#video-viewer {
    max-height: 400px
}
  }
@media (max-height: 500px) {
#video-viewer {
    max-height: 200px
}
  }
.audio--back, .audio--forward {
  background-color: rgb(241, 243, 244);
  line-height: 0;
  padding: 8px;
  border-radius: 50%;
  cursor: pointer;
}
.media__watermark {
  display: flex;
  align-items: center;
  justify-content: center;
  position: absolute;
  top: 80px;
  left: 40px;
  right: 40px;
  bottom: 80px;
  font-size: 120px;
  text-align: center;
  vertical-align: middle;
  color: var(--hero-white);
  opacity: 0.5;
  text-transform: uppercase;
  pointer-events: none;
}
.media__logo {
  position: absolute;
  width: 24px;
  height: 24px;
  left: 33px;
  top: 15px;
}
body {
	background-color: var(--body-bg);
	color: var(--body-color);
}
.page {
	position: relative;
}
/* background-color: #f3f3f9; */
.page--sign {
		display: flex;
		flex-direction: column;
		min-height: 100vh;
		/* background-color: var(--white); */
	}
/* color: #fff; */
.page--valut {
		min-height: unset;
	}
.page--recovery {
		box-sizing: border-box;
		padding-top: 20px;
		padding-bottom: 20px;
		background-color: var(--hero-white);
		color: var(--black);
	}
.page--signup {
		background-color: var(--colour-brand-dark);
		overflow: hidden;
		box-sizing: border-box;
		color: var(--hero-white);
	}
.page--signup .container {
			transform: translate3d(0, 0, 0);
		}
.page--signup .login__graphic {
			opacity: 0.3;
		}
.page--signup .sign-title, .page--signup .sign__text, .page--signup .sign__form-title {
			color: var(--hero-white);
		}
a,
button {
	outline: none;
}
@keyframes fadein {
  from { opacity: 0; }
  to   { opacity: 1; }
}
/* Log details modal styles */
.log-details__info {
    padding: 1rem;
    border-radius: 4px;
  }
.log-details__group {
    border: 1px solid;
    border-radius: 4px;
    padding: 1rem;
    background: var(--colour-bg-default);
  }
/* Layout chrome for the DekkoCORE login + signup pages.
   Background image fills the viewport. A centered row contains:
   - left column: DekkoCORE pill sits just above a wide white card
   - right column: a narrower navy quote panel, vertically centered
   A small footer line sits near the bottom of the viewport. */
.dekkodems-auth {
    position: fixed;
    inset: 0;
    overflow: auto;
    color: #fff;
    font-family: inherit;
    background-color: #05071a;
    padding: 24px 24px 56px;
    box-sizing: border-box;
}
.dekkodems-auth__background {
    position: absolute;
    inset: 0;
    background-image:
        linear-gradient(rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0.75)),
        url("/assets/images/core-bg-87fd99310933d708385899e5847352fa.jpg");
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    z-index: 0;
}
.dekkodems-auth__center {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 960px;
    margin: 0 auto;
    min-height: calc(100vh - 24px - 56px);
    display: flex;
    flex-direction: column;
    justify-content: center;
}
.dekkodems-auth__row {
    display: flex;
    align-items: center;
    gap: 176px;
}
.dekkodems-auth__col {
    display: flex;
    flex-direction: column;
}
.dekkodems-auth__col--card {
    flex: 1 1;
    min-width: 0;
}
.dekkodems-auth__col--quote {
    flex: 0 0 315px;
}
.dekkodems-auth__brand {
    align-self: center;
    display: inline-flex;
    align-items: center;
    gap: 30px;
    background: #fff;
    color: #0a1130;
    padding: 16px 32px;
    border-radius: 18px;
    box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2);
    margin-bottom: -32px;
    position: relative;
    z-index: 2;
}
.dekkodems-auth__brand-name {
    font-weight: 700;
    font-size: 26px;
    color: #0a1130;
    letter-spacing: 0.2px;
}
.dekkodems-auth__brand-flag {
    width: 68px;
    height: 44px;
    object-fit: cover;
    border-radius: 3px;
}
.dekkodems-auth__card {
    background: #fff;
    color: #0a1130;
    border-radius: 16px;
    padding: 64px 36px 52px;
    box-shadow: 0 16px 48px rgba(0, 0, 0, 0.45);
    box-sizing: border-box;
    position: relative;
    z-index: 1;
}
.dekkodems-auth__card-inner {
    max-width: 320px;
    margin: 0 auto;
}
.dekkodems-auth__quote {
    background: #131b41;
    color: #fff;
    border-radius: 14px;
    padding: 40px 44px 32px;
    box-shadow: 0 16px 48px rgba(0, 0, 0, 0.45);
    display: flex;
    flex-direction: column;
    gap: 32px;
    box-sizing: border-box;
    min-height: 320px;
    justify-content: space-between;
}
.dekkodems-auth__quote-text {
    margin: 0;
    font-size: 16px;
    line-height: 1.5;
    font-weight: 600;
    text-align: center;
    color: #ffffff;
}
.dekkodems-auth__quote-cta {
    align-self: center;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 8px 22px;
    background: #3b6dff;
    color: #fff !important;
    border-radius: 6px;
    text-decoration: none;
    font-size: 14px;
    font-weight: 600;
    transition: background-color 0.15s ease;
}
.dekkodems-auth__quote-cta:hover {
    background: #2a58e6;
    text-decoration: none;
}
.dekkodems-auth__footer {
    margin: 20px 0 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    position: relative;
    z-index: 1;
    font-size: 12px;
    color: #c9d2f0;
}
.dekkodems-auth__footer a {
    color: #ffffff;
    text-decoration: underline;
    margin-left: 4px;
}
/* === Card-internal form styling ===
   Restyles the existing login-form / signup-page form markup that's
   yielded into the white card. Form logic untouched. */
.dekkodems-auth__card .login__title,
.dekkodems-auth__card .dekkodems-auth__title {
    font-size: 24px;
    font-weight: 700;
    color: #0a1130;
    margin: 0 0 22px;
    line-height: 1.2;
    text-align: center;
}
.dekkodems-auth__card .login__field,
.dekkodems-auth__card .sign__form-field {
    margin-bottom: 12px;
    padding-bottom: 0;
    position: relative;
}
.dekkodems-auth__card .login__field:last-of-type {
    margin-bottom: 12px;
}
.dekkodems-auth__card .login__label {
    display: block;
    font-size: 13px;
    font-weight: 500;
    color: #4a5072;
    margin-bottom: 6px;
}
.dekkodems-auth__card input.login__input,
.dekkodems-auth__card input.login__input-white {
    width: 100%;
    box-sizing: border-box;
    padding: 10px 12px;
    border: 1px solid #d3d8ea;
    border-radius: 6px;
    background: #fff;
    color: #0a1130;
    font-size: 14px;
    line-height: 1.4;
    outline: none;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.dekkodems-auth__card input.login__input::placeholder,
.dekkodems-auth__card input.login__input-white::placeholder {
    color: #9098b3;
}
.dekkodems-auth__card input.login__input:focus,
.dekkodems-auth__card input.login__input-white:focus {
    border-color: #3b6dff;
    box-shadow: 0 0 0 3px rgba(75, 124, 255, 0.15);
}
.dekkodems-auth__card .login__icon {
    top: auto;
    right: 12px;
}
.dekkodems-auth__card .login__icon--eye {
    position: absolute;
    right: 12px;
    top: 21px;
    transform: translateY(-50%);
    cursor: pointer;
    color: #6b7290;
    font-size: 16px;
    line-height: 1;
}
.dekkodems-auth__card .login__label ~ .login__icon--eye {
    top: 43px;
}
.dekkodems-auth__card .login__button {
    width: 100%;
    padding: 10px 16px;
    background: #3b6dff;
    color: #fff;
    border: none;
    border-radius: 6px;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    margin-top: 6px;
    transition: background-color 0.15s ease;
}
.dekkodems-auth__card .login__button:hover:not(:disabled) {
    background: #2a58e6;
}
.dekkodems-auth__card .login__button:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}
/* Corporate-login (AD) button — black with white text, sits under the divider. */
.dekkodems-auth__card .login__button--ad {
    background: #000;
    color: #fff;
    border: 1px solid #000;
    margin-bottom: 16px;
}
.dekkodems-auth__card .login__button--ad:hover:not(:disabled) {
    background: #1a1a1a;
    border-color: #1a1a1a;
}
.dekkodems-auth__card .login__label--center {
    text-align: center;
}
.dekkodems-auth__card .login__button--ad-spaced {
    margin-top: 24px;
}
.dekkodems-auth__card .login__divider {
    border: 0;
    border-top: 1px solid #e6e9f4;
    margin: 18px 0 12px;
    height: 0;
    background: transparent;
}
.dekkodems-auth__links {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-wrap: nowrap;
    gap: 12px;
    margin-top: 4px;
    white-space: nowrap;
}
.dekkodems-auth__card .login__link {
    display: inline-block;
    margin: 0;
    padding: 0;
    background: transparent;
    font-size: 12px;
    color: #3b6dff;
    text-decoration: none;
}
.dekkodems-auth__card .login__link:hover {
    text-decoration: underline;
}
/* A button that reads as one of these links (the passkey conversion's Log out): no native border or box, and a focus
   ring for the keyboard. */
.dekkodems-auth__card button.login__link {
    border: 0;
    cursor: pointer;
}
.dekkodems-auth__card button.login__link:focus-visible {
    outline: 2px solid #3b6dff;
    outline-offset: 2px;
}
/* Room between a conversion step's main button and the way out under it, left-aligned as that button is (the CTO), and a
   little more weight than the footer links. */
.dekkodems-auth__card .passkey-conversion__logout {
    justify-content: flex-start;
    margin-top: 20px;
}
.dekkodems-auth__card .passkey-conversion__logout .login__link {
    font-size: 13px;
    font-weight: 600;
}
.dekkodems-auth__card .login__error {
    color: #d64545;
    font-size: 12px;
    margin-top: 4px;
}
.dekkodems-auth__card .dekkodems-auth__fineprint {
    margin: 16px 0 0;
    font-size: 12px;
    line-height: 1.5;
    color: #6b7290;
    text-align: center;
}
.dekkodems-auth__card .dekkodems-auth__fineprint a {
    color: #3b6dff;
    text-decoration: none;
}
.dekkodems-auth__card .dekkodems-auth__fineprint a:hover {
    text-decoration: underline;
}
.dekkodems-auth__card .sign-banner {
    background: #eef3ff;
    border: 1px solid #cfdbff;
    color: #1f2d6f;
    padding: 10px 12px;
    border-radius: 6px;
    font-size: 13px;
    margin-bottom: 14px;
}
.dekkodems-auth__card .google-recaptcha {
    display: flex;
    justify-content: center;
    margin: 4px 0 10px;
}
.dekkodems-auth__card .warning-banner {
    background: #fff4e0;
    border: 1px solid #ffd99e;
    color: #6b4a00;
    padding: 8px 12px;
    border-radius: 6px;
    font-size: 12px;
    margin-bottom: 14px;
    position: static;
    width: auto;
}
/* Recover-account page: breathing room after the hint paragraph and after
   the submit button (scoped to the recover form so login is untouched). */
.dekkodems-auth__card .login__recover-hint {
    margin: 6px 0 24px;
    line-height: 1.5;
}
.dekkodems-auth__card form[name="recover-form"] {
    margin-bottom: 20px;
}
/* Login: the passkey hint said after a refused password, between Log In and "Sign in with a passkey". */
.dekkodems-auth__card .login__passkey-hint {
    margin: 12px 0 0;
    line-height: 1.5;
}
/* === Responsive ===
   Hide the quote panel and center the card on:
   - viewports ≤1024px (phones, portrait tablets, narrow desktop windows)
   - any touch-primary device (catches landscape iPad Pro at 1366px, etc.)
   The card itself stays visible at every size. */
@media (max-width: 1024px), (hover: none) and (pointer: coarse) {
    .dekkodems-auth__col--quote {
        display: none;
    }
    .dekkodems-auth__row {
        justify-content: center;
        gap: 0;
    }
    .dekkodems-auth__col--card {
        flex: 0 0 auto;
        width: 100%;
        max-width: 480px;
    }
    .dekkodems-auth__card {
        padding: 56px 24px 36px;
    }
}
/* layout */
.df {
  display: flex;
}
.dif {
  display: inline-flex;
}
.df-jc {
  display: flex;
  justify-content: center;
}
.df-jsa {
  display: flex;
  justify-content: space-around;
}
.df-jfe {
  display: flex;
  justify-content: flex-end;
}
.df-jfs {
  display: flex;
  justify-content: flex-start;
}
.dif-ac {
  display: inline-flex;
  align-items: center;
}
.df-ac {
  display: flex;
  align-items: center;
}
.df-ac-jc {
  display: flex;
  align-items: center;
  justify-content: center;
}
.df-ac-jsa {
  display: flex;
  align-items: center;
  justify-content: space-around;
}
.df-ac-jsb {
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.df-ac-jse {
  display: flex;
  align-items: center;
  justify-content: space-evenly;
}
.df-ac-fdc {
  display: flex;
  align-items: center;
  flex-direction: column;
}
.df-fdc {
  display: flex;
  flex-direction: column;
}
.df-fdc-jsb {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.df-ac-fdr-jsb {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
}
.df-fw {
  display: flex;
  flex-wrap: wrap;
}
.df-ab {
  display: flex;
  align-items: baseline;
}
.flex-1 {
  flex: 1 1;
}
.full-width {
  width: 100%;
}
.full-max-width {
  max-width: 100%;
}
.margin-auto {
  margin: 0 auto;
}
.cursor-pointer {
  cursor: pointer;
}
.wrapper-text-ellipsis {
  flex: 1 1;
  min-width: 0;
}
.text-ellipsis {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: initial;
}
/* A long value in a table cell ends in "…" instead of widening its column without limit (the CTO,
 * 15.10.2026: very long attribute values must look reasonable). A table ignores `max-width` on its own
 * cells, which is why `.text-ellipsis` and the register's `max-width: 320px` never cut anything, so the cap
 * sits on a block INSIDE the cell. It grows with the screen: a wide one shows more before trimming. Wide
 * tables still scroll sideways; the whole value is in the tooltip. */
.cell-trim {
  display: block;
  max-width: clamp(8rem, 18vw, 22rem);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.width-100 {
  width: 100%;
}
.m-r-10 {
  margin-right: 10px;
}
.m-r-30 {
  margin-right: 30px;
}
.text-center {
  text-align: center;
}
.m-t-10 {
  margin-top: 10px;
}
.m-b-20 {
  margin-bottom: 20px;
}
.m-b-5 {
  margin-bottom: 5px;
}
.font-10 {
  font-size: 10px;
}
.font-12 {
  font-size: 12px;
}
.font-14 {
  font-size: 14px;
}
.font-16 {
  font-size: 16px;
}
.font-18 {
  font-size: 18px;
}
.font-bold {
  font-weight: bold;
}
.font-italic {
  font-style: italic;
}
.font-normal {
  font-weight: normal;
}
.font-500 {
  font-weight: 500;
}
.font-underline {
  text-decoration: underline;
}
.rotate-180 {
  transform: rotate(180deg);
}
.font-black {
  color: var(--black);
}
.font-white {
  color: var(--hero-white);
}
/* Pages */
.valut-table--wrap {
    position: relative;
    width: 100%;
    overflow: auto;
  }
.valut-table--wrap .tenancy__content-row .checkbox-set__item.checkbox-set__item--horiz {
        display: flex;
        align-items: center;
        max-width: unset;
        margin-left: 0;
        margin-bottom: 15px;
      }
.valut-table--wrap .tenancy__content-row .checkbox-set__item.checkbox-set__item--horiz .checkbox-set__dscr.checkbox-set__dscr--tenancy {
          color: #000000;
          margin-top: 0;
          margin-left: 10px;
          font-size: 12px;
        }
.valut-table--share .valut-table__cell {
      padding: 10px 15px;
      vertical-align: top;
      max-width: 100%;
    }
.valut-table--share .valut-table__cell:first-child {
        padding-left: 0;
      }
.valut-table--share .valut-table__item:not(:last-child) .valut-table__cell {
          border-bottom: 2px dashed #e4e4e4;
        }
.valut-table--share .tenancy__content-text {
      margin-bottom: 13px;
    }
.valut-table--tenancy {
    position: relative;
    width: max-content;
    max-width: none;
    margin-top: 0px;
    padding-top: 0;
  }
.valut-table--tenancy:not(:last-child) {
      margin-bottom: 20px;
    }
.valut-table--tenancy label {
      font-size: 14px;
      font-weight: 500;
      line-height: 1.19;
      text-align: left;
      color: #000000;
      margin-bottom: 12px;
    }
.valut-table--tenancy input {
      background-color: #ffffff;
      margin-top: 0;
      border-color: #000000;
      width: 100%;
      font-size: 13px;
      padding: 10px 15px;
      max-width: 175px;
    }
.tenancy {
  color: #000000;
}
.tenancy--default-case {
    text-transform: unset;
  }
.tenancy--textcenter {
    text-align: center;
  }
.tenancy--bold {
    font-weight: bold;
  }
.tenancy__container {
    display: flex;
    flex-direction: row;
    width: 100%;
  }
.tenancy__container button {
      max-width: 175px;
    }
.tenancy__content {
    position: relative;
    flex-grow: 1;
    padding-left: 35px;
    height: 100%;
    max-height: 680px;
    width: 100%;
    max-width: calc(100% - 310px);
    display: flex;
    flex-direction: column;
  }
.tenancy__content-row {
      margin-top: 12px;
    }
@media screen and (min-width: 1440px) {
.tenancy__content-row {
        margin-top: 20px
    }
      }
@media screen and (min-width: 1920px) {
.tenancy__content-row {
        margin-top: 32px
    }
      }
.tenancy__content-text {
      font-size: 13px;
      /*max-width: 80px;*/
      line-height: 1.5;
      color: #707070;
    }
.tenancy__content-text--style-1 {
        font-size: 14px;
        font-weight: 500;
        line-height: 1.19;
        text-align: left;
        color: #000000;
        padding-top: 14px;
      }
.tenancy__content-text--ellipsis {
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
      }
.tenancy__content .traffic__form {
      max-width: 100%;
    }
.tenancy__content .traffic__form .highcharts-wrapper {
        width: 100%;
        max-width: 1160px;
        margin-top: 10px;
      }
.tenancy__content .traffic__form .highcharts-wrapper .chart-container .highcharts-background {
            fill: transparent;
          }
.tenancy__content .traffic__form .checkbox-set__item.checkbox-set__item--horiz {
        display: flex;
        align-items: center;
        max-width: unset;
        margin-left: 0;
        margin-bottom: 0;
        margin-top: 30px;
      }
.tenancy__content .traffic__form .checkbox-set__item.checkbox-set__item--horiz .checkbox-set__dscr.checkbox-set__dscr--tenancy {
          margin-top: 0;
          margin-left: 10px;
          font-size: 15px;
          text-align: left;
        }
.tenancy__row {
    margin: 8px 0;
  }
@media screen and (min-width: 1280px) {
.tenancy__row {
      margin: 12px 0
  }
    }
.tenancy__row .checkbox-set {
        position: relative;
        display: flex;
        max-width: 500px;
        flex-wrap: wrap;
        padding: 16px 0;
        justify-content: flex-start !important;
      }
.tenancy__row .checkbox-set .checkbox {
          margin: 0 0 0 10px;
        }
.tenancy__row .checkbox-set__item {
          min-width: 175px;
          margin-bottom: 15px;
        }
.tenancy__row .checkbox-set__item--width {
            flex-grow: 7;
            justify-content: flex-end;
          }
.tenancy__row .checkbox-set__item--horiz {
            display: flex;
            align-items: center;
            max-width: unset;
            margin-left: 0;
          }
.tenancy__row .checkbox-set__item--marginbottom {
            margin-top: 8px;
            margin-bottom: 8px;
          }
.tenancy__row .checkbox-set__dscr--tenancy {
            line-height: 1.22;
            text-align: left;
            color: #000000;
            margin-top: 0;
            /*width: 92px;*/
            width: auto;
            font-size: 13px;
            margin-left: 10px;
          }
@media screen and (min-width: 1920px) {
.tenancy__row .checkbox-set__dscr--tenancy {
              margin-left: 20px;
              font-size: 18px
          }
            }
.tenancy__title {
    font-size: 22px;
    min-height: 45px;
    font-weight: 500;
    line-height: 1.21;
    text-align: left;
    color: #000000;
    margin-top: 8px;
    margin-bottom: 20px;
  }
.tenancy__subtitle {
    margin-top: 16px;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.19;
    text-align: left;
    color: #000000;
  }
.tenancy__filterlist {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    padding-right: 40px;
  }
.tenancy__filterlist--bottomalign {
      align-items: flex-end;
    }
.tenancy__filteritem {
    display: flex;
    flex-direction: column;
    flex-grow: 1;
    margin-bottom: 8px;
    max-width: 175px;
    padding-right: 15px;
  }
.tenancy__filteritem--wide {
      /*flex-grow: 4;*/
    }
.tenancy__filteritem-label {
      font-size: 16px;
      font-weight: 500;
      line-height: 1.19;
      text-align: left;
      color: #000000;
      margin-bottom: 12px;
    }
.tenancy__input-row {
      display: flex;
      flex-direction: row;
      align-items: center;
    }
.tenancy__input-text {
      font-size: 14px;
      line-height: 1.22;
      text-align: left;
      color: #000000;
      margin-left: 28px;
    }
.tenancy__graph {
    width: 90%;
  }
.tenancy__graph--fullwidth {
      width: 100%;
    }
.tenancy__graph img {
      width: 100%;
    }
.tenancy__brand-colors {
      display: flex;
      flex-direction: row;
      padding: 24px 0;
    }
.tenancy__brand-color {
      font-size: 8px;
      line-height: 1.25;
      text-align: center;
      color: #000000;
      display: flex;
      flex-direction: column;
      align-items: center;
      margin-right: 32px;
      max-width: 36px;
    }
.tenancy__brand-color img {
        width: 32px;
        height: 32px;
        margin-bottom: 6px;
        border-radius: 50%;
        border: 1px solid #000000;
      }
.tenancy__brand-features {
      display: flex;
      flex-direction: row;
      border-bottom: 1px dashed #707070;
      padding: 24px 0;
      max-width: 375px;
    }
.tenancy__brand-feature {
      font-size: 12px;
      font-weight: 500;
      line-height: 1.25;
      text-align: center;
      color: #000000;
      display: flex;
      flex-direction: column;
      align-items: center;
      margin-right: 40px;
      max-width: 56;
    }
.tenancy__brand-feature img {
        width: 48px;
        height: 48px;
        margin-bottom: 8px;
        border-radius: 50%;
        border: 1px solid #000000;
      }
.tenancy__brand--nomargin {
      margin-right: 0;
    }
.tenancy__filtergroup {
    display: flex;
    flex-direction: row;
    margin-top: 32px;
  }
.tenancy__button--rightmargin {
      margin-right: 40px;
    }
.paginator {
  display: flex;
  flex-direction: row;
  align-self: center;
  margin: 0 auto;
  margin-top: 20px;
}
.paginator__cell {
    width: 28px;
    height: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 12px;
    font-weight: 500;
    padding: 4px;
    text-align: center;
    cursor: pointer;
    color: #4e4e4e;
    background-color: #f3f3f9;
    border: 1px solid;
    border-color: rgba(112, 112, 112, 0.3);
  }
.paginator__cell:hover,
    .paginator__cell--active {
      color: #ffffff;
      background-color: #4e4e4e;
    }
.paginator__cell--disabled {
      cursor: unset;
      background-color: #ffffff;
      color: rgba(112, 112, 112, 0.3);
    }
.paginator__cell--disabled:hover {
        cursor: unset;
        background-color: #ffffff;
        color: rgba(112, 112, 112, 0.3);
      }
.container--tenancy .ember-basic-dropdown-trigger.selectbox__head.tenancy__head {
    max-width: inherit;
  }
.doccontainer {
  padding: calc(92px + var(--banner-height)) 0 32px 0;
  margin-left: 0;
}
@media only screen and (max-device-width: 640px) {
.doccontainer {
    padding-top: calc(60px + var(--banner-height));
    padding-bottom: 118px
}
  }
.doccontainer__margin {
    margin-right: 320px;
  }
@media screen and (min-width: 1920px) {
.doccontainer__margin {
      margin-right: 385px
  }
    }
@media only screen and (max-device-width: 640px) {
.doccontainer__margin {
      margin-right: 0
  }
    }
.doccontainer__loadbar {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: rgba(0, 0, 0, 0.1);
    color: #000;
    display: flex;;
    align-items: center;
    justify-content: center;
    z-index: 10;
  }
.officecontainer {
  padding: calc(60px + var(--banner-height)) 0 0;
  margin-left: 0;
}
.only-office-embed {
  width: 100%;
  height: 100%;
}
#only-office__header {
  position: absolute;
  top: calc(60px + var(--banner-height));
  left: 0;
  height: 31px;
  width: 100%;
}
#only-office__header.word {
    background-color: var(--only-office-header-bg-word);
  }
#only-office__header.word.pdf {
      background-color: var(--only-office-header-bg-pdf);
    }
#only-office__header.slide {
    background-color: var(--only-office-header-bg-slide);
  }
#only-office__header.cell {
    background-color: var(--only-office-header-bg-cell);
  }
.only-office__logo {
  position: absolute;
  top: calc(60px + var(--banner-height));
  left: 0;
  height: 31px;
  width: 160px;
}
.only-office__logo.word {
    background-color: var(--only-office-header-bg-word);
  }
.only-office__logo.word.pdf {
      background-color: var(--only-office-header-bg-pdf);
    }
.only-office__logo.slide {
    background-color: var(--only-office-header-bg-slide);
  }
.only-office__logo.cell {
    background-color: var(--only-office-header-bg-cell);
  }
.only-office__save {
  position: absolute;
  top: calc(95px + var(--banner-height));
  left: 0;
  height: 55px;
  width: 35px;
  background-color: var(--only-office-toolbar-bg);
}
/* Covers the document server's Protection tab, which offers passwords and signatures this product does not
   implement. A cover rather than a setting because the editor's own `permissions.protect` is signed into
   the config token by the backend, and a field outside that signature makes the editor reject the config
   whole — see the commented-out line in `only-office#component`.

   THE OFFSETS ARE TIED TO THE DOCUMENT SERVER'S VERSION. They are the position of one tab in a strip the
   editor draws inside a cross-origin frame, so nothing here can find it: a release that renames a tab or
   changes a font moves it, silently, and the cover lands on the neighbour. `cell` did exactly that — it sat
   on View until 01.09.2026.

   Re-measure like this rather than by eye, against DS 9.4.0 as these were:
   open the editor, screenshot the viewport, and read the columns off the pixels — the tab labels are light
   text on the toolbar's own colour, and this cover is the only near-black run in the strip. A tab is its
   label plus 13px of padding on each side. */
.only-office__protect {
  position: absolute;
  top: calc(64px + var(--banner-height));
  height: 27px;
  background: #000;
  opacity: 0.5;
  width: 78px;
}
/* Label 400..459 References, 485..554 Collaboration, then Protection — measured under the cover, which
     already lands on it. */
.only-office__protect.word {
    left: 567px;
  }
/* A PDF is handed to the `word` editor and inherits its offsets, and its toolbar is not Word's. */
.only-office__protect.word.pdf {
      display: none;
    }
/* NOT an omission. A presentation's strip is File Home Insert Draw Design Transitions Animation
     Collaboration View — there is no Protection tab to cover. Measured 01.09.2026. */
.only-office__protect.slide {
    display: none;
  }
/* Label 612..664, so the tab is 599..677. Was 682, which is where View begins: one tab too far right,
     from a DS release that laid the strip out differently. */
.only-office__protect.cell {
    left: 599px;
  }
.header__back {
    display: inline-flex;
    cursor: pointer;
    align-items: center;
    padding: 6px 14px 6px 10px;
    border-radius: 18px;
    background-color: #f0f2f5;
    border: 1px solid #c8cdd6;
    color: #1a1a1a;
    transition: background-color 0.15s ease, border-color 0.15s ease;
  }
.header__back:hover {
      background-color: #e6e8ec;
      border-color: #b0b6c0;
    }
.header__back:focus-visible {
      outline: 2px solid #2566a3;
      outline-offset: 2px;
    }
.header__back-label {
      font-size: 14px;
      font-weight: 500;
      color: inherit;
    }
@media screen and (min-width: 1920px) {
.header__back-label {
        font-size: 16px
    }
      }
.header__back-icon {
      transform: rotate(180deg);
      margin-right: 8px;
    }
.header__doc {
    display: flex;
    align-items: center;
    margin-left: 16px;
    margin-right: 16px;
    min-width: 0;
  }
.header__doc div {
      margin-left: 8px;
    }
@media screen and (min-width: 1920px) {
.header__doc div {
        margin-left: 16px
    }
      }
.header__doc-title {
      font-weight: 500;
      line-height: 1.22;
      font-size: 18px;
      max-width: 400px;
    }
@media screen and (min-width: 1920px) {
.header__doc-title {
        font-size: 32px
    }
      }
@media only screen and (max-device-width: 640px) {
.header__doc-title {
        max-width: 200px
    }
      }
.header__save-status {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 5px 12px;
    border-radius: 12px;
    margin-left: 16px;
    font-size: 12px;
    font-weight: 500;
    line-height: 1;
  }
.header__save-status-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      flex-shrink: 0;
    }
.header__save-status--saved {
      background-color: #e6f5ec;
      color: #138a36;
    }
.header__save-status--saved .header__save-status-dot {
      background-color: #138a36;
    }
.header__save-status--modified {
      background-color: #fdf3dd;
      color: #8a6313;
    }
.header__save-status--modified .header__save-status-dot {
      background-color: #c97d0a;
    }
@media only screen and (max-device-width: 640px) {
.header__save-status {
      padding: 5px;
      margin-left: 8px
  }
    }
.field__sign-title {
      padding-bottom: 12px;
      width: 100%;
      /* color: #000000; */
    }
@media screen and (min-width: 1920px) {
.field__sign-title {
        padding-bottom: 20px;
    }
      }
.field__sign-title {
      font-size: 16px;
      font-weight: 500;
      line-height: 1.19;
      text-align: left;
      border-bottom: 2px dashed rgba(0, 0, 0, 0.16);
}
.field__sign-block {
      display: flex;
      flex-wrap: wrap;
      margin-left: 36px;
    }
@media screen and (min-width: 1440px) {
.field__sign-block {
        margin-left: 72px
    }
      }
.field__sign-row {
      display: flex;
      flex-direction: row;
      align-items: center;
      font-size: 16px;
      font-weight: 500;
      line-height: 1.5;
      text-align: left;
      /* color: #707070; */
      padding: 6px;
    }
@media screen and (min-width: 1920px) {
.field__sign-row {
        padding-top: 20px
    }
      }
.field__sign-row img {
        margin-right: 8px;
      }
.doctools {
  position: absolute;
  z-index: 3;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  bottom: 16px;
  left: 50%;
  transform: translateX(-50%);
  padding: 4px;
  color: var(--doctools-fg);
  background-color: var(--doctools-bg);
  border: 1px solid var(--doctools-border);
  border-radius: 12px;
  box-shadow: 0 8px 24px rgba(16, 24, 64, 0.14), 0 1px 3px rgba(16, 24, 64, 0.08);
  white-space: nowrap;
}
@media only screen and (max-device-width: 640px) {
.doctools {
    width: 100%;
    left: 0;
    bottom: 0;
    transform: none;
    justify-content: center;
    padding: 0;
    border-width: 1px 0 0;
    border-radius: 0;
    box-shadow: none
}
  }
.doctools--margin {
    left: calc(50% - 160px);
  }
@media only screen and (max-device-width: 640px) {
.doctools--margin {
      left: 0
  }
    }
.doctools__block {
    display: flex;
    align-items: center;
    gap: 2px;
  }
.doctools__block + .doctools__block {
      margin-left: 5px;
      padding-left: 5px;
      border-left: 1px solid var(--doctools-border);
    }
@media only screen and (max-device-width: 640px) {
      .doctools__block + .doctools__block {
        margin-left: 0;
        padding-left: 0;
        border-left: none;
      }
    }
.doctools__tool {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 8px;
    -webkit-user-select: none;
    user-select: none;
    cursor: pointer;
    height: 36px;
    min-width: 36px;
    padding: 0 8px;
    border-radius: 8px;
    color: inherit;
    transition: background-color 0.12s ease, color 0.12s ease;
  }
.doctools__tool:hover {
      background-color: var(--doctools-hover);
    }
.doctools__tool--labelled {
      padding: 0 12px 0 10px;
    }
.doctools__tool--active,
    .doctools__tool--active:hover {
      background-color: var(--doctools-active-bg);
      color: var(--doctools-active-fg);
    }
.doctools__tool--useless {
      cursor: default;
    }
.doctools__tool--useless:hover {
        background-color: transparent;
      }
@media only screen and (max-device-width: 640px) {
.doctools__tool {
      padding: 10px;
      border-radius: 0
  }

      .doctools__tool--useless {
        padding-left: 0;
        padding-right: 0;
      }
    }
.doctools__svg {
    width: 18px;
    height: 18px;
    flex: none;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
.doctools__label {
    font-size: 13px;
    font-weight: 500;
    line-height: 1;
  }
.doctools__readout {
    gap: 0;
    min-width: 52px;
    padding: 0 4px;
    font-size: 13px;
    font-weight: 500;
    font-variant-numeric: tabular-nums;
  }
.doctools__readout .hide-on-phone {
      margin-right: 4px;
      color: var(--doctools-muted);
    }
.doctools__readout-of {
    margin-left: 4px;
    color: var(--doctools-muted);
  }
@media only screen and (max-device-width: 640px) {
.doctools--signable {
      bottom: 64px
  }
    }
.doctoolsmobile {
  display: none;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  position: absolute;
  bottom: 0;
  background: var(--gray);
  color: #fff;
  border-top: solid 2px var(--grey-light);
}
@media only screen and (max-device-width: 640px) {
.doctoolsmobile {
    display: flex
}
  }
.doctoolsmobile__button {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    border: none;
    outline: none;
    background: none;
    width: 100%;
    padding: 0;
    height: 62px;
  }
.doctoolsmobile__button + .doctoolsmobile__button {
      border-left: 2px solid var(--grey-light);
    }
.doctoolsmobile__icon {
    font-size: 22px;
  }
.doctoolsmobile__icon:before {
      color: var(--white);
    }
.doctoolsmobile__icon--phone {
      display: none;
    }
@media only screen and (max-device-width: 640px) {
.doctoolsmobile__icon--phone {
        display: block
    }
      }
.view-area {
  box-sizing: border-box;
  width: -moz-fit-content;
  width: fit-content;
  border: solid 1px #0d2136;
  padding: 32px;
  margin: 0 auto;
}
@media only screen and (max-device-width: 640px) {
.view-area {
    padding: 0;
    border: 0
}
  }
.view-area__canvas {
    border: dashed 1px #707070;
    background-color: #f7f7f7;
    box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
  }
.signtools {
  position: fixed;
  right: 0;
  bottom: 0;
  top: calc(60px + var(--banner-height));
  display: flex;
  flex-direction: column;
  color: var(--panel-fg);
  background-color: var(--panel-bg);
  /* A shadow rather than a border, so the panel stays exactly as wide as it was */
  box-shadow: inset 1px 0 0 var(--panel-border);
  width: 320px;
  height: calc(100% - 60px - var(--banner-height));
  transform: translate3d(0, 0, 0);
  -webkit-user-select: none;
  user-select: none;
}
@media screen and (min-width: 1920px) {
.signtools {
    width: 385px
}
  }
@media only screen and (max-device-width: 640px) {
.signtools {
    width: calc(100% - 40px);
    z-index: 4
}
  }
.signtools__close {
    display: none;
  }
@media only screen and (max-device-width: 640px) {
.signtools__close {
      align-items: center;
      justify-content: center;
      position: fixed;
      left: 0;
      bottom: 0;
      display: flex;
      background-color: var(--alto);
      box-shadow: 0 3px 6px 0 rgb(0 0 0 / 16%);
      width: 40px;
      height: calc(100% - 60px - var(--banner-height));
      transform: translate3d(0, 0, 0);
      color: #000;
      font-size: 30px;
      z-index: 4
  }
    }
.signtools__zoom {
    display: flex;
    justify-content: space-between;
  }
.signtools__paginator {
    background-color: var(--gray);
    display: flex;
    flex-direction: row;
    justify-content: center;
    align-items: center;
    padding: 8px 24px;
  }
@media screen and (min-width: 1440px) {
.signtools__paginator {
      padding: 16px 24px
  }
    }
.signtools__paginator-text {
      font-weight: 500;
      line-height: 1.28;
      letter-spacing: 0.9px;
      text-align: center;
      color: #4e4e4e;
      -webkit-user-select: none;
      user-select: none;
      font-size: 16px;
      margin: 0 16px;
    }
@media screen and (min-width: 1920px) {
.signtools__paginator-text {
        font-size: 18px;
        margin: 0 20px
    }
      }
.signtools__icon--small {
      font-size: 14px;
    }
.signtools__icon--nil {
      width: 30px;
    }
.signtools__icon--nil g[fill] {
        fill: currentColor;
        stroke: currentColor;
      }
/* The SVG asks for Helvetica Neue, which Windows lacks, so it fell back to a serif */
.signtools__icon--nil text {
        fill: #fff;
        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
        font-weight: 600;
      }
/* ---- Tools: Sign / Stamp, then the two groups of things to place ---- */
.signtools__functions {
    display: flex;
    flex-direction: column;
    padding: 14px 14px 4px;
    border-bottom: 1px solid var(--panel-border);
  }
.signtools__sings {
    display: flex;
    gap: 8px;
    margin-bottom: 6px;
  }
.signtools__function {
    flex: 1 1;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    height: 44px;
    padding: 0 12px;
    border: none;
    border-radius: 10px;
    background: var(--panel-sign-bg);
    color: var(--panel-sign-fg);
    outline: none;
    cursor: pointer;
    transition: background-color 0.12s ease;
  }
.signtools__function:hover {
      background: var(--panel-sign-hover);
    }
.signtools__function:focus-visible {
      box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.3);
    }
.signtools__function[disabled] {
      opacity: 0.5;
      cursor: not-allowed;
    }
.signtools__signicon {
    font-size: 22px;
    line-height: 1;
  }
.signtools__signicon:before {
      color: currentColor;
    }
.signtools__signicon-subtext {
      font-size: 13.5px;
      font-weight: 600;
      color: inherit;
    }
.signtools__section-label {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 2px 6px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--panel-fg-subtle);
  }
.signtools__count {
    padding: 1px 7px;
    border-radius: 999px;
    background: var(--panel-tile);
    color: var(--panel-fg-muted);
    font-size: 11px;
    letter-spacing: 0;
  }
/* One row per group, however many tools it holds (Name and Position only show when set) */
.signtools__additional {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    gap: 6px;
    padding-bottom: 8px;
  }
.signtools__additional--text {
      --panel-tile-bg: var(--panel-text-tile);
      --panel-tile-fg: var(--panel-text-fg);
      --panel-tile-hover: var(--panel-text-tile-hover);
    }
.signtools__additional--images {
      --panel-tile-bg: var(--panel-image-tile);
      --panel-tile-fg: var(--panel-image-fg);
      --panel-tile-hover: var(--panel-image-tile-hover);
    }
.signtools__additional-item {
      position: relative;
      display: flex;
      align-items: center;
      justify-content: center;
      height: 40px;
      border-radius: 10px;
      background: var(--panel-tile-bg, var(--panel-tile));
      color: var(--panel-tile-fg, var(--panel-fg));
      cursor: pointer;
      transition: background-color 0.12s ease, color 0.12s ease;
    }
.signtools__additional-item i {
        font-size: 22px;
        line-height: 1;
      }
.signtools__additional-item i:before {
        color: currentColor;
      }
.signtools__additional-item:hover {
        background: var(--panel-tile-hover, var(--panel-active));
      }
.signtools__additional-item--vertical {
        transform: rotate(90deg);
        font-size: 20px;
      }
.signtools__icon-text {
    position: absolute;
    top: 3px;
    right: 4px;
    font-size: 11px;
    line-height: 1;
  }
/* ---- What is on the document ---- */
.signtools__signblock {
    flex: 1 1;
    display: flex;
    flex-direction: column;
    min-height: 0;
    padding: 4px 8px 0;
  }
.signtools__text {
    margin: 0;
    padding: 12px 8px 6px;
    -webkit-user-select: none;
    user-select: none;
  }
.signtools__signlist {
    display: flex;
    flex-direction: column;
    gap: 2px;
    overflow-y: auto;
    flex: 1 1;
    padding-bottom: 8px;
  }
.signtools__signitem {
    box-sizing: border-box;
    display: flex;
    align-items: center;
    gap: 10px;
    flex: none;
    min-height: 44px;
    padding: 6px 6px 6px 8px;
    border-radius: 10px;
    font-size: 13.5px;
    cursor: pointer;
  }
.signtools__signitem:hover {
      background-color: var(--panel-hover);
    }
.signtools__signitem--active,
    .signtools__signitem--active:hover {
      background-color: var(--panel-active);
    }
.signtools__signitem--active .signtools__item-title, .signtools__signitem--active:hover .signtools__item-title {
        color: var(--panel-brand);
      }
.signtools__signitem.redact {
      align-items: flex-start;
      padding: 9px 6px 9px 10px;
    }
.signtools__avatar {
    flex: none;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    overflow: hidden;
    background: var(--panel-tile);
  }
.signtools__avatar img {
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
.signtools__item-body {
    flex: 1 1;
    min-width: 0;
  }
.signtools__item-title {
    margin: 0;
    font-size: 13.5px;
    font-weight: 600;
    line-height: 18px;
    color: var(--panel-fg);
  }
.signtools__item-title--hidden {
      display: none;
    }
.signtools__item-title--empty {
      font-weight: 500;
      font-style: italic;
      color: var(--panel-fg-subtle);
    }
.signtools__item-meta {
    display: block;
    font-size: 12px;
    line-height: 16px;
    color: var(--panel-fg-subtle);
  }
.signtools__item-actions {
    flex: none;
    display: flex;
    align-items: center;
    gap: 2px;
  }
.signtools__item-done {
    display: flex;
    margin-right: 4px;
  }
.signtools__item-action {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 8px;
    color: var(--panel-fg-subtle);
    cursor: pointer;
  }
.signtools__item-action svg {
      width: 16px;
      height: 16px;
      fill: none;
      stroke: currentColor;
      stroke-width: 2;
      stroke-linecap: round;
      stroke-linejoin: round;
    }
.signtools__item-action:hover {
      background: var(--panel-bg);
      color: var(--panel-brand);
    }
.signtools__item-action--remove:hover {
      color: var(--panel-danger);
    }
.signtools__empty {
    margin: 4px 8px;
    padding: 14px;
    border: 1px dashed var(--panel-field-border);
    border-radius: 10px;
    font-size: 12.5px;
    line-height: 1.45;
    color: var(--panel-fg-muted);
    text-align: center;
  }
/* ---- Bottom: the selected item, then save ---- */
.signtools__signeditor {
    display: flex;
    flex-direction: column;
    padding: 0 14px 14px;
    border-top: 1px solid var(--panel-border);
    background: var(--panel-footer-bg);
  }
.signtools__selected {
    padding-bottom: 4px;
  }
.signtools__selected-label {
    padding-top: 12px;
  }
.signtools__editor-buttons {
      display: flex;
      align-items: center;
      gap: 6px;
      margin-bottom: 8px;
    }
.signtools__editor-buttons:not(:has(*)) {
        display: none;
      }
.signtools__editor-buttons .ember-basic-dropdown-content-wormhole-origin {
        display: none;
      }
.signtools__editor-buttons .actions-button {
        width: 34px;
        height: 34px;
        margin: 0;
        padding: 0;
        border: 1px solid var(--panel-field-border);
        border-radius: 8px;
        background: var(--panel-bg);
        color: var(--panel-fg);
        font-size: 14px;
        cursor: pointer;
      }
.signtools__editor-buttons .actions-button:hover {
          background: var(--panel-hover);
        }
.signtools__editor-buttons .actions-button--active,
        .signtools__editor-buttons .actions-button--active:hover {
          border-color: var(--panel-brand);
          background: var(--panel-active);
          color: var(--panel-brand);
        }
.signtools__editor-select {
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 4px;
      min-width: 56px;
      height: 34px;
      padding: 0 8px;
      border: 1px solid var(--panel-field-border);
      border-radius: 8px;
      background: var(--panel-bg);
      color: var(--panel-fg);
      font-size: 13.5px;
      font-weight: 600;
      outline: none;
      cursor: pointer;
    }
.signtools__editor-select .ember-power-select-selected-item {
        margin: 0;
      }
.signtools__editor-select .ember-power-select-status-icon {
        position: static;
        margin: 0;
      }
.signtools__field {
    position: relative;
    margin: 0 0 8px;
  }
.signtools__field img {
      width: 100%;
    }
.signtools__field--fill {
      height: 160px;
      border: 1px solid var(--panel-border);
      border-radius: 10px;
      background-color: var(--white);
      background-size: contain;
      background-position: center;
      background-repeat: no-repeat;
    }
.signtools__field--textarea {
      box-sizing: border-box;
      display: block;
      width: 100%;
      margin: 0;
      padding: 10px 12px;
      border: 1px solid var(--panel-field-border);
      border-radius: 10px;
      background: var(--panel-bg);
      color: var(--panel-fg);
      font-size: 13.5px;
      line-height: 1.45;
      resize: vertical;
    }
.signtools__field--textarea:focus {
        border-color: var(--panel-brand);
        box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.18);
        outline: none;
      }
.signtools__field--textarea::placeholder {
        font-size: 13px;
        color: var(--panel-fg-subtle);
      }
.signtools__field--textarea[disabled] {
        pointer-events: auto !important;
        opacity: 0.7;
      }
.signtools__field--range {
      width: 100%;
      margin: 0;
      accent-color: var(--panel-brand);
    }
.signtools__range {
    display: block;
    margin: 0 0 8px;
  }
.signtools__range-label {
      display: flex;
      justify-content: space-between;
      margin-bottom: 4px;
      font-size: 12.5px;
      font-weight: 600;
      color: var(--panel-fg-muted);
    }
.signtools__keep-sharing {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 12px 0 0;
    font-size: 13.5px;
    cursor: pointer;
    -webkit-user-select: none;
    user-select: none;
  }
.signtools__keep-sharing p {
      margin: 0;
    }
.signtools__keep-sharing--language {
      margin: 15px 24px;
      position: relative;
    }
/* In the Finalise modal's footer (modal/changed-blocks) it sits beside the button in a row centred by
       `.modal__footer`; the side panel's top margin pushed it 6px below the button's centre line there */
.signtools__keep-sharing--in-footer {
      margin: 0;
    }
.signtools__submit {
    padding-top: 14px;
  }
.signtools__submit .button {
      width: 100%;
      height: 42px;
      border-radius: 10px;
      font-size: 14px;
      font-weight: 600;
    }
/* ---- Redact: the same panel, with a search and two lists ---- */
.signtools--redact .signtools__function {
    flex: none;
    margin-bottom: 4px;
  }
.signtools__function-svg {
    width: 20px;
    height: 20px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
  }
.signtools__search {
    position: relative;
    display: block;
    margin: 0 0 12px;
  }
.signtools__search-icon {
    position: absolute;
    top: 50%;
    left: 12px;
    width: 16px;
    height: 16px;
    transform: translateY(-50%);
    fill: none;
    stroke: var(--panel-fg-subtle);
    stroke-width: 2;
    stroke-linecap: round;
    pointer-events: none;
  }
.signtools__search-input {
    box-sizing: border-box;
    display: block;
    width: 100%;
    height: 40px;
    padding: 0 12px 0 36px;
    border: 1px solid var(--panel-field-border);
    border-radius: 10px;
    background: var(--panel-bg);
    color: var(--panel-fg);
    font-size: 13.5px;
  }
.signtools__search-input::placeholder {
      color: var(--panel-fg-subtle);
    }
.signtools__search-input:focus {
      border-color: var(--panel-brand);
      box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.18);
      outline: none;
    }
.signtools__section-label--divided {
    margin-top: 8px;
    padding-top: 14px;
    border-top: 1px solid var(--panel-border);
  }
/* What a row will become: a highlighter mark for a match, a black bar for a redaction */
.signtools__swatch {
    flex: none;
    align-self: flex-start;
    width: 14px;
    height: 14px;
    margin-top: 2px;
    border-radius: 3px;
    background: #111;
    /* Keeps the black bar visible on the dark theme's panel */
    box-shadow: inset 0 0 0 1px var(--panel-field-border);
  }
.signtools__swatch--match {
      background: #ffe066;
      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
    }
.signtools__redact-text {
    flex: 1 1;
    min-width: 0;
    font-size: 13px;
    line-height: 18px;
    color: var(--panel-fg);
    overflow-wrap: anywhere;
  }
.signtools__redact-text b {
      font-weight: 700;
      background: rgba(255, 224, 102, 0.55);
      border-radius: 2px;
    }
.signtools__redact-page {
    margin-right: 4px;
    color: var(--panel-fg-subtle);
    font-size: 12px;
    font-weight: 600;
  }
.signtools__redact-all {
    padding: 4px 0 8px;
  }
.signtools__secondary {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 38px;
    border: 1px solid var(--panel-field-border);
    border-radius: 10px;
    background: var(--panel-bg);
    color: var(--panel-fg);
    font-size: 13.5px;
    font-weight: 600;
    cursor: pointer;
  }
.signtools__secondary:hover {
      background: var(--panel-hover);
    }
.body-container {
  margin: 0;
  padding: 20px;
  font-family: Arial, sans-serif;
  background-color: #36004b;
  color: #333;
  display: flex;
  flex-direction: column;
  align-items: center;
  min-height: 100vh;
}
.body-container *  {
    box-sizing: border-box;
  }
.ibac-logo {
  align-self: flex-start;
  margin-bottom: 20px;
}
.ibac-logo img {
  height: 40px;
  width: auto;
}
.ibac-container {
  background-color: white;
  max-width: 500px;
  width: 100%;
  padding: 24px;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.ibac-title {
  color: #7e3f98;
  font-size: 1.4em;
  margin-bottom: 12px;
}
.ibac-text {
  font-size: 14px;
  margin: 10px 0;
}
.ibac-upload-area {
  border: 2px dashed #ccc;
  padding: 24px;
  text-align: center;
  border-radius: 6px;
  margin-top: 12px;
  margin-bottom: 8px;
  transition: all 0.2s ease-in-out;
  cursor: pointer;
}
.ibac-upload-area:hover {
  border-color: #7e3f98;
  background-color: #f8f6f9;
}
.ibac-upload-area--over {
  border-color: #7e3f98;
  background-color: #f0e6f5;
  border-style: solid;
  box-shadow: 0 0 10px rgba(126, 63, 152, 0.2);
}
.ibac-upload-label {
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  font-size: 10px;
}
.ibac-upload-input {
  display: none;
}
.ibac-upload-note {
  font-size: 12px;
  color: #666;
  margin-top: 8px;
}
.ibac-textarea {
  width: 100%;
  padding: 10px;
  border-radius: 4px;
  border: 1px solid #ccc;
  margin-top: 8px;
  resize: none;
  font-family: inherit;
  font-size: 14px;
}
.ibac-submit-button {
  margin-top: 16px;
  width: 100%;
  padding: 12px;
  background-color: #444;
  color: white;
  font-weight: bold;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
.ibac-submit-button:hover {
  background-color: #333;
}
.ibac-note {
  font-size: 12px;
  color: #555;
  margin-top: 14px;
}
.ibac-important-title {
  font-weight: bold;
  color: #7e3f98;
  margin-top: 16px;
  margin-bottom: 5px;
}
.ibac-important {
  font-size: 12px;
  color: #555;
}
.ibac-privacy-link {
  color: #7e3f98;
  font-weight: bold;
  text-decoration: none;
  font-size: 13px;
}
.ibac-privacy-link:hover,
.ibac-privacy-link:focus {
  text-decoration: underline;
  color: #5c2a74;
}
.ibac-tooltip-wrapper {
  position: relative;
  display: inline-block;
  margin: 0 4px;
}
.ibac-tooltip-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background-color: #7e3f98;
  color: white;
  font-weight: bold;
  font-size: 13px;
  border-radius: 50%;
  width: 18px;
  height: 18px;
  line-height: 1;
  cursor: default;
  text-align: center;
  -webkit-user-select: none;
  user-select: none;
}
.ibac-tooltip-text {
  visibility: hidden;
  opacity: 0;
  position: absolute;
  bottom: 130%;
  left: 50%;
  transform: translateX(-50%);
  background-color: #333;
  color: #fff;
  padding: 8px 10px;
  border-radius: 4px;
  font-size: 12px;
  white-space: normal;
  width: max-content;
  max-width: 280px;
  text-align: left;
  z-index: 10;
  transition: opacity 0.2s ease-in-out;
}
.ibac-tooltip-wrapper:hover .ibac-tooltip-text,
.ibac-tooltip-wrapper:focus-within .ibac-tooltip-text {
  visibility: visible;
  opacity: 1;
}
@media (max-width: 600px) {
  .body-container {
    padding: 12px;
  }

  .ibac-logo {
    align-self: center;
    margin-bottom: 16px;
  }

  .ibac-container {
    padding: 16px;
  }

  .ibac-title {
    font-size: 1.2em;
  }
}
/* The folder list beside a document. Also carries `.signtools`, which supplies the fixed position,
   height and width it shares with the signing panel on the right. */
.document-list {
  left: 0;
  right: auto;
  overflow: auto;
  /* No horizontal padding or extra border: `.signtools` sizes this as a content box, so either
     would widen the panel. The gutters are margins on the rows instead. */
  padding-bottom: 12px;
  border-left: none;
  border-right: 1px solid var(--panel-border);
  box-shadow: none;
  color: var(--panel-fg);
}
.document-list__header {
    position: sticky;
    top: 0;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin: 0 0 6px;
    padding: 14px 12px 12px 18px;
    background: var(--panel-bg);
    border-bottom: 1px solid var(--panel-border);
  }
.document-list__heading {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
  }
.document-list__heading-icon {
    flex: none;
    width: 20px;
    height: 20px;
  }
.document-list__heading-title {
    font-size: 14px;
    font-weight: 600;
  }
.document-list__close {
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border-radius: 8px;
    color: var(--panel-fg-muted);
    cursor: pointer;
  }
.document-list__close svg {
      width: 18px;
      height: 18px;
      fill: none;
      stroke: currentColor;
      stroke-width: 2;
      stroke-linecap: round;
      stroke-linejoin: round;
    }
.document-list__close:hover {
      background: var(--panel-hover);
      color: var(--panel-brand);
    }
.document-list__content {
    display: flex;
    flex-direction: column;
    gap: 2px;
  }
.document-list__item {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    margin: 0 8px;
    padding: 9px 10px;
    border-radius: 10px;
    cursor: pointer;
  }
.document-list__item:hover {
      background: var(--panel-hover);
    }
.document-list__item--current,
    .document-list__item--current:hover {
      background: var(--panel-active);
    }
.document-list__item--current .document-list__name, .document-list__item--current:hover .document-list__name {
        color: var(--panel-brand);
      }
.document-list__item--up {
      align-items: center;
      margin-bottom: 2px;
      color: var(--panel-fg-muted);
    }
.document-list__icon {
    flex: none;
    width: 20px;
    height: 20px;
    margin-top: 1px;
  }
.document-list__up-icon {
    flex: none;
    width: 18px;
    height: 18px;
    margin: 0 1px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
.document-list__body {
    flex: 1 1;
    min-width: 0;
  }
.document-list__name {
    font-size: 13.5px;
    line-height: 22px;
  }
.document-list__name--unread {
      font-weight: 600;
    }
.document-list__tags {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    margin-top: 4px;
  }
.document-list__tags:not(:has(*)) {
      display: none;
    }
.document-list__tags .file-status {
      margin: 0;
    }
.document-list--empty {
    color: var(--panel-fg-muted);
    text-align: center;
    padding: 20px;
  }
/* Signature from an image (signature-image-processor), and the signature/stamp editor around it.
   Palette and controls follow the settings shell (`_blocks/sysadmin`): navy #1c205c, brand #2f6fed,
   grey #5b6678, borders #e3e8f0 / #cdd5e2. */
.sigproc {
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: 100%;
  margin-bottom: 14px;
  color: #1c205c;
  font-size: 13.5px;
  text-align: left;
}
/* ---- Drop zone ---- */
.sigproc__drop {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    padding: 22px 18px;
    border: 2px dashed #cdd5e2;
    border-radius: 12px;
    background: #f8fafd;
    text-align: center;
    cursor: pointer;
    transition: border-color 0.15s ease, background-color 0.15s ease;
  }
.sigproc__drop:hover,
    .sigproc__drop:focus-visible {
      border-color: #2f6fed;
      background: #f3f7ff;
      outline: none;
    }
.sigproc__drop--over {
      border-color: #2f6fed;
      background: #eef3fe;
    }
.sigproc__drop--disabled {
      opacity: 0.6;
      pointer-events: none;
    }
.sigproc__drop-icon {
    width: 28px;
    height: 28px;
    margin-bottom: 2px;
    fill: none;
    stroke: #2f6fed;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
.sigproc__drop-title {
    margin: 0;
    font-weight: 600;
  }
.sigproc__drop-sub {
    margin: 0;
    font-size: 12.5px;
    color: #5b6678;
  }
.sigproc__link {
    padding: 0;
    border: none;
    background: none;
    color: #2f6fed;
    font: inherit;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
  }
.sigproc__link:hover {
      text-decoration: underline;
    }
.sigproc__link:disabled {
      opacity: 0.5;
      cursor: default;
    }
/* ---- Help ---- */
.sigproc__howto {
    font-size: 12.5px;
    color: #5b6678;
  }
.sigproc__howto summary {
      cursor: pointer;
      color: #3a4763;
      font-weight: 600;
    }
.sigproc__howto ul {
      margin: 8px 0;
      padding-left: 18px;
    }
.sigproc__howto li {
      margin: 4px 0;
    }
.sigproc__privacy {
    display: flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    font-size: 12px;
    color: #8a93a6;
  }
.sigproc__privacy svg {
      flex: none;
      width: 14px;
      height: 14px;
      fill: none;
      stroke: currentColor;
      stroke-width: 2;
      stroke-linecap: round;
    }
/* ---- Loaded file ---- */
.sigproc__file {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
  }
.sigproc__file-icon {
    flex: none;
    width: 18px;
    height: 18px;
    fill: none;
    stroke: #5b6678;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
.sigproc__file-name {
    min-width: 0;
    font-weight: 600;
  }
.sigproc__file-size {
    flex: none;
    color: #8a93a6;
    font-size: 12.5px;
  }
.sigproc__file .sigproc__link {
    flex: none;
    margin-left: auto;
  }
/* ---- Preview ---- */
.sigproc__stage {
    position: relative;
    border: 1px solid #e3e8f0;
    border-radius: 12px;
    overflow: hidden;
    /* The checkerboard shows what is transparent */
    background: repeating-conic-gradient(#eef1f6 0% 25%, #fff 0% 50%) 50% / 16px 16px;
  }
.sigproc__preview {
    display: block;
    width: 100%;
    height: auto;
  }
.sigproc__view {
    position: absolute;
    top: 8px;
    right: 8px;
    display: flex;
    padding: 2px;
    border-radius: 8px;
    background: rgba(255, 255, 255, 0.92);
    box-shadow: 0 1px 3px rgba(8, 12, 35, 0.12);
  }
.sigproc__view-btn {
    padding: 4px 10px;
    border: none;
    border-radius: 6px;
    background: none;
    color: #5b6678;
    font-size: 12px;
    font-weight: 600;
    cursor: pointer;
  }
.sigproc__view-btn--active {
      background: #1c205c;
      color: #fff;
    }
.sigproc__empty {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 80%;
    margin: 0;
    transform: translate(-50%, -50%);
    text-align: center;
    color: #5b6678;
    font-size: 13px;
  }
/* ---- Controls ---- */
.sigproc__controls {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 14px;
    border: 1px solid #e3e8f0;
    border-radius: 12px;
    background: #fff;
  }
.sigproc__control-label {
    font-weight: 600;
    color: #1c205c;
  }
.sigproc__hint {
    display: block;
    margin-top: 4px;
    font-size: 12px;
    line-height: 1.4;
    color: #8a93a6;
  }
.sigproc__hint--inline {
      flex-basis: 100%;
      margin: 0 0 0 44px;
    }
.sigproc__switch {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 2px 10px;
    margin: 0;
    cursor: pointer;
  }
.sigproc__switch input {
      position: absolute;
      opacity: 0;
      pointer-events: none;
    }
.sigproc__switch--off {
      opacity: 0.5;
      cursor: default;
    }
.sigproc__switch-track {
    position: relative;
    flex: none;
    width: 34px;
    height: 20px;
    border-radius: 999px;
    background: #cdd5e2;
    transition: background-color 0.15s ease;
  }
.sigproc__switch-track::after {
      content: '';
      position: absolute;
      top: 2px;
      left: 2px;
      width: 16px;
      height: 16px;
      border-radius: 50%;
      background: #fff;
      box-shadow: 0 1px 2px rgba(8, 12, 35, 0.2);
      transition: transform 0.15s ease;
    }
.sigproc__switch input:checked + .sigproc__switch-track {
    background: #2f6fed;
  }
.sigproc__switch input:checked + .sigproc__switch-track::after {
      transform: translateX(14px);
    }
.sigproc__switch input:focus-visible + .sigproc__switch-track {
    box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.25);
  }
.sigproc__note {
    margin: 0;
    padding: 8px 10px;
    border-radius: 8px;
    background: #eef3fe;
    color: #1c205c;
    font-size: 12.5px;
  }
.sigproc__slider {
    padding-left: 44px;
  }
.sigproc__slider input[type="range"] {
      display: block;
      width: 100%;
      margin: 6px 0 0;
      accent-color: #2f6fed;
    }
.sigproc__slider--off {
      opacity: 0.45;
    }
.sigproc__ticks {
    display: flex;
    justify-content: space-between;
    /* Half a thumb in from each end, so the numbers sit under the stops */
    padding: 0 4px;
    margin-top: 2px;
    font-size: 11px;
    color: #8a93a6;
    font-variant-numeric: tabular-nums;
  }
.sigproc__slider-head {
    display: flex;
    justify-content: space-between;
  }
.sigproc__slider-value {
    min-width: 32px;
    white-space: nowrap;
    padding: 1px 8px;
    border-radius: 999px;
    background: #f0f3f9;
    color: #3a4763;
    font-size: 12px;
    font-weight: 600;
    text-align: center;
    font-variant-numeric: tabular-nums;
  }
.sigproc__row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
  }
.sigproc__segmented {
    display: flex;
    padding: 2px;
    border-radius: 9px;
    background: #f0f3f9;
  }
.sigproc__segment {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 5px 11px;
    border: none;
    border-radius: 7px;
    background: none;
    color: #5b6678;
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
  }
.sigproc__segment--active {
      background: #fff;
      color: #1c205c;
      box-shadow: 0 1px 2px rgba(8, 12, 35, 0.12);
    }
.sigproc__swatch {
    width: 10px;
    height: 10px;
    border-radius: 50%;
  }
.sigproc__swatch--black {
      background: #111;
    }
.sigproc__swatch--blue {
      background: #153ba0;
    }
/* ---- Actions ---- */
.sigproc__actions {
    display: flex;
    align-items: center;
    gap: 8px;
  }
.sigproc__actions .sysadmin__btn {
      padding: 9px 14px;
    }
.sigproc__actions-spacer {
    flex: 1 1;
  }
/* ---- The editor round it: tabs, pad, buttons ---- */
.field-signature__signature .signature__tabs, .field-signature__stamp .signature__tabs {
    justify-content: center;
    gap: 0;
    width: -moz-fit-content;
    width: fit-content;
    margin: 0 auto 14px;
    padding: 3px;
    border-radius: 10px;
    background: #f0f3f9;
  }
.field-signature__signature .signature__tab, .field-signature__stamp .signature__tab {
    min-width: 96px;
    padding: 7px 14px;
    border: none;
    border-radius: 8px;
    background: none;
    color: #5b6678;
    font-size: 13px;
    font-weight: 600;
    box-shadow: none;
  }
.field-signature__signature .signature__tab:hover, .field-signature__stamp .signature__tab:hover {
      color: #1c205c;
    }
.field-signature__signature .signature__tab--active,
  .field-signature__signature .signature__tab--active:hover,
  .field-signature__stamp .signature__tab--active,
  .field-signature__stamp .signature__tab--active:hover {
    background: #fff;
    color: #1c205c;
    box-shadow: 0 1px 3px rgba(8, 12, 35, 0.12);
  }
.field-signature__signature .field-signature__canvas, .field-signature__stamp .field-signature__canvas {
    border: 1px solid #cdd5e2;
    border-radius: 12px;
  }
.field-signature__signature .field-signature__canvas--hidden, .field-signature__stamp .field-signature__canvas--hidden {
      display: none;
    }
.field-signature__signature .signature__buttons, .field-signature__stamp .signature__buttons {
    justify-content: center;
    height: auto;
    gap: 10px;
    margin: 12px auto 4px;
  }
.field-signature__signature .signature__button, .field-signature__stamp .signature__button {
    padding: 7px 14px;
    border: 1px solid #cdd5e2;
    border-radius: 8px;
    background: #fff;
    color: #3a4763;
    font-size: 13px;
    font-weight: 600;
  }
.field-signature__signature .signature__button:hover, .field-signature__stamp .signature__button:hover {
      background: #f6f8fc;
      box-shadow: none;
    }
.field-signature__signature .signature__input, .field-signature__stamp .signature__input {
    min-width: 260px;
    padding: 9px 12px;
    border: 1px solid #cdd5e2;
    border-radius: 9px;
    font-size: 13.5px;
  }
.field-signature__signature .signature__input:focus, .field-signature__stamp .signature__input:focus {
      border-color: #2f6fed;
      box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.18);
    }
.field-signature__signature .placement__divider, .field-signature__stamp .placement__divider {
    height: 0;
    margin: 12px 0 16px;
    border-bottom-color: #e3e8f0;
  }
.field-signature__signature .signature__save, .field-signature__stamp .signature__save {
    padding: 10px 28px;
    border: 1px solid #2f6fed;
    border-radius: 9px;
    background: #2f6fed;
    color: #fff;
    font-size: 13.5px;
    font-weight: 600;
  }
.field-signature__signature .signature__save:hover, .field-signature__stamp .signature__save:hover {
      background: #2559c9;
      box-shadow: none;
    }
.field-signature__signature .signature__save:disabled, .field-signature__stamp .signature__save:disabled {
      opacity: 0.6;
    }
/* Wide enough for the preset row and the address + Copy row to sit on one line each. */
.public-link__dialog {
  width: 620px;
  max-width: 100%;
}
/* Guest-access modal. Left-aligned labelled sections rather than a column of centred prose: the
   owner scans for the link, the expiry and the switches, so each gets its own labelled block.

   No horizontal padding anywhere in here: the gutter belongs to `.modal__content`, which is where
   every dialog gets it. This file used to say "the .modal shell already gives 55px" — the shell has
   no padding at all now, and a rule written against a shell that has changed is how this dialog kept
   ending up the exception. */
.public-link__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 0 0 12px;
}
.public-link__folder {
  overflow: hidden;
  font-weight: 600;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--colour-fg-default);
}
/* State in one line: dot + word + what is behind it + when it lapses. Replaces the status pill,
   which conflated the link's state with this browser's ability to display it. */
.public-link__stateline {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  padding: 0 0 12px;
  font-size: 13px;
  color: var(--colour-fg-muted);
}
.public-link__dot {
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--colour-fg-subtle);
}
.public-link__dot--live {
  background: var(--colour-fg-success);
}
.public-link__dot--expired {
  background: var(--colour-fg-danger);
}
.public-link__sep {
  color: var(--colour-border-default);
}
/* Duration presets. These four cover the whole legal range, so the common path cannot reach an
   invalid lifetime at all. */
.public-link__chips {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
}
.public-link__chip {
  padding: 5px 12px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--r-grey);
  background: #fff;
  border: 1px solid var(--r-ctl);
  border-radius: var(--r-r-pill);
  cursor: pointer;
}
.public-link__chip--on {
  color: var(--r-brand);
  background: var(--r-tint);
  border-color: var(--r-brand);
}
.public-link__chip--custom {
  color: var(--r-muted);
  border-style: dashed;
}
/* The address: host and path legible, secret masked, Copy as the primary action beside it. */
.public-link__linkrow {
  display: flex;
  align-items: stretch;
  gap: 8px;
}
.public-link__linkbox {
  flex: 1 1 auto;
  min-width: 0;
  padding: 6px 10px;
  overflow: hidden;
  font-size: 12.5px;
  white-space: nowrap;
  border: 1px solid var(--r-ctl);
  border-radius: var(--r-r-ctl);
  background: var(--r-hover);
}
.public-link__linkbox--empty {
  color: var(--colour-fg-muted);
}
.public-link__url-host {
  font-weight: 600;
}
.public-link__url-secret {
  color: var(--colour-fg-subtle);
  letter-spacing: 0.5px;
}
.public-link__caution {
  display: flex;
  gap: 8px;
  align-items: flex-start;
  margin-top: 9px;
  padding: 8px 11px;
  font-size: 12px;
  color: var(--colour-fg-attention, #7a5a12);
  background: var(--colour-label-attention-bg, #fff8e8);
  border: 1px solid var(--colour-label-attention-bg, #f0dfb4);
  border-radius: var(--r-r-ctl);
}
.public-link__disclosure {
  color: var(--colour-brand);
  font-weight: 600;
  cursor: pointer;
}
.public-link__ghost-button {
  padding: 0;
  font: inherit;
  font-weight: 600;
  color: var(--colour-brand);
  background: none;
  border: 0;
  cursor: pointer;
}
/* The body spaces its own children — see `.modal__content > * + *`. This used
   to add 12px on top of that, so guest access was the one dialog whose sections
   sat further apart than every other dialog's. */
.public-link__section {
  padding: 0;
}
.public-link__label {
  margin-bottom: 6px;
  font-size: 11.5px;
  font-weight: 600;
  color: var(--r-grey);
}
.public-link__row {
  display: flex;
  align-items: center;
  gap: 8px;
}
.public-link__hint {
  margin-top: 4px;
  font-size: 12px;
  color: var(--colour-fg-muted);
}
.public-link__hint--error {
  color: var(--colour-fg-danger);
}
.public-link__notice {
  margin: 12px 0 0;
  padding: 10px 12px;
  font-size: 13px;
  line-height: 1.45;
  border-radius: var(--r-r-ctl);
  color: var(--colour-fg-default);
  background: rgba(127, 127, 127, 0.12);
}
.public-link__notice--error {
  text-align: center;
}
/* Warning for a recoverable problem; danger only for an expired link, which is the single genuine
   fault this dialog can show. */
.public-link__notice--warn {
  color: var(--colour-fg-attention, #7a5a12);
  background: var(--colour-label-attention-bg, #fff8e8);
}
.public-link__notice--danger {
  color: var(--colour-label-danger-fg);
  background: var(--colour-label-danger-bg);
}
.public-link__actions-right {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
.public-link__busy {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 24px;
}
.public-link__busy-text {
  font-size: 13px;
  color: var(--colour-fg-muted);
}
.public-link__duration-input {
  box-sizing: border-box;
  height: 40px;
  padding: 0 12px;
  font-size: 14px;
  color: var(--colour-black);
  background-color: #fff;
  border: 1px solid var(--colour-brand);
  border-radius: 4px;
  outline: none;
}
.public-link__duration-input:focus {
  border-color: var(--colour-brand-dark);
}
input.public-link__duration-input {
  width: 64px;
  text-align: center;
  /* hide number spinners for a cleaner field */
  -moz-appearance: textfield;
}
input.public-link__duration-input::-webkit-outer-spin-button,
input.public-link__duration-input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.public-link__duration-unit {
  width: 110px;
  cursor: pointer;
  /* room for the native dropdown arrow */
  padding-right: 8px;
}
.public-link__email-input {
  box-sizing: border-box;
  width: 100%;
  height: 40px;
  padding: 0 12px;
  font-size: 14px;
  color: var(--colour-black);
  background-color: #fff;
  border: 1px solid var(--colour-brand);
  border-radius: 4px;
  outline: none;
}
.public-link__email-input:focus {
  border-color: var(--colour-brand-dark);
}
.public-link-docs__content {
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
  /* More room above so the panel reads as placed rather than stuck to the header. */
  padding: 48px 16px 64px;
}
/* Orientation block: what this page is, and when it stops working. */
.public-link-docs__intro {
  margin-bottom: 14px;
}
.public-link-docs__title {
  margin: 0 0 2px;
  font-size: 19px;
  font-weight: 600;
}
.public-link-docs__subtitle {
  margin: 0;
  font-size: 13px;
  color: rgba(255, 255, 255, 0.82);
}
/* Whole panel is the drop target, so say so while a drag is over it. */
.public-link-docs__panel--dragging {
  border-color: rgba(255, 255, 255, 0.6);
  background: rgba(255, 255, 255, 0.12);
}
/* Text that behaves as a link but must be a real button for keyboard users. */
.public-link-docs__link-button {
  padding: 0;
  font: inherit;
  color: inherit;
  text-align: left;
  background: none;
  border: 0;
  cursor: pointer;
}
.public-link-docs__link-button:hover .public-link-docs__name,
.public-link-docs__link-button:focus-visible .public-link-docs__name {
  text-decoration: underline;
}
.public-link-docs__name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 46ch;
}
/* Per-row actions (View + Download), so nothing has to be selected to act on one file. */
.public-link-docs__row-actions-col {
  width: 76px;
  white-space: nowrap;
  text-align: right;
}
.public-link-docs__row-action {
  padding: 4px;
  color: rgba(255, 255, 255, 0.8);
  background: none;
  border: 0;
  border-radius: 4px;
  cursor: pointer;
}
/* These icons ship with fill="#373737" baked into the <svg>, which is invisible on this page's dark
   panel — the paths inherit it, so re-pointing the root fill at currentColor is enough, and it then
   follows the hover/disabled states below. */
.public-link-docs__row-action svg {
  display: block;
  fill: currentColor;
}
.public-link-docs__row-action:hover,
.public-link-docs__row-action:focus-visible {
  color: #fff;
  background: rgba(255, 255, 255, 0.12);
}
/* Held in place rather than removed, so the actions column keeps one shape down the list. */
.public-link-docs__row-action--disabled,
.public-link-docs__row-action:disabled {
  opacity: 0.35;
  cursor: default;
}
.public-link-docs__row-action:disabled:hover {
  color: rgba(255, 255, 255, 0.7);
  background: none;
}
/* Empty upload-enabled folder: an invitation, not a statement. */
.public-link-docs__dropzone {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  width: 100%;
  padding: 28px 16px;
  color: inherit;
  background: none;
  border: 1px dashed rgba(255, 255, 255, 0.35);
  border-radius: 8px;
  cursor: pointer;
}
.public-link-docs__dropzone:hover,
.public-link-docs__dropzone:focus-visible {
  border-color: rgba(255, 255, 255, 0.6);
  background: rgba(255, 255, 255, 0.06);
}
/* The per-row meta line replaces the Size/Date columns on narrow screens — guests very often open
   these links on a phone, where four columns cannot fit. */
.public-link-docs__meta {
  display: none;
  font-size: 12px;
}
@media (max-width: 640px) {
  .public-link-docs__content {
    padding: 24px 8px 48px;
  }

  .public-link-docs__panel {
    padding: 16px 12px;
  }

  .public-link-docs__meta-col {
    display: none;
  }

  .public-link-docs__meta {
    display: block;
  }

  .public-link-docs__name {
    max-width: 24ch;
  }

  .public-link-docs__toolbar {
    flex-wrap: wrap;
    gap: 8px;
  }

  .public-link-docs__toolbar-right {
    margin-left: 0;
  }
}
.public-link-docs .header__logo {
  cursor: pointer;
}
/* The page forces the brand-dark background (like the submission page), so
   the panel and table use translucent light strokes; the toolbar buttons
   keep their themed surface and need the themed text colour back (the page
   sets hero-white on everything). */
.public-link-docs .button-file {
  color: var(--body-color);
}
/* Nearly opaque on purpose. At 5% white the page's background graphic ran straight through the
   table, so rows sat on a moving, unpredictable backdrop — the single worst thing for legibility
   here. A dark wash keeps every row on the same surface. */
.public-link-docs__panel {
  padding: 16px 20px;
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: 12px;
  background: rgba(6, 16, 46, 0.82);
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
}
.public-link-docs__toolbar {
  display: flex;
  align-items: center;
  gap: 6px;
  padding-bottom: 12px;
  margin-bottom: 12px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
/* Slimmer toolbar buttons: the stock ones are sized for the owner's file bar, where they are the
   whole interface. Here they sit above a short list and were shouting over it. */
.public-link-docs__toolbar .button-file {
  padding: 4px 8px;
}
.public-link-docs__toolbar .button-file__dscr {
  font-size: 12px;
}
.public-link-docs__toolbar .button-file svg {
  width: 18px;
  height: 16px;
}
.public-link-docs__toolbar-right {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
/* In-flight upload/download line above the listing. The page forces the brand-dark background, so
   the track is a translucent light stroke like the panel and table borders. */
.public-link-docs__progress-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 6px;
  font-size: 13px;
}
.public-link-docs__progress .progress {
  background: rgba(255, 255, 255, 0.16);
  border-radius: 2px;
  overflow: hidden;
}
/* Inline "new folder" row — sits between the toolbar and the listing, where the folder will appear. */
.public-link-docs__new-folder {
  display: flex;
  align-items: center;
  gap: 8px;
}
.public-link-docs__new-folder-input {
  box-sizing: border-box;
  flex: 1 1;
  max-width: 320px;
  height: 36px;
  padding: 0 12px;
  font-size: 14px;
  color: var(--colour-black);
  background-color: #fff;
  border: 1px solid var(--colour-brand);
  border-radius: 4px;
  outline: none;
}
.public-link-docs__crumb {
  cursor: pointer;
}
.public-link-docs__crumb:hover {
  text-decoration: underline;
}
/* Was 0.65 — too faint once the panel darkened, and sizes/dates are the details people squint at. */
.public-link-docs__crumb-sep,
.public-link-docs__muted {
  color: rgba(255, 255, 255, 0.78);
}
.public-link-docs__table {
  width: 100%;
  border-collapse: collapse;
}
.public-link-docs__table th {
  padding: 6px 10px;
  text-align: left;
  font-size: 11px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: rgba(255, 255, 255, 0.55);
  border-bottom: 1px solid rgba(255, 255, 255, 0.18);
}
/* Slimmer rows, but a slightly stronger divider than before: less height, more definition. */
.public-link-docs__table td {
  padding: 7px 10px;
  font-size: 14px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.09);
}
/* Fixed widths for the secondary columns so the name gets the space instead of a wide empty gap. */
.public-link-docs__meta-col {
  width: 112px;
}
.public-link-docs__table tbody tr:last-child td {
  border-bottom: none;
}
.public-link-docs__table tbody tr:hover td {
  background: rgba(255, 255, 255, 0.05);
}
.public-link-docs__check-col {
  width: 18px;
  text-align: center;
}
.public-link-docs__table td.public-link-docs__check-col,
.public-link-docs__table th.public-link-docs__check-col {
  padding-right: 6px;
}
.public-link-docs__table td.public-link-docs__check-col + td,
.public-link-docs__table th.public-link-docs__check-col + th {
  padding-left: 6px;
}
.public-link-docs__empty {
  padding: 24px 12px;
}
.public-link-preview {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1000;
  display: flex;
  flex-direction: column;
  padding: 16px;
  background: var(--body-bg);
  color: var(--body-color);
}
.public-link-preview__bar {
  margin-bottom: 12px;
}
.public-link-preview__body {
  flex: 1 1;
  width: 100%;
  min-height: 0;
  overflow: auto;
  border: 0;
}
/* Antivirus state on a row. Shown, not hidden: the file is there and will become readable, so a
   disabled Open/Download without a reason would read as breakage. Lives INSIDE the name's flex row, so
   no margin is needed — the row's own gap spaces it. */
.public-link-docs__av-label {
  flex: 0 0 auto;
  padding: 1px 6px;
  border-radius: 3px;
  border: 1px solid rgba(255, 255, 255, 0.28);
  font-size: 11px;
  white-space: nowrap;
}
/* --colour-danger does not exist in the design system — only the -0/-4/-8 steps do — so naming it left
   both declarations invalid and the one label that is a security verdict looked like the two that are
   merely progress. */
.public-link-docs__av-label--infected {
  border-color: var(--colour-danger-4);
  color: var(--colour-danger-4);
}
/* The renewal button lives inside easysharing-docs__error — a plain block that centres its text.
   Button renders a <div>, so on its own it stretches edge to edge and reads as a banner rather than
   something to press; inline-block lets the surrounding centring apply to it too. */
.public-link-docs__renew {
  display: inline-block;
  margin-top: 12px;
}
/**
 * Dekko forms — the form screen, its page canvas, field boxes and the responses table.
 *
 * Colours come from the existing theme variables so light and dark both work; where a form needs a
 * colour the theme has no name for (the field-box tint, the verified/failed badges) it is defined
 * once here and reused, rather than sprinkled through the rules.
 */
.dform {
  --dform-accent: #3b5ba5;
  --dform-accent-soft: rgba(59, 91, 165, .12);
  --dform-good: #2f6b4f;
  --dform-bad: #a6321e;
  --dform-line: rgba(128, 128, 128, .28);

  display: flex;
  flex-direction: column;
  /**
   * This screen renders into `authenticated/cloud`, past the vault container that normally holds
   * the app chrome clear — the same thing the file viewer and redact do. So it has to make its own
   * room for the fixed top header, exactly as `.doccontainer` does.
   *
   * 60px rather than `.doccontainer`'s 92px because that value also allows for the
   * `cloud-file-back` partial, which this screen does not render — its own `.dform__bar` is the
   * sub-header. The nav is handled the other way round, by adding this route to the list in
   * `nav-sidebar` that hides it.
   */
  padding-top: calc(60px + var(--banner-height));
  box-sizing: border-box;
  height: 100vh;
  min-height: 0;
  overflow: hidden;
}
/* The tenancy's banner pushes the header down on a phone as well, and the bar has to start below both. */
@media only screen and (max-device-width: 640px) {
.dform {
    padding-top: calc(52px + var(--banner-height))
}
  }
/* ── top bar ─────────────────────────────────────────────────────────── */
.dform__bar {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--dform-line);
  flex: 0 0 auto;
}
.dform__bar-left,
.dform__bar-right {
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
}
.dform__bar-middle {
  flex: 1 1 auto;
  display: flex;
  justify-content: center;
  min-width: 0;
}
.dform__back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: none;
  border: 0;
  cursor: pointer;
  padding: 4px 6px;
  font: inherit;
  color: inherit;
}
.dform__back:hover { opacity: .7; }
.dform__title {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-weight: 600;
  max-width: 32ch;
}
.dform__tabs {
  display: inline-flex;
  border: 1px solid var(--dform-line);
  border-radius: 4px;
  overflow: hidden;
}
.dform__tab {
  background: none;
  border: 0;
  border-right: 1px solid var(--dform-line);
  padding: 6px 14px;
  cursor: pointer;
  font: inherit;
  font-size: 13px;
  color: inherit;
  white-space: nowrap;
}
.dform__tab:last-child { border-right: 0; }
.dform__tab:hover { background: var(--dform-accent-soft); }
.dform__tab--on {
  background: var(--dform-accent);
  color: #fff;
}
.dform__tab--on:hover { background: var(--dform-accent); }
.dform__save-status {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  opacity: .8;
  white-space: nowrap;
}
.dform__save-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--dform-good);
}
.dform__save-status--modified .dform__save-dot { background: #d08b1e; }
/* ── working area ────────────────────────────────────────────────────── */
.dform__work {
  display: flex;
  flex: 1 1 auto;
  min-height: 0;
}
.dform__panel {
  flex: 1 1 auto;
  min-height: 0;
  overflow: auto;
  padding: 20px;
}
.dform__palette,
.dform__properties {
  flex: 0 0 208px;
  border-right: 1px solid var(--dform-line);
  padding: 14px;
  overflow-y: auto;
}
.dform__properties {
  border-right: 0;
  border-left: 1px solid var(--dform-line);
  flex-basis: 264px;
}
.dform__palette-title,
.dform__properties-title {
  font-size: 11px;
  letter-spacing: .08em;
  text-transform: uppercase;
  opacity: .6;
  margin: 0 0 10px;
}
.dform__palette-item {
  display: flex;
  align-items: center;
  gap: 9px;
  border: 1px dashed var(--dform-line);
  border-radius: 4px;
  padding: 6px 9px;
  margin-bottom: 6px;
  cursor: grab;
  font-size: 13px;
  -webkit-user-select: none;
  user-select: none;
}
.dform__palette-item:hover {
  border-style: solid;
  border-color: var(--dform-accent);
  background: var(--dform-accent-soft);
}
/* A worked example of the field's content, sized so `01/07/2026` still fits legibly. */
.dform__palette-hintbox {
  flex: 0 0 62px;
  text-align: center;
  border: 1px solid var(--dform-line);
  border-radius: 3px;
  padding: 2px 3px;
  font-size: 10px;
  line-height: 1.4;
  letter-spacing: .01em;
  color: var(--dform-accent);
  background: var(--dform-accent-soft);
  overflow: hidden;
  white-space: nowrap;
}
.dform__palette-name { min-width: 0; }
.dform__palette-hint,
.dform__properties-empty {
  font-size: 12px;
  opacity: .65;
  line-height: 1.45;
  margin-top: 12px;
}
.dform__prop {
  display: block;
  margin-bottom: 12px;
  font-size: 12px;
}
.dform__prop > span {
  display: block;
  margin-bottom: 4px;
  opacity: .7;
}
/**
 * `box-sizing` is the load-bearing line, not tidiness: these are `width: 100%` controls inside a
 * fixed-width panel, and this app has no global border-box reset, so content-box added the 8px of
 * padding and the 1px borders OUTSIDE the 100% — the Label and Placeholder boxes ran 18px past the
 * panel, and since the panel is the last thing on the right of the screen they ran off the edge of
 * it, leaving the panel with a horizontal scrollbar to reach the end of a text field.
 */
.dform__prop input[type="text"],
.dform__prop input[type="number"] {
  box-sizing: border-box;
  width: 100%;
  max-width: 100%;
  padding: 5px 8px;
  border: 1px solid var(--dform-line);
  border-radius: 3px;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: 13px;
}
.dform__prop-note {
  font-size: 10px;
  letter-spacing: .02em;
  opacity: .55;
  margin-left: 4px;
  white-space: nowrap;
}
/* Label left, a narrow number box right — this row sits among ordinary text fields, not above them. */
.dform__prop--cells {
  justify-content: space-between;
  gap: 10px;
}
.dform__prop--cells > span { flex: 1 1 auto; margin: 0; }
.dform__prop--cells input[type="number"] {
  flex: 0 0 68px;
  width: 68px;
  text-align: center;
}
.dform__prop--inline {
  display: flex;
  align-items: center;
  gap: 8px;
}
.dform__prop--inline > span { margin: 0; }
.dform__option {
  display: flex;
  gap: 6px;
  margin-bottom: 5px;
}
.dform__option input { flex: 1 1 auto; }
.dform__option-remove,
.dform__delete {
  background: none;
  border: 1px solid var(--dform-line);
  border-radius: 3px;
  cursor: pointer;
  color: inherit;
  font: inherit;
  padding: 2px 8px;
}
.dform__delete {
  margin-top: 18px;
  width: 100%;
  padding: 7px;
  color: var(--dform-bad);
  border-color: var(--dform-bad);
  font-size: 13px;
}
.dform__delete:hover { background: rgba(166, 50, 30, .1); }
.dform__delete-key {
  font-size: 10px;
  border: 1px solid currentColor;
  border-radius: 3px;
  padding: 0 4px;
  margin-left: 6px;
  opacity: .7;
}
.dform__canvas {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
}
.dform__scroll {
  flex: 1 1 auto;
  overflow: auto;
  padding: 20px;
  display: flex;
  justify-content: center;
  align-items: flex-start;
}
.dform__notice {
  margin: 12px 20px 0;
  padding: 9px 14px;
  border: 1px solid var(--dform-line);
  border-left: 3px solid var(--dform-accent);
  border-radius: 0 3px 3px 0;
  font-size: 13px;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 16px;
  align-items: center;
  justify-content: space-between;
}
.dform__notice--warn { border-left-color: #d08b1e; }
.dform__notice-main { flex: 1 1 auto; min-width: 0; }
.dform__empty {
  padding: 60px 20px;
  opacity: .6;
}
/* ── pager ───────────────────────────────────────────────────────────── */
.dform__pager {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 8px 16px;
  border-top: 1px solid var(--dform-line);
  font-size: 13px;
}
.dform__pager-button {
  background: none;
  border: 1px solid var(--dform-line);
  border-radius: 3px;
  padding: 3px 10px;
  cursor: pointer;
  color: inherit;
  font: inherit;
  font-size: 13px;
}
.dform__pager-button:disabled { opacity: .4; cursor: default; }
.dform__pager-button:not(:disabled):hover { background: var(--dform-accent-soft); }
.dform__pager-count { opacity: .7; }
.dform__pager-zoom { display: inline-flex; gap: 4px; }
.dform__pager-required { margin-left: auto; opacity: .7; }
/* ── the page ────────────────────────────────────────────────────────── */
.dform-page {
  width: 100%;
  display: flex;
  justify-content: center;
}
.dform-page__sheet {
  position: relative;
  max-width: 1200px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .2), 0 10px 30px -12px rgba(0, 0, 0, .35);
  background: #fff;
}
.dform-page__aspect { width: 100%; }
.dform-page__background {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  -webkit-user-select: none;
  user-select: none;
  pointer-events: none;
}
.dform-page__blank {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #999;
  font-size: 13px;
  border: 1px dashed #ccc;
}
.dform-page--design .dform-page__sheet { cursor: crosshair; }
/* ── a field box ─────────────────────────────────────────────────────── */
.dform-field {
  position: absolute;
  box-sizing: border-box;
  display: flex;
  align-items: center;
}
/* design */
/**
 * A colour per type, so a page of twenty fields reads as a map rather than a wall of identical blue
 * rectangles. Hues are spread far enough apart to survive being seen at 13px — the size an imported
 * checkbox actually is — and each is set once here as `--f`, which the border, fill and hover all
 * derive from, so a type is recoloured in one place.
 */
.dform-field--design {
  --f: 59, 91, 165;

  border: 1.5px solid rgb(var(--f));
  background: rgba(var(--f), .16);
  cursor: move;
  touch-action: none;
  /* No text selection while designing: selecting a label and dragging it starts a NATIVE drag,
     which is not the interact drag that moves the box — it used to drop phantom fields instead. */
  user-select: none;
  -webkit-user-select: none;
  overflow: hidden;
  padding: 0 2px;
  gap: 4px;
  border-radius: 2px;
}
.dform-field--design.dform-field--type-text      { --f: 59, 91, 165; }
/* blue */
.dform-field--design.dform-field--type-textarea  { --f: 45, 118, 158; }
/* teal-blue */
.dform-field--design.dform-field--type-number    { --f: 138, 79, 175; }
/* violet */
.dform-field--design.dform-field--type-date      { --f: 176, 96, 32; }
/* amber */
.dform-field--design.dform-field--type-checkbox  { --f: 0, 140, 92; }
/* green */
.dform-field--design.dform-field--type-radio     { --f: 0, 132, 132; }
/* cyan */
.dform-field--design.dform-field--type-select    { --f: 168, 88, 128; }
/* mauve */
.dform-field--design.dform-field--type-signature { --f: 166, 50, 30; }
/* red */
.dform-field--design.dform-field--type-staticText{ --f: 110, 122, 132; }
/* grey — not an input */
.dform-field--design:hover { background: rgba(var(--f), .3); }
/**
 * A box too small to hold text — an imported checkbox is about 13x10px — gets a solid block and a
 * ring instead. Legible at that size, where a label and a 1px border are not, and it still shows its
 * type by colour. The label lives on the element's `title`.
 */
.dform-field--design.dform-field--tiny {
  background: rgba(var(--f), .55);
  box-shadow: 0 0 0 1.5px #fff, 0 0 0 3px rgb(var(--f));
  padding: 0;
}
.dform-field--design.dform-field--tiny .dform-field__grip,
.dform-field--design.dform-field--tiny .dform-field__type { display: none; }
.dform-field--selected {
  outline: 2px solid #16202b;
  outline-offset: 2px;
  background: rgba(var(--f), .38);
}
/* The resize affordance: SE corner of the selected field, oversized hit area via padding-box trick. */
.dform-field__handle {
  position: absolute;
  right: -7px;
  bottom: -7px;
  width: 14px;
  height: 14px;
  box-sizing: border-box;
  background: #fff;
  border: 2.5px solid rgb(var(--f));
  border-radius: 3px;
  cursor: nwse-resize;
  z-index: 2;
}
.dform-field--design.dform-field--tiny.dform-field--selected {
  background: rgba(var(--f), .8);
}
.dform-field__grip {
  display: flex;
  align-items: center;
  gap: 3px;
  min-width: 0;
  flex: 1 1 auto;
  font-size: 11px;
  line-height: 1.2;
  font-weight: 600;
  color: rgb(var(--f));
}
.dform-field__label { min-width: 0; }
.dform-field__required { color: #a6321e; font-weight: 700; }
.dform-field__type {
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: .04em;
  opacity: .75;
  flex: 0 0 auto;
  color: rgb(var(--f));
  white-space: nowrap;
}
/* Palette swatches carry the same hue as the box the item drops, so the two are learnable together. */
.dform__palette-item--text .dform__palette-hintbox      { --f: 59, 91, 165; }
.dform__palette-item--comb .dform__palette-hintbox      { --f: 59, 91, 165; }
.dform__palette-item--textarea .dform__palette-hintbox  { --f: 45, 118, 158; }
.dform__palette-item--number .dform__palette-hintbox    { --f: 138, 79, 175; }
.dform__palette-item--date .dform__palette-hintbox      { --f: 176, 96, 32; }
.dform__palette-item--checkbox .dform__palette-hintbox  { --f: 0, 140, 92; }
.dform__palette-item--radio .dform__palette-hintbox     { --f: 0, 132, 132; }
.dform__palette-item--select .dform__palette-hintbox    { --f: 168, 88, 128; }
.dform__palette-item--signature .dform__palette-hintbox { --f: 166, 50, 30; }
.dform__palette-item--staticText .dform__palette-hintbox{ --f: 110, 122, 132; }
.dform__palette-hintbox {
  --f: 59, 91, 165;

  border-color: rgba(var(--f), .45);
  color: rgb(var(--f));
  background: rgba(var(--f), .12);
}
/* ── "what is selected" header in the properties panel ───────────────── */
.dform__selected {
  --f: 59, 91, 165;

  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 9px;
  margin-bottom: 4px;
  border: 1px solid rgba(var(--f), .45);
  border-radius: 4px;
  background: rgba(var(--f), .12);
}
.dform__selected-swatch {
  flex: 0 0 auto;
  width: 12px;
  height: 12px;
  border-radius: 3px;
  background: rgb(var(--f));
}
.dform__selected-type {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .03em;
  color: rgb(var(--f));
}
.dform__selected-name {
  margin: 0 0 14px;
  font-size: 13px;
  font-weight: 600;
  opacity: .85;
}
/* ── the file-list pill ──────────────────────────────────────────────── */
.dform-filepill {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 6px;
  border-radius: 9px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  vertical-align: middle;
  white-space: nowrap;
  border: 1px solid currentColor;
}
.dform-filepill--form { color: #3b5ba5; background: rgba(59, 91, 165, .1); }
.dform-filepill--response { color: #2f6b4f; background: rgba(47, 107, 79, .1); }
/* fill */
/**
 * The same hue per type as the designer uses, so someone filling the form can see at a glance what
 * each box wants — a tick, a choice, a signature — instead of a page of identical pale rectangles.
 *
 * Deliberately weaker than design mode. Here the PRINTED form is the thing being read and the
 * inputs sit on top of it, so the tint stays light enough to read the artwork through and the
 * colour is carried mostly by the border. Design mode is the opposite: there the fields are the
 * subject and the page is reference.
 */
.dform-field--fill {
  --f: 59, 91, 165;

  background: rgba(var(--f), .12);
}
.dform-field--fill.dform-field--type-text      { --f: 59, 91, 165; }
.dform-field--fill.dform-field--type-textarea  { --f: 45, 118, 158; }
.dform-field--fill.dform-field--type-number    { --f: 138, 79, 175; }
.dform-field--fill.dform-field--type-date      { --f: 176, 96, 32; }
.dform-field--fill.dform-field--type-checkbox  { --f: 0, 140, 92; }
.dform-field--fill.dform-field--type-radio     { --f: 0, 132, 132; }
.dform-field--fill.dform-field--type-select    { --f: 168, 88, 128; }
.dform-field--fill.dform-field--type-signature { --f: 166, 50, 30; }
.dform-field--missing { outline: 2px solid #a6321e; outline-offset: 1px; }
/**
 * The colour has to live in the FILL, not just the border.
 *
 * A 1px edge is nearly invisible on a dense printed page — the field reads as an empty rectangle,
 * and someone filling the form cannot tell a date from a signature without clicking it.
 *
 * Two things this rule has to get right, both learned the hard way:
 *
 * 1. `background-color` as a LONGHAND, not the `background` shorthand. The shorthand carries
 *    background-image with it, so any later or more specific declaration anywhere in the app wipes
 *    the whole thing out at once — which is exactly what happened: borders painted, fills did not.
 * 2. Scoped under `.dform-field--fill`, not bare. A single class loses to the app's own input
 *    styling, and losing silently is what made this look like the colour "wasn't applied".
 *
 * Translucent on purpose: the printed rule underneath stays visible through the tint, which is what
 * keeps the field looking like part of the form rather than a box pasted over it.
 */
.dform-field--fill .dform-field__input {
  width: 100%;
  height: 100%;
  border: 1.5px solid rgba(var(--f), .8);
  border-radius: 2px;
  background-color: rgba(var(--f), .18);
  color: #16202b;
  font: inherit;
  font-size: 13px;
  padding: 2px 5px;
  box-sizing: border-box;
}
.dform-field--fill .dform-field__input::placeholder { color: rgba(var(--f), .7); }
.dform-field--fill .dform-field__input:hover { background-color: rgba(var(--f), .26); }
/* Focus is the one place colour goes strongest: it must beat every other cue on the page. */
.dform-field--fill .dform-field__input:focus,
.dform-field--fill .dform-field__signature:focus {
  outline: 2px solid rgb(var(--f));
  outline-offset: 1px;
  background-color: #fff;
}
/* Separate from the rule above: a focused comb must keep its text hidden, so it cannot take the
   plain `background-color: #fff` reset without also re-showing the string it is holding. */
.dform-field--fill .dform-field__comb .dform-field__comb-input:focus {
  outline: 2px solid rgb(var(--f));
  outline-offset: 1px;
  background-color: rgba(var(--f), .1);
}
.dform-field__input--area { resize: none; line-height: 1.35; }
.dform-field__check {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  /* Filled as well as ringed: at the size of a printed square, an outline alone disappears into
     the artwork and there is no room for anything else to carry the colour. */
  background-color: rgba(var(--f), .22);
  box-shadow: 0 0 0 2px rgba(var(--f), .85);
  border-radius: 2px;
}
.dform-field--fill .dform-field__check:hover { background-color: rgba(var(--f), .34); }
/**
 * The native checkbox has to be replaced, not merely tinted.
 *
 * It is sized to fill the printed square, so it paints its own white box straight over the coloured
 * label behind it — which is why the tick boxes stayed colourless while every other type took its
 * hue. `accent-color` does not help: it colours the MARK, and an unticked box has no mark, so the
 * one state that most needed to be visible stayed plain.
 *
 * `appearance: none` hands the box back to us. The tick is an inline SVG data URI — no external
 * request, so it works under the artifact CSP and offline like everything else here.
 */
.dform-field--fill .dform-field__check input {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  height: 100%;
  margin: 0;
  cursor: pointer;
  border: 1.5px solid rgba(var(--f), .9);
  border-radius: 2px;
  background-color: rgba(var(--f), .2);
  box-sizing: border-box;
}
.dform-field--fill .dform-field__check input:hover { background-color: rgba(var(--f), .34); }
.dform-field--fill .dform-field__check input:checked {
  background-color: rgb(var(--f));
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20 6L9 17l-5-5' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-size: 78% 78%;
  background-position: center;
  background-repeat: no-repeat;
}
.dform-field--fill .dform-field__check input:focus-visible {
  outline: 2px solid rgb(var(--f));
  outline-offset: 2px;
}
/**
 * `row wrap`, not `column`.
 *
 * A printed form nearly always lays a short choice list ACROSS a line — "Annual leave   Sick
 * leave   Unpaid leave" — and the author draws one field box over that line, so the box arrives
 * wide and one line tall (610×24 on the leave request that found this). Stacking those three
 * options vertically needs 49px inside 22px of usable height, and with `overflow: auto` the
 * overflow became a scrollbar in a 24px box: the responder saw one and a half options and had to
 * scroll a control the height of a line of text to discover the other two. Nobody scrolls inside
 * a 24px box, so in practice two of the three answers did not exist.
 *
 * Wrapping row-first fits that box the way the printed page does, and degrades the right way for
 * the opposite shape: in a tall narrow box each option is wider than the row, so it wraps one per
 * line and reads as the vertical list it should be. `overflow: auto` stays as the last resort for
 * a box too small for either arrangement.
 */
.dform-field--fill .dform-field__choices {
  display: flex;
  flex-flow: row wrap;
  align-content: center;
  column-gap: 10px;
  row-gap: 2px;
  width: 100%;
  height: 100%;
  overflow: auto;
  font-size: 12px;
  color: #16202b;
  border: 1.5px solid rgba(var(--f), .75);
  border-radius: 2px;
  padding: 1px;
  box-sizing: border-box;
  /**
   * OPAQUE, not the `.92` this used to be.
   *
   * A choice field is the one control the app draws whole — circles and labels both — because a
   * field carries a single `rect` and its options carry no coordinates, so there is no printed
   * circle to aim a mark at. On a form that prints its own options across the line the box is laid
   * over them, and at `.92` the printed circles and labels ghosted through BETWEEN ours: two rows
   * of the same three answers, a few pixels apart, one of them ours. Covering the box is what makes
   * the control the only thing in it.
   */
  background-color: #fff;
}
.dform-field--fill .dform-field__choice {
  display: flex;
  align-items: center;
  gap: 5px;
  /* Size to its own label so several fit a row; `1 1 auto` would stretch one option across the
     whole width and undo the wrap above. */
  flex: 0 0 auto;
  max-width: 100%;
  cursor: pointer;
  background-color: rgba(var(--f), .16);
  border-radius: 2px;
  padding: 0 3px;
}
.dform-field--fill .dform-field__choice:hover { background-color: rgba(var(--f), .3); }
/* Replaced for the same reason as the checkbox: the native dot paints its own box over the tint. */
.dform-field--fill .dform-field__choice input {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  width: 11px;
  height: 11px;
  margin: 0;
  border: 1.5px solid rgba(var(--f), .9);
  border-radius: 50%;
  background-color: #fff;
  cursor: pointer;
  box-sizing: border-box;
}
.dform-field--fill .dform-field__choice input:checked {
  background-color: rgb(var(--f));
  box-shadow: inset 0 0 0 2px #fff;
}
.dform-field--fill .dform-field__choice input:focus-visible {
  outline: 2px solid rgb(var(--f));
  outline-offset: 1px;
}
/* A chosen option should be readable as chosen without hunting for the dot. */
.dform-field--fill .dform-field__choice-label { font-weight: 500; }
/**
 * The same row, submitted.
 *
 * Geometry copied from the fill rules above rather than shared with them, because what changes
 * between the two is every other property: a response carries no tint, no border and no hover — the
 * guides belong to the editable view, and the answer belongs on the paper (the comb cells above draw
 * the same distinction).
 *
 * The mark takes `--dform-accent`, which is the colour the checkbox tick already answers in. It
 * cannot take `--f`: that is declared on `.dform-field--fill` and `--design` only, so every
 * `rgba(var(--f), …)` here would be invalid at computed-value time and silently drop.
 */
.dform-field--view .dform-field__choices {
  display: flex;
  flex-flow: row wrap;
  align-content: center;
  column-gap: 10px;
  row-gap: 2px;
  width: 100%;
  height: 100%;
  overflow: hidden;
  box-sizing: border-box;
  font-size: 12px;
  color: #16202b;
  /* Covers the printed options for the same reason the fill row above does. This started out
     transparent, on the theory that a response should let the paper show — which is right for a
     value written ON a printed line, and wrong for the one field that draws its own circles: what
     showed through was a second copy of the same three options, misaligned with ours. */
  background-color: #fff;
}
.dform-field--view .dform-field__choice {
  display: flex;
  align-items: center;
  gap: 5px;
  flex: 0 0 auto;
  max-width: 100%;
}
.dform-field--view .dform-field__choice input {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 auto;
  width: 11px;
  height: 11px;
  margin: 0;
  border: 1.5px solid var(--dform-accent, #3b5ba5);
  border-radius: 50%;
  background-color: #fff;
  box-sizing: border-box;
}
/* `:disabled` is not styled away deliberately — the whole row is disabled in a response, so a
   greyed-out mark would grey out the answer itself. */
.dform-field--view .dform-field__choice input:checked {
  background-color: var(--dform-accent, #3b5ba5);
  box-shadow: inset 0 0 0 2px #fff;
}
.dform-field--view .dform-field__choice-label { font-weight: 500; }
/**
 * A choice group whose options were placed by the PDF.
 *
 * No backing, no border, no labels of our own — the page already prints a circle and a label for
 * every option, and the whole point of these boxes is that a mark lands INSIDE the printed circle.
 * Everything the masked row above needs, this one must not have.
 *
 * `overflow: visible` because a mark is allowed to fill its circle right to the edge, and the
 * outermost option's box ends exactly where the field's own box does (the field rect IS their
 * union), so a hidden overflow would shave the last one.
 */
.dform-field__placed {
  position: absolute;
  inset: 0;
  display: block;
  overflow: visible;
}
.dform-field__placed-choice,
.dform-field__placed-mark {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
}
.dform-field__placed-choice { cursor: pointer; }
/* The hit area is the printed circle, so the input fills the box rather than drawing a circle of
   its own beside it — `appearance: none` for the same reason as the row above: the native dot
   paints its own box over the artwork. */
.dform-field--fill .dform-field__placed-choice input {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  height: 100%;
  margin: 0;
  border: 1.5px solid rgba(var(--f), .55);
  border-radius: 50%;
  background-color: rgba(var(--f), .14);
  cursor: pointer;
  box-sizing: border-box;
}
.dform-field--fill .dform-field__placed-choice:hover input {
  background-color: rgba(var(--f), .3);
}
/* Chosen: a filled centre, inset so the printed ring stays visible around it. */
.dform-field--fill .dform-field__placed-choice input:checked {
  background-color: rgb(var(--f));
  box-shadow: inset 0 0 0 2.5px #fff;
}
.dform-field--fill .dform-field__placed-choice input:focus-visible {
  outline: 2px solid rgb(var(--f));
  outline-offset: 1px;
}
/* Submitted: the tick only, in the colour the checkbox tick already answers in. Scaled to the box
   like that one, so it stays crisp at any zoom and fits whatever size circle the PDF drew. */
.dform-field__placed-mark {
  color: var(--dform-accent, #3b5ba5);
  pointer-events: none;
}
.dform-field__placed-mark svg {
  width: 100%;
  height: 100%;
  display: block;
}
/**
 * `background-color` longhand only — the signed state sets `background-image` inline to the
 * signature PNG, and a `background` shorthand here would fight it for the same property.
 */
.dform-field__signature {
  width: 100%;
  height: 100%;
  border: 1.5px dashed rgba(var(--f), .85);
  border-radius: 2px;
  background-color: rgba(var(--f), .18);
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  cursor: pointer;
  font: inherit;
  font-size: 12px;
  font-weight: 600;
  color: rgb(var(--f));
  display: block;
}
.dform-field__signature:hover { background-color: rgba(var(--f), .3); }
.dform-field__signature--signed {
  border-style: solid;
  border-color: transparent;
  background-color: transparent;
  color: transparent;
}
.dform-field__signature--readonly { cursor: default; }
.dform-field__signature-clear {
  position: absolute;
  top: -9px;
  right: -9px;
  width: 18px;
  height: 18px;
  line-height: 1;
  border-radius: 50%;
  border: 1px solid var(--dform-line);
  background: #fff;
  color: #a6321e;
  cursor: pointer;
  padding: 0;
}
/* read-only */
.dform-field--view { pointer-events: none; }
/* ── comb: one character per printed box ─────────────────────────────── */
.dform-field__comb {
  position: relative;
  width: 100%;
  height: 100%;
}
.dform-field__comb-cells {
  position: absolute;
  inset: 0;
  display: block;
  pointer-events: none;
}
/* Each box is an equal slice of the field, matching how a PDF renders a comb. */
.dform-field__comb-cell {
  position: absolute;
  top: 0;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  line-height: 1;
  color: #16202b;
  box-sizing: border-box;
}
/* Guides only in the editable view — a submitted response shows the printed boxes underneath. */
.dform-field--fill .dform-field__comb-cell {
  border-right: 1px solid rgba(var(--f), .4);
}
.dform-field--fill .dform-field__comb-cell:last-child { border-right: 0; }
/**
 * The real input: full-size and on top, but invisible. It owns every text behaviour — caret,
 * selection, paste, undo, Tab — while the cells beneath do the drawing. `color: transparent` rather
 * than `opacity: 0` so the caret still shows through `caret-color`, which is the one piece of
 * feedback that would otherwise be lost.
 */
.dform-field--fill .dform-field__comb .dform-field__comb-input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 1.5px solid rgba(var(--f), .8);
  padding: 0;
  margin: 0;
  background-color: rgba(var(--f), .18);
  /**
   * BOTH properties, and the selector deliberately over-specified.
   *
   * The input carries the real value but must not draw it — the cells underneath do that, each
   * character centred in its own printed box. `color` alone is not enough: Chrome paints input text
   * with `-webkit-text-fill-color`, which wins over `color`, so the raw left-aligned string stayed
   * visible on top of the boxes while typing and only appeared to "become" a comb once it lost
   * focus and stopped being repainted.
   *
   * This used to claim the pair sat "at a specificity the app's own input styling cannot outrank".
   * It could, and did: `_blocks/forms`'s one-text-control rule is `input[type="text"]` plus four
   * `:not()` guards — (0,4,1) against the (0,3,0) here — so it won `background`, `border` and
   * `color` while leaving `-webkit-text-fill-color` alone, which is the worst possible half to
   * lose. The input became an opaque white box over the cells and a typed value vanished. Fixed
   * where the reach is, by excluding `[class*="dform-field"]` there, not by escalating here.
   */
  color: transparent;
  -webkit-text-fill-color: transparent;
  caret-color: rgb(var(--f));
  font: inherit;
  font-size: 13px;
  letter-spacing: 0;
  box-sizing: border-box;
}
.dform-field__comb-input:focus {
  outline: 2px solid #3b5ba5;
  outline-offset: 0;
  background: rgba(255, 255, 255, .5);
}
/* Fills the printed square, whatever size the source PDF drew it. */
.dform-field__tick {
  display: block;
  width: 100%;
  height: 100%;
  color: var(--dform-accent, #3b5ba5);
}
.dform-field__tick svg {
  width: 100%;
  height: 100%;
  display: block;
}
/* Available to screen readers, invisible on screen — the tick's meaning in words. */
.dform-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.dform-field__value,
.dform-field__static {
  font-size: 13px;
  color: #16202b;
  line-height: 1.3;
  overflow: hidden;
  width: 100%;
}
.dform-field__static { opacity: .85; }
/* ── responses ───────────────────────────────────────────────────────── */
.dform-responses__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}
.dform-responses__stats {
  display: flex;
  align-items: baseline;
  gap: 18px;
  flex-wrap: wrap;
}
.dform-responses__stat { font-size: 13px; }
.dform-responses__stat b { font-size: 20px; margin-right: 5px; }
.dform-responses__stat--muted { opacity: .6; }
.dform-responses__stat--bad { color: #a6321e; }
.dform-responses__scroll {
  overflow-x: auto;
  border: 1px solid rgba(128, 128, 128, .28);
  border-radius: 4px;
}
.dform-responses__table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}
.dform-responses__table th,
.dform-responses__table td {
  text-align: left;
  padding: 8px 12px;
  border-bottom: 1px solid rgba(128, 128, 128, .18);
  white-space: nowrap;
}
.dform-responses__table th {
  font-size: 11px;
  letter-spacing: .06em;
  text-transform: uppercase;
  opacity: .65;
}
.dform-responses__row { cursor: pointer; }
.dform-responses__row:hover { background: rgba(59, 91, 165, .08); }
.dform-responses__row--pending { opacity: .55; }
.dform-responses__who { font-weight: 600; }
.dform-responses__cell {
  max-width: 26ch;
  overflow: hidden;
  text-overflow: ellipsis;
}
.dform-responses__empty {
  padding: 48px 20px;
  text-align: center;
  opacity: .7;
}
.dform-responses__empty-hint {
  font-size: 13px;
  max-width: 52ch;
  margin: 8px auto 0;
  line-height: 1.5;
}
.dform-badge {
  display: inline-block;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .03em;
  border-radius: 3px;
  padding: 2px 7px;
  border: 1px solid currentColor;
  white-space: nowrap;
}
.dform-badge--good { color: #2f6b4f; }
.dform-badge--bad { color: #a6321e; }
.dform-badge--muted { color: #7c8a93; }
@media (max-width: 900px) {
  .dform__palette,
  .dform__properties { display: none; }
}
/* Form and response pills, brought into the badge family. */
.dform-filepill {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  gap: var(--spacer-1);
  padding: 3px 9px;
  border: 1px solid transparent;
  border-radius: var(--r-r-pill);
  font-size: 11.5px;
  line-height: 16px;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}
.dform-filepill--form,
.dform-filepill--response {
  background: var(--r-ok-bg);
  color: var(--r-ok-fg);
}
/* The register screen — and the orange door to it on the files toolbar.
 *
 * One deliberate colour on an otherwise quiet page: the Index button and the register's own accents are
 * ORANGE (--orange/--serenade, already in the palette) so the register reads as one thing wherever it
 * appears — the way in, the screen itself, the chips that narrow it. Nothing else here uses orange. */
/* --- the way in: the register's own colour, first on the fusion toolbar ---
 *
 * It was an orange chip while the whole toolbar was chips. Now that the toolbar is icons, the register
 * keeps its colour but wears it the way its neighbours do — on the icon, at the deep orange the register
 * screen itself uses. The button's shape, spacing and collapse behaviour come from `.button-file` in
 * `_blocks/toolbar/toolbar.css` along with everything else in the row; only the hue is its own, and that
 * one declaration lives in `--btn-index` beside the rest of the palette so a reader finds them together. */
/* Nearly the whole window, the same call the viewer makes and for the same reason: what it shows is a
 * table of many columns, and a modal sized to a paragraph would put a register in a letterbox. */
.modal--fusion-catalog {
  width: calc(100vw - 80px);
  max-width: 1500px;
}
/* ONE scroll region, and it is the table's.
 *
 * The register used to cap its table at `calc(100vh - 320px)` — 320 being a guess at everything else the
 * dialog draws: title, subtitle, the tools row, the pager, the footer. A guess is wrong the moment any of
 * them changes height, and the tools row does that by design: it WRAPS, growing a line for each filter
 * chip. When the guess ran short the dialog's own `.modal__content` began scrolling too, so the register
 * had two vertical scrollbars side by side — one moving the whole dialog by twenty-odd pixels, one moving
 * the rows.
 *
 * So nothing is guessed now. The content becomes a column, the table takes whatever is left of it
 * (`flex: 1` with `min-height: 0`, without which a flex item refuses to shrink below its content), and the
 * dialog is left with nothing to scroll. This is a deliberate exception to the rule in modal.css that
 * `.modal__content` is a dialog's single scroll region — the register brings its own, and the whole
 * problem here was having both. */
.modal--fusion-catalog .modal__content {
  display: flex;
  flex-direction: column;
  min-height: 0;
}
.modal--fusion-catalog .catalog__table-wrap {
  flex: 1 1 auto;
  max-height: none;
  /* A FLOOR, not `min-height: 0`. Left free to shrink the table collapsed to 26 pixels on a short window —
     the header row and nothing else — which is a register showing no register. Below this the dialog's own
     content scrolls again, so a very short window is back to two bars; that is the right way round, because
     a second scrollbar is a nuisance and a table with no rows in it is useless. About four rows and the
     header, which is enough to see that the thing has contents and to reach the pager. */
  min-height: 180px;
}
/* Pushes whatever follows it — the Export button — to the right end of the tools row, so the one action
 * that takes the register away sits apart from the controls that narrow it. */
.catalog__spacer {
  flex: 1 1;
}
/* --- the toolbar: one search, and the chips that say how the register is narrowed --- */
.catalog__tools {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 12px;
}
.catalog__search {
  flex: 0 1 340px;
  min-width: 220px;
  padding: 8px 12px;
  border: 1px solid var(--colour-neutral-6, #737373);
  border-radius: 18px;
  font-size: 13px;
  background: transparent;
}
.catalog__search:focus {
  outline: none;
  border-color: var(--orange);
}
/* A chip is a fact about the current view that can be removed by the person reading it. */
.catalog__chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border: 1px solid var(--orange);
  border-radius: 14px;
  background: var(--serenade);
  color: var(--orange-dark);
  font-size: 12px;
  cursor: pointer;
  -webkit-user-select: none;
  user-select: none;
}
.catalog__chip:hover { background: var(--orange-mid); }
.catalog__chip-off {
  font-weight: 700;
  line-height: 1;
}
/* The quick toggle for the work remaining, off-state: quiet until it is on. */
.catalog__chip--quiet {
  border-color: var(--colour-neutral-6, #737373);
  background: transparent;
  color: inherit;
}
/* --- table --- */
/* The register is wider than any dialog BY CONSTRUCTION — File, Location and one column per attribute —
 * so it always scrolls sideways, and that has to be obvious rather than discovered.
 *
 * `overflow-x: scroll`, not `auto`: the bar is drawn whether or not this particular tenancy's columns
 * happen to overflow, so it never appears and vanishes as filters change the widths, and a cut-off Title
 * column can never be mistaken for the end of the table. And styled here rather than borrowing the app's
 * `.smooth-scroll`, whose 9px of #bdc0cb reads as no scrollbar at all against a white table — it was
 * reported missing twice, once with that class already applied. */
.catalog__table-wrap {
  overflow-x: scroll;
  overflow-y: auto;
  border: 1px solid var(--r-div-2, #e2e2e7);
  border-radius: var(--border-radius-sm, 6px);
  /* Chrome (121+) and Firefox both honour this, and setting it makes Chrome IGNORE the
     `::-webkit-scrollbar` rules below — those are now the fallback for Safari and older Chrome, which is
     why the two are kept deliberately in step. `--colour-neutral-6` rather than `--colour-fg-subtle`:
     the latter resolves to rgb(155,155,155), which is the pale thumb this was reported as not having. */
  scrollbar-color: var(--colour-neutral-6, #737373) var(--platinum, #e2e2e7);
}
.catalog__table-wrap::-webkit-scrollbar {
  width: 14px;
  height: 14px;
}
.catalog__table-wrap::-webkit-scrollbar-track {
  background: var(--platinum, #e2e2e7);
}
.catalog__table-wrap::-webkit-scrollbar-thumb {
  background: var(--colour-neutral-6, #737373);
  border-radius: 7px;
  /* Inset by its own track colour, so the thumb reads as a grip rather than filling the gutter. */
  border: 3px solid var(--platinum, #e2e2e7);
}
.catalog__table-wrap::-webkit-scrollbar-thumb:hover {
  background: var(--orange);
}
/* The one corner where the two bars meet, which otherwise paints white and breaks the gutter in half. */
.catalog__table-wrap::-webkit-scrollbar-corner {
  background: var(--platinum, #e2e2e7);
}
.catalog__table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}
/* Sticky, so column names survive a register that runs to pages. */
.catalog__table thead th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--serenade);
  text-align: left;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 10px 12px;
  border-bottom: 2px solid var(--orange);
  white-space: nowrap;
}
/* Column name and its funnel on ONE line, always.
 *
 * `.flex-group` wraps by default, and a header cell is only as wide as its column — so on the narrow ones
 * (CDRL Number, Classification, Date of Change, Index Number) the funnel dropped below the name while the
 * wide ones kept it alongside, and the row of filters came out as a zigzag at two different heights. The
 * cell already refuses to wrap its text; this makes its two children agree. The column simply gets as wide
 * as it needs — the table is in an `overflow: auto` wrapper and has always scrolled sideways. */
.catalog__table thead th .flex-group {
  flex-wrap: nowrap;
}
.catalog__table tbody td {
  padding: 9px 12px;
  border-bottom: 1px solid var(--r-div-2, #e2e2e7);
  vertical-align: middle;
  max-width: 320px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.catalog__row--open { cursor: pointer; }
.catalog__row--open:hover td { background: var(--serenade); }
.catalog__content {
  border: 0;
  min-width: 0;
}
/* A fieldset's anonymous content box does not shrink with the modal's flex layout. Keep its
 * native disabled behaviour, but let the table participate directly in the content's layout. */
.catalog__fieldset {
  display: contents;
}
.catalog__table .catalog__selection {
  width: 42px;
  min-width: 42px;
  padding: 9px 12px;
  text-align: center;
}
.catalog__selection input {
  width: 16px;
  height: 16px;
  margin: 0;
  vertical-align: middle;
  accent-color: var(--orange-dark);
  cursor: pointer;
}
.catalog__selection input:disabled { cursor: default; }
.catalog__table .catalog__row--selected td {
  background: var(--serenade);
}
.catalog__bulk {
  flex: 0 0 auto;
  border: 1px solid var(--orange);
  border-radius: 6px;
  padding: 12px;
  margin-bottom: 12px;
}
.catalog__bulk-tools {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
}
.catalog__selected-count { color: var(--orange-dark); }
.catalog__bulk-attribute { width: 210px; }
.catalog__bulk-value { width: 250px; }
.catalog__deselect {
  background: transparent;
  border: 0;
  color: inherit;
  text-decoration: underline;
  font-size: 12px;
}
.catalog__hint {
  margin: 0 0 10px;
  font-size: 12px;
  color: var(--colour-fg-subtle);
}
.catalog__bulk .catalog__hint { margin: 10px 0 0; }
.catalog__bulk-mapping {
  margin-top: 10px;
  overflow-wrap: anywhere;
}
.catalog__cell--preview {
  background: var(--serenade);
  font-weight: 600;
}
.catalog__required { color: var(--orange-dark); }
.catalog__missing {
  color: var(--orange-dark);
  background: var(--serenade);
  border: 1px dashed var(--orange);
  border-radius: 4px;
  padding: 2px 6px;
  font-size: 11px;
}
.catalog__result {
  flex: 0 0 auto;
  padding: 8px 0;
  font-size: 12px;
  max-height: 120px;
  overflow-y: auto;
}
.catalog__result ul { margin: 6px 0; }
/* Listed for the record, not openable by this reader.
 *
 * It used to be the mock's greyed row — `opacity: 0.45` over the whole `<tr>`. Dropped on purpose: the
 * dimming applied to the REGISTER DATA, so a row's CDRL number, status and title — the very columns the
 * index exists to be read down — came out fainter than the rows either side of them, to say something
 * about the file rather than about its values. The row now reads at full strength and says the one thing
 * it needs to with a padlock where the file's own glyph would go. */
.catalog__row--held { cursor: default; }
/* The prohibition sign that stands in for the file type on a row this reader cannot open.
 *
 * Red, and the only red on the screen: the row itself is no longer dimmed, so this one glyph carries the
 * whole message that the file behind it cannot be reached. `color` rather than `fill` because the sign is
 * drawn inline in the template and strokes with `currentColor` — its circle is deliberately unfilled. */
.catalog__file-icon--held {
  color: var(--colour-fg-danger, #df1b41);
}
/* A picklist value reads as a state, so it is drawn as one. */
.catalog__pill {
  display: inline-block;
  padding: 2px 9px;
  border-radius: 10px;
  background: var(--platinum, #e2e2e7);
  font-size: 12px;
  white-space: nowrap;
  /* Inside `.cell-trim`: a very long option ends in "…" inside its pill rather than being cut off flat. */
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  vertical-align: middle;
}
.catalog__sort {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  /* Take the header cell's own colour rather than the user agent's `ButtonText`. A <button> that
     resets background/border/font but not colour keeps the UA value, which is BLACK under a light
     colour scheme and WHITE under a dark one — and the app declared `color-scheme: dark light` when
     this was written, so a browser in dark mode painted every sortable column name white on the pale
     `--serenade` header
     while File and Location, which are plain text in the same row, stayed readable. `inherit` also
     follows the app's own theme, which pinning a token would not (`--colour-fg-default` itself flips
     to white in themes/dark.css). Same reason as `.catalog__chip--quiet` below. The root opt-in is
     now `color-scheme: light` (themes/theme.css), so this no longer has a dark UA palette to defend
     against — it is kept because `inherit` is still the right answer for the app's own dark theme. */
  color: inherit;
  font-weight: 600;
  text-transform: inherit;
  letter-spacing: inherit;
  cursor: pointer;
}
/* --- the shimmer that stands in for rows while a filter answers --- */
.catalog__skeleton {
  height: 14px;
  border-radius: 4px;
  background: linear-gradient(90deg, var(--platinum, #e2e2e7) 25%, var(--hero-white, #efefef) 50%, var(--platinum, #e2e2e7) 75%);
  background-size: 200% 100%;
  animation: catalog-shimmer 1.2s infinite linear;
}
@keyframes catalog-shimmer {
  from { background-position: 200% 0; }
  to { background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .catalog__skeleton { animation: none; }
}
.catalog__foot {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
  font-size: 12px;
  color: var(--colour-fg-subtle, #737373);
}
/* The funnel on every column head: quiet until its filter narrows something, orange once it does — the
 * same signal as the chips, in the same colour. */
.catalog-filter__trigger {
  display: inline-flex;
  align-items: center;
  color: var(--colour-fg-subtle, #737373);
  cursor: pointer;
}
.catalog-filter__trigger:hover { color: var(--orange); }
.catalog-filter__trigger--on { color: var(--orange); }
/* The boxes a person types a filter into — Contains, and the two ends of a date range.
 *
 * They shipped as `field__input--flat`, which is the app's BORDERLESS variant: no border, transparent
 * background. On the filter menu's white panel that is an input with nothing to see — only a grey
 * placeholder floating in space — so finding where to click was guesswork. Given the same outline as the
 * register's own search box above them, which is the other thing on this screen you type into. */
.catalog-filter__field {
  border: 1px solid var(--field-border);
  border-radius: 6px;
  background: var(--field-bg);
  padding: 6px 10px;
  color: var(--field-fg);
}
.catalog-filter__field:focus {
  outline: none;
  border-color: var(--orange);
}
.catalog-filter__preset {
  border: 1px solid var(--r-div-2, #e2e2e7);
  border-radius: 12px;
  background: transparent;
  /* Same UA `ButtonText` trap as `.catalog__sort` — and worse here, because these sit on a white
     dropdown: under a dark browser colour scheme the three date presets were white on white, i.e.
     entirely invisible rather than merely faint. */
  color: inherit;
  padding: 4px 10px;
  font-size: 12px;
  text-align: left;
  cursor: pointer;
}
.catalog-filter__preset:hover {
  border-color: var(--orange);
  background: var(--serenade);
}
.catalog__pager {
  display: flex;
  align-items: center;
  gap: 12px;
}
.catalog__page-n {
  font-variant-numeric: tabular-nums;
}
.catalog__file {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  max-width: 100%;
}
.catalog__file-icon {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
}
/* After _blocks/page/page.css above, which pulls in the shared valut-table,
   tabs and buttons blocks this one restyles within its own scope. */
/* Meeting schedule on /room — the DekkoCORE-styled list of conferences.
 *
 * The markup is the shared `.valut-table` block (also used by cloud/files, mail
 * and tenancy-manager), so nothing here may live on those class names alone.
 * Everything is nested under `.room-schedule`, a wrapper class carried only by
 * the desktop container in authenticated/room/index — restyling the shared
 * block directly would redecorate half the app.
 *
 * The shared block lays the list out with `display: table`, which cannot give a
 * row a margin, a radius or a shadow. So within this scope the table becomes a
 * grid: one track list (`--schedule-grid`) shared by the header row and every
 * card keeps the columns lined up, and each row is free to be a card.
 *
 * Colours come from the design-system tokens and the per-theme `--schedule-*`
 * set in themes/light.css and themes/dark.css — cyan brand over navy, the same
 * palette the nav panel and the auth pages use.
 */
.room-schedule {
  /* Eight tracks = the eight desktop cells in room/conference-info. The two
     phone cells that follow it are `display: none` here and take no track (see
     the `:not(.lynx-phone__cell)` guards below). Each track is a minmax so the
     list compresses toward its minimum instead of overflowing the moment the
     window narrows; below the sum of the minimums the wrapper scrolls.

     The sixth track was "transcriptions" and is now "chat" — same collection of
     conference CSVs, honestly named, since the chat log is the only thing that
     writes one now. It is narrower than the transcriptions track it replaces
     (112px -> 84px): the header word is much shorter, and the cell lost the
     help icon that sat beside the count. */
  --schedule-grid:
    minmax(200px, 2.6fr)  /* host + meeting name */
    minmax(96px, 0.9fr)   /* date */
    minmax(84px, 0.8fr)   /* time */
    minmax(80px, 0.7fr)   /* participants */
    minmax(100px, 1fr)    /* recordings */
    minmax(84px, 0.8fr)   /* chat */
    minmax(104px, 0.9fr)  /* status */
    minmax(230px, 1.6fr);
}
/* Doubled class on purpose: the production build moves this media block ahead of the base set above, and at equal
     specificity the base then won at every width, so at 1024 the action column ran off the list. Two classes win in
     any order. */
@media (max-width: 1440px) {
    .room-schedule.room-schedule {
      --schedule-grid:
        minmax(170px, 2.6fr)
        minmax(88px, 0.9fr)
        minmax(78px, 0.8fr)
        minmax(72px, 0.7fr)
        minmax(92px, 1fr)
        minmax(78px, 0.8fr)
        minmax(98px, 0.9fr)
        minmax(218px, 1.6fr);
    }
  }
/* The toolbar above the list stops 115px short of its container while the
     table runs to the scroller's 15px scrollbar gutter, so the primary CTA used
     to float 100px inside the right edge of the rows it sits over. Same gutter
     for both puts them on one line. */
.room-schedule .valut__container-stickyhead {
    box-sizing: border-box;
    width: 100%;
    padding-right: 15px;
  }
/* ---------- Filter tabs as a segmented control ---------- */
.room-schedule .valut__head-tabs {
    gap: 4px;
    padding: 4px;
    background-color: var(--schedule-segment-bg);
    border-radius: 999px;
  }
/* actions: join + cancel + edit is the widest set */
.room-schedule .valut__head-tabs .tabs__item {
    padding: 8px 18px;
    border-radius: 999px;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.04em;
    color: var(--secondary-font);
    transition: color 0.15s ease, background-color 0.15s ease;
  }
/* The shared block draws a 2px rule between adjacent tabs. Inside a pill
       track it reads as a crack down the middle of the control. */
.room-schedule .valut__head-tabs .tabs__item:after {
      display: none;
    }
.room-schedule .valut__head-tabs .tabs__item:hover {
      opacity: 1;
      color: var(--body-color);
    }
.room-schedule .valut__head-tabs .tabs__item--active {
    /* `.tabs__item--active` hard-codes `color: #fff !important`, so the raised
       pill has to answer in kind — it is white-on-white otherwise. */
    color: var(--schedule-segment-active-color) !important;
    background-color: var(--schedule-segment-active-bg);
    border-radius: 999px;
    box-shadow: var(--schedule-segment-active-shadow);
  }
/* ---------- Toolbar buttons ---------- */
.room-schedule .valut__head-menu .button {
    height: 36px;
    padding: 0 16px;
    border-radius: var(--border-radius-default);
    font-size: 14px;
    font-weight: 600;
    transition: background-color 0.15s ease, box-shadow 0.15s ease;
  }
/* Create new meeting — the one primary action on the page. Navy rather than
     the brand cyan `.button--style-5` ships: white on #00a7e7 sits near 2.7:1,
     and this button carries text only. */
.room-schedule .valut__head-menu .button--style-5 {
    background-color: var(--colour-brand-dark);
    color: var(--white);
  }
.room-schedule .valut__head-menu .button--style-5:hover {
      background-color: var(--schedule-primary-hover-bg);
    }
.room-schedule .valut__head-menu .button--style-5:disabled {
      opacity: 0.45;
      box-shadow: none;
    }
/* Recording Player — a secondary utility, so an outline instead of the solid
     black `.button--style-6` fill. */
.room-schedule .valut__head-menu .button--style-6 {
    background-color: transparent;
    border: 1px solid var(--schedule-border-strong);
    color: var(--body-color);
    font-weight: 600;
  }
.room-schedule .valut__head-menu .button--style-6:hover {
      background-color: var(--schedule-segment-bg);
      box-shadow: none;
    }
/* `--is-empty` switches the same element to a centring flex box for the
     blank slate; leave that one alone. */
.room-schedule .valut-table:not(.valut-table--is-empty) {
    display: block;
  }
/* ---------- Table -> grid ---------- */
.room-schedule .valut-table__head,
  .room-schedule .valut-table__item {
    display: grid;
    grid-template-columns: var(--schedule-grid);
    align-items: center;
    column-gap: 12px;
  }
/* ---------- Column labels ---------- */
.room-schedule .valut-table__head {
    position: sticky;
    top: 0;
    z-index: 3;
    padding: 0 18px 10px;
    background-color: var(--body-bg);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--schedule-label-color);
  }
/* The shared block pins each header cell individually and paints it with
       the table-cell background. Pinning the row instead lets the labels sit on
       the page background with no seams between them. */
.room-schedule .valut-table__head .valut-table__cell {
      position: static;
      display: flex;
      align-items: center;
      padding: 0;
      border: 0;
      background-color: transparent;
    }
.room-schedule .valut-table__head .valut-table__cell--events {
      padding-left: 0;
      justify-content: flex-end;
    }
/* ---------- Rows as cards ---------- */
.room-schedule .valut-table__item {
    margin-bottom: 8px;
    padding: 14px 18px;
    background-color: var(--schedule-card-bg);
    border: 1px solid var(--schedule-card-border);
    border-radius: var(--border-radius-rounder);
    box-shadow: var(--schedule-card-shadow);
    transition: border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease;
  }
/* The card owns the border and the padding now, so the cells inside it are
       plain boxes. `min-width: 0` is what lets `.text-ellipsis` keep working:
       a grid item's automatic minimum size is its content, so without this the
       meeting name pushes its track wider instead of truncating. */
.room-schedule .valut-table__item .valut-table__cell:not(.lynx-phone__cell) {
      display: flex;
      align-items: center;
      min-width: 0;
      padding: 0;
      border: 0;
    }
.room-schedule .valut-table__item:hover {
      border-color: var(--colour-brand);
      box-shadow: var(--schedule-card-hover-shadow);
      transform: translateY(-1px);
    }
/* Hover in the shared block moves the accent onto the cell borders, which no
     longer exist. Neutralise it so it cannot fight the card's own border. */
.room-schedule .valut-table__item:hover .valut-table__cell:not(.lynx-phone__cell) {
    border-color: transparent;
  }
/* Selected row — the conference sidebar is open on this meeting. */
.room-schedule .valut-table__item--is-active {
    background-color: var(--schedule-card-active-bg);
    border-color: var(--colour-brand);
    box-shadow: var(--schedule-card-hover-shadow);
  }
/* A spacer row that existed to give the table bottom padding; the wrapper
     below does that job now, and as a grid row it drew an empty card. */
.room-schedule .valut-table__item--is-empty {
    display: none;
  }
.room-schedule .valut-table__wrapper {
    padding: 0 15px 24px 0;
  }
/* Host + meeting name. */
.room-schedule .valut-table__item .valut-table__cell:nth-child(1) .user-info__name {
      font-size: 15px;
      font-weight: 600;
      color: var(--body-color);
    }
.room-schedule .valut-table__item .valut-table__cell:nth-child(1) .user-info__dscr {
      font-size: 12px;
      color: var(--secondary-font);
    }
/* Date — a tinted chip, so the eye can run down the column and find a day
     without reading every row. */
.room-schedule .valut-table__item .valut-table__cell:nth-child(2) .valut-table__date {
    min-width: 0;
    padding: 4px 10px;
    background-color: var(--schedule-chip-bg);
    color: var(--schedule-chip-color);
    border-radius: 999px;
    font-size: 13px;
    font-weight: 600;
    white-space: nowrap;
  }
/* Time — tabular figures so the colons line up down the column. */
.room-schedule .valut-table__item .valut-table__cell:nth-child(3) .valut-table__date {
    min-width: 0;
    font-size: 14px;
    font-weight: 500;
    font-variant-numeric: tabular-nums;
    color: var(--body-color);
  }
/* Participant count — a badge rather than a bare numeral, which at 15px in an
     otherwise empty cell read as a stray character. */
.room-schedule .valut-table__item .valut-table__cell:nth-child(4) .valut-table__date {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    min-width: 28px;
    height: 24px;
    padding: 0 8px;
    background-color: var(--schedule-segment-bg);
    border-radius: 999px;
    font-size: 13px;
    font-weight: 600;
    color: var(--body-color);
  }
/* Recordings + chat: a count and a "show" link, or nothing at all for most
     meetings. Both cells are the same shape, so both share these two rules. */
.room-schedule .valut-table__item .valut-table__cell:nth-child(5) .valut-table__date,
  .room-schedule .valut-table__item .valut-table__cell:nth-child(6) .valut-table__date {
    display: inline-flex;
    align-items: center;
    min-width: 0;
    font-size: 13px;
    font-weight: 500;
    color: var(--secondary-font);
  }
/* ---------- Cell contents ---------- */
.room-schedule .valut-table__item .valut-table__cell:nth-child(5) .link,
  .room-schedule .valut-table__item .valut-table__cell:nth-child(6) .link {
    font-size: 12px;
    font-weight: 600;
    text-decoration: none;
    /* Themed: the navy this uses in light mode disappears on a dark card. */
    color: var(--schedule-link-color);
  }
.room-schedule .valut-table__item .valut-table__cell:nth-child(5) .link:hover, .room-schedule .valut-table__item .valut-table__cell:nth-child(6) .link:hover {
      text-decoration: underline;
    }
/* Soft tints instead of the saturated solid fills the shared `.tag` block
     ships: eight of these stacked down a list is a lot of colour for a field
     that is only ever one of three words. The label tokens are the pairs the
     design system already validates for contrast. */
.room-schedule .valut-table__item .tag {
    padding: 5px 12px;
    border-radius: 999px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.02em;
  }
/* ---------- Status ---------- */
.room-schedule .valut-table__item .tag--color-3 {
    background-color: var(--colour-label-attention-bg);
    color: var(--colour-label-attention-fg);
  }
.room-schedule .valut-table__item .tag--color-5 {
    background-color: var(--colour-label-success-bg);
    color: var(--colour-label-success-fg);
  }
.room-schedule .valut-table__item .tag--color-9 {
    background-color: var(--colour-label-danger-bg);
    color: var(--colour-label-danger-fg);
  }
/* The last desktop cell — 8th, and the two phone cells after it are
     display:none at this width. Keyed by position, so it moves with the column
     count: this rule and the two above are what a column added or removed here
     has to be checked against. */
.room-schedule .valut-table__item .valut-table__cell:nth-child(8) {
    justify-content: flex-end;
    gap: 8px;
  }
/* ---------- Row actions ---------- */
.room-schedule .valut-table__item .button {
    height: 32px;
    /* The shared block sets `min-width: 110px`, sized for standalone dialog
       buttons. Three of them in one cell demand 346px, which is more than the
       actions track carries — they overflowed leftwards and painted over the
       status pill, so "accepted" read as "Acce". These labels are one short word
       each; let them size to it. */
    min-width: auto;
    padding: 0 14px;
    border-radius: var(--border-radius-default);
    font-size: 13px;
    font-weight: 600;
    white-space: nowrap;
    transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
  }
.room-schedule .valut-table__item .button:disabled {
      opacity: 0.45;
      cursor: not-allowed;
      box-shadow: none;
    }
/* Join / Start / Accept — the row's primary action. */
.room-schedule .valut-table__item .button--style-2 {
    background-color: var(--colour-brand-dark);
    border-color: var(--colour-brand-dark);
    color: var(--white);
  }
.room-schedule .valut-table__item .button--style-2:hover:not(:disabled) {
      background-color: var(--schedule-primary-hover-bg);
      border-color: var(--schedule-primary-hover-bg);
    }
/* Cancel / Decline — outlined while at rest, since neither is the action the
     row is inviting; the consequence only shows up on hover. */
.room-schedule .valut-table__item .button--style-3 {
    background-color: transparent;
    border: 1px solid var(--schedule-border-strong);
    color: var(--body-color);
  }
.room-schedule .valut-table__item .button--style-3:hover:not(:disabled) {
      background-color: var(--colour-label-danger-bg);
      border-color: var(--colour-danger-4);
      color: var(--colour-label-danger-fg);
    }
/* Edit — a third solid fill in one cell is noise, so this one is a quiet
     tinted button rather than the brand cyan `.button--style-5`. */
.room-schedule .valut-table__item .button--style-5 {
    background-color: var(--schedule-segment-bg);
    color: var(--body-color);
  }
.room-schedule .valut-table__item .button--style-5:hover {
      background-color: var(--schedule-border-strong);
      box-shadow: none;
    }
/* ---------- Blank slate ---------- */
.room-schedule .valut-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 14px;
  }
/* The icon carries `.fill-graphite`, a literal #4e4e4e that all but
       disappears against the dark theme's page background. */
.room-schedule .valut-empty .valut-empty__icon {
      fill: var(--secondary-font);
      opacity: 0.55;
    }
.room-schedule .valut-empty .valut-empty__title {
      margin: 0;
      font-size: 16px;
      font-weight: 600;
      color: var(--secondary-font);
    }
/* Conference sidebar on /room — the 800px flyout behind "Create new meeting",
 * and the Meeting info / Attendees / chat / transcription tabs that share its
 * chrome.
 *
 * Same containment rule as _blocks/room-schedule: the markup is built from
 * shared blocks (`container__sidebar`, `file-tabs`, `sign__form-*`, `accordion`,
 * `file-sharing`, `user-details`, `field`), all of which are used by the file,
 * mail and invite sidebars too. So everything is nested under
 * `.conference-panel`, a wrapper class carried only by the conference sidebar in
 * authenticated/room/template.hbs.
 *
 * Two levels of scope on purpose:
 *   .conference-panel                      -> panel chrome: surface, close
 *                                             button, tab bar, footer buttons.
 *                                             Every tab of the sidebar gets it.
 *   .conference-panel .conference__content -> the create/edit meeting form.
 *                                             Only sidebars/confe-rence/new
 *                                             renders that class, so the Meeting
 *                                             info tab (valut-filedata__*) is
 *                                             untouched by these rules.
 */
.conference-panel {
  /* The panel slides in from the right edge, so only the left corners are ever
     visible. The shared block rounds the top-left alone. */
  padding: 20px 32px 28px;
  border-radius: 16px 0 0 16px;
  box-shadow: var(--panel-shadow);
}
@media (max-width: 900px) {
.conference-panel {
    padding: 20px;
    border-radius: 0
}
  }
/* The shared block right-aligns a bare glyph with `text-align: right`. A
     32px box plus `margin-left: auto` puts it in the same corner as a target
     big enough to hit, and gives it somewhere to show hover. */
.conference-panel .container__sidebar-close:not(.container__sidebar-close--chat) {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    margin-left: auto;
    border-radius: 50%;
    color: var(--body-color);
    font-size: 14px;
    transition: background-color 0.15s ease, color 0.15s ease;
  }
.conference-panel .container__sidebar-close:not(.container__sidebar-close--chat):hover {
      background-color: var(--panel-tint);
    }
/* ---------- Tab bar ---------- */
.conference-panel .file-tabs {
    padding: 0;
    margin-top: 2px;
    /* A solid #707070 rule under the tabs is the heaviest line in the panel. */
    border-bottom: 1px solid var(--panel-hairline);
  }
/* ---------- Close button ---------- */
.conference-panel .file-tabs__item {
    flex: 0 0 auto;
    padding: 8px 0 12px;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--panel-label-color);
  }
.conference-panel .file-tabs__item:first-child {
      margin-right: 28px;
      padding-right: 0;
    }
.conference-panel .file-tabs__item:hover {
      color: var(--body-color);
    }
.conference-panel .file-tabs__item--active {
    color: var(--body-color);
  }
/* The shared block marks the active tab with a 7px slab of #4e4e4e floating
       15px below it. A 2px brand rule sitting on the bar's own border is the
       same signal without the weight. */
.conference-panel .file-tabs__item--active:after {
      bottom: -1px;
      height: 2px;
      background-color: var(--colour-brand);
      border-radius: 2px 2px 0 0;
    }
/* New meeting / Edit meeting renders a single, non-clickable item — that is a
     panel heading, not a tab. */
.conference-panel .file-tabs__item:only-child {
    flex: 1 1;
    padding: 4px 0 14px;
    font-size: 18px;
    font-weight: 700;
    letter-spacing: 0;
    text-transform: none;
    color: var(--body-color);
    cursor: default;
  }
.conference-panel .file-tabs__item:only-child:hover {
      color: var(--body-color);
    }
/* Title above the chat and transcription panels. */
.conference-panel .room__chat-title {
    font-size: 18px;
    font-weight: 700;
    color: var(--body-color);
  }
/* ---------- Create / edit meeting form ---------- */
.conference-panel .conference__content {
    padding-top: 4px;
  }
.conference-panel .conference__content .sign__form-field:not(:last-child) {
    margin-bottom: 22px;
  }
.conference-panel .conference__content .sign__form-input,
  .conference-panel .conference__content .field__input {
    box-sizing: border-box;
    width: 100%;
    /* `.field__input` ships a 15px top margin, which pushed the input out from
       under its own notched label and left the label floating in space. */
    margin-top: 0;
    padding: 12px 14px;
    border: 1px solid var(--panel-field-border);
    border-radius: var(--border-radius-default);
    /* Background AND colour are both pinned per theme, deliberately. container.css
       pins an explicit white here because an input that declares neither inherits
       Chrome's dark user-agent styling and renders dark text on a dark box — the
       typed meeting name became invisible. Declaring both keeps that fixed while
       letting the dark theme have a dark field instead of a white one. */
    background-color: var(--panel-field-bg);
    color: var(--panel-field-color);
    font-size: 14px;
    line-height: 1.4;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
  }
.conference-panel .conference__content .sign__form-input::placeholder, .conference-panel .conference__content .field__input::placeholder {
      color: var(--panel-label-color);
      font-style: normal;
      font-size: 13px;
    }
.conference-panel .conference__content .sign__form-input:focus, .conference-panel .conference__content .field__input:focus {
      outline: none;
      border-color: var(--colour-brand);
      box-shadow: 0 0 0 3px var(--panel-focus-ring);
    }
.conference-panel .conference__content .sign__form-input:disabled, .conference-panel .conference__content .field__input:disabled {
      background-color: var(--panel-field-disabled-bg);
      color: var(--secondary-font);
      cursor: not-allowed;
    }
/* Notched label sitting over the top edge of its field. Its background has to
     match the panel behind the input, not the input itself — the shared block
     hard-codes #fff and #000, which is a white chip on the dark theme's panel. */
.conference-panel .conference__content .sign__form-label {
    left: 12px;
    top: -8px;
    padding: 0 6px;
    background-color: var(--panel-surface);
    color: var(--panel-label-color);
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
  }
.conference-panel .conference__content .invalid-feedback {
    margin-top: 6px;
    font-size: 12px;
    color: var(--colour-fg-danger);
  }
/* The shared accordion draws a #4e4e4e filled bar with a black border for its
     title. In a form panel that section heading only has to label the group. */
.conference-panel .conference__content .accordion__item,
  .conference-panel .conference__content .accordion__item--is-opened {
    background-color: transparent;
    border: 0;
    border-radius: 0;
  }
/* ---------- Participants ---------- */
.conference-panel .conference__content .accordion__item-title {
    margin-bottom: 0;
    padding: 0 0 10px;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--panel-label-color);
    cursor: default;
  }
.conference-panel .conference__content .accordion__item-content {
    padding: 16px;
    border: 1px solid var(--panel-hairline);
    border-radius: var(--border-radius-rounder);
  }
/* "Registered / Unregistered Participants:" — utility-classed in the template
     (`font-bold font-14`); matched here rather than in the template so the two
     sub-headings match the section label above them. */
.conference-panel .conference__content .accordion__item-content .font-bold {
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--panel-label-color);
  }
.conference-panel .conference__content .file-sharing__add {
    padding: 0 0 4px;
  }
.conference-panel .conference__content .field--style-2 .field__label {
    font-size: 12px;
    font-weight: 500;
    line-height: 1.4;
    color: var(--panel-label-color);
  }
/* The typeahead trigger is its own element — `.field__input--flat` wraps a real
     input, and the border lives on the inner one. */
.conference-panel .conference__content .field__input--flat input {
    box-sizing: border-box;
    width: 100%;
    margin-top: 8px;
    padding: 11px 13px;
    border: 1px solid var(--panel-field-border);
    border-radius: var(--border-radius-default);
    background-color: var(--panel-field-bg);
    color: var(--panel-field-color);
    font-size: 14px;
  }
.conference-panel .conference__content .field__input--flat input::placeholder {
      font-style: normal;
      font-size: 13px;
      color: var(--panel-label-color);
      opacity: 1;
    }
.conference-panel .conference__content .field__input--flat input:focus {
      border: 1px solid var(--colour-brand);
      box-shadow: 0 0 0 3px var(--panel-focus-ring);
    }
.conference-panel .conference__content .file-sharing__members {
    gap: 6px;
    max-height: 132px;
    margin-top: 8px;
    font-size: 12px;
    color: var(--secondary-font);
  }
/* Attendees as chips. */
.conference-panel .conference__content .user-details__conference {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    padding: 5px 10px 5px 12px;
    background-color: var(--panel-chip-bg);
    border: 1px solid var(--panel-chip-border);
    border-radius: 999px;
    font-size: 12px;
    color: var(--body-color);
  }
/* The template puts the remove glyph before the name; on a chip it belongs
       after it. */
.conference-panel .conference__content .user-details__conference .icon-close {
      order: 2;
      color: var(--secondary-font);
      transition: color 0.15s ease;
    }
.conference-panel .conference__content .user-details__conference .icon-close:hover {
        color: var(--colour-fg-danger);
      }
.conference-panel .conference__content .accordion__item-content > p {
    margin-bottom: 0;
    font-size: 12px;
    line-height: 1.5;
    color: var(--secondary-font);
  }
/* ---------- Footer ---------- */
.conference-panel .container__sidebar-column--buttons {
    padding: 0 10px;
  }
.conference-panel .container__sidebar-column--buttons .button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    height: 42px;
    min-width: 0;
    padding: 0 18px;
    border-radius: var(--border-radius-default);
    font-size: 14px;
    font-weight: 700;
    letter-spacing: 0.02em;
    transition: background-color 0.15s ease, box-shadow 0.15s ease;
  }
.conference-panel .container__sidebar-column--buttons .button:disabled {
      opacity: 0.5;
      cursor: not-allowed;
      box-shadow: none;
    }
/* Send / update — the panel's primary action. Navy for the same reason the
     schedule's is: white on the brand cyan sits near 2.7:1. */
.conference-panel .container__sidebar-column--buttons .button--style-5 {
    background-color: var(--colour-brand-dark);
    color: var(--white);
  }
.conference-panel .container__sidebar-column--buttons .button--style-5:hover:not(:disabled) {
      background-color: var(--panel-primary-hover-bg);
    }
/* Send via 365 keeps the Office colour — it identifies the destination. */
.conference-panel .container__sidebar-column--buttons .button--style-10 {
    font-size: 13px;
  }
/* These two tabs dock beside the call rather than covering it, so the panel is
     full-bleed: `.container__sidebar--is-chat` zeroes the padding and radius that
     the form tabs use, and the chat lays out its own. */
.conference-panel .room__chat-title {
    padding: 18px 20px 14px;
    text-align: left;
    border-bottom: 1px solid var(--panel-hairline);
  }
/* ---------- Group chat / transcription ---------- */
.conference-panel .container__sidebar-close--chat {
    display: flex;
    align-items: center;
    justify-content: center;
    top: 14px;
    right: 14px;
    width: 30px;
    height: 30px;
    border-radius: 50%;
    color: var(--body-color);
    font-size: 13px;
  }
.conference-panel .container__sidebar-close--chat:hover {
      background-color: var(--panel-tint);
    }
.conference-panel .room__chat-container {
    display: flex;
    flex-direction: column;
    gap: 16px;
    padding: 18px 20px;
  }
/* One message. The shared .dialog block spaces messages with a 28px bottom
     margin; the column gap above does that job here. */
.conference-panel .room__chat-container .dialog__msg {
    display: flex;
    flex-direction: column;
  }
.conference-panel .room__chat-container .dialog__msg:not(:last-child) {
      margin-bottom: 0;
    }
/* Sender line — avatar, name, time. Was a 32px avatar over a 16px gap for every
     single message, which in a 400px column left more chrome than conversation. */
.conference-panel .room__chat-container .dialog__head {
    align-items: center;
    gap: 8px;
    min-height: 0;
    margin-bottom: 5px;
  }
.conference-panel .room__chat-container .dialog-img {
    width: 22px;
    height: 22px;
    border: 0;
    box-shadow: 0 0 0 1px var(--panel-hairline);
  }
.conference-panel .room__chat-container .dialog-name {
    font-size: 12px;
    font-weight: 600;
    color: var(--body-color);
  }
.conference-panel .room__chat-container .dialog__status-text {
    font-size: 11px;
    font-weight: 500;
    color: var(--panel-label-color);
    font-variant-numeric: tabular-nums;
  }
.conference-panel .room__chat-container .dialog__body {
    max-width: 88%;
  }
.conference-panel .room__chat-container .dialog__text {
    /* 32px of right padding used to be reserved on every bubble. */
    padding: 8px 12px;
    font-size: 13px;
    line-height: 1.5;
    border-radius: 12px;
  }
/* Received. */
.conference-panel .room__chat-container .dialog__msg--to .dialog__body {
      padding-left: 30px;
    }
.conference-panel .room__chat-container .dialog__msg--to .dialog__text {
      background-color: var(--panel-tint);
      color: var(--body-color);
      border-radius: 4px 12px 12px 12px;
    }
/* Sent — navy, matching the panel's own primary action. */
.conference-panel .room__chat-container .dialog__msg--from .dialog__body {
      padding-right: 30px;
    }
.conference-panel .room__chat-container .dialog__msg--from .dialog__text {
      background-color: var(--colour-brand-dark);
      color: var(--white);
      border-radius: 12px 4px 12px 12px;
    }
.conference-panel .room__chat-footer {
    /* The shared rule sets `width: 100%`; without border-box the padding added
       here is stacked on top of that and the composer overhangs the panel. */
    box-sizing: border-box;
    padding: 12px 16px 16px;
    border-top: 1px solid var(--panel-hairline);
  }
.conference-panel .room__chat-footer textarea {
      box-sizing: border-box;
      width: 100%;
      padding: 11px 13px;
      border: 1px solid var(--panel-field-border);
      border-radius: var(--border-radius-default);
      box-shadow: none;
      background-color: var(--panel-field-bg);
      color: var(--panel-field-color);
      font-size: 13px;
      line-height: 1.4;
      resize: none;
    }
.conference-panel .room__chat-footer textarea::placeholder {
        font-size: 13px;
        font-style: normal;
        color: var(--panel-label-color);
      }
.conference-panel .room__chat-footer textarea:focus {
        outline: none;
        border-color: var(--colour-brand);
        box-shadow: 0 0 0 3px var(--panel-focus-ring);
      }
/* After _blocks/sysadmin (via page.css) — tenancy-admin builds on that block. */
/* Tenancy manager (Settings → Tenancy management): users, hubs, traffic, audit
 * logs, policies, integrations.
 *
 * Deliberately built on the `sysadmin` block rather than duplicating it. That
 * block is the newer DekkoCORE admin styling — nav, page head, card, toolbar,
 * table, badges, switches — and the two admin areas are meant to look like one
 * product, so the tenancy pages reuse those classes directly. Only what the
 * tenancy manager has and system admin does not lives here: the nav's back link
 * and tenant switcher, the grouped policy form, and the save bar that form
 * needs.
 *
 * (The `sysadmin` name is now doing double duty. Renaming it to something
 * neutral would be tidier, but it would touch every system-management template
 * for no visual gain, so it is left alone.)
 */
/* ---- Page frame ---- */
/* The tenancy pages come in two shapes, and the difference is what stops a long
 * table pushing its pagination row off the bottom of the window.
 *
 *   Fill  — users, hubs, audit logs. The card is sized to the viewport and the
 *           TABLE scrolls inside it, so the toolbar and the pagination row stay
 *           put no matter how many rows load.
 *   Tail  — policies, integrations, traffic. Long forms and charts; the page
 *           scrolls normally and the wrapper just carries bottom clearance.
 *
 * Both need `.sysadmin__main` to be a column. `.sysadmin` is `align-items:
 * flex-start`, so main has to claim `align-self: stretch` to inherit the
 * viewport height that `.container--tenancy` (`display: flex; height: 100vh;
 * max-height: 100vh`, container.css) already gives `.sysadmin` — without it
 * main is content-height and a percentage height inside resolves to auto.
 *
 * Bottom clearance sits on the wrapper, never on main: main is a box that the
 * tail pages' content deliberately overflows, and padding on an overflowed box
 * lands mid-scroll rather than after the content. Nothing else in the chain
 * offers any — `.sysadmin` is `padding: 24px 24px 0`, and `.container`'s
 * `padding: 180px 0 40px 40px` is replaced wholesale by `.p-header`'s
 * `padding: 60px 0 0 0`. */
.tenancy-admin .sysadmin__main {
    align-self: stretch;
    display: flex;
    flex-direction: column;
    min-height: 0;

    /* Scrolling happens HERE, not on the page, which is what keeps the left nav
       on screen. Previously the tail pages overflowed `.container` and the whole
       shell — nav included — scrolled away, and the nav could not simply be made
       `position: sticky` instead: a sticky element is confined to its containing
       block, and `.sysadmin` is a flex item of `.container--tenancy`
       (`display: flex; height: 100vh`) so it is pinned at viewport height while
       its content runs well past that. The nav would have unstuck as soon as you
       scrolled beyond one screen. Giving main its own scrollport makes the shell
       fixed-height for every page instead, so the nav never moves at all. */
    overflow-y: auto;

    /* Keeps content clear of the scrollbar this element now owns. */
    padding-right: 12px;
}
/* The header is a sibling of the card in the same column; without this its
   default `flex-shrink: 1` lets it be squeezed when the card wants the room. */
.tenancy-admin .sysadmin__page-head {
    flex: 0 0 auto;
}
/* ---- Tail pages: the page scrolls ---- */
/* `flex: 0 0 auto` matters: main is a column with `min-height: 0`, so a content
   box taller than it would otherwise be SHRUNK to fit and the form squashed,
   instead of overflowing and letting the container scroll. */
.tenancy-admin__policies,
.tenancy-admin__integrations,
.tenancy-admin__tail {
    flex: 0 0 auto;
    padding-bottom: 32px;
}
/* The policy cards otherwise sit hard against the scrollbar. */
.tenancy-admin__policies {
    padding-right: 12px;
}
/* ---- Fill pages: the table scrolls ---- */
/* An intermediate wrapper between main and the card (users has one) has to pass
   the height through rather than collapse to its content. */
.tenancy-admin__page--fill {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
}
.tenancy-admin__card--fill {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
    margin-bottom: 32px;
}
/* The Users page puts a SECOND card under the filling one — "In fusion HUBs only" — and the fill model
   above was written for a page with exactly one.
 
   What went wrong: `--page-fill` is a flex column locked to the viewport's height, and
   `.tenancy-admin__group` carries `overflow: hidden` for its 14px corners. Per the flexbox spec an item
   whose overflow is not `visible` has an automatic minimum size of ZERO, so that card was free to be
   shrunk — 471px of content squeezed into 205px, with the remainder clipped by the very `overflow: hidden`
   that allowed the squeeze. And because it was clipped rather than overflowing, `.sysadmin__main`'s
   `overflow-y: auto` had nothing to scroll: the page ended at the fold with a third of a table cut off and
   no way to reach the rest.
 
   So both halves are needed. The second card keeps its own height, and the first gets a floor so it cannot
   be crushed to a stub in exchange — together they exceed the column, which is what finally gives
   `.sysadmin__main` something to scroll. Scoped to a direct child so the single-card pages, which want the
   viewport-tall table with its own inner scroll, are untouched. */
.tenancy-admin__page--fill > .tenancy-admin__group {
    flex-shrink: 0;
}
/* A floor under the last card. Scrolled to the bottom, the fusion-only card's rounded edge met the
   end of the scroll box exactly — the removal note read as clipped rather than as finished. The card
   above never showed it: its own 32px is the gap BETWEEN the two cards, and nothing held the second
   one off the floor.

   `::after` rather than the obvious `margin-bottom: 32px` on the card, which was tried first and does
   nothing at all. This wrapper is a height-locked flex column (see above) and the card overflows it;
   a bottom margin on a box that is already overflowing its container is not part of that container's
   scrollable overflow, so `.sysadmin__main`'s scrollHeight did not move — measured identical, 1159px,
   with the margin on and off. A real flex item does count: 1159 → 1191, and 32px of daylight under the
   card. Padding inside the card grows the scroll the same way but keeps the border on the floor, which
   is the half of the problem that shows.

   Scoped to `--page--fill`, which is the Users page alone; every other tenancy-admin page sizes to its
   content and has never needed this. */
.tenancy-admin__page--fill::after {
    content: "";
    display: block;
    flex: 0 0 32px;
}
/* Roughly the height of the toolbar, four rows and the pager: enough that the users table is still a table
   when a long fusion-only list is sharing the page with it. Below this the page scrolls instead. */
.tenancy-admin__page--fill > .tenancy-admin__card--fill {
    min-height: 460px;
}
/* The scroll box has to be a wrapper around the table, not the table itself.
   `.dekko-table` is `display: table` (design-system/components/table.css) and a
   table box cannot be a scroll container — `overflow-y: auto` on it computes
   straight back to `visible`, the rows overflow the card, and `.sysadmin__card`
   (`overflow: hidden`) then clips them away unreachable.
   `min-height: 0` matters too: a flex item's default `min-height: auto` floors
   it at its content height, so the wrapper would grow the card instead of
   scrolling inside it. */
.tenancy-admin__tablewrap {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
}
.tenancy-admin__card--fill > .tenancy-admin__toolbar,
.tenancy-admin__card--fill > .tenancy-admin__foot {
    flex: 0 0 auto;
}
/* Empty state fills the card rather than leaving it a squat box. */
.tenancy-admin__card--fill > .blank-slate {
    flex: 1 1 auto;
}
/* Column headers survive the body scrolling under them. Applied to the cells
   rather than the `__head` row: sticky on a `display: table-row` box is far
   less consistently honoured than on the cells themselves. They already carry
   an opaque background from the table restyle below, which they need — the
   rows scroll directly beneath them. */
.tenancy-admin__tablewrap .dekko-table__head .dekko-table__cell {
    position: sticky;
    top: 0;
    z-index: 2;
}
/* Breathing room for an empty table. Unpadded it hugs the toolbar above and the
   card edge below, which is what made the empty audit log look lopsided. */
.tenancy-admin .blank-slate {
    padding: 48px 24px;
}
/* Single-line nav items. System admin's carry a subtitle; these do not, so the
   icon is centred against one line of text rather than aligned to its top. */
.tenancy-admin .sysadmin__nav-item {
    align-items: center;
}
/* ---- Nav header, and the grouped-form section card ---- */
/* Both moved into the `sysadmin` block when the settings shells adopted them:
   `sysadmin__nav-head` / `__back` / `__switcher` for the nav header, and
   `sysadmin__group*` / `__row` / `__fields` for the section card. The
   `tenancy-admin__*` names are kept there as aliases on the same rules rather
   than renamed across 75 call sites in three templates, for no visual change.
   Only the tenancy-only pieces stay below. */
/* Integrations: the enable toggle belongs on the section header, at the far end. */
.tenancy-admin__group-action {
    margin-left: auto;
}
/* A save bar that belongs to one card rather than the page: no sticky, no rule. */
.tenancy-admin__savebar--inline {
    position: static;
    margin-top: 0;
    border: 0;
    border-top: 1px solid #eef1f6;
    border-radius: 0;
    background: #fbfcfe;
    backdrop-filter: none;
}
/* ---- Traffic ---- */
/* The "Traffic distribution" toggle sits at the far end of a section head. */
.traffic-section__toggle {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 7px 12px;
    border: 1px solid #cdd5e2;
    border-radius: 9px;
    background: #fff;
    color: #3a4763;
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
}
.traffic-section__toggle:hover {
    background: #f6f8fc;
    border-color: #c7d2e6;
}
.traffic-section__toggle--active {
    background: #eef3fe;
    border-color: #b9cdf7;
    color: #2f6fed;
}
.traffic-section__toggle-arrow {
    font-size: 10px;
    line-height: 1;
}
/* The expanded panel: distribution left, scatter right, divided from the charts
   it expands rather than floating below them. */
.traffic-distribution {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 24px;
    padding: 18px 22px 22px;
    border-top: 1px solid #eef1f6;
    background: #fbfcfe;
}
/* The height cap is the whole point of folding the tail into "Other": a tenancy
   with eighty hubs opens the same amount of page as one with four. */
.traffic-figure--fixed .highcharts-wrapper,
.traffic-figure--fixed .chart-container {
    /* Eleven bars on the left, and on the right a legend that wraps to two or
       three rows before the plot starts — 360 leaves both a readable plot area
       without letting the panel grow with the tenancy. */
    height: 360px;
    min-height: 360px;
}
@media (max-width: 1100px) {
    .traffic-distribution {
        grid-template-columns: minmax(0, 1fr);
    }
}
/* The charts are full-bleed inside their card. `.setting__form` caps itself at
   900px; the old markup lifted that with `.tenancy__content .traffic__form
   { max-width: 100% }`, and that selector stopped matching when the page
   dropped the `tenancy__content` wrapper, so the cap came back and the charts
   rendered narrow. Restored here, without the 1160px ceiling the old rule also
   imposed on `.highcharts-wrapper`. */
.tenancy-admin .traffic__form,
.tenancy-admin .traffic__form .setting__form-line,
.tenancy-admin .traffic__form .highcharts-wrapper,
.tenancy-admin .traffic__form .chart-container {
    width: 100%;
    max-width: none;
}
/* ---- Listing pages: users, hubs, audit logs, traffic ---- */
/* The toolbar above a table: search, filter dropdowns, actions. Sits inside the
   card so the controls and the rows they filter read as one object. */
.tenancy-admin__toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    padding: 14px 18px;
    border-bottom: 1px solid #eef1f6;
}
/* Pushes everything after it to the right-hand end of the toolbar. */
.tenancy-admin__toolbar-gap {
    margin-left: auto;
}
/* These four pages use the shared `dekko-table` block, and only these four do —
   nothing else in the app renders one. Restyled in place rather than rewritten
   as markup: the rows carry the data-test hooks the specs select on, and the
   cells are built from live records. Scoped under .tenancy-admin regardless, so
   the design-system default is untouched if anything else ever adopts it. */
.tenancy-admin .dekko-table {
    border-collapse: collapse;
}
.tenancy-admin .dekko-table .dekko-table__head .dekko-table__cell {
        padding: 12px 18px;
        font-size: 11px;
        font-weight: 700;
        letter-spacing: 0.04em;
        color: #8a93a6;
        background: #f8fafd;
        border-bottom: 1px solid #eef1f6;
        white-space: nowrap;
    }
.tenancy-admin .dekko-table .dekko-table__cell {
        padding: 13px 18px;
        font-size: 13.5px;
        color: #1c205c;
        border-bottom: 1px solid #f1f4f9;
    }
.tenancy-admin .dekko-table .dekko-table__item:hover .dekko-table__cell {
        background: #f9fbfe;
    }
.tenancy-admin .dekko-table .dekko-table__item:last-child .dekko-table__cell {
        border-bottom: 0;
    }
/* The name/email pair in a user row. */
.tenancy-admin .user-card__name {
    font-size: 13.5px;
    font-weight: 600;
    color: #1c205c;
}
.tenancy-admin .user-card__email {
    font-size: 12.5px;
    color: #6b7488;
    margin-top: 1px;
}
/* Marks a group the server created for one person, in the list where those sit beside the ones an
   administrator made. Quiet on purpose: it is a fact about the row, not a warning, and the eye should
   still land on the name first. */
.tenancy-admin__grouptag {
    display: inline-block;
    margin-left: var(--spacer-2);
    padding: 1px 7px;
    border-radius: var(--r-r-pill);
    background: #eef0f5;
    color: #6b7488;
    font-size: 11px;
    font-weight: 600;
    line-height: 16px;
    vertical-align: middle;
}
/* Result count and pagination, below the table but inside the card. */
.tenancy-admin__foot {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 12px 18px;
    border-top: 1px solid #eef1f6;
    font-size: 13px;
    color: #8a93a6;
}
/* PaginationList is a classic component whose own `classNames` are
   `flex-group center-horizontal` — it renders no `paginator` class, so it has
   to be selected by those. Nothing else inside the foot is a flex-group.
   `center-horizontal` is `margin: 0 auto`; the right margin has to go too, or
   the pager centres itself in the leftover space instead of sitting flush. */
.tenancy-admin__foot .flex-group {
    margin-left: auto;
    margin-right: 0;
    margin-bottom: 0;
}
/* ---- Save bar ---- */
/* Pinned, because a policy form this long otherwise hides its own save button
   thousands of pixels below whichever control you just changed. */
.tenancy-admin__savebar {
    position: sticky;
    bottom: 0;
    z-index: 20;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 14px;
    margin-top: 20px;
    padding: 14px 22px;
    background: rgba(255, 255, 255, 0.94);
    backdrop-filter: blur(6px);
    border: 1px solid #e3e8f0;
    border-radius: 14px 14px 0 0;
    border-bottom: 0;
}
.tenancy-admin__savebar-state {
    font-size: 13px;
    color: #8a93a6;
    margin-right: auto;
}
.tenancy-admin__savebar-state--dirty {
    color: #b26a00;
    font-weight: 600;
}
/* ---- Changed elsewhere ---- */
/* What the Policies page marks when the tenancy moved under it
   (policies/controller#checkServer): a notice above the form naming each field,
   and each field's row tinted — amber where only the server changed it, red
   where this page changed it too and the note shows both values. Built on the
   refresh status pairs, whose foregrounds clear 4.5:1 on their own backgrounds;
   themes/dark.css gives these elements the pairs' dark values. */
.tenancy-admin__stale {
    margin-bottom: 20px;
    padding: 14px 18px;
    border-radius: 14px;
    background: var(--r-warn-bg);
    color: var(--r-warn-fg);
    font-size: 13.5px;
    line-height: 1.5;
}
.tenancy-admin__stale:focus {
    outline: none;
    box-shadow: var(--r-focus);
}
.tenancy-admin__stale-field {
    padding: 0;
    border: 0;
    background: none;
    color: inherit;
    font: inherit;
    font-weight: 600;
    text-decoration: underline;
    cursor: pointer;
}
.tenancy-admin__policy:has(.tenancy-admin__change) {
    background: var(--r-note-bg);
    box-shadow: inset 3px 0 0 var(--r-warn-fg);
}
.tenancy-admin__policy:has(.tenancy-admin__change--conflict) {
    background: var(--r-crit-bg);
    box-shadow: inset 3px 0 0 var(--r-crit-fg);
}
.tenancy-admin__change {
    margin-top: 10px;
    font-size: 13px;
    line-height: 1.45;
    color: var(--r-note-fg);
}
.tenancy-admin__change--conflict {
    color: var(--r-crit-fg);
}
/* ---- Traffic toolbar ---- */
/* Two rows — the period, then everything that reads within it — on a card of
   their own. Loose on the page background they read as stray buttons above an
   unrelated card; given the same surface as the sections below, they read as the
   controls for them. */
.filter-toolbar {
    display: flex;
    flex-direction: column;
    margin-bottom: 20px;
    background: #fff;
    border: 1px solid #e3e8f0;
    border-radius: 14px;
    box-shadow: 0 1px 2px rgba(8, 12, 35, 0.04);
}
.filter-toolbar__row {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    padding: 12px 18px;
}
.filter-toolbar__row + .filter-toolbar__row {
    border-top: 1px solid #eef1f6;
}
/* Fixed width so both rows' controls begin on the same line. Without it each row
   starts wherever its own label happens to end, and the two sets of buttons sit
   a few pixels out from each other — which is most of why the block looked off. */
.filter-toolbar__label {
    flex: 0 0 auto;
    min-width: 46px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #8a93a6;
}
/* Set off from the segmented control by a rule rather than by spacing alone —
   it is a readout, not another option in the group. */
.filter-toolbar__summary {
    padding-left: 12px;
    border-left: 1px solid #e3e8f0;
    font-size: 12.5px;
    color: #6b7488;
}
/* A limit on what can be asked for, shown beside the control that can ask. Takes
   the rest of its row so it wraps as a sentence rather than a ragged tail. */
.filter-toolbar__note {
    flex: 1 1 260px;
    min-width: 0;
    font-size: 12px;
    line-height: 1.45;
    color: #8a93a6;
}
/* Pushes the export to the far end of its row. */
.filter-toolbar__gap {
    margin-left: auto;
}
/* Segmented control: the presets are one choice, so they read as one object
   rather than five buttons that happen to sit together. */
.filter-period {
    display: inline-flex;
    gap: 2px;
    padding: 3px;
    border-radius: 10px;
    background: #f0f3f9;
}
.filter-period__btn {
    padding: 6px 12px;
    border: 0;
    border-radius: 7px;
    background: transparent;
    color: #5b6678;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    white-space: nowrap;
    cursor: pointer;
}
.filter-period__btn:hover {
        color: #1c205c;
    }
.filter-period__btn--active {
    background: #fff;
    color: #2f6fed;
    box-shadow: 0 1px 2px rgba(8, 12, 35, 0.08);
}
/* ---- Traffic charts ---- */
/* Sections reuse the policies `tenancy-admin__group` shell so the two pages read
   as one product; only the chart grid inside is new. */
.traffic-section + .traffic-section {
    margin-top: 20px;
}
/* The period total, alongside the metric it belongs to. Separated by a colon
   rather than whitespace so "All traffic 4.7 TB" cannot be read as a name. */
/* The group head is a flex row with a 14px gap, for the icon a policy section
   carries. A traffic section has no icon — just the title and its total — and
   that gap landed between the title and the colon, reading as "All traffic : ".
   Spacing here comes from the colon's own margin instead. */
.traffic-section .tenancy-admin__group-head {
    gap: 0;
}
/* The colon hangs off the total, not the title, so it has to sit flush against
   the title — any margin here reads as a space before the punctuation. */
.traffic-section__total {
    font-size: 15px;
    font-weight: 700;
    color: #2f6fed;
}
.traffic-section__total::before {
        content: ":";
        margin-right: 7px;
        font-weight: 600;
        color: #8a93a6;
    }
/* The 2-up pair: per-period bars left, running total right.
   `minmax(0, 1fr)` rather than `1fr` — a grid track's default `min-width: auto`
   is its content's min size, and Highcharts reports the width it last drew at,
   so a plain `1fr` lets a chart wedge the column open and never shrink back
   when the window narrows. */
.traffic-pair {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 4px 20px;
    padding: 14px 18px 18px;
}
/* One column, for the split-by-user view: the left cell then holds a stack of
   per-hub charts that would be unreadable at half width. */
.traffic-pair--single {
    grid-template-columns: minmax(0, 1fr);
}
.traffic-figure {
    margin: 0;
    min-width: 0;
}
.traffic-figure__caption {
    display: block;
    margin: 0 0 2px 4px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #8a93a6;
}
/* Charts stacked inside one figure (the by-user case) need separating. */
.traffic-figure .highcharts-wrapper + .highcharts-wrapper {
    margin-top: 18px;
}
@media (max-width: 1100px) {
    .traffic-pair {
        grid-template-columns: minmax(0, 1fr);
    }
}
/* ---- Sortable table headers ---- */
/* A header cell that is also a control. Inherits the header's own type so it
   reads as a heading first and a button second. */
.table-sort {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    padding: 0;
    border: 0;
    background: none;
    font: inherit;
    color: inherit;
    text-transform: inherit;
    letter-spacing: inherit;
    cursor: pointer;
}
.table-sort:hover {
        color: #2f6fed;
    }
.table-sort--active {
    color: #2f6fed;
}
/* Only the column actually in force shows its direction; on the others the arrow
   would be claiming an order that is not applied. */
.table-sort__arrow {
    opacity: 0;
    font-size: 10px;
}
.table-sort--active .table-sort__arrow {
    opacity: 1;
}
/* ---- Region protection quick-add ---- */
.region-quick {
    margin: 4px 0 8px;
    padding: 12px 14px;
    border: 1px solid #e3e8f0;
    border-radius: 10px;
    background: #fbfcfe;
}
.region-quick__head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
    margin-bottom: 10px;
}
.region-quick__label {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #8a93a6;
}
.region-quick__all {
    border: 0;
    padding: 0;
    background: none;
    font: inherit;
    font-size: 12.5px;
    font-weight: 600;
    color: #2f6fed;
    cursor: pointer;
}
.region-quick__all:disabled {
        color: #a7b0c0;
        cursor: default;
    }
.region-quick__chips {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}
.region-quick__chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    border: 1px solid #c7d2e6;
    border-radius: 999px;
    background: #fff;
    color: #1c205c;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
}
.region-quick__chip svg {
        fill: currentColor;
    }
.region-quick__chip:hover {
        border-color: #2f6fed;
        color: #2f6fed;
    }
/* Added regions stay visible rather than disappearing: the row is then a stable
   five-item checklist of where you stand, not a shrinking set of leftovers.
   Removal lives on the allow-list chips below, hence no pointer here. */
.region-quick__chip--added {
    border-color: #cfe3d2;
    background: #f2f9f3;
    color: #2f7a44;
    cursor: default;
}
.region-quick__chip--added:hover {
        border-color: #cfe3d2;
        color: #2f7a44;
    }
/* ---- Users: hub filter ---- */
/* The hub filter lists one option per hub in the tenancy and `.dropdown-content`
   sets no ceiling, so on a large tenancy it runs off the bottom of the screen.
   Unscoped: BasicDropdown wormholes its content out of the `.tenancy-admin`
   subtree, so a scoped selector would never match. */
.dropdown-content--scroll {
    max-height: 320px;
    overflow-y: auto;
}
/* The last-access options are sentences, not one-word states. */
.dropdown-content--wide {
    max-width: 320px;
}
/* A binary filter, sitting in the same toolbar row as the dropdowns, so it has to
   read as a control of the same weight rather than as a stray checkbox. */
.users-toggle {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 7px 12px;
    border: 1px solid #e3e8f0;
    border-radius: 8px;
    background: #fff;
    font-size: 13px;
    font-weight: 600;
    color: #1c205c;
    white-space: nowrap;
}
.users-toggle:hover {
        border-color: #c7d2e6;
    }
.users-toggle .checkbox-input {
        margin: 0;
    }
/* Only the box and its text toggle; the (i) beside them is a sibling, not a
   child, so explaining the filter cannot also change it. */
.users-toggle__label {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    cursor: pointer;
}
/* The (i). `cursor: help` because this explains rather than does. */
.users-toggle__info {
    position: relative;
    display: inline-flex;
    align-items: center;
    color: #8a93a6;
    cursor: help;
}
.users-toggle__info svg {
        fill: currentColor;
    }
.users-toggle__info:hover {
        color: #2f6fed;
    }
/* A footnote inside a menu: explains why a set of options cannot speak for SSO
   users. Ruled off so it does not read as another selectable option. */
.dropdown-note {
    margin-top: 6px;
    padding: 8px 8px 2px;
    border-top: 1px solid #eef1f6;
    font-size: 11.5px;
    line-height: 1.45;
    color: #8a93a6;
}
/* ---- Integrations: reference notes ---- */
/* Prose inside a card, divided the way the policy rows are so a run of notes
   reads as a list rather than as one long paragraph block. */
.integration-note {
    padding: 18px 22px;
}
.integration-note + .integration-note {
        border-top: 1px solid #eef1f6;
    }
.integration-note__title {
    margin: 0 0 8px;
    font-size: 14px;
    font-weight: 700;
    color: #1c205c;
}
/* Wide enough to use the card it sits in — at 78ch this filled barely half of it
   and read as a column stranded on the left — but still measured, because the
   card runs the full width of the page and unbounded lines here would be ~160
   characters. */
.integration-note__body {
    margin: 0 0 10px;
    max-width: 104ch;
    font-size: 13px;
    line-height: 1.6;
    color: #5b6678;
}
.integration-note__body:last-child {
        margin-bottom: 0;
    }
.integration-note__list {
    margin: 0;
    padding-left: 18px;
    max-width: 104ch;
    font-size: 13px;
    line-height: 1.6;
    color: #5b6678;
}
.integration-note__list li + li {
        margin-top: 6px;
    }
.integration-note__field {
    margin: 14px 0 16px;
}
/* The value is a 36-character GUID. Run full width it reads as a field
       expecting far more than it wants, and leaves the cursor stranded a long
       way from the label. The generated link below it is genuinely long, so that
       keeps the full width. */
.integration-note__field .text-input {
        max-width: 420px;
    }
.integration-note__error {
    margin: 6px 0 0;
    font-size: 12.5px;
    color: #b42318;
}
/* The generated link and its copy button. Wraps rather than scrolls: this is a
   value someone reads to check before sending it on. */
.integration-note__link {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
    max-width: 1200px;
    margin-top: 12px;
    padding: 10px 12px;
    border: 1px solid #e3e8f0;
    border-radius: 10px;
    background: #fbfcfe;
}
.integration-note__url {
    flex: 1 1 420px;
    min-width: 0;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 12px;
    line-height: 1.5;
    color: #1c205c;
    word-break: break-all;
}
/* The commercial note is not instruction, so it is set apart from the rest. */
.integration-note--flag {
    background: #fbfcfe;
    font-size: 13px;
    line-height: 1.6;
    color: #5b6678;
}
/* ---- Storage-by-hub modal ---- */
/* Unscoped for the same reason as the memberships modal below: ModalContent
   renders through `{{#-in-element}}`, outside this subtree. */
.hub-storage__total {
    font-size: 28px;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: #1c205c;
    margin: 6px 0 12px;
}
/* `.modal` is `min-width: 560px` with no maximum, so it sizes itself to its
   content. Left uncapped, a tenancy with hundreds of hubs stretched this dialog
   across the entire window. */
.hub-storage-modal {
    width: 100%;
    max-width: 760px;
}
/* The proportional band. Segments butt together, so a hairline gap keeps two
   adjacent hubs from reading as one — affordable because the component caps the
   band at a dozen or so segments regardless of how many hubs exist. */
.hub-storage__share {
    display: flex;
    height: 10px;
    gap: 1px;
    border-radius: 999px;
    overflow: hidden;
    background: #f0f3f9;
    margin-bottom: 18px;
}
.hub-storage__share-seg {
    /* No `flex-shrink`: the widths are the data. A sliver still has to be wide
       enough to carry its tooltip, hence the floor — which is only safe because
       the segment count is bounded; per-hub it was what forced the dialog wide. */
    flex: 0 0 auto;
    min-width: 2px;
}
/* Grows with the window but never past it — `.modal` already caps its own height
   at `100vh - 80px`, and this has to leave room for the heading and the band. */
.hub-storage__list {
    display: flex;
    flex-direction: column;
    gap: 2px;
    max-height: 46vh;
    min-height: 120px;
    overflow-y: auto;
    /* Clears the scrollbar off the rows, and stops the last row sitting flush
       against the modal's bottom edge. */
    padding-right: 6px;
    margin-bottom: 4px;
}
/* Fixed columns rather than flex, so the sizes and percentages line up down the
   list instead of drifting with the length of each hub's name. */
.hub-storage__row {
    display: grid;
    grid-template-columns: 10px minmax(0, 1fr) 1.4fr auto 52px;
    align-items: center;
    gap: 10px;
    padding: 7px 8px;
    border-radius: 8px;
}
.hub-storage__row:hover {
        background: #f8fafd;
    }
.hub-storage__dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
}
.hub-storage__name {
    font-size: 13.5px;
    font-weight: 600;
    color: #1c205c;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.hub-storage__track {
    height: 8px;
    border-radius: 999px;
    background: #f0f3f9;
    overflow: hidden;
}
.hub-storage__bar {
    display: block;
    height: 100%;
    border-radius: 999px;
}
.hub-storage__value {
    font-size: 13px;
    font-weight: 600;
    color: #1c205c;
    white-space: nowrap;
}
/* Right-aligned so the decimal points stack. */
.hub-storage__pct {
    font-size: 12.5px;
    color: #8a93a6;
    text-align: right;
}
.hub-storage__empty {
    padding: 28px 8px;
    text-align: center;
    font-size: 13px;
    color: #8a93a6;
}
/* ---- Hub memberships modal ---- */
/* Reached only from the tenancy users page, but NOT named `tenancy-admin__` and
   not nested under it: ModalContent renders through `{{#-in-element}}` into a
   destination outside this subtree, so a scoped selector would never match. */
.memberships__controls {
    display: flex;
    flex-direction: column;
    gap: 12px;
    padding: 4px 0 0;
}
.memberships__tabs {
    display: flex;
    gap: 4px;
    padding: 4px;
    border-radius: 10px;
    background: #f0f3f9;
}
.memberships__tab {
    flex: 1 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    padding: 7px 10px;
    border: 0;
    border-radius: 7px;
    background: transparent;
    color: #5b6678;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
}
.memberships__tab:hover {
        color: #1c205c;
    }
.memberships__tab--active {
    background: #fff;
    color: #2f6fed;
    box-shadow: 0 1px 2px rgba(8, 12, 35, 0.08);
}
.memberships__tab-count {
    padding: 1px 6px;
    border-radius: 999px;
    background: rgba(28, 32, 92, 0.08);
    font-size: 11px;
    font-weight: 700;
    color: inherit;
}
/* The list keeps its `min-height`, so an empty result still fills the box rather
   than collapsing the modal to the height of one sentence. */
.memberships__empty {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    min-height: 180px;
    padding: 24px;
    text-align: center;
    font-size: 13px;
    color: #8a93a6;
}
/* ---- Membership insights (Users page modal) ---- */
/* A single chart in a modal: wide enough for eleven category labels without
   forcing the dialog to full width. */
.membership-insights__figure--solo {
    width: min(640px, 78vw);
}
.membership-insights__figure {
    margin: 0;
    min-width: 0;
}
/* Capped for the same reason the traffic panel is: eleven bars on one side and a
   wrapping legend on the other, whatever the size of the tenancy. */
.membership-insights__figure .highcharts-wrapper,
.membership-insights__figure .chart-container {
    height: 360px;
    min-height: 360px;
}
.membership-insights__empty {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 360px;
    padding: 0 24px;
    text-align: center;
    border: 1px dashed #cdd5e2;
    border-radius: 12px;
    color: #8a93a6;
    font-size: 13px;
}
@media only screen and (max-device-width: 640px) {
  .tenancy-admin__toolbar {
    padding: 12px;
  }

  /* A vertical rule between two controls says nothing once the row has wrapped
     and they are no longer beside each other. */
  .tenancy-admin__toolbar .divider-verticle {
    display: none;
  }

  /* Users only, and by its own class rather than by `.tenancy-admin__toolbar`.
     That toolbar carries a search, two dropdown filters, four checkboxes, a
     Reset and two report buttons: on a phone the search is the one that earns
     the room, because everything else is a desk-sized way of narrowing a list
     you can already narrow by typing. The search is its first child; the rest
     go regardless of what gets added to the row later.

     Written for that toolbar and true only of it. Three others use the same
     block — Groups, Hubs, Audit logs — and as `.tenancy-admin__toolbar > *`
     this rule reached all four: it hid "Create group", it hid the hub sort and
     the four charts (undoing the per-button `hide-on-phone` that page already
     carries, which is the tell that the decision had been made there and this
     was overriding it), and on Audit logs, where the first child is the hub
     picker rather than a search, it hid Refresh and Export — leaving a screen
     that can choose a hub and never load it. Those three wrap onto two or
     three lines instead, which the block already does: `flex-wrap: wrap` and
     a 10px gap, both left alone above. */
  .tenancy-admin__toolbar--phone-search-only {
    gap: 0;
  }

  .tenancy-admin__toolbar--phone-search-only > *:not(:first-child) {
    display: none;
  }

  /* The row leads with the name and repeats the email under it. At this width
     the email is the one that identifies the account, so it stands alone —
     except where they are the same string, and then the name IS the email and
     hiding it would leave the row blank.

     Scoped to this screen's own table. Unscoped it reached every `.user-card`
     in the application, and one of them is the fusion "Manage group" dialog,
     which renders through a wormhole outside this subtree: a member with a name
     lost it there and was shown by address alone, on a phone, in a dialog this
     rule was never written for. */
  .tenancy-admin__tablewrap .user-card__content:has(.user-card__email) .user-card__name {
    display: none;
  }

  /* Whichever of the two survives is now the only thing identifying the row, so
     both read the same. Left as they were, a row where the name and the email
     match came out a size larger and darker than the row above it, purely
     because of which element happened to be the one still standing. */
  .tenancy-admin__tablewrap .user-card__content .user-card__email {
    font-size: var(--font-size-1);
    color: var(--colour-fg-default);
  }
}
/* Same again: settings-admin builds on sysadmin, and overrides `.setting__*`
   (pulled in by page.css via dekkoSetting) for the forms not yet rewritten. */
/* Account settings (/settings/account/*) and Hub settings (/settings/hub/*).
 *
 * Built on the `sysadmin` block for the same reason the tenancy manager is:
 * that block is the current DekkoCORE admin styling — nav card, page head,
 * section card, table, badges — and settings is meant to read as the same
 * product, not a fourth look. Only what settings has and the admin areas do
 * not lives here.
 *
 * Light-only, like `sysadmin` and `tenancy-admin`.
 */
/* ---- Page frame ---- */
/* Scrolling happens in main, not on the page, which is what keeps the nav card
   on screen on a long page — the same arrangement `.tenancy-admin
   .sysadmin__main` uses. `.sysadmin` is `align-items: flex-start`, so main has
   to claim `align-self: stretch` to inherit the viewport height
   `.container--settings` (display:flex; height:100vh) already gives it.
   Making the nav `position: sticky` instead does not work: a sticky element is
   confined to its containing block, and the nav is a flex item of a shell
   pinned at viewport height, so it would unstick after one screen. */
.settings-admin .sysadmin__main {
    align-self: stretch;
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow-y: auto;

    /* Keeps content clear of the scrollbar main now owns. */
    padding-right: 12px;
}
/* `flex: 0 0 auto` matters: main is a column with `min-height: 0`, so content
   taller than it would otherwise be SHRUNK to fit rather than overflowing and
   letting main scroll. */
.settings-admin .sysadmin__main > * {
    flex: 0 0 auto;
}
/* The nav card sizes to its items. It must NOT `align-self: stretch` — that
   makes it a full-height white column with the items stranded at the top. It
   stays on screen because MAIN owns the scrolling, not because the card is
   tall. `max-height` only gives it a scrollport if it ever outgrows a short
   window. */
.settings-admin .sysadmin__nav {
    align-self: flex-start;
    max-height: 100%;
    overflow-y: auto;
}
/* Bottom clearance sits on the content, not on main: main is a box the content
   deliberately overflows, and padding on an overflowed box lands mid-scroll
   rather than after the content. */
.settings-admin__page {
    padding-bottom: 32px;
}
/* Single-line nav items: these carry no subtitle, so the icon is centred
   against one line of text rather than aligned to its top. */
.settings-admin .sysadmin__nav-item {
    align-items: center;
}
/* The single-Hub stand-in for the switcher: same box, minus the affordance. */
.settings-admin__hub-name {
    padding: 9px 12px;
    margin: 0 2px;
    border: 1px solid #e3e8f0;
    border-radius: 10px;
    background: #f8fafd;
    color: #1c205c;
    font-size: 14px;
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
/* ---- Destructive sections ---- */
/* Red where the shared card is blue, so "delete" and "leave" cannot be mistaken
   for the settings above them. */
.settings-admin__group--danger {
    border-color: #f2c4c0;
}
.settings-admin__group--danger .sysadmin__group-head {
    background: #fdf6f5;
    border-bottom-color: #f2c4c0;
}
.settings-admin__group-icon--danger {
    background: #fdecea;
    color: #b42318;
}
/* A secondary note under a section's main copy. */
.settings-admin__note {
    margin-top: 12px;
    font-size: 12.5px;
}
/* ---- Contacts (master + detail) ---- */
.settings-admin__contacts {
    display: flex;
    align-items: flex-start;
    gap: 20px;
}
.settings-admin__contacts-card {
    flex: 0 0 320px;
    max-width: 320px;
}
.settings-admin__contacts-list {
    overflow-y: auto;
    max-height: calc(100vh - 320px - var(--banner-height));
    min-height: 120px;
}
.settings-admin__contact-row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 11px 18px;
    border-bottom: 1px solid #f1f4f9;
    text-decoration: none;
    cursor: pointer;
}
.settings-admin__contact-row:last-child {
    border-bottom: 0;
}
.settings-admin__contact-row:hover {
    background: #f9fbfe;
}
.settings-admin__contact-row--active {
    background: #eef3fe;
}
.settings-admin__contact-panel {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 520px;
    padding: 22px;
    position: relative;
}
/* show-contact's own rules live under `.setting__contact`, the old settings
   shell, so none of them reach it here — which is why the panel arrived with
   its rows simply stacked. These are that layout, scoped to this shell. */
/* Space under the name, so it reads as a heading over the detail rather than as
   the first line of them. The right padding keeps a long name clear of the close
   button pinned in the corner. */
.settings-admin__contact-panel .contact__head {
    padding-bottom: 16px;
    padding-right: 34px;
}
/* Top-right of the panel, which is what `position: relative` on the panel is
   for. In the flow it landed under the name and read as a control belonging to
   it rather than as "close this". */
.settings-admin__contact-panel .contact-close {
    position: absolute;
    top: 14px;
    right: 14px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    padding: 0;
    font-size: 14px;
    color: #7b8698;
    background: transparent;
    border: 0;
    border-radius: 6px;
    cursor: pointer;
}
.settings-admin__contact-panel .contact-close:hover {
    background: #f1f4f9;
    color: #1c205c;
}
.settings-admin__contact-panel .contact__info-company {
    display: flex;
    align-items: center;
    gap: 10px;
}
.settings-admin__contact-panel .contact__icon {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 18px;
    color: #7b8698;
}
.settings-admin__contact-panel .contact__emails {
    min-width: 0;
}
.settings-admin__contact-panel .contact__emails p {
    margin: 0;
}
/* Space under the trust toggle, so the actions below read as a separate step
   rather than as part of the same control. */
.settings-admin__contact-panel .contact__info-trust {
    padding-top: 16px;
    padding-bottom: 20px;
}
/* ---- Shared row furniture (contacts list, membership table) ---- */
.settings-admin__user {
    display: flex;
    align-items: center;
    gap: 12px;
}
.settings-admin__user-img {
    flex: 0 0 auto;
    width: 34px;
    height: 34px;
    border-radius: 50%;
    overflow: hidden;
    background: #f0f3f9;
    display: flex;
    align-items: center;
    justify-content: center;
}
.settings-admin__user-img img {
        width: 100%;
        height: 100%;
        object-fit: cover;
    }
.settings-admin__user-text {
    min-width: 0;
}
.settings-admin__user-name {
    display: block;
    font-size: 13.5px;
    font-weight: 600;
    color: #1c205c;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.settings-admin__user-meta {
    display: block;
    font-size: 12px;
    color: #6b7488;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.settings-admin__readonly-value {
    font-size: 13.5px;
    font-weight: 600;
    color: #1c205c;
}
/* Role plus any tenancy badges, on one line. Wraps rather than overflowing
   when a narrow column has both a long role name and two badges. */
.settings-admin__role {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}
/* The membership table has five columns; a narrow window should scroll it
   rather than the page. */
.settings-admin__tablewrap {
    overflow-x: auto;
}
/* ---- Legacy forms ---- */
/* Two forms are still their original components because they are shared or
   large: the Hub branding form (also rendered by the create-Hub modal) and the
   account profile form. Both lay themselves out with the generic `flex-group`
   utilities and, in branding's case, right-aligned 100px labels sized for the
   modal's narrow column. Rather than rewrite either — and change the modal as
   collateral — this pins the pieces that read wrong inside a section card.
   Scoped to `.settings-admin`, so the modal is untouched. */
.settings-admin__legacy-form .text-input,
    .settings-admin__legacy-form .text-input input,
    .settings-admin__legacy-form .account-readonly-field,
    .settings-admin__legacy-form .field__with-icon {
        max-width: 420px;
    }
.settings-admin__legacy-form label.w-100px {
        width: 120px;
        text-align: left;
    }
.settings-admin__legacy-form .modal__button {
        margin-top: 4px;
    }
/* `.setting__form { height: 100% }` (dekkoSetting-form.css) was written for the
   old settings frame; inside a section card it stretches a short form to the
   full card height. Still reached by the change-password component. */
.settings-admin .setting__form {
    height: auto;
}
/* The change-password fields are `.field--setting .field__input`, which
   hard-codes a near-black 1px border sized for the old settings frame. Inside a
   section card that reads as a heavy box around each field. Same treatment the
   retired `account-section` card gave them. */
.settings-admin__legacy-form .field--setting + .field--setting {
        margin-top: 14px;
    }
.settings-admin__legacy-form .field--setting .field__label {
        display: block;
        margin-bottom: 6px;
        font-size: 13px;
        font-weight: 600;
        color: #1c205c;
    }
.settings-admin__legacy-form .field--setting .field__input {
        height: auto;
        min-height: 0;
        margin-top: 0;
        /* Right padding leaves room for the show/hide eye. */
        padding: 9px 36px 9px 12px;
        line-height: 20px;
        font-size: 13.5px;
        color: #1c205c;
        background: #fff;
        border: 1px solid #cdd5e2;
        border-radius: 9px;
    }
.settings-admin__legacy-form .field--setting .field__input:focus {
        border-color: #2f6fed;
        box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.15);
    }
/* The eye toggle's base icon is near-black. */
.settings-admin__legacy-form .field--setting .field__with-icon .icon {
        color: #9aa6b8;
    }
/* The membership table's visibility picker is a `.selectbox__head` dropdown
   trigger, which carries the same hard-coded dark border. */
.settings-admin .selectbox__head {
    border: 1px solid #cdd5e2;
    border-radius: 9px;
    padding: 8px 12px;
    font-size: 13.5px;
    color: #1c205c;
    background: #fff;
    min-height: 0;
}
.settings-admin .selectbox__head:hover {
    border-color: #c7d2e6;
    background: #f6f8fc;
}
/* "Not applicable here" in a table cell — an external member who cannot be a
   Hub admin, a row you cannot remove. An em dash reads as deliberate where an
   empty cell reads as a missing control. */
.settings-admin__na {
    color: #a5adbd;
    font-size: 13.5px;
}
/* The branding form's save button is styled for the modal footer it also lives
   in, where it sits alone on a line. In a section card it needs to read as the
   card's action: left-aligned under the fields, clear of them. */
.settings-admin__legacy-form .modal__button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin: 20px 0 0;
    min-width: 0;
}
/* Signature and stamp are small, fixed-size canvases; a full-width card leaves
   them stranded in white space. Cap the column instead. */
.settings-admin__page--narrow {
    max-width: 760px;
}
/* The signature and stamp editors are fixed-size canvases with their own
   controls stacked under them. Left-aligned in a card they leave a block of
   dead space to the right, so the whole column is centred as a unit —
   `fit-content` keeps the internal layout (canvas, Clear, rule, Save) exactly
   as the editors lay it out. */
.settings-admin .field__painting {
    width: -moz-fit-content;
    width: fit-content;
    max-width: 100%;
    margin-left: auto;
    margin-right: auto;
}
.ember-basic-dropdown-trigger.selectbox__head {
    max-width: 200px;
  }
/* Design System */
@supports (--css: variables) {
  :root {
    --border-radius-sm: 3px;
    --border-radius-default: 6px;
    --border-radius-rounder: 12px;
  }
}
/*
  Hover colours are made by making a colour lighter or darker, typically by 5%
  Darken colour tool: https://mdigi.tools/darken-color
  Lighten colour tool: https://mdigi.tools/lighten-color

  The following tool can be used to generate colour tints and shades: https://maketintsandshades.com
*/
@supports (--css: variables) {
  :root {
    /* Global */
    --black: #000;
    --white: #fff;

    --blue-links: #5bc2ef;
    --hero-blue: #0659ff;
    --gray: #4e4e4e;
    --grey-light: #707070;
    --grey-cod: #101010;
    --grey-white: #8f8f8f;
    --red: #d50517;
    --green: #2a8122;
    --orange: #cc6b37;
    --blue-medium: #3d89e4;
    --purple: #7444e0;
    --solitude: #e6f1ff;
    --office365: #dc3e15;
    --danger: #ff0000;
    --alto: #d0d0d0;
    --orange-light: #ea5d32;
    --orange-dark: #3b0e00;
    --orange-mid: #eec4a3;
    --orange-tin: #f17b55;
    --serenade: #fff1e6;
    --hero-white: #efefef;
    --blue-white: #c2d3ee;
    --blue-font: #5390ff;
    --platinum: #e2e2e7;
    --gray-css: #818181;
    --pink: #FFE7E7;

    /* Colour scale */
    --colour-black: #373737;
    --colour-white: #fff;
    --colour-brand: #00a7e7;
    --colour-brand-hover: #009fdb;
    --colour-brand-dark: #1c205c;

    /* Neutral */
    --colour-neutral-8: #4b4b4b;
    --colour-neutral-7: #5f5f5f;
    --colour-neutral-6: #737373;
    --colour-neutral-5: #878787;
    --colour-neutral-4: #9b9b9b;
    --colour-neutral-3: #afafaf;
    --colour-neutral-2: #c3c3c3;
    --colour-neutral-1: #d7d7d7;
    --colour-neutral-0: #ebebeb;

    /* Info */
    --colour-info-0: #cff5f6;
    --colour-info-8: #0055bc;

    --colour-info-hover-0: #c3f2f4;

    /* Success */
    --colour-success-0: #d7f7c2;
    --colour-success-8: #05690d;

    --colour-success-hover-0: #cdf5b2;

    /* Danger */
    --colour-danger-0: #ffe7f2;
    --colour-danger-4: #df1b41;
    --colour-danger-8: #b3063d;

    --colour-danger-hover-0: #ffd6e9;
    --colour-danger-hover-4: #d1193d;

    /* Attention */
    --colour-attention-0: #fcedb9;
    --colour-attention-8: #a82c00;

    --colour-attention-hover-0: #FBEAAC;

    /* Foreground colours */
    --colour-fg-default: var(--colour-black);
    --colour-fg-muted: var(--colour-neutral-6);
    --colour-fg-subtle: var(--colour-neutral-4);
    --colour-fg-on-emphasis: var(--colour-white);

    --colour-fg-brand: var(--colour-brand);
    --colour-fg-success: #05690d;
    --colour-fg-info: #0055bc;
    --colour-fg-danger: #df1b41;
    --colour-fg-attention: #c84801;
    --colour-fg-indigo: #311B92;

    /* Background colours */
    --colour-bg-default: var(--colour-white);
    --colour-bg-subtle: var(--colour-neutral-0);
    --colour-bg-emphasis: var(--colour-black);

    --colour-bg-brand-emphasis: var(--colour-brand);
    --colour-bg-brand: #d1e8ff;
    --colour-bg-brand-dark: var(--colour-brand-dark);
    --colour-bg-brand-subtle: #e6ecf8;
    --colour-bg-success: #b4d2b6;
    --colour-bg-success-emphasis: #05690d;
    --colour-bg-info: #b3cceb;
    --colour-bg-info-emphasis: #0055bc;
    --colour-bg-danger: #f5bbc6;
    --colour-bg-danger-emphasis: #df1b41;
    --colour-bg-attention: #efc8b3;
    --colour-bg-attention-emphasis: #c84801;
    --colour-bg-dark-blue: #3c6ed0;
    --colour-bg-eerie-black: #191919;
    --colour-bg-raisin-black: #242424;
    --colour-bg-anti-flash-white: #f0f0f0;
    --colour-bg-alice-blue: #EDF4FF;
    --colour-bg-lavender: #D1C4E9;

    /* Border colours */
    --colour-border-default: var(--colour-neutral-1);

    /* Button colours */
    --colour-btn-fg: var(--colour-fg-default);
    --colour-btn-bg: var(--colour-bg-subtle);
    --colour-btn-hover-bg: #dfdfdf;

    --colour-btn-primary-fg: var(--colour-fg-on-emphasis);
    --colour-btn-primary-bg: var(--colour-bg-brand-emphasis);
    --colour-btn-primary-hover-bg: var(--colour-brand-hover);

    --colour-btn-danger-fg: var(--colour-fg-on-emphasis);
    --colour-btn-danger-bg: var(--colour-danger-4);
    --colour-btn-danger-hover-bg: var(--colour-danger-hover-4);

    --colour-btn-outlined-bg: var(--colour-bg-default);
    --colour-btn-outlined-border: var(--colour-border-default);
    --colour-btn-outlined-hover-bg: #f2f2f2;

    --colour-btn-blue-fg: var(--colour-white);
    --colour-btn-blue-bg: var(--blue-font);
    --colour-btn-blue-hover-bg: var(--colour-bg-dark-blue);

    /* Label colours */
    /* Badges. Repointed at the refresh status pairs: the `--colour-*-0` scale
       these used was drawn for surfaces, so the four badge colours were a
       cyan, a lime, a pink and a mustard that shared no relationship with each
       other and none of which had a foreground chosen to be legible on it. The
       `--r-*-fg`/`--r-*-bg` pairs are picked together and each clears 4.5:1.
       The hover of each is its own background half a step darker, rather than
       a different hue from the old scale. */
    --colour-label-fg: var(--r-grey);
    --colour-label-bg: var(--r-fill);
    --colour-label-hover-bg: #e6ebf3;

    --colour-label-info-fg: var(--r-brand);
    --colour-label-info-bg: var(--r-tint-2);
    --colour-label-info-hover-bg: #dde8ff;

    --colour-label-success-fg: var(--r-ok-fg);
    --colour-label-success-bg: var(--r-ok-bg);
    --colour-label-success-hover-bg: #dcf2e5;

    --colour-label-attention-fg: var(--r-warn-fg);
    --colour-label-attention-bg: var(--r-warn-bg);
    --colour-label-attention-hover-bg: #fdeab4;

    --colour-label-danger-fg: var(--r-crit-fg);
    --colour-label-danger-bg: var(--r-crit-bg);
    --colour-label-danger-hover-bg: #fbdfdc;

    --colour-label-expiry-fg: var(--r-expiry-fg);
    --colour-label-expiry-bg: var(--r-expiry-bg);
    --colour-label-expiry-hover-bg: #ffe9db;
    --colour-label-submission-bg: var(--r-tint);

    /* Nav */
    --colour-nav-hover-bg: #dfe6f6;
  }
}
/* The refresh palette.
 *
 * These are the values the refreshed areas already use — sysadmin, tenancy
 * admin, the tenancy manager, settings admin, the account section, the login
 * and passkey screens — but they were repeated as literals in every one of
 * them (`#2f6fed`, `#1c205c`, `#5b6678` appear by hand across half a dozen
 * files). Naming them once means the next area does not have to guess, and a
 * change to the palette is one edit rather than a search.
 *
 * They sit alongside `colours.css` rather than replacing it: that file is the
 * app's semantic set and is theme-swapped, while these are the flat reference
 * values the refresh was drawn against. Where a rule can use a semantic token
 * it should; these are for the surfaces and edges that have no semantic name.
 */
:root {
  /* Text. Three tiers, and the boundary between them is legibility, not taste:
     --r-navy and --r-grey are for text people read, --r-muted is secondary text
     that must still clear 4.5:1 on both white and --r-tint, and --r-faint is
     for placeholders and disabled states only — it does not pass, and nothing
     a person has to read may use it. */
  --r-navy:      #1c205c;
  --r-grey:      #5b6678;
  --r-muted:     #667085;
  --r-faint:     #9aa6b8;

  --r-brand:     #2f6fed;
  --r-brand-hi:  #2559c9;
  /* Filled buttons carry white text. Keep their backgrounds separate from
     the brand foreground, which becomes cyan on dark modal surfaces. */
  --r-button-bg:       #2f6fed;
  --r-button-hover-bg: #2559c9;
  --r-tint:      #eef3fe;
  --r-tint-2:    #eaf1ff;

  /* Edges and surfaces, lightest border to darkest fill. */
  --r-edge:      #e3e8f0;
  --r-ctl:       #cdd5e2;
  --r-ctl-hi:    #b9c3d6;
  --r-div:       #eef1f6;
  --r-div-2:     #f1f4f9;
  --r-fill:      #f0f3f9;
  --r-hover:     #f6f8fc;
  --r-row-hover: #f9fbfe;
  --r-head:      #fbfcfe;
  --r-thead:     #f8fafd;

  /* Status pairs. Foreground is always chosen to clear 4.5:1 on its own
     background, so a badge can use either half without a second thought. */
  --r-ok-fg:     #0c7a43;   --r-ok-bg:    #e9f7ef;
  --r-warn-fg:   #b45309;   --r-warn-bg:  #fef3c7;
  --r-crit-fg:   #b42318;   --r-crit-bg:  #fdecea;
  --r-note-fg:   #8a5a08;   --r-note-bg:  #fef8e7;
  /* Orange, and its own pair rather than `warn`: a file counting down to automatic deletion is not the
     same kind of news as the amber warnings, and the two appear in the same status cell. The foreground
     is the deep end of the ramp because it also paints the icon at 13px — the vivid #cc6b37/#ea5d32 in
     the legacy palette read as orange but only reach 3.3:1 and 3.1:1 here, under the 4.5:1 this block
     promises. This pair clears it at rest AND on hover (5.72:1 / 5.41:1), which `--r-warn` does not. */
  --r-expiry-fg: #a83c0b;   --r-expiry-bg: #fff1e6;

  /* The seven-step scale for a value that is a RANK rather than a state — at
     present the fusion listing's Permission column, which runs from "Listing
     only" to "Full permissions" and reads as a ladder or as nothing.

     Five steps of red to green, and then two that leave the ramp: Manager is
     blue and Full permissions (with Owner) is purple. Two reasons, and the
     second is why it is worth the irregularity. A ramp that has to reach green
     by step 7 spends its first five steps barely moving, so the levels an
     ordinary reader actually holds — the five below Manager — came out as five
     shades of the same olive. Pulling the top two off the ramp gives those five
     the whole range. And the top two are not "more green": they are the levels
     that can reshare and delete, which is a difference in kind rather than in
     degree, and a hue of their own says so where a darker green could not.

     Steps 1 and 5 are the crit and ok pairs above, so both ends of the ramp
     match what red and green already mean in this app. 6 and 7 are the house
     blue (--r-brand) and the house purple (--purple from colours.css). Every
     foreground clears 4.5:1 on its own background, as the status pairs do —
     measured 5.75, 4.72, 4.56, 4.64, 4.90, 4.52, 4.94. Flat values in both
     themes, again as the pairs are: the dark theme overrides none of these, so
     a tinted pill stays a tinted pill.

     Note that step 6 lands close to `.vltheader__kind`, the "Fusion" badge in
     the hub dropdown — same shape, nearly the same blue. They never share a
     screen region, but if that ever reads as one badge meaning two things, step
     6 is the one to move, not the header. */
  --r-step-1-fg: var(--r-crit-fg);  --r-step-1-bg: var(--r-crit-bg);
  --r-step-2-fg: #a65815;           --r-step-2-bg: #fcf2ea;
  --r-step-3-fg: #83700f;           --r-step-3-bg: #faf7e9;
  --r-step-4-fg: #457d0d;           --r-step-4-bg: #f1f9e9;
  --r-step-5-fg: var(--r-ok-fg);    --r-step-5-bg: var(--r-ok-bg);
  --r-step-6-fg: #1f64ec;           --r-step-6-bg: #eaf1fd;
  --r-step-7-fg: var(--purple);     --r-step-7-bg: #f0ebfc;

  /* Radii, in descending order of the thing they wrap: a dialog, a panel
     inside it, a control, a pill. */
  --r-r-card:    14px;
  --r-r-inner:   10px;
  --r-r-ctl:     9px;
  --r-r-pill:    999px;

  --r-gutter:    24px;
  --r-focus:     0 0 0 3px rgba(47, 111, 237, .15);
  --r-shadow:    0 1px 2px rgba(8, 12, 35, .04);
  --r-shadow-md: 0 4px 14px rgba(8, 12, 35, .10);
  --r-shadow-lg: 0 16px 48px rgba(8, 12, 35, .20);
}
@supports (--css: variables) {
  :root {
    --spacer-0: 0px;
    --spacer-1: 4px;
    --spacer-2: 8px;
    --spacer-3: 16px;
    --spacer-4: 24px;
    --spacer-5: 32px;
  }
}
@supports (--css: variables) {
  :root {
    --font-size-0: 12px;
    --font-size-1: 14px;
    --font-size-2: 16px;
    --font-size-3: 18px;

    --lh-default: 1.5;
    --lh-condenced: 1.2;
    --lh-extra-condensed: 1;
  }
}
.colour-fg-default {
      color: var(--colour-black);
    }
.colour-fg-brand {
      color: var(--colour-brand);
    }
.colour-fg-muted {
      color: var(--colour-fg-muted);
    }
.colour-fg-subtle {
      color: var(--colour-fg-subtle);
    }
.colour-fg-on-emphasis {
      color: var(--colour-white);
    }
.colour-fg-grey-light {
      color: var(--grey-light);
    }
.colour-fg-attention {
      color: var(--colour-label-attention-fg);
    }
.colour-fg-danger {
      color: var(--colour-label-danger-fg);
    }
.colour-bg-default {
      background: var(--colour-bg-default);
    }
.colour-bg-subtle {
      background: var(--colour-bg-subtle);
    }
.colour-bg-emphasis {
      background: var(--colour-bg-emphasis);
    }
.colour-bg-brand {
      background: var(--colour-bg-brand);
    }
.colour-bg-brand-subtle {
        background: var(--colour-bg-brand-subtle);
      }
.colour-bg-brand-dark {
        background: var(--colour-bg-brand-dark);
      }
.colour-bg-attention {
      background: var(--colour-label-attention-bg);
    }
.colour-bg-danger {
      background: var(--colour-label-danger-bg);
    }
.colour-border-default {
      border: solid 1px var(--colour-border-default);
    }
.colour-border-default-right {
        border-right: solid 1px var(--colour-border-default);
      }
.colour-border-default-top {
        border-top: solid 1px var(--colour-border-default);
      }
.colour-border-attention {
      border: solid 1px var(--colour-label-attention-fg);
    }
.colour-border-danger {
      border: solid 1px var(--colour-label-danger-fg);
    }
.colour-fill-default {
      fill: var(--colour-black);
    }
.flex {
  display: flex;
}
.flex-group {
    display: flex;
    flex-wrap: wrap;
    gap: var(--spacer-2);
  }
/* Stop the dropdown from moving elements when opened */
.flex-group > .ember-basic-dropdown-content-wormhole-origin {
      position: absolute;
    }
.flex-column {
    flex-direction: column;
  }
.flex-row {
    flex-direction: row;
  }
.flex-nowrap {
    flex-wrap: nowrap;
  }
.flex-align-center {
      align-items: center;
    }
.flex-align-end {
      align-items: flex-end;
    }
.flex-gap-0 {
      gap: var(--spacer-0);
    }
.flex-gap-1 {
      gap: var(--spacer-1);
    }
.flex-gap-2 {
      gap: var(--spacer-2);
    }
.flex-gap-3 {
      gap: var(--spacer-3);
    }
.flex-gap-4 {
      gap: var(--spacer-4);
    }
.flex-gap-5 {
      gap: var(--spacer-5);
    }
.flex-grow-1 {
      flex-grow: 1;
    }
.float-right {
        float: right;
    }
.float-left {
        float: left;
    }
.center-horizontal {
        margin: 0 auto;
    }
.center-vertical {
      margin: auto 0;
  }
.justify-start {
        justify-content: start;
    }
.justify-center {
        justify-content: center;
    }
.justify-between {
        justify-content: space-between;
    }
.justify-end {
        justify-content: end;
    }
.m-0 {
    margin: var(--spacer-0);
  }
.m-1 {
    margin: var(--spacer-1);
  }
.m-2 {
    margin: var(--spacer-2);
  }
.m-3 {
    margin: var(--spacer-3);
  }
.m-4 {
    margin: var(--spacer-4);
  }
.m-5 {
    margin: var(--spacer-5);
  }
.mt-0 {
      margin-top: var(--spacer-0);
    }
.mt-1 {
      margin-top: var(--spacer-1);
    }
.mt-2 {
      margin-top: var(--spacer-2);
    }
.mt-3 {
      margin-top: var(--spacer-3);
    }
.mt-4 {
      margin-top: var(--spacer-4);
    }
.mt-5 {
      margin-top: var(--spacer-5);
    }
.mb-0 {
      margin-bottom: var(--spacer-0);
    }
.mb-1 {
      margin-bottom: var(--spacer-1);
    }
.mb-2 {
      margin-bottom: var(--spacer-2);
    }
.mb-3 {
      margin-bottom: var(--spacer-3);
    }
.mb-4 {
      margin-bottom: var(--spacer-4);
    }
.mb-5 {
      margin-bottom: var(--spacer-5);
    }
.mb-64px {
      margin-bottom: 64px;
    }
.ml-0 {
      margin-left: var(--spacer-0);
    }
.ml-1 {
      margin-left: var(--spacer-1);
    }
.ml-2 {
      margin-left: var(--spacer-2);
    }
.ml-3 {
      margin-left: var(--spacer-3);
    }
.ml-4 {
      margin-left: var(--spacer-4);
    }
.ml-5 {
      margin-left: var(--spacer-5);
    }
.ml-auto {
      margin-left: auto;
    }
.ml-none {
      margin-left: 0px;
    }
.ml-nav {
      margin-left: calc(175px + var(--spacer-4));
    }
.ml-25px {
      margin-left: 25px;
    }
.mr-0 {
      margin-right: var(--spacer-0);
    }
.mr-1 {
      margin-right: var(--spacer-1);
    }
.mr-2 {
      margin-right: var(--spacer-2);
    }
.mr-3 {
      margin-right: var(--spacer-3);
    }
.mr-4 {
      margin-right: var(--spacer-4);
    }
.mr-5 {
      margin-right: var(--spacer-5);
    }
.rounded-sm {
  border-radius: var(--border-radius-sm);
}
.rounded {
    border-radius: var(--border-radius-default);
}
.rounder {
  border-radius: var(--border-radius-rounder);
}
.z-1 {
  z-index: 1;
}
.z-9999 {
  z-index: 9999;
}
.flip-horizontal {
  transform: scale(-1,1);
}
.white-space-nowrap {
    white-space: nowrap;
  }
.white-space-prewrap {
    white-space: pre-wrap;
  }
.relative {
  position: relative;
}
.opacity-50 {
  opacity: 0.5;
}
.box-border {
  box-sizing: border-box;
}
.p-0 {
    padding: var(--spacer-0);
  }
.p-1 {
    padding: var(--spacer-1);
  }
.p-2 {
    padding: var(--spacer-2);
  }
.p-3 {
    padding: var(--spacer-3);
  }
.p-4 {
    padding: var(--spacer-4);
  }
.p-5 {
    padding: var(--spacer-5);
  }
.p-header {
    padding: calc(60px + var(--banner-height)) 0 0 0;
  }
.p-button {
    padding: 5px var(--spacer-2);
  }
.pt-0 {
      padding-top: var(--spacer-0);
    }
.pt-1 {
      padding-top: var(--spacer-1);
    }
.pt-2 {
      padding-top: var(--spacer-2);
    }
.pt-3 {
      padding-top: var(--spacer-3);
    }
.pt-4 {
      padding-top: var(--spacer-4);
    }
.pt-5 {
      padding-top: var(--spacer-5);
    }
.pb-0 {
      padding-bottom: var(--spacer-0);
    }
.pb-1 {
      padding-bottom: var(--spacer-1);
    }
.pb-2 {
      padding-bottom: var(--spacer-2);
    }
.pb-3 {
      padding-bottom: var(--spacer-3);
    }
.pb-4 {
      padding-bottom: var(--spacer-4);
    }
.pb-5 {
      padding-bottom: var(--spacer-5);
    }
.pl-0 {
      padding-left: var(--spacer-0);
    }
.pl-1 {
      padding-left: var(--spacer-1);
    }
.pl-2 {
      padding-left: var(--spacer-2);
    }
.pl-3 {
      padding-left: var(--spacer-3);
    }
.pl-4 {
      padding-left: var(--spacer-4);
    }
.pl-5 {
      padding-left: var(--spacer-5);
    }
.pr-0 {
      padding-right: var(--spacer-0);
    }
.pr-1 {
      padding-right: var(--spacer-1);
    }
.pr-2 {
      padding-right: var(--spacer-2);
    }
.pr-3 {
      padding-right: var(--spacer-3);
    }
.pr-4 {
      padding-right: var(--spacer-4);
    }
.pr-5 {
      padding-right: var(--spacer-5);
    }
.py-20px {
      padding-top: 20px;
      padding-bottom: 20px;
    }
.w-fill {
    width: 100%;
  }
.w-third {
    width: 33.333333%;
  }
.w-fit-content {
    width: -moz-fit-content;
    width: fit-content;
  }
.w-200px {
    width: 200px;
  }
.w-100px {
    width: 100px;
  }
.min-w-18px {
    min-width: 18px;
  }
.min-w-150px {
    min-width: 150px;
  }
.min-w-170px {
    min-width: 170px;
  }
.min-w-300px {
    min-width: 300px;
  }
.min-w-400px {
    min-width: 400px;
  }
.max-w-150px {
    max-width: 150px;
  }
.max-w-200px {
    max-width: 200px;
  }
.max-w-250px {
    max-width: 250px;
  }
.max-w-300px {
    max-width: 300px;
  }
.max-w-350px {
    max-width: 350px;
  }
.max-w-400px {
    max-width: 400px;
  }
.max-w-500px {
    max-width: 500px;
  }
.max-w-550px {
    max-width: 550px;
  }
.max-w-600px {
    max-width: 600px;
  }
.max-w-800px {
    max-width: 800px;
  }
.max-w-100vh {
    max-width: 100vh;
  }
.max-w-auto {
    max-width: auto;
  }
.h-fill {
  height: 100%;
}
.max-h-100vh {
    max-height: 100vh;
  }
.max-h-content {
    max-height: calc(100vh - 60px);
  }
.min-h-200px {
    min-height: 200px;
  }
.text-left {
        text-align: left;
    }
.text-right {
        text-align: right;
    }
.text-center {
        text-align: center;
    }
.font-0 {
        font-size: var(--font-size-0);
    }
.font-1 {
        font-size: var(--font-size-1);
    }
.font-2 {
        font-size: var(--font-size-2);
    }
.font-3 {
        font-size: var(--font-size-3);
    }
.font-semibold {
        font-weight: 500;
    }
.font-bold {
        font-weight: 600;
    }
.lh-default {
        line-height: var(--lh-default);
    }
.lh-condensed {
        line-height: var(--lh-condensed);
    }
.lhextra--condensed {
        line-height: var(--lh-extra-condensed);
    }
.transform-none {
        text-transform: none;
    }
.wrap-break-word {
  overflow-wrap: break-word;
}
.btn {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  gap: var(--spacer-2);
  cursor: pointer;
  vertical-align: middle;
  position: relative;
  padding: 5px var(--spacer-2);
  font-weight: 500;
  font-size: 14px;
  line-height: 20px;
  color: var(--button-tenancy-color);
  background: var(--button-tenancy-bg);
  border: 1px solid var(--colour-btn-bg);
  border-radius: var(--border-radius-default);
  transition: 80ms cubic-bezier(0.33, 1, 0.68, 1);
  text-decoration: none;
  max-width: 100%;
}
.btn:hover {
    background: var(--button-tenancy-bg-hover);
    border-color: var(--colour-btn-hover-bg);
    transition-duration: 0.1s;
  }
.btn svg {
    fill: var(--colour-btn-fg);
    vertical-align: text-bottom;
  }
.btn-icon {
    padding: 5px;
  }
.btn-inline {
    display: inline-flex;
  }
.btn-primary {
    color: var(--colour-btn-primary-fg);
    border: 1px solid var(--colour-btn-primary-bg);
    background: var(--colour-btn-primary-bg);
  }
.btn-primary:hover {
      background: var(--colour-btn-primary-hover-bg);
      border-color: var(--colour-btn-primary-hover-bg);
    }
.btn-primary svg {
      fill: var(--colour-btn-primary-fg) !important;
    }
.btn-danger {
    color: var(--colour-btn-danger-fg);
    border: 1px solid var(--colour-btn-danger-bg);
    background: var(--colour-btn-danger-bg);
  }
.btn-danger:hover {
      background: var(--colour-btn-danger-hover-bg);
      border-color: var(--colour-btn-danger-hover-bg);
    }
.btn-danger svg {
      fill: var(--colour-btn-danger-fg) !important;
    }
.btn-blue {
    color: var(--colour-btn-blue-fg);
    border: 1px solid var(--colour-btn-blue-bg);
    background: var(--colour-btn-blue-bg);
  }
.btn-blue:hover {
      background: var(--colour-btn-blue-hover-bg);
      border-color: var(--colour-btn-blue-hover-bg);
    }
.btn-blue svg {
      fill: var(--colour-btn-blue-fg) !important;
    }
.btn-thin {
    font-weight: 700;
    letter-spacing: 0.02em;
    font-size: 12px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
.btn-outlined,
    .btn-outlined-primary,
    .btn-outlined-danger {
      border-color: var(--colour-btn-outlined-border);
      background: var(--colour-bg-default);
    }
.btn-outlined:hover, .btn-outlined-primary:hover, .btn-outlined-danger:hover {
        background: var(--colour-btn-outlined-hover-bg);
      }
.btn-outlined-primary {
      color: var(--colour-fg-brand);
    }
.btn-outlined-primary svg {
        fill: var(--colour-fg-brand);
      }
.btn-outlined-danger {
      color: var(--colour-fg-danger);
    }
.btn-outlined-danger svg {
        fill: var(--colour-fg-danger);
      }
.btn-subtle,
    .btn-subtle-primary,
    .btn-subtle-danger {
      border-color: transparent;
      background: none;
    }
.btn-subtle:hover, .btn-subtle-primary:hover, .btn-subtle-danger:hover {
        background: var(--colour-btn-outlined-hover-bg);
        border-color: var(--colour-btn-outlined-hover-bg);
      }
.btn-subtle-primary {
      color: var(--colour-btn-primary-bg);
    }
.btn-subtle-primary svg {
        fill: var(--colour-btn-primary-bg) !important;
      }
.btn-subtle-danger {
      color: var(--colour-btn-danger-bg);
    }
.btn-subtle-danger svg {
        fill: var(--colour-btn-danger-bg) !important;
      }
.btn-link,
    .btn-link-primary,
    .btn-link-danger {
      border: none;
      padding: 0;
      background: none;
      color: var(--colour-fg-default);
    }
.btn-link svg, .btn-link-primary svg, .btn-link-danger svg {
        fill: var(--colour-fg-default);
      }
.btn-link:hover {
      color: var(--colour-fg-info);
      background: none;
    }
.btn-link:hover svg {
        fill: var(--colour-fg-info);
      }
.btn-link-primary:hover {
      color: var(--colour-fg-brand);
      background: none;
    }
.btn-link-primary:hover svg {
        fill: var(--colour-fg-brand);
      }
.btn-link-danger:hover {
      color: var(--colour-fg-danger);
      background: none;
    }
.btn-link-danger:hover svg {
        fill: var(--colour-fg-danger);
      }
/* Account settings — the read-only Email field.
 *
 * What remains of the Fusion account-redesign port. The `account-section` card
 * it belonged to is gone: the settings pages now use the shared `sysadmin`
 * section card, so the wrapper classes (`.account-section`, `__header`,
 * `__title`, `__subtitle`, `__body`, `--split`, `.account-savehint`) and every
 * rule scoped under `.account-section__body` had no markup left to style and
 * were removed with it. The field styling those rules provided for the profile
 * form now lives in `_blocks/settings-admin` under `settings-admin__legacy-form`.
 *
 * This block stays because `settings/account/pro-file` still renders it: the
 * email is shown as read-only information rather than a greyed-out disabled
 * input, which reads as broken.
 */
.account-readonly-field {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    max-width: 400px;
    padding: 5px 10px;
    min-height: 32px;
    box-sizing: border-box;
    background: var(--colour-bg-default);
    border: 1px solid var(--colour-border-default);
    border-radius: 6px;
    font-size: 14px;
    /* Subtle grey text signals the email is read-only (inactive). */
    color: var(--colour-fg-subtle);
}
.account-readonly-field__value {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    margin-right: auto;
}
/* Lock cue + "Read only" pill — shown in both themes so the email always reads
   as a deliberate read-only field, not a broken disabled input. */
.account-readonly-field::before {
    content: "\01F512";
    font-size: 12px;
    opacity: .7;
}
.account-readonly-field::after {
    content: "Read only";
    flex: 0 0 auto;
    font-size: 11px;
    color: var(--colour-fg-muted);
    border: 1px solid var(--colour-border-default);
    padding: 1px 7px;
    border-radius: 10px;
}
/* Dark theme: recessed surface + muted value text. Colours from the dark-theme
   profile redesign — panel #1f1f23 · read-only #252528 · muted #8b93a1. */
[data-theme="dark"] .account-readonly-field {
    background: #252528;
    border-color: rgba(255, 255, 255, .09);
    color: #8b93a1;
}
[data-theme="dark"] .account-readonly-field::after {
    color: #6a7280;
    border-color: rgba(255, 255, 255, .09);
}
/* A row of these sits in one table cell, so the pill has to be able to give
   ground: flex rather than inline-block, and a text element that can be clipped
   without dragging the icon or the tooltip out of alignment with it. */
.label {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  gap: var(--spacer-1);
  max-width: 100%;
  min-width: 0;
  cursor: pointer;
  vertical-align: middle;
  position: relative;
  padding: 3px 9px;
  font-size: 11.5px;
  line-height: 16px;
  letter-spacing: 0;
  text-align: left;
  text-transform: none;
  border-radius: var(--r-r-pill);
  font-weight: 600;
  /* The theme-swapped pair, not the flat `--r-*` values, exactly as
     refresh.css asks: "where a rule can use a semantic token it should". The
     hover below has always read `--label-shared-bg`'s partner, so a fixed fill
     here left the two disagreeing — in dark that was a near-white pill turning
     #242424 under text that stayed #5b6678. Light is unchanged: its
     `--label-shared-bg` now points at `--colour-label-bg`, which is `--r-fill`.
     The variants below stay flat on purpose — a badge is the same colour in
     both themes, and was on govt-core-dev too. */
  background: var(--label-shared-bg);
  /* Transparent rather than absent so a variant that wants an edge can set a
     colour without the pill changing size. */
  border: 1px solid transparent;
  color: var(--colour-label-fg);
  white-space: normal;
}
/* `vertical-align: middle` aligned the icon to the middle of the x-height,
     which is not the middle of the pill — every icon sat a pixel or so high,
     and an icon-only pill was visibly off-centre. A flex box of its own centres
     it against the pill instead of against the text it may not even have. */
.label__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    /* Same height as the text's line box, so an icon-only pill is exactly as
       tall as the ones beside it instead of sitting 3px short in the row. */
    min-height: 16px;
    line-height: 0;
  }
/* The only part that may be cut short. `min-width: 0` is what lets it: a flex
     item's automatic minimum size is its content, so without this the label
     widens its column instead of ellipsising. utils/truncation.js puts the full
     text back on hover whenever this actually clips. */
.label__text {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
.label:hover {
    background: var(--label-shared-bg-hover);
  }
.label-info {
    background: var(--colour-label-info-bg);
    border-color: var(--colour-label-info-bg);
    color: var(--colour-label-info-fg);
  }
.label-info svg {
      fill: var(--colour-label-info-fg);
    }
.label-info:hover {
      background: var(--colour-label-info-hover-bg);
      border-color: var(--colour-label-info-hover-bg);
    }
.label-success {
    background: var(--colour-label-success-bg);
    border-color: var(--colour-label-success-bg);
    color: var(--colour-label-success-fg);
  }
.label-success svg {
      fill: var(--colour-label-success-fg);
    }
.label-success:hover {
      background: var(--colour-label-success-hover-bg);
      border-color: var(--colour-label-success-hover-bg);
    }
.label-danger {
    background: var(--colour-label-danger-bg);
    border-color: var(--colour-label-danger-bg);
    color: var(--colour-label-danger-fg);
  }
.label-danger svg {
      fill: var(--colour-label-danger-fg);
    }
.label-danger:hover {
      background: var(--colour-label-danger-hover-bg);
      border-color: var(--colour-label-danger-hover-bg);
    }
.label-attention {
    background: var(--colour-label-attention-bg);
    border-color: var(--colour-label-attention-bg);
    color: var(--colour-label-attention-fg);
  }
.label-attention svg {
      fill: var(--colour-label-attention-fg);
    }
.label-attention:hover {
      background: var(--colour-label-attention-hover-bg);
      border-color: var(--colour-label-attention-hover-bg);
    }
/* Orange. Used by the Data Expiration countdown in the Files status column, which sits beside the
     amber `attention` labels and has to be told apart from them at a glance. */
.label-expiry {
    background: var(--colour-label-expiry-bg);
    border-color: var(--colour-label-expiry-bg);
    color: var(--colour-label-expiry-fg);
  }
.label-expiry svg {
      fill: var(--colour-label-expiry-fg);
    }
.label-expiry:hover {
      background: var(--colour-label-expiry-hover-bg);
      border-color: var(--colour-label-expiry-hover-bg);
    }
.label-version {
    background: var(--color-default-fg);
    color: var(--color-scale-neutral-0);
  }
.label-version svg {
      fill: var(--color-scale-neutral-0);
    }
.label-version:hover {
      background: var(--color-default-bg);
      color: var(--color-default-fg);
    }
.label-version:hover svg {
        fill: var(--color-default-fg);
      }
.label-white {
    border: 1px solid var(--r-ctl);
    color: var(--r-muted);
    background: #fff;
  }
.label-submission {
    background: var(--colour-label-submission-bg);
    color: var(--r-brand);
    border-color: transparent;
  }
.label-submission svg {
      fill: var(--r-brand);
    }
.label-submission:hover {
      background: var(--colour-label-submission-bg);
      color: var(--r-brand);
      border-color: transparent;
    }
.label-submission:hover svg {
        fill: var(--r-brand);
      }
/* On a phone a label gives up its text and shows its icon alone, because the
   status column is a sliver. But only when there IS an icon: the text span
   used to carry `hide-on-phone` unconditionally, so a label without one — "New
   to this Hub" on a recipient about to be added — rendered as an empty
   coloured box with nothing in it at all. */
@media only screen and (max-device-width: 640px) {
  .label:has(.label__icon) .label__text {
    display: none;
  }
}
/* Count badges — a version count inside a dropdown trigger. Horizontal padding
   has to go or `min-width` doubles their size.

   The guard is not about specificity: `.label.text-center` is ALSO what a
   status tag renders, and a status tag carries only its colours inline. Its
   geometry is still a class rule's to set, so without this the count badge's
   22px min-width and 2px padding squash every user-defined tag in the files
   table. Having an inline background is what tells the two apart. */
.label.text-center:not([style*="background"]) {
  justify-content: center;
  min-width: 22px;
  padding: 3px 2px;
  background: #3a4763;
  color: #fff;
}
.label-version:not([style*="background"]) {
  justify-content: center;
  min-width: 22px;
  padding: 3px 2px;
  background: #3a4763;
  color: #fff;
}
.nav-link {
    display: flex;
    align-items: center;
    gap: var(--spacer-2);
    cursor: pointer;
    vertical-align: middle;
    position: relative;
    padding: 8px var(--spacer-3);
    font-weight: 500;
    font-size: 14px;
    line-height: 20px;
    transition: 80ms cubic-bezier(0.33, 1, 0.68, 1);
    text-decoration: none;
    color: var(--nav-link-color);
    border-right: solid 3px transparent;
    max-width: 100%;
  }
.nav-link:hover {
      background: var(--colour-nav-hover-bg);
      border-color: var(--colour-nav-hover-bg);
    }
.nav-link svg {
      fill: var(--colour-fg-brand);
      vertical-align: text-bottom;
    }
.nav-link-active {
      background: var(--colour-bg-brand) !important;
      color: var(--colour-fg-brand);
      border-color: var(--colour-fg-brand) !important;
      font-weight: 600;
    }
.sidebar-item {
    padding: 6px 16px;
    color: var(--color-default-fg);
    font-size: 12px;
    font-weight: 600;
}
.dekko-table {
  display: table;
  width: 100%;
  overflow-x: auto;
  max-width: 100%;
  width: 100%;
}
.dekko-table__head {
    z-index: 2;
    display: table-row;
  }
.dekko-table__head .dekko-table__cell {
      border: 0;
      font-weight: 500;
      font-size: var(--font-size-1);
      /* color: var(--colour-fg-subtle); */
      text-transform: uppercase;
      vertical-align: bottom;
    }
.dekko-table__cell {
    position: relative;
    display: table-cell;
    vertical-align: middle;
    padding: var(--spacer-2);
    font-size: var(--font-size-1);
    border-bottom: 1px solid var(--colour-neutral-0);
  }
/* color: var(--colour-fg-default); */
.row-align-top .dekko-table__cell {
      vertical-align: top;
    }
.dekko-table__item {
    display: table-row;
  }
/* A row's `⋯` menu opens under the `⋯`, not at the far edge of the column.
   *
   * `Dd.Trigger` renders a plain `<div>`, so inside a `display: table-cell` it stretches to the whole
   * cell — and ember-basic-dropdown positions the menu against the TRIGGER's box, so
   * `horizontalPosition="right"` pinned the menu to the right edge of the cell rather than to the icon
   * sitting at its left. On the User groups table, whose last column is everything the two narrow ones
   * leave over, that put the menu some 250px away from the button that opened it.
   *
   * Shrink-wrapping the trigger fixes it wherever the pattern is used — User groups and Tenancy users
   * both — without moving the icon itself. */
.dekko-table__cell > .ember-basic-dropdown > .ember-basic-dropdown-trigger,
  .dekko-table__cell > .ember-basic-dropdown-trigger {
    display: inline-flex;
    align-items: center;
  }
.divider-horizontal {
    height: 1px;
    background-color: var(--colour-border-default);
  }
.divider-verticle {
    width: 1px;
    margin: 5px 4px;
    background-color: var(--colour-border-default);
  }
.divider-black {
    background-color: var(--black);
  }
.dropdown-content {
    background: var(--body-bg);
    border: solid 1px var(--colour-border-default);
    padding: 8px;
    min-width: 192px;
    border-radius: 5px;
    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25),
      0px 5px 15px rgba(0, 0, 0, 0.08);
    z-index: 30;
    margin-top: 4px;
    display: block;
  }
.dropdown-content-group * {
      margin: 2px 0;
    }
.dropdown-divider {
    height: 1px;
    background: var(--colour-border-default);
    margin: 8px 0;
  }
/* The More menu is built from toolbar buttons — `.button-file` — so without
   this it rendered as a stack of toolbar buttons inside a popover rather than
   as a menu. */
.ember-basic-dropdown-content .button-file {
  width: 100%;
  justify-content: flex-start;
  padding: 8px 10px;
  border: 0;
  border-radius: 7px;
  background: transparent;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--r-navy);
}
/* The same neutral grey the toolbar row uses, so the More and New file menus answer a hover the way the
   buttons that opened them do. It was `--r-tint` (#eef3fe) here and, underneath that, `_blocks/buttons`
   filled the WRAP with `--colour-action-bg-hover` (#b9e895, a light green) — a menu is wormholed to the
   end of `<body>`, so the `.vlt__head` rule that turns that green off never reached it. Two different
   hover colours for one row, neither of them the row's own. */
.ember-basic-dropdown-content .button-file:hover:not(:disabled) {
  background: var(--btn-hover-bg, rgba(0, 0, 0, 0.06));
  color: var(--r-brand);
}
/* The wrap is a full-width positioning box for the tooltip; the fill belongs on the button inside it, the
   same division the toolbar row makes. Without this the green sits behind the grey and shows around it. */
.ember-basic-dropdown-content .button-file__wrap:hover {
  background: transparent;
}
/* And a DISABLED item gets no fill, the same as a disabled button in the row.
 *
 * `:not(:disabled)` above says which item lights up and not what happens to the rest, so a disabled one
 * fell through to `_blocks/buttons`'s `.button-file__wrap:hover .button-file` and went green. This is the
 * state the More menu is normally IN — every item there needs a selected row, so with nothing selected
 * the whole menu is disabled, which is why it still looked green after the rule above was added. */
.ember-basic-dropdown-content .button-file__wrap:hover .button-file:disabled {
  background: transparent;
}
.ember-basic-dropdown-content .button-file__wrap {
  width: 100%;
  border: 0;
  background: transparent;
  box-shadow: none;
}
.user-card {
  display: flex;
  align-items: center;
}
.user-card__img {
    flex-shrink: 0;
    width: 28px;
    height: 28px;
    max-width: 48px;
    max-height: 48px;
    margin-right: var(--spacer-3);
    /* Matches `.user-info__img` — see the note there. It said that while
       being 30px to that rule's 32px; both are 28px now, so it is true. The 1px black border it
       carried outlined every avatar in the list and ate a pixel of any photo
       behind it. */
    border: 0;
    border-radius: 30%;
    overflow: hidden;
  }
@media (max-width: 900px) {
.user-card__img {
      display: none
  }
    }
.user-card__img img {
      display: block;
      max-width: 100%;
    }
.user-card__content { line-height: var(--lh-condenced); }
.user-card__name {
    font-size: var(--font-size-1);
  }
/* color: var(--colour-fg-default); */
.user-card__name--150 {
      max-width: 150px;
    }
.user-card__name--175 {
      max-width: 175px;
    }
.user-card__name--240 {
      max-width: 210px;
    }
.user-card__email {
    font-size: var(--font-size-0);
    color: var(--secondary-font);
  }
.blank-slate {
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    flex-grow: 1;
}
.blank-slate-heading {
        font-size: var(--font-size-3);
        color: var(--colour-fg-default);
        margin-bottom: var(--spacer-2)
    }
.blank-slate-content {
        font-size: var(--font-size-1);
        color: var(--colour-fg-subtle);
    }
.text-input {
  position: relative;
}
.text-input .icon {
    display: flex;
    align-items: center;
    justify-content: center;
    bottom: 0;
    margin: auto 0;
    right: var(--spacer-2);
    position: absolute;
    top: 0;
    z-index: 1;
  }
.text-input input {
    box-sizing: border-box;
    color: var(--colour-fg-default);
    background: var(--colour-bg-default);
    border: 1px solid var(--colour-border-default);
    border-radius: 4px;
    font-size: var(--font-size-1);
    line-height: 20px;
    margin-top: 0;
    padding: 5px var(--spacer-2);
  }
.text-input input::placeholder {
      color: var(--colour-fg-muted);
      opacity: 0.5;
      font-style: italic;
    }
/* Reserve room on the right so text never slides under the trailing
     icon / clear button when a rightIcon or onClear is present. */
.text-input.text-input-with-icon input {
    padding-right: 32px;
  }
/* Clear ("cross") button; reuses .icon absolute positioning. */
.text-input .text-input-clear {
    border: 0;
    padding: 0;
    background: transparent;
    color: var(--colour-fg-muted);
    cursor: pointer;
  }
.text-input .text-input-clear:hover {
      color: var(--colour-fg-default);
    }
.text-input svg {
    fill: var(--colour-fg-default);
  }
.text-input-large input {
      width: 200px;
    }
.text-input-wide input {
      width: 300px;
    }
.text-input-full input {
      width: 100%;
    }
.date-input {
  position: relative;
}
.date-input .icon {
    display: flex;
    align-items: center;
    justify-content: center;
    bottom: 0;
    margin: auto 0;
    right: var(--spacer-2);
    position: absolute;
    top: 0;
    z-index: 1;
  }
.date-input input {
    color: var(--colour-fg-default);
    background: var(--colour-bg-default);
    border: 1px solid var(--colour-border-default);
    border-radius: 4px;
    font-size: var(--font-size-1);
    line-height: 20px;
    margin-top: 0;
    padding: 5px var(--spacer-2);
    font-variant-numeric: tabular-nums;
  }
.checkbox-input {
    margin: 2px 0;
}
.textarea-input {
  position: relative;
}
.textarea-input textarea {
    box-sizing: border-box;
    color: var(--colour-fg-default);
    background: var(--colour-bg-default);
    border: 1px solid var(--colour-border-default);
    border-radius: 3px;
    font-size: var(--font-size-1);
    line-height: 20px;
    margin-top: 0;
    padding: 5px var(--spacer-2);
    outline: none;
    resize: none;
  }
.textarea-input textarea::placeholder {
      color: var(--colour-fg-muted);
    }
.textarea-input-large textarea {
      width: 200px;
    }
.textarea-input-full textarea {
      width: 100%;
    }
.select-menu {
    background: var(--colour-bg-default);
    border: solid 1px var(--colour-border-default);
    border-radius: 5px;
    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25),
      0px 5px 15px rgba(0, 0, 0, 0.08);
    z-index: 30;
    margin-top: 4px;
    display: block;
    min-width: 192px;
    max-width: 250px;
  }
.select-menu--header {
      padding: var(--spacer-2);
    }
.select-menu--content {
      max-height: 200px;
      overflow: auto;
    }
.select-menu--no-results {
      font-size: var(--font-size-1);
      padding: 5px var(--spacer-2);
    }
.select-menu .text-input {
    width: 100%;
  }
.select-menu .text-input input {
      width: 100%;
    }
.colorpicker {
  padding: 5px;
  box-sizing: initial;
  width: 240px;
  border-radius: 2px;
  background: rgb(255, 255, 255);
}
.colorpicker__items {
    display: flex;
    flex-wrap: wrap;
    gap: 5px;
    align-items: center;
    justify-content: center;
  }
.colorpicker__swatch {
    height: 15px;
    width: 15px;
    position: relative;
    cursor: pointer;
  }
.colorpicker__color-text-container {
    display: flex;
    position: relative;
  }
.colorpicker__selected-color {
    top: 6px;
    left: 5px;
    height: 9px;
    width: 9px;
    cursor: default;
  }
.colorpicker__hex-text-container {
    position: relative;
    flex: 6 1;
  }
.colorpicker__rgb-text-container {
    flex: 3 1;
    display: flex;
    align-items: center;
  }
.colorpicker__hex-text {
    border: none;
    outline: none;
    background: none;
    font-size: 12px;
    color: rgb(51, 51, 51);
    height: 16px;
    width: 80%;
    padding: 0 0 0 20%;
  }
.colorpicker__rgb-text {
    border: none;
    outline: none;
    background: none;
    font-size: 12px;
    color: rgb(51, 51, 51);
    height: 16px;
    width: 36px;
    padding: 0 0 0 6px;
  }
.colorpicker__rbg-label {
    line-height: 16px;
    text-transform: uppercase;
    font-size: 12px;
    color: rgb(153, 153, 153);
  }
.colorpicker__dot--white {
    position: absolute;
    top: 5px;
    right: 5px;
    bottom: 5px;
    left: 5px;
    border-radius: 50%;
    opacity: 1;
    background: rgb(255, 255, 255);
  }
.colorpicker__dot--black {
    position: absolute;
    top: 5px;
    right: 5px;
    bottom: 5px;
    left: 5px;
    border-radius: 50%;
    opacity: 1;
    background: rgb(0, 0, 0);
  }
.statustags__container {
  box-sizing: border-box;
  padding: 10px;
  max-height: 400px;
  min-height: 200px;
  width: 100%;
  border: 1px solid var(--colour-neutral-6);
  border-radius: var(--border-radius-sm);
  margin-top: 10px;
  overflow: auto;
}
/* The same box, sized to what is in it.
 *
 * The 200px floor above is right in a dialog, where the list is the body and a box that grows as rows are
 * added would make the dialog jump under the pointer. On a settings panel it is 200px of empty border
 * around one row, and the margin is a second gap on top of the one the column already provides. */
.statustags__container--fit {
  min-height: 0;
  margin-top: 0;
}
/* A row the HUB's Default sharing put there. It cannot be edited from a document's own panel — the server
 * writes these groups back on every reshare — so it carries no controls at all: the cross is not rendered
 * and the level is stated as text, with the reason written under the group's name.
 *
 * Read as INERT, not as flagged. It was tinted orange, which is this product's attention colour and is
 * what the register is drawn in — so the one row on the panel nobody can act on was also the one row that
 * pulled the eye hardest. A quiet surface and a neutral marker say "this is here, and it is not yours to
 * change", which is what the row means.
 *
 * An inset shadow rather than a left border: a border would move the row's contents 3px against every
 * neighbour, and this list is read as a column. */
.statustags__item--standing {
  /* Translucent grey rather than a palette token, and deliberately: `dark.css` overrides component tokens
   * only, not the base palette, so `--colour-bg-subtle` stays a LIGHT grey in dark mode and would paint a
   * bright strip across a dark panel. `--serenade` had exactly that bug. A neutral at 8% darkens a light
   * surface and lightens a dark one, so one declaration is right in both themes. */
  background: rgba(128, 128, 128, 0.08);
  box-shadow: inset 3px 0 0 rgba(128, 128, 128, 0.45);
}
.statustags__item {
  width: 100%;
  padding: 5px 10px;
  display: flex;
  align-items: center;
  gap: var(--spacer-2);
  box-sizing: border-box;
}
.statustags__item .label {
    cursor: default;
    -webkit-user-select: none;
    user-select: none;
  }
.statustags__item .ember-basic-dropdown-content-wormhole-origin {
    display: none;
  }
/* The trigger holds every status tag on the document, so it is a wrapping row
   in its own right rather than a line of inline-blocks whose spacing came from
   the whitespace between them in the template. */
.statustags__button {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  min-width: 0;
  max-width: 100%;
  border: 0;
  padding: 0;
  margin: 0;
  background: none;
  line-height: 0;
  text-align: left;
}
/* Adding the first tag. The bare `+` glyph read as a stray character in a
   column of pills; this is the same pill, drawn as an empty slot — dashed and
   quiet enough to ignore down a long list, and unmistakably the thing to press
   once you are looking for it. */
/* `.label` is in the selector only for weight: the base badge rule sets a
   fill on every label at the same specificity, and an empty slot has to win. */
.label.statustags__add {
  cursor: pointer;
  border: 1px dashed var(--r-ctl);
  background: transparent;
  color: var(--r-muted);
  font-weight: 500;
}
.label.statustags__add svg {
    fill: currentColor;
  }
.label.statustags__add:hover {
    border-style: solid;
    border-color: var(--r-brand);
    background: var(--r-tint);
    color: var(--r-brand);
  }
.statustags__menu {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-3);
  padding: 15px;
  box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.25);
  border-radius: var(--border-radius-sm);
}
/* The status-tag menu, and the version-count cluster that shares its trigger
   class. `:has(> svg)` separates them: the icon-only trigger is the version
   count, everything else is a row of tags. */
.statustags__button:has(> svg) {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  padding: 0;
  border: 1px solid var(--r-ctl);
  border-radius: var(--r-r-pill);
  background: var(--r-thead);
  color: var(--r-muted);
}
.statustags__button:has(> svg):hover {
  border-color: var(--r-brand);
  background: var(--r-tint);
}
.statustags__button:has(> svg) svg {
  width: 11px;
  height: 11px;
  fill: var(--r-muted);
}
.statustags__menu {
  padding: 12px;
  border: 1px solid var(--r-edge);
  border-radius: var(--r-r-inner);
  background: #fff;
  box-shadow: 0 8px 24px rgba(8, 12, 35, .12);
}
.easysharing-docs__wrapper {
  display: flex;
  align-items: flex-start;
  font-size: 14px;
  font-weight: 500;
  padding: var(--spacer-4);
  margin-bottom: 50px;
  box-sizing: border-box;
  border-radius: 10px;
  flex-direction: column;
  border: solid 1px var(--colour-bg-default);
  background: var(--colour-white);
  color: var(--black);
  max-width: 400px;
  max-height: 400px;
  width: 100%;
  gap: var(--spacer-1);
  overflow-y: auto;
}
.easysharing-docs__wrapper--mb-10 {
    margin-bottom: 10px;
  }
.easysharing-docs__success {
  border-radius: 3px;
  background-color: var(--colour-success-0);
  border: 1px solid var(--colour-success-8);
  font-size: 14px;
  text-align: center;
  color: var(--black);
  padding: var(--spacer-4);
}
.easysharing-docs__error-container {
  background-color: white;
  padding: 24px;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.easysharing-docs__error {
  border-radius: 3px;
  background-color: #FFF3CD;
  border: 1px solid #856404;
  font-size: 14px;
  text-align: center;
  color: var(--black);
  padding: var(--spacer-4);
}
.validator__upload-area {
  border: 2px dashed var(--colour-border-default, #ccc);
  padding: 24px;
  text-align: center;
  border-radius: 10px;
  margin-bottom: 20px;
  transition: all 0.2s ease-in-out;
  cursor: pointer;
  max-width: 400px;
  width: 100%;
}
.validator__upload-area:hover {
  border-color: var(--colour-primary, #f7941e);
  background-color: rgba(247, 148, 30, 0.05);
}
.validator__upload-area--over {
  border-color: var(--colour-primary, #f7941e);
  background-color: rgba(247, 148, 30, 0.1);
  border-style: solid;
  box-shadow: 0 0 10px rgba(247, 148, 30, 0.2);
}
.validator__upload-input {
  display: none;
}
.alert {
  padding: var(--spacer-3, 12px) var(--spacer-4, 16px);
  border-radius: 4px;
  font-size: 14px;
  width: 100%;
  box-sizing: border-box;
}
.alert-warning {
  background-color: #FFF3CD;
  border: 1px solid #FFECB5;
  color: #664D03;
}
.data-expiration__banner {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--spacer-3);
  border-radius: var(--border-radius-sm);
  font-weight: 600;
  text-align: center;
  color: var(--colour-white);
}
.data-expiration__banner--off {
  background-color: var(--colour-brand-dark);
}
.data-expiration__banner--on {
  background-color: var(--orange);
}
/* Attribute filter chips for a fusion hub's toolbar.
 *
 * Ported from the reference's `vlt-filters.css`, narrowed to the chip itself: the class names are kept so
 * the two products draw the same control, and everything around it — the container, the grouping bar, the
 * case-search summary — is left behind, because none of it exists here.
 *
 * The shape is one chip per attribute: an action circle, the name, and — only once a value is set — the
 * value in a tinted tail that reads as part of the same object. */
/* The toggle and the basic-search pill as one unit, so they cannot drift apart when the chips beside them
 * wrap onto a second line. */
.vlt__search-group {
  display: inline-flex;
  align-items: center;
  gap: var(--spacer-2);
  flex-shrink: 0;
}
/* The Basic ↔ Advanced toggle, drawn as the reference draws it: a navy-outlined button rather than
 * another house `Button`.
 *
 * It is an ACTION, not a filter, and the grey `.btn` it used to be sat in the row looking like one more
 * chip — the one control that changes what the whole row IS was the least visible thing in it. */
.vlt__advanced-toggle {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
  gap: var(--spacer-1);
  height: 32px;
  padding: 4px 12px;
  position: relative;
  border: 1px solid var(--colour-brand-dark);
  border-radius: 4px;
  background: var(--colour-bg-brand-subtle);
  color: var(--colour-brand-dark);
  font-weight: 500;
  line-height: 22px;
  cursor: pointer;
  transition: background-color 0.15s ease, color 0.15s ease;
}
.vlt__advanced-toggle:hover {
    background: var(--colour-brand-dark);
    color: var(--colour-white);
  }
.vlt__advanced-toggle:hover svg { fill: var(--colour-white); }
/* The reference also puts a red dot on this button for "filters are set but you are looking at basic
 * search". That state cannot happen here — `toggleMode` clears the search on the way out of a mode, so
 * the chips and what is being searched for can never disagree — so the dot is not ported. */
/* The basic-search pill: one bordered box holding the icon, the field and the clear cross, with the
 * Search button beside it rather than inside. Its width scales with the window and stops at 320px, so it
 * stays a search box rather than growing into half the toolbar. */
.vlt__basic-search {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 32px;
  width: clamp(140px, 30vw, 320px);
  padding: 4px 10px;
  border: 1px solid var(--colour-neutral-2);
  border-radius: 4px;
  background: var(--colour-bg-default);
}
.vlt__basic-search__icon {
    display: inline-flex;
    align-items: center;
    flex-shrink: 0;
    color: var(--colour-fg-subtle);
  }
.vlt__basic-search__input {
    flex: 1 1;
    min-width: 0;
    padding: 0;
    border: none;
    outline: none;
    background: transparent;
    color: var(--colour-fg-default);
    font-size: 14px;
  }
.vlt__basic-search__clear {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    padding: 0;
    border: none;
    background: none;
    line-height: 0;
    cursor: pointer;
  }
/* The click target. The magnifier inside the pill is decorative — it was the only thing there suggesting
 * how to run the search, and it is not a button. */
.vlt__basic-search-btn {
  height: 32px;
  padding: 0 14px;
  border: 1px solid var(--colour-brand-dark);
  border-radius: 4px;
  background: var(--colour-brand-dark);
  color: var(--colour-white);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  transition: opacity 0.15s ease;
}
.vlt__basic-search-btn:hover { opacity: 0.85; }
.vlt__basic-search-btn:focus-visible {
    outline: 3px solid var(--colour-brand);
    outline-offset: 1px;
  }
.vlt__filters {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--spacer-1);
}
/* One chip per attribute.
 *
 * The border and the height are the toggle's, so the row reads as one set of controls rather than as a
 * navy button followed by a line of something else. The reference paints the name on a flat grey fill and
 * nothing else, which in this app's toolbar came out looking like a row of disabled buttons — grey is
 * what every dead control here is — and, worse, said nothing about the thing that matters: whether the
 * filter is SET. A set chip carries the fill and the navy edge; an empty one is an outline. */
.vlt__filter {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  height: 32px;
  padding: 0 4px;
  border: 1px solid var(--colour-neutral-2);
  border-radius: 4px;
  background: var(--colour-bg-default);
  color: var(--colour-brand-dark);
  font-size: 14px;
  line-height: 22px;
  cursor: pointer;
  outline: none;
  transition: background-color 0.15s ease, border-color 0.15s ease;
}
.vlt__filter:hover {
    border-color: var(--colour-brand-dark);
    background: var(--colour-bg-brand-subtle);
  }
.vlt__filter--set {
    border-color: var(--colour-brand-dark);
    background: var(--colour-bg-brand-subtle);
  }
.vlt__filter-name {
  display: flex;
  align-items: center;
  box-sizing: border-box;
  gap: var(--spacer-1);
  padding: 0 4px;
}
/* The value, in a tinted tail that reads as part of the same object rather than as a second control. */
.vlt__filter-value {
  box-sizing: border-box;
  padding: 0 6px;
  margin-left: 2px;
  border-radius: 3px;
  background: var(--colour-info-0);
  max-width: 160px;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.vlt__filter-action {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: none;
  outline: none;
  background: none;
  cursor: pointer;
}
/* The menu a chip opens: the value on one padded row, Apply filling the row under it. Wide enough for a
   date field, which the 192px floor of `.select-menu` clipped. */
.vlt__filter-menu {
  min-width: 240px;
}
/* The rule between the value and the button, drawn as a border on the second row rather than as an
     element of its own — one less node, and it cannot end up on the wrong side of the padding. */
.vlt__filter-menu__foot {
    border-top: 1px solid var(--colour-border-default);
  }
/* The bordered box the fusion modals list things in — one row per attribute, per profile, per group.
 *
 * Its own name rather than the reference's bare `.card`: that class is used by thirty templates in this
 * app and styled by none of them, so defining it would put a border around thirty screens nobody asked
 * to change.
 */
.fusion-card {
  border: 1px solid var(--colour-border-default);
  border-radius: 6px;
  background: var(--colour-bg-default);
}
/* The listing while something is being dragged over it. A tint and a dashed edge, no layout change: a
 * border that appears on drag-enter would shift every row down by a pixel and make the drop target
 * flicker as the pointer crosses a row. */
.valut-table__wrapper--drop-target {
  outline: 2px dashed var(--colour-bg-brand-emphasis);
  outline-offset: -4px;
  background: var(--colour-bg-subtle);
}
/* The in-place viewer. Nearly the whole window, because what it shows is a document — a modal sized to its
 * text would put a page of A4 in a letterbox. */
.modal--fusion-viewer {
  width: calc(100vw - 80px);
  max-width: 1400px;
}
.fusion-viewer {
  display: flex;
  flex-direction: column;
  min-height: 60vh;
}
.fusion-viewer__frame {
    width: 100%;
    /* Fills what the modal leaves after its title and footer. A percentage would resolve against a parent
       with no height of its own and collapse the frame to nothing. */
    height: calc(100vh - 260px);
    border: 0;
  }
.fusion-viewer__image {
    max-width: 100%;
    max-height: calc(100vh - 260px);
    margin: 0 auto;
    object-fit: contain;
  }
.fusion-viewer__media {
    width: 100%;
    max-height: calc(100vh - 260px);
  }
/* No `&__office`. An Office document does not open in this dialog — `openViewer` sends it to the editor's
     own page with `?mode=view`, the way a core hub always has — and the rules that sized a document server
     inside this box went with the markup on 01.09.2026.

     The lesson they carried is kept because it cost a day and still applies wherever that editor is put:
     the iframe sizes itself to its container, so a percentage height is only as good as the shortest link
     in the chain above it. `#only-office` is not that chain — it is the PLACEHOLDER handed to
     `DocsAPI.DocEditor`, which the document server REPLACES as it initialises, so a rule hung on that id
     matches nothing once the editor is up. What has to be given a height is every box between the sized
     ancestor and the frame, the OnlyOffice component's own `div.ember-view` included: give it none and it
     collapses to `auto`, the frame's `height="100%"` resolves against nothing and falls back to the HTML
     default of 150px, and a two-page report opens as a letterbox with its own scrollbar — readable, which
     is exactly what makes it look like a half-loaded file rather than a container with no height.

     The page does this with `.officecontainer` and `.only-office-embed` (`_pages/documents-view.css`). */
.fusion-viewer__text {
    max-height: calc(100vh - 260px);
    overflow: auto;
    white-space: pre-wrap;
    word-break: break-word;
    font-size: var(--font-size-0);
    margin: 0;
  }
/* The list of what a delete is about to destroy. Scrolls on its own once a selection runs long, so the
 * Delete button stays reachable without the dialog growing past the window — a confirmation whose confirm
 * button is off screen is a confirmation nobody can give. */
.fusion-delete-list {
  max-height: 220px;
  overflow-y: auto;
}
/* A File date, which is shown rather than asked for: the stamp on one line and what it is on the next.
 * Sized to sit in the same row as the fields around it, so a sheet of controls does not go ragged where
 * the one read-only row falls. */
.fusion-file-date {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-height: 34px;
  justify-content: center;
}
/* The Type row of the attribute editor.
 *
 * It is the only one of the three rows (Name, Type, Rules) with explanatory text UNDER its control, and
 * that is what breaks it: `flex-group` wraps, so once a line under the picker is wider than the space left
 * beside the 100px label, the whole control column drops to the next line — the picker ends up under the
 * label instead of next to it, out of the column the other two rows line up on. The short "type is fixed"
 * line was narrow enough to get away with it; "filled in for each uploaded file from that file's own
 * last-modified date" was not.
 *
 * Three parts, all needed. The row must not wrap. The label must not be shrunk to pay for that, or its
 * right edge stops matching Name's and Rules'. And the column must be allowed to shrink below its content,
 * so the explanation wraps its own TEXT instead of widening the row. `flex-start` because the label now
 * belongs beside the picker rather than beside the middle of a three-line column. */
.fusion-attr-type {
  flex-wrap: nowrap;
  align-items: flex-start;
}
.fusion-attr-type > label {
  flex-shrink: 0;
}
.fusion-attr-type > .flex-column {
  min-width: 0;
}
/* The attribute sheet shown before an upload. Fields stacked with room for the clear cross that sits
 * outside them on the right — which is why the sheet carries its own right-hand padding rather than
 * letting the cross fall on the modal's edge. */
/* The sheet is narrower than a modal's floor of 560px, which is why this overrides it rather than merely
 * sizing the content: the fields are short and the reference draws them in a narrow column. */
/* The attribute sheet's dialog.
 *
 * NO horizontal padding on the shell, and that is the contract in `_blocks/modal/modal.css` rather than a
 * preference: "the gutter belongs to the body and the footer … on the children, not on `.modal`, because a
 * shell with horizontal padding cannot have a flush footer or a body whose scrollbar sits at its edge."
 * This carried `padding: 0 40px` and produced both of those, which is how it was reported — the footer's
 * grey band stopped 40px short of the dialog on each side with white beyond it, and on a short screen the
 * body's scrollbar floated 40px inside the right edge instead of running down it.
 *
 * The gutter is not lost, it moves: `.modal__content` already carries `16px 24px` and `.modal__footer`
 * `14px 24px`, so the fields sit 24px in like every other dialog in the app and the buttons line up with
 * them. The dialog keeps its 440px — narrower than the 560px floor, which is what `min-width: 0` is for. */
.modal--fusion-attrs {
  min-width: 0;
  width: 440px;
}
/* The question asked before that sheet, when a lot of files are dropped at once.
 *
 * Sized to the modal's own floor rather than under it: this one is PROSE — two paragraphs weighing an
 * archive against separate rows — and 440px would set them in a column narrow enough to be a wall of text.
 * 560px is the width the rest of the app calls a dialog.
 *
 * A width at all is the point. `.modal` declares `min-width: 560px` and no `width`, so a dialog naming no
 * class is as wide as the backdrop lets it be: this one drew at 1694px on a 1694px window, each paragraph
 * one line running the full width of the screen, which is the hardest possible way to read a choice. */
.modal--fusion-many-files {
  width: 560px;
}
.fusion-attr-sheet {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-3);
  width: 100%;

  /* What the FILE says about its own classification, under the field that asks it.
   *
   * Quiet on purpose. It is a fact offered, not an answer given, and it sits directly beneath a control
   * the person still owns — at field weight it would read as the value, which is exactly the confusion
   * worth avoiding when the subject is a security marking. The same relationship, and nearly the same
   * treatment, as the line under a File date.
   *
   * `--clear-spacer` above keeps the fields aligned; this one is deliberately full width instead, because
   * the sentence wraps and lining it up under the control would leave it in a narrower column than the
   * text it is explaining. */
}
/* No scroll of its own. A tenancy can define forty attributes and a profile can show all of them, but
     the dialog body is the single scroll region under the contract in modal.css — a second one nested
     inside it is two scrollbars for one form. */
.fusion-attr-sheet__field {
    display: flex;
    flex-direction: column;
    gap: var(--spacer-1);
  }
/* The field and its clear cross on one line. The cross used to hang outside the field on `position:
     absolute`, which put it past the edge of a modal this narrow — visible in the screenshot as four red
     crosses sitting on the border. A flex row keeps it inside whatever width the modal happens to have. */
.fusion-attr-sheet__row {
    display: flex;
    align-items: center;
    gap: var(--spacer-2);
  }
.fusion-attr-sheet__control {
    flex: 1 1;
    min-width: 0;
  }
.fusion-attr-sheet__clear {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    cursor: pointer;
    background: none;
    border: 0;
    padding: 0;
  }
/* A field the upload is waiting on. Shown as well as said: the sheet scrolls, and a sentence at the
     foot of it is a sentence nobody reads — which made a blocked upload look like a dead button. */
.fusion-attr-sheet__field--missing input,
  .fusion-attr-sheet__field--missing .ember-power-select-trigger {
    border-color: var(--colour-fg-danger);
  }
/* Keeps the fields lined up when only some of them carry a cross — a required attribute has none. */
.fusion-attr-sheet__required {
    color: var(--colour-fg-danger);
    margin-left: 2px;
  }
.fusion-attr-sheet__clear-spacer {
    flex: 0 0 auto;
    width: 16px;
  }
/* Running text, not a flex row. It was a row, and the marking took a line of its own above the
     sentence — which read as a heading, or worse as the answer, when the whole point is that the field
     below is still unanswered. In flow the marking is simply the object of the sentence and wraps with
     it. */
.fusion-attr-sheet__label {
    margin: 0;
    font-size: var(--font-size-0, 12px);
    line-height: 1.5;
    color: var(--colour-fg-subtle);
  }
/* The folder will not accept the marking the file carries. This one IS a warning — not about the
     document, but about what pressing Confirm would do — so it takes the danger colour the sheet already
     uses for a field holding the upload up. */
.fusion-attr-sheet__label-refused {
    color: var(--colour-fg-danger);
  }
/* The second classification control: what the files carrying no marking of their own should be.
   *
   * Indented and ruled off rather than made a field of its own, because it is not another attribute — it
   * is the same one, asked about a subset. At field weight in the flat list it would read as a second
   * Classification column in the register, which there is not. */
.fusion-attr-sheet__remainder {
    display: flex;
    flex-direction: column;
    gap: var(--spacer-1);
    margin-left: var(--spacer-3);
    padding-left: var(--spacer-3);
    border-left: 2px solid var(--colour-border-default);
  }
/* The option list inside the attribute editor: its own scroll region, so however many options an
 * attribute carries, the fields below it — Rules, the error line, Save — stay where they were. Before
 * this the dialog grew by one row per option and everything after the list went off the bottom. */
.fusion-attr-options {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-2);
  max-height: 260px;
  overflow-y: auto;

  /* Room for the scrollbar, so it never sits on top of a remove button. */
  padding-right: var(--spacer-1);
}
/* The two rows that stand in for everything the window is not drawing.
 *
 * Rows, because the listing is a `display: table` and anything that is not one becomes an anonymous row;
 * the height goes on the CELL, because a table-row takes its height from its contents and an empty one
 * collapses whatever it is told. None of the row chrome — borders, hover, padding — belongs on something
 * that is only holding the scrollbar honest. */
.fusion-virtual-spacer {
  border: 0;
  background: none;
}
.fusion-virtual-spacer:hover {
    background: none;
  }
.fusion-virtual-spacer__cell {
    padding: 0;
    border: 0;
  }
/* The file history modal: a column of version cards, each one line until it is unfolded.
 *
 * The measurements repeat the attribute sheet's — `--spacer-2` between cards, `--spacer-3` inside — so the
 * two modals a document offers read as one product. The attribute lines inside an unfolded row are a
 * two-column grid rather than label-over-value pairs: a snapshot is read by scanning for one field, and a
 * left column of names is what makes that scan possible. */
.fusion-attr-import {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-1);
  padding: var(--spacer-2) var(--spacer-3);
}
/* Room for the remove button's column, so the headers sit over their own columns and not over it. */
.fusion-attr-options__head-gap {
  width: 24px;
  flex-shrink: 0;
}
.fusion-history {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-2);
}
/* The two questions this modal answers — what the file held, and what has been done to it. Named into
     this block although the bar sits above `.fusion-history` in the DOM: it belongs to the history, and a
     second block name for two buttons would be a block nobody remembers. */
.fusion-history__tabs {
    display: flex;
    gap: var(--spacer-3);
    margin: 0 0 var(--spacer-2);
    padding: 0 var(--spacer-3);
    border-bottom: 1px solid var(--colour-border-default);
  }
.fusion-history__tab {
    appearance: none;
    background: none;
    border: 0;
    border-bottom: 2px solid transparent;
    padding: var(--spacer-1) 0;
    font: inherit;
    color: var(--colour-fg-subtle);
    cursor: pointer;
  }
.fusion-history__tab:hover { color: var(--colour-fg-default); }
/* Keyboard focus stays visible: these are the only controls at the top of the modal. */
.fusion-history__tab:focus-visible {
      outline: 2px solid var(--colour-brand-dark);
      outline-offset: 2px;
    }
.fusion-history__tab--on {
      color: var(--colour-fg-default);
      border-bottom-color: var(--colour-brand-dark);
    }
.fusion-history__row {
    /* On the card, not the line: an unfolded row keeps one padding box around both halves. */
    padding: var(--spacer-2) var(--spacer-3);
  }
.fusion-history__line {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--spacer-3);
  }
.fusion-history__what {
    display: flex;
    flex-direction: column;
    gap: var(--spacer-1);
    /* The side that gives way: the date wraps before the size and Download are pushed off the card. */
    min-width: 0;
  }
.fusion-history__actions {
    display: flex;
    align-items: center;
    gap: var(--spacer-3);
    /* Never squeezed — a Download that wraps mid-word reads as two links. */
    flex-shrink: 0;
  }
.fusion-history__attributes {
    display: flex;
    flex-direction: column;
    gap: var(--spacer-1);
    margin-top: var(--spacer-2);
    padding-top: var(--spacer-2);
    /* The rule between the line and its snapshot, same as the one under the filter menu's value row. */
    border-top: 1px solid var(--colour-border-default);
  }
.fusion-history__attribute {
    display: grid;
    /* Wide enough for "Classification level", narrow enough that short names do not strand the values
       in the middle of the card. */
    grid-template-columns: 160px 1fr;
    gap: var(--spacer-2);
    align-items: baseline;
  }
/* A date filter: a list of periods, and the calendar only behind the one entry that needs it.
 *
 * Two controls where every other type has one, which is the price of answering both "recently" and "on this
 * particular day" — and the reason it does not read as two questions is that the second does not exist until
 * the first has been answered with "Specific date", and then appears directly beneath the answer that
 * summoned it. A column with one gap, not a pair of fields side by side.
 *
 * The gap is not decoration. Without it the calendar field butts against the trigger above it and the two
 * read as one broken control; `--spacer-2` is what separates the value row from the Apply row in the same
 * menu, so the space inside matches the space around.
 *
 * Both children fill the row rather than taking the 200px the other selects take. This menu is 240px wide
 * and its text and number filters already fill; a control stopping 30px short of the edge in a box that
 * narrow reads as misaligned rather than as sized. */
.fusion-date-filter {
  display: flex;
  flex-direction: column;
  gap: var(--spacer-2);
}
.fusion-date-filter .ember-power-select-trigger {
    width: 100%;
  }
/* A date attribute's field, wherever one is drawn — the filter chip and the attribute sheet both.
 *
 * `DateTimePicker` renders a calendar button and a text field as siblings, and the rules that put the one
 * inside the other live under `.field--style-4` (forms.css). Neither of these is in that scope, so the
 * icon came out on a line of ITS OWN ABOVE the field: two stacked controls where there should be one, and
 * the calendar sitting where a label belongs.
 *
 * One rule rather than a copy per caller, because it is the same control answering the same question. */
.fusion-date-field {
  position: relative;
}
.fusion-date-field .icon {
    position: absolute;
    right: 8px;
    /* Centred against the wrapper, which the margin reset below makes exactly the height of the field. */
    top: 50%;
    transform: translateY(-50%);
    display: flex;
    align-items: center;
    cursor: pointer;
  }
.fusion-date-field .field__input {
    box-sizing: border-box;
    width: 100%;
    /* 32px is what every control beside it is — the text inputs and the PowerSelect triggers both. Without
       a height of its own this field was 16px of bare line, so it read as text rather than as a field and
       the calendar had nothing to centre against. */
    height: 32px;
    /* The house `.field__input` carries a top margin for the label it usually sits under. There is no label
       here — the attribute's name is already in the row's own — and the margin made the wrapper 47px tall
       around a 32px field, which is what the calendar was centring against. */
    margin: 0;
    /* Room on the right for the calendar, so a typed date never runs under it. */
    padding: 0 34px 0 10px;
    border: 1px solid var(--colour-neutral-2);
    border-radius: 4px;
    background: var(--colour-bg-default);
    color: var(--colour-fg-default);
    outline: none;
  }
/* Adding a group — the share panel, and the hub's Default sharing page, which does the same thing.
 *
 * The control was a small centred dropdown button labelled "Select a group", floating above the list of who
 * already has access. It did not read as the action the panel exists for — centred and narrow, it looked
 * like a caption or a filter, and people did not find it.
 *
 * So it fills the space it is given and sits directly on the list it adds to. The width has to be taken here
 * rather than on the button: `SelectMenu` caps its own trigger at `max-w-200px`, and that trigger sits
 * between the template and the button, so a class on the button alone is overruled by an element it cannot
 * reach. */
.fusion-group-add .ember-basic-dropdown-trigger {
    max-width: none;
    width: 100%;
  }
.fusion-group-add .fusion-add-group {
    width: 100%;
    /* Left, with the chevron pushed to the far edge — the same shape as the level dropdown on every row
       below it, so the two read as the same kind of control. */
    justify-content: space-between;
  }
/* After the design system, which owns how a `.button-file` looks inside a dropdown:
   the toolbar block adds the colour on top of that shape rather than replacing it. */
/* =============================================================================
   `.vlt__head` — the file toolbars
   =============================================================================

   Everything inside a `.vlt__head` is owned here: the classic listing's toolbar,
   the fusion listing's, and the loading skeleton that stands in for both. The
   menus they open are owned here too, since a wormholed dropdown is not inside
   the toolbar in the DOM and cannot inherit from it.

   WHAT CHANGED, AND WHY

   The row used to be filled chips — a tinted background, a 1px border and a drop
   shadow around every button, with the group's meaning carried by the tint (paler
   blue for uploads, green for actions). With eight to sixteen buttons on the line
   that meant eight to sixteen boxes competing at equal weight, and the icon inside
   each box — the only part that says what the button does — was the quietest thing
   in it. The chips are gone. What tells one button from the next is now the icon
   and the icon's own colour, one per action rather than one per cluster.

   The label did not disappear with them: it is in the DOM in both states, and
   `--collapsed` decides whether it is on screen. NAMED is the default — the row
   opens with its names — and the ⓘ at the end collapses it to icons for anyone who
   has learnt the set. That is the opposite of the left nav's default, on purpose;
   `services/toolbar` carries the reasoning. Collapsed, every button still answers a
   hover with its name, through the same EmberTooltip the disabled ones use.

   ONE OWNER: no rule outside this file may set colour, fill, background, padding
   or radius on a `.button-file` inside `.vlt__head`. The cluster fills that used
   to live in `_blocks/buttons/buttons.css` and the orange Index chip in
   `_blocks/fusion-catalog/fusion-catalog.css` were both removed when this arrived;
   `.button-file`'s base rule still owns the chip on the guest-access page, which
   is not a `.vlt__head` and keeps the old look on purpose.
   ========================================================================== */
:root {
  /* The palette, in one place, because half of it is applied inside `.vlt__head`
     and half inside menus that render at the end of `<body>`. Two lists would
     drift; one list cannot.

     The left half of the toolbar is three jobs and three colours: bringing bytes in
     that already exist (teal), making a container for them (blue), and making a new
     document from nothing (purple). Inside the New file menu the three templates
     split again, each on the colour its own file type wears elsewhere — Word blue,
     Excel green, PowerPoint orange — so the menu is read by colour before it is read
     by word.

     All at the 800 step of their ramp, which is what holds them apart from each other
     AND from the near-black on the right. That near-black is the fourth job: acting on
     something already in the hub. It is the strongest thing in the row on purpose, being
     the half of the toolbar that changes a file rather than adding one. */
  --btn-upload: #00695C;
  --btn-create: #0277BD;
  --btn-new-file: #6A1B9A;
  --btn-new-doc: #1565C0;
  --btn-new-sheet: #2E7D32;
  --btn-new-slides: #EF6C00;
  --btn-action: #212121;

  /* Disabled — and nothing else. This grey is reserved: the moment a live button
     wears it, the row stops being able to say what it will accept. */
  --btn-inactive: #BDBDBD;

  /* The register's own deep orange, and the ⓘ toggle. Neither is an action on a
     file: one opens the whole tenancy's register, the other changes the toolbar.
     They are the two buttons in the row allowed a colour nothing else uses. */
  --btn-index: #BF360C;
  --btn-info: #AD1457;

  --btn-hover-bg: rgba(0, 0, 0, 0.06);
}
/* --- the left-hand slot --------------------------------------------------- *

   One box holding two things that are never shown together: the controls for
   ADDING something, and the banner saying what is selected. They used to swap
   with an `{{#if}}`, and the swap changed the toolbar's HEIGHT — the banner is a
   few hundred pixels wide where the add controls are about 640, so on a laptop
   the row stopped wrapping the moment something was ticked and the whole listing
   jumped up by the line it lost. Measured 13.09.2026 at 1440x790: 90px to 42px,
   a 48px jump against a row 67px tall, which is enough to put the NEXT file
   under a pointer that has not moved. The second click of a double-click then
   opens the wrong file, and nobody is quick enough to stop it.

   So nothing is removed. The add controls keep their box and go invisible; the
   banner is laid over that same box. `visibility: hidden` rather than `display:
   none` is the whole mechanism — the space stays, so the height cannot move, at
   any width and without measuring anything. It also takes the hidden buttons out
   of the tab order and out of reach of the pointer, which `opacity: 0` would not.

   The two are stacked by GRID rather than by absolute positioning, and that is
   not a stylistic preference — the absolute version shipped on 13.09.2026 and
   broke the Archive. There the add controls are `{{#unless this.isArchived}}`, so
   the group renders NO children and collapses to 0x0; an `inset: 0` banner inside
   a 0x0 box is itself 0x0, and its content — a count and a button — simply
   overflowed in both directions and painted across the toolbar. `Restore` was
   still there, still the right size, and unclickable: e2e caught it as
   "`<button data-test-document-restore>` is being covered by
   `<button data-test-deselect-docs>`".

   Worth recording HOW that hid: the two boxes do not intersect, because the
   banner's box is zero. A rectangle test says there is no overlap and is wrong.
   `document.elementFromPoint` over the Restore button is what tells the truth,
   and it is what this was finally verified with.

   One grid cell holding both children has neither problem. The slot sizes to the
   LARGER of them: to the add controls where there are some, so the banner lies
   over exactly them and the height cannot move; and to the banner itself in the
   Archive, where there are none — nothing overflows because nothing is being
   squeezed into a box of zero. */
.vlt__head__slot {
  display: grid;
}
.vlt__head__slot > * {
  grid-area: 1 / 1;
}
.vlt__buttons--replaced {
  visibility: hidden;
}
.vlt__head__slot > .valut__head-deselect {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
}
/* --- the button, flattened ------------------------------------------------ */
.vlt__head .button-file {
  background-color: transparent;
  box-shadow: none;
  border-color: transparent;
  border-radius: var(--r-r-ctl, 8px);
  padding: 7px 9px;
  gap: 9px;
  color: var(--btn-action);
}
/* The label follows the icon rather than keeping a colour of its own — expanded,
   a near-black name beside a deep green icon read as two separate things stuck
   together. `inherit` also means every rule below sets one property, not two. */
.vlt__head .button-file__dscr {
  color: inherit;
  font-size: 12px;
  white-space: nowrap;
}
/* `.theme-icon` sets `fill` with `!important` — it is how the header icons go
   white in the dark theme — so taking the fill back needs the same weight plus a
   longer selector. The icons themselves ship `fill="currentColor"`, so this is
   only undoing that override, not choosing a colour.

   24px, which is what the four header icons are: with the chips gone the icon is
   the whole button, and at the old 20px it was a small mark floating in a large
   click target rather than the thing being clicked. Sized here rather than at the
   ninety-odd `svg-jar` call sites, which pass `width=25 height=20` — a 25-wide box
   for a square glyph, so the extra 5px never drew anything anyway; the viewBox is
   1:1 and `preserveAspectRatio` had already been fitting it to the 20. One rule
   also means the row cannot end up half one size and half another. */
.vlt__head .button-file svg {
  fill: currentColor !important;
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
}
/* The hover moves off the wrap and onto the button. The wrap is a positioning box
   for the tooltip and is as tall as the row, so lighting IT up drew a panel around
   the button rather than under it — and, since it does not know whether the button
   inside is disabled, it lit up for buttons that cannot be clicked too. `:not(:disabled)`
   on the button answers both. The wrap's own hover fill from `_blocks/buttons` is
   turned off here rather than deleted there: the guest-access page still uses it. */
.vlt__head .button-file__wrap:hover {
  background-color: transparent;
}
.vlt__head .button-file__wrap:hover .button-file:not(:disabled) {
  background-color: var(--btn-hover-bg);
}
/* And a DISABLED one gets no fill at all, rather than the green it was getting.
 *
 * `:not(:disabled)` above says which button lights up; it does not say what happens to the one that does
 * not. `_blocks/buttons` fills `.button-file__wrap:hover .button-file` with `--colour-action-bg-hover`
 * (#b9e895, a light green) at the same specificity as the rule above minus the pseudo-class, so a
 * disabled button fell through to it — which is why hovering Download, View or Edit with nothing selected
 * lit them green while Upload and Create, enabled, went grey. Reported as exactly that inconsistency.
 *
 * Transparent, not grey: a fill is the affordance that says "this responds", and these do not. */
.vlt__head .button-file__wrap:hover .button-file:disabled {
  background-color: transparent;
}
/* --- who is which colour -------------------------------------------------- */
.vlt__head .button-file--upload { color: var(--btn-upload); }
.vlt__head .button-file--create { color: var(--btn-create); }
.vlt__head .button-file--new-file { color: var(--btn-new-file); }
.vlt__head .button-file--index { color: var(--btn-index); }
.vlt__head .button-file--info { color: var(--btn-info); }
/* Beats every line above it on the pseudo-class, which is what we want: whatever a
   button's colour is, off is off. Colour only — the fade comes from the reset's
   `[disabled]` rule, which is `!important` and applies to all three toolbars anyway. */
.vlt__head .button-file:disabled {
  color: var(--btn-inactive);
}
/* --- collapsed, when asked for -------------------------------------------- */
/* The one thing the collapse trades away. Scoped to `.vlt__head--collapsed`, which
   a menu rendered into the wormhole at the end of `<body>` is never inside — so the
   New file and More menus keep their names in both states, as they must: a menu of
   unlabelled icons is a guessing game, and those two are where the toolbar's less
   common actions live. */
.vlt__head--collapsed .button-file__dscr {
  display: none;
}
/* A square target around a 24px icon: 8px each side puts the button at 40px, which
   is the smallest thing worth aiming at with a mouse and matches the header row's
   own hit area. `min-width` rather than `width` so a button that somehow keeps a
   label — a `--collapsed` toolbar rendered before the class lands, say — grows
   rather than clipping it. */
.vlt__head--collapsed .button-file {
  justify-content: center;
  padding: 8px;
  min-width: 40px;
}
/* --- the menus ------------------------------------------------------------ */
/* `.ember-basic-dropdown-content .button-file` in `design-system/components/dropdown.css`
   makes these look like menu rows — full width, left-aligned, transparent — and that
   stays. This adds only what it does not set: the colour, and the fill override that
   `.theme-icon` would otherwise win. */
.files-nav__dropdown--actions .button-file,
.files-nav__dropdown--new-office .button-file {
  color: var(--btn-action);

  /* Icon and word were touching. `dropdown.css` left-aligns these rows and
     `files-nav.css` pads them, but neither sets what separates the two things
     inside a row — the toolbar's own buttons get it from `gap` and these did not
     because that rule is scoped to `.vlt__head`. A menu row is wider and reads
     as a line of text, so it takes a little more than the 9px the toolbar uses. */
  gap: 12px;
}
.files-nav__dropdown--new-office .button-file--new-doc { color: var(--btn-new-doc); }
.files-nav__dropdown--new-office .button-file--new-sheet { color: var(--btn-new-sheet); }
.files-nav__dropdown--new-office .button-file--new-slides { color: var(--btn-new-slides); }
/* THE MENUS KEEP THEIR WORDS ON A PHONE.
   `_blocks/buttons` hides every `.button-file__dscr` below 640px device-width. That
   is right for the toolbar — a fixed row of icons you learn once, with the names a
   tap away — and wrong in here, where it left the More menu as a column of nine
   unlabelled marks: nothing distinguishes Move from Delete from Rename except an
   icon, there is no tooltip to fall back on with no pointer to hover, and the menu
   had collapsed to about the width of one icon. A menu of unlabelled icons is a
   guessing game, and this is where the toolbar's least-used actions live.

   Two classes deep, so it outranks that rule wherever it applies. `display: flex`
   rather than `block` because the row is a flex container and this span is what
   gives it a second item to space against. */
.files-nav__dropdown--actions .button-file__dscr,
.files-nav__dropdown--new-office .button-file__dscr {
  display: flex;
  white-space: normal;
  text-align: left;
}
/* Wide enough for the longest label ("Take ownership of uploads"), and never wider
   than the screen it opens on — the menu is right-anchored, so on a narrow phone an
   unbounded one would have run off the left edge instead of wrapping. */
.files-nav__dropdown--actions,
.files-nav__dropdown--new-office {
  min-width: 210px;
  max-width: calc(100vw - 24px);
}
.files-nav__dropdown--actions .button-file svg,
.files-nav__dropdown--new-office .button-file svg {
  fill: currentColor !important;
}
.files-nav__dropdown--actions .button-file:disabled,
.files-nav__dropdown--new-office .button-file:disabled {
  color: var(--btn-inactive);
}
/* The hover in dropdown.css re-colours the row to the brand; the icon has to come
   with it or it stays green on a blue-tinted row. */
.files-nav__dropdown--actions .button-file:hover:not(:disabled),
.files-nav__dropdown--new-office .button-file:hover:not(:disabled) {
  color: var(--r-brand);
}
/* --- the header row ------------------------------------------------------- */
/* The four icons at the top right — profile, knowledgebase, what's new, meetings —
   are one set doing one kind of job (leaving this screen for something else), and
   they are the only icons up there that are. The brand blue says so. `.theme-icon`
   again forces `fill`, so again this has to answer in kind.

   `--r-brand` IS #2f6fed, the colour these were specified in. Named rather than
   written out, so that if the brand blue is ever retuned these four move with it
   instead of becoming the four things left behind. */
.vltheader .vltheader__icon {
  fill: currentColor !important;
}
.vltheader__dropdown-trigger .vltheader__icon {
  color: var(--r-brand);
}
/* No meetings running. The set has one camera, not two, so the state that used to
   be a second bell is carried by the colour instead — and by the tooltip, which
   says which state it is in words. */
.vltheader__dropdown-trigger--quiet .vltheader__icon {
  color: var(--btn-inactive);
}
/* --- buttons that never take a name --------------------------------------- */
/* The view toggle. It keeps the collapsed shape in both states, so switching the
   names on does not resize it or give it a label — see its template for why it
   must not have one. Repeating the three collapsed declarations rather than
   sharing them with `.vlt__head--collapsed .button-file`: that rule is about a
   toolbar state, this one is about a single button that has no states, and
   folding them together would mean the next change to either had to be reasoned
   about twice. */
.vlt__head .button-file--fixed {
  justify-content: center;
  padding: 8px;
  min-width: 40px;
}
/* --- the dark theme ------------------------------------------------------- */
/* The palette above is the one that was specified, and it was specified against a
   white page. On the dark theme's #2d2d30 an 800-step colour and a near-black are
   both within a few percent of the background — the toolbar would have gone from
   "quiet" to genuinely not there, which the old tinted chips never risked because
   their fill carried the contrast for them.

   So: the same hues, one step-range up the Material ramp. Every 800 becomes its 300,
   which is the standard swap and keeps the six apart from each other exactly as the
   800s do; the two 900s (Index, and the Pink 800 of the toggle) follow the same rule.
   The near-black action colour inverts to near-white. Disabled goes the other way —
   on a dark ground #BDBDBD is bright, so it steps DOWN to Grey 600, which keeps "off"
   reading as off rather than as the loudest thing in the row.

   Only the tokens are redefined. Every rule above is written against them, so none
   of them is repeated here. */
@supports(--css: variables) {
  [data-theme="dark"] {
    --btn-upload: #4DB6AC;      /* Teal 300 */
    --btn-create: #4FC3F7;      /* Light Blue 300 */
    --btn-new-file: #BA68C8;    /* Purple 300 */
    --btn-new-doc: #64B5F6;     /* Blue 300 */
    --btn-new-sheet: #81C784;   /* Green 300 */
    --btn-new-slides: #FFB74D;  /* Orange 300 */
    --btn-action: #ECECEC;
    --btn-inactive: #757575;    /* Grey 600 */
    --btn-index: #FF8A65;       /* Deep Orange 300 */
    --btn-info: #F06292;        /* Pink 300 */
    --btn-hover-bg: rgba(255, 255, 255, 0.10);
  }

  /* The header four. `--r-brand` does not move between themes, and #2f6fed against
     #2d2d30 is legible but sits low — this is the same blue lifted, not a different
     one, so the row still reads as brand blue on both themes. */
  [data-theme="dark"] .vltheader__dropdown-trigger .vltheader__icon {
    color: #6C9BFF;
  }

  /* And the quiet meetings state again. The rule above is a class longer than the
     light-theme `--quiet` rule, so on the dark theme it was winning and every icon
     in the row went brand blue — the "no meetings running" state simply stopped
     being drawn. Same specificity as the line above, declared after it. */
  [data-theme="dark"] .vltheader__dropdown-trigger--quiet .vltheader__icon {
    color: var(--btn-inactive);
  }
}
/* Theme */
/* `light`, NOT `light dark`. This app has no browser-dark support: there is not one
   `@media (prefers-color-scheme: dark)` rule in app/styles, and the only dark theme is the
   in-app `[data-theme="dark"]` toggle below. Claiming `dark` bought nothing and cost the
   legibility of every native form control — Chrome hands an input that declares no colour of
   its own the DARK user-agent palette, i.e. white text, while the panel behind it is an
   explicit `#fff`. White on white. It was patched three times one control at a time
   (`container.css`, `sysadmin.css`, `fusion-catalog.css`) before being fixed here instead. */
:root {
  color-scheme: light;
}
/* The app's own dark theme keeps the dark palette, so native controls inside it match the
   surfaces around them rather than flipping to a light box on a dark panel. */
[data-theme="dark"] {
  color-scheme: dark;
}
.theme-icon {
  fill: var(--icon-bg) !important;
}
@supports(--css: variables) {
  [data-theme="light"] {
    /* Body  */
    --body-bg: var(--white);
    --body-color: var(--colour-black);

    /* Header menu */
    /* A shade off the page, so the active hub tab reads as the page opening up into the bar. */
    --header-menu-bg: #f5f7fa;
    --header-menu-line: #e3e7ee;
    --header-hub-color: var(--black);

    /* Nav Panel */
    --nav-panel-bg: var(--colour-bg-brand-subtle);
    --nav-panel-contacts-bg: var(--colour-bg-alice-blue);
    /* Menu item states — tints of the panel's own palette, so the pill reads as
       part of the panel rather than a card dropped on top of it. */
    --nav-item-hover-bg: rgba(28, 32, 92, 0.06);
    --nav-item-active-bg: rgba(0, 167, 231, 0.14);
    --nav-item-active-color: var(--colour-brand-dark);
    --nav-rule-color: rgba(28, 32, 92, 0.12);
    /* A tint, not a fill. A solid chip competes with the active pill for
       attention on a panel this small; the count only has to be findable, and
       navy figures on a cyan wash still clear 8:1. */
    --nav-badge-bg: rgba(0, 167, 231, 0.18);
    --nav-badge-color: var(--colour-brand-dark);

    /* Files Table */
    --table-cell-bg: var(--white);
    --table-cell-border-bg: var(--white);
    --table-cell-border-bottom-bg: var(--platinum);
    --table-cell-active: var(--colour-bg-brand-subtle);

    /* Room schedule (/room meeting list) — card rows rather than table rows, so
       these are surface tokens: a border, a resting shadow and a raised one.
       Tints of the panel's own navy and cyan, like the nav items, so a card
       reads as part of the page instead of a box dropped onto it. */
    --schedule-card-bg: var(--white);
    /* The page behind the list is white and so is a card, so the hairline and a
       shallow shadow are the only things separating them. */
    --schedule-card-border: rgba(28, 32, 92, 0.14);
    --schedule-card-shadow: 0 1px 3px rgba(28, 32, 92, 0.07);
    --schedule-card-hover-shadow: 0 6px 16px rgba(28, 32, 92, 0.12);
    --schedule-card-active-bg: var(--colour-bg-brand-subtle);
    --schedule-border-strong: rgba(28, 32, 92, 0.22);
    --schedule-label-color: var(--colour-neutral-6);
    /* Navy figures on a cyan wash — the same pairing as the nav badge. */
    --schedule-chip-bg: rgba(0, 167, 231, 0.14);
    --schedule-chip-color: var(--colour-brand-dark);
    --schedule-segment-bg: rgba(28, 32, 92, 0.06);
    --schedule-segment-active-bg: var(--white);
    --schedule-segment-active-color: var(--colour-brand-dark);
    --schedule-segment-active-shadow: 0 1px 2px rgba(28, 32, 92, 0.16);
    --schedule-primary-hover-bg: #262b73;
    --schedule-link-color: var(--colour-brand-dark);

    /* Conference sidebar (/room create-and-edit-meeting flyout). Same navy/cyan
       surface language as the schedule; `--panel-surface` must equal whatever
       paints behind the fields, because the notched field labels sit on it. */
    --panel-surface: var(--body-bg);
    --panel-shadow: -8px 0 28px rgba(28, 32, 92, 0.14);
    --panel-hairline: rgba(28, 32, 92, 0.14);
    --panel-tint: rgba(28, 32, 92, 0.06);
    --panel-label-color: var(--colour-neutral-6);
    --panel-field-bg: var(--white);
    --panel-field-color: #3c3c3c;
    --panel-field-border: rgba(28, 32, 92, 0.22);
    --panel-field-disabled-bg: #f4f5f9;
    --panel-focus-ring: rgba(0, 167, 231, 0.20);
    --panel-chip-bg: rgba(0, 167, 231, 0.10);
    --panel-chip-border: rgba(0, 167, 231, 0.35);
    --panel-primary-hover-bg: #262b73;

    /* Checkbox */
    --checkbox-bg: var(--white);
    --checkbox-border: rgba(28, 32, 92, 0.35);
    --checkbox-border-hover: var(--colour-brand);
    --checkbox-checked-bg: var(--colour-brand);
    /* Navy tick on cyan clears 5:1; white on cyan sits near 2.7:1. */
    --checkbox-tick: var(--colour-brand-dark);

    /* Toolbar action buttons — fusion's values verbatim. */
    --colour-action-bg: #d0f7b0;
    --colour-action-bg-hover: #b9e895;
    --colour-action-bg-upload: #d8f6ff;
    --colour-action-bg-upload-hover: #b2e8ff;

    /* Font */
    --secondary-font: var(--grey-light);

    /* Buttons */
    --button-bg: var(--white);
    --button-bg-hover: var(--colour-bg-anti-flash-white);
    --button-color: var(--colour-black);

    --button-tenancy-bg: var(--colour-btn-bg);
    --button-tenancy-bg-hover: var(--colour-btn-hover-bg);
    --button-tenancy-color: var(--colour-btn-fg);

    /* --colour-btn-outlined-hover-bg: ; */

    /* Icons */
    /* --icon-bg: var(--hero-white); */

    /* Discussion Summary Component */
    --discussion-summary-bg-hover: var(--colour-bg-brand-subtle);

    /* Permission select */
    --permission-bg: var(--colour-bg-anti-flash-white);
    --permission-bg-hover: var(--white);

    /* Nav Link */
    --nav-link-color: var(--colour-black);

    /* Signature menu */
    --signature-tab-bg: var(--white);
    --signature-tab-active-bg: var(--colour-black);

    /* Tenants */
    /* --colour-nav-hover-bg: ;     */

    /* Selectbox arrow */
    --selectbox-arrow-bg: var(--colour-black);

    /* Form controls, app-wide (`_blocks/forms/forms.css`).
     *
     * That file styles every text control in the product from one selector
     * list, and it hardcoded `background: #fff` with `color: var(--r-navy)`.
     * Both are light-only, and the rule reaches an input at (0,6,1) — one
     * element, one attribute and five `:not()` — so no block could
     * realistically override it. The result was a white field with navy text
     * on every dark-theme screen in the app: login, settings, sysadmin, the
     * tenancy manager, search, compose.
     *
     * These are the pairs it reads instead. The light half is exactly what was
     * hardcoded, so light does not move.
     *
     * This is the GENERAL set. Areas that need a different field on purpose
     * still have their own — `--panel-field-*` for the conference flyout, and
     * `--msg-*` for mail and chat — and those stay where they are. */
    --field-bg: var(--white);
    --field-fg: var(--r-navy);
    --field-border: var(--r-ctl);
    --field-border-hover: var(--r-ctl-hi);
    --field-border-focus: var(--r-brand);
    --field-focus-ring: var(--r-focus);
    --field-placeholder: var(--r-faint);
    --field-label: var(--r-grey);
    --field-link: var(--r-brand);
    --field-disabled-bg: var(--r-div-2);

    /* Mail head  */
    --mail-head-bg: var(--colour-bg-brand-subtle);

    /* Mail & chat.
     *
     * The refresh palette (`variables/refresh.css`) is a set of flat reference
     * values, deliberately NOT theme-swapped — so the mail and chat blocks
     * cannot read it directly without going light-only, which on this screen
     * meant `--r-navy` text landing on a `#2d2d30` card. These are the pairs
     * those blocks read instead: light gets the refresh values it was drawn
     * against, dark gets its own. Geometry (`--r-r-*`, `--r-gutter`) stays on
     * the flat tokens, because a radius does not change with the theme. */
    --msg-fg: var(--r-navy);
    --msg-fg-secondary: var(--r-grey);
    --msg-fg-muted: var(--r-muted);
    --msg-edge: var(--r-edge);
    --msg-divider: var(--r-div);
    --msg-row-hover: var(--r-hover);
    --msg-row-active: var(--r-tint);
    --msg-accent: var(--r-brand);
    --msg-avatar-bg: var(--r-tint-2);
    --msg-chip-bg: var(--r-head);
    --msg-pill-bg: var(--r-fill);
    --msg-field-border: var(--r-ctl);
    --msg-field-border-hover: var(--r-ctl-hi);
    /* Blank-slate artwork only — lighter than any text token, because it is a
       40px glyph and not something anyone has to read. */
    --msg-icon-faint: var(--r-ctl);
    /* Received / sent bubble. The sent pair is the brand blue in both themes:
       it clears 4.5:1 against white either way, and a conversation reading the
       same colour for "mine" on both themes is the point of the pair. */
    --msg-bubble-in-bg: var(--r-fill);
    --msg-bubble-in-fg: var(--r-navy);
    --msg-bubble-out-bg: var(--r-brand);
    --msg-bubble-out-fg: var(--white);

    /* Document Label. Repointed at the badge token the refresh set, so the
       pill keeps reading one theme-swapped pair without light losing the fill
       it was drawn with. */
    --label-shared-bg: var(--colour-label-bg);
    --label-shared-bg-hover: var(--colour-label-hover-bg);

    /* Links */
    --link-color: var(--colour-brand-dark);

    /* Doctools tool */
    /* Document side panels (signing tools, document list) */
    --panel-bg: var(--white);
    --panel-border: #e3e8f0;
    --panel-fg: #1c205c;
    --panel-fg-muted: #5b6678;
    --panel-fg-subtle: #8a93a6;
    --panel-hover: #f6f8fc;
    --panel-active: #eef3fe;
    --panel-brand: #2f6fed;
    --panel-brand-hover: #2559c9;
    --panel-tile: #f0f3f9;
    --panel-field-border: #cdd5e2;
    --panel-footer-bg: #f8fafd;
    --panel-danger: #df1b41;
    --panel-sign-bg: #4e4e4e;
    --panel-sign-hover: #3a3a3a;
    --panel-sign-fg: var(--white);
    --panel-text-tile: #e9f6ea;
    --panel-text-tile-hover: #d6eed8;
    --panel-text-fg: #2da032;
    --panel-image-tile: #fdf0e6;
    --panel-image-tile-hover: #fae0cc;
    --panel-image-fg: #e57a42;

    --doctools-bg: var(--white);
    --doctools-fg: var(--colour-brand-dark);
    --doctools-muted: #6b6f8e;
    --doctools-border: rgba(28, 32, 92, 0.12);
    --doctools-hover: var(--colour-bg-brand-subtle);
    --doctools-active-bg: var(--colour-bg-brand);
    --doctools-active-fg: var(--colour-brand-dark);

    /* Only Office */
    --only-office-header-bg-word: #446995;
    --only-office-header-bg-slide: #BE664F;
    --only-office-header-bg-cell: #40865c;
    --only-office-header-bg-pdf: #AA5252;
    --only-office-toolbar-bg: #f1f1f1;
  }
}
@supports(--css: variables) {
  [data-theme="dark"] {
    /* Body — page backdrop from the redesign proposal (#2d2d30). Note this
       drives many dark surfaces (body, header, files-nav, containers, chat,
       dropdowns), so the whole dark app shifts to this slightly deeper tone. */
    --body-bg: #2d2d30;
    --body-color: var(--hero-white);

    /* Header menu */
    --header-menu-bg: var(--colour-black);
    --header-hub-color: var(--hero-white);
    --header-menu-line: rgba(255, 255, 255, 0.12);

    /* Nav Panel */
    --nav-panel-bg: var(--colour-bg-eerie-black);
    --nav-panel-contacts-bg: var(--colour-black);
    /* Same states as light, inverted: lift with white, not with shadow — on a
       near-black panel a shadow is invisible and a tint is all that reads. */
    --nav-item-hover-bg: rgba(255, 255, 255, 0.07);
    --nav-item-active-bg: rgba(0, 167, 231, 0.20);
    --nav-item-active-color: var(--white);
    --nav-rule-color: rgba(255, 255, 255, 0.14);
    /* Same tint, inverted: navy figures would vanish here, so the cyan moves
       from the fill to the numerals. */
    --nav-badge-bg: rgba(0, 167, 231, 0.22);
    --nav-badge-color: var(--colour-brand);

    /* Files Table */
    --table-cell-bg: var(--colour-black);
    --table-cell-border-bg: var(--colour-black);
    --table-cell-border-bottom-bg: var(--colour-black);
    --table-cell-active: var(--colour-bg-eerie-black);

    /* Room schedule (/room meeting list) — same cards as light, inverted the way
       the nav panel inverts: the card lifts off the page with a lighter surface
       and a white-alpha border, because a drop shadow on #2d2d30 is invisible.
       The cyan stays on the chip, and the primary button lightens on hover
       rather than darkening into the background. */
    --schedule-card-bg: var(--colour-bg-eerie-black);
    --schedule-card-border: rgba(255, 255, 255, 0.12);
    --schedule-card-shadow: none;
    --schedule-card-hover-shadow: 0 6px 16px rgba(0, 0, 0, 0.45);
    --schedule-card-active-bg: var(--colour-bg-raisin-black);
    --schedule-border-strong: rgba(255, 255, 255, 0.24);
    --schedule-label-color: var(--gray-css);
    --schedule-chip-bg: rgba(0, 167, 231, 0.22);
    --schedule-chip-color: var(--colour-brand);
    --schedule-segment-bg: rgba(255, 255, 255, 0.08);
    --schedule-segment-active-bg: rgba(0, 167, 231, 0.20);
    --schedule-segment-active-color: var(--white);
    --schedule-segment-active-shadow: none;
    --schedule-primary-hover-bg: #2f3690;
    --schedule-link-color: var(--colour-brand);

    /* Conference sidebar (/room create-and-edit-meeting flyout). The fields go
       dark here rather than staying white as they do today — safe because both
       background and colour are declared, which is what container.css's white
       pin was actually protecting against. */
    --panel-surface: var(--body-bg);
    --panel-shadow: -8px 0 28px rgba(0, 0, 0, 0.55);
    --panel-hairline: rgba(255, 255, 255, 0.14);
    --panel-tint: rgba(255, 255, 255, 0.08);
    --panel-label-color: var(--gray-css);
    --panel-field-bg: var(--colour-bg-eerie-black);
    --panel-field-color: var(--hero-white);
    --panel-field-border: rgba(255, 255, 255, 0.22);
    --panel-field-disabled-bg: var(--colour-bg-raisin-black);
    --panel-focus-ring: rgba(0, 167, 231, 0.28);
    --panel-chip-bg: rgba(0, 167, 231, 0.16);
    --panel-chip-border: rgba(0, 167, 231, 0.40);
    --panel-primary-hover-bg: #2f3690;

    /* Checkbox */
    --checkbox-bg: var(--gray-css);
    --checkbox-border: rgba(255, 255, 255, 0.4);
    --checkbox-border-hover: var(--colour-brand);
    --checkbox-checked-bg: var(--colour-brand);
    --checkbox-tick: var(--colour-brand-dark);

    /* Toolbar action buttons. Fusion leaves these unthemed, so its dark mode
       shows the same pale green and blue — glaring against a near-black page.
       Same hues held at a fraction of the lightness instead. */
    --colour-action-bg: #22401a;
    --colour-action-bg-hover: #2e5423;
    --colour-action-bg-upload: #103543;
    --colour-action-bg-upload-hover: #164657;

    /* Font */
    --secondary-font: var(--gray-css);

    /* Buttons */
    --button-bg: var(--colour-bg-eerie-black);
    --button-bg-hover: var(--colour-bg-raisin-black);
    --button-color: var(--hero-white);

    --button-tenancy-bg: var(--colour-bg-eerie-black);
    --button-tenancy-bg-hover: var(--colour-bg-raisin-black);
    --button-tenancy-color: var(--hero-white);

    --colour-btn-outlined-hover-bg: var(--colour-bg-raisin-black);

    /* Icons */
    --icon-bg: var(--hero-white);

    /* Discussion Summary Component */
    --discussion-summary-bg-hover: var(--colour-bg-raisin-black);

    /* Permission select */
    --permission-bg: var(--colour-bg-eerie-black);
    --permission-bg-hover: var(--colour-bg-raisin-black);

    /* Nav Link */
    --nav-link-color: var(--hero-white);

    /* Signature menu */
    --signature-tab-bg: var(--colour-black);
    --signature-tab-active-bg: var(--button-bg);

    /* Tenants */
    --colour-nav-hover-bg: var(--colour-bg-raisin-black);

    /* Colours */
    --colour-bg-default: var(--colour-black);
    --colour-fg-default: var(--hero-white);

    /* Selectbox arrow */
    --selectbox-arrow-bg: var(--hero-white);

    /* Form controls, app-wide — the dark half of the pairs light.css documents.
     *
     * A field reads as RECESSED here rather than raised: #191919 against the
     * #2d2d30 page, which is the same direction the files table and the nav
     * panel go. Measured on that fill: text 17.4:1, placeholder 5.4:1, and the
     * border resolves to about #4a4a4a so the control still has an edge.
     *
     * The link and focus colours move from `--r-brand` (#2f6fed) to the cyan:
     * that blue is 3.0:1 on this page and fails, the cyan is 5.1:1. */
    --field-bg: var(--colour-bg-eerie-black);
    --field-fg: var(--hero-white);
    --field-border: rgba(255, 255, 255, 0.22);
    --field-border-hover: rgba(255, 255, 255, 0.34);
    --field-border-focus: var(--colour-brand);
    --field-focus-ring: rgba(0, 167, 231, 0.28);
    --field-placeholder: var(--grey-white);
    --field-label: var(--alto);
    --field-link: var(--colour-brand);
    --field-disabled-bg: var(--colour-bg-raisin-black);

    /* Mail head  */
    --mail-head-bg: var(--colour-bg-raisin-black);

    /* Mail & chat — the dark half of the pairs light.css documents.
     *
     * Surfaces lift with white rather than with a shadow, the same way the nav
     * panel's states do a few lines up: on a #2d2d30 page a drop shadow is
     * invisible and only a tint reads. Sent bubbles keep the brand blue, so
     * "mine" is the same colour on both themes. */
    --msg-fg: var(--hero-white);
    --msg-fg-secondary: var(--alto);
    --msg-fg-muted: var(--grey-white);
    --msg-edge: rgba(255, 255, 255, 0.14);
    --msg-divider: rgba(255, 255, 255, 0.09);
    --msg-row-hover: rgba(255, 255, 255, 0.06);
    --msg-row-active: rgba(0, 167, 231, 0.16);
    --msg-accent: var(--colour-brand);
    --msg-avatar-bg: var(--colour-bg-eerie-black);
    --msg-chip-bg: var(--colour-bg-eerie-black);
    --msg-pill-bg: var(--colour-bg-raisin-black);
    --msg-field-border: rgba(255, 255, 255, 0.22);
    --msg-field-border-hover: rgba(255, 255, 255, 0.34);
    --msg-icon-faint: rgba(255, 255, 255, 0.28);
    --msg-bubble-in-bg: var(--colour-bg-raisin-black);
    --msg-bubble-in-fg: var(--hero-white);
    --msg-bubble-out-bg: var(--r-brand);
    --msg-bubble-out-fg: var(--white);

    /* Document Label */
    --label-shared-bg: var(--colour-bg-eerie-black);
    --label-shared-bg-hover: var(--colour-bg-raisin-black);
    /* The badge foreground is one flat value in colours.css, picked to clear
       4.5:1 on the light fill. On these two it is 2:1, so dark takes the
       foreground it uses everywhere else. Only the plain pill needs this — the
       info/success/attention/danger variants carry their own matched pair. */
    --colour-label-fg: var(--colour-fg-default);

    /* Links */
    --link-color: var(--hero-white);
  }

    [data-theme="dark"] .colour-fg-default {
      color: var(--hero-white);
    }

    /* Outlined secondary button (.button--style-3) hard-codes a near-black
       text colour that is invisible on dark surfaces — e.g. the "Get an
       authenticator app" link on the 2FA page. Use a light foreground. */
    [data-theme="dark"] .button--style-3:not(.button--style-3--active) {
      color: var(--hero-white);
    }

    /* Nav panel labels (`_blocks/nav/nav.css`).
     *
     * That file styles these states TWICE. The first block does it properly,
     * on the `--nav-item-*` / `--nav-badge-*` pairs defined above. A later
     * block — "Panel typography and states, on the refresh palette" — then
     * re-declares the same properties on the flat `--r-*` values, and being
     * later it wins. Those values are not theme-swapped, so on dark the panel
     * ended up with `--r-navy` (#1c205c) labels on `--colour-bg-eerie-black`
     * (#191919): about 1.2:1, which is not low contrast but invisible.
     *
     * These overrides put dark back on the themed pairs and leave light
     * exactly as it is, because that later block is what light was drawn
     * against and this is a legibility fix, not a redesign. The real repair is
     * to collapse the two blocks into one on the tokens — which changes how
     * light looks (cyan tint and navy text rather than blue on blue) and so
     * belongs to whoever owns the nav's appearance, not to a contrast patch.
     *
     * Specificity: `[data-theme="dark"]` prefixes each of these, which clears
     * the (0,1,0) and (0,2,0) of the rules being overridden. */
    [data-theme="dark"] .nav__menu-item {
      color: var(--hero-white);
    }

    [data-theme="dark"] .nav__menu-item:hover {
      background: var(--nav-item-hover-bg);
    }

    [data-theme="dark"] .nav__menu-item--active,
    [data-theme="dark"] .nav__menu-item.active {
      background: var(--nav-item-active-bg);
      color: var(--nav-item-active-color);
    }

    /* One step quieter than the parent, the way light has it, but light's
       `--r-grey` (#5b6678) is a dark-on-light value. */
    [data-theme="dark"] .nav__sub-menu-item {
      color: var(--alto);
    }

    [data-theme="dark"] .nav__sub-menu-item:hover {
      background: var(--nav-item-hover-bg);
    }

    [data-theme="dark"] .nav__sub-menu-item--active {
      color: var(--nav-item-active-color);
    }

    [data-theme="dark"] .nav__badge {
      background: var(--nav-badge-bg);
      color: var(--nav-badge-color);
    }

    [data-theme="dark"] {
    --panel-bg: var(--colour-bg-raisin-black);
    --panel-border: rgba(255, 255, 255, 0.1);
    --panel-fg: var(--hero-white);
    --panel-fg-muted: rgba(255, 255, 255, 0.65);
    --panel-fg-subtle: rgba(255, 255, 255, 0.45);
    --panel-hover: rgba(255, 255, 255, 0.06);
    --panel-active: rgba(47, 111, 237, 0.24);
    --panel-brand: #6d9bff;
    --panel-brand-hover: #8fb3ff;
    --panel-tile: rgba(255, 255, 255, 0.08);
    --panel-field-border: rgba(255, 255, 255, 0.18);
    --panel-footer-bg: rgba(255, 255, 255, 0.03);
    --panel-danger: #ff6b85;
    --panel-sign-bg: #4e4e4e;
    --panel-sign-hover: #5c5c5c;
    --panel-sign-fg: var(--white);
    --panel-text-tile: rgba(45, 160, 50, 0.16);
    --panel-text-tile-hover: rgba(45, 160, 50, 0.26);
    --panel-text-fg: #5cc760;
    --panel-image-tile: rgba(229, 122, 66, 0.16);
    --panel-image-tile-hover: rgba(229, 122, 66, 0.26);
    --panel-image-fg: #f0965f;

    --doctools-bg: var(--colour-bg-raisin-black);
    --doctools-fg: var(--hero-white);
    --doctools-muted: rgba(255, 255, 255, 0.55);
    --doctools-border: rgba(255, 255, 255, 0.12);
    --doctools-hover: rgba(255, 255, 255, 0.08);
    --doctools-active-bg: rgba(255, 255, 255, 0.16);
    --doctools-active-fg: var(--hero-white);
    --only-office-header-bg-word: #2a2a2a;
    --only-office-header-bg-slide: #2a2a2a;
    --only-office-header-bg-cell: #2a2a2a;
    --only-office-header-bg-pdf: #2a2a2a;
    --only-office-toolbar-bg: #404040;
  }

    /* `_blocks/forms`'s older `.field__input` base, which keeps its own
       literals (#707070 on #fff, a black border) because they are that block's
       values rather than the refresh palette, and repointing them would have
       moved LIGHT too. Only the inputs the control rule excludes — flat,
       search-input, calendar-input — ever reach them, and on dark #707070 on
       #191919 is 3.5:1. Corrected here, where it costs light nothing. */
    [data-theme="dark"] .field__input {
      color: var(--field-fg);
      background-color: var(--field-bg);
      border-color: var(--field-border);
    }

    /* Only Office */

    [data-theme="dark"] .field__input::placeholder {
      color: var(--field-placeholder);
    }

    /* The borderless variant declares `background: transparent; border: 0` of
       its own, so it must keep them — it sits on a surface that already paints
       itself. Only the text needs saying. */
    [data-theme="dark"] .field__input--flat {
      background: transparent;
      border: 0;
    }

    /* The files table (`_blocks/valut-table`, the refresh block at the foot of
     * that file — Files, Shared, Received, Recordings, Forms, Archive).
     *
     * Same shape as the admin surfaces: the block is drawn on the flat refresh
     * palette, so on dark it kept a light `--r-thead` strip and a hardcoded
     * `#fff` wrapper while the cells inherited light text. Measured before:
     * the head row 1.1:1 and a head cell 2.39:1 — the column titles were gone.
     *
     * The wrapper is the one that mattered most: the rows themselves paint
     * nothing, so its white showed through every row on the screen. */
    [data-theme="dark"] .valut-table__wrapper {
      background: var(--body-bg);
    }
    /* Document side panels (signing tools, document list) */

    [data-theme="dark"] .valut-table__head,
    [data-theme="dark"] .vlt-table__head {
      background: var(--colour-bg-raisin-black);
      border-bottom-color: rgba(255, 255, 255, 0.14);
    }

    /* Doctools tool */

    [data-theme="dark"] .valut-table__head .valut-table__cell,
    [data-theme="dark"] .valut-table__cell-title {
      color: var(--grey-white);
    }

    [data-theme="dark"] .valut-table__row:hover,
    [data-theme="dark"] .vlt-table__row:hover {
      background: rgba(255, 255, 255, 0.06);
    }

    [data-theme="dark"] .valut-table__cell,
    [data-theme="dark"] .valut-table__title {
      color: var(--hero-white);
    }

    [data-theme="dark"] .valut-table__date {
      color: var(--alto);
    }

    /* -- Surfaces -- */
    [data-theme="dark"] .sysadmin__nav,
    [data-theme="dark"] .sysadmin__group,
    [data-theme="dark"] .tenancy-admin__group,
    [data-theme="dark"] .sysadmin__card,
    [data-theme="dark"] .sysadmin__detail-card,
    [data-theme="dark"] .sysadmin__icon-btn,
    [data-theme="dark"] .sysadmin__btn--outline {
      background: var(--colour-bg-eerie-black);
      border-color: rgba(255, 255, 255, 0.14);
    }

    /* Settings and admin surfaces (`_blocks/sysadmin`, and the tenancy-admin
     * and settings-admin blocks built on it: Profile, Security, Signature,
     * Hub settings, Tenancy Manager, System Management).
     *
     * That block is written entirely in literals — 70 of them — because it was
     * drawn against the refresh palette and the palette is flat by design. So
     * on dark it kept a `#fff` card while the text on it inherited
     * `--hero-white` from the theme: the Profile form was light grey labels on
     * a white card, i.e. invisible, with a dark input in the middle of it.
     *
     * The literals are the refresh values written out, so each one has an
     * obvious dark counterpart. Surfaces recede (eerie/raisin black), hovers
     * lift with white the way the nav panel does, hairlines become white-alpha,
     * and the three text tiers inherit the same mapping the mail and chat
     * tokens use. Light is untouched.
     *
     * This is a legibility repair, not a dark design for the admin area. It
     * covers the surfaces and the text tiers; the status badges, switches and
     * the chart colours in that block still carry their light values. */

    [data-theme="dark"] .sysadmin__group-head,
    [data-theme="dark"] .tenancy-admin__group-head,
    [data-theme="dark"] .sysadmin__nav-icon,
    [data-theme="dark"] .sysadmin__table thead th {
      background: var(--colour-bg-raisin-black);
      border-color: rgba(255, 255, 255, 0.14);
    }

    /* Hovers lift with white rather than darkening, because on a #191919 card
       a darker wash has nowhere left to go. */
    [data-theme="dark"] .sysadmin__nav-item:hover,
    [data-theme="dark"] .sysadmin__nav-jump:hover,
    [data-theme="dark"] .sysadmin__btn--outline:hover,
    [data-theme="dark"] .sysadmin__table tbody tr:hover,
    [data-theme="dark"] .tenancy-admin__back:hover {
      background: rgba(255, 255, 255, 0.06);
    }

    [data-theme="dark"] .sysadmin__copy-id-btn:hover,
    [data-theme="dark"] .sysadmin__copy-id-btn:focus-visible {
      background: rgba(255, 255, 255, 0.06);
      border-color: rgba(255, 255, 255, 0.14);
    }

    [data-theme="dark"] .sysadmin__nav-item--active {
      background: rgba(0, 167, 231, 0.16);
    }

    /* -- Hairlines -- */
    [data-theme="dark"] .sysadmin__row,
    [data-theme="dark"] .sysadmin__row + .sysadmin__row,
    [data-theme="dark"] .sysadmin__group + .sysadmin__group,
    [data-theme="dark"] .sysadmin__nav-head,
    [data-theme="dark"] .sysadmin__table tbody td,
    [data-theme="dark"] .sysadmin__toolbar,
    [data-theme="dark"] .settings-admin__legacy-form {
      border-color: rgba(255, 255, 255, 0.09);
    }

    /* -- Text, three tiers -- */
    [data-theme="dark"] .sysadmin__title,
    [data-theme="dark"] .sysadmin__group-title,
    [data-theme="dark"] .tenancy-admin__group-title,
    [data-theme="dark"] .sysadmin__nav-title,
    [data-theme="dark"] .sysadmin__detail-title,
    [data-theme="dark"] .sysadmin__ident-name,
    [data-theme="dark"] .sysadmin__info-value,
    [data-theme="dark"] .sysadmin__cell-name,
    [data-theme="dark"] .sysadmin__table tbody td,
    [data-theme="dark"] .sysadmin__search-clear:hover,
    [data-theme="dark"] .sysadmin__search-clear:focus-visible {
      color: var(--hero-white);
    }

    [data-theme="dark"] .sysadmin__sub,
    [data-theme="dark"] .sysadmin__group-copy,
    [data-theme="dark"] .sysadmin__nav-icon,
    [data-theme="dark"] .sysadmin__nav-jump,
    [data-theme="dark"] .sysadmin__btn--outline,
    [data-theme="dark"] .sysadmin__cell-muted,
    [data-theme="dark"] .sysadmin__copy-id-text,
    [data-theme="dark"] .sysadmin__ident-email,
    [data-theme="dark"] .sysadmin__badge--none {
      color: var(--alto);
    }

    [data-theme="dark"] .sysadmin__group-sub,
    [data-theme="dark"] .tenancy-admin__group-sub,
    [data-theme="dark"] .sysadmin__nav-label,
    [data-theme="dark"] .sysadmin__nav-sub,
    [data-theme="dark"] .sysadmin__nav-jump-icon,
    [data-theme="dark"] .sysadmin__table thead th,
    [data-theme="dark"] .sysadmin__empty,
    [data-theme="dark"] .sysadmin__lookup-note,
    [data-theme="dark"] .sysadmin__lookup-id,
    [data-theme="dark"] .sysadmin__crumbs,
    [data-theme="dark"] .sysadmin__chip--no,
    [data-theme="dark"] .sysadmin__info-label,
    [data-theme="dark"] .sysadmin__search-icon,
    [data-theme="dark"] .sysadmin__search-clear {
      color: var(--grey-white);
    }

    /* -- Table -- */
    [data-theme="dark"] .tenancy-admin .dekko-table .dekko-table__head .dekko-table__cell {
      background: var(--colour-bg-raisin-black);
      border-color: rgba(255, 255, 255, 0.09);
      color: var(--grey-white);
    }

    /* Tenancy Manager (`_blocks/tenancy-admin`). The same repair as above, for
     * the block built on it, which the pass above stopped short of: its table,
     * toolbars, save bar, filters, policy and integration notes are literals
     * too, so on dark the cells kept their navy (#1c205c on #191919 is 1.2:1 —
     * the users, hubs and groups lists were close to blank), the header row,
     * save bar, filter toolbar, region picker and notes kept light panels, and
     * the muted greys stayed tuned for white (3.0–3.8:1). Measured page by page
     * against WCAG AA (4.5:1) on Users, Hubs, Traffic, Audit logs, Policies,
     * User groups and Integrations. Same mapping as above: navy → hero-white,
     * slate → alto, the light greys and `colour-fg-muted` → grey-white, and the
     * refresh blue #2f6fed → the brand cyan, which is the one that reads on
     * black. Light is untouched: every rule here sits under [data-theme=dark].
     *
     * The table selectors repeat `.tenancy-admin .dekko-table` because that is
     * how the block writes them (nested, three classes deep) — shorter ones
     * would lose on specificity, not on order. */

    [data-theme="dark"] .tenancy-admin .dekko-table .dekko-table__cell {
      border-color: rgba(255, 255, 255, 0.09);
      color: var(--hero-white);
    }

    [data-theme="dark"] .tenancy-admin .dekko-table .dekko-table__item:hover .dekko-table__cell {
      background: rgba(255, 255, 255, 0.06);
    }

    /* The cell rule above outranks the colour utilities, so a cell asking for
       a quieter tier (the hubs list's "—", "Standard") got the loud one. */
    [data-theme="dark"] .tenancy-admin .dekko-table .colour-fg-subtle,
    [data-theme="dark"] .tenancy-admin .dekko-table .dekko-table__head .colour-fg-subtle {
      color: var(--grey-white);
    }

    [data-theme="dark"] .tenancy-admin .user-card__name,
    [data-theme="dark"] .tenancy-admin__tenant-name,
    [data-theme="dark"] .integration-note__title,
    [data-theme="dark"] .integration-note__url,
    [data-theme="dark"] .users-toggle,
    [data-theme="dark"] .region-quick__chip,
    [data-theme="dark"] .hub-storage__total,
    [data-theme="dark"] .hub-storage__name,
    [data-theme="dark"] .hub-storage__value {
      color: var(--hero-white);
    }

    [data-theme="dark"] .tenancy-admin .user-card__email,
    [data-theme="dark"] .tenancy-admin__back,
    [data-theme="dark"] .integration-note__body,
    [data-theme="dark"] .integration-note__list,
    [data-theme="dark"] .integration-note--flag,
    [data-theme="dark"] .filter-toolbar__summary,
    [data-theme="dark"] .filter-period__btn,
    [data-theme="dark"] .traffic-section__toggle,
    [data-theme="dark"] .memberships__tab {
      color: var(--alto);
    }

    [data-theme="dark"] .tenancy-admin .colour-fg-muted,
    [data-theme="dark"] .tenancy-admin__foot,
    [data-theme="dark"] .tenancy-admin__savebar-state,
    [data-theme="dark"] .filter-toolbar__label,
    [data-theme="dark"] .filter-toolbar__note,
    [data-theme="dark"] .traffic-section__total::before,
    [data-theme="dark"] .traffic-figure__caption,
    [data-theme="dark"] .region-quick__label,
    [data-theme="dark"] .users-toggle__info,
    [data-theme="dark"] .dropdown-note,
    [data-theme="dark"] .hub-storage__pct,
    [data-theme="dark"] .hub-storage__empty,
    [data-theme="dark"] .memberships__empty,
    [data-theme="dark"] .membership-insights__empty {
      color: var(--grey-white);
    }

    /* The refresh blue is 3.4:1 on these cards; the brand cyan is 5.6:1. */
    [data-theme="dark"] .traffic-section__total,
    [data-theme="dark"] .traffic-section__toggle--active,
    [data-theme="dark"] .filter-period__btn--active,
    [data-theme="dark"] .table-sort:hover,
    [data-theme="dark"] .table-sort--active,
    [data-theme="dark"] .region-quick__all,
    [data-theme="dark"] .region-quick__chip:hover,
    [data-theme="dark"] .users-toggle__info:hover,
    [data-theme="dark"] .memberships__tab--active {
      color: var(--colour-brand);
    }

    [data-theme="dark"] .region-quick__all:disabled {
      color: rgba(255, 255, 255, 0.3);
    }

    [data-theme="dark"] .filter-period__btn:hover,
    [data-theme="dark"] .memberships__tab:hover {
      color: var(--hero-white);
    }

    [data-theme="dark"] .tenancy-admin__savebar-state--dirty {
      color: #f5b041;
    }

    /* "Changed elsewhere" on the Policies page is drawn with the refresh status pairs, which this file
       redefines only inside dialogs further down — so the notice and the rows take the dark pairs here. */
    [data-theme="dark"] .tenancy-admin__stale,
    [data-theme="dark"] .tenancy-admin__policy {
      --r-warn-fg: #f5b041;   --r-warn-bg: rgba(180, 83, 9, 0.22);
      --r-crit-fg: #ff8a80;   --r-crit-bg: rgba(180, 35, 24, 0.22);
      --r-note-fg: #f5c26b;   --r-note-bg: rgba(138, 90, 8, 0.22);
      --r-focus: 0 0 0 3px rgba(0, 167, 231, 0.3);
    }

    [data-theme="dark"] .integration-note__error {
      color: #ff8a80;
    }

    /* -- Surfaces -- */
    [data-theme="dark"] .tenancy-admin__savebar {
      background: rgba(25, 25, 25, 0.94);
      border-color: rgba(255, 255, 255, 0.14);
    }

    [data-theme="dark"] .filter-toolbar,
    [data-theme="dark"] .users-toggle,
    [data-theme="dark"] .region-quick__chip,
    [data-theme="dark"] .traffic-section__toggle {
      background: var(--colour-bg-eerie-black);
      border-color: rgba(255, 255, 255, 0.22);
      box-shadow: none;
    }

    [data-theme="dark"] .users-toggle:hover {
      border-color: rgba(255, 255, 255, 0.35);
    }

    [data-theme="dark"] .region-quick__chip:hover {
      border-color: var(--colour-brand);
    }

    [data-theme="dark"] .traffic-section__toggle:hover {
      background: rgba(255, 255, 255, 0.06);
      border-color: rgba(255, 255, 255, 0.35);
    }

    [data-theme="dark"] .traffic-section__toggle--active {
      background: rgba(0, 167, 231, 0.16);
      border-color: rgba(0, 167, 231, 0.45);
    }

    [data-theme="dark"] .tenancy-admin__savebar--inline,
    [data-theme="dark"] .traffic-distribution,
    [data-theme="dark"] .region-quick,
    [data-theme="dark"] .integration-note__link,
    [data-theme="dark"] .integration-note--flag,
    [data-theme="dark"] .filter-period,
    [data-theme="dark"] .memberships__tabs,
    [data-theme="dark"] .hub-storage__share {
      background: var(--colour-bg-raisin-black);
      border-color: rgba(255, 255, 255, 0.14);
    }

    /* The selected segment sinks to the card colour rather than lifting: the
       cyan on a lifted #3a3a3a is 4.2:1, on #191919 it is 6.9:1. */
    [data-theme="dark"] .filter-period__btn--active,
    [data-theme="dark"] .memberships__tab--active {
      background: var(--colour-bg-eerie-black);
      box-shadow: none;
    }

    [data-theme="dark"] .hub-storage__track,
    [data-theme="dark"] .memberships__tab-count,
    [data-theme="dark"] .tenancy-admin__grouptag {
      background: rgba(255, 255, 255, 0.1);
    }

    [data-theme="dark"] .tenancy-admin__grouptag {
      color: var(--alto);
    }

    [data-theme="dark"] .hub-storage__row:hover {
      background: rgba(255, 255, 255, 0.06);
    }

    /* Added regions: the light green chip, as a tint. */
    [data-theme="dark"] .region-quick__chip--added,
    [data-theme="dark"] .region-quick__chip--added:hover {
      background: rgba(47, 122, 68, 0.22);
      border-color: rgba(125, 214, 155, 0.4);
      color: #7dd69b;
    }

    [data-theme="dark"] .membership-insights__empty {
      border-color: rgba(255, 255, 255, 0.22);
    }

    /* -- Hairlines -- */
    [data-theme="dark"] .tenancy-admin__toolbar,
    [data-theme="dark"] .tenancy-admin__foot,
    [data-theme="dark"] .tenancy-admin__savebar--inline,
    [data-theme="dark"] .traffic-distribution,
    [data-theme="dark"] .filter-toolbar__row + .filter-toolbar__row,
    [data-theme="dark"] .filter-toolbar__summary,
    [data-theme="dark"] .dropdown-note,
    [data-theme="dark"] .integration-note + .integration-note {
      border-color: rgba(255, 255, 255, 0.09);
    }

    /* -- Badges on these screens (hub features "On", "Fusion") -- a light
       chip on a black card; as a tint they stop glowing and read at 7:1. */
    [data-theme="dark"] .sysadmin__badge--brand,
    [data-theme="dark"] .tenancy-admin .label-info {
      background: rgba(0, 167, 231, 0.16);
      color: #7fd4f5;
    }

    [data-theme="dark"] .tenancy-admin .label-info .label__text {
      color: inherit;
    }

    /* -- Charts -- Highcharts writes its label colours as inline styles
       (`macros/high-chart.js`, AXIS_LABEL / itemStyle), which only
       `!important` outranks. Scoped to the tenancy screens and their modals. */
    [data-theme="dark"] .tenancy-admin .highcharts-axis-labels text,
    [data-theme="dark"] .tenancy-admin .highcharts-legend-item text,
    [data-theme="dark"] .tenancy-admin .highcharts-data-label text,
    [data-theme="dark"] .tenancy-admin .highcharts-title,
    [data-theme="dark"] .modal .highcharts-axis-labels text,
    [data-theme="dark"] .modal .highcharts-legend-item text,
    [data-theme="dark"] .modal .highcharts-data-label text {
      color: var(--alto) !important;
      fill: var(--alto) !important;
    }

    /* Form controls and dropdowns, app-wide.
     *
     * Found by listing every rule in the compiled CSS that gives a control —
     * input, select trigger, dropdown panel, picker — a light background, and
     * keeping the ones with no dark counterpart: 28 of them. Several are the
     * refresh blocks re-declaring a control as `#fff` AFTER the themed base
     * (`selectbox.css` does `.selectbox__head, .ember-power-select-trigger
     * { background: #fff }` below its own `var(--body-bg)`), so dark got a white
     * field carrying the theme's light text — the attribute pickers on a fusion
     * upload measured 1.15:1. Drawing surfaces stay white on purpose and are
     * not here: signature and painting canvases, the colour picker's swatches,
     * form fields drawn onto the (white) PDF page, and the login screens.
     *
     * Every control takes the field trio the rest of dark already uses. */
    [data-theme="dark"] .ember-power-select-trigger,
    [data-theme="dark"] .ember-power-select-trigger.field__input--flat,
    [data-theme="dark"] .selectbox__head,
    [data-theme="dark"] .settings-admin .selectbox__head,
    [data-theme="dark"] .user__select.selectbox--normal .selectbox,
    [data-theme="dark"] .menu-input,
    [data-theme="dark"] .passkey-add__input,
    [data-theme="dark"] .twofa.twofa--modern .twofa__setup-inner .field__input,
    [data-theme="dark"] .settings-admin__legacy-form .field--setting .field__input,
    [data-theme="dark"] .valut-table--tenancy input,
    [data-theme="dark"] .public-link__duration-input,
    [data-theme="dark"] .public-link__email-input,
    [data-theme="dark"] .public-link-docs__new-folder-input,
    [data-theme="dark"] .sysadmin__switcher .select-menu__button,
    [data-theme="dark"] .tenancy-admin__tenant .select-menu__button,
    [data-theme="dark"] .loads__head {
      background-color: var(--field-bg);
      border-color: var(--field-border);
      color: var(--field-fg);
    }

    [data-theme="dark"] .settings-admin .selectbox__head:hover,
    [data-theme="dark"] .sysadmin__search-clear:hover {
      background-color: rgba(255, 255, 255, 0.06);
    }

    /* Panels a control opens. ember-basic-dropdown portals these to the body,
       so no page or modal rule reaches them. Specific menus that draw their
       own dark surface (the permission picker, below) still win: they come
       later in this file at the same specificity. */
    [data-theme="dark"] .ember-basic-dropdown-content,
    [data-theme="dark"] .selectbox__list,
    [data-theme="dark"] .user__select .selectbox__item,
    [data-theme="dark"] .exists-option__title,
    [data-theme="dark"] .transfers__panel {
      background-color: var(--field-bg);
      border-color: var(--field-border);
      color: var(--field-fg);
    }

    /* Chips inside a multi-select (recipients in Compose, tags). */
    [data-theme="dark"] .ember-power-select-multiple-option,
    [data-theme="dark"] .compose-mail-to .ember-power-select-multiple-options .ember-power-select-multiple-option {
      background-color: rgba(255, 255, 255, 0.1);
      border-color: rgba(255, 255, 255, 0.22);
      color: var(--field-fg);
    }

    [data-theme="dark"] input[disabled],
    [data-theme="dark"] .ember-power-select-trigger-multiple-input:disabled {
      background-color: rgba(255, 255, 255, 0.04);
      color: var(--grey-white);
    }

    /* Fusion Index (`_blocks/fusion-catalog`). Its orange accent is four flat
       tokens, three of which nothing else uses: `--serenade` is the header,
       the hovered row and the TICKED row (a tan band under white text),
       `--orange-dark` its text, `--orange-mid` the chip hover, and
       `--platinum` the value pills (#e2e2e7 under white text, 1.12:1) and
       the scrollbar. Set where the Index renders: in its modal and in the
       filter menus it portals out. */
    [data-theme="dark"] .modal,
    [data-theme="dark"] .ember-basic-dropdown-content {
      --serenade: rgba(204, 107, 55, 0.18);
      --orange-mid: rgba(204, 107, 55, 0.32);
      --orange-dark: #f0a77c;
      --platinum: rgba(255, 255, 255, 0.12);
    }

    [data-theme="dark"] .catalog__skeleton {
      background: linear-gradient(90deg, rgba(255, 255, 255, 0.06) 25%, rgba(255, 255, 255, 0.14) 50%, rgba(255, 255, 255, 0.06) 75%);
      background-size: 200% 100%;
    }

    /* Red "required" asterisk on the attribute sheets: #df1b41 is 2.9:1 on
       the modal sheet. */
    [data-theme="dark"] .fusion-attr-sheet__required {
      color: #ff6b81;
    }

    /* Modals (`_blocks/modal/modal.css`).
     *
     * The modal block is drawn on the refresh palette (`--r-*`), and those
     * tokens are flat light values that dark never redefined — so every modal
     * opened with navy titles and slate labels on the dark sheet, and the
     * pieces written as `#fff` (the membership list, its dropdowns, the tab
     * pills) came up as white panels carrying the dark theme's white text.
     * "Hub Memberships" measured 1.08:1 on its title and 1.15:1 on every row.
     *
     * The tokens are redefined HERE, on `.modal`, not on :root: they are used
     * by fifteen other blocks (buttons, tags, the nav…) that were never checked
     * against a dark value, and a custom property set on the modal reaches only
     * what is inside it. Same mapping as the admin surfaces above.
     *
     * Dropdown panels take the same set. ember-basic-dropdown portals its
     * content to a body-level wormhole, so a menu opened FROM a modal is not
     * inside `.modal` and kept the light palette — the share dialog's
     * permission menu was light slate on a white sheet. */
    [data-theme="dark"] .modal,
    [data-theme="dark"] .ember-basic-dropdown-content {
      --r-navy: var(--hero-white);
      --r-grey: var(--alto);
      --r-muted: #a8a8a8;
      --r-faint: var(--grey-white);

      --r-brand: var(--colour-brand);
      --r-brand-hi: #33b9ec;
      --r-tint: rgba(0, 167, 231, 0.16);
      --r-tint-2: rgba(0, 167, 231, 0.12);

      --r-edge: rgba(255, 255, 255, 0.14);
      --r-ctl: rgba(255, 255, 255, 0.22);
      --r-ctl-hi: rgba(255, 255, 255, 0.35);
      --r-div: rgba(255, 255, 255, 0.09);
      --r-div-2: rgba(255, 255, 255, 0.07);

      --r-fill: rgba(255, 255, 255, 0.06);
      --r-hover: rgba(255, 255, 255, 0.06);
      --r-row-hover: rgba(255, 255, 255, 0.04);
      --r-head: var(--colour-bg-raisin-black);
      --r-thead: var(--colour-bg-raisin-black);

      --r-ok-fg: #7dd69b;     --r-ok-bg: rgba(47, 122, 68, 0.22);
      --r-warn-fg: #f5b041;   --r-warn-bg: rgba(180, 83, 9, 0.22);
      --r-crit-fg: #ff8a80;   --r-crit-bg: rgba(180, 35, 24, 0.22);
      --r-note-fg: #f5c26b;   --r-note-bg: rgba(138, 90, 8, 0.22);
      --r-expiry-fg: #ffab76; --r-expiry-bg: rgba(168, 60, 11, 0.22);

      --r-focus: 0 0 0 3px rgba(0, 167, 231, 0.3);
      --r-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
      --r-shadow-md: 0 4px 14px rgba(0, 0, 0, 0.4);
      --r-shadow-lg: 0 16px 48px rgba(0, 0, 0, 0.55);
    }

    /* What modal.css writes as literals rather than tokens. */
    [data-theme="dark"] .modal .statustags__container,
    [data-theme="dark"] .modal .statustags__item .ember-basic-dropdown-trigger:not(:has(> svg)) {
      background: var(--colour-bg-eerie-black);
    }

    [data-theme="dark"] .modal .statustags__item .ember-basic-dropdown-trigger:not(:has(> svg)) {
      color: var(--hero-white);
    }

    [data-theme="dark"] .modal .memberships__tab--active {
      background: var(--colour-bg-eerie-black);
      box-shadow: none;
    }

    [data-theme="dark"] .modal .memberships__tab-count {
      background: rgba(255, 255, 255, 0.1);
      box-shadow: none;
    }

    [data-theme="dark"] .modal .tabs__item--active .tabs__item-subtitle {
      color: #7fd4f5;
    }

    [data-theme="dark"] .modal .modal__content--grey {
      color: var(--alto);
    }

    /* Permission picker (`_blocks/permissions/permissions.css`). Its refresh
       section writes the menu, the selected row and the closed trigger as
       `#fff`/`#f4f8ff`, over the file's own themed `--permission-bg` that dark
       already sets — so dark kept white panels under light text. */
    [data-theme="dark"] .permissions__list,
    [data-theme="dark"] .permissions__head {
      background: var(--colour-bg-eerie-black);
    }

    [data-theme="dark"] .permissions__head:hover {
      background: rgba(255, 255, 255, 0.06);
    }

    [data-theme="dark"] .permissions__item--selected {
      background: rgba(0, 167, 231, 0.12);
    }

    /* Light lets the danger fill win over "selected" by source order; the rule
       above outranks it, so it is restated. */
    [data-theme="dark"] .permissions__item--full,
    [data-theme="dark"] .permissions__head--full {
      background: var(--r-crit-bg);
    }

    /* A modal sheet is #2d2d30, a step lighter than the #191919 cards, so the
       card's tertiary grey (#8f8f8f) drops to 4.2:1 on it. One step up. */
    [data-theme="dark"] .modal .colour-fg-muted,
    [data-theme="dark"] .modal .hub-storage__pct,
    [data-theme="dark"] .modal .hub-storage__empty,
    [data-theme="dark"] .modal .memberships__empty,
    [data-theme="dark"] .modal .membership-insights__empty,
    [data-theme="dark"] .modal .ember-power-select-placeholder {
      color: #a8a8a8;
    }

    /* The group editor's member list — the same name/email pair as the users
       table, outside `.tenancy-admin` because modals render at the root. */
    [data-theme="dark"] .modal .user-card__name {
      color: var(--hero-white);
    }

    [data-theme="dark"] .modal .user-card__email {
      color: var(--alto);
    }

    [data-theme="dark"] .modal .highcharts-axis-title {
      color: var(--alto) !important;
      fill: var(--alto) !important;
    }

    /* The outlined secondary button: the rule near the top of this file gives
       it a light label but it keeps `buttons.css`'s `#fff` fill, so "Cancel"
       in every confirm dialog was white on white (1.15:1). The active variant
       keeps its brand fill — it is a separate class on the same element, and
       one class lower in specificity than this, hence the :not().

       `--style-6` is the same button under another name (buttons.css declares
       the two together) — the share dialog's Cancel — and had no dark rule at
       all, so it stayed a white light-mode button. */
    [data-theme="dark"] .button--style-3:not(.button--style-3--active),
    [data-theme="dark"] .button--style-6 {
      background-color: transparent;
      border-color: rgba(255, 255, 255, 0.22);
    }

    [data-theme="dark"] .button--style-6 {
      color: var(--hero-white);
    }

    [data-theme="dark"] .button--style-3:not(.button--style-3--active):hover,
    [data-theme="dark"] .button--style-6:hover {
      background-color: rgba(255, 255, 255, 0.06);
      border-color: var(--colour-brand);
      color: var(--colour-brand);
    }

    /* Reset passkey (`_blocks/passkeys/passkeys.css`), all literals. */
    [data-theme="dark"] .reset-passkey__title,
    [data-theme="dark"] .reset-passkey__code,
    [data-theme="dark"] .reset-passkey__input {
      color: var(--hero-white);
    }

    [data-theme="dark"] .reset-passkey__subtitle,
    [data-theme="dark"] .reset-passkey__loading,
    [data-theme="dark"] .reset-passkey__confirm-note,
    [data-theme="dark"] .reset-passkey__label,
    [data-theme="dark"] .reset-passkey__code-label,
    [data-theme="dark"] .reset-passkey__note,
    [data-theme="dark"] .reset-passkey__copy,
    [data-theme="dark"] .reset-passkey__reveal,
    [data-theme="dark"] .reset-passkey__btn--ghost {
      color: var(--alto);
    }

    [data-theme="dark"] .reset-passkey__icon {
      background: rgba(0, 167, 231, 0.16);
      color: #7fd4f5;
    }

    [data-theme="dark"] .reset-passkey__confirm-icon,
    [data-theme="dark"] .reset-passkey__reveal:hover,
    [data-theme="dark"] .reset-passkey__copy:hover {
      color: var(--colour-brand);
    }

    [data-theme="dark"] .reset-passkey__error {
      color: #ff8a80;
    }

    [data-theme="dark"] .reset-passkey__warn {
      background: rgba(217, 133, 43, 0.14);
      border-color: rgba(243, 209, 158, 0.35);
      color: #f3d19e;
    }

    [data-theme="dark"] .reset-passkey__warn strong {
      color: #ffe2b3;
    }

    [data-theme="dark"] .reset-passkey__input,
    [data-theme="dark"] .reset-passkey__copy,
    [data-theme="dark"] .reset-passkey__btn--ghost {
      background: var(--colour-bg-eerie-black);
      border-color: rgba(255, 255, 255, 0.22);
    }

    [data-theme="dark"] .reset-passkey__input::placeholder {
      color: var(--grey-white);
    }

    [data-theme="dark"] .reset-passkey__input:focus {
      border-color: var(--colour-brand);
      box-shadow: 0 0 0 3px rgba(0, 167, 231, 0.3);
    }

    [data-theme="dark"] .reset-passkey__code {
      background: var(--colour-bg-eerie-black);
      border-color: rgba(255, 255, 255, 0.22);
    }

    [data-theme="dark"] .reset-passkey__copy:hover,
    [data-theme="dark"] .reset-passkey__btn--ghost:hover {
      background: rgba(255, 255, 255, 0.06);
      border-color: rgba(255, 255, 255, 0.35);
    }

    [data-theme="dark"] .reset-passkey__spinner {
      border-color: rgba(255, 255, 255, 0.2);
      border-top-color: var(--colour-brand);
    }

    /* The typeahead / select dropdown. `ember-power-select` ships its own
       `background-color: #fff` and `color: #333` in vendor CSS, so every
       dropdown in the app — recipient pickers, hub switchers, tenancy filters
       — opened as a white sheet with dark text over a dark page. There is no
       app rule to repoint, so this overrides the addon. */
    [data-theme="dark"] .ember-power-select-dropdown,
    [data-theme="dark"] .ember-power-select-options {
      background-color: var(--field-bg);
      border-color: var(--field-border);
      color: var(--field-fg);
    }

    [data-theme="dark"] .ember-power-select-option {
      background-color: transparent;
      color: var(--field-fg);
    }

    [data-theme="dark"] .ember-power-select-option[aria-selected="true"] {
      background-color: var(--msg-row-hover);
    }
    /* It never got that cyan on dark: the `transparent` rule above has the
       same specificity as selectbox.css's `[aria-current]` fill and comes
       later, so the highlighted row was navy on the dark sheet (1.01:1,
       measured on a fusion attribute picker). Stated here, as a tint, with the
       light text a tint needs. */
    [data-theme="dark"] .ember-power-select-option[aria-current="true"] {
      background-color: rgba(0, 167, 231, 0.24);
      color: var(--hero-white);
    }

    /* The addon marks the keyboard-highlighted row with `aria-current`, and
       selectbox.css already fills it with the brand cyan. White on that cyan
       is 2.7:1, so the highlighted row takes the navy the badges use. */

    [data-theme="dark"] .ember-power-select-search-input {
      background-color: var(--field-bg);
      border-color: var(--field-border);
      color: var(--field-fg);
    }

    /* Disabled select box */
    [data-theme="dark"] .ember-power-select-trigger[aria-disabled=true] {
      background-color: inherit;
    }
}
@keyframes mdi-icon-spin {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(359deg);
  }
}
.mdi-icon-spin {
  animation: mdi-icon-spin .65s infinite linear;
}
.fill-grey {
  fill: #707070;
}
.fill-graphite {
  fill: #4e4e4e;
}
.fill-green {
  fill: #188313;
}
.fill-white {
  fill: #fff;
}
.m-r-5 {
  margin-right: 5px;
}
.m-t-25 {
  margin-top: 25px;
}
.color-black {
  color: #000;
}
.color-white {
  color: #fff;
}
.icon--green:before {
      color: #2da032;
    }
.icon--blue {
    color: var(--hero-blue);
  }
.smooth-scroll {
  -webkit-overflow-scrolling: touch;
}
.smooth-scroll::-webkit-scrollbar-track {
    background-color: #e1e3ec;
  }
.smooth-scroll::-webkit-scrollbar {
    width: 9px;
    height: 9px;
    background-color: #e1e3ec;
  }
@media only screen and (max-device-width: 640px) {
.smooth-scroll::-webkit-scrollbar {
      width: 1px;
      height: 1px
  }
    }
.smooth-scroll::-webkit-scrollbar-thumb {
    background-color: #bdc0cb;
    border-radius: 3px;
  }
.d-none {
  display: none !important;
}
.invalid-feedback {
  color: #ed3521;
  margin-top: 5px;
  font-size: 10px;
}
.domain-label {
  /* color: var(--colour-fg-default); */
  font-weight: 600;
  padding: 5px var(--spacer-3);
  border-left: solid 1px var(--colour-fg-default);
  font-size: 14px;
}
/* The hub's name beside the top bar's buttons, with All DekkoHubs selected. That bar is no wider than the conversation
   list below it (mail and chat templates): the reading pane is pulled up into the same row (`.mail__content`), and a
   name running past the list sat under the open chat's first participant. Where the buttons leave it less room than
   this, it takes a line of its own instead of shrinking to a letter. */
.mail__head--button > .wrapper-text-ellipsis {
  flex-basis: 120px;
  min-width: 120px;
}
.tenancy-label {
  margin-left: 10px;
  font-size: 17px;
  color: #4e4e4e;
}
.table {
  color: #000;
}
.uploaded-file-name {
  max-width: 600px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: bottom;
}
@media only screen and (max-device-width: 640px) {
.uploaded-file-name--phone {
        max-width: 340px
  }
      }
@media only screen and (max-device-width: 640px) {
.hide-on-phone {
      display: none !important
}
    }
/*
  A table column that only appears when there is room for it: hidden by default and restored at
  1900px and up. `table-cell` rather than `block`, because that is what `.valut-table__cell` is —
  the table is laid out with display:table, so a block here would drop the cell out of its row.
  Put it on the header cell and the body cell together or the columns stop lining up.
*/
.hide-below-wide {
  display: none !important;
}
@media only screen and (min-width: 1900px) {
.hide-below-wide {
      display: table-cell !important
}
    }
/* Override browser form-filling and input highlighting with HTML/CSS.
   currentColor, not a fixed one: an autofilled value must read the same as a typed one, and this
   rule covers every input in the app. It used to pin --hero-white here, which is only right on the
   dark hero forms it was written for — on any input with a light background the filled address came
   back white on white, invisible until clicked (the login form already had to override it back to
   black for exactly this reason). */
input:-webkit-autofill {
  -webkit-background-clip: text;
  -webkit-text-fill-color: currentColor;
}
input::-webkit-search-cancel-button {
 -webkit-appearance: none;
}
.google-recaptcha {
  display: inline-block;
  margin: 0;
  padding: 0;
}
.warning-banner {
  padding: 20px;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  right: 0;
  z-index: 1;
  background: #ffce00;
  text-align: center;
  box-sizing: border-box;
  color: #373737;
  font-weight: 500;
}
.viewer-info {
  color: #fff;
  font-size: 15px;
  line-height: 1.5rem;
  text-align: center;
  font-weight: bold;
}
.viewer-info::before {
  content: "i";
}
