@simplysm/angular 14.1.20 → 14.2.1

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.
Files changed (185) hide show
  1. package/dist/controls/button/sd-additional-button.js +2 -2
  2. package/dist/controls/button/sd-anchor.d.ts.map +1 -1
  3. package/dist/controls/button/sd-anchor.js +3 -3
  4. package/dist/controls/button/sd-button.d.ts.map +1 -1
  5. package/dist/controls/button/sd-button.js +3 -3
  6. package/dist/controls/button/sd-modal-select-button.d.ts.map +1 -1
  7. package/dist/controls/button/sd-modal-select-button.js +2 -2
  8. package/dist/controls/checkbox/sd-checkbox.d.ts.map +1 -1
  9. package/dist/controls/checkbox/sd-checkbox.js +3 -3
  10. package/dist/controls/checkbox/sd-switch.d.ts.map +1 -1
  11. package/dist/controls/checkbox/sd-switch.js +3 -3
  12. package/dist/controls/collapse/sd-collapse-icon.d.ts +1 -1
  13. package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
  14. package/dist/controls/collapse/sd-collapse-icon.js +2 -2
  15. package/dist/controls/collapse/sd-collapse.d.ts +1 -1
  16. package/dist/controls/collapse/sd-collapse.d.ts.map +1 -1
  17. package/dist/controls/collapse/sd-collapse.js +2 -2
  18. package/dist/controls/dropdown/sd-dropdown-popup.d.ts.map +1 -1
  19. package/dist/controls/dropdown/sd-dropdown-popup.js +2 -2
  20. package/dist/controls/dropdown/sd-dropdown.js +1 -1
  21. package/dist/controls/gap/sd-gap.d.ts.map +1 -1
  22. package/dist/controls/gap/sd-gap.js +5 -7
  23. package/dist/controls/input/sd-date-range-picker.js +2 -2
  24. package/dist/controls/input/sd-numpad.d.ts.map +1 -1
  25. package/dist/controls/input/sd-numpad.js +7 -15
  26. package/dist/controls/input/sd-range.js +2 -2
  27. package/dist/controls/input/sd-textarea.js +4 -4
  28. package/dist/controls/input/sd-textfield.d.ts.map +1 -1
  29. package/dist/controls/input/sd-textfield.js +10 -10
  30. package/dist/controls/list/sd-list-item.js +43 -43
  31. package/dist/controls/list/sd-list.js +2 -2
  32. package/dist/controls/pagination/sd-pagination.d.ts.map +1 -1
  33. package/dist/controls/pagination/sd-pagination.js +7 -5
  34. package/dist/controls/select/sd-select-button.d.ts.map +1 -1
  35. package/dist/controls/select/sd-select-button.js +4 -4
  36. package/dist/controls/select/sd-select-item.d.ts.map +1 -1
  37. package/dist/controls/select/sd-select-item.js +3 -3
  38. package/dist/controls/select/sd-select.d.ts.map +1 -1
  39. package/dist/controls/select/sd-select.js +10 -19
  40. package/dist/controls/tab/sd-tab-item.js +2 -2
  41. package/dist/controls/tab/sd-tab.js +2 -2
  42. package/dist/core/busy/sd-busy-container.d.ts.map +1 -1
  43. package/dist/core/busy/sd-busy-container.js +3 -3
  44. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  45. package/dist/core/modal/sd-modal.js +3 -3
  46. package/dist/core/provideSdAngular.d.ts.map +1 -1
  47. package/dist/core/provideSdAngular.js +31 -10
  48. package/dist/core/ripple/setupRipple.js +2 -2
  49. package/dist/core/setupBgTheme.d.ts +0 -1
  50. package/dist/core/setupBgTheme.d.ts.map +1 -1
  51. package/dist/core/setupBgTheme.js +3 -4
  52. package/dist/core/show-effect/setupRevealOnShow.js +1 -1
  53. package/dist/core/toast/sd-toast-container.js +2 -2
  54. package/dist/core/toast/sd-toast.d.ts.map +1 -1
  55. package/dist/core/toast/sd-toast.js +3 -3
  56. package/dist/core/validation/setupInvalid.js +5 -5
  57. package/dist/data/crud/sd-base-container.d.ts.map +1 -1
  58. package/dist/data/crud/sd-base-container.js +50 -52
  59. package/dist/data/kanban/sd-kanban-board.js +2 -2
  60. package/dist/data/kanban/sd-kanban-lane.d.ts.map +1 -1
  61. package/dist/data/kanban/sd-kanban-lane.js +4 -4
  62. package/dist/data/kanban/sd-kanban.d.ts.map +1 -1
  63. package/dist/data/kanban/sd-kanban.js +4 -4
  64. package/dist/data/permission-table/sd-permission-table.d.ts.map +1 -1
  65. package/dist/data/permission-table/sd-permission-table.js +5 -17
  66. package/dist/data/shared-data/sd-shared-data-select-list.d.ts.map +1 -1
  67. package/dist/data/shared-data/sd-shared-data-select-list.js +5 -19
  68. package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
  69. package/dist/data/shared-data/sd-shared-data-select.js +8 -15
  70. package/dist/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
  71. package/dist/data/sheet/sd-sheet-config.modal.js +7 -9
  72. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  73. package/dist/data/sheet/sd-sheet.js +10 -12
  74. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  75. package/dist/data/sheet/useSheetCellStyling.js +1 -1
  76. package/dist/data/state-preset/sd-state-preset.js +5 -5
  77. package/dist/features/editor/sd-markdown-editor.d.ts.map +1 -1
  78. package/dist/features/editor/sd-markdown-editor.js +85 -34
  79. package/dist/features/editor/sd-tiptap-editor.d.ts.map +1 -1
  80. package/dist/features/editor/sd-tiptap-editor.js +192 -61
  81. package/dist/features/theme/sd-theme-provider.d.ts +18 -1
  82. package/dist/features/theme/sd-theme-provider.d.ts.map +1 -1
  83. package/dist/features/theme/sd-theme-provider.js +21 -4
  84. package/dist/features/theme/sd-theme-selector.d.ts.map +1 -1
  85. package/dist/features/theme/sd-theme-selector.js +50 -9
  86. package/dist/features/theme/wcag-contrast.d.ts +9 -0
  87. package/dist/features/theme/wcag-contrast.d.ts.map +1 -0
  88. package/dist/features/theme/wcag-contrast.js +83 -0
  89. package/dist/features/visual/sd-calendar.js +2 -2
  90. package/dist/features/visual/sd-label.d.ts.map +1 -1
  91. package/dist/features/visual/sd-label.js +5 -5
  92. package/dist/features/visual/sd-note.d.ts.map +1 -1
  93. package/dist/features/visual/sd-note.js +3 -3
  94. package/dist/features/visual/sd-progress.d.ts.map +1 -1
  95. package/dist/features/visual/sd-progress.js +3 -3
  96. package/dist/index.d.ts +12 -11
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +10 -9
  99. package/dist/layout/sidebar/sd-sidebar-container.d.ts.map +1 -1
  100. package/dist/layout/sidebar/sd-sidebar-container.js +11 -5
  101. package/dist/layout/sidebar/sd-sidebar-menu.d.ts.map +1 -1
  102. package/dist/layout/sidebar/sd-sidebar-menu.js +5 -17
  103. package/dist/layout/sidebar/sd-sidebar-user.js +32 -32
  104. package/dist/layout/sidebar/sd-sidebar.d.ts.map +1 -1
  105. package/dist/layout/sidebar/sd-sidebar.js +3 -3
  106. package/dist/layout/topbar/sd-topbar-menu.js +5 -5
  107. package/dist/layout/topbar/sd-topbar.d.ts.map +1 -1
  108. package/dist/layout/topbar/sd-topbar.js +5 -5
  109. package/package.json +5 -5
  110. package/scss/commons/_colors.scss +296 -242
  111. package/scss/commons/_density.scss +23 -0
  112. package/scss/commons/_mixins.scss +142 -129
  113. package/scss/commons/_styles.scss +78 -103
  114. package/scss/commons/_theme-variables.scss +16 -2
  115. package/scss/commons/_variables.scss +277 -149
  116. package/scss/controls/_card.scss +12 -8
  117. package/scss/controls/_form-box.scss +7 -7
  118. package/scss/controls/_form-table.scss +7 -7
  119. package/scss/controls/_table.scss +5 -5
  120. package/scss/sd-tokens.md +132 -0
  121. package/scss/styles.scss +3 -4
  122. package/scss/themes/_variables-blueprint.scss +127 -81
  123. package/scss/themes/_variables-ide-dark.scss +215 -0
  124. package/src/controls/button/sd-additional-button.ts +12 -12
  125. package/src/controls/button/sd-anchor.ts +7 -8
  126. package/src/controls/button/sd-button.ts +42 -44
  127. package/src/controls/button/sd-modal-select-button.ts +15 -19
  128. package/src/controls/checkbox/sd-checkbox.ts +55 -43
  129. package/src/controls/checkbox/sd-switch.ts +18 -19
  130. package/src/controls/collapse/sd-collapse-icon.ts +2 -2
  131. package/src/controls/collapse/sd-collapse.ts +2 -2
  132. package/src/controls/dropdown/sd-dropdown-popup.ts +10 -12
  133. package/src/controls/dropdown/sd-dropdown.ts +1 -1
  134. package/src/controls/gap/sd-gap.ts +11 -9
  135. package/src/controls/input/sd-date-range-picker.ts +1 -1
  136. package/src/controls/input/sd-numpad.ts +3 -11
  137. package/src/controls/input/sd-range.ts +1 -1
  138. package/src/controls/input/sd-textarea.ts +18 -18
  139. package/src/controls/input/sd-textfield.ts +39 -37
  140. package/src/controls/list/sd-list-item.ts +195 -195
  141. package/src/controls/list/sd-list.ts +8 -8
  142. package/src/controls/pagination/sd-pagination.ts +4 -2
  143. package/src/controls/select/sd-select-button.ts +6 -10
  144. package/src/controls/select/sd-select-item.ts +14 -15
  145. package/src/controls/select/sd-select.ts +34 -35
  146. package/src/controls/tab/sd-tab-item.ts +4 -4
  147. package/src/controls/tab/sd-tab.ts +2 -2
  148. package/src/core/busy/sd-busy-container.ts +17 -16
  149. package/src/core/modal/sd-modal.ts +38 -32
  150. package/src/core/provideSdAngular.ts +34 -10
  151. package/src/core/ripple/setupRipple.ts +2 -2
  152. package/src/core/setupBgTheme.ts +5 -14
  153. package/src/core/show-effect/setupRevealOnShow.ts +1 -1
  154. package/src/core/toast/sd-toast-container.ts +5 -5
  155. package/src/core/toast/sd-toast.ts +16 -17
  156. package/src/core/validation/setupInvalid.ts +5 -5
  157. package/src/data/crud/sd-base-container.ts +120 -122
  158. package/src/data/kanban/sd-kanban-board.ts +1 -1
  159. package/src/data/kanban/sd-kanban-lane.ts +9 -14
  160. package/src/data/kanban/sd-kanban.ts +9 -19
  161. package/src/data/permission-table/sd-permission-table.ts +12 -20
  162. package/src/data/shared-data/sd-shared-data-select-list.ts +5 -19
  163. package/src/data/shared-data/sd-shared-data-select.ts +11 -28
  164. package/src/data/sheet/sd-sheet-config.modal.ts +5 -7
  165. package/src/data/sheet/sd-sheet.ts +29 -28
  166. package/src/data/sheet/useSheetCellStyling.ts +12 -3
  167. package/src/data/state-preset/sd-state-preset.ts +16 -16
  168. package/src/features/editor/sd-markdown-editor.ts +110 -56
  169. package/src/features/editor/sd-tiptap-editor.ts +214 -81
  170. package/src/features/theme/sd-theme-provider.ts +28 -3
  171. package/src/features/theme/sd-theme-selector.ts +21 -2
  172. package/src/features/theme/wcag-contrast.ts +103 -0
  173. package/src/features/visual/sd-calendar.ts +8 -8
  174. package/src/features/visual/sd-label.ts +11 -12
  175. package/src/features/visual/sd-note.ts +10 -11
  176. package/src/features/visual/sd-progress.ts +9 -11
  177. package/src/index.ts +15 -40
  178. package/src/layout/sidebar/sd-sidebar-container.ts +21 -8
  179. package/src/layout/sidebar/sd-sidebar-menu.ts +15 -17
  180. package/src/layout/sidebar/sd-sidebar-user.ts +100 -100
  181. package/src/layout/sidebar/sd-sidebar.ts +7 -9
  182. package/src/layout/topbar/sd-topbar-menu.ts +3 -3
  183. package/src/layout/topbar/sd-topbar.ts +12 -14
  184. package/styles.css +1641 -2462
  185. package/scss/themes/_blueprint-surfaces.scss +0 -87
