ДокумСнтация

Установка Tailwind

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ„Ρ€ΠΎΠ½Ρ‚-энд прилоТСния

npx create-react-app my-project
cd my-project

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сами ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ тэилвинда

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ

tailwind.config.js

/** @type {import('tailwindcss').Config} */
module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
	theme: {
		extend: {},
	},
	plugins: [],
};

И эти строки Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² основной Ρ„Π°ΠΉΠ» стилСй

index.css

@tailwind base;
@tailwind components;
@tailwind utilities;

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Tailwind VS code

Π­Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π°Π²Ρ‚ΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ‚ ΠΏΠΎΠ΄ Tailwind

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π²Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° Π½ΡƒΠΆΠ½Ρ‹ для Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прСпроцСссора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ тэилвинд

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ тэилвиндовский

ΠžΡ‚ΡΡ‚ΡƒΠΏΡ‹ (margin, padding, borders)

m-10 - margin:10rem mx-10 - сдСлаСт ΠΌΠ°Ρ€Π΄ΠΆΠΈΠ½ ΠΏΠΎ оси x my-10 - сдСлаСт ΠΌΠ°Ρ€Π΄ΠΆΠΈΠ½ ΠΏΠΎ оси y m-auto/ mx-auto /my-auto - сдСлаСт автоматичСский ΠΌΠ°Ρ€Π΄ΠΆΠΈΠ½ ΠΏΠΎ всСм осям, Π»ΠΈΠ±ΠΎ справа слСва ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ, Π»ΠΈΠ±ΠΎ ΠΎΡ‚Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ свСрху снизу ΠΏΠΎ сСрСдинС

-m-10 - ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ€Π΄ΠΆΠΈΠ½ -mx-10 - ΠΏΠΎ оси x -my-10 - ΠΏΠΎ оси y

p-10 - Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ со всСх сторон px-10 - сдСлаСт ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΠΏΠΎ оси x py-10 сдСлаСт ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΠΏΠΎ оси y p-auto/ px-auto /py-auto

-p-10 - Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ -px-10 - ΠΏΠΎ оси x -py-10 - ΠΏΠΎ оси y

function App() {
	return (
		<div className='App'>
			<h1 className="m-10">Tailwind CSS</h1>
			<button className='mx-10'>Login</button>
		</div>
	);
}

border - создаст Π³Ρ€Π°Π½ΠΈΡ†Ρƒ Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½ΠΎΠΉ 1 пиксСль border-Ρ†Π²Π΅Ρ‚-Π½Π°ΡΡ‹Ρ‰Π΅Π½Π½ΠΎΡΡ‚ΡŒ - создаст Ρ€Π°ΠΌΠΊΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° rounded-ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ - скруглит Ρ€Π°ΠΌΠΊΡƒ

Π¨Ρ€ΠΈΡ„Ρ‚ (Ρ€Π°Π·ΠΌΠ΅Ρ€, Ρ†Π²Π΅Ρ‚, ΠΆΠΈΡ€Π½ΠΎΡΡ‚ΡŒ)

text-xl - этим классом ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΆΠΈΡ€Π½ΠΎΡΡ‚ΡŒ тСкста (ΠΎΡ‚ xl Π΄ΠΎ 4xl) font-bold - ΠΆΠΈΡ€Π½Ρ‹ΠΉ тСкст text-center - Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ тСкста text-Ρ†Π²Π΅Ρ‚-Π½Π°ΡΡ‹Ρ‰Π΅Π½Π½ΠΎΡΡ‚ΡŒ - ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° тСкста

Π¨ΠΈΡ€ΠΈΠ½Π°, высота

w-число - опрСдСляСт ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΊΠ½Π° w-screen - width: 100vw w-full - width: 100%

h-число - ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ высоту ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° h-screen - height: 100vw h-full - height: 100%

hover, focus, before, after…

bg-purple-500 - Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ·Ρ‹Π²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚Π° для bg bg-opacity-60 - ΠΈ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠΆΠ΅

  • hover:ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ-ΠΈΡ‚ΠΎΠ³ - дСйствиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ hover:bg-opacity-100 - Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Ρ„ΠΎΠ½Π° ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ = 100%
  • hover/focus/before/after:ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ-ΠΈΡ‚ΠΎΠ³ - Ρ‚Π°ΠΊ ΠΆΠ΅ со всСми ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ элСмСнтами

function App() {
	return (
		<div className='App border border-emerald-600 rounded-md m-10 p-4'>
			<h1 className='text-4xl font-bold text-center text-gray-600'>
				Hello Tailwind CSS
			</h1>
			<button
				className='block mt-10 mx-auto px-4 py-2
				bg-purple-500 bg-opacity-60 rounded-lg
				hover:bg-opacity-100'
			>
				Login
			</button>
		</div>
	);
}

Transition

transition - опрСдСляСт ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ transition-[colors/opacity/shadow/transform] - Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для Ρ†Π²Π΅Ρ‚ΠΎΠ², нСпрозрачности, Ρ‚Π΅Π½Π΅ΠΉ ΠΈ трансформации transition-all - Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° всС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ для элСмСнта

