import { type ClassValue, clsx } from 'clsx' import { extendTailwindMerge } from 'tailwind-merge' /** * Tailwind class merger — combines clsx (conditional classes) + tailwind-merge * (resolves conflicts: e.g. `px-2 px-4` → `px-4`). * * Standard shadcn/ui utility, used by every primitive variant. * *

tailwind-merge по умолчанию не знает наши custom typography utilities * (text-body, text-cell, text-mono, text-title-xl/lg/md, text-cap) — он * pattern-matches `text-*` как color class, поэтому считал `text-body text-ink` * конфликтом (двух color rules) и убирал первый. Результат: buttons теряли * font-size, наследовали 16px от body. * *

extendTailwindMerge регистрирует наши utilities в группе `font-size` * (separate от colors), и в группе `font-family` для text-mono/text-cap * (которые baked в Mono/Tektur respectively). Теперь `text-body text-ink` * корректно сохраняется как size + color combination. */ const customTwMerge = extendTailwindMerge({ extend: { classGroups: { 'font-size': [ 'text-body', 'text-cell', 'text-mono', 'text-cap', 'text-title-xl', 'text-title-lg', 'text-title-md', ], // text-mono / text-cap baked font-family. Регистрируем отдельной группой // чтобы конфликтовали с `font-mono` / `font-display` корректно. 'font-family': ['text-mono', 'text-cap'], }, }, }) export function cn(...inputs: ClassValue[]) { return customTwMerge(clsx(inputs)) }