Zephora UI

Διαμόρφωση

Καθολικές ρυθμίσεις για κάθε component της Zephora — τύλιξε την εφαρμογή σου μία φορά με ZephoraConfigProvider και διαμόρφωσε το locale, τα επίπεδα z-index των overlay, το portal container και την προεπιλογή headless.

Ρύθμιση

import { ZephoraConfigProvider } from "@zephora/react";

export default function App() {
  return (
    <ZephoraConfigProvider
      locale="tr"
      zIndex={{ modal: 2000, toast: 2100 }}
      appendTo={typeof document !== "undefined" ? document.body : null}
      unstyled={false}
    >
      <YourApp />
    </ZephoraConfigProvider>
  );
}

ZephoraConfigProvider props

PropΤύποςΠροεπιλογήΠεριγραφή
localestring"en"Active locale for component UI strings. Only "en" is embedded; load others from @zephora/theme/locales/* (module or JSON) and register with addLocale().
zIndex{ dropdown?, overlay?, modal?, popover?, toast?, tooltip?: number }Overrides the layering of floating elements. Written as --z-index-* CSS variables on the root element.
appendToHTMLElement | nulldocument.bodyContainer that Portal-based overlays (Dialog, Select menus, Tooltip…) render into.
unstyledbooleanfalseMakes every component headless by default for Tailwind-first apps. A per-component unstyled prop still wins.

Ανάγνωση της διαμόρφωσης

import { useZephoraConfig, useLocale } from "@zephora/react";

function MyField() {
  const config = useZephoraConfig(); // { locale, zIndex, appendTo, unstyled }
  const { t, messages, locale } = useLocale();
  return <button aria-label={t("close")} />;
}

Επίπεδα z-index

Τα components παίρνουν τη σειρά στοίβαξής τους από CSS μεταβλητές με ενσωματωμένα fallbacks, οπότε τόσο ο provider όσο και το απλό CSS μπορούν να τις ρυθμίσουν εκ νέου:

:root {
  --z-index-dropdown: 1000;
  --z-index-overlay: 1040;
  --z-index-modal: 1050;
  --z-index-popover: 1060;
  --z-index-toast: 1070;
  --z-index-tooltip: 1080;
}

Σκοτεινή λειτουργία

Το @zephora/theme περιλαμβάνει αυτόματους βοηθούς σκοτεινής λειτουργίας. Το hook useColorScheme επιλύει ένα σχήμα (με mode: "system" ακολουθεί ζωντανά την προτίμηση του λειτουργικού) και εξ ορισμού εφαρμόζει το επιλυμένο θέμα καθολικά:

import { useColorScheme } from "@zephora/theme";

function App() {
  // mode: "light" | "dark" | "system" (default "system")
  const { scheme, theme } = useColorScheme({ mode: "system" });
  return <span>Active scheme: {scheme}</span>;
}

useColorScheme(options) props

PropΤύποςΠροεπιλογήΠεριγραφή
mode"light" | "dark" | "system""system""system" follows the OS preference live; "light"/"dark" force a scheme.
light / darkThemelightTheme / darkThemeTheme objects used for each scheme.
applybooleantrueWrite the resolved theme to document.documentElement via applyTheme.
→ returns{ scheme: "light" | "dark"; theme: Theme }The resolved scheme and the theme object in effect.

Εξάγονται και τα πρωτογενή στοιχεία χαμηλότερου επιπέδου:

import { getSystemColorScheme, watchSystemColorScheme } from "@zephora/theme";

// Reads the OS color scheme (SSR-safe; defaults to "light").
const scheme = getSystemColorScheme(); // "light" | "dark"

// Subscribes to OS changes. Returns an unsubscribe function.
const stop = watchSystemColorScheme((next) => console.log(next));
stop();

SSR χωρίς FOUC

Για server rendering, το colorSchemeCss(light?, dark?) δημιουργεί ένα στατικό stylesheet που εναλλάσσει θέματα με βάση την προτίμηση του λειτουργικού — χωρίς αναλαμπή λάθος θέματος, χωρίς ανάγκη JavaScript πριν το paint. Ο ορισμός του data-zephora-scheme στο <html> παρακάμπτει το media query (σύνδεσέ το με έναν διακόπτη χρήστη):

import { colorSchemeCss } from "@zephora/theme";

// Next.js app router — app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <head>
        <style dangerouslySetInnerHTML={{ __html: colorSchemeCss() }} />
      </head>
      <body>{children}</body>
    </html>
  );
}

Slot classNames

Τα components πολλαπλών slot (Dialog, Sheet, Tabs, Card, Popover, Tooltip…) εκθέτουν ένα συμβόλαιο κλάσεων ανά slot: το root δέχεται classNames τυποποιημένο ως Partial<Record<<Name>Slot, string>> (τα union ονομάτων slot όπως το DialogSlot εξάγονται). Οι κλάσεις slot προστίθενται μετά τις κλάσεις του module και δεν εξαρτώνται από το unstyled — λειτουργούν τόσο σε styled όσο και σε unstyled λειτουργία· στην unstyled λειτουργία είναι οι μόνες κλάσεις. Το classNames.root συγχωνεύεται μαζί με το υπάρχον prop className, το οποίο εξακολουθεί να στοχεύει το root και εφαρμόζεται τελευταίο. Για σύνθετα components, το classNames ορίζεται μία φορά στο root και μεταφέρεται στα μέρη μέσω context.

Server components

Το δημοσιευμένο bundle @zephora/react περιλαμβάνει μια οδηγία "use client", οπότε μπορείς να εισάγεις components απευθείας μέσα σε δέντρα React Server Component (Next.js app router) χωρίς να προσθέσεις εσύ την οδηγία — κάθε component της Zephora είναι client component.