Users (Tools > Users) - Everyone can update their display name, email and password; administrators can add, edit, invite (one-time link), block and delete accounts. - Accounts in config.local.php stay locked to config (the main administrator); CMS accounts live in data/users.json. Sign-in is by login name. - Roles are now editor and administrator (publisher is an alias of editor). - Account protection: password hashes only (12-72 characters), administrator password confirmation for sensitive actions, rate-limited failures, hashed single-use invite tokens, self-lockout guards, sessions of blocked/deleted users end on the next request, every account event audited without secrets. - dataDirectory can move data outside the web root; the dashboard recommends it. Media library - Upload images, documents, video and audio, sorted into four categories by extension. - Extension allow-list; executables, scripts, HTML/SVG, archives, legacy and macro Office files refused; content sniffing; files containing code refused; PDFs with scripts refused; Office/OpenDocument packages inspected for macros and embedded objects. - Media library button in the editor inserts an image, document link, video or audio. Navigation menus, pages and interface - The site scan detects primary/secondary navigation and seeds Navigation Menus; menus can be renamed, edited and deleted but not created by the CMS; a scan button finds new navigation. - New page wizard (template, name, navigation group) in the Pages dialogue; new pages stay private drafts until published; pages can be used as templates. - Deleted pages can be recovered from the Dashboard. - Full-width top bar with the user at the top right, device icons, consistent buttons. Tests and docs updated (tests/run.php, README, ARCHITECTURE, DEVELOPMENT, CHANGELOG). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
556 lines
18 KiB
CSS
556 lines
18 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: 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; }
|