@akhatmirzo/ui

Bu eski versiya hujjati

Siz v0.2 hujjatini o'qiyapsiz. Eng so'nggi versiya — v0.3.

Eng so'nggisiga o'tish →

Mavzu va tokenlar

Ranglar, tipografiya, radius, soya, animatsiya va brend rangini o'zgartirish.

Butun dizayn bitta faylda — @akhatmirzo/tokens/theme.css. Unda CSS o'zgaruvchilari (--ak-*) va ularni Tailwind utilitalariga ulaydigan @theme bloki bor. Komponentlar hech qachon indigo-600 kabi xom rangni ishlatmaydi — faqat bg-primary, text-text-muted kabi semantik tokenlarni. Shuning uchun dark mode va brend rangi bitta joyda almashadi.

app.css
@import 'tailwindcss';
@import '@akhatmirzo/tokens/theme.css';

Tokenlar ikki qavatli:

  1. Bazaviy shkalalar — --ak-indigo-600, --ak-slate-200 ... Faqat semantik tokenlarni yasash uchun. Komponentlarda va ilova kodida to'g'ridan-to'g'ri ishlatmang.
  2. Semantik tokenlar — --ak-surface, --ak-text-muted, --ak-primary ... Ular light va dark rejimda turli bazaviy qiymatga ishora qiladi va Tailwind'da bg-surface, text-text-muted, bg-primary bo'lib chiqadi.

Ranglar palitrasi

Asosiy rang — indigo, neytral — slate. Status ranglari: emerald (success), amber (warning), rose (danger) va sky (info). Qiymatlar to'g'ridan-to'g'ri theme.css dan o'qiladi.

indigo
50
100
200
300
400
500
600
700
800
900
950
slate
50
100
200
300
400
500
600
700
800
900
950
emerald
50
100
300
400
500
600
700
950
amber
50
100
300
400
500
600
700
950
rose
50
100
300
400
500
600
700
950
sky
50
100
300
400
500
600
700
950

Semantik tokenlar

Kod yozganda shu ro'yxatdan tanlang. Sayt mavzusini almashtirib ko'ring — rang namunalari va qiymatlar dark rejimga o'tadi.

backgroundSahifa foni—
surfaceKarta, input, modal—
surface-mutedHover, ikkilamchi fon—
surface-raisedPopover, toast—
borderOddiy chegara—
border-strongHover chegara—
textAsosiy matn—
text-subtleGhost tugma, ikonka—
text-mutedYordamchi matn—
text-faintPlaceholder—
primaryAsosiy tugma—
primary-softSoft tugma, badge—
primary-soft-foregroundSoft ustidagi matn—
linkHavola—
dangerXavfli tugma—
ringFokus halqasi—
TokenTailwindLightDarkQayerda
backgroundbg-backgroundslate-50slate-900Sahifa foni
surfacebg-surfaceoqslate-800Karta, input, modal
surface-mutedbg-surface-mutedslate-100slate-700Hover, ikkilamchi fon
surface-raisedbg-surface-raisedoqslate-750Popover, toast, menyu
borderborder-borderslate-200slate-700Oddiy chegara
border-strongborder-border-strongslate-300slate-600Hover chegara
texttext-textslate-900slate-100Asosiy matn
text-subtletext-text-subtleslate-700slate-300Ghost tugma, ikonkalar
text-mutedtext-text-mutedslate-500slate-400Yordamchi matn
text-fainttext-text-faintslate-400slate-500Placeholder
primarybg-primaryindigo-600indigo-600Asosiy tugma
primary-hoverbg-primary-hoverindigo-700indigo-500Asosiy tugma hover
primary-foregroundtext-primary-foregroundoqoqPrimary ustidagi matn
primary-softbg-primary-softindigo-50indigo-950Soft tugma, badge
primary-soft-hoverbg-primary-soft-hoverindigo-100indigo-900Soft tugma hover
primary-soft-foregroundtext-primary-soft-foregroundindigo-700indigo-300Soft ustidagi matn
linktext-linkindigo-600indigo-300Havolalar
ringoutline-ringindigo-500 / 40%indigo-400 / 50%Fokus halqasi
overlaybg-overlayslate-900 / 40%slate-950 / 60%Modal ortidagi fon
dangerbg-dangerrose-600rose-500Xavfli tugma
danger-hoverbg-danger-hoverrose-700rose-600Xavfli tugma hover
danger-ringoutline-danger-ringrose-500 / 25%rose-500 / 35%Xato holatidagi fokus

