@simplysm/sd-claude 14.0.88 → 14.0.89

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 (122) hide show
  1. package/claude/references/sd-simplysm14/README.md +17 -17
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +27 -53
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +37 -105
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +46 -43
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +22 -32
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +40 -55
  7. package/claude/references/sd-simplysm14/apis/angular/infra.md +40 -40
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +25 -53
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +70 -82
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +44 -39
  11. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +21 -36
  12. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +52 -65
  13. package/claude/references/sd-simplysm14/apis/angular/sheet.md +65 -70
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +33 -35
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +7 -7
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +29 -29
  17. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +45 -50
  18. package/claude/references/sd-simplysm14/apis/core-browser/README.md +42 -55
  19. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
  20. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +13 -12
  21. package/claude/references/sd-simplysm14/apis/core-common/README.md +222 -98
  22. package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +102 -53
  23. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
  24. package/claude/references/sd-simplysm14/apis/core-common/datetime.md +98 -64
  25. package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
  26. package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +34 -28
  27. package/claude/references/sd-simplysm14/apis/core-common/obj.md +104 -40
  28. package/claude/references/sd-simplysm14/apis/core-node/README.md +11 -8
  29. package/claude/references/sd-simplysm14/apis/core-node/consola.md +23 -31
  30. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +33 -22
  31. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +28 -25
  32. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +39 -53
  33. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +26 -29
  34. package/claude/references/sd-simplysm14/apis/core-node/worker.md +27 -29
  35. package/claude/references/sd-simplysm14/apis/excel/README.md +14 -14
  36. package/claude/references/sd-simplysm14/apis/lint/README.md +27 -21
  37. package/claude/references/sd-simplysm14/apis/lint/rules.md +89 -49
  38. package/claude/references/sd-simplysm14/apis/orm-common/README.md +5 -59
  39. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +98 -67
  40. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +107 -92
  41. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +99 -65
  42. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +83 -98
  43. package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -52
  44. package/claude/references/sd-simplysm14/apis/orm-node/README.md +62 -25
  45. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +27 -27
  46. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +12 -15
  47. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +92 -45
  48. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +226 -108
  49. package/claude/references/sd-simplysm14/apis/service-client/README.md +84 -86
  50. package/claude/references/sd-simplysm14/apis/service-client/orm.md +14 -11
  51. package/claude/references/sd-simplysm14/apis/service-client/transport.md +33 -10
  52. package/claude/references/sd-simplysm14/apis/service-common/README.md +37 -23
  53. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +9 -9
  54. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +13 -13
  55. package/claude/references/sd-simplysm14/apis/service-server/README.md +81 -65
  56. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +32 -35
  57. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +44 -33
  58. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +34 -45
  59. package/claude/references/sd-simplysm14/apis/storage/README.md +24 -18
  60. package/claude/skills/sd-demo/SKILL.md +6 -0
  61. package/claude/skills/sd-impl/SKILL.md +4 -7
  62. package/claude/skills/sd-spec/SKILL.md +31 -858
  63. package/claude/skills/sd-spec/references/spec-authoring.md +519 -0
  64. package/claude/workflows/sd-docs.js +84 -0
  65. package/package.json +1 -1
  66. package/claude/references/sd-simplysm14/apis/orm-common/query-builder.md +0 -29
  67. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
  68. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
  69. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
  70. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
  71. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
  72. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
  73. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
  74. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
  75. package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
  76. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
  77. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
  78. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  79. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
  80. package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
  81. package/claude/skills/sd-docs/SKILL.md +0 -46
  82. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
  83. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
  84. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
  85. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
  86. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
  87. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
  88. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
  89. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
  90. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
  91. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
  92. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
  93. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
  94. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
  95. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
  96. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
  97. package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
  98. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
  99. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
  100. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
  101. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
  102. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
  103. package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
  104. package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
  105. package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
  106. package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
  107. package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
  108. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
  109. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
  110. package/claude/skills/sd-review/evals/golden.jsonl +0 -2
  111. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
  112. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  113. package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
  114. package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
  115. package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
  116. package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
  117. package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
  118. package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
  119. package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
  120. package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
  121. package/claude/skills/sd-use/evals/golden.jsonl +0 -6
  122. /package/claude/{skills/sd-docs/references/doc-rules.md → workflows/sd-docs.rules.md} +0 -0
