/* Full-height application shell: the toolbar takes what it needs and the preview takes the rest. */ html, body { height: 100%; margin: 0; } body { min-height: 100vh; } .pageContainer { display: flex; flex-flow: column; height: 100%; min-height: 100vh; width: 100%; min-width: 0; } /* Dark, wrapping administration toolbar shared by wide and narrow screens. */ .pageContainer .controls { flex: 0 0 auto; min-height: 60px; position: relative; background-color: #1a1d20; border-bottom: 1px solid #1a1a1a; -webkit-box-shadow: 0 10px 13px -7px #000000, -1px -1px 15px 5px rgba(0, 0, 0, 0); box-shadow: 0 10px 13px -7px #000000, -1px -1px 15px 5px rgba(0, 0, 0, 0); display: grid; grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "logo url user" "logo url buttons"; align-items: center; gap: 6px 16px; padding: 10px 16px; box-sizing: border-box; width: 100%; min-width: 0; } /* Same-origin preview iframe; JavaScript narrows its width for responsive previews. */ .pageContainer .frame { flex: 1 1 auto; display: block; width: 100%; height: 100%; min-width: 0; min-height: 0; border: 0; } /* Product mark remains a fixed size while neighbouring controls wrap around it. */ .controls .logo { background-image: url("../img/logo.png"); width: 60px; height: 60px; display: block; grid-area: logo; background-size: contain; background-repeat: no-repeat; background-position: center; } /* Top right: user and Log out; the menu buttons sit directly beneath them. */ .controls .buttonContainer { grid-area: buttons; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px 12px; } .toolbar-row { display: flex; gap: 7px; margin: 0; } /* Shared toolbar button treatment, including keyboard focus and destructive emphasis. */ .headerButton { display: inline-flex; align-items: center; justify-content: center; min-height: 38px; padding: 8px 14px; font-family: -apple-system, BlinkMacSystemFont, 'Roboto', sans-serif; font-size: 14px; font-weight: 600; line-height: 1.2; border-radius: 6px; border: none; white-space: nowrap; cursor: pointer; background: #6E6D70; box-shadow: 0px 0.5px 1px rgba(0, 0, 0, 0.1), inset 0px 0.5px 0.5px rgba(255, 255, 255, 0.5), 0px 0px 0px 0.5px rgba(0, 0, 0, 0.12); color: #DFDEDF; user-select: none; -webkit-user-select: none; touch-action: manipulation; } .headerButton:focus { box-shadow: inset 0px 0.8px 0px -0.25px rgba(255, 255, 255, 0.2), 0px 0.5px 1px rgba(0, 0, 0, 0.1), 0px 0px 0px 3.5px rgba(58, 108, 217, 0.5); outline: 0; } .headerButton:hover { filter: brightness(1.08); } /* Current page path and unpublished-state label. */ .controls #urlbox { grid-area: url; min-width: 0; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 1.1rem; line-height: 1.3; color: #dee2e6; } .controls #urlbox div { display: inline-block; margin-left: 10px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; white-space: nowrap; } /* Compact account, role, logout, and operational-warning area. */ .controls .loggedInDetails { grid-area: user; justify-self: end; color: #dee2e6; text-align: right; font-size: 0.9rem; line-height: 1.4; } /* Name and Log out share one line. */ .controls .loggedInDetails br:first-of-type { display: none; } .controls .loggedInDetails .link-button { margin-left: 10px; } .link-button { border: 0; padding: 0; color: #9ecbff; background: transparent; cursor: pointer; } /* Legacy list support retained for installations with locally customised toolbar markup. */ .controls .buttonContainer ul { list-style-type: none; margin: 0; padding: 0; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .controls .buttonContainer li { display: block; } /* New-page dialogue: template selection followed by the destination filename. */ #newPageDialog { display: none; } .newpage-content { padding: 20px; background-color: #fefefe; border: 1px solid #888; width: 400px; margin: auto; } .newpage-content form { display: flex; flex-direction: column; } .newpage-content label { margin-bottom: 10px; } .newpage-content input[type="text"] { margin-bottom: 20px; padding: 5px; } #newPageForm label { display: block; } /* Page-picker dialogue and searchable action rows. */ #fileListDialog { display: none; } #pageSearch { width: 100%; padding: 9px; margin-bottom: 12px; box-sizing: border-box; } .cms-dialog label { display: block; margin: 12px 0; font-weight: 600; } /* Consistent form controls across SEO, scheduling, shared-content, and menu dialogues. */ .cms-dialog input[type="text"], .cms-dialog input[type="email"], .cms-dialog input[type="password"], .cms-dialog select, .cms-dialog input[type="url"], .cms-dialog input[type="datetime-local"], .cms-dialog textarea { display: block; width: 100%; margin-top: 5px; padding: 8px; box-sizing: border-box; font-weight: normal; } /* Content-editor actions sit beneath TinyMCE now that no Bootstrap modal is required. */ .editor-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-top: 12px; } /* Light, regular-weight buttons; Publish Now is the only filled one, in green. */ #editModal .editor-actions button { padding: 6px 14px; border: 1px solid #c9cfd8; border-radius: 4px; background: #fff; color: #374151; font-size: 13px; font-weight: 400; cursor: pointer; } #editModal .editor-actions button:hover { background: #f3f5f8; } #editModal .editor-actions #saveBtn { border-color: #9db8d8; color: #2f5a8a; } #editModal .editor-actions #saveBtn:hover { background: #eaf1fb; } #editModal .editor-actions .publish-now { background: #2e7d4f; border-color: #2e7d4f; color: #fff; } #editModal .editor-actions .publish-now:hover { background: #256a42; } /* Tool launcher expands to available width without requiring a row of tiny buttons. */ .tool-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; } .tool-grid button, .cms-dialog button, #fileList button { padding: 7px 10px; cursor: pointer; } /* Media cards keep previews useful while accommodating long generated filenames. */ .media-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 14px; max-height: 65vh; overflow: auto; } .media-card { display: flex; flex-direction: column; gap: 7px; padding: 10px; border: 1px solid #ccc; overflow: hidden; } .media-card img { width: 100%; height: 130px; object-fit: contain; background: #eee; cursor: pointer; } /* Reusable rows serve revisions, schedules, activity, shared blocks, and menus. */ .list-row { display: block; width: 100%; margin: 5px 0; padding: 8px; border-bottom: 1px solid #ddd; text-align: left; box-sizing: border-box; } /* Findings use a restrained warning treatment; no flashing sirens are required. */ .issue { margin: 7px 0; padding: 9px; border-left: 4px solid #b52b3a; background: #fff0f1; } /* Semantic status colours shared by checks and destructive actions. */ .success-text { color: #18733c; font-weight: 600; } .danger-text { color: #a51d2d; } .redText { color: #ff4d4d; } /* At medium widths the buttons take their own row under the user block; the path stays beside the logo. */ @media (max-width: 1100px) { .pageContainer .controls { grid-template-areas: "logo url user" "buttons buttons buttons"; } } /* On small screens controls stack into touch-friendly full-width rows; the user block stays top right. */ @media (max-width: 760px) { .pageContainer .controls { grid-template-columns: auto minmax(0, 1fr); grid-template-areas: "logo user" "url url" "buttons buttons"; padding: 12px; } .controls .logo { width: 48px; height: 48px; } .toolbar-row { flex: 1 1 100%; flex-wrap: wrap; } .controls #urlbox { text-align: left; } .controls .buttonContainer ul { gap: 8px; } .controls .buttonContainer li, .controls .buttonContainer .headerButton { width: 100%; } .controls #urlbox div { display: block; margin-left: 0; margin-top: 4px; } } /* Site scan dialogue: selectable page rows and the option group. */ #siteScanOptions { border: 1px solid #ccc; margin: 12px 0; padding: 8px 12px; } #siteScanOptions label { display: block; margin: 4px 0; } #siteScanPages { max-height: 40vh; overflow: auto; } .scan-row { display: block; cursor: pointer; } .scan-note { color: #555; font-size: 0.9em; } /* Image dialogue: thumbnail picker and address fields. */ #imagePicker img { cursor: pointer; } #imageForm label { display: block; margin: 8px 0; } #imageForm input[type="text"] { display: block; width: 100%; box-sizing: border-box; } /* Page picker: full-width table with a document icon, draft badge, and per-row actions. */ .filelist-content { padding: 4px 0 0; } .table-wrap { max-height: 60vh; overflow: auto; border: 1px solid #dfe3ea; border-radius: 8px; } .data-table { width: 100%; border-collapse: collapse; font-size: 14px; } .data-table th { position: sticky; top: 0; z-index: 1; text-align: left; padding: 10px 14px; background: #f3f5f8; color: #4b5563; font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; border-bottom: 1px solid #dfe3ea; } .data-table td { padding: 10px 14px; border-bottom: 1px solid #edf0f4; vertical-align: middle; } .data-table tbody tr:last-child td { border-bottom: 0; } .data-table tbody tr:nth-child(even) { background: #fafbfc; } .page-row { cursor: pointer; } .page-row:hover { background: #eaf1fb !important; } .page-cell { white-space: nowrap; } .doc-icon { vertical-align: middle; margin-right: 8px; color: #4a7bb7; flex: none; } .data-table .page-open { border: 0; background: none; padding: 0; font: inherit; font-weight: 600; color: #1f2937; cursor: pointer; text-align: left; } .data-table .page-open:hover, .data-table .page-open:focus { color: #2563a8; text-decoration: underline; } .page-title { color: #4b5563; } .page-date { color: #6b7280; white-space: nowrap; } .row-actions { white-space: nowrap; text-align: right; } .row-actions button, .row-button { margin-left: 4px; padding: 4px 9px; font-size: 12px; cursor: pointer; } .badge-draft { margin-left: 10px; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; background: #fff3d6; color: #8a5a00; border: 1px solid #f0d58a; } @media (max-width: 700px) { #fileList .page-title, #fileList th:nth-child(2), #fileList .page-date, #fileList th:nth-child(3) { display: none; } } /* Site scan progress bar and file count. */ #siteScanProgress { margin: 0 0 12px; } #scanProgressBar { width: 100%; height: 16px; accent-color: #4a7bb7; } #scanProgressText { margin-top: 4px; font-size: 13px; color: #4b5563; } /* Shared polish for dialogue content: stat tiles, section headings, empty states, badges. */ .stat-row { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 14px; } .stat { padding: 10px 14px; background: #f3f5f8; border: 1px solid #dfe3ea; border-radius: 8px; font-size: 13px; color: #4b5563; } .stat strong { font-size: 18px; color: #1f2937; margin-right: 2px; } .dialog-section { margin: 18px 0 8px; font-size: 14px; color: #374151; } .empty-state { padding: 18px; text-align: center; color: #6b7280; background: #fafbfc; border: 1px dashed #dfe3ea; border-radius: 8px; } .page-sub { display: block; margin: 2px 0 0 26px; font-size: 12px; font-weight: 400; color: #6b7280; white-space: normal; } .check-cell { width: 34px; text-align: center; } .data-table .page-cell strong { font-weight: 600; color: #1f2937; } .badge-pending, .badge-failed { padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; } .badge-pending { background: #e7f0fb; color: #1e5a99; border: 1px solid #bcd3ee; } .badge-failed { background: #fdeaec; color: #a51d2d; border: 1px solid #f0b8bf; } .issue { border-radius: 6px; } /* New-page templates as selectable rows. */ #radioList { display: grid; gap: 8px; margin-bottom: 14px; } .template-option { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid #dfe3ea; border-radius: 8px; cursor: pointer; } .template-option:hover { background: #f3f7fc; } .template-option:has(input:checked) { border-color: #4a7bb7; background: #eaf1fb; } .template-option .doc-icon { margin: 0; } /* Media library cards. */ .media-card { border-radius: 10px; border-color: #dfe3ea; background: #fff; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); transition: box-shadow 0.15s; } .media-card:hover { box-shadow: 0 4px 14px rgba(0, 0, 0, 0.12); } .media-card img { border-radius: 6px; } .media-card strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; } .media-card small { color: #6b7280; } /* Snackbar: bottom-centre toast for success and error messages. */ #message-bar { position: fixed; left: 50%; bottom: 28px; z-index: 100000; display: flex; align-items: center; gap: 12px; min-width: 280px; max-width: min(560px, calc(100vw - 32px)); box-sizing: border-box; padding: 12px 10px 12px 14px; background: #fff; color: #1f2937; border-left: 5px solid #18733c; border-radius: 10px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.28); font: 14px/1.4 system-ui, -apple-system, "Segoe UI", sans-serif; opacity: 0; transform: translate(-50%, 24px); pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease; } #message-bar[hidden] { display: none; } #message-bar.show { opacity: 1; transform: translate(-50%, 0); pointer-events: auto; } #message-bar.is-error { border-left-color: #a51d2d; } .snack-icon { flex: none; display: grid; place-items: center; width: 24px; height: 24px; border-radius: 50%; background: #18733c; color: #fff; font-size: 14px; font-weight: 700; } #message-bar.is-error .snack-icon { background: #a51d2d; } #message-bar.is-success .snack-icon::before { content: "\2713"; } #message-bar.is-error .snack-icon::before { content: "!"; } .snack-text { flex: 1; word-break: break-word; } .snack-close { flex: none; border: 0; background: none; padding: 0 6px; font-size: 22px; line-height: 1; color: #6b7280; cursor: pointer; } .snack-close:hover { color: #111827; } @media (prefers-reduced-motion: reduce) { #message-bar { transition: none; } } /* New-page dialogue: fill the dialogue instead of sitting in a bordered box inside it. */ .newpage-content { padding: 0; background: none; border: 0; width: auto; } #newPageForm > label[for="filename"] { margin: 4px 0 6px; font-weight: 600; } #newPageForm input[type="text"] { width: 100%; box-sizing: border-box; padding: 9px; margin-bottom: 16px; border: 1px solid #c9cfd8; border-radius: 6px; } /* Dialogue buttons use the small row-button metrics; primary actions are filled blue. */ .ui-dialog .ui-dialog-content :where(button:not([class*="tox"]):not([class*="ui-"]):not(.page-open)) { padding: 4px 9px; font-family: inherit; font-size: 12px; font-weight: 400; color: #374151; background: #fff; border: 1px solid #c9cfd8; border-radius: 4px; cursor: pointer; } .ui-dialog .ui-dialog-content :where(button:not([class*="tox"]):not([class*="ui-"]):not(.page-open)):hover { background: #f3f5f8; } .ui-dialog .ui-dialog-content button.danger-text { color: #a51d2d; } .ui-dialog .ui-dialog-content button[type="submit"], .ui-dialog .ui-dialog-content .step-next, .ui-dialog .ui-dialog-content #siteScanApply { border-color: #3b6ea5; background: #3b6ea5; color: #fff; font-weight: 600; } .ui-dialog .ui-dialog-content button[type="submit"]:hover, .ui-dialog .ui-dialog-content .step-next:hover, .ui-dialog .ui-dialog-content #siteScanApply:hover { background: #2f5a8a; } #fileList .row-actions button { padding: 4px 9px; font-size: 12px; } /* Action buttons (editor Save/Schedule/Publish, dialogue Save/Next/Apply) are a step larger than row buttons. */ #editModal .editor-actions button, .ui-dialog .ui-dialog-content button[type="submit"], .ui-dialog .ui-dialog-content .step-next, .ui-dialog .ui-dialog-content .step-back, .ui-dialog .ui-dialog-content #siteScanApply { padding: 6px 14px; font-size: 13px; } #sharedList, #menuList { margin-bottom: 16px; } /* Device-preview buttons are icon-only; the active one is highlighted. */ .viewport-button { min-width: 42px; padding: 8px 10px; } .viewport-button.active { outline: 2px solid rgba(255, 255, 255, 0.85); outline-offset: -3px; } /* New-page wizard. */ .step-indicator { margin: 0 0 4px; font-size: 12px; color: #6b7280; text-transform: uppercase; letter-spacing: .04em; } .step-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; } #menuChoice { display: grid; gap: 8px; } #newPageForm section[hidden] { display: none; } /* Wizard lists reuse the page-table look. */ #radioList, #menuChoice { display: block; margin-bottom: 14px; } #radioList .table-wrap, #menuChoice .table-wrap { max-height: 46vh; overflow: auto; } /* Users dialogue. */ #usersDialog form { margin-bottom: 8px; } #usersDialog #inviteLink { width: calc(100% - 100px); box-sizing: border-box; padding: 6px; } /* Important administrator recommendations (for example the data directory notice). */ .important-note, .cms-dialog .scan-note.important-note { color: #b3141f; font-weight: 600; } /* Media library: upload, category tabs, and file cards. */ .media-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-bottom: 10px; } .media-tabs { display: flex; flex-wrap: wrap; gap: 6px; } .media-tab[aria-selected="true"] { background: #3b6ea5 !important; border-color: #3b6ea5 !important; color: #fff !important; } .media-thumb { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; height: 130px; background: #eef2f5; color: #4a7bb7; font-weight: 600; font-size: 12px; } .media-thumb svg { width: 40px; height: 40px; } .media-actions { display: flex; flex-wrap: wrap; gap: 6px; } #mediaUploadReport:empty { display: none; } /* New page wizard sits under the page list in the Pages dialogue. */ #newPageSection { margin-top: 22px; padding-top: 6px; border-top: 1px solid #d4dde4; }