Dark rejimda primary o'zgarmaydi

Asosiy tugma ikkala rejimda ham indigo-600. Indigo-500 oq matn bilan WCAG AA kontrast chegarasiga yetmaydi, shuning uchun dark rejimda faqat hover ochroq bo'ladi.

Status ranglari

Har bir status uchun ikki to'plam: soft — badge va xabarlar foni, solid — nuqta va to'liq bo'yalgan badge'lar.

softsuccesswarningdangerinfo
solidsuccesswarningdangerinfo
StatusSoftSolid
successbg-success-soft text-success-soft-foregroundbg-success text-success-foreground
warningbg-warning-soft text-warning-soft-foregroundbg-warning text-warning-foreground
dangerbg-danger-soft text-danger-soft-foregroundbg-danger text-danger-foreground
infobg-info-soft text-info-soft-foregroundbg-info text-info-foreground

Tipografiya

Asosiy shrift — Manrope (lotin va kirill), kod uchun — JetBrains Mono. theme.css shriftlarni yuklamaydi, faqat nomini beradi (font-sans, font-mono). Ularni alohida ulang:

pnpm add @fontsource-variable/manrope @fontsource-variable/jetbrains-mono
app.css
@import '@fontsource-variable/manrope';
@import '@fontsource-variable/jetbrains-mono';

Shrift yuklanmasa, tizim shrifti (ui-sans-serif, system-ui) ishlatiladi. O'lchamlar shkalasi qator balandligi va harf oralig'i bilan birga keladi:

text-4xl36 / 40

O'zbekiston — Ўзбекистон

text-3xl30 / 36

O'zbekiston — Ўзбекистон

text-2xl24 / 32

O'zbekiston — Ўзбекистон

text-xl20 / 28

O'zbekiston — Ўзбекистон

text-lg18 / 28

O'zbekiston — Ўзбекистон

text-base16 / 24

O'zbekiston — Ўзбекистон

text-sm14 / 20

O'zbekiston — Ўзбекистон

text-xs12 / 16

O'zbekiston — Ўзбекистон

font-mono: 1 250 000 so'm · +998 90

Qalinlik o'lchamga bog'lanmagan — har bir komponent font-medium, font-semibold ni o'zi belgilaydi. Tavsiya: tugma va label — 500, sarlavha — 600, katta sarlavha — 700. Jadval va narxlarda raqamlar tekis turishi uchun tabular-nums qo'shing.

Radius va soyalar

Tugma va input — rounded-lg (12px), karta va popover — rounded-xl (16px), modal va drawer — rounded-2xl (20px). Soyalar qora emas, slate-900 rangida — yumshoqroq ko'rinadi. Dark rejimda shadow-md dan boshlab soyaga 1px halqa qo'shiladi, chunki qorong'i fonda soyaning o'zi deyarli ko'rinmaydi.

rounded-sm6px
rounded-md8px
rounded-lg12px
rounded-xl16px
rounded-2xl20px
rounded-full9999px
shadow-xsInput, tugma
shadow-smKarta
shadow-mdDropdown
shadow-lgPopover, toast
shadow-xlModal, drawer

Animatsiya

Animatsiya — bezak emas, ma'lumot: element qayerdan kelib, qayerga ketganini ko'rsatadi. Kirish sekinroq va ease-out, chiqish tezroq va ease-in.

ease-outKirishlar (asosiy)
ease-inChiqishlar
ease-in-outJoyida o'zgarish
ease-springToast, switch
DavomiylikQiymatQayerda
duration-fast100msHover, bosish, dropdown yopilishi
duration-base150msDropdown ochilishi, tooltip
duration-moderate200msModal ochilishi, accordion, tabs
duration-slow300msDrawer, toast kirishi

Easing: ease-out (asosiy), ease-in, ease-in-out, ease-spring (kamdan-kam — toast, switch). Overlay'lar uchun tayyor keyframe'lar ham bor: animate-dialog-in/out, animate-popover-in/out, animate-tooltip-in/out, animate-slide-in-right (va left, top, bottom), animate-toast-in/out, animate-accordion-down/up, shuningdek animate-spinner va animate-shimmer.