@@ -1,55 +1,40 @@
1
- # @simplysm/angular — 부가 기능(테마·주소·에디터·시각화·칸반·프리셋)
2
-
3
- 화면에 부분적으로 끼워 쓰는 독립 기능 컴포넌트·프로바이더. 테마(다크/폰트), 주소검색 모달, TipTap 리치에디터, 시각화(라벨/노트/진행률/달력/바코드/차트), 칸반 보드, 상태 프리셋.
4
-
5
- ## SdThemeProvider / SdThemeSelector
6
-
7
- - `SdThemeProvider`루트 테마 프로바이더. `dark: WritableSignal<boolean>`(다크모드, body 클래스 토글), `fontSize: WritableSignal<number>`(루트 폰트크기 px), `fontSizePresets: readonly number[]`(`[12,14,16,20,24,28]`), `increaseFontSize()`/`decreaseFontSize()`(프리셋 단계 이동). `provideSdAngular` localStorage 영속화 연결.
8
- - `<sd-theme-selector>`드롭다운 UI. 폰트크기 ±버튼·다크모드 스위치로 프로바이더 조작. input 없음.
9
-
10
- ## SdAddressSearchModal
11
-
12
- `<sd-address-search-modal>` — 다음(카카오) 우편번호 검색 모달. `SdModalContentDef<Address>` 구현(`SdModalProvider.showAsync` 의 type 으로 사용). 스크립트 동적 로드 후 임베드, 선택 시 결과 emit.
13
-
14
- - `close = output<Address>()` 선택 결과. `Address = { postNumber?; address?; buildingName? }`(결측 보존).
15
- - input 없음. 스크립트 로드 실패 시 에러 메시지 표시.
16
-
17
- ## SdTiptapEditor
18
-
19
- `<sd-tiptap-editor>` — TipTap 기반 리치텍스트 에디터(HTML 값, 툴바: 제목·굵게·기울임·밑줄·취소선·색상·리스트 등).
20
-
21
- - `value = model<string>()` HTML 콘텐츠. 빈 내용이면 `undefined`(결측 보존).
22
- - `disabled`/`readonly`비활성/읽기전용(편집 불가, 툴바 숨김).
23
- - `required` 필수 검증( 연동).
24
- - `placeholder` 상태 안내(미지정 확장 적용).
25
- - `validatorFn?: (value) => string | undefined` — 커스텀 검증 메시지.
26
- - `extensions?: AnyExtension[]` TipTap 확장 직접 지정(미지정 시 기본 확장 + placeholder).
27
- - `editor: WritableSignal<Editor | undefined>`내부 TipTap 인스턴스(@internal, 고급/테스트용).
28
-
29
- ## 시각화 컴포넌트
30
-
31
- - `<sd-label>` — 인라인 라벨/배지. `theme`(공통 8색), `color?`(임의 배경색), `clickable`(호버 효과·커서).
32
- - `<sd-note>` — 강조 박스. `theme`(공통 8색), `size`(`"sm"|"lg"`), `inset`.
33
- - `<sd-progress>` — 진행률 막대. `value = input.required<number>()`(0~1, 퍼센트 표시·막대폭), `theme = input.required<...>()`(공통 8색), `size`, `inset`.
34
- - `<sd-calendar>` — 월 달력에 항목 배치. 제네릭 `<T>`. `items = input.required<T[]>()`, `getItemDateFn = input.required<(item, index) => DateOnly>()`(항목 날짜), `yearMonth = input(...)`(표시 월, 기본 이번달 1일), `weekStartDay = input(0)`(주 시작 요일), `minDaysInFirstWeek = input(1)`. 셀 항목은 `<ng-template [itemOf]>`.
35
- - `<sd-barcode>` — 바코드/QR SVG 렌더(bwip-js). `type = input.required<BarcodeType>()`(바코드 종류, `"qrcode"`/`"code128"`/`"ean13"` 등 다수 리터럴 유니온), `value = input<string>()`(인코딩 텍스트, 빈값이면 미표시).
36
- - `<sd-echarts>` — ECharts 차트. `option = input.required<EChartsOption>()`(차트 옵션), `notMerge = input(false)`(setOption 병합 여부), `loading = input(false)`(로딩 스피너). 리사이즈 자동 반영.
37
-
38
- ## SdKanbanBoard / SdKanbanLane / SdKanban
39
-
40
- 드래그 가능한 칸반 보드. 보드 > 레인 > 카드 계층.
41
-
42
- - `<sd-kanban-board>` — 보드 컨테이너. 제네릭 `<L, T>`. `selectedValues = model<T[]>([])`(선택된 카드 값), `drop = output<SdKanbanBoardDropInfo<L, T>>()`(드롭 시 `{ sourceKanbanValue?; targetLaneValue?; targetKanbanValue? }`).
43
- - `<sd-kanban-lane>` — 레인(열). 제네릭 `<L, T>`. `value = input<L>()`(레인 값), `busy`(로딩), `useCollapse`(접기 버튼), `collapse = model(false)`. `#titleTpl`/`#toolTpl` 슬롯. 선택 가능 카드 있으면 전체선택 체크박스.
44
- - `<sd-kanban>` — 카드. 제네릭 `<L, T>`. `value = input<T>()`(카드 값), `selectable`(Shift클릭 선택), `draggable`(드래그 이동), `contentClass`.
45
-
46
- 타입: `SdKanbanBoardDropInfo<L,T>`, `SdKanbanDragRef<L,T>`(`value()`/`heightOnDrag()`), `SdKanbanDropTarget<L,T>`(`targetLaneValue()`/`targetKanbanValue?()`).
47
-
48
- ## SdStatePreset
49
-
50
- `<sd-state-preset>` — 화면 상태(필터 등)를 명명 프리셋으로 저장·복원(시스템설정 영속화). 제네릭 `<TState>`.
51
-
52
- - `key = input.required<string>()` — 프리셋 저장 키(태그명과 결합).
53
- - `state = model.required<TState>()` — 현재 상태(저장/적용 대상). 프리셋 클릭 시 이 값으로 복원.
54
- - `size = input<"sm"|"lg">()` — 크기.
55
- - ⭐버튼=현재 상태 새 프리셋 저장, 각 프리셋=클릭 적용/저장/삭제. `SdStatePresetDef<TState> = { name: string; state: TState }`.
1
+ # @simplysm/angular — 기능 컴포넌트(주소검색·에디터·시각화·칸반)
2
+
3
+ 특정 도메인 기능을 제공하는 독립 컴포넌트 묶음. 필요한 화면에서 개별적으로 가져다 씀.
4
+
5
+ ## 주소 검색
6
+
7
+ - **SdAddressSearchModal**다음(카카오) 우편번호 검색 모달 컴포넌트. `SdModalContentDef<Address>` 구현이라 `SdModalProvider.showAsync({ type: SdAddressSearchModal, ... })` 띄움. 외부 스크립트(daum postcode) 동적 로드. `close = output<Address>()`.
8
+ - **Address**`{ postNumber: string | undefined; address: string | undefined; buildingName: string | undefined }`. 결측은 undefined 보존.
9
+
10
+ ## 에디터
11
+
12
+ - **SdTiptapEditor** `<sd-tiptap-editor [(value)]="...">` tiptap 기반 리치텍스트 에디터(HTML 문자열).
13
+ - value = model<string>() — HTML 본문.
14
+ - disabled/readonly/required: boolean비활성/읽기전용/필수(빈 검증).
15
+ - placeholder?: string.
16
+ - validatorFn?: (value) => string | undefined — 커스텀 검증 메시지.
17
+ - extensions?: AnyExtension[] — 추가 tiptap 확장.
18
+
19
+ ## 시각화
20
+
21
+ - **SdLabel** `<sd-label>` — 작은 배지/태그. `theme`(8색), `color?: string`(임의 배경색), `clickable: boolean`(호버 강조 + 커서).
22
+ - **SdNote** `<sd-note>` 안내 박스. `theme`(8색), `size`("sm"|"lg"), `inset: boolean`.
23
+ - **SdProgress** `<sd-progress [theme]="..." [value]="...">` — 진행률 막대. `theme: input.required`(8색), `value: input.required<number>`(0~1, 백분율 표시·막대 폭은 0~100% clamp), `size`("sm"|"lg"), `inset: boolean`.
24
+ - **SdCalendar<T>** `<sd-calendar [items]="..." [getItemDateFn]="...">` 월간 달력에 항목 배치.
25
+ - items: input.required<T[]>.
26
+ - getItemDateFn: input.required<(item, index) => DateOnly> 항목의 날짜.
27
+ - yearMonth: input(기본 이번 1일) 표시 월.
28
+ - weekStartDay: number(기본 0=일요일) / minDaysInFirstWeek: number(기본 1) — 주 시작·첫 주 기준.
29
+ - (contentChild) `itemOf` 템플릿 필수 — 날짜 칸 항목 렌더.
30
+ - **SdBarcode** `<sd-barcode [type]="..." [value]="...">` — bwip-js 로 바코드 SVG 렌더. `type: input.required<BarcodeType>`(qrcode/code128/ean13 등 다수 — `BarcodeType` 유니온 참조), `value?: string`(빈 값이면 미표시).
31
+ - **SdEcharts** `<sd-echarts [option]="...">` — ECharts 차트. `option: input.required<echarts.EChartsOption>`, `notMerge: boolean`(기본 false, true 면 옵션 병합 대신 교체), `loading: boolean`(로딩 오버레이).
32
+
33
+ ## 칸반
34
+
35
+ - **SdKanbanBoard<L, T>** `<sd-kanban-board>` — 칸반 보드 컨테이너(드래그 드롭 조율).
36
+ - selectedValues = model<T[]>([]) 선택된 카드 (Shift+클릭 다중 선택).
37
+ - (output) drop: `SdKanbanBoardDropInfo<L,T>` = `{ sourceKanbanValue?; targetLaneValue?; targetKanbanValue? }` — 드롭 시 발생(소스 카드→대상 레인/카드).
38
+ - **SdKanbanLane<L, T>** `<sd-kanban-lane [value]="...">` — 레인(열). `value?: L`(레인 식별), `busy: boolean`, `useCollapse: boolean`(접기 버튼) + `collapse = model(false)`, `toolTpl`/`titleTpl`(도구·제목 템플릿). 전체선택 체크박스(선택가능 카드 있을 때).
39
+ - **SdKanban<L, T>** `<sd-kanban [value]="...">` — 카드. `value?: T`, `selectable: boolean`(Shift+클릭 선택 허용), `draggable: boolean`(드래그 허용), `contentClass?: string`. 드래그 시 다른 카드/레인 위에 드롭 위치 표시.
40
+ - 타입: **SdKanbanBoardDropInfo<L,T>**(위), **SdKanbanDragRef<L,T>**(`{ value(); heightOnDrag() }`), **SdKanbanDropTarget<L,T>**(`{ targetLaneValue(); targetKanbanValue?() }`) — 보드 내부 드래그/드롭 대상 규약.
@@ -1,74 +1,74 @@
1
- # @simplysm/angular — 설정·로깅·서비스 인프라
1
+ # @simplysm/angular — 부트스트랩·설정·로깅·서비스 인프라
2
2
 
