@simplysm/sd-claude 14.0.98 → 14.0.99

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 (77) hide show
  1. package/claude/references/sd-simplysm14/README.md +16 -16
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +81 -153
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +179 -205
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +71 -57
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +49 -109
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +58 -86
  7. package/claude/references/sd-simplysm14/apis/angular/kanban.md +32 -40
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +38 -52
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +86 -110
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +54 -86
  11. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +82 -74
  12. package/claude/references/sd-simplysm14/apis/angular/sheet.md +56 -80
  13. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +15 -15
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +21 -21
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +79 -53
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +9 -11
  17. package/claude/references/sd-simplysm14/apis/core-browser/README.md +15 -15
  18. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +20 -20
  19. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +18 -18
  20. package/claude/references/sd-simplysm14/apis/core-common/README.md +20 -49
  21. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +66 -55
  22. package/claude/references/sd-simplysm14/apis/core-common/collection-ext.md +83 -56
  23. package/claude/references/sd-simplysm14/apis/core-common/errors.md +32 -21
  24. package/claude/references/sd-simplysm14/apis/core-common/obj.md +57 -39
  25. package/claude/references/sd-simplysm14/apis/core-common/serialization.md +36 -30
  26. package/claude/references/sd-simplysm14/apis/core-common/value-types.md +69 -41
  27. package/claude/references/sd-simplysm14/apis/core-node/README.md +4 -4
  28. package/claude/references/sd-simplysm14/apis/core-node/consola.md +15 -13
  29. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +11 -7
  30. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +8 -8
  31. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +29 -20
  32. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +14 -6
  33. package/claude/references/sd-simplysm14/apis/core-node/worker.md +3 -3
  34. package/claude/references/sd-simplysm14/apis/excel/README.md +3 -3
  35. package/claude/references/sd-simplysm14/apis/excel/cell.md +32 -32
  36. package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +23 -24
  37. package/claude/references/sd-simplysm14/apis/excel/style.md +24 -30
  38. package/claude/references/sd-simplysm14/apis/excel/utils.md +20 -23
  39. package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +60 -71
  40. package/claude/references/sd-simplysm14/apis/excel/wrapper.md +36 -36
  41. package/claude/references/sd-simplysm14/apis/lint/README.md +7 -9
  42. package/claude/references/sd-simplysm14/apis/lint/recommended.md +59 -37
  43. package/claude/references/sd-simplysm14/apis/lint/rules.md +81 -74
  44. package/claude/references/sd-simplysm14/apis/orm-common/README.md +6 -6
  45. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +112 -78
  46. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +131 -75
  47. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +126 -82
  48. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +170 -113
  49. package/claude/references/sd-simplysm14/apis/orm-common/types.md +102 -48
  50. package/claude/references/sd-simplysm14/apis/orm-node/README.md +12 -13
  51. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +3 -3
  52. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +5 -5
  53. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +67 -65
  54. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +130 -123
  55. package/claude/references/sd-simplysm14/apis/service-client/README.md +63 -63
  56. package/claude/references/sd-simplysm14/apis/service-client/orm.md +22 -22
  57. package/claude/references/sd-simplysm14/apis/service-client/transport.md +30 -26
  58. package/claude/references/sd-simplysm14/apis/service-common/README.md +8 -8
  59. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +13 -6
  60. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +1 -1
  61. package/claude/references/sd-simplysm14/apis/service-server/README.md +43 -47
  62. package/claude/references/sd-simplysm14/apis/service-server/built-in-services.md +35 -0
  63. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +20 -19
  64. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +23 -25
  65. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +9 -9
  66. package/claude/references/sd-simplysm14/apis/storage/README.md +26 -26
  67. package/claude/references/sd-simplysm14/manuals/client-component.md +9 -1
  68. package/claude/references/sd-simplysm14/manuals/client-crud.md +1 -1
  69. package/claude/references/sd-simplysm14/manuals/client-orm.md +1 -0
  70. package/claude/references/sd-simplysm14/manuals/client-service.md +1 -0
  71. package/claude/references/sd-simplysm14/manuals/client-shared-data.md +1 -0
  72. package/claude/references/sd-simplysm14/manuals/client-ssg.md +1 -0
  73. package/claude/sd-system-prompt.md +11 -26
  74. package/claude/skills/sd-docs/references/subagent-prompt.md +4 -3
  75. package/claude/skills/sd-spec/SKILL.md +87 -18
  76. package/claude/skills/sd-spec/references/format.md +2 -2
  77. package/package.json +1 -1
@@ -1,258 +1,239 @@
1
1
  # @simplysm/angular — 폼·입력 컨트롤
2
2
 
3
- 버튼·앵커, 텍스트/숫자/날짜 입력, 체크박스/스위치, 셀렉트/드롭다운, 폼/접기/탭/리스트/페이지네이션 등 폼·UI 기본 컨트롤 군. 화면 폼·필터·시트 셀에서 함께 쓰임. 공통: 대부분 컨트롤이 `size: "sm"|"lg"`(미지정=기본), `inline`(인라인 배치), `inset`(테두리 제거·셀 내장용), `disabled`, `theme` 을 가짐. 값 입력 컨트롤은 `model()` 양방향, 검증 컨트롤은 `required`/`validatorFn` 보유.
3
+ 버튼·앵커, 텍스트/숫자/날짜 입력, 체크박스/스위치/그룹, 셀렉트/드롭다운, 폼/접기/탭/리스트/갭/페이지네이션 등 폼·UI 기본 컨트롤 군. 화면 폼·필터·시트 셀에서 함께 쓰임. 화면 폼·버튼 스타일 규약은 [client-component.md](../manuals/client-component.md) '폼·입력 컨트롤' / '버튼 스타일' 참조.
4
4
 