delay-[число] - Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

ease-in-out - Ρ‚ΠΈΠΏ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ

Анимации

animate-[анимация] - позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ (Π·Π°Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΡŽ) Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ animate-spin - анимация кручСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Адаптация - ΠΌΠ΅Π΄ΠΈΠ° запросы

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ измСнСния ΠΏΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ экранов: sm, md, lg, xl, 2xl (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ примСнСния Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π² bootstrap - mobile-first)

<div className='App border border-emerald-600 rounded-md m-10 p-4'>
	<h1 className='text-4xl font-bold text-center text-gray-600'>Hello Tailwind CSS</h1>
	<button className='block mt-10 mx-auto px-4 py-2 bg-green-500 bg-opacity-60 rounded-lg md:bg-purple-500'>
		Login
	</button>
</div>

Π’Π΅ΠΌΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

dark:[ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ свойство] - ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ настройки, Ссли Π½Π° ПК установлСна тёмная Ρ‚Π΅ΠΌΠ°

@apply ΠΈ module.scss

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ стили ΠΊ скрипту Π² .module Ρ€Π΅ΠΆΠΈΠΌΠ΅ (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ· JSX ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² стили Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²) styles.parent - обращаСтся ΠΊ стилям styles ΠΈ Π±Π΅Ρ€Ρ‘Ρ‚ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° стили класса parent

App.js

import styles from './App.module.scss';
 
function App() {
	return (
		<div className={`App ${styles.parent}`}>
			<h1 className={styles.heading}>Hello Tailwind CSS</h1>
			<button className={styles.button}>Login</button>
		</div>
	);
}
 
export default App;

Π”ΠΈΡ€Ρ€Π΅ΠΊΡ‚ΠΈΠ²Π° @apply Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² PostCSS, которая позволяСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ стили тэилвинда прямо Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° CSS

App.module.scss

.parent {
	@apply border border-emerald-600 rounded-md m-10 p-4;
 
	.heading {
		@apply text-4xl font-bold text-center text-gray-600;
	}
 
	.button {
		@apply block mt-10 mx-auto px-4 py-2 bg-green-500 bg-opacity-60 rounded-lg md:bg-purple-500 dark:bg-rose-500 transition-all;
 
		&:hover {
			@apply bg-green-900;
		}
	}
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° вСрсткС Ρ„ΠΎΡ€ΠΌΡ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

App.js

import { useState } from 'react';
import styles from './App.module.scss';
 
function App() {
	const [email, setEmail] = useState('');
	const [password, setPassword] = useState('');
 
	return (
		<div className={`App ${styles.parent}`}>
			<h1 className={styles.heading}>Hello Tailwind CSS</h1>
			<div>
				<input
					className={styles.input}
					placeholder='Login'
					value={email}
					onChange={(e) => setEmail(e.target.value)}
				/>
				<input
					className={styles.input}
					placeholder='Password'
					value={password}
					onChange={(e) => setPassword(e.target.value)}
				/>
				<button className={styles.button}>Login</button>
			</div>
		</div>
	);
}
 
export default App;

App.module.scss

.parent {
	@apply mx-auto mt-0 w-80;
 
	.heading {
		@apply text-2xl font-bold text-center text-white my-6;
	}
 
	> div {
		@apply shadow-2xl rounded-sm overflow-hidden;
 
		.input {
			@apply block w-full py-3 px-4 bg-white bg-opacity-10 border-r-2 border-transparent placeholder:text-slate-500 outline-none text-slate-50 transition-all;
 
			&:focus {
				@apply border-slate-400;
			}
		}
 
		.button {
			@apply block w-full py-2.5 bg-orange-500 text-white transition-all font-bold text-lg;
 
			&:hover {
				@apply bg-orange-600;
			}
		}
	}
}

Tailwind Config

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ значСния Π² theme, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Если ΠΌΡ‹ Π½Π°Ρ‡Π½Ρ‘ΠΌ ΠΈΡ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ прямо Π² Ρ‚Π΅ΠΌΠ΅, Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ этой Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚

/** @type {import('tailwindcss').Config} */
module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
	// Ссли Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ прямо Ρ‚ΡƒΡ‚, Ρ‚ΠΎ ΠΌΡ‹ замСняСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»
	theme: {
		// замСняСм всС Ρ†Π²Π΅Ρ‚Π° Π½Π° подставлСнныС
		colors: {
			primary: 'red',
		},
		extend: {},
	},
	plugins: [],
};

Однако, Ссли ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ просто Π² Ρ‚Π΅ΠΌΡ‹, Π° Π² extend, Ρ‚ΠΎ всС Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ значСния останутся

/** @type {import('tailwindcss').Config} */
module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
 
	theme: {
		// Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»
		extend: {
			colors: {
				primary: 'red',
			},
			spacing: {
				0.5: '0.12rem',
			},
		},
	},
	plugins: [],
};

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ значСния Π½Π° свои, прописав это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ помСняв свойство DEFAULT