3
- 부트스트랩과 함께 읽히는 인프라 묶음. `provideSdAngular()` 전역 프로바이더를 등록하고, 클라이언트명·테마영속화·시스템로그·로컬스토리지·시스템설정·서비스 클라이언트 연결·전역 에러 처리를 담당.
3
+ 시작 1회 설정하는 부트스트랩 함수와 전역 프로바이더 묶음. 앱 부팅 코드(`appConfig`/`main.ts`)·전역 에러·서버 연결·시스템 설정 저장을 다룰 함께 읽힘.
4
4
 
5
5
  ## provideSdAngular
6
6
 
7
- `provideSdAngular(opt: { clientName: string }): EnvironmentProviders` — 앱 부트스트랩 `providers` 에 넣는 핵심 프로바이더 묶음.
7
+ `provideSdAngular(opt: { clientName: string }): EnvironmentProviders` — 앱 `providers` 1개 추가하면 다음을 일괄 설정. zoneless 변경감지 활성, 전역 에러 핸들러(`SdGlobalErrorHandlerPlugin`) 등록, 옵션 이벤트 플러그인(`SdOptionEventPlugin`) 등록, ng-icons 기본설정(strokeWidth 1.5, size 1.33em), `IMAGE_CONFIG` 경고 비활성, 테마 dark/fontSize 를 로컬스토리지(`sd-theme-dark`/`sd-theme-font-size`)자동 영속, service worker 업데이트 폴링(5분~최대1시간 지수 백오프, 갱신 감지 시 새로고침 확인), 라우터 네비게이션 동안 글로벌 busy 카운트 증감.
8
8
 
9
- - `opt.clientName` — 클라이언트 식별명. `SdAngularConfigProvider.clientName` 에 주입되어 로컬스토리지 키 prefix·서비스 클라이언트 생성에 사용. 앱마다 고유해야 함.
9
+ - opt.clientName: string 클라이언트 식별자. 로컬스토리지 키 prefix·service-client 연결 이름으로 사용. 앱마다 고유 문자열.
10
10
 
11
- 등록 내용(본문 기준): 이미지 경고 비활성화, ng-icon 기본 설정, 다크모드/폰트크기 localStorage 영속화 effect, `window` 의 `error`/`unhandledrejection` → ErrorHandler 위임, `SdOptionEventPlugin`(이벤트 옵션 플러그인), `SdGlobalErrorHandlerPlugin`(ErrorHandler), zoneless 변경감지, Service Worker 업데이트 폴링(지수 백오프, 발견 시 confirm 후 reload), 라우터 내비게이션 중 `SdBusyProvider.globalBusyCount` 증감.
12
-
13
- ```typescript
11
+ ```ts
14
12
  bootstrapApplication(AppComponent, {
15
13
  providers: [provideRouter(routes), provideSdAngular({ clientName: "my-app" })],
16
14
  });
