diff --git a/saas-app/public/index.php b/saas-app/public/index.php index 07bc097..4198ad4 100644 --- a/saas-app/public/index.php +++ b/saas-app/public/index.php @@ -232,70 +232,111 @@ $themeCss = app_tenant_theme_root_css($tenantSettings); Die Kaffeeliste -
-
-
- Die Kaffeeliste - Kaffeeliste, Hinweise und Support in einem Menü. +
+
-
-
-
-
-
- - -
-
- - ist angemeldet als - -
-
- + + +
Du siehst diesen Mandanten mit erweitertem Global-Admin-Zugriff. @@ -810,6 +851,7 @@ $themeCss = app_tenant_theme_root_css($tenantSettings); +
diff --git a/saas-app/public/surveys/index.php b/saas-app/public/surveys/index.php index acf611f..c40c248 100644 --- a/saas-app/public/surveys/index.php +++ b/saas-app/public/surveys/index.php @@ -59,46 +59,158 @@ $themeCss = app_tenant_theme_root_css($tenantSettings); - Die Kaffeeliste - Umfragen + Die Kaffeeliste -
-
-
- Die Kaffeeliste - Umfragen und Freigaben im Tenant. +
+
-
-
-
-
-
+ + + +

Umfragen

-

Umfragen

+

Umfragen

Entwürfe bleiben intern bearbeitbar. Mitglieder sehen nur veröffentlichte Stände.

