@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,195 +1,195 @@
1
- import {
2
- booleanAttribute,
3
- ChangeDetectionStrategy,
4
- Component,
5
- computed,
6
- contentChild,
7
- contentChildren,
8
- input,
9
- model,
10
- TemplateRef,
11
- ViewEncapsulation,
12
- } from "@angular/core";
13
- import { NgTemplateOutlet } from "@angular/common";
14
- import { NgIcon } from "@ng-icons/core";
15
- import { SdCollapse } from "../collapse/sd-collapse";
16
- import { SdCollapseIcon } from "../collapse/sd-collapse-icon";
17
- import { SdList } from "./sd-list";
18
- import { SdRipple } from "../../core/ripple/sd-ripple";
19
-
20
- @Component({
21
- selector: "sd-list-item",
22
- changeDetection: ChangeDetectionStrategy.OnPush,
23
- encapsulation: ViewEncapsulation.None,
24
- standalone: true,
25
- imports: [SdCollapse, SdCollapseIcon, NgTemplateOutlet, NgIcon, SdRipple],
26
- template: `
27
- <div
28
- class="_content"
29
- [style]="contentStyle()"
30
- [class]="contentClass()"
31
- tabindex="0"
32
- (click)="onContentClick()"
33
- (keydown.enter)="onContentClick()"
34
- [sdRipple]="!readonly() && !(layout() === 'flat' && hasChildren())"
35
- >
36
- @if (selectedIcon() != null && !hasChildren()) {
37
- <ng-icon
38
- [class.tx-theme-primary-default]="selected()"
39
- [class.tx-trans-lightest]="!selected()"
40
- [svg]="selectedIcon()!"
41
- />
42
- }
43
- <div class="_label">
44
- <ng-content />
45
- </div>
46
- @if (toolTpl()) {
47
- <div class="_tool">
48
- <ng-template [ngTemplateOutlet]="toolTpl()!" />
49
- </div>
50
- }
51
- @if (layout() === "accordion" && hasChildren()) {
52
- <sd-collapse-icon [open]="open()" />
53
- }
54
- </div>
55
- @if (hasChildren()) {
56
- <sd-collapse [open]="childrenOpen()">
57
- <div class="_children">
58
- @if (layout() === "accordion") {
59
- <div class="_indent-guide"></div>
60
- }
61
- <ng-content select="sd-list" />
62
- </div>
63
- </sd-collapse>
64
- }
65
- `,
66
- styles: [
67
- /* language=SCSS */ `
68
- sd-list-item {
69
- display: block;
70
-
71
- > ._content {
72
- display: flex;
73
- padding: var(--gap-sm) var(--gap-default);
74
- cursor: pointer;
75
- gap: var(--gap-xs);
76
- border-radius: var(--border-radius-default);
77
- transition: background var(--animation-duration) ease-in;
78
-
79
- > ._label {
80
- flex: 1 1 auto;
81
- overflow: auto;
82
- }
83
-
84
- &:focus-visible {
85
- outline: none;
86
- transition: background var(--animation-duration) ease-out;
87
- background: var(--trans-light);
88
- }
89
- }
90
-
91
- &[data-sd-selected="true"] > ._content {
92
- background: var(--trans-light);
93
- font-weight: bold;
94
- }
95
-
96
- &[data-sd-has-selected-icon="true"][data-sd-selected="true"] > ._content {
97
- color: var(--text-trans-default);
98
-
99
- &:hover {
100
- background: var(--trans-light);
101
- }
102
- }
103
-
104
- &[data-sd-readonly="true"] {
105
- > ._content {
106
- cursor: default;
107
- }
108
- }
109
-
110
- // 중첩 자식 영역: 세로 가이드선을 그리기 위한 기준 컨테이너.
111
- // 깊이별 들여쓰기는 중첩 sd-list 의 padding 으로 누적되므로, 이 컨테이너
112
- // 좌측은 항상 현재 항목 기준이라 가이드선 위치는 고정값이면 충분함.
113
- > sd-collapse > ._content > ._children {
114
- position: relative;
115
-
116
- > ._indent-guide {
117
- position: absolute;
118
- top: 0;
119
- bottom: 0;
120
- left: 1em;
121
- width: 0;
122
- border-left: 1px solid var(--trans-light);
123
- pointer-events: none;
124
- }
125
- }
126
-
127
- &[data-sd-layout="accordion"] {
128
- &:not([data-sd-readonly="true"]) {
129
- > ._content:hover {
130
- transition: background var(--animation-duration) ease-out;
131
- background: var(--trans-light);
132
- }
133
- }
134
-
135
- // 깊이별 들여쓰기: accordion 항목의 자식 리스트를 한 칸씩 누적 들여씀.
136
- // (flat 항목의 자식 리스트는 들여쓰지 않음)
137
- > sd-collapse > ._content > ._children > sd-list > sd-list-item > ._content {
138
- padding-left: 1.5em;
139
- }
140
- }
141
-
142
- &[data-sd-layout="flat"][data-sd-has-children="true"] {
143
- > ._content {
144
- display: block;
145
- background: transparent;
146
- cursor: default;
147
- font-size: var(--font-size-sm);
148
- opacity: 0.7;
149
- margin: 0;
150
- }
151
- }
152
- }
153
-
154
- .sd-theme-mobile > sd-list-item {
155
- > ._content:hover {
156
- background: transparent;
157
- }
158
- }
159
- `,
160
- ],
161
- host: {
162
- "[attr.data-sd-layout]": "layout()",
163
- "[attr.data-sd-open]": "open()",
164
- "[attr.data-sd-selected]": "selected()",
165
- "[attr.data-sd-readonly]": "readonly()",
166
- "[attr.data-sd-has-children]": "hasChildren()",
167
- "[attr.data-sd-has-selected-icon]": "selectedIcon() != null",
168
- },
169
- })
170
- export class SdListItem {
171
- layout = input<"accordion" | "flat">("accordion");
172
- open = model(false);
173
- selected = input(false, { transform: booleanAttribute });
174
- selectedIcon = input<string>();
175
- readonly = input(false, { transform: booleanAttribute });
176
- contentStyle = input<string>();
177
- contentClass = input<string>();
178
-
179
- toolTpl = contentChild<TemplateRef<void>>("toolTpl");
180
-
181
- private readonly _childLists = contentChildren(SdList);
182
-
183
- hasChildren = computed(() => this._childLists().length > 0);
184
-
185
- childrenOpen = computed(() => {
186
- return this.layout() === "flat" ? true : this.open();
187
- });
188
-
189
- onContentClick(): void {
190
- if (this.readonly()) return;
191
- if (this.layout() === "accordion" && this.hasChildren()) {
192
- this.open.update((v) => !v);
193
- }
194
- }
195
- }
1
+ import {
2
+ booleanAttribute,
3
+ ChangeDetectionStrategy,
4
+ Component,
5
+ computed,
6
+ contentChild,
7
+ contentChildren,
8
+ input,
9
+ model,
10
+ TemplateRef,
11
+ ViewEncapsulation,
12
+ } from "@angular/core";
13
+ import { NgTemplateOutlet } from "@angular/common";
14
+ import { NgIcon } from "@ng-icons/core";
15
+ import { SdCollapse } from "../collapse/sd-collapse";
16
+ import { SdCollapseIcon } from "../collapse/sd-collapse-icon";
17
+ import { SdList } from "./sd-list";
18
+ import { SdRipple } from "../../core/ripple/sd-ripple";
19
+
20
+ @Component({
21
+ selector: "sd-list-item",
22
+ changeDetection: ChangeDetectionStrategy.OnPush,
23
+ encapsulation: ViewEncapsulation.None,
24
+ standalone: true,
25
+ imports: [SdCollapse, SdCollapseIcon, NgTemplateOutlet, NgIcon, SdRipple],
26
+ template: `
27
+ <div
28
+ class="_content"
29
+ [style]="contentStyle()"
30
+ [class]="contentClass()"
31
+ tabindex="0"
32
+ (click)="onContentClick()"
33
+ (keydown.enter)="onContentClick()"
34
+ [sdRipple]="!readonly() && !(layout() === 'flat' && hasChildren())"
35
+ >
36
+ @if (selectedIcon() != null && !hasChildren()) {
37
+ <ng-icon
38
+ [class.tx-primary]="selected()"
39
+ [class.tx-faint]="!selected()"
40
+ [svg]="selectedIcon()!"
41
+ />
42
+ }
43
+ <div class="_label">
44
+ <ng-content />
45
+ </div>
46
+ @if (toolTpl()) {
47
+ <div class="_tool">
48
+ <ng-template [ngTemplateOutlet]="toolTpl()!" />
49
+ </div>
50
+ }
51
+ @if (layout() === "accordion" && hasChildren()) {
52
+ <sd-collapse-icon [open]="open()" />
53
+ }
54
+ </div>
55
+ @if (hasChildren()) {
56
+ <sd-collapse [open]="childrenOpen()">
57
+ <div class="_children">
58
+ @if (layout() === "accordion") {
59
+ <div class="_indent-guide"></div>
60
+ }
61
+ <ng-content select="sd-list" />
62
+ </div>
63
+ </sd-collapse>
64
+ }
65
+ `,
66
+ styles: [
67
+ /* language=SCSS */ `
68
+ sd-list-item {
69
+ display: block;
70
+
71
+ > ._content {
72
+ display: flex;
73
+ padding: var(--sd-gap-sm) var(--sd-gap-default);
74
+ cursor: pointer;
75
+ gap: var(--sd-gap-xs);
76
+ border-radius: var(--sd-radius-default);
77
+ transition: background var(--sd-animation-duration) ease-in;
78
+
79
+ > ._label {
80
+ flex: 1 1 auto;
81
+ overflow: auto;
82
+ }
83
+
84
+ &:focus-visible {
85
+ outline: none;
86
+ transition: background var(--sd-animation-duration) ease-out;
87
+ background-color: var(--sd-bg-state-hover);
88
+ }
89
+ }
90
+
91
+ &[data-sd-selected="true"] > ._content {
92
+ background-color: var(--sd-bg-state-selected);
93
+ font-weight: bold;
94
+ }
95
+
96
+ &[data-sd-has-selected-icon="true"][data-sd-selected="true"] > ._content {
97
+ color: var(--sd-tx-default);
98
+
99
+ &:hover {
100
+ background-color: var(--sd-bg-state-hover);
101
+ }
102
+ }
103
+
104
+ &[data-sd-readonly="true"] {
105
+ > ._content {
106
+ cursor: default;
107
+ }
108
+ }
109
+
110
+ // 중첩 자식 영역: 세로 가이드선을 그리기 위한 기준 컨테이너.
111
+ // 깊이별 들여쓰기는 중첩 sd-list 의 padding 으로 누적되므로, 이 컨테이너
112
+ // 좌측은 항상 현재 항목 기준이라 가이드선 위치는 고정값이면 충분함.
113
+ > sd-collapse > ._content > ._children {
114
+ position: relative;
115
+
116
+ > ._indent-guide {
117
+ position: absolute;
118
+ top: 0;
119
+ bottom: 0;
120
+ left: 1em;
121
+ width: 0;
122
+ border-left: 1px solid var(--sd-bd-soft);
123
+ pointer-events: none;
124
+ }
125
+ }
126
+
127
+ &[data-sd-layout="accordion"] {
128
+ &:not([data-sd-readonly="true"]) {
129
+ > ._content:hover {
130
+ transition: background var(--sd-animation-duration) ease-out;
131
+ background-color: var(--sd-bg-state-hover);
132
+ }
133
+ }
134
+
135
+ // 깊이별 들여쓰기: accordion 항목의 자식 리스트를 한 칸씩 누적 들여씀.
136
+ // (flat 항목의 자식 리스트는 들여쓰지 않음)
137
+ > sd-collapse > ._content > ._children > sd-list > sd-list-item > ._content {
138
+ padding-left: 1.5em;
139
+ }
140
+ }
141
+
142
+ &[data-sd-layout="flat"][data-sd-has-children="true"] {
143
+ > ._content {
144
+ display: block;
145
+ background-color: transparent;
146
+ cursor: default;
147
+ font-size: var(--sd-font-size-sm);
148
+ opacity: 0.7;
149
+ margin: 0;
150
+ }
151
+ }
152
+ }
153
+
154
+ .sd-theme-mobile > sd-list-item {
155
+ > ._content:hover {
156
+ background-color: transparent;
157
+ }
158
+ }
159
+ `,
160
+ ],
161
+ host: {
162
+ "[attr.data-sd-layout]": "layout()",
163
+ "[attr.data-sd-open]": "open()",
164
+ "[attr.data-sd-selected]": "selected()",
165
+ "[attr.data-sd-readonly]": "readonly()",
166
+ "[attr.data-sd-has-children]": "hasChildren()",
167
+ "[attr.data-sd-has-selected-icon]": "selectedIcon() != null",
168
+ },
169
+ })
170
+ export class SdListItem {
171
+ layout = input<"accordion" | "flat">("accordion");
172
+ open = model(false);
173
+ selected = input(false, { transform: booleanAttribute });
174
+ selectedIcon = input<string>();
175
+ readonly = input(false, { transform: booleanAttribute });
176
+ contentStyle = input<string>();
177
+ contentClass = input<string>();
178
+
179
+ toolTpl = contentChild<TemplateRef<void>>("toolTpl");
180
+
181
+ private readonly _childLists = contentChildren(SdList);
182
+
183
+ hasChildren = computed(() => this._childLists().length > 0);
184
+
185
+ childrenOpen = computed(() => {
186
+ return this.layout() === "flat" ? true : this.open();
187
+ });
188
+
189
+ onContentClick(): void {
190
+ if (this.readonly()) return;
191
+ if (this.layout() === "accordion" && this.hasChildren()) {
192
+ this.open.update((v) => !v);
193
+ }
194
+ }
195
+ }
@@ -21,18 +21,18 @@ import {
21
21
  display: flex;
22
22
  flex-direction: column;
23
23
  user-select: none;
24
- background: var(--control-color);
25
- border: 1px solid var(--border-color-default);
26
- border-radius: var(--border-radius-default);
27
- padding: var(--gap-sm);
28
- gap: var(--gap-xs);
24
+ background-color: var(--sd-bg-control);
25
+ border: 1px solid var(--sd-bd-strong);
26
+ border-radius: var(--sd-radius-default);
27
+ padding: var(--sd-gap-sm);
28
+ gap: var(--sd-gap-xs);
29
29
 
30
30
  &[data-sd-inset="true"] {
31
- background: transparent;
31
+ background-color: transparent;
32
32
  border: none;
33
33
 
34
34
  sd-list {
35
- background: transparent;
35
+ background-color: transparent;
36
36
  }
37
37
  }
38
38
 
@@ -41,7 +41,7 @@ import {
41
41
  border-color: transparent;
42
42
  border-radius: 0;
43
43
  padding: 0;
44
- background: transparent;
44
+ background-color: transparent;
45
45
  }
46
46
  }