17
15
  ```
18
16
 
19
- ## setupBgTheme
20
-
21
- `setupBgTheme(options?: { theme?: ..., lightness?: "lightest" | "lighter" }): void` — 컴포넌트 활성 동안 `document.body` 의 `--background-color` 를 테마 색으로 지정(effect, cleanup 시 복원). 컴포넌트 생성자/필드에서 호출.
22
-
23
- - `options.theme` — `"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray"`. 배경 테마 색. 미지정 시 변수 비움(`""`).
24
- - `options.lightness` — `"lightest"|"lighter"`. 밝기 단계. 기본 `"lightest"`.
25
-
26
17
  ## SdAngularConfigProvider
27
18
 
28
- `class SdAngularConfigProvider { clientName!: string }` `provideSdAngular` 가 설정하는 클라이언트명 보관 루트 프로바이더. 다른 프로바이더가 inject prefix 사용.
29
-
30
- - `clientName` — 클라이언트 식별명. 직접 set 하지 말고 `provideSdAngular({clientName})` 로 주입됨.
19
+ `@Injectable({providedIn:"root"})`. `clientName: string` 필드 1개. `provideSdAngular` 가 채워줌. 다른 프로바이더가 clientName 참조할 inject.
31
20
 
32
21
  ## SdSystemLogProvider
33
22
 
34
- `class SdSystemLogProvider` — 시스템 로그 기록 루트 프로바이더. 콘솔 로깅 + 선택적 외부 전송.
23
+ 전역 로그 기록 프로바이더. 콘솔 로그 + 선택적 서버 전송.
35
24
 
36
- - `writeFn?: (severity, ...data) => Promise<void> | void` — 외부 로그 싱크. 지정 `writeAsync` 콘솔 출력 함수도 호출. 미지정이면 콘솔만.
37
- - `writeAsync(severity: "error"|"warn"|"log", ...data): Promise<void>` — 로그 기록. `severity` 로거 메서드 선택 `writeFn` 있으면 await(실패 내부 로깅만, throw 안 함).
25
+ - writeFn?: (severity, ...data) => Promise<void> | void — 외부(서버) 전송 훅. 지정하면 로그마다 호출. 서버 로그 적재가 필요하면 초기화 할당.
26
+ - writeAsync(severity: "error"|"warn"|"log", ...data): Promise<void> — 로그 기록. 콘솔에 먼저 출력 writeFn 호출. writeFn throw 해도 로깅 자체는 실패하지 않음(내부 logger.error 기록).
38
27
 
39
- ## SdLocalStorageProvider
28
+ ## SdLocalStorageProvider<T>
40
29
 
41
- `class SdLocalStorageProvider<T>` — `clientName.{key}` prefix localStorage 에 JSON 저장하는 타입드 래퍼.
30
+ `clientName.<key>` 형태로 localStorage 에 JSON 저장/조회. T 는 `{ key: 값타입 }` 맵.
42
31
 
43
- - `set<K>(key, value)``JSON.stringify` 후 저장. `key` 는 `T` 의 키.
44
- - `get<K>(key): T[K] | undefined`파싱 반환. 없거나 파싱 실패 시 `undefined`(결측 보존).
45
- - `remove(key)`항목 제거.
32
+ - set<K>(key, value) — JSON.stringify 후 저장.
33
+ - get<K>(key): T[K] | undefined — 없거나 파싱 실패 시 undefined(결측 보존).
34
+ - remove(key) — 삭제.
46
35
 
47
- ## SdSystemConfigProvider
36
+ ## SdSystemConfigProvider<T>
48
37
 
49
- `class SdSystemConfigProvider<T>` 시스템 설정 저장소. 외부 `fn` 있으면 서버, 없으면 localStorage 폴백.
38
+ 화면별 설정(시트 컬럼 상태, 모달 위치, 상태 프리셋 등) 영속 프로바이더. `fn` 미지정 로컬스토리지로 폴백.
50
39
 
51
- - `fn?: { set(key, data): ...; get(key): PromiseLike<unknown> }`외부 저장 핸들러. 지정 서버 영속, 미지정 시 `SdLocalStorageProvider` 사용.
52
- - `setAsync<K>(key, data: T[K] | undefined)`저장. `fn` 있으면 위임, 없고 `data==null` 이면 remove, 아니면 localStorage set.
53
- - `getAsync(key)`조회. `fn` 있으면 위임, 없으면 localStorage get.
40
+ - fn?: { set(key, data): Promise|void; get(key): PromiseLike<unknown> } — 서버 영속 훅. 지정하면 서버에 저장/조회, 미지정이면 `SdLocalStorageProvider` 로 폴백. 서버 동기화가 필요하면 앱 초기화 때 할당.
41
+ - setAsync<K>(key, data) — data null 이면 제거(폴백 시), 아니면 저장.
42
+ - getAsync(key) — 저장된 조회.
54
43
 
55
- ## injectSdSystemConfigResource
44
+ ## injectSdSystemConfigResource<T>
56
45
 
57
- `injectSdSystemConfigResource<T>(options: { key: Signal<string | undefined> })` — 호스트 엘리먼트 태그명 + `key` 시스템 설정을 읽고 쓰는 Angular `resource` 래퍼. 시트/상태프리셋이 컬럼·프리셋 영속화에 사용.
46
+ `injectSdSystemConfigResource<T>({ key: Signal<string|undefined> })` — 컴포넌트 내에서 호출. 호스트 엘리먼트 태그명 + key 합친 키로 `SdSystemConfigProvider` 연동되는 resource 핸들 반환. key undefined 면 로드/저장 안 함.
58
47
 
59
- - `options.key` — 설정 키 시그널. `undefined` 면 로드 안 함(결측). 실제 키는 `{태그명}.{key}`.
60
- - 반환: `{ value, isLoading, status, hasValue(), reload(), set(value), update(fn) }` — `set` 즉시 resource 갱신 + 마이크로태스크로 `setAsync` 영속화(실패 시 ErrorHandler 위임).
48
+ - key: Signal<string|undefined> — 설정 키 signal. 값이면 비활성.
49
+ - 반환: `{ value, isLoading, status, hasValue(), reload(), set(v), update(fn) }`. set/update 즉시 로컬 반영 microtask 비동기 영속(실패 시 errorHandler 로 전달). 시트/상태프리셋이 내부적으로 사용.
61
50
 
62
51
  ## SdServiceClientFactoryProvider
63
52
 
64
- `class SdServiceClientFactoryProvider` 키별 `ServiceClient` 연결 풀. 요청/응답 진행률을 토스트 progress 로 표시.
53
+ `@simplysm/service-client` 연결을 key 단위로 관리하는 팩토리. 요청/응답 진행률을 토스트로 표시.
65
54
 
66
- - `connectAsync(key, options?: Partial<ServiceConnectionOptions>)``key` 클라이언트 연결. 호스트/포트/ssl `location` 기본값 + `options` 머지. 이미 연결/이미 끊긴 키면 throw.
67
- - `closeAsync(key)` — 연결 종료 풀에서 제거(미연결 키면 throw).
68
- - `get(key): ServiceClient` — 연결된 클라이언트 반환. 미연결/끊긴 키면 throw.
55
+ - connectAsync(key: string, options?: Partial<ServiceConnectionOptions>): Promise<void> 연결 생성. host/port/ssl 미지정 현재 location 기준 기본값. 같은 key 재연결·끊긴 key 재사용 throw.
56
+ - closeAsync(key): Promise<void> — 연결 종료. 미연결 key throw.
57
+ - get(key): ServiceClient — 연결된 클라이언트 반환. 미연결/끊김이면 throw. 서비스 호출 시 이걸로 ServiceClient 획득.
69
58
 
70
59
  ## SdGlobalErrorHandlerPlugin
71
60
 
72
- `class SdGlobalErrorHandlerPlugin implements ErrorHandler` `provideSdAngular` 가 `ErrorHandler` 로 등록하는 전역 에러 핸들러.
61
+ `ErrorHandler` 구현. `provideSdAngular` 가 등록하므로 직접 쓸 일은 드묾. 처리되지 않은 에러/Promise 거부를 시스템 로그에 기록하고 전체화면 오류 오버레이를 1회 표시 후 앱을 destroy(클릭 시 새로고침). 직접 inject 하지 말고 `throw` 로 위임.
62
+
63
+ ## SdThemeProvider
64
+
65
+ `@Injectable({providedIn:"root"})`. 다크모드·폰트크기 전역 상태.
66
+
67
+ - dark: WritableSignal<boolean> — 다크모드. true 면 body 에 `sd-theme-dark` 클래스 토글.
68
+ - fontSize: WritableSignal<number> — 루트 폰트 크기(px). 변경 시 `documentElement.style.fontSize` 반영.
69
+ - fontSizePresets: readonly number[] — `[12,14,16,20,24,28]`. 증감 단계.
70
+ - increaseFontSize() / decreaseFontSize() — 프리셋 내 다음/이전 단계로 이동.
71
+
72
+ ## SdThemeSelector
73
73
 
74
- - `handleError(event)``PromiseRejectionEvent`/`ErrorEvent`/`Error`/기타를 분기해 메시지 구성 시스템 로그 기록 + 파괴 후 전체화면 에러 오버레이 표시(클릭 시 reload). 최초 1회만 오버레이 노출. 직접 호출보다 Angular 자동 호출.
74
+ `<sd-theme-selector />`폰트크기 증감·다크모드 스위치를 드롭다운으로 제공하는 컴포넌트. input 없음. `SdThemeProvider` 직접 조작. 탑바 등에 배치.
@@ -1,55 +1,27 @@
1
1
  # @simplysm/angular — 레이아웃(사이드바·탑바)
2
2
 
3
- 화면 셸을 구성하는 사이드바/탑바 컨테이너·메뉴·사용자 메뉴. 사이드바는 모바일에서 백드롭+슬라이드, 탑바는 사이드바 토글 버튼을 자동 제공. 메뉴 입력은 `SdMenu[]`(라우팅·앱구조 참조)이며 `sdRouterLink`/선택표시가 내장됨.
4
-
5
- ## SdSidebarContainer
6
-
7
- `<sd-sidebar-container>` — 사이드바 + 본문 레이아웃 컨테이너. 본문에 좌측 패딩(`--sidebar-width`)을 주고, 모바일에서는 백드롭 표시. 라우터 내비게이션 시작 시 자동으로 사이드바를 닫음(`toggle` 신호 보유). input 없음.
8
-
9
- ## SdSidebar
10
-
11
- `<sd-sidebar>` — 실제 사이드바 패널. 부모 `SdSidebarContainer.toggle` 을 따라 슬라이드 표시/숨김. 콘텐츠는 투영. input 없음.
12
-
13
- ## SdSidebarMenu
14
-
15
- `<sd-sidebar-menu>` 사이드바 메뉴 트리.
16
-
17
- - `menus = input<SdMenu[]>([])` — 메뉴 트리. `SdAppStructureProvider.usableMenus()` 결과를 주로 넣음.
18
- - `layout: "accordion"|"flat"` — 루트 메뉴 레이아웃. 미지정 시 메뉴 3개 이하면 flat, 초과면 accordion 자동.
19
- - `getMenuIsSelectedFn?: (menu) => boolean` — 선택 판정 커스텀(미지정 시 현재 페이지코드와 codeChain 비교).
20
-
21
- 각 메뉴 항목은 `sdRouterLink` 로 `/home/{codeChain}` 이동, `url` 있으면 새 탭, 자식 있으면 하위 트리.
22
-
23
- ## SdSidebarUser
24
-
25
- `<sd-sidebar-user>` — 사이드바 상단 사용자 영역 + 접이식 메뉴.
26
-
27
- - `userMenu = input<SdSidebarUserMenu>()` `{ title: string; menus: { title; onClick }[] }`. title 클릭 시 메뉴 펼침, 항목 클릭 `onClick` 실행.
28
- - 콘텐츠 투영부에 사용자 정보 표시.
29
-
30
- ## SdTopbarContainer
31
-
32
- `<sd-topbar-container>` — 탑바 + 본문 세로 레이아웃 컨테이너. input 없음. `<sd-topbar>` 와 본문을 자식으로 둠.
33
-
34
- ## SdTopbar
35
-
36
- `<sd-topbar>` — 상단 바. 사이드바 컨테이너가 있으면 좌측에 메뉴 토글 버튼 자동 표시.
37
-
38
- - `sidebarContainer = input<SdSidebarContainer>()` — 토글 대상 사이드바. 미지정 시 inject 된 부모 `SdSidebarContainer` 사용. 둘 중 하나라도 있으면 토글 버튼 노출.
39
- - 콘텐츠(제목·액션)는 투영.
40
-
41
- ## SdTopbarMenu
42
-
43
- `<sd-topbar-menu>` — 탑바 가로 메뉴(각 루트 메뉴가 드롭다운).
44
-
45
- - `menus = input<SdMenu[]>([])` — 메뉴 트리.
46
- - `getMenuIsSelectedFn?: (menu) => boolean` — 선택 판정 커스텀.
47
-
48
- 리프 메뉴 클릭 시 드롭다운 닫힘, `url` 있으면 새 탭.
49
-
50
- ## SdTopbarUser
51
-
52
- `<sd-topbar-user>` — 탑바 우측 사용자 드롭다운 메뉴.
53
-
54
- - `menus = input.required<SdTopbarUserMenu[]>()` — `{ title: string; onClick: () => void }[]`. 항목 클릭 시 `onClick` 실행 후 드롭다운 닫힘.
55
- - 트리거 라벨(사용자명 등)은 콘텐츠 투영.
3
+ 화면 골격을 만드는 사이드바·탑바 컴포넌트 묶음. 메뉴 데이터는 `SdMenu`(routing-appstructure.md 참조) 또는 자체 메뉴 객체를 사용.
4
+
5
+ ## 사이드바
6
+
7
+ - **SdSidebarContainer** `<sd-sidebar-container>` — 사이드바 + 본문 레이아웃 컨테이너. input 없음. `toggle: WritableSignal<boolean>`(접힘 상태, 모바일은 backdrop 표시). 라우터 네비게이션 시작 시 자동 접힘. 자식으로 `sd-sidebar` 본문을 둠.
8
+ - **SdSidebar** `<sd-sidebar>` — 사이드바 패널. input 없음(컨테이너의 toggle 을 따름). 좌측 고정, 모바일에서 오버레이.
9
+ - **SdSidebarMenu** `<sd-sidebar-menu>` — 메뉴 트리 렌더. `menus = input<SdMenu[]>([])`, `layout`("accordion"|"flat" — 미지정 시 최상위 3개 이하면 flat, 아니면 accordion), `getMenuIsSelectedFn`(선택 판정 커스텀). leaf 는 `sdRouterLink` 로 이동, `menu.url` 있으면 새 창.
10
+ - **SdSidebarUser** `<sd-sidebar-user>` — 사용자 영역 + 접이식 메뉴. `userMenu = input<SdSidebarUserMenu>()`. 투영 내용(프로필) + 클릭 시 펼쳐지는 메뉴 목록. 타입 `SdSidebarUserMenu = { title: string; menus: { title; onClick }[] }`.
11
+
12
+ ```html
13
+ <sd-sidebar-container>
14
+ <sd-sidebar>
15
+ <sd-sidebar-user [userMenu]="userMenu">{{ userName }}</sd-sidebar-user>
16
+ <sd-sidebar-menu [menus]="appStructure.usableMenus()" />
17
+ </sd-sidebar>
18
+ <router-outlet />
19
+ </sd-sidebar-container>
20
+ ```
21
+
22
+ ## 탑바
23
+
24
+ - **SdTopbarContainer** `<sd-topbar-container>` — 탑바 + 본문 세로 레이아웃. input 없음.
25
+ - **SdTopbar** `<sd-topbar>` — 상단 바. `sidebarContainer = input<SdSidebarContainer>()`(미지정 시 주입된 컨테이너 자동 사용). 사이드바가 있으면 좌측 토글(햄버거) 버튼 표시. 제목·도구는 투영.
26
+ - **SdTopbarMenu** `<sd-topbar-menu>` — 드롭다운형 상단 메뉴 트리. `menus = input<SdMenu[]>([])`, `getMenuIsSelectedFn`. 최상위 메뉴별 드롭다운, leaf 클릭 시 이동·드롭다운 닫힘.
27
+ - **SdTopbarUser** `<sd-topbar-user>`사용자 드롭다운 메뉴. `menus = input.required<SdTopbarUserMenu[]>()`. 투영 내용(이름) 클릭 시 메뉴 목록. 타입 `SdTopbarUserMenu = { title: string; onClick: () => void }`.
@@ -1,115 +1,103 @@
1
1
  # @simplysm/angular — 모달·토스트·Busy·인쇄 (오버레이)
2
2
 
3
- 프로그래밍 방식으로 동적 컴포넌트를 body 부착하는 루트 프로바이더 4종(모달/토스트/Busy/인쇄)과 콘텐츠 컴포넌트가 구현할 인터페이스. 모두 `createComponent` + `ApplicationRef.attachView` 로 동작.
3
+ 화면 위에 띄우는 피드백·오버레이 묶음. 프로그래밍 방식으로 모달/토스트를 띄우거나 작업 진행 표시, 화면 인쇄/PDF 필요할 함께 읽힘.
4
4
 
5
5
  ## SdModalProvider
6
6
 
7
- `class SdModalProvider` 모달을 프로그래밍 방식으로 띄우는 루트 프로바이더.
8
-
9
- - `modalCount: Signal<number>` 현재 열린 모달 수.
10
- - `showAsync<T>(modal: SdModalInfo<T>, options?: SdModalOptions): Promise<결과 | undefined>` — 모달 표시. 콘텐츠 컴포넌트의 `close` emit 값으로 resolve, 배경/ESC/닫기버튼이면 `undefined`. 닫힘 애니메이션·포커스 복원·z-index 스택 처리.
11
-
12
- `SdModalInfo<T, X>`:
13
- - `title: string` — 모달 헤더 제목.
14
- - `type: Type<T>` — 콘텐츠 컴포넌트 클래스(`SdModalContentDef` 구현).
15
- - `inputs`콘텐츠 컴포넌트의 input 값 객체(`initialized`/`close`/`actionTplRef` 제외, `_optionalModalInputs` 로 지정된 키는 optional).
16
-
17
- `SdModalOptions`(모두 optional):
18
- - `key`설정 키. 지정 크기·위치를 `SdSystemConfigProvider` 영속화.
19
- - `hideHeader` — 헤더 전체 숨김.
20
- - `hideCloseButton` — 닫기(X) 버튼만 숨김.
21
- - `headerStyle`헤더 인라인 스타일.
22
- - `useCloseByBackdrop`배경 클릭으로 닫기 허용. 기본 true.
23
- - `useCloseByEscapeKey`ESC 닫기 허용. 기본 true.
24
- - `float`배경 없는 플로팅 모달(다른 조작 가능).
25
- - `fill`전체화면 채움.
26
- - `resizable`모서리/변 드래그 리사이즈.
27
- - `movable`헤더 드래그 이동.
28
- - `position``"bottom-right"|"top-right"`. 고정 위치.
29
- - `minHeightPx`/`minWidthPx`/`heightPx`/`widthPx`크기 px.
30
- - `noFirstControlFocusing` 입력요소 자동 포커스 끔(true 면 dialog 자체 포커스).
31
-
32
- `SdModalContentDef<O>`(콘텐츠 컴포넌트 구현 인터페이스):
33
- - `initialized: Signal<boolean>`초기화 완료 신호.
34
- - `close: OutputEmitterRef<O | undefined>` — 결과 emit 시 모달 닫힘.
35
- - `actionTplRef?: TemplateRef<any>` — 헤더 우측 액션 영역 템플릿.
36
- - `_optionalModalInputs?: string` — optional 처리할 input 키(타입 마커).
37
-
38
- ```typescript
7
+ `@Injectable({providedIn:"root"})`. 컴포넌트를 모달로 동적 생성.
8
+
9
+ - showAsync<T>(modal: SdModalInfo<T>, options?: SdModalOptions): Promise<close결과 | undefined> — 모달 표시. 컨텐츠 컴포넌트의 `close.emit(result)` 시 result 로 resolve, 배경클릭/ESC/닫기버튼 시 undefined 로 resolve. 첫 탭 가능 컨트롤에 자동 포커스.
10
+ - modalCount: Signal<number> 현재 열린 모달 수.
11
+
12
+ `SdModalInfo<T, X>` = `{ title: string; type: Type<T>; inputs: ... }`. inputs 는 컨텐츠 컴포넌트의 input 중 `initialized`/`close`/`actionTplRef`/`_optionalModalInputs` 와 X 로 지정한 키를 제외한 것. `_optionalModalInputs` 로 선언한 키는 optional.
13
+
14
+ `SdModalContentDef<O>` — 모달 컨텐츠 컴포넌트가 구현할 인터페이스:
15
+ - initialized: Signal<boolean> 초기화 완료 신호(인쇄/대기 동기화에 사용).
16
+ - close: OutputEmitterRef<O | undefined> — 결과 emit. O 가 모달 반환 타입.
17
+ - actionTplRef?: TemplateRef — 헤더 우측 액션 영역에 투영할 템플릿(있으면 모달 헤더로 브릿지됨).
18
+ - _optionalModalInputs?: string optional input 키들의 유니온 타입 표식(런타임 값 아님).
19
+
20
+ `SdModalOptions`:
21
+ - key?: string 지정 크기·위치를 `SdSystemConfigProvider` 에 영속(`sd-modal.<key>`).
22
+ - hideHeader?: boolean 헤더(제목·닫기버튼) 숨김.
23
+ - hideCloseButton?: boolean 우상단 닫기 버튼만 숨김.
24
+ - headerStyle?: string 헤더 인라인 스타일.
25
+ - useCloseByBackdrop?: boolean 배경 클릭으로 닫기 허용(기본 true). 입력 확인 모달이면 false.
26
+ - useCloseByEscapeKey?: boolean ESC 닫기 허용(기본 true).
27
+ - float?: boolean 배경(backdrop) 없이 떠 있는 모달. 비차단 패널이면 true.
28
+ - fill?: boolean 화면 가득 채움(전체화면 모달).
29
+ - resizable?: boolean 8방향 리사이즈 핸들 표시.
30
+ - movable?: boolean 헤더 드래그로 이동.
31
+ - position?: "bottom-right" | "top-right" — 고정 위치(알림형 모달).
32
+ - minHeightPx/minWidthPx/heightPx/widthPx?: number — 최소·초기 크기(px).
33
+ - noFirstControlFocusing?: boolean — 컨트롤 자동 포커스 비활성(다이얼로그 자체에 포커스).
34
+
35
+ ```ts
39
36
  const result = await sdModal.showAsync(
40
- { title: "사용자 선택", type: UserSelectModal, inputs: { deptId } },
37
+ { title: "사용자 선택", type: UserSelectModal, inputs: { teamId } },
41
38
  { resizable: true, key: "user-select" },
42
39
  );
43
40
  ```
