Charts-Tab komplett entfernt (User-Vorgabe)
Entfernt: Tab-Button, #view-charts, der gesamte app.js-Chart-Block (Kartenaufbau, renderChart, loadCharts, 20-s-Refresh, Resize-Handler), die Chart-CSS-Regeln, die vendorte Bibliothek web/lightweight-charts.standalone.production.js (164 KB) samt script-Tag - und die Backend-Kette dahinter: /api/bars und engine.get_bars (60 Zeilen). Beide existierten ausschliesslich fuer dieses Tab; geprueft, dass es keinen anderen Aufrufer gibt. Nicht betroffen (sahen nur aehnlich aus): die Chartmuster-Karte (Verdict-Gewicht 0,25, im Tab "SIG Live"), der MQL5-Indikator samt sr_levels.csv-Export (eigener Pfad ueber _write_levels_file) und die Analyse-Module structure/patterns/cone - die speisen den Snapshot, nicht das Chart. Der MT5-Chart bleibt voll bedient. Ein veralteter Kommentar in trader.py, der auf engine.get_bars verwies, wurde auf core/gaps.py umgehaengt. Verifiziert am laufenden Server: /api/bars -> 404, Bibliothek -> 404, data-view="charts" und id="view-charts" nicht mehr im ausgelieferten HTML, 6 Tabs zu 6 Views paarig, keine verwaisten JS-Referenzen, Klammern-Balance ok, keine Fehler im Log. v=142. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
6ff3c15b1d
commit
a1a5d560b9
@@ -2213,7 +2213,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
|
||||
`pnl>0`-Gate (`history`) noch vom 5-Min-Cooldown betroffen.
|
||||
|
||||
## Mobile-UI (web/) & Alarme
|
||||
- Aufbau: **Tab-Navigation ganz oben** (sticky: Dashboard/**SIG Live**/**SIG Anzeige**/Logs/Statistik/**Charts**/News),
|
||||
- Aufbau: **Tab-Navigation ganz oben** (sticky: Dashboard/**SIG Live**/**SIG Anzeige**/Logs/Statistik/News),
|
||||
darunter Header.
|
||||
- **Design-System (`style.css`, Pass 2026-07-15, KEIN Framework — Tailwind bewusst
|
||||
verworfen wegen WireGuard/Offline + kein Node):** Tokens in `:root` — Flächen-Leiter
|
||||
@@ -2246,164 +2246,24 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
|
||||
der Zeile. Titel „aktueller Trade läuft"; Richtung/Lots/Einsatz = Anzeige-Boxen
|
||||
(`.tb-val`), Rest editierbar — alle im selben `.tb-field`-Look. Position-Kachel hält
|
||||
nur noch `cur-near`-Warnung + `pos-srhint`. (`.emg*`/`.sr-toggle`-CSS entfernt.)
|
||||
- **Charts-Tab** (`#view-charts`): **M1/M5/M15/M30/H1 untereinander**, je ein
|
||||
Candlestick-Chart mit **EMA12 (blau) + EMA50 (amber)**-Overlay und Trend-Header
|
||||
(▲/▼/→ nach EMA12-vs-EMA50 mit Totband). Framework **TradingView Lightweight
|
||||
Charts v4.2.3 — lokal vendored** (`web/lightweight-charts.standalone.production.js`,
|
||||
KEIN CDN wegen WireGuard/Offline). Daten via `GET /api/bars?tf=&n=` →
|
||||
`engine.get_bars` (OHLC+EMA+Trend unter `mt5_lock`). `app.js`: `loadCharts`/
|
||||
`renderChart`, Charts nur bei sichtbarem Tab geladen + Auto-Refresh 20 s
|
||||
(schont den Lock). Broker-Zeit (UTC+3) → UTC via `broker_utc_offset`. **Gitternetz
|
||||
dezent** (2026-07-27, User „dunkler/unauffälliger": `grid`-Farbe `#161b22`→`#10151c`,
|
||||
näher am Hintergrund `#0d1117`). **Chartmuster-Overlay (nur M30)** — s. Chartmuster-
|
||||
Kachel: die 2 stärksten M30-Muster als Trigger-/Ziel-Preislinien.
|
||||
**Regressionskanal-Overlay (nur M30, 2026-07-20):** `get_bars` liefert bei M30
|
||||
`channel {dir, mid[], upper[], lower[]}` (Arrays deckungsgleich mit den Bars,
|
||||
`structure.channel_series` — Regression über 60 abgeschl. Bars, linear über die
|
||||
volle Breite extrapoliert). Frontend zeichnet 3 LineSeries (oben/unten gestrichelt,
|
||||
Mitte gepunktet, grau). Dieselbe Kanal-Definition wie die Marktstruktur-Kachel —
|
||||
REINE Anzeige (Signalvariante gemessen verworfen, s. `backtest_structure.py`).
|
||||
**S/R-Overlay & Dashboard-Kachel = EINE Quelle** (`_draw_levels`; die Position-Kachel
|
||||
`sr-res`/`sr-sup` speist jetzt via `_dash_sr` daraus statt aus dem Misch-Set
|
||||
`_sr_levels` — vorher wichen Chart und Kachel ab, User-Feedback 2026-07-15). `_sr_levels`
|
||||
bleibt intern für Strategie/Konfidenz. **„Klebrige" Hysterese** in `_draw_levels`
|
||||
(`_draw_last`, verschärft 2026-07-21): die gezeichnete Linie **bleibt stehen, bis der
|
||||
Kurs sie WIRKLICH durchbricht** (bid > R+0,1×ATR bzw. bid < S−0,1×ATR) — ein neuer,
|
||||
näherer M5-Pivot löst KEINEN Wechsel mehr aus (das war die Zitter-Quelle: auf M5
|
||||
bilden sich laufend neue Pivots, die alte 0,25×ATR-Regel sprang darauf an). Ausnahme:
|
||||
ist die alte Linie >1,5×ATR weit weg UND ein deutlich näheres Level existiert, wird
|
||||
refresht (sonst bliebe sie irrelevant hängen). Gilt für PWA-Chart UND MQL5-CSV (eine
|
||||
Quelle).
|
||||
**Level-Auswahl nach Kursposition statt Entstehungstyp (Fix 2026-07-23, User-Frage
|
||||
„Widerstand/Support-Retest von der falschen Seite"):** vorher kam Widerstand NUR aus
|
||||
`ph` (Swing-Hochs) und Support NUR aus `pl` (Swing-Tiefs) — ein gebrochenes Level blieb
|
||||
für IMMER im falschen Topf hängen. 2 von 4 Retest-Varianten hatten dadurch NIE eine
|
||||
Durchbruchwahrscheinlichkeit: (1) Widerstand von unten ✓ funktionierte, (2) **Support-
|
||||
Retest von unten** (Kurs unter einem gebrochenen Support, nähert sich von unten wieder)
|
||||
✗ kein Hinweis, (3) Support von oben ✓ funktionierte, (4) **Widerstand-Retest von oben**
|
||||
(Kurs über einem gebrochenen Widerstand, nähert sich von oben wieder) ✗ kein Hinweis.
|
||||
Fix: `ph`/`pl` bleiben GETRENNT geclustert (unverändert granular — ein erster Versuch,
|
||||
beide Rohpools VOR dem Clustern zusammenzulegen, erzeugte in dichten Zonen Ketten-Mega-
|
||||
Cluster durch die verdoppelte Punktdichte, >1×ATR breit, verworfen), aber NACH dem
|
||||
Clustern werden beide fertigen Linien-Listen zusammengeführt und die Wahl erfolgt rein
|
||||
per `min/max` relativ zu `bid` — nicht mehr nach Topf-Zugehörigkeit. Verifiziert: Fall 1
|
||||
bei Live-Daten (bid 90,951) und ein dichter Kontrollfall liefern exakt dieselben Level
|
||||
wie vorher (keine Regression); Fälle 2+4 (synthetische Retest-Szenarien) finden jetzt
|
||||
das nahe, vorher übersehene Level statt eines weit entfernten Ersatzlevels. Betrifft
|
||||
`_draw_levels` direkt und damit ALLE Konsumenten (PWA-Chart, MQL5-CSV, Dashboard-
|
||||
Kachel, `_sr_close_hint`/Auto-Close) — eine Quelle, ein Fix.
|
||||
**⚠ LEVEL-TF M5→M30 umgestellt (2026-07-30, gemessen `backtest_level_tf.py`):**
|
||||
Auslöser war die User-Beobachtung „die S/R-Linien liegen oft sehr nahe beieinander" —
|
||||
quantifiziert stimmte das: **71 % der M5-Level lagen näher als 1×ATR** (Median-Abstand
|
||||
nur 0,61×ATR). Gemessen über 80k M5-Bars in 2 Halbjahren (Trades bleiben M5, nur die
|
||||
LEVEL-Quelle variiert; Live-Exit + Echtkosten). **M30 gewinnt in BEIDEN Hälften:**
|
||||
Abstand **1,95×ATR** (nur 28 % eng) · AUC out-of-sample **0,721** (M15 0,725, M5 0,710)
|
||||
· R-Ertrag der P(break)-Close-Regel **rund doppelt** (+12.424/+13.047 vs +6.698/+7.749
|
||||
bei P<0,55). M15 lag dazwischen; M30 gewählt wegen des klar besten R-Ertrags und der
|
||||
weitesten Level. **Das P(break)-Modell wurde dafür NACHTRAINIERT** (`_PB_MU/_SD/_W`
|
||||
in `engine.py`): out-of-sample validiert (H1→H2), dann auf allen 80k Bars final
|
||||
gefittet — 34.771 Touches, Basisrate 39,4 %, Kalibrierung trifft (pred/real 23/25 ·
|
||||
38/36 · 58/59 · 86/87). Die **Merkmale bleiben M5** (mom6/mom3 auf M5-Bars), nur die
|
||||
Level sind M30. Quelle live: `wave.pb_levels30` (M30-H/L aus dem 15-s-Turn-Fetch,
|
||||
k=3, letzte 50 Bars = trainingsgleich zum 300-M5-Lookback), Fallback `pb_levels` (M5)
|
||||
beim Kaltstart. ⚠ **NICHT mitverändert: das Entry-Raum-Gate** (`wave._room_gate`) nutzt
|
||||
weiter die M5-`pb_levels` — `entry_room_atr=0.6` ist darauf kalibriert, eine Umstellung
|
||||
dort wäre ungemessen. Alte M5-Modellwerte stehen als Kommentar über `_PB_MU` (Rückweg).
|
||||
Real nach der Umstellung: R/S 84,617/83,722 = 2,9×ATR Abstand (vorher 0,28×ATR).
|
||||
**S/R-Overlay:** `get_bars` liefert `levels {res, sup}` aus **`engine._draw_levels`**
|
||||
= echte Kursstruktur (rohe M30-Pivots aus `wave.pb_levels30`, geclustert ~0,5×ATR,
|
||||
**nur die NÄCHSTE je Seite = 2 Linien total, deckungsgleich mit Dashboard
|
||||
sr-res/sr-sup** — mehr Linien tauchten beim Kurslauf laufend auf/ab, User-Feedback
|
||||
2026-07-14; identisch zur Auto-Close-Logik). ⚠ Bugfix 2026-07-14: vorher
|
||||
kamen die Linien aus `_sr_levels` (stale [zones]-Config + Tageslevel + Gaps) —
|
||||
gezeichnet wurden Uralt-Level (81,24/82,64) statt aktueller Struktur. Farben
|
||||
**blau** (User-Wunsch): Widerstand #1f6feb, Support #58a6ff. **Beschriftung**
|
||||
(2026-07-14): PWA-Achsenlabel „Widerstand"/„Unterstützung" (+Nummer ab 2);
|
||||
MQL5 zusätzlich sichtbares OBJ_TEXT-Label je Linie („Widerstand 78.65",
|
||||
~8 Kerzen vor dem rechten Rand, in Linienfarbe).
|
||||
⚠ **Kein MT5-Terminal-Zeichnen aus Python:** das `MetaTrader5`-Paket hat KEINE
|
||||
`object_create`/`OBJ_HLINE`/`chart_*`-Funktionen (nur MQL5). S/R-Linien daher im
|
||||
PWA-Chart. **Für das Desktop-Terminal: Datei-Bridge** — `engine._write_levels_file`
|
||||
(im `_run_analysis`, ~5 s, `[trading] export_mql5_levels=true`) schreibt atomar
|
||||
`<terminal>\MQL5\Files\sr_levels.csv` (`SYM;…` / `R;preis` / `S;preis` / **`CH;<U|M|L>;
|
||||
t1;p1;t2;p2`** = Regressionskanal-Anker / **`LQ;<B|A>;preis;size;<U|D>;<1|0>`** = ECHTE
|
||||
Liquiditäts-Wand + Pfeilrichtung + Dominanz (⚠ seit MQL5 v1.14 zeichnet der
|
||||
Indikator davon NUR noch den PFEIL, rechtsbündig am aktuellen Rand — Linie und
|
||||
Text-Label sind auf User-Wunsch raus, Details stehen im Tooltip) / **`LT;t1;p1;t2;p2;<U|D>`** =
|
||||
Liquiditäts-Trendlinie, s. u.); Quelle **`_draw_levels`** (S/R) +
|
||||
**`structure.channel_line`** (Kanal) + **`self.hl_walls`** (Liquidität),
|
||||
Indikator-Farben blau DodgerBlue/DeepSkyBlue, Wände grün/orangerot.
|
||||
⚠ **Chartmuster-Linien (`PT;…`) 2026-07-30 auf User-Wunsch ENTFERNT** („entferne die
|
||||
chartmuster linien aus dem mt5" — Chart war zu voll); die Muster-Kachel + das
|
||||
PWA-Chart-Overlay bleiben unverändert, nur der MT5-Export/Indikator-Handler ist raus.
|
||||
**ECHTE Liquiditäts-Wände im MT5-Chart (User-Wunsch 2026-07-30 „zeichne mir die
|
||||
liquiditätslinien in den mt5 ein"):** `core/hl_walls.py` holt vom **HL-Dashboard**
|
||||
(`GET http://127.0.0.1:8001/api/walls`, `[trading] export_hl_walls=true`) das
|
||||
**größte L2-Orderbuch-Level je Seite** — die einzigen Linien im Chart, die NICHT aus
|
||||
Pivots geschätzt sind, sondern **tatsächlich ruhende Orders** zeigen (Pepperstone =
|
||||
Market Maker, liefert kein Buch). ⚠ **Basis-Korrektur zwingend:** HL `xyz:CL` notiert
|
||||
**~0,45 $ unter** dem CFD (anderer Kontrakt/Contango) — die Umrechnung passiert
|
||||
serverseitig im HL-Projekt (Median über 60 Snapshots), hier kommt schon
|
||||
`bid_mt5`/`ask_mt5` an; fehlt die Basis, wird NICHT gezeichnet. ⚠ **`127.0.0.1`, nicht
|
||||
`localhost`** (IPv6-Auflösung → 2066 ms statt 19–46 ms, lief in den 2-s-Timeout) und
|
||||
der HL-Endpoint liest **nur seine DB** (live-`fetch_l2_book` dauerte ~2 s = Timeout).
|
||||
**Pfeil + Liquiditäts-Trendlinie (User-Wunsch 2026-07-30, Indikator v1.13):**
|
||||
(a) Jede Wand bekommt einen **Pfeil in ihrer Wirkrichtung** (Wingdings 233/234) —
|
||||
Lesart **„die Wand HÄLT"**: Nachfrage-Wand stützt von unten (▲), Angebots-Wand
|
||||
deckelt (▼); die **größere** der beiden wird dicker gezeichnet + „<<" im Label
|
||||
(`dominant` aus dem Endpoint). ⚠ **Die Pfeilrichtung ist INTERPRETATION, nicht
|
||||
gemessen** — die Gegenthese („Liquidity Grab": der Kurs läuft ZUR Wand, um sie
|
||||
abzuräumen) ist genauso verbreitet. Welche stimmt, beantwortet `analyze_bookflow.py`
|
||||
(Frage 3) nach genug Daten; bis dahin ist der Pfeil eine Lese-Hilfe, kein Signal.
|
||||
(b) **Pinke Liquiditäts-Trendlinie** (`OBJ_TREND`, nach rechts verlängert,
|
||||
`InpShowLiqTrend`/`InpLiqTrendColor`): lineare Regression über den **volumen-
|
||||
gewichteten Wand-Schwerpunkt** `(bid_px·bid_sz + ask_px·ask_sz)/(bid_sz+ask_sz)`
|
||||
der letzten **60 min** (≥20 Punkte nötig). ⚠ Sie zeigt etwas ANDERES als eine
|
||||
Kurs-Trendlinie: **wohin das Gewicht der RUHENDEN Orders wandert**, nicht wohin der
|
||||
gehandelte Preis läuft — steigt sie, ziehen die Käufer ihre großen Gebote hoch.
|
||||
Zeiten werden im Bot in **Broker-Zeit** umgerechnet (`trader._broker_offset_s()`),
|
||||
weil MT5-Charts die brauchen; Preise sind bereits basis-korrigiert.
|
||||
Fail-safe: HL-Server aus → keine Linien, kein Fehler (Log 1×, dann still), Cache 10 s,
|
||||
Daten älter als 60 s werden verworfen. **REINE ANZEIGE** — ob HL-Buch-Signale auf den
|
||||
CFD übertragbar sind, wird gerade gemessen (`analyze_bookflow.py` im HL-Projekt,
|
||||
Datensammlung seit 2026-07-30, Urteil in ~2 Wochen). Der Indikator
|
||||
**`mql5/SR_Levels.mq5`** (**v1.29** — `LQ`-Handler zeichnet seit v1.14 **nur noch
|
||||
den PFEIL**, rechtsbündig am aktuellen Rand (in `RepositionLabels()` nachgeführt,
|
||||
bleibt beim Scrollen rechts; Details im **Tooltip**) — Linie und Text-Label sind
|
||||
auf User-Wunsch raus („Chart zu voll"). **v1.15 = CHART-THEME** (User „Farben im
|
||||
MT5 wie im Bild"): `ApplyTheme()` setzt beim Start Hintergrund/Gitter/Kerzenfarben
|
||||
auf die Dashboard-Palette — Bull **#3B82F6**, Bear **#EF4444**, BG **#0D1117**,
|
||||
Gitter **#10151C** (dezent), Text #8B949E; Liquiditäts-Pfeile **Gold #F59E0B**
|
||||
(= „Liquiditätszone" der Legende). ⚠ Das ändert das Chart **dauerhaft** (bleibt
|
||||
auch nach Entfernen des Indikators) → `InpApplyTheme=false` schaltet es ab, alle
|
||||
Farben sind einzeln als Inputs überschreibbar. Schalter: `InpShowWalls`/
|
||||
`InpWallBidColor`/`InpWallAskColor`/`InpShowLiqTrend`/`InpLiqTrendColor`;
|
||||
PT-Handler entfernt; in `MQL5\Indicators\`, **braucht
|
||||
`OnCalculate` als No-op** sonst Compile-Error, F7-kompilieren, auf den Chart ziehen)
|
||||
liest die S/R-Linien per Timer (OBJ_HLINE) UND den **M30-Regressionskanal als 3
|
||||
diagonale Trendlinien** (OBJ_TREND, nach rechts verlängert, oben/unten gestrichelt/
|
||||
Mitte gepunktet grau; `InpShowChannel`/`InpChanColor`, Default an) — Anker in
|
||||
Broker-Zeit (= Server-Zeit im Terminal), zeichnet **nur bei Datei-Änderung neu**
|
||||
(Inhalts-Cache `g_last` gegen Flackern). Der Kanal ist dieselbe M30-Definition wie
|
||||
PWA-Overlay + Marktstruktur-Kachel; ⚠ nach dem Update den Indikator **neu F7-
|
||||
kompilieren** (v1.10). Die dynamische Handels-Range (`DrawRange`, Hoch/Tief
|
||||
der letzten `InpRangeBars` Kerzen) ist **per Default AUS** (`InpShowRange=false`,
|
||||
User-Wunsch 2026-07-14) — bei Bedarf über die Indikator-Eingaben aktivierbar. (Die
|
||||
statischen `[zones]`-Config werden NICHT mehr in die CSV geschrieben — waren stale
|
||||
WTI-Level, füllten den Chart.)
|
||||
**Architektur bewusst: Python = Gehirn (Analyse/Strategie/PWA/News/LLM/Reports),
|
||||
MQL5 = nur dünne Zeichen-Schicht.** Kein Full-Rewrite in MQL5 (PWA/Backtests/
|
||||
Integrationen wären dort nicht/kaum machbar). **Sym-Zeile:** Symbol links · rechts `hdr-clock`
|
||||
(**Srv = Broker-Wallclock** aus `market.server_time` via `getUTC*`, **Lok** =
|
||||
Browser) + **Session** (`#session`; zeigt 21–22 Uhr lokal „🕘 PRIME-TIME" —
|
||||
gemessen die stärksten Stunden — und bei Headline-Burst „📰 NEWS-STURM"/„viele
|
||||
News" aus `news.storm_state()` → Snapshot `news_storm` {level: normal/elevated/
|
||||
storm, fresh, base_per_h}; Headline-Rate letzte Stunde vs Basisrate, Basis-Fenster
|
||||
min. 6 h verankert. Beides reine Anzeige) + Verbindungspunkt. Darunter Balance ·
|
||||
**Tag P/L** · Equity. **Kein** Bid/Ask/Spread (Kurs steht in der Position-Kachel,
|
||||
färbt sich nahe S/R). **Tag P/L** (`day-pl`) = realisiert heute
|
||||
(`stats_overview("today")`) + offene Position; grün/rot
|
||||
(`day_pl{realized,open,total}` im Snapshot).
|
||||
- ⚠⚠ **CHARTS-TAB KOMPLETT ENTFERNT (User-Vorgabe 2026-08-05, v=142).** Weg sind:
|
||||
Tab-Button, `#view-charts`, der gesamte `app.js`-Chart-Block (Kartenaufbau,
|
||||
`renderChart`, `loadCharts`, 20-s-Refresh, Resize-Handler), die Chart-CSS-Regeln,
|
||||
die **vendorte Bibliothek** `web/lightweight-charts.standalone.production.js`
|
||||
(164 KB) samt `<script>`-Tag — und die Backend-Kette dahinter: **`/api/bars`**
|
||||
und **`engine.get_bars`** (60 Zeilen). Beide existierten ausschliesslich für
|
||||
dieses Tab (geprüft: kein anderer Aufrufer).
|
||||
⚠ **Nicht betroffen** — sie sahen nur ähnlich aus: die **Chartmuster**-Karte
|
||||
(`#card-patterns`, Verdict-Gewicht 0,25, jetzt im Tab „SIG Live"), der
|
||||
**MQL5-Indikator** samt `sr_levels.csv`-Export (eigener Pfad über
|
||||
`_write_levels_file`, unabhängig von `get_bars`) und alle Analyse-Module
|
||||
(`structure.py`, `patterns.py`, `cone.py`) — die speisen den Snapshot, nicht das
|
||||
Chart. Der MT5-Chart bleibt also vollständig bedient.
|
||||
Verifiziert am laufenden Server: `/api/bars` → **404**, Bibliothek → **404**,
|
||||
`data-view="charts"` und `id="view-charts"` nicht mehr im ausgelieferten HTML,
|
||||
6 Tabs zu 6 Views paarig, keine verwaisten JS-Referenzen, Klammern-Balance ok.
|
||||
Zurückholen: alles liegt in der Git-Historie (Commit davor).
|
||||
|
||||
- **Gesamtempfehlung** (`#card-verdict`, ganz oben): grafische Aggregation aller
|
||||
Module — Konfidenz-Ring (conic-gradient = `conf_pct`), Bias-Balken mit Nadel
|
||||
(SHORT↔LONG) und Modul-Chips (Welle/M30/H1/KI/Elliott/**Squeeze**, je grün/rot/grau; **TU
|
||||
@@ -3272,7 +3132,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
|
||||
Signal → **Hinweis-Dialog „trotzdem eröffnen?"** (überschreibbar). CLOSE bei
|
||||
**negativem** P&L → Sicherheitsabfrage; im Plus/Breakeven direkt. Sonst keine
|
||||
Token-Dialoge (`require_token=false`). Audio braucht 1× Nutzer-Tap.
|
||||
- Asset-Version aktuell **v=141** (in `web/index.html` hochzählen, siehe Workflows).
|
||||
- Asset-Version aktuell **v=142** (in `web/index.html` hochzählen, siehe Workflows).
|
||||
Schriftgrößen 2026-07-24 global **+4px** (2× je +2px auf User-Wunsch; Body-Basis
|
||||
14→18px). ⚠ Betrifft in `style.css` sowohl `font-size:Npx` (71×) ALS AUCH die
|
||||
`font:<weight> Npx/…`-**Shorthand** (3×: `.ms-chip`/`.ms-bos-lbl`/`.sqm-badge` —
|
||||
|
||||
Reference in New Issue
Block a user