/* /Components/Agenda/NotificationBell.razor.rz.scp.css */
.bell-wrap[b-0rj3e7491r] {
    position: relative;
}

.bell[b-0rj3e7491r] {
    text-decoration: none;
    font-size: 1.1rem;
    line-height: 1;
    padding: .25rem .5rem;
    color: #1F1B1B;
}

.count[b-0rj3e7491r] {
    position: absolute;
    top: -2px;
    right: -2px;
    background: #FFD800;
    color: #1F1B1B;
    border-radius: 999px;
    font-size: .65rem;
    font-weight: 700;
    min-width: 1.1rem;
    height: 1.1rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 .25rem;
}

/* Invisible on purpose: it exists to catch the click that closes the panel, not to dim
   anything. Fixed to the viewport so it covers the sidebar and the page alike, and one
   layer below the panel so the panel stays clickable. */
.backdrop[b-0rj3e7491r] {
    position: fixed;
    inset: 0;
    z-index: 1040;
    background: transparent;
}

.panel[b-0rj3e7491r] {
    position: absolute;
    right: 0;
    top: 2.2rem;
    width: 21rem;
    max-width: 90vw;
    background: #fff;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .5rem;
    z-index: 1050;
    overflow: hidden;
}

.panel-head[b-0rj3e7491r] {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: .5rem .75rem;
    border-bottom: 1px solid var(--bs-border-color, #dee2e6);
    background: #f8f9fa;
    font-size: .85rem;
}

/* The transparent left border is not decoration: the accented rows below claim those 3px,
   and without it here their text would sit 3px off from everybody else's. */
.item[b-0rj3e7491r] {
    display: flex;
    gap: .5rem;
    align-items: flex-start;
    padding: .5rem .75rem;
    border-bottom: 1px solid #f1f3f5;
    border-left: 3px solid transparent;
}

/* Somebody is waiting on a decision from whoever is reading this. Louder than the rest of
   the panel — the brand accent and a warm tint, no new colours — because "colegas de
   férias" is something to know and this is something to do. */
.item.waiting[b-0rj3e7491r] {
    border-left-color: #FFD800;
    background: #FFFCF0;
}

.item.waiting .item-title[b-0rj3e7491r] {
    font-weight: 600;
}

/* An answer already given: still worth reading, nothing left to do. Marked so it is clearly
   of the same family as the two above, in grey so it never competes with them. */
.item.decided[b-0rj3e7491r] {
    border-left-color: #dee2e6;
}

.kind-icon[b-0rj3e7491r] {
    margin-right: .3rem;
    font-size: .8rem;
}

/* Same reasoning as the overview's titles: underlined blue on every row would turn the
   panel into a menu. It underlines on hover, so it still says it is a link. */
.item-link[b-0rj3e7491r] {
    color: inherit;
    text-decoration: none;
}

.item-link:hover[b-0rj3e7491r],
.item-link:focus[b-0rj3e7491r] {
    text-decoration: underline;
}

.item-body[b-0rj3e7491r] {
    flex: 1;
    min-width: 0;
}

.item-title[b-0rj3e7491r] {
    font-size: .85rem;
    font-weight: 500;
}

.at[b-0rj3e7491r] {
    display: inline-block;
    background: #1F1B1B;
    color: #fff;
    border-radius: .2rem;
    font-size: .7rem;
    padding: 0 .3rem;
    margin-right: .3rem;
}

.item-detail[b-0rj3e7491r] {
    font-size: .75rem;
    color: #6c757d;
}

.empty[b-0rj3e7491r] {
    padding: 1rem .75rem;
    font-size: .85rem;
    color: #6c757d;
    text-align: center;
}

.panel-foot[b-0rj3e7491r] {
    display: block;
    text-align: center;
    padding: .5rem;
    font-size: .8rem;
    background: #f8f9fa;
    text-decoration: none;
}

/* A panel opened on the tablet, at the counter: the row's link and the dismiss cross are
   both real targets now, not 12px of text between two 8px paddings. */
@media (pointer: coarse) {
    .item[b-0rj3e7491r] {
        padding-top: .75rem;
        padding-bottom: .75rem;
    }

    .item-link[b-0rj3e7491r] {
        display: inline-flex;
        align-items: center;
        min-height: 44px;
    }

    .item .btn-close[b-0rj3e7491r] {
        min-width: 44px;
        min-height: 44px;
    }
}
/* /Components/Comms/ConversationLinksPanel.razor.rz.scp.css */
/* The panel folds into the conversation card, so it borrows the card's padding and only adds
   the layout its own rows need. The toggle is a quiet, ink-coloured summary line. */
.links-toggle[b-sswizaf0eo] {
    color: #1F1B1B;
    text-decoration: none;
    font-weight: 600;
}

.links-toggle:hover[b-sswizaf0eo] {
    color: #1F1B1B;
    text-decoration: none;
}

.links-caret[b-sswizaf0eo] {
    display: inline-block;
    width: 1rem;
    color: #6c757d;
}

/* Each link is a row: a small thumbnail (items only), the title and its meta, and a remove
   button pinned to the right. min-height keeps the remove target comfortable on a tablet. */
.links-list[b-sswizaf0eo] {
    display: flex;
    flex-direction: column;
    gap: .4rem;
    margin-top: .35rem;
}

.link-row[b-sswizaf0eo] {
    display: flex;
    align-items: center;
    gap: .6rem;
    min-height: 44px;
    padding: .35rem .5rem;
    border: 1px solid #e9ecef;
    border-radius: .5rem;
}

.link-main[b-sswizaf0eo] {
    flex: 1 1 auto;
    min-width: 0;
}

.link-title[b-sswizaf0eo] {
    display: block;
    font-weight: 600;
    text-decoration: none;
    color: inherit;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

a.link-title:hover[b-sswizaf0eo] {
    text-decoration: underline;
}

/* Square thumbnail, cropped to fill — the same neutral placeholder the catalogue uses. */
.link-thumb[b-sswizaf0eo] {
    flex: 0 0 auto;
    width: 44px;
    height: 44px;
    border-radius: .4rem;
    overflow: hidden;
    background: #f1f3f5;
}

.link-thumb img[b-sswizaf0eo] {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.link-thumb-empty[b-sswizaf0eo] {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #adb5bd;
}

.link-remove[b-sswizaf0eo] {
    flex: 0 0 auto;
    line-height: 1;
}

/* A category's colour as a small dot beside its name. */
.cat-dot[b-sswizaf0eo] {
    display: inline-block;
    width: .6rem;
    height: .6rem;
    border-radius: 50%;
    flex: 0 0 auto;
}

/* The picker sits under the section on a faint tinted panel so it reads as a temporary tool
   rather than part of the list. Results are full-width buttons for an easy tap. */
.link-picker[b-sswizaf0eo] {
    padding: .5rem;
    border: 1px solid #e9ecef;
    border-radius: .5rem;
    background: #fbfbf7;
}

.link-result[b-sswizaf0eo] {
    display: flex;
    align-items: center;
    gap: .6rem;
    width: 100%;
    min-height: 44px;
    padding: .35rem .5rem;
    text-align: left;
    border: 1px solid transparent;
    border-radius: .5rem;
    background: #fff;
}

.link-result:hover[b-sswizaf0eo],
.link-result:focus-visible[b-sswizaf0eo] {
    border-color: #FFD800;
    background: #fffdf2;
}

.link-result:disabled[b-sswizaf0eo] {
    opacity: .6;
}
/* /Components/Comms/LinkedConversationList.razor.rz.scp.css */
/* Compact, tappable rows for a linked conversation: a bordered strip whose whole surface is
   the deep link into the inbox. 44px min-height keeps it comfortable under a finger. */
.linked-conversations[b-en3je5iomk] {
    display: flex;
    flex-direction: column;
    gap: .4rem;
}

.linked-conversation-link[b-en3je5iomk] {
    display: block;
    min-height: 44px;
    padding: .45rem .6rem;
    border: 1px solid #e9ecef;
    border-radius: .5rem;
    text-decoration: none;
    color: inherit;
}

.linked-conversation-link:hover[b-en3je5iomk],
.linked-conversation-link:focus-visible[b-en3je5iomk] {
    border-color: #FFD800;
    background: #fffdf2;
}
/* /Components/Holidays/HolidayRangePicker.razor.rz.scp.css */
.picker[b-v7acszjoym] {
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .5rem;
    padding: .75rem;
}

.picker-head[b-v7acszjoym] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .75rem;
}

.picker-title[b-v7acszjoym] {
    font-weight: 600;
    font-size: .95rem;
}

.months[b-v7acszjoym] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
    gap: 1rem;
}

.month-name[b-v7acszjoym] {
    font-size: .8rem;
    font-weight: 600;
    margin-bottom: .35rem;
}

.weekday-row[b-v7acszjoym],
.day-grid[b-v7acszjoym] {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 3px;
}

.weekday[b-v7acszjoym] {
    text-align: center;
    font-size: .7rem;
    color: #6c757d;
    padding-bottom: .2rem;
}

/* Day cells are real buttons so they are keyboard reachable and announce as controls. */
.day[b-v7acszjoym] {
    aspect-ratio: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .8rem;
    border: 1px solid transparent;
    border-radius: .25rem;
    background: transparent;
    padding: 0;
    color: inherit;
    cursor: pointer;
}

.day:hover:not(:disabled)[b-v7acszjoym] {
    border-color: #0d6efd;
}

.day:focus-visible[b-v7acszjoym] {
    outline: 2px solid #0d6efd;
    outline-offset: 1px;
}

.day.blank[b-v7acszjoym] {
    visibility: hidden;
    pointer-events: none;
}

.day.selected[b-v7acszjoym] {
    background: #0d6efd;
    color: #fff;
    font-weight: 600;
}

.day.selected.half[b-v7acszjoym] {
    background: linear-gradient(135deg, #0d6efd 50%, #e7f1ff 50%);
    color: #084298;
}

.day.booked[b-v7acszjoym] {
    background: #198754;
    color: #fff;
    cursor: not-allowed;
    opacity: .65;
}

.day.holiday[b-v7acszjoym] {
    background: #cfe2ff;
    color: #084298;
}

.day.nonworking[b-v7acszjoym] {
    background: #f1f3f5;
    color: #adb5bd;
}

.legend[b-v7acszjoym] {
    display: flex;
    flex-wrap: wrap;
    gap: .9rem;
    margin-top: .75rem;
    font-size: .75rem;
    color: #6c757d;
}

.legend span[b-v7acszjoym] {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
}

.swatch[b-v7acszjoym] {
    width: .75rem;
    height: .75rem;
    border-radius: .2rem;
    display: inline-block;
}

.swatch.selected[b-v7acszjoym] { background: #0d6efd; }
.swatch.selected.half[b-v7acszjoym] { background: linear-gradient(135deg, #0d6efd 50%, #e7f1ff 50%); }
.swatch.booked[b-v7acszjoym] { background: #198754; opacity: .65; }
.swatch.holiday[b-v7acszjoym] { background: #cfe2ff; }
.swatch.nonworking[b-v7acszjoym] { background: #f1f3f5; border: 1px solid #dee2e6; }
/* /Components/Holidays/YearCalendar.razor.rz.scp.css */
.year-grid[b-o47xnwreei] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
    gap: 1rem;
}

.month[b-o47xnwreei] {
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .5rem;
    padding: .6rem;
}

.month-name[b-o47xnwreei] {
    margin: 0 0 .4rem;
    font-size: .85rem;
    font-weight: 600;
}

.weekday-row[b-o47xnwreei],
.day-grid[b-o47xnwreei] {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
}

.weekday[b-o47xnwreei] {
    text-align: center;
    font-size: .65rem;
    color: #6c757d;
    padding-bottom: .2rem;
}

.day[b-o47xnwreei] {
    aspect-ratio: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .7rem;
    border-radius: .2rem;
    background: transparent;
    cursor: default;
}

.day.blank[b-o47xnwreei] {
    visibility: hidden;
}

/* Approved and pending win over the non-working styling, so a booked block reads as one
   continuous run even when it spans a weekend. A public holiday is the exception and keeps
   its own colour — see .day.booked-holiday below. */
.day.approved[b-o47xnwreei] {
    background: #198754;
    color: #fff;
    font-weight: 600;
}

.day.pending[b-o47xnwreei] {
    background: #ffc107;
    color: #212529;
    font-weight: 600;
}

/* A half day is drawn as a diagonal split so it is distinguishable at a glance from a
   full day without needing a separate colour. */
.day.approved.half[b-o47xnwreei] {
    background: linear-gradient(135deg, #198754 50%, #e9ecef 50%);
    color: #212529;
}

.day.pending.half[b-o47xnwreei] {
    background: linear-gradient(135deg, #ffc107 50%, #e9ecef 50%);
}

.day.holiday[b-o47xnwreei] {
    background: #cfe2ff;
    color: #084298;
}

/* A feriado inside a booked block. Keeps the holiday colour, because that is what it is and
   what the plafond charged, with a ring so the run still reads as one period. */
.day.booked-holiday[b-o47xnwreei] {
    box-shadow: inset 0 0 0 2px #198754;
    font-weight: 600;
}

.day.nonworking[b-o47xnwreei] {
    background: #f1f3f5;
    color: #adb5bd;
}

.legend[b-o47xnwreei] {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    margin-top: 1rem;
    font-size: .8rem;
    color: #6c757d;
}

.legend span[b-o47xnwreei] {
    display: inline-flex;
    align-items: center;
    gap: .35rem;
}

.swatch[b-o47xnwreei] {
    width: .8rem;
    height: .8rem;
    border-radius: .2rem;
    display: inline-block;
}

.swatch.approved[b-o47xnwreei] { background: #198754; }
.swatch.pending[b-o47xnwreei] { background: #ffc107; }
.swatch.holiday[b-o47xnwreei] { background: #cfe2ff; }
.swatch.holiday.booked-holiday[b-o47xnwreei] { background: #cfe2ff; box-shadow: inset 0 0 0 2px #198754; }
.swatch.nonworking[b-o47xnwreei] { background: #f1f3f5; border: 1px solid #dee2e6; }
.swatch.approved.half[b-o47xnwreei] { background: linear-gradient(135deg, #198754 50%, #e9ecef 50%); }
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-c7ja3qlefa] {
    position: relative;
    display: flex;
    flex-direction: column;
}

main[b-c7ja3qlefa] {
    flex: 1;
}

.sidebar[b-c7ja3qlefa] {
    /* Brand near-black, lifted very slightly towards the bottom so the panel has some
       depth without becoming a second colour. */
    background-image: linear-gradient(180deg, #1F1B1B 0%, #2b2725 100%);
}

.top-row[b-c7ja3qlefa] {
    background-color: #fff;
    border-bottom: 3px solid #FFD800;
    justify-content: flex-end;
    height: 3.5rem;
    display: flex;
    align-items: center;
}

    .top-row[b-c7ja3qlefa]  a, .top-row[b-c7ja3qlefa]  .btn-link {
        white-space: nowrap;
        margin-left: 1.5rem;
        text-decoration: none;
    }

    .top-row[b-c7ja3qlefa]  a:hover, .top-row[b-c7ja3qlefa]  .btn-link:hover {
        text-decoration: underline;
    }

    .top-row[b-c7ja3qlefa]  a:first-child {
        overflow: hidden;
        text-overflow: ellipsis;
    }

@media (max-width: 640.98px) {
    .top-row[b-c7ja3qlefa] {
        justify-content: space-between;
    }

    .top-row[b-c7ja3qlefa]  a, .top-row[b-c7ja3qlefa]  .btn-link {
        margin-left: 0;
    }
}

@media (min-width: 992px) {
    .page[b-c7ja3qlefa] {
        flex-direction: row;
    }

    .sidebar[b-c7ja3qlefa] {
        width: 250px;
        /* 100vh first as a fallback for engines that don't understand dvh; 100dvh then wins on
           modern engines so the sidebar tracks the *visible* viewport (iOS URL bar excluded). */
        height: 100vh;
        height: 100dvh;
        position: sticky;
        top: 0;
    }

    .top-row[b-c7ja3qlefa] {
        position: sticky;
        top: 0;
        z-index: 1;
    }

    .top-row.auth[b-c7ja3qlefa]  a:first-child {
        flex: 1;
        text-align: right;
        width: 0;
    }

    .top-row[b-c7ja3qlefa], article[b-c7ja3qlefa] {
        padding-left: 2rem !important;
        padding-right: 1.5rem !important;
    }
}

/* Em papel não há navegação. Sem isto a barra lateral continua a ocupar os seus 250px ao
   lado do conteúdo — e a imprimir um mapa da equipa isso é uma coluna preta e um quarto da
   largura da folha gastos com botões em que ninguém pode carregar. */
@media print {
    .sidebar[b-c7ja3qlefa],
    .top-row[b-c7ja3qlefa] {
        display: none !important;
    }

    .page[b-c7ja3qlefa] {
        display: block;
    }

    article[b-c7ja3qlefa] {
        padding-left: 0 !important;
        padding-right: 0 !important;
    }
}

#blazor-error-ui[b-c7ja3qlefa] {
    color-scheme: light only;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss[b-c7ja3qlefa] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/NavMenu.razor.rz.scp.css */
/*
    Ink on white, not the stock template's white-on-dark. The brand bar behind this control
    is white (see .top-row below) so that the JPEG logo sits on its own background — which
    left the inherited white glyph, white fill and white border invisible against it. The
    control still worked, so on a phone the menu read as missing entirely rather than
    collapsed: nothing to see and nothing to tap. Any restyle of .top-row has to keep this
    contrast.
*/
.navbar-toggler[b-1bd2o3qcrb] {
    appearance: none;
    -webkit-appearance: none;
    cursor: pointer;
    width: 3.5rem;
    height: 2.5rem;
    position: absolute;
    top: 0.5rem;
    right: 1rem;
    /* Above the brand bar regardless of how the two are positioned in future. */
    z-index: 2;
    border: 1px solid rgba(31, 27, 27, 0.25);
    border-radius: 4px;
    background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%231F1B1B' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem transparent;
}

.navbar-toggler:checked[b-1bd2o3qcrb] {
    background-color: rgba(31, 27, 27, 0.1);
}

/* Keyboard focus has to be visible against white too — brand yellow, as elsewhere. */
.navbar-toggler:focus-visible[b-1bd2o3qcrb] {
    outline: 3px solid #FFD800;
    outline-offset: 2px;
}

/* 44px minimum touch target on touch devices, per the tablet-friendly convention. */
@media (pointer: coarse) {
    .navbar-toggler[b-1bd2o3qcrb] {
        height: 2.75rem;
    }
}

.top-row[b-1bd2o3qcrb] {
    min-height: 4.75rem;
    background-color: #fff;
    border-bottom: 3px solid #FFD800;
    padding: .5rem .75rem;
}

.navbar-brand[b-1bd2o3qcrb] {
    font-size: 1.1rem;
}

.brand-logo[b-1bd2o3qcrb] {
    display: block;
    max-width: 100%;
    height: auto;
    /* The source artwork is only 215px wide, so it is never scaled up past its natural
       size — enlarging it just makes the JPEG artefacts visible. */
    width: 190px;
}

.bi[b-1bd2o3qcrb] {
    display: inline-block;
    position: relative;
    width: 1.25rem;
    height: 1.25rem;
    margin-right: 0.75rem;
    top: -1px;
    background-size: cover;
}

.bi-house-door-fill-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}

.bi-plus-square-fill-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}

.bi-list-nested-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}

.bi-lock-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath d='M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2zM5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1z'/%3E%3C/svg%3E");
}

.bi-person-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person' viewBox='0 0 16 16'%3E%3Cpath d='M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z'/%3E%3C/svg%3E");
}

.bi-person-badge-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-badge' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 2a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1h-3zM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z'/%3E%3Cpath d='M4.5 0A2.5 2.5 0 0 0 2 2.5V14a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2.5A2.5 2.5 0 0 0 11.5 0h-7zM3 2.5A1.5 1.5 0 0 1 4.5 1h7A1.5 1.5 0 0 1 13 2.5v10.795a4.2 4.2 0 0 0-.776-.492C11.392 12.387 10.063 12 8 12s-3.392.387-4.224.803a4.2 4.2 0 0 0-.776.492V2.5z'/%3E%3C/svg%3E");
}

.bi-person-fill-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-fill' viewBox='0 0 16 16'%3E%3Cpath d='M3 14s-1 0-1-1 1-4 6-4 6 3 6 4-1 1-1 1H3Zm5-6a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z'/%3E%3C/svg%3E");
}

.bi-arrow-bar-left-nav-menu[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-arrow-bar-left' viewBox='0 0 16 16'%3E%3Cpath d='M12.5 15a.5.5 0 0 1-.5-.5v-13a.5.5 0 0 1 1 0v13a.5.5 0 0 1-.5.5ZM10 8a.5.5 0 0 1-.5.5H3.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L3.707 7.5H9.5a.5.5 0 0 1 .5.5Z'/%3E%3C/svg%3E");
}

/* The BejaBikeTraining module's icon — a mortarboard glyph in the sidebar's white. Keyed on
   the `bi-mortarboard` identifier the TrainingModule sets, in the same way the hardcoded nav
   icons above map an identifier to a custom SVG background. */
.bi-mortarboard[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-mortarboard-fill' viewBox='0 0 16 16'%3E%3Cpath d='M8.211 2.047a.5.5 0 0 0-.422 0l-7.5 3.5a.5.5 0 0 0 .025.917l7.5 3a.5.5 0 0 0 .372 0L14 7.14V13a1 1 0 0 0-1 1v2h3v-2a1 1 0 0 0-1-1V6.739l.686-.275a.5.5 0 0 0 .025-.917z'/%3E%3Cpath d='M4.176 9.032a.5.5 0 0 0-.656.327l-.5 1.7a.5.5 0 0 0 .294.605l4.5 1.8a.5.5 0 0 0 .372 0l4.5-1.8a.5.5 0 0 0 .294-.605l-.5-1.7a.5.5 0 0 0-.656-.327L8 10.466z'/%3E%3C/svg%3E");
}

/* The remaining module icons, keyed the same way: each IAppModule declares a Bootstrap Icons
   class name and the sidebar draws it from the authentic BI glyph below, in the sidebar's
   white. AgendaModule → calendar-event, CommsModule → inbox, ChannelsModule → broadcast,
   HolidaysModule → calendar-week, AbsencesModule → person-x, BonusModule → piggy-bank,
   ItemsModule → tag, UsersModule → people.

   A module whose Icon has no rule here renders an empty 1.25rem gap, not a fallback — which
   is exactly what Faltas did until this rule was added. Declaring the icon on the module is
   only half of it; the glyph has to be drawn here too.

   Prémios then did the identical thing, with this comment already on the file saying so, which
   says something about how much a warning is worth: BonusModule declared bi-piggy-bank and
   shipped with a blank where its glyph belongs. The list above is exhaustive on purpose — a new
   module belongs in it and in a rule below, and if the two ever disagree the menu is what shows
   it. */
.bi-calendar-event[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-calendar-event' viewBox='0 0 16 16'%3E%3Cpath d='M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5z'/%3E%3Cpath d='M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5M1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4z'/%3E%3C/svg%3E");
}

.bi-inbox[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-inbox' viewBox='0 0 16 16'%3E%3Cpath d='M4.98 4a.5.5 0 0 0-.39.188L1.54 8H6a.5.5 0 0 1 .5.5 1.5 1.5 0 1 0 3 0A.5.5 0 0 1 10 8h4.46l-3.05-3.812A.5.5 0 0 0 11.02 4zm-1.17-.437A1.5 1.5 0 0 1 4.98 3h6.04a1.5 1.5 0 0 1 1.17.563l3.7 4.625a.5.5 0 0 1 .106.374l-.39 3.124A1.5 1.5 0 0 1 14.117 13H1.883a1.5 1.5 0 0 1-1.489-1.314l-.39-3.124a.5.5 0 0 1 .106-.374z'/%3E%3C/svg%3E");
}

.bi-broadcast[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-broadcast' viewBox='0 0 16 16'%3E%3Cpath d='M3.05 3.05a7 7 0 0 0 0 9.9.5.5 0 0 1-.707.707 8 8 0 0 1 0-11.314.5.5 0 0 1 .707.707m2.122 2.122a4 4 0 0 0 0 5.656.5.5 0 1 1-.708.708 5 5 0 0 1 0-7.072.5.5 0 0 1 .708.708m5.656-.708a.5.5 0 0 1 .708 0 5 5 0 0 1 0 7.072.5.5 0 1 1-.708-.708 4 4 0 0 0 0-5.656.5.5 0 0 1 0-.708m2.122-2.12a.5.5 0 0 1 .707 0 8 8 0 0 1 0 11.313.5.5 0 0 1-.707-.707 7 7 0 0 0 0-9.9.5.5 0 0 1 0-.707zM10 8a2 2 0 1 1-4 0 2 2 0 0 1 4 0'/%3E%3C/svg%3E");
}

.bi-calendar-week[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-calendar-week' viewBox='0 0 16 16'%3E%3Cpath d='M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5zm-3 0a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5zm-5 3a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5zm3 0a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5z'/%3E%3Cpath d='M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5M1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4z'/%3E%3C/svg%3E");
}

.bi-person-x[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-person-x' viewBox='0 0 16 16'%3E%3Cpath d='M11 5a3 3 0 1 1-6 0 3 3 0 0 1 6 0M8 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4m.256 7a4.5 4.5 0 0 1-.229-1.004H3c.001-.246.154-.986.832-1.664C4.484 10.68 5.711 10 8 10q.39 0 .74.025c.226-.341.496-.65.804-.918Q8.844 9.002 8 9c-5 0-6 3-6 4s1 1 1 1z'/%3E%3Cpath d='M12.5 16a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7m-.646-4.854.646.647.646-.647a.5.5 0 0 1 .708.708l-.647.646.647.646a.5.5 0 0 1-.708.708l-.646-.647-.646.647a.5.5 0 0 1-.708-.708l.647-.646-.647-.646a.5.5 0 0 1 .708-.708'/%3E%3C/svg%3E");
}

.bi-piggy-bank[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-piggy-bank' viewBox='0 0 16 16'%3E%3Cpath d='M5 6.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.138-1.496A6.6 6.6 0 0 1 7.964 4.5c.666 0 1.303.097 1.893.273a.5.5 0 0 0 .286-.958A7.6 7.6 0 0 0 7.964 3.5c-.734 0-1.441.103-2.102.292a.5.5 0 1 0 .276.962'/%3E%3Cpath fill-rule='evenodd' d='M7.964 1.527c-2.977 0-5.571 1.704-6.32 4.125h-.55A1 1 0 0 0 .11 6.824l.254 1.46a1.5 1.5 0 0 0 1.478 1.243h.263c.3.513.688.978 1.145 1.382l-.729 2.477a.5.5 0 0 0 .48.641h2a.5.5 0 0 0 .471-.332l.482-1.351c.635.173 1.31.267 2.011.267.707 0 1.388-.095 2.028-.272l.543 1.372a.5.5 0 0 0 .465.316h2a.5.5 0 0 0 .478-.645l-.761-2.506C13.81 9.895 14.5 8.559 14.5 7.069q0-.218-.02-.431c.261-.11.508-.266.705-.444.315.306.815.306.815-.417 0 .223-.5.223-.461-.026a1 1 0 0 0 .09-.255.7.7 0 0 0-.202-.645.58.58 0 0 0-.707-.098.74.74 0 0 0-.375.562c-.024.243.082.48.32.654a2 2 0 0 1-.259.153c-.534-2.664-3.284-4.595-6.442-4.595M2.516 6.26c.455-2.066 2.667-3.733 5.448-3.733 3.146 0 5.536 2.114 5.536 4.542 0 1.254-.624 2.41-1.67 3.248a.5.5 0 0 0-.165.535l.66 2.175h-.985l-.59-1.487a.5.5 0 0 0-.629-.288c-.661.23-1.39.359-2.157.359a6.6 6.6 0 0 1-2.157-.359.5.5 0 0 0-.635.304l-.525 1.471h-.979l.633-2.15a.5.5 0 0 0-.17-.534 4.65 4.65 0 0 1-1.284-1.541.5.5 0 0 0-.446-.275h-.56a.5.5 0 0 1-.492-.414l-.254-1.46h.933a.5.5 0 0 0 .488-.393m12.621-.857a.6.6 0 0 1-.098.21l-.044-.025c-.146-.09-.157-.175-.152-.223a.24.24 0 0 1 .117-.173c.049-.027.08-.021.113.012a.2.2 0 0 1 .064.199'/%3E%3C/svg%3E");
}

.bi-tag[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-tag' viewBox='0 0 16 16'%3E%3Cpath d='M6 4.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0M5 4.5a.5.5 0 1 0-1 0 .5.5 0 0 0 1 0'/%3E%3Cpath d='M2 1a1 1 0 0 0-1 1v4.586a1 1 0 0 0 .293.707l7 7a1 1 0 0 0 1.414 0l4.586-4.586a1 1 0 0 0 0-1.414l-7-7A1 1 0 0 0 6.586 1zm0 5V2h4.586l7 7L9 13.586z'/%3E%3C/svg%3E");
}

.bi-people[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-people' viewBox='0 0 16 16'%3E%3Cpath d='M15 14s1 0 1-1-1-4-5-4-5 3-5 4 1 1 1 1zm-7.978-1L7 12.996c.001-.264.167-1.03.76-1.72C8.312 9.629 9.282 9 11 9c1.717 0 2.687.63 3.24 1.276.593.69.758 1.457.76 1.72l-.008.002-.014.002zM11 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4m3-2a3 3 0 1 1-6 0 3 3 0 0 1 6 0M6.936 9.28a6 6 0 0 0-1.23-.247A7 7 0 0 0 5 9c-4 0-5 3-5 4q0 1 1 1h4.216A2.24 2.24 0 0 1 5 13c0-1.01.377-2.042 1.09-2.904.243-.294.526-.569.846-.816M4.92 10A5.5 5.5 0 0 0 4 13H1c0-.26.164-1.03.76-1.724.545-.636 1.492-1.256 3.16-1.275ZM1.5 5.5a3 3 0 1 1 6 0 3 3 0 0 1-6 0m3-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4'/%3E%3C/svg%3E");
}

.bi-shield-lock[b-1bd2o3qcrb] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-shield-lock' viewBox='0 0 16 16'%3E%3Cpath d='M5.338 1.59a61 61 0 0 0-2.837.856.48.48 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.7 10.7 0 0 0 2.287 2.233c.346.244.652.42.893.533q.18.085.293.118a1 1 0 0 0 .101.025 1 1 0 0 0 .1-.025q.114-.034.294-.118c.24-.113.547-.29.893-.533a10.7 10.7 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.8 11.8 0 0 1-2.517 2.453 7 7 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7 7 0 0 1-1.048-.625 11.8 11.8 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 63 63 0 0 1 5.072.56'/%3E%3Cpath d='M9.5 6.5a1.5 1.5 0 0 1-1 1.415l.385 1.99a.5.5 0 0 1-.491.595h-.788a.5.5 0 0 1-.49-.595l.384-1.99a1.5 1.5 0 1 1 2-1.415'/%3E%3C/svg%3E");
}

/* A section label, not a link: small, quiet and lettered wide, so it reads as a divider
   between the day-to-day modules above it and the administration ones below. */
.nav-group-header[b-1bd2o3qcrb] {
    font-size: 0.7rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.45);
    padding-top: 0.75rem;
    padding-bottom: 0.35rem;
    /* Aligned with the labels, past the reserved active marker. */
    margin-left: .75rem;
}

.nav-item[b-1bd2o3qcrb] {
    font-size: 0.9rem;
    padding-bottom: 0.5rem;
}

    .nav-item:first-of-type[b-1bd2o3qcrb] {
        padding-top: 1rem;
    }

    .nav-item:last-of-type[b-1bd2o3qcrb] {
        padding-bottom: 1rem;
    }

    /* min-height, not height, and a normal line-height: a long label such as "Canais de
       Comunicação" wraps to two lines, and the old fixed 3rem height + 3rem line-height
       left the two lines a full 3rem apart and spilling out of the box. The link now grows
       to fit while single-line entries keep the same 3rem rhythm. */
    .nav-item[b-1bd2o3qcrb]  .nav-link {
        color: #d7d7d7;
        background: none;
        border: none;
        border-radius: 4px;
        min-height: 3rem;
        display: flex;
        align-items: center;
        line-height: 1.3;
        width: 100%;
        /* Reserved so the active marker does not shift the label sideways. */
        border-left: 3px solid transparent;
        padding-left: .75rem;
        padding-right: .5rem;
        text-align: left;
    }

        /* The glyph keeps its size when the label beside it wraps. */
        .nav-item[b-1bd2o3qcrb]  .nav-link .bi {
            flex: 0 0 auto;
        }

/* Brand yellow marks the current page. Used as a rule and as text colour rather than a
   fill, because a solid yellow block would compete with the logo directly above it. */
.nav-item[b-1bd2o3qcrb]  a.active {
    background-color: rgba(255, 216, 0, 0.12);
    border-left-color: #FFD800;
    color: #FFD800;
    font-weight: 600;
}

.nav-item[b-1bd2o3qcrb]  .nav-link:hover {
    background-color: rgba(255, 255, 255, 0.08);
    color: white;
}

.nav-scrollable[b-1bd2o3qcrb] {
    display: none;
}

.navbar-toggler:checked ~ .nav-scrollable[b-1bd2o3qcrb] {
    display: block;
}

@media (min-width: 992px) {
    .navbar-toggler[b-1bd2o3qcrb] {
        display: none;
    }

    .nav-scrollable[b-1bd2o3qcrb] {
        /* Never collapse the sidebar for wide screens */
        display: block;

        /* Allow sidebar to scroll for tall menus. Subtract the real top-row height (4.75rem,
           see .top-row min-height above), not 3.5rem. 100vh is the fallback for old engines;
           100dvh then wins so the scroll area matches the visible viewport on iOS. */
        height: calc(100vh - 4.75rem);
        height: calc(100dvh - 4.75rem);
        overflow-y: auto;
    }
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
/* Both content blocks are hidden until Blazor puts the modal into a matching state. */
.reconnect-while-retrying[b-pexdbarkx9],
.reconnect-while-failed[b-pexdbarkx9] {
    display: none;
}

/* Trying to resume: first attempt, an active retry, or a server-paused circuit. */
#components-reconnect-modal.components-reconnect-show .reconnect-while-retrying[b-pexdbarkx9],
#components-reconnect-modal.components-reconnect-retrying .reconnect-while-retrying[b-pexdbarkx9],
#components-reconnect-modal.components-reconnect-paused .reconnect-while-retrying[b-pexdbarkx9] {
    display: block;
}

/* Gave up: retries exhausted, the socket was rejected, or resuming a paused circuit failed. */
#components-reconnect-modal.components-reconnect-failed .reconnect-while-failed[b-pexdbarkx9],
#components-reconnect-modal.components-reconnect-rejected .reconnect-while-failed[b-pexdbarkx9],
#components-reconnect-modal.components-reconnect-resume-failed .reconnect-while-failed[b-pexdbarkx9] {
    display: block;
}

#components-reconnect-modal[b-pexdbarkx9] {
    /* Centred and comfortably sized for a tablet held at arm's length. */
    background-color: white;
    color: #1f1b1b;
    width: min(22rem, calc(100vw - 2rem));
    margin: 20vh auto;
    padding: 2rem;
    border: 0;
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    font-size: 1.05rem;
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-pexdbarkx9 0.5s both;
}

#components-reconnect-modal[open][b-pexdbarkx9] {
    animation: components-reconnect-modal-slideUp-b-pexdbarkx9 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-pexdbarkx9 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

#components-reconnect-modal[b-pexdbarkx9]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-pexdbarkx9 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-pexdbarkx9 {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-pexdbarkx9 {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-pexdbarkx9 {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-pexdbarkx9] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
    text-align: center;
}

#components-reconnect-modal p[b-pexdbarkx9] {
    margin: 0;
    text-align: center;
}

#components-reconnect-modal button[b-pexdbarkx9] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    /* Large, finger-friendly tap target. */
    padding: 0.6rem 1.75rem;
    font-size: 1rem;
    border-radius: 4px;
    cursor: pointer;
}

    #components-reconnect-modal button:hover[b-pexdbarkx9] {
        background-color: #3b6ea2;
    }

    #components-reconnect-modal button:active[b-pexdbarkx9] {
        background-color: #6b9ed2;
    }

