/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-tq2jybsvae] {
    position: relative;
    display: flex;
    flex-direction: column;
}

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

.sidebar[b-tq2jybsvae] {
    background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}

.top-row[b-tq2jybsvae] {
    background-color: #f7f7f7;
    border-bottom: 1px solid #d6d5d5;
    justify-content: flex-end;
    height: 3.5rem;
    display: flex;
    align-items: center;
}

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

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

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

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

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

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

    .sidebar[b-tq2jybsvae] {
        width: 250px;
        height: 100vh;
        position: sticky;
        top: 0;
    }

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

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

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

#blazor-error-ui[b-tq2jybsvae] {
    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-tq2jybsvae] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-lt6qdheict] {
    appearance: none;
    cursor: pointer;
    width: 3.5rem;
    height: 2.5rem;
    color: white;
    position: absolute;
    top: 0.5rem;
    right: 1rem;
    border: 1px solid rgba(255, 255, 255, 0.1);
    background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}

.navbar-toggler:checked[b-lt6qdheict] {
    background-color: rgba(255, 255, 255, 0.5);
}

.top-row[b-lt6qdheict] {
    min-height: 3.5rem;
    background-color: rgba(0,0,0,0.4);
}

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

.bi[b-lt6qdheict] {
    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-lt6qdheict] {
    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-lt6qdheict] {
    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-lt6qdheict] {
    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");
}

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

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

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

    .nav-item[b-lt6qdheict]  .nav-link {
        color: #d7d7d7;
        background: none;
        border: none;
        border-radius: 4px;
        height: 3rem;
        display: flex;
        align-items: center;
        line-height: 3rem;
        width: 100%;
    }

.nav-item[b-lt6qdheict]  a.active {
    background-color: rgba(255,255,255,0.37);
    color: white;
}

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

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

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

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

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

        /* Allow sidebar to scroll for tall menus */
        height: calc(100vh - 3.5rem);
        overflow-y: auto;
    }
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-3fbqtj22pq],
.components-reconnect-repeated-attempt-visible[b-3fbqtj22pq],
.components-reconnect-failed-visible[b-3fbqtj22pq],
.components-pause-visible[b-3fbqtj22pq],
.components-resume-failed-visible[b-3fbqtj22pq],
.components-rejoining-animation[b-3fbqtj22pq] {
    display: none;
}

#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-retrying[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-failed[b-3fbqtj22pq],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-3fbqtj22pq] {
    display: block;
}


#components-reconnect-modal[b-3fbqtj22pq] {
    background-color: white;
    width: 20rem;
    margin: 20vh auto;
    padding: 2rem;
    border: 0;
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-3fbqtj22pq 0.5s both;
    &[open]

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

}

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

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

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

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

    100% {
        opacity: 1;
    }
}

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

    100% {
        opacity: 0;
    }
}

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

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

#components-reconnect-modal button[b-3fbqtj22pq] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    padding: 4px 24px;
    border-radius: 4px;
}

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

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