5
- ## 버튼
5
+ 공통 약속: 대부분 컨트롤이 `size: "sm"|"lg"`(미지정=기본 중간), `inline`(인라인 배치·폭 auto), `inset`(테두리·라운드 제거, 셀/다른 컨트롤 내장용), `disabled`, `theme` 을 가짐. 모든 boolean input 은 `booleanAttribute` 변환이라 `<sd-x inline>` 처럼 빈 속성=`true`. **표준 테마 셋** = `primary | secondary | info | success | warning | danger | gray | blue-gray`. 검증 컨트롤은 `required`/`validatorFn` 으로 `sd-form` 의 native validity 에 연동.
6
6
 
7
- ### SdButton — `<sd-button>`
7
+ ## 버튼
8
8
 
9
- ```ts
10
- type = input<"button" | "submit">("button");
11
- theme = input<"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray"
12
- | "link"|"link-primary"|...|"link-blue-gray"|"link-rev">();
13
- inline; inset; disabled; size = input<"xs"|"sm"|"lg">();
14
- buttonStyle = input<string>(); buttonClass = input<string>();
15
- ```
9
+ ### `SdButton` — `<sd-button>`
16
10
 
17
- - `type` — `"submit"` 이면 제출 트리거(sd-form 안에서). 기본 `"button"`.
18
- - `theme` — 채움 테마 또는 `link-*`(테두리·배경 없는 링크형), `link-rev`(어두운 배경용 반전). 액션 강조면 채움, 보조면 link.
19
- - `inset` — 테두리·라운드 제거 primary 텍스트색(셀·툴바 내장 버튼). `size="xs"` 가장 촘촘한 패딩.
20
- - `buttonStyle`/`buttonClass` — 내부 `<button>` 직접 적용할 style/class 문자열.
11
+ - `type: "button"|"submit"` (기본 `"button"`) native 버튼 타입. `"submit"` 감싼 `<form>` 제출 트리거, `"button"` 은 안 함.
12
+ - `theme` — 표준 테마 셋(채워진 버튼) + `link`(투명·primary 텍스트) + `link-primary`…`link-blue-gray`(투명·해당 테마 색 텍스트) + `link-rev`(투명·다크 배경용 밝은 텍스트). 미지정 시 기본 컨트롤색 버튼. 화면 액션 역할별 사용은 매뉴얼 '버튼 스타일' 표.
13
+ - `inline: boolean` — true `inline-block`·width auto (내용 크기로 축소). 시트 위/폼 인라인 버튼에.
14
+ - `inset: boolean` — true 테두리·라운드 제거, primary 텍스트색(다른 컨트롤에 flush 내장).
15
+ - `size: "xs"|"sm"|"lg"` — 패딩 스케일. `xs` 최소·`sm` 작음·미지정 중간·`lg` 큼. 시트 위 버튼은 `sm`.
16
+ - `disabled: boolean` — true 면 native 버튼 비활성 + ripple 억제.
17
+ - `buttonStyle: string` / `buttonClass: string` — 내부 `<button>` 에 적용할 인라인 스타일/클래스.
21
18
 
22
19
  ```html
23
- <sd-button [type]="'submit'" [theme]="'primary'">저장</sd-button>
20
+ <sd-button [theme]="'primary'" (click)="onSubmit()">저장</sd-button>
21
+ <sd-button [size]="'sm'" [theme]="'link-success'" (click)="onDownload()">엑셀 다운로드</sd-button>
24
22
  ```
25
23
 
26
- ### SdAnchor — `<sd-anchor>`
27
-
28
- ```ts
29
- disabled = input(false);
30
- theme = input<"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray">("primary");
31
- ```
24
+ ### `SdAnchor` — `<sd-anchor>`
32
25
 
33
- - 텍스트 링크형 클릭 요소. `disabled` 흐려지고 tabindex 제거. 아이콘/짧은 액션에 사용.
26
+ - `theme` 표준 테마 셋(기본 `"primary"`). 텍스트 색; hover 밑줄·진해짐.
27
+ - `disabled: boolean` — true 면 opacity 0.3·`pointer-events:none`·tabindex 제거.
34
28
 
35
- ### SdAdditionalButton `<sd-additional-button>`
29
+ 시트 진입점 앵커 등에 사용([client-crud.md](../manuals/client-crud.md) 의 '#' 컬럼 편집 진입 패턴).
36
30
 
37
- ```ts
38
- size = input<"sm" | "lg">();
39
- inset = input(false);
40
- ```
31
+ ### `SdAdditionalButton` — `<sd-additional-button>`
41
32
 
42
- - 본문() + 우측 버튼 영역 묶음 컨트롤. `<sd-anchor>`/`<sd-button>`콘텐츠로 투영하면 우측 버튼 영역에 배치. 값 표시 + 보조 액션 조합용.
33
+ 좌측에 자유 콘텐츠(`._content` flex-fill), 우측에 투영된 `sd-anchor`/`sd-button`배치하는 테두리 컨테이너.
43
34
 