@@ -336,6 +491,7 @@ $themeCss = app_tenant_theme_root_css($tenantSettings);
+
diff --git a/saas-app/resources/views/layouts/app.blade.php b/saas-app/resources/views/layouts/app.blade.php index 970ed07..35235ed 100644 --- a/saas-app/resources/views/layouts/app.blade.php +++ b/saas-app/resources/views/layouts/app.blade.php @@ -28,10 +28,13 @@ :root { {!! $layoutThemeCss !!} --line: rgba(44, 32, 23, 0.14); + --line-strong: rgba(44, 32, 23, 0.2); --shadow: 0 18px 42px rgba(68, 48, 34, 0.08); + --shadow-soft: 0 12px 26px rgba(68, 48, 34, 0.05); --radius-xl: 24px; --radius-lg: 18px; - --content-width: 1220px; + --sidebar-width: 292px; + --content-width: 1260px; } * { box-sizing: border-box; } @@ -41,6 +44,7 @@ min-height: 100vh; color: var(--text); background: + radial-gradient(circle at top left, rgba(var(--brand-rgb), 0.08), transparent 32%), linear-gradient(180deg, #f8f1e6 0%, var(--bg) 100%); font-family: "Trebuchet MS", "Aptos", "Segoe UI", sans-serif; line-height: 1.55; @@ -55,32 +59,45 @@ a:hover { text-decoration: underline; } img { max-width: 100%; } - .app-shell { min-height: 100vh; } - .app-header { + .app-shell { + width: min(var(--content-width), calc(100% - 28px)); + margin: 14px auto; + min-height: calc(100vh - 28px); + display: grid; + grid-template-columns: var(--sidebar-width) minmax(0, 1fr); + gap: 18px; + } + + .app-sidebar { position: sticky; - top: 0; - z-index: 50; - border-bottom: 1px solid var(--line); - background: rgba(249, 242, 231, 0.96); - backdrop-filter: blur(12px); + top: 14px; + align-self: start; + min-height: calc(100vh - 28px); } - .app-header__inner, - .app-main, - .app-footer__inner { - width: min(var(--content-width), calc(100% - 32px)); - margin: 0 auto; + + .app-sidebar__panel { + height: calc(100vh - 28px); + display: grid; + grid-template-rows: auto auto 1fr auto; + gap: 20px; + padding: 24px 20px; + border: 1px solid var(--line); + border-radius: 30px; + background: + linear-gradient(180deg, rgba(255, 252, 246, 0.98), rgba(249, 242, 231, 0.96)); + box-shadow: var(--shadow); } - .app-header__inner { + + .brand { display: flex; align-items: center; - justify-content: space-between; - gap: 20px; - padding: 18px 0; + gap: 14px; + min-width: 0; } - .brand { display: flex; align-items: center; gap: 14px; min-width: 0; } + .brand__mark { - width: 44px; - height: 44px; + width: 46px; + height: 46px; border-radius: 16px; display: grid; place-items: center; @@ -89,16 +106,19 @@ background: linear-gradient(135deg, var(--brand) 0%, #115e59 55%, var(--accent) 100%); box-shadow: 0 12px 26px rgba(45, 106, 79, 0.2); } - .brand__text { display: grid; gap: 2px; min-width: 0; } - .brand__title { margin: 0; font-size: 1.02rem; font-weight: 700; letter-spacing: 0.01em; } + + .brand__text { display: grid; gap: 3px; min-width: 0; } + .brand__title { margin: 0; font-size: 1.16rem; font-weight: 700; letter-spacing: 0.01em; } .brand__subtitle { margin: 0; color: var(--muted); font-size: 0.92rem; } + + .sidebar-meta, .header-meta { display: flex; align-items: center; - gap: 12px; + gap: 10px; flex-wrap: wrap; - justify-content: flex-end; } + .badge, .pill { display: inline-flex; @@ -112,54 +132,129 @@ font-weight: 600; color: var(--brand-strong); } + .badge--solid { background: var(--brand); color: #fff; border-color: transparent; } - .tenant-nav-wrap { - width: min(var(--content-width), calc(100% - 32px)); - margin: 16px auto 0; + + .sidebar-nav { + display: grid; + gap: 8px; + align-content: start; } - .tenant-nav-shell { + + .sidebar-nav__link { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 0.88rem 1rem; + border-radius: 18px; + border: 1px solid rgba(44, 32, 23, 0.08); + background: rgba(255, 255, 255, 0.72); + color: var(--text); + font-size: 0.95rem; + font-weight: 700; + box-shadow: var(--shadow-soft); + } + + .sidebar-nav__link::after { + content: "›"; + font-size: 1rem; + color: var(--muted); + } + + .sidebar-nav__link:hover { + text-decoration: none; + border-color: rgba(var(--brand-rgb), 0.22); + background: rgba(255, 255, 255, 0.95); + } + + .sidebar-nav__link.is-active { + background: linear-gradient(135deg, var(--brand) 0%, var(--brand-strong) 100%); + color: #fff; + border-color: transparent; + } + + .sidebar-nav__link.is-active::after { color: rgba(255, 255, 255, 0.88); } + + .sidebar-footer { display: grid; gap: 12px; + align-content: end; + } + + .sidebar-note { padding: 14px 16px; + border-radius: 18px; + background: rgba(var(--brand-rgb), 0.08); + border: 1px solid rgba(var(--brand-rgb), 0.12); + color: var(--brand-strong); + } + + .sidebar-note strong { + display: block; + margin-bottom: 4px; + } + + .app-body { + min-width: 0; + display: grid; + grid-template-rows: auto 1fr auto; + gap: 18px; + } + + .context-bar { padding-top: 6px; } + + .context-bar__inner { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + padding: 20px 24px; border: 1px solid var(--line); - border-radius: 20px; + border-radius: 28px; background: rgba(255, 251, 244, 0.92); box-shadow: var(--shadow); } - .tenant-nav__desktop { - display: flex; - align-items: center; - gap: 14px; - justify-content: space-between; + + .context-copy { display: grid; gap: 6px; } + + .context-copy__title { + margin: 0; + font-size: 1.5rem; + line-height: 1.1; } - .tenant-nav__links { - display: flex; - gap: 10px; - flex: 1 1 auto; - overflow-x: auto; - scrollbar-width: none; + + .context-copy__lead { + margin: 0; + color: var(--muted); + font-size: 0.95rem; } - .tenant-nav__links::-webkit-scrollbar { display: none; } - .tenant-nav__mobile { + + .mobile-nav { display: none; position: relative; } - .tenant-nav__toggle { + + .mobile-nav[open] { z-index: 40; } + + .mobile-nav__toggle { display: inline-flex; align-items: center; gap: 10px; list-style: none; cursor: pointer; - padding: 0.72rem 1rem; + padding: 0.78rem 1rem; border-radius: 999px; - border: 1px solid rgba(44, 32, 23, 0.08); - background: rgba(255, 251, 244, 0.94); + border: 1px solid var(--line-strong); + background: rgba(255, 255, 255, 0.94); color: var(--text); - font-size: 0.92rem; + font-size: 0.94rem; font-weight: 700; } - .tenant-nav__toggle::-webkit-details-marker { display: none; } - .tenant-nav__toggle::before { + + .mobile-nav__toggle::-webkit-details-marker { display: none; } + + .mobile-nav__toggle::before { content: ""; width: 18px; height: 12px; @@ -167,89 +262,30 @@ border-bottom: 2px solid currentColor; box-shadow: inset 0 -4px 0 0 currentColor; } - .tenant-nav__panel { - margin-top: 12px; - padding: 14px; - border-radius: 18px; + + .mobile-nav__panel { + position: absolute; + right: 0; + top: calc(100% + 12px); + width: min(320px, calc(100vw - 32px)); + padding: 16px; + border-radius: 24px; border: 1px solid var(--line); background: rgba(255, 252, 246, 0.98); box-shadow: var(--shadow); } - .tenant-nav__stack { + + .mobile-nav__stack { display: grid; gap: 10px; } - .tenant-nav__link { - padding: 0.75rem 0.95rem; - border-radius: 16px; - border: 1px solid rgba(44, 32, 23, 0.08); - background: rgba(255, 251, 244, 0.96); - color: var(--text); - font-size: 0.94rem; - font-weight: 600; - white-space: nowrap; - } - .tenant-nav__link.is-primary { - background: linear-gradient(135deg, var(--brand) 0%, var(--brand-strong) 100%); - color: #fff; - } - .tenant-nav__link:hover { - text-decoration: none; - border-color: rgba(var(--brand-rgb), 0.2); - background: #fffdf8; - } - .tenant-nav__logout { + + .mobile-nav__footer { + margin-top: 12px; display: flex; justify-content: flex-end; - flex: 0 0 auto; - } - .app-main { padding: 34px 0 56px; } - .hero { - display: grid; - gap: 24px; - margin-bottom: 28px; - padding: 30px; - border: 1px solid var(--line); - border-radius: var(--radius-xl); - background: - linear-gradient(135deg, rgba(255, 251, 244, 0.98), rgba(252, 247, 240, 0.95)); - box-shadow: var(--shadow); - } - .hero--split { - grid-template-columns: minmax(0, 1.25fr) minmax(300px, 0.75fr); - align-items: stretch; - } - .hero__content, - .hero__aside { - display: grid; - gap: 18px; - } - .hero__kicker { - margin: 0 0 12px; - text-transform: uppercase; - letter-spacing: 0.15em; - font-size: 0.8rem; - color: var(--accent); - font-weight: 700; - } - .hero__title { - margin: 0; - font-size: clamp(2rem, 4vw, 3.6rem); - line-height: 1.05; - letter-spacing: -0.03em; - } - .hero__lead { - margin: 0; - max-width: 68ch; - color: var(--muted); - font-size: 1.02rem; - } - .hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 4px; } - .hero__meta { - display: flex; - flex-wrap: wrap; - gap: 10px; } + .button, button, input[type="submit"] { @@ -264,16 +300,69 @@ cursor: pointer; box-shadow: 0 12px 24px rgba(var(--brand-rgb), 0.18); } + .button--ghost { background: transparent; color: var(--brand-strong); border: 1px solid rgba(var(--brand-rgb), 0.18); box-shadow: none; } + + .app-main { padding: 0 0 6px; } + + .hero { + display: grid; + gap: 24px; + margin-bottom: 28px; + padding: 30px; + border: 1px solid var(--line); + border-radius: var(--radius-xl); + background: + linear-gradient(135deg, rgba(255, 251, 244, 0.98), rgba(252, 247, 240, 0.95)); + box-shadow: var(--shadow); + } + + .hero--split { + grid-template-columns: minmax(0, 1.25fr) minmax(300px, 0.75fr); + align-items: stretch; + } + + .hero__content, + .hero__aside { + display: grid; + gap: 18px; + } + + .hero__kicker { + margin: 0 0 12px; + text-transform: uppercase; + letter-spacing: 0.15em; + font-size: 0.8rem; + color: var(--accent); + font-weight: 700; + } + + .hero__title { + margin: 0; + font-size: clamp(2rem, 4vw, 3.6rem); + line-height: 1.05; + letter-spacing: -0.03em; + } + + .hero__lead { + margin: 0; + max-width: 68ch; + color: var(--muted); + font-size: 1.02rem; + } + + .hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 4px; } + .hero__meta { display: flex; flex-wrap: wrap; gap: 10px; } .grid { display: grid; gap: 18px; } .grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + .card, .panel, .form-panel, @@ -284,6 +373,7 @@ box-shadow: var(--shadow); padding: 22px; } + .card__eyebrow { margin: 0 0 10px; font-size: 0.8rem; @@ -292,21 +382,23 @@ color: var(--accent); font-weight: 700; } + .metric { display: grid; gap: 8px; } .metric__value { font-size: clamp(1.6rem, 2.5vw, 2.4rem); font-weight: 800; letter-spacing: -0.03em; } + .metric__label, .muted { color: var(--muted); } + .list-reset { margin: 0; padding: 0; list-style: none; } .list-reset li + li { margin-top: 12px; } .stack { display: grid; gap: 14px; } - .feature-list { - display: grid; - gap: 12px; - } + + .feature-list { display: grid; gap: 12px; } + .feature-list__item { display: flex; gap: 12px; @@ -316,6 +408,7 @@ background: rgba(255, 255, 255, 0.78); border: 1px solid rgba(31, 41, 51, 0.08); } + .feature-list__badge { flex: 0 0 auto; width: 34px; @@ -327,30 +420,33 @@ color: var(--brand-strong); font-weight: 800; } + .feature-list__title { margin: 0 0 4px; font-weight: 700; } + .feature-list__copy { margin: 0; color: var(--muted); font-size: 0.94rem; } + .split { display: grid; gap: 18px; grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.9fr); } + .auth-summary__card { padding: 16px; border-radius: 18px; background: rgba(255, 255, 255, 0.75); border: 1px solid rgba(31, 41, 51, 0.08); } - .tenant-grid { - display: grid; - gap: 12px; - } + + .tenant-grid { display: grid; gap: 12px; } + .tenant-row { display: flex; justify-content: space-between; @@ -361,19 +457,11 @@ background: rgba(255, 255, 255, 0.82); border: 1px solid rgba(31, 41, 51, 0.08); } - .tenant-row__meta { - display: grid; - gap: 4px; - } - .tenant-row__title { - margin: 0; - font-weight: 700; - } - .tenant-row__copy { - margin: 0; - color: var(--muted); - font-size: 0.92rem; - } + + .tenant-row__meta { display: grid; gap: 4px; } + .tenant-row__title { margin: 0; font-weight: 700; } + .tenant-row__copy { margin: 0; color: var(--muted); font-size: 0.92rem; } + .callout { padding: 16px 18px; border-radius: 18px; @@ -381,21 +469,18 @@ border: 1px solid rgba(45, 106, 79, 0.14); color: var(--brand-strong); } + .callout strong { display: block; margin-bottom: 4px; } - .metric--compact { - padding: 18px 20px; - } - .toolbar { - display: flex; - flex-wrap: wrap; - gap: 12px; - margin-top: 18px; - } + + .metric--compact { padding: 18px 20px; } + .toolbar { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 18px; } .toolbar .badge { background: #fff; } + .table-card { overflow: hidden; padding: 0; } + .table-card__header { display: flex; align-items: center; @@ -403,15 +488,18 @@ gap: 16px; padding: 22px 22px 12px; } + .table-card__body { padding: 0 22px 22px; overflow-x: auto; } + table { width: 100%; border-collapse: collapse; min-width: 680px; } + th, td { padding: 0.95rem 0.8rem; @@ -419,6 +507,7 @@ text-align: left; vertical-align: top; } + th { font-size: 0.8rem; text-transform: uppercase; @@ -427,7 +516,9 @@ font-weight: 700; background: rgba(249, 242, 231, 0.6); } + tr:last-child td { border-bottom: 0; } + .status { display: inline-flex; align-items: center; @@ -439,11 +530,14 @@ font-weight: 700; font-size: 0.82rem; } + .status--warning { background: rgba(180, 83, 9, 0.12); color: #92400e; } .status--danger { background: rgba(185, 28, 28, 0.12); color: #991b1b; } + .form-grid { display: grid; gap: 16px; } .field { display: grid; gap: 8px; } label { font-size: 0.9rem; font-weight: 700; } + input, select, textarea { @@ -455,7 +549,9 @@ font: inherit; color: var(--text); } + textarea { min-height: 120px; resize: vertical; } + .note { padding: 14px 16px; border-radius: 16px; @@ -463,8 +559,10 @@ border: 1px solid rgba(15, 118, 110, 0.12); color: var(--brand-strong); } + .timeline { display: grid; gap: 14px; } .timeline--tight { gap: 10px; } + .timeline__item { display: grid; gap: 6px; @@ -473,9 +571,12 @@ background: rgba(255, 255, 255, 0.8); border: 1px solid rgba(31, 41, 51, 0.08); } + .timeline__title { margin: 0; font-weight: 700; } .timeline__meta { margin: 0; color: var(--muted); font-size: 0.92rem; } - .app-footer { padding: 0 0 38px; } + + .app-footer { padding: 0 0 12px; } + .app-footer__inner { display: flex; justify-content: space-between; @@ -486,114 +587,144 @@ color: var(--muted); font-size: 0.92rem; } - @media (max-width: 960px) { + + @media (max-width: 980px) { + .app-shell { + width: calc(100% - 20px); + margin: 10px auto; + min-height: calc(100vh - 20px); + grid-template-columns: 1fr; + } + + .app-sidebar { display: none; } + .mobile-nav { display: block; } + .context-bar { padding-top: 0; } + .context-bar__inner { padding: 18px; } .grid--2, .grid--3, .grid--4, .split, .hero--split { grid-template-columns: 1fr; } - .app-header__inner { flex-direction: column; align-items: flex-start; } - .header-meta { justify-content: flex-start; } - .tenant-nav__desktop { display: none; } - .tenant-nav__mobile { display: block; } .hero, .card, .panel, - .form-panel, - .table-card { padding: 18px; } - .tenant-nav-wrap { width: calc(100% - 32px); } - } - @media (min-width: 961px) { - .tenant-nav__mobile { display: none; } + .form-panel { padding: 18px; } + .table-card { padding: 0; } + table { min-width: 0; } }
-
-
+
-
-
-
- + + +
+ -
- Navigation -
- - @if (is_array($layoutAuth)) -
- -
+
+
+
+
+

Die Kaffeeliste

+

+ @if (is_array($layoutAuth)) + Ruhige Tenant-Oberfläche mit klarer Navigation und ohne doppelte Statusinfos. + @else + Anmeldung, Tenant-Zugriff und Verwaltung bleiben in einer ruhigen gemeinsamen Struktur. + @endif +

+ @if (!is_array($layoutAuth)) +
+ Mandantenfähig + Mobil tauglich +
@endif
-
-
-
-
- @yield('content') -
+
+ Menü +
+ + @if (is_array($layoutAuth)) + + @endif +
+
+
+ - +
+ @yield('content') +
+ + + diff --git a/saas-app/resources/views/support/index.blade.php b/saas-app/resources/views/support/index.blade.php index 7b9822b..5a51c8b 100644 --- a/saas-app/resources/views/support/index.blade.php +++ b/saas-app/resources/views/support/index.blade.php @@ -7,50 +7,174 @@ - Die Kaffeeliste - Support + Die Kaffeeliste -
-
-
- Die Kaffeeliste - Support, Vorgänge und Rückmeldungen im Tenant. +
+
-
-
-
- -
-
-
- Navigation -
- -
-
-
-
-
- -
-

Support

-

Support

-

- Mitglieder legen hier Vorgänge an. Verantwortliche verfolgen, beantworten und schließen sie im selben Verlauf. -

-
+ -
- -
- -
- + - -
- -
- Das Support-Modul ist strukturell vorbereitet, aber die Support-Tabellen sind noch nicht angelegt. - Bitte führe die Migrationen aus, bevor du das Modul produktiv nutzt. -
- + + - -
-

Alle Vorgänge

Support-Anfragen im aktuellen Tenant.

-

Neu

Neue Vorgänge ohne Bearbeitung.

-

Warten auf Antwort

Vorgänge mit Rückfrage an Mitglieder.

-

Erledigt

Abgeschlossene oder gelöste Anfragen.

+
+
+
+

Support

+

Support

+

+ Mitglieder legen hier Vorgänge an. Verantwortliche verfolgen, beantworten und schließen sie im selben Verlauf. +

+
-
+ +
+ +
+ + + +
+ +
+ Das Support-Modul ist strukturell vorbereitet, aber die Support-Tabellen sind noch nicht angelegt. + Bitte führe die Migrationen aus, bevor du das Modul produktiv nutzt. +
+ + + +
+

Alle Vorgänge

Support-Anfragen im aktuellen Tenant.

+

Neu

Neue Vorgänge ohne Bearbeitung.

+

Warten auf Antwort

Vorgänge mit Rückfrage an Mitglieder.

+

Erledigt

Abgeschlossene oder gelöste Anfragen.

+
+ +

Support-Vorgang erstellen

@@ -280,7 +451,7 @@
-
+

Detailansicht

Ausgewählter Vorgang

@@ -394,9 +565,10 @@
- + - + +
diff --git a/saas-app/resources/views/tenants/roles.blade.php b/saas-app/resources/views/tenants/roles.blade.php index 5414410..e1ea471 100644 --- a/saas-app/resources/views/tenants/roles.blade.php +++ b/saas-app/resources/views/tenants/roles.blade.php @@ -7,12 +7,12 @@ - Die Kaffeeliste - Rollen + Die Kaffeeliste -
-
-
- Die Kaffeeliste - Rollen und Rechte im Tenant. +
+
-
-
-
-
-
+ + + +

Rollen

-

Rollen und Rechte

+

Rollen und Rechte

Tenant-Admins behalten den Gesamtzugriff. Fachrollen für Finanzen, Support und Umfragen werden gezielt delegiert.

@@ -264,6 +420,7 @@
+