@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.
Files changed (90) hide show
  1. package/claude/references/sd-requirement-source-handling.md +20 -20
  2. package/claude/references/sd-simplysm14/README.md +13 -13
  3. package/claude/references/sd-simplysm14/manuals/client-component.md +92 -92
  4. package/claude/references/sd-simplysm14/manuals/client-crud.md +11 -11
  5. package/claude/references/sd-simplysm14/manuals/client-demo.md +28 -28
  6. package/claude/references/sd-simplysm14/manuals/client-rules.md +1 -1
  7. package/claude/references/sd-simplysm14/manuals/client-setup.md +21 -21
  8. package/claude/references/sd-simplysm14/manuals/client-tab.md +3 -3
  9. package/claude/references/sd-simplysm14/manuals/logging.md +15 -15
  10. package/claude/references/sd-simplysm14/manuals/orm-union.md +6 -6
  11. package/claude/references/sd-simplysm14/manuals/orm.md +19 -19
  12. package/claude/references/sd-simplysm14/manuals/test.md +33 -33
  13. package/claude/rules/sd-design-rules.md +18 -18
  14. package/claude/sd-system-prompt.md +369 -0
  15. package/claude/skills/sd-commit/SKILL.md +10 -10
  16. package/claude/skills/sd-config/SKILL.md +2 -2
  17. package/claude/skills/sd-demo/SKILL.md +45 -45
  18. package/claude/skills/sd-dev/SKILL.md +15 -15
  19. package/claude/skills/sd-docs/SKILL.md +7 -7
  20. package/claude/skills/sd-docs/references/subagent-prompt.md +33 -33
  21. package/claude/skills/sd-impl/SKILL.md +60 -60
  22. package/claude/skills/sd-review/SKILL.md +9 -9
  23. package/claude/skills/sd-skill/SKILL.md +74 -74
  24. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +1 -1
  25. package/claude/skills/sd-spec/SKILL.md +354 -319
  26. package/claude/skills/sd-spec/references/example-spec.md +104 -104
  27. package/claude/skills/sd-unpack/SKILL.md +34 -34
  28. package/claude/skills/sd-unpack/scripts/handlers/__pycache__/office_com.cpython-314.pyc +0 -0
  29. package/claude/skills/sd-unpack/scripts/handlers/office_com.py +234 -159
  30. package/claude/skills/sd-use/SKILL.md +4 -4
  31. package/package.json +1 -1
  32. package/claude/references/sd-simplysm14/apis/angular/README.md +0 -37
  33. package/claude/references/sd-simplysm14/apis/angular/app-structure.md +0 -92
  34. package/claude/references/sd-simplysm14/apis/angular/buttons.md +0 -88
  35. package/claude/references/sd-simplysm14/apis/angular/crud.md +0 -100
  36. package/claude/references/sd-simplysm14/apis/angular/forms.md +0 -200
  37. package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +0 -231
  38. package/claude/references/sd-simplysm14/apis/angular/kanban.md +0 -80
  39. package/claude/references/sd-simplysm14/apis/angular/layout.md +0 -92
  40. package/claude/references/sd-simplysm14/apis/angular/modal.md +0 -115
  41. package/claude/references/sd-simplysm14/apis/angular/routing.md +0 -107
  42. package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +0 -35
  43. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +0 -82
  44. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +0 -134
  45. package/claude/references/sd-simplysm14/apis/angular/sheet.md +0 -127
  46. package/claude/references/sd-simplysm14/apis/angular/toast.md +0 -97
  47. package/claude/references/sd-simplysm14/apis/angular/visual.md +0 -167
  48. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +0 -79
  49. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +0 -83
  50. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +0 -91
  51. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +0 -49
  52. package/claude/references/sd-simplysm14/apis/core-browser/README.md +0 -143
  53. package/claude/references/sd-simplysm14/apis/core-common/README.md +0 -58
  54. package/claude/references/sd-simplysm14/apis/core-common/extensions.md +0 -88
  55. package/claude/references/sd-simplysm14/apis/core-common/features.md +0 -51
  56. package/claude/references/sd-simplysm14/apis/core-common/types.md +0 -88
  57. package/claude/references/sd-simplysm14/apis/core-common/utils.md +0 -189
  58. package/claude/references/sd-simplysm14/apis/core-node/README.md +0 -12
  59. package/claude/references/sd-simplysm14/apis/core-node/consola.md +0 -59
  60. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +0 -44
  61. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +0 -42
  62. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +0 -53
  63. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +0 -24
  64. package/claude/references/sd-simplysm14/apis/core-node/worker.md +0 -65
  65. package/claude/references/sd-simplysm14/apis/excel/README.md +0 -193
  66. package/claude/references/sd-simplysm14/apis/lint/README.md +0 -94
  67. package/claude/references/sd-simplysm14/apis/orm-common/README.md +0 -58
  68. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +0 -77
  69. package/claude/references/sd-simplysm14/apis/orm-common/executable.md +0 -20
  70. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +0 -92
  71. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +0 -98
  72. package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +0 -128
  73. package/claude/references/sd-simplysm14/apis/orm-node/README.md +0 -69
  74. package/claude/references/sd-simplysm14/apis/sd-claude/README.md +0 -32
  75. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +0 -80
  76. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +0 -155
  77. package/claude/references/sd-simplysm14/apis/service-client/README.md +0 -131
  78. package/claude/references/sd-simplysm14/apis/service-common/README.md +0 -29
  79. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +0 -63
  80. package/claude/references/sd-simplysm14/apis/service-common/messages.md +0 -56
  81. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +0 -64
  82. package/claude/references/sd-simplysm14/apis/service-common/service-types.md +0 -43
  83. package/claude/references/sd-simplysm14/apis/service-server/README.md +0 -13
  84. package/claude/references/sd-simplysm14/apis/service-server/auth.md +0 -39
  85. package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +0 -71
  86. package/claude/references/sd-simplysm14/apis/service-server/define-service.md +0 -55
  87. package/claude/references/sd-simplysm14/apis/service-server/internals.md +0 -82
  88. package/claude/references/sd-simplysm14/apis/service-server/server.md +0 -57
  89. package/claude/references/sd-simplysm14/apis/storage/README.md +0 -71
  90. package/claude/rules/sd-base-rules.md +0 -306
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-claude",
3
- "version": "14.0.82",
3
+ "version": "14.0.84",
4
4
  "description": "심플리즘 패키지 - Claude Code 셋업",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -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)).