44
- ### SdModalSelectButton`<sd-modal-select-button>`
35
+ - `size: "sm"|"lg"` 콘텐츠/버튼 패딩 스케일.
36
+ - `inset: boolean` — true 면 테두리·라운드 제거.
45
37
 
46
- ```ts
47
- modal = input.required<SdSelectModalInfo<SdSelectModal<K>>>();
48
- value = model<SelectModeValue<K>[M]>();
49
- disabled; required; inset; size = input<"sm"|"lg">();
50
- selectMode = input<M>("single"); // "single" | "multi"
51
- modalOptions = input<SdModalOptions>();
52
- searchIcon = input(tablerSearch);
53
- // SdSelectModal<TKey> = SdModalContentDef<SelectModalOutputResult<TKey>> + selectMode/selectedKeys inputs
54
- // SdSelectModalInfo<T> = SdModalInfo<T, "selectMode" | "selectedKeys">
55
- ```
38
+ ### `SdModalSelectButton<K, M>` — `<sd-modal-select-button>`
56
39
 
57
- - 모달로 선택해 값을 채우는 버튼. 검색 버튼 클릭 `modal` 띄워(현재 값·selectMode 자동 주입) 결과 `{ selectedKeys }` 로 `value` 갱신.
58
- - `selectMode` — `"single"`=`value` 가 단일 키, `"multi"`=키 배열. 지우기(eraser) 버튼은 `required=false` 이고 값이 있을 때만 노출.
59
- - `required` 면 빈 선택 시 native invalid(`setupInvalid`). `modal` 은 `SdSelectModal` 계약(selectMode input + selectedKeys model)을 구현한 모달.
60
-
61
- ## 텍스트·숫자·날짜 입력
62
-
63
- ### SdTextfield — `<sd-textfield>`
64
-
65
- ```ts
66
- value = model<SdTextfieldTypes[K]>();
67
- type = input.required<K>(); // K extends keyof SdTextfieldTypes
68
- placeholder; title; inputStyle; inputClass;
69
- disabled; readonly; required;
70
- min/max = input<SdTextfieldTypes[K]>(); minlength; maxlength; pattern = input<string>();
71
- validatorFn = input<(value) => string | undefined>(); format = input<string>();
72
- step; autocomplete; useNumberComma = input(true); minDigits = input<number>();
73
- inline; inset; size = input<"sm"|"lg">(); theme;
74
- // SdTextfieldTypes: number, text, password, color, email, format,
75
- // date/month/year(DateOnly), datetime/datetime-sec(DateTime), time/time-sec(Time)
76
- ```
40
+ 값을 모달로 선택하는 버튼(검색 버튼 클릭 모달 선택 반영). `M extends "single"|"multi"`.
77
41
 
78
- - `type` 타입을 결정(제네릭으로 `value` 타입 추론). 날짜·시간 타입은 `DateOnly`/`DateTime`/`Time` 객체를 값으로 주고받음(문자열 아님).
79
- - `format``type="format"` 에서 `X` 자리 마스크(예: `"XXX-XXXX"`, `|` 길이 분기). `type="number"` 의 `useNumberComma`=천단위 콤마 표시, `minDigits`=최소 소수자릿수.
80
- - `required`/`min`/`max`/`minlength`/`maxlength`/`pattern`/`validatorFn` 타입별 핸들러 + 사용자 함수로 검증, 실패 native invalid 표시. `readonly`/`disabled` input 대신 표시용 텍스트만 렌더.
81
- - `sdTextfieldTypes` — `(keyof SdTextfieldTypes)[]` 상수. 타입 목록을 순회/검증할 사용.
42
+ - `modal: SdSelectModalInfo<SdSelectModal<K>>` (required) 검색 모달 정의. `SdSelectModal<K>` = `SdModalContentDef<SelectModalOutputResult<K>>` + `selectMode`/`selectedKeys` input 가진 컴포넌트(버튼이 그 둘을 주입하므로 `inputs` 에서 제외됨).
43
+ - `value: model<SelectModeValue<K>[M]>` single 이면 `K`, multi `K[]`.
44
+ - `selectMode: M` (기본 `"single"`) `"single"` = 단일 키, eraser `undefined` 초기화; `"multi"` = `K[]`, eraser `[]` 로 초기화.
45
+ - `required: boolean` — true 값일 "선택된 항목이 없습니다." 검증 + eraser 숨김.
46
+ - `disabled: boolean` — true 면 검색·eraser 버튼 숨김.
47
+ - `inset: boolean` / `size: "sm"|"lg"` — 스타일.
48
+ - `modalOptions: SdModalOptions` — 모달 provider 로 전달할 옵션.
49
+ - `searchIcon` (기본 `tablerSearch`) — 검색 버튼 아이콘.
50
+ - 메서드: `onSearchClick(event)` — 모달을 `selectMode`·현재 `selectedKeys` 로 열고, 확정 시 value 갱신. `onEraseClick()` — 값 클리어.
82
51
 
83
52
  ```html
84
- <sd-textfield [type]="'number'" [(value)]="qty" [required]="true" [min]="1" />
85
- <sd-textfield [type]="'date'" [(value)]="orderDate" />
53
+ <sd-modal-select-button [(value)]="data().customerId" [modal]="{ type: CustomerList, title: '고객사', inputs: {} }" />
86
54
  ```
87
55
 
