@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
@@ -0,0 +1,147 @@
1
+ # CSS Custom Properties
2
+
3
+ `:root`에 선언되는 CSS 커스텀 프로퍼티. SCSS `$vars` 맵에서 `mixins.writeVars()`로 생성된다.
4
+
5
+ ## Theme Colors
6
+
7
+ OKLCH 기반 17+5 색상 팔레트. 각 테마 그룹에 7단계 shade가 존재한다.
8
+
9
+ **테마 그룹**: gray, blue-gray, primary, secondary, info, success, warning, danger
10
+
11
+ **Shade 단계**: lightest (+90%), lighter (+75%), light (+60%), default, dark (-10%), darker (-25%), darkest (-40%)
12
+
13
+ | Property Pattern | Description |
14
+ |------------------|-------------|
15
+ | `--theme-{group}-lightest` | 가장 밝은 단계 |
16
+ | `--theme-{group}-lighter` | 밝은 단계 |
17
+ | `--theme-{group}-light` | 약간 밝은 단계 |
18
+ | `--theme-{group}-default` | 기본 단계 |
19
+ | `--theme-{group}-dark` | 약간 어두운 단계 |
20
+ | `--theme-{group}-darker` | 어두운 단계 |
21
+ | `--theme-{group}-darkest` | 가장 어두운 단계 |
22
+
23
+ **기본 색상 매핑** (OKLCH):
24
+
25
+ | Theme Group | Base Color |
26
+ |-------------|------------|
27
+ | gray | `oklch(0.707 0.022 261.325)` (gray) |
28
+ | blue-gray | `oklch(0.704 0.04 256.788)` (slate) |
29
+ | primary | `oklch(0.707 0.165 254.624)` (blue) |
30
+ | secondary | `oklch(0.707 0.165 254.624)` (blue) |
31
+ | info | `oklch(0.789 0.154 211.53)` (cyan) |
32
+ | success | `oklch(0.841 0.238 128.85)` (lime) |
33
+ | warning | `oklch(0.75 0.183 55.934)` (orange) |
34
+ | danger | `oklch(0.704 0.191 22.216)` (red) |
35
+
36
+ ## Transparency
37
+
38
+ | Property | Default | Description |
39
+ |----------|---------|-------------|
40
+ | `--trans-darkest` | `rgba(0, 0, 0, 0.5)` | 가장 어두운 투명 |
41
+ | `--trans-darker` | `rgba(0, 0, 0, 0.4)` | |
42
+ | `--trans-dark` | `rgba(0, 0, 0, 0.3)` | |
43
+ | `--trans-default` | `rgba(0, 0, 0, 0.2)` | |
44
+ | `--trans-light` | `rgba(0, 0, 0, 0.1)` | |
45
+ | `--trans-lighter` | `rgba(0, 0, 0, 0.05)` | |
46
+ | `--trans-lightest` | `rgba(0, 0, 0, 0.03)` | |
47
+ | `--trans-rev-default` | `rgba(255, 255, 255, 0.1)` | 역방향 투명 |
48
+ | `--trans-rev-light` | `rgba(255, 255, 255, 0.2)` | |
49
+ | `--trans-rev-lighter` | `rgba(255, 255, 255, 0.3)` | |
50
+ | `--trans-rev-lightest` | `rgba(255, 255, 255, 0.4)` | |
51
+
52
+ ## Text Colors
53
+
54
+ | Property | Default | Description |
55
+ |----------|---------|-------------|
56
+ | `--text-trans-dark` | `black` | 강조 텍스트 |
57
+ | `--text-trans-default` | `rgba(0, 0, 0, 0.87)` | 기본 텍스트 |
58
+ | `--text-trans-light` | `rgba(0, 0, 0, 0.6)` | 보조 텍스트 |
59
+ | `--text-trans-lighter` | `rgba(0, 0, 0, 0.38)` | 비활성 텍스트 |
60
+ | `--text-trans-lightest` | `rgba(0, 0, 0, 0.2)` | 최소 텍스트 |
61
+ | `--text-trans-rev-default` | `white` | 역방향 기본 텍스트 |
62
+ | `--text-trans-rev-dark` | `rgba(255, 255, 255, 0.7)` | 역방향 강조 텍스트 |
63
+ | `--text-trans-rev-darker` | `rgba(255, 255, 255, 0.5)` | 역방향 더 강조 |
64
+
65
+ ## Font Size
66
+
67
+ | Property | Default | Description |
68
+ |----------|---------|-------------|
69
+ | `--font-size-h1` | `2rem` | h1 |
70
+ | `--font-size-h2` | `1.5rem` | h2 |
71
+ | `--font-size-h3` | `1.3333rem` | h3 |
72
+ | `--font-size-h4` | `1.1667rem` | h4 |
73
+ | `--font-size-h5` | `1rem` | h5 |
74
+ | `--font-size-h6` | `0.9167rem` | h6 |
75
+ | `--font-size-lg` | `1.1667rem` | 큰 폰트 |
76
+ | `--font-size-default` | `1rem` | 기본 폰트 |
77
+ | `--font-size-sm` | `0.9167rem` | 작은 폰트 |
78
+
79
+ ## Gap (Spacing)
80
+
81
+ | Property | Default | Description |
82
+ |----------|---------|-------------|
83
+ | `--gap-xxs` | `0.0833rem` | 초소형 |
84
+ | `--gap-xs` | `0.1667rem` | 소형 |
85
+ | `--gap-sm` | `0.3333rem` | 중소형 |
86
+ | `--gap-default` | `0.5rem` | 기본 |
87
+ | `--gap-lg` | `0.6667rem` | 중대형 |
88
+ | `--gap-xl` | `1rem` | 대형 |
89
+ | `--gap-xxl` | `1.5rem` | 초대형 |
90
+ | `--gap-0` | `0` | 없음 |
91
+ | `--gap-auto` | `auto` | 자동 |
92
+
93
+ ## Border
94
+
95
+ | Property | Default | Description |
96
+ |----------|---------|-------------|
97
+ | `--border-color-lighter` | `var(--theme-gray-lightest)` | 가장 밝은 border |
98
+ | `--border-color-light` | `var(--theme-gray-lighter)` | 밝은 border |
99
+ | `--border-color-default` | `var(--theme-gray-light)` | 기본 border |
100
+ | `--border-color-dark` | `var(--theme-gray-default)` | 어두운 border |
101
+ | `--border-color-darker` | `var(--theme-gray-dark)` | 가장 어두운 border |
102
+ | `--border-radius-xs` | `var(--gap-xxs)` | |
103
+ | `--border-radius-sm` | `var(--gap-xs)` | |
104
+ | `--border-radius-default` | `var(--gap-sm)` | |
105
+ | `--border-radius-lg` | `var(--gap-default)` | |
106
+ | `--border-radius-xl` | `var(--gap-lg)` | |
107
+ | `--border-radius-xxl` | `var(--gap-xl)` | |
108
+
109
+ ## Layout & Z-Index
110
+
111
+ | Property | Default | Description |
112
+ |----------|---------|-------------|
113
+ | `--line-height` | `1.5em` | 기본 line-height |
114
+ | `--font-family` | `sans-serif` | 기본 폰트 패밀리 |
115
+ | `--font-family-monospace` | `monospace` | 코드 폰트 패밀리 |
116
+ | `--background-color` | `white` | 페이지 배경색 |
117
+ | `--background-rev-color` | `black` | 역방향 배경색 |
118
+ | `--control-color` | `white` | 컨트롤 배경색 |
119
+ | `--busy-overlay-bg` | `rgba(255, 255, 255, 0.6)` | busy 오버레이 배경 |
120
+ | `--animation-duration` | `0.2s` | 애니메이션 지속 시간 |
121
+ | `--elevation-size` | `0.0833rem` | elevation 단위 |
122
+ | `--sidebar-width` | `15em` | 사이드바 너비 |
123
+ | `--topbar-height` | `3em` | 탑바 높이 |
124
+ | `--z-index-toast` | `9999` | 토스트 z-index |
125
+ | `--z-index-busy` | `9998` | busy z-index |
126
+ | `--z-index-dropdown` | `5000` | 드롭다운 z-index |
127
+ | `--z-index-modal` | `4000` | 모달 z-index |
128
+ | `--z-index-sidebar` | `3000` | 사이드바 z-index |
129
+
130
+ ## Sheet
131
+
132
+ | Property | Default | Description |
133
+ |----------|---------|-------------|
134
+ | `--sheet-pv` | `var(--gap-xs)` | 시트 셀 수직 padding |
135
+ | `--sheet-ph` | `var(--gap-sm)` | 시트 셀 수평 padding |
136
+ | `--sheet-bg` | `var(--theme-gray-lightest)` | 시트 배경색 |
137
+
138
+ ## Breakpoints (SCSS 전용)
139
+
140
+ CSS 커스텀 프로퍼티가 아닌 SCSS 변수. media query에서 사용된다.
141
+
142
+ | Variable | Value | Description |
143
+ |----------|-------|-------------|
144
+ | `$breakpoint-mobile` | `520px` | 모바일 |
145
+ | `$breakpoint-xxs` | `800px` | 초소형 |
146
+ | `$breakpoint-xs` | `1024px` | 소형 |
147
+ | `$breakpoint-sm` | `1280px` | 중소형 |
@@ -1,5 +1,7 @@
1
1
  # Type Utilities
