/* 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: flex; align-items: center; gap: 16px; padding: 10px 16px; box-sizing: border-box; width: 100%; min-width: 0; flex-wrap: wrap; } /* 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("/cms/img/logo.png"); width: 60px; height: 60px; display: block; flex: 0 0 60px; background-size: contain; background-repeat: no-repeat; background-position: center; } /* The two toolbar rows stay together and yield horizontal space when necessary. */ .controls .buttonContainer { margin-left: auto; flex: 0 1 auto; min-width: 0; } .toolbar-row { display: flex; gap: 7px; justify-content: flex-end; margin: 3px 0; flex-wrap: wrap; } .publish-controls { opacity: 0.94; } /* 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.dangerButton { background-color: #6E4D50; } .headerButton:hover { filter: brightness(1.08); } /* Current page path and unpublished-state label. */ .controls #urlbox { flex: 1 1 320px; min-width: 0; text-align: center; 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 { flex: 0 1 auto; color: #dee2e6; text-align: right; font-size: 0.9rem; line-height: 1.4; max-width: 260px; } .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; } .filelist-content { padding: 20px; background-color: #fefefe; border: 1px solid #888; width: 400px; margin: auto; } #fileList { list-style-type: none; padding: 0; } #fileList li { padding: 10px; cursor: pointer; background-color: #f0f0f0; margin-bottom: 5px; } #pageSearch { width: 100%; padding: 9px; margin-bottom: 12px; box-sizing: border-box; } #fileList li { display: flex; gap: 6px; align-items: center; } #fileList .page-open { flex: 1; text-align: left; } .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="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; justify-content: flex-end; gap: 8px; margin-top: 12px; } /* 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; } #fileList li:hover { background-color: #e0e0e0; } .redText { color: #ff4d4d; } /* At medium widths the page path receives its own row. */ @media (max-width: 1100px) { .pageContainer .controls { gap: 12px; } .controls #urlbox { order: 3; flex-basis: 100%; text-align: left; } .controls .buttonContainer { margin-left: 0; } } /* On small screens controls stack into touch-friendly full-width rows. */ @media (max-width: 760px) { .pageContainer .controls { align-items: flex-start; padding: 12px; } .controls .logo { width: 48px; height: 48px; flex-basis: 48px; } .controls .buttonContainer, .controls .loggedInDetails, .controls #urlbox { flex-basis: 100%; max-width: none; 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; } }