88
- ### SdTextarea — `<sd-textarea>`
56
+ ## 입력
57
+
58
+ ### `SdTextfield<K>` — `<sd-textfield>`
59
+
60
+ 값 타입은 `type` input 으로 결정(`SdTextfieldTypes[K]`).
61
+
62
+ - `type: K` (required) — `SdTextfieldTypes` 키 중 하나(아래). parse/format/validate 핸들러와 native 컨트롤 타입을 결정.
63
+ - `value: model<SdTextfieldTypes[K]>` — 타입드 값(`number`/`string`/`DateOnly`/`DateTime`/`Time`).
64
+ - `placeholder` / `title` — placeholder 텍스트; `title` 미지정 시 placeholder 사용.
65
+ - `disabled: boolean` — true 면 `<input>` 미렌더, 읽기전용 display 박스(회색).
66
+ - `readonly: boolean` — true 면 display 텍스트만 표시.
67
+ - `required: boolean` — true 면 빈 값일 때 "값을 입력하세요.".
68
+ - `min`/`max: SdTextfieldTypes[K]` — 타입드 경계. 위반 시 "…보다 크거나/작거나 같아야 합니다.".
69
+ - `minlength`/`maxlength: number` — 문자열 길이 경계(text/email/password).
70
+ - `pattern: string` — 정규식(문자열 타입); 불일치 시 "입력 값이 형식에 맞지 않습니다.".
71
+ - `validatorFn: (value) => string | undefined` — 커스텀 검증; 반환 문자열이 에러에 추가.
72
+ - `format: string` — `type="format"` 용 `X` 마스크(예 `XXX-XXXX|XXX-XXX-XXXX`, `|` 로 대안). 비-`X` 리터럴을 파싱 시 제거·표시 시 재삽입.
73
+ - `step: number` — native step 재정의.
74
+ - `autocomplete: string` — native autocomplete.
75
+ - `useNumberComma: boolean` (기본 `true`) — number 일 때 천단위 콤마 표시. `false` 면 plain `toString`.
76
+ - `minDigits: number` — number 표시 시 최소 소수 자릿수.
77
+ - `inline`/`inset`/`size: "sm"|"lg"`/`theme`(표준 테마 셋, 배경 틴트) — 스타일.
78
+
79
+ `SdTextfieldTypes` 키별 값 타입(`type` 으로 지정):
80
+
81
+ - `number → number` — 숫자 입력(`useNumberComma`·`min`/`max`).
82
+ - `text → string` / `email → string` / `password → string` — 문자열(길이·패턴 적용).
83
+ - `color → string` — native `type=color`(길이·패턴 미적용).
84
+ - `format → string` — `format` 마스크.
85
+ - `date → DateOnly`(`yyyy-MM-dd`) / `month → DateOnly`(`yyyy-MM`) / `year → DateOnly`(text, `yyyy`).
86
+ - `datetime → DateTime`(`datetime-local`) / `datetime-sec → DateTime`(초 포함, default step 1).
87
+ - `time → Time`(`HH:mm`) / `time-sec → Time`(초 포함, default step 1).
88
+
89
+ `sdTextfieldTypes: (keyof SdTextfieldTypes)[]` — 위 키 전체의 순서 배열(셀렉트 옵션 등에 사용).
89
90
 
