@simplysm/sd-claude 14.0.82 → 14.0.84
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.
- package/claude/references/sd-requirement-source-handling.md +20 -20
- package/claude/references/sd-simplysm14/README.md +13 -13
- package/claude/references/sd-simplysm14/manuals/client-component.md +92 -92
- package/claude/references/sd-simplysm14/manuals/client-crud.md +11 -11
- package/claude/references/sd-simplysm14/manuals/client-demo.md +28 -28
- package/claude/references/sd-simplysm14/manuals/client-rules.md +1 -1
- package/claude/references/sd-simplysm14/manuals/client-setup.md +21 -21
- package/claude/references/sd-simplysm14/manuals/client-tab.md +3 -3
- package/claude/references/sd-simplysm14/manuals/logging.md +15 -15
- package/claude/references/sd-simplysm14/manuals/orm-union.md +6 -6
- package/claude/references/sd-simplysm14/manuals/orm.md +19 -19
- package/claude/references/sd-simplysm14/manuals/test.md +33 -33
- package/claude/rules/sd-design-rules.md +18 -18
- package/claude/sd-system-prompt.md +369 -0
- package/claude/skills/sd-commit/SKILL.md +10 -10
- package/claude/skills/sd-config/SKILL.md +2 -2
- package/claude/skills/sd-demo/SKILL.md +45 -45
- package/claude/skills/sd-dev/SKILL.md +15 -15
- package/claude/skills/sd-docs/SKILL.md +7 -7
- package/claude/skills/sd-docs/references/subagent-prompt.md +33 -33
- package/claude/skills/sd-impl/SKILL.md +60 -60
- package/claude/skills/sd-review/SKILL.md +9 -9
- package/claude/skills/sd-skill/SKILL.md +74 -74
- package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +1 -1
- package/claude/skills/sd-spec/SKILL.md +354 -319
- package/claude/skills/sd-spec/references/example-spec.md +104 -104
- package/claude/skills/sd-unpack/SKILL.md +34 -34
- package/claude/skills/sd-unpack/scripts/handlers/__pycache__/office_com.cpython-314.pyc +0 -0
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +234 -159
- package/claude/skills/sd-use/SKILL.md +4 -4
- package/package.json +1 -1
- package/claude/references/sd-simplysm14/apis/angular/README.md +0 -37
- package/claude/references/sd-simplysm14/apis/angular/app-structure.md +0 -92
- package/claude/references/sd-simplysm14/apis/angular/buttons.md +0 -88
- package/claude/references/sd-simplysm14/apis/angular/crud.md +0 -100
- package/claude/references/sd-simplysm14/apis/angular/forms.md +0 -200
- package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +0 -231
- package/claude/references/sd-simplysm14/apis/angular/kanban.md +0 -80
- package/claude/references/sd-simplysm14/apis/angular/layout.md +0 -92
- package/claude/references/sd-simplysm14/apis/angular/modal.md +0 -115
- package/claude/references/sd-simplysm14/apis/angular/routing.md +0 -107
- package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +0 -35
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +0 -82
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +0 -134
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +0 -127
- package/claude/references/sd-simplysm14/apis/angular/toast.md +0 -97
- package/claude/references/sd-simplysm14/apis/angular/visual.md +0 -167
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +0 -79
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +0 -83
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +0 -91
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +0 -49
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +0 -143
- package/claude/references/sd-simplysm14/apis/core-common/README.md +0 -58
- package/claude/references/sd-simplysm14/apis/core-common/extensions.md +0 -88
- package/claude/references/sd-simplysm14/apis/core-common/features.md +0 -51
- package/claude/references/sd-simplysm14/apis/core-common/types.md +0 -88
- package/claude/references/sd-simplysm14/apis/core-common/utils.md +0 -189
- package/claude/references/sd-simplysm14/apis/core-node/README.md +0 -12
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +0 -59
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +0 -44
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +0 -42
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +0 -53
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +0 -24
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +0 -65
- package/claude/references/sd-simplysm14/apis/excel/README.md +0 -193
- package/claude/references/sd-simplysm14/apis/lint/README.md +0 -94
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +0 -58
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +0 -77
- package/claude/references/sd-simplysm14/apis/orm-common/executable.md +0 -20
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +0 -92
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +0 -98
- package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +0 -128
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +0 -69
- package/claude/references/sd-simplysm14/apis/sd-claude/README.md +0 -32
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +0 -80
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +0 -155
- package/claude/references/sd-simplysm14/apis/service-client/README.md +0 -131
- package/claude/references/sd-simplysm14/apis/service-common/README.md +0 -29
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +0 -63
- package/claude/references/sd-simplysm14/apis/service-common/messages.md +0 -56
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +0 -64
- package/claude/references/sd-simplysm14/apis/service-common/service-types.md +0 -43
- package/claude/references/sd-simplysm14/apis/service-server/README.md +0 -13
- package/claude/references/sd-simplysm14/apis/service-server/auth.md +0 -39
- package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +0 -71
- package/claude/references/sd-simplysm14/apis/service-server/define-service.md +0 -55
- package/claude/references/sd-simplysm14/apis/service-server/internals.md +0 -82
- package/claude/references/sd-simplysm14/apis/service-server/server.md +0 -57
- package/claude/references/sd-simplysm14/apis/storage/README.md +0 -71
- package/claude/rules/sd-base-rules.md +0 -306
package/package.json
CHANGED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular
|
|
2
|
-
|
|
3
|
-
Angular 기반 simplysm 공통 UI/상태/인프라 컴포넌트·디렉티브·서비스 모음. zoneless·signal 기반. 모든 컴포넌트 standalone.
|
|
4
|
-
|
|
5
|
-
## 사용 트리거 인덱스
|
|
6
|
-
|
|
7
|
-
- **provideSdAngular / SdAngularConfigProvider** — 앱 부트스트랩 시 1회. 아래 "부트스트랩" 참조.
|
|
8
|
-
- **버튼류** (`SdButton`/`SdAnchor`/`SdAdditionalButton`/`SdModalSelectButton`/`SdSelectModal`/`SdSelectModalInfo`) — 클릭 트리거 UI. 자세히: [buttons.md](./buttons.md)
|
|
9
|
-
- **폼 입력류** (`SdTextfield`/`SdTextfieldTypes`/`sdTextfieldTypes`/`SdTextarea`/`SdNumpad`/`SdRange`/`SdDateRangePicker`/`SdSelect`/`SelectModeValue`/`SdSelectItem`/`SdSelectButton`/`SdCheckbox`/`SdSwitch`/`SdCheckboxGroup`/`SdCheckboxGroupItem`/`SdForm`/`SdDropdown`/`SdDropdownPopup`) — 값 입력·서밋. 자세히: [forms.md](./forms.md)
|
|
10
|
-
- **모달** (`SdModalProvider`/`SdModal`/`SdActivatedModalProvider`/`SdModalContentDef`/`SdModalInfo`/`SdModalOptions`/`SdPromptModal`/`SdConfirmModal`/`SelectModalOutputResult`) — 프로그래밍 다이얼로그. 자세히: [modal.md](./modal.md)
|
|
11
|
-
- **토스트·바쁨·프린트** (`SdToastProvider`/`SdToast`/`SdToastContainer`/`SdToastSeverity`/`SdToastTheme`/`SdToastContentDef`/`SdToastInput`/`SdBusyProvider`/`SdBusyContainer`/`SdBusyType`/`SdPrintProvider`/`SdPrint`/`SdPrintInput`) — 알림·로딩·인쇄. 자세히: [toast.md](./toast.md)
|
|
12
|
-
- **앱 구조·권한** (`SdAppStructureProvider`/`SdAppStructureUtils`/`SdMenu`/`SdFlatMenu`/`SdPermission`/`injectPermsSignal`/`SdPermissionTable`) — 메뉴 트리·권한 매트릭스. 자세히: [app-structure.md](./app-structure.md)
|
|
13
|
-
- **공유 데이터** (`SdSharedDataProvider`/`SharedDataBase`/`SharedDataInfo`/`SharedDataHandle`/`SdSharedDataChangeEvent`/`SdSharedDataSelect`/`SdSharedDataSelectButton`/`SdSharedDataSelectList`/`matchesSearchText`) — 서버 마스터데이터 캐시+선택 UI. 자세히: [shared-data.md](./shared-data.md)
|
|
14
|
-
- **시트** (`SdSheet`/`SdSheetColumn`/`SdSheetColumnCellTemplate`/`SdSheetConfigModal`/`SdSheetCellContext`/`SdSheetColumnDef`/`SdSheetConfig`/`SdSheetHeaderDef`/`SdSheetItemKeydownEventParam`/`SdSheetCellKeydownEventParam`) — 표 그리드. 자세히: [sheet.md](./sheet.md)
|
|
15
|
-
- **칸반** (`SdKanbanBoard`/`SdKanban`/`SdKanbanLane`/`SdKanbanBoardDropInfo`/`SdKanbanDragRef`/`SdKanbanDropTarget`) — 드래그 보드. 자세히: [kanban.md](./kanban.md)
|
|
16
|
-
- **CRUD 화면 골격** (`SdBaseContainer`/`SdCrudList`/`SdCrudDetail`/`SdStatePreset`/`SdStatePresetDef`) — 목록/상세 페이지 컨테이너. 자세히: [crud.md](./crud.md)
|
|
17
|
-
- **레이아웃** (`SdSidebarContainer`/`SdSidebar`/`SdSidebarMenu`/`SdSidebarUser`/`SdSidebarUserMenu`/`SdTopbarContainer`/`SdTopbar`/`SdTopbarMenu`/`SdTopbarUser`/`SdTopbarUserMenu`) — 사이드바·탑바 골격. 자세히: [layout.md](./layout.md)
|
|
18
|
-
- **셀렉트/확장/정렬 매니저** (`useSelectionManager`/`useExpandingManager`/`useSortingManager`/`ExpandItemDef`/`SortingDef`) — 리스트 내부 상태 헬퍼. 자세히: [selection-managers.md](./selection-managers.md)
|
|
19
|
-
- **라우팅** (`SdRouterLink`/`SdNavigateWindowProvider`/`injectCurrentPageCodeSignal`/`injectFullPageCodeSignal`/`injectViewTitleSignal`/`injectViewTypeSignal`/`SdViewType`/`setupCanDeactivate`/`getMenuRouterLinkOption`/`getIsMenuSelected`) — 라우터 보조. 자세히: [routing.md](./routing.md)
|
|
20
|
-
- **인프라/유틸** (`SdSystemLogProvider`/`SdLocalStorageProvider`/`SdSystemConfigProvider`/`injectSdSystemConfigResource`/`SdServiceClientFactoryProvider`/`SdFileDialogProvider`/`SdGlobalErrorHandlerPlugin`/`SdThemeProvider`/`SdThemeSelector`/`FormatPipe`/`mark`/`setSafeStyle`/`setupBgTheme`/`setupModelHook`/`DirectiveInputSignals`/`UndefToOptional`/`WithOptional`/`SdEvents`/`SdOptionEventPlugin`/`SdResizeDirective`/`SdResizeEvent`/`SdIntersectionDirective`/`SdIntersectionEvent`/`SdCommandDirective`/`SdRipple`/`setupRipple`/`SdShowEffect`/`setupRevealOnShow`/`SdInvalid`/`setupInvalid`/`SdTypedTemplate`/`SdItemOfTemplate`/`SdItemOfTemplateContext`) — 자세히: [infrastructure.md](./infrastructure.md)
|
|
21
|
-
- **시각 위젯** (`SdLabel`/`SdNote`/`SdProgress`/`SdCalendar`/`SdBarcode`/`BarcodeType`/`SdEcharts`/`SdTiptapEditor`/`SdAddressSearchModal`/`Address`/`SdCollapse`/`SdCollapseIcon`/`SdTab`/`SdTabItem`/`SdList`/`SdListItem`/`SdGap`/`SdPagination`) — 자세히: [visual.md](./visual.md)
|
|
22
|
-
|
|
23
|
-
## 부트스트랩
|
|
24
|
-
|
|
25
|
-
```ts
|
|
26
|
-
provideSdAngular(opt: { clientName: string }): EnvironmentProviders
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
- `clientName` — `SdAngularConfigProvider.clientName` 으로 저장. `SdLocalStorageProvider` 키 prefix, `SdServiceClientFactoryProvider` 의 `createServiceClient(clientName, …)`, `SdAppStructureProvider.initialize` 의 `itemsMap[clientName]` 조회에 사용.
|
|
30
|
-
- 호출 부수효과: zoneless change detection 활성, `IMAGE_CONFIG` 경고 끔, ng-icons 기본(stroke 1.5/size 1.33em), `EVENT_MANAGER_PLUGINS` 에 `SdOptionEventPlugin` 추가, `ErrorHandler` 를 `SdGlobalErrorHandlerPlugin` 으로 교체, `unhandledrejection`·`error` 글로벌 리스너 등록, `SdThemeProvider.dark`/`fontSize` 를 `SdLocalStorageProvider` 와 양방향 sync(`sd-theme-dark`·`sd-theme-font-size` 키), `Router` 네비게이션 동안 `SdBusyProvider.globalBusyCount` 증감, `SwUpdate` 활성 시 5분~1시간 백오프로 업데이트 확인 후 사용자 컨펌 → reload.
|
|
31
|
-
|
|
32
|
-
```ts
|
|
33
|
-
@Injectable({ providedIn: "root" }) class SdAngularConfigProvider { clientName!: string }
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
- 직접 쓸 일은 거의 없음. 다른 simplysm 프로바이더가 inject 해 prefix·키로 사용.
|
|
37
|
-
- 사용 예: `bootstrapApplication(App, { providers: [provideSdAngular({ clientName: "my-app" })] })`
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular — app-structure
|
|
2
|
-
|
|
3
|
-
서버 `AppStructureService` 에서 받은 메뉴·권한 트리(`AppStructureItem<TModule>[]`)를 클라이언트에서 사용 가능 형태로 변환·캐시.
|
|
4
|
-
|
|
5
|
-
## SdAppStructureProvider<TModule> (root)
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
usableModules: WritableSignal<TModule[]|undefined>;
|
|
9
|
-
permRecord: WritableSignal<Record<string, boolean>|undefined>;
|
|
10
|
-
items: WritableSignal<AppStructureItem<TModule>[]>;
|
|
11
|
-
|
|
12
|
-
usableMenus: Signal<SdMenu[]>; // items × modules × perms 필터된 트리 메뉴
|
|
13
|
-
usableFlatMenus: Signal<SdFlatMenu<TModule>[]>; // 평탄화된 메뉴 리스트 (검색 등)
|
|
14
|
-
|
|
15
|
-
initialize(serviceKey: string): Promise<void>;
|
|
16
|
-
getPermissionsByStructure(items, codeChain?): SdPermission<TModule>[];
|
|
17
|
-
getTitleByFullCode(fullCode: string): string; // 부모 chain 포함 타이틀("[A > B] C")
|
|
18
|
-
getItemChainByFullCode(fullCode: string): AppStructureItem<TModule>[];
|
|
19
|
-
getPermsByFullCode<K extends string>(fullCodes: string[], permKeys: K[]): K[];
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
- `initialize` — `SdServiceClientFactoryProvider.get(serviceKey)` 에서 `AppStructureService.getItems()` 호출, `clientName` (`SdAngularConfigProvider`) 키로 트리 적재.
|
|
23
|
-
- `usableModules` — 활성 모듈 식별자 배열. 메뉴/권한 필터링에 사용. 미세팅(`undefined`) 이면 모듈 체크 통과(전체 허용).
|
|
24
|
-
- `permRecord` — `<fullCode>.<permKey>` (예: `sales.invoice.use`) → boolean. `undefined` 면 권한 체크 통과.
|
|
25
|
-
- `usableMenus` — 그룹 메뉴는 표시 가능한 leaf 자식이 있어야 포함. leaf 는 `<code>.use` 권한 검사.
|
|
26
|
-
- `usableFlatMenus` — leaf 만 평탄화. modulesChain 정보 포함.
|
|
27
|
-
- `getPermsByFullCode` — 해당 화면들에 대해 사용자가 가진 권한키들 추출(`perms` 자체가 정의 안된 화면은 모든 permKey 통과).
|
|
28
|
-
|
|
29
|
-
## SdAppStructureUtils (abstract static class)
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
static getTitleByFullCode/getPermsByFullCode/getItemChainByFullCode
|
|
33
|
-
static getMenus(items, codeChain, usableModules, permRecord): SdMenu[]
|
|
34
|
-
static getFlatMenus(items, usableModules, permRecord): SdFlatMenu<TModule>[]
|
|
35
|
-
static getPermissions(items, codeChain, usableModules): SdPermission<TModule>[]
|
|
36
|
-
static getFlatPermissions(items, usableModules) // service-common 의 동명 함수 위임
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
- 프로바이더가 내부적으로 호출. 트리 변환 로직 직접 쓰고 싶으면 호출 가능.
|
|
40
|
-
|
|
41
|
-
## injectPermsSignal
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
function injectPermsSignal<K extends string>(viewCodes: string[], keys: K[]): Signal<K[]>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
- 컴포넌트/페이지에서 자기 화면 코드들과 검사할 권한키 배열을 주면, 현재 사용자가 가진 키만 담은 signal 반환. 버튼 enable 조건 등에 사용.
|
|
48
|
-
|
|
49
|
-
```ts
|
|
50
|
-
readonly perms = injectPermsSignal(["sales.invoice"], ["use", "edit"]);
|
|
51
|
-
// 템플릿: @if (perms().includes("edit")) { <sd-button>편집</sd-button> }
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## SdPermissionTable — `<sd-permission-table>`
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
class SdPermissionTable<TModule>
|
|
58
|
-
value = model<Record<string, boolean>>({}); // permRecord 형태(key: <fullCode>.<permKey>)
|
|
59
|
-
items = input<SdPermission<TModule>[]>([]);
|
|
60
|
-
disabled = input(false);
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
- 권한 트리를 표 형태로 표시·편집. `value` 양방향. 관리자 권한 설정 화면용.
|
|
64
|
-
|
|
65
|
-
## 타입
|
|
66
|
-
|
|
67
|
-
```ts
|
|
68
|
-
interface SdMenu {
|
|
69
|
-
title: string; codeChain: string[]; url?: string; icon?: string; children?: SdMenu[];
|
|
70
|
-
}
|
|
71
|
-
interface SdFlatMenu<TModule = unknown> {
|
|
72
|
-
titleChain: string[]; codeChain: string[]; modulesChain: TModule[][];
|
|
73
|
-
}
|
|
74
|
-
interface SdPermission<TModule = unknown> {
|
|
75
|
-
title: string; codeChain: string[]; modules: TModule[]|undefined;
|
|
76
|
-
perms: ("use"|"edit")[]|undefined;
|
|
77
|
-
children: SdPermission<TModule>[]|undefined;
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
- `SdMenu` — `url` 또는 `children` 중 하나. 라우터 링크 분기는 `getMenuRouterLinkOption` 이 담당 ([routing.md](./routing.md)).
|
|
82
|
-
- `SdFlatMenu.modulesChain` — 조상부터 자신까지 누적된 modules 배열 묶음. 모듈 활성 여부 검사 시 사용.
|
|
83
|
-
- `SdPermission.perms` — 해당 화면이 정의한 권한 키들. undefined 면 권한 개념 없음(모두 허용).
|
|
84
|
-
|
|
85
|
-
## 부트스트랩 순서
|
|
86
|
-
|
|
87
|
-
```ts
|
|
88
|
-
const sdAppStructure = inject(SdAppStructureProvider);
|
|
89
|
-
sdAppStructure.usableModules.set(myActiveModules);
|
|
90
|
-
sdAppStructure.permRecord.set(myPermRecord);
|
|
91
|
-
await sdAppStructure.initialize("main"); // serviceKey = SdServiceClientFactoryProvider 의 등록 key
|
|
92
|
-
```
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular — buttons
|
|
2
|
-
|
|
3
|
-
## SdButton — `<sd-button>`
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
type = input<"button" | "submit">("button");
|
|
7
|
-
theme = input<"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray"|"link"|"link-primary"|"link-secondary"|"link-info"|"link-success"|"link-warning"|"link-danger"|"link-gray"|"link-blue-gray"|"link-rev">();
|
|
8
|
-
inline = input(false); inset = input(false); size = input<"sm"|"lg">();
|
|
9
|
-
disabled = input(false); buttonStyle = input<string>(); buttonClass = input<string>();
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
- `type` — 내부 `<button type>`. `submit` 이면 둘러싼 `<sd-form>`·`<form>` 의 서밋을 트리거.
|
|
13
|
-
- `theme` — 색상·강조. `link-*` 는 배경 없는 텍스트 링크 룩. 미지정이면 디폴트 회색.
|
|
14
|
-
- `inline` — true 면 인라인 블록 폭(콘텐츠 크기). false 면 부모 폭 채움.
|
|
15
|
-
- `inset` — true 면 외곽 보더/그림자 제거(컨테이너 안에 박힌 룩).
|
|
16
|
-
- `size` — `sm`/`lg` 만. 미지정 = 기본 크기.
|
|
17
|
-
- `disabled` — true 면 클릭·포커스 차단.
|
|
18
|
-
- `buttonStyle`/`buttonClass` — 내부 `<button>` 에 style/class 추가.
|
|
19
|
-
|
|
20
|
-
```html
|
|
21
|
-
<sd-button theme="primary" (click)="onSave()">저장</sd-button>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## SdAnchor — `<sd-anchor>`
|
|
25
|
-
|
|
26
|
-
```ts
|
|
27
|
-
disabled = input(false);
|
|
28
|
-
theme = input<"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray"|...>();
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
- 링크 룩 클릭 영역. 버튼보다 강조 낮음. `theme` 미지정이면 현재 텍스트 색 상속.
|
|
32
|
-
- `disabled` — 클릭·포커스 차단.
|
|
33
|
-
|
|
34
|
-
```html
|
|
35
|
-
<sd-anchor (click)="onEdit()">수정</sd-anchor>
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## SdAdditionalButton — `<sd-additional-button>`
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
size = input<"sm"|"lg">(); inset = input(false);
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
- 입력 컨트롤(`<sd-textfield>` 등) 옆에 붙이는 보조 버튼 슬롯. `<ng-content>` 로 아이콘/텍스트 투영. 키패드 등 입력 우측에 액션 붙일 때.
|
|
45
|
-
|
|
46
|
-
```html
|
|
47
|
-
<sd-textfield type="text" [(value)]="q" /><sd-additional-button (click)="onSearch()">검색</sd-additional-button>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## SdModalSelectButton — `<sd-modal-select-button>`
|
|
51
|
-
|
|
52
|
-
```ts
|
|
53
|
-
class SdModalSelectButton<M extends "single"|"multi", K, T extends SdSelectModal<K>>
|
|
54
|
-
modal = input.required<SdSelectModalInfo<SdSelectModal<K>>>();
|
|
55
|
-
value = model<SelectModeValue<K>[M]>();
|
|
56
|
-
disabled = input(false); required = input(false); inset = input(false);
|
|
57
|
-
size = input<"sm"|"lg">(); selectMode = input<M>("single" as M);
|
|
58
|
-
modalOptions = input<SdModalOptions>();
|
|
59
|
-
searchIcon = input(tablerSearch);
|
|
60
|
-
|
|
61
|
-
interface SdSelectModal<TKey> extends SdModalContentDef<SelectModalOutputResult<TKey>> {
|
|
62
|
-
selectMode: InputSignal<"single"|"multi"|undefined>;
|
|
63
|
-
selectedKeys: InputSignal<TKey[]>;
|
|
64
|
-
}
|
|
65
|
-
type SdSelectModalInfo<T extends SdSelectModal<any>> = SdModalInfo<T, "selectMode"|"selectedKeys">;
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
- 입력 옆에 검색 버튼이 붙은 모달 트리거 컨트롤. 검색 아이콘 클릭 → 지정 모달 표시 → 모달이 `SelectModalOutputResult<TKey>` emit → `value` 에 반영.
|
|
69
|
-
- `modal` — 표시할 모달 컴포넌트 정의(`SdSelectModal` 구현). 필수.
|
|
70
|
-
- `value` — `single` 모드면 단일 키, `multi` 면 키 배열. `model` 이므로 양방향.
|
|
71
|
-
- `selectMode` — 모달에 전달되는 선택 모드. `single` 기본.
|
|
72
|
-
- `required` — true 면 값이 있어도 지우개 아이콘 표시 안 함. false + 값 있음 → 우측에 지우개 아이콘 노출.
|
|
73
|
-
- `inset` — 컨테이너 안에 박힌 룩(보더 제거).
|
|
74
|
-
- `disabled` — 검색·지우개 버튼 모두 숨김.
|
|
75
|
-
- `modalOptions` — `SdModalProvider.showAsync` 에 전달되는 옵션 ([modal.md](./modal.md)).
|
|
76
|
-
- `searchIcon` — 우측 버튼 아이콘. 기본 `tablerSearch`.
|
|
77
|
-
- `<ng-content>` — 좌측 값 표시 영역.
|
|
78
|
-
|
|
79
|
-
```html
|
|
80
|
-
<sd-modal-select-button [(value)]="userId" [modal]="{ title: '직원선택', type: EmpSelectModal, inputs: {} }">
|
|
81
|
-
{{ userName() }}
|
|
82
|
-
</sd-modal-select-button>
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## 공통 주의
|
|
86
|
-
|
|
87
|
-
- 모든 버튼류는 standalone. 별도 NgModule 등록 불필요.
|
|
88
|
-
- `theme` 의 같은 8개 baseline(`primary`~`blue-gray`)은 디자인 토큰 `--theme-<name>-default` 에 연결. `SdButton.theme` 만 `link-*` 변종 추가.
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular — crud
|
|
2
|
-
|
|
3
|
-
CRUD 화면 골격. 공통 컨테이너(`SdBaseContainer`) + 리스트(`SdCrudList`) + 상세(`SdCrudDetail`) + 사용자 상태 프리셋(`SdStatePreset`).
|
|
4
|
-
|
|
5
|
-
## SdBaseContainer — `<sd-base-container>`
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
ready = model(false);
|
|
9
|
-
initialized = input(false);
|
|
10
|
-
busyCount = model(0);
|
|
11
|
-
restricted = input(false);
|
|
12
|
-
viewType = input.required<SdViewType>(); // "page"|"modal"|"control" (routing.md)
|
|
13
|
-
|
|
14
|
-
// content slots: #topbarTpl #commandTpl #contentTpl #bottomCommandTpl
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
- 모든 simplysm 화면의 기본 컨테이너. 진입 시 `SdSharedDataProvider.wait()` 후 `ready` true.
|
|
18
|
-
- `restricted=true` 면 권한 없음 안내 화면 표시(데이터 로드 스킵).
|
|
19
|
-
- `viewType` — 보통 `injectViewTypeSignal()` 결과 바인딩.
|
|
20
|
-
- 슬롯: `<ng-template #topbarTpl>` 상단 영역, `#commandTpl` 명령바, `#contentTpl` 본문, `#bottomCommandTpl` 하단.
|
|
21
|
-
|
|
22
|
-
## SdCrudList — `<sd-crud-list>`
|
|
23
|
-
|
|
24
|
-
```ts
|
|
25
|
-
class SdCrudList<TItem, TKey>
|
|
26
|
-
ready = model(false); initialized = input(false); busyCount = model(0);
|
|
27
|
-
restricted = input(false); readonly = input(false);
|
|
28
|
-
viewType = input.required<SdViewType>();
|
|
29
|
-
selectMode = input<"single"|"multi">();
|
|
30
|
-
key = input.required<string>(); // 시트/프리셋 key prefix
|
|
31
|
-
|
|
32
|
-
filterSubmit = output(); submit = output();
|
|
33
|
-
create = output(); delete = output<TItem[]>(); restore = output<TItem[]>();
|
|
34
|
-
|
|
35
|
-
items = input<TItem[]>([]);
|
|
36
|
-
selectedKeys = model<NonNullable<TKey>[]>([]);
|
|
37
|
-
currDeletedItems = input<TItem[]>([]); // 삭제됨 표시(취소선) 대상
|
|
38
|
-
|
|
39
|
-
currentPage = model(0); totalPageCount = input(0);
|
|
40
|
-
itemsPerPage = input(0); visiblePageCount = input(10);
|
|
41
|
-
sorts = model<SortingDef[]>([]);
|
|
42
|
-
trackByFn = input.required<(item) => TKey>();
|
|
43
|
-
|
|
44
|
-
// content slots: #commandTpl #filterTpl #toolTpl #bottomCommandTpl
|
|
45
|
-
// + 자식: <sd-sheet-column> 들
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
- 표준 리스트 화면: 필터 영역 + 시트 + 페이지바 + 명령(저장/추가/삭제/복원).
|
|
49
|
-
- `filterSubmit` — 필터 폼 submit. 호출자가 데이터 fetch.
|
|
50
|
-
- `submit` — 명령바의 저장 버튼.
|
|
51
|
-
- `create`/`delete`/`restore` — 행 추가/선택 삭제/선택 복원.
|
|
52
|
-
- `currDeletedItems` — soft-delete 표시. 해당 행 셀에 취소선 자동.
|
|
53
|
-
- `readonly=true` 면 명령바·편집 차단.
|
|
54
|
-
- 모달로 띄워서 선택 picker 로도 동작: 모달 confirm 시 `SdActivatedModalProvider.contentComponent.close.emit({ selectedKeys })`.
|
|
55
|
-
- `key` — 자식 `<sd-sheet key>` 와 `SdStatePreset key` 가 이 값을 prefix 로 사용.
|
|
56
|
-
|
|
57
|
-
```html
|
|
58
|
-
<sd-crud-list [viewType]="viewType()" key="invoice" [trackByFn]="trackById"
|
|
59
|
-
[items]="items()" [(selectedKeys)]="sel" selectMode="multi"
|
|
60
|
-
(filterSubmit)="reload()" (create)="onCreate()" (delete)="onDelete($event)">
|
|
61
|
-
<ng-template #filterTpl>...필터 폼...</ng-template>
|
|
62
|
-
<sd-sheet-column key="no" header="번호" />
|
|
63
|
-
</sd-crud-list>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## SdCrudDetail — `<sd-crud-detail>`
|
|
67
|
-
|
|
68
|
-
```ts
|
|
69
|
-
ready = model(false); initialized = input(false); busyCount = model(0);
|
|
70
|
-
restricted = input(false); readonly = input(false);
|
|
71
|
-
viewType = input.required<SdViewType>();
|
|
72
|
-
submit = output();
|
|
73
|
-
|
|
74
|
-
// content slots: #commandTpl #contentTpl #bottomCommandTpl
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
- 상세 화면 골격. 내부에 `<sd-form>` 자동 배치. 저장 버튼 클릭 시 form submit → invalid 없으면 `submit` 발화.
|
|
78
|
-
|
|
79
|
-
## SdStatePreset — `<sd-state-preset>`
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
key = input.required<string>();
|
|
83
|
-
state = model<any>(); // 적용할 상태 객체 (필터 등)
|
|
84
|
-
size = input<"sm"|"lg">();
|
|
85
|
-
|
|
86
|
-
interface SdStatePresetDef { name: string; state: any; }
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
- 사용자가 현재 `state` 를 이름 붙여 저장/불러오기. `SdSystemConfigProvider` 키 `key` 로 `SdStatePresetDef[]` 저장.
|
|
90
|
-
- 별 아이콘 클릭 → 이름 입력(`SdPromptModal`) → 추가. 프리셋 클릭 → `state` 에 적용. 디스켓 아이콘 → 현재 state 덮어쓰기. X 아이콘 → 삭제.
|
|
91
|
-
|
|
92
|
-
```html
|
|
93
|
-
<sd-state-preset key="invoice-filter" [(state)]="filter" />
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## 주의
|
|
97
|
-
|
|
98
|
-
- 모든 CRUD 컴포넌트의 `ready` 는 진입 후 데이터 준비 완료 시 true. 호출자가 `[ready]="ready()"` 로 자식 조건부 렌더링.
|
|
99
|
-
- `key` 는 한 클라이언트 내 고유해야 함. 시트 컬럼 설정·프리셋·기타 영구 상태가 이 키로 충돌 없이 저장됨.
|
|
100
|
-
- `SdCrudList` 의 selectMode 가 설정되었고 컨테이너가 모달 안에 있으면 자동으로 picker 모드로 동작.
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
# @simplysm/angular — forms
|
|
2
|
-
|
|
3
|
-
폼 컨테이너 + 값 입력 컨트롤. 모든 입력 컨트롤은 `value` model 기반. native form validity API 활용.
|
|
4
|
-
|
|
5
|
-
## SdForm — `<sd-form>`
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
formSubmit = output<SubmitEvent>();
|
|
9
|
-
formInvalid = output();
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
- 내부에 native `<form>` 구성. 자식 `<sd-textfield required>` 등 native invalid 상태가 있으면 submit 막고 `formInvalid` 발화. 모두 valid 면 `formSubmit` 발화.
|
|
13
|
-
|
|
14
|
-
```html
|
|
15
|
-
<sd-form (formSubmit)="onSubmit()"><sd-textfield type="text" required [(value)]="name"/></sd-form>
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## SdTextfield — `<sd-textfield>`
|
|
19
|
-
|
|
20
|
-
```ts
|
|
21
|
-
class SdTextfield<K extends keyof SdTextfieldTypes>
|
|
22
|
-
value = model<SdTextfieldTypes[K]>();
|
|
23
|
-
type = input.required<K>();
|
|
24
|
-
placeholder = input<string>(); title = input<string>();
|
|
25
|
-
inputStyle = input<string>(); inputClass = input<string>();
|
|
26
|
-
disabled = input(false); readonly = input(false); required = input(false);
|
|
27
|
-
min/max = input<SdTextfieldTypes[K]>(); minlength/maxlength = input<number>();
|
|
28
|
-
pattern = input<string>();
|
|
29
|
-
validatorFn = input<(value) => string|undefined>();
|
|
30
|
-
format = input<string>(); step = input<number>(); autocomplete = input<string>();
|
|
31
|
-
useNumberComma = input(true); minDigits = input<number>();
|
|
32
|
-
inline = input(false); inset = input(false); size = input<"sm"|"lg">();
|
|
33
|
-
theme = input<"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray">();
|
|
34
|
-
|
|
35
|
-
type SdTextfieldTypes = {
|
|
36
|
-
number: number; text: string; password: string; color: string; email: string;
|
|
37
|
-
format: string; date: DateOnly; month: DateOnly; year: DateOnly;
|
|
38
|
-
datetime: DateTime; "datetime-sec": DateTime; time: Time; "time-sec": Time;
|
|
39
|
-
}
|
|
40
|
-
const sdTextfieldTypes: (keyof SdTextfieldTypes)[]
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
- `type` — 위 13개 중 1개. 각 타입별 핸들러가 파싱/포맷/입력 제한 담당. `number` 는 콤마 표시, `date`/`month`/`year` 는 `DateOnly`, `datetime[-sec]` 는 `DateTime`, `time[-sec]` 는 `Time`, `format` 은 `format` 입력에 따른 자유 포맷.
|
|
44
|
-
- `value` — 양방향. 타입에 맞는 객체/숫자/문자열.
|
|
45
|
-
- `format` — `type=format` 또는 표시 포맷팅용. `XXX-XXXX` 같은 패턴(`X` 자리).
|
|
46
|
-
- `validatorFn` — 반환 문자열이 있으면 invalid 메시지로 표시. undefined 면 통과.
|
|
47
|
-
- `useNumberComma` — `type=number` 기본 true. 천 단위 콤마 표시.
|
|
48
|
-
- `minDigits` — `type=number` 정수부 자릿수(부족 시 0 패딩).
|
|
49
|
-
- `min`/`max`/`minlength`/`maxlength`/`pattern`/`required` — native 검증으로 위임.
|
|
50
|
-
- `inline`/`inset`/`size`/`theme` — 레이아웃 옵션. `inset` 은 sd-sheet/모달 셀 안에 박힌 룩.
|
|
51
|
-
- `readonly` — 편집 차단(포커스 가능). `disabled` — 포커스 불가.
|
|
52
|
-
|
|
53
|
-
```html
|
|
54
|
-
<sd-textfield type="number" [(value)]="qty" [min]="0" />
|
|
55
|
-
<sd-textfield type="date" [(value)]="dueDate" required />
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## SdTextarea — `<sd-textarea>`
|
|
59
|
-
|
|
60
|
-
```ts
|
|
61
|
-
value = model<string>();
|
|
62
|
-
placeholder/title/inputStyle/inputClass = input<string>(); minRows = input<number>(1);
|
|
63
|
-
disabled/readonly/required/inline/inset = input(false);
|
|
64
|
-
size = input<"sm"|"lg">();
|
|
65
|
-
validatorFn = input<(v) => string|undefined>();
|
|
66
|
-
theme = input<...8 themes>();
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
- 멀티라인 입력. `minRows` 만큼 시작 높이 확보, 내용 늘면 자동 확장.
|
|
70
|
-
|
|
71
|
-
## SdNumpad — `<sd-numpad>`
|
|
72
|
-
|
|
73
|
-
```ts
|
|
74
|
-
value = model<number>(); placeholder = input<string>();
|
|
75
|
-
required = input(false); inputDisabled = input(false);
|
|
76
|
-
useEnterButton = input(false); useMinusButton = input(false);
|
|
77
|
-
enterButtonClick = output();
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
- 터치용 숫자 패드. `useEnterButton` true 면 엔터 키 노출, 클릭 시 `enterButtonClick` 발화. `useMinusButton` true 면 부호 토글 키 노출. `inputDisabled` true 면 상단 표시 영역의 직접 타이핑 차단(패드만 사용).
|
|
81
|
-
|
|
82
|
-
## SdRange — `<sd-range>`
|
|
83
|
-
|
|
84
|
-
```ts
|
|
85
|
-
class SdRange<K extends keyof SdTextfieldTypes>
|
|
86
|
-
type = input.required<K>(); from = model<SdTextfieldTypes[K]>(); to = model<SdTextfieldTypes[K]>();
|
|
87
|
-
inputStyle = input<string>(); required = input(false); disabled = input(false);
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
- `SdTextfield` 2개를 `~` 로 묶은 범위 입력. `type` 은 `SdTextfield` 와 동일 키.
|
|
91
|
-
|
|
92
|
-
## SdDateRangePicker — `<sd-date-range-picker>`
|
|
93
|
-
|
|
94
|
-
```ts
|
|
95
|
-
periodType = model<"일"|"월"|"범위">("범위");
|
|
96
|
-
from = model<DateOnly>(); to = model<DateOnly>();
|
|
97
|
-
required = input(false);
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
- `periodType` — `일`: 단일 날짜(`from`=`to`), `월`: 단일 월, `범위`: from/to 자유 범위. 사용자가 토글 가능.
|
|
101
|
-
|
|
102
|
-
## SdSelect — `<sd-select>`
|
|
103
|
-
|
|
104
|
-
```ts
|
|
105
|
-
class SdSelect<M extends "single"|"multi", T>
|
|
106
|
-
selectMode = input("single" as M);
|
|
107
|
-
value = model<SelectModeValue<any>[M]>(); // single → T, multi → T[]
|
|
108
|
-
placeholder = input<string>();
|
|
109
|
-
disabled/inline/inset/required = input(false); size = input<"sm"|"lg">();
|
|
110
|
-
hideSelectAll = input(false);
|
|
111
|
-
multiSelectionDisplayDirection = input<"vertical">();
|
|
112
|
-
items = input<T[]>(); trackByFn = input<(item, index) => unknown>((item) => item);
|
|
113
|
-
getChildrenFn = input<(item: T) => T[]|undefined>();
|
|
114
|
-
contentClass = input<string>(); contentStyle = input<string>();
|
|
115
|
-
dropdownOpen = model(false);
|
|
116
|
-
|
|
117
|
-
type SelectModeValue<T> = { multi: T[]; single: T };
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
- 드롭다운 셀렉트. `items` 를 직접 주거나, content projection 으로 `<sd-select-item>` 나열.
|
|
121
|
-
- `selectMode` — `single`: 단일 선택, `multi`: 체크박스 다중 선택(`hideSelectAll` false 면 전체 선택 옵션 노출).
|
|
122
|
-
- `getChildrenFn` — 트리형 선택지. 자식 있는 노드 펼침.
|
|
123
|
-
- `multiSelectionDisplayDirection` — multi 모드에서 선택값 표시 방향. `vertical` 만.
|
|
124
|
-
- `dropdownOpen` — 양방향. 외부에서 강제 열림 제어 가능.
|
|
125
|
-
- `<ng-content>` — 표시 영역 커스텀 템플릿 또는 `<sd-select-item>` 리스트.
|
|
126
|
-
|
|
127
|
-
## SdSelectItem — `<sd-select-item>`
|
|
128
|
-
|
|
129
|
-
```ts
|
|
130
|
-
class SdSelectItem<T> { value = input<T|undefined>(); disabled = input(false); hidden = input(false); }
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
- `SdSelect` 자식. content projection 으로 표시할 옵션. `hidden` true 면 필터링 결과 등으로 숨김.
|
|
134
|
-
|
|
135
|
-
## SdSelectButton — `<sd-select-button>`
|
|
136
|
-
|
|
137
|
-
- `SdSelect` 트리거 버튼 슬롯. inputs 없음. `<sd-select>` 내부에 표시 영역 커스터마이즈 시 content projection 으로 사용.
|
|
138
|
-
|
|
139
|
-
## SdCheckbox — `<sd-checkbox>`
|
|
140
|
-
|
|
141
|
-
```ts
|
|
142
|
-
value = model(false);
|
|
143
|
-
canChangeFn = input<(item: boolean) => boolean|Promise<boolean>>(() => true);
|
|
144
|
-
icon = input(tablerCheck); radio = input(false);
|
|
145
|
-
disabled = input(false); size = input<"sm"|"lg">();
|
|
146
|
-
inline = input(false); inset = input(false);
|
|
147
|
-
theme = input<...8 themes>(); contentStyle = input<string>();
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
- `radio` true 면 라디오 룩(원형). false 면 체크박스(사각).
|
|
151
|
-
- `canChangeFn` — 변경 직전 호출, false 반환·Promise<false> 면 무시. 비동기 확인용.
|
|
152
|
-
- `icon` — 체크 상태 아이콘. 기본 `tablerCheck`.
|
|
153
|
-
|
|
154
|
-
## SdSwitch — `<sd-switch>`
|
|
155
|
-
|
|
156
|
-
```ts
|
|
157
|
-
value = model(false);
|
|
158
|
-
canChangeFn = input<(item) => boolean|Promise<boolean>>(() => true);
|
|
159
|
-
disabled = input(false); inline = input(false); inset = input(false);
|
|
160
|
-
size = input<"sm"|"lg">(); theme = input<...8 themes>();
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
- 토글 스위치. `SdCheckbox` 와 의미 같지만 룩만 슬라이더.
|
|
164
|
-
|
|
165
|
-
## SdCheckboxGroup — `<sd-checkbox-group>`
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
class SdCheckboxGroup<T> { value = model<T[]>([]); disabled = input(false); }
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
- 자식 `<sd-checkbox-group-item>` 들을 묶어 `value` 배열로 관리.
|
|
172
|
-
|
|
173
|
-
## SdCheckboxGroupItem — `<sd-checkbox-group-item>`
|
|
174
|
-
|
|
175
|
-
```ts
|
|
176
|
-
class SdCheckboxGroupItem<T> { value = input.required<T>(); inline = input(false); }
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
- 그룹의 단일 옵션. `value` 가 그룹 배열에 있으면 체크 상태.
|
|
180
|
-
|
|
181
|
-
## SdDropdown — `<sd-dropdown>`
|
|
182
|
-
|
|
183
|
-
```ts
|
|
184
|
-
open = model(false); disabled = input(false);
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
- 트리거 + 팝업 컨테이너. content projection 으로 트리거와 `<sd-dropdown-popup>` 을 함께 둠.
|
|
188
|
-
|
|
189
|
-
## SdDropdownPopup — `<sd-dropdown-popup>`
|
|
190
|
-
|
|
191
|
-
- `SdDropdown` 의 팝업 슬롯. inputs 없음. content projection 으로 내용 채움.
|
|
192
|
-
|
|
193
|
-
```html
|
|
194
|
-
<sd-dropdown [(open)]="open">트리거<sd-dropdown-popup>...팝업 내용...</sd-dropdown-popup></sd-dropdown>
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## 주의
|
|
198
|
-
|
|
199
|
-
- `value` model 인 컨트롤은 모두 `[(value)]="..."` 양방향.
|
|
200
|
-
- 입력 컨트롤은 `<sd-form>` 안에 두면 invalid 시 native `:invalid` 처리됨. `SdInvalid` 디렉티브로 커스텀 invalid 표시 추가 가능 ([infrastructure.md](./infrastructure.md)).
|