์์
CoUI ์๋งจํฑ ์์ ํ ํฐ โ ์ญํ ์ ํ๊ณผ ๋๋น ํ์ด๋ง. CoreColors ๊ฐ ๋จ์ผ ์ถ์ฒ์ ๋๋ค.
๋ชฉ์ฐจ
Figma Foundation ยท 01. Color ยท ๊ฐ์
coui_core๊ฐ ์ ๋ณธ์ ๋๋ค. ์ ๋ณธ ํ์ผ์ Figma ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์ด ํ์ด์ง๋ ์ญํ ์ ๊ณ ๋ฅด๊ณ , ์ง๊ธ ํ
๋ง์ ์ค์ ๊ฐ์ ์ค์์น๋ก ํ์ธํ๋ ๊ณณ์
๋๋ค. ๊ฐ์ coui_core ์ CoreColors
๊ฐ ์ ํ๊ณ , Flutter ColorScheme ๊ณผ Web --coui-* ๋ณ์๊ฐ ๊ฐ์ ์ด๋ฆ์ ์ฝ์ต๋๋ค.
ํ๋ ํธ hex ๋ฅผ ์ฑ์ ๋ณต์ฌํ์ง ๋ง์ธ์. ๋ผ์ดํธ/๋คํฌ์ ์ํ์ด์ค ์คํ์ผ์ด ํ ํฐ ๊ฐ์ ๋ฐ๊พธ๊ณ , ์ด๋ฆ์ ๊ทธ๋๋ก ๋ก๋๋ค. ํ ํฐ ์ถ ์ ์ฒด๋ ๋์์ธ ํ ํฐ ์ ๋ณด์ธ์.
์ธ์ ์ฐ๋#
์๋งจํฑ ํ ํฐ์ ๊ณ ๋ฅด์ธ์
-
๋ฐฐ๊ฒฝ ยท ๊ธ์ ยท ๋ณด๋ ยท ์ํ ์์ ์ค ๋ โ
primary,onSurface,error์ฒ๋ผ ์ญํ ์ ๊ณ ๋ฆ ๋๋ค -
์ปดํฌ๋ํธ Style (
backgroundColor: CoreColor.token(CoreColors.surface)) ์ด๋Text('โฆ').onSurface
์ฐ์ง ๋ง์ธ์
#RRGGBB/Color(0xFFโฆ)๋ฅผ ์์ ฏ์ ๋ฐ๊ธฐ โ ๋คํฌ ๋ชจ๋์ ์ํ์ด์ค ์คํ์ผ์ด ๋น๊ปด๊ฐ๋๋ค- "์ด ๋ฒํผ์ ํ๋"์ฒ๋ผ ์์ ์์ ๊ณ ๋ฅด๊ธฐ โ ์ฑ์์ ์ญํ (
primary,accent)์ ๊ณ ๋ฆ ๋๋ค
primary ์ accent#
CoUI ๊ธฐ๋ณธ ํ
๋ง์์ primary / onPrimary ๋ ๋ผ์ดํธ์์ ๋ธ๋ฃจ๊ทธ๋ ์ด์
๋๋ค โ neutral ๋ณด๋ค ์ฑ๋๊ฐ ๋์ ์ฒญํ์ ๊ณ์ด(OKLCH hue 266)์ด๋ผ ์๊ธฐ ์์ผ๋ก ์ฝํ์ง๋ง, ์ฑ์ ๋จ๊ณ๋ ์ฝํ
์ธ ์ ๊ฒฝ์ํ์ง ์์ ๋งํผ ์ด๋ก์ต๋๋ค. ๋ผ์ดํธ๋ ์งํ ์ฑ์(primary/800)์ ํฐ ๊ธ์์
๋๋ค. ๋คํฌ๋
๊ฑฐ์ ํฐ neutral ์ฑ์(neutral/100)์ ๊ฑฐ์ ๊ฒ์ ๊ธ์(neutral/1000)์
๋๋ค โ ํ์คํ
ํ๋(primary/200)์ ํธ์ง๊ธฐ๊ฐ ์ ํ ์์ญ ยท ๋งํฌ ยท ์ ๋ณด์ ์ด๋ฏธ ์ฐ๋ ํ๋๊ณผ ์์ฌ "์ ํ๋ ๊ฒ"์ฒ๋ผ ์ฝํ๊ธฐ ๋๋ฌธ์, ๋คํฌ์ ์ฃผ ์ก์
๋ง neutral ๋จํ์์ ๊ณ ๋ฆ
๋๋ค. ํฌ์ปค์ค ๋ง ยท hover ยท pressed ๋ ๊ฐ์ neutral ๋จ๊ณ๋ฅผ ๋ฐ๋ผ๊ฐ๊ณ , ์ปจํ
์ด๋ ยท fixed ยท inverse ยท ๊ธ์(primaryText) ์ฌ๋กฏ์ ๋คํฌ์์๋ ๋ธ๋ฃจ๊ทธ๋ ์ด๋ฅผ ์ ์งํด ๋ธ๋๋ ์์กฐ๋ ๊ทธ ๋ฉด๊ณผ ๊ธ์์ ๋จ์ต๋๋ค. CoUI ๋ ๋ชจ๋ ์๋น์ค์ ๊ธฐ๋ณธ UI ๋ผ์ primary ๊ฐ ์ฝํ
์ธ ์ ๊ฒฝ์ํ์ง ์๊ฒ ๋๊ณ , ๋ธ๋๋ ํ
๋ง๊ฐ
primary ์ฌ๋กฏ์ ์๊ธฐ ์์ผ๋ก ๋ฎ์ด์๋๋ค โ ์ด ๋คํฌ ์์ธ๋ CoUI ๊ธฐ๋ณธ ํ
๋ง๋ง์ ๊ฒ์ด๊ณ ๋ธ๋๋ ๋งคํ์ ๊ทธ๋๋ก "๋ฐ์ ๋จ๊ณ + ์ด๋์ด ๊ธ์"์
๋๋ค.
secondary ๋ ์ค์ฑ ๊ฐ์กฐ์
๋๋ค โ ์ผ๋ฐ ๋ชจ๋์์ primary ์ ๊ฐ์ ๋จ๊ณ๋ฅผ neutral ๋จํ์์ ๊ณ ๋ฅธ ์ฑ์์
๋๋ค.
CoreColors.accent / CoreColors.onAccent ๋ tertiary / onTertiary
์ ๊ฐ์ ์คํด ์ฌ๋กฏ์
๋๋ค. CoUI ๊ธฐ๋ณธ ํ
๋ง์์ tertiary ๊ณ์ด์ primary ์ ๊ฐ์ ๊ฐ์ด๋ฏ๋ก accent ๋ primary ์ ๊ฐ์ ์์
๋๋ค(๋ผ์ดํธ๋ ๋ธ๋ฃจ๊ทธ๋ ์ด, ๋คํฌ๋ ๊ฑฐ์ ํฐ neutral) โ CoUI ์๋ ๋ ๋ฒ์งธ ๊ฐ์กฐ์์ด ์์ต๋๋ค. ์ปจํ
์ด๋ยทfixed ๋จ๊ณ๋ ๊ทธ๋๋ก
tertiaryContainer ์ด๋ฆ์ ์๋๋ค.
์์ด ์๋ ๊ฐ์กฐ ์ฑ์์ด ํ์ํ ์ ํ์ ์๊ธฐ ๋ธ๋๋(CoreBrand)์ tertiary ๋ก ๊ทธ ์์ ์ ํ๊ณ , ์ฑ์์ accent ์ ๋ฌถ์ต๋๋ค. Cocode ํ ์ผ๋ ๋์คํฌ์ ๋ฏผํธ๋ CoUI ์ ๊ฐ์ด ์๋๊ณ , ๋ ํฌ ์ ๋ธ๋๋(Unibook
h312)์๋ ์์ต๋๋ค โ ์ ํ ์บ๋ฒ์ค hex ๋ ์ฌ๊ธฐ ์ ๋ณธ์ด ์๋๋ฏ๋ก, ํ์ ๊ทธ ๋ฏผํธ๋ฅผ CoreBrand ํ๋ ํธ์ tertiaryHSL
์ ์ฌ์ต๋๋ค.
final cocode = CoreBrand(
id: 'cocode',
displayName: 'Cocode',
palette: PrimitiveColors.generate(
primaryHSL: (h: 220.0, s: 0.65, l: 0.535),
secondaryHSL: (h: 260.0, s: 0.60, l: 0.50),
// ์์ ์๋ โ ํฐ ์์ด์ฝ(onAccent)์ด accent ์ฑ์ ์์์ 4.5:1 ์ ๋๋
// ๋ณด๋ผ๋ค. ํ ์ผ๋ ๋์คํฌ์์ ์ค์ธกํ ๋ฏผํธ๋ก ๋ฐ๊ฟ ๋๋ ๋ผ์ดํธ์
// onAccent ร accent ๋๋น๊ฐ 4.5:1 ์ธ์ง ํ์ธํ๋ค โ ๋ฐ์ ๋ฏผํธ๋ ํฐ
// ์์ด์ฝ๊ณผ ๊ทธ ๋๋น์ ๋ชป ๋ฏธ์น๋ค.
tertiaryHSL: (h: 272.0, s: 0.75, l: 0.46),
successHSL: (h: 140.0, s: 0.70, l: 0.30),
infoHSL: (h: 200.0, s: 0.75, l: 0.38),
warningHSL: (h: 45.0, s: 0.85, l: 0.50),
errorHSL: (h: 0.0, s: 0.75, l: 0.50),
neutralHue: 220,
),
);
// ํ์ด๋ก ์ผ๋ ๋์คํฌ โ ์ฑ์ accent, ์์ด์ฝ onAccent.
// primary variant ์ ๊ธฐ๋ณธ hover ์ฑ์์ background ๋ฅผ ๋ฎ์ด์ฐ๋ฉด ๋น ์ง๋ค.
Button(
variant: CoreButtonVariant.primary,
shape: CoreButtonShape.circle,
buttonStyle: const CoreButtonStyle(
backgroundColor: CoreColor.token(CoreColors.accent),
foregroundColor: CoreColor.token(CoreColors.onAccent),
),
onPressed: send,
child: Icon(LucideIcons.arrowUp),
)
primary ๋ ์ฃผ ์ก์
์ฑ์์, accent ๋ ๋ธ๋๋๊ฐ ๋ฐ๋ก ๊ณ ๋ฅธ ๊ฐ์กฐ ์ฑ์(์ผ๋ ๋์คํฌ ๊ฐ์)์ ์๋๋ค. CoUI ๊ธฐ๋ณธ ํ
๋ง์์๋ ๋์ด ๊ฐ์ ์์ผ๋ก ์น ํด์ง๊ณ , ๋ธ๋๋ ํ
๋ง๊ฐ tertiary ๋ฅผ ๋ฐ๋ก ๊ณ ๋ฅด๋ฉด ๋์ด ๊ฐ๋ผ์ง๋๋ค. ์ํ ์(success,
error)์ ์
์ผํธ๊ฐ ์๋๋๋ค.
onX ๋ ๊ทธ ์ ๊ธ์/์์ด์ฝ ์์
๋๋ค. primary ๋ฐฐ๊ฒฝ์๋ onPrimary,
surface ์ ๋ณธ๋ฌธ์๋ onSurface ๋ฅผ ์ง์ง์ผ์ธ์.
๋งํฌ ์ โ link#
๋งํฌ๋ ์ ์ฉ ์ฌ๋กฏ link ๋ก ์์๋ด
๋๋ค. primary ๋ info ๋ ์๋๋๋ค โ CoUI ์์
primary ๋ ๋ณธ๋ฌธ ๊ธ์์ ๊ฑฐ์ ๊ฐ์ ํค(๋ผ์ดํธ ๋ธ๋ฃจ๊ทธ๋ ์ด, ๋คํฌ ๊ฑฐ์ ํฐ neutral)์ด๋ผ ๋งํฌ๋ก ์ฝํ์ง ์๊ณ , info ๋ ์ํ์์ด๋ผ "์ด๋ํ๋ค"๊ฐ ์๋๋ผ "์๋ด"๋ฅผ ๋ปํฉ๋๋ค. ์ฌ๋กฏ์ ๋ฐ๋ก ๋๋ฉด ๋ธ๋๋๊ฐ ๋งํฌ ์๋ง ๋ฐ๊ฟ ์ ์์ต๋๋ค.
CoUI ์์๋ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ ์์ด info ๋จํ์ ๋จ๊ณ์
๋๋ค: ๋ผ์ดํธ info/700 ยท ๋คํฌ info/400
ยท ๊ณ ๋๋น ๋ผ์ดํธ info/800 ยท ๊ณ ๋๋น ๋คํฌ info/200. ๋งํฌ๋ ๊ธ์๋ก ์ฝํ๋ฏ๋ก surface 8ํค ์ ๋ถ์์ 4.5:1 ์ ๋์ด์ผ ํ๊ณ , ๊ทธ๋์ ์ํ ์ฑ์ ๋จ๊ณ(info/600)๊ฐ ์๋๋ผ ํ ๋จ๊ณ ์ด๋์ด
700 ์
๋๋ค โ 600 ์ ํ์ ์ปจํ
์ด๋ ํค ์์์ 4.5:1 ์๋๋ก ๋จ์ด์ง๋๋ค. ๋ธ๋๋๊ฐ ๋งํฌ ์์ ๋ฐ๊พธ๋ ค๋ฉด surface
~ surfaceContainerHighest ์์์ 4.5:1 ์ ๋๊ฒจ์ผ ํฉ๋๋ค.
๋งํฌ์ ๋ฐ์ค์ ์์ด ์๋๋ผ Link ์ปดํฌ๋ํธ๊ฐ ์ ํฉ๋๋ค โ Link.
์ธ ๋ฒ์งธ ๊ธ์ ๋จ๊ณ โ onSurfaceSubtle#
๊ธ์๋ ์ธ ๋จ๊ณ์
๋๋ค: ๋ณธ๋ฌธ onSurface, ๋ณด์กฐ onSurfaceVariant, ๋ฉํ onSurfaceSubtle. ๋ฉํ๋ ์ค ๋ฒํธ ยท ํ์์คํฌํ ยท ๋์๋ง์ฒ๋ผ ์ฝํ์ผ ํ์ง๋ง ๋์ ๋ ๋์ด์ผ ํ๋ ๊ธ์์
๋๋ค.
CoUI ์์๋ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ ์์ด placeholder ์ ๊ฐ์ ๋จ๊ณ์
๋๋ค(๋ผ์ดํธ neutral/600 ยท ๋คํฌ neutral/500
ยท ๊ณ ๋๋น ๋ผ์ดํธ neutral/700 ยท ๊ณ ๋๋น ๋คํฌ neutral/400) โ neutral ๋จํ์์ onSurfaceVariant
๋ฐ๋ก ์๋ ๋จ๊ณ๊ฐ ๊ทธ๊ฒ๋ฟ์
๋๋ค. ๊ทธ๋์ ๋๋น ์ฝ์๋ placeholder ์ ๊ฐ์ต๋๋ค: ํ์ด์ง(surface ยท surfaceContainerLowest) ์์์ 4.5:1 ์ ๋๊ณ (๋ผ์ดํธ 4.65 ยท ๋คํฌ 5.96), ํ์ ์ปจํ
์ด๋ ํค ์๋ ์ฝ์ํ์ง ์์ต๋๋ค(๋ผ์ดํธ
surfaceContainer ์ 4.26).
placeholder ๋ก ๋์ ํ์ง ๋ง์ธ์ โ ๊ฐ์ด ๊ฐ์๋ ๊ทธ๊ฑด "์์ง ๊ฐ์ด ์๋ค"๋ ๋ป์ด๋ผ, ๋ธ๋๋๊ฐ ๋์ ๋ฐ๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํฉ๋๋ค. disabledContent
๋ ์๋๋๋ค โ ๋นํ์ฑ์ ๋๋น ์๋ฌด๊ฐ ์์ด์, ๋ฉํ ๊ธ์๋ฅผ ๊ฑฐ๊ธฐ์ ๋๋ฉด 4.5:1 ์ ๋์ณ๋ ์๋ฌด๋ ๋ชจ๋ฆ
๋๋ค. ํ์ ์ปจํ
์ด๋ ์๋ hover ยท pressed ์ํ์ธต์ด ๋ฎ์ด๋ ํ ์์ ๋ณด์กฐ ๊ธ์๋ onSurfaceVariant ๋ฅผ ์ฐ์ธ์.
์์ ๋ฉด โ surfaceRaised#
surfaceRaised ๋ ํธ๋ ์๋ก ์์ ์ ํ ๋ฉด์
๋๋ค โ ๋ถํ ์ปจํธ๋กค์์ ์ ํ๋ ์นธ, ์์ฝ ํญ์์ ์ ํ๋ ํญ. ๋ผ์ดํธ๋ ํฐ์, ๋คํฌ๋ ์ปจํ
์ด๋ ์ฌ๋ค๋ฆฌ์ ๋งจ ์(neutral/800)์
๋๋ค. ๋คํฌ์์๋
surfaceContainerHighest ์ ๊ฐ์ ๊ฐ์ด์ด๋ ๋ป์ด ๋ค๋ฆ
๋๋ค โ ๊ฐ์ฅ ๋์ ์ปจํ
์ด๋ ํค์ด ์๋๋ผ "์๋ ํธ๋์์ ๋ ์ค๋ฅธ ๋ฉด"์ด๋ผ์, ๋ ๋ชจ๋ ๋ชจ๋ ํธ๋(surfaceContainer)๋ณด๋ค ๋ฐ์ต๋๋ค. ๋๋น ๊ฒ์ดํธ์ surface ํค ๋ชฉ๋ก์ ๋ค์ด ์์ด, ๋ณธ๋ฌธ ยท ๋ณด์กฐ ๊ธ์์ ๋งํฌ๊ฐ ๊ทธ ์์์๋ ๋ค๋ฅธ ํค๊ณผ ๊ฐ์ ๊ธฐ์ค์ ๋๋์ง ์ฝ๋๋ค.
์ํ ํ์ โ errorIcon ยท successIcon ยท warningIcon ยท infoIcon#
๊ธ์๊ฐ ์๋ ์ํ ํ์ โ ์์ด์ฝ, ์ํ ์ , ์งํ ๋ง๋, ์ฐจํธ ํ์ โ ๋ ์ํ ์ฑ์(error โฆ)์ด ์๋๋ผ ์ด ์ฌ๋กฏ ๋ท์ ์๋๋ค. ๊ธ์๋ 4.5:1 ์ ๋์ด์ผ ํ์ง๋ง ๊ธ์๊ฐ ์๋ ํ์๋ 3:1(WCAG 1.4.11)์ด๋ฉด ๋์ด์, ์ฑ์๋ณด๋ค ํ ๋จ๊ณ ๋ฐ๊ฒ ๋ ์ ์์ต๋๋ค.
CoUI ์์๋ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ ์์ด ์ํ ๋จํ์ ๋จ๊ณ์
๋๋ค: ๋ผ์ดํธ 500 ยท ๋คํฌ 400 ยท ๊ณ ๋๋น ๋ผ์ดํธ 700
ยท ๊ณ ๋๋น ๋คํฌ 300. ๋๋น ๊ฒ์ดํธ๊ฐ ํ์ด์ง ํค(surface ยท surfaceBright ยท surfaceContainerLowest) ์์์ ์ผ๋ฐ ๋ชจ๋ 3:1, ๊ณ ๋๋น 4.5:1 ์ ์ฝ๋๋ค(๋ผ์ดํธ 3.06 ~ 3.21 ยท ๋คํฌ 8.25 ~ 9.10 ยท ๊ณ ๋๋น ๋ผ์ดํธ 6.30 ~ 6.92 ยท ๊ณ ๋๋น ๋คํฌ 11.03 ~ 11.76). ๋ผ์ดํธ์
500 ์ ํ์ ์ปจํ
์ด๋ ํค ์์์ 3:1 ์๋๋ก ๋จ์ด์ง๋ฏ๋ก(2.45 ~ 3.07), ํ์ ์ปจํ
์ด๋ ์์ ํ์๋ ์ํ ์ฑ์(error โฆ)์ ์ฐ์ธ์. ์์ฑ ํ๋ ํธ ๋ธ๋๋(ํ์ค ๋งคํ)๋ ์ํ ์ฑ์๊ณผ ๊ฐ์ ๋จ๊ณ์ด๊ณ , ๋ผ์ดํธ
warning ๋ง ์ฑ์์ด ๋ฐ์ ํ ๋จ๊ณ ์ด๋์ด dark ์
๋๋ค.
๊ธ์์๋ ์ฐ์ง ๋ง์ธ์ โ ์ํ ์ ๊ธ์๋ onXContainer ์
๋๋ค.
๊ตฌ๋ฌธ ์ โ syntaxKeyword ยท syntaxType ยท syntaxFunction ยท syntaxString#
์ฝ๋ ๊ฐ์กฐ ์์ ์ฌ๋กฏ ๋ท์
๋๋ค โ ํค์๋(keyword ยท storage ยท control), ํ์
ยท ํด๋์ค ยท ์ซ์, ํจ์ ยท ๋ฉ์๋, ๋ฌธ์์ด. ํ๋ฌธ ยท ๋ณ์๋
onSurface, ๊ตฌ๋์ ยท ์ฐ์ฐ์๋ onSurfaceVariant, ์ฃผ์์ onSurfaceSubtle ์ ์๋๋ค.
๊ตฌ๋ฌธ ์์ ๋ธ๋๋๊ฐ ์ ํ๋ ์์ด ์๋๋ผ ๋ชจ๋ ๋ธ๋๋์์ ๊ฐ์ ๊ฐ์
๋๋ค. ๋ณด๋ผ ยท ๋
ธ๋ ยท ์ฐ๋์ ์ด๋์ด ํ์ฉ ๊ฐ๊ณผ ๋ฐ์ ํ์ฉ ๊ฐ ์ฌ์ฏ์ด ๋ธ๋๋ ๋ฐ์ syntax
๊ทธ๋ฃน์ ํ ๋ฒ๋ง ์๊ณ , ๋ธ๋๋์ ์๋งจํฑ ๋งคํ์ด ๊ทธ ๊ฐ์ ๋ชจ๋์ ๋ง๊ฒ ์ด๋ฆ์ผ๋ก ๊ฐ๋ฆฌํต๋๋ค(๋ถ๋ฅ์๊ณผ ๊ฐ์ ๋ฐฉ์). ํจ์ ์๋ง ๋ธ๋๋ info ๋จํ์ ๋จ๊ณ์ด๊ณ , CoUI ๋ ๋งํฌ์ ๊ฐ์ ๋จ๊ณ์
๋๋ค(๋ผ์ดํธ
info/700 ยท ๋คํฌ info/400). ๊ณ ๋๋น๋ ๊ฐ์ ๋ฐ๊ธฐ์ ์ผ๋ฐ ๊ฐ์ ๊ทธ๋๋ก ์๋๋ค. ์ฝ๋๊ฐ ๋์ด๋ ๋ฐํ ์ฌ๋ ๊ณณ(surface
ยท surfaceContainerLow ยท surfaceContainer ยท surfaceContainerHigh
ยท ๋ค ์ํ์ XContainer ๋ )์์ 4.5:1 ์ ๋์ด์ผ ํ๊ณ , ๋ ํฌ์ ๋๋น ๊ฒ์ดํธ๊ฐ CoUI ์์ ๊ทธ๊ฒ์ ์ฝ๋๋ค(๊ฐ์ฅ ๋ฎ์ ๊ณณ์ด ๋ผ์ดํธ surfaceContainerHigh
์ 4.55).
coui_core ๋งต#
| ์ฐ๋ ์ด๋ฆ | ์๋ฏธ |
|---|---|
CoreColors.primary ๋ฑ |
์๋งจํฑ ์ฌ๋กฏ. kebab ์ด๋ฆ์ด CSS ๋ณ์ (--coui-primary) ๊ฐ ๋ฉ๋๋ค |
CoreColor.token(CoreColors.primary) | Style ํ๋์ ๋ฃ๋ ํ๋ซํผ-์ค๋ฆฝ ์ฐธ์กฐ |
theme.colorScheme.primary | Flutter โ ํ์ฌ ์คํด์ด ํ ํฐ์ ํ์ด ์ค ๊ฐ |
bg-primary / rgb(var(--coui-on-surface)) |
Web โ Tailwind class ๋๋ inline ๋ณ์ |
์๋ ์ค์์น๋ --coui-<token> ์ ๊ทธ๋๋ก ์น ํ๋ฏ๋ก, ํค๋์ ํ
๋งยท์ํ์ด์ค ์ค์์ฒ๋ฅผ ๋ฐ๊พธ๋ฉด ๊ฐ์ด ์์ง์
๋๋ค.
์ฌ์ฉ๋ฒ#
// Flutter โ colorScheme ๊ฒฝ์ ๋๋ Style ํ ํฐ
theme.colorScheme.primary
theme.colorScheme.onSurfaceVariant
CoreColor.token(CoreColors.primary)
// Web โ ํ ํฐ class / CSS ๋ณ์
'bg-primary' // Tailwind class
'rgb(var(--coui-on-surface))' // inline
๋ฌด์์ ๊ณ ๋ฅด๋ โ ์ ๋ ฅ์ 8๊ฐ๋ค#
CoUI ์์ ์ ํ๋ ํธ๋ ๊ณ์ฐํ์ง ์์ต๋๋ค โ ๋์์ด๋๊ฐ ์ ํ ๊ณ ์ hex ๋ฅผ
CouiColorPresets.palette ์ ์ซ์ ๋จ๊ณ๋ก ์ ์ด ๋ก๋๋ค(neutral/50โฆ1050,
primaryยท์ํ ์ 100โฆ1000, base/whiteยทbase/black). Web ์ ๊ฐ์ ์ด๋ฆ์
--coui-neutral-100 ์ฒ๋ผ, Figma ๋ color/coui/neutral/100
์ฒ๋ผ ์๋๋ค. ์ปดํฌ๋ํธ๋
์ด ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ง์ ์ฝ์ง ์๊ณ ์๋งจํฑ ์ฌ๋กฏ๋ง ์ฝ์ต๋๋ค.
๋ธ๋๋ ํ๋ ํธ์ ์ถ๋ฐ์ ์ 8๊ฐ ์
๋ ฅ์
๋๋ค โ 7๊ฐ ์ญํ ์ HSL
(primary ยท secondary ยท tertiary ยท success ยท info ยท warning ยท error)๊ณผ ์ค๋ฆฝ hue
ํ๋๋ฅผ PrimitiveColors.generate ์ ๋๊น๋๋ค. ์ฌ๋กฏ์ ํ๋์ฉ ๊ณ ๋ฅด๋ ๊ฒ ์๋๋ผ ์ด
์
๋ ฅ๊ณผ ์๋งจํฑ ๋งคํ์ ์ ํ๋ฉด ์ปจํ
์ด๋ยท์ ๊ฒฝยท์ํ ์ฌ๋กฏ์ด ๋ฐ๋ผ์ต๋๋ค. ๋ชจ๋์ ์ํ์ด์ค
์คํ์ผ๋ ์ต์ข
๊ฐ์ ์ฐธ์ฌํ๋ฏ๋ก, ํน์ ํ๋ ํธ์ hex ๋ ์ฌ๋กฏ ๊ฐ์๋ฅผ ๊ณ ์ ๋ ๋ณด์ฅ์ผ๋ก
์ฐ์ง ๋ง์ธ์.
์ปค์คํ ํ๋ ํธ๋ฅผ ๋ง๋๋ ๋ฒ๊ณผ ๊ทธ๊ฒ์ด Tailwind configยทCSS ๋ณ์๋ก ๊ตฌ์์ง๋ ๊ฒฝ๋ก๋ ํ ๋ง ๊ฐ์ด๋์ ์์ต๋๋ค.
์ญํ โ primary ๊ฐ ๊ธฐ๋ณธ์ด๊ณ , ๋๋จธ์ง ๋์ ๊ฐ๋๋ค#
์ ์ ํ์ ์๊ณ๊ฐ ์๋๋ผ ๊ฐ๊ฐ ๋ฐ๋ก ๊ณ ๋ฅด๋ ์ ๋ ฅ์ ๋๋ค. tertiary ๊ฐ secondary ์์ ๋์ค์ง ์์ต๋๋ค.
primary ๋ ๊ธฐ๋ณธ ์ธํฐ๋์ ์ญํ ์ด๊ณ , secondaryยทtertiary ๋ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ผ๋ก ๊ฐ๋๋ด์ผ ํ ๋ ๊ณ ๋ฅด๋ ๋ค๋ฅธ ์ญํ ์ ๋๋ค. ์ค์ ์ฑ์์ ์๋งจํฑ ๋งคํ์ด ์ ํฉ๋๋ค โ CoUI ๊ธฐ๋ณธ ํ ๋ง์์๋ primary ๊ฐ ๋ผ์ดํธ์์ ๋ธ๋ฃจ๊ทธ๋ ์ด(๋คํฌ์์๋ ๊ฑฐ์ ํฐ neutral), secondary ๊ฐ ์ค์ฑ ๊ฐ์กฐ์ด๊ณ , tertiary(= accent)๋ primary ์ ๊ฐ์ ๊ฐ์ด๋ผ ๊ฐ๋๊ฐ ์๊ธฐ์ง ์์ต๋๋ค. ๊ฐ๋๋ ๋ธ๋๋ ํ๋ ํธ๊ฐ tertiary ๋ฅผ ๋ฐ๋ก ๊ณ ๋ฅผ ๋ ์๊น๋๋ค.
๊ทธ ์ด์์ ์๋ฏธ๋ก ("secondary ๋ ๋ณด์กฐ ๋์")์ ์ด ํท์ด ์ฃผ์ฅํ์ง ์์ต๋๋ค. ์ฑ์ด ์ ํ์ธ์.
์ฑ์์ ๋ฐ๊ธฐ๋ ์ ๊ฒฝ๊ณผ ํจ๊ป ๊ฒฐ์ ํ์ธ์.
onX๊ฐ ํฐ์์ธ์ง ๊ฒ์ ์ธ์ง๋ ๋งคํ์ด ์ ํฉ๋๋ค. ์ฑ์๋ง ๋ฐํ๊ฑฐ๋ ์ด๋ก๊ฒ ํ๋ฉด ๊ทธ ์ ์ ๊ฒฝ๊ณผ์ ๋๋น๊ฐ ๊นจ์ง ์ ์์ผ๋ฏ๋ก, ์ปค์คํ ํ๋ ํธ๋ ์ค์ ์คํด์์X/onX๋ฅผ ํ ์์ผ๋ก ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
surface ๊ณ์ธต โ ์ด๋ฆ์ ๋ฐ๊ธฐ๊ฐ ์๋๋ผ "ํ์ด์ง์์ ๋จ์ด์ง ๊ฑฐ๋ฆฌ"๋ค#
์ด๊ฑด ์ด๋ฆ๋ง์ผ๋ก ๋งํ ์ ์์ด์ ๋ฐ๋์ ์์์ผ ํฉ๋๋ค.
surfaceContainerLowest โ surfaceContainerLow โ surfaceContainer
โ
surfaceContainerHigh โ surfaceContainerHighest
๊ฐ ์ปจํ
์ด๋ ํค ์ฌ๋ค๋ฆฌ์
๋๋ค.
์ค์ ๊ฐ์ ์๋ ์ค์์น์์ ํ์ฌ ํ
๋ง๋ก ํ์ธํ์ธ์.
๋ผ์ดํธ์์๋ level ์ด ์ค๋ฅผ์๋ก ์ด๋์์ง๊ณ , ๋คํฌ์์๋ ๋ฐ์์ง๋๋ค. ๋ฐฉํฅ์ด ๋ค์งํ์ง๋ง ๋ป์ ๊ฐ์ต๋๋ค โ "ํ์ด์ง์์ ๋ฉ์ด์ง๋ค". ๋ ๋ฐ์ ์์ด๋ผ๋ ์ด์ ๋ก ์ญํ ์ ๊ณ ๋ฅด์ง ๋ง์ธ์. ์นด๋ยทํ์ค๋ฒ์ ํ๋ฉด์ ๊ฐ ์ปดํฌ๋ํธ ๊ธฐ๋ณธ๊ฐ์ด ์ ํ๊ณ , ๋ณ๋ ์๊ณ๊ฐ ํ์ํ ๋๋ง ์ปจํ ์ด๋ level ์ ๋ช ์์ ์ผ๋ก ์ ํํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋กฏ์ด ๊ฐ์ ๊ฐ์ด ๋ ์ ์์ต๋๋ค. ๋งคํยท๋ชจ๋์ ๋ฐ๋ผ
surface์ ์ผ๋ถ ์ปจํ ์ด๋ ํค์ด ๊ฒน์นฉ๋๋ค. ์ด๋ฆ์ด ๋ค๋ฅด๋ค๋ ์ด์ ๋ง์ผ๋ก ์๊ฐ ์ฐจ์ด๊ฐ ๋ณด์ฅ๋์ง๋ ์์ต๋๋ค.
onSurface ์ onSurfaceVariant ๋ ๊ธฐ๋ณธ ์คํด์์ surface 8ํค ๋ชจ๋์ ๋ํด
4.5:1 ๊ธฐ์ค์ผ๋ก ๊ฒ์ฆ๋ฉ๋๋ค. ์ฑ์ด ๊ฐ์ ๋ฎ์ผ๋ฉด ๊ทธ ์ฑ์ ์ต์ข
์กฐํฉ๋ ๋ค์ ์ฌ์ผ ํฉ๋๋ค.
on* ํ์ด๋ง โ ์ด ํ๋ CI ๊ฐ ๋งค PR ๊ฒ์ฆํ๋ค#
์ถ์ธก์ด ์๋๋๋ค. check_contrast.dart ๊ฐ ์ค์ ์คํด์ ๋น๋ํด ์ฌ๊ณ , CI ๊ฐ ๊ทธ๊ฒ์
๋๋ฆฝ๋๋ค. ๊ฒ์ฌ ๋ฒ์์ ๊ฒฐ๊ณผ์ ์ ๋ณธ์ packages/coui_core/tool/check_contrast.dart
์ ๊ทธ ์คํ ์ถ๋ ฅ์
๋๋ค. ์ฌ๋กฏ์ด ํ์ฅ๋์ด๋ ์ค๋๋ ์ ๊ฐ์๋ฅผ ๋ณด์ฅ์ผ๋ก ๋จ๊ธฐ์ง ์์ต๋๋ค.
| ๋ฌด์ | ๊ธฐ์ค |
|---|---|
onSurface ยท onSurfaceVariant ร surface 8ํค | 4.5:1 |
onX on X โ 7์ญํ | 4.5:1 |
onXContainer on XContainer โ 7์ญํ | 4.5:1 |
onXFixed ๊ณ์ด ร XFixed/XFixedDim | 4.5:1 |
inverseOnSurfaceยทinversePrimary on inverseSurface |
4.5:1 |
onXContainer ๋ฅผ ๋ณธ๋ฌธ ํ
์คํธ๋ก surface ์์ | 4.5:1 |
primaryText ร surface 8ํค | 4.5:1 |
primaryTextLarge ร surface 8ํค | 3:1 (ํฐ ๊ธ์ ์ ์ฉ) |
link ร surface 8ํค | 4.5:1 |
placeholder ร ์
๋ ฅ ํ๋๊ฐ ๋์ด๋ ๋ฐํ(surface ยท surfaceContainerLowest) |
4.5:1 |
onSurfaceSubtle ร ๊ฐ์ ๋ฐํ(surface ยท surfaceContainerLowest) |
4.5:1 |
syntaxKeyword
ยท
syntaxType
ยท
syntaxFunction
ยท
syntaxString
ร ์ฝ๋ ๋ฐํ ์ฌ๋ โ CoUI
|
4.5:1 |
| ์ฑ์์ง ์ปจํธ๋กค์ hover / pressed ๋ฐฐ๊ฒฝ๊ณผ ์ ๊ฒฝ | 4.5:1 |
outline ร surface 8ํค | 3:1 |
outlineSubtle
ร
surface
ยท
surfaceBright
โ CoUI ๊ณ ๋๋น ๋ ๋ชจ๋๋ง
|
4.5:1 |
onCategoryX on categoryX โ ๋ถ๋ฅ์ 9๊ฐ์ง |
4.5:1 ยท ๋ผ์ดํธ 3.5:1(์ข์ ์์ธ) ยท ๊ณ ๋๋น 7:1 |
onCategoryXContainer on categoryXContainer |
4.5:1 ยท ๊ณ ๋๋น 7:1 |
onCategoryXContainer ๋ฅผ ์ ๊ธ์๋ก surface ์์ |
4.5:1 ยท ๊ณ ๋๋น 7:1 |
categoryXOutline ร surface โ ๊ณ ๋๋น ๋ ๋ชจ๋๋ง(CoUI ยท ํ์ค ๋งคํ) |
4.5:1 |
๊ท์น ์ธ ์ค#
-
onX๋X์์์๋ง ๋ณด์ฅ๋ฉ๋๋ค.onPrimary๋ฅผsurface์์ ๋๋ ์กฐํฉ์ ๊ฒ์ฆ ๋์์ด ์๋๋๋ค. -
์ญํ ์ ํ
์คํธ๊ฐ ํ์ํ๋ฉด fill ์ด ์๋๋ผ
onXContainer๋๋ ํ ์คํธ ์ ์ฉprimaryText๋ฅผ ์ฐ์ธ์. fill ์ ๊ทธ ์์onX์ ์ง์ง์ ์ฑ์์ด๊ณ ๋ณธ๋ฌธ ์์ด ์๋๋๋ค.primaryTextLarge๋ ํฐ ๊ธ์ ๊ธฐ์ค์ด๋ฏ๋ก ์ผ๋ฐ ๋ณธ๋ฌธ์ ์ฐ์ง ์์ต๋๋ค. outline์ ํ ์คํธ๊ฐ ์๋๋ผ ๊ฒฝ๊ณ๋ผ 3:1 ๊ธฐ์ค์ ๋๋ค.
์ผ๋ถ๋ฌ ๊ฒ์ฆํ์ง ์๋ ๊ฒ#
์ ์ด๋์ง ์์ผ๋ฉด ์๋ ๋ณด์ฅ์ ๋ฏฟ๊ฒ ๋ฉ๋๋ค.
-
outlineVariantโ ์ฅ์ ๊ตฌ๋ถ์ ์ด๋ผ 3:1 ์ ์๊ตฌํ๋ฉด hairline ์ด ์๋๊ฒ ๋ฉ๋๋ค. ์ปจํธ๋กค์ ๊ตฌํํ๋ ๊ฒฝ๊ณ๋ฅผ ์ด๊ฒ๋ง์ผ๋ก ๊ทธ๋ฆฌ์ง ๋ง์ธ์ โ ๊ทธ ์ฉ๋๋outline์ ๋๋ค. -
outlineSubtleโ ๋ ์๋ ํจ๋์ ํ ๋๋ฆฌ ์ฌ๋กฏ์ ๋๋ค. ์ผ๋ฐ ๋ชจ๋์์๋outlineVariant๋ณด๋ค๋ ์ ๊ฒ ๋๋ ๊ฐ(๋ผ์ดํธneutral/150ยท ๋คํฌneutral/900)์ด๋ผ ๊ฐ์ ์ด์ ๋ก ๋น์จ์ ์๊ตฌํ์ง ์์ต๋๋ค. ๋คํฌ์neutral/900์ ํจ๋ ์ฑ์ (surfaceBright)๊ณผ ๊ฐ์ ํค์ด๋ผ ์ ์ด ๋ณด์ด์ง ์๊ณ , ๊ฐ์ฅ์๋ฆฌ๋ ์ฑ์์ ๋ช ๋ ์ฐจ๋ก ์ฝํ๋๋ค. ๊ทธ๋ฆผ์๋ฅผ ๋ฏฟ์ ์ ์๋ CoUI ๊ณ ๋๋น ๋ ๋ชจ๋๋งsurfaceยทsurfaceBright์์์ 4.5:1 ๋ก ์ฝ๋๋ค. ๋ธ๋๋๊ฐ ๋ฐ๋ก ์ ํ์ง ์์ ํ์ค ๋งคํ์์๋ ์ด ์ฌ๋กฏ์ดoutlineVariant์ ๊ฐ์ ๊ฐ์ด๋ผ ๊ทธ ๊ธฐ์ค์ ์ง์ง ์์ต๋๋ค. -
disabled ์ฌ๋กฏ โ WCAG ๊ฐ ๋นํ์ฑ ์ปจํธ๋กค์ ๋ฉด์ ํฉ๋๋ค. ๋์ ๋ณ๋ ํ
์คํธ๊ฐ
๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ๊ณ ์ ํฉ๋๋ค(surface ๋๋น 3:1 ์ด์์ด๋ฉด์
onSurface๋ณด๋ค๋ ๋ฎ์ ๊ฒ โ ์ฝํ๋ ๋ช ๋ฐฑํ ๋นํ์ฑ). -
์ปจํ
์ด๋ ํค ์์
placeholderโ ์ ๋ ฅ ํ๋๋surface๋ฐํ์ด๋ผ ์ด ์กฐํฉ์ ๊ทธ๋ ค์ง์ง ์์ต๋๋ค. CoUI ๊ธฐ๋ณธ ํ ๋ง์์placeholder๋ ๋ผ์ดํธ์surfaceContainerLow๋ถํฐ ์ ์ปจํ ์ด๋ ํค๊ณผsurfaceDim, ๋คํฌ์surfaceContainerHighยทsurfaceContainerHighestยทsurfaceBright์์์ 4.5:1 ์ ๋ชป ๋ฏธ์นฉ๋๋ค. ์ปจํ ์ด๋ ํค์ผ๋ก ์ฑ์ด ์ ๋ ฅ์ ๋ง๋ค๋ฉด ๊ทธ ํค์ ๊ฒ์ฌ ๋์์ ๋ฃ๊ณ ๋ค์ ์ฌ์ผ ํฉ๋๋ค. -
์์ ์ ๊ฒฝยท๋ฐฐ๊ฒฝ ์กฐํฉ โ
onX๊ฐ ์๋ค๋ ์ฌ์ค๋ง์ผ๋ก ๋ชจ๋ ๋ฐฐ๊ฒฝ๊ณผ์ ๋๋น๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.primaryTextLarge์ 3:1 ๊ฒ์ฌ๋ ์ผ๋ฐ ๋ณธ๋ฌธ ๋ณด์ฅ์ด ์๋๋๋ค. -
ํ์ด์ง ์์ ๋ถ๋ฅ์ ์ฑ์ โ ์นฉ ยท ์ฐจํธ ยท ๋ฒ๋ก ์ ์ด ํ์ด์ง์์ ๋ณด์ด๋ ์ ๋
(
categoryXรsurface)์ ๋๋ค. ๋์์ธ์ UI ๊ธฐ์ค 3:1 ์ ์ฐธ๊ณ ๋ก๋ง ์ ์ต๋๋ค โ ๋ถ๋ฅ์ ์ด๋ฆ์ ์นฉ์ด๋ ๋ฒ๋ก์ ๋ผ๋ฒจ์ด ๋งํ๊ณ , ๊ทธ ๋ผ๋ฒจ ์ง์ ์ ํ์์ ์ฝ๋๋ค. - ๋ผ์ดํธ ยท ๋คํฌ์ ๋ถ๋ฅ์ outline โ ๋ผ์ดํธ์์๋ ์ปจํ ์ด๋ ํค์ ์ฝ์ด ์ ์ ์นฉ์ ์ผ๋ถ๋ฌ ํ ๋๋ฆฌ๊ฐ ๋ณด์ด์ง ์์ต๋๋ค. ๋คํฌ์ outline ์ ์นฉ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ ๋ฆฌํ๋ ์์กฐ์ด์ง ์ปจํธ๋กค์ ๊ตฌํํ๋ ๊ฒฝ๊ณ๊ฐ ์๋๋ผ ์ฝ 2:1 ์ ๋๋ค. ๋ณด์ด๋ ๊ฒฝ๊ณ๋ฅผ ์ฝ์ํ๋ ๊ณ ๋๋น ๋ ๋ชจ๋์์๋ง ์ฝ๋๋ค.
-
์นด๋ ยท ์ปจํ
์ด๋ ํค ์์ ๋ถ๋ฅ์ ์ง โ ๊ธฐ์ค์ ์นฉ์ด ๊ธฐ๋ณธ์ผ๋ก ๋์ด๋ ํ์ด์ง์์
์ ํ์ต๋๋ค. ๊ณ ๋๋น ๋คํฌ์ outline ์
surfaceContainer๊ฐ์ ์ปจํ ์ด๋ ํค ์์์ 4.5:1 ์ ๋ชป ๋ฏธ์นฉ๋๋ค. ๊ทธ ๋ชจ๋์์ ์ปจํ ์ด๋ ํค ์์ ์นฉ์ ๊ทธ๋ฆฌ๋ฉด ๊ทธ ํค์ ๊ฒ์ฌ ๋์์ ๋ฃ๊ณ ๋ค์ ์ฌ์ผ ํฉ๋๋ค. -
์ค๋ฆฝ ํค์ด ๋ค๋ฅธ ๋ธ๋๋์ ๊ณ ๋๋น ๋คํฌ ํ์ด์ง โ ๋ถ๋ฅ์ ๊ฐ์ ๋ชจ๋ ๋ธ๋๋์์
๊ฐ์ง๋ง ํ์ด์ง(
surface)๋ ๋ธ๋๋์ ์ค๋ฆฝ ํค์ ๋ฐ๋ฆ ๋๋ค. ๊ฒ์ดํธ๋ ํ์ค ๋งคํ์ ๋ํ ํ๋ ํธ ํ ๋ฒ์ ํ์ด์ง์์๋ง ์ฌ๊ณ , ๊ณ ๋๋น ๋คํฌ์ outline ์ ๊ทธ ํ์ด์ง์์ 4.5:1 ์ ๊ฒจ์ฐ ๋ฟ์ต๋๋ค(yellow ๊ฐ ๊ฐ์ฅ ๋น ๋ฏํฉ๋๋ค). ๊ทธ๋์ ์ค๋ฆฝ ํค์ด ๋ ๋ฐ๊ฑฐ๋ ์์กฐ๊ฐ ๋ค๋ฅธ ๋ธ๋๋์ ๊ณ ๋๋น ๋คํฌ ํ์ด์ง์์๋ outline ์ด 4.5:1 ์ ๋ชป ๋ฏธ์น ์ ์์ต๋๋ค โ ๊ทธ๋ฐ ๋ธ๋๋๋ ์๊ธฐ ํ์ด์ง์์ outline ์ ์ง์ ์ฌ์ผ ํฉ๋๋ค. ๊ธ์ ์ง์ ์ฌ์ ๊ฐ ์ปค์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ณ ๋๋น ๋ชจ๋์์๋ ๊ฐ์ ์ญํ ์์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ฆํ๊ณ , ๊ทธ ์์ ๊ณ ๋๋น์์๋ง ๋ํ๋ ๊ธฐ์ค์ด ์์ต๋๋ค โ ์ ํ์์ ๊ณ ๋๋น๋ฅผ ๋ฐ๋ก ์ ์ ํ์ ๋๋ค. ๊ณ ๋๋น๊ฐ ๋ฌด์์ ๋ฐ๊พธ๊ณ ๋ฌด์์ ์ผ๋ถ๋ฌ ํ์ง ์๋์ง๋ ์ ๊ทผ์ฑ ํ์ด์ง์ ์์ต๋๋ค.
๋ถ๋ฅ์ (category) โ ์๋ฏธ ์์ด ๊ตฌ๋ถ๋ง ํ๋ ์#
ํ๊ทธ ยท ์๋ฐํ ยท ๋ผ๋ฒจ ยท ์ผ์ ยท ์ฐจํธ ๋ฒ๋ก์ฒ๋ผ ์ด๊ฒ๊ณผ ์ ๊ฒ์ด ๋ค๋ฅด๋ค๋ง ๋งํ๋ ๊ณณ์ ์๋๋ค. ๋ถ๋ฅ์์ ์ฑ๊ณต ยท ์ค๋ฅ ยท ๊ฒฝ๊ณ ๊ฐ์ ์๋ฏธ๋ฅผ ๋๋ฅด์ง ์์ต๋๋ค โ ์๋ฏธ๋ ์ํ ์์ด ๋งก์ต๋๋ค.
์์ 9๊ฐ์ง์
๋๋ค: red ยท orange ยท yellow ยท green ยท blue ยท purple ยท pink ยท brown ยท
gray. ์ฝ๋์์๋ CoreCategoryColor ์ ๊ฐ์ด๊ณ , CSS ๋ณ์ ยท Figma ๋ณ์ ยท ์๋ ์ค์์น๊ฐ
๋ชจ๋ ์ด ์์๋ก ๋์ด๋ฉ๋๋ค.
๋ชจ๋๋ง๋ค ์นฉ์ด ๋ค๋ฅด๊ฒ ๋ณด์ธ๋ค#
| ๋ชจ๋ | ์งํ ์นฉ | ์ ์ ์นฉ |
|---|---|---|
| ๋ผ์ดํธ | ์ฑ์ + ํฐ ๊ธ์ | ์ ์ ์์กฐ ๋ฐํ + ์งํ ์ ๊ธ์, ํ ๋๋ฆฌ ์์ |
| ๋คํฌ | ์ด๋์ด ์ฑ์ + ํฐ ๊ธ์ | ์ด๋์ด ์์กฐ ๋ฐํ + ์ ํ ๋๋ฆฌ + ์ ๋ช ํ ์ ๊ธ์ |
| ๊ณ ๋๋น ๋ผ์ดํธ | ์งํ ์ฑ์ + ํฐ ๊ธ์ | ๋ผ์ดํธ ๋ฐํ + ๋ ์งํ ๊ธ์ + ์งํ ์ฑ์์ ํ ๋๋ฆฌ |
| ๊ณ ๋๋น ๋คํฌ | ๋ฐ์ ์ฑ์ + ๊ฒ์ ๊ธ์ | ์ด๋์ด ์์กฐ ๋ฐํ + ๋ฐ์ ๊ธ์ + ์ ํ ๋๋ฆฌ |
์ฌ๋กฏ ์ด๋ฆ์ ๋ค ๋ชจ๋๊ฐ ๊ฐ๊ณ ๊ฐ๋ง ๋ค๋ฆ ๋๋ค โ ์ปดํฌ๋ํธ๋ ์ฌ๋กฏ๋ง ๊ณ ๋ฆ ๋๋ค.
์ฌ๋กฏ โ ์๋ง๋ค ๋ค์ฏ ๊ฐ#
์ฌ๋กฏ (X = Red โฆ Gray) | ์ฐ์ |
|---|---|
categoryX | ์งํ ์นฉ ์ฑ์ ยท ์ฐจํธ ๊ณ์ด ยท ๋ฒ๋ก ์ |
onCategoryX | ์งํ ์นฉ ๊ธ์ |
categoryXContainer | ์ ์ ์นฉ ยท ์๋ฐํ ยท ์ผ์ ๋ธ๋ก ๋ฐํ |
onCategoryXContainer | ์ ์ ์นฉ ๊ธ์, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ ๊ธ์ |
categoryXOutline | ์ ์ ์นฉ ยท ์๋ฐํ ยท ์ผ์ ๋ธ๋ก ํ ๋๋ฆฌ โ ๋ผ์ดํธ์์๋ ๋ณด์ด์ง ์์ต๋๋ค |
// ์ ํด ๋ ์
CoreColor.token(CoreColors.categoryRedContainer)
// ์คํ ์ค์ ๊ณ ๋ฅธ ์ โ hue ๋ CoreCategoryColor
CoreColor.token(hue.container)
// Web โ ๊ฐ์ ์ด๋ฆ์ class / CSS ๋ณ์
'bg-category-red-container'
'rgb(var(--coui-on-category-red-container))'
์ฐ๋ ๊ท์น#
- ์๋ฏธ๋ฅผ ๋๋ฅด์ง ์์ต๋๋ค. ์ฑ๊ณต ยท ์ค๋ฅ ยท ๊ฒฝ๊ณ ยท ์ ๋ณด์๋ ์ํ ์์ ์๋๋ค.
- 9๊ฐ์ง ์ค์์ ๊ณ ๋ฆ ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅธ ์์์ hex ๋ ๋ฐ์ง ์์ต๋๋ค.
-
์ ๊ธ์๋ ๋ชจ๋ ๋ชจ๋์์
onCategoryXContainer์ ๋๋ค โ ๋ถ๋ฅ๋ช ์ ์์ผ๋ก ์ฐ๋ ๊ธ์, ๋ฒ๋ก ๊ธ์ ๋ชจ๋.categoryX๋ ๊ธ์์์ด ์๋๋๋ค. ํฐ ๋ฐํ ์์์ 3.5:1 ์ธ์ ๋ฆฌ๊น์ง ๋ด๋ ค๊ฐ๋๋ค. - ๊ธฐ๋ณธ์ ์ ์ ์นฉ์ ๋๋ค. ์งํ ์นฉ์ ๊ฐ์กฐ๋ ์๊ฐ ๋ฐฐ์ง ๊ฐ์ ์งง์ ๋ผ๋ฒจ์๋ง ์๋๋ค.
๋๋น ์์ธ โ ๋ผ์ดํธ์ ์งํ ์นฉ ๋ผ๋ฒจ ํ๋#
๋ผ์ดํธ ๋ชจ๋์ ์งํ ์นฉ ๋ผ๋ฒจ(
onCategoryXoncategoryX)์ ํํด 3.5:1 ์ ํ์ฉํฉ๋๋ค. ์กฐ๊ฑด: SemiBold ์ด์ ยท 12px ์ด์ ยท ๋จ์ด ํ๋๋ ์๊ฐ ๊ฐ์ ์งง์ ๋ผ๋ฒจ. ๋ฌธ์ฅ์๋ ์ฐ์ง ์์ต๋๋ค.
ํฐ ๊ธ์๋ก 4.5:1 ์ ์งํค๋ฉด ๋ผ์ดํธ์ ์ฑ์์ด ์ด๋ก๊ณ ํํด์ง๋๋ค. ์งง์ ๋ผ๋ฒจ์ 3.5:1 ์์๋ ์ฝํ๋๋ค. ๋คํฌ๋ 4.5:1, ๊ณ ๋๋น ๋ ๋ชจ๋๋ 7:1 ์ ์์ธ ์์ด ์งํต๋๋ค. ๋๋น ๊ฒ์ดํธ๋ ์ด ์์ธ๋ฅผ 3:1 ํฐ ๊ธ์ ๊ธฐ์ค์ด ์๋ 3.5:1 ๊ทธ๋๋ก ์ฌ๋ฏ๋ก, ์ฑ์์ด 3.5:1 ์๋๋ก ๋ด๋ ค๊ฐ๋ฉด ์คํจํฉ๋๋ค.
๊ฐ์ ๋ธ๋๋์ ๋ฌด๊ดํ๋ค#
๋ถ๋ฅ์์ ๋ธ๋๋ ์์ด ์๋๋ผ ๋ชจ๋ ๋ธ๋๋์์ ๊ฐ์ ๊ฐ์
๋๋ค. ๋ธ๋๋ ํ๋ ํธ
(CoreBrand)๊ฐ ๋ฐ๊พธ์ง ์๊ณ , PrimitiveColors.generate ์ ์
๋ ฅ๋ ์๋๋๋ค. ๊ฐ์
coui_core ์ CoreCategoryPalette ํ ๊ณณ์ ์๊ณ , ๊ฐ ๋งคํ์ด ์ผ๋ฐ ์คํด๊ณผ ๊ณ ๋๋น
์คํด์ ๊ทธ ํ๋ฅผ ๊ทธ๋๋ก ์๋๋ค. ์งํ ์นฉ ๊ธ์(onCategoryX)๋ง ํ์ ์์ด ์๋๋ผ ๋งคํ์
ํฐ์์ด๊ณ , ๊ณ ๋๋น ๋คํฌ์์๋ง ๊ฒ์ ์
๋๋ค. Figma ์์๋ ์์๊ฐ์ด ๋ธ๋๋ ๋ฐ์
color/category/<์>/<์ญํ > ๊ทธ๋ฃน์ ํ ๋ฒ ์๊ณ , ๋ธ๋๋๋ง๋ค ์๋งจํฑ ์ฌ๋กฏ์ด ๊ทธ๊ฒ์
๊ฐ๋ฆฌํต๋๋ค.
CoreSchemeSource ๋ฅผ ์ง์ ๊ตฌํํ๋ค๋ฉด ๋ค ๋น๋(light ยท dark ยท
highContrastLight ยท highContrastDark)์ raiseContrast
์์์
CoreCategoryPalette.applyTo ๋ฅผ ๋ถ๋ฅด์ธ์. ๊ณ ๋๋น ์ชฝ์์ ๋น ๋จ๋ฆฌ๋ฉด ๊ณ ๋๋น ๋ชจ๋๊ฐ
๋ถ๋ฅ์์ ์ผ๋ฐ ๊ฐ์ ๊ทธ๋๋ก ๊ทธ๋ฆฝ๋๋ค โ ๋น์ด ์๋ ์ฌ๋กฏ์ CoUI ์ ์ผ๋ฐ ๊ฐ์ผ๋ก ์ฑ์์ง๊ธฐ
๋๋ฌธ์
๋๋ค.
๋๋น๋ ๋ ํฌ ๊ฒ์ดํธ๊ฐ ์ฐ๋ค#
๋ ํฌ์ ๋๋น ๊ฒ์ดํธ(check_contrast.dart)๊ฐ ์ on* ํ์ ๋ถ๋ฅ์ ์ง์ 9์ ร 4๋ชจ๋,
CoUI ยท ํ์ค ๋งคํ์์ ์ฝ๋๋ค. ํ์ค ๋งคํ์ ๋ํ ํ๋ ํธ ํ ๋ฒ์ ํ์ด์ง์์ ์ฌ๋ฏ๋ก, ์ค๋ฆฝ
ํค์ด ๋ค๋ฅธ ๋ธ๋๋์ ๊ณ ๋๋น ๋คํฌ outline ์ ์ผ๋ถ๋ฌ ๊ฒ์ฆํ์ง ์๋ ๊ฒ
์ ์ ์์ต๋๋ค. CoreContrast.auditScheme ์ ๋ถ๋ฅ์์ ๋ณด์ง ์์ต๋๋ค โ
๊ธฐ์ค์ด ๋ชจ๋๋ง๋ค ๋ค๋ฅด๊ณ ๋ผ์ดํธ์ 3.5:1 ์ ์ด๋ค CoreContrastLevel ์๋ ์์ด์, ๋ํ ์
ํ ๋ฒ๋ก ์ ์ ์ ์์ต๋๋ค. ์ฑ์ด ์ง์ ๊ทธ๋ฆฌ๋ ๋ถ๋ฅ์ ์ง์ CoreContrast.ratio ๋ก
๊ณ ์ ํ์ธ์.
์ค์์น๋ ์๋ ์ ์ฒด ํ ํฐ ์ Category ๋ฌถ์์ ์์ต๋๋ค.
์ํ์์ ์ฅ์์ผ๋ก ์จ๋ ๋๋ โ ๋๊ฐ๊ฐ ๋ ์๋ค#
์์คํ ์ ์ด ์๋ค์ ์ฅ์ variant ๋ก ์ค์ ์ ๊ณตํฉ๋๋ค. ๋ค๋ง:
warning fill ์ ํ
์คํธ ์์ผ๋ก ์ธ ์ ์์ต๋๋ค#
warning fill ์ ๋ณธ๋ฌธ ์์ผ๋ก ์ฐ์ง ์์ต๋๋ค. ๋ฐ์ ํ๋ ํธ์์ ๋๋น๊ฐ ๋ฎ์์ง๋ ๊ฒ์
ํ๋ ๋ฏธ์ค๊ฐ ์๋๋ผ ๊ตฌ์กฐ์ ์
๋๋ค โ warning ์
onWarning ์ด ํฐ์์ด ์๋๋ผ ๊ฒ์ ์ธ ์ ์ผํ ์ญํ ์ด๊ณ , ๊ทธ๊ฑด fill ์ด ์ค๊ณ์
๋ฐ๋ค๋ ๋ป์
๋๋ค(๊ฒฝ๊ณ ๋ ๋
ธ๋์ด๋๊น). ํ
์คํธ๋ก ์ฝํ๊ฒ ์ด๋ก๊ฒ ํ๋ฉด ๊ทธ ๊ฒ์ ์ ๊ฒฝ์ด
๊นจ์ง๋๋ค.
๊ทธ๋์ ํ
์คํธ ์ฒด์ธ์ fill getter ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค โ Web ์์๋ ์ผ๊ณฑ
์ญํ ์ fill getter ๊ฐ ์ญ์ ๋์๊ณ Flutter ์์๋ deprecated ์
๋๋ค. ๊ฐ๋๊ฐ ๊ทธ
๊ฒฝ๋ก์ ์ฌ๋์
์ ๋ง์ต๋๋ค. ๊ฒฝ๊ณ ์ ํ
์คํธ์ ๋์ฒด๋ **onWarningContainer**์
๋๋ค.
ํค์ ์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ ๋ผ์ด๋๋ ์ ๋๋ฅผ ๋ฐ๊ฟ๋๋ค#
Alert ์ ํต๋ณด ๋ฐฉ์์ variant ๊ฐ ๊ฒฐ์ ํ๊ณ , ์ ํ๋ซํผ์ด ๊ฐ์ ๊ฒฐ์ ์ ์ฝ์ต๋๋ค:
| ํค | Web | Flutter |
|---|---|---|
| destructive | role="alert" โ ์ฝ๋ ๋ฌธ์ฅ์ ๋์ต๋๋ค |
live region |
| warning ยท success ยท info | role="status" โ ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค | live region |
| ํค ์์ | ์ญํ ์์ | live region ์๋ |
Flutter ์๋ ํต๋ณด ์ถ์ด ํ๋๋ฟ์ด๋ผ polite/assertive ๊ตฌ๋ถ์ด ์์ต๋๋ค โ ๊ทธ ๊ตฌ๋ถ๋ง Web ์ ์ฉ์ด๊ณ , ๋งคํ ์์ฒด๋ ๊ณต์ ๋ฉ๋๋ค.
์์ ์ฅ์์ผ๋ก ๊ณ ๋ฅด๋ฉด ํ์ด์ง๊ฐ ๋ง์ ๋์ต๋๋ค. ๋ฐฐ๋ ์ธ ๊ฐ๋ฅผ destructive ๋ก ๋๋ฉด ์ฌ์ฉ์๊ฐ ์๋ฌด๊ฒ๋ ํ๊ธฐ ์ ์ ์ธ ๋ฒ ๋ง์ด ๋๊น๋๋ค.
๋๋น ๊ฒ์ฆ#
๋ธ๋๋ ํ๋ ํธ๋ฅผ ์ธ์ ๋ค๋ฉด ๋ผ์ดํธยท๋คํฌ ์๋งจํฑ ์์ ๋๋น๋ฅผ ํ
์คํธ๋ก ๊ณ ์ ํ์ธ์. coui_core ์ CoreContrast
๊ฐ WCAG 2.x ์๋ ํ๋์ ๋๋น ๋น์จ์ ์์ Dart ๋ก ๊ณ์ฐํ๋ฏ๋ก, Flutter ์ฑยทWeb ์ฑยท๊ณจ๋ ํ
์คํธ๊ฐ ๊ฐ์ ์ซ์๋ฅผ ๋ด
๋๋ค. ์ฑ์์ ํ๋ ๊ณต์์ ๋ค์ ์ง์ง ๋ง์ธ์.
| ์ฐ๋ ์ด๋ฆ | ์๋ฏธ |
|---|---|
CoreContrast.relativeLuminance(color) | ์๋ ํ๋ (0 = ๊ฒ์ , 1 = ํฐ์) |
CoreContrast.ratio(foreground, background) | ๋๋น ๋น์จ (1 ~ 21) |
CoreContrast.meets(foreground, background, level) |
level ์ ํต๊ณผํ๋์ง |
CoreContrastLevel |
aaNormalText
4.5 ยท
aaLargeText
3 ยท
aaaNormalText
7 ยท
aaaLargeText
4.5 ยท
nonText
3
|
CoreContrast.auditScheme(scheme) |
์คํด์ ๋ํ ์์ ํ ๋ฒ์ ์ ๊ฒํ CoreContrastReport |
final brand = PrimitiveColors.generate(/* ๋ธ๋๋ ์๋ */);
final light = CoreSemanticMapping.light(brand).resolved(.light);
final dark = CoreSemanticMapping.dark(brand).resolved(.dark);
// ๋ํ ์ ํ ๋ฒ์ โ ์คํจํ ์์ด reason ๋งจ ์์ ์ฐํ๋๋ค
for (final scheme in [light, dark]) {
final report = CoreContrast.auditScheme(scheme);
expect(report.failures, isEmpty, reason: report.toString());
}
// ์ฑ์ด ์ง์ ์น ํ๋ ์
expect(
CoreContrast.meets(light.onPrimaryContainer, light.surface, .aaNormalText),
isTrue,
);
CoreContrast.ratio(const CoreColor(0xFF777777), const CoreColor(0xFFFFFFFF)); // 4.48
auditScheme ์ ๋ํ ์์ ์คํด์ด ๊ทธ๋ฆฌ๋ผ๊ณ ๋ง๋ ์กฐํฉ์
๋๋ค โ ์ญํ ๋ง๋ค onX / X ์ onXContainer
/ XContainer, ํ์ด์ง ์ onSurface ยท onSurfaceVariant ยท onSurfaceSubtle
ยท placeholder ยท error, ์ด๋ฆ์ด ๊ธฐ์ค์ ๋งํ๋ primaryText(4.5:1) ยท primaryTextLarge(3:1),
inverseOnSurface / inverseSurface, ์ปดํฌ๋ํธ ๊ฒฝ๊ณ outline(3:1). ๋ชจ๋ ์ปจํ
์ด๋ ํคยทhover ์ฑ์ยท์ปดํฌ๋ํธ ๋ณํ๊น์ง ํ์ง๋ ์์ผ๋, ์ฑ์ด ๋ฐ๋ก ์น ํ๋ ์์
ratio / meets ๋ก ์ง์ ๊ณ ์ ํ์ธ์. ์ฅ์์ฉ outlineVariant ยท outlineSubtle
๊ณผ ๋นํ์ฑ ํค์ WCAG ๊ฐ ๋น์จ์ ์๊ตฌํ์ง ์์ ๋ฃ์ง ์์ต๋๋ค. ๋ถ๋ฅ์๋ ๋ฃ์ง ์์ต๋๋ค โ ๊ธฐ์ค์ด ๋ชจ๋๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
๋๋ค(๋ถ๋ฅ์).
-
์
๋ ฅ์ ํด์๋ ์์
๋๋ค โ
ResolvedColorScheme์ ์ฌ๋กฏ์ด๋ Flutterscheme.resolve(token)๊ฒฐ๊ณผ. ํด์ ์ CoreColor.token(...)์ ์ฑ๋์ด ์์ดStateError๋ฅผ ๋์ง๋๋ค. -
๋ฐํฌ๋ช
โ ๋๋น๋ ๋ถํฌ๋ช
ํ ๋ ์ ์ฌ์ด์์๋ง ์ ์๋ฉ๋๋ค. ๋ฐํฌ๋ช
ํ ์ ๊ฒฝ์ ๋ฐฐ๊ฒฝ ์์ ํฉ์ฑ(source-over)ํ ์์ผ๋ก ์ฝ๋๋ค. ๋ฐํฌ๋ช
ํ
๋ฐฐ๊ฒฝ์ ๊ทธ ๋ค์ ๋ฌด์์ด ์๋๋์ ๋ฌ๋ ค ํ์ ํ ์ ์์ผ๋ฏ๋ก
ArgumentError์ ๋๋ค โ ํ๋ฉด์ ์ค์ ๋ก ๋ณด์ด๋ ๋ถํฌ๋ช ์์ ๋๊ธฐ์ธ์(CoreContrast.compositeOver). - ๋ฐ์ฌ๋ฆผํ์ง ์์ต๋๋ค โ 4.48:1 ์ ํ๋ฉด์ "4.5" ๋ก ๋ณด์ฌ๋
aaNormalText๋ฅผ ํต๊ณผํ์ง ๋ชปํฉ๋๋ค.
CoUI ๊ธฐ๋ณธ ์(CouiColorPresets.source)์ ๋ผ์ดํธยท๋คํฌยท๊ณ ๋๋น ์คํด์ ๋ํ ์์ ๋ชจ๋ ํต๊ณผํ๊ณ , ๊ทธ ์ฌ์ค์ coui_core
ํ
์คํธ๊ฐ ๊ณ ์ ํฉ๋๋ค.
์ ์ฒด ํ ํฐ#
Surface
Primary
Secondary
Accent
Tertiary
Status
Status indicators
Utility
Syntax
Category
์ด ํ๋
glass*๋ค ์ฌ๋กฏ์ ๋ณด์ฌ์ฃผ์ง ์์ต๋๋ค โ ๊ธฐ๋ณธ ํ๋ ํธ๊ฐ ๊ทธ ์ฌ๋กฏ์ ์ฑ์ฐ์ง ์์--coui-glass-*CSS ๋ณ์๊ฐ ๋๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ ๋ช ์ํ๋ฉด Liquid Glass ๋์์ธ ์์คํ ์ด๋ํฐ(Flutter)๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ , ๋ช ์ํ์ง ์์ผ๋ฉด surfaceยทprimary ์์ ํ์ํฉ๋๋ค.