44
41
 
45
42
  ## SdModal
46
43
 
47
- `<sd-modal>` — 모달 셸 컴포넌트. 보통 `SdModalProvider` 내부 생성하지만 선언적으로도 사용 가능.
48
-
49
- - `open = model(false)` — 열림 여부 양방향.
50
- - `title`/`hideHeader`/`hideCloseButton`/`headerStyle`/`useCloseByBackdrop`/`useCloseByEscapeKey`/`float`/`fill`/`resizable`/`movable`/`position`/`minHeightPx`/`minWidthPx`/`heightPx`/`widthPx`/`actionTplRef` — `SdModalOptions` 와 동일 의미의 input.
51
- - `key` — 크기·위치 영속화 키.
52
- - `closeRequest = output<void>()` — 배경/ESC/닫기버튼으로 닫기 요청 시 emit.
44
+ `<sd-modal>` — `SdModalProvider` 가 내부적으로 생성하는 셸 컴포넌트. 직접 템플릿에 쓰기보다 provider 경유 권장. 위 `SdModalOptions` 동일한 input + `open = model(false)`, `closeRequest = output<void>()`, `title`/`actionTplRef` input 보유.
53
45
 
54
46
  ## SdActivatedModalProvider
55
47
 
56
- `class SdActivatedModalProvider<T>` 모달 콘텐츠 내부에서 inject 모달 컨텍스트에 접근.
57
-
58
- - `modalComponent: Signal<SdModal | undefined>`부모 `SdModal` 인스턴스.
59
- - `contentComponent: Signal<T | undefined>` — 콘텐츠 컴포넌트 인스턴스.
60
- - `canDeactivateFn: () => boolean` — 닫기 차단 함수(true 면 닫힘 허용). `setupCanDeactivate` 가 설정.
48
+ 모달 컨텐츠 컴포넌트 내부에서 inject. 현재 모달 제어.
49
+ - modalComponent: Signal<SdModal | undefined> / contentComponent: Signal<T | undefined>.
50
+ - canDeactivateFn: () => boolean닫기 차단 판정. `setupCanDeactivate` 가 설정. true 가 아니면 배경/ESC/버튼 닫기 무시.
61
51
 
