Theming

Motywy jasny/ciemny sterowane tokenami, bez przeładowania.

Tokeny

src/styles/tokens.ts: getThemeTokens(theme) / deriveSurfaceTokens(bg, text): mały, stały zestaw tokenów bazowych (tło, tekst, akcent) plus tokeny powierzchni/obramowania wyprowadzone przez mieszanie bg w stronę text, nigdy nie wprowadzając nowego odcienia.

Stosowanie bez przeładowania

src/styles/apply-theme.ts: zapisuje wynikowe niestandardowe właściwości CSS oraz atrybut data-theme na <html>; przełączanie motywów zmienia wyłącznie wartości zmiennych, bez ponownego renderu drzewa komponentów.

Zustand store

src/state/theme-store.ts: store Zustand, który zapisuje wybrany motyw w localStorage i stosuje go synchronicznie przed pierwszym renderem (bez błysku złego motywu).

Document Model

Zanim cokolwiek dotrze do komponentu, surowy dokument OpenAPI jest normalizowany do modelu w pamięci (tagGroups → endpoints), zaimplementowanego jako czysty TypeScript, testowanego niezależnie, bez zależności od React. Cztery obowiązki:

  • normalize.ts: dereferencjonuje każdy $ref przez @apidevtools/swagger-parser i grupuje endpointy po tagu, zachowując zadeklarowaną kolejność.
  • cap-depth.ts: sprawia, że zdereferencowany (i ewentualnie cykliczny) schemat jest bezpieczny dla JSON.stringify, dla przycisku „Copy OpenAPI”.
  • example.ts / schema-tree.ts: buduje przykładowy payload z tokenami typów oraz przeglądane drzewo schematu z tego samego schematu, bez zmyślania fałszywych danych.
  • filter.ts: wyszukiwanie po stronie klienta używane przez panel boczny.

Każda funkcja przechodząca po schemacie (flattenSchema, schemaToTreeNodes, extractValidationRules) śledzi odwiedzone węzły po tożsamości obiektu, nie przez numeryczny limit głębokości, więc prawdziwie rekurencyjne DTO renderuje pojedynczy znacznik (circular reference) / ↩ circular zamiast rozwijać się N razy albo się wysypać.