@simplysm/angular 14.0.49 → 14.0.51

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 (134) hide show
  1. package/README.md +234 -225
  2. package/dist/controls/select/sd-select.js +3 -3
  3. package/dist/layout/dock/sd-dock-container.js +1 -1
  4. package/docs/bootstrap/provide-sd-angular.md +37 -0
  5. package/docs/bootstrap/sd-angular-config-provider.md +16 -0
  6. package/docs/directives/sd-command-directive.md +30 -0
  7. package/docs/directives/sd-events.md +25 -0
  8. package/docs/directives/sd-intersection-directive.md +36 -0
  9. package/docs/directives/sd-invalid.md +24 -0
  10. package/docs/directives/sd-resize-directive.md +42 -0
  11. package/docs/directives/sd-ripple.md +23 -0
  12. package/docs/directives/sd-router-link.md +38 -0
  13. package/docs/directives/sd-show-effect.md +18 -0
  14. package/docs/directives/sd-typed-template.md +69 -0
  15. package/docs/features/sd-address-search-modal.md +50 -0
  16. package/docs/features/sd-permission-table.md +20 -0
  17. package/docs/features/sd-shared-data-components.md +158 -0
  18. package/docs/features/sd-tiptap-editor.md +26 -0
  19. package/docs/{pipes.md → pipes/format-pipe.md} +14 -5
  20. package/docs/plugins/sd-global-error-handler.md +23 -0
  21. package/docs/{plugins.md → plugins/sd-option-event-plugin.md} +9 -12
  22. package/docs/provider-types/sd-menu.md +65 -0
  23. package/docs/provider-types/sd-modal-content-def.md +148 -0
  24. package/docs/provider-types/sd-toast-content-def.md +73 -0
  25. package/docs/provider-types/shared-data-base.md +59 -0
  26. package/docs/providers/sd-activated-modal-provider.md +34 -0
  27. package/docs/providers/sd-app-structure-provider.md +81 -0
  28. package/docs/providers/sd-busy-provider.md +18 -0
  29. package/docs/providers/sd-file-dialog-provider.md +40 -0
  30. package/docs/providers/sd-local-storage-provider.md +20 -0
  31. package/docs/providers/sd-modal-provider.md +67 -0
  32. package/docs/providers/sd-navigate-window-provider.md +18 -0
  33. package/docs/providers/sd-print-provider.md +25 -0
  34. package/docs/providers/sd-service-client-factory-provider.md +43 -0
  35. package/docs/providers/sd-shared-data-provider.md +64 -0
  36. package/docs/providers/sd-system-config-provider.md +46 -0
  37. package/docs/providers/sd-system-log-provider.md +18 -0
  38. package/docs/providers/sd-theme-provider.md +38 -0
  39. package/docs/providers/sd-toast-provider.md +65 -0
  40. package/docs/recipes/_common-rules.md +244 -0
  41. package/docs/recipes/crud-detail/extension-a-edit-save.md +230 -0
  42. package/docs/recipes/crud-detail/extension-b-delete-restore.md +142 -0
  43. package/docs/recipes/crud-detail/extension-c-modal-view.md +214 -0
  44. package/docs/recipes/crud-detail/extension-d-control-view.md +103 -0
  45. package/docs/recipes/crud-detail/extension-e-auxiliary.md +87 -0
  46. package/docs/recipes/crud-detail/extension-f-complex-detail.md +234 -0
  47. package/docs/recipes/crud-detail.md +184 -706
  48. package/docs/recipes/crud-list/extension-a-inline-edit.md +410 -0
  49. package/docs/recipes/crud-list/extension-b-selection.md +226 -0
  50. package/docs/recipes/crud-list/extension-c-inline-delete.md +87 -0
  51. package/docs/recipes/crud-list/extension-d-select-modal.md +207 -0
  52. package/docs/recipes/crud-list/extension-e-readonly-modal.md +165 -0
  53. package/docs/recipes/crud-list/extension-f-modal-edit.md +177 -0
  54. package/docs/recipes/crud-list/extension-g-excel.md +157 -0
  55. package/docs/recipes/crud-list.md +196 -787
  56. package/docs/recipes/data-select-button.md +185 -91
  57. package/docs/recipes/page-modal-container.md +168 -86
  58. package/docs/styling/classes.md +149 -0
  59. package/docs/styling/mixins.md +100 -0
  60. package/docs/styling/themes.md +35 -0
  61. package/docs/styling/variables.md +147 -0
  62. package/docs/{type-utilities.md → type-utilities/directive-input-signals.md} +17 -35
  63. package/docs/ui-data/sd-list.md +37 -0
  64. package/docs/ui-data/sd-sheet.md +227 -0
  65. package/docs/ui-form/sd-additional-button.md +26 -0
  66. package/docs/ui-form/sd-anchor.md +31 -0
  67. package/docs/ui-form/sd-button.md +105 -0
  68. package/docs/ui-form/sd-checkbox-group.md +39 -0
  69. package/docs/ui-form/sd-checkbox.md +81 -0
  70. package/docs/ui-form/sd-date-range-picker.md +27 -0
  71. package/docs/ui-form/sd-form.md +89 -0
  72. package/docs/ui-form/sd-modal-select-button.md +54 -0
  73. package/docs/ui-form/sd-numpad.md +26 -0
  74. package/docs/ui-form/sd-range.md +26 -0
  75. package/docs/ui-form/sd-select.md +68 -0
  76. package/docs/ui-form/sd-shared-data-select.md +52 -0
  77. package/docs/ui-form/sd-state-preset.md +37 -0
  78. package/docs/ui-form/sd-switch.md +27 -0
  79. package/docs/ui-form/sd-textarea.md +33 -0
  80. package/docs/ui-form/sd-textfield.md +145 -0
  81. package/docs/ui-layout/sd-dock-container.md +64 -0
  82. package/docs/ui-layout/sd-dock.md +37 -0
  83. package/docs/ui-layout/sd-gap.md +26 -0
  84. package/docs/{ui-layout.md → ui-layout/sd-kanban-board.md} +41 -85
  85. package/docs/ui-layout/sd-kanban-lane.md +34 -0
  86. package/docs/ui-layout/sd-kanban.md +29 -0
  87. package/docs/ui-navigation/sd-collapse.md +35 -0
  88. package/docs/ui-navigation/sd-pagination.md +26 -0
  89. package/docs/ui-navigation/sd-sidebar-container.md +49 -0
  90. package/docs/ui-navigation/sd-sidebar-menu.md +22 -0
  91. package/docs/ui-navigation/sd-sidebar-user.md +43 -0
  92. package/docs/ui-navigation/sd-tab.md +51 -0
  93. package/docs/ui-navigation/sd-topbar-container.md +97 -0
  94. package/docs/ui-navigation/sd-topbar-menu.md +23 -0
  95. package/docs/ui-navigation/sd-topbar-user.md +38 -0
  96. package/docs/ui-navigation/sd-topbar.md +30 -0
  97. package/docs/ui-overlay/sd-busy-container.md +69 -0
  98. package/docs/ui-overlay/sd-confirm-modal.md +30 -0
  99. package/docs/ui-overlay/sd-dropdown.md +40 -0
  100. package/docs/ui-overlay/sd-modal.md +34 -0
  101. package/docs/ui-overlay/sd-prompt-modal.md +30 -0
  102. package/docs/ui-overlay/sd-toast.md +35 -0
  103. package/docs/ui-visual/sd-barcode.md +36 -0
  104. package/docs/ui-visual/sd-calendar.md +34 -0
  105. package/docs/ui-visual/sd-echarts.md +32 -0
  106. package/docs/ui-visual/sd-label.md +24 -0
  107. package/docs/ui-visual/sd-note.md +23 -0
  108. package/docs/ui-visual/sd-progress.md +23 -0
  109. package/docs/utils/inject-routing-signals.md +161 -0
  110. package/docs/utils/inject-sd-system-config-resource.md +35 -0
  111. package/docs/utils/mark.md +43 -0
  112. package/docs/utils/selection-managers.md +96 -0
  113. package/docs/utils/set-safe-style.md +19 -0
  114. package/docs/utils/setup-functions.md +93 -0
  115. package/package.json +5 -5
  116. package/src/controls/select/sd-select.ts +3 -3
  117. package/src/core/modal/sd-modal.provider.ts +1 -1
  118. package/src/core/modal/sd-modal.ts +1 -1
  119. package/src/core/routing/menu-utils.ts +1 -1
  120. package/src/core/shared-data/sd-shared-data.provider.ts +7 -7
  121. package/src/data/shared-data/sd-shared-data-select.ts +2 -2
  122. package/src/layout/dock/sd-dock-container.ts +1 -1
  123. package/docs/bootstrap.md +0 -38
  124. package/docs/directives.md +0 -236
  125. package/docs/features.md +0 -154
  126. package/docs/provider-types.md +0 -283
  127. package/docs/providers.md +0 -379
  128. package/docs/styling.md +0 -222
  129. package/docs/ui-data.md +0 -333
  130. package/docs/ui-form.md +0 -502
  131. package/docs/ui-navigation.md +0 -303
  132. package/docs/ui-overlay.md +0 -157
  133. package/docs/ui-visual.md +0 -127
  134. package/docs/utils.md +0 -244