90
- ```ts
91
- value = model<string>();
92
- placeholder; title; minRows = input(1);
93
- disabled; readonly; required; inline; inset; size = input<"sm"|"lg">();
94
- validatorFn = input<(value: string | undefined) => string | undefined>();
95
- theme; inputStyle; inputClass;
91
+ ```html
92
+ <sd-textfield [type]="'text'" [(value)]="filter().searchText" (valueChange)="mark(filter)" />
93
+ <sd-textfield [type]="'number'" [(value)]="data().qty" (valueChange)="mark(data)" />
96
94
  ```
97
95
 
98
- - 여러 줄 텍스트. 행 수는 `minRows` 줄바꿈 개수 중 큰 값으로 자동 확장. 빈 입력은 undefined(결측 보존).
99
-
100
- ### SdNumpad — `<sd-numpad>`
96
+ ### `SdTextarea` `<sd-textarea>`
101
97
 
102
- ```ts
103
- value = model<number>(); placeholder; required;
104
- inputDisabled = input(false); useEnterButton = input(false); useMinusButton = input(false);
105
- enterButtonClick = output();
106
- ```
98
+ - `value: model<string>` — 빈 값이면 `undefined`.
99
+ - `minRows: number` (기본 1) 실제 행 수 = `max(minRows, 줄 수)`.
100
+ - `disabled`/`readonly: boolean` 정적 display 박스.
101
+ - `required: boolean` — 빈 값일 때 "값을 입력하세요.".
102
+ - `inline`/`inset`/`size: "sm"|"lg"`/`theme`/`validatorFn`/`inputStyle`/`inputClass`.
107
103
 
108
- - 터치 숫자 키패드. 상단 표시 textfield + 0~9·소수점·BS·C 버튼. `useEnterButton`=ENT 버튼 노출(눌리면 `enterButtonClick`), `useMinusButton`=부호 토글 버튼, `inputDisabled`=상단 직접 입력 차단(버튼만).
104
+ ### `SdNumpad` `<sd-numpad>`
109
105
 
110
- ### SdRange `<sd-range>`
106
+ 화면 숫자 키패드 + textfield 표시.
111
107
 
112
- ```ts
113
- type = input.required<K>(); // keyof SdTextfieldTypes
114
- from = model<SdTextfieldTypes[K]>(); to = model<SdTextfieldTypes[K]>();
115
- inputStyle; required; disabled;
116
- ```
108
+ - `value: model<number>` — 파싱된 값(내부 `text` 와 동기).
109
+ - `placeholder` / `required: boolean`(빈 값이면 ENT 비활성) / `inputDisabled: boolean`(상단 textfield 비활성, 키패드는 사용 가능).
110
+ - `useEnterButton: boolean` true 면 ENT 버튼 표시 → `enterButtonClick` emit.
111
+ - `useMinusButton: boolean` — true 면 `-` 부호 토글 버튼 표시.
112
+ - `enterButtonClick: output()` — ENT 클릭 시.
117
113
 
118
- - `from ~ to` 두 textfield 묶음. `to` 의 min 이 `from` 으로 자동 설정. 날짜/숫자 범위 입력에 사용.
114
+ ### `SdRange<K>` `<sd-range>`
119
115
 
120
- ### SdDateRangePicker `<sd-date-range-picker>`
116
+ `~` 묶인 두 `sd-textfield`(`to.min` 은 `from` 에 바인딩).
121
117
 
122
- ```ts
123
- periodType = model<"일" | "월" | "범위">("범위");
124
- from = model<DateOnly>(); to = model<DateOnly>(); required;
125
- ```
118
+ - `type: K` (required) — 양끝 textfield 타입.
119
+ - `from`/`to: model<SdTextfieldTypes[K]>` 범위 양끝.
120
+ - `required: boolean`(양끝 적용) / `disabled: boolean`(양끝 비활성) / `inputStyle`.
126
121
 
127
- - 기간 선택. `periodType` `"일"`=단일 날짜(from=to), `"월"`=해당 월 1일~말일 자동 세팅, `"범위"`=from/to 직접. 검색 필터의 기간 조건에 사용.
122
+ ### `SdDateRangePicker` `<sd-date-range-picker>`
128
123
 
129
- ## 체크박스·스위치
124
+ 기간 타입 셀렉트 + 날짜/월/범위 입력.
130
125
 
131
- ### SdCheckbox`<sd-checkbox>`
126
+ - `periodType: model<"일"|"월"|"범위">` (기본 `"범위"`) `"일"` = 단일 날짜(to=from); `"월"` = 월 필드(범위를 그달 1일~말일로); `"범위"` = 두 날짜 필드 range.
127
+ - `from`/`to: model<DateOnly>` — 결과 범위(`"범위"` 에서 `to ≥ from` 클램프).
128
+ - `required: boolean` — 내부 필드 적용.
132
129
 
133
- ```ts
134
- value = model(false);
135
- canChangeFn = input<(item: boolean) => boolean | Promise<boolean>>(() => true);
136
- icon = input(tablerCheck); radio = input(false); disabled;
137
- size = input<"sm"|"lg">(); inline; inset;
138
- theme = input<...|"white">(); contentStyle = input<string>();
130
+ ```html
131
+ <sd-date-range-picker [(from)]="filter().fromDate" [(to)]="filter().toDate" (fromChange)="mark(filter)" (toChange)="mark(filter)" />
139
132
  ```
140
133
 
141
- - `value` — 체크 상태(model 양방향). `canChangeFn` 이 false 반환 시 변경 거부(`setupModelHook`), Promise 면 비동기 확인 후 적용.
142
- - `radio` — true 면 라디오 외형(클릭 시 항상 true 로만 set, 해제 불가). `icon` 으로 체크 아이콘 교체, `theme="white"` 는 어두운 배경용.
134
+ ## 체크박스·스위치
143
135
 
144
- ### SdSwitch — `<sd-switch>`
136
+ ### `SdCheckbox` — `<sd-checkbox>`
145
137
 
