Files
neoCMS/cms/css/editor.css
T

406 lines
8.1 KiB
CSS

/* 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;
}
}