@import '_content/Turbo.Portal.Chat/Turbo.Portal.Chat.7du0x9tfuj.bundle.scp.css';

/* /Components/Files/WorkspaceFilesDropZone.razor.rz.scp.css */
/* Structurally transparent: the file body is a flex column whose children
   (list / grid / empty-pad) rely on `flex: 1`, so the wrapper must re-establish
   that context while also giving the absolute overlay a positioning parent. */
.dropzone[b-vwlz8w449d] {
    position: relative;
    flex: 1;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.dropzone__overlay[b-vwlz8w449d] {
    position: absolute;
    inset: 0;
    display: none;
    align-items: center;
    justify-content: center;
    /* Drag events must keep reaching the underlying list so the enter/leave
       depth counter in JS stays balanced. */
    pointer-events: none;
    z-index: 5;
    background: rgba(var(--color-primary-rgb), 0.08);
    border: 2px dashed var(--color-primary);
    border-radius: var(--border-radius-md);
}

.dropzone.is-dragover .dropzone__overlay[b-vwlz8w449d] {
    display: flex;
}

.dropzone__inner[b-vwlz8w449d] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--spacing-sm);
    padding: var(--spacing-lg) var(--spacing-xl);
    border-radius: var(--border-radius-md);
    background: var(--color-surface);
    box-shadow: var(--shadow-md);
    color: var(--color-primary);
    font-weight: 600;
}

.dropzone__inner i[b-vwlz8w449d] {
    font-size: 1.75rem;
}
/* /Components/Files/WorkspaceFilesUploadPanel.razor.rz.scp.css */
.portal-uploads[b-s7ykfdl8yy] {
    position: fixed;
    right: var(--spacing-xl);
    bottom: var(--spacing-xl);
    width: 360px;
    max-width: calc(100vw - 2 * var(--spacing-md));
    display: flex;
    flex-direction: column;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-md);
    box-shadow: var(--shadow-md);
    z-index: 50;
    overflow: hidden;
}

.portal-uploads__head[b-s7ykfdl8yy] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--spacing-sm);
    padding: var(--spacing-sm) var(--spacing-md);
}

.portal-uploads__title[b-s7ykfdl8yy] {
    display: inline-flex;
    align-items: center;
    gap: var(--spacing-sm);
    font-size: var(--font-size-sm);
    font-weight: var(--font-weight-semibold);
    color: var(--color-text-primary);
    min-width: 0;
}

.portal-uploads__head-actions[b-s7ykfdl8yy] {
    display: inline-flex;
    align-items: center;
    gap: var(--spacing-xs);
}

.portal-uploads__icon-btn[b-s7ykfdl8yy] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: var(--border-radius-sm);
    color: var(--color-text-secondary);
    cursor: pointer;
}

.portal-uploads__icon-btn:hover[b-s7ykfdl8yy] {
    background: var(--color-surface-hover);
    color: var(--color-text-primary);
}

.portal-uploads__icon-btn--dim[b-s7ykfdl8yy] {
    color: var(--color-text-tertiary);
}

.portal-uploads__spinner[b-s7ykfdl8yy] {
    width: 14px;
    height: 14px;
    flex: none;
    border: 2px solid rgba(var(--color-primary-rgb), 0.25);
    border-top-color: var(--color-primary);
    border-radius: 50%;
    animation: portal-uploads-spin-b-s7ykfdl8yy 0.8s linear infinite;
}

@keyframes portal-uploads-spin-b-s7ykfdl8yy {
    to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
    .portal-uploads__spinner[b-s7ykfdl8yy] { animation: none; }
}

.portal-uploads__badge[b-s7ykfdl8yy] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    flex: none;
    border-radius: 50%;
    font-size: 10px;
}