package/docs/ui-form.md DELETED
@@ -1,502 +0,0 @@
1
- # UI - Form
2
-
3
- ## Buttons
4
-
5
- ### `SdButton`
6
-
7
- 버튼 컴포넌트.
8
-
9
- ```typescript
10
- @Component({ selector: "sd-button" })
11
- class SdButton {
12
- type = input<"button" | "submit">("button");
13
- theme = input<"primary" | "secondary" | "info" | ... | "link" | "link-primary" | ... | "link-rev">();
14
- inline = input(false, { transform: booleanAttribute });
15
- inset = input(false, { transform: booleanAttribute });
16
- size = input<"sm" | "lg">();
17
- disabled = input(false, { transform: booleanAttribute });
18
- buttonStyle = input<string>();
19
- buttonClass = input<string>();
20
- }
21
- ```
22
-
23
- | Input | Type | Default | Description |
24
- |-------|------|---------|-------------|
25
- | `type` | `"button" \| "submit"` | `"button"` | 버튼 HTML 타입 |
26
- | `theme` | `string \| undefined` | `undefined` | 테마 (primary, secondary, info, success, warning, danger, gray, blue-gray, link, link-primary, link-secondary, link-info, link-success, link-warning, link-danger, link-gray, link-blue-gray, link-rev) |
27
- | `inline` | `boolean` | `false` | 인라인 표시 |
28
- | `inset` | `boolean` | `false` | 테두리 없는 삽입 스타일 |
29
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
30
- | `disabled` | `boolean` | `false` | 비활성화 |
31
- | `buttonStyle` | `string \| undefined` | `undefined` | 버튼 인라인 스타일 |
32
- | `buttonClass` | `string \| undefined` | `undefined` | 버튼 CSS 클래스 |
33
-
34
- 호스트 속성: `data-sd-theme`, `data-sd-inline`, `data-sd-size`, `data-sd-inset`, `data-sd-disabled`
35
-
36
- **스타일 적용**: 배경/색상/테두리/패딩 등 시각적 스타일은 내부 `<button>`에 적용되므로 `buttonClass`/`buttonStyle`을 사용한다. 호스트(`<sd-button>`)에 직접 `class`/`style`을 줘도 버튼 외형은 변경되지 않는다.
37
-
38
- ### `SdAnchor`
39
-
40
- 앵커(인라인 버튼) 컴포넌트. 텍스트 내 클릭 가능 요소.
41
-
42
- ```typescript
43
- @Component({ selector: "sd-anchor" })
44
- class SdAnchor {
45
- disabled = input(false, { transform: booleanAttribute });
46
- theme = input<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray">("primary");
47
- }
48
- ```
49
-
50
- | Input | Type | Default | Description |
51
- |-------|------|---------|-------------|
52
- | `disabled` | `boolean` | `false` | 비활성화 |
53
- | `theme` | `string` | `"primary"` | 테마 색상 |
54
-
55
- ### `SdAdditionalButton`
56
-
57
- 추가 동작 버튼. 드롭다운 포함.
58
-
59
- ```typescript
60
- @Component({ selector: "sd-additional-button" })
61
- class SdAdditionalButton {
62
- size = input<"sm" | "lg">();
63
- inset = input(false, { transform: booleanAttribute });
64
- }
65
- ```
66
-
67
- ### `SdModalSelectButton`
68
-
69
- 모달을 열어 선택하는 버튼 컴포넌트. 선택/지우기 버튼과 값 표시 영역으로 구성.
70
-
71
- ```typescript
72
- @Component({ selector: "sd-modal-select-button" })
73
- class SdModalSelectButton<T extends object, K, M extends keyof SelectModeValue<K>> {
74
- modal = input.required<SdSelectModalInfo<SdSelectModal<T>>>();
75
- value = model<SelectModeValue<K>[M]>();
76
- selectedItems = model<T[]>([]);
77
- disabled = input(false, { transform: booleanAttribute });
78
- required = input(false, { transform: booleanAttribute });
79
- inset = input(false, { transform: booleanAttribute });
80
- size = input<"sm" | "lg">();
81
- selectMode = input<M>("single" as M);
82
- modalOptions = input<SdModalOptions>();
83
- searchIcon = input(tablerSearch);
84
- }
85
- ```
86
-
87
- | Input | Type | Default | Description |
88
- |-------|------|---------|-------------|
89
- | `modal` | `SdSelectModalInfo<...>` | required | 모달 정보 |
90
- | `value` | `SelectModeValue<K>[M]` | - | 선택된 값 (two-way) |
91
- | `selectedItems` | `T[]` | `[]` | 선택된 항목 객체 배열 (two-way) |
92
- | `disabled` | `boolean` | `false` | 비활성화 |
93
- | `required` | `boolean` | `false` | 필수 (지우기 버튼 숨김) |
94
- | `inset` | `boolean` | `false` | 삽입 스타일 |
95
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
96
- | `selectMode` | `M` | `"single"` | 선택 모드 |
97
- | `modalOptions` | `SdModalOptions \| undefined` | `undefined` | 모달 옵션 |
98
- | `searchIcon` | `string` | `tablerSearch` | 검색 아이콘 |
99
-
100
- ## Inputs
101
-
102
- ### `SdTextfield`
103
-
104
- 텍스트 입력 컴포넌트. 13가지 타입을 지원한다.
105
-
106
- ```typescript
107
- @Component({ selector: "sd-textfield" })
108
- class SdTextfield<K extends keyof SdTextfieldTypes> {
109
- value = model<SdTextfieldTypes[K]>();
110
- type = input.required<K>();
111
- placeholder = input<string>();
112
- title = input<string>();
113
- inputStyle = input<string>();
114
- inputClass = input<string>();
115
- disabled = input(false, { transform: booleanAttribute });
116
- readonly = input(false, { transform: booleanAttribute });
117
- required = input(false, { transform: booleanAttribute });
118
- min = input<SdTextfieldTypes[K]>();
119
- max = input<SdTextfieldTypes[K]>();
120
- minlength = input<number>();
121
- maxlength = input<number>();
122
- pattern = input<string>();
123
- validatorFn = input<(value: SdTextfieldTypes[K] | undefined) => string | undefined>();
124
- format = input<string>();
125
- step = input<number>();
126
- autocomplete = input<string>();
127
- useNumberComma = input(true, { transform: booleanAttribute });
128
- minDigits = input<number>();
129
- inline = input(false, { transform: booleanAttribute });
130
- inset = input(false, { transform: booleanAttribute });
131
- size = input<"sm" | "lg">();
132
- theme = input<string>();
133
- }
134
- ```
135
-
136
- | Input | Type | Default | Description |
137
- |-------|------|---------|-------------|
138
- | `type` | `keyof SdTextfieldTypes` | required | 입력 타입 (number, text, password, color, email, format, date, month, year, datetime, datetime-sec, time, time-sec) |
139
- | `value` | `SdTextfieldTypes[K] \| undefined` | - | 값 (two-way) |
140
- | `placeholder` | `string \| undefined` | `undefined` | 플레이스홀더 |
141
- | `title` | `string \| undefined` | `undefined` | title 속성 (없으면 placeholder 사용) |
142
- | `inputStyle` | `string \| undefined` | `undefined` | input 인라인 스타일 |
143
- | `inputClass` | `string \| undefined` | `undefined` | input CSS 클래스 |
144
- | `disabled` | `boolean` | `false` | 비활성화 |
145
- | `readonly` | `boolean` | `false` | 읽기 전용 |
146
- | `required` | `boolean` | `false` | 필수 |
147
- | `min` | `SdTextfieldTypes[K] \| undefined` | `undefined` | 최소값 |
148
- | `max` | `SdTextfieldTypes[K] \| undefined` | `undefined` | 최대값 |
149
- | `minlength` | `number \| undefined` | `undefined` | 최소 길이 |
150
- | `maxlength` | `number \| undefined` | `undefined` | 최대 길이 |
151
- | `pattern` | `string \| undefined` | `undefined` | 입력 패턴 (정규식) |
152
- | `validatorFn` | `((value) => string \| undefined) \| undefined` | `undefined` | 커스텀 유효성 검증 함수 (에러 메시지 반환) |
153
- | `format` | `string \| undefined` | `undefined` | format 타입에서 사용할 포맷 문자열 |
154
- | `step` | `number \| undefined` | `undefined` | 증감 단위 |
155
- | `autocomplete` | `string \| undefined` | `undefined` | autocomplete 속성 |
156
- | `useNumberComma` | `boolean` | `true` | number 타입에서 천 단위 쉼표 사용 |
157
- | `minDigits` | `number \| undefined` | `undefined` | number 타입 최소 자릿수 |
158
- | `inline` | `boolean` | `false` | 인라인 표시 |
159
- | `inset` | `boolean` | `false` | 삽입 스타일 |
160
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
161
- | `theme` | `string \| undefined` | `undefined` | 테마 |
162
-
163
- **스타일 적용**: 배경/테두리/패딩/텍스트 정렬 등 입력 영역 스타일은 내부 `<input>`(및 readonly/disabled 시 표시되는 `._contents`)에 적용되므로 `inputClass`/`inputStyle`을 사용한다. 호스트(`<sd-textfield>`)에 직접 `class`/`style`을 줘도 입력 영역 외형은 변경되지 않는다. 미리 정의된 테마 색상은 `theme` input으로 지정한다.
164
-
165
- ### `SdTextarea`
166
-
167
- 멀티라인 텍스트 입력 컴포넌트.
168
-
169
- ```typescript
170
- @Component({ selector: "sd-textarea" })
171
- class SdTextarea {
172
- value = model<string>();
173
- placeholder = input<string>();
174
- title = input<string>();
175
- minRows = input<number>(1);
176
- disabled = input(false, { transform: booleanAttribute });
177
- readonly = input(false, { transform: booleanAttribute });
178
- required = input(false, { transform: booleanAttribute });
179
- inline = input(false, { transform: booleanAttribute });
180
- inset = input(false, { transform: booleanAttribute });
181
- size = input<"sm" | "lg">();
182
- validatorFn = input<(value: string | undefined) => string | undefined>();
183
- theme = input<string>();
184
- inputStyle = input<string>();
185
- inputClass = input<string>();
186
- }
187
- ```
188
-
189
- **스타일 적용**: 배경/테두리/패딩 등 입력 영역 스타일은 내부 `<textarea>`(및 readonly/disabled 시 표시되는 `._contents`)에 적용되므로 `inputClass`/`inputStyle`을 사용한다. 호스트(`<sd-textarea>`)에 직접 `class`/`style`을 줘도 입력 영역 외형은 변경되지 않는다. 미리 정의된 테마 색상은 `theme` input으로 지정한다.
190
-
191
- ### `SdNumpad`
192
-
193
- 숫자 패드 컴포넌트.
194
-
195
- ```typescript
196
- @Component({ selector: "sd-numpad" })
197
- class SdNumpad {
198
- placeholder = input<string>();
199
- value = model<number>();
200
- required = input(false, { transform: booleanAttribute });
201
- inputDisabled = input(false, { transform: booleanAttribute });
202
- useEnterButton = input(false, { transform: booleanAttribute });
203
- useMinusButton = input(false, { transform: booleanAttribute });
204
-
205
- enterButtonClick = output();
206
- }
207
- ```
208
-
209
- | Input | Type | Default | Description |
210
- |-------|------|---------|-------------|
211
- | `placeholder` | `string \| undefined` | `undefined` | 플레이스홀더 |
212
- | `value` | `number \| undefined` | - | 값 (two-way) |
213
- | `required` | `boolean` | `false` | 필수 |
214
- | `inputDisabled` | `boolean` | `false` | 입력 필드 비활성화 |
215
- | `useEnterButton` | `boolean` | `false` | 엔터 버튼 표시 |
216
- | `useMinusButton` | `boolean` | `false` | 마이너스 버튼 표시 |
217
-
218
- | Output | Type | Description |
219
- |--------|------|-------------|
220
- | `enterButtonClick` | `void` | 엔터 버튼 클릭 시 발생 |
221
-
222
- ### `SdRange`
223
-
224
- 범위 슬라이더 컴포넌트.
225
-
226
- ```typescript
227
- @Component({ selector: "sd-range" })
228
- class SdRange<K extends keyof SdTextfieldTypes> {
229
- type = input.required<K>();
230
- from = model<SdTextfieldTypes[K]>();
231
- to = model<SdTextfieldTypes[K]>();
232
- inputStyle = input<string>();
233
- required = input(false, { transform: booleanAttribute });
234
- disabled = input(false, { transform: booleanAttribute });
235
- }
236
- ```
237
-
238
- **스타일 적용**: 입력 요소 스타일은 내부 `<input>`에 적용되므로 `inputStyle`을 사용한다(클래스 input 없음). 호스트(`<sd-range>`)에 직접 `class`/`style`을 줘도 입력 영역 외형은 변경되지 않는다.
239
-
240
- ### `SdDateRangePicker`
241
-
242
- 날짜 범위 선택기.
243
-
244
- ```typescript
245
- @Component({ selector: "sd-date-range-picker" })
246
- class SdDateRangePicker {
247
- periodType = model<"일" | "월" | "범위">("범위");
248
- from = model<DateOnly>();
249
- to = model<DateOnly>();
250
- required = input(false, { transform: booleanAttribute });
251
- }
252
- ```
253
-
254
- | Input | Type | Default | Description |
255
- |-------|------|---------|-------------|
256
- | `periodType` | `"일" \| "월" \| "범위"` | `"범위"` | 기간 선택 타입 (two-way) |
257
- | `from` | `DateOnly \| undefined` | - | 시작일 (two-way) |
258
- | `to` | `DateOnly \| undefined` | - | 종료일 (two-way) |
259
- | `required` | `boolean` | `false` | 필수 |
260
-
261
- ## Choice
262
-
263
- ### `SdStatePreset`
264
-
265
- 상태 프리셋 저장/불러오기 컴포넌트. 사용자 설정을 저장하고 복원한다.
266
-
267
- ```typescript
268
- @Component({ selector: "sd-state-preset" })
269
- class SdStatePreset {
270
- key = input.required<string>();
271
- state = model<any>();
272
- size = input<"sm" | "lg">();
273
- }
274
- ```
275
-
276
- | Input | Type | Default | Description |
277
- |-------|------|---------|-------------|
278
- | `key` | `string` | required | 프리셋 저장 키 |
279
- | `state` | `any` | - | 상태 데이터 (two-way) |
280
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
281
-
282
- ### `SdStatePresetDef`
283
-
284
- ```typescript
285
- interface SdStatePresetDef {
286
- name: string;
287
- state: any;
288
- }
289
- ```
290
-
291
- | Field | Type | Description |
292
- |-------|------|-------------|
293
- | `name` | `string` | 프리셋 이름 |
294
- | `state` | `any` | 저장된 상태 데이터 |
295
-
296
- ## Checkbox
297
-
298
- ### `SdCheckbox`
299
-
300
- 체크박스 컴포넌트.
301
-
302
- ```typescript
303
- @Component({ selector: "sd-checkbox" })
304
- class SdCheckbox {
305
- value = model(false);
306
- canChangeFn = input<(item: boolean) => boolean | Promise<boolean>>(() => true);
307
- icon = input(tablerCheck);
308
- radio = input(false, { transform: booleanAttribute });
309
- disabled = input(false, { transform: booleanAttribute });
310
- size = input<"sm" | "lg">();
311
- inline = input(false, { transform: booleanAttribute });
312
- inset = input(false, { transform: booleanAttribute });
313
- theme = input<"primary" | "secondary" | ...>();
314
- contentStyle = input<string>();
315
- }
316
- ```
317
-
318
- | Input | Type | Default | Description |
319
- |-------|------|---------|-------------|
320
- | `value` | `boolean` | `false` | 체크 여부 (two-way) |
321
- | `canChangeFn` | `(item: boolean) => boolean \| Promise<boolean>` | `() => true` | 값 변경 가능 여부 함수 |
322
- | `icon` | `string` | `tablerCheck` | 체크 아이콘 |
323
- | `radio` | `boolean` | `false` | 라디오 버튼 스타일 |
324
- | `disabled` | `boolean` | `false` | 비활성화 |
325
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
326
- | `inline` | `boolean` | `false` | 인라인 표시 |
327
- | `inset` | `boolean` | `false` | 삽입 스타일 |
328
- | `theme` | `string \| undefined` | `undefined` | 테마 색상 |
329
- | `contentStyle` | `string \| undefined` | `undefined` | 컨텐츠 인라인 스타일 |
330
-
331
- **스타일 적용**: `contentStyle`은 체크박스 옆 라벨 텍스트(`._contents`) 영역에만 적용된다. 인디케이터 박스의 배경/색상은 `theme` input으로 변경한다(별도 class/style input 없음). 호스트(`<sd-checkbox>`)에 직접 `class`/`style`을 주면 전체 영역 layout/여백 정도만 영향을 주며 인디케이터 외형은 바뀌지 않는다.
332
-
333
- ### `SdSwitch`
334
-
335
- 스위치 토글 컴포넌트.
336
-
337
- ```typescript
338
- @Component({ selector: "sd-switch" })
339
- class SdSwitch {
340
- value = model(false);
341
- canChangeFn = input<(item: boolean) => boolean | Promise<boolean>>(() => true);
342
- disabled = input(false, { transform: booleanAttribute });
343
- inline = input(false, { transform: booleanAttribute });
344
- inset = input(false, { transform: booleanAttribute });
345
- size = input<"sm" | "lg">();
346
- theme = input<string>();
347
- }
348
- ```
349
-
350
- ### `SdCheckboxGroup`
351
-
352
- 체크박스 그룹 컴포넌트.
353
-
354
- ```typescript
355
- @Component({ selector: "sd-checkbox-group" })
356
- class SdCheckboxGroup<T> {
357
- value = model<T[]>([]);
358
- disabled = input(false, { transform: booleanAttribute });
359
- }
360
- ```
361
-
362
- ### `SdCheckboxGroupItem`
363
-
364
- 체크박스 그룹 항목.
365
-
366
- ```typescript
367
- @Component({ selector: "sd-checkbox-group-item" })
368
- class SdCheckboxGroupItem<T> {
369
- value = input.required<T>();
370
- inline = input(false, { transform: booleanAttribute });
371
- }
372
- ```
373
-
374
- ## Editor
375
-
376
- ### `SdTiptapEditor`
377
-
378
- TipTap 기반 리치 텍스트 에디터.
379
-
380
- ```typescript
381
- @Component({ selector: "sd-tiptap-editor" })
382
- class SdTiptapEditor {
383
- value = model<string>();
384
- disabled = input(false, { transform: booleanAttribute });
385
- readonly = input(false, { transform: booleanAttribute });
386
- required = input(false, { transform: booleanAttribute });
387
- placeholder = input<string>();
388
- validatorFn = input<(value: string | undefined) => string | undefined>();
389
- extensions = input<AnyExtension[]>();
390
- }
391
- ```
392
-
393
- | Input | Type | Default | Description |
394
- |-------|------|---------|-------------|
395
- | `value` | `string \| undefined` | - | HTML 콘텐츠 (two-way) |
396
- | `disabled` | `boolean` | `false` | 비활성화 |
397
- | `readonly` | `boolean` | `false` | 읽기 전용 |
398
- | `required` | `boolean` | `false` | 필수 |
399
- | `placeholder` | `string \| undefined` | `undefined` | 플레이스홀더 |
400
- | `validatorFn` | `((value) => string \| undefined) \| undefined` | `undefined` | 커스텀 유효성 검증 함수 |
401
- | `extensions` | `AnyExtension[] \| undefined` | `undefined` | 추가 TipTap 확장 |
402
-
403
- ## Select
404
-
405
- ### `SdSelect`
406
-
407
- 드롭다운 선택 컴포넌트. single/multi 모드를 지원한다.
408
-
409
- ```typescript
410
- @Component({ selector: "sd-select" })
411
- class SdSelect<T, M extends keyof SelectModeValue<T>> {
412
- selectMode = input("single" as M);
413
- value = model<SelectModeValue<any>[M]>();
414
- placeholder = input<string>();
415
- disabled = input(false, { transform: booleanAttribute });
416
- inline = input(false, { transform: booleanAttribute });
417
- inset = input(false, { transform: booleanAttribute });
418
- size = input<"sm" | "lg">();
419
- required = input(false, { transform: booleanAttribute });
420
- hideSelectAll = input(false, { transform: booleanAttribute });
421
- multiSelectionDisplayDirection = input<"vertical">();
422
- items = input<T[]>();
423
- getChildrenFn = input<(item: T) => T[] | undefined>();
424
- contentClass = input<string>();
425
- contentStyle = input<string>();
426
- }
427
- ```
428
-
429
- | Input | Type | Default | Description |
430
- |-------|------|---------|-------------|
431
- | `selectMode` | `M` | `"single"` | 선택 모드 |
432
- | `value` | `SelectModeValue<any>[M]` | - | 선택된 값 (two-way) |
433
- | `placeholder` | `string \| undefined` | `undefined` | 플레이스홀더 |
434
- | `disabled` | `boolean` | `false` | 비활성화 |
435
- | `inline` | `boolean` | `false` | 인라인 표시 |
436
- | `inset` | `boolean` | `false` | 삽입 스타일 |
437
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
438
- | `required` | `boolean` | `false` | 필수 |
439
- | `hideSelectAll` | `boolean` | `false` | multi 모드에서 전체 선택 숨김 |
440
- | `multiSelectionDisplayDirection` | `"vertical" \| undefined` | `undefined` | multi 모드 표시 방향 |
441
- | `items` | `T[] \| undefined` | `undefined` | 항목 배열 (selectMode가 "multi"일 때 내부 목록 렌더링용) |
442
- | `getChildrenFn` | `((item) => T[] \| undefined) \| undefined` | `undefined` | 트리 구조 자식 함수 |
443
- | `contentClass` | `string \| undefined` | `undefined` | 선택값이 표시되는 영역에 추가할 CSS 클래스 |
444
- | `contentStyle` | `string \| undefined` | `undefined` | 선택값이 표시되는 영역에 적용할 인라인 스타일 |
445
-
446
- **스타일 적용**: `contentClass`/`contentStyle`은 트리거 영역(선택값 텍스트와 드롭다운 화살표가 함께 놓인 박스)에만 적용된다. 드롭다운으로 펼쳐지는 팝업 영역은 이 input으로 스타일링할 수 없다. 호스트(`<sd-select>`)에 직접 `class`/`style`을 주면 전체 영역 layout/여백/너비 정도에만 영향을 준다.
447
-
448
- ### `SelectModeValue`
449
-
450
- ```typescript
451
- type SelectModeValue<T> = {
452
- multi: T[];
453
- single: T;
454
- }
455
- ```
456
-
457
- ### `SdSelectItem`
458
-
459
- 드롭다운 선택 항목.
460
-
461
- ```typescript
462
- @Component({ selector: "sd-select-item" })
463
- class SdSelectItem<T> {
464
- value = input.required<T>();
465
- disabled = input(false, { transform: booleanAttribute });
466
- hidden = input(false, { transform: booleanAttribute });
467
- }
468
- ```
469
-
470
- ### `SdSelectButton`
471
-
472
- 버튼 스타일 선택 컴포넌트.
473
-
474
- ```typescript
475
- @Component({ selector: "sd-select-button" })
476
- class SdSelectButton<T> { }
477
- ```
478
-
479
- ## Form
480
-
481
- ### `SdForm`
482
-
483
- 폼 래퍼 컴포넌트. `<form>` 태그를 렌더링하며 submit 이벤트 처리 및 유효성 검증을 수행한다.
484
-
485
- ```typescript
486
- @Component({ selector: "sd-form" })
487
- class SdForm {
488
- formSubmit = output<SubmitEvent>();
489
- formInvalid = output();
490
-
491
- requestSubmit(): void;
492
- }
493
- ```
494
-
495
- | Output | Type | Description |
496
- |--------|------|-------------|
497
- | `formSubmit` | `SubmitEvent` | 유효성 검증 통과 시 발생 |
498
- | `formInvalid` | `void` | 유효성 검증 실패 시 발생 (`reportValidity()` 호출 후) |
499
-
500
- | Method | Description |
501
- |--------|-------------|
502
- | `requestSubmit()` | 프로그래밍 방식으로 submit 트리거 |