/* Expanding-ring spinner shown while resuming. */
.reconnect-spinner[b-pexdbarkx9] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .reconnect-spinner div[b-pexdbarkx9] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-pexdbarkx9 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .reconnect-spinner div:nth-child(2)[b-pexdbarkx9] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-pexdbarkx9 {
    0% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    4.9% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    5% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 1;
    }

    100% {
        top: 0px;
        left: 0px;
        width: 80px;
        height: 80px;
        opacity: 0;
    }
}
/* /Components/Pages/Agenda/AgendaCalendar.razor.rz.scp.css */
.month-grid[b-u0jjsbev7w] {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 4px;
}

.weekday[b-u0jjsbev7w] {
    font-size: .75rem;
    font-weight: 600;
    color: #6c757d;
    text-align: center;
    padding-bottom: .25rem;
}

.day[b-u0jjsbev7w] {
    min-height: 6rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .35rem;
    background: #fff;
    padding: .3rem;
    text-align: left;
    display: flex;
    flex-direction: column;
    gap: 2px;
    cursor: pointer;
    overflow: hidden;
}

.day:hover[b-u0jjsbev7w] {
    border-color: #1F1B1B;
}

.day.blank[b-u0jjsbev7w] {
    visibility: hidden;
    pointer-events: none;
}

.day.is-today .day-number[b-u0jjsbev7w] {
    background: #1F1B1B;
    color: #fff;
    border-radius: 999px;
    padding: 0 .4rem;
}

.day.is-selected[b-u0jjsbev7w] {
    border-color: #1F1B1B;
    box-shadow: inset 0 0 0 2px #FFD800;
}