146
- ```ts
147
- value = model(false);
148
- canChangeFn = input<(item: boolean) => boolean | Promise<boolean>>(() => true);
149
- disabled; inline; inset; size = input<"sm"|"lg">(); theme;
138
+ - `value: model(false)` — 체크 상태.
139
+ - `radio: boolean` — true 면 라디오 외형(원형·채운 점)이며 클릭은 항상 `true` 로(해제 불가); false 면 토글 체크박스.
140
+ - `canChangeFn: (item: boolean) => boolean | Promise<boolean>` (기본 `() => true`) — 변경 가드(`setupModelHook`). `false`/reject 면 변경 거부.
141
+ - `icon` (기본 `tablerCheck`) 체크 아이콘(라디오 모드에선 무시).
142
+ - `disabled`/`size: "sm"|"lg"`/`inline`/`inset`/`contentStyle`.
143
+ - `theme` — 표준 테마 셋 + `white`(흰 배경·연한 테두리·체크 시 primary).
144
+
145
+ ```html
146
+ <sd-checkbox [(value)]="data().isActive" (valueChange)="mark(data)">활성</sd-checkbox>
147
+ <sd-checkbox [radio]="true" [value]="mode() === 'a'" (valueChange)="mode.set('a')">A</sd-checkbox>
150
148
  ```
151
149
 
152
- - 토글 스위치. on 이면 success(또는 `theme`) 색. `canChangeFn` 동작은 체크박스와 동일.
150
+ ### `SdSwitch` `<sd-switch>`
153
151
 
154
- ### SdCheckboxGroup / SdCheckboxGroupItem `<sd-checkbox-group>` / `<sd-checkbox-group-item>`
152
+ - `value: model(false)`on/off.
153
+ - `canChangeFn` — 변경 가드(기본 `() => true`).
154
+ - `theme`(표준 테마 셋, on 트랙 색·기본 success) / `disabled`/`inline`/`inset`/`size: "sm"|"lg"`.
155
155
 
156
- ```ts
157
- // group
158
- value = model<T[]>([]); disabled = input(false);
159
- // item
160
- value = input.required<T>(); inline = input(false);
161
- ```
156
+ ### `SdCheckboxGroup<T>` / `SdCheckboxGroupItem<T>` — `<sd-checkbox-group>` / `<sd-checkbox-group-item>`
162
157
 
163
- - 그룹은 선택된 값 배열(`T[]`)을 보유. item `value` 그룹 배열에 포함되면 체크, 토글 시 배열에서 추가/제거. 다중 선택 묶음에 사용.
158
+ - 그룹: `value: model<T[]>([])` 선택 항목 배열. `disabled: boolean` 자식에 전파.
159
+ - 아이템: `value: input.required<T>()` — 이 항목 값. `inline: boolean`. 클릭 시 부모 배열에 추가/제거.
164
160
 
165
- ## 선택(select)·드롭다운
161
+ ## 셀렉트·드롭다운
166
162
 
167
- ### SdSelect — `<sd-select>`
163
+ ### `SdSelect<M, T>` — `<sd-select>`
168
164
 
169
- ```ts
170
- selectMode = input("single"); // "single" | "multi"
171
- value = model<SelectModeValue<any>[M]>(); // single=T, multi=T[]
172
- placeholder; disabled; inline; inset; size = input<"sm"|"lg">(); required;
173
- hideSelectAll = input(false); multiSelectionDisplayDirection = input<"vertical">();
174
- items = input<T[]>(); trackByFn = input<(item, index) => unknown>((item)=>item);
175
- getChildrenFn = input<(item: T) => T[] | undefined>();
176
- contentClass; contentStyle; dropdownOpen = model(false);
177
- // SelectModeValue<T> = { multi: T[]; single: T }
178
- selectItem(v); toggleItem(v); onSelectAll(); onDeselectAll(); openDropdown(); closeDropdown();
179
- ```
165
+ `SelectModeValue<T> = { multi: T[]; single: T }`.
180
166
 
181
- - `selectMode` — `"single"`=단일(선택 시 닫힘), `"multi"`=다중(체크박스·전체선택바). `value` 타입이 모드에 따라 분기.
182
- - 항목은 `<sd-select-item>` 콘텐츠로 두거나 `items`+`itemOf` 템플릿으로 렌더. `getChildrenFn` 지정 시 트리 평탄화. `hideSelectAll`=multi 전체선택바 숨김, `multiSelectionDisplayDirection="vertical"`=선택 표시 세로 나열.
183
- - `#headerTpl`/`#beforeTpl`/`itemOf` 템플릿 슬롯으로 검색바·상단 항목·반복 항목 커스터마이즈. `<sd-select-button>` 콘텐츠는 우측 액션 버튼으로 투영.
167
+ - `selectMode: M` (기본 `"single"`) — `"single"`(단일 값, 선택 시 닫힘) / `"multi"`(배열 값, 체크박스·전체선택 바, 열린 채 유지).
168
+ - `value: model<SelectModeValue<any>[M]>` 선택 값(들).
169
+ - `placeholder: string` 미선택 회색 표시.
170
+ - `required: boolean` — 빈 값(null/빈 배열)일 때 "선택된 항목이 없습니다.".
171
+ - `hideSelectAll: boolean` — true 면 multi 모드 "전체선택/전체해제" 바 숨김.
172
+ - `multiSelectionDisplayDirection: "vertical"` — multi 선택 라벨을 세로 스택(기본 인라인 콤마).
173
+ - `items: T[]` — 템플릿 구동 렌더용 데이터(`SdItemOfTemplate` 와 함께). `trackByFn`/`getChildrenFn`(계층 평탄화) 동반.
174
+ - `disabled`/`inline`/`inset`/`size: "sm"|"lg"`/`contentClass`/`contentStyle`.
175
+ - `dropdownOpen: model(false)` — 열림 상태.
176
+
177
+ 정적 선택지는 `<sd-select-item>` 자식으로 구성:
184
178
 
185
179
  ```html
186
- <sd-select [(value)]="status" [required]="true">
187
- <sd-select-item [value]="'active'">사용</sd-select-item>
188
- <sd-select-item [value]="'inactive'">미사용</sd-select-item>
180
+ <sd-select [(value)]="data().state" (valueChange)="mark(data)">
181
+ <sd-select-item [value]="'작성'">작성</sd-select-item>
182
+ <sd-select-item [value]="'승인'">승인</sd-select-item>
189
183
  </sd-select>
190
184
  ```
191
185
 
192
- ### SdSelectItem — `<sd-select-item>`
186
+ ### `SdSelectItem<T>` — `<sd-select-item>`
193
187
 
194
- ```ts
195
- value = input<T | undefined>(undefined); disabled = input(false); hidden = input(false);
196
- ```
188
+ - `value: T | undefined` — 이 항목 값.
189
+ - `disabled: boolean` 회색·비클릭, 전체선택 제외.
190
+ - `hidden: boolean` — `display:none`, 전체선택 제외.
197
191
 
