White-label multi-domain tuki (Noxus Intra)

- CSS-muuttujat: kaikki kovakoodatut #0f3460/#16213e korvattu var(--primary-color)/var(--primary-dark)
- Uudet API-endpointit: branding (julkinen, domain-pohjainen), company_logo, company_logo_upload
- Domain-pohjainen brändäys: HTTP_HOST → yrityksen domains-arrayn matchaus
- Login: domain asettaa oletusyrityksen sessioon
- check_auth: palauttaa branding-objektin (primary_color, subtitle, logo_url)
- company_create/update: käsittelee domains, primary_color, subtitle, logo_file
- Dynaaminen login-sivu, header ja footer (logo, nimi, alaotsikko, värit)
- JS: loadBranding(), applyBranding(), yritysvaihdon brändäyspäivitys
- Admin-paneeli: brändäysasetukset (logo-upload, väri, alaotsikko, domainit)
- Git-repo siirretty intra.noxus.fi:hin

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 13:44:49 +02:00
parent 918a5ff120
commit 095dc90b6f
4 changed files with 381 additions and 54 deletions

View File

@@ -1,3 +1,10 @@
:root {
--primary-color: #0f3460;
--primary-dark: #16213e;
--primary-light: color-mix(in srgb, var(--primary-color) 10%, white);
--primary-hover: color-mix(in srgb, var(--primary-color) 85%, black);
}
* {
margin: 0;
padding: 0;
@@ -17,7 +24,7 @@ body {
align-items: center;
justify-content: center;
min-height: 100vh;
background: linear-gradient(135deg, #0f3460, #16213e);
background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
}
.login-box {
@@ -34,7 +41,7 @@ body {
.login-box h1 {
font-size: 1.8rem;
margin-bottom: 0.5rem;
color: #0f3460;
color: var(--primary-color);
}
.login-box p {
@@ -54,13 +61,13 @@ body {
.login-box input:focus {
outline: none;
border-color: #0f3460;
border-color: var(--primary-color);
}
.login-box button {
width: 100%;
padding: 12px;
background: #0f3460;
background: var(--primary-color);
color: #fff;
border: none;
border-radius: 8px;
@@ -70,7 +77,7 @@ body {
}
.login-box button:hover {
background: #16213e;
background: var(--primary-dark);
}
.error {
@@ -88,7 +95,7 @@ body {
.forgot-link {
display: inline-block;
margin-top: 1rem;
color: #0f3460;
color: var(--primary-color);
font-size: 0.85rem;
text-decoration: none;
opacity: 0.7;
@@ -110,7 +117,7 @@ body {
.captcha-question {
font-size: 1.1rem;
font-weight: 700;
color: #0f3460;
color: var(--primary-color);
white-space: nowrap;
min-width: 120px;
text-align: center;
@@ -127,7 +134,7 @@ body {
/* Header */
header {
background: linear-gradient(135deg, #0f3460, #16213e);
background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
color: #fff;
padding: 1rem 2rem;
display: flex;
@@ -221,7 +228,7 @@ header {
}
.sidebar-stats .stat-card.highlight {
background: #0f3460;
background: var(--primary-color);
color: #fff;
}
@@ -253,7 +260,7 @@ header {
}
.stat-highlight {
color: #0f3460;
color: var(--primary-color);
}
.sidebar-stats .stat-card.trivia .stat-value {
@@ -285,7 +292,7 @@ header {
.speed-item.top {
font-weight: 700;
color: #0f3460;
color: var(--primary-color);
}
.speed-bar {
@@ -297,7 +304,7 @@ header {
}
.speed-item.top .speed-bar {
background: #0f3460;
background: var(--primary-color);
}
/* Toolbar */
@@ -331,7 +338,7 @@ header {
.search-bar input:focus {
outline: none;
border-color: #0f3460;
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(15,52,96,0.1);
}
@@ -350,7 +357,7 @@ table {
}
thead th {
background: #16213e;
background: var(--primary-dark);
color: #fff;
padding: 11px 14px;
text-align: left;
@@ -401,7 +408,7 @@ tbody td {
.price-cell {
font-weight: 700;
color: #0f3460;
color: var(--primary-color);
}
.actions-cell {
@@ -460,7 +467,7 @@ tbody td {
#total-billing {
font-size: 0.95rem;
color: #0f3460;
color: var(--primary-color);
}
/* Footer */
@@ -604,7 +611,7 @@ footer {
.modal-header h2 {
font-size: 1.3rem;
color: #0f3460;
color: var(--primary-color);
}
.modal-close {
@@ -635,7 +642,7 @@ form {
form h3 {
font-size: 0.95rem;
color: #0f3460;
color: var(--primary-color);
margin: 1.25rem 0 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #f0f2f5;
@@ -688,7 +695,7 @@ form h3:first-of-type {
.form-group textarea:focus,
.form-group select:focus {
outline: none;
border-color: #0f3460;
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(15,52,96,0.1);
}
@@ -704,7 +711,7 @@ form h3:first-of-type {
.checkbox-label input[type="checkbox"] {
width: 16px;
height: 16px;
accent-color: #0f3460;
accent-color: var(--primary-color);
}
.form-actions {
@@ -744,7 +751,7 @@ form h3:first-of-type {
.liittyma-row-title {
font-size: 0.8rem;
font-weight: 600;
color: #0f3460;
color: var(--primary-color);
}
/* Detail view */
@@ -762,7 +769,7 @@ form h3:first-of-type {
.detail-section h3 {
font-size: 0.95rem;
color: #0f3460;
color: var(--primary-color);
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #f0f2f5;
@@ -794,7 +801,7 @@ form h3:first-of-type {
}
.detail-value a {
color: #0f3460;
color: var(--primary-color);
text-decoration: none;
}
@@ -820,7 +827,7 @@ span.empty {
.liittyma-num {
font-size: 0.75rem;
font-weight: 700;
color: #0f3460;
color: var(--primary-color);
margin-bottom: 0.4rem;
text-transform: uppercase;
letter-spacing: 0.5px;
@@ -830,7 +837,7 @@ span.empty {
text-align: right;
font-weight: 700;
font-size: 0.95rem;
color: #0f3460;
color: var(--primary-color);
margin-top: 0.5rem;
padding-top: 0.5rem;
border-top: 2px solid #e8ebf0;
@@ -869,7 +876,7 @@ span.empty {
.file-name {
font-size: 0.9rem;
font-weight: 500;
color: #0f3460;
color: var(--primary-color);
text-decoration: none;
overflow: hidden;
text-overflow: ellipsis;
@@ -995,12 +1002,12 @@ span.empty {
}
.tab:hover {
color: #0f3460;
color: var(--primary-color);
}
.tab.active {
color: #0f3460;
border-bottom-color: #0f3460;
color: var(--primary-color);
border-bottom-color: var(--primary-color);
}
.tab-content {
@@ -1023,7 +1030,7 @@ span.empty {
}
.role-admin {
background: #0f3460;
background: var(--primary-color);
color: #fff;
}
@@ -1257,7 +1264,7 @@ span.empty {
.ticket-reply-form textarea:focus {
outline: none;
border-color: #0f3460;
border-color: var(--primary-color);
box-shadow: 0 0 0 3px rgba(15, 52, 96, 0.1);
}
@@ -1279,9 +1286,9 @@ span.empty {
}
.btn-reply-tab.active {
color: #0f3460;
color: var(--primary-color);
background: #fff;
border-color: #0f3460;
border-color: var(--primary-color);
}
/* Ticket tags */
@@ -1339,7 +1346,7 @@ span.empty {
border-radius: 6px;
font-size: 0.82rem;
font-weight: 600;
color: #0f3460;
color: var(--primary-color);
background: #fff;
cursor: pointer;
transition: border-color 0.2s;
@@ -1347,7 +1354,7 @@ span.empty {
.company-selector:hover,
.company-selector:focus {
border-color: #0f3460;
border-color: var(--primary-color);
outline: none;
}
@@ -1357,7 +1364,7 @@ span.empty {
}
.mailbox-item:hover {
border-color: #0f3460 !important;
border-color: var(--primary-color) !important;
}
/* Company badge */