Microsoft Fast์ Blazor ์ปดํฌ๋ํธ์ธ Fast Blazor์ ์ ์ํ๊ณ ์ ๋ฌด์ ์ ์ฉํ๊ธฐ ์ํ ๋จ๊ธฐ ์ฌ๋ก๊ทธ ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์์ ๋๋ Blazor UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ MudBlazor์ ์ด๋ ํ ์ฐจ์ด๊ฐ ์๋์ง ์ด๋ค ์ฅ/๋จ์ ์ด ์๋์ง๋ ๊ฐ์ด ๋น๊ตํ ์์ ์ ๋๋ค.
์คโฆ ์ ๋ toy project๋ฅผ MudBlazor๋ก ํฝํ๋๋ฐใ ใ โฆ awesomeblazor์์ ๋ค์ง ๊ฒฐ๊ณผ ์ ์ผ ๋ซ๋ค๊ณ ํ๋จํ์ต๋๋ค. ๋ฌผ๋ก ๋ค๋ฅธ component๋ค์ ์จ๋ณด์ง ์์์ ๋น๊ตํด์ฃผ์๋ฉด ๋์์ด ๋ง์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค!
Fast Blazor๋ ๋ค์์ ๋ช ๋ น์ผ๋ก ํ๋ก์ ํธ ํ ํ๋ฆฟ์ผ๋ก ๋น ๋ฅด๊ฒ ์์ํ ์ ์์ต๋๋ค.
| ํ๋ก์ ํธ ํ ํ๋ฆฟ ์ค์น
dotnet new install Microsoft.Fast.Templates.FluentUI::2.0.3
์ดํ ์ ํ๋ก์ ํธ
์ ๊ด๋ จ ํ๋ก์ ํธ ํ
ํ๋ฆฟ์ ์ ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋์์ธ ํ ํฐ
FAST๋ ์ ์ํ UI(Adaptive UI)๋ผ๋ ์์คํ ์ ์ ๊ณตํฉ๋๋ค. ์ด์ ๋ฐ๋ผ ์ฆ๊ฐ์ ์ธ ํ ๋ง ์ ์ฉ์ด ๊ฐ๋ฅํด์ง๋๋ค.
https://www.fast.design/ ์ Dynamic themes with Adaptive UI๋ฅผ ์ดํด์ฃผ์ธ์.
์ด๋ "๋์์ธ ํ ํฐ"์ ํตํด ๊ฐ๋ฅํฉ๋๋ค. Fast Balzor์์๋ ๊ฐ ํ ํฐ์ด ์๋น์ค์ ๋ฑ๋ก๋์ด ์์ด์ [Inject]
ํน์ฑ์ ์ด์ฉํด ๊ฐ์ ธ๋ค ์ธ ์ ์์ต๋๋ค.
๋ค์์ฒ๋ผ ๊ตฌ์ฑ ์์๋ก ์ง์ ์ฌ์ฉํ ์ ๋ ์์ต๋๋ค.
<FluentDesignSystemProvider>
๋ฅผ ์ด์ฉํด app.razor
์ ์ผ๊ด ์ ์ฉํ ์๋ ์์ต๋๋ค.
Fast Blazor์ ๋ฐ๋ชจ๋ ์๋์์ ํ์ธํ ์ ์์ต๋๋ค.
Fast ๋ฐ Fast Blazor ๋ ๋ณ๋์ ๋ ์ด์์ ์์คํ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๊ฐ์ด css๊ฐ ์ฝํ ๊ฐ๋ฐ์์ ์ ์ฅ์์๋ ์์ฌ์ด ๋ถ๋ถ์ ๋๋ค.
์ด์ ๋ฐํด MudBlazor๋ css๋ฅผ ์์จ๋ ํ๋ฉด ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ ์ ๋๋ก ๋ค์ํ ๋ ์ด์์ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Blazor์์ ์ ์ค๋น๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์์ค์์๋ Fast Blazor๋ MudBlazor๋ ํน๋ณํ ๋์ด๋์ ์ฐจ์ด๋ ์์ด ๋ณด์ ๋๋ค. (๊ทธ ์ปดํฌ๋ํธ์ ์ฌ์ฉ๋ฒ์ ์ผ๋ง๋ ๋นจ๋ฆฌ ์ต์ํด์ง๋ ์ ๋์ ์ฐจ์ด์ ๋๋ค.)
๋ค๋ง Fast Blazor๋ Fast์ ๋ํ์ด๊ณ Fast๋ ํ๋์ ์ธ ๋ฐฉ์์ผ๋ก ์น ๊ตฌ์ฑ ์์ ๋จ์๋ก ํ๋ฅญํ๊ฒ ๋์์ธ ๋ฐ ํ์ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ ์ด ์ฅ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. (ํ์ ํ ์ ์๋ ์ด์ ๋ ์์ง Fast๋ฅผ ์ ๋๋ก ์ฌ์ฉํ์ง ์์์ผ๋ฏ๋ก)
ํน์ ๊ธฐ์ ์ ๋น ๋ฅด๊ฒ ์ตํ๊ธฐ ์ํด์๋ ์นํธ ์ํธ(์ปจ๋ ํ์ดํผ)๋งํผ ์ข์ ๊ฒ์ด ์์ต๋๋ค.
Fast์ ๊ฐ์ ์ ํ ๋ง๋ฅผ ์ด๋ป๊ฒ ๋์ ์ผ๋ก ์ ์ฉํ ์ ์๋์ง ์ดํด๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
Fast Blazor์ ์ํ ์ฝ๋ ์ค ํ ๋ง ์ค์์น ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด
public async void SwitchTheme()
{
await Task.Delay(50);
if (_inDarkMode)
baseLayerLuminance = StandardLuminance.DarkMode;
else
baseLayerLuminance = StandardLuminance.LightMode;
await BaseLayerLuminance.SetValueFor(container, baseLayerLuminance.GetLuminanceValue());
GlobalState.SetLuminance(baseLayerLuminance);
await _jsModule!.InvokeVoidAsync("switchHighlightStyle", baseLayerLuminance == StandardLuminance.DarkMode);
}
์ด๋ฐ ์ฝ๋๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ํต์ฌ์ ํ์ค์ธ๋ฐ์,
await BaseLayerLuminance.SetValueFor(container, baseLayerLuminance.GetLuminanceValue());
๋์์ธ ํ ํฐ ์ค BaseLayerLuminance
๊ฐ์ ๋ณ๊ฒฝํจ์ ์ ์ ์์ต๋๋ค. Fast์์๋ ๋คํฌ๋ชจ๋์ ๋ผ์ดํธ ๋ชจ๋๋ฅผ Luminance(ํ๋)๋ก ์กฐ์ ํ ์ ์๋ ๋ฏ ํฉ๋๋ค. ์ฆ, Dark|Light ๊ฐ ์๋๋ผ 0.2f, 0.8f ๋ฑ์ ํน์ ๊ฐ์ผ๋ก ์ค ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ ์ฉ์ ์ฆ๊ฐ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ ์ฉ๋ฉ๋๋ค.
Fast Blazor๋ฅผ ํ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋จ์ ์ ์ ์์ ๋ ๋ ์ด์์ ์์คํ ์ ๋๋ค. ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ทธ๋ฅ Bootstrap์ ๋ ์ด์์ ์์คํ ์ ๊ทธ๋๋ก ์ด์ฉํ๋ ๊ฒ์ ๋๋ค ๋งโฆ Blazor์์ ์ปดํฌ๋ํธ ํํ๋ก ๋ ์ด์์์ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ ์ข ๋ ๋ฆฌ์์น ํด๋ด์ผ๊ฒ ์ต๋๋ค.
์ดํด๋ณผ ๋งํ ์๋ก, Fast Blazor์ ๋ฐ๋ชจ ์ฝ๋๋ฅผ ๋ณด๋ฉด Stack
์ด๋ผ๋ ๋ ์ด์์ ์ปดํฌ๋ํธ๊ฐ ์๋๋ฐ ๊ตฌํ์ ์ดํด๋ณด๋ฉด ๊ฐ๊ฒฐํ๊ณ ์ฌ๋ฐ์ต๋๋ค. (Stack์ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ StackPanel
์ ๊ทธ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค)
| stack.razor
@* Remember to replace the namespace below with your own project's namespace. *@
@namespace FluentUI.Demo.Shared
@inherits FluentComponentBase
<div class="@ClassValue" style="@StyleValue" @attributes="AdditionalAttributes">
@ChildContent
</div>
HTML ์
์ฅ์์๋ ๋ ์ด์์ ๋ธ๋ก์ ๋จ์ง div
๋ธ๋ก์ผ ๋ฟ์
๋๋ค.
| Stack.razor.cs
...
protected string? ClassValue => new CssBuilder(Class)
.AddClass("stack-horizontal", () => Orientation == Orientation.Horizontal)
.AddClass("stack-vertical", () => Orientation == Orientation.Vertical)
.Build();
protected string? StyleValue => new StyleBuilder()
.AddStyle("align-items", GetHorizontalAlignment(), () => Orientation == Orientation.Vertical)
.AddStyle("justify-content", GetVerticalAlignment(), () => Orientation == Orientation.Vertical)
.AddStyle("justify-content", GetHorizontalAlignment(), () => Orientation == Orientation.Horizontal)
.AddStyle("align-items", GetVerticalAlignment(), () => Orientation == Orientation.Horizontal)
.AddStyle("column-gap", $"{HorizontalGap}px", () => HorizontalGap.HasValue)
.AddStyle("row-gap", $"{VerticalGap}px", () => VerticalGap.HasValue)
.AddStyle("width", Width, () => !string.IsNullOrEmpty(Width))
.AddStyle("flex-wrap", "wrap", () => Wrap)
.AddStyle(Style)
.Build();
...
์์ฑ์ ๋ฐ๋ผ ์ ์ ํ Class
์ ์ ์ ํ Style
์ ์์ฑํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Fast Blazor์์ Lab ํํ๋ก (NuGet ํจํค์ง์๋ ํฌํจ๋์ง ์์) ๋ ์ด์์ ์ปดํฌ๋ํธ๋ฅผ Header
, Footer
, BodyContent
, Layout
, MainLayout
, Spacer
, Stack
์ผ๋ก ์ ๊ณตํ์ง๋ง MudBlazor์ ๊ทธ๊ฒ์ ๋นํด์๋ ๋ง์ด ๋น์ฝํฉ๋๋ค. (์ด๊ฒ์ Fast์ ๋ฌธ์ ๋ผ๊ธฐ ๋ณด๋ค๋ ์ ์ css ํ์ฉ์ ์ ํ์ ๋ฐ๋ฅธ ๋จ์ ์ผ๋ก ๋น์ถฐ์ง๋ ์ ์
๋๋ค.)
Fast ํน์ง ์ ๋ฆฌ
Fast๋ ์ด๋ฏธ ์ ๋์์ธ๋ Fast ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ์ ์ง์ HTML ์์๋ก ์ฌ์ฉํ๊ณ ์ฌ์ฉ์๊ฐ ์ด ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ฌ์ฉ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋๋ก ํด์ค๋๋ค. ์ด๋ ์ HTML ํ๊ทธ๋ฅผ ์ ์ํ๊ณ , ํ์ค ๊ตฌ์ฑ ์์ ์๋ช ์ฃผ๊ธฐ์ ์ฐ๊ฒฐํ๊ณ , HTML ๋ ๋๋ง ๋ฐ CSS๋ฅผ ์บก์ํํ๊ณ , CSS๋ฅผ ๋งค๊ฐ ๋ณ์ํ ํ๊ณ , ๊ตฌ์ฑ ์์๋ฅผ ์คํจํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์คํ๋ฅผ ํตํด ๊ฑฐ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ ์ ๋์ํฉ๋๋ค.
๋ํ ๋ค์ํ ํ๋ ์์ํฌ์ ์ ๊ฒฐํฉ๋๋ฉฐ Fast ํํ์ด์ง์์ ์๊ฐํ๋ ํ๋ ์์ํฌ - Angular, ASP.NET, Aurelia, Blazor, Ember, React, Rollup, Svelte, Vite, Vue, Webpack๋ฑ๊ณผ ์ ๊ฒฐํฉ๋ฉ๋๋ค.
๋ํ Fast๋ ๋ค์์ ๊ธฐ์ ์คํ์ผ๋ก ๊ตฌํ๋์ด ์๋๋ฐ
์ด ๊ธฐ๋ฐ์ผ๋ก ์๋กญ๊ฒ ๊ตฌํํ ํ์ ์์ด ๊ธฐ ๊ตฌํ๋ ๋ค์ํ ๊ธฐ๋ฅ ๋จ์ (์ํ ๊ด๋ฆฌ, ์ ๊ทผ์ฑ, ํค๋ณด๋ ํ์ ๋ฐ ํ์ฅ์ฑ/์ปดํฌ์ง์ ๋ชจ๋ธ ๋ฑ)์ ๋์ ์คํ์ผ ๋์, CSS ์์ฑ ๊ด๋ฆฌ, ์๊ณ ๋ฆฌ์ฆ ์์, RTL, ๊ณ ๋๋น ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
@microsoft/fast-foundation
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Google์ ๋จธํฐ๋ฆฌ์ผ ๋์์ธ์ด๋ ํธ์ํฐ์ ๋ถํธ ์คํธ๋ฉ๊ณผ ๊ฐ์ ๊ตฌํํ ์๋ ์์ต๋๋ค.
Fast Blazor ํน์ง ์ ๋ฆฌ
Fast Blazor๋ Fast์ Balzor ๋ํ์ ๋๋ค. Fast์ ์ฌ์ฉ์ ์ง์ HTML์ Blazor์ ์ปดํฌ๋ํธ๋ก ๋ํ๋ฉ๋๋ค.
๋์์ธ ํ ํฐ์ ์ ์ธํ Fast์ ๊ธฐ๋ฅ์ด Fast Blazor์ ๋ ธ์ถ๋๋์ง๋ ํ์ ๋์ง ์์ต๋๋ค. (๋ฐ๋ชจ์๋ ๋ํ๋์ง ์์ต๋๋ค.) Fast๋ฅผ ์ด์ฉํด์ ๋ง๋ค์ด์ง FluentUI ์ปดํฌ๋ํธ๋ฅผ Blazor์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก Blazor ์ปดํฌ๋ํธ๋ก ๋ํํ ์ ๋๋ก ์ดํด๊ฐ ๋ฉ๋๋ค.
Blazor์์ ์ข ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก Lab ์์ค์ผ๋ก ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ์ด์์ ์์คํ ๋ฟฅ๋ง ์๋๋ผ NavMenu๋ผ๋๊ฐ ๋ฑ์ง, Highligther ๋ฑ์ ๋๋ค.
๊ฒ์ํด ๋ณธ ๊ฒฐ๊ณผ WPF์ Grid, StackPanel ๊ฐ์ Blazor์ฉ ๋ ์ด์์ ์ ์ฉ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ํ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ฐ๋ณด๋ฉด CSS๊ฐ ์ด๋ฏธ ๊ทธ ๊ฒ์ ํ๋ฅญํ๊ฒ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ด ์๋๊น ์๊ฐํ๋๋ฐ์, ์ฐธ๊ณ ๊ฐ ๋๋ ์๋์ ๊ธ์ ๊ณต์ ํฉ๋๋ค.
CSS ๊ฒฉ๋ฆฌ ์ค๋์
์ ์ผ์ธ์ง CSS ๊ฒฉ๋ฆฌ๊ฐ ๋์ํ์ง ์์ต๋๋ค. ๋ถ๋ช ํ ๋ค์ ์ฒ๋ผ CSS ๊ฒฉ๋ฆฌ๋ฅผ ์ค์ ํ๋๋ฐ
| _Laout.cshtml
...
<link href="BlazorApp33.styles.css" rel="stylesheet" />
...
| Components.razor.css
fluent-card {
--card-height: 400px;
--card-width: 500px;
padding: 20px;
margin: 12px;
}
.class-override {
height: 163px;
width: 300px;
}
.state-override {
--card-width: 350px;
--card-height: 300px;
}
.contents {
display: flex;
flex-direction: column;
}
์คํํ๋ฉด ๋ค์ ์ฒ๋ผ ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
๋ถ์ํด๋ณด๋ฉด ๋ณํ๋ html ์ฝ๋๋ฅผ ๋ณด์์ ๋,
<fluent-card neutral-palette-source="#CABA8C" _bl_90769844-e72f-40fc-b290-c337320e18c4>
...
</fluent-card>
๊ทธ๋ฆฌ๊ณ ์คํ์ผ์
| https://localhost:7061/BlazorApp33.styles.css
fluent-card[b-63vyab3aqy] {
--card-height: 400px;
--card-width: 500px;
padding: 20px;
margin: 12px;
}
...
๋ก ๋ง์ง๋ฅผ ์๋ค์? ์๋ง๋ ์์ฒด ์์คํ ์ ์ด์ฉํ๋ ๋ฏ ํ๋ฉฐ ๊ทธ ์์คํ ์ ๋ง๊ฒ ์คํ์ผ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ฆฌ
Fast ๋ฐ Fast Blazor๋ (ํนํ Flast Blazor๋ Fast๊ฐ ์กด์ํ๋ ํ) Microsoft๊ฐ ๊ด๋ฆฌํ๊ณ ์์ผ๋ฏ๋ก ์ ์ฉํด ๋ณผ๋งํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ํนํ Fast๋ GitHub์์ 8k์ ์ง์ง๋ฅผ ๋ฐ๊ณ ์๋ ์ ๋ ์ธ์์ ์ ๋๋ค.
Blazor์์ ์ฌ์ฉํ๋ Fast๋ ๋ค๋ฅธ Blazor ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน๋ณํ ๋ค๋ฅธ ๋๋์ ์์์ง๋ง ์๋ง๋ Fast์ ์ดํด๋๊ฐ ๋ฎ์์ ์๊ธฐ๋ ์๊ฐ์ ์ํ ๊ฒ์ผ๋ก ์๊ฐ๋ฉ๋๋ค. ์ด์จ๋ Fast Blazor๋ฅผ ์ฌ์ฉํ๋ ์ ์ฅ์์๋ ์ฌํ Blazor ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๊ฐ์ผ๋ก ๊ฑฐ์ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ๋๋ถ๋ถ์ ๊ถ๊ธ์ฆ์ ๋ค์์ ๋ฐ๋ชจ๋ฅผ ํตํด ์ฐพ๊ณ ์ ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
https://brave-cliff-0c0c93310.azurestaticapps.net/
CSS ๊ฒฉ๋ฆฌ์ ๊ฒฝ์ฐ ์ ํํ ์์ธ์ ์ฐพ์ง ๋ชปํ์ผ๋ Blazor ์์ฒด์ ๋ฌธ์ ์ ์ฐ๊ด์ด ์๋ ๋ฏ ํด ๋ณด์ ๋๋ค. Fast Blazor์ ์ปดํฌ๋ํธ๋ ๋ณ๊ฐ์ CSS ๊ฒฉ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋๋ง์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ Fast ์ปดํฌ๋ํธ์์ ์คํ์ผ์ ์ ์ฉํ ์ ์์๋๋ฐ ์ง๊ธ์ ์ด๋ถ๋ถ์ด ์ค์ํ์ง๋ ์์ผ๋ฏ๋ก ๊ธธ๊ฒ ํ์ธ ํ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ฉด ๋ง๊ธ์ ๋ฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ ์ด์์ ์์คํ ์ Lab์ Stack์ ์ฌ์ฉํด์ ์ ๊ทผํ๊ณ ์ข ๋ ๋ค์ํ ๊ตฌ์ฑ์ Stack์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ ๋ง๋ค์ด๋๊ฐ์ผ๊ฒ ์ต๋๋ค. ๋๋ถ๋ถ์ ๋ ์ด์์์ Stack๋ง์ผ๋ก๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ ๋ณด์์ต๋๋ค. ๋ค๋ง ๋ฐ์ํ๋ ๊ณ ๋ คํด์ผ ํ๋ฏ๋ก ์ด๊ฒ ์ญ์ ์ฐจ์ฐจ ๋๊ฐ๋ฉฐ ์ค์ ์ ์ฉํ์ ๋์ ์๋ฃจ์ ์ ๋๊ธ๋ก ๋ฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
@dimohy ๋์ Slog ๋๋ถ์ Fluent UI Blazor๋ฅผ ํ ์คํธํด๋ณด๊ณ ์์ต๋๋ค.
๊ฐ๊ฒฐํ๊ณ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. web component๋ ์๊ฒ๋๊ณ fluent ui๊ฐ blazor๋ก ํฌํ ๋ ๋ถ๋ถ๋ ์ดํด๋ณผ ์ ์์์ต๋๋ค. design token์ ์ฝ๊ฒ ์ ์ํ๊ธฐ ์ด๋ ค์์ css๋ฅผ ํธ๋ค๋ง ํ๋ ๋ฐฉ๋ฒ์ ํ ์คํธ ์ค์ ๋๋ค.
tailwindcss์ fluent ui๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์์ต๋๋ค.
๊ตณ์ด tailwindcss๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ด์ ๋ ๊ณ์ ์ฌ์ฉํ๋ค ๋ณด๋ ์์ ์ต์ด์ ๊ทธ๋ ์ต๋๋ค.
FluentCard๋ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ผ Class๋ฅผ ํตํด tailwindcss ์ ์ฉ์ด ์ฌ์ ์ต๋๋ค.
๋ฌธ์ ๋ FluentButton์ ๋ ๋๋ง ๋๊ฒ์ ๋ณด๋ฉด Child Element๋ก button ํ๊ทธ๊ฐ ๋ค์ด๊ฐ ์์ด์
fluent-button ํ๊ทธ์ css๋ฅผ ์ ์ฉํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , css ๊ฒฉ๋ฆฌ์ ๋น์ทํ ํจ๊ณผ๋ฅผ ์ป๊ณ ์ ํ์์ต๋๋ค.
(์ค๋ตโฆ) ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ์์ต๋๋ค.
-
tailwindcss ์ค์
-
postcss ๋ฐ autoprefixer ์ค์น
-
postcss-import์ postcss-easy-import ์ค์น
npm install -D postcss-import postcss-easy-import
- postcss.config.js ์ค์
module.exports = {
plugins: [
require('postcss-easy-import'),
require('tailwindcss'),
require('autoprefixer'),
]
}
- package.json ์ค์
"scripts": {
"build": "postcss ./Src/base.styles.css -o ./wwwroot/css/StyleSheet.css",
"watch": "postcss ./Src/base.styles.css -o ./wwwroot/css/StyleSheet.css --watch --verbose"
}
- base.styles.css ํ์ผ ์์ฑ
@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";
@import './tag.styles.css';
/* postcss easy import */
@import '../Pages/**/*.razor.css';
- tag.styles.css ํ์ผ ์์ฑ
fluent-card {
@apply border rounded-none shadow-none;
}
fluent-button {
@apply border-0 rounded-none shadow-none;
}
- /Pages/Index.razor
<FluentCard Class="w-[300px] h-[300px] text-red-500">
<h2>Hello World!</h2>
<FluentButton id="test">Click Me</FluentButton>
</FluentCard>
- /Pages/Index.razor.css
#test::part(control) {
@apply border text-red-500 bg-white text-[20px] hover:text-white hover:bg-red-500;
--neutral-fill-hover: initial;
}
- wwwroot/css/StyleSheet.css ํ์ผ ์์ฑ
npm run build
์ผ๋ถ๋ง ํ
์คํธํด ๋ณด์์ต๋๋ค.
๋ด์ฉ์ ์ฌ๋ฆฌ๋์ค ๋๋ ์๊ฐ์ ๊ตณ์ด ์ด๋ ๊ฒ๊น์ง ํด์ ์ฌ์ฉํด์ผ ๋๋ ์ถ์ต๋๋ค.
์๋๋๋ค. ํ๋ฅญํ๋ค์โฆ ๊ด๋ จ ๊ฒฝํ์ ๋ธ๋ก๊ทธ ๊ธ๋ก ๊ณต์ ์ฃผ์๋ฉด ๋์์ด ๋ง์ด ๋ ๋ฏ ํฉ๋๋ค.
์์ปจ๋ ์ต์ํด์ง๊ธฐ ํธํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๊ณ ,
์์๊ฒ ๋ง๋๋ ๊ฑด ๊ฒฐ๊ตญ css๋ก ์ก์์ค์ผ ํ๋๊ฑฐ๊ตฐ์?
์, ์คํ๋ ค ๊ทธ๊ฒ ๋ ๊น๋ํ๊ฒ ๋ณด์ผ ์๋ ์๊ฒ ๋ค์.
์ ์๋๋ฉด ์์ css ๊ตฌํด๋ค ๋ถ์ฌ๋ฒ๋ ค๋ ๋๊ณ ,
๋จโฆ @_jeonghwan ๋๊ป์ ์ ๋ฆฌํด์ฃผ์ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ฒ ๋ค์.
CSS์์ flex์ grid๊ฐ ์ด๋์ ๋ ์ด์ํด์ง๋ <Stack>
๋ฑ์ ๋ ์ด์์ ๊ด๋ จ ์ปดํฌ๋ํธ๊ฐ ๊ฑฐ์ถ์ฅํด์ก์ต๋๋ค. class ๋๋ style์ด ์๋ ๋ณ๋์ ์ปดํฌ๋ํธ ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํด์ ๊ตฌ์กฐ๊ฐ ์ข ๋ ๋ณต์กํด์ง๋ ์ ๋ ์์ต๋๋ค. ์ด ์ ๋ ๋๋ HTML-CSS ์ฌ์ โ ๋ฌธ์์ ์คํ์ผ์ ๊ตฌ๋ณํ๋ ์ ๊ทผ๋ฒ์ด XAML ๊ตฌ์กฐ ๋ณด๋ค ์ข์๋ณด์ด๋ ์ ๋ ์๊น๋๋ค. (๋ ์ด์์์ ๋น ๋ฅด๊ฒ ํ๊ทธ๋ก ์ก๊ณ ์คํ์ผ์ ๋จน์ฌ๊ฐ๋ ์ฌ๋ฏธ๋ ์ข ์ฐจ์ด๊ฐ ๋ฉ๋๋ค)
์ ๊ฐ ์ธํ
์ ์ ๋ชป ํด์ ๊ทธ๋ฐ์ง๋ ๋ชฐ๋ผ๋,
๋ท๋ท 8.0์์ ์๋ก ๋ฐ๋ blazor์ ๊ธฐ๋ณธ template๊ณผ ํธํ์ด ๋์ง ์๋ ๊ฒ ๊ฐ์์.
์ฌ์ง์ด ๊ฐ์ ๋ฐํ์ ์กฐ๊ฑด ํ์์, fast ์ ์ฉ, ์ฆ FluentUI ํ
ํ๋ฆฟ์ผ๋ก ์์ฑํ๋ฉด ์ ์๋ ํฉ๋๋ค๋ง,
8 ๋ฒ์ ์ด ์๋์์ ๋์ ํ
ํ๋ฆฟ์ผ๋ก ์์ฑํด์ ๊ทธ๋ฐ๊ฐ ๋ด์.
์ ๊ฐ ํ ์คํธ ํ์ ๋๋ ์ ๋์๋๋ฐ์, ๋์์ ๋๋ฆด ์ ์๋๋ก ํ๋ก์ ํธ๋ฅผ ๊ณต์ ๊ฐ๋ฅ ํ ๊น์?