.portal-uploads__badge--ok[b-s7ykfdl8yy] {
    background: var(--color-success);
    color: var(--color-on-primary, #fff);
}

.portal-uploads__done-check[b-s7ykfdl8yy] {
    flex: none;
    color: var(--color-success);
}

.portal-uploads__aggregate[b-s7ykfdl8yy] {
    height: 3px;
    background: rgba(var(--color-primary-rgb), 0.15);
}

.portal-uploads__aggregate-fill[b-s7ykfdl8yy] {
    height: 100%;
    background: var(--color-primary);
    transition: width var(--transition-fast);
}

/* Batches can hold up to 50 files; the header stays fixed and the rows scroll. */
.portal-uploads__list[b-s7ykfdl8yy] {
    overflow-y: auto;
    max-height: min(50vh, 420px);
    border-top: 1px solid var(--color-border);
}

.portal-uploads__item[b-s7ykfdl8yy] {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    padding: var(--spacing-sm) var(--spacing-md);
}

.portal-uploads__item + .portal-uploads__item[b-s7ykfdl8yy] {
    border-top: 1px solid var(--color-border);
}

.portal-uploads__item.is-queued[b-s7ykfdl8yy] {
    opacity: 0.6;
}

.portal-uploads__item-icon[b-s7ykfdl8yy] {
    flex: none;
    width: 24px;
    text-align: center;
    color: var(--color-text-secondary);
}

.portal-uploads__item-meta[b-s7ykfdl8yy] {
    flex: 1;
    min-width: 0;
}

.portal-uploads__item-name[b-s7ykfdl8yy] {
    font-size: var(--font-size-sm);
    color: var(--color-text-primary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.portal-uploads__item-sub[b-s7ykfdl8yy] {
    font-size: var(--font-size-xs);
    color: var(--color-text-secondary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.portal-uploads__item.is-failed .portal-uploads__item-sub[b-s7ykfdl8yy] {
    color: var(--color-error);
}

.portal-uploads__bar[b-s7ykfdl8yy] {
    height: 3px;
    margin-top: var(--spacing-xs);
    background: rgba(var(--color-primary-rgb), 0.15);
    border-radius: var(--border-radius-pill);
    overflow: hidden;
}

.portal-uploads__bar-fill[b-s7ykfdl8yy] {
    height: 100%;
    background: var(--color-primary);
    border-radius: var(--border-radius-pill);
    transition: width var(--transition-fast);
}

.portal-uploads__item-actions[b-s7ykfdl8yy] {
    display: inline-flex;
    align-items: center;
    gap: var(--spacing-xs);
    flex: none;
}

@media (max-width: 900px) {
    .portal-uploads[b-s7ykfdl8yy] {
        right: var(--spacing-md);
        bottom: var(--spacing-md);
    }
}
/* /Components/Pages/PublicArtifact.razor.rz.scp.css */
.artifact-share[b-dvw3lonfgw] {
    min-height: calc(100vh - 200px);
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding: var(--spacing-3xl) var(--spacing-xl);
    color: var(--color-text-primary);
}

.artifact-share__inner[b-dvw3lonfgw] {
    width: 100%;
    max-width: 720px;
}

.artifact-share__inner--message[b-dvw3lonfgw] {
    text-align: center;
    align-self: center;
}

.artifact-share__title[b-dvw3lonfgw] {
    font-size: var(--font-size-3xl);
    font-weight: var(--font-weight-semibold);
    line-height: var(--line-height-tight);
    margin: 0 0 var(--spacing-2xl);
    overflow-wrap: anywhere;
}

.artifact-share__subtitle[b-dvw3lonfgw] {
    font-size: var(--font-size-2xl);
    font-weight: var(--font-weight-normal);
    line-height: var(--line-height-tight);
    color: var(--color-text-primary);
    margin: 0 0 var(--spacing-md);
}

.artifact-share__files[b-dvw3lonfgw] {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--font-size-md);
}

.artifact-share__files th[b-dvw3lonfgw] {
    text-align: left;
    font-weight: var(--font-weight-semibold);
    color: var(--color-text-secondary);
    padding: var(--spacing-sm) var(--spacing-md);
    border-bottom: 1px solid var(--color-border);
}

.artifact-share__files td[b-dvw3lonfgw] {
    padding: var(--spacing-sm) var(--spacing-md);
    border-bottom: 1px solid var(--color-border);
    overflow-wrap: anywhere;
}

.artifact-share__files a[b-dvw3lonfgw] {
    color: var(--color-primary);
    text-decoration: none;
}

.artifact-share__files a:hover[b-dvw3lonfgw] {
    text-decoration: underline;
}

.artifact-share__col-size[b-dvw3lonfgw],
.artifact-share__col-modified[b-dvw3lonfgw] {
    white-space: nowrap;
    color: var(--color-text-secondary);
}

.artifact-share__empty[b-dvw3lonfgw] {
    color: var(--color-text-secondary);
    margin: 0;
}
/* /Components/Pages/ShareLink.razor.rz.scp.css */
.share-launch[b-unp2jvbnwu] {
    min-height: calc(100vh - 200px);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--spacing-3xl) var(--spacing-xl);
    color: var(--color-text-primary);
}

.share-launch__inner[b-unp2jvbnwu] {
    max-width: 640px;
    text-align: center;
}

.share-launch__title[b-unp2jvbnwu] {
    font-size: var(--font-size-4xl);
    font-weight: var(--font-weight-semibold);
    line-height: var(--line-height-tight);
    margin: 0 0 var(--spacing-3xl);
}

.share-launch__subtitle[b-unp2jvbnwu] {
    font-size: var(--font-size-2xl);
    font-weight: var(--font-weight-normal);
    line-height: var(--line-height-tight);
    color: var(--color-text-primary);
    margin: 0 0 var(--spacing-md);
}

.share-launch__note[b-unp2jvbnwu] {
    font-size: var(--font-size-xl);
    color: var(--color-text-primary);
    margin: 0;
}

.share-launch__note a[b-unp2jvbnwu],
.share-launch__link[b-unp2jvbnwu] {
    color: var(--color-primary);
    text-decoration: none;
    background: none;
    border: 0;
    padding: 0;
    font: inherit;
    cursor: pointer;
}

.share-launch__note a:hover[b-unp2jvbnwu],
.share-launch__link:hover[b-unp2jvbnwu] {
    text-decoration: underline;
}

.share-launch__error[b-unp2jvbnwu] {
    color: var(--color-error);
    font-size: var(--font-size-lg);
    margin: 0 0 var(--spacing-lg);
}
/* /Components/Pages/WorkspaceChat.razor.rz.scp.css */
/* Two-pane chat: room rail + active room. Fixed height so the thread scrolls, not the page. */
.workspace-chat[b-oftjerhofv] {
    display: flex;
    height: calc(100vh - 220px);
    min-height: 24rem;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-md);
    background: var(--color-surface);
    overflow: hidden;
}

.workspace-chat__rail[b-oftjerhofv] {
    flex: 0 0 12rem;
    display: flex;
    flex-direction: column;
    gap: var(--spacing-md);
    padding: var(--spacing-md);
    min-width: 0;
    overflow-y: auto;
}

.workspace-chat__section[b-oftjerhofv] {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-xxs, var(--spacing-xs));
    min-width: 0;
}

.workspace-chat__section-title[b-oftjerhofv] {
    padding: 0 var(--spacing-sm);
    color: var(--color-text-tertiary, var(--color-text-secondary));
    font-size: var(--font-size-xs);
    font-weight: var(--font-weight-semibold);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Drag to resize the rail; the JS module drives flex-basis and persists the width. */
.workspace-chat__divider[b-oftjerhofv] {
    flex: 0 0 5px;
    margin-left: -2px;
    cursor: col-resize;
    border-left: 1px solid var(--color-border);
    touch-action: none;
}

.workspace-chat__divider:hover[b-oftjerhofv],
.workspace-chat__divider:active[b-oftjerhofv] {
    border-left-color: var(--color-primary);
}

.workspace-chat__room[b-oftjerhofv] {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    padding: var(--spacing-xs) var(--spacing-sm);
    border: 0;
    border-radius: var(--border-radius-sm);
    background: none;
    color: var(--color-text-secondary);
    text-align: left;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.workspace-chat__room.is-active[b-oftjerhofv],
.workspace-chat__room:hover[b-oftjerhofv] {
    background: var(--color-surface-subtle);
    color: var(--color-text);
}

.workspace-chat__main[b-oftjerhofv] {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.workspace-chat__thread[b-oftjerhofv] {
    flex: 1 1 auto;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    gap: var(--spacing-md);
    padding: var(--spacing-md);
}

.workspace-chat__thread-header[b-oftjerhofv] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--spacing-md);
    padding: var(--spacing-sm) var(--spacing-md);
    border-bottom: 1px solid var(--color-border);
}

.workspace-chat__thread-title[b-oftjerhofv] {
    font-weight: var(--font-weight-semibold);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    margin-right: auto;
}

.workspace-chat__thread-shared[b-oftjerhofv] {
    color: var(--color-text-secondary);
    font-size: var(--font-size-sm);
    white-space: nowrap;
}

.workspace-chat__thread-shared a[b-oftjerhofv] {
    color: var(--color-primary);
    text-decoration: none;
}

.workspace-chat__thread-shared a:hover[b-oftjerhofv] {
    text-decoration: underline;
}

.workspace-chat__thread-share[b-oftjerhofv] {
    display: inline-flex;
    align-items: center;
    gap: var(--spacing-xs);
    flex: 0 0 auto;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-sm);
    background: none;
    color: var(--color-text-secondary);
    padding: var(--spacing-xs) var(--spacing-sm);
    font-size: var(--font-size-sm);
    cursor: pointer;
}

.workspace-chat__thread-share:hover[b-oftjerhofv] {
    background: var(--color-surface-active);
    color: var(--color-text-primary);
}

.workspace-chat__thread-share:disabled[b-oftjerhofv] {
    cursor: default;
    opacity: 0.6;
}

/* Header row (avatar · author · time), then the content flows vertically below it at the
   message's left edge — content never sits in a column beside the avatar. */
.workspace-chat__message[b-oftjerhofv] {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-xs);
    min-width: 0;
}

