@simplysm/angular 14.0.51 → 14.0.52

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/dist/data/sheet/sd-sheet.d.ts +9 -12
  2. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  3. package/dist/data/sheet/sd-sheet.js +150 -168
  4. package/dist/data/sheet/types.d.ts +1 -0
  5. package/dist/data/sheet/types.d.ts.map +1 -1
  6. package/dist/data/sheet/useSheetCellStyling.d.ts +2 -2
  7. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  8. package/dist/data/sheet/useSheetCellStyling.js +20 -12
  9. package/dist/data/sheet/useSheetColumnFixing.d.ts +3 -8
  10. package/dist/data/sheet/useSheetColumnFixing.d.ts.map +1 -1
  11. package/dist/data/sheet/useSheetColumnFixing.js +19 -27
  12. package/dist/data/sheet/useSheetLayoutEngine.d.ts.map +1 -1
  13. package/dist/data/sheet/useSheetLayoutEngine.js +4 -1
  14. package/dist/layout/dock/sd-dock-container.d.ts.map +1 -1
  15. package/dist/layout/dock/sd-dock-container.js +3 -3
  16. package/package.json +7 -8
  17. package/src/data/sheet/sd-sheet.ts +39 -60
  18. package/src/data/sheet/types.ts +1 -0
  19. package/src/data/sheet/useSheetCellStyling.ts +19 -11
  20. package/src/data/sheet/useSheetColumnFixing.ts +21 -28
  21. package/src/data/sheet/useSheetLayoutEngine.ts +4 -1
  22. package/src/layout/dock/sd-dock-container.ts +1 -0
  23. package/README.md +0 -476
  24. package/docs/bootstrap/provide-sd-angular.md +0 -37
  25. package/docs/bootstrap/sd-angular-config-provider.md +0 -16
  26. package/docs/directives/sd-command-directive.md +0 -30
  27. package/docs/directives/sd-events.md +0 -25
  28. package/docs/directives/sd-intersection-directive.md +0 -36
  29. package/docs/directives/sd-invalid.md +0 -24
  30. package/docs/directives/sd-resize-directive.md +0 -42
  31. package/docs/directives/sd-ripple.md +0 -23
  32. package/docs/directives/sd-router-link.md +0 -38
  33. package/docs/directives/sd-show-effect.md +0 -18
  34. package/docs/directives/sd-typed-template.md +0 -69
  35. package/docs/features/sd-address-search-modal.md +0 -50
  36. package/docs/features/sd-permission-table.md +0 -20
  37. package/docs/features/sd-shared-data-components.md +0 -158
  38. package/docs/features/sd-tiptap-editor.md +0 -26
  39. package/docs/pipes/format-pipe.md +0 -41
  40. package/docs/plugins/sd-global-error-handler.md +0 -23
  41. package/docs/plugins/sd-option-event-plugin.md +0 -34
  42. package/docs/provider-types/sd-menu.md +0 -65
  43. package/docs/provider-types/sd-modal-content-def.md +0 -148
  44. package/docs/provider-types/sd-toast-content-def.md +0 -73
  45. package/docs/provider-types/shared-data-base.md +0 -59
  46. package/docs/providers/sd-activated-modal-provider.md +0 -34
  47. package/docs/providers/sd-app-structure-provider.md +0 -81
  48. package/docs/providers/sd-busy-provider.md +0 -18
  49. package/docs/providers/sd-file-dialog-provider.md +0 -40
  50. package/docs/providers/sd-local-storage-provider.md +0 -20
  51. package/docs/providers/sd-modal-provider.md +0 -67
  52. package/docs/providers/sd-navigate-window-provider.md +0 -18
  53. package/docs/providers/sd-print-provider.md +0 -25
  54. package/docs/providers/sd-service-client-factory-provider.md +0 -43
  55. package/docs/providers/sd-shared-data-provider.md +0 -64
  56. package/docs/providers/sd-system-config-provider.md +0 -46
  57. package/docs/providers/sd-system-log-provider.md +0 -18
  58. package/docs/providers/sd-theme-provider.md +0 -38
  59. package/docs/providers/sd-toast-provider.md +0 -65
  60. package/docs/recipes/_common-rules.md +0 -244
  61. package/docs/recipes/crud-detail/extension-a-edit-save.md +0 -230
  62. package/docs/recipes/crud-detail/extension-b-delete-restore.md +0 -142
  63. package/docs/recipes/crud-detail/extension-c-modal-view.md +0 -214
  64. package/docs/recipes/crud-detail/extension-d-control-view.md +0 -103
  65. package/docs/recipes/crud-detail/extension-e-auxiliary.md +0 -87
  66. package/docs/recipes/crud-detail/extension-f-complex-detail.md +0 -234
  67. package/docs/recipes/crud-detail.md +0 -353
  68. package/docs/recipes/crud-list/extension-a-inline-edit.md +0 -410
  69. package/docs/recipes/crud-list/extension-b-selection.md +0 -226
  70. package/docs/recipes/crud-list/extension-c-inline-delete.md +0 -87
  71. package/docs/recipes/crud-list/extension-d-select-modal.md +0 -207
  72. package/docs/recipes/crud-list/extension-e-readonly-modal.md +0 -165
  73. package/docs/recipes/crud-list/extension-f-modal-edit.md +0 -177
  74. package/docs/recipes/crud-list/extension-g-excel.md +0 -157
  75. package/docs/recipes/crud-list.md +0 -446
  76. package/docs/recipes/data-select-button.md +0 -412
  77. package/docs/recipes/page-modal-container.md +0 -260
  78. package/docs/styling/classes.md +0 -149
  79. package/docs/styling/mixins.md +0 -100
  80. package/docs/styling/themes.md +0 -35
  81. package/docs/styling/variables.md +0 -147
  82. package/docs/type-utilities/directive-input-signals.md +0 -232
  83. package/docs/ui-data/sd-list.md +0 -37
  84. package/docs/ui-data/sd-sheet.md +0 -227
  85. package/docs/ui-form/sd-additional-button.md +0 -26
  86. package/docs/ui-form/sd-anchor.md +0 -31
  87. package/docs/ui-form/sd-button.md +0 -105
  88. package/docs/ui-form/sd-checkbox-group.md +0 -39
  89. package/docs/ui-form/sd-checkbox.md +0 -81
  90. package/docs/ui-form/sd-date-range-picker.md +0 -27
  91. package/docs/ui-form/sd-form.md +0 -89
  92. package/docs/ui-form/sd-modal-select-button.md +0 -54
  93. package/docs/ui-form/sd-numpad.md +0 -26
  94. package/docs/ui-form/sd-range.md +0 -26
  95. package/docs/ui-form/sd-select.md +0 -68
  96. package/docs/ui-form/sd-shared-data-select.md +0 -52
  97. package/docs/ui-form/sd-state-preset.md +0 -37
  98. package/docs/ui-form/sd-switch.md +0 -27
  99. package/docs/ui-form/sd-textarea.md +0 -33
  100. package/docs/ui-form/sd-textfield.md +0 -145
  101. package/docs/ui-layout/sd-dock-container.md +0 -64
  102. package/docs/ui-layout/sd-dock.md +0 -37
  103. package/docs/ui-layout/sd-gap.md +0 -26
  104. package/docs/ui-layout/sd-kanban-board.md +0 -96
  105. package/docs/ui-layout/sd-kanban-lane.md +0 -34
  106. package/docs/ui-layout/sd-kanban.md +0 -29
  107. package/docs/ui-navigation/sd-collapse.md +0 -35
  108. package/docs/ui-navigation/sd-pagination.md +0 -26
  109. package/docs/ui-navigation/sd-sidebar-container.md +0 -49
  110. package/docs/ui-navigation/sd-sidebar-menu.md +0 -22
  111. package/docs/ui-navigation/sd-sidebar-user.md +0 -43
  112. package/docs/ui-navigation/sd-tab.md +0 -51
  113. package/docs/ui-navigation/sd-topbar-container.md +0 -97
  114. package/docs/ui-navigation/sd-topbar-menu.md +0 -23
  115. package/docs/ui-navigation/sd-topbar-user.md +0 -38
  116. package/docs/ui-navigation/sd-topbar.md +0 -30
  117. package/docs/ui-overlay/sd-busy-container.md +0 -69
  118. package/docs/ui-overlay/sd-confirm-modal.md +0 -30
  119. package/docs/ui-overlay/sd-dropdown.md +0 -40
  120. package/docs/ui-overlay/sd-modal.md +0 -34
  121. package/docs/ui-overlay/sd-prompt-modal.md +0 -30
  122. package/docs/ui-overlay/sd-toast.md +0 -35
  123. package/docs/ui-visual/sd-barcode.md +0 -36
  124. package/docs/ui-visual/sd-calendar.md +0 -34
  125. package/docs/ui-visual/sd-echarts.md +0 -32
  126. package/docs/ui-visual/sd-label.md +0 -24
  127. package/docs/ui-visual/sd-note.md +0 -23
  128. package/docs/ui-visual/sd-progress.md +0 -23
  129. package/docs/utils/inject-routing-signals.md +0 -161
  130. package/docs/utils/inject-sd-system-config-resource.md +0 -35
  131. package/docs/utils/mark.md +0 -43
  132. package/docs/utils/selection-managers.md +0 -96
  133. package/docs/utils/set-safe-style.md +0 -19
  134. package/docs/utils/setup-functions.md +0 -93
