@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.
- package/claude/references/sd-simplysm14/README.md +17 -17
- package/claude/references/sd-simplysm14/apis/angular/README.md +27 -53
- package/claude/references/sd-simplysm14/apis/angular/controls.md +37 -105
- package/claude/references/sd-simplysm14/apis/angular/crud.md +46 -43
- package/claude/references/sd-simplysm14/apis/angular/directives.md +22 -32
- package/claude/references/sd-simplysm14/apis/angular/features.md +40 -55
- package/claude/references/sd-simplysm14/apis/angular/infra.md +40 -40
- package/claude/references/sd-simplysm14/apis/angular/layout.md +25 -53
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +70 -82
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +44 -39
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +21 -36
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +52 -65
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +65 -70
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +33 -35
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +7 -7
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +29 -29
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +45 -50
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +42 -55
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +13 -12
- package/claude/references/sd-simplysm14/apis/core-common/README.md +222 -98
- package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +102 -53
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
- package/claude/references/sd-simplysm14/apis/core-common/datetime.md +98 -64
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
- package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +34 -28
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +104 -40
- package/claude/references/sd-simplysm14/apis/core-node/README.md +11 -8
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +23 -31
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +33 -22
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +28 -25
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +39 -53
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +26 -29
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +27 -29
- package/claude/references/sd-simplysm14/apis/excel/README.md +14 -14
- package/claude/references/sd-simplysm14/apis/lint/README.md +27 -21
- package/claude/references/sd-simplysm14/apis/lint/rules.md +89 -49
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +5 -59
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +98 -67
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +107 -92
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +99 -65
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +83 -98
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -52
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +62 -25
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +27 -27
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +12 -15
- package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +92 -45
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +226 -108
- package/claude/references/sd-simplysm14/apis/service-client/README.md +84 -86
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +14 -11
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +33 -10
- package/claude/references/sd-simplysm14/apis/service-common/README.md +37 -23
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +9 -9
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +13 -13
- package/claude/references/sd-simplysm14/apis/service-server/README.md +81 -65
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +32 -35
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +44 -33
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +34 -45
- package/claude/references/sd-simplysm14/apis/storage/README.md +24 -18
- package/claude/skills/sd-demo/SKILL.md +6 -0
- package/claude/skills/sd-impl/SKILL.md +4 -7
- package/claude/skills/sd-spec/SKILL.md +31 -858
- package/claude/skills/sd-spec/references/spec-authoring.md +519 -0
- package/claude/workflows/sd-docs.js +84 -0
- package/package.json +1 -1
- package/claude/references/sd-simplysm14/apis/orm-common/query-builder.md +0 -29
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
- package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
- package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
- package/claude/skills/sd-docs/SKILL.md +0 -46
- package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
- package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
- package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
- package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
- package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
- package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
- package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
- package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
- package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
- package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
- package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
- package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
- package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
- package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
- package/claude/skills/sd-review/evals/golden.jsonl +0 -2
- package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
- package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
- package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
- package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
- package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
- package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
- package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
- package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
- package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
- package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
- package/claude/skills/sd-use/evals/golden.jsonl +0 -6
- /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
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
`<sd-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
- `required`
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- `<sd-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
- `<sd-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
앱
|
|
3
|
+
앱 시작 시 1회 설정하는 부트스트랩 함수와 전역 프로바이더 묶음. 앱 부팅 코드(`appConfig`/`main.ts`)·전역 에러·서버 연결·시스템 설정 저장을 다룰 때 함께 읽힘.
|
|
4
4
|
|
|
5
5
|
## provideSdAngular
|
|
6
6
|
|
|
7
|
-
`provideSdAngular(opt: { clientName: string }): EnvironmentProviders` — 앱
|
|
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
|
-
-
|
|
9
|
+
- opt.clientName: string — 이 클라이언트 식별자. 로컬스토리지 키 prefix·service-client 연결 이름으로 사용. 앱마다 고유 문자열.
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
- `clientName` — 클라이언트 식별명. 직접 set 하지 말고 `provideSdAngular({clientName})` 로 주입됨.
|
|
19
|
+
`@Injectable({providedIn:"root"})`. `clientName: string` 필드 1개. `provideSdAngular` 가 채워줌. 다른 프로바이더가 clientName 을 참조할 때 inject.
|
|
31
20
|
|
|
32
21
|
## SdSystemLogProvider
|
|
33
22
|
|
|
34
|
-
|
|
23
|
+
전역 로그 기록 프로바이더. 콘솔 로그 + 선택적 서버 전송.
|
|
35
24
|
|
|
36
|
-
-
|
|
37
|
-
-
|
|
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
|
-
`
|
|
30
|
+
`clientName.<key>` 형태로 localStorage 에 JSON 저장/조회. T 는 `{ key: 값타입 }` 맵.
|
|
42
31
|
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
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
|
-
|
|
38
|
+
화면별 설정(시트 컬럼 상태, 모달 위치, 상태 프리셋 등) 영속 프로바이더. `fn` 미지정 시 로컬스토리지로 폴백.
|
|
50
39
|
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
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>(
|
|
46
|
+
`injectSdSystemConfigResource<T>({ key: Signal<string|undefined> })` — 컴포넌트 내에서 호출. 호스트 엘리먼트 태그명 + key 를 합친 키로 `SdSystemConfigProvider` 에 연동되는 resource 핸들 반환. key 가 undefined 면 로드/저장 안 함.
|
|
58
47
|
|
|
59
|
-
-
|
|
60
|
-
- 반환: `{ value, isLoading, status, hasValue(), reload(), set(
|
|
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
|
-
`
|
|
53
|
+
`@simplysm/service-client` 연결을 key 단위로 관리하는 팩토리. 요청/응답 진행률을 토스트로 표시.
|
|
65
54
|
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
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
|
-
`
|
|
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
|
-
-
|
|
74
|
+
`<sd-theme-selector />` — 폰트크기 증감·다크모드 스위치를 드롭다운으로 제공하는 컴포넌트. input 없음. `SdThemeProvider` 를 직접 조작. 탑바 등에 배치.
|
|
@@ -1,55 +1,27 @@
|
|
|
1
1
|
# @simplysm/angular — 레이아웃(사이드바·탑바)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
`<sd-sidebar-container>` — 사이드바 + 본문 레이아웃 컨테이너.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
`<sd-
|
|
26
|
-
|
|
27
|
-
-
|
|
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
|
-
|
|
3
|
+
화면 위에 띄우는 피드백·오버레이 묶음. 프로그래밍 방식으로 모달/토스트를 띄우거나 작업 진행 표시, 화면 인쇄/PDF 가 필요할 때 함께 읽힘.
|
|
4
4
|
|
|
5
5
|
## SdModalProvider
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
`SdModalInfo<T, X
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
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: {
|
|
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>` —
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
67
|
-
|
|
58
|
+
```ts
|
|
59
|
+
const name = await sdModal.showAsync({ title: "이름", type: SdPromptModal, inputs: { message: "이름?" } });
|
|
60
|
+
```
|
|
68
61
|
|
|
69
62
|
## SdToastProvider
|
|
70
63
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
-
|
|
74
|
-
- `
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
타입:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
+
## SdPrintProvider
|
|
109
98
|
|
|
110
|
-
|
|
111
|
-
-
|
|
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 가 되고 이미지 로드 완료까지 대기 후 인쇄.
|