2
2
 
3
+ 컴포넌트/디렉티브 입력 시그널 타입 추출 유틸리티 모음.
4
+
3
5
  ## `DirectiveInputSignals`
4
6
 
5
7
  컴포넌트/디렉티브의 InputSignal 프로퍼티에서 값 타입을 추출하는 유틸리티 타입. InputSignal이 아닌 프로퍼티는 제외되며, undefined를 포함하는 필드는 optional로 변환된다.
@@ -10,7 +12,8 @@ type DirectiveInputSignals<T> = UndefToOptional<{
10
12
  }>
11
13
  ```
12
14
 
13
- 예시:
15
+ ### 예시
16
+
14
17
  ```typescript
15
18
  class MyComponent {
16
19
  name = input.required<string>();
@@ -31,7 +34,7 @@ type UndefToOptional<T> = {
31
34
  }
32
35
  ```
33
36
 
34
- 예시: `{ name: string; age: number | undefined }` -> `{ name: string; age?: number }`
37
+ 예시: `{ name: string; age: number | undefined }` `{ name: string; age?: number }`
35
38
 
36
39
  ## `WithOptional`
37
40
 
@@ -62,7 +65,7 @@ interface SortingDef {
62
65
 
63
66
  | Field | Type | Description |
64
67
  |-------|------|-------------|
65
- | `key` | `string` | 정렬 키. **컬럼 `key`가 `"vendor.name"`, `"lot.goods.code"` 같은 체인 경로일 수 있다.** 따라서 `item[key]` 단순 접근 대신 `obj.getChainValue(item, key)` (from `@simplysm/core-common`) 사용해 체인을 따라 값을 조회해야 한다 |
68
+ | `key` | `string` | 정렬 키. **컬럼 `key`가 `"vendor.name"`, `"lot.goods.code"` 같은 체인 경로일 수 있다.** 정렬 처리 시 `item[key]` 단순 접근 대신 `obj.getChainValue(item, key)` (from `@simplysm/core-common`) 사용해야 한다 |
66
69
  | `desc` | `boolean` | 내림차순 여부 |
67
70
 
68
71
  ## `ExpandItemDef`
@@ -85,25 +88,6 @@ interface ExpandItemDef<T> {
85
88
  | `hasChildren` | `boolean` | 자식 존재 여부 |
86
89
  | `depth` | `number` | 깊이 |
87
90
 
88
- ## `SdSelectModal`
89
-
90
- 모달 선택 컴포넌트가 구현해야 하는 인터페이스. `SdModalContentDef`를 확장.
91
-
92
- ```typescript
93
- interface SdSelectModal<T> extends SdModalContentDef<SelectModalOutputResult<T>> {
94
- selectMode: InputSignal<"single" | "multi" | undefined>;
95
- selectedItemKeys: InputSignal<any[]>;
96
- }
97
- ```
98
-
99
- ## `SdSelectModalInfo`
100
-
101
- 모달 선택 정보. `SdModalInfo`에서 selectMode/selectedItemKeys를 제외.
102
-
103
- ```typescript
104
- type SdSelectModalInfo<T extends SdSelectModal<any>> = SdModalInfo<T, "selectMode" | "selectedItemKeys">
105
- ```
106
-
107
91
  ## `SdTextfieldTypes`
108
92
 
109
93
  텍스트필드 타입별 값 타입 매핑.
@@ -139,7 +123,7 @@ const sdTextfieldTypes: (keyof SdTextfieldTypes)[] = [
139
123
 
140
124
  ## `SelectModeValue`
141
125
 
142
- select mode별 value 타입 매핑. `SdSelect`에서 export됨.
126
+ select mode별 value 타입 매핑.
143
127
 
144
128
  ```typescript
145
129
  type SelectModeValue<T> = {
@@ -150,7 +134,7 @@ type SelectModeValue<T> = {
150
134
 
151
135
  ## `SdSidebarUserMenu`
152
136
 
153
- 사이드바 사용자 메뉴 항목. `SdSidebarUser`에서 export됨.
137
+ 사이드바 사용자 메뉴 항목.
154
138
 
155
139
  ```typescript
156
140
  interface SdSidebarUserMenu {
@@ -169,7 +153,7 @@ interface SdSidebarUserMenu {
169
153
 
170
154
  ## `SdTopbarUserMenu`
171
155
 
172
- 탑바 사용자 메뉴 항목. `SdTopbarUser`에서 export됨.
156
+ 탑바 사용자 메뉴 항목.
173
157
 
174
158
  ```typescript
175
159
  interface SdTopbarUserMenu {
@@ -185,7 +169,7 @@ interface SdTopbarUserMenu {
185
169
 
186
170
  ## `SdStatePresetDef`
187
171
 
188
- 상태 프리셋 데이터. `SdStatePreset`에서 export됨.
172
+ 상태 프리셋 데이터.
189
173
 
190
174
  ```typescript
191
175
  interface SdStatePresetDef {
@@ -199,9 +183,11 @@ interface SdStatePresetDef {
199
183
  | `name` | `string` | 프리셋 이름 |
200
184
  | `state` | `any` | 저장된 상태 데이터 |
201
185
 
202
- ## `SdKanbanBoardDropInfo`
186
+ ## Kanban Types
187
+
188
+ ### `SdKanbanBoardDropInfo`
203
189
 
204
- 칸반 보드 드롭 정보. `SdKanbanBoard`에서 export됨.
190
+ 칸반 보드 드롭 정보.
205
191
 
206
192
  ```typescript
207
193
  interface SdKanbanBoardDropInfo<L, T> {
@@ -215,11 +201,9 @@ interface SdKanbanBoardDropInfo<L, T> {
215
201
  |-------|------|-------------|
216
202
  | `sourceKanbanValue` | `T \| undefined` | 드래그한 칸반 아이템의 값 |
217
203
  | `targetLaneValue` | `L \| undefined` | 드롭 대상 레인의 값 |
218
- | `targetKanbanValue` | `T \| undefined` | 드롭 대상 칸반 아이템의 값 (칸반 위에 드롭 시) |
204
+ | `targetKanbanValue` | `T \| undefined` | 드롭 대상 칸반 아이템의 값 |
219
205
 
220
- ## `SdKanbanDragRef`
221
-
222
- 칸반 드래그 참조 인터페이스. `SdKanbanBoard`에서 export됨.
206
+ ### `SdKanbanDragRef`
223
207
 
224
208
  ```typescript
225
209
  interface SdKanbanDragRef<_L, T> {
@@ -233,9 +217,7 @@ interface SdKanbanDragRef<_L, T> {
233
217
  | `value()` | `T \| undefined` | 드래그 중인 칸반 아이템의 값 |
234
218
  | `heightOnDrag()` | `number` | 드래그 시작 시점의 요소 높이 |
235
219
 
236
- ## `SdKanbanDropTarget`
237
-
238
- 칸반 드롭 타겟 인터페이스. `SdKanbanBoard`에서 export됨.
220
+ ### `SdKanbanDropTarget`
239
221
 
240
222
  ```typescript
241
223
  interface SdKanbanDropTarget<L, T> {
@@ -0,0 +1,37 @@
1
+ # `SdList`
2
+
3
+ 리스트 컴포넌트.
4
+
5
+ ```typescript
6
+ @Component({ selector: "sd-list" })
7
+ class SdList {
8
+ inset = input(false, { transform: booleanAttribute });
9
+ }
10
+ ```
11
+
12
+ ## Members
13
+
14
+ | Member | Kind | Type | Default | Description |
15
+ |--------|------|------|---------|-------------|
16
+ | `inset` | input | `boolean` | `false` | 삽입 스타일 (테두리 없음) |
17
+
18
+ ## Related Types
19
+
20
+ ### `SdListItem`
21
+
22
+ 리스트 항목 컴포넌트. 접기/펼치기 자식 리스트를 지원한다.
23
+
24
+ ```typescript
25
+ @Component({ selector: "sd-list-item" })
26
+ class SdListItem {
27
+ open = model(false);
28
+ selected = input(false, { transform: booleanAttribute });
29
+ readonly = input(false, { transform: booleanAttribute });
30
+ }
31
+ ```
32
+
33
+ | Input | Type | Default | Description |
34
+ |-------|------|---------|-------------|
35
+ | `open` | `boolean` | `false` | 자식 리스트 펼침 (two-way) |
36
+ | `selected` | `boolean` | `false` | 선택 상태 |
37
+ | `readonly` | `boolean` | `false` | 읽기 전용 |
@@ -0,0 +1,227 @@
1
+ # `SdSheet`
2
+
3
+ 스프레드시트 컴포넌트. 정렬, 컬럼 고정, 리사이즈, 페이지네이션, 설정 저장을 지원한다.
4
+
5
+ ```typescript
6
+ @Component({ selector: "sd-sheet" })
7
+ class SdSheet<T> {
8
+ key = input<string>();
9
+ items = input<T[]>([]);
10
+ trackByFn = input<(item: T, index: number) => unknown>();
11
+ selectMode = input<"single" | "multi">();
12
+ getItemSelectableFn = input<(item: T) => boolean | string>();
13
+ getChildrenFn = input<(item: T, index: number) => T[] | undefined>();
14
+ useAutoSort = input(false, { transform: booleanAttribute });
15
+ visiblePageCount = input(10);
16
+ totalPageCount = input(0);
17
+ itemsPerPage = input(0);
18
+ inset = input(false, { transform: booleanAttribute });
19
+ hideConfigBar = input(false, { transform: booleanAttribute });
20
+ cumulativeSelection = input(false, { transform: booleanAttribute });
21
+
22
+ itemKeydown = output<SdSheetItemKeydownEventParam<T>>();
23
+ cellKeydown = output<SdSheetCellKeydownEventParam<T>>();
24
+
25
+ selectedItems = model<T[]>([]);
26
+ expandedItems = model<T[]>([]);
27
+ sorts = model<SortingDef[]>([]);
28
+ currentPage = model(0);
29
+ }
30
+ ```
31
+
32
+ ## Members
33
+
34
+ | Member | Kind | Type | Default | Description |
35
+ |--------|------|------|---------|-------------|
36
+ | `key` | input | `string \| undefined` | `undefined` | 설정 저장 키 |
37
+ | `items` | input | `T[]` | `[]` | 표시할 항목 |
38
+ | `trackByFn` | input | `((item, index) => unknown) \| undefined` | `undefined` | 트랙킹 함수 |
39
+ | `selectMode` | input | `"single" \| "multi" \| undefined` | `undefined` | 선택 모드 |
40
+ | `getItemSelectableFn` | input | `((item) => boolean \| string) \| undefined` | `undefined` | 선택 가능 여부 함수. string은 비활성 사유 |
41
+ | `getChildrenFn` | input | `((item, index) => T[] \| undefined) \| undefined` | `undefined` | 트리 구조 자식 반환 함수 |
42
+ | `useAutoSort` | input | `boolean` | `false` | 클라이언트 측 자동 정렬 |
43
+ | `visiblePageCount` | input | `number` | `10` | 한 번에 표시할 페이지 수 |
44
+ | `totalPageCount` | input | `number` | `0` | 총 페이지 수 |
45
+ | `itemsPerPage` | input | `number` | `0` | 페이지당 항목 수 |
46
+ | `inset` | input | `boolean` | `false` | 삽입 스타일 |
47
+ | `hideConfigBar` | input | `boolean` | `false` | 설정 바 숨김 |
48
+ | `cumulativeSelection` | input | `boolean` | `false` | items 변경 시 selectedItems 유지 여부. 다중 페이지 선택 누적에 사용 |
49
+ | `itemKeydown` | output | `SdSheetItemKeydownEventParam<T>` | - | 행 keydown 이벤트 |
50
+ | `cellKeydown` | output | `SdSheetCellKeydownEventParam<T>` | - | 셀 keydown 이벤트 |
51
+ | `selectedItems` | model | `T[]` | `[]` | 선택된 항목 (two-way) |
52
+ | `expandedItems` | model | `T[]` | `[]` | 확장된 항목 (two-way) |
53
+ | `sorts` | model | `SortingDef[]` | `[]` | 정렬 설정 (two-way) |
54
+ | `currentPage` | model | `number` | `0` | 현재 페이지 (two-way) |
55
+
56
+ ### `cumulativeSelection` 사용 패턴
57
+
58
+ - **선택 모달** (다중 페이지 선택 누적) → `true`. 반드시 `trackByFn` 지정 필수
59
+ - **현재 뷰 일괄 작업** (현재 페이지 내 처리) → `false` (기본값)
60
+
61
+ ```html
62
+ <sd-sheet
63
+ [cumulativeSelection]="viewType() === 'modal' && selectMode() === 'multi'"
64
+ [trackByFn]="trackById"
65
+ >
66
+ ```
67
+
68
+ > `SortingDef.key`는 `"vendor.name"` 같은 체인 경로일 수 있다. 정렬 처리 시 `obj.getChainValue(item, sort.key)` (from `@simplysm/core-common`)를 사용한다.
69
+
70
+ ### 실사용 예
71
+
72
+ - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — items·sorts·currentPage·totalPageCount·trackByFn 기본 바인딩
73
+ - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — selectMode·selectedItems·mark 연동
74
+ - [crud-list.md §6 확장 B: 선택 기능 + 선택 삭제/복구](../recipes/crud-list.md#6-확장-b-선택-기능--선택-삭제복구) — selectMode="multi"·selectedItems 바인딩
75
+ - [crud-list.md §8 확장 D: 선택 모달 전환](../recipes/crud-list.md#8-확장-d-선택-모달-전환) — cumulativeSelection·selectMode 조건부 적용
76
+ - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 상세 폼 내부 하위 컬렉션 편집
77
+
78
+ ## Related Types
79
+
80
+ ### `SdSheetColumn`
81
+
82
+ 시트 컬럼 정의 디렉티브.
83
+
84
+ ```typescript
85
+ @Directive({ selector: "sd-sheet-column" })
86
+ class SdSheetColumn<T = unknown> {
87
+ key = input.required<string>();
88
+ header = input<string | string[]>("");
89
+ headerStyle = input<string>();
90
+ tooltip = input<string>();
91
+ width = input<string>();
92
+ fixed = input(false, { transform: booleanAttribute });
93
+ hidden = input(false, { transform: booleanAttribute });
94
+ collapse = input(false, { transform: booleanAttribute });
95
+ disableSorting = input(false, { transform: booleanAttribute });
96
+ disableResizing = input(false, { transform: booleanAttribute });
97
+ ordering = input(0);
98
+ }
99
+ ```
100
+
101
+ Content children: `SdSheetColumnCellTemplate` (required), `#headerTpl`, `#summaryTpl`
102
+
103
+ #### 실사용 예
104
+
105
+ - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — key·header 기본 컬럼 정의
106
+ - [crud-list.md §7 확장 C: inline 삭제 열](../recipes/crud-list.md#7-확장-c-inline-삭제-열) — fixed·hidden·#headerTpl 커스텀 헤더
107
+ - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 하위 컬렉션 컬럼 정의
108
+
109
+ ### `SdSheetColumnCellTemplate`
110
+
111
+ 시트 컬럼 셀 내용을 정의하는 디렉티브. `ng-template[cell]` 셀렉터.
112
+
113
+ ```typescript
114
+ @Directive({ selector: "ng-template[cell]" })
115
+ class SdSheetColumnCellTemplate<T> {
116
+ cell = input.required<T[]>();
117
+
118
+ static ngTemplateContextGuard<TContextItem>(
119
+ _dir: SdSheetColumnCellTemplate<TContextItem>,
120
+ _ctx: unknown,
121
+ ): _ctx is SdSheetCellContext<TContextItem>;
122
+ }
123
+ ```
124
+
125
+ **셀 내용 작성 지침:**
126
+ - **일반 텍스트**: `<div class="p-xs-sm">` 로 감싸 기본 패딩 적용
127
+ - **컨트롤 삽입**: 반드시 `[inset]="true"` + `[size]="'sm'"` 지정
128
+
129
+ #### 실사용 예
130
+
131
+ - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — let-item 기본 셀 렌더링
132
+ - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — let-edit 조건부 편집 셀 (inset+sm 컨트롤)
133
+ - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 상세 폼 내부 하위 컬렉션 셀
134
+
135
+ ### `SdSheetCellContext`
136
+
137
+ ```typescript
138
+ interface SdSheetCellContext<T = unknown> {
139
+ $implicit: T;
140
+ item: T;
141
+ index: number;
142
+ depth: number;
143
+ edit: boolean;
144
+ }
145
+ ```
146
+
147
+ | Field | Type | Description |
148
+ |-------|------|-------------|
149
+ | `$implicit` | `T` | 현재 항목 (let-item으로 접근) |
150
+ | `item` | `T` | 현재 항목 |
151
+ | `index` | `number` | 행 인덱스 |
152
+ | `depth` | `number` | 트리 깊이 |
153
+ | `edit` | `boolean` | 편집 모드 여부 |
154
+
155
+ ### `SdSheetConfigModal`
156
+
157
+ ```typescript
158
+ @Component({ selector: "sd-sheet-config-modal" })
159
+ class SdSheetConfigModal implements SdModalContentDef<SdSheetConfig> {
160
+ controls = input.required<readonly SdSheetColumn[]>();
161
+ config = input.required<SdSheetConfig | undefined>();
162
+ close = output<SdSheetConfig>();
163
+ initialized = signal(true);
164
+ }
165
+ ```
166
+
167
+ ### `SdSheetColumnDef`
168
+
169
+ ```typescript
170
+ interface SdSheetColumnDef {
171
+ key: string;
172
+ header: string | string[];
173
+ headerStyle: string | undefined;
174
+ tooltip: string | undefined;
175
+ width: string | undefined;
176
+ fixed: boolean;
177
+ hidden: boolean;
178
+ collapse: boolean;
179
+ disableSorting: boolean;
180
+ disableResizing: boolean;
181
+ ordering: number;
182
+ }
183
+ ```
184
+
185
+ ### `SdSheetConfig`
186
+
187
+ ```typescript
188
+ interface SdSheetConfig {
189
+ columnRecord: Record<string, {
190
+ width?: string;
191
+ hidden?: boolean;
192
+ fixed?: boolean;
193
+ ordering?: number;
194
+ }>;
195
+ }
196
+ ```
197
+
198
+ ### `SdSheetHeaderDef`
199
+
200
+ ```typescript
201
+ interface SdSheetHeaderDef {
202
+ text: string;
203
+ colspan: number;
204
+ rowspan: number;
205
+ isLastRow: boolean;
206
+ colDef: SdSheetColumnDef | undefined;
207
+ }
208
+ ```
209
+
210
+ ### `SdSheetItemKeydownEventParam`
211
+
212
+ ```typescript
213
+ interface SdSheetItemKeydownEventParam<T> {
214
+ item: T;
215
+ event: KeyboardEvent;
216
+ }
217
+ ```
218
+
219
+ ### `SdSheetCellKeydownEventParam`
220
+
221
+ ```typescript
222
+ interface SdSheetCellKeydownEventParam<T> {
223
+ item: T;
224
+ key: string;
225
+ event: KeyboardEvent;
226
+ }
227
+ ```
@@ -0,0 +1,26 @@
1
+ # `SdAdditionalButton`
2
+
3
+ 주 콘텐츠 영역과 추가 동작 버튼을 나란히 배치하는 복합 컴포넌트. 콘텐츠 왼쪽 `_content` 영역과 오른쪽 `_button` 영역으로 구성된다.
4
+
5
+ ```typescript
6
+ @Component({ selector: "sd-additional-button", ... })
7
+ export class SdAdditionalButton
8
+ ```
9
+
10
+ ## Members
11
+
12
+ | Member | Kind | Type | Description |
13
+ |--------|------|------|-------------|
14
+ | `disabled` | input | `boolean` | 비활성화 여부 (기본값: `false`) |
15
+ | `size` | input | `"sm" \| "lg" \| undefined` | 크기 |
16
+ | `inset` | input | `boolean` | 인셋 스타일 여부 (기본값: `false`) |
17
+
18
+ ## Usage
19
+
20
+ ```html
21
+ <sd-additional-button>
22
+ 선택된 항목 이름
23
+ <sd-anchor>편집</sd-anchor>
24
+ <sd-button>삭제</sd-button>
25
+ </sd-additional-button>
26
+ ```
@@ -0,0 +1,31 @@
1
+ # `SdAnchor`
2
+
3
+ 인라인 버튼 컴포넌트. 텍스트나 아이콘을 클릭 가능한 링크 스타일로 표시한다.
4
+
5
+ ```typescript
6
+ @Component({ selector: "sd-anchor", ... })
7
+ export class SdAnchor
8
+ ```
9
+
10
+ ## Members
11
+
12
+ | Member | Kind | Type | Description |
13
+ |--------|------|------|-------------|
14
+ | `disabled` | input | `boolean` | 비활성화 여부 (기본값: `false`) |
15
+ | `theme` | input | `"primary" \| "secondary" \| "info" \| "success" \| "warning" \| "danger" \| "gray" \| "blue-gray"` | 색상 테마 (기본값: `"primary"`) |
16
+
17
+ ## Usage
18
+
19
+ ```html
20
+ <sd-anchor (click)="onItemClick()">편집</sd-anchor>
21
+ <sd-anchor [theme]="'danger'" (click)="onDeleteClick()">삭제</sd-anchor>
22
+ <sd-anchor [disabled]="!canEdit()">설정</sd-anchor>
23
+ ```
24
+
25
+ ### 실사용 예
26
+
27
+ - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 시트 셀 내 인라인 앵커 버튼
28
+ - [crud-list.md §7 확장 C: inline 삭제 열](../recipes/crud-list.md#7-확장-c-inline-삭제-열) — row별 삭제/복구 토글 아이콘
29
+ - [crud-list.md §10 확장 F: 모달 편집 모드](../recipes/crud-list.md#10-확장-f-모달-편집-모드) — 행 클릭 편집 모달 열기 링크
30
+ - [crud-detail.md §7 확장 C: modal 뷰](../recipes/crud-detail.md#7-확장-c-modal-뷰) — modal 우측 상단 액션 앵커
31
+ - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 행 삭제 아이콘 앵커