.day-number[b-u0jjsbev7w] {
    font-size: .8rem;
    font-weight: 600;
    align-self: flex-start;
}

/* Chips are colour-coded by category and clipped rather than wrapped, so a busy day
   cannot stretch the whole row. */
.chip[b-u0jjsbev7w] {
    font-size: .68rem;
    line-height: 1.25;
    padding: 1px 4px;
    border-radius: .2rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    border-left: 3px solid transparent;
    background: #f1f3f5;
}

.chip.cat-reuniao[b-u0jjsbev7w] { background: #e7f1ff; border-left-color: #0d6efd; }
.chip.cat-entrega[b-u0jjsbev7w] { background: #e6f4ea; border-left-color: #198754; }
.chip.cat-manutencao[b-u0jjsbev7w] { background: #fff3cd; border-left-color: #ffc107; }
.chip.cat-formacao[b-u0jjsbev7w] { background: #efe3fb; border-left-color: #6f42c1; }
.chip.cat-evento[b-u0jjsbev7w] { background: #ffe8d6; border-left-color: #fd7e14; }
.chip.cat-outro[b-u0jjsbev7w] { background: #f1f3f5; border-left-color: #adb5bd; }

/* As marcações do gabinete. As seis categorias acima são tons pastel com um filete colorido,
   e a sétima cor seria lida como a sétima categoria — que é exactamente o que estas não são.
   Por isso levam as cores da casa, tinta e amarelo, e uma etiqueta escrita: mesmo a preto e
   branco, ou com três fichas empilhadas, a ficha diz de onde vem antes de dizer o que é. */
.chip.chip-gabinete[b-u0jjsbev7w] {
    background: #FFF4B8;
    border-left-color: #1F1B1B;
    color: #1F1B1B;
    font-weight: 600;
}

.chip-tag[b-u0jjsbev7w] {
    background: #1F1B1B;
    color: #FFD800;
    border-radius: .15rem;
    padding: 0 3px;
    margin-right: 3px;
    font-size: .58rem;
    text-transform: uppercase;
}

/* Cancelada: fica à vista — quem planeou à volta dela tem de ver que foi desmarcada — mas
   recua e leva um risco, como na grelha do próprio gabinete. */
.chip.is-cancelled[b-u0jjsbev7w] {
    opacity: .6;
    text-decoration: line-through;
}

.more[b-u0jjsbev7w] {
    font-size: .65rem;
    color: #6c757d;
}

.gabinete-heading[b-u0jjsbev7w] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
}

.gabinete-tag[b-u0jjsbev7w] {
    background: #1F1B1B;
    color: #FFD800;
    border-radius: .2rem;
    padding: .1rem .4rem;
    font-size: .75rem;
    text-transform: uppercase;
}

/* A mesma tinta do cabeçalho ao lado de cada entrada: percorrendo o dia, a origem lê-se na
   margem sem ser preciso reler a etiqueta. */
.gabinete-item[b-u0jjsbev7w] {
    border-left: 3px solid #1F1B1B;
}

.gabinete-item.is-cancelled[b-u0jjsbev7w] {
    opacity: .6;
}

.gabinete-item.is-cancelled .gabinete-link[b-u0jjsbev7w],
.gabinete-item.is-cancelled .gabinete-time[b-u0jjsbev7w] {
    text-decoration: line-through;
}

/* Um bloqueio não tem cliente nem área. Amarelo da marca, como o "Sem responsáveis" do
   resumo: não é um erro, é uma sala ocupada por outra razão. */
.bloqueio[b-u0jjsbev7w] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

/* The title carries through to the compromisso. Styled as text rather than as a link: a day
   list of blue underlined lines would read as navigation instead of as the day. */
.appt-link[b-u0jjsbev7w] {
    color: inherit;
    text-decoration: none;
}

.appt-link:hover[b-u0jjsbev7w],
.appt-link:focus[b-u0jjsbev7w] {
    text-decoration: underline;
}

/* Completion state in the day list. Ink for closed, brand yellow for still open — the same
   two colours the overview's "Em atraso" block uses, so the two screens read alike. */
.done[b-u0jjsbev7w] {
    background: #1F1B1B;
    color: #FFD800;
}

.pending[b-u0jjsbev7w] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

.btn-complete[b-u0jjsbev7w] {
    background: #1F1B1B;
    color: #FFD800;
    border: 1px solid #1F1B1B;
    font-weight: 600;
    white-space: nowrap;
}

.btn-complete:hover[b-u0jjsbev7w],
.btn-complete:focus[b-u0jjsbev7w] {
    background: #000;
    color: #FFD800;
}

.btn-complete:disabled[b-u0jjsbev7w] {
    opacity: .5;
}

/* Tapped in passing, on a tablet, standing at the counter. */
@media (pointer: coarse) {
    .list-group-item .btn[b-u0jjsbev7w] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    /* A entrada do gabinete não tem botões — o link para a marcação é a única saída, por isso
       é ele que tem de ser um alvo. */
    .gabinete-item .gabinete-link[b-u0jjsbev7w] {
        display: inline-flex;
        align-items: center;
        min-height: 44px;
    }
}

@media (max-width: 700px) {
    .day[b-u0jjsbev7w] {
        min-height: 4.5rem;
    }

    .chip[b-u0jjsbev7w] {
        font-size: .6rem;
    }
}
/* /Components/Pages/Agenda/AgendaCategories.razor.rz.scp.css */
.chip-preview[b-hfs864xmzb] {
    display: inline-block;
    font-size: .68rem;
    line-height: 1.25;
    padding: 1px 4px;
    border-radius: .2rem;
    border-left: 3px solid transparent;
    white-space: nowrap;
}
/* /Components/Pages/Agenda/AppointmentDetail.razor.rz.scp.css */
dt[b-ysjrwhb6a4] {
    color: #6c757d;
    font-weight: 600;
}

/* The same two colours the overview and the day list use for completion state, so the three
   screens read alike: ink for closed, brand yellow for still open. */
.done[b-ysjrwhb6a4] {
    background: #1F1B1B;
    color: #FFD800;
}

.pending[b-ysjrwhb6a4] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

/* Nobody was assigned — an oversight to pick up, not a fault. */
.unassigned[b-ysjrwhb6a4] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

/* Notes are typed as free text; keep the line breaks somebody put there. */
.notes[b-ysjrwhb6a4] {
    white-space: pre-wrap;
}

.btn-complete[b-ysjrwhb6a4] {
    background: #1F1B1B;
    color: #FFD800;
    border: 1px solid #1F1B1B;
    font-weight: 600;
    white-space: nowrap;
}

.btn-complete:hover[b-ysjrwhb6a4],
.btn-complete:focus[b-ysjrwhb6a4] {
    background: #000;
    color: #FFD800;
}

.btn-complete:disabled[b-ysjrwhb6a4] {
    opacity: .5;
}

/* O histórico, com o mesmo desenho do rasto das faltas: uma régua à esquerda diz de relance
   que aquilo é uma sequência e não uma lista de factos soltos. */
.trail[b-ysjrwhb6a4] {
    list-style: none;
    margin: 0;
    padding: 0 0 0 1rem;
    border-left: 2px solid #e9ecef;
}

.trail-entry[b-ysjrwhb6a4] {
    position: relative;
    padding: .35rem 0 .35rem .35rem;
}

.trail-entry[b-ysjrwhb6a4]::before {
    content: "";
    position: absolute;
    left: -1.4rem;
    top: .8rem;
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: #1F1B1B;
}

/* O corpo da nota é texto que alguém escreveu — guardam-se as mudanças de linha, tal como
   nas Notas do compromisso. */
.trail-comment[b-ysjrwhb6a4] {
    font-size: .85rem;
    color: #495057;
    white-space: pre-wrap;
    margin-top: .1rem;
}

/* Discreto e encostado à direita, longe do texto da nota: apagar é do autor, mas não é o
   que ele vem cá fazer. */
.trail-remove[b-ysjrwhb6a4] {
    margin-left: auto;
    padding: 0 .25rem;
    font-size: .8rem;
    color: #6c757d;
    text-decoration: none;
}

.trail-remove:hover[b-ysjrwhb6a4],
.trail-remove:focus[b-ysjrwhb6a4] {
    color: #b02a37;
    text-decoration: underline;
}

.add-note label[b-ysjrwhb6a4] {
    font-weight: 600;
}

@media (pointer: coarse) {
    .btn[b-ysjrwhb6a4] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    .form-control[b-ysjrwhb6a4] {
        min-height: 44px;
        font-size: 16px;
    }

    /* Alvo de 44px como o resto, mas com folga à volta e sem se colar ao texto: num tablet
       um toque ao lado não pode apagar a nota de ninguém. */
    .trail-remove[b-ysjrwhb6a4] {
        min-width: 44px;
        min-height: 44px;
        justify-content: flex-end;
        padding: 0 .5rem;
    }
}
/* /Components/Pages/Comms/Inbox.razor.rz.scp.css */
/* The list scrolls inside itself so a busy inbox never pushes the open thread off the
   bottom of the page — the two panes stay side by side however much arrives. */
.conversation-list[b-rlg61mk699] {
    max-height: 70vh;
    overflow-y: auto;
}

.conversation-list .list-group-item[b-rlg61mk699] {
    text-align: left;
}

.conversation-list .list-group-item.is-selected[b-rlg61mk699] {
    background: #fffdf2;
    box-shadow: inset 0 0 0 2px #FFD800;
}

/* One line, clipped rather than wrapped: the snippet is a hint, and a long first
   paragraph must not make one row as tall as the rest of the list. */
.snippet[b-rlg61mk699] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.timeline[b-rlg61mk699] {
    display: flex;
    flex-direction: column;
    gap: .5rem;
    max-height: 55vh;
    overflow-y: auto;
}

.msg[b-rlg61mk699] {
    max-width: 85%;
    border-radius: .6rem;
    padding: .45rem .65rem;
}

/* Theirs on the left in grey, ours on the right in the brand ink — the side alone says
   who wrote it, before anyone reads the name. */
.msg.in[b-rlg61mk699] {
    align-self: flex-start;
    background: #f1f3f5;
}

.msg.out[b-rlg61mk699] {
    align-self: flex-end;
    background: #1F1B1B;
    color: #fff;
}

.msg-meta[b-rlg61mk699] {
    font-size: .7rem;
    opacity: .7;
    margin-bottom: .15rem;
}

/* Emails arrive as plain text with their own line breaks; keep them. */
.msg-body[b-rlg61mk699] {
    font-size: .9rem;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

.event[b-rlg61mk699] {
    align-self: center;
    text-align: center;
}

/* Attachments sit under the body as a small stack of download chips. */
.msg-attachments[b-rlg61mk699] {
    display: flex;
    flex-direction: column;
    gap: .25rem;
    margin-top: .4rem;
}

.msg-attachments .attachment[b-rlg61mk699] {
    display: inline-flex;
    align-items: baseline;
    gap: .35rem;
    max-width: 100%;
    padding: .15rem .4rem;
    border-radius: .35rem;
    font-size: .8rem;
    text-decoration: none;
}

/* On our own (dark) bubble the default link colour disappears; lift it. */
.msg.out .msg-attachments .attachment[b-rlg61mk699] {
    color: #ffe680;
}

.msg-attachments .attachment-name[b-rlg61mk699] {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.msg-attachments .attachment-size[b-rlg61mk699] {
    flex-shrink: 0;
    opacity: .7;
}
/* /Components/Pages/Faltas/AbsenceDetail.razor.rz.scp.css */
dt[b-c6emzk40p2] {
    color: #6c757d;
    font-weight: 600;
}

/* The reason chip is tinted inline from the catalogue colour; only the shape lives here. */
.reason[b-c6emzk40p2] {
    display: inline-block;
    font-size: .85rem;
    line-height: 1.35;
    padding: 2px 8px;
    border-radius: .2rem;
    border-left: 3px solid transparent;
}

/* Paperwork still owed. Brand yellow rather than red: an errand, not a fault. */
.awaits[b-c6emzk40p2] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

/* À espera de que a gestão decida. Amarelo cheio, e não o tom pálido do justificativo em
   falta: o que falta aqui é alguém decidir, não um papel — e as duas etiquetas aparecem
   lado a lado. */
.pending[b-c6emzk40p2] {
    background: #FFD800;
    color: #1F1B1B;
    border: 1px solid #E0BE00;
    font-weight: 600;
}

/* Art. 257.º settled — ink, the same colour the app uses elsewhere for "done". */
.substituted[b-c6emzk40p2] {
    background: #1F1B1B;
    color: #FFD800;
    font-weight: 600;
}

/* Notes are free text; keep the line breaks somebody put there. */
.notes[b-c6emzk40p2] {
    white-space: pre-wrap;
}

/* The append-only trail. A rule down the left says at a glance that these are one
   sequence and not a list of unrelated facts. */
.trail[b-c6emzk40p2] {
    list-style: none;
    margin: 0;
    padding: 0 0 0 1rem;
    border-left: 2px solid #e9ecef;
}

.trail-entry[b-c6emzk40p2] {
    position: relative;
    padding: .35rem 0 .35rem .35rem;
}

.trail-entry[b-c6emzk40p2]::before {
    content: "";
    position: absolute;
    left: -1.4rem;
    top: .8rem;
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: #1F1B1B;
}

.trail-comment[b-c6emzk40p2] {
    font-size: .85rem;
    color: #495057;
    white-space: pre-wrap;
    margin-top: .1rem;
}

.btn-substitute[b-c6emzk40p2] {
    background: #1F1B1B;
    color: #FFD800;
    border: 1px solid #1F1B1B;
    font-weight: 600;
}

.btn-substitute:hover[b-c6emzk40p2],
.btn-substitute:focus[b-c6emzk40p2] {
    background: #000;
    color: #FFD800;
}

.btn-substitute:disabled[b-c6emzk40p2] {
    opacity: .5;
}

.duration[b-c6emzk40p2] {
    flex-wrap: wrap;
}

@media (pointer: coarse) {
    .btn[b-c6emzk40p2] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    .form-control[b-c6emzk40p2],
    .form-select[b-c6emzk40p2] {
        min-height: 44px;
        font-size: 16px;
    }
}
/* /Components/Pages/Faltas/AbsenceReasons.razor.rz.scp.css */
/* Ten columns is a lot for a phone; the table scrolls sideways inside its own wrapper
   rather than letting the page do it, and the name column keeps a workable width. */
.reasons[b-igugebhuns] {
    min-width: 60rem;
}

.reasons td[b-igugebhuns] {
    vertical-align: middle;
}

/* What the motivo will look like as a chip on the faltas list, tinted from its own colour. */
.chip-preview[b-igugebhuns] {
    display: inline-block;
    font-size: .68rem;
    line-height: 1.25;
    padding: 1px 4px;
    border-radius: .2rem;
    border-left: 3px solid transparent;
    white-space: nowrap;
}

@media (pointer: coarse) {
    .btn[b-igugebhuns] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    .form-control[b-igugebhuns] {
        min-height: 44px;
        font-size: 16px;
    }

    /* A tick box is the smallest target on the page — grow it, and the row with it. */
    .form-check-input[type="checkbox"][b-igugebhuns] {
        width: 1.4rem;
        height: 1.4rem;
    }
}
/* /Components/Pages/Faltas/AllAbsences.razor.rz.scp.css */
/* Same reason chip as the other Faltas screens, tinted inline from the catalogue colour. */
.reason[b-sxlaozy2i1] {
    display: inline-block;
    font-size: .78rem;
    line-height: 1.3;
    padding: 1px 6px;
    border-radius: .2rem;
    border-left: 3px solid transparent;
    white-space: nowrap;
}

.awaits[b-sxlaozy2i1] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

/* À espera de que a gestão decida — amarelo cheio, contra o tom pálido do justificativo
   em falta. */
.pending[b-sxlaozy2i1] {
    background: #FFD800;
    color: #1F1B1B;
    border: 1px solid #E0BE00;
    font-weight: 600;
}

.substituted[b-sxlaozy2i1] {
    background: #1F1B1B;
    color: #FFD800;
    font-weight: 600;
}

/* O botão da fila de aprovações, dentro de um aviso já amarelo: tinta, para se ver que é
   ali que se carrega. */
.btn-queue[b-sxlaozy2i1] {
    background: #1F1B1B;
    color: #FFD800;
    border: 1px solid #1F1B1B;
    font-weight: 600;
}

.btn-queue:hover[b-sxlaozy2i1],
.btn-queue:focus[b-sxlaozy2i1] {
    background: #000;
    color: #FFD800;
}

/* Five filters plus a table on a tablet: the selects have to be thumb-sized, and 16px
   keeps iOS from zooming the page when one is focused. */
@media (pointer: coarse) {
    .btn[b-sxlaozy2i1],
    .form-select[b-sxlaozy2i1] {
        min-height: 44px;
    }

    .form-select[b-sxlaozy2i1] {
        font-size: 16px;
    }
}
/* /Components/Pages/Faltas/MyAbsences.razor.rz.scp.css */
/* The reason carries its own colour from the catalogue, so the chip is tinted inline and
   only the shape lives here — the same idiom the agenda's category chips use. */
.reason[b-j7sk4vs6l6] {
    display: inline-block;
    font-size: .78rem;
    line-height: 1.3;
    padding: 1px 6px;
    border-radius: .2rem;
    border-left: 3px solid transparent;
    white-space: nowrap;
}

/* Something is owed to the office. Brand yellow rather than red: a missing certificate is
   an errand, not a fault. */
.awaits[b-j7sk4vs6l6] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

/* À espera de que a gestão decida. Amarelo cheio, contra o tom pálido do justificativo em
   falta: o que falta aqui é alguém decidir, não um papel. */
.pending[b-j7sk4vs6l6] {
    background: #FFD800;
    color: #1F1B1B;
    border: 1px solid #E0BE00;
    font-weight: 600;
}

.card.awaiting[b-j7sk4vs6l6] {
    border-color: #FFD800;
    box-shadow: inset 0 0 0 1px #FFD800;
}

/* Art. 257.º — the pay loss was traded for holiday days. Ink, so it reads as settled. */
.substituted[b-j7sk4vs6l6] {
    background: #1F1B1B;
    color: #FFD800;
    font-weight: 600;
}

@media (pointer: coarse) {
    .btn[b-j7sk4vs6l6],
    .form-select[b-j7sk4vs6l6] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    .form-select[b-j7sk4vs6l6] {
        font-size: 16px;
    }
}
/* /Components/Pages/Faltas/NewAbsence.razor.rz.scp.css */
/* Same chip shape the list and the detail use, tinted inline from the reason's own colour. */
.reason[b-o5wju4lnjt] {
    display: inline-block;
    font-size: .85rem;
    line-height: 1.35;
    padding: 2px 8px;
    border-radius: .2rem;
    border-left: 3px solid transparent;
}

.duration[b-o5wju4lnjt] {
    flex-wrap: wrap;
}

/* Standing at the counter with a tablet: the two duration buttons and every field have to
   be hittable with a thumb, and 16px inputs stop iOS zooming the page on focus. */
@media (pointer: coarse) {
    .btn[b-o5wju4lnjt],
    .duration .btn[b-o5wju4lnjt] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    .form-control[b-o5wju4lnjt],
    .form-select[b-o5wju4lnjt] {
        min-height: 44px;
        font-size: 16px;
    }
}
/* /Components/Pages/Gestao/Canais.razor.rz.scp.css */
/* Mailbox addresses and page ids are long and unbreakable by the browser's own rules;
   let them wrap inside their cell rather than pushing the table past the page. */
.channels-table td.address[b-3c6lnhboka] {
    overflow-wrap: anywhere;
    min-width: 12rem;
}

/* Said quietly, under the kind it qualifies: the channel is configurable today and will
   only carry messages once Meta's integration is done. */
.pending-note[b-3c6lnhboka] {
    font-size: .72rem;
    line-height: 1.2;
}

/* The access editor drops in as a full-width row beneath the channel it belongs to; its
   user checklist scrolls rather than pushing the whole table down by an entire roster. */
.access-users[b-3c6lnhboka] {
    max-height: 14rem;
    overflow-y: auto;
}
/* /Components/Pages/Gestao/Impersonar.razor.rz.scp.css */
/* Timestamps are the column people scan down when matching a record against a session, so
   they are kept on one line and in figures of even width. */
.impersonation-history td.when[b-bevqziukj7] {
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

/* Names are the other half of that scan; give them room before the dates rather than letting
   a long full name wrap into two lines. */
.impersonation-history th:first-child[b-bevqziukj7],
.impersonation-history td:first-child[b-bevqziukj7] {
    min-width: 10rem;
}
/* /Components/Pages/Holidays/HolidayTeamMap.razor.rz.scp.css */
.team-map table[b-3b4hjjsk8j] {
    table-layout: fixed;
}

.team-map .name-col[b-3b4hjjsk8j] {
    width: 12rem;
    min-width: 12rem;
    position: sticky;
    left: 0;
    background: var(--bs-body-bg, #fff);
    z-index: 1;
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.team-map .day-col[b-3b4hjjsk8j] {
    width: 1.6rem;
    min-width: 1.6rem;
    padding: 0;
    text-align: center;
    height: 1.8rem;
}

.team-map thead .day-col[b-3b4hjjsk8j] {
    font-size: .6rem;
    line-height: 1.1;
    font-weight: 500;
    color: #6c757d;
}

.team-map .dow[b-3b4hjjsk8j],
.team-map .dom[b-3b4hjjsk8j] {
    display: block;
}

.team-map .total-col[b-3b4hjjsk8j] {
    width: 3.5rem;
    min-width: 3.5rem;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

/* The ends of the week, so the eye can find where one week stops without reading the day
   numbers.

   Saturday and Sunday are deliberately NOT the same shade. The store works Saturday
   mornings: a Saturday is a working day, is charged against a plafond, and can be booked as
   férias. Sunday is closed and costs nobody a day. Painting them alike would say the whole
   weekend is free — wrong in the direction that quietly costs somebody holiday. So Saturday
   is barely tinted, a hint of a boundary, while Sunday is firmly grey like the closed day it
   is.

   ORDER MATTERS BELOW. These two rules deliberately come first so that everything after
   them — folgas, leave, faltas, feriados — paints over them: a Saturday actually booked as
   férias has to read as férias, not as a weekend. A public holiday landing on a Saturday
   likewise wins, because "the shop is shut" is the more useful fact. Moving these rules down
   the file would silently swallow those colours. */
.team-map .is-saturday[b-3b4hjjsk8j] { background: #f1f3f5; }
.team-map .is-sunday[b-3b4hjjsk8j] { background: #dee2e6; }

/* The folga: this person has this Saturday off, by the escala.

   It sits here, immediately after the weekend tints and before everything else, because that
   is exactly its rank. Above the Saturday tint, which only says where the week ends and says
   it about the whole column; below leave, faltas and feriados, which are the expensive facts
   and must keep the cell.

   Hence background-IMAGE and not the background shorthand. The dot then composes with
   whatever background-colour the cell already has — the Saturday tint underneath it, or
   nothing on a swapped weekday — instead of replacing it. And because every rule after this
   one uses the shorthand, a cell that somehow carried both classes loses the dot and keeps
   the leave colour, which is the order the page's CellClass also encodes. */
.team-map td.rest-day[b-3b4hjjsk8j] {
    background-image: radial-gradient(circle at center, #1F1B1B 0 .22rem, rgba(0, 0, 0, 0) .22rem);
}

/* The week separator, and the reason it is a border rather than a shade.

   The map paints the whole booked period, Sundays included — a fortnight off is a solid run
   of green, and a tint underneath it is invisible. So the boundary is drawn on the right edge
   of every Sunday instead: a border composes with whatever background wins the cell, where a
   background can only be replaced by it. Weeks stay legible straight across somebody's
   holiday, which is the case the marking exists for.

   On the header too, so the ruling runs the full height of the table. */
.team-map .is-sunday[b-3b4hjjsk8j] {
    border-right: 2px solid #adb5bd;
}

.team-map td.approved[b-3b4hjjsk8j] { background: #198754; }
.team-map td.pending[b-3b4hjjsk8j] { background: #ffc107; }
.team-map .is-holiday[b-3b4hjjsk8j] { background: #cfe2ff; }

/* Um feriado que cai dentro de um bloco marcado. Fica azul de feriado, porque é isso que ele
   é e é isso que o plafond desconta, mas leva um ponto para que o bloco continue a ler-se como
   um período contínuo em vez de aparecer partido em dois. */
.team-map td.booked-holiday[b-3b4hjjsk8j] {
    background:
        radial-gradient(circle at 50% 50%, #084298 1.5px, transparent 1.6px),
        #cfe2ff;
}

/* Diagonal split marks a half day without introducing another colour. */
.team-map td.approved.half[b-3b4hjjsk8j] { background: linear-gradient(135deg, #198754 50%, #e9ecef 50%); }
.team-map td.pending.half[b-3b4hjjsk8j] { background: linear-gradient(135deg, #ffc107 50%, #e9ecef 50%); }

/* Faltas. Grey by default — that is the whole cell for a reader who may see the team map
   but not the reasons, and it says "ausente" and nothing more. A reader with
   absences.viewall gets the motive's own colour, written inline by the page, which simply
   overrides the background below. The stripe stays either way, so an absence never reads
   as booked leave. */
.team-map td.absent[b-3b4hjjsk8j] {
    background: #adb5bd;
    box-shadow: inset 0 -3px 0 rgba(31, 27, 27, .35);
}

/* Part of a day: the same diagonal the half days use, so the two read alike. */
.team-map td.absent-partial[b-3b4hjjsk8j] {
    background: linear-gradient(135deg, #adb5bd 50%, #e9ecef 50%);
}

/* ── A vista do ano ──────────────────────────────────────────────────────────────────────
   Doze grelhas iguais à do mês, empilhadas. A largura é a única diferença: com o `width:
   100%` do Bootstrap e `table-layout: fixed`, Fevereiro esticava as suas 28 colunas até
   encher a linha e ficava com células mais largas que Março. Numa vista de um mês ninguém
   dava por isso; empilhados, os meses deixavam de alinhar uns com os outros. Com `width:
   auto` cada célula fica com o 1,6rem que lhe está declarado e os meses mais curtos acabam
   mais cedo, que é a leitura certa. */
.year-map .team-map table[b-3b4hjjsk8j] {
    width: auto;
}

.year-map .month-block[b-3b4hjjsk8j] {
    margin-top: 1.75rem;
}

.year-map .month-title[b-3b4hjjsk8j] {
    margin-bottom: .35rem;
}

/* A tira de totais. O que cada número conta está explicado na página e no comentário que a
   acompanha — aqui só se lhe dá largura fixa e algarismos alinhados. */
.totals-strip table[b-3b4hjjsk8j] {
    table-layout: fixed;
    width: auto;
}

.totals-strip .name-col[b-3b4hjjsk8j] {
    width: 12rem;
    min-width: 12rem;
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.totals-strip .month-col[b-3b4hjjsk8j] {
    width: 2.75rem;
    min-width: 2.75rem;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

.totals-strip .year-col[b-3b4hjjsk8j] {
    width: 5.5rem;
    min-width: 5.5rem;
    text-align: center;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

.totals-strip thead th[b-3b4hjjsk8j] {
    font-size: .75rem;
    color: #6c757d;
    font-weight: 500;
}

.range-label[b-3b4hjjsk8j] {
    min-width: 10rem;
    text-align: center;
}

.swatch[b-3b4hjjsk8j] {
    width: .8rem;
    height: .8rem;
    border-radius: .2rem;
    display: inline-block;
    margin-right: .35rem;
    vertical-align: -1px;
}

.swatch.approved[b-3b4hjjsk8j] { background: #198754; }
.swatch.pending[b-3b4hjjsk8j] { background: #ffc107; }
.swatch.holiday[b-3b4hjjsk8j] { background: #cfe2ff; }
.swatch.absent[b-3b4hjjsk8j] { background: #adb5bd; box-shadow: inset 0 -3px 0 rgba(31, 27, 27, .35); }
.swatch.approved.half[b-3b4hjjsk8j] { background: linear-gradient(135deg, #198754 50%, #e9ecef 50%); }

/* The same dot over the Saturday tint it usually sits on, so the legend shows what the map
   shows rather than a colour that appears nowhere. */
.swatch.rest-day[b-3b4hjjsk8j] {
    background-color: #f1f3f5;
    background-image: radial-gradient(circle at center, #1F1B1B 0 .18rem, rgba(0, 0, 0, 0) .18rem);
    border: 1px solid #ced4da;
}

/* Bordered, because both are pale enough to vanish against the legend's own background. */
.swatch.saturday[b-3b4hjjsk8j] { background: #f1f3f5; border: 1px solid #ced4da; }
.swatch.sunday[b-3b4hjjsk8j] { background: #dee2e6; border: 1px solid #adb5bd; }

/* ── Impressão ───────────────────────────────────────────────────────────────────────────

   A vista do ano existe por causa disto: o mapa do ano afixado na parede da loja. Três
   coisas têm de sair bem e nenhuma sai por omissão.

   1. AS CORES SÃO O MAPA. Todos os browsers deitam fora os fundos ao imprimir, para poupar
      tinta, e sem elas sai uma grelha em branco — não um mapa mais pálido, um mapa vazio.
      print-color-adjust: exact é o que os obriga a manter os fundos; a variante -webkit- vai
      junto porque o Safari e os Chrome mais antigos ainda é essa que entendem.

   2. Um mês não se parte a meio de uma folha. break-inside: avoid no bloco, e nada mais: os
      blocos continuam a correr uns atrás dos outros e o ano cai no número de folhas que der,
      em vez de se forçar uma folha por mês e gastar doze.

   3. Os botões não se imprimem. Navegação, alternador e ligações desaparecem — em papel não
      se carrega em nada. O rótulo do período FICA: é a única coisa na folha que diz de que
      ano ou de que mês ela é. */
@media print {
    .map-controls .btn[b-3b4hjjsk8j],
    .map-controls .mode-toggle[b-3b4hjjsk8j],
    .map-controls a[b-3b4hjjsk8j] {
        display: none !important;
    }

    .range-label[b-3b4hjjsk8j] {
        min-width: 0;
        text-align: left;
    }

    .team-map th[b-3b4hjjsk8j],
    .team-map td[b-3b4hjjsk8j],
    .totals-strip th[b-3b4hjjsk8j],
    .totals-strip td[b-3b4hjjsk8j],
    .swatch[b-3b4hjjsk8j] {
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
    }

    /* O scroll horizontal não existe em papel: a caixa que o dá no ecrã passaria a cortar. */
    .table-responsive[b-3b4hjjsk8j] {
        overflow: visible !important;
    }

    .year-map .month-block[b-3b4hjjsk8j],
    .totals-strip[b-3b4hjjsk8j] {
        break-inside: avoid;
        page-break-inside: avoid;
    }

    /* Apertado o suficiente para os 31 dias caberem ao largo de uma folha. Só na impressão:
       no ecrã há scroll e nada disto é preciso. */
    .year-map .team-map .name-col[b-3b4hjjsk8j] {
        width: 8rem;
        min-width: 8rem;
        font-size: .7rem;
    }

    .year-map .team-map .day-col[b-3b4hjjsk8j] {
        width: 1.1rem;
        min-width: 1.1rem;
        height: 1.15rem;
    }

    .year-map .team-map thead .day-col[b-3b4hjjsk8j] {
        font-size: .5rem;
    }

    .year-map .month-block[b-3b4hjjsk8j] {
        margin-top: 1rem;
    }

    .legend[b-3b4hjjsk8j] {
        break-inside: avoid;
    }
}
/* /Components/Pages/Holidays/RestDaySchedule.razor.rz.scp.css */
.range-label[b-8zemr3qp6o] {
    min-width: 12rem;
    text-align: center;
}

/* Um sábado sem ninguém tem de se ler como uma pergunta por responder, e não como uma linha
   vazia que se salta com os olhos. Daí a barra à esquerda em vez de um fundo colorido: marca
   a linha sem competir com o resto da tabela. */
.escala tr.unassigned th[scope="row"][b-8zemr3qp6o] {
    box-shadow: inset 3px 0 0 #FFD800;
}

.escala .entries[b-8zemr3qp6o] {
    list-style: none;
    margin: 0;
    padding: 0;
}

.escala .entries li + li[b-8zemr3qp6o] {
    margin-top: .25rem;
}

.escala .entry-name[b-8zemr3qp6o] {
    font-weight: 500;
}

/* Registada depois do dia que cobre. Discreta de propósito — é uma nota de rodapé, não uma
   acusação —, mas nunca invisível: sem ela uma discussão sobre justiça podia ser ganha a
   preencher o passado em silêncio. O título diz em que dia foi realmente escrita. */
.escala .late[b-8zemr3qp6o] {
    display: inline-block;
    margin-left: .4rem;
    padding: 0 .35rem;
    border: 1px dashed #adb5bd;
    border-radius: .2rem;
    font-size: .7rem;
    line-height: 1.5;
    color: #6c757d;
    cursor: help;
    white-space: nowrap;
}

.escala .note-input[b-8zemr3qp6o] {
    width: 9rem;
}

.tally td[b-8zemr3qp6o],
.tally th[b-8zemr3qp6o] {
    font-variant-numeric: tabular-nums;
}

/* O desvio. Peso e cor mínimos: quem está acima da média não fez nada de errado, e quem está
   abaixo também não. Serve para a conversa começar no sítio certo, não para dar pontos. */
.tally .dev-above[b-8zemr3qp6o] {
    font-weight: 600;
    color: #1F1B1B;
}

.tally .dev-below[b-8zemr3qp6o] {
    font-weight: 600;
    color: #8a6d00;
}

.tally .dev-even[b-8zemr3qp6o] {
    color: #6c757d;
}

/* A proposta ainda não é nada. A moldura amarela existe para que ninguém a leia como escala
   já feita — o que está aqui desaparece sem rasto se carregarem em «Descartar». */
.proposals[b-8zemr3qp6o] {
    border-color: #FFD800;
}

.proposals .card-header[b-8zemr3qp6o] {
    background: #fffbe6;
}

.proposal-list[b-8zemr3qp6o] {
    margin: 0;
    padding-left: 1.2rem;
}

.proposal-list li[b-8zemr3qp6o] {
    padding: .35rem 0;
}

/* The controls sit on one line and wrap together; the reason sits under them, because it is
   about the line rather than another field of it. */
.proposal-line[b-8zemr3qp6o] {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    align-items: center;
}

.proposal-date[b-8zemr3qp6o] {
    font-variant-numeric: tabular-nums;
    font-weight: 500;
}

.proposal-who[b-8zemr3qp6o] {
    width: auto;
    min-width: 12rem;
}

.proposal-why[b-8zemr3qp6o] {
    display: block;
    margin-top: .1rem;
}

.proposal-why[b-8zemr3qp6o] {
    font-size: .85rem;
}

.order-list[b-8zemr3qp6o] {
    margin: 0;
    padding-left: 1.4rem;
}

.order-list li[b-8zemr3qp6o] {
    padding: .15rem 0;
}

.order-name[b-8zemr3qp6o] {
    display: inline-block;
    min-width: 9rem;
    margin-right: .35rem;
}

/* O rasto, igual ao das faltas: um risco à esquerda diz que isto é uma sequência e não uma
   lista de factos soltos. */
.trail[b-8zemr3qp6o] {
    list-style: none;
    margin: 0;
    padding: 0 0 0 1rem;
    border-left: 2px solid #e9ecef;
}

.trail-entry[b-8zemr3qp6o] {
    position: relative;
    padding: .35rem 0 .35rem .35rem;
}

.trail-entry[b-8zemr3qp6o]::before {
    content: "";
    position: absolute;
    left: -1.4rem;
    top: .8rem;
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: #1F1B1B;
}

.trail-comment[b-8zemr3qp6o] {
    font-size: .85rem;
    color: #495057;
    white-space: pre-wrap;
    margin-top: .1rem;
}

@media (pointer: coarse) {
    .btn[b-8zemr3qp6o],
    .form-select[b-8zemr3qp6o],
    .form-control[b-8zemr3qp6o] {
        min-height: 44px;
    }

    .btn[b-8zemr3qp6o],
    .form-select[b-8zemr3qp6o] {
        display: inline-flex;
        align-items: center;
    }

    .form-select[b-8zemr3qp6o],
    .form-control[b-8zemr3qp6o] {
        font-size: 16px;
    }

    .escala .note-input[b-8zemr3qp6o] {
        width: 100%;
    }
}
/* /Components/Pages/Home.razor.rz.scp.css */
.time-pill[b-aecpyzqevv] {
    display: inline-block;
    background: #1F1B1B;
    color: #fff;
    border-radius: .25rem;
    font-size: .72rem;
    padding: .1rem .4rem;
    white-space: nowrap;
    min-width: 5.5rem;
    text-align: center;
}

/* The overview lists only what is this person's, so an appointment they are on carries the
   brand accent and the rest — the ones nobody was put on — simply sit without it. */
.appt.mine[b-aecpyzqevv] {
    border-left: 3px solid #FFD800;
    padding-left: .5rem;
}

/* Nobody was assigned. Yellow rather than red: it is an oversight to pick up, not a fault,
   and it must not be mistaken for the dark "Atribuído a si" badge next to it. */
.unassigned[b-aecpyzqevv] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

.done[b-aecpyzqevv] {
    background: #1F1B1B;
    color: #FFD800;
}

/* Every title on the overview carries through to the compromisso, where the notes, the
   responsáveis and the completion record are. Styled as text rather than as a link: a screen of
   blue underlined lines would read as a menu instead of as the day. */
.appt-link[b-aecpyzqevv] {
    color: inherit;
    text-decoration: none;
}

.appt-link:hover[b-aecpyzqevv],
.appt-link:focus[b-aecpyzqevv] {
    text-decoration: underline;
}

.others-link[b-aecpyzqevv] {
    color: #6c757d;
    text-decoration: underline;
}

.others-link:hover[b-aecpyzqevv],
.others-link:focus[b-aecpyzqevv] {
    color: #1F1B1B;
}

/* Overdue work is the reason this feature exists, so the block is the loudest thing on the
   page — brand ink and yellow, no new colours, and above the day it is holding up. */
.overdue[b-aecpyzqevv] {
    border: 1px solid #1F1B1B;
    border-left: 6px solid #FFD800;
}

.overdue .card-header[b-aecpyzqevv] {
    background: #1F1B1B;
    color: #fff;
    font-weight: 600;
}

.overdue-count[b-aecpyzqevv] {
    background: #FFD800;
    color: #1F1B1B;
}

.overdue-item + .overdue-item[b-aecpyzqevv] {
    border-top: 1px solid #eceaea;
    padding-top: .5rem;
}

/* Decisions somebody else is waiting for. Same two brand colours as "Em atraso" and the
   opposite arrangement of them — ink edge, yellow header, inverted count — so the two cards
   are plainly of the same family and impossible to read as the same card. Quieter than
   overdue on purpose: nothing here is late yet, it is simply somebody's turn. */
.awaiting[b-aecpyzqevv] {
    border: 1px solid #e7e3e3;
    border-left: 6px solid #1F1B1B;
}

.awaiting .card-header[b-aecpyzqevv] {
    background: #FFF4B8;
    color: #1F1B1B;
    font-weight: 600;
}

.awaiting-count[b-aecpyzqevv] {
    background: #1F1B1B;
    color: #FFD800;
}

.awaiting-item + .awaiting-item[b-aecpyzqevv] {
    border-top: 1px solid #eceaea;
    padding-top: .5rem;
}

.kind-icon[b-aecpyzqevv] {
    margin-right: .35rem;
}

/* The close button reads as the one action on the row: ink with the brand yellow on it. */
.btn-complete[b-aecpyzqevv] {
    background: #1F1B1B;
    color: #FFD800;
    border: 1px solid #1F1B1B;
    font-weight: 600;
    white-space: nowrap;
}

.btn-complete:hover[b-aecpyzqevv],
.btn-complete:focus[b-aecpyzqevv] {
    background: #000;
    color: #FFD800;
}

.btn-complete:disabled[b-aecpyzqevv] {
    opacity: .5;
}

/* Meant to be tapped in passing, on a tablet, with a glove half off. */
@media (pointer: coarse) {
    .btn-complete[b-aecpyzqevv] {
        min-height: 44px;
        padding-left: 1rem;
        padding-right: 1rem;
    }

    /* The title is the only way into the decision, so on a tablet it has to be a target and
       not a line of text. */
    .awaiting-item .appt-link[b-aecpyzqevv] {
        display: inline-flex;
        align-items: center;
        min-height: 44px;
    }
}
/* /Components/Pages/Premios/MeusPremios.razor.rz.scp.css */
/* O ano manda. O mês é a notícia de hoje; o ano é o que se pode perder, por isso é o cartão
   com moldura, com mais espaço e com a frase do que ainda falta. */
.year-card[b-x502p8ew8s] {
    border: 2px solid #1F1B1B;
}

.year-card .card-header[b-x502p8ew8s] {
    background: #1F1B1B;
    color: #fff;
    font-weight: 600;
}

.mealheiro[b-x502p8ew8s] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .5rem;
    margin-bottom: .75rem;
}

.mealheiro-amount[b-x502p8ew8s] {
    font-size: 2rem;
    font-weight: 700;
    line-height: 1.1;
    color: #1F1B1B;
    font-variant-numeric: tabular-nums;
}

.mealheiro-label[b-x502p8ew8s] {
    color: #6c757d;
}

/* A frase que motiva — quanto falta facturar e que média mensal isso dá. Vem do serviço
   inteira e é a única coisa desta página desenhada para se ler de longe. */
.pace[b-x502p8ew8s] {
    margin: 0 0 .75rem;
    padding: .6rem .75rem;
    border-left: 4px solid #FFD800;
    background: #fffbe6;
    font-size: 1.05rem;
}

/* A condição. Escrita sem eufemismo e sempre visível: ninguém pode descobrir em Dezembro
   que o mealheiro dependia de uma coisa que nunca lhe foi dita. */
.condition[b-x502p8ew8s] {
    margin: 0;
    padding: .6rem .75rem;
    border: 1px dashed #8a6d00;
    border-radius: .3rem;
    color: #6b5500;
    background: #fffdf3;
    font-size: .9rem;
}

.condition strong[b-x502p8ew8s] {
    color: #1F1B1B;
}

.month-card .figure[b-x502p8ew8s] {
    font-size: 1.5rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: #1F1B1B;
}

.month-card .figure-label[b-x502p8ew8s] {
    display: block;
    font-size: .85rem;
    color: #6c757d;
}

.history td[b-x502p8ew8s],
.history th[b-x502p8ew8s] {
    font-variant-numeric: tabular-nums;
}

.history tfoot td[b-x502p8ew8s],
.history tfoot th[b-x502p8ew8s] {
    font-weight: 600;
    border-top: 2px solid #1F1B1B;
}

.history .zero[b-x502p8ew8s] {
    color: #adb5bd;
}

.history .adjustment-note[b-x502p8ew8s] {
    display: block;
    font-size: .8rem;
    color: #6c757d;
    white-space: pre-wrap;
}

@media (pointer: coarse) {
    .btn[b-x502p8ew8s],
    .form-select[b-x502p8ew8s],
    .form-control[b-x502p8ew8s] {
        min-height: 44px;
    }

    .btn[b-x502p8ew8s],
    .form-select[b-x502p8ew8s] {
        display: inline-flex;
        align-items: center;
    }

    .form-select[b-x502p8ew8s],
    .form-control[b-x502p8ew8s] {
        font-size: 16px;
    }
}
/* /Components/Pages/Premios/PremiosGestao.razor.rz.scp.css */
/* A simulação não está gravada. A moldura amarela e a etiqueta existem para que ninguém a
   confunda com um mês fechado — é a mesma convenção da proposta da escala de folgas. */
.preview[b-by9hi2tp21] {
    border-color: #FFD800;
}

.preview .card-header[b-by9hi2tp21] {
    background: #fffbe6;
}

.preview-figures[b-by9hi2tp21] {
    display: flex;
    flex-wrap: wrap;
    gap: 1.25rem;
    margin-bottom: .75rem;
}

.preview-figures .figure[b-by9hi2tp21] {
    font-size: 1.25rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: #1F1B1B;
}

.preview-figures .figure-label[b-by9hi2tp21] {
    display: block;
    font-size: .8rem;
    color: #6c757d;
}

.amounts td[b-by9hi2tp21],
.amounts th[b-by9hi2tp21] {
    font-variant-numeric: tabular-nums;
}

.amounts tfoot td[b-by9hi2tp21],
.amounts tfoot th[b-by9hi2tp21] {
    font-weight: 600;
    border-top: 2px solid #1F1B1B;
}

.adjust-note[b-by9hi2tp21] {
    min-width: 12rem;
}

.adjust-amount[b-by9hi2tp21] {
    width: 7rem;
}

/* Fechar, reabrir e liquidar o ano são de outra natureza que o resto da página: escrevem
   dinheiro que as pessoas contam receber. Ficam num bloco com risco à esquerda em vez de
   soltos entre os campos. */
.decisive[b-by9hi2tp21] {
    border-left: 4px solid #1F1B1B;
    padding-left: .9rem;
}

.settle-forfeit[b-by9hi2tp21] {
    border-color: #b02a37;
    color: #b02a37;
}

.state-badge[b-by9hi2tp21] {
    font-variant-numeric: tabular-nums;
}

.trail[b-by9hi2tp21] {
    list-style: none;
    margin: 0;
    padding: 0 0 0 1rem;
    border-left: 2px solid #e9ecef;
}

.trail-entry[b-by9hi2tp21] {
    position: relative;
    padding: .35rem 0 .35rem .35rem;
}

.trail-entry[b-by9hi2tp21]::before {
    content: "";
    position: absolute;
    left: -1.4rem;
    top: .8rem;
    width: .5rem;
    height: .5rem;
    border-radius: 50%;
    background: #1F1B1B;
}

.trail-detail[b-by9hi2tp21] {
    font-size: .85rem;
    color: #495057;
    white-space: pre-wrap;
    margin-top: .1rem;
}

@media (pointer: coarse) {
    .btn[b-by9hi2tp21],
    .form-select[b-by9hi2tp21],
    .form-control[b-by9hi2tp21] {
        min-height: 44px;
    }

    .btn[b-by9hi2tp21],
    .form-select[b-by9hi2tp21] {
        display: inline-flex;
        align-items: center;
    }

    .form-select[b-by9hi2tp21],
    .form-control[b-by9hi2tp21] {
        font-size: 16px;
    }

    .adjust-note[b-by9hi2tp21],
    .adjust-amount[b-by9hi2tp21] {
        width: 100%;
        min-width: 0;
    }
}
/* /Components/Pages/Premios/PremiosParametros.razor.rz.scp.css */
/* Os valores em vigor, lado a lado com os campos que os mudam: quem está a escrever 0,015
   tem de ver que o que lá está é 1 %. */
.current[b-jwzxbbjvl5] {
    background: #faf9f7;
    border: 1px solid #e4e0da;
    border-radius: .3rem;
    padding: .75rem 1rem;
}

.current dl[b-jwzxbbjvl5] {
    margin: 0;
}

.current dt[b-jwzxbbjvl5] {
    font-weight: 500;
    color: #6c757d;
}

.current dd[b-jwzxbbjvl5] {
    margin-bottom: .5rem;
    font-variant-numeric: tabular-nums;
    font-weight: 600;
    color: #1F1B1B;
}

/* A regra que ninguém pode não ver: mudar isto não reescreve meses fechados. */
.frozen-warning[b-jwzxbbjvl5] {
    border-left: 4px solid #FFD800;
    background: #fffbe6;
    padding: .6rem .9rem;
    margin-bottom: 1.25rem;
}

.field-unit[b-jwzxbbjvl5] {
    color: #6c757d;
}

.policy-form .form-control[b-jwzxbbjvl5] {
    max-width: 14rem;
}

@media (pointer: coarse) {
    .btn[b-jwzxbbjvl5],
    .form-select[b-jwzxbbjvl5],
    .form-control[b-jwzxbbjvl5] {
        min-height: 44px;
    }

    .btn[b-jwzxbbjvl5],
    .form-select[b-jwzxbbjvl5] {
        display: inline-flex;
        align-items: center;
    }

    .form-select[b-jwzxbbjvl5],
    .form-control[b-jwzxbbjvl5] {
        font-size: 16px;
    }

    .policy-form .form-control[b-jwzxbbjvl5] {
        max-width: none;
    }
}
/* /Components/Pages/Treinos/BgFitSessionDetail.razor.rz.scp.css */
/* O motivo, as queixas, as notas de flexibilidade e as palavras do fitter chegam como texto
   simples com as suas próprias quebras de linha — um relatório de fit é escrito por pontos, e
   essa forma é a informação. Mantê-las é o mínimo até haver um editor com formatação.
   (Os alvos de toque e o mínimo de 16px nos campos vêm da regra `@media (pointer: coarse)`
   global em app.css, por isso não se repetem aqui.) */
.fit-text[b-5wrpw7fa48] {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}
/* /Components/Pages/Treinos/BikePlanDetail.razor.rz.scp.css */
/* O objetivo, o plano e as notas chegam como texto simples com as suas próprias quebras de
   linha — um plano de bicicleta é escrito por semanas, saídas e intervalos, e essa forma é a
   informação. Mantê-las é o mínimo até haver um editor com formatação. */
.plan-text[b-h1ejluaeei] {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}
/* /Components/Pages/Treinos/BodyAssessmentImport.razor.rz.scp.css */
/* Os três passos, escritos como uma lista e não como um enfeite: quem está a importar um
   ficheiro quer saber em que ponto está e, sobretudo, a partir de onde é que alguma coisa
   fica gravada. O passo em curso é o único a preto da casa.
   (Os alvos de toque e o mínimo de 16px nos campos vêm da regra `@media (pointer: coarse)`
   global em app.css, por isso não se repetem aqui.) */
.steps[b-eejrrxy7iv] {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: .5rem 1.25rem;
    padding: 0;
    margin: 0;
    font-size: .9rem;
    color: #6c757d;
}

.steps .step-number[b-eejrrxy7iv] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    margin-right: .35rem;
    border-radius: 50%;
    border: 1px solid #ced4da;
    font-size: .8rem;
    font-weight: 600;
}

.steps .current[b-eejrrxy7iv] {
    color: #1F1B1B;
    font-weight: 600;
}

.steps .current .step-number[b-eejrrxy7iv] {
    background: #FFD800;
    border-color: #FFD800;
}

.steps .done .step-number[b-eejrrxy7iv] {
    background: #e9ecef;
}

/* A pré-visualização tem a forma da tabela do cliente — métricas em baixo umas das outras,
   uma coluna por data — para que o que se confere aqui seja lido do mesmo modo que o que
   fica lá depois. O scroll horizontal vive dentro da caixa e nunca no corpo da página. */
.preview-table table[b-eejrrxy7iv] {
    width: auto;
    margin-bottom: 0;
}

.preview-table .metric-col[b-eejrrxy7iv] {
    position: sticky;
    left: 0;
    z-index: 2;
    background: var(--bs-body-bg, #fff);
    width: 13rem;
    min-width: 13rem;
    font-weight: 500;
    text-align: left;
}

.preview-table .metric-col .unit[b-eejrrxy7iv] {
    color: #6c757d;
    font-weight: 400;
    font-size: .8rem;
}

.preview-table .value-col[b-eejrrxy7iv] {
    width: 8rem;
    min-width: 8rem;
    text-align: right;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

.preview-table thead .value-col[b-eejrrxy7iv] {
    text-align: left;
}

/* A data que o cliente já tem. Marcada em âmbar e dita por palavras, porque a caixa vem
   desligada de propósito e a razão de vir desligada tem de estar à vista. */
.preview-table thead .recorded[b-eejrrxy7iv] {
    background: #fff3cd;
}

.preview-table .already[b-eejrrxy7iv] {
    display: block;
    font-size: .7rem;
    font-weight: 400;
    color: #8a6d3b;
}

.unmatched[b-eejrrxy7iv] {
    padding-left: 1.1rem;
    margin-bottom: 0;
}

.unmatched li + li[b-eejrrxy7iv] {
    margin-top: .2rem;
}
/* /Components/Pages/Treinos/BodyAssessments.razor.rz.scp.css */
/* Algarismos de largura fixa nas colunas de medidas: a lista lê-se de cima a baixo à procura
   de um peso que saltou, e com algarismos proporcionais as vírgulas não alinham e o olho
   perde a coluna.
   (Os alvos de toque e o mínimo de 16px nos campos vêm da regra `@media (pointer: coarse)`
   global em app.css, por isso não se repetem aqui.) */
.assessment-list .numeric[b-g3dpfzyckc] {
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* A caixa de procura não cresce com o ecrã: uma linha de texto com trinta centímetros é mais
   difícil de ler do que uma curta, e o resto da largura é da tabela. */
.client-search[b-g3dpfzyckc] {
    max-width: 26rem;
}

/* As acções de cada linha quebram para baixo em vez de espremerem a coluna: num tablet em
   retrato há três botões e a coluna do nome vale mais do que a das acções. */
.row-actions .btn[b-g3dpfzyckc] {
    white-space: nowrap;
}
/* /Components/Pages/Treinos/ClientAssessments.razor.rz.scp.css */
/* A tabela cresce para a direita a cada avaliação, e por isso o scroll horizontal vive DENTRO
   da caixa (.table-responsive do Bootstrap) e nunca no corpo da página: numa página que abana
   ao largo, a coluna das métricas some-se e o resto deixa de se saber ler.
   (Os alvos de toque e o mínimo de 16px nos campos vêm da regra `@media (pointer: coarse)`
   global em app.css, por isso não se repetem aqui.) */
.assessment-table table[b-3ct1yarmo8] {
    width: auto;
    margin-bottom: 0;
}

/* A coluna das métricas fica colada à esquerda: é o rótulo de cada linha e, sem ela, uma
   tabela com dez datas passa a ser uma parede de números sem nome. Precisa de fundo próprio
   — as células por baixo passariam por trás dela — e de ficar por cima no eixo z. */
.assessment-table .metric-col[b-3ct1yarmo8] {
    position: sticky;
    left: 0;
    z-index: 2;
    background: var(--bs-body-bg, #fff);
    width: 14rem;
    min-width: 14rem;
    font-weight: 500;
    text-align: left;
}

.assessment-table .metric-col .unit[b-3ct1yarmo8] {
    color: #6c757d;
    font-weight: 400;
    font-size: .8rem;
}

/* Algarismos tabulares nas colunas de números: é uma tabela para ser lida de cima a baixo à
   procura do que mudou, e com algarismos proporcionais as vírgulas não alinham. */
.assessment-table .value-col[b-3ct1yarmo8],
.assessment-table .diff-col[b-3ct1yarmo8] {
    font-variant-numeric: tabular-nums;
    text-align: right;
    white-space: nowrap;
}

.assessment-table .value-col[b-3ct1yarmo8] {
    width: 7.5rem;
    min-width: 7.5rem;
}

.assessment-table thead .value-col[b-3ct1yarmo8] {
    text-align: right;
}

.assessment-table thead .value-col .date[b-3ct1yarmo8] {
    display: block;
    font-weight: 600;
}

.assessment-table thead .value-col .edit[b-3ct1yarmo8] {
    font-size: .75rem;
    font-weight: 400;
}

/* A forma da série, ao lado do nome da métrica e antes dos números. Fica encostada à esquerda
   porque se lê logo a seguir ao rótulo — rótulo, forma, valores — e é estreita de propósito:
   é uma pista de relance, e os números que ela resume estão todos na mesma linha, à direita. */
.assessment-table .spark-col[b-3ct1yarmo8] {
    width: 5.5rem;
    min-width: 5.5rem;
    text-align: left;
    padding-left: .5rem;
    padding-right: .5rem;
}

.assessment-table thead .spark-col[b-3ct1yarmo8] {
    font-size: .75rem;
    font-weight: 500;
    color: #6c757d;
}

/* A coluna da diferença. Cinzenta e discreta de propósito: o número que interessa é a medida,
   e a diferença é a leitura por cima dela. NENHUMA COR DE JUÍZO — nem verde nem vermelho —
   porque descer não é progresso: para a massa gorda talvez seja, para a massa muscular é o
   contrário, e a plataforma não tem como saber qual das duas está a ser lida. A seta diz a
   direcção, e a direcção é tudo o que se pode afirmar. */
.assessment-table .diff-col[b-3ct1yarmo8] {
    width: 5.75rem;
    min-width: 5.75rem;
    background: #f8f9fa;
    color: #495057;
    font-size: .85rem;
}

.assessment-table .diff-col .arrow[b-3ct1yarmo8] {
    margin-right: .15rem;
    opacity: .75;
}

/* A comparação escolhida nos selectores. É a coluna que a folha de cálculo não consegue dar,
   por isso é a única com destaque — e o destaque é a marca da casa, não uma cor com sentido. */
.assessment-table .chosen-col[b-3ct1yarmo8] {
    background: #fffbe0;
    border-left: 3px solid #FFD800;
    border-right: 3px solid #FFD800;
}

.assessment-table thead .chosen-col .v[b-3ct1yarmo8] {
    display: block;
    font-weight: 700;
}

.assessment-table thead .chosen-col .dates[b-3ct1yarmo8] {
    display: block;
    font-size: .7rem;
    font-weight: 400;
    color: #6c757d;
}

.assessment-table thead .diff-col[b-3ct1yarmo8] {
    text-align: center;
    color: #6c757d;
}

/* Os títulos das secções do protocolo — Composição, Perímetros, Pregas, Valores preditivos.
   Ficam colados à esquerda com a coluna das métricas, para que a secção continue a ver-se
   depois de a tabela ter sido arrastada para o lado. */
.assessment-table .group-row th[b-3ct1yarmo8] {
    position: sticky;
    left: 0;
    background: #1F1B1B;
    color: #fff;
    font-size: .8rem;
    letter-spacing: .04em;
    text-transform: uppercase;
    font-weight: 600;
}

.compare-card[b-3ct1yarmo8] {
    border-left: 3px solid #FFD800;
}

/* ── Impressão ───────────────────────────────────────────────────────────────────────────
   A tabela é o documento de trabalho dela, e é levada em papel para a consulta. Três coisas:
   os botões e os selectores não se imprimem (em papel não se carrega em nada, e a comparação
   escolhida já traz as duas datas escritas no cabeçalho); o scroll horizontal não existe em
   papel, e a caixa que o dá no ecrã passaria a cortar as colunas de fora; e os fundos das
   colunas de diferença têm de sobreviver à poupança de tinta, senão o destaque desaparece e
   as colunas deixam de se distinguir umas das outras. */
@media print {
    .page-actions[b-3ct1yarmo8],
    .compare-card[b-3ct1yarmo8] {
        display: none !important;
    }

    .assessment-table[b-3ct1yarmo8] {
        overflow: visible !important;
    }

    .assessment-table th[b-3ct1yarmo8],
    .assessment-table td[b-3ct1yarmo8] {
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
        font-size: .7rem;
    }

    .assessment-table .metric-col[b-3ct1yarmo8] {
        width: 10rem;
        min-width: 10rem;
    }

    .assessment-table .value-col[b-3ct1yarmo8] {
        width: auto;
        min-width: 0;
    }

    .assessment-table .diff-col[b-3ct1yarmo8] {
        width: auto;
        min-width: 0;
    }

    .assessment-table .spark-col[b-3ct1yarmo8] {
        width: 4.5rem;
        min-width: 4.5rem;
    }
}
/* /Components/Pages/Treinos/ClientAssessmentTrends.razor.rz.scp.css */
h2[b-ya6ri9y0nv] {
    font-size: 1.1rem;
    margin-bottom: .5rem;
}

/* A nota que explica porque é que não há aqui um gráfico de peso nem de IMC em destaque. É a
   única explicação escrita da área, e ganha o lugar por ser o motivo da montagem da página. */
.headline-note[b-ya6ri9y0nv] {
    font-size: .85rem;
    color: #495057;
    max-width: 46rem;
    border-left: 3px solid #FFD800;
    padding-left: .75rem;
    margin-top: .75rem;
}

.picker-block[b-ya6ri9y0nv] {
    margin-top: 1.75rem;
}

.picker[b-ya6ri9y0nv] {
    max-width: 22rem;
    margin-bottom: .75rem;
}

.single-chart[b-ya6ri9y0nv] {
    border: 1px solid #E7E4E0;
    border-radius: .375rem;
    padding: .75rem;
    background: #fff;
    overflow-x: auto;
}

.closing-note[b-ya6ri9y0nv] {
    font-size: .8rem;
    color: #6c757d;
    margin-top: 1.5rem;
}

/* ── Impressão ───────────────────────────────────────────────────────────────────────────
   Esta folha é entregue ao cliente, que não tem conta na plataforma e por isso nunca vê o
   ecrã. Três coisas, pelo mesmo padrão do mapa de férias e da tabela:

   1. Os botões e o selector não se imprimem — em papel não se carrega em nada. O gráfico que
      o selector escolheu FICA, com o nome da métrica por cima, que é o que diz o que ele é.
   2. Nenhum bloco se parte a meio de uma folha.
   3. As texturas e os fundos da legenda têm de sobreviver à poupança de tinta do browser. Essa
      regra fica no CSS de cada gráfico e não aqui: o CSS desta página está isolado e não chega
      ao interior dos componentes filhos, e cada um deles sabe o que tem de imprimir. */
@media print {
    .page-actions[b-ya6ri9y0nv],
    .picker[b-ya6ri9y0nv] {
        display: none !important;
    }

    .single-chart[b-ya6ri9y0nv] {
        border: 0;
        padding: 0;
        overflow: visible !important;
    }

    .composition-block[b-ya6ri9y0nv],
    .picker-block[b-ya6ri9y0nv] {
        break-inside: avoid;
        page-break-inside: avoid;
    }
}
/* /Components/Pages/Treinos/ClientDetail.razor.rz.scp.css */
.training-price[b-jmaigt0inn] {
    font-size: 1.4rem;
    font-weight: 700;
    color: #1F1B1B;
}

/* Notes arrive as plain text with their own line breaks; keep them. */
.training-notes[b-jmaigt0inn] {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}
/* /Components/Pages/Treinos/Clients.razor.rz.scp.css */
/* The whole row is the link into the client's page, so it reads as clickable and gives a
   comfortable tap target on a tablet without a fiddly link on the name alone. */
.training-row[b-6c3k39koot] {
    cursor: pointer;
}

.training-row:hover[b-6c3k39koot] {
    background-color: rgba(31, 27, 27, .04);
}
/* /Components/Pages/Treinos/Payments.razor.rz.scp.css */
/* The month and year pickers size to their content rather than stretching across the bar,
   so the ‹ › steppers stay beside them as one compact control on a tablet. */
.training-month[b-w86qnmiu0g],
.training-year[b-w86qnmiu0g] {
    width: auto;
    flex: 0 0 auto;
}

/* ------------------------------------------------------------------- vista anual */

.view-switch .btn[b-w86qnmiu0g] {
    white-space: nowrap;
}

/* Catorze colunas nunca cabem num tablet, e a solução é rolar dentro da caixa (.table-responsive
   já o faz) e nunca a página. Larguras fixas para que o mês seja sempre do mesmo tamanho,
   independentemente de a célula ter marca ou não. */
.annual-map table[b-w86qnmiu0g] {
    table-layout: fixed;
}

/* Colada à esquerda: rolar doze meses sem saber de quem é a linha não serve de nada. Precisa
   de fundo próprio, senão as células passam-lhe por baixo à vista. */
.annual-map .name-col[b-w86qnmiu0g] {
    width: 11rem;
    min-width: 11rem;
    position: sticky;
    left: 0;
    background: var(--bs-body-bg, #fff);
    z-index: 1;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.annual-map .tier-col[b-w86qnmiu0g] {
    width: 7.5rem;
    min-width: 7.5rem;
    white-space: nowrap;
}

.annual-map .month-col[b-w86qnmiu0g] {
    width: 2.4rem;
    min-width: 2.4rem;
    padding: .15rem;
    text-align: center;
}

.annual-map thead .month-col[b-w86qnmiu0g] {
    font-size: .7rem;
    font-weight: 500;
    color: #6c757d;
}

.annual-map .total-col[b-w86qnmiu0g] {
    width: 10.5rem;
    min-width: 10.5rem;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

/* A marca de um mês. Verde/âmbar/vermelho é a mesma escala do crachá da vista mensal, mas a
   cor não pode ser o único sinal: pago é um bloco cheio com visto, pendente é um contorno
   vazio, em atraso é um contorno com ponto de exclamação. Quem não distingue o vermelho do
   verde continua a ler a grelha. */
.pay-cell[b-w86qnmiu0g] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    padding: 0;
    border: 2px solid transparent;
    border-radius: .2rem;
    background: transparent;
    font-size: .75rem;
    font-weight: 700;
    line-height: 1;
}

.pay-cell.paid[b-w86qnmiu0g] {
    background: var(--bs-success, #198754);
    border-color: var(--bs-success, #198754);
    color: #fff;
}

.pay-cell.pending[b-w86qnmiu0g] {
    border-color: var(--bs-warning, #ffc107);
    border-style: dashed;
}

.pay-cell.overdue[b-w86qnmiu0g] {
    border-color: var(--bs-danger, #dc3545);
    color: var(--bs-danger, #dc3545);
}

button.pay-cell[b-w86qnmiu0g] {
    cursor: pointer;
}

button.pay-cell:hover[b-w86qnmiu0g],
button.pay-cell:focus-visible[b-w86qnmiu0g] {
    box-shadow: 0 0 0 .2rem rgba(31, 27, 27, .15);
}

/* A legenda usa exactamente as mesmas formas das células, senão não é legenda de nada. */
.swatch[b-w86qnmiu0g] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.1rem;
    height: 1.1rem;
    margin-right: .35rem;
    vertical-align: -3px;
    border: 2px solid transparent;
    border-radius: .2rem;
    font-size: .65rem;
    font-weight: 700;
    font-style: normal;
    line-height: 1;
}

.swatch.paid[b-w86qnmiu0g] {
    background: var(--bs-success, #198754);
    border-color: var(--bs-success, #198754);
    color: #fff;
}

.swatch.pending[b-w86qnmiu0g] {
    border-color: var(--bs-warning, #ffc107);
    border-style: dashed;
}

.swatch.overdue[b-w86qnmiu0g] {
    border-color: var(--bs-danger, #dc3545);
    color: var(--bs-danger, #dc3545);
}

/* Ao balcão, com o tablet: o que se carrega tem de ter 44 px. A célula por pagar é um botão,
   por isso é essa que cresce — a marca de "pago" não se carrega e não precisa de crescer
   tanto, o que poupa largura numa grelha que já rola. */
@media (pointer: coarse) {
    .view-switch .btn[b-w86qnmiu0g] {
        min-height: 44px;
        display: inline-flex;
        align-items: center;
    }

    .form-control[b-w86qnmiu0g],
    .form-select[b-w86qnmiu0g] {
        min-height: 44px;
        font-size: 16px;
    }

    .annual-map .month-col[b-w86qnmiu0g] {
        width: 46px;
        min-width: 46px;
        padding: 1px;
    }

    .pay-cell[b-w86qnmiu0g] {
        width: 2rem;
        height: 2rem;
        font-size: .9rem;
    }

    button.pay-cell[b-w86qnmiu0g] {
        width: 44px;
        height: 44px;
    }
}
/* /Components/Pages/Treinos/RoomAgenda.razor.rz.scp.css */
/* Sete colunas não cabem num tablet ao alto, e o que não pode acontecer é a página inteira
   andar para o lado — a grelha rola dentro desta caixa e mais nada se mexe. */
.week-scroll[b-ie5gy0quub] {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    padding-bottom: .25rem;
}

.week-grid[b-ie5gy0quub] {
    display: grid;
    grid-template-columns: repeat(7, minmax(10rem, 1fr));
    gap: 4px;
    min-width: 100%;
}

.week-range[b-ie5gy0quub] {
    min-width: 16rem;
}

.day-column[b-ie5gy0quub] {
    display: flex;
    flex-direction: column;
    gap: .3rem;
    min-height: 9rem;
    padding: .35rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .35rem;
    background: #fff;
}

/* Hoje marca-se como no calendário da Agenda: contorno a tinta e o filete amarelo da marca. */
.day-column.is-today[b-ie5gy0quub] {
    border-color: #1F1B1B;
    box-shadow: inset 0 0 0 2px #FFD800;
}

.day-head[b-ie5gy0quub] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .25rem;
    font-size: .75rem;
    font-weight: 600;
    color: #6c757d;
}

.day-number[b-ie5gy0quub] {
    font-size: .9rem;
    color: #1F1B1B;
}

.day-column.is-today .day-number[b-ie5gy0quub] {
    background: #1F1B1B;
    color: #fff;
    border-radius: 999px;
    padding: 0 .4rem;
}

.day-add[b-ie5gy0quub] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.4rem;
    min-height: 1.4rem;
    border-radius: .25rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    color: #1F1B1B;
    text-decoration: none;
    line-height: 1;
}

.day-add:hover[b-ie5gy0quub] {
    border-color: #1F1B1B;
    background: #FFD800;
}

.slot[b-ie5gy0quub] {
    display: block;
    padding: .3rem .35rem;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-left: 3px solid #FFD800;
    border-radius: .25rem;
    background: #f8f9fa;
    color: #1F1B1B;
    text-decoration: none;
    font-size: .75rem;
    line-height: 1.3;
}

.slot:hover[b-ie5gy0quub] {
    border-color: #1F1B1B;
    background: #fff;
}

.slot-time[b-ie5gy0quub] {
    display: block;
    font-weight: 600;
}

.slot-label[b-ie5gy0quub] {
    display: block;
    overflow-wrap: anywhere;
}

.slot-who[b-ie5gy0quub] {
    display: block;
    color: #6c757d;
}

.slot-meta[b-ie5gy0quub] {
    display: block;
    margin-top: .15rem;
}

/* Cancelada: fica no registo, deixa de ocupar a sala — recua e leva um risco, para que se leia
   que foi desmarcada sem competir com as marcações que ainda contam. */
.slot.is-cancelled[b-ie5gy0quub] {
    opacity: .6;
    border-left-color: #adb5bd;
}

.slot.is-cancelled .slot-time[b-ie5gy0quub],
.slot.is-cancelled .slot-label[b-ie5gy0quub] {
    text-decoration: line-through;
}

/* Um dia vazio diz "—" em vez de ficar em branco: uma coluna vazia parece um erro de
   carregamento, um travessão diz que não há nada marcado. */
.day-empty[b-ie5gy0quub] {
    text-align: center;
    padding: .5rem 0;
    color: #adb5bd;
    font-size: .8rem;
}

@media (pointer: coarse) {
    .week-grid[b-ie5gy0quub] {
        grid-template-columns: repeat(7, minmax(12rem, 1fr));
    }

    .slot[b-ie5gy0quub] {
        min-height: 44px;
        padding: .5rem;
        font-size: .85rem;
    }

    .day-add[b-ie5gy0quub] {
        min-width: 44px;
        min-height: 44px;
        font-size: 1.1rem;
    }
}
/* /Components/Pages/Treinos/RoomAppointmentDetail.razor.rz.scp.css */
/* As notas chegam como texto simples com as suas próprias quebras de linha — "trazer os
   sapatos", "segunda tentativa" — e mantê-las é o mínimo até haver um editor com formatação. */
.appointment-notes[b-4x0mksq1r9] {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

/* O quando é a primeira coisa que se procura nesta página, por isso lê-se antes do resto. */
.appointment-when[b-4x0mksq1r9] {
    font-size: 1.1rem;
    font-weight: 600;
    color: #1F1B1B;
}

@media (pointer: coarse) {
    .appointment-actions .btn[b-4x0mksq1r9] {
        min-height: 44px;
    }
}
/* /Components/Pages/Treinos/StrengthPlanDetail.razor.rz.scp.css */
/* O objetivo, o plano e as notas chegam como texto simples com as suas próprias quebras de
   linha — um plano de força é escrito por sessões, exercícios e séries, e essa forma é a
   informação. Mantê-las é o mínimo até haver um editor com formatação. */
.plan-text[b-ccopt2iyog] {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}
/* /Components/Pages/Treinos/TrainingHome.razor.rz.scp.css */
/* O cartão inteiro é o alvo do toque — o stretched-link do Bootstrap estica o link do título
   sobre todo o cartão — por isso mostra que é clicável e ganha altura suficiente para um dedo
   num tablet, onde acertar só no título seria fastidioso. */
.training-tile[b-7ws8zecbqz] {
    transition: box-shadow .15s ease-in-out;
}

.training-tile:hover[b-7ws8zecbqz] {
    box-shadow: 0 .125rem .5rem rgba(31, 27, 27, .12);
}

.training-tile a[b-7ws8zecbqz] {
    color: #1F1B1B;
    text-decoration: none;
}

.training-tile:hover a[b-7ws8zecbqz] {
    text-decoration: underline;
}

@media (pointer: coarse) {
    .training-tile .card-body[b-7ws8zecbqz] {
        min-height: 6rem;
    }
}
/* /Components/Pages/Usados/Catalogue.razor.rz.scp.css */
/* Cards reflow to fit whatever width the tablet gives them — three or four across on an
   iPad in landscape, two in portrait, without a media query per breakpoint. */
.item-grid[b-wysionmu1v] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: 1rem;
}

.item-card[b-wysionmu1v] {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .5rem;
    overflow: hidden;
    background: #fff;
    color: inherit;
    text-decoration: none;
    transition: border-color .12s ease, box-shadow .12s ease;
}

.item-card:hover[b-wysionmu1v],
.item-card:focus-visible[b-wysionmu1v] {
    border-color: #1F1B1B;
    box-shadow: 0 2px 10px rgba(31, 27, 27, .12);
    outline: none;
}

.item-thumb[b-wysionmu1v] {
    aspect-ratio: 4 / 3;
    background: #f6f6f4;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
}

.item-thumb img[b-wysionmu1v] {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.item-thumb-empty[b-wysionmu1v] {
    color: #b9b4b0;
}

.item-body[b-wysionmu1v] {
    display: flex;
    flex-direction: column;
    gap: .35rem;
    padding: .6rem .7rem .75rem;
}

/* Two lines at most, clipped rather than wrapped, so a long title cannot make one card
   taller than its neighbours in the row. */
.item-title[b-wysionmu1v] {
    font-weight: 600;
    line-height: 1.25;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.item-price[b-wysionmu1v] {
    font-size: 1.05rem;
    font-weight: 700;
    color: #1F1B1B;
}

.item-tags[b-wysionmu1v] {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
    align-items: center;
}

.item-interest[b-wysionmu1v] {
    font-weight: 500;
}

/* On a phone, two comfortable columns rather than one oversized card. */
@media (max-width: 575px) {
    .item-grid[b-wysionmu1v] {
        grid-template-columns: repeat(2, 1fr);
        gap: .6rem;
    }
}
/* /Components/Pages/Usados/ItemDetail.razor.rz.scp.css */
.gallery-main[b-modngxthnw] {
    aspect-ratio: 4 / 3;
    background: #f6f6f4;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .5rem;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
}

/* The whole photo, letterboxed rather than cropped — on a detail page the buyer wants to
   see all of it, not a tidy square. */
.gallery-main img[b-modngxthnw] {
    width: 100%;
    height: 100%;
    object-fit: contain;
}

.gallery-empty[b-modngxthnw] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    color: #b9b4b0;
}

.gallery-thumbs[b-modngxthnw] {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    margin-top: .5rem;
}

/* 64px keeps the thumbnails a comfortable tap target on a tablet. */
.gallery-thumb[b-modngxthnw] {
    width: 64px;
    height: 64px;
    padding: 0;
    border: 2px solid transparent;
    border-radius: .4rem;
    overflow: hidden;
    background: #f6f6f4;
    cursor: pointer;
}

.gallery-thumb img[b-modngxthnw] {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.gallery-thumb.is-active[b-modngxthnw] {
    border-color: #1F1B1B;
    box-shadow: inset 0 0 0 2px #FFD800;
}

.item-price[b-modngxthnw] {
    font-size: 1.4rem;
    font-weight: 700;
    color: #1F1B1B;
}

/* Descriptions arrive as plain text with their own line breaks; keep them. */
.item-description[b-modngxthnw] {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

.interest-list[b-modngxthnw] {
    display: flex;
    flex-direction: column;
    gap: .5rem;
}

.interest-item[b-modngxthnw] {
    border-bottom: 1px solid var(--bs-border-color, #dee2e6);
    padding-bottom: .5rem;
}

.interest-item:last-child[b-modngxthnw] {
    border-bottom: 0;
    padding-bottom: 0;
}

.interest-remove[b-modngxthnw] {
    line-height: 1;
}
/* /Components/Pages/Usados/ItemEdit.razor.rz.scp.css */
.edit-thumbs[b-ob5ucrfirt] {
    display: flex;
    flex-wrap: wrap;
    gap: .75rem;
}

.edit-thumb[b-ob5ucrfirt] {
    position: relative;
    width: 150px;
    border: 1px solid var(--bs-border-color, #dee2e6);
    border-radius: .5rem;
    overflow: hidden;
    background: #f6f6f4;
    display: flex;
    flex-direction: column;
}

/* The main photo is ringed so it is obvious which one the catalogue card will show. */
.edit-thumb.is-main[b-ob5ucrfirt] {
    border-color: #1F1B1B;
    box-shadow: inset 0 0 0 2px #FFD800;
}

.edit-thumb img[b-ob5ucrfirt] {
    width: 100%;
    height: 112px;
    object-fit: cover;
}

.edit-thumb-badge[b-ob5ucrfirt] {
    position: absolute;
    top: .35rem;
    left: .35rem;
}

.edit-thumb-actions[b-ob5ucrfirt] {
    display: flex;
    flex-wrap: wrap;
    gap: .25rem;
    padding: .4rem;
}
/* /Components/Pages/Usados/ItemStatusBadge.razor.rz.scp.css */
.item-status[b-u5s0qrq4zj] {
    font-weight: 600;
}

/* A sold item keeps its badge but strikes it through, so the catalogue reads "gone" at a
   glance without losing the colour code. */
.item-status.is-sold[b-u5s0qrq4zj] {
    text-decoration: line-through;
}
/* /Components/Shared/BonusOverviewCard.razor.rz.scp.css */
/* O cartão dos prémios no resumo do dia. Da mesma família que "Em atraso" e "À sua espera" —
   as mesmas duas cores da casa, nenhuma nova — mas o mais discreto dos três: nada aqui está
   atrasado nem à espera de ninguém. É uma coisa boa a acontecer, que só precisa de estar
   à vista todos os dias. */
.premios[b-01t833drk2] {
    border: 1px solid #e7e3e3;
    border-left: 6px solid #FFD800;
}

.premios .card-header[b-01t833drk2] {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
    font-weight: 600;
}

.premios-link[b-01t833drk2] {
    color: #6c757d;
    text-decoration: underline;
    font-weight: 400;
    font-size: .85rem;
}

.premios-link:hover[b-01t833drk2],
.premios-link:focus[b-01t833drk2] {
    color: #1F1B1B;
}

.mealheiro-line[b-01t833drk2] {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: .4rem;
    margin: 0 0 .5rem;
}

.mealheiro-amount[b-01t833drk2] {
    font-size: 1.4rem;
    font-weight: 700;
    line-height: 1.1;
    color: #1F1B1B;
    font-variant-numeric: tabular-nums;
}

.mealheiro-label[b-01t833drk2] {
    color: #6c757d;
    font-size: .85rem;
}

/* A frase do serviço: quanto falta e que média mensal dá. É por isto que o cartão existe. */
.pace[b-01t833drk2] {
    margin: 0 0 .25rem;
    font-size: .9rem;
    color: #1F1B1B;
}

.condition[b-01t833drk2] {
    margin: 0;
    font-size: .8rem;
    color: #6c757d;
}

@media (pointer: coarse) {
    .premios-link[b-01t833drk2] {
        display: inline-flex;
        align-items: center;
        min-height: 44px;
        font-size: 1rem;
    }

    .condition[b-01t833drk2],
    .pace[b-01t833drk2] {
        font-size: 1rem;
    }
}
/* /Components/Shared/BonusProgressMeter.razor.rz.scp.css */
.meter[b-r52zbrl27f] {
    margin-bottom: 1rem;
}

.meter-head[b-r52zbrl27f] {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: baseline;
    gap: .5rem;
    margin-bottom: .35rem;
}

.meter-label[b-r52zbrl27f] {
    font-weight: 600;
    color: #1F1B1B;
}

.meter-figures[b-r52zbrl27f] {
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.meter-target[b-r52zbrl27f] {
    color: #6c757d;
    font-size: .9rem;
}

/* A calha é sempre visível, mesmo a zero: uma barra vazia diz "ainda no princípio", e a
   ausência de barra não diz nada. */
.meter-track[b-r52zbrl27f] {
    position: relative;
    height: 1.25rem;
    border: 1px solid #d5d1cb;
    border-radius: .3rem;
    background: #f3f1ee;
    overflow: hidden;
}

.meter-fill[b-r52zbrl27f] {
    height: 100%;
    min-width: 2px;
    transition: width .3s ease-out;
}

/* Amarelo da casa enquanto falta, tinta quando o objectivo está feito. A diferença de cor
   é um reforço — o texto por baixo diz sempre o mesmo em palavras. */
.meter-fill.short[b-r52zbrl27f] {
    background: #FFD800;
}

.meter-fill.reached[b-r52zbrl27f] {
    background: #1F1B1B;
}

.meter-caption[b-r52zbrl27f] {
    margin: .35rem 0 0;
    font-size: .875rem;
    color: #495057;
}

.meter-caption.reached[b-r52zbrl27f] {
    color: #1F1B1B;
    font-weight: 600;
}

.meter-mark[b-r52zbrl27f] {
    margin-right: .25rem;
}

.meter-note[b-r52zbrl27f] {
    display: block;
    color: #6c757d;
}

.meter.compact .meter-track[b-r52zbrl27f] {
    height: .9rem;
}

.meter.compact .meter-head[b-r52zbrl27f],
.meter.compact .meter-caption[b-r52zbrl27f] {
    font-size: .8125rem;
}

.meter.compact[b-r52zbrl27f] {
    margin-bottom: .75rem;
}

@media (pointer: coarse) {
    .meter-track[b-r52zbrl27f] {
        height: 1.5rem;
    }

    .meter.compact .meter-track[b-r52zbrl27f] {
        height: 1.15rem;
    }

    .meter-caption[b-r52zbrl27f] {
        font-size: 1rem;
    }
}
/* /Components/Shared/ImpersonationBanner.razor.rz.scp.css */
/* Deliberately the loudest thing in the application. Brand yellow on brand ink, full width,
   stuck to the top of the viewport so it survives scrolling, and above every other layer
   (the sidebar and the sticky top-row sit at z-index 1). Nothing else in the app looks like
   this, which is the point: it must not read as ordinary chrome. */
.impersonation-banner[b-1ynhkx1te4] {
    position: sticky;
    top: 0;
    z-index: 1090;

    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: .5rem 1rem;

    padding: .5rem 1rem;
    background-color: #FFD800;
    color: #1F1B1B;
    border-bottom: 4px solid #1F1B1B;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .35);

    font-size: .9rem;
    line-height: 1.3;

    /* The colours carry the warning, so they are held even where the system theme would
       otherwise repaint them. */
    color-scheme: light only;
}

.impersonation-message[b-1ynhkx1te4] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
    min-width: 0;
}

/* Inverted out of the yellow so the state has a name, not just a colour. */
.impersonation-tag[b-1ynhkx1te4] {
    background-color: #1F1B1B;
    color: #FFD800;
    border-radius: .25rem;
    padding: .15rem .5rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    font-size: .72rem;
    white-space: nowrap;
}

.impersonation-actions[b-1ynhkx1te4] {
    display: flex;
    align-items: center;
    gap: .75rem;
    margin-left: auto;
}

.impersonation-actions form[b-1ynhkx1te4] {
    margin: 0;
}

.impersonation-time[b-1ynhkx1te4] {
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    font-weight: 600;
}

.impersonation-stop[b-1ynhkx1te4] {
    background-color: #1F1B1B;
    color: #FFFFFF;
    border: 2px solid #1F1B1B;
    border-radius: .25rem;
    padding: .3rem 1rem;
    font-weight: 700;
    cursor: pointer;
    white-space: nowrap;
}

.impersonation-stop:hover[b-1ynhkx1te4],
.impersonation-stop:focus[b-1ynhkx1te4] {
    background-color: #FFFFFF;
    color: #1F1B1B;
}

.impersonation-stop:focus-visible[b-1ynhkx1te4] {
    outline: 3px solid #1F1B1B;
    outline-offset: 2px;
}

/* The counter tablet: a 44px target for the one control that ends the session, and text that
   stays legible without shrinking the message onto one unreadable line. */
@media (pointer: coarse) {
    .impersonation-banner[b-1ynhkx1te4] {
        font-size: 1rem;
        padding: .65rem 1rem;
    }

    .impersonation-stop[b-1ynhkx1te4] {
        min-height: 44px;
        min-width: 44px;
        font-size: 16px;
        padding: .5rem 1.25rem;
    }
}

@media (max-width: 640.98px) {
    .impersonation-actions[b-1ynhkx1te4] {
        width: 100%;
        margin-left: 0;
        justify-content: space-between;
    }
}
/* /Components/Training/BgFitCell.razor.rz.scp.css */
/* A célula ocupa a largura toda da casa da tabela e não desenha caixa nenhuma: a caixa é a
   grelha da folha, como no papel, e um <input> com moldura própria dentro de uma casa já com
   moldura dá dois rectângulos onde o formulário tem um.
   16px é o mínimo que o iOS exige para não dar zoom ao focar um campo, e esta folha preenche-se
   num tablet ao lado da bicicleta — por isso o tamanho é fixo aqui e não herdado. */
.cell-input[b-boktgyju5j] {
    display: block;
    width: 100%;
    min-height: 2.25rem;
    padding: .15rem .35rem;
    border: 0;
    background: transparent;
    font-size: 16px;
    line-height: 1.3;
    color: inherit;
}

.cell-input:focus[b-boktgyju5j] {
    outline: 2px solid #1F1B1B;
    outline-offset: -2px;
    background: #fff;
}

/* Em leitura, o valor ocupa a mesma altura que o campo ocupava, para que a folha preenchida e
   a folha em branco tenham exactamente a mesma grelha. */
.cell-value[b-boktgyju5j] {
    display: block;
    min-height: 2.25rem;
    padding: .15rem .35rem;
    font-size: 16px;
    line-height: 1.3;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

@media (pointer: coarse) {
    .cell-input[b-boktgyju5j],
    .cell-value[b-boktgyju5j] {
        min-height: 2.75rem;
    }
}
/* /Components/Training/BgFitScaleChips.razor.rz.scp.css */
/* As duas escalas numa linha só, na ordem impressa. Envolvem-se quando não cabem (num telemóvel
   seis palavras não cabem ao lado de um rótulo), mas nunca se partem ao meio de um grupo: o
   `nowrap` está nos grupos, não aqui. */
.scale[b-wcwrkfedkk] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .2rem .6rem;
    padding: .1rem .35rem;
}

/* O "E –" / "D –" que a folha imprime antes das palavras. */
.side[b-wcwrkfedkk] {
    font-size: .8rem;
    color: #333;
    white-space: nowrap;
}

.chips[b-wcwrkfedkk] {
    display: inline-flex;
    align-items: center;
    gap: .15rem;
    white-space: nowrap;
}

/* Cada palavra tem a caixa do papel: pequena, em maiúsculas, sem moldura enquanto não está
   escolhida — no papel também não há caixa nenhuma até alguém passar o círculo. */
.chip[b-wcwrkfedkk] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.6rem;
    min-height: 1.9rem;
    padding: .1rem .3rem;
    border: 1px solid transparent;
    border-radius: 1rem;
    background: transparent;
    font-size: .78rem;
    letter-spacing: .02em;
    color: #333;
    line-height: 1;
}

button.chip[b-wcwrkfedkk] {
    cursor: pointer;
}

button.chip:hover[b-wcwrkfedkk] {
    border-color: #adb5bd;
}

button.chip:focus-visible[b-wcwrkfedkk] {
    outline: 2px solid #1F1B1B;
    outline-offset: 1px;
}

/* O círculo do fitter. Tinta em vez de cor de marca: a folha é a preto e vermelho, e um chip
   amarelo aqui leria-se como um aviso e não como uma escolha. */
.chip.on[b-wcwrkfedkk] {
    border-color: #1F1B1B;
    background: #1F1B1B;
    color: #fff;
    font-weight: 600;
}

/* Num tablet as palavras deixam de ser alvos de 30px: a folha preenche-se com o dedo. */
@media (pointer: coarse) {
    .chip[b-wcwrkfedkk] {
        min-width: 3rem;
        min-height: 2.75rem;
        font-size: .85rem;
    }
}
/* /Components/Training/BgFitSheets.razor.rz.scp.css */
/* A folha do Body Geometry FIT, no ecrã.

   O objectivo aqui não é desenhar bem — é desenhar *igual*. Quem preenche isto tem o papel ao
   lado, e cada diferença de ordem, de cor ou de agrupamento é uma hesitação a meio de um fit.
   Daí o vermelho dos títulos, que é o do formulário e não o amarelo da loja: a excepção à marca
   é deliberada e é o ponto.

   Duas folhas A4 deitadas, uma por secção, cada uma com duas colunas — a estrutura do papel. */

.sheet[b-dp1bqztz2j] {
    border: 1px solid #d9d5d0;
    border-radius: .35rem;
    padding: 1rem;
    margin-bottom: 1.25rem;
    background: #fff;
}

/* Cabeçalho: Data / Nome / Telefone / Email / Morada em linhas sublinhadas, como no papel. */
.head[b-dp1bqztz2j] {
    display: grid;
    grid-template-columns: auto 1fr auto 1fr;
    gap: .25rem .5rem;
    align-items: end;
    margin-bottom: 1rem;
    padding-bottom: .75rem;
    border-bottom: 1px solid #1F1B1B;
}

.head-label[b-dp1bqztz2j] {
    font-weight: 700;
    font-size: .8rem;
    white-space: nowrap;
}

.head-field[b-dp1bqztz2j] {
    border-bottom: 1px solid #c9c4bd;
    min-height: 1.4rem;
    font-size: .85rem;
}

.sheet-cols[b-dp1bqztz2j] {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.35fr);
    gap: 1.5rem;
}

.sheet-col[b-dp1bqztz2j] {
    min-width: 0;
}

/* O título de secção do formulário: vermelho, maiúsculas, sublinhado a preto.
   O text-transform faz o trabalho para que o texto no markup continue legível e traduzível. */
.section[b-dp1bqztz2j] {
    color: #E4002B;
    text-transform: uppercase;
    font-weight: 700;
    font-size: .82rem;
    letter-spacing: .02em;
    border-bottom: 1px solid #1F1B1B;
    padding-bottom: .15rem;
    margin: 0 0 .4rem;
}

/* As grelhas de linhas alternadas cinzento/branco, que é como o papel separa as linhas. */
.grid[b-dp1bqztz2j] {
    width: 100%;
    border-collapse: collapse;
    font-size: .8rem;
    table-layout: fixed;
}

.grid th[b-dp1bqztz2j],
.grid td[b-dp1bqztz2j] {
    padding: .2rem .4rem;
    vertical-align: middle;
    border: 0;
}

.grid th[scope="row"][b-dp1bqztz2j] {
    font-weight: 600;
    text-align: left;
    white-space: normal;
}

.grid tbody tr:nth-child(odd)[b-dp1bqztz2j] {
    background: #ebe9e6;
}

/* Cabeçalho das três tabelas da folha 2 — ATUAIS/NOVAS e ATUAL/NOVO, a vermelho como a secção. */
.grid thead th.section[b-dp1bqztz2j] {
    border-bottom: 1px solid #1F1B1B;
    text-align: left;
}

.grid thead th.section:not(:first-child)[b-dp1bqztz2j] {
    text-align: center;
}

/* As tabelas de medidas levam grelha visível, ao contrário das da avaliação: no papel são
   caixas para escrever, e sem os traços perde-se de que coluna é cada valor. */
.boxed th[b-dp1bqztz2j],
.boxed td[b-dp1bqztz2j] {
    border: 1px solid #1F1B1B;
}

/* Texto impresso no formulário — "Atual", "E -", "Perfil da coluna" — por oposição ao que a
   pessoa escreve. Cinzento e pequeno para que a distinção se veja sem se ler. */
.printed[b-dp1bqztz2j] {
    font-weight: 600;
    font-size: .74rem;
    margin-right: .35rem;
    white-space: nowrap;
}

/* Os parêntesis do formulário: "(Avanço/recuo/ângulo)", "(cunha/altura)". Mais pequenos e mais
   claros do que o rótulo, exactamente como impressos. */
.qualifier[b-dp1bqztz2j] {
    font-weight: 400;
    font-size: .7rem;
    color: #6c757d;
}

.captioned[b-dp1bqztz2j] {
    white-space: nowrap;
}

.captioned > .sheet-input[b-dp1bqztz2j],
.captioned > .sheet-value[b-dp1bqztz2j] {
    display: inline-block;
    width: auto;
    min-width: 0;
    max-width: calc(100% - 4.5rem);
    vertical-align: middle;
}

/* Os campos. Fundo transparente e só uma linha por baixo: no papel são linhas, não caixas. */
.sheet-input[b-dp1bqztz2j] {
    width: 100%;
    border: 0;
    border-bottom: 1px solid #c9c4bd;
    background: transparent;
    font-size: 1rem;
    padding: .1rem .15rem;
    min-height: 1.6rem;
}

.sheet-input:focus[b-dp1bqztz2j] {
    outline: 2px solid #FFD800;
    outline-offset: 1px;
    background: #fffdf0;
}

/* O mesmo campo em leitura: sem caixa, sem linha, só o valor — a folha preenchida. */
.sheet-value[b-dp1bqztz2j] {
    display: inline-block;
    min-height: 1.4rem;
    font-size: .85rem;
    padding: .1rem .15rem;
}

.sheet-text[b-dp1bqztz2j] {
    width: 100%;
    border: 1px solid #c9c4bd;
    background: transparent;
    font-size: 1rem;
    padding: .25rem .35rem;
}

/* As linhas em branco das NOTAS: seis traços, como no papel. */
.ruled[b-dp1bqztz2j] {
    width: 100%;
    border: 0;
    border-bottom: 1px solid #1F1B1B;
    background: transparent;
    font-size: 1rem;
    padding: .2rem .15rem;
    min-height: 1.8rem;
}

.ruled-read[b-dp1bqztz2j] {
    border-bottom: 1px solid #1F1B1B;
    min-height: 1.8rem;
    padding: .2rem .15rem;
    font-size: .85rem;
}

.inline[b-dp1bqztz2j] {
    display: flex;
    gap: .5rem;
    align-items: baseline;
    flex-wrap: wrap;
}

/* O desenho da bicicleta é a imagem do próprio formulário, com o logótipo e os rótulos ingleses
   apagados e as quatro caixas deixadas vazias. Os campos são posicionados por cima delas em
   percentagem, medidas na imagem original (574x437) e convertidas — assim a sobreposição
   acompanha a imagem seja qual for a largura que a coluna tiver.

     Alcance:  caixa x307-351  y108-136
     Drop:     caixa x456-501  y106-133
     Altura:   caixa x186-230  y156-184
     Avanço:   caixa x239-284  y383-410 */
.diagram[b-dp1bqztz2j] {
    position: relative;
    width: 100%;
    max-width: 574px;
    margin: 0 auto 1rem;
}

.diagram-art[b-dp1bqztz2j] {
    display: block;
    width: 100%;
    height: auto;
}

.diagram-field[b-dp1bqztz2j] {
    position: absolute;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .1rem;
}

/* A caixa é a que está desenhada na imagem; a nossa fica por cima dela, do mesmo tamanho, com
   fundo branco para tapar o traço da imagem e um contorno igual ao dela. */
.diagram-box[b-dp1bqztz2j] {
    border: 1px solid #1F1B1B;
    background: #fff;
    width: 100%;
    text-align: center;
}

.diagram-box .sheet-input[b-dp1bqztz2j],
.diagram-box .sheet-value[b-dp1bqztz2j] {
    text-align: center;
    border: 0;
    min-height: 1.5rem;
    font-size: .8rem;
    padding: 0 .1rem;
    width: 100%;
}

.diagram-label[b-dp1bqztz2j] {
    font-size: .68rem;
    line-height: 1.1;
    text-align: center;
    color: #1F1B1B;
    background: #fff;
    white-space: nowrap;
    padding: 0 .1rem;
}

/* left/top/width em percentagem da imagem: x/574 e y/437. */
.f-reach[b-dp1bqztz2j] {
    left: 53.5%;
    top: 18.3%;
    width: 7.7%;
}

.f-drop[b-dp1bqztz2j] {
    left: 79.4%;
    top: 17.8%;
    width: 7.8%;
}

/* A altura do selim tem o rótulo à esquerda da caixa e não por cima, como no papel. */
.f-height[b-dp1bqztz2j] {
    left: 24.0%;
    top: 35.7%;
    width: 16.1%;
    flex-direction: row;
    align-items: center;
    gap: .25rem;
}

.f-height .diagram-box[b-dp1bqztz2j] {
    width: 48%;
}

/* O avanço/recuo tem o rótulo por baixo. */
.f-setback[b-dp1bqztz2j] {
    left: 41.6%;
    top: 87.6%;
    width: 7.8%;
    flex-direction: column-reverse;
}

/* Tablet: o fitter preenche isto de pé, ao lado de uma bicicleta. Alvos de 44px e texto de 16px
   para que o teclado não faça zoom, e as duas colunas passam a uma só sem trocar a ordem — a
   ordem é a do papel e é o que a pessoa está a seguir. */
@media (pointer: coarse) {
    .sheet-input[b-dp1bqztz2j],
    .ruled[b-dp1bqztz2j] {
        min-height: 44px;
        font-size: 16px;
    }

    .sheet-text[b-dp1bqztz2j] {
        font-size: 16px;
    }
}

@media (max-width: 991.98px) {
    .sheet-cols[b-dp1bqztz2j] {
        grid-template-columns: minmax(0, 1fr);
        gap: 1rem;
    }

    .head[b-dp1bqztz2j] {
        grid-template-columns: auto 1fr;
    }
}

/* Impressão: a folha em papel é o artefacto que a consulta produz, e o PDF gerado no servidor
   não substitui poder carregar em imprimir. print-color-adjust é a linha que importa — sem ela
   o browser deita fora o vermelho e o cinzento das linhas, e sai uma grelha vazia. */
@media print {
    .sheet[b-dp1bqztz2j] {
        border: 0;
        padding: 0;
        break-after: page;
        print-color-adjust: exact;
        -webkit-print-color-adjust: exact;
    }

    .sheet:last-of-type[b-dp1bqztz2j] {
        break-after: auto;
    }

    .grid tbody tr:nth-child(odd)[b-dp1bqztz2j],
    .section[b-dp1bqztz2j] {
        print-color-adjust: exact;
        -webkit-print-color-adjust: exact;
    }

    .sheet-input[b-dp1bqztz2j],
    .ruled[b-dp1bqztz2j] {
        border-bottom: 1px solid #1F1B1B;
    }
}
/* /Components/Training/BgFitTypeBadge.razor.rz.scp.css */
.bgfit-type[b-ngxyoqcf9r] {
    font-weight: 600;
}
/* /Components/Training/BodyCompositionChart.razor.rz.scp.css */
/* O gráfico é desenhado ao tamanho natural e ENCOLHE se o ecrã for estreito, em vez de ser
   esticado até à largura do contentor: duas barras esticadas ao largo de um tablet deixam de
   ser um gráfico e passam a ser um cartaz. */
.composition[b-3ihq6a8edq] {
    margin: 0 0 .5rem;
}

.composition .plot[b-3ihq6a8edq] {
    max-width: 100%;
    height: auto;
    display: block;
}

/* A grelha e os eixos são traços finos e apagados, um tom acima do fundo: são a régua, não o
   que se lê. Contínuos e nunca tracejados — um tracejado lê-se como previsão. */
.composition .grid[b-3ihq6a8edq] {
    stroke: #E7E4E0;
    stroke-width: 1;
}

.composition .axis[b-3ihq6a8edq] {
    stroke: #C9C4BD;
    stroke-width: 1;
}

.composition .tick[b-3ihq6a8edq],
.composition .axis-unit[b-3ihq6a8edq],
.composition .date[b-3ihq6a8edq] {
    fill: #6c757d;
    font-size: 11px;
    font-variant-numeric: tabular-nums;
}

/* O número em cima da barra é a soma das três parcelas. Fica na tinta da marca e não na cor do
   segmento: a cor identifica a parcela, o texto é texto. */
.composition .total[b-3ihq6a8edq] {
    fill: #1F1B1B;
    font-size: 12px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* O separador entre parcelas é uma frincha da cor do fundo, desenhada POR CIMA — e não um
   contorno, nem uma barra encurtada. Assim a altura de cada rectângulo continua exactamente
   proporcional aos quilos que representa. */
.composition .stack-gap[b-3ihq6a8edq] {
    fill: var(--bs-body-bg, #fff);
}

.composition figcaption[b-3ihq6a8edq] {
    margin-top: .5rem;
}

.composition .legend[b-3ihq6a8edq] {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: .35rem 1.25rem;
    margin: 0;
    padding: 0;
}

.composition .legend li[b-3ihq6a8edq] {
    display: flex;
    align-items: center;
    gap: .4rem;
    font-size: .85rem;
}

.composition .legend .name[b-3ihq6a8edq] {
    color: #1F1B1B;
}

/* SEM COR DE JUÍZO, aqui como na tabela. A seta diz para que lado a parcela foi e o número diz
   quanto; nenhuma das duas coisas diz se isso é bom, porque descer é o objectivo para uma
   parcela e o contrário para outra, e a plataforma não sabe qual é o objectivo deste cliente. */
.composition .legend .change[b-3ihq6a8edq] {
    color: #495057;
    font-variant-numeric: tabular-nums;
}

.composition .legend .change .arrow[b-3ihq6a8edq] {
    margin-right: .1rem;
    opacity: .75;
}

/* Os quadrados da legenda repetem a textura do gráfico: é o que os mantém distinguíveis em
   papel a preto e branco e para quem não separa estas três cores. */
.composition .swatch[b-3ihq6a8edq] {
    width: 14px;
    height: 14px;
    border-radius: 2px;
    flex: none;
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
}

.composition .swatch.fat[b-3ihq6a8edq] {
    background: repeating-linear-gradient(45deg, #D9A441 0 4px, #EBCB8C 4px 5.6px);
}

.composition .swatch.lean[b-3ihq6a8edq] {
    background: #4A5D6E;
}

.composition .swatch.bone[b-3ihq6a8edq] {
    background: repeating-linear-gradient(135deg, #BFBAB2 0 4px, #8B857C 4px 5px);
}

.composition .span[b-3ihq6a8edq] {
    margin: .4rem 0 0;
    font-size: .8rem;
    color: #6c757d;
}

.chart-empty[b-3ihq6a8edq],
.source-note[b-3ihq6a8edq],
.reading-note[b-3ihq6a8edq],
.skipped-note[b-3ihq6a8edq] {
    font-size: .85rem;
    color: #6c757d;
    margin: 0 0 .4rem;
}

/* A discordância entre a balança e as pregas fica numa caixa neutra — nem alerta nem erro. As
   duas leituras estão ambas certas do ponto de vista do seu instrumento, e escolher uma delas
   seria decidir uma questão que as medições não decidem. */
.reading-note[b-3ihq6a8edq] {
    border-left: 3px solid #FFD800;
    padding: .25rem .6rem;
    background: #fffbe0;
}

@media print {
    .composition .plot[b-3ihq6a8edq] {
        break-inside: avoid;
        page-break-inside: avoid;
    }

    /* Os fundos dos quadrados da legenda são a legenda: sem eles sai uma lista de nomes sem
       nada que os ligue aos segmentos. */
    .composition .swatch[b-3ihq6a8edq],
    .reading-note[b-3ihq6a8edq] {
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
    }
}
/* /Components/Training/GabineteTodayCard.razor.rz.scp.css */
/* O cartão do gabinete no resumo do dia. Da mesma família dos outros três — as mesmas duas
   cores da casa, nenhuma nova — e da mesma discrição do dos prémios: nada aqui está atrasado
   nem à espera de decisão, são horas já marcadas. A tinta na margem é a mesma que marca as
   entradas do gabinete na Agenda, para que as duas se leiam como a mesma origem. */
.gabinete-hoje[b-eknjq30ikt] {
    border: 1px solid #e7e3e3;
    border-left: 6px solid #1F1B1B;
}

.gabinete-hoje .card-header[b-eknjq30ikt] {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: .5rem;
    font-weight: 600;
}

.gabinete-link[b-eknjq30ikt] {
    color: #6c757d;
    text-decoration: underline;
    font-weight: 400;
    font-size: .85rem;
}

.gabinete-link:hover[b-eknjq30ikt],
.gabinete-link:focus[b-eknjq30ikt] {
    color: #1F1B1B;
}

/* A mesma pastilha de horas do resumo, para que as duas listas se leiam à mesma altura. */
.time-pill[b-eknjq30ikt] {
    display: inline-block;
    background: #1F1B1B;
    color: #fff;
    border-radius: .25rem;
    font-size: .72rem;
    padding: .1rem .4rem;
    white-space: nowrap;
    min-width: 5.5rem;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

/* O acento amarelo diz "esta hora é sua", exactamente como no compromisso atribuído a si. As
   dos colegas ficam sem ele — e ficam, que é o ponto: um mapa de ocupação que esconde metade
   da ocupação não evita uma marcação em cima de outra. */
.slot.mine[b-eknjq30ikt] {
    border-left: 3px solid #FFD800;
    padding-left: .5rem;
}

.slot-link[b-eknjq30ikt] {
    color: inherit;
    text-decoration: none;
}

.slot-link:hover[b-eknjq30ikt],
.slot-link:focus[b-eknjq30ikt] {
    text-decoration: underline;
}

.bloqueio[b-eknjq30ikt] {
    background: #FFF4B8;
    color: #1F1B1B;
    border: 1px solid #FFD800;
    font-weight: 600;
}

@media (pointer: coarse) {
    .gabinete-link[b-eknjq30ikt],
    .slot-link[b-eknjq30ikt] {
        display: inline-flex;
        align-items: center;
        min-height: 44px;
    }

    .time-pill[b-eknjq30ikt] {
        font-size: .85rem;
    }
}
/* /Components/Training/GirthSmallMultiples.razor.rz.scp.css */
.girths[b-0uvqqirnw6] {
    margin-top: 1.5rem;
}

.girths h2[b-0uvqqirnw6] {
    font-size: 1.1rem;
    margin-bottom: .25rem;
}

.lead-note[b-0uvqqirnw6] {
    font-size: .85rem;
    color: #6c757d;
    max-width: 46rem;
}

/* Sete gráficos pequenos, todos do mesmo tamanho e alinhados numa grelha: são para ser lidos
   uns contra os outros, e uma grelha irregular obrigaria a procurar cada um. auto-fill com um
   mínimo em vez de um número fixo de colunas — num tablet ao alto cabem duas, num portátil
   três ou quatro, sem nenhuma media query a decidir por eles. */
.grid[b-0uvqqirnw6] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
    gap: .75rem;
}

.cell[b-0uvqqirnw6] {
    border: 1px solid #E7E4E0;
    border-radius: .375rem;
    padding: .5rem .6rem;
    background: #fff;
}

@media print {
    /* Um gráfico não se parte a meio de uma folha, e em papel cabem três ao largo. */
    .cell[b-0uvqqirnw6] {
        break-inside: avoid;
        page-break-inside: avoid;
    }

    .grid[b-0uvqqirnw6] {
        grid-template-columns: repeat(3, 1fr);
    }
}
/* /Components/Training/MetricSparkline.razor.rz.scp.css */
/* Sem eixos, sem grelha e sem número: numa célula de tabela o que falta é espaço, e os números
   estão todos na própria linha, à direita. A forma só acrescenta o que a linha de números não
   dá de relance — para que lado é que isto foi. */
.spark[b-kaozvell6b] {
    display: block;
    width: 80px;
    height: 20px;
}

.spark .line[b-kaozvell6b] {
    stroke: #1F1B1B;
    fill: none;
}

.spark .dot[b-kaozvell6b],
.spark .endpoint[b-kaozvell6b] {
    fill: #1F1B1B;
}

@media print {
    .spark[b-kaozvell6b] {
        -webkit-print-color-adjust: exact;
        print-color-adjust: exact;
    }
}
/* /Components/Training/MetricTrendChart.razor.rz.scp.css */
/* O gráfico é desenhado ao tamanho natural e encolhe se não couber, como o da composição. */
.trend .plot[b-5dt05qrs1o] {
    max-width: 100%;
    height: auto;
    display: block;
}

.trend-head[b-5dt05qrs1o] {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: .5rem;
    margin-bottom: .15rem;
}

.trend-label[b-5dt05qrs1o] {
    color: #1F1B1B;
    font-weight: 600;
}

.trend.small .trend-label[b-5dt05qrs1o] {
    font-size: .8rem;
}

.trend-label .unit[b-5dt05qrs1o] {
    color: #6c757d;
    font-weight: 400;
    font-size: .8em;
}

/* A mesma neutralidade da coluna «V» da tabela: seta e grandeza, cinzento, nunca verde nem
   vermelho. Para o perímetro abdominal descer talvez seja o objectivo; para o do braço é o
   contrário, e a plataforma não sabe qual deles este cliente quer. */
.trend .change[b-5dt05qrs1o] {
    color: #495057;
    font-size: .85rem;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.trend .change .arrow[b-5dt05qrs1o] {
    margin-right: .1rem;
    opacity: .75;
}

.trend .grid[b-5dt05qrs1o] {
    stroke: #E7E4E0;
    stroke-width: 1;
}

.trend .axis[b-5dt05qrs1o] {
    stroke: #C9C4BD;
    stroke-width: 1;
}

.trend .tick[b-5dt05qrs1o],
.trend .date[b-5dt05qrs1o] {
    fill: #6c757d;
    font-variant-numeric: tabular-nums;
}

/* A linha e os pontos na tinta da marca. Uma métrica, uma cor — não há aqui séries para
   distinguir, e uma cor a mais seria uma cor com um significado que ninguém definiu. */
.trend .line[b-5dt05qrs1o] {
    stroke: #1F1B1B;
    fill: none;
}

.trend .dot[b-5dt05qrs1o] {
    fill: #1F1B1B;
}

.trend .value[b-5dt05qrs1o] {
    fill: #1F1B1B;
    font-variant-numeric: tabular-nums;
}

.chart-empty[b-5dt05qrs1o] {
    font-size: .85rem;
    color: #6c757d;
    margin: 0 0 .4rem;
}

/* Porque é que o eixo não começa em zero, e porque é que duas medições são barras. São as duas
   perguntas que este gráfico levanta a quem o sabe ler, e ficam respondidas na folha. */
.axis-note[b-5dt05qrs1o] {
    font-size: .75rem;
    color: #6c757d;
    margin: .25rem 0 0;
}

.axis-note span[b-5dt05qrs1o] {
    display: block;
}

@media print {
    .trend .plot[b-5dt05qrs1o],
    .trend-head[b-5dt05qrs1o] {
        break-inside: avoid;
        page-break-inside: avoid;
    }
}
/* /Components/Training/MonthlyStatusBadge.razor.rz.scp.css */
.training-status[b-b7fda5l99s] {
    font-weight: 600;
}
/* /Components/Training/PlanStatusBadge.razor.rz.scp.css */
.plan-status[b-gi6um9w903] {
    font-weight: 600;
}
/* /Components/Training/RoomAppointmentStatusBadge.razor.rz.scp.css */
.room-status[b-7yq62hat9n] {
    font-weight: 600;
}
/* /Components/Training/TrainingAreaBadge.razor.rz.scp.css */
/* Tons próprios em vez das cores do Bootstrap: as classes text-bg-* não chegam a seis áreas
   distinguíveis, e aqui a cor tem de separar seis coisas de relance. Cada tom é claro com
   texto escuro, para que a etiqueta se leia dentro de um bloco pequeno da grelha. */
.training-area[b-iw98t6els0] {
    font-weight: 600;
    border: 1px solid transparent;
}

.area-nutrition[b-iw98t6els0] {
    background: #e6f4ea;
    color: #14532d;
    border-color: #a7d7b6;
}

.area-bgfit[b-iw98t6els0] {
    background: #e7f1ff;
    color: #0a3977;
    border-color: #a8c7f0;
}

.area-strength[b-iw98t6els0] {
    background: #efe3fb;
    color: #3d1d68;
    border-color: #c9aeea;
}

.area-bike[b-iw98t6els0] {
    background: #ffe8d6;
    color: #6b2c00;
    border-color: #f2bf95;
}

/* Rosa quente: é o que sobra entre o verde da nutrição, o azul do BGFit, o roxo da força e o
   laranja da bicicleta sem se confundir com nenhum deles à distância de uma grelha. */
.area-depilation[b-iw98t6els0] {
    background: #fde4ee;
    color: #6d1338;
    border-color: #f3b3ca;
}

.area-other[b-iw98t6els0] {
    background: #f1f3f5;
    color: #343a40;
    border-color: #ced4da;
}
/* /Components/Training/TrainingStatusBadge.razor.rz.scp.css */
.training-status[b-3wi2c7sqcs] {
    font-weight: 600;
}