62
52
  ## SdPromptModal / SdConfirmModal
63
53
 
64
- 내장 범용 모달 콘텐츠. `SdModalProvider.showAsync` `type` 으로 사용.
54
+ provider 바로 넘길 있는 범용 모달 컴포넌트.
55
+ - SdPromptModal: `SdModalContentDef<string>`. `message = input.required<string>()`. 텍스트 입력(필수) 후 확인 시 입력값, 취소 시 undefined emit.
56
+ - SdConfirmModal: `SdModalContentDef<boolean>`. `message = input.required<string>()`. 확인 시 `true`, 취소 시 undefined emit.
65
57
 
66
- - `SdPromptModal` — `SdModalContentDef<string>`. `message: input.required<string>()` 표시 후 텍스트 입력. 확인 시 입력값 emit(필수 검증), 취소 시 `undefined`.
67
- - `SdConfirmModal` `SdModalContentDef<boolean>`. `message` 표시 확인 `true`, 취소 `undefined` emit.
58
+ ```ts
59
+ const name = await sdModal.showAsync({ title: "이름", type: SdPromptModal, inputs: { message: "이름?" } });
60
+ ```
68
61
 
69
62
  ## SdToastProvider
70
63
 
71
- `class SdToastProvider` — 토스트 알림 루트 프로바이더.
72
-
73
- - `alertThemes: WritableSignal<SdToastSeverity[]>` 심각도는 토스트 대신 `window.alert` 표시.
74
- - `overlap: WritableSignal<boolean>` true 토스트가 기존 토스트를 모두 치우고 겹쳐 표시.
75
- - `beforeShowFn?: (theme) => void` — 토스트 표시 직전 콜백.
76
- - `info/success/warning/danger(message, useProgress?)` — 심각도별 토스트. `useProgress: true` 면 `WritableSignal<number>`(0~100) 반환(100 도달 1초 자동 해제), 아니면 3초 후 자동 해제(호버 시 지연).
77
- - `notify<T>(input: SdToastInput<T>): Promise<결과|undefined>` 커스텀 컴포넌트 토스트. `close` emit 값으로 resolve, 5초자동 `undefined`.
78
- - `try<R>(fn, messageFn?): Promise<R|undefined>``fn` 실행, `Error` 발생 시 `danger` 토스트 + 시스템로그 후 `undefined` 반환(비-Error 는 rethrow). `messageFn` 으로 메시지 커스터마이즈.
79
-
80
- 타입:
81
- - `SdToastSeverity` — `"info"|"success"|"warning"|"danger"`.
82
- - `SdToastTheme` — `"primary"|"secondary"|SdToastSeverity|"gray"|"blue-gray"`.
83
- - `SdToastContentDef<O>` `{ close: OutputEmitterRef<O|undefined> }`. notify 콘텐츠 구현.
84
- - `SdToastInput<T>` — `{ type: Type<T>; inputs }`(`close` 제외 input).
85
-
86
- ```typescript
87
- sdToast.danger("저장 실패");
88
- const progress = sdToast.info("업로드 중", true);
89
- progress.set(50);
90
- await sdToast.try(() => api.saveAsync());
64
+ `@Injectable({providedIn:"root"})`. 토스트 알림.
65
+
66
+ - info/success/warning/danger(message: string, useProgress?: boolean) — 심각도별 토스트. useProgress=true 면 진행률 토스트가 되어 `WritableSignal<number>`(0~100) 반환, 100 도달 1초 자동 해제. useProgress 없거나 false 면 3초 후 자동 해제(호버 중 지연), 반환 void.
67
+ - notify<T>(input: SdToastInput<T>): Promise<close결과 | undefined> — 커스텀 컴포넌트 토스트. `SdToastInput<T>` = `{ type: Type<T>; inputs }`(컨텐츠는 `SdToastContentDef<O>` = `{ close: OutputEmitterRef<O|undefined> }` 구현). 5초 자동 해제.
68
+ - try<R>(fn, messageFn?): Promise<R | undefined> fn 실행 중 Error 발생 시 danger 토스트 + 시스템로그 기록 후 undefined 반환(Error 아닌 throw 는 재throw). 화면 액션 핸들러를 감싸는 표준 패턴.
69
+ - alertThemes: WritableSignal<SdToastSeverity[]> 심각도들은 토스트 대신 `window.alert`.
70
+ - overlap: WritableSignal<boolean> — true 토스트가 기존 토스트 모두 제거표시(겹침 방지).
71
+ - beforeShowFn?: (theme) => void — 토스트 표시 직전 콜백(예: 사운드).
72
+
73
+ 타입: `SdToastSeverity = "info"|"success"|"warning"|"danger"`, `SdToastTheme = "primary"|"secondary"|SdToastSeverity|"gray"|"blue-gray"`.
74
+
75
+ ```ts
76
+ await sdToast.try(async () => { await save(); sdToast.success("저장됨"); });
91
77
  ```
92
78
 
93
79
  ## SdToast / SdToastContainer
94
80
 
95
- - `<sd-toast>` 개별 토스트. `open`/`progress`/`message` 는 `model`, `useProgress`/`theme` input. theme 에 따라 `role`/`aria-live`(info·success=polite/status, warning·danger=assertive/alert) 자동.
96
- - `<sd-toast-container>` — 토스트 컨테이너. `overlap = input(false)` — 겹침 모드.
81
+ `SdToastProvider` 내부 생성. 직접 쓸 일 드묾. SdToast: `open`/`progress`/`message` model, `useProgress`/`theme` input, severity 에 따라 `role`/`aria-live` 자동(info·success=status/polite, warning·danger=alert/assertive). SdToastContainer: `overlap` input.
97
82
 
98
- ## SdBusyProvider / SdBusyContainer
83
+ ## SdBusyProvider
99
84
 
100
- 전역·지역 로딩 표시.
85
+ `@Injectable({providedIn:"root"})`. 전역 로딩 표시.
86
+ - globalBusyCount: WritableSignal<number> — >0 이면 전역 busy 오버레이 표시(라우팅·인쇄가 자동 증감). 직접 작업 감쌀 때 update 로 증감.
87
+ - type: WritableSignal<SdBusyType> — 기본 표시 유형. `SdBusyType = "spinner"|"bar"|"cube"`.
101
88
 
102
- - `SdBusyProvider` — `type: WritableSignal<SdBusyType>` 기본 스피너 종류, `globalBusyCount: WritableSignal<number>` 0 초과 시 전역 busy 오버레이 표시. 라우팅·인쇄가 자동 증감.
103
- - `SdBusyType` — `"spinner"|"bar"|"cube"`. 인디케이터 모양.
104
- - `<sd-busy-container>` — 지역 busy 래퍼. `busy = input(false)` 표시 여부, `message`/`type`(미지정 시 프로바이더 type 따름)/`progressPercent`(0~100 막대) input. busy 중 키입력 차단.
89
+ ## SdBusyContainer
105
90
 
106
- ## SdPrintProvider
91
+ `<sd-busy-container [busy]="..." />` — 영역 단위 busy 오버레이. 내부 컨텐츠 위에 표시.
92
+ - busy: boolean — true 면 오버레이 표시 + 영역 내 키입력 차단.
93
+ - message?: string — 표시 메시지.
94
+ - type?: "spinner"|"bar"|"cube" — 미지정 시 `SdBusyProvider.type` 사용.
95
+ - progressPercent?: number — 지정 시 상단 진행 바 표시(0~100).
107
96
 
108
- `class SdPrintProvider` — 컴포넌트를 인쇄하거나 PDF 버퍼로 만드는 루트 프로바이더. 진행 중 전역 busy 증가.
97
+ ## SdPrintProvider
109
98
 
110
- - `printAsync<T>(template: SdPrintInput<T>, options?: { size?: string; margin?: string }): Promise<void>` — 템플릿 컴포넌트를 body 부착·`@page` 스타일 주입 후 `window.print()`. 이미지 로드 대기.
111
- - `getPdfBufferAsync<T>(template, options?: { orientation?: "portrait"|"landscape"; pageSize?: string }): Promise<Uint8Array>` — `.page` 요소(없으면 전체)를 캔버스화해 jsPDF PDF 버퍼 생성.
99
+ `@Injectable({providedIn:"root"})`. 컴포넌트를 인쇄/PDF 렌더.
100
+ - printAsync<T>(template: SdPrintInput<T>, options?: { size?: string; margin?: string }): Promise<void>컴포넌트를 body 에 임시 렌더 후 `window.print()`. size 기본 `"A4 auto"`, margin 기본 `"0"`. 인쇄 동안 글로벌 busy.
101
+ - getPdfBufferAsync<T>(template, options?: { orientation?: "portrait"|"landscape"; pageSize?: string }): Promise<Uint8Array> — `.page` 엘리먼트별로 캔버스 변환(jsPDF) 후 PDF 버퍼 반환. pageSize 기본 `"a4"`, orientation 기본 portrait.
112
102
 
113
- 타입:
114
- - `SdPrint` — `{ initialized: Signal<boolean>; _optionalPrintInputs?: string }`. 인쇄 콘텐츠 구현.
115
- - `SdPrintInput<T, X>` — `{ type: Type<T>; inputs }`(`_optionalPrintInputs` 키는 optional).
103
+ `SdPrintInput<T, X>` = `{ type: Type<T>; inputs }`. 컨텐츠는 `SdPrint`(= `{ initialized: Signal<boolean>; _optionalPrintInputs?: string }`) 구현. `initialized()` 가 true 가 되고 이미지 로드 완료까지 대기 후 인쇄.