198
- - 한 선택 항목. multi 모드면 좌측 체크박스 자동 표시. `value` 부모 select 값과 매칭되면 선택 강조. `hidden`=DOM 유지하되 숨김(검색 필터 등).
192
+ ### `SdSelectButton` `<sd-select-button>`
199
193
 
200
- ### SdSelectButton `<sd-select-button>`
194
+ `sd-select` 우측에 슬롯되는 액션 버튼. input/output 없음(ripple 만 설정).
201
195
 
202
- ```ts
203
- // 입력 없음. 콘텐츠 투영용.
204
- ```
196
+ ### `SdDropdown` / `SdDropdownPopup` — `<sd-dropdown>` / `<sd-dropdown-popup>`
205
197
 
206
- - select 우측에 붙는 액션 버튼 슬롯(ripple 내장). 관리/검색 모달 트리거 등에 사용.
198
+ 트리거 + body-append 팝업. 모바일(≤520px) backdrop 바텀시트, 데스크탑은 인접 배치.
207
199
 
208
- ### SdDropdown / SdDropdownPopup`<sd-dropdown>` / `<sd-dropdown-popup>`
200
+ - 드롭다운: `open: model(false)`열림 상태. `disabled: boolean` — true 면 tabindex 제거·열기 차단.
201
+ - 팝업: 콘텐츠 300px 초과 시 자체 높이 캡. input 없음.
209
202
 
210
- ```ts
211
- // dropdown
212
- open = model(false); disabled = input(false);
213
- // popup: 입력 없음
203
+ ```html
204
+ <sd-dropdown [(open)]="open">
205
+ <div>트리거</div>
206
+ <sd-dropdown-popup>...</sd-dropdown-popup>
207
+ </sd-dropdown>
214
208
  ```
215
209
 
216
- - 임의 콘텐츠를 여는 드롭다운. 트리거 콘텐츠 + `<sd-dropdown-popup>` 한 쌍. 열리면 popup 을 body 로 이동해 위치 계산(모바일은 하단 시트 + backdrop). 키보드 ↑/↓/Esc/Space 로 열고닫기·이동. select·테마셀렉터·탑바메뉴가 내부 사용.
210
+ ##
217
211
 
218
- ## 폼·접기·탭·리스트·기타
212
+ ### `SdForm` — `<sd-form>`
219
213
 
220
- ### SdForm `<sd-form>`
214
+ native `<form novalidate>` + 숨김 submit 버튼 래퍼. 폼 안 Enter 자동 제출에. (`sd-crud-list`/`sd-crud-detail` 은 이미 내장하므로 별도 래핑 불필요)
221
215
 
222
- ```ts
223
- formElRef = viewChild.required<ElementRef<HTMLFormElement>>("formEl");
224
- get formEl: HTMLFormElement;
225
- formSubmit = output<SubmitEvent>(); formInvalid = output();
226
- requestSubmit(): void;
227
- ```
228
-
229
- - native form 래퍼. 제출 시 `checkValidity()` 통과하면 `formSubmit`, 실패하면 `reportValidity()` 후 `formInvalid`. `requestSubmit()` 으로 외부에서 제출 트리거(CTRL+S 등).
216
+ - `formSubmit: output<SubmitEvent>` — `checkValidity()` 통과 시 emit.
217
+ - `formInvalid: output()` — 검증 실패 시(`reportValidity()` 로 메시지·포커스 후).
218
+ - 메서드: `requestSubmit()` — 프로그래밍 제출. `get formEl(): HTMLFormElement`.
230
219
 
231
220
  ```html
232
- <sd-form (formSubmit)="onSubmit()"> ... <sd-button [type]="'submit'">저장</sd-button> </sd-form>
221
+ <sd-form (formSubmit)="onSearch()">...<sd-button [type]="'submit'">조회</sd-button></sd-form>
233
222
  ```
234
223
 
235
- ### SdCollapse / SdCollapseIcon — `<sd-collapse>` / `<sd-collapse-icon>`
224
+ ## 접기·탭·리스트
236
225
 
237
- ```ts
238
- // collapse
239
- open = input(false);
240
- // collapse-icon
241
- icon = input(tablerChevronDown); open = input(false); openRotate = input(90);
242
- ```
226
+ ### `SdCollapse` / `SdCollapseIcon` — `<sd-collapse>` / `<sd-collapse-icon>`
243
227
 
244
- - `sd-collapse` `open` 따라 콘텐츠 높이를 애니메이션 접기/펼치기. `sd-collapse-icon` `open` `openRotate`(deg) 회전하는 펼침 표시 아이콘(보통 collapse 헤더에 동반).
228
+ - collapse: `open: boolean` true 펼침(margin-top 0), false 접힘(`-{높이}px`). 애니메이션 0.1s.
229
+ - icon: `open: boolean` — true 면 `openRotate` 도 회전. `openRotate: number`(기본 90) — 펼침 시 회전 각도. `icon`(기본 `tablerChevronDown`).
245
230
 
246
- ### SdTab / SdTabItem — `<sd-tab>` / `<sd-tab-item>`
231
+ ### `SdTab` / `SdTabItem` — `<sd-tab>` / `<sd-tab-item>`
247
232
 
248
- ```ts
249
- // tab
250
- value = model<any>();
251
- // tab-item
252
- value = input<any>();
253
- ```
233
+ 현재 탭 값을 고르는 **선택 컨트롤**(콘텐츠 컨테이너 아님). 콘텐츠는 바깥 `@if`/`@switch` 로 분기. 표준 패턴은 [client-tab.md](../manuals/client-tab.md).
254
234
 
255
- - `sd-tab` 현재 탭 값을 고르는 선택 컨트롤(콘텐츠 컨테이너 아님). `sd-tab-item` 의 `value` 가 부모 값과 같으면 선택. 콘텐츠 분기는 바깥에서 `@if`/`@switch` 로. 값 시그널은 literal union 으로.
235
+ - 탭: `value: model<any>` 현재 선택값(양방향 필수).
236
+ - 탭아이템: `value: any` — 이 항목 식별값. 클릭 시 부모 `value` 로 set, 부모 값과 비교해 선택 자동 결정.
256
237
 
257
238
  ```html
