Tailwind 무료 템플릿을 구해서 svelte 및 melt-ui 등으로 UI 기능을 구성하는 연습을 합니다. 첫번째로 TailAdmin 이라는 템플릿으로 클론 프로젝트를 진행합니다.
Admin 템플릿 : tailadmin (무료)
런타임, 컴파일러
웹프레임워크 및 개발도구
CSS 유틸리티
UI 컴포넌트
개발 유틸리티
bun create svelte@latest tailwind-admin-app
# - Skeleton project
# - Typescript
# - Prettier
cd tailwind-admin-app
bun install
bun run dev
.prettierrc
설정 : tailwind 플러그인vite.config.ts
설정 : purgeCss (highlight.js 클래스 제거 방지)svelte.config.js
설정 : melt-ui 전처리기tailwind.config.js
설정 : Noto 폰트, pluginsapp.html
: D2Coding 폰트, lang 설정app.pcss
: tailwind 테마 설정+layout.svelte
: 전역 css 연결+page.svelte
: 데모 코드를 넣어 tailwind 작동 확인bun:sqlite 을 내장한 bun 런타임을 실행하기 위해 --bun
옵션을 사용한다.
.env
: 외부 변수.prettierrc
: 플러그인svelte.config.js
: 전처리기tailwind.config.js
: 플러그인, 테마 설정app.html
app.pcss
: tailwind 변수값, 사용자 클래스+layout.svelte
+page.svelte
$lib
로 이동<script>
import { ModeToggle } from '$lib/components/ui';
import { dropdownOpen, mobileNavOpen } from './open-handlers';
import { setContext } from 'svelte';
setContext('dropdownOpen', dropdownOpen);
setContext('mobileNavOpen', mobileNavOpen);
import HeaderLeftSection from './header-left-section.svelte';
import HeaderMobileNavButton from './header-mobile-nav-button.svelte';
import HeaderMobileNavMenu from './header-mobile-nav-menu.svelte';
import HeaderUserDropdown from './header-user-dropdown.svelte';
import HeaderRightToolbar from './header-right-toolbar.svelte';
</script>
<header id="page-header" class="z-1 flex flex-none items-center">
<div class="container mx-auto px-4 lg:px-8 xl:max-w-7xl">
<div class="flex justify-between border-b-2 border-slate-200/50 py-6">
<HeaderLeftSection />
<!-- Right Section -->
<div class="flex items-center gap-1 lg:gap-5">
<HeaderRightToolbar />
<HeaderUserDropdown />
<ModeToggle />
<HeaderMobileNavButton />
</div>
<!-- END Right Section -->
</div>
{#if $mobileNavOpen}
<HeaderMobileNavMenu />
{/if}
</div>
</header>
daisyUI 의 light, dark 테마 색상으로 변경
bg-{색상}
, text-{색상}
들을 모두 교체:root,
[data-theme] {
background-color: theme(colors.base-100); /* background */
color: theme(colors.base-content); /* foreground */
}
CSS 속성 : var 함수
var(--my-var, red)
: --my-var 가 정의되지 않았을 경우 red로 표시됨aria-hidden
: (스크린 리더에서) 불필요한 요소를 숨기는 역활<FlagIcon />
사용시 정적 맵핑<svelte:component this={컴포넌트} />
활용value 값에 따라 적용되는 색상을 tailwind-variants
으로 설정하여 적용한다.
{#if}..{/if}
에 의한 html 중복 없이 간단하게 처리할 수 있다.
svelte-headless-table
사용해 보기shadcn-svelte 의 Data Table 에서는 해볼만하게 나왔는데, svelte-headless-table 만으로 적용해 보려니깐 무척 지저분하게 보인다. 일단 컬럼 순서와, 정렬, 컬럼 숨기기 plugin 기능을 추가하여 적용해 보았다.
컬럼 단위 정렬은 Svelte Legos 에도 있다.
font-feature-settings: 'rlig' 1, 'calt' 1;
Solution 1. Using a Theme File
tailwind.config.js
에서 변수와 연결되는 색상 함수를 정의theme.js
에서 색상 함수를 제공 (json 파일 등에서 읽어올 수도 있음)Solution 2. Using CSS Variables
tailwind.config.js
에서 변수를 정의하고global.css
에서 변수값(색상)을 설정oklch
로 전환하는 이유공식을 정의하고 몇가지 색상을 선택하면 전체 디자인 시스템 팔레트가 자동으로 생성됩니다.
oklch
(L C H) oroklch
(L C H / a)
.bw {
color: oklch(0% 0 0); /* black */
color: oklch(100% 0 0); /* white */
color: oklch(100% 0.2 100); /* also white, any hue with 100% L is white */
color: oklch(50% 0 0); /* gray */
}
.colors {
color: oklch(80% 0.12 100); /* yellow */
color: oklch(60% 0.12 100); /* much darker yellow */
color: oklch(80% 0.05 100); /* quite grayish yellow */
color: oklch(80% 0.12 225); /* blue, with the same perceived lightness */
}
.opacity {
color: oklch(80% 0.12 100 / 50%); /* transparent yellow */
}
oklch 와 hsl 비교
oklch 와 lch 차이
CSS 색상 변환 (rgb 를 oklch 로 바꾸기)
:root {
--origin: #ff000;
--error: oklch(60% 0.16 30);
}
.foo {
color: oklch(from var(--origin) l c h);
}
.message.is-error {
/* The same color but with different opacity */
background: oklch(from var(--error) l c h / 60%);
/* 10% darker */
border-color: oklch(from var(--error) calc(l - 10%) c h);
}
.message.is-success {
/* Another hue (green) with the same lightness and saturation */
background: oklch(from var(--error) l c 140);
}
끝!