feat(settings): standardize settings and admin section framing

Introduce a shared SettingsSectionFrame (the settings twin of the admin
renderer's SectionFrame) that emits the canonical visible heading +
subheading, and route all 19 settings sections through it. Every settings
page now shows a real h1 + subtitle in the reference Übersicht style
instead of an invisible sr-only title; the section bodies drop their own
headings and off-style intro paragraphs (the explanatory copy folds into
the frame subtitle).

- Route the admin About page through SectionFrame so it carries the same
  visible heading as every other admin section.
- Rename the AI settings section from KI-Auswertung to KI-Anbieter across
  six locales: the page configures the provider and key, not an analysis.
- Add a heading-block spacer to the settings and admin sidebars so the
  first menu item lines up with the top of the first card.
- Remove the always-on core-domains card from Module: a tracking area that
  can't be turned off doesn't need listing.
- Move the proactive-coach control out of Benachrichtigungen into Coach.
- Move admin module availability out of the Coach section into its own
  page: it gates every module, not just the coach.
- Give the Layout Insights editor a proper Insights heading.

Adds settings.sections.<slug>.subtitle and the new admin keys across all
six locales; removes the now-unused module core-domain strings.
This commit is contained in:
Marc-André Bombeck committed 2026-06-18 21:28:33 +02:00
1 parent ae3091df9e
commit 33d7d103da
42 files changed
+822 -802

No files matched your search

+12
View File
@@ -18,6 +18,7 @@ import Link from "next/link";
import { usePathname } from "next/navigation";
import {
Bell,
Blocks,
Database,
FileText,
Info,
@@ -39,6 +40,7 @@ import { cn } from "@/lib/utils";
import { scrollBehaviorForUser } from "@/lib/motion";
import { useAuth } from "@/hooks/use-auth";
import { useTranslations } from "@/lib/i18n/context";
import { SectionNavHeadingSpacer } from "@/components/settings/section-nav-heading-spacer";
import { isAdminSectionSlug, type AdminSectionSlug } from "./section-slugs";
interface AdminSection {
@@ -82,6 +84,13 @@ export const ADMIN_SECTIONS: readonly AdminSection[] = [
titleKey: "admin.section.coach.title",
icon: Sparkles,
},
// v1.18.6 (W9) — server-wide module availability split out of Coach into
// its own entry, sitting next to it.
{
slug: "module-availability",
titleKey: "admin.section.module-availability.title",
icon: Blocks,
},
{
slug: "feedback",
titleKey: "admin.section.feedback.title",
@@ -276,6 +285,9 @@ export function AdminShell({ active, children }: AdminShellProps) {
className="hidden md:block"
>
<div className="sticky top-20">
{/* v1.18.6 (W9) — align the first nav item with the top of the
first card, matching the settings shell. */}
<SectionNavHeadingSpacer />
<ul className="space-y-1">
<li>
<Link
+8 -4
View File
@@ -16,11 +16,15 @@ export const ADMIN_SECTION_SLUGS = [
"integrations",
// v1.18.1 — the former `ai-quality`, `assistant`, and `coach-feedback`
// sections collapse into one "Coach" area. It holds the assistant
// surface toggles, the server-key + module-availability operator
// config, and both feedback-quality tables (Coach + Insights). Three
// navigation entries for one coherent coach-quality concern read as
// clutter; one card opens the full picture.
// surface toggles, the server-key operator config, and both
// feedback-quality tables (Coach + Insights). Three navigation entries
// for one coherent coach-quality concern read as clutter; one card opens
// the full picture.
"coach",
// v1.18.6 (W9) — server-wide module availability is its own section now
// (was stacked under Coach). It gates every module, not just the coach,
// so it reads better next to Coach than buried inside it.
"module-availability",
"feedback",
"reminders",
"users",