@@ -1,20 +1,34 @@
1
1
  @use "mixins";
2
2
  @use "variables";
3
3
  @use "colors";
4
+ @use "density";
4
5
  @use "../themes/variables-blueprint" as blueprint;
6
+ @use "../themes/variables-ide-dark" as ide-dark;
5
7
 
6
8
  @layer base, theme-variant, utilities;
7
9
 
8
10
  @layer base {
9
11
  :root {
10
12
  @include colors.vars;
11
- @include mixins.writeVars(variables.$vars, "");
13
+ @include mixins.writeVars(variables.$sd, "sd");
12
14
  }
13
15
  }
14
16
 
15
17
  @layer theme-variant {
18
+ // 테마 = --sd-* 역할 토큰 값 맵만(셀렉터 오버라이드 금지).
19
+
16
20
  // 블루프린트 — 트레이싱지(라이트 면)
17
21
  .sd-theme-blueprint {
18
- @include mixins.writeVars(blueprint.$paper, "");
22
+ @include mixins.writeVars(blueprint.$paper, "sd");
23
+ }
24
+
25
+ // IDE 다크 — VSCode Dark 2026 팔레트, Sarasa Fixed K
26
+ .sd-theme-ide-dark {
27
+ @include mixins.writeVars(ide-dark.$dark, "sd");
28
+ }
29
+
30
+ // 밀도 축(DEC-007) — 테마와 직교, 밀도 그룹(치수)만 덮음
31
+ .sd-density-compact {
32
+ @include mixins.writeVars(density.$compact, "sd");
19
33
  }
20
34
  }
