d8a80f6272
이름만 다른(표기 변형) [[위키링크]]를 대상 문서의 canonical 제목으로 치환해 끊겼던 1,200개 링크를 연결. 제목/파일명 정규화 일치만 적용하고 별칭 매칭은 과병합 위험으로 제외(애매성 가드). 원본은 _link_reconcile_backup/ 에 백업. 도구: Datacollect/scripts/link_reconcile_apply.mjs Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
204 lines
4.7 KiB
Markdown
204 lines
4.7 KiB
Markdown
---
|
|
id: wiki-2026-0508-scss-sass
|
|
title: SCSS (Sass)
|
|
category: 10_Wiki/Topics
|
|
status: verified
|
|
canonical_id: self
|
|
aliases: [Sass, SCSS, Dart Sass]
|
|
duplicate_of: none
|
|
source_trust_level: A
|
|
confidence_score: 0.9
|
|
verification_status: applied
|
|
tags: [frontend, css, scss, sass, preprocessor]
|
|
raw_sources: []
|
|
last_reinforced: 2026-05-10
|
|
github_commit: pending
|
|
tech_stack:
|
|
language: SCSS
|
|
framework: Dart Sass
|
|
---
|
|
|
|
# SCSS (Sass)
|
|
|
|
## 매 한 줄
|
|
> **"매 CSS 의 superset preprocessor — variable, nesting, mixin, module"**. 2006 Hampton Catlin 출시. 2020 Dart Sass 의 only 공식 implementation (LibSass deprecated). 2026 매 Tailwind v4 / native CSS nesting 의 부상으로 점유율 감소했지만 매 design system / legacy 에서 견고.
|
|
|
|
## 매 핵심
|
|
|
|
### 매 두 syntax
|
|
- **SCSS**: 매 CSS-superset, `{}` `;` 사용 — 매 mainstream.
|
|
- **Sass (indented)**: 매 Python-like indentation, `.sass` 확장자 — 매 niche.
|
|
|
|
### 매 핵심 기능
|
|
- Variable: `$primary: #007bff;`
|
|
- Nesting: 매 selector 중첩 + `&` (parent reference).
|
|
- Mixin: `@mixin` / `@include` — reusable block.
|
|
- Function: `@function` — value 반환.
|
|
- Module system: `@use` / `@forward` (2019+, 매 `@import` deprecated).
|
|
- Inheritance: `@extend`.
|
|
- Math/color operations.
|
|
|
|
### 매 2026 상태
|
|
- Native CSS: nesting (Baseline 2024), `var()`, `@layer`, container query — 매 SCSS 의 일부 기능 native.
|
|
- Tailwind v4: 매 utility-first → SCSS 의 design system 사용 감소.
|
|
- 여전히 활발: Bootstrap 5, Material Design legacy, Rails 8 default.
|
|
|
|
### 매 응용
|
|
1. Design system: 매 token (color, spacing, typography) 의 SCSS variable.
|
|
2. Component library: 매 mixin 으로 button/card variant 생성.
|
|
3. Theme switching: 매 SCSS map + CSS custom property hybrid.
|
|
|
|
## 💻 패턴
|
|
|
|
### Variable + Nesting
|
|
```scss
|
|
$primary: #007bff;
|
|
$radius: 4px;
|
|
|
|
.card {
|
|
background: white;
|
|
border-radius: $radius;
|
|
|
|
&__header {
|
|
color: $primary;
|
|
|
|
&:hover {
|
|
color: darken($primary, 10%);
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Mixin
|
|
```scss
|
|
@mixin flex-center($direction: row) {
|
|
display: flex;
|
|
flex-direction: $direction;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.modal {
|
|
@include flex-center(column);
|
|
}
|
|
```
|
|
|
|
### `@use` module system (modern, replaces `@import`)
|
|
```scss
|
|
// _colors.scss
|
|
$primary: #007bff;
|
|
$secondary: #6c757d;
|
|
|
|
// _mixins.scss
|
|
@mixin shadow($level: 1) {
|
|
box-shadow: 0 #{$level * 2}px #{$level * 4}px rgba(0,0,0,0.1);
|
|
}
|
|
|
|
// app.scss
|
|
@use 'colors' as c;
|
|
@use 'mixins' as m;
|
|
|
|
.button {
|
|
background: c.$primary;
|
|
@include m.shadow(2);
|
|
}
|
|
```
|
|
|
|
### Map + each loop (theme tokens)
|
|
```scss
|
|
$spacing: (
|
|
xs: 4px,
|
|
sm: 8px,
|
|
md: 16px,
|
|
lg: 24px,
|
|
);
|
|
|
|
@each $name, $value in $spacing {
|
|
.p-#{$name} { padding: $value; }
|
|
.m-#{$name} { margin: $value; }
|
|
}
|
|
```
|
|
|
|
### CSS custom property + SCSS hybrid (theme switch)
|
|
```scss
|
|
:root {
|
|
--bg: #fff;
|
|
--text: #000;
|
|
}
|
|
[data-theme='dark'] {
|
|
--bg: #111;
|
|
--text: #eee;
|
|
}
|
|
|
|
@function token($name) {
|
|
@return var(--#{$name});
|
|
}
|
|
|
|
body {
|
|
background: token(bg);
|
|
color: token(text);
|
|
}
|
|
```
|
|
|
|
### Function
|
|
```scss
|
|
@function rem($px) {
|
|
@return #{$px / 16}rem;
|
|
}
|
|
|
|
.title {
|
|
font-size: rem(24); // 1.5rem
|
|
}
|
|
```
|
|
|
|
### Vite 7 SCSS 설정
|
|
```ts
|
|
// vite.config.ts
|
|
export default defineConfig({
|
|
css: {
|
|
preprocessorOptions: {
|
|
scss: {
|
|
api: 'modern-compiler', // Dart Sass embedded API
|
|
additionalData: `@use "@/styles/_globals" as *;`,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
```
|
|
|
|
## 매 결정 기준
|
|
| 상황 | Approach |
|
|
|---|---|
|
|
| New project (greenfield 2026) | Native CSS + Tailwind v4 |
|
|
| Existing Bootstrap project | SCSS (built-in) |
|
|
| Design system with tokens | SCSS map + CSS var hybrid |
|
|
| Theme switching | CSS custom property (SCSS optional) |
|
|
| Rails 8 / Phoenix | SCSS (default) |
|
|
| React app | CSS Modules / Tailwind / vanilla-extract |
|
|
|
|
**기본값**: 매 새 project 매 native CSS + Tailwind v4. 매 SCSS 매 design-system / legacy 의 limited use.
|
|
|
|
## 🔗 Graph
|
|
- 응용: [[Material_Design]] · [[Design_System]]
|
|
- Adjacent: [[Tailwind CSS]] · [[CSS Modules]] · [[vanilla-extract]]
|
|
|
|
## 🤖 LLM 활용
|
|
**언제**: 매 large design system, theme variable, legacy Bootstrap project.
|
|
**언제 X**: 매 utility-first (Tailwind), 매 native CSS nesting/var 으로 충분한 경우.
|
|
|
|
## ❌ 안티패턴
|
|
- **`@import` 사용**: deprecated (2024) — 매 `@use`/`@forward` 사용.
|
|
- **Deep nesting (4+ level)**: 매 specificity 폭발, BEM-like flat 으로.
|
|
- **LibSass 사용**: 매 deprecated 2020 — Dart Sass 만.
|
|
- **Color function 의 변경 무시**: 매 `darken()` 의 공식 deprecation (2024) → `color.adjust()` 사용.
|
|
|
|
## 🧪 검증 / 중복
|
|
- Verified (Sass 1.81+, Dart Sass docs, Vite 7 release).
|
|
- 신뢰도 A.
|
|
|
|
## 🕓 Changelog
|
|
| 날짜 | 변경 |
|
|
|---|---|
|
|
| 2026-05-08 | Phase 1 |
|
|
| 2026-05-10 | Manual cleanup — `@use` module / Dart Sass / Vite 통합 |
|