prefers-reduced-motion

Foydalanuvchi tizimda "kam animatsiya"ni yoqqan bo'lsa, popover siljishi o'chadi. O'z animatsiyalaringizda motion-reduce: variantidan foydalaning.

Qatlamlar (z-index)

Tailwind'ga ulanmagan — CSS o'zgaruvchisi orqali ishlating: z-(--ak-z-modal).

O'zgaruvchiQiymatKim
--ak-z-dropdown1000Dropdown, Select, Combobox, Popover
--ak-z-overlay1100Dialog, Drawer va Command Palette foni
--ak-z-modal1110Dialog, Drawer va Command Palette paneli
--ak-z-toast1200Toast
--ak-z-tooltip1300Tooltip

Brend rangini almashtirish

Brend rangi --ak-primary* guruhida. Ularni theme.css dan keyin qayta belgilang — komponentlarga tegish shart emas. Quyida misol: brend rangi blok ichida almashadi.

Yangi

Ilova bo'ylab almashtirish uchun light va dark qiymatlarni alohida yozing. Bazaviy shkaladagi istalgan rangni yoki o'z HEX qiymatlaringizni berishingiz mumkin:

app.css
@import 'tailwindcss';
@import '@akhatmirzo/tokens/theme.css';

:root,
[data-theme='light'] {
  --ak-primary: var(--ak-emerald-600);
  --ak-primary-hover: var(--ak-emerald-700);
  --ak-primary-soft: var(--ak-emerald-50);
  --ak-primary-soft-hover: var(--ak-emerald-100);
  --ak-primary-soft-foreground: var(--ak-emerald-700);
  --ak-ring: rgb(16 185 129 / 0.4);
  --ak-link: var(--ak-emerald-700);
}

[data-theme='dark'] {
  --ak-primary: var(--ak-emerald-600);
  --ak-primary-hover: var(--ak-emerald-500);
  --ak-primary-soft: var(--ak-emerald-950);
  --ak-primary-soft-hover: var(--ak-emerald-950);
  --ak-primary-soft-foreground: var(--ak-emerald-300);
  --ak-ring: rgb(52 211 153 / 0.5);
  --ak-link: var(--ak-emerald-300);
}

Dark blokni ham yozing

<html> dagi :root qiymati dark rejimga ham o'tadi: selektorlar kuchi bir xil, sizning faylingiz esa keyin keladi. Lekin rejimga qarab farq qiladigan tokenlar (soft, ring, link) va ichki data-theme="dark" bloklari uchun [data-theme='dark'] blokini to'liq yozing.

Primary ustidagi matn oq (--ak-primary-foreground). Och rang tanlasangiz (masalan amber), kontrastni tekshiring va kerak bo'lsa --ak-primary-foreground ni ham o'zgartiring.

Tailwind utilitalari

Ranglar, radius va soyalardan tashqari theme.css bir nechta tayyor utilita qo'shadi:

UtilitaNima qiladi
focus-ringFaqat klaviatura fokusida (:focus-visible) 2px halqa
focus-ring-withinInput konteyneri uchun: ichida fokus bo'lsa chegara va halqa; xatoda — danger
duration-fast … slowDavomiylik tokenlari (transition-* bilan)
ease-out, ease-spring ...Easing tokenlari
dark:data-theme="dark" ichida ishlaydi (class="dark" emas)
O'z komponentingizda
<button className="focus-ring rounded-lg bg-primary-soft px-4 py-2 text-sm font-medium text-primary-soft-foreground transition-colors duration-base hover:bg-primary-soft-hover">
  Filtr
</button>

Tailwind ishlatilmaydigan joyda (o'z CSS'ingiz, inline style, grafik kutubxonasi) ranglar, soyalar, davomiylik, easing va qatlamlar CSS o'zgaruvchilari orqali mavjud:

.chart-tooltip {
  background: var(--ak-surface-raised);
  color: var(--ak-text);
  box-shadow: var(--ak-shadow-lg);
  transition: opacity var(--ak-duration-base) var(--ak-ease-out);
  z-index: var(--ak-z-tooltip);
}

Sahifada