Tailwind v4 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜: Dynamic spacing utilities

์š”์ฆ˜ Tailwind CSS๋ฅผ 3์—์„œ 4๋กœ ์˜ฌ๋ฆฌ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ์˜ˆ์ƒ๋ณด๋‹ค ๋งŽ์€ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋™์•ˆ EmotionCSS์™€ PandaCSS๋งŒ ๋‹ค๋ค„์™€์„œ Tailwind์˜ ๋ฌธ๋ฒ•๊ณผ ๋™์ž‘ ๋ฐฉ์‹์ด ๊ฝค ๋‚ฏ์„ค์—ˆ๋‹ค. ํŠนํžˆ ๋ฒ„์ „๋งŒ ์˜ฌ๋ ธ๋Š”๋ฐ๋„ ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ ๊ธฐ๋Œ€ํ•œ ๊ฐ’๊ณผ ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ€ ํฌ๊ฒŒ ๋‹ฌ๋ผ ๋ ˆ์ด์•„์›ƒ์ด ๊นจ์ ธ๋ฒ„๋ ธ๋Š”๋ฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋จผ์ € Tailwind v4์˜ spacing ๊ณ„์‚ฐ ๋ฐฉ์‹์„ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ ์งง๊ฒŒ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

PandaCSS์™€ Tailwind v4์˜ ์ฐจ์ด

PandaCSS (ํ† ํฐ ๋งคํ•‘)

PandaCSS๋Š” spacing์„ design tokens์—์„œ ์ง์ ‘ ์ •์˜ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ํ† ํฐ์ด ์ •์˜๋ผ ์žˆ๋‹ค๋ฉด ํ•ญ์ƒ ๊ณ ์ •๋œ ๊ฐ’์ด ์ถœ๋ ฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์—†๋‹ค.