.workspace-chat__message-head[b-oftjerhofv] {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
}

.workspace-chat__author[b-oftjerhofv] {
    font-weight: var(--font-weight-semibold);
}

.workspace-chat__time[b-oftjerhofv] {
    margin-left: var(--spacing-sm);
    color: var(--color-text-tertiary, var(--color-text-secondary));
    font-size: var(--font-size-xs);
}

/* Message content renders through the shared chat pipeline (markdown, code cards, tool cards),
   which supplies its own block spacing — this container just stacks the parts. */
.workspace-chat__body[b-oftjerhofv] {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-md);
    min-width: 0;
    overflow-wrap: anywhere;
}

.workspace-chat__send-error[b-oftjerhofv] {
    padding: var(--spacing-sm) var(--spacing-md) 0;
}

.workspace-chat__empty[b-oftjerhofv] {
    color: var(--color-text-secondary);
}

.workspace-chat__composer[b-oftjerhofv] {
    display: flex;
    gap: var(--spacing-sm);
    padding: var(--spacing-md);
    border-top: 1px solid var(--color-border);
}

/* Unread dot: sits at the rail entry's right edge; the flexed label truncates before it. */
.workspace-chat__unread[b-oftjerhofv] {
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    margin-left: auto;
    border-radius: 50%;
    background: var(--color-primary);
}
/* /Components/Pages/WorkspaceFiles.razor.rz.scp.css */