47
47
  `,
@@ -35,7 +35,9 @@ import {
35
35
  class="page-anchor"
36
36
  [style.text-decoration]="page === currentPage() + 1 ? 'underline' : ''"
37
37
  (click)="goToPage(page - 1)"
38
- >{{ page }}</sd-anchor>
38
+ >
39
+ {{ page }}
40
+ </sd-anchor>
39
41
  }
40
42
 
41
43
  <sd-anchor class="nav-next-group" [disabled]="!hasNext()" (click)="goToNextGroup()">
@@ -50,7 +52,7 @@ import {
50
52
  sd-pagination {
51
53
  > sd-anchor {
52
54
  display: inline-block;
53
- padding: var(--gap-xxs) var(--gap-xs);
55
+ padding: var(--sd-gap-xxs) var(--sd-gap-xs);
54
56
  }
55
57
  }
56
58
  `,
@@ -1,8 +1,4 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- } from "@angular/core";
1
+ import { ChangeDetectionStrategy, Component, ViewEncapsulation } from "@angular/core";
6
2
  import { setupRipple } from "../../core/ripple/setupRipple";
7
3
 
8
4
  @Component({
@@ -18,15 +14,15 @@ import { setupRipple } from "../../core/ripple/setupRipple";
18
14
  /* language=SCSS */ `
19
15
  sd-select-button {
20
16
  display: block;
21
- background: var(--control-color);
17
+ background-color: var(--sd-bg-control);
22
18
  font-weight: bold;
23
19
  cursor: pointer;
24
- color: var(--theme-primary-default);
25
- transition: background var(--animation-duration) linear;
20
+ color: var(--sd-tx-primary);
21
+ transition: background var(--sd-animation-duration) linear;
26
22
 
27
23
  &:hover {
28
- color: var(--theme-primary-darker);
29
- background: var(--theme-gray-lightest);
24
+ color: var(--sd-tx-primary-hover);
25
+ background-color: var(--sd-bg-state-hover);
30
26
  }
31
27
  }
32
28
  `,
@@ -38,32 +38,33 @@ import { SdGap } from "../gap/sd-gap";
38
38
 
39
39
  sd-select-item {
40
40
  display: block;
41
- padding: var(--gap-sm) var(--gap-default);
41
+ padding: var(--sd-gap-sm) var(--sd-gap-default);
42
42
  cursor: pointer;
43
- font-family: var(--font-family-field);
44
- transition: background var(--animation-duration) ease-in;
45
- background: var(--control-color);
43
+ font-family: var(--sd-font-family-field);
44
+ transition: background var(--sd-animation-duration) ease-in;
45
+ background-color: var(--sd-bg-overlay);
46
46
 
47
47
  &:hover {
48
- transition: background var(--animation-duration) ease-out;
49
- background: rgba(0, 0, 0, 0.07);
48
+ transition: background var(--sd-animation-duration) ease-out;
49
+ background-color: var(--sd-bg-state-hover);
50
50
  }
51
51
 
52
52
  &:focus {
53
53
  outline: none;
54
- transition: background var(--animation-duration) ease-out;
55
- background: rgba(0, 0, 0, 0.07);
54
+ transition: background var(--sd-animation-duration) ease-out;
55
+ background-color: var(--sd-bg-state-hover);
56
56
  }
57
57
 
58
58
  &[data-sd-selected="true"] {
59
- color: var(--theme-primary-default);
59
+ color: var(--sd-tx-primary);
60
60
  font-weight: bold;
61
- background: rgba(0, 0, 0, 0.07);
61
+ background-color: var(--sd-bg-state-selected);
62
62
  }
63
63
 
64
+ // disabled 는 색 치환 단일 규약 (DEC-009 — opacity 방식 폐기)
64
65
  &[data-sd-disabled="true"] {
65
- background: var(--theme-gray-default);
66
- opacity: 0.3;
66
+ background-color: var(--sd-bg-disabled);
67
+ color: var(--sd-tx-disabled);
67
68
  cursor: default;
68
69
  pointer-events: none;
69
70
  }
@@ -85,9 +86,7 @@ import { SdGap } from "../gap/sd-gap";
85
86
  },
86
87
  })
87
88
  export class SdSelectItem<T> {
88
- protected readonly _parentControl = inject<SdSelect<any, T>>(
89
- forwardRef(() => SdSelect),
90
- );
89
+ protected readonly _parentControl = inject<SdSelect<any, T>>(forwardRef(() => SdSelect));
91
90
  private readonly _elRef = inject(ElementRef<HTMLElement>);
92
91
  private readonly _destroyRef = inject(DestroyRef);
93
92