/** @type {import('tailwindcss').Config} */
module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
 
	theme: {
		extend: {
			transitionTimingFunction: {
				DEFAULT: 'ease-in-out',
			},
			transitionDuration: {
				DEFAULT: '400ms',
			},
		},
	},
	plugins: [],
};

А ΡƒΠΆΠ΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для Π½Π°ΡˆΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
 
	theme: {
		extend: {
			transitionTimingFunction: {
				DEFAULT: 'ease-in-out',
			},
			transitionDuration: {
				DEFAULT: '400ms',
			},
			// Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ
			keyframes: {
				// названиС шаблона
				fadeIn: {
					from: {
						opacity: 0,
					},
					to: {
						opacity: 1,
					},
				},
			},
			// Ρ‚ΡƒΡ‚ ΡƒΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ animation ...
			animation: {
				// ... Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ fade
				fade: 'fadeIn 0.5s ease-in-out'
			}
		},
	},
	plugins: [],
};

Π’Π°ΠΊ ΠΆΠ΅ Ρ‚ΡƒΡ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свои малСнькиС значСния z-index, Ссли Π½Π°ΠΌ понадобятся (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² тэилвиндС ΠΎΠ½ΠΈ ΠΈΠ΄ΡƒΡ‚, начиная с 10)

module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
 
	theme: {
		extend: {
			zIndex: {
				1: '1',
				2: '2',
			},
		},
	},
	plugins: [],
};

ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹

Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ с npm, Π»ΠΈΠ±ΠΎ ΠΎΡ‚ самих Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

npm i -D @tailwindcss/typography

Π’ΡƒΡ‚ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π°Ρ… ΠΎΠ½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ

module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
	theme: {
		extend: {},
	},
	plugins: [require('@tailwindcss/typography')],
};

И Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ описываСтся, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ

<article class='prose lg:prose-xl'>
	<h1>Garlic bread with cheese: What the science tells us</h1>
	<p>
		For years parents have espoused the health benefits of eating garlic bread with cheese to
		their children, with the food earning such an iconic status in our culture that kids will
		often dress up as warm, cheesy loaf for Halloween.
	</p>
	<p>
		But a recent study shows that the celebrated appetizer may be linked to a series of rabies
		cases springing up around the country.
	</p>
</article>

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ

Π’Π°ΠΊ ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ plugin() ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ addComponents(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² сСбя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ стили для Π½Π΅Π³ΠΎ

/** @type {import('tailwindcss').Config} */
import plugin from 'tailwindcss/plugin';
 
module.exports = {
	content: ['./src/**/*.{js,jsx,ts,tsx}'],
	theme: {
		extend: {},
	},
	plugins: [
		plugin(({ addComponents, theme, addUtilities }) => {
			// Ρ‚ΡƒΡ‚ ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚
			addComponents({
				'.btn-primary': {
					// пишСм стили
					// Ρ‚ΡƒΡ‚ ΠΌΡ‹ Π±Π΅Ρ€Ρ‘ΠΌ стили ΠΈΠ· tailwind
					backgroundColor: theme('colors.orange.500'),
 
					// Π° Ρ‚ΡƒΡ‚ пишСм стили ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ
					color: 'white',
					padding: '10px 0',
					display: 'block',
					width: '100%',
					fontSize: 18,
					fontWeight: 'bold',
 
					// это ΡΡ‚ΠΈΠ»ΡŒ-псСвдокласс
					'&:hover': {
						backgroundColor: theme('colors.orange.600'),
					},
				},
			});
		}),
	],
};

Π’Π°ΠΊ выглядит ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°

.button {
	@apply btn-primary transition-all;
 
	&:hover {
		@apply bg-orange-600;
	}
}

ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Π°Ρ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° - это нСбольшоС Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π° Π½Π΅ Ρ†Π΅Π»Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСтся Ρ‡Π΅Ρ€Π΅Π· addUtilities()

plugins: [
		plugin(({ addComponents, theme, addUtilities }) => {
			// Ρ‚ΡƒΡ‚ ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚
			addComponents({
				'.btn-primary': {
					// пишСм стили
					// Ρ‚ΡƒΡ‚ ΠΌΡ‹ Π±Π΅Ρ€Ρ‘ΠΌ стили ΠΈΠ· tailwind
					backgroundColor: theme('colors.orange.500'),
 
					// Π° Ρ‚ΡƒΡ‚ пишСм стили ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ
					color: 'white',
					padding: '10px 0',
					display: 'block',
					width: '100%',
					fontSize: 18,
					fontWeight: 'bold',
 
					// это ΡΡ‚ΠΈΠ»ΡŒ-псСвдокласс
					'&:hover': {
						backgroundColor: theme('colors.orange.600'),
					},
				},
			});
			// Ρ‚ΡƒΡ‚ ΡƒΠΆΠ΅ ΠΌΡ‹ добавляСм ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΊΡƒ
			addUtilities({
				'.textShadow': {
					textShadow: '1px 1px rgba(0, 0, 0, 0.4)',
				},
			});
		}),
	],