/* ── Preview overlay ─────────────────────────────────────────────────────────
   Portal-side file viewer opened from a preview file-association row. */
.portal-preview[b-ou2i9yylin] {
    position: fixed;
    inset: 0;
    z-index: var(--z-index-modal);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--spacing-xl);
    background: rgba(0, 0, 0, 0.7);
    outline: none;
}

.portal-preview__panel[b-ou2i9yylin] {
    display: flex;
    flex-direction: column;
    max-width: min(1100px, 94vw);
    max-height: 90vh;
    min-width: 320px;
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-lg);
    background: var(--color-surface);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
}

.portal-preview__head[b-ou2i9yylin] {
    display: flex;
    align-items: center;
    gap: var(--spacing-lg);
    padding: var(--spacing-sm) var(--spacing-md);
    border-bottom: 1px solid var(--color-border);
}

.portal-preview__name[b-ou2i9yylin] {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.portal-preview__action[b-ou2i9yylin] {
    display: inline-flex;
    align-items: center;
    border: 0;
    padding: 0;
    background: transparent;
    color: var(--color-link);
    font-size: var(--font-size-sm);
    cursor: pointer;
}

.portal-preview__body[b-ou2i9yylin] {
    overflow: auto;
    padding: var(--spacing-md);
}

.portal-preview__image[b-ou2i9yylin] {
    display: block;
    max-width: 100%;
    max-height: 74vh;
    margin: 0 auto;
}

.portal-preview__pdf[b-ou2i9yylin] {
    width: min(1000px, 88vw);
    height: 74vh;
}

.portal-preview__text[b-ou2i9yylin] {
    margin: 0;
    font-family: var(--font-family-monospace);
    font-size: var(--font-size-sm);
    line-height: 1.6;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

.portal-preview__table-wrap[b-ou2i9yylin] {
    overflow: auto;
}

.portal-preview__table[b-ou2i9yylin] {
    border-collapse: collapse;
    font-size: var(--font-size-sm);
}

.portal-preview__table td[b-ou2i9yylin] {
    padding: var(--spacing-xs) var(--spacing-sm);
    border: 1px solid var(--color-border-light);
    white-space: nowrap;
    max-width: 320px;
    overflow: hidden;
    text-overflow: ellipsis;
}

.portal-preview__table tr:first-child td[b-ou2i9yylin] {
    background: var(--color-surface-hover);
    font-weight: var(--font-weight-semibold);
}

.portal-preview__notice[b-ou2i9yylin],
.portal-preview__error[b-ou2i9yylin],
.portal-preview__loading[b-ou2i9yylin] {
    margin: var(--spacing-sm) 0 0;
    color: var(--color-text-secondary);
    font-size: var(--font-size-sm);
}

.portal-preview__error[b-ou2i9yylin] {
    color: var(--color-error);
}
/* /Components/Rxp/RxpToolbar.razor.rz.scp.css */
/* These tokens cascade into the standard Bootstrap inputs of the child
   <RdpAccessDetails/> to re-theme them for the dark popover, without ::deep.
   Buttons set their own --bs-btn-* so they keep Bootstrap defaults here. */

.portal-rxp-tb-connect[b-rr0z8fb2lb] {
    --color-surface: var(--rxp-input-bg);
    --bs-body-color: var(--rxp-text);
    --bs-border-color: var(--rxp-border);
}
/* /Components/Shared/PortalSessionTaskbar.razor.rz.scp.css */
/* Sits just after the brand, left-aligned, set off by whitespace (padding-left) so the switcher
   reads as its own group without a divider line competing with the app identity. flex:1 lets it
   fill the gap up to the topbar-end so the scroll container always has slack; min-width:0 +
   overflow let it shrink and scroll when sessions pile up. */
.session-taskbar[b-agvnivu8sf] {
    display: flex;
    align-items: center;
    align-self: stretch;
    flex: 1 1 auto;
    min-width: 0;
    gap: var(--spacing-sm);
    overflow: hidden;
    padding-left: var(--spacing-lg);
}

/* flex:1 so the scroll box fills the strip rather than shrink-wrapping the pills. A content-sized
   overflow-x:auto box paints a phantom scrollbar from sub-pixel rounding even when everything fits;
   keeping clientWidth ahead of the pills until they truly overflow avoids it. The native scrollbar
   is hidden - overflow is driven by the arrow buttons instead (a raw scrollbar reads badly in the
   topbar), but the box stays scrollable for trackpad swipe and programmatic scrollBy. */
.session-taskbar__scroll[b-agvnivu8sf] {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    flex: 1 1 auto;
    min-width: 0;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-width: none;          /* Firefox */
    -ms-overflow-style: none;       /* legacy Edge */
}

.session-taskbar__scroll[b-agvnivu8sf]::-webkit-scrollbar {
    display: none;                  /* WebKit / Blink */
}

/* Hidden until the pills overflow; the JS module adds .session-taskbar--scrollable. */
.session-taskbar__arrow[b-agvnivu8sf] {
    display: none;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
    width: 22px;
    height: 30px;
    padding: 0;
    border: none;
    border-radius: var(--border-radius-sm);
    background: none;
    color: var(--color-text-secondary);
    cursor: pointer;
}

.session-taskbar--scrollable .session-taskbar__arrow[b-agvnivu8sf] {
    display: inline-flex;
}

.session-taskbar__arrow:hover[b-agvnivu8sf] {
    color: var(--color-text-primary);
    background: var(--color-surface-hover);
}

/* Both arrows stay put when scrollable; the dead-direction one greys out rather than vanishing, so
   the strip keeps a stable width (no shift) and the controls read as a consistent pair. */
.session-taskbar__arrow:disabled[b-agvnivu8sf] {
    opacity: 0.3;
    cursor: default;
}

.session-taskbar__arrow i[b-agvnivu8sf] {
    font-size: var(--font-size-sm);
}

.session-taskbar__pill[b-agvnivu8sf] {
    /* 230px ideal, but shrink-to-fit (flex-shrink:1) down to min-width when the strip is crowded,
       like browser tabs - a shared flex-basis means every pill shrinks by the same ratio, so they
       stay equal width and the close buttons keep aligning. The scrollbar only appears once they hit
       min-width and still overflow. flex-grow:0 keeps them from stretching wide when only a few are
       open. The 140px floor fits the widest fixed anatomy (3-icon cluster 40px + "+N" chip ~24px +
       close 18px + gaps/padding/borders ~26px) with a sliver of title left; below that the close
       button would be pushed past the pill edge. */
    flex: 0 1 230px;
    min-width: 140px;
    max-width: 230px;
    display: flex;
    align-items: center;
    gap: var(--spacing-xs);
    height: 32px;
    /* Asymmetric per the design: a touch more room before the icon than after the close. */
    padding: 0 var(--spacing-xs) 0 var(--spacing-sm);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-pill);
    background: var(--color-surface);
    cursor: pointer;
    transition: border-color 0.12s, background 0.12s;
}

.session-taskbar__pill:hover[b-agvnivu8sf] {
    border-color: var(--color-primary);
    background: var(--color-surface);
}

.session-taskbar__pill:focus-visible[b-agvnivu8sf] {
    outline: 2px solid var(--color-border-focus);
    outline-offset: 1px;
}

.session-taskbar__pill--active[b-agvnivu8sf] {
    border-color: var(--color-primary);
    background: rgba(var(--color-primary-rgb), 0.04);
}

.session-taskbar__pill--ended[b-agvnivu8sf] {
    opacity: 0.65;
}

.session-taskbar__name[b-agvnivu8sf] {
    flex: 1 1 0;
    /* min-width:0 overrides the flex default (auto) so the item can shrink below content and ellipsize. */
    min-width: 0;
    font-size: var(--font-size-base);
    font-weight: 500;
    color: var(--color-text-primary);
}

/* Running apps beyond the icon-cluster cap. Sits after the (truncatable) name so the count
   survives even when the joined title ellipsizes. */
.session-taskbar__more[b-agvnivu8sf] {
    flex: 0 0 auto;
    padding: calc(var(--spacing-xs) / 2) var(--spacing-xs);
    font-size: var(--font-size-xs);
    font-weight: 700;
    line-height: 1;
    color: var(--color-text-secondary);
    background: var(--color-surface-hover);
    border-radius: var(--border-radius-sm);
}

/* Active pill keeps the base weight: the border + background tint already mark it, and a
   500->600 bump visibly widens the name (the pill jitters) the moment a pill activates. */
/* /Components/Shared/SessionInstance.razor.rz.scp.css */
/* Lays the session surface beside the docked assistant. The session host gives this its full slot
   (.portal-session-slot > * { flex: 1 1 auto }); main takes the rest, the dock is fixed-width. */
.session-dock-layout[b-0o5zsznlcb] {
    display: flex;
    flex-direction: row;
    height: 100%;
    min-height: 0;
}

.session-dock-layout__main[b-0o5zsznlcb] {
    flex: 1 1 auto;
    min-width: 0;
    min-height: 0;
    display: flex;
    flex-direction: column;
}
/* /Components/Shared/SessionPreviewPopover.razor.rz.scp.css */
.session-taskbar__preview[b-z0k0gcqjqo] {
    position: fixed;
    top: calc(var(--app-shell-topbar-height, 56px) + 8px);
    /* Must match PREVIEW_W in PortalSessionTaskbar.razor.js (it clamps the popover's left). */
    width: 340px;
    z-index: 40;
    background: var(--color-surface);
    border: 1px solid var(--color-border);
    border-radius: var(--border-radius-md);
    box-shadow: var(--shadow-md);
    overflow: hidden;
    cursor: pointer;
    animation: session-preview-pop-b-z0k0gcqjqo 120ms ease;
}

@keyframes session-preview-pop-b-z0k0gcqjqo {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
    .session-taskbar__preview[b-z0k0gcqjqo] {
        animation: none;
    }
}

.session-taskbar__preview-header[b-z0k0gcqjqo] {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    padding: var(--spacing-sm) var(--spacing-md);
    border-bottom: 1px solid var(--color-border);
}

.session-taskbar__preview-heading[b-z0k0gcqjqo] {
    flex: 1 1 auto;
    min-width: 0;
}

.session-taskbar__preview-name[b-z0k0gcqjqo] {
    font-size: var(--font-size-base);
    font-weight: 600;
    color: var(--color-text-primary);
}

.session-taskbar__preview-subtitle[b-z0k0gcqjqo] {
    font-size: var(--font-size-sm);
    color: var(--color-text-secondary);
}

.session-taskbar__preview-media[b-z0k0gcqjqo] {
    position: relative;
    aspect-ratio: 16 / 9;
    overflow: hidden;
}

/* Session icon on a blank surface, shown until a frame loads. */
.session-taskbar__preview-placeholder[b-z0k0gcqjqo] {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--color-background);
}