{ "spacing": { "1": { "value": "0.25rem" }, // 4px 
               "2": { "value": "0.5rem" }, // 8px 
               "96": { "value": "24rem" } // 384px } }
  • h="96" โ†’ height: var(--spacing-96) โ†’ ํ•ญ์ƒ 384px

์ฆ‰, Panda๋Š” ํ† ํฐ โ†’ ๊ฐ’ ๋งคํ•‘๋งŒ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์ธก์ด ํ•ญ์ƒ ๋™์ผํ•˜๋‹ค.

Tailwind v4 (์„ ํ˜• ๊ณ„์‚ฐ)

v3๊นŒ์ง€๋Š” Panda์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ณ ์ •๊ฐ’์„ ๋ฆฌํ„ดํ–ˆ์ง€๋งŒ, v4๋ถ€ํ„ฐ๋Š” spacing ์œ ํ‹ธ ์ „์ฒด๊ฐ€ --spacing์ด๋ผ๋Š” ๋‹จ์ผ ํ† ํฐ์„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.

/* v4 */
.h-96 { height: calc(var(--spacing) * 96); }
  • Tailwind ๊ธฐ๋ณธ๊ฐ’: --spacing: 0.25 rem (4px ๋‹จ์œ„)
  • ๋”ฐ๋ผ์„œ h-96 = 96 ร— 0.25rem = 24 rem = 384px

์ฆ‰, v4์—์„œ๋Š” ์ˆซ์ž ๊ฐ’์ด ์‹ค์ œ ๊ธธ์ด๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํ…์ด๊ณ , ํ•ด๋‹น ๊ฐ’์€ --spacing ๊ฐ’์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

v3 / v4

v3 / v4์™€ ๋””์ž์ธ ํ† ํฐ ์ถฉ๋Œ

์šฐ๋ฆฌ ํŒ€์˜ ๋””์ž์ธ ํ† ํฐ์€ ํ”ฝ์…€ ๋‹จ์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ผ์œˆ๋“œ v4๋กœ ๋ฒ„์ „์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ ๊ฐ™์€ ํด๋ž˜์Šค์ธ๋ฐ ๊ธฐ๋Œ€์น˜์™€ ์‹ค์ œ๊ฐ€ ๋‹ฌ๋ผ ๋ ˆ์ด์•„์›ƒ์ด ์ „๋ถ€ ๊นจ์ง€๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

ํ•ด๊ฒฐ: --spacing์„ 1px ๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ์ •์˜

์ „์—ญ์—์„œ --spacing์„ 1px ๋‹จ์œ„๋กœ ๋ฎ์–ด์จ์„œ ์ˆซ์ž ์œ ํ‹ธ = ํ”ฝ์…€๋กœ ๋งž์ถฐ์ฃผ์—ˆ๋‹ค.

@layer theme {
  :root {
    --spacing: 0.0625rem; /* 1px */
  }
}

์ด์ œ ๋ชจ๋“  spacing ์œ ํ‹ธ์€ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๊ณ„์‚ฐ๋˜๋ฉด์„œ ๋ ˆ์ด์•„์›ƒ ์ด์Šˆ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

  • h-96 = 96px
  • p-4 = 4px
  • m-8 = 8px

https://tailwindcss.com/blog/tailwindcss-v4#dynamic-utility-values-and-variants

[Tailwind CSS v4.0

We just released Tailwind CSS v4.0 โ€” an all-new version of the framework optimized for performance and flexibility, with a reimagined configuration and customization experience, and taking full advantage of the latest advancements the web platform has to

tailwindcss.com](https://tailwindcss.com/blog/tailwindcss-v4#dynamic-utility-values-and-variants)

v3๋ฅผ ์จ๋ณธ ์ ์ด ์—†์–ด์„œ, ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ์˜ ์žฅ์ ์ด ๊ถ๊ธˆํ•ด ์ฐพ์•„๋ณด์•˜๋‹ค.

  1. ๋Œ€๊ด„ํ˜ธ ํ•„์š” ์—†์Œ
    • v3์—์„œ๋Š” scale์— ์—†๋Š” ๊ฐ’์ด๋ฉด ๋ฐ˜๋“œ์‹œ w-[188px]์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ…€์ด ํ•„์š”ํ–ˆ๋‹ค.
    • v4์—์„œ๋Š” ๊ทธ๋ƒฅ w-47์ฒ˜๋Ÿผ ์ •์ˆ˜๋งŒ ์“ฐ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์งง๊ณ  ๊น”๋”ํ•ด์ง.
  2. ์Šค์ผ€์ผ ์ผ๊ด€์„ฑ ํ™•๋ณด
    • margin, padding, width, height ๋“ฑ spacing ๊ด€๋ จ ์œ ํ‹ธ์ด ์ „๋ถ€ --spacing ํ•˜๋‚˜์˜ ๊ทœ์น™์œผ๋กœ ํ†ต์ผ๋๋‹ค.
    • ํŒ€ ๋‚ด์—์„œ ๋‹จ์œ„ ๊ณ„์‚ฐ ๋ฐฉ์‹์ด ์ œ๊ฐ๊ฐ์ผ ์ผ์ด ์ค„์–ด๋“ ๋‹ค.
  3. ํ…Œ๋งˆ ํ™•์žฅ ์šฉ์ด
    • --spacing ๊ฐ’์„ 0.25rem ๋Œ€์‹  1px ๊ฐ™์€ ์ปค์Šคํ…€ ๊ฐ’์œผ๋กœ ์žฌ์ •์˜ํ•˜๋ฉด, ๋ชจ๋“  spacing ์œ ํ‹ธ์ด ํ•œ ๋ฒˆ์— ์žฌ๊ณ„์‚ฐ๋œ๋‹ค.
    • ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ๋‹จ์œ„ ์ •์ฑ…์„ Tailwind์— ๊ทธ๋Œ€๋กœ ๋…น์ผ ์ˆ˜ ์žˆ๋‹ค.
  4. ๋Ÿฐํƒ€์ž„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ
    • CSS ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜์ด๋ผ JS๋กœ --spacing์„ ๋ฐ”๊พธ๋ฉด ์•ฑ ์ „์ฒด spacing์ด ์ฆ‰์‹œ ์žฌ์ ์šฉ๋œ๋‹ค.

v3

w-[11.75rem] ์œผ๋กœ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋Š” width ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. / w-47 ์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋Š” width์— ์˜๋„ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ด ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

v4

spcing ์ •์˜์—†์ด ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.