Przejdź do głównej zawartości

Z-Index & Overlays

Cały stacking w aplikacji idzie przez tokeny --vista-z-* i util-klasy .vista-z-*.

Zdefiniowane w src/styles/design/surfaces.css:

TokenWartośćUżycie
--vista-z-background0Background layer
--vista-z-base1Base content
--vista-z-sidebar10Sidebar
--vista-z-topbar20Top navigation
--vista-z-sticky30Sticky elements
TokenWartośćUżycie
--vista-z-hovercard200Hover cards
--vista-z-tooltip300Tooltips
--vista-z-dropdown400Dropdown menus
--vista-z-popover500Popovers
--vista-z-contextmenu550Context menus
--vista-z-floating-ui600General floating UI
--vista-z-toast650Toast notifications
--vista-z-notification700Notifications
TokenWartośćUżycie
--vista-z-overlay-backdrop995Pełnoekranowy backdrop
--vista-z-modal1000Kontenery modali/drawerów
--vista-z-modal-content1050Karta/treść modala
--vista-z-modal-floating1075Elementy pływające nad modalem (EntitySelector)
--vista-z-critical-modal1100Krytyczne potwierdzenia
TokenWartośćUżycie
--vista-z-assistant-dock1500AI assistant dock
--vista-z-assistant-floating1600AI floating panels
--vista-z-assistant-overlay1800AI overlay
--vista-z-assistant-priority2000AI priority elements
TokenWartośćUżycie
--vista-z-system-alert3000Panic alerts, system critical
// Overlay (backdrop)
<div className="fixed inset-0 vista-overlay-strong vista-z-overlay-backdrop" />
// Modal content
<div className="vista-z-modal-content vista-card rounded-2xl">
{/* content */}
</div>

Referencja: src/components/ui/Modal.tsx

Korzystają z tej samej warstwy overlayowej:

  • Root overlay: vista-z-overlay-backdrop
  • Panel/drawer: dziedziczy stacking z kontenera

Scenariusz: dialog otwiera EntitySelector (pacjent/wizyta).

// EntitySelector dropdown
<div className="vista-z-modal-floating vista-dropdown vista-card">
{/* options */}
</div>

Portal target: Gdy EntitySelector jest wywołany z wnętrza modala, przekazujemy portalTarget (root tego modala).

Referencje:

  • src/components/selectors/EntitySelector.tsx
  • src/components/tasks/TaskDrawer.tsx
  • src/components/tasks/PatientSelector.tsx
ElementKlasa
Tooltips.vista-z-tooltip
Dropdowny.vista-z-dropdown
Popovery.vista-z-popover
Floating tools.vista-z-floating-ui

Przykłady:

  • FieldTooltip, TermTooltip – tooltips
  • ExportKebabMenu – dropdown
  • VisitSummaryCard – popover
  • ToolsTray, AI chat DnD overlay – floating-ui

Wszystkie warstwy asystenta używają dedykowanych utili:

// AI diagnostics drawer
<div className="vista-z-assistant-overlay">
{/* AI content */}
</div>
  1. Nie używaj z-[…] w komponentach produkcyjnych

    • Wyjątek: definicje w utilities.css / surfaces.css
  2. Używaj najbliższej pasującej klasy:

    • tooltip → .vista-z-tooltip
    • dropdown → .vista-z-dropdown
    • modal overlay → .vista-z-overlay-backdrop
  3. Nowy poziom? Dodaj token:

    • Dopisz --vista-z-* w surfaces.css
    • Dodaj .vista-z-* w utilities.css
    • Dopiero potem użyj
  4. W modalach używaj portalTarget:

    • Preferuj portalTarget + vista-z-modal-floating
    • Zamiast ścigania się z overlayami na document.body
PlikZawartość
src/styles/design/surfaces.cssTokeny --vista-z-*
src/styles/design/utilities.cssKlasy .vista-z-*

Vista wykorzystuje natywne efekty przezroczystości (vibrancy) na macOS i Windows dla efektu “Liquid Glass”.

Wymagane ustawienia (już zaimplementowane):

/* index.html + tailwind.css */
html, body, #root {
background: transparent;
height: 100vh;
border-radius: 8px;
overflow: hidden;
}
/* vista-window-root / vista-window-shell */
/* Full-screen wrappy bez background */

macOS - NSVisualEffectView z wyborem materiału:

ProfilMateriałUżycie
HudHudWindowLegacy/pro
SidebarSidebarPanele boczne
AppearanceAppearanceBasedDomyślny - system wybiera
WindowBgWindowBackgroundFallback

Windows - Acrylic z fallback na blur:

// apply_acrylic z fallbackiem apply_blur

Dla detached windows (np. AI Assistant popup):

useAssistantDetachedWindow.ts
if (isTauriEnv) {
await safeInvoke('vista_apply_glass', {
label: DETACHED_WINDOW_LABEL
});
}
KlasaUżycie
vista-vibrancy-highTitlebar, intensywne szkło
vista-vibrancy-mediumSidebar, panele boczne
vista-vibrancy-cardKarty, popovery, wizardy

Czego NIE robić:

  1. Zero pełnoekranowego, kryjącego tła (background: #000)
  2. Nie tworzymy “drugiego okna w oknie”
  3. Nie zakładamy że blur jest zawsze włączony (Reduce Transparency)

Co robić ZAWSZE:

  1. Budować na .vista-window-root + .vista-window-shell
  2. Używać istniejących klas vibrancy
  3. Przy overlayach: rgba(..., alpha < 1) - nigdy pełne krycie
// Overlay (backdrop) - półprzezroczysty
<div className="fixed inset-0 bg-black/25 vista-z-overlay-backdrop" />
// Główna karta - szklana
<div className="vista-vibrancy-card vista-z-modal-content rounded-2xl">
{/* content */}
</div>

Przy projektowaniu pamiętaj:

  • Apple HIG sekcja “Materials” - semantyczne materiały
  • Użytkownik może mieć “Reduce Transparency” włączone
  • UI musi być czytelny bez blur
/* Top titlebar */
.vista-titlebar-glass {
@apply vista-vibrancy-high;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
/* Sidebar */
.vista-sidebar-panel {
@apply vista-vibrancy-medium;
border-right: 1px solid rgba(255, 255, 255, 0.08);
}