.session-taskbar__preview-placeholder .session-taskbar__icon[b-z0k0gcqjqo] {
    width: 34px;
    height: 34px;
}

.session-taskbar__preview-media--has-frame .session-taskbar__preview-placeholder[b-z0k0gcqjqo] {
    display: none;
}

.session-taskbar__preview-thumb[b-z0k0gcqjqo] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    /* Hidden until the frame loads (onload adds --has-frame); the placeholder shows meanwhile. */
    display: none;
    /* paintPreview sizes the box to the frame's aspect, so this fills it with no bars or crop. */
    object-fit: contain;
    background: var(--color-terminal-bg);
}

.session-taskbar__preview-media--has-frame .session-taskbar__preview-thumb[b-z0k0gcqjqo] {
    display: block;
}

.session-taskbar__preview-term[b-z0k0gcqjqo] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: var(--spacing-sm);
    overflow: hidden;
    font-family: var(--font-family-monospace);
    /* Thumbnail density, not reading size: slightly below the smallest text token so the preview
       can show enough terminal columns without introducing another type size. */
    font-size: calc(var(--font-size-xs) * 0.75);
    line-height: var(--line-height-tight);
    background: var(--color-terminal-bg);
    color: rgba(var(--color-terminal-fg-rgb), 0.9);
}

