/* Unified document workspace */ .comment-page-wrap { --workspace-border: #dfe4ea; --workspace-surface: #ffffff; --workspace-muted: #f7f8fb; --workspace-accent: #4f46c8; --workspace-header-height: 58px; position: relative; /* * .page-content has zoom: 0.9 (see layouts/head-css.blade.php), which * scales every rendered box inside it -- including this dvh-based * height -- by 0.9. Dividing by 0.9 here cancels that out so the * pane fills the vertical space its dvh calc intends instead of * rendering 10% shorter than the numbers say; the smaller subtracted * offset (180px vs 224px) then gives it noticeably more room besides. */ height: calc((100dvh - 130px) / 0.9); min-height: calc(560px / 0.9); border: 1px solid var(--workspace-border); border-radius: 12px; background: var(--workspace-surface); box-shadow: 0 8px 24px rgba(15, 23, 42, .05); isolation: isolate; } .comment-doc-pane, .comment-thread-pane { border: 0; border-radius: 0; background: var(--workspace-surface); } .comment-doc-pane { min-width: 360px; padding-top: var(--workspace-header-height); border-radius: 12px 0 0 12px; } .comment-doc-pane > .comment-pane-header { position: absolute; inset: 0 0 auto 0; width: 100%; min-height: var(--workspace-header-height); z-index: 6; border-radius: 12px 12px 0 0; } .comment-thread-pane { width: clamp(320px, 24vw, 430px); min-width: 300px; margin-top: var(--workspace-header-height); border-radius: 0 12px 12px 0; transition: width .16s ease, min-width .16s ease; } #paneResizer { margin-top: var(--workspace-header-height); } .comment-pane-header { min-height: 52px; padding: 9px 14px; background: var(--workspace-muted); } .comment-pane-heading { display: flex; align-items: center; min-width: 0; gap: 8px; } .comment-pane-heading > i { color: var(--workspace-accent); font-size: 17px; } .comment-pane-heading-label { overflow: visible; text-overflow: clip; white-space: normal; line-height: 1.6; padding-block: 2px; } .doc-version-title-text { display: block; line-height: 1.6; padding-block: 2px; font-size: inherit; font-weight: inherit; } .doc-version-title-text.comment-pane-heading-label { min-width: 0; overflow: hidden; text-overflow: clip; white-space: nowrap; } .doc-version-title > i { flex: 0 0 auto; color: var(--workspace-accent); font-size: 17px; } .comment-thread-pane > .comment-pane-header { padding-top: 14px; padding-bottom: 10px; } .doc-version-layout:not(.is-collapsed) .doc-version-header { min-height: 52px; margin: -8px -8px 0; padding: 14px 14px 10px; border-bottom: 1px solid var(--workspace-border); background: var(--workspace-muted); font-size: 13px; font-weight: 600; } .doc-version-layout:not(.is-collapsed) .doc-version-title { color: inherit; font-size: inherit; font-weight: inherit; } .doc-version-layout.is-collapsed .doc-version-title, .doc-version-layout.is-resize-compact .doc-version-title, .doc-version-layout.is-opening .doc-version-title { display: none; } .side-panel-toggle { width: 32px; height: 32px; flex: 0 0 32px; display: inline-flex; align-items: center; justify-content: center; padding: 0; border: 1px solid #d7dce3; border-radius: 8px; background: var(--workspace-surface); color: #64748b; transition: color .12s ease, border-color .12s ease, background-color .12s ease; } .side-panel-toggle:hover { color: var(--workspace-accent); border-color: #b9b5ef; background: #f2f0ff; } .doc-version-layout.is-collapsed .doc-version-toggle.side-panel-toggle { width: 32px; height: 32px; flex: 0 0 32px; } .doc-version-layout.is-collapsed.is-opening .doc-version-sidebar, .doc-version-layout.is-collapsed.is-resize-compact .doc-version-sidebar { align-items: stretch; flex-direction: column; } .doc-version-layout.is-collapsed.is-opening .doc-version-header, .doc-version-layout.is-collapsed.is-resize-compact .doc-version-header { width: 100%; justify-content: flex-end; } .doc-version-layout.is-collapsed.is-opening .doc-version-toggle, .doc-version-layout.is-collapsed.is-resize-compact .doc-version-toggle { margin-inline-start: auto; margin-inline-end: 0; } .pane-resizer { position: relative; width: 10px; flex: 0 0 10px; border: 0; background: var(--workspace-muted); transition: background-color .12s ease; touch-action: none; z-index: 3; } .pane-resizer::before { content: ''; position: absolute; top: 0; bottom: 0; left: 50%; width: 1px; background: var(--workspace-border); transform: translateX(-50%); } .pane-resizer:hover, .pane-resizer.is-dragging { background: #efeffb; } .pane-resizer:hover::before, .pane-resizer.is-dragging::before { width: 2px; background: var(--workspace-accent); } .pane-resizer:hover .resizer-dots, .pane-resizer.is-dragging .resizer-dots { color: var(--workspace-accent); } .resizer-dots { position: relative; z-index: 1; gap: 2px; padding: 5px 2px; border-radius: 999px; background: var(--workspace-surface); color: #9aa4b2; box-shadow: 0 0 0 1px var(--workspace-border); } .resizer-dots span { width: 3px; height: 3px; } .doc-version-sidebar { width: 260px; min-width: 0; background: var(--workspace-muted); } .doc-version-resizer { border: 0; } .doc-version-preview { background: #eef1f5; } .added-doc-preview-surface { width: 100%; height: 100%; overflow: hidden; border: 1px solid var(--workspace-border); border-radius: 6px; background: var(--workspace-surface); } #addedDocPreviewImage { display: none; width: 100%; height: 100%; max-width: none; max-height: none; object-fit: contain; object-position: center; } /* Images scale to fill the preview area, like PDFs, instead of staying at natural size. */ .main-doc-image-preview { height: 100%; padding: 12px; background: #f8f9fa; box-sizing: border-box; } .main-doc-image-preview img { display: block; width: 100%; height: 100%; object-fit: contain; object-position: center; border: 1px solid var(--workspace-border); border-radius: 6px; background: var(--workspace-surface); } /* In full screen, give images the whole screen. */ .comment-doc-pane:fullscreen .main-doc-image-preview, .comment-doc-pane.is-document-fullscreen .main-doc-image-preview, .comment-doc-pane:fullscreen #addedDocPreviewPane:has(#addedDocPreviewImage[src]), .comment-doc-pane.is-document-fullscreen #addedDocPreviewPane:has(#addedDocPreviewImage[src]) { padding: 0 !important; } .comment-doc-pane:fullscreen .main-doc-image-preview img, .comment-doc-pane.is-document-fullscreen .main-doc-image-preview img, .comment-doc-pane:fullscreen .added-doc-preview-surface:has(#addedDocPreviewImage[src]), .comment-doc-pane.is-document-fullscreen .added-doc-preview-surface:has(#addedDocPreviewImage[src]) { border: 0; border-radius: 0; } .doc-version-layout.is-collapsed .doc-version-sidebar { width: 58px; padding: 8px 0; border-right: 0; flex-direction: column; align-items: center; justify-content: flex-start; gap: 8px; overflow-x: hidden; overflow-y: auto; } .doc-version-layout.is-collapsed .doc-version-header { width: 100%; height: 42px; flex: 0 0 42px; align-self: stretch; justify-content: center; position: relative; } .doc-version-layout.is-collapsed:not(.is-opening):not(.is-resize-compact) .doc-version-toggle { position: absolute; left: 50%; margin: 0 !important; transform: translateX(-50%); } .doc-version-layout.is-collapsed:not(.is-opening):not(.is-resize-compact) .doc-version-header, .doc-version-layout.is-collapsed:not(.is-opening):not(.is-resize-compact) .doc-version-list { transform: translateX(5px); } .doc-version-layout.is-collapsed .doc-version-list { width: 100%; flex: 0 0 auto; align-self: stretch; flex-flow: column nowrap !important; align-items: center; gap: 4px; overflow: hidden; } .doc-version-layout.is-collapsed .doc-version-list .nav-link { width: 36px; height: 36px; flex: 0 0 36px; margin-inline: auto !important; padding: 2px; border-radius: 8px; } .doc-version-layout.is-collapsed .doc-version-section, .doc-version-layout.is-collapsed .doc-version-section-body { display: flex; flex: 0 0 auto; width: 100%; margin: 0; flex-direction: column; align-items: center; } .comment-page-wrap.is-comments-collapsed .comment-thread-pane, .comment-thread-pane.is-collapsed { width: 54px !important; min-width: 54px !important; } .comment-thread-pane.is-collapsed .comment-pane-header { height: 100%; min-height: 0; padding: 14px 10px 10px; align-items: flex-start; justify-content: center; border-bottom: 0; } .comment-thread-pane.is-collapsed .comment-pane-heading, .comment-thread-pane.is-collapsed .pane-tab-content { display: none !important; } .comment-page-wrap.is-resizing .comment-thread-pane, .comment-page-wrap.is-resizing .comment-doc-pane, .comment-page-wrap.is-resizing .doc-version-sidebar { transition: none !important; } .comment-page-wrap.is-resizing .comment-thread-pane { min-width: 54px !important; } .comment-thread-pane.is-opening .comment-pane-heading, .comment-thread-pane.is-opening .pane-tab-content, .comment-thread-pane.is-resize-compact .comment-pane-heading, .comment-thread-pane.is-resize-compact .pane-tab-content { opacity: 0; pointer-events: none; } body.is-workspace-resizing, body.is-workspace-resizing * { cursor: col-resize !important; } html[data-bs-theme="dark"] .comment-page-wrap, html[data-layout-mode="dark"] .comment-page-wrap, body[data-bs-theme="dark"] .comment-page-wrap, body[data-layout-mode="dark"] .comment-page-wrap { --workspace-border: #3b4654; --workspace-surface: #252e39; --workspace-muted: #202833; --workspace-accent: #9b8cff; box-shadow: 0 8px 26px rgba(0, 0, 0, .2); } html[data-bs-theme="dark"] .doc-version-preview, html[data-layout-mode="dark"] .doc-version-preview, body[data-bs-theme="dark"] .doc-version-preview, body[data-layout-mode="dark"] .doc-version-preview { background: #1b222b; } html[data-bs-theme="dark"] .side-panel-toggle, html[data-layout-mode="dark"] .side-panel-toggle, body[data-bs-theme="dark"] .side-panel-toggle, body[data-layout-mode="dark"] .side-panel-toggle { border-color: #465365; color: #c4cedb; } html[data-bs-theme="dark"] .side-panel-toggle:hover, html[data-layout-mode="dark"] .side-panel-toggle:hover, body[data-bs-theme="dark"] .side-panel-toggle:hover, body[data-layout-mode="dark"] .side-panel-toggle:hover { border-color: #786ce0; background: #353154; color: #c8c1ff; } @media (max-width: 991.98px) { .comment-page-wrap { height: auto; min-height: 0; border: 0; border-radius: 0; box-shadow: none; background: transparent; } .comment-doc-pane { padding-top: 0; } .comment-doc-pane > .comment-pane-header { position: static; width: auto; min-height: 52px; border-radius: 10px 10px 0 0; } #paneResizer, .comment-thread-pane { margin-top: 0; } .doc-version-layout.is-collapsed .doc-version-sidebar { width: 100%; max-width: 100%; justify-content: flex-start; flex-direction: row; overflow-x: auto; overflow-y: hidden; } .doc-version-layout.is-collapsed .doc-version-header { width: 42px; flex: 0 0 42px; align-self: center; } .doc-version-layout.is-collapsed:not(.is-opening):not(.is-resize-compact) .doc-version-header, .doc-version-layout.is-collapsed:not(.is-opening):not(.is-resize-compact) .doc-version-list { transform: none; } .doc-version-layout.is-collapsed .doc-version-list { width: auto; flex: 1 1 auto; align-self: center; flex-flow: row nowrap !important; justify-content: flex-start; overflow: visible; } .doc-version-layout.is-collapsed .doc-version-section, .doc-version-layout.is-collapsed .doc-version-section-body { width: auto; flex-direction: row; } .comment-doc-pane { min-width: 0; border-radius: 10px; } .comment-thread-pane, .comment-page-wrap.is-comments-collapsed .comment-thread-pane, .comment-thread-pane.is-collapsed { width: 100% !important; min-width: 0 !important; flex-basis: auto; border-radius: 10px; } .comment-thread-pane.is-collapsed .comment-pane-header { height: auto; min-height: 48px; align-items: center; justify-content: space-between; } .comment-thread-pane.is-collapsed .comment-pane-heading { display: flex !important; } .comment-thread-pane.is-collapsed .comment-pane-heading .badge { display: inline-flex; } } /* * The unified-workspace rules above set an unconditional * `.doc-version-sidebar { width: 260px }` with no media guard. A later * unconditional rule beats an earlier media-guarded one at equal * specificity, so that 260px silently wins over the mobile * `width: 100%` override further up this file, pinning the version * sidebar to a fixed desktop width on phones and clipping its * contents. Re-assert the mobile width here, last in the cascade, so * it always wins below the tablet breakpoint. */ @media (max-width: 991.98px) { .doc-version-sidebar { width: 100%; min-width: 0; } } /* * Responsive review workspace * * Keep the desktop split-pane experience, but turn the document viewer * into a true stacked workspace on tablets and phones. This final layer * intentionally comes after the legacy responsive rules above so saved * collapsed widths and older fixed pane heights cannot clip the version * rail or the preview at narrow viewport widths. */ @media (max-width: 991.98px) { .comment-page-wrap, .comment-page-wrap.is-comments-collapsed { display: flex; flex-direction: column; gap: 16px; width: 100%; height: auto; min-height: 0; overflow: visible; margin-bottom: 24px; } .comment-page-wrap > *, .comment-doc-pane, .comment-thread-pane, .doc-version-layout, .doc-version-sidebar, .doc-version-preview { min-width: 0 !important; max-width: 100%; box-sizing: border-box; } .comment-doc-pane { width: 100%; height: auto; min-height: 0; max-height: none; flex: 0 0 auto; overflow: hidden; border: 1px solid var(--workspace-border); border-radius: 12px; } .comment-doc-pane > div[style*="flex: 1 1 0"] { flex: 0 0 auto !important; width: 100%; height: auto; overflow: visible !important; } .doc-version-layout, .doc-version-layout.is-collapsed { display: flex; flex-direction: column; width: 100%; height: auto; min-height: 0; } .doc-version-resizer, #paneResizer { display: none !important; } .doc-version-sidebar, .doc-version-layout.is-collapsed .doc-version-sidebar { width: 100% !important; max-width: 100%; min-height: 0; max-height: none; flex: 0 0 auto; display: flex; flex-direction: column; align-items: stretch; gap: 8px; padding: 10px 12px; overflow: hidden; border-right: 0; border-bottom: 1px solid var(--workspace-border); } .doc-version-layout.is-collapsed .doc-version-header, .doc-version-layout.is-collapsed:not(.is-opening):not(.is-resize-compact) .doc-version-header { width: 100%; height: auto; min-height: 36px; flex: 0 0 auto; align-self: stretch; justify-content: space-between; transform: none; } .doc-version-layout.is-collapsed .doc-version-title { display: flex; } .doc-version-layout.is-collapsed .doc-version-title-text, .doc-version-layout.is-collapsed .doc-version-section-header, .doc-version-layout.is-resize-compact .doc-version-title-text, .doc-version-layout.is-opening .doc-version-title-text { display: block; opacity: 1; pointer-events: auto; } .doc-version-toggle { display: none !important; } .doc-version-list.nav, .doc-version-layout.is-collapsed .doc-version-list { display: flex; width: 100%; flex: 0 0 auto; flex-flow: row nowrap !important; align-items: stretch; gap: 8px; margin: 0; padding: 1px 2px 7px; overflow-x: auto; overflow-y: hidden; opacity: 1; pointer-events: auto; transform: none; scroll-snap-type: x proximity; overscroll-behavior-inline: contain; scrollbar-width: thin; } .doc-version-list .doc-version-tab, .doc-version-layout.is-collapsed .doc-version-list .nav-link { width: auto; min-width: 190px; max-width: min(280px, 75vw); height: auto; min-height: 44px; flex: 0 0 auto; justify-content: flex-start; margin: 0 !important; padding: 7px 9px; scroll-snap-align: start; } .doc-version-layout.is-collapsed .doc-version-name { display: block; } .doc-version-list .doc-version-section, .doc-version-list .doc-version-section-body, .doc-version-layout.is-collapsed .doc-version-section, .doc-version-layout.is-collapsed .doc-version-section-body { width: auto; flex: 0 0 auto; flex-direction: row; align-items: stretch; margin: 0; } .doc-version-list .doc-version-section-header { display: none; } .doc-version-preview { width: 100%; height: clamp(480px, 62vh, 720px); flex: 0 0 auto; overflow: hidden; } .doc-version-preview iframe, .doc-version-preview img { max-width: 100%; } .comment-thread-pane, .comment-page-wrap.is-comments-collapsed .comment-thread-pane, .comment-thread-pane.is-collapsed { width: 100% !important; height: auto; min-height: 420px; max-height: none; flex: 0 0 auto; overflow: hidden; border: 1px solid var(--workspace-border); border-radius: 12px; } .comment-thread-pane.is-collapsed .pane-tab-content { display: flex !important; } .comment-thread-pane .pane-tab-content { min-height: 360px; } } @media (max-width: 575.98px) { .comment-page-wrap { gap: 12px; margin-inline: 0; } .comment-doc-pane > .comment-pane-header { padding: 10px; } .comment-doc-pane .comment-pane-header > .d-flex { display: grid !important; grid-template-columns: 36px minmax(0, 1fr) minmax(0, 1fr); gap: 6px !important; } .comment-doc-pane .comment-pane-header .btn { width: 100%; min-width: 0; padding-inline: 7px; } .doc-version-sidebar, .doc-version-layout.is-collapsed .doc-version-sidebar { padding: 9px 10px; } .doc-version-list .doc-version-tab, .doc-version-layout.is-collapsed .doc-version-list .nav-link { min-width: min(220px, 76vw); max-width: 76vw; } .doc-version-preview { height: clamp(420px, 60vh, 620px); } .comment-thread-pane, .comment-page-wrap.is-comments-collapsed .comment-thread-pane, .comment-thread-pane.is-collapsed { min-height: 440px; } }