258
239
  <sd-tab [(value)]="activeTab">
@@ -261,36 +242,29 @@ value = input<any>();
261
242
  </sd-tab>
262
243
  ```
263
244
 
264
- ### SdList / SdListItem — `<sd-list>` / `<sd-list-item>`
245
+ ### `SdList` / `SdListItem` — `<sd-list>` / `<sd-list-item>`
265
246
 
266
- ```ts
267
- // list
268
- inset = input(false);
269
- // list-item
270
- layout = input<"accordion" | "flat">("accordion");
271
- open = model(false); selected = input(false); selectedIcon = input<string>();
272
- readonly = input(false); contentStyle; contentClass;
273
- // #toolTpl 슬롯, 중첩 <sd-list> 로 트리
274
- ```
247
+ - list: `inset: boolean` — true 면 투명 배경·테두리 제거(카드 chrome 제거). 중첩 리스트는 항상 chrome 없음.
248
+ - item: `layout: "accordion"|"flat"` (기본 `"accordion"`) — `"accordion"` = 자식 클릭 접기/펼치기·chevron·들여쓰기; `"flat"` = 자식 항상 표시, 자식 가진 항목은 작은 섹션 헤더로(비클릭).
249
+ - `open: model(false)` — accordion 펼침 상태.
250
+ - `selected: boolean` — 강조/볼드. `selectedIcon: string` — leaf 선두 아이콘(선택 시 primary).
251
+ - `readonly: boolean` 비대화(기본 커서·ripple 없음·클릭 무시).
252
+ - `contentStyle`/`contentClass`, `#toolTpl` 우측 도구 템플릿.
275
253
 
276
- - `inset` — 카드 외형(테두리·배경) 제거(임베드용). list-item 의 `layout` `"accordion"`=클릭 시 자식 펼침(트리), `"flat"`=섹션 헤더(항상 펼침).
277
- - `selected`=선택 강조, `selectedIcon`=리프 항목 좌측 선택 아이콘, `readonly`=클릭 펼침 비활성. 자식 `<sd-list>` 중첩으로 다단 트리. 사이드바 메뉴가 이를 사용.
254
+ ## 갭·페이지네이션
278
255
 
279
- ### SdGap — `<sd-gap>`
256
+ ### `SdGap` — `<sd-gap>`
280
257
 
281
- ```ts
282
- height/width = input<"xxs"|"xs"|"sm"|"default"|"lg"|"xl"|"xxl">();
283
- heightPx; widthPx; widthEm = input<number>();
284
- ```
258
+ 스페이서. width 입력이 height 보다 우선.
285
259
 
286
- - 간격 스페이서. 토큰(`height`/`width`) 또는 px/em 으로 지정. width 류면 inline-block, height block, 0 이면 미표시.
260
+ - `height` / `width: "xxs"|"xs"|"sm"|"default"|"lg"|"xl"|"xxl"` 명명 갭 토큰(`--gap-{key}`). height `display:block`, width `inline-block`.
261
+ - `heightPx`/`widthPx`/`widthEm: number` — 명시 px/em. `0` 이면 `display:none`.
287
262
 
288
- ### SdPagination — `<sd-pagination>`
263
+ ### `SdPagination` — `<sd-pagination>`
289
264
 
290
- ```ts
291
- currentPage = model(0); // 0-based
292
- totalPageCount = input(0); visiblePageCount = input(10);
293
- goToPage(p); goToFirst(); goToLast(); goToNextGroup(); goToPrevGroup();
294
- ```
265
+ 처음/이전그룹/페이지번호/다음그룹/마지막. 내부 0-base, 표시 1-base. (`sd-sheet`/`sd-crud-list` 가 내장하므로 단독 사용은 드묾)
295
266
 
296
- - 페이지 네비게이션. `currentPage` 0-base 양방향. `visiblePageCount` 묶음 단위로 이전/다음 그룹·처음/끝 이동. 시트·리스트 페이징에 사용.
267
+ - `currentPage: model(0)` 0-base 현재 페이지.
268
+ - `totalPageCount: number` (기본 0) — 총 페이지. `0` 이면 페이지 없음·내비 비활성.
269
+ - `visiblePageCount: number` (기본 10) — 그룹당 페이지 번호 개수.
270
+ - 메서드: `goToPage(page)`/`goToNextGroup()`/`goToPrevGroup()`/`goToFirst()`/`goToLast()`.