/* The apps section owns its top divider, so the card reads cleanly with or without it. */
.session-taskbar__preview-apps[b-z0k0gcqjqo] {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-xs);
    padding: var(--spacing-sm) var(--spacing-md);
    border-top: 1px solid var(--color-border);
}

.session-taskbar__preview-app[b-z0k0gcqjqo] {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    min-width: 0;
}

/* Each running app is its own click target (focus that app), distinct from the card's
   session-level activate. Padding + matching negative margin lets the hover fill cleanly without
   indenting the row content. */
.session-taskbar__preview-app--clickable[b-z0k0gcqjqo] {
    padding: var(--spacing-xs) var(--spacing-sm);
    margin: 0 calc(-1 * var(--spacing-sm));
    border-radius: var(--border-radius-sm);
    cursor: pointer;
    transition: background-color var(--transition-fast);
}

.session-taskbar__preview-app--clickable:hover[b-z0k0gcqjqo] {
    background: var(--color-surface-hover);
}

.session-taskbar__preview-app-title[b-z0k0gcqjqo] {
    flex: 1 1 0;
    min-width: 0;
    font-size: var(--font-size-base);
    color: var(--color-text-primary);
}

.session-taskbar__preview-actions[b-z0k0gcqjqo] {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: var(--spacing-sm);
    padding: var(--spacing-sm) var(--spacing-md);
    border-top: 1px solid var(--color-border);
    background: var(--color-background);
    /* The card's body click activates an inactive session; the footer is its own surface. */
    cursor: default;
}

