TopBar-Redesign: Marke, Zoom-Cluster, Datei-Menü, Fenstersteuerung, Dark-Theme fest

- Marke (DOSSIER-Wortmarke) + Ressourcen-Icon ganz links, wie im
  Rhino-Plugin; Settings-Icon folgt über den neuen Einstellungs-Dialog.
- Massstab/Zoom-Cluster bereinigt: doppelte Massstab-Dropdown entfernt,
  Zoom-Aktionen unter dem Massstab-Dropdown gestapelt (gleiche Breite),
  Ring bei "am Massstab" statt Flächen-Aufhellung.
- PDF/DXF-Export aus der Leiste raus, zusammen mit Speichern/Öffnen/
  Import in einem neuen Datei-Burger-Menü ganz rechts. Speichern/Öffnen
  sind echte JSON-Download/-Upload-Handler fürs ganze Projekt.
- Einstellungs-Fenster (neu): Accent-Palette, Auswahlrahmen-/Snap-Farbe
  editierbar (freier Picker + Presets), Projekt-Referenzhöhe (m ü. M.)
  als Feld.
- LayoutMenu auf die eigene Dropdown-Komponente umgestellt (war noch
  natives <select>).
- Custom Fenstersteuerung (_/□/X) für die randlose Electron-Shell via
  Preload+IPC, eigener Look statt OS-Chrome; Oberleiste als Drag-Region.
- Dark-Theme ist jetzt fester Standard (vorher an OS-Präferenz
  gekoppelt, zeigte je nach Umgebung fälschlich Light) — Light bleibt
  als Opt-in (`[data-theme="light"]`) für einen künftigen Umschalter.
  Alle Oberleisten-Pillen (Dropdown-Trigger, Segmente, Icon-Knöpfe,
  Ansichts-Icons) auf dieselbe dunkle Fläche wie das Kontextmenü
  vereinheitlicht. Panel-Köpfe nicht mehr separat aufgehellt, feste
  Höhe (40px) unabhängig von optionalem Darstellungsmodus-Dropdown.
- 2D-Zoom-Grenzen deutlich erweitert (20000x/0.005x statt 50x/0.2x).
This commit is contained in:
2026-07-04 05:10:44 +02:00
parent 44942e6976
commit f724c088e0
13 changed files with 1052 additions and 265 deletions
+53
View File
@@ -0,0 +1,53 @@
// Accent-Farbpalette (Schnellauswahl) für einstellbare UI-Akzente wie den
// Auswahlrahmen (Marquee) oder die Snap-/Endpunkt-Hervorhebung im Grundriss.
// Zehn benannte Töne (japanische Wörter, wie im HANDOVER-Backlog vorgesehen);
// jede Einstellung bleibt trotzdem ein FREIER Farbpicker — diese Liste liefert
// nur die Schnellauswahl-Buttons daneben.
//
// Bezeichner englisch, Kommentare deutsch (CONVENTIONS.md).
/** Ein Akzent-Farbton der Schnellauswahl-Palette. */
export interface AccentSwatch {
/** Stabiler Schlüssel (React-key, Vergleich). */
id: string;
/** Anzeigename (japanisch, wie im Backlog benannt). */
name: string;
/** Hex-Farbwert. */
hex: string;
}
/**
* Die zehn benannten Akzenttöne. Reihenfolge wie im HANDOVER-Backlog genannt.
* Nur `yuyake` hat einen vom Nutzer vorgegebenen Wert (#CEB188); die übrigen
* sind plausible, klar unterscheidbare Töne passend zum Namen — bei Bedarf
* später anpassbar, ohne dass Aufrufer sich ändern (Verweis über `id`).
*/
export const ACCENT_SWATCHES: AccentSwatch[] = [
{ id: "ajisai", name: "Ajisai", hex: "#7C86C4" }, // 紫陽花 Hortensie — Blau-Violett
{ id: "sakura", name: "Sakura", hex: "#E3A8B8" }, // 桜 Kirschblüte — zartes Rosa
{ id: "suna", name: "Suna", hex: "#CBB994" }, // 砂 Sand — helles Beige
{ id: "ichigo", name: "Ichigo", hex: "#C2485C" }, // 苺 Erdbeere — Rot
{ id: "yuyake", name: "Yuyake", hex: "#CEB188" }, // 夕焼け Abendrot — warmes Gold-Beige
{ id: "sora", name: "Sora", hex: "#5FA1C9" }, // 空 Himmel — kühles Blau
{ id: "kusa", name: "Kusa", hex: "#7FA65A" }, // 草 Gras — Grün
{ id: "kori", name: "Kori", hex: "#A8D4D8" }, // 氷 Eis — blasses Zyan
{ id: "amagumo", name: "Amagumo", hex: "#6E7C8C" }, // 雨雲 Regenwolke — Blaugrau
{ id: "yuki", name: "Yuki", hex: "#E7E5DE" }, // 雪 Schnee — nahezu Weiss
];
/** Auswahlrahmen-Default (Marquee, 2D-Planansicht): Akzent „Yuyake". */
export const DEFAULT_MARQUEE_COLOR = "#CEB188";
/**
* Snap-/Endpunkt-Default: Akzent „Sora" (vorläufig — die offene Rückfrage
* „aki" im HANDOVER-Backlog ist noch nicht geklärt). Bewusst ein kühler,
* heller Ton: hebt sich klar vom warmen Yuyake-Auswahlrahmen UND von den
* meist neutral-dunklen Wand-/Linienfarben ab, bleibt aber (anders als das
* sehr blasse Kori) auch auf hellem Papier-Hintergrund gut sichtbar.
*/
export const DEFAULT_SNAP_COLOR = "#5FA1C9";
/** Liefert einen Swatch nach `id`, oder `undefined`. */
export function findAccentSwatch(id: string): AccentSwatch | undefined {
return ACCENT_SWATCHES.find((s) => s.id === id);
}