.components-rejoining-animation[b-3fbqtj22pq] {
    position: relative;
    width: 80px;
    height: 80px;
}

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

        .components-rejoining-animation div:nth-child(2)[b-3fbqtj22pq] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-3fbqtj22pq {
    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/Conversion/PendingReleaseList.razor.rz.scp.css */
tr.sticky-footer td[b-m2sfzv98t6] {
    position: sticky;
    bottom: 0;
    background-color: var(--bs-table-bg, #f8f9fa);
    box-shadow: inset 0 1px 0 var(--bs-border-color, #dee2e6);
    z-index: 2;
}
/* /Components/Pages/Revenue/SaleOrderEdit.razor.rz.scp.css */
/* Right rail. Sticky-with-offset is handled here directly rather than via
   Bootstrap's .sticky-md-top helper — that class sets `top: 0 !important`
   which silently wins over any scoped override, causing the rail to slide
   under MainLayout's .top-row navbar (also sticky, top: 0, height 3.5rem).
   The 4rem offset parks the rail cleanly below the navbar.

   Height comes from JS: printingMatchHeight sets an inline height on the
   parent .atp-split-right so the rail stays exactly as tall as the form
   column and never grows the card past the last field. */

.atp-rail[b-39efqbgkip] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    height: 100%;
}

@media (min-width: 768px) {
    .atp-rail[b-39efqbgkip] {
        /* !important on top defends against any inherited utility class
           (e.g. a leftover Bootstrap sticky-*-top somewhere) that sets
           top: 0 !important. z-index: 0 keeps the rail explicitly *below*
           MainLayout's .top-row (z-index: 1) so during scroll the navbar
           always draws on top of the rail. */
        position: sticky !important;
        top: 4.5rem !important;
        z-index: 0 !important;
    }
}

/* Two-pane splitter. Left pane gets a default flex-basis; the JS helper
   updates it as the user drags the handle. Right pane fills the rest via
   flex: 1. min-width: 0 on both allows their content to shrink below its
   natural size (default flex behaviour would refuse and blow past the
   container width). Both are flex columns so the rail inside can fill. */

.atp-split-left[b-39efqbgkip] {
    flex: 0 0 66%;
    min-width: 0;
}

.atp-split-right[b-39efqbgkip] {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.atp-split-handle[b-39efqbgkip] {
    flex: 0 0 6px;
    align-self: stretch;
    margin: 0 0.75rem;
    background: transparent;
    border-left: 2px dashed #ccc;
    cursor: col-resize;
    transition: border-color 0.15s, background-color 0.15s;
    user-select: none;
}

.atp-split-handle:hover[b-39efqbgkip] {
    border-color: #4a89dc;
    background: rgba(74, 137, 220, 0.1);
}

/* Below md: stack the panes and hide the handle — a drag splitter doesn't
   make sense when the panes are already at 100% width each. */
@media (max-width: 767.98px) {
    .atp-split[b-39efqbgkip] {
        flex-direction: column;
    }
    .atp-split-left[b-39efqbgkip],
    .atp-split-right[b-39efqbgkip] {
        flex: 1 1 auto !important;
        width: 100%;
    }
    .atp-split-handle[b-39efqbgkip] {
        display: none;
    }
}
/* /Components/Pages/Revenue/SaleOrderView.razor.rz.scp.css */
/* Compact cards on the view page. FormField renders `.row.mb-2` per field
   and `.form-control-plaintext` adds its own vertical padding — combined,
   that's about 30 px per field of pure spacing on a page that only shows
   9-12 read-only lines. Halving both keeps everything legible while
   letting the ATP photo breathe in the sticky right rail. */

.atp-compact[b-8v88cgyz6x]  .row.mb-2 {
    margin-bottom: 0.1rem !important;
}

.atp-compact[b-8v88cgyz6x]  .form-control-plaintext {
    padding-top: 0.15rem;
    padding-bottom: 0.15rem;
    min-height: unset;
}

.atp-compact[b-8v88cgyz6x]  .card-body {
    padding-top: 0.5rem;
    padding-bottom: 0.5rem;
}

.atp-compact[b-8v88cgyz6x]  .col-form-label {
    padding-top: 0.15rem;
    padding-bottom: 0.15rem;
}

/* Right rail. Same sticky offset + z-index defence as SaleOrderEdit's
   rail — MainLayout's .top-row is `position: sticky; top: 0` and would
   otherwise sit on top of us. !important guards against any inherited
   utility class that might try to override the top offset.

   Height comes from JS: printingMatchHeight sets an inline height on the
   parent .atp-split-right so the rail stays exactly as tall as the info
   column and never grows the card past the last field. */

.atp-rail[b-8v88cgyz6x] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    height: 100%;
}

@media (min-width: 768px) {
    .atp-rail[b-8v88cgyz6x] {
        position: sticky !important;
        top: 4.5rem !important;
        z-index: 0 !important;
    }
}

/* Two-pane splitter — same shape as the edit page so the operator sees the
   same widget in both places. Left pane defaults to 66 %; the JS helper
   updates it as the user drags. min-width: 0 on both panes so their
   content can shrink instead of blowing past the container width. */

.atp-split-left[b-8v88cgyz6x] {
    flex: 0 0 66%;
    min-width: 0;
}

.atp-split-right[b-8v88cgyz6x] {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.atp-split-handle[b-8v88cgyz6x] {
    flex: 0 0 6px;
    align-self: stretch;
    margin: 0 0.75rem;
    background: transparent;
    border-left: 2px dashed #ccc;
    cursor: col-resize;
    transition: border-color 0.15s, background-color 0.15s;
    user-select: none;
}

.atp-split-handle:hover[b-8v88cgyz6x] {
    border-color: #4a89dc;
    background: rgba(74, 137, 220, 0.1);
}

/* Below md: stack the panes and hide the handle. Same fallback as the
   edit page — a drag splitter doesn't make sense when the panes are
   already at 100 % width each. */
@media (max-width: 767.98px) {
    .atp-split[b-8v88cgyz6x] {
        flex-direction: column;
    }
    .atp-split-left[b-8v88cgyz6x],
    .atp-split-right[b-8v88cgyz6x] {
        flex: 1 1 auto !important;
        width: 100%;
    }
    .atp-split-handle[b-8v88cgyz6x] {
        display: none;
    }
}
/* /Components/Shared/AtpPhotoAttach.razor.rz.scp.css */
.atp-attach-thumb[b-gwl5n0d7af] {
    width: 60px;
    height: 60px;
    object-fit: cover;
}

/* Panel mode — a right-rail preview sized to match the height of the left
   column (via a cascade of flex-fill from .atp-split down to this frame).
   No more fixed aspect-ratio: the frame stretches to whatever height the
   form ended up at, and the image inside scales/pans within it.

   The frame is a plain block (NOT flex). A previous flex + overflow combo
   silently clamped the image back to 100 % of the frame — flex-shrink: 1
   is the default — so zooms above 100 % never actually grew the img. As a
   plain block, the img can freely exceed the frame; overflow: auto then
   provides scrollbars, and the printingPan JS helper turns those into a
   grab-and-drag pan gesture. */
.atp-attach-panel[b-gwl5n0d7af] {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}

.atp-attach-panel-frame[b-gwl5n0d7af] {
    flex: 1 1 auto;
    min-height: 0;        /* shrink freely to whatever height is left */
    width: 100%;
    overflow: auto;
    cursor: grab;
}

.atp-attach-panel-frame.is-panning[b-gwl5n0d7af] {
    cursor: grabbing;
}

.atp-attach-drop-panel[b-gwl5n0d7af] {
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
}

/* Image inline width is set by _zoom (%). height auto preserves the
   photo's aspect ratio. margin: 0 auto centers the image horizontally
   when it's narrower than the frame (zoom < 100 %); at 100 %+ it fills
   or overflows and the parent's overflow: auto shows scrollbars. */
.atp-attach-panel-image[b-gwl5n0d7af] {
    display: block;
    height: auto;
    max-width: none;
    margin: 0 auto;
    /* Prevent the browser from starting an image-drag on mousedown, which
       would clash with our grab-and-drag pan handler. */
    user-select: none;
    -webkit-user-drag: none;
    pointer-events: none;
}

/* Same ::deep trick as the Import dialog — Blazor scoped CSS doesn't
   reach into <InputFile>'s rendered <input>, so drops silently miss unless
   the input is stretched to cover the whole label. */
.atp-attach-drop[b-gwl5n0d7af] {
    border-style: dashed !important;
    border-width: 1px !important;
    transition: background-color 0.15s, border-color 0.15s;
}

.atp-attach-drop:hover[b-gwl5n0d7af] {
    background-color: #eaf1fb !important;
    border-color: #4a89dc !important;
}

.atp-attach-drop-active[b-gwl5n0d7af] {
    background-color: #d1e7dd !important;
    border-color: #198754 !important;
}

.atp-attach-drop[b-gwl5n0d7af]  input[type="file"] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}

.atp-attach-drop[b-gwl5n0d7af] {
    position: relative;
}
/* /Components/Shared/AtpReviewDialog.razor.rz.scp.css */
/* Photo half: takes the full modal height. Zoom is done by binding the img's
   width to a state field (see .razor), so the img can grow past 100% and
   scrollbars appear on this container. */

.atp-review-photo[b-obcozifp49] {
    height: calc(100vh - 60px);
    max-height: calc(100vh - 60px);
}

.atp-review-image[b-obcozifp49] {
    display: block;
    height: auto;
    max-width: none;      /* zoom controls width; no cap here */
    cursor: copy;         /* affordance for click-to-copy */
}
/* /Components/Shared/PasteAtpDialog.razor.rz.scp.css */
/* Drop-zone label + invisible InputFile overlay. The <input type="file">
   needs real DOM presence to receive drop events, so we keep it clickable
   and drop-target-active but hide it visually with opacity + absolute
   positioning that covers the whole label. */

.atp-dropzone[b-nptbmeu5xu] {
    min-height: 100px;
    border-style: dashed !important;
    border-width: 2px !important;
    transition: background-color 0.15s, border-color 0.15s, box-shadow 0.15s;
}

.atp-dropzone:hover[b-nptbmeu5xu] {
    background-color: #eaf1fb !important;
    border-color: #4a89dc !important;
}

/* Drag-over indicator — bright, obvious, and slightly lifted so the operator
   can see mid-drag that this is a live drop target. */
.atp-dropzone-active[b-nptbmeu5xu] {
    background-color: #d1e7dd !important;   /* Bootstrap success-subtle */
    border-color: #198754 !important;       /* Bootstrap success */
    box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);
}

/* ::deep is required because <InputFile> is a child component; without it the
   scoped-CSS attribute selector never reaches the rendered <input>, the input
   stays at the natural top-left size, and drops outside that tiny area silently
   miss. */
.atp-dropzone[b-nptbmeu5xu]  input[type="file"] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}