.session-taskbar__preview-actions .btn i[b-z0k0gcqjqo] {
    margin-right: var(--spacing-xs);
}
/* /Components/Shared/SessionTopbarTabs.razor.rz.scp.css */
.session-tabs[b-lg47njnmfi] {
    display: flex;
    align-items: center;
    gap: var(--spacing-lg);
}

/* Persistent accent for the active tab (.app-shell__icon-button only tints on hover). */
.session-tab--active[b-lg47njnmfi] {
    color: var(--color-primary);
    background: var(--color-surface-hover);
}

.session-tabs__divider[b-lg47njnmfi] {
    width: 1px;
    align-self: stretch;
    margin: var(--spacing-xs) 0;
    background: var(--color-border);
}
/* /Components/Shared/SessionView.razor.rz.scp.css */
.portal-session-body[b-an85s1vws0] {
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

.portal-terminal-surface[b-an85s1vws0] {
    /* position:relative scopes the loading overlay's position:absolute box to the
       terminal surface, so the overlay fills the same rectangle xterm draws into
       and not the page. Square and full-bleed: the surface fills the body row, so
       it carries no border or radius of its own. */
    position: relative;
    flex: 1;
    min-height: 0;
    min-width: 0;
    padding: var(--spacing-md);
    background: var(--color-terminal-bg);
    overflow: hidden;
}

/* Remote-Desktop tab body — sits below the tab strip when active. flex:1 fills the
   same row the terminal would, so switching tabs doesn't change the panel's vertical
   real estate. position:relative scopes the loading overlay's position:absolute box to
   this container, so the splash fills only the desktop surface — without this the
   overlay escapes to the nearest positioned ancestor (the page root) and covers the
   topbar tabs, trapping the user on the splash. */
.portal-rdp-handoff[b-an85s1vws0] {
    position: relative;
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
    min-width: 0;
    gap: 0;
    padding: 0;
    overflow: hidden;
}

.portal-rxp-frame[b-an85s1vws0] {
    flex: 1;
    min-height: 0;
    width: 100%;
    background: var(--color-terminal-bg);
}

/* Empty-state placeholder for the Desktop surface — shown when there's no remote
   desktop to render (PTY app). Fills the same square, borderless rectangle the iframe
   would occupy, so switching tabs doesn't change the box layout; only the body swaps
   between the iframe and this informational copy. */
.portal-rdp-handoff__placeholder[b-an85s1vws0] {
    flex: 1;
    min-height: 24rem;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    background: var(--color-terminal-bg);
    color: rgba(var(--color-terminal-fg-rgb), 0.92);
    padding: var(--spacing-xl);
}

.portal-rdp-handoff__placeholder h3[b-an85s1vws0] {
    font-size: var(--font-size-xl);
    font-weight: var(--font-weight-semibold);
    margin: 0;
    color: rgba(var(--color-terminal-fg-rgb), 0.96);
}

.portal-diagnostics-surface[b-an85s1vws0] {
    flex: 1;
    min-height: 0;
    min-width: 0;
    overflow: auto;
    padding: var(--spacing-lg);
}

/* Pre-connect loading / failure splash. Fills its host surface (terminal or desktop),
   which clips it — the splash carries no radius of its own so it reaches the corners
   in every context. */
.portal-terminal-loading[b-an85s1vws0] {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--color-terminal-bg);
    z-index: 1;
}

