@conscience-technology/ctds 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -2
- package/assets/components/AppFrame/AppFrame.module.css +177 -0
- package/assets/components/AppFrame/AppFrame.tsx +93 -0
- package/assets/components/AppFrame/index.ts +6 -0
- package/assets/components/AttachmentChip/AttachmentChip.module.css +71 -0
- package/assets/components/AttachmentChip/AttachmentChip.tsx +74 -0
- package/assets/components/AttachmentChip/index.ts +2 -0
- package/assets/components/AttachmentThumb/AttachmentThumb.module.css +107 -0
- package/assets/components/AttachmentThumb/AttachmentThumb.tsx +91 -0
- package/assets/components/AttachmentThumb/index.ts +2 -0
- package/assets/components/Avatar/Avatar.module.css +167 -0
- package/assets/components/Avatar/Avatar.tsx +228 -0
- package/assets/components/Avatar/index.ts +2 -0
- package/assets/components/AvatarUpload/AvatarUpload.module.css +130 -0
- package/assets/components/AvatarUpload/AvatarUpload.tsx +139 -0
- package/assets/components/AvatarUpload/index.ts +2 -0
- package/assets/components/Badge/Badge.module.css +76 -0
- package/assets/components/Badge/Badge.tsx +68 -0
- package/assets/components/Badge/index.ts +2 -0
- package/assets/components/Breadcrumb/Breadcrumb.module.css +213 -0
- package/assets/components/Breadcrumb/Breadcrumb.tsx +279 -0
- package/assets/components/Breadcrumb/index.ts +8 -0
- package/assets/components/Button/Button.module.css +216 -0
- package/assets/components/Button/Button.tsx +149 -0
- package/assets/components/Button/index.ts +2 -0
- package/assets/components/Callout/Callout.module.css +146 -0
- package/assets/components/Callout/Callout.tsx +138 -0
- package/assets/components/Callout/index.ts +2 -0
- package/assets/components/ChatInput/ChatInput.module.css +241 -0
- package/assets/components/ChatInput/ChatInput.tsx +322 -0
- package/assets/components/ChatInput/ModelSelector.tsx +40 -0
- package/assets/components/ChatInput/SendButton.tsx +41 -0
- package/assets/components/ChatInput/index.ts +10 -0
- package/assets/components/Checkbox/Checkbox.module.css +66 -0
- package/assets/components/Checkbox/Checkbox.tsx +36 -0
- package/assets/components/Checkbox/index.ts +2 -0
- package/assets/components/Chip/Chip.module.css +128 -0
- package/assets/components/Chip/Chip.tsx +103 -0
- package/assets/components/Chip/index.ts +2 -0
- package/assets/components/ChoiceCard/ChoiceCard.module.css +142 -0
- package/assets/components/ChoiceCard/ChoiceCard.tsx +132 -0
- package/assets/components/ChoiceCard/index.ts +2 -0
- package/assets/components/ContextMenu/ContextMenu.module.css +102 -0
- package/assets/components/ContextMenu/ContextMenu.tsx +392 -0
- package/assets/components/ContextMenu/index.ts +9 -0
- package/assets/components/DatePicker/Calendar.tsx +234 -0
- package/assets/components/DatePicker/DESIGN_NOTES.md +106 -0
- package/assets/components/DatePicker/DESIGN_NOTES_TIME.md +125 -0
- package/assets/components/DatePicker/DatePicker.module.css +295 -0
- package/assets/components/DatePicker/DatePicker.tsx +387 -0
- package/assets/components/DatePicker/TimeSelector.tsx +69 -0
- package/assets/components/DatePicker/index.ts +8 -0
- package/assets/components/DatePicker/presets.ts +80 -0
- package/assets/components/DatePicker/utils.ts +148 -0
- package/assets/components/Disclosure/Disclosure.module.css +73 -0
- package/assets/components/Disclosure/Disclosure.tsx +129 -0
- package/assets/components/Disclosure/index.ts +6 -0
- package/assets/components/Drawer/Drawer.module.css +257 -0
- package/assets/components/Drawer/Drawer.tsx +126 -0
- package/assets/components/Drawer/index.ts +7 -0
- package/assets/components/EmptyState/EmptyState.module.css +102 -0
- package/assets/components/EmptyState/EmptyState.tsx +80 -0
- package/assets/components/EmptyState/index.ts +2 -0
- package/assets/components/FileIcon/FileIcon.module.css +66 -0
- package/assets/components/FileIcon/FileIcon.tsx +84 -0
- package/assets/components/FileIcon/fileExtMap.ts +112 -0
- package/assets/components/FileIcon/index.ts +9 -0
- package/assets/components/FilterButton/FilterButton.module.css +130 -0
- package/assets/components/FilterButton/FilterButton.tsx +94 -0
- package/assets/components/FilterButton/index.ts +2 -0
- package/assets/components/GalleryItem/GalleryItem.module.css +220 -0
- package/assets/components/GalleryItem/GalleryItem.tsx +163 -0
- package/assets/components/GalleryItem/index.ts +7 -0
- package/assets/components/Icon/Icon.tsx +616 -0
- package/assets/components/Icon/context.tsx +39 -0
- package/assets/components/Icon/index.ts +4 -0
- package/assets/components/IconButton/IconButton.module.css +109 -0
- package/assets/components/IconButton/IconButton.tsx +110 -0
- package/assets/components/IconButton/index.ts +2 -0
- package/assets/components/Input/Input.module.css +338 -0
- package/assets/components/Input/Input.tsx +371 -0
- package/assets/components/Input/index.ts +2 -0
- package/assets/components/ListItem/ListItem.module.css +318 -0
- package/assets/components/ListItem/ListItem.tsx +262 -0
- package/assets/components/ListItem/index.ts +9 -0
- package/assets/components/MenuItem/MenuItem.module.css +437 -0
- package/assets/components/MenuItem/MenuItem.tsx +529 -0
- package/assets/components/MenuItem/index.ts +8 -0
- package/assets/components/MetricCard/MetricCard.module.css +153 -0
- package/assets/components/MetricCard/MetricCard.tsx +140 -0
- package/assets/components/MetricCard/index.ts +2 -0
- package/assets/components/Modal/Modal.module.css +175 -0
- package/assets/components/Modal/Modal.tsx +98 -0
- package/assets/components/Modal/index.ts +2 -0
- package/assets/components/Onboarding/DocsIndex.tsx +82 -0
- package/assets/components/Onboarding/LayoutBuilder.tsx +160 -0
- package/assets/components/Onboarding/Onboarding.module.css +1394 -0
- package/assets/components/Onboarding/OnboardingAxisPanel.tsx +515 -0
- package/assets/components/Onboarding/OnboardingPage.tsx +1193 -0
- package/assets/components/Onboarding/PresetsGallery.tsx +65 -0
- package/assets/components/Onboarding/actions.ts +250 -0
- package/assets/components/Onboarding/index.ts +8 -0
- package/assets/components/Onboarding/palette.css +40 -0
- package/assets/components/Onboarding/wizardData.ts +265 -0
- package/assets/components/Pagination/Pagination.module.css +82 -0
- package/assets/components/Pagination/Pagination.tsx +248 -0
- package/assets/components/Pagination/index.ts +6 -0
- package/assets/components/ProgressBar/ProgressBar.module.css +64 -0
- package/assets/components/ProgressBar/ProgressBar.tsx +54 -0
- package/assets/components/ProgressBar/index.ts +2 -0
- package/assets/components/QuotationBar/QuotationBar.module.css +61 -0
- package/assets/components/QuotationBar/QuotationBar.tsx +48 -0
- package/assets/components/QuotationBar/index.ts +2 -0
- package/assets/components/Radio/Radio.module.css +63 -0
- package/assets/components/Radio/Radio.tsx +33 -0
- package/assets/components/Radio/index.ts +2 -0
- package/assets/components/Select/Select.module.css +151 -0
- package/assets/components/Select/Select.tsx +425 -0
- package/assets/components/Select/index.ts +10 -0
- package/assets/components/SelectableCard/SelectableCard.module.css +177 -0
- package/assets/components/SelectableCard/SelectableCard.tsx +83 -0
- package/assets/components/SelectableCard/index.ts +2 -0
- package/assets/components/Shortcut/Shortcut.module.css +56 -0
- package/assets/components/Shortcut/Shortcut.tsx +156 -0
- package/assets/components/Shortcut/index.ts +2 -0
- package/assets/components/Sidebar/Sidebar.module.css +242 -0
- package/assets/components/Sidebar/Sidebar.tsx +264 -0
- package/assets/components/Sidebar/index.ts +7 -0
- package/assets/components/SidebarSplit/SidebarSplit.module.css +126 -0
- package/assets/components/SidebarSplit/SidebarSplit.tsx +222 -0
- package/assets/components/SidebarSplit/index.ts +6 -0
- package/assets/components/Slider/Slider.module.css +120 -0
- package/assets/components/Slider/Slider.tsx +88 -0
- package/assets/components/Slider/index.ts +2 -0
- package/assets/components/SplitButton/SplitButton.module.css +190 -0
- package/assets/components/SplitButton/SplitButton.tsx +145 -0
- package/assets/components/SplitButton/index.ts +6 -0
- package/assets/components/Stepper/Stepper.module.css +182 -0
- package/assets/components/Stepper/Stepper.tsx +185 -0
- package/assets/components/Stepper/index.ts +2 -0
- package/assets/components/Switch/Switch.module.css +116 -0
- package/assets/components/Switch/Switch.tsx +58 -0
- package/assets/components/Switch/index.ts +2 -0
- package/assets/components/TableCell/TableCell.module.css +137 -0
- package/assets/components/TableCell/TableCellAvatar.tsx +42 -0
- package/assets/components/TableCell/TableCellBadge.tsx +23 -0
- package/assets/components/TableCell/TableCellIcon.tsx +39 -0
- package/assets/components/TableCell/TableCellImage.tsx +49 -0
- package/assets/components/TableCell/TableCellLink.tsx +33 -0
- package/assets/components/TableCell/TableCellMeter.tsx +55 -0
- package/assets/components/TableCell/TableCellNumber.tsx +43 -0
- package/assets/components/TableCell/TableCellText.tsx +30 -0
- package/assets/components/TableCell/index.ts +23 -0
- package/assets/components/TableHeader/TableHeader.module.css +287 -0
- package/assets/components/TableHeader/TableHeader.tsx +590 -0
- package/assets/components/TableHeader/index.ts +9 -0
- package/assets/components/TableRow/TableRow.module.css +290 -0
- package/assets/components/TableRow/TableRow.tsx +253 -0
- package/assets/components/TableRow/index.ts +8 -0
- package/assets/components/TableRowEdit/TableRowEdit.module.css +126 -0
- package/assets/components/TableRowEdit/TableRowEdit.tsx +247 -0
- package/assets/components/TableRowEdit/index.ts +2 -0
- package/assets/components/TableRowSelect/TableRowSelect.module.css +23 -0
- package/assets/components/TableRowSelect/TableRowSelect.tsx +175 -0
- package/assets/components/TableRowSelect/index.ts +2 -0
- package/assets/components/Tabs/Tabs.module.css +234 -0
- package/assets/components/Tabs/Tabs.tsx +426 -0
- package/assets/components/Tabs/index.ts +9 -0
- package/assets/components/Textarea/Textarea.module.css +318 -0
- package/assets/components/Textarea/Textarea.tsx +426 -0
- package/assets/components/Textarea/index.ts +7 -0
- package/assets/components/ThemeController.tsx +271 -0
- package/assets/components/TimePicker/TimePicker.module.css +317 -0
- package/assets/components/TimePicker/TimePicker.tsx +821 -0
- package/assets/components/TimePicker/index.ts +8 -0
- package/assets/components/TimePicker/utils.ts +115 -0
- package/assets/components/Toast/Toast.module.css +264 -0
- package/assets/components/Toast/Toast.tsx +243 -0
- package/assets/components/Toast/index.ts +15 -0
- package/assets/components/Toolbar/Toolbar.module.css +72 -0
- package/assets/components/Toolbar/Toolbar.tsx +75 -0
- package/assets/components/Toolbar/index.ts +2 -0
- package/assets/components/Tooltip/Tooltip.module.css +42 -0
- package/assets/components/Tooltip/Tooltip.tsx +332 -0
- package/assets/components/Tooltip/index.ts +2 -0
- package/assets/components/Topbar/Topbar.module.css +26 -0
- package/assets/components/Topbar/Topbar.tsx +47 -0
- package/assets/components/Topbar/index.ts +2 -0
- package/assets/components/_cn.ts +3 -0
- package/assets/components/_color.ts +48 -0
- package/assets/components/_data.ts +659 -0
- package/assets/components/_utils.css +19 -0
- package/assets/components/axisOptions.ts +24 -0
- package/assets/components/tokens.css +742 -0
- package/assets/prompts/GUIDE.md +251 -0
- package/assets/prompts/OVERRIDE.md +170 -0
- package/assets/prompts/PRINCIPLES.md +130 -0
- package/assets/prompts/axes/density.md +38 -0
- package/assets/prompts/axes/font.md +36 -0
- package/assets/prompts/axes/hue.md +36 -0
- package/assets/prompts/axes/icon.md +48 -0
- package/assets/prompts/axes/mode.md +50 -0
- package/assets/prompts/axes/motion.md +77 -0
- package/assets/prompts/axes/palette.md +35 -0
- package/assets/prompts/axes/shape.md +33 -0
- package/assets/prompts/axes/voice.md +54 -0
- package/assets/prompts/components/README.md +84 -0
- package/assets/prompts/components/app-frame.md +94 -0
- package/assets/prompts/components/attachment-chip.md +46 -0
- package/assets/prompts/components/attachment-thumb.md +49 -0
- package/assets/prompts/components/avatar.md +86 -0
- package/assets/prompts/components/badge.md +104 -0
- package/assets/prompts/components/breadcrumb.md +77 -0
- package/assets/prompts/components/button.md +99 -0
- package/assets/prompts/components/callout.md +81 -0
- package/assets/prompts/components/chat-input.md +84 -0
- package/assets/prompts/components/checkbox.md +46 -0
- package/assets/prompts/components/chip.md +84 -0
- package/assets/prompts/components/choice-card.md +127 -0
- package/assets/prompts/components/context-menu.md +145 -0
- package/assets/prompts/components/date-picker.md +104 -0
- package/assets/prompts/components/drawer.md +152 -0
- package/assets/prompts/components/empty-state.md +69 -0
- package/assets/prompts/components/file-icon.md +73 -0
- package/assets/prompts/components/filter-button.md +42 -0
- package/assets/prompts/components/form-field.md +74 -0
- package/assets/prompts/components/gallery-item.md +158 -0
- package/assets/prompts/components/icon-button.md +82 -0
- package/assets/prompts/components/icon.md +68 -0
- package/assets/prompts/components/input.md +95 -0
- package/assets/prompts/components/list-item.md +235 -0
- package/assets/prompts/components/menu-item.md +234 -0
- package/assets/prompts/components/metric-card.md +132 -0
- package/assets/prompts/components/modal.md +131 -0
- package/assets/prompts/components/pagination.md +92 -0
- package/assets/prompts/components/progress-bar.md +61 -0
- package/assets/prompts/components/quotation-bar.md +39 -0
- package/assets/prompts/components/radio.md +41 -0
- package/assets/prompts/components/select.md +104 -0
- package/assets/prompts/components/selectable-card.md +67 -0
- package/assets/prompts/components/shortcut.md +76 -0
- package/assets/prompts/components/sidebar.md +107 -0
- package/assets/prompts/components/slider.md +89 -0
- package/assets/prompts/components/split-button.md +71 -0
- package/assets/prompts/components/stepper.md +93 -0
- package/assets/prompts/components/switch.md +86 -0
- package/assets/prompts/components/table-cell.md +87 -0
- package/assets/prompts/components/table-header.md +157 -0
- package/assets/prompts/components/table-row-edit.md +129 -0
- package/assets/prompts/components/table-row-select.md +82 -0
- package/assets/prompts/components/table-row.md +156 -0
- package/assets/prompts/components/tabs.md +122 -0
- package/assets/prompts/components/textarea.md +105 -0
- package/assets/prompts/components/toast.md +149 -0
- package/assets/prompts/components/tooltip.md +71 -0
- package/assets/prompts/components/topbar.md +148 -0
- package/assets/prompts/primitives/emerge.md +43 -0
- package/assets/prompts/primitives/fade.md +31 -0
- package/assets/prompts/primitives/scale.md +32 -0
- package/assets/prompts/primitives/scroll.md +75 -0
- package/assets/prompts/primitives/slide.md +31 -0
- package/assets/prompts/themes/_SCHEMA.md +135 -0
- package/assets/prompts/themes/_TEMPLATE.md +73 -0
- package/assets/prompts/themes/expressive.md +118 -0
- package/assets/prompts/themes/pure.md +87 -0
- package/assets/prompts/themes/spare.md +73 -0
- package/assets/prompts/tokens/breakpoint.md +29 -0
- package/assets/prompts/tokens/color.md +78 -0
- package/assets/prompts/tokens/radius.md +33 -0
- package/assets/prompts/tokens/shadow.md +35 -0
- package/assets/prompts/tokens/spacing.md +86 -0
- package/assets/prompts/tokens/typography.md +76 -0
- package/assets/prompts/tokens/z-index.md +35 -0
- package/assets/public/expressive.png +0 -0
- package/assets/public/pure.png +0 -0
- package/assets/public/spare.png +0 -0
- package/assets/skill/SKILL.md +36 -0
- package/bin/ctds.js +76 -0
- package/package.json +35 -4
- package/src/commands/init.js +215 -0
- package/src/commands/update.js +275 -0
- package/src/utils/assets.js +78 -0
- package/src/utils/deps.js +51 -0
- package/src/utils/detect.js +47 -0
- package/src/utils/diff.js +52 -0
- package/src/utils/hash.js +16 -0
- package/src/utils/log.js +41 -0
- package/src/utils/meta.js +73 -0
- package/src/utils/prompt.js +28 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# slide
|
|
2
|
+
|
|
3
|
+
### 원칙
|
|
4
|
+
공간 이동(translate). 이동 거리는 `--motion-distance-scale`이 축 값에 따라 스왑.
|
|
5
|
+
Drawer·Toast·Sheet 등 화면 가장자리에서 들어오는 요소.
|
|
6
|
+
|
|
7
|
+
### Do
|
|
8
|
+
- 뷰포트 가장자리에서 들어오는 큰 오버레이(Drawer, Sheet, Toast).
|
|
9
|
+
- 방향은 요소의 논리적 위치와 일치. 하단 Toast → `slide-up`, 상단 배너 → `slide-down`.
|
|
10
|
+
|
|
11
|
+
### Don't
|
|
12
|
+
- 앵커(트리거 요소) 기반 등장에는 slide만 쓰지 않는다 (`emerge` 사용).
|
|
13
|
+
|
|
14
|
+
### Fallback
|
|
15
|
+
방향 애매하면 `slide-up`.
|
|
16
|
+
|
|
17
|
+
### 관련
|
|
18
|
+
- [[axes/motion]] — duration과 이동 거리를 스왑
|
|
19
|
+
- [[primitives/emerge]] — 앵커 기반 등장은 이쪽
|
|
20
|
+
|
|
21
|
+
### 축별 스왑
|
|
22
|
+
| data-motion | 파라미터 |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `bouncy` | duration 400ms · distance 1.3× |
|
|
25
|
+
| `standard` | duration 200ms · distance 1× |
|
|
26
|
+
| `calm` | duration 100ms · distance 0.7× |
|
|
27
|
+
| `none` | 즉시 (이동 없음) |
|
|
28
|
+
|
|
29
|
+
### 겹침 규칙
|
|
30
|
+
- `fade`와 조합 필수.
|
|
31
|
+
- `emerge-*`와는 대체 관계. 뷰포트 기반이면 slide, 앵커 기반이면 emerge.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Theme Schema
|
|
2
|
+
|
|
3
|
+
Theme 레이어 자체의 규칙. 개별 Theme 문서는 이 스키마를 따른다.
|
|
4
|
+
[[PRINCIPLES]] · [[GUIDE]]의 전제를 모두 이어받는다.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 원칙
|
|
9
|
+
Theme은 **6개 축의 preset 묶음 + 축 밖 산문 레이어**다. "룩의 뼈대"를 담고, 색은 담지 않는다.
|
|
10
|
+
|
|
11
|
+
- Theme이 묶는 축 6개: **Mode / Shape / Density / Font / Icon / Motion**
|
|
12
|
+
- Theme에서 빠지는 축 3개: **Palette / Hue / Voice**
|
|
13
|
+
→ 같은 Theme에 다른 Palette·Hue를 자유롭게 입힌다. editorial Theme에 cream도 slate도 pink도 성립.
|
|
14
|
+
→ Voice는 Theme과 독립 — editorial Theme에 `casual`도, mechanical Theme에 `formal`도 성립.
|
|
15
|
+
- Theme이 담는 축 밖 레이어는 **산문·네거티브 선언만**. 토큰화하지 않는다.
|
|
16
|
+
|
|
17
|
+
### Do
|
|
18
|
+
- Theme 하나 = 파일 하나. 파일명은 `<theme-slug>.md` (kebab-case).
|
|
19
|
+
- 축 6개 preset을 모두 선언한다 (하나라도 빠지면 Theme이 아니다).
|
|
20
|
+
- 모든 preset에 **왜 1문장** 붙인다.
|
|
21
|
+
- 산문 레이어 4섹션(Layout / Imagery / Decoration / Negative)은 **값이 없으면 "N/A"**로 명시. 섹션 자체를 생략하지 않는다.
|
|
22
|
+
- Signature 1문장은 "이 Theme IS ___" 공식으로 쓴다 (ANALYSIS §3 수사 장치 참고).
|
|
23
|
+
|
|
24
|
+
### Don't
|
|
25
|
+
- 색을 Theme에 담지 않는다. `color: #...`, `palette: warm-cream` 등 모두 금지. 색은 Palette/Hue 축이 담는다.
|
|
26
|
+
- 레이아웃·간격·radius·duration **수치를 Theme에 쓰지 않는다**. 수치는 축/토큰이 담는다. Theme은 "선호"만.
|
|
27
|
+
- 커스텀 토큰·CSS 변수를 Theme에서 새로 정의하지 않는다. Theme은 기존 토큰 선택기일 뿐.
|
|
28
|
+
- override 상한을 걸지 않는다. **override는 전부 자유, 책임은 사용자**(공주 결정).
|
|
29
|
+
|
|
30
|
+
### Fallback
|
|
31
|
+
축 6개 중 preset 선택이 애매하면 각 축의 기본값([[axes/mode]] 등 참고)으로 둔다. 그래도 애매하면 사용자에게 확인.
|
|
32
|
+
|
|
33
|
+
### 관련
|
|
34
|
+
- [[GUIDE]] — Theme도 공통 골격 §2를 따른다. 아래 "Theme 전용 추가 항목"이 §3의 축/토큰/컴포넌트/프리미티브 다음 다섯 번째 타입.
|
|
35
|
+
- [[themes/_TEMPLATE]] — 복사해서 쓰는 Theme skeleton.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Theme 전용 추가 항목 (공통 골격 §2 뒤)
|
|
40
|
+
|
|
41
|
+
Theme 문서는 공통 골격 5섹션(원칙/Do/Don't/Fallback/관련) 뒤에 아래 4블록을 **이 순서로** 붙인다.
|
|
42
|
+
|
|
43
|
+
### 1. Signature
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
### Signature
|
|
47
|
+
이 Theme IS ___. <비교 수사 1문장: "not X, but Y because Z" 공식 권장>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- 1~2문장. ANALYSIS §3의 "editorial pacing", "software-craft documentation" 류 어휘.
|
|
51
|
+
- "경쟁 레퍼런스 공간 안에서의 좌표"를 심는다. 예: "not a bright SaaS marketing page, but a long-form reading column."
|
|
52
|
+
|
|
53
|
+
### 2. Preset table (축 6개)
|
|
54
|
+
|
|
55
|
+
```markdown
|
|
56
|
+
### Preset
|
|
57
|
+
|
|
58
|
+
| Axis | Value | Why |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| [[axes/mode]] | `<값>` | <한 줄 이유> |
|
|
61
|
+
| [[axes/shape]] | `<값>` | <한 줄 이유> |
|
|
62
|
+
| [[axes/density]] | `<값>` | <한 줄 이유> |
|
|
63
|
+
| [[axes/font]] | `<값>` | <한 줄 이유> |
|
|
64
|
+
| [[axes/icon]] | `<값>` | <한 줄 이유> |
|
|
65
|
+
| [[axes/motion]] | `<값>` | <한 줄 이유> |
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- 6행 전부 채운다. 빈 셀 금지.
|
|
69
|
+
- `Value`는 각 축 문서에 선언된 값만 쓴다. 새 값을 Theme에서 발명하지 않는다.
|
|
70
|
+
- Voice는 Theme 묶음 바깥 축이므로 Preset table에 포함하지 않는다 ([[axes/voice]] 참고).
|
|
71
|
+
|
|
72
|
+
### 3. 축 밖 레이어 (산문 4섹션)
|
|
73
|
+
|
|
74
|
+
각 섹션은 **수치 없이 선호·태도만**. 수치는 Density/Shape 축에 양보.
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
### Layout
|
|
78
|
+
<1~3문장. column 수 선호, section 호흡, 1-column 중심인지 그리드 중심인지. 수치 금지.>
|
|
79
|
+
또는 N/A
|
|
80
|
+
|
|
81
|
+
### Imagery
|
|
82
|
+
<1~3문장. 사진 / 3D / 플랫 일러스트 / 아이코노그래피 / 없음. 소스·톤 가이드.>
|
|
83
|
+
또는 N/A
|
|
84
|
+
|
|
85
|
+
### Decoration
|
|
86
|
+
<1~3문장. mesh gradient / grid lines / 노이즈 / 없음.>
|
|
87
|
+
또는 N/A
|
|
88
|
+
|
|
89
|
+
### Negative
|
|
90
|
+
- <"no X" 선언 1>
|
|
91
|
+
- <"no X" 선언 2>
|
|
92
|
+
- <최소 3개, 최대 5개 권장>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- Negative는 **최소 3개**. ANALYSIS §3 "네거티브 선언이 포지티브만큼 정체성을 만든다" 원칙.
|
|
96
|
+
- Negative 각 항목은 "경쟁 default가 뭔지 전제한 반대 선언" 공식을 권장. 예: "no uppercase (SaaS marketing default)".
|
|
97
|
+
|
|
98
|
+
### 4. Override 정책 + Known Gaps + Iteration Guide
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
### Override
|
|
102
|
+
전부 자유. 사용자가 "이 Theme에서 Shape만 soft로"처럼 지시하면 그대로 적용. 책임은 사용자.
|
|
103
|
+
Theme 선언을 벗어난 조합의 완성도는 보증하지 않는다 ([[PRINCIPLES]] §7).
|
|
104
|
+
|
|
105
|
+
### Known Gaps
|
|
106
|
+
- <이 Theme이 터치하지 않는 것 1>
|
|
107
|
+
- <이 Theme이 터치하지 않는 것 2>
|
|
108
|
+
|
|
109
|
+
### Iteration Guide
|
|
110
|
+
1. <이 Theme을 수정·확장할 때 지켜야 할 규칙 1>
|
|
111
|
+
2. <규칙 2>
|
|
112
|
+
3. <규칙 3>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
- Known Gaps: ANALYSIS §1 "환각 봉쇄" 공식. "animation 시퀀스는 Motion 축에 양보", "Voice는 축 바깥 — Theme이 추천하지 않음" 식.
|
|
116
|
+
- Iteration Guide: 다음 LLM/작성자에게 주는 유지보수 문법. 명령형. ANALYSIS §4.5.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 보이스
|
|
121
|
+
Linear "software-craft documentation" 톤 (ANALYSIS §4.7). 짧은 문장 + 토큰 레퍼런스 + 비교 수사.
|
|
122
|
+
한국어로 쓰되 축/토큰/preset 식별자는 영어 유지.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 셀프 체크리스트
|
|
127
|
+
- [ ] 공통 골격 5섹션(원칙/Do/Don't/Fallback/관련) 모두 있는가
|
|
128
|
+
- [ ] Signature에 "IS ___" 공식 + 비교 수사가 있는가
|
|
129
|
+
- [ ] Preset 표 6행이 모두 채워져 있는가
|
|
130
|
+
- [ ] Preset 표의 Value가 각 축 문서에 선언된 값과 일치하는가
|
|
131
|
+
- [ ] 산문 4섹션(Layout/Imagery/Decoration/Negative)이 모두 있는가 (없으면 N/A)
|
|
132
|
+
- [ ] Negative가 최소 3개 있는가
|
|
133
|
+
- [ ] Known Gaps · Iteration Guide가 있는가
|
|
134
|
+
- [ ] 색(hex/palette)·수치(px/ms)를 Theme 안에 쓰지 않았는가
|
|
135
|
+
- [ ] [[PRINCIPLES]] §6 하드코딩 금지 전부 준수
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# <Theme Name>
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
새 Theme을 만들 때 이 파일을 복사하고 파일명을 `<theme-slug>.md`로 바꿔 쓴다.
|
|
5
|
+
스키마·보이스·셀프 체크리스트는 [[themes/_SCHEMA]] 참고.
|
|
6
|
+
HTML 주석은 작성 완료 후 지운다.
|
|
7
|
+
-->
|
|
8
|
+
|
|
9
|
+
### 원칙
|
|
10
|
+
<이 Theme이 왜 존재하는가. 1~2줄. 어떤 사용 맥락에서 쓰이도록 설계되었는가.>
|
|
11
|
+
|
|
12
|
+
### Do
|
|
13
|
+
- <이 Theme을 쓸 때의 명령형 규칙 1>
|
|
14
|
+
- <규칙 2>
|
|
15
|
+
- <규칙 3>
|
|
16
|
+
|
|
17
|
+
### Don't
|
|
18
|
+
- <이 Theme을 쓸 때 하드 리젝 사유 1>
|
|
19
|
+
- <사유 2>
|
|
20
|
+
|
|
21
|
+
### Fallback
|
|
22
|
+
<축 preset이 애매할 때의 기본 처리. 보통 "각 축의 기본값으로 두거나 사용자에게 확인".>
|
|
23
|
+
|
|
24
|
+
### 관련
|
|
25
|
+
- [[themes/_SCHEMA]] — Theme 스키마
|
|
26
|
+
- [[axes/palette]] · [[axes/hue]] — 이 Theme 바깥. 색은 조합 시점에 결정.
|
|
27
|
+
- [[presets/<관련-preset>]] — <어떤 관련인지 한 줄> (없으면 삭제)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### Signature
|
|
32
|
+
이 Theme IS ___. <비교 수사 1문장. "not X, but Y because Z" 권장.>
|
|
33
|
+
|
|
34
|
+
### Preset
|
|
35
|
+
|
|
36
|
+
| Axis | Value | Why |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| [[axes/mode]] | `<값>` | <한 줄 이유> |
|
|
39
|
+
| [[axes/shape]] | `<값>` | <한 줄 이유> |
|
|
40
|
+
| [[axes/density]] | `<값>` | <한 줄 이유> |
|
|
41
|
+
| [[axes/font]] | `<값>` | <한 줄 이유> |
|
|
42
|
+
| [[axes/icon]] | `<값>` | <한 줄 이유> |
|
|
43
|
+
| [[axes/motion]] | `<값>` | <한 줄 이유> |
|
|
44
|
+
|
|
45
|
+
### Layout
|
|
46
|
+
<1~3문장. column 수 선호, section 호흡, 1-column 중심인지 그리드 중심인지. 수치 금지.>
|
|
47
|
+
또는 N/A
|
|
48
|
+
|
|
49
|
+
### Imagery
|
|
50
|
+
<1~3문장. 사진 / 3D / 플랫 일러스트 / 아이코노그래피 / 없음. 소스·톤 가이드.>
|
|
51
|
+
또는 N/A
|
|
52
|
+
|
|
53
|
+
### Decoration
|
|
54
|
+
<1~3문장. mesh gradient / grid lines / 노이즈 / 없음.>
|
|
55
|
+
또는 N/A
|
|
56
|
+
|
|
57
|
+
### Negative
|
|
58
|
+
- <"no X" 선언 — 경쟁 default 전제 1>
|
|
59
|
+
- <선언 2>
|
|
60
|
+
- <선언 3>
|
|
61
|
+
|
|
62
|
+
### Override
|
|
63
|
+
전부 자유. 사용자가 "이 Theme에서 Shape만 soft로"처럼 지시하면 그대로 적용. 책임은 사용자.
|
|
64
|
+
Theme 선언을 벗어난 조합의 완성도는 보증하지 않는다 ([[PRINCIPLES]] §7).
|
|
65
|
+
|
|
66
|
+
### Known Gaps
|
|
67
|
+
- <이 Theme이 터치하지 않는 것 1>
|
|
68
|
+
- <이 Theme이 터치하지 않는 것 2>
|
|
69
|
+
|
|
70
|
+
### Iteration Guide
|
|
71
|
+
1. <이 Theme을 수정·확장할 때 지켜야 할 규칙 1>
|
|
72
|
+
2. <규칙 2>
|
|
73
|
+
3. <규칙 3>
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Expressive
|
|
2
|
+
|
|
3
|
+
### 원칙
|
|
4
|
+
Apple Reminders·Linear Mobile·Things·Notion Calendar가 공유하는 "**중립 바탕 + 소수의 accent 자리 + hue 안에서 묶은 2-톤**" Theme. 통통 튀는 느낌은 pastel을 "많이 깔아서"가 아니라, **대부분 중립인 캔버스 위에 꼭 필요한 2~3자리에만 pastel field가 찍히고, 그 pastel 안에 같은 hue의 진한 ink가 포인트로 눌러주는** 구조에서 온다. 색은 **의미 있는 자리에만** 쓰여야 "강조"가 되고, pastel과 ink가 **같은 hue**로 묶여야 "조화"가 된다. 리마인더·태스크·커뮤니티·모바일 생산성 앱의 자리.
|
|
5
|
+
|
|
6
|
+
### Do
|
|
7
|
+
- 전체 캔버스·대부분의 카드/필드는 **중립**으로 둔다 (`--bg` 또는 `--bg-subtle`). pastel은 자동 default가 아니다.
|
|
8
|
+
- 캔버스 중립은 **가능한 가장 옅은 톤**(흰색 또는 `--bg-subtle`)으로. "회색이 섞인" 바탕은 그 자체로 배경 색이 되어 accent의 자리를 뺏는다 — 바탕이 조용해야 pastel 포인트가 돋보임.
|
|
9
|
+
- accent 자리는 "지금 가장 중요한 하나"에만 — 가장 급한 KPI 하나, 선택된 카드 하나, 플로팅 CTA 하나. 한 화면에 **총 2~3개**.
|
|
10
|
+
- ink point(원형 배지·pill·강조 라벨)는 **tint의 짝 fg**를 쓴다. pink field엔 wine ink, blue field엔 deep-blue ink. **블랙 ink 금지**.
|
|
11
|
+
- ink badge를 중립 자리에도 넣으려면 **ghost 모드**(배경 투명, 아이콘만 `--fg-muted`)로. solid wine은 accent 자리에만.
|
|
12
|
+
- 소문자 bold 제목 + 소문자 regular 본문의 weight 대비는 유지한다 — "통통 튀는데 정돈된"의 축.
|
|
13
|
+
|
|
14
|
+
### Don't
|
|
15
|
+
- 모든 카드/섹션을 pastel로 깔지 않는다. 전부 색이면 무지개가 되고 "강조" 축이 사라진다. **중립이 바탕, pastel은 포인트**.
|
|
16
|
+
- 캔버스·중립 카드 배경에 **진한 중성톤**(짙은 회색, `--bg-muted`보다 어두운 톤)을 쓰지 않는다. 바탕이 "색"으로 지각되는 순간 accent pastel이 묻힌다. 중립은 **거의 흰색**이어야 한다.
|
|
17
|
+
- pastel field 위에 **블랙/다크그레이 ink**를 올리지 않는다 — 두 hue가 어긋나서 "회색 + 핑크" 같은 추한 조합으로 떨어진다. ink는 **같은 hue의 진한 명도**여야 한다.
|
|
18
|
+
- 모든 카드마다 ink 원형 배지를 똑같이 박지 않는다. 배지 자체가 과한 신호 — 중립 자리는 ghost 또는 생략, accent 자리에만 solid.
|
|
19
|
+
- "통통 튀게" 하려고 큰 글자를 남발하지 않는다. **한 화면의 "가장 큰 글자"는 하나** — hero head 하나, 또는 KPI value 하나. 나머지는 조용해야 그 하나가 묵직해진다.
|
|
20
|
+
- `tracking-tight`·`tracking-wide` 같은 트래킹을 모든 타이포에 바르지 않는다. 큰 묵직한 자리(hero head, 큰 숫자)에만 `tracking-tight`. 나머지는 default.
|
|
21
|
+
- 데이터 테이블·엔터프라이즈 설정·금융 거래 화면에는 쓰지 않는다. 이 Theme의 "경쾌함"이 신뢰를 깎는 자리.
|
|
22
|
+
|
|
23
|
+
### Fallback
|
|
24
|
+
축 preset은 아래 표 값으로 고정. override는 자유지만 Negative에 걸린 조합이면 한 번 확인한다.
|
|
25
|
+
pastel을 어디에 쓸지 고민되면 **중립이 default**. "지금 이 카드가 가장 중요한가?"라는 질문에 Yes가 아니면 중립.
|
|
26
|
+
|
|
27
|
+
### 관련
|
|
28
|
+
- [[themes/_SCHEMA]] — Theme 스키마
|
|
29
|
+
- [[themes/spare]] — 반대축. spare는 "격자 안에서만 움직임", expressive는 "격자 위에 소수 accent 자리".
|
|
30
|
+
- [[themes/pure]] — 다른 축. pure는 "가두는 장치 없이 흐름", expressive는 "중립 바탕 + accent 자리".
|
|
31
|
+
- [[components/topbar]] — hero head·환영 메시지를 Topbar에 끼우지 않는 공식. expressive의 hero는 body 첫 블록.
|
|
32
|
+
- [[components/sidebar]] · [[components/app-frame]] — Sidebar top padding = Topbar top padding으로 좌·우 상단 baseline 정렬.
|
|
33
|
+
- [[axes/palette]] `pastel` · [[axes/shape]] `soft` · [[axes/motion]] `bouncy` — 이 Theme의 세 토대 축. 조합이 깨지면 Theme의 지문도 깨진다.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### Signature
|
|
38
|
+
이 Theme IS **중립 바탕에 소수의 accent field + 같은 hue의 ink로 묶는** Theme. Notion Calendar·Apple Reminders가 공유하는 "chrome 자체의 리듬" 공식의 한 분파이되, 그 리듬이 **"모든 카드가 pastel"이 아니라 "거의 다 중립인데 1~2자리만 pastel"**로 작동한다는 좌표. 통통 튀면서도 유치하지 않은 이유는 — **중립이 대부분을 받치고, pastel이 "강조" 자리에만 등장하고, pastel 안의 ink는 같은 hue의 진한 명도로 조화되고, 소문자 bold 제목이 두 톤을 묶기** 때문. 색은 **의미**로 쓰이고, 큰 글자는 **하나**이고, 리듬은 **절제**로 만들어진다.
|
|
39
|
+
|
|
40
|
+
### Preset
|
|
41
|
+
|
|
42
|
+
| Axis | Value | Why |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| [[axes/mode]] | `light` | 중립 캔버스 + pastel accent + 짙은 ink 대비가 성립하려면 밝은 canvas가 전제. dark에선 중립=딥 중성, pastel→딥 틴티드로 재해석되지만 기본은 light. |
|
|
45
|
+
| [[axes/shape]] | `soft` | 큰 radius·원형 아이콘 배지·pill 버튼이 이 Theme의 "통통 튀는" 촉감 세트. crisp는 격자 신호가 되어 pastel accent의 "분위기 깔림"이 안 나옴. |
|
|
46
|
+
| [[axes/density]] | `default` | 중립 카드가 숨 쉴 공간은 필요하되, comfortable은 모바일/생산성 앱의 밀도를 깨고 compact은 카드가 서로 뭉개짐. 중앙값이 맞음. |
|
|
47
|
+
| [[axes/font]] | `lang=ko` | 한국어 기본. 폰트 스택은 Font 축에 양보. 다만 "소문자 bold 제목"은 Theme 지문이라 Font 축과 무관하게 강제. |
|
|
48
|
+
| [[axes/icon]] | `phosphor` · `regular` | 기본 regular, 활성·선택만 `fill`. ink 원형 배지 안에서 아이콘은 반전되어 조용히 받친다. |
|
|
49
|
+
| [[axes/motion]] | `bouncy` | spring easing + 400ms. accent field가 등장하고 ink가 눌러주는 리듬과 짝. standard는 밋밋하고 calm은 "통통"을 죽인다. |
|
|
50
|
+
|
|
51
|
+
### Layout
|
|
52
|
+
중립이 대부분을 받치고, pastel이 "가장 중요한 자리"에만 찍히는 레이아웃. 2열 카드 그리드·수직 스크롤 섹션·칸반 보드가 자연스러운 자리. **섹션 head**는 body의 첫 블록에서 큰 소문자로 한 번만 — hero head를 Topbar에 끼우지 않는다 (hero를 끼우려는 순간 `align-items: flex-start` 수습이 필요해지는 신호, [[components/topbar]] 참고).
|
|
53
|
+
|
|
54
|
+
**여백 위계 — 4단계 리듬:**
|
|
55
|
+
- **섹션↔섹션** (큼): 가장 넉넉하게. 섹션끼리 "다른 블록"으로 보이게.
|
|
56
|
+
- **섹션 head ↔ 콘텐츠** (중): head가 콘텐츠에 "속해있다"고 느껴지는 거리.
|
|
57
|
+
- **카드끼리** (작): 그리드 간격. 숨은 쉬지만 "같은 블록"으로.
|
|
58
|
+
- **카드 안 요소** (아주 작): label↔value, badge↔body. 요소끼리 "같은 정보"로 묶임.
|
|
59
|
+
|
|
60
|
+
flat한 간격(섹션·카드·내부 전부 같은 수치)이면 Theme이 지루해진다. 네 단계가 눈에 보여야 "읽히는 리듬".
|
|
61
|
+
|
|
62
|
+
**상단 baseline 정렬:**
|
|
63
|
+
Sidebar top padding = Topbar top padding으로 맞춘다 ([[components/app-frame]] 조립 공식). 좌·우 상단이 한 줄에 서야 shell이 깔끔.
|
|
64
|
+
|
|
65
|
+
### Imagery
|
|
66
|
+
사진·앨범 아트가 **없어도 성립하는** Theme. accent field 자체가 "이미지 자리"를 대신하고, ink 원형 배지가 포인트가 된다. 실제 이미지가 들어올 때는 **아바타(원형)·썸네일(소형 중립 카드)** 형태로 chrome 리듬에 녹인다 — 전면 hero 이미지는 이 Theme의 자리가 아님.
|
|
67
|
+
|
|
68
|
+
### Decoration
|
|
69
|
+
- **Neutral base**: 캔버스·대부분의 카드/필드는 중립 (`--bg` 또는 `--bg-subtle`). pastel이 default가 아님. **중립은 "거의 흰색"에서 멈춤** — 짙은 회색 바탕은 그 자체가 색이 되어 accent를 묻히게 함.
|
|
70
|
+
- **Accent field**: 지금 가장 중요한 1~3자리에만 pastel 면 — 가장 급한 KPI, 선택된 카드, 플로팅 CTA. hairline 생략 (색 자체가 분리).
|
|
71
|
+
- **Hue-matched ink**: pastel field 안의 ink는 **같은 hue의 진한 명도** (pink → wine, blue → deep-navy). 블랙 ink 절대 금지.
|
|
72
|
+
- **Ink badge (2단계)**:
|
|
73
|
+
- 중립 자리: **ghost** — 배경 투명, 아이콘만 `--fg-muted`. 또는 아예 생략.
|
|
74
|
+
- accent 자리: **solid** — pastel 위에 같은 hue 진한 명도의 원형 배지. 이 자리의 포인트.
|
|
75
|
+
- **Lowercase + weight 대비**: 제목은 소문자 bold/semibold, 본문은 소문자 regular. 두 weight의 대비가 색 대비와 짝.
|
|
76
|
+
- **큰 글자 한 자리**: 한 화면의 "가장 큰 글자"는 하나 — hero head 또는 그 섹션의 중심 KPI value. 나머지는 조용해야 그 하나가 묵직.
|
|
77
|
+
- mesh gradient·노이즈·장식 라인·배경 패턴 쓰지 않는다. 리듬은 중립/accent · ink · 소문자 · 여백 위계 네 축으로만.
|
|
78
|
+
|
|
79
|
+
### Negative
|
|
80
|
+
- no photo-first hero (Airbnb·Spotify 공식의 default — 이 Theme은 콘텐츠 없이도 chrome이 성격을 만듦)
|
|
81
|
+
- no all-pastel surface (키즈·게임 UI의 default — 모든 카드가 pastel이면 무지개가 되어 "강조" 축이 사라짐. 중립이 바탕, pastel은 포인트)
|
|
82
|
+
- no heavy neutral background (SaaS 대시보드의 default — 짙은 회색 캔버스/카드 바탕은 그 자체가 "색"으로 지각되어 accent pastel을 묻힘. 중립은 `--bg` 또는 `--bg-subtle`에서 멈춤)
|
|
83
|
+
- no black ink on pastel field (잘못된 2-톤 default — pastel + 블랙/다크그레이는 hue가 어긋나서 추해짐. ink는 같은 hue 진한 명도)
|
|
84
|
+
- no high-saturation tint (키즈·게임 UI의 default — tint는 반드시 pastel 라인에서만)
|
|
85
|
+
- no ink badge on every card (장식 과잉의 default — 모든 카드에 solid 배지를 박으면 포인트가 소음이 됨. 중립 자리는 ghost 또는 생략)
|
|
86
|
+
- no multiple accent fields side-by-side without reason (화면 전체가 accent로 가득 차는 default — accent는 한 화면에 2~3곳이 상한)
|
|
87
|
+
- no oversized typography everywhere (브랜드 랜딩의 default — 모든 title을 크게 하면 "가장 중요한 하나"가 사라짐. 큰 글자는 한 화면에 하나)
|
|
88
|
+
- no tracking-tight on every heading (타이포 과장의 default — tracking은 묵직한 자리 1~2곳만. 나머지는 default)
|
|
89
|
+
- no hero head inside Topbar ([[components/topbar]] 위반 default — hero는 body 첫 블록. Topbar에 끼우면 `align-items` 전쟁)
|
|
90
|
+
- no sidebar/topbar baseline mismatch ([[components/app-frame]] 위반 default — Sidebar top padding = Topbar top padding)
|
|
91
|
+
- no deep elevation shadow (skeuomorphism의 default — pastel field 자체가 색으로 분리하므로 shadow 불필요)
|
|
92
|
+
- no card nesting (앱 UI의 default — accent 카드가 중립 카드를 품지 않음)
|
|
93
|
+
- no uppercase titles (브랜드 랜딩의 default — 제목까지 소문자 bold가 이 Theme의 지문. UPPERCASE + wide tracking은 "정돈된" 좌표를 "격식 있는" 좌표로 끌어내려서 Theme이 깨짐)
|
|
94
|
+
|
|
95
|
+
### Override
|
|
96
|
+
전부 자유. 사용자가 "이 Theme에서 mode만 dark로" 또는 "palette만 standard로"처럼 지시하면 그대로 적용. 책임은 사용자. 다만 `shape≠soft` · `motion≠bouncy` · `palette≠pastel` 셋 중 하나라도 어기면 이 Theme의 지문(중립 바탕 + accent 포인트 + hue 조화) 중 하나가 깨짐 — 그때는 [[themes/spare]] 또는 [[themes/pure]]로 좌표를 옮기는 쪽이 솔직하다.
|
|
97
|
+
Theme 선언을 벗어난 조합의 완성도는 보증하지 않는다 ([[PRINCIPLES]] §7).
|
|
98
|
+
|
|
99
|
+
### Known Gaps
|
|
100
|
+
- Voice는 Theme 바깥 축이라 이 Theme이 추천하지 않는다. 캐주얼 톤이든 포멀 톤이든 어떤 Voice와도 결합 가능 ([[axes/voice]] 참고).
|
|
101
|
+
- "pastel 패밀리"의 구체적 hue 세트(lavender/mint/peach/sky/sand 등)는 Palette·Hue 축이 담는다. 이 Theme은 "같은 명도 라인에 묶인 pastel + 짝 fg를 ink로 쓴다"는 전략만.
|
|
102
|
+
- 어느 hue를 accent로 쓸지(pink/blue/mint 등)는 조합 시점에 결정. 이 Theme은 "accent는 하나로 통일, ink는 그 hue의 짝 fg"라는 공식만.
|
|
103
|
+
- 소문자 bold의 weight·tracking·size는 Font 축이 담는다. 이 Theme은 "큰 글자는 한 자리, 트래킹은 묵직한 자리만, 소문자 + weight 대비"라는 태도만.
|
|
104
|
+
- 여백 위계의 구체적 수치는 Spacing·Density 축이 담는다. 이 Theme은 "4단계 리듬이 눈에 보여야 한다"는 원칙만.
|
|
105
|
+
- 모션의 spring 수치·bounce 양은 Motion 축이 담는다. 이 Theme은 `bouncy` preset 선택만.
|
|
106
|
+
|
|
107
|
+
### Iteration Guide
|
|
108
|
+
1. 축 preset을 바꿀 때 반드시 "왜" 1문장을 새로 쓴다. 기존 Why를 그대로 둔 채 Value만 바꾸지 않는다.
|
|
109
|
+
2. Negative에서 "no X"를 추가·삭제할 때는 "X가 어떤 카테고리의 default인지"를 괄호로 명시한다. 좌표 없는 금지는 금지가 아니다.
|
|
110
|
+
3. Layout·Imagery·Decoration 어느 섹션에도 수치를 넣지 않는다. "중립이 대부분, pastel은 소수" OK, "pastel 면 20%" 금지.
|
|
111
|
+
4. Signature를 수정할 때 "IS ___" 공식과 비교 수사(not X, but Y)를 유지한다.
|
|
112
|
+
5. 이 Theme에 Palette·Hue를 선언하지 않는다. 색은 조합 시점에만 결정. 단, "중립 바탕 + 단일 hue accent + 같은 hue 짝 ink"라는 전략은 Palette와 무관하게 Theme 안에 남는다.
|
|
113
|
+
6. 중립/accent · ink · 소문자 · 여백 위계 네 지문 중 어느 하나라도 Decoration·Negative 두 섹션에서 반복 강화되지 않으면 Theme이 맹탕이 된다. 네 지문의 일관성을 Iteration마다 재확인한다.
|
|
114
|
+
7. 성격 어휘(playful / cute / radical)를 더 바르지 않는다. 이 Theme의 성격은 "절제된 대비 리듬" — "귀여움"으로 해석되면 좌표가 깨진 신호.
|
|
115
|
+
8. "통통 튄다"의 반대는 "정돈된다"가 아니라 "유치해진다". 이 Theme은 통통 튀면서 **정돈된다** — 중립 바탕·소수 accent·hue 조화·큰 글자 하나가 "정돈" 쪽을 책임지므로, 하나라도 빠지면 유치 쪽으로 추락.
|
|
116
|
+
9. "accent를 어디에 쓸까"가 고민되면 **그 자리가 유저에게 지금 가장 중요한가?**를 묻는다. Yes 하나만 pastel, 나머지는 전부 중립. 색은 **의미**로 쓰여야 지문이 된다.
|
|
117
|
+
10. "큰 글자를 어디에 쓸까"도 같은 공식. 한 화면의 "가장 큰 글자"는 하나. 모든 title이 크면 지문이 아니라 소음.
|
|
118
|
+
11. "배경 색을 어디까지 줄까"가 고민되면 **더 옅은 쪽**. 캔버스·중립 카드가 "색"으로 보이기 시작하는 순간 accent의 자리가 사라진다. 중립은 흰색에 가까워야 pastel 포인트가 산다.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Pure
|
|
2
|
+
|
|
3
|
+
### 원칙
|
|
4
|
+
Stripe·Framer·Linear 랜딩이 공유하는 "경계 장치 없이 매끄럽게 흐르는" Theme. border·divider·card·drop shadow 같은 **요소를 가두는 장치**를 걷어내고, 대신 톤 차이·여백·타이포·hairline으로 흐름을 만든다. 요소 수를 줄이는 게 아니라, **요소를 가두지 않는다**. 세련됨은 덜어내서가 아니라 **공들여 매끄럽게 마감**해서 생긴다 — "장치 대신 비례"가 이 Theme의 공식.
|
|
5
|
+
|
|
6
|
+
### Do
|
|
7
|
+
- 콘텐츠는 필요한 만큼 담되, 요소를 **박스·선·그림자로 가두지 않는다**. 사이드바도 테이블도 폼도 "가두는 장치 없이" 구성한다.
|
|
8
|
+
- 분리가 필요한 자리는 **톤 차이·여백·hairline** 셋 중 하나로 해결한다. 셋 다 제어가 섬세해야 pure의 세련됨이 나온다.
|
|
9
|
+
- 모든 요소를 **공들여 마감**한다 — 간격·정렬·타이포 리듬·톤 대비 전부 과하게 다듬어야 "덜 가두는데도 완성도 있어 보인다".
|
|
10
|
+
- 사진 같은 평면성을 노린다. 입체감(그림자·광택·중첩 깊이)이 아니라 **표면의 균질함**으로 세련됨을 만든다.
|
|
11
|
+
|
|
12
|
+
### Don't
|
|
13
|
+
- "허전해 보여서" border·divider·card·drop shadow를 추가하지 않는다. 가두는 장치를 다시 들이는 순간 pure의 좌표가 깨진다.
|
|
14
|
+
- card·container를 중첩하지 않는다. frame이 frame을 품는 구조는 pure의 반대 — 정보 그룹은 여백·톤으로 묶는다.
|
|
15
|
+
- "덜 가둠"을 "덜 담음"으로 오해하지 않는다. 필요한 콘텐츠·보조 설명·메타 정보는 다 담되, 담는 방식만 바꾼다.
|
|
16
|
+
- 거친 마감으로 넘어가지 않는다. 가두는 장치가 없을수록 **정렬·간격·타이포 리듬이 과하게 정교해야** 완성도가 보인다.
|
|
17
|
+
|
|
18
|
+
### Fallback
|
|
19
|
+
축 preset은 아래 표 값으로 고정. override는 자유지만 Negative에 걸린 조합이면 한 번 확인한다.
|
|
20
|
+
|
|
21
|
+
### 관련
|
|
22
|
+
- [[themes/_SCHEMA]] — Theme 스키마
|
|
23
|
+
- [[themes/spare]] — 비슷해 보이지만 다른 좌표. spare는 "격자가 뼈대로 드러남", pure는 "격자조차 가두는 장치로 안 씀".
|
|
24
|
+
- [[themes/expressive]] — 반대축. expressive는 "콘텐츠가 chrome을 밀어냄", pure는 "chrome 자체가 녹아 사라짐".
|
|
25
|
+
- [[axes/palette]] · [[axes/hue]] · [[axes/voice]] — Theme 바깥.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### Signature
|
|
30
|
+
이 Theme IS **경계 장치 없이 매끄럽게 흐르는** Theme. 미니멀리즘의 "덜 꾸밈"이 아니라, Stripe·Framer·Linear 랜딩이 공유하는 **"장치 대신 비례"** — border·divider·card·drop shadow 같은 **요소를 가두는 장치**를 쓰지 않고, 톤 차이·여백·hairline·타이포 리듬만으로 흐름을 만든다. 세련됨은 **덜어내서**가 아니라 **공들여 매끄럽게 마감해서** 생긴다. 사진 같은 평면성과 과하게 정교한 비례가 지문. 모든 자리(랜딩·앱·테이블·설정)에 쓸 수 있다 — 어느 자리든 "가두지 말고 흐르게 짜라, 그리고 과하게 공들여 마감하라"는 지시로 작동한다.
|
|
31
|
+
|
|
32
|
+
### Preset
|
|
33
|
+
|
|
34
|
+
| Axis | Value | Why |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| [[axes/mode]] | `light` | Stripe·Framer 랜딩의 "white canvas" 패턴. canvas 자체가 조용해야 가두는 장치 없이도 요소가 떠오름. dark override는 가능하지만 톤 차이로 분리하는 설계가 더 까다로워짐. |
|
|
37
|
+
| [[axes/shape]] | `soft` | radius가 있어야 "박스로 가둔 느낌" 없이 요소가 부드럽게 자리잡음. crisp은 모서리 자체가 격자 신호가 되어 pure의 "장치 없음"과 어긋남. |
|
|
38
|
+
| [[axes/density]] | `comfortable` | 가두는 장치가 없으므로 각 요소의 호흡 공간이 분리 장치 역할. default는 간격이 좁아 요소끼리 뭉쳐 보이고, 톤·여백만으로 분리가 어려워짐. |
|
|
39
|
+
| [[axes/font]] | `lang=ko` | 한국어 기본. 폰트 스택은 Font 축에 양보. |
|
|
40
|
+
| [[axes/icon]] | `phosphor` · `regular` | regular weight가 타이포와 톤이 맞음. bold·fill은 아이콘이 따로 떠올라 매끄러운 흐름을 깸. |
|
|
41
|
+
| [[axes/motion]] | `calm` | 100ms linear. 조용히 녹아들 듯 등장하는 톤. bouncy는 요소가 튀어나와 pure의 평면성과 충돌. |
|
|
42
|
+
|
|
43
|
+
### Layout
|
|
44
|
+
균질한 호흡으로 흐르는 레이아웃. 1열·그리드·사이드바 전부 쓸 수 있지만, 각 요소를 card·border로 가두지 않는다. 사이드바는 배경 톤 교대 또는 hairline으로, 그리드 셀은 여백으로, 섹션은 상하 호흡으로 분리한다. 간격·정렬이 과하게 정교해야 "가두지 않았는데도 구조가 보인다".
|
|
45
|
+
|
|
46
|
+
**조립 규범 — 자리별 default 컴포넌트:**
|
|
47
|
+
- 리스트 자리(피드·활동·알림·오늘 할 일·일정·팀 상태 등) → **[[components/list-item]]** 로 통일. 사람·시간·대상·메타의 anatomy가 공유되고, pure 좌표에선 hairline 분리로 리스트를 만든다. 수제 `<div>` 리스트 금지 — anatomy가 리스트마다 어긋나 pure의 "과하게 공들여 마감"이 깨진다.
|
|
48
|
+
- 숫자 정렬·금액·대기일 등 **셀 폭·정렬·tabular-nums가 중요한 자리** → **[[components/table-header]] + [[components/table-row]]** 조합. variant는 `line`(pure default) — hairline 하나로 분리. plate(라운드 chrome)는 pure 좌표 바깥.
|
|
49
|
+
- 지표 strip(KPI 4개 등) → **[[components/metric-card]]** `variant="bare"` + 부모 strip이 상단 hairline + 수직 hairline으로 분리.
|
|
50
|
+
- 어느 자리든 "수제 조립 vs 컴포넌트 조립"이 애매하면 **컴포넌트 조립** 쪽. 그래야 자리마다 간격·정렬·톤이 어긋나지 않는다.
|
|
51
|
+
|
|
52
|
+
**리스트 조립 — hairline + wrapper 공식:**
|
|
53
|
+
hairline 리스트에서 콘텐츠가 선에 **딱 붙는 건 pure 좌표에서 치명적**이다 (Negative 참고). 부모 li가 세로 padding을 반드시 책임지고, self-space 공식을 가진 컴포넌트(ListItem 등)는 자식 선택자로 중화한다. 공식 상세는 [[components/list-item]] "조립 — 부모 wrapper 공식".
|
|
54
|
+
|
|
55
|
+
### Imagery
|
|
56
|
+
이미지는 캔버스에 **매끄럽게 녹아들도록** 배치한다. 거친 crop·강한 그림자·테두리로 가두지 않고, 자연스러운 여백 안에 놓거나 배경 톤에 섞는다. 사진·일러스트·gradient 전부 쓸 수 있지만 "가두는 frame" 없이 — Framer의 포스터 패턴, Stripe의 mesh gradient 패턴처럼 **경계가 흐려지는** 방식.
|
|
57
|
+
|
|
58
|
+
### Decoration
|
|
59
|
+
border·divider·card·drop shadow는 거의 쓰지 않는다 — 이것들이 "가두는 장치". 대신 **톤 차이·여백·hairline·gradient·배경 색면**은 자유롭게, 그러나 과하게 공들여 쓴다. hairline 한 줄도 색·굵기·위치가 섬세해야 pure의 세련됨이 나온다. 입체감(강한 shadow·광택·중첩 깊이) 대신 **표면의 균질함**과 **섬세한 톤 레이어링**으로 완성도를 만든다.
|
|
60
|
+
|
|
61
|
+
### Negative
|
|
62
|
+
- no card nesting·border nesting (앱 UI의 default — frame이 frame을 품지 않음)
|
|
63
|
+
- no drop shadow for elevation (SaaS card의 default — 그림자로 띄우지 않고 톤·여백으로 분리)
|
|
64
|
+
- no divider line between list items (설정·메뉴의 default — 리스트는 여백·톤으로 분리)
|
|
65
|
+
- no bordered input·bordered button as default (폼의 default — 입력·버튼은 톤 차이·배경 색면으로 성립)
|
|
66
|
+
- no gradient background **반복** (AI·fintech 랜딩의 default — gradient는 자유지만 섹션마다 깔지 않음, 과잉은 매끄러움을 깸)
|
|
67
|
+
- no sloppy spacing·misaligned baseline (pure의 치명적 default — 가두는 장치가 없으므로 거친 마감은 바로 "대충 비워둔 느낌"으로 보임)
|
|
68
|
+
- no content touching hairline·border·cell edge (pure의 치명적 default — 텍스트·Avatar·Icon이 선/테두리에 padding 없이 붙으면 "덜 가둠"이 아니라 "대충 비움"으로 추락. 모든 리스트 아이템·카드 셀·테이블 셀에서 완성 후 눈으로 체크)
|
|
69
|
+
- no mono in body (technical voice는 pure 자리가 아님)
|
|
70
|
+
|
|
71
|
+
### Override
|
|
72
|
+
전부 자유. 사용자가 "이 Theme에서 mode만 dark로"(Framer 패턴) 또는 "shape만 crisp로"(Stripe 편집 톤)처럼 지시하면 그대로 적용. 책임은 사용자.
|
|
73
|
+
Theme 선언을 벗어난 조합의 완성도는 보증하지 않는다 ([[PRINCIPLES]] §7).
|
|
74
|
+
|
|
75
|
+
### Known Gaps
|
|
76
|
+
- Voice는 Theme 바깥 축이라 이 Theme이 추천하지 않는다. editorial 톤이든 포스터 톤이든 어떤 Voice와도 결합 가능 ([[axes/voice]] 참고).
|
|
77
|
+
- 타이포 리듬의 수치(weight·tracking·size·line-height)는 Font 축이 담는다. 이 Theme은 "타이포 리듬이 과하게 정교해야 한다"는 태도만 담음.
|
|
78
|
+
- 톤 차이·hairline·gradient의 색·채도는 Palette/Hue가 담는다. 이 Theme은 "가두는 장치 대신 톤을 쓴다"는 원칙만.
|
|
79
|
+
- 호흡·여백의 수치는 Density 축이 담는다. 이 Theme은 "균질한 호흡"이라는 선호만.
|
|
80
|
+
|
|
81
|
+
### Iteration Guide
|
|
82
|
+
1. 축 preset을 바꿀 때 반드시 "왜" 1문장을 새로 쓴다. 기존 Why를 그대로 둔 채 Value만 바꾸지 않는다.
|
|
83
|
+
2. Negative에서 "no X"를 추가·삭제할 때는 "X가 어떤 카테고리의 default인지"를 괄호로 명시한다. 좌표 없는 금지는 금지가 아니다.
|
|
84
|
+
3. Layout·Imagery·Decoration 어느 섹션에도 수치를 넣지 않는다. "균질한 호흡" OK, "160px 간격" 금지.
|
|
85
|
+
4. Signature를 수정할 때 "IS ___" 공식과 비교 수사(not X, but Y)를 유지한다.
|
|
86
|
+
5. 이 Theme에 Palette·Hue를 선언하지 않는다. 색은 조합 시점에만 결정.
|
|
87
|
+
6. "덜 가둠 ≠ 덜 담음"을 Do·Don't·Decoration·Negative 네 섹션에서 반복적으로 강화한다. 한 곳이라도 "요소를 줄여라" 톤이 섞이면 pure가 다시 "대충 비운 느낌"으로 흐른다.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Spare
|
|
2
|
+
|
|
3
|
+
### 원칙
|
|
4
|
+
Vercel / Supabase / Raycast / Linear가 공유하는 "엔지니어드된 자제"를 뼈대로 삼는 Theme. "꾸미지 않음"이 디폴트가 아니라 **"규칙 격자를 먼저 정하고 그 안에서만 움직임"**이 디폴트다. 앱·대시보드·설정·문서·커맨드 UI 등 "매일 쓰는 도구" 전반의 기준이 된다.
|
|
5
|
+
|
|
6
|
+
### Do
|
|
7
|
+
- UI chrome은 전부 축 값 그대로 상속한다. 특정 섹션만 다른 Shape/Motion으로 튀게 하지 않는다.
|
|
8
|
+
- Palette/Hue만 바꾸면 브랜드별 변주가 자연스럽게 성립해야 한다 — 뼈대는 색에 의존하지 않는다.
|
|
9
|
+
- accent는 한 페이지에 한 지점에서만 터뜨린다 (primary CTA 또는 상태 이벤트 하나).
|
|
10
|
+
|
|
11
|
+
### Don't
|
|
12
|
+
- 전환형 랜딩·게임·엔터테인먼트의 자리에 억지로 쓰지 않는다. 자극·대비·그라디언트가 없어 전환이 안 터진다.
|
|
13
|
+
- 성격을 색·장식으로 보강하려 들지 않는다. 성격이 더 필요하면 Theme 자체를 바꾼다.
|
|
14
|
+
- "비어 보여서" 요소를 추가하지 않는다. 비어 보이는 게 이 Theme의 피드백이다.
|
|
15
|
+
|
|
16
|
+
### Fallback
|
|
17
|
+
축 preset은 아래 표 값으로 고정. override는 자유지만 Negative에 걸린 조합이면 한 번 확인한다.
|
|
18
|
+
|
|
19
|
+
### 관련
|
|
20
|
+
- [[themes/_SCHEMA]] — Theme 스키마
|
|
21
|
+
- [[axes/palette]] · [[axes/hue]] — Theme 바깥. 어떤 색이든 이 뼈대 위에 올라감.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Signature
|
|
26
|
+
이 Theme IS "격자부터 정한 뒤 그 격자 안에서만 움직이는" UI. 미니멀리즘의 수동적 비움이 아니라, Vercel·Supabase·Raycast·Linear가 공유하는 **엔지니어드된 자제** — 왜냐하면 매일 쓰는 도구는 "무엇을 넣느냐"가 아니라 "무엇을 들이지 않느냐"로 신뢰를 번다.
|
|
27
|
+
|
|
28
|
+
### Preset
|
|
29
|
+
|
|
30
|
+
| Axis | Value | Why |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| [[axes/mode]] | `light` | 제품 UI 기본. dark override는 열려 있고, 이 Theme의 뼈대는 두 mode 모두에서 동일하게 성립. |
|
|
33
|
+
| [[axes/shape]] | `standard` | 콘솔 톤을 유지하되 crisp처럼 날카롭지 않은 중립 모서리. soft는 캐주얼, crisp는 과하게 engineered. |
|
|
34
|
+
| [[axes/density]] | `default` | compact은 데이터 테이블·관리자 전용, comfortable은 터치·콘텐츠. 매일 쓰는 도구의 중앙값. |
|
|
35
|
+
| [[axes/font]] | `lang=ko` | 한국어 기본. 실제 폰트 스택은 Font 축이 담당. |
|
|
36
|
+
| [[axes/icon]] | `phosphor` · `regular` | 얇은 outline이 UI 호흡을 끊지 않음. 활성 상태만 `fill`로 전환. |
|
|
37
|
+
| [[axes/motion]] | `calm` | 100ms linear. 반복 사용 시 bouncy는 피곤. 피드백은 있되 과장 없음. |
|
|
38
|
+
|
|
39
|
+
### Layout
|
|
40
|
+
특별한 선호 없음. 1열·2열·그리드 전부 성립. 사이드바·상단 네비·멀티 컬럼 모두 이 Theme에 맞음 — Theme이 레이아웃을 강요하지 않는 게 디폴트의 성격. 섹션 간 호흡은 Density에 양보.
|
|
41
|
+
|
|
42
|
+
### Imagery
|
|
43
|
+
UI 안에 사진·3D·일러스트가 **반드시 들어와야 할 자리에만** 쓴다. 장식용 이미지는 쓰지 않는다. 이 Theme의 자연스러운 "이미지"는 제품 스크린샷·다이어그램·코드블록 — Raycast·Supabase의 공통 패턴.
|
|
44
|
+
|
|
45
|
+
### Decoration
|
|
46
|
+
없음. mesh gradient·노이즈·장식 라인·배경 패턴 전부 쓰지 않는다. elevation은 **표면 색의 사다리**(canvas → surface → surface-elevated)와 hairline border로만 만든다 — 그림자로 띄우지 않는다.
|
|
47
|
+
|
|
48
|
+
### Negative
|
|
49
|
+
- no heavy display weight (브랜드 랜딩의 default — display weight는 500~600에서 멈춘다)
|
|
50
|
+
- no uppercase + wide tracking (브랜드 랜딩의 default — sentence case 강제)
|
|
51
|
+
- no mono in body (technical voice는 caption·code 자리에만, body에 섞지 않는다)
|
|
52
|
+
- no gradient background (AI·fintech 랜딩의 default)
|
|
53
|
+
- no hero illustration·3D object (SaaS 홈의 default)
|
|
54
|
+
- no decorative shadow·glow (게임·엔터 UI의 default — elevation은 표면 사다리만)
|
|
55
|
+
- no multi-accent — 한 페이지에 accent voltage는 한 지점에서만
|
|
56
|
+
|
|
57
|
+
### Override
|
|
58
|
+
전부 자유. 사용자가 "이 Theme에서 Shape만 soft로" 또는 "mode만 dark로"처럼 지시하면 그대로 적용. 책임은 사용자.
|
|
59
|
+
Theme 선언을 벗어난 조합의 완성도는 보증하지 않는다 ([[PRINCIPLES]] §7).
|
|
60
|
+
|
|
61
|
+
### Known Gaps
|
|
62
|
+
- Voice는 Theme 바깥 축이라 이 Theme이 추천하지 않는다. engineered 톤이든 캐주얼 톤이든 어떤 Voice와도 결합 가능 ([[axes/voice]] 참고).
|
|
63
|
+
- 신택스 하이라이트·차트·데이터 비주얼의 팔레트는 Palette 축이 담는다.
|
|
64
|
+
- "weight 상한 500~600" 같은 타이포 규칙은 Negative 선언으로만 남고, 수치 레벨 강제는 Font 축에 양보한다.
|
|
65
|
+
- 표면 색 사다리의 단계 수·명도 간격은 Palette 축이 담는다. 이 Theme은 "사다리로 depth를 만든다"는 규칙만 담음.
|
|
66
|
+
|
|
67
|
+
### Iteration Guide
|
|
68
|
+
1. 축 preset을 바꿀 때 반드시 "왜" 1문장을 새로 쓴다. 기존 Why를 그대로 둔 채 Value만 바꾸지 않는다.
|
|
69
|
+
2. Negative에서 "no X"를 추가·삭제할 때는 "X가 어떤 카테고리의 default인지"를 괄호로 명시한다. 좌표 없는 금지는 금지가 아니다.
|
|
70
|
+
3. Layout·Imagery·Decoration 어느 섹션에도 수치를 넣지 않는다. "넉넉한 호흡" OK, "80px 간격" 금지.
|
|
71
|
+
4. Signature를 수정할 때 "IS ___" 공식과 비교 수사(not X, but Y)를 유지한다.
|
|
72
|
+
5. 이 Theme에 Palette·Hue를 선언하지 않는다. 색은 조합 시점에만 결정.
|
|
73
|
+
6. 성격 어휘(editorial / playful / radical)를 더 바르지 않는다. 이 Theme의 성격은 "격자부터 정한 뒤 그 안에서만 움직임" — 그 외는 다른 Theme의 자리.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Breakpoint
|
|
2
|
+
|
|
3
|
+
### 원칙
|
|
4
|
+
모바일 우선(min-width). Tailwind 표준 5단계.
|
|
5
|
+
|
|
6
|
+
### Do
|
|
7
|
+
- 기본 스타일은 모바일(sm 미만) 기준으로 짜고, 위 breakpoint에서 오버라이드.
|
|
8
|
+
- 페이지 좌우 여백은 sm에서 `space-6`, lg 이상에서 `space-8~12`.
|
|
9
|
+
- 사이드바 레이아웃은 lg 이상에서 노출, 이하는 Drawer로 대체.
|
|
10
|
+
|
|
11
|
+
### Don't
|
|
12
|
+
- max-width 기반 미디어쿼리 사용 금지 (min-width만).
|
|
13
|
+
- 임의 픽셀 값 미디어쿼리 금지 — 이름 있는 브레이크포인트만.
|
|
14
|
+
- 컴포넌트 내부에 fixed width 금지 — 컨테이너 크기에 반응.
|
|
15
|
+
|
|
16
|
+
### Fallback
|
|
17
|
+
반응형 설계가 애매하면 `md`를 데스크톱/모바일 갈림점으로 쓴다.
|
|
18
|
+
|
|
19
|
+
### 관련
|
|
20
|
+
N/A
|
|
21
|
+
|
|
22
|
+
### 토큰 표
|
|
23
|
+
| Token | 용도 |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `sm` | 큰 모바일 · 작은 태블릿 |
|
|
26
|
+
| `md` | 태블릿 · 데스크톱 갈림점 |
|
|
27
|
+
| `lg` | 작은 데스크톱 · 사이드바 노출 |
|
|
28
|
+
| `xl` | 표준 데스크톱 |
|
|
29
|
+
| `2xl` | 큰 데스크톱 · 와이드 |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Color
|
|
2
|
+
|
|
3
|
+
### 원칙
|
|
4
|
+
Semantic 이름으로 참조. 실제 색은 Hue × Palette × Mode 세 축의 조합이 결정.
|
|
5
|
+
컴포넌트가 "파란색" 같은 색상 자체를 지시하지 않고 "브랜드 강조" 같은 역할로 참조.
|
|
6
|
+
|
|
7
|
+
### Do
|
|
8
|
+
- **브랜드 색은 하나 — `--primary`**. 주 액션(CTA·submit·confirm)·링크·활성 상태·강조 전부 primary로. 브랜드 톤이 둘로 쪼개지지 않게.
|
|
9
|
+
- 텍스트 위계: 본문 `--fg`, 보조 `--fg-muted`, 메타·플레이스홀더 `--fg-subtle`.
|
|
10
|
+
- 표면 위계: 페이지 `--bg`, 카드/영역 `--bg-subtle`, 코드/hover `--bg-muted`.
|
|
11
|
+
- 상태 표시는 status 토큰: 성공 `--success`, 경고 `--warning`, 삭제·오류 `--destructive`, 정보 `--info`.
|
|
12
|
+
- Focus 표시는 `--ring`.
|
|
13
|
+
|
|
14
|
+
### Don't
|
|
15
|
+
- hex/rgb/oklch 리터럴 금지. 모든 색은 CSS 변수 경유.
|
|
16
|
+
- Status hue를 재정의하지 않는다 (성공은 항상 초록, 경고는 항상 주황).
|
|
17
|
+
- 밝은 배경에 흰 텍스트, 어두운 배경에 검은 텍스트 금지 — 항상 semantic pair 사용.
|
|
18
|
+
- **`--accent`를 쓰지 않는다** — CTDS는 Hue 축이 "한 프로젝트 = 한 hue"로 설계돼 primary 외의 별도 브랜드 색이 존재하지 않는다. 과거 `--accent` 참조는 `--primary`로 교체.
|
|
19
|
+
|
|
20
|
+
### Fallback
|
|
21
|
+
텍스트 `--fg`, 배경 `--bg`, 강조 `--primary`.
|
|
22
|
+
|
|
23
|
+
### 관련
|
|
24
|
+
- [[axes/palette]] · [[axes/hue]] · [[axes/mode]] — 실제 색상값 결정
|
|
25
|
+
- [[tokens/shadow]] — Shape 축이 color·shadow·border를 함께 결정하므로 짝으로 자주 참조
|
|
26
|
+
|
|
27
|
+
### 토큰 표
|
|
28
|
+
|
|
29
|
+
**표면**
|
|
30
|
+
| Token | 용도 |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `--bg` | 페이지 배경 |
|
|
33
|
+
| `--bg-subtle` | 카드·영역 배경 |
|
|
34
|
+
| `--bg-muted` | 코드 인라인·hover 배경 |
|
|
35
|
+
|
|
36
|
+
**텍스트**
|
|
37
|
+
| Token | 용도 |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `--fg` | 본문 |
|
|
40
|
+
| `--fg-muted` | 보조 텍스트 |
|
|
41
|
+
| `--fg-subtle` | 메타·플레이스홀더 |
|
|
42
|
+
|
|
43
|
+
**경계**
|
|
44
|
+
| Token | 용도 |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `--border` | 기본 경계 |
|
|
47
|
+
| `--border-strong` | 강조 경계 (crisp shape에서 두드러짐) |
|
|
48
|
+
|
|
49
|
+
**브랜드**
|
|
50
|
+
| Token | 용도 |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `--primary` | 브랜드 색 전부 — 주 액션·링크·활성·CTA. Mode에 따라 톤 반전 |
|
|
53
|
+
| `--primary-hover` | primary hover 상태 |
|
|
54
|
+
| `--primary-subtle` | primary의 매우 연한 배경 (soft 변형) |
|
|
55
|
+
| `--icon-color` | 아이콘 기본 색. Palette 축이 결정 (mono=fg-muted, standard/colorful=primary) |
|
|
56
|
+
| `--ring` | Focus 표시 |
|
|
57
|
+
|
|
58
|
+
> primary 위 텍스트는 자동 대비(`--bg`)로 처리. 별도 `--primary-fg` 토큰 없음.
|
|
59
|
+
|
|
60
|
+
**보조 (Secondary variant 전용 — Palette=colorful에서만 유의미)**
|
|
61
|
+
| Token | 용도 |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `--secondary-bg` · `--secondary-bg-hover` · `--secondary-fg` | Button `variant="secondary"` 등이 참조 |
|
|
64
|
+
|
|
65
|
+
**상태**
|
|
66
|
+
| Token | 용도 |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `--success` | 성공·완료 (항상 초록 계열) |
|
|
69
|
+
| `--warning` | 경고·주의 (항상 주황 계열) |
|
|
70
|
+
| `--destructive` | 삭제·오류 (항상 빨강 계열) |
|
|
71
|
+
| `--info` | 정보 안내 (항상 파랑 계열) |
|
|
72
|
+
|
|
73
|
+
**오버레이 · 인터랙션**
|
|
74
|
+
| Token | 용도 |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `--hover` | 반복 리스트·메뉴·탭·테이블 hover 공통. 라이트 검정 3%, 다크 흰색 3% 알파 오버레이 |
|
|
77
|
+
| `--tooltip-bg` | Tooltip 배경 (Mode 반전: light면 다크, dark면 라이트) |
|
|
78
|
+
| `--tooltip-fg` | Tooltip 텍스트 (Mode 반전) |
|