νμ μμ ν μ€μ μ μν Tailwind CSS μ€μ μ€ν€λ§λ₯Ό νμνμ¬ κ°λ° ν¨μ¨μ±μ λμ΄κ³ μ€λ₯λ₯Ό μ€μ΄μΈμ. μ¬μ©μ μ μ μ΅μ , νλ¬κ·ΈμΈ, λͺ¨λ² μ¬λ‘μ λν΄ μμ보μΈμ.
Tailwind CSS μ€μ μ€ν€λ§: νμ μμ ν μ€μ ꡬννκΈ°
Tailwind CSSλ κ°λ°μλ€μ΄ μΉ μ ν리μΌμ΄μ
μ μ€νμΌλ§μ μ κ·Όνλ λ°©μμ νμ νμ΅λλ€. μ νΈλ¦¬ν° μ°μ μ κ·Ό λ°©μμ λΉ λ₯Έ νλ‘ν νμ΄νκ³Ό μΌκ΄λ λμμΈμ κ°λ₯νκ² ν©λλ€. κ·Έλ¬λ νλ‘μ νΈκ° 볡μ‘ν΄μ§λ©΄μ Tailwind μ€μ νμΌμΈ tailwind.config.js
λλ tailwind.config.ts
λ₯Ό κ΄λ¦¬νλ κ²μ΄ μ΄λ €μμ§ μ μμ΅λλ€. μ μ μλ μ€μ μ€ν€λ§λ νΉν TypeScriptμ κ²°ν©λ λ νμ
μμ μ±μ μ 곡νκ³ , κ°λ° ν¨μ¨μ±μ λμ΄λ©°, μ μ¬μ μ€λ₯λ₯Ό μ€μ¬μ€λλ€. μ΄ λΈλ‘κ·Έ ν¬μ€νΈμμλ μ€μ μ€ν€λ§μ μ€μμ±, λ€μν μ¬μ©μ μ μ μ΅μ
, νλ¬κ·ΈμΈ νμ©, κ·Έλ¦¬κ³ κ²¬κ³ ν Tailwind CSS μ€μ μ μν λͺ¨λ² μ¬λ‘λ₯Ό νμν©λλ€.
Tailwind CSS μ€μ μμ νμ μμ μ±μ΄ μ€μν μ΄μ
νμ μμ μ±μ νλ μννΈμ¨μ΄ κ°λ°μ μ€μν μΈ‘λ©΄μ λλ€. μ΄λ μ ν리μΌμ΄μ μμ μ¬μ©λλ λ°μ΄ν°κ° μμλ νμ μμ 보μ₯νμ¬ λ°νμ μ€λ₯λ₯Ό λ°©μ§νκ³ μ½λ μ μ§λ³΄μμ±μ ν₯μμν΅λλ€. Tailwind CSS μ€μ μ λ§₯λ½μμ νμ μμ μ±μ λ€μκ³Ό κ°μ λͺ κ°μ§ μ£Όμ μ΄μ μ μ 곡ν©λλ€:
- μ‘°κΈ° μ€λ₯ κ°μ§: λ°νμμ΄ μλ κ°λ° μ€μ μ€μ μ€λ₯λ₯Ό μλ³ν©λλ€.
- ν₯μλ IDE μ§μ: IDEμμ μλ μμ± λ° μ μ κΈ°λ₯μ νμ©νμ¬ λ μνν κ°λ° κ²½νμ μ 곡ν©λλ€.
- μ½λ κ°λ μ± ν₯μ: μ€μ νμΌμ μ체μ μΌλ‘ λ¬Έμννκ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- 리ν©ν λ§ λΉμ© μ κ°: νλ‘μ νΈκ° λ°μ ν¨μ λ°λΌ μ€μ μ μ λ°μ΄νΈνκ³ μ μ§νλ κ³Όμ μ λ¨μνν©λλ€.
TypeScriptμ μν
JavaScriptμ μμ μ§ν©μΈ TypeScriptλ μΈμ΄μ μ μ νμ΄νμ μΆκ°ν©λλ€. Tailwind CSS μ€μ μ TypeScriptλ₯Ό μ¬μ©νλ©΄ ν λ§ κ°, νλ¬κ·ΈμΈ λ° κΈ°ν μ΅μ μ λν νμ μ μ μνμ¬ μ€μ μ΄ μ ν¨νκ³ μΌκ΄μ± μλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
Tailwind CSS μ€μ νμΌ μ΄ν΄νκΈ°
tailwind.config.js
(λλ tailwind.config.ts
) νμΌμ Tailwind CSS μ€μ μ ν΅μ¬μ
λλ€. μ΄λ₯Ό ν΅ν΄ λ€μκ³Ό κ°μ νλ μμν¬μ λ€μν μΈ‘λ©΄μ μ¬μ©μ μ μν μ μμ΅λλ€:
- ν λ§(Theme): μ¬μ©μ μ μ μμ, κΈκΌ΄, κ°κ²©, μ€λ¨μ λ±μ μ μν©λλ€.
- λ³ν(Variants): λ€μν μν(μ: hover, focus, active)μ λν λ³νμ νμ±ννκ±°λ λΉνμ±νν©λλ€.
- νλ¬κ·ΈμΈ(Plugins): μ¬μ©μ μ μ κΈ°λ₯μΌλ‘ Tailwind CSSλ₯Ό μΆκ°νκ±°λ νμ₯ν©λλ€.
- μ½ν μΈ (Content): Tailwind CSS ν΄λμ€λ₯Ό μ€μΊν νμΌμ μ§μ ν©λλ€.
κΈ°λ³Έ μ€μ ꡬ쑰
μΌλ°μ μΈ tailwind.config.js
νμΌμ λ€μκ³Ό κ°μ΅λλ€:
module.exports = {
content: [
'./src/**/*.{html,js,ts,jsx,tsx}',
'./public/index.html',
],
theme: {
extend: {
colors: {
primary: '#3490dc',
secondary: '#ffed4a',
},
fontFamily: {
sans: ['Graphik', 'sans-serif'],
},
},
},
plugins: [],
};
content
λ°°μ΄μ Tailwind CSSκ° ν΄λμ€ μ΄λ¦μ μ€μΊν΄μΌ ν νμΌμ μ§μ ν©λλ€. theme
μΉμ
μμλ κΈ°λ³Έ ν
λ§λ₯Ό μ¬μ©μ μ μν μ μκ³ , plugins
μΉμ
μμλ μ¬μ©μ μ μ νλ¬κ·ΈμΈμ μΆκ°ν μ μμ΅λλ€.
TypeScriptλ‘ μ€μ μ€ν€λ§ ꡬννκΈ°
νμ
μμ ν μ€μ μ€ν€λ§λ₯Ό ꡬννλ €λ©΄ TypeScriptλ₯Ό μ¬μ©νμ¬ μ€μ μ΅μ
μ λν νμ
μ μ μν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ tailwind.config.ts
νμΌμ μμ±νκ³ λ€μν μ€μ μΉμ
μ λν μΈν°νμ΄μ€λ νμ
μ μ μνλ κ²μ ν¬ν¨ν©λλ€.
ν λ§ νμ μ μνκΈ°
ν λ§ μΉμ μ λν νμ μ μ μνλ κ²λΆν° μμνκ² μ΅λλ€. μλ₯Ό λ€μ΄, μμ, κΈκΌ΄ κ³μ΄, κ°κ²©μ λν νμ μ λ§λ€ μ μμ΅λλ€:
// tailwind.config.ts
import type { Config } from 'tailwindcss'
import type { PluginAPI } from 'tailwindcss/types/config'
interface CustomColors {
primary: string;
secondary: string;
accent: string;
[key: string]: string; // Allow additional custom colors
}
interface CustomFontFamily {
sans: string[];
serif: string[];
mono: string[];
[key: string]: string[]; // Allow additional custom font families
}
interface CustomSpacing {
sm: string;
md: string;
lg: string;
xl: string;
[key: string]: string; // Allow additional custom spacing values
}
interface CustomTheme {
colors: CustomColors;
fontFamily: CustomFontFamily;
spacing: CustomSpacing;
}
const config: Config = {
content: [
'./src/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
extend: {
colors: {
primary: '#FF4500', // Example: Netflix red
secondary: '#007BFF', // Example: Bootstrap primary blue
accent: '#28A745', // Example: Bootstrap success green
},
fontFamily: {
sans: ['Roboto', 'sans-serif'],
serif: ['Merriweather', 'serif'],
mono: ['Courier New', 'monospace'],
},
spacing: {
sm: '8px',
md: '16px',
lg: '24px',
xl: '48px',
},
},
},
plugins: [],
}
export default config
μ΄ μμ μμλ CustomColors
, CustomFontFamily
, CustomSpacing
μ λν μΈν°νμ΄μ€λ₯Ό μ μνμ¬ κ° μΉμ
λ΄ κ°μ νμ
μ μ§μ ν©λλ€. [key: string]: string;
λ° [key: string]: string[];
λΌμΈμ νμ
μ μλ₯Ό μλ°νμ§ μμΌλ©΄μ ν
λ§μ μΆκ°μ μΈ μ¬μ©μ μ μ μμ±μ μΆκ°ν μ μλλ‘ ν©λλ€.
μ€μ μ ν λ§ νμ μ μ©νκΈ°
μ΄μ μ΄ νμ
λ€μ tailwind.config.ts
νμΌμ μ μ©ν μ μμ΅λλ€:
// tailwind.config.ts (Continued)
const config: Config = {
content: [
'./src/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
extend: {
colors: {
primary: '#3490dc',
secondary: '#ffed4a',
} as CustomColors, // Explicitly cast to CustomColors
fontFamily: {
sans: ['Graphik', 'sans-serif'],
} as CustomFontFamily, // Explicitly cast to CustomFontFamily
spacing: {
sm: '8px',
md: '16px',
lg: '24px',
xl: '48px',
} as CustomSpacing
},
},
plugins: [],
} as Config
export default config;
ν λ§ μμ±μ κ°κ°μ νμ μΌλ‘ λͺ μμ μΌλ‘ μΊμ€ν ν¨μΌλ‘μ¨ μ€μ μ΄ μ μλ μ€ν€λ§λ₯Ό μ€μνλλ‘ λ³΄μ₯ν©λλ€. μ΄μ TypeScriptκ° μ΄ μΉμ λ€μ λν΄ νμ κ²μ¬λ₯Ό μ 곡ν κ²μ λλ€.
ν λ§ νμ μ¬μ©μ μ΄μ
- μλ μμ±:
theme.colors.
λ₯Ό μ λ ₯νλ©΄ IDEκ°primary
μsecondary
λ₯Ό μ μν©λλ€. - μ€λ₯ λ°©μ§:
theme.colors.primary
μ λ¬Έμμ΄μ΄ μλ κ°μ ν λΉνλ €κ³ νλ©΄ TypeScriptκ° μ€λ₯λ‘ νμν©λλ€. - λ¬Έμν: νμ μ ν λ§μ λν λ¬Έμ μν μ νμ¬ λ€λ₯Έ κ°λ°μλ€μ΄ μ€μ μ λ μ½κ² μ΄ν΄ν μ μλλ‘ ν©λλ€.
νλ¬κ·ΈμΈκ³Ό TypeScriptλ‘ Tailwind CSS μ¬μ©μ μ μνκΈ°
Tailwind CSS νλ¬κ·ΈμΈμ μ¬μ©νλ©΄ μ¬μ©μ μ μ κΈ°λ₯μΌλ‘ νλ μμν¬λ₯Ό νμ₯ν μ μμ΅λλ€. TypeScriptλ₯Ό μ¬μ©ν λ νλ¬κ·ΈμΈμ λν νμ μ μ μνμ¬ νμ μμ μ±μ 보μ₯ν μλ μμ΅λλ€.
μ¬μ©μ μ μ νλ¬κ·ΈμΈ λ§λ€κΈ°
ν μ€νΈ κ·ΈλΌλ°μ΄μ μ μν μ¬μ©μ μ μ μ νΈλ¦¬ν° ν΄λμ€λ₯Ό μΆκ°νλ κ°λ¨ν νλ¬κ·ΈμΈμ λ§λ€μ΄ λ³΄κ² μ΅λλ€.
// plugins/tailwind-text-gradient.js
const plugin = require('tailwindcss/plugin')
module.exports = plugin(
function ({ addUtilities }) {
addUtilities({
'.text-gradient': {
'@apply text-transparent bg-clip-text': {},
'background-image': 'linear-gradient(to right, #30CFD0, #330867)',
},
})
}
)
νλ¬κ·ΈμΈμ λν νμ μ μ μΆκ°νκΈ°
μμ JavaScript μμ λ μλνμ§λ§, νμ
μ μλ₯Ό μΆκ°νμ¬ κ°λ° κ²½νμ ν₯μμν¬ μ μμ΅λλ€. tailwind.config.ts
νμΌμ μμ±(μμ§ μλ€λ©΄)νκ³ plugins
λ°°μ΄μ μ
λ°μ΄νΈν΄μΌ ν©λλ€. μμ ν νμ
μμ μ±μ μν΄μλ νλ¬κ·ΈμΈ μ΅μ
μ λν νμ
μ μ μν΄μΌκ² μ§λ§, μ΄ κ°λ¨ν μμ μμλ νλ¬κ·ΈμΈ μ체μ μ΄μ μ λ§μΆκ² μ΅λλ€.
λ¨Όμ Tailwind CSS νμ μ΄ μ€μΉλμ΄ μλμ§ νμΈνμΈμ:
npm install -D @types/tailwindcss
κ·Έλ° λ€μ tailwind.config.ts
νμΌμ μ
λ°μ΄νΈνμΈμ:
// tailwind.config.ts
import type { Config } from 'tailwindcss'
const tailwindTextGradient = require('./plugins/tailwind-text-gradient')
const config: Config = {
content: [
'./src/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
extend: {},
},
plugins: [tailwindTextGradient],
}
export default config
μ΄ μ€μ μ μ¬μ©νλ©΄ μ ν리μΌμ΄μ
μμ text-gradient
ν΄λμ€λ₯Ό μ¬μ©ν λ IDEμμ μλ μμ± λ° νμ
κ²μ¬μ μ΄μ μ λ릴 μ μμ΅λλ€.
μ€μ μ€ν€λ§ κ²μ¦νκΈ°
TypeScriptλ₯Ό μ¬μ©νλλΌλ μ€μ μ΄ μ ν¨νμ§ νμΈνκΈ° μν΄ μΆκ°μ μΈ κ²μ¦ κ²μ¬λ₯Ό νλ κ²μ΄ λμμ΄ λ©λλ€. JSON Schemaλ Zodμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ€μ μ λν μ€ν€λ§λ₯Ό μ μνκ³ λ°νμμ μ΄λ₯Ό κ²μ¦ν μ μμ΅λλ€.
JSON Schema μ¬μ©νκΈ°
JSON Schemaλ JSON λ¬Έμμ ꡬ쑰μ λ°μ΄ν° νμ μ μ€λͺ νκΈ° μν νμ€μ λλ€. Tailwind CSS μ€μ μ λν JSON Schemaλ₯Ό μ μνκ³ κ²μ¦ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ€μ μ΄ μ€ν€λ§λ₯Ό μ€μνλμ§ νμΈν μ μμ΅λλ€.
// tailwind.config.schema.json
{
"type": "object",
"properties": {
"content": {
"type": "array",
"items": {
"type": "string"
}
},
"theme": {
"type": "object",
"properties": {
"extend": {
"type": "object",
"properties": {
"colors": {
"type": "object",
"properties": {
"primary": {
"type": "string"
},
"secondary": {
"type": "string"
}
},
"required": [
"primary",
"secondary"
]
}
},
"required": [
"colors"
]
}
},
"required": [
"extend"
]
}
},
"required": [
"content",
"theme"
]
}
κ·Έλ° λ€μ ajv
μ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ€ν€λ§μ λν΄ μ€μ μ κ²μ¦ν μ μμ΅λλ€:
// validate-config.js
const Ajv = require('ajv');
const ajv = new Ajv();
const config = require('./tailwind.config.js');
const schema = require('./tailwind.config.schema.json');
const validate = ajv.compile(schema);
const valid = validate(config);
if (!valid) {
console.log(validate.errors);
}
Zod μ¬μ©νκΈ°
Zodλ TypeScript μ°μ μ μ€ν€λ§ μ μΈ λ° κ²μ¦ λΌμ΄λΈλ¬λ¦¬μ λλ€. TypeScript νμ μ μ¬μ©νμ¬ μ€ν€λ§λ₯Ό μ μνκ³ ν΄λΉ μ€ν€λ§μ λν΄ λ°μ΄ν°λ₯Ό κ²μ¦ν μ μμ΅λλ€.
// tailwind.config.schema.ts
import { z } from 'zod';
const colorSchema = z.object({
primary: z.string(),
secondary: z.string(),
});
const themeSchema = z.object({
extend: z.object({
colors: colorSchema,
}),
});
const configSchema = z.object({
content: z.array(z.string()),
theme: themeSchema,
});
export type Config = z.infer;
export const validateConfig = (config: unknown) => configSchema.safeParse(config);
κ·Έλ° λ€μ validateConfig
ν¨μλ₯Ό μ¬μ©νμ¬ μ€μ μ κ²μ¦ν μ μμ΅λλ€:
// validate-config.ts
import config from './tailwind.config';
import { validateConfig } from './tailwind.config.schema';
const result = validateConfig(config);
if (!result.success) {
console.error(result.error.issues);
}
Tailwind CSS μ€μ μ μν λͺ¨λ² μ¬λ‘
κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯ν Tailwind CSS μ€μ μ 보μ₯νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- TypeScript μ¬μ©: TypeScriptλ₯Ό νμ©νμ¬ ν λ§ κ°, νλ¬κ·ΈμΈ λ° κΈ°ν μ΅μ μ λν νμ μ μ μνμΈμ.
- μ€μ λͺ¨λν: μ€μ μ λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ λͺ¨λλ‘ λλμΈμ.
- μ€μ λ¬Έμν: κ° μΉμ κ³Ό κ°μ λͺ©μ μ μ€λͺ νλ μ£Όμμ μΆκ°νμΈμ.
- μμ μ μΈ μ΄λ¦ μ¬μ©: μ¬μ©μ μ μ ν λ§ κ°κ³Ό μ νΈλ¦¬ν° ν΄λμ€μ μμ μ μΈ μ΄λ¦μ μ ννμΈμ. νλ‘μ νΈ μ λ°μ κ±Έμ³ μΌκ΄λ λͺ λͺ κ·μΉμ κ³ λ €νμΈμ.
- μ€μ κ²μ¦: JSON Schemaλ Zodμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ λ°νμμ μ€μ μ κ²μ¦νμΈμ.
- DRY(λ°λ³΅νμ§ μκΈ°) μμΉ μ€μ: μ€μ μμ κ°μ λ°λ³΅ν΄μ μ¬μ©νκ³ μλ€λ©΄ λ³μλ ν¨μλ₯Ό λ§λ€μ΄ μ¬μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
- λ²μ κ΄λ¦¬:
tailwind.config.js
λλtailwind.config.ts
νμΌμ λ²μ κ΄λ¦¬ μμ€ν (μ: Git)μ 컀λ°νμ¬ λ³κ²½ μ¬νμ μΆμ νκ³ νμν κ²½μ° μ΄μ λ²μ μΌλ‘ λλ릴 μ μλλ‘ νμΈμ.
μ μ Tailwind CSS μ¬μ©μ μ μ μμ
Tailwind CSSλ λ€μν μ§μκ³Ό λ¬Ένμ νΉμ λμμΈ μꡬ μ¬νμ λ°μνλλ‘ μ¬μ©μ μ μν μ μμ΅λλ€. λ€μμ λͺ κ°μ§ μμ λλ€:
- μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘(RTL) μ§μ: μΈμ΄λ₯Ό μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μ½λ μ§μ(μ: μλμ΄, νλΈλ¦¬μ΄)μμλ
rtl
λ°ltr
λ³νμ μ¬μ©νμ¬ RTL λ μ΄μμμ μ§μνλλ‘ Tailwind CSSλ₯Ό ꡬμ±ν μ μμ΅λλ€. - λ¬Ένμ μμ νλ νΈ: λμ κ³ κ°μ λ¬Ένμ μ νΈλλ₯Ό λ°μνλλ‘ μμ νλ νΈλ₯Ό μ¬μ©μ μ μν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μΌλΆ λ¬ΈνκΆμμλ νΉμ μμμ΄ νΉμ μλ―Έλ κ°μ κ³Ό μ°κ΄λ μ μμ΅λλ€.
- νμ΄ν¬κ·ΈλνΌ: μΈμ΄μ μ§μμ λ°λΌ λ€λ₯Έ κΈκΌ΄ κ³μ΄κ³Ό κΈκΌ΄ ν¬κΈ°κ° νμν μ μμ΅λλ€. Tailwind CSS μ€μ μμ νμ΄ν¬κ·ΈλνΌ μ€μ μ μ¬μ©μ μ μνμ¬ ν μ€νΈκ° λ€μν λ¬Έλ§₯μμ κ°λ μ± μκ³ μκ°μ μΌλ‘ λ§€λ ₯μ μΌλ‘ 보μ΄λλ‘ ν μ μμ΅λλ€. λ€μν νλ©΄ ν¬κΈ°μ λκ»μ μ΅μ ννκΈ° μν΄ κ°λ³ κΈκΌ΄ μ¬μ©μ κ³ λ €νμΈμ.
- κ°κ²© λ° λ μ΄μμ: λμμΈμ κ°κ²©κ³Ό λ μ΄μμμ λ€μν μ½ν μΈ μ νκ³Ό νλ©΄ ν¬κΈ°μ λ§κ² μ‘°μ ν΄μΌ ν μ μμ΅λλ€. Tailwind CSS μ€μ μμ κ°κ²© λ° λ μ΄μμ μ€μ μ μ¬μ©μ μ μνμ¬ λ°μνμ΄κ³ μ¬μ©μ μΉνμ μΈ κ²½νμ λ§λ€ μ μμ΅λλ€.
κ²°λ‘
Tailwind CSSμ λν νμ μμ ν μ€μ μ€ν€λ§λ₯Ό ꡬννλ κ²μ κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯ν μΉ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° μ€μν λ¨κ³μ λλ€. TypeScriptλ₯Ό νμ©νμ¬ μ€λ₯λ₯Ό μ‘°κΈ°μ λ°κ²¬νκ³ , IDE μ§μμ κ°μ νλ©°, μ½λ κ°λ μ±μ ν₯μμν¬ μ μμ΅λλ€. λν JSON Schemaλ Zodμ κ°μ κ²μ¦ λꡬλ₯Ό μ¬μ©νλ©΄ μΆκ°μ μΈ λ³΄μ κ³μΈ΅μ μ 곡νκ³ μ€μ μ΄ νμ μ ν¨νλλ‘ λ³΄μ₯ν μ μμ΅λλ€. μ΄ λΈλ‘κ·Έ ν¬μ€νΈμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ ν¨μ¨μ μ΄κ³ νμ₯ κ°λ₯ν Tailwind CSS μ€μ μ λ§λ€ μ μμ΅λλ€.
μ΄λ λ μνν κ°λ° νλ‘μΈμ€λ₯Ό 보μ₯νκ³ μμμΉ λͺ»ν μ€νμΌλ§ λ¬Έμ λ₯Ό μλ°©νλ λ° λμμ΄ λ©λλ€. μ΄λ¬ν κ΄νμ μ±ννμ¬ μ¬λ¬λΆμ Tailwind CSS νλ‘μ νΈ μμ€μ ν λ¨κ³ λμ¬λ³΄μΈμ!