.portal-terminal-loading__card[b-an85s1vws0] {
    width: min(28rem, calc(100% - 2 * var(--spacing-xl)));
    text-align: center;
    color: rgba(var(--color-terminal-fg-rgb), 0.92);
}

.portal-terminal-loading__progress[b-an85s1vws0] {
    width: 100%;
    height: 4px;
    background: rgba(var(--color-terminal-fg-rgb), 0.08);
    border-radius: var(--border-radius-pill);
    overflow: hidden;
    margin-bottom: var(--spacing-lg);
}

.portal-terminal-loading__progress-bar[b-an85s1vws0] {
    height: 100%;
    width: 30%;
    background: linear-gradient(
        90deg,
        rgba(var(--color-primary-rgb), 0)   0%,
        rgba(var(--color-primary-rgb), 1)  50%,
        rgba(var(--color-primary-rgb), 0) 100%
    );
    border-radius: var(--border-radius-pill);
    animation: portal-terminal-loading-shimmer-b-an85s1vws0 1.8s ease-in-out infinite;
}

@keyframes portal-terminal-loading-shimmer-b-an85s1vws0 {
    0%   { transform: translateX(-110%); }
    100% { transform: translateX(440%); }
}

.portal-terminal-loading__title[b-an85s1vws0] {
    font-size: var(--font-size-xl);
    font-weight: var(--font-weight-semibold);
    margin: 0 0 var(--spacing-sm);
    color: rgba(var(--color-terminal-fg-rgb), 0.96);
    animation: portal-terminal-loading-pulse-b-an85s1vws0 2.4s ease-in-out infinite;
}

.portal-terminal-loading__subtitle[b-an85s1vws0] {
    font-size: var(--font-size-base);
    color: rgba(var(--color-terminal-fg-rgb), 0.62);
    margin: 0;
}

@keyframes portal-terminal-loading-pulse-b-an85s1vws0 {
    0%, 100% { opacity: 0.92; }
    50%      { opacity: 0.72; }
}

/* Failure layout: the error glyph sits inline with the title (not the loading state's
   stacked shimmer-bar + title), then the reason, then a single recovery action. */
.portal-terminal-loading__heading[b-an85s1vws0] {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--spacing-sm);
    margin-bottom: var(--spacing-sm);
}

.portal-terminal-loading__heading .portal-terminal-loading__title[b-an85s1vws0] {
    margin: 0;
}

.portal-terminal-loading__error-icon[b-an85s1vws0] {
    font-size: var(--font-size-xl);
    line-height: 1;
    color: var(--color-error);
}

.portal-terminal-loading--error .portal-terminal-loading__title[b-an85s1vws0] {
    animation: none;
    color: rgba(var(--color-error-rgb), 1);
}

/* Ended (PTY / cold-dead loads) is a routine destination, not an alarm: neutral title, no glyph
   (the markup omits it). */
.portal-terminal-loading--ended .portal-terminal-loading__title[b-an85s1vws0] {
    color: rgba(var(--color-terminal-fg-rgb), 0.92);
}

.portal-terminal-loading__actions[b-an85s1vws0] {
    display: flex;
    justify-content: center;
    margin-top: var(--spacing-lg);
}

@media (prefers-reduced-motion: reduce) {
    .portal-terminal-loading__progress-bar[b-an85s1vws0] {
        animation: none;
        width: 100%;
        opacity: 0.6;
    }
    .portal-terminal-loading__title[b-an85s1vws0] {
        animation: none;
    }
}