@@ -4,174 +4,302 @@ $breakpoint-xxs: 800px;
4
4
  $breakpoint-xs: 1024px;
5
5
  $breakpoint-sm: 1280px;
6
6
 
7
- $vars: (
8
- theme: (
9
- // 중립색: 텍스트·보더 용도라 단계 밝은 스케일
10
- "gray": (
11
- lightest: var(--color-zinc-50),
12
- lighter: var(--color-zinc-100),
13
- light: var(--color-zinc-300),
14
- default: var(--color-zinc-400),
15
- dark: var(--color-zinc-500),
16
- darker: var(--color-zinc-600),
17
- darkest: var(--color-zinc-700),
7
+ // ---------------------------------------------------------------------------
8
+ // --sd-* 역할 토큰 카탈로그 — writeVars($sd, "sd") 로 :root 발행.
9
+ // 테마는 역할 토큰의 맵만으로 완성된다(셀렉터 오버라이드 금지).
10
+ //
11
+ // 규칙:
12
+ // - 어휘(DEC-013): 색 어휘는 --sd-{bg|tx|bd}-… 속성 우선. 유틸 클래스명 = 토큰명에서 --sd- 만 뗀 것.
13
+ // hover 변형은 -hover 접미. 비색상·컴포넌트 전용 그룹(팔레트·focus-ring·scrollbar·shadow·타이포·치수·z)은 그룹 구조 유지.
14
+ // - 체이닝 금지: var() 참조는 팔레트(--sd-color-*, 테마 불변)로만 허용.
15
+ // 테마·밀도가 덮는 토큰끼리의 체인은 재정의 스코프에서 하위가 안 따라오므로 리터럴로 푼다.
16
+ // - 색 원천: 팔레트 + 흰/검 알파(rgba white/black)만. 커스텀 rgb 리터럴 금지.
17
+ // - 라이트 기본값은 구 스케일 토큰과 시각 등가(값 불변·이름만 역할화).
18
+ // - 구 스케일 어휘(--theme-*·--trans-*·--text-trans-* 등)는 발행하지 않는다(14.2 에서 발행 종료·브레이킹).
19
+ // ---------------------------------------------------------------------------
20
+ // 시맨틱 키 목록 — 컴포넌트 theme 변형 @each 순회용 (토큰 아님)
21
+ $theme-keys: ("gray", blue-gray, primary, secondary, info, success, warning, danger);
22
+
23
+ $sd: (
24
+ // 배경(bg)
25
+ bg: (
26
+ // 표면 — 앱 배경(canvas)·컨트롤(control)·카드/모달(elevated)·드롭다운/팝업(overlay)·시트(sheet)·반전면(inverse)
27
+ canvas: var(--sd-color-zinc-50),
28
+ // 배경 패턴(블루프린트 모눈 등) — 값 맵으로 패턴까지 테마화. 소비측은 background 단축 금지.
29
+ canvas-image: none,
30
+ control: white,
31
+ elevated: white,
32
+ overlay: white,
33
+ sheet: var(--sd-color-zinc-50),
34
+ // 시트 컨테이너 배경 패턴(블루프린트 모눈 등) — canvas-image 와 별개 축(방침 1, 2026-07-16 확정)
35
+ sheet-image: none,
36
+ inverse: black,
37
+ // 필드(인풋류) 면 — 구 "--theme-secondary-lightest 필드 배경 관례" 해체
38
+ field: var(--sd-color-blue-50),
39
+ // 트랙 면(스위치 off 트랙 등 손잡이·채움 뒤의 궤도) — 준역할(2026-07-16 확정)
40
+ track: var(--sd-color-zinc-100),
41
+ // 시맨틱 면 — solid(짙은 면)·subtle(옅은 면), hover 변형 포함
42
+ "gray": (
43
+ solid: var(--sd-color-zinc-400),
44
+ solid-hover: var(--sd-color-zinc-500),
45
+ subtle: var(--sd-color-zinc-50),
46
+ subtle-hover: var(--sd-color-zinc-100),
47
+ ),
48
+ blue-gray: (
49
+ solid: var(--sd-color-slate-400),
50
+ solid-hover: var(--sd-color-slate-500),
51
+ subtle: var(--sd-color-slate-50),
52
+ subtle-hover: var(--sd-color-slate-100),
18
53
  ),
19
- blue-gray: (
20
- lightest: var(--color-slate-50),
21
- lighter: var(--color-slate-100),
22
- light: var(--color-slate-300),
23
- default: var(--color-slate-400),
24
- dark: var(--color-slate-500),
25
- darker: var(--color-slate-600),
26
- darkest: var(--color-slate-700),
27
- ),
28
- // 시맨틱 solid 색: 500 기준
29
- primary: (
30
- lightest: var(--color-blue-50),
31
- lighter: var(--color-blue-100),
32
- light: var(--color-blue-200),
33
- default: var(--color-blue-500),
34
- dark: var(--color-blue-600),
35
- darker: var(--color-blue-700),
36
- darkest: var(--color-blue-800),
54
+ primary: (
55
+ solid: var(--sd-color-blue-500),
56
+ solid-hover: var(--sd-color-blue-600),
57
+ subtle: var(--sd-color-blue-50),
58
+ subtle-hover: var(--sd-color-blue-100),
59
+ ),
60
+ secondary: (
61
+ solid: var(--sd-color-blue-500),
62
+ solid-hover: var(--sd-color-blue-600),
63
+ subtle: var(--sd-color-blue-50),
64
+ subtle-hover: var(--sd-color-blue-100),
65
+ ),
66
+ info: (
67
+ solid: var(--sd-color-cyan-500),
68
+ solid-hover: var(--sd-color-cyan-600),
69
+ subtle: var(--sd-color-cyan-50),
70
+ subtle-hover: var(--sd-color-cyan-100),
71
+ ),
72
+ success: (
73
+ solid: var(--sd-color-lime-500),
74
+ solid-hover: var(--sd-color-lime-600),
75
+ subtle: var(--sd-color-lime-50),
76
+ subtle-hover: var(--sd-color-lime-100),
77
+ ),
78
+ warning: (
79
+ solid: var(--sd-color-orange-500),
80
+ solid-hover: var(--sd-color-orange-600),
81
+ subtle: var(--sd-color-orange-50),
82
+ subtle-hover: var(--sd-color-orange-100),
37
83
  ),
38
- secondary: (
39
- lightest: var(--color-blue-50),
40
- lighter: var(--color-blue-100),
41
- light: var(--color-blue-200),
42
- default: var(--color-blue-500),
43
- dark: var(--color-blue-600),
44
- darker: var(--color-blue-700),
45
- darkest: var(--color-blue-800),
84
+ danger: (
85
+ solid: var(--sd-color-red-500),
86
+ solid-hover: var(--sd-color-red-600),
87
+ subtle: var(--sd-color-red-50),
88
+ subtle-hover: var(--sd-color-red-100),
89
+ ),
90
+ // 상태 오버레이(알파) — hover/active/selected 전 컨트롤 공통
91
+ state: (
92
+ hover: rgba(0, 0, 0, 0.05),
93
+ active: rgba(0, 0, 0, 0.1),
94
+ selected: rgba(0, 0, 0, 0.07),
95
+ ),
96
+ // 비활성 — 색 치환 단일 규약(opacity 방식 폐기)
97
+ disabled: var(--sd-color-zinc-100),
98
+ busy-overlay: rgba(255, 255, 255, 0.6),
99
+ // busy 로딩 인디케이터 그래픽 면(큐브 로더 등) — 준역할(2026-07-16 확정)
100
+ busy-indicator: rgba(0, 0, 0, 0.1),
101
+ // 모달 뒤 스크림(배경 어둡히기) — 준역할(2026-07-16 확정)
102
+ backdrop: rgba(0, 0, 0, 0.2)
46
103
  ),
47
- info: (
48
- lightest: var(--color-cyan-50),
49
- lighter: var(--color-cyan-100),
50
- light: var(--color-cyan-200),
51
- default: var(--color-cyan-500),
52
- dark: var(--color-cyan-600),
53
- darker: var(--color-cyan-700),
54
- darkest: var(--color-cyan-800),
104
+ // 텍스트(tx) — 무채 텍스트는 표면색과 독립 축(흰/검 알파)
105
+ tx: (
106
+ strong: black,
107
+ default: rgba(0, 0, 0, 0.87),
108
+ muted: rgba(0, 0, 0, 0.6),
109
+ faint: rgba(0, 0, 0, 0.38),
110
+ on-inverse: white,
111
+ // 반전면 위 보조 텍스트(hover 감쇠·비활성) — 준역할(2026-07-16 확정)
112
+ on-inverse-muted: rgba(255, 255, 255, 0.7),
113
+ on-inverse-disabled: rgba(255, 255, 255, 0.5),
114
+ disabled: rgba(0, 0, 0, 0.38),
115
+ // 시맨틱 텍스트 — {key}(단독 텍스트·아이콘·링크, +hover)·{key}-solid(solid 면 위)·{key}-subtle(subtle 면 위)
116
+ // tx-{key} 가 리프라 시맨틱 키는 중첩 없이 평탄 표기
117
+ "gray": var(--sd-color-zinc-400),
118
+ gray-hover: var(--sd-color-zinc-500),
119
+ gray-solid: white,
120
+ gray-subtle: var(--sd-color-zinc-600),
121
+ blue-gray: var(--sd-color-slate-400),
122
+ blue-gray-hover: var(--sd-color-slate-500),
123
+ blue-gray-solid: white,
124
+ blue-gray-subtle: var(--sd-color-slate-600),
125
+ primary: var(--sd-color-blue-500),
126
+ primary-hover: var(--sd-color-blue-600),
127
+ primary-solid: white,
128
+ primary-subtle: var(--sd-color-blue-700),
129
+ secondary: var(--sd-color-blue-500),
130
+ secondary-hover: var(--sd-color-blue-600),
131
+ secondary-solid: white,
132
+ secondary-subtle: var(--sd-color-blue-700),
133
+ info: var(--sd-color-cyan-500),
134
+ info-hover: var(--sd-color-cyan-600),
135
+ info-solid: white,
136
+ info-subtle: var(--sd-color-cyan-700),
137
+ success: var(--sd-color-lime-500),
138
+ success-hover: var(--sd-color-lime-600),
139
+ success-solid: white,
140
+ success-subtle: var(--sd-color-lime-700),
141
+ warning: var(--sd-color-orange-500),
142
+ warning-hover: var(--sd-color-orange-600),
143
+ warning-solid: white,
144
+ warning-subtle: var(--sd-color-orange-700),
145
+ danger: var(--sd-color-red-500),
146
+ danger-hover: var(--sd-color-red-600),
147
+ danger-solid: white,
148
+ danger-subtle: var(--sd-color-red-700),
55
149
  ),
56
- success: (
57
- lightest: var(--color-lime-50),
58
- lighter: var(--color-lime-100),
59
- light: var(--color-lime-200),
60
- default: var(--color-lime-500),
61
- dark: var(--color-lime-600),
62
- darker: var(--color-lime-700),
63
- darkest: var(--color-lime-800),
150
+ // 보더(bd)
151
+ bd: (
152
+ hairline: var(--sd-color-zinc-100),
153
+ soft: var(--sd-color-zinc-200),
154
+ default: var(--sd-color-zinc-300),
155
+ strong: var(--sd-color-zinc-400),
156
+ emphasis: var(--sd-color-zinc-500),
157
+ field: var(--sd-color-zinc-300),
158
+ disabled: var(--sd-color-zinc-200),
159
+ // 시맨틱 보더 — solid(+hover)·subtle
160
+ "gray": (
161
+ solid: var(--sd-color-zinc-400),
162
+ solid-hover: var(--sd-color-zinc-500),
163
+ subtle: var(--sd-color-zinc-300),
164
+ ),
165
+ blue-gray: (
166
+ solid: var(--sd-color-slate-400),
167
+ solid-hover: var(--sd-color-slate-500),
168
+ subtle: var(--sd-color-slate-300),
169
+ ),
170
+ primary: (
171
+ solid: var(--sd-color-blue-500),
172
+ solid-hover: var(--sd-color-blue-600),
173
+ subtle: var(--sd-color-blue-200),
174
+ ),
175
+ secondary: (
176
+ solid: var(--sd-color-blue-500),
177
+ solid-hover: var(--sd-color-blue-600),
178
+ subtle: var(--sd-color-blue-200),
179
+ ),
180
+ info: (
181
+ solid: var(--sd-color-cyan-500),
182
+ solid-hover: var(--sd-color-cyan-600),
183
+ subtle: var(--sd-color-cyan-200),
184
+ ),
185
+ success: (
186
+ solid: var(--sd-color-lime-500),
187
+ solid-hover: var(--sd-color-lime-600),
188
+ subtle: var(--sd-color-lime-200),
189
+ ),
190
+ warning: (
191
+ solid: var(--sd-color-orange-500),
192
+ solid-hover: var(--sd-color-orange-600),
193
+ subtle: var(--sd-color-orange-200),
194
+ ),
195
+ danger: (
196
+ solid: var(--sd-color-red-500),
197
+ solid-hover: var(--sd-color-red-600),
198
+ subtle: var(--sd-color-red-200),
199
+ ),
64
200
  ),
65
- warning: (
66
- lightest: var(--color-orange-50),
67
- lighter: var(--color-orange-100),
68
- light: var(--color-orange-200),
69
- default: var(--color-orange-500),
70
- dark: var(--color-orange-600),
71
- darker: var(--color-orange-700),
72
- darkest: var(--color-orange-800),
201
+ // 포커스 링 — :focus-visible 전 컨트롤 단일 규약
202
+ focus-ring: (
203
+ color: var(--sd-color-blue-500),
204
+ width: 0.1667rem,
205
+ offset: 0.0833rem,
73
206
  ),
74
- danger: (
75
- lightest: var(--color-red-50),
76
- lighter: var(--color-red-100),
77
- light: var(--color-red-200),
78
- default: var(--color-red-500),
79
- dark: var(--color-red-600),
80
- darker: var(--color-red-700),
81
- darkest: var(--color-red-800),
207
+ scrollbar: (
208
+ thumb: rgba(0, 0, 0, 0.05),
209
+ thumb-hover: rgba(0, 0, 0, 0.1),
210
+ track: rgba(0, 0, 0, 0.03),
211
+ ),
212
+ // 컴포넌트 장식 토큰(방침 1, 2026-07-16 확정) — 테마 오버라이드가 값 맵으로 못 잡던
213
+ // 장식(FIND-003 ③)의 소비 지점. 라이트 기본값은 현행 시각 등가.
214
+ card: (
215
+ bd: transparent,
216
+ // focus-within 시 상단 보더 색(ide-dark 액센트 라인용)
217
+ bd-active: transparent,
218
+ // 기본값 = elevation(2)/(4) 전개 등가 리터럴(체이닝 금지 규칙상 --sd-shadow-* 참조 불가)
219
+ shadow: (
220
+ 0 0.1667rem 0.6667rem rgba(0, 0, 0, 0.05),
221
+ 0 0.0833rem 0.0833rem rgba(0, 0, 0, 0.05),
222
+ ),
223
+ shadow-hover: (
224
+ 0 0.3333rem 1.3333rem rgba(0, 0, 0, 0.05),
225
+ 0 0.0833rem 0.0833rem rgba(0, 0, 0, 0.05),
226
+ ),
82
227
  ),
228
+ modal: (
229
+ bd: transparent,
230
+ header-bg: var(--sd-color-zinc-50),
231
+ header-tx: rgba(0, 0, 0, 0.87),
232
+ header-tx-muted: var(--sd-color-zinc-400),
83
233
  ),
84
- trans: (
85
- darkest: rgba(0, 0, 0, 0.5),
86
- darker: rgba(0, 0, 0, 0.4),
87
- dark: rgba(0, 0, 0, 0.3),
88
- default: rgba(0, 0, 0, 0.2),
89
- light: rgba(0, 0, 0, 0.1),
90
- lighter: rgba(0, 0, 0, 0.05),
91
- lightest: rgba(0, 0, 0, 0.03),
92
- rev-default: rgba(255, 255, 255, 0.1),
93
- rev-light: rgba(255, 255, 255, 0.2),
94
- rev-lighter: rgba(255, 255, 255, 0.3),
95
- rev-lightest: rgba(255, 255, 255, 0.4),
234
+ dropdown: (
235
+ bd: var(--sd-color-zinc-300),
96
236
  ),
97
- text-trans: (
98
- dark: black,
99
- default: rgba(0, 0, 0, 0.87),
100
- light: rgba(0, 0, 0, 0.6),
101
- lighter: rgba(0, 0, 0, 0.38),
102
- lightest: rgba(0, 0, 0, 0.2),
103
- rev-default: white,
104
- rev-dark: rgba(255, 255, 255, 0.7),
105
- rev-darker: rgba(255, 255, 255, 0.5),
237
+ permission-group: (
238
+ bg: var(--sd-color-cyan-500),
239
+ tx: white,
106
240
  ),
107
- font-size: (
108
- lg: 1.1667rem,
109
- default: 1rem,
110
- sm: 0.9167rem,
111
- h1: 2rem,
112
- h2: 1.5rem,
113
- h3: 1.3333rem,
114
- h4: 1.1667rem,
115
- h5: 1rem,
116
- h6: 0.9167rem,
241
+ shadow: (
242
+ color: rgba(0, 0, 0, 0.05),
243
+ size: 0.0833rem,
244
+ blur-mult: 1,
117
245
  ),
246
+ // 타이포
247
+ font-size: (
248
+ lg: 1.1667rem,
249
+ default: 1rem,
250
+ sm: 0.9167rem,
251
+ h1: 2rem,
252
+ h2: 1.5rem,
253
+ h3: 1.3333rem,
254
+ h4: 1.1667rem,
255
+ h5: 1rem,
256
+ h6: 0.9167rem,
257
+ ),
258
+ font-family: "sans-serif",
259
+ font-family-field: "ui-sans-serif, system-ui, sans-serif",
260
+ font-family-monospace: "ui-monospace, monospace",
261
+ font-weight: 400,
262
+ // 형태(테마 소유) — 구 gap 체인 해체, 리터럴 고정
263
+ radius: (
264
+ xs: 0.0833rem,
265
+ sm: 0.1667rem,
266
+ default: 0.3333rem,
267
+ lg: 0.5rem,
268
+ xl: 0.6667rem,
269
+ xxl: 1rem,
270
+ ),
271
+ // 밀도 그룹(치수) — sd-density-compact 가 이 그룹만 덮는다. 테마 맵엔 치수 없음.
118
272
  gap: (
119
- xxs: 0.0833rem,
120
- xs: 0.1667rem,
121
- sm: 0.3333rem,
122
- default: 0.5rem,
123
- lg: 0.6667rem,
124
- xl: 1rem,
125
- xxl: 1.5rem,
126
- 0: 0,
127
- auto: "auto",
273
+ xxs: 0.0833rem,
274
+ xs: 0.1667rem,
275
+ sm: 0.3333rem,
276
+ default: 0.5rem,
277
+ lg: 0.6667rem,
278
+ xl: 1rem,
279
+ xxl: 1.5rem,
280
+ 0: 0,
281
+ auto: "auto",
282
+ ),
283
+ line-height: 1.5em,
284
+ line-height-strip-unit: 1.5,
285
+ sheet: (
286
+ pv: 0.1667rem,
287
+ ph: 0.3333rem,
288
+ // shadow 는 테마 소유(블루프린트 하드 그림자용) — pv/ph 만 밀도 소유
289
+ shadow: none,
128
290
  ),
129
- border-color: (
130
- lightest: var(--color-zinc-100),
131
- lighter: var(--color-zinc-200),
132
- light: var(--color-zinc-300),
133
- default: var(--color-zinc-400),
134
- dark: var(--color-zinc-500),
135
- darker: var(--color-zinc-600),
136
- darkest: var(--color-zinc-700),
291
+ topbar: (
292
+ height: 2.5rem,
137
293
  ),
138
- border-radius: (
139
- xs: var(--gap-xxs),
140
- sm: var(--gap-xs),
141
- default: var(--gap-sm),
142
- lg: var(--gap-default),
143
- xl: var(--gap-lg),
144
- xxl: var(--gap-xl),
294
+ sidebar: (
295
+ width: 14rem,
145
296
  ),
146
- z-index: (
297
+ z: (
147
298
  toast: 9999,
148
299
  busy: 9998,
149
300
  dropdown: 5000,
150
301
  modal: 4000,
151
302
  sidebar: 3000,
152
303
  ),
153
- line-height: 1.5em,
154
- line-height-strip-unit: 1.5,
155
- font-family: "sans-serif",
156
- font-family-field: "ui-sans-serif, system-ui, sans-serif",
157
- font-family-monospace: "ui-monospace, monospace",
158
- background-color: var(--theme-gray-lightest),
159
- background-rev-color: black,
160
- control-color: white,
161
- busy-overlay-bg: rgba(255, 255, 255, 0.6),
162
- animation-duration: 0.2s,
163
- elevation-size: 0.0833rem,
164
- // elevation 그림자 blur 배수 (기본 1 = 현재 동작 유지). 테마에서 0으로 덮으면 하드 섀도.
165
- elevation-blur-mult: 1,
166
- sidebar: (
167
- width: 14rem,
168
- ),
169
- topbar: (
170
- height: 2.5rem,
171
- ),
172
- sheet: (
173
- pv: var(--gap-xs),
174
- ph: var(--gap-sm),
175
- bg: var(--theme-gray-lightest),
176
- ),
304
+ animation-duration: 0.2s
177
305
  );
@@ -1,19 +1,23 @@
1
- @use "../commons/mixins";
2
-
3
1
  .card {
4
2
  display: block;
5
- background: var(--control-color);
6
- border-radius: var(--border-radius-default);
7
- transition: box-shadow var(--animation-duration) ease-in-out;
8
- @include mixins.elevation(2);
9
- animation: sd-card var(--animation-duration) ease-out;
3
+ background-color: var(--sd-bg-elevated);
4
+ // 장식 토큰 소비(방침 1) — 기본 transparent/elevation 등가, 테마가 값 맵으로 덮는다
5
+ border: 1px solid var(--sd-card-bd);
6
+ border-radius: var(--sd-radius-default);
7
+ transition: box-shadow var(--sd-animation-duration) ease-in-out;
8
+ box-shadow: var(--sd-card-shadow);
9
+ animation: sd-card var(--sd-animation-duration) ease-out;
10
10
  opacity: 0;
11
11
  transform: translateY(-1em);
12
12
  animation-fill-mode: forwards;
13
13
 
14
14
  &:hover,
15
15
  &:focus-within {
16
- @include mixins.elevation(4);
16
+ box-shadow: var(--sd-card-shadow-hover);
17
+ }
18
+
19
+ &:focus-within {
20
+ border-top-color: var(--sd-card-bd-active);
17
21
  }
18
22
  }
19
23
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  .form-box {
4
4
  display: flex;
5
- @include mixins.flex-direction(column, var(--gap-default));
5
+ @include mixins.flex-direction(column, var(--sd-gap-default));
6
6
 
7
7
  > div,
8
8
  > .form-box-item {
@@ -10,17 +10,17 @@
10
10
 
11
11
  > label {
12
12
  display: block;
13
- margin-bottom: var(--gap-xs);
13
+ margin-bottom: var(--sd-gap-xs);
14
14
  white-space: nowrap;
15
15
  font-weight: bold;
16
16
  border: 1px solid transparent;
17
17
  }
18
18
 
19
19
  @media all and (pointer: coarse) {
20
- margin-bottom: var(--gap-default);
20
+ margin-bottom: var(--sd-gap-default);
21
21
 
22
22
  > label {
23
- margin-bottom: var(--gap-xxs);
23
+ margin-bottom: var(--sd-gap-xxs);
24
24
  }
25
25
  }
26
26
  }
@@ -29,7 +29,7 @@
29
29
  .form-box-inline {
30
30
  display: inline-flex;
31
31
  flex-wrap: wrap;
32
- @include mixins.flex-direction(row, var(--gap-sm));
32
+ @include mixins.flex-direction(row, var(--sd-gap-sm));
33
33
 
34
34
  > div,
35
35
  > .form-box-item {
@@ -42,8 +42,8 @@
42
42
  white-space: nowrap;
43
43
  font-weight: bold;
44
44
  border: 1px solid transparent;
45
- padding-left: var(--gap-sm);
46
- padding-right: var(--gap-sm);
45
+ padding-left: var(--sd-gap-sm);
46
+ padding-right: var(--sd-gap-sm);
47
47
  }
48
48
  }
49
49
  }
@@ -7,7 +7,7 @@
7
7
  > * > tr,
8
8
  > tr {
9
9
  > * {
10
- padding: 0 var(--gap-default) var(--gap-sm) 0;
10
+ padding: 0 var(--sd-gap-default) var(--sd-gap-sm) 0;
11
11
  vertical-align: middle;
12
12
 
13
13
  &:last-child {
@@ -20,20 +20,20 @@
20
20
  }
21
21
 
22
22
  > th {
23
- padding-left: var(--gap-sm);
23
+ padding-left: var(--sd-gap-sm);
24
24
  text-align: right;
25
25
  width: 0;
26
26
  white-space: nowrap;
27
27
 
28
28
  &.form-table-header {
29
29
  text-align: left;
30
- line-height: var(--line-height);
31
- margin-bottom: var(--gap-sm);
32
- color: var(--theme-gray-default);
30
+ line-height: var(--sd-line-height);
31
+ margin-bottom: var(--sd-gap-sm);
32
+ color: var(--sd-tx-gray);
33
33
  font-weight: normal;
34
34
 
35
- padding: var(--gap-xxl) 0 var(--gap-sm) 0;
36
- font-size: var(--font-size-sm);
35
+ padding: var(--sd-gap-xxl) 0 var(--sd-gap-sm) 0;
36
+ font-size: var(--sd-font-size-sm);
37
37
  }
38
38
  }
39
39
  }
@@ -1,5 +1,5 @@
1
- $border-color-light: var(--border-color-lighter);
2
- $border-color-dark: var(--border-color-light);
1
+ $border-color-light: var(--sd-bd-soft);
2
+ $border-color-dark: var(--sd-bd-default);
3
3
 
4
4
  .table {
5
5
  display: table;
@@ -12,7 +12,7 @@ $border-color-dark: var(--border-color-light);
12
12
  > * > tr,
13
13
  > tr {
14
14
  > * {
15
- padding: var(--gap-xs) var(--gap-sm);
15
+ padding: var(--sd-gap-xs) var(--sd-gap-sm);
16
16
  border-left: 1px solid $border-color-light;
17
17
  border-top: 1px solid $border-color-light;
18
18
 
@@ -33,7 +33,7 @@ $border-color-dark: var(--border-color-light);
33
33
  }
34
34
 
35
35
  > th {
36
- background: var(--theme-gray-lightest);
36
+ background-color: var(--sd-bg-gray-subtle);
37
37
  }
38
38
 
39
39
  > td {
@@ -42,7 +42,7 @@ $border-color-dark: var(--border-color-light);
42
42
  }
43
43
 
44
44
  > thead > tr > th {
45
- background: var(--theme-gray-lightest);
45
+ background-color: var(--sd-bg-gray-subtle);
46
46
  }
47
47
 
48
48
  &.table-inset {