@@ -1,26 +0,0 @@
1
- # `SdNumpad`
2
-
3
- 숫자 패드 입력 컴포넌트. 버튼을 클릭하여 숫자를 입력한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-numpad", ... })
7
- export class SdNumpad
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `value` | model | `number \| undefined` | 숫자 값 |
15
- | `placeholder` | input | `string \| undefined` | 플레이스홀더 |
16
- | `required` | input | `boolean` | 필수 여부 (기본값: `false`) |
17
- | `inputDisabled` | input | `boolean` | 상단 텍스트 입력 비활성화 (기본값: `false`) |
18
- | `useEnterButton` | input | `boolean` | 확인 버튼 표시 (기본값: `false`) |
19
- | `useMinusButton` | input | `boolean` | 부호 반전 버튼 표시 (기본값: `false`) |
20
- | `enterButtonClick` | output | `void` | 확인 버튼 클릭 이벤트 |
21
-
22
- ## Usage
23
-
24
- ```html
25
- <sd-numpad [(value)]="quantity" [useEnterButton]="true" (enterButtonClick)="onConfirm()" />
26
- ```
@@ -1,26 +0,0 @@
1
- # `SdRange`
2
-
3
- 범위 입력 컴포넌트. `from`/`to` 두 개의 `SdTextfield`를 나란히 배치한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-range", ... })
7
- export class SdRange<K extends keyof SdTextfieldTypes>
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `type` | input (required) | `K` | 텍스트필드 타입 (`SdTextfieldTypes`의 키) |
15
- | `from` | model | `SdTextfieldTypes[K] \| undefined` | 시작 값 |
16
- | `to` | model | `SdTextfieldTypes[K] \| undefined` | 종료 값 |
17
- | `inputStyle` | input | `string \| undefined` | 인라인 스타일 |
18
- | `required` | input | `boolean` | 필수 여부 (기본값: `false`) |
19
- | `disabled` | input | `boolean` | 비활성화 (기본값: `false`) |
20
-
21
- ## Usage
22
-
23
- ```html
24
- <sd-range [type]="'date'" [(from)]="startDate" [(to)]="endDate" />
25
- <sd-range [type]="'number'" [(from)]="minValue" [(to)]="maxValue" />
26
- ```
@@ -1,68 +0,0 @@
1
- # `SdSelect`
2
-
3
- 드롭다운 선택 컴포넌트. single/multi 모드를 지원한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-select" })
7
- class SdSelect<T, M extends keyof SelectModeValue<T>> {
8
- selectMode = input("single" as M);
9
- value = model<SelectModeValue<any>[M]>();
10
- placeholder = input<string>();
11
- disabled = input(false, { transform: booleanAttribute });
12
- inline = input(false, { transform: booleanAttribute });
13
- inset = input(false, { transform: booleanAttribute });
14
- size = input<"sm" | "lg">();
15
- required = input(false, { transform: booleanAttribute });
16
- hideSelectAll = input(false, { transform: booleanAttribute });
17
- multiSelectionDisplayDirection = input<"vertical">();
18
- items = input<T[]>();
19
- getChildrenFn = input<(item: T) => T[] | undefined>();
20
- contentClass = input<string>();
21
- contentStyle = input<string>();
22
- }
23
- ```
24
-
25
- ## Members
26
-
27
- | Member | Kind | Type | Default | Description |
28
- |--------|------|------|---------|-------------|
29
- | `selectMode` | input | `M` | `"single"` | 선택 모드 |
30
- | `value` | model | `SelectModeValue<any>[M]` | - | 선택된 값 (two-way) |
31
- | `placeholder` | input | `string \| undefined` | `undefined` | 플레이스홀더 |
32
- | `disabled` | input | `boolean` | `false` | 비활성화 |
33
- | `inline` | input | `boolean` | `false` | 인라인 표시 |
34
- | `inset` | input | `boolean` | `false` | 삽입 스타일 |
35
- | `size` | input | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
36
- | `required` | input | `boolean` | `false` | 필수 |
37
- | `hideSelectAll` | input | `boolean` | `false` | multi 모드에서 전체 선택 숨김 |
38
- | `multiSelectionDisplayDirection` | input | `"vertical" \| undefined` | `undefined` | multi 모드 표시 방향 |
39
- | `items` | input | `T[] \| undefined` | `undefined` | 항목 배열 |
40
- | `getChildrenFn` | input | `((item) => T[] \| undefined) \| undefined` | `undefined` | 트리 구조 자식 함수 |
41
- | `contentClass` | input | `string \| undefined` | `undefined` | 트리거 영역 CSS 클래스 |
42
- | `contentStyle` | input | `string \| undefined` | `undefined` | 트리거 영역 인라인 스타일 |
43
-
44
- **스타일 적용**: `contentClass`/`contentStyle`은 트리거 영역(선택값 텍스트와 드롭다운 화살표가 함께 놓인 박스)에만 적용된다.
45
-
46
- ## Related Types
47
-
48
- ### `SdSelectItem`
49
-
50
- 드롭다운 선택 항목.
51
-
52
- ```typescript
53
- @Component({ selector: "sd-select-item" })
54
- class SdSelectItem<T> {
55
- value = input.required<T>();
56
- disabled = input(false, { transform: booleanAttribute });
57
- hidden = input(false, { transform: booleanAttribute });
58
- }
59
- ```
60
-
61
- ### `SdSelectButton`
62
-
63
- 버튼 스타일 선택 컴포넌트.
64
-
65
- ```typescript
66
- @Component({ selector: "sd-select-button" })
67
- class SdSelectButton<T> { }
68
- ```
@@ -1,52 +0,0 @@
1
- # `SdSharedDataSelect`
2
-
3
- 공유 데이터 드롭다운 선택 컴포넌트. 검색 기능 포함. 상세 API는 [features/sd-shared-data-components.md](../features/sd-shared-data-components.md#sdshareddataselect)를 참조한다.
4
-
5
- ## 시트 셀 내 사용 패턴
6
-
7
- 시트 셀 안에서 사용할 때 `[inset]="true" [size]="'sm'"`을 반드시 지정한다.
8
-
9
- ```html
10
- <sd-sheet-column [header]="'거래처'" [key]="'vendorId'">
11
- <ng-template [cell]="items()" let-item let-edit="edit">
12
- <sd-shared-data-select
13
- [items]="sharedVendors()"
14
- [inset]="true"
15
- [size]="'sm'"
16
- [disabled]="!canEdit()"
17
- [readonly]="!edit"
18
- [(value)]="item.vendorId"
19
- (valueChange)="mark(items)"
20
- >
21
- <ng-template [itemOf]="sharedVendors()">
22
- <div class="flex-row gap-sm">
23
- <div>{{ item.__searchText }}</div>
24
- </div>
25
- </ng-template>
26
- </sd-shared-data-select>
27
- </ng-template>
28
- </sd-sheet-column>
29
- ```
30
-
31
- ## 일반 form 내 사용 패턴
32
-
33
- ```html
34
- <sd-shared-data-select
35
- [items]="sharedVendors()"
36
- [(value)]="data().vendorId"
37
- (valueChange)="mark(data)"
38
- >
39
- <ng-template [itemOf]="sharedVendors()">
40
- <div class="flex-row gap-sm">
41
- <div>{{ item.__searchText }}</div>
42
- </div>
43
- </ng-template>
44
- </sd-shared-data-select>
45
- ```
46
-
47
- `<ng-template [itemOf]>` 패턴으로 드롭다운 항목의 표시 형식을 커스터마이징한다.
48
-
49
- ### 실사용 예
50
-
51
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 시트 셀 내 공유 데이터 선택
52
- - [crud-detail.md §9 확장 E: 보조 기능 영역](../recipes/crud-detail.md#9-확장-e-보조-기능-영역) — 보조 form 셀렉터
@@ -1,37 +0,0 @@
1
- # `SdStatePreset`
2
-
3
- 화면 상태(검색 조건 등)를 로컬 스토리지에 저장하고 불러오는 프리셋 컴포넌트.
4
- `SdSystemConfigProvider`를 통해 설정 키 기반으로 저장한다.
5
-
6
- ```typescript
7
- @Component({ selector: "sd-state-preset", ... })
8
- export class SdStatePreset
9
- ```
10
-
11
- ## Members
12
-
13
- | Member | Kind | Type | Description |
14
- |--------|------|------|-------------|
15
- | `key` | input (required) | `string` | 저장 키 (`SdSystemConfigProvider` 기반) |
16
- | `state` | model | `any` | 현재 상태 객체. 프리셋 클릭 시 해당 프리셋의 상태로 업데이트됨 |
17
- | `size` | input | `"sm" \| "lg" \| undefined` | 크기 |
18
-
19
- ## Related Types
20
-
21
- ### `SdStatePresetDef`
22
-
23
- ```typescript
24
- interface SdStatePresetDef {
25
- name: string;
26
- state: any;
27
- }
28
- ```
29
-
30
- ## Usage
31
-
32
- ```html
33
- <sd-state-preset [key]="'order-list-search'" [(state)]="searchState" />
34
- ```
35
-
36
- > 프리셋 아이콘 클릭 → 이름 입력 모달 → 현재 `state`를 해당 이름으로 저장.
37
- > 저장된 프리셋 클릭 → `state`가 해당 프리셋의 값으로 업데이트됨.
@@ -1,27 +0,0 @@
1
- # `SdSwitch`
2
-
3
- 토글 스위치 컴포넌트. `value` model로 on/off 상태를 관리한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-switch", ... })
7
- export class SdSwitch
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `value` | model | `boolean` | on/off 상태 (기본값: `false`) |
15
- | `canChangeFn` | input | `(item: boolean) => boolean \| Promise<boolean>` | 변경 가드 함수 (기본값: 항상 `true`) |
16
- | `disabled` | input | `boolean` | 비활성화 (기본값: `false`) |
17
- | `inline` | input | `boolean` | 인라인 표시 (기본값: `false`) |
18
- | `inset` | input | `boolean` | 인셋 스타일 (기본값: `false`) |
19
- | `size` | input | `"sm" \| "lg" \| undefined` | 크기 |
20
- | `theme` | input | `"primary" \| "secondary" \| "info" \| "success" \| "warning" \| "danger" \| "gray" \| "blue-gray" \| undefined` | 색상 테마 |
21
-
22
- ## Usage
23
-
24
- ```html
25
- <sd-switch [(value)]="isActive" [theme]="'primary'" />
26
- <sd-switch [(value)]="isEnabled" [canChangeFn]="canChangeActiveAsync" />
27
- ```
@@ -1,33 +0,0 @@
1
- # `SdTextarea`
2
-
3
- 멀티라인 텍스트 입력 컴포넌트. 내용에 따라 행 수가 자동으로 늘어난다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-textarea", ... })
7
- export class SdTextarea
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `value` | model | `string \| undefined` | 입력 값 |
15
- | `placeholder` | input | `string \| undefined` | 플레이스홀더 텍스트 |
16
- | `title` | input | `string \| undefined` | 툴팁 |
17
- | `minRows` | input | `number` | 최소 행 수 (기본값: `1`) |
18
- | `disabled` | input | `boolean` | 비활성화 (기본값: `false`) |
19
- | `readonly` | input | `boolean` | 읽기 전용 (기본값: `false`) |
20
- | `required` | input | `boolean` | 필수 여부 (기본값: `false`) |
21
- | `inline` | input | `boolean` | 인라인 표시 (기본값: `false`) |
22
- | `inset` | input | `boolean` | 인셋 스타일 (기본값: `false`) |
23
- | `size` | input | `"sm" \| "lg" \| undefined` | 크기 |
24
- | `validatorFn` | input | `(value: string \| undefined) => string \| undefined` | 커스텀 유효성 검사 함수 |
25
- | `theme` | input | `"primary" \| "secondary" \| "info" \| "success" \| "warning" \| "danger" \| "gray" \| "blue-gray" \| undefined` | 배경 테마 |
26
- | `inputStyle` | input | `string \| undefined` | 인라인 스타일 |
27
- | `inputClass` | input | `string \| undefined` | 추가 CSS 클래스 |
28
-
29
- ## Usage
30
-
31
- ```html
32
- <sd-textarea [(value)]="description" [placeholder]="'설명을 입력하세요'" [minRows]="3" />
33
- ```
@@ -1,145 +0,0 @@
1
- # `SdTextfield`
2
-
3
- 텍스트 입력 컴포넌트. 13가지 타입을 지원한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-textfield" })
7
- class SdTextfield<K extends keyof SdTextfieldTypes> {
8
- value = model<SdTextfieldTypes[K]>();
9
- type = input.required<K>();
10
- placeholder = input<string>();
11
- title = input<string>();
12
- inputStyle = input<string>();
13
- inputClass = input<string>();
14
- disabled = input(false, { transform: booleanAttribute });
15
- readonly = input(false, { transform: booleanAttribute });
16
- required = input(false, { transform: booleanAttribute });
17
- min = input<SdTextfieldTypes[K]>();
18
- max = input<SdTextfieldTypes[K]>();
19
- minlength = input<number>();
20
- maxlength = input<number>();
21
- pattern = input<string>();
22
- validatorFn = input<(value: SdTextfieldTypes[K] | undefined) => string | undefined>();
23
- format = input<string>();
24
- step = input<number>();
25
- autocomplete = input<string>();
26
- useNumberComma = input(true, { transform: booleanAttribute });
27
- minDigits = input<number>();
28
- inline = input(false, { transform: booleanAttribute });
29
- inset = input(false, { transform: booleanAttribute });
30
- size = input<"sm" | "lg">();
31
- theme = input<string>();
32
- }
33
- ```
34
-
35
- ## Members
36
-
37
- | Member | Kind | Type | Default | Description |
38
- |--------|------|------|---------|-------------|
39
- | `type` | input (required) | `keyof SdTextfieldTypes` | - | 입력 타입 (number, text, password, color, email, format, date, month, year, datetime, datetime-sec, time, time-sec) |
40
- | `value` | model | `SdTextfieldTypes[K] \| undefined` | - | 값 (two-way) |
41
- | `placeholder` | input | `string \| undefined` | `undefined` | 플레이스홀더 |
42
- | `title` | input | `string \| undefined` | `undefined` | title 속성 |
43
- | `inputStyle` | input | `string \| undefined` | `undefined` | input 인라인 스타일 |
44
- | `inputClass` | input | `string \| undefined` | `undefined` | input CSS 클래스 |
45
- | `disabled` | input | `boolean` | `false` | 비활성화 |
46
- | `readonly` | input | `boolean` | `false` | 읽기 전용 |
47
- | `required` | input | `boolean` | `false` | 필수 |
48
- | `min` | input | `SdTextfieldTypes[K] \| undefined` | `undefined` | 최소값 |
49
- | `max` | input | `SdTextfieldTypes[K] \| undefined` | `undefined` | 최대값 |
50
- | `minlength` | input | `number \| undefined` | `undefined` | 최소 길이 |
51
- | `maxlength` | input | `number \| undefined` | `undefined` | 최대 길이 |
52
- | `pattern` | input | `string \| undefined` | `undefined` | 입력 패턴 (정규식) |
53
- | `validatorFn` | input | `((value) => string \| undefined) \| undefined` | `undefined` | 커스텀 유효성 검증 함수 (에러 메시지 반환) |
54
- | `format` | input | `string \| undefined` | `undefined` | format 타입에서 사용할 포맷 문자열 |
55
- | `step` | input | `number \| undefined` | `undefined` | 증감 단위 |
56
- | `autocomplete` | input | `string \| undefined` | `undefined` | autocomplete 속성 |
57
- | `useNumberComma` | input | `boolean` | `true` | number 타입에서 천 단위 쉼표 사용 |
58
- | `minDigits` | input | `number \| undefined` | `undefined` | number 타입 최소 자릿수 |
59
- | `inline` | input | `boolean` | `false` | 인라인 표시 |
60
- | `inset` | input | `boolean` | `false` | 삽입 스타일 |
61
- | `size` | input | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
62
- | `theme` | input | `string \| undefined` | `undefined` | 테마 |
63
-
64
- **스타일 적용**: 입력 영역 스타일은 `inputClass`/`inputStyle`을 사용한다. 호스트(`<sd-textfield>`)에 직접 `class`/`style`을 줘도 입력 영역 외형은 변경되지 않는다.
65
-
66
- ### 실사용 예
67
-
68
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — 필터 영역 텍스트 입력
69
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 시트 셀 내 편집 (inset+sm, readonly=!edit)
70
- - [crud-detail.md §3 최소 뼈대: 읽기 전용 상세 폼](../recipes/crud-detail.md#3-최소-뼈대-읽기-전용-상세-폼) — 읽기 전용 필드 (readonly=true)
71
- - [crud-detail.md §5 확장 A: 편집/저장](../recipes/crud-detail.md#5-확장-a-편집저장) — 편집 가능 필드 (disabled=!canEdit)
72
- - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 하위 컬렉션 시트 셀 내 편집
73
-
74
- ## Related Types
75
-
76
- ### `SdTextarea`
77
-
78
- 멀티라인 텍스트 입력 컴포넌트.
79
-
80
- ```typescript
81
- @Component({ selector: "sd-textarea" })
82
- class SdTextarea {
83
- value = model<string>();
84
- placeholder = input<string>();
85
- title = input<string>();
86
- minRows = input<number>(1);
87
- disabled = input(false, { transform: booleanAttribute });
88
- readonly = input(false, { transform: booleanAttribute });
89
- required = input(false, { transform: booleanAttribute });
90
- inline = input(false, { transform: booleanAttribute });
91
- inset = input(false, { transform: booleanAttribute });
92
- size = input<"sm" | "lg">();
93
- validatorFn = input<(value: string | undefined) => string | undefined>();
94
- theme = input<string>();
95
- inputStyle = input<string>();
96
- inputClass = input<string>();
97
- }
98
- ```
99
-
100
- ### `SdNumpad`
101
-
102
- 숫자 패드 컴포넌트.
103
-
104
- ```typescript
105
- @Component({ selector: "sd-numpad" })
106
- class SdNumpad {
107
- placeholder = input<string>();
108
- value = model<number>();
109
- required = input(false, { transform: booleanAttribute });
110
- inputDisabled = input(false, { transform: booleanAttribute });
111
- useEnterButton = input(false, { transform: booleanAttribute });
112
- useMinusButton = input(false, { transform: booleanAttribute });
113
- enterButtonClick = output();
114
- }
115
- ```
116
-
117
- ### `SdRange`
118
-
119
- 범위 슬라이더 컴포넌트.
120
-
121
- ```typescript
122
- @Component({ selector: "sd-range" })
123
- class SdRange<K extends keyof SdTextfieldTypes> {
124
- type = input.required<K>();
125
- from = model<SdTextfieldTypes[K]>();
126
- to = model<SdTextfieldTypes[K]>();
127
- inputStyle = input<string>();
128
- required = input(false, { transform: booleanAttribute });
129
- disabled = input(false, { transform: booleanAttribute });
130
- }
131
- ```
132
-
133
- ### `SdDateRangePicker`
134
-
135
- 날짜 범위 선택기.
136
-
137
- ```typescript
138
- @Component({ selector: "sd-date-range-picker" })
139
- class SdDateRangePicker {
140
- periodType = model<"일" | "월" | "범위">("범위");
141
- from = model<DateOnly>();
142
- to = model<DateOnly>();
143
- required = input(false, { transform: booleanAttribute });
144
- }
145
- ```
@@ -1,64 +0,0 @@
1
- # `SdDockContainer`
2
-
3
- 도킹 레이아웃 컨테이너. `SdDock`과 함께 사용하여 상/하/좌/우 고정 영역을 만든다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-dock-container" })
7
- class SdDockContainer { }
8
- ```
9
-
10
- ## Related Types
11
-
12
- ### `SdDock`
13
-
14
- 도킹 영역 컴포넌트. `SdDockContainer` 내부에서 사용.
15
-
16
- ```typescript
17
- @Component({ selector: "sd-dock" })
18
- class SdDock {
19
- key = input<string>();
20
- position = input<"top" | "bottom" | "right" | "left">("top");
21
- resizable = input(false, { transform: booleanAttribute });
22
- }
23
- ```
24
-
25
- | Input | Type | Default | Description |
26
- |-------|------|---------|-------------|
27
- | `key` | `string \| undefined` | `undefined` | 리사이즈 설정 저장 키 |
28
- | `position` | `"top" \| "bottom" \| "right" \| "left"` | `"top"` | 도킹 위치 |
29
- | `resizable` | `boolean` | `false` | 크기 조절 가능 여부 |
30
-
31
- ## Usage
32
-
33
- 필터·도구 바는 `position="top"` (기본값이므로 생략 가능), 하단 액션 바는 `[position]="'bottom'"`으로 배치한다.
34
-
35
- ```html
36
- <sd-dock-container>
37
- <sd-dock>
38
- <!-- 상단 필터/도구 바 (기본 position="top") -->
39
- </sd-dock>
40
- <!-- 메인 콘텐츠 -->
41
- <sd-dock [position]="'bottom'">
42
- <!-- 하단 액션 바 -->
43
- </sd-dock>
44
- </sd-dock-container>
45
- ```
46
-
47
- > **CRITICAL — modal 하단 바에 `[position]="'bottom'"` 반드시 명시**
48
- > 기본값은 `"top"`이다. modal 하단 액션 바에 `[position]`을 누락하면 상단에 렌더링되어 레이아웃이 깨진다.
49
-
50
- ### 실사용 예
51
-
52
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — 필터 영역 dock(top)
53
- - [crud-list.md §8 확장 D: 선택 모달 전환](../recipes/crud-list.md#8-확장-d-선택-모달-전환) — modal 하단 선택 바 dock(bottom)
54
- - [crud-detail.md §7 확장 C: modal 뷰](../recipes/crud-detail.md#7-확장-c-modal-뷰) — modal 하단 액션 바 dock(bottom)
55
- - [crud-detail.md §8 확장 D: control 뷰](../recipes/crud-detail.md#8-확장-d-control-뷰) — control 상단 바 dock(top)
56
-
57
- ## `SdGap`
58
-
59
- 간격(gap) 컴포넌트. 요소 사이에 공간을 추가한다.
60
-
61
- ```typescript
62
- @Component({ selector: "sd-gap" })
63
- class SdGap { }
64
- ```
@@ -1,37 +0,0 @@
1
- # `SdDock`
2
-
3
- `SdDockContainer` 내부에 배치되는 도킹 패널 컴포넌트. `position`으로 도킹 위치를 지정하고, `resizable`로 크기 조절을 허용한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-dock", ... })
7
- export class SdDock
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `key` | input | `string \| undefined` | 시스템 설정 저장 키 (크기 저장에 사용) |
15
- | `position` | input | `"top" \| "bottom" \| "right" \| "left"` | 도킹 위치 (기본값: `"top"`) |
16
- | `resizable` | input | `boolean` | 크기 조절 가능 여부 (기본값: `false`) |
17
-
18
- ## Usage
19
-
20
- ```html
21
- <sd-dock-container>
22
- <sd-dock [position]="'top'">
23
- <!-- 상단 고정 영역 -->
24
- </sd-dock>
25
- <sd-dock [position]="'bottom'" [resizable]="true" [key]="'my-page-bottom-dock'">
26
- <!-- 하단 조절 가능 영역 -->
27
- </sd-dock>
28
- <ng-content /> <!-- 나머지 영역 -->
29
- </sd-dock-container>
30
- ```
31
-
32
- ### 실사용 예
33
-
34
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — 필터 영역 dock(top)
35
- - [crud-list.md §8 확장 D: 선택 모달 전환](../recipes/crud-list.md#8-확장-d-선택-모달-전환) — modal 하단 선택 바 dock(bottom)
36
- - [crud-detail.md §7 확장 C: modal 뷰](../recipes/crud-detail.md#7-확장-c-modal-뷰) — modal 하단 액션 바 dock(bottom)
37
- - [crud-detail.md §8 확장 D: control 뷰](../recipes/crud-detail.md#8-확장-d-control-뷰) — control 상단 바 dock(top)
@@ -1,26 +0,0 @@
1
- # `SdGap`
2
-
3
- 레이아웃 간격 컴포넌트. 세로/가로 공백을 삽입한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-gap", ... })
7
- export class SdGap
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `height` | input | `"xxs" \| "xs" \| "sm" \| "default" \| "lg" \| "xl" \| "xxl" \| undefined` | 세로 간격 (CSS 변수 `--gap-*` 기반) |
15
- | `heightPx` | input | `number \| undefined` | 세로 간격 (픽셀) |
16
- | `width` | input | `"xxs" \| "xs" \| "sm" \| "default" \| "lg" \| "xl" \| "xxl" \| undefined` | 가로 간격 (CSS 변수 `--gap-*` 기반) |
17
- | `widthPx` | input | `number \| undefined` | 가로 간격 (픽셀) |
18
- | `widthEm` | input | `number \| undefined` | 가로 간격 (em) |
19
-
20
- ## Usage
21
-
22
- ```html
23
- <sd-gap [height]="'lg'" />
24
- <sd-gap [width]="'default'" />
25
- <sd-gap [heightPx]="32" />
26
- ```
@@ -1,96 +0,0 @@
1
- # `SdKanbanBoard`
2
-
3
- 칸반 보드 컨테이너. 드래그앤드롭을 지원한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-kanban-board" })
7
- class SdKanbanBoard<L, T> {
8
- selectedValues = model<T[]>([]);
9
- drop = output<SdKanbanBoardDropInfo<L, T>>();
10
- }
11
- ```
12
-
13
- ## Members
14
-
15
- | Member | Kind | Type | Default | Description |
16
- |--------|------|------|---------|-------------|
17
- | `selectedValues` | model | `T[]` | `[]` | 선택된 칸반 아이템 값 배열 (two-way) |
18
- | `drop` | output | `SdKanbanBoardDropInfo<L, T>` | - | 드롭 완료 시 발생 |
19
-
20
- ## Related Types
21
-
22
- ### `SdKanban`
23
-
24
- 칸반 아이템 컴포넌트.
25
-
26
- ```typescript
27
- @Component({ selector: "sd-kanban" })
28
- class SdKanban<L, T> {
29
- value = input<T>();
30
- selectable = input(false, { transform: booleanAttribute });
31
- draggable = input(false, { transform: booleanAttribute });
32
- contentClass = input<string>();
33
- }
34
- ```
35
-
36
- | Input | Type | Default | Description |
37
- |-------|------|---------|-------------|
38
- | `value` | `T \| undefined` | `undefined` | 칸반 아이템의 값 |
39
- | `selectable` | `boolean` | `false` | 선택 가능 여부 |
40
- | `draggable` | `boolean` | `false` | 드래그 가능 여부 |
41
- | `contentClass` | `string \| undefined` | `undefined` | 컨텐츠 CSS 클래스 |
42
-
43
- ### `SdKanbanLane`
44
-
45
- 칸반 레인 컴포넌트.
46
-
47
- ```typescript
48
- @Component({ selector: "sd-kanban-lane" })
49
- class SdKanbanLane<L, T> {
50
- busy = input(false, { transform: booleanAttribute });
51
- useCollapse = input(false, { transform: booleanAttribute });
52
- collapse = model(false);
53
- value = input<L>();
54
- }
55
- ```
56
-
57
- | Input | Type | Default | Description |
58
- |-------|------|---------|-------------|
59
- | `busy` | `boolean` | `false` | busy 상태 |
60
- | `useCollapse` | `boolean` | `false` | 접기 기능 사용 |
61
- | `collapse` | `boolean` | `false` | 접힘 상태 (two-way) |
62
- | `value` | `L \| undefined` | `undefined` | 레인의 값 |
63
-
64
- ### `SdKanbanBoardDropInfo`
65
-
66
- ```typescript
67
- interface SdKanbanBoardDropInfo<L, T> {
68
- sourceKanbanValue?: T;
69
- targetLaneValue?: L;
70
- targetKanbanValue?: T;
71
- }
72
- ```
73
-
74
- | Field | Type | Description |
75
- |-------|------|-------------|
76
- | `sourceKanbanValue` | `T \| undefined` | 드래그한 칸반 아이템의 값 |
77
- | `targetLaneValue` | `L \| undefined` | 드롭 대상 레인의 값 |
78
- | `targetKanbanValue` | `T \| undefined` | 드롭 대상 칸반 아이템의 값 |
79
-
80
- ### `SdKanbanDragRef`
81
-
82
- ```typescript
83
- interface SdKanbanDragRef<_L, T> {
84
- value(): T | undefined;
85
- heightOnDrag(): number;
86
- }
87
- ```
88
-
89
- ### `SdKanbanDropTarget`
90
-
91
- ```typescript
92
- interface SdKanbanDropTarget<L, T> {
93
- targetLaneValue(): L | undefined;
94
- targetKanbanValue?(): T | undefined;
95
- }
96
- ```
@@ -1,34 +0,0 @@
1
- # `SdKanbanLane`
2
-
3
- 칸반 레인 컴포넌트. `SdKanbanBoard` 내부에 배치되며, `SdKanban` 아이템을 수직으로 나열한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-kanban-lane", ... })
7
- export class SdKanbanLane<L, T> implements SdKanbanDropTarget<L, T>
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `value` | input | `L \| undefined` | 이 레인의 값 |
15
- | `busy` | input | `boolean` | 로딩 표시 (기본값: `false`) |
16
- | `useCollapse` | input | `boolean` | 접기 기능 사용 (기본값: `false`) |
17
- | `collapse` | model | `boolean` | 접힘 상태 (기본값: `false`) |
18
-
19
- ## Usage
20
-
21
- ```html
22
- <sd-kanban-board [(selectedValues)]="selectedItems">
23
- @for (lane of lanes; track lane.id) {
24
- <sd-kanban-lane [value]="lane">
25
- <ng-template #titleTpl>{{ lane.name }}</ng-template>
26
- @for (item of lane.items; track item.id) {
27
- <sd-kanban [value]="item" [draggable]="true">
28
- {{ item.title }}
29
- </sd-kanban>
30
- }
31
- </sd-kanban-lane>
32
- }
33
- </sd-kanban-board>
34
- ```