@simplysm/sd-claude 14.0.98 → 14.0.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/claude/references/sd-simplysm14/README.md +16 -16
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +81 -153
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +179 -205
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +71 -57
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +49 -109
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +58 -86
  7. package/claude/references/sd-simplysm14/apis/angular/kanban.md +32 -40
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +38 -52
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +86 -110
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +54 -86
  11. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +82 -74
  12. package/claude/references/sd-simplysm14/apis/angular/sheet.md +56 -80
  13. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +15 -15
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +21 -21
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +79 -53
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +9 -11
  17. package/claude/references/sd-simplysm14/apis/core-browser/README.md +15 -15
  18. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +20 -20
  19. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +18 -18
  20. package/claude/references/sd-simplysm14/apis/core-common/README.md +20 -49
  21. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +66 -55
  22. package/claude/references/sd-simplysm14/apis/core-common/collection-ext.md +83 -56
  23. package/claude/references/sd-simplysm14/apis/core-common/errors.md +32 -21
  24. package/claude/references/sd-simplysm14/apis/core-common/obj.md +57 -39
  25. package/claude/references/sd-simplysm14/apis/core-common/serialization.md +36 -30
  26. package/claude/references/sd-simplysm14/apis/core-common/value-types.md +69 -41
  27. package/claude/references/sd-simplysm14/apis/core-node/README.md +4 -4
  28. package/claude/references/sd-simplysm14/apis/core-node/consola.md +15 -13
  29. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +11 -7
  30. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +8 -8
  31. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +29 -20
  32. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +14 -6
  33. package/claude/references/sd-simplysm14/apis/core-node/worker.md +3 -3
  34. package/claude/references/sd-simplysm14/apis/excel/README.md +3 -3
  35. package/claude/references/sd-simplysm14/apis/excel/cell.md +32 -32
  36. package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +23 -24
  37. package/claude/references/sd-simplysm14/apis/excel/style.md +24 -30
  38. package/claude/references/sd-simplysm14/apis/excel/utils.md +20 -23
  39. package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +60 -71
  40. package/claude/references/sd-simplysm14/apis/excel/wrapper.md +36 -36
  41. package/claude/references/sd-simplysm14/apis/lint/README.md +7 -9
  42. package/claude/references/sd-simplysm14/apis/lint/recommended.md +59 -37
  43. package/claude/references/sd-simplysm14/apis/lint/rules.md +81 -74
  44. package/claude/references/sd-simplysm14/apis/orm-common/README.md +6 -6
  45. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +112 -78
  46. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +131 -75
  47. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +126 -82
  48. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +170 -113
  49. package/claude/references/sd-simplysm14/apis/orm-common/types.md +102 -48
  50. package/claude/references/sd-simplysm14/apis/orm-node/README.md +12 -13
  51. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +3 -3
  52. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +5 -5
  53. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +67 -65
  54. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +130 -123
  55. package/claude/references/sd-simplysm14/apis/service-client/README.md +63 -63
  56. package/claude/references/sd-simplysm14/apis/service-client/orm.md +22 -22
  57. package/claude/references/sd-simplysm14/apis/service-client/transport.md +30 -26
  58. package/claude/references/sd-simplysm14/apis/service-common/README.md +8 -8
  59. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +13 -6
  60. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +1 -1
  61. package/claude/references/sd-simplysm14/apis/service-server/README.md +43 -47
  62. package/claude/references/sd-simplysm14/apis/service-server/built-in-services.md +35 -0
  63. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +20 -19
  64. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +23 -25
  65. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +9 -9
  66. package/claude/references/sd-simplysm14/apis/storage/README.md +26 -26
  67. package/claude/references/sd-simplysm14/manuals/client-component.md +9 -1
  68. package/claude/references/sd-simplysm14/manuals/client-crud.md +1 -1
  69. package/claude/references/sd-simplysm14/manuals/client-orm.md +1 -0
  70. package/claude/references/sd-simplysm14/manuals/client-service.md +1 -0
  71. package/claude/references/sd-simplysm14/manuals/client-shared-data.md +1 -0
  72. package/claude/references/sd-simplysm14/manuals/client-ssg.md +1 -0
  73. package/claude/sd-system-prompt.md +11 -26
  74. package/claude/skills/sd-docs/references/subagent-prompt.md +4 -3
  75. package/claude/skills/sd-spec/SKILL.md +87 -18
  76. package/claude/skills/sd-spec/references/format.md +2 -2
  77. package/package.json +1 -1
@@ -49,20 +49,20 @@ ORM 호출, 파일 변환, 비즈니스 로직 등은 위 두 경우에 해당
49
49
 
50
50
  ## 패키지 인덱스
51
51
 
52
- - **angular** — Angular 21 zoneless 프론트엔드 UI 라이브러리 — provideSdAngular 부트스트랩, 모달/토스트/busy/인쇄 오버레이, 폼 입력·버튼·셀렉트 등 컨트롤, sd-sheet 그리드, sd-crud-list/detail 화면 골격, 공유 마스터 데이터 선택, 사이드바/탑바 레이아웃, 라우팅·메뉴·권한, core 디렉티브·signal 헬퍼, 칸반/권한표/에디터/시각화. 화면 작성·수정 시 사용. 자세히: [apis/angular/README.md](./apis/angular/README.md)
53
- - **capacitor-plugin-auto-update** — Android APK 자동 업데이트 Capacitor 플러그인 부팅 시 서버/외부저장소의 최신 APK 를 받아 설치하는 오케스트레이터(AutoUpdate.run/runByExternalStorage) 저수준 설치·권한·버전 조회 정적 클래스(ApkInstaller) 브리지 타입(ApkInstallerPlugin/VersionInfo)을 쓸 때. 자세히: [apis/capacitor-plugin-auto-update/README.md](./apis/capacitor-plugin-auto-update/README.md)
54
- - **capacitor-plugin-file-system** — Capacitor 네이티브 파일 시스템 접근(Android OS 파일 시스템 / IndexedDB 에뮬레이션). FileSystem 정적 메서드로 권한 확인·요청, 디렉토리 읽기/생성, 파일 읽기/쓰기/삭제, 저장소 경로·파일 URI 조회 시. 자세히: [apis/capacitor-plugin-file-system/README.md](./apis/capacitor-plugin-file-system/README.md)
55
- - **capacitor-plugin-intent** — Android 인텐트 송수신 Capacitor 플러그인(Intent 정적 클래스) — 브로드캐스트 구독/전송, 실행 인텐트 조회, newIntent 리스닝, startActivityForResult 외부 Activity 실행·결과 수신. 바코드 스캐너·PDA 산업용 디바이스 연동 사용. 자세히: [apis/capacitor-plugin-intent/README.md](./apis/capacitor-plugin-intent/README.md)
56
- - **capacitor-plugin-usb-storage** — 연결된 USB Mass Storage 장치를 열거·권한확인 디렉토리/파일을 읽는 Capacitor 플러그인. 정적 클래스 UsbStorage 입출력 타입(UsbDeviceInfo/UsbDeviceFilter/UsbFileInfo/UsbStoragePlugin) 제공. 자세히: [apis/capacitor-plugin-usb-storage/README.md](./apis/capacitor-plugin-usb-storage/README.md)
57
- - **core-browser** — 브라우저 전용 유틸리티 — DOM 요소 탐색·위치 계산·가시성 확장, IndexedDB 영속화 및 가상 파일시스템, Blob 다운로드·URL 바이너리 수신·파일 선택 대화상자가 필요할 때. 자세히: [apis/core-browser/README.md](./apis/core-browser/README.md)
58
- - **core-common** — 브라우저·Node 공용 기반 유틸 — 날짜/시간 값 타입(DateTime/DateOnly/Time/Uuid), 에러 클래스(SdError 등), 배열/Set/Map 프로토타입 확장, 객체 깊은 복사·비교·병합(obj), 직렬화(json/xml/bytes/transfer), 비동기 큐·이벤트·대기·자동만료 Map, 문자열/숫자/경로/날짜포맷 유틸, 로거·환경변수·원시타입 매핑이 필요할 때. 자세히: [apis/core-common/README.md](./apis/core-common/README.md)
59
- - **core-node** — Node 전용 유틸: 파일시스템 IO(fsx)·경로 가공(pathx)·자식 프로세스 실행(cpx)·glob 감시(FsWatcher)·consola 로깅 셋업(setupConsola)·worker_threads 타입 안전 래퍼(Worker/createWorker)가 필요할 때. 자세히: [apis/core-node/README.md](./apis/core-node/README.md)
60
- - **excel** — xlsx(엑셀) 파일을 코드로 읽기/쓰기 ExcelWorkbook 으로 시트·셀 값/수식·스타일·조건부서식·이미지·뷰(틀고정/줌/자동필터) 다루고, ExcelWrapper(Zod 스키마)로 레코드 배열 ↔ 엑셀 변환, ExcelUtils 주소·날짜·숫자형식 변환할 때. 자세히: [apis/excel/README.md](./apis/excel/README.md)
61
- - **lint** — 심플리즘 ESLint 자산. 커스텀 규칙 9종 플러그인(`@simplysm/lint/eslint-plugin`)과 그 규칙 + typescript-eslint/angular-eslint/import/unused-imports 를 묶은 flat config 프리셋(`@simplysm/lint/eslint-recommended`)을 프로젝트 eslint.config 에 적용하거나 개별 규칙의 검사 대상·메시지·autofix·옵션을 파악할 때. 자세히: [apis/lint/README.md](./apis/lint/README.md)
62
- - **orm-common** — Dialect(MySQL/MSSQL/PostgreSQL) 독립 ORM 코어 — Table/View/Procedure 스키마 빌더, DbContext 상속(연결·트랜잭션·DDL·마이그레이션), Queryable 체이닝(SELECT/CUD·join/include/union/recursive·검색), expr 표현식 빌더(비교·집계·조건·윈도우·서브쿼리), QueryDef/Expr AST·dialect QueryBuilder·결과 파싱을 다룰 때. 자세히: [apis/orm-common/README.md](./apis/orm-common/README.md)
52
+ - **angular** — Angular 클라이언트 프레임워크 — provideSdAngular 부트스트랩, UI 컨트롤·사이드바/탑바 레이아웃, CRUD·시트·공유데이터·칸반·시각화 컴포넌트, 모달·토스트·busy·인쇄 오버레이, 라우팅·권한·설정 인프라를 다룰 때. 자세히: [apis/angular/README.md](./apis/angular/README.md)
53
+ - **capacitor-plugin-auto-update** — Android APK 자동 업데이트 부팅 시 서버(ServiceClient) 또는 외부 저장소 폴더에서 최신 APK 를 받아 설치(AutoUpdate.run/runByExternalStorage)하거나, 설치 권한·APK 설치·앱 버전 조회를 저수준(ApkInstaller)으로 다룰 때. 자세히: [apis/capacitor-plugin-auto-update/README.md](./apis/capacitor-plugin-auto-update/README.md)
54
+ - **capacitor-plugin-file-system** — 앱/웹에서 파일·디렉토리 읽기·쓰기·삭제, 표준 저장소 경로·파일 URI 조회, 파일 접근 권한 확인·요청이 필요할 (FileSystem 정적 클래스 진입점, Android 네이티브 IndexedDB 에뮬레이션 동일 API). 자세히: [apis/capacitor-plugin-file-system/README.md](./apis/capacitor-plugin-file-system/README.md)
55
+ - **capacitor-plugin-intent** — Android 인텐트 연동(브로드캐스트 송수신·실행 인텐트 조회·newIntent 리스닝·startActivityForResult)을 정적 클래스 Intent 수행하는 Capacitor 플러그인. 산업용 디바이스(바코드 스캐너·PDA) 연동용, 웹은 무동작 스텁. 자세히: [apis/capacitor-plugin-intent/README.md](./apis/capacitor-plugin-intent/README.md)
56
+ - **capacitor-plugin-usb-storage** — USB Mass Storage 장치 열거·권한 확인/요청·디렉토리 나열·파일 읽기를 다루는 Capacitor 플러그인(UsbStorage 정적 진입점, UsbDeviceFilter 장치 지정). 자세히: [apis/capacitor-plugin-usb-storage/README.md](./apis/capacitor-plugin-usb-storage/README.md)
57
+ - **core-browser** — 브라우저 전용 유틸 — DOM 요소 확장(조회·순회·위치·가시성·클립보드·경계 측정), IndexedDB 키-값 영속화 및 가상 파일트리, Blob 다운로드·URL 바이너리 수신·파일 선택 대화상자가 필요할 때. 자세히: [apis/core-browser/README.md](./apis/core-browser/README.md)
58
+ - **core-common** — 브라우저·Node 공용 기반 유틸 — 날짜/시간 값 타입(DateTime/DateOnly/Time/Uuid), 에러 클래스, 배열/Set/Map 프로토타입 확장, 객체 깊은 복사·비교·병합(obj), 직렬화(json/xml/bytes/transfer), 비동기 큐·이벤트·대기·자동만료 Map, 문자열/숫자/경로 유틸, 로거·환경변수·원시타입 매핑이 필요할 때. 자세히: [apis/core-common/README.md](./apis/core-common/README.md)
59
+ - **core-node** — Node 전용 기반 계층 — 파일시스템 IO(fsx)·경로 가공(pathx)·자식 프로세스 실행(cpx)·glob 파일 감시(FsWatcher)·consola 로깅 셋업(setupConsola)·타입 안전 worker_threads 래퍼(Worker/createWorker)가 필요할 때. 자세히: [apis/core-node/README.md](./apis/core-node/README.md)
60
+ - **excel** — 엑셀(.xlsx) 워크북 읽기/쓰기·셀 값/수식·스타일·조건부 서식·이미지·뷰(ExcelWorkbook/ExcelWorksheet/ExcelCell), Zod 스키마 기반 레코드 ↔ 엑셀 다운로드/업로드(ExcelWrapper), 주소·날짜·숫자형식 변환(ExcelUtils)을 다룰 때. 자세히: [apis/excel/README.md](./apis/excel/README.md)
61
+ - **lint** — 심플리즘 ESLint 자산 커스텀 규칙 9종 플러그인(`@simplysm/lint/eslint-plugin`)과 flat config 프리셋(`@simplysm/lint/eslint-recommended`)을 프로젝트 eslint.config 에 적용하거나, 개별 규칙의 검사 대상·메시지·autofix·옵션을 파악할 때. 자세히: [apis/lint/README.md](./apis/lint/README.md)
62
+ - **orm-common** — Dialect(MySQL/MSSQL/PostgreSQL) 독립 ORM 코어 — 스키마 빌더(Table/View/Procedure/Column/Index/Relation), DbContext(연결·트랜잭션·DDL·마이그레이션), Queryable 체이닝/Executable/검색, expr 표현식 빌더, QueryDef·Expr AST·dialect QueryBuilder·결과 파싱 타입을 다룰 때. 자세히: [apis/orm-common/README.md](./apis/orm-common/README.md)
63
63
  - **orm-node** — Node.js 환경에서 DbContext 를 MySQL/MSSQL/PostgreSQL 에 연결·실행하는 ORM 런타임 — 고수준 createOrm(트랜잭션 경계) 과 저수준 createDbConn/DbConn(raw SQL·파라미터 쿼리·bulk insert·수동 트랜잭션) 제공. 자세히: [apis/orm-node/README.md](./apis/orm-node/README.md)
64
- - **sd-cli** — sd.config.ts 설정 타입(SdConfigFn·타겟별 패키지 설정·배포/Capacitor/Electron/PWA), 패키지 단위 TS/Angular AOT 증분 컴파일러 SdTsCompiler, Vitest Angular Vite 플러그인 sdAngularPlugin 을 다룰 때. 자세히: [apis/sd-cli/README.md](./apis/sd-cli/README.md)
65
- - **service-client** — WebSocket 으로 서비스 서버에 접속해 서비스 RPC 호출·서버 푸시 이벤트 구독/발행·파일 업다운로드·서버측 ORM 원격 실행을 수행하는 클라이언트(브라우저/Node 양용)가 필요할 때. 자세히: [apis/service-client/README.md](./apis/service-client/README.md)
66
- - **service-common** — 서버·클라이언트 공유 서비스 통신 계약 — defineEvent 이벤트 정의, 내장 RPC 서비스(OrmService·AutoUpdateService) 시그니처, 앱 메뉴·권한·모듈 구조(AppStructure), WebSocket 바이너리 프로토콜·메시지 타입. 자세히: [apis/service-common/README.md](./apis/service-common/README.md)
67
- - **service-server** — Fastify 기반 RPC 서비스 서버(WebSocket/HTTP 전송, JWT 인증, 정적 파일·업로드, 서버측 이벤트 브로드캐스트, 내장 ORM/자동업데이트 서비스) 띄우거나 defineService/auth 로 서비스 메서드를 작성할 때. 자세히: [apis/service-server/README.md](./apis/service-server/README.md)
68
- - **storage** — FTP/FTPS/SFTP 원격 스토리지에 접속해 파일·디렉토리를 업로드·다운로드·조회·삭제할 때(StorageFactory.connect 연결/종료 자동 관리). 자세히: [apis/storage/README.md](./apis/storage/README.md)
64
+ - **sd-cli** — sd.config.ts 설정 타입(SdConfigFn·타겟별 빌드/배포/Capacitor/Electron/PWA/SSG), 패키지 단위 TS/Angular AOT 증분 컴파일러 SdTsCompiler, Vitest 전용 Angular Vite 플러그인 sdAngularPlugin 을 다룰 때. 자세히: [apis/sd-cli/README.md](./apis/sd-cli/README.md)
65
+ - **service-client** — WebSocket 으로 서비스 서버에 접속해 서비스 RPC 호출·서버 푸시 이벤트 구독/발행·파일 업다운로드·서버측 ORM 원격 트랜잭션 실행을 수행하는 클라이언트(브라우저/Node 양용)가 필요할 때. 자세히: [apis/service-client/README.md](./apis/service-client/README.md)
66
+ - **service-common** — 서버·클라이언트 공유 서비스 통신 계약 — 실시간 이벤트 정의(defineEvent), 내장 RPC 서비스 시그니처(OrmService·AutoUpdateService), 앱 메뉴·권한·모듈 구조(AppStructure), WebSocket 바이너리 프로토콜·메시지 타입. 자세히: [apis/service-common/README.md](./apis/service-common/README.md)
67
+ - **service-server** — Fastify 기반 RPC 서비스 서버를 띄우거나(부팅·옵션 구성, JWT 인증, 서버측 이벤트 브로드캐스트, 내장 ORM/자동업데이트 서비스, 저수준 전송 핸들러·V1 레거시) defineService/auth 로 서비스 메서드를 작성할 때. 자세히: [apis/service-server/README.md](./apis/service-server/README.md)
68
+ - **storage** — Node 전용 FTP/FTPS/SFTP 스토리지 클라이언트 StorageFactory.connect 콜백 패턴으로 연결을 자동 관리하며 파일·디렉토리 업로드·다운로드·조회·삭제할 때. 자세히: [apis/storage/README.md](./apis/storage/README.md)
@@ -1,216 +1,144 @@
1
1
  # @simplysm/angular
2
2
 
3
- Angular 21 zoneless 프론트엔드 UI 라이브러리. 부트스트랩 프로바이더, signal 기반 standalone 컴포넌트/디렉티브, 모달·토스트·busy 오버레이, 시트·CRUD 골격, 공유데이터·레이아웃·시각화 컴포넌트를 제공. `import "@simplysm/core-browser"` 를 side-effect 로 로드하며, 컴포넌트는 standalone + OnPush + `ViewEncapsulation.None`, selector 는 `sd-` prefix. 앱 화면을 작성·수정할 때 거의 항상 이 패키지를 import.
3
+ Angular 기반 클라이언트 프레임워크 부트스트랩 프로바이더, UI 컨트롤·레이아웃, CRUD·시트·공유데이터·칸반·시각화 컴포넌트, 모달·토스트·busy 오버레이, 라우팅·권한·설정 인프라를 제공. `import "@simplysm/core-browser"` 를 side-effect 로 로드하며, 모든 컴포넌트는 `standalone: true` + `OnPush` + `ViewEncapsulation.None`, selector 는 `sd-` prefix.
4
4
 
5
5
  ## 사용 트리거 인덱스
6
6
 
7
- - **provideSdAngular / SdAngularConfigProvider** — 앱 부트스트랩 시 1 등록(테마·에러핸들러·zoneless·SW 업데이트·라우팅 busy 연동). 아래 "부트스트랩" 인라인 섹션.
8
- - **SdThemeProvider / setupBgTheme**다크모드·폰트크기 전역 테마 제어, 배경 테마 지정. 아래 "테마·배경" 인라인 섹션. 셀렉터 UI 는 `자세히: [features.md](./features.md)`.
9
- - **SdSystemLogProvider / SdLocalStorageProvider / SdSystemConfigProvider / injectSdSystemConfigResource** 시스템 로그 적재 훅, 클라이언트별 localStorage, key 기반 영속 설정(시트/프리셋/모달 위치 저장). 아래 "설정·로그·인프라" 인라인 섹션.
10
- - **SdServiceClientFactoryProvider / SdFileDialogProvider**서버 서비스 클라이언트 연결, 파일 선택 대화상자. 아래 "설정·로그·인프라" 인라인 섹션.
11
- - **모달·토스트·busy·인쇄(Provider + 컴포넌트 + Def 타입)**프로그래밍 방식 오버레이를 띄울 때. `자세히: [overlay.md](./overlay.md)`.
12
- - **버튼·폼 입력·선택·체크박스·드롭다운·탭·리스트·페이징·gap 컨트롤**화면 폼/조작 UI 작성. `자세히: [controls.md](./controls.md)`.
13
- - **SdSheet 시트 컬럼/설정** 데이터 그리드(정렬·페이징·트리·고정·선택·인라인편집·설정저장). `자세히: [sheet.md](./sheet.md)`.
14
- - **SdBaseContainer / SdCrudList / SdCrudDetail** 목록·단건 화면 표준 골격. `자세히: [crud.md](./crud.md)`.
15
- - **SdSharedDataProvider / sd-shared-data-select\***공유 마스터 데이터 정의·선택 컨트롤. `자세히: [shared-data.md](./shared-data.md)`.
16
- - **sidebar·topbar 레이아웃 + 메뉴/사용자** 레이아웃. `자세히: [layout.md](./layout.md)`.
17
- - **라우팅 헬퍼 + SdAppStructureProvider/Utils** 페이지 코드/제목/뷰타입/권한 시그널, 메뉴·권한 트리 구성. `자세히: [routing-appstructure.md](./routing-appstructure.md)`.
18
- - **core 디렉티브·signal 헬퍼**resize/intersection/ripple/show-effect/invalid/명령단축키/template/모델훅 등. `자세히: [directives.md](./directives.md)`.
19
- - **useSelectionManager / useSortingManager / useExpandingManager** 시트류 컴포넌트의 선택·정렬·확장 로직 합성 헬퍼(컴포넌트 작성용). 아래 "선택·정렬·확장 매니저" 인라인 섹션.
20
- - **SdPermissionTable / SdStatePreset** — 권한 트리 편집표, 화면 상태 프리셋 저장 컨트롤. `자세히: [features.md](./features.md)`.
21
- - **테마 셀렉터·주소검색·tiptap 에디터·label·note·progress·calendar·barcode·echarts** — 부가 기능 컴포넌트. `자세히: [features.md](./features.md)`.
22
- - **kanban 보드** — 드래그 가능 칸반. `자세히: [kanban.md](./kanban.md)`.
23
-
24
- ## 부트스트랩
25
-
26
- ### provideSdAngular
7
+ - **provideSdAngular** — 앱 부트스트랩 시 1회. 테마 영속화·전역 에러 핸들러·zoneless·SW 업데이트 폴링·라우팅 busy 추적을 일괄 설정. (이 README 의 `앱 부트스트랩` 참조)
8
+ - **UI 컨트롤** (`sd-button`·`sd-textfield`·`sd-select`·`sd-checkbox`·`sd-tab`·`sd-list`·`sd-form`·`sd-dropdown` 등) 폼·입력·버튼·선택 화면을 구성할 때. 자세히: [controls.md](./controls.md)
9
+ - **시트** (`sd-sheet`·`sd-sheet-column`·시트 설정 모달·시트 타입)다건 목록·편집 그리드. 자세히: [sheet.md](./sheet.md)
10
+ - **CRUD 골격** (`sd-crud-list`·`sd-crud-detail`·`sd-base-container`·`SdStatePreset`·`SdPermissionTable`)목록·단건 편집 화면 표준 셸, 상태 프리셋, 권한 테이블. 자세히: [crud.md](./crud.md)
11
+ - **오버레이** (`SdModalProvider`·`SdToastProvider`·`SdBusyProvider`·`SdPrintProvider`·`SdFileDialogProvider`·`SdModal`·`SdPromptModal`·`SdConfirmModal`) — 모달 띄우기·토스트·busy·프린트·파일 다이얼로그. 자세히: [overlay.md](./overlay.md)
12
+ - **공유 마스터 데이터** (`SdSharedDataProvider`·`sd-shared-data-select*`·`use*Manager`·`matchesSearchText`) 마스터 데이터 공유·선택 컨트롤·선택/정렬/펼침 매니저. 자세히: [shared-data.md](./shared-data.md)
13
+ - **라우팅·앱구조·권한** (`SdRouterLink`·`injectViewTypeSignal`·`injectPermsSignal`·`SdAppStructureProvider`·`injectViewTitleSignal`·`setupCanDeactivate`·`getMenuRouterLinkOption`) 메뉴·권한·라우팅 좌표·이탈 가드. 자세히: [routing-appstructure.md](./routing-appstructure.md)
14
+ - **디렉티브·이펙트** (`SdEvents`·`SdCommandDirective`·`SdResizeDirective`·`SdIntersectionDirective`·`SdRipple`·`SdShowEffect`·`SdInvalid`·`SdTypedTemplate`·`SdItemOfTemplate`)DOM 이벤트 옵션·단축키·리사이즈·리플·검증·타입 템플릿. 자세히: [directives.md](./directives.md)
15
+ - **레이아웃** (`sd-sidebar*`·`sd-topbar*`)사이드바·탑바 셸. 자세히: [layout.md](./layout.md)
16
+ - **칸반** (`sd-kanban-board`·`sd-kanban-lane`·`sd-kanban`)드래그앤드롭 칸반 보드. 자세히: [kanban.md](./kanban.md)
17
+ - **features** (`SdThemeProvider`·`SdThemeSelector`·`SdTiptapEditor`·`SdAddressSearchModal`·`sd-label`·`sd-note`·`sd-progress`·`sd-calendar`·`sd-barcode`·`sd-echarts`)테마·에디터·주소검색·시각요소. 자세히: [features.md](./features.md)
18
+ - **설정·로그·서비스 인프라** (`SdLocalStorageProvider`·`SdSystemConfigProvider`·`SdSystemLogProvider`·`SdServiceClientFactoryProvider`·`injectSdSystemConfigResource`·`SdAngularConfigProvider`) README `설정·로그·서비스 인프라` 인라인 섹션.
19
+ - **코어 유틸** (`mark`·`FormatPipe`·`setSafeStyle`·`setupBgTheme`·`setupModelHook`·타입 헬퍼) README `코어 유틸` 인라인 섹션.
27
20
 
28
- ```ts
29
- provideSdAngular(opt: { clientName: string }): EnvironmentProviders
30
- ```
31
-
32
- - `opt.clientName` — 클라이언트 식별자. `SdAngularConfigProvider.clientName` 으로 보관되며 localStorage 키 접두사·서비스 클라이언트 이름으로 쓰임. 앱마다 고유 문자열.
21
+ ## 앱 부트스트랩
33
22
 
34
- `makeEnvironmentProviders` 로 다음을 한 번에 등록: `IMAGE_CONFIG`(이미지 경고 비활성), ng-icons 기본 설정(strokeWidth 1.5, size 1.33em), 테마 dark/fontSize 의 localStorage 복원·저장 effect, 전역 `unhandledrejection`/`error` 리스너→`ErrorHandler`, `SdAngularConfigProvider`(clientName 주입), `SdOptionEventPlugin`(이벤트 수식어 지원), `ErrorHandler=SdGlobalErrorHandlerPlugin`, `provideZonelessChangeDetection()`, `SwUpdate` 주기 점검(5분 시작 → 실패 시 지수 백오프 최대 60분, 업데이트 발견 시 confirm 후 reload), 라우팅 네비게이션을 `SdBusyProvider.globalBusyCount` 와 연동. 앱 `ApplicationConfig.providers` 에 1회 추가.
35
-
36
- SSR(프리렌더) 안전: 부트스트랩 경로의 브라우저 의존 동작(테마 localStorage 복원, window 에러 리스너, SW 업데이트 점검, busy 오버레이, 에러 오버레이, `setupBgTheme`/`setupRipple`, core-browser prototype 확장)은 서버 플랫폼에서 무동작 — `prerender`(SSG) 클라이언트에서 그대로 사용 가능. 그 외 컴포넌트의 SSR-safe 여부는 개별 확인 필요.
23
+ ### `provideSdAngular`
37
24
 
38
25
  ```ts
39
- export const appConfig: ApplicationConfig = {
40
- providers: [provideRouter(routes), provideSdAngular({ clientName: "my-app" })],
41
- };
26
+ function provideSdAngular(opt: { clientName: string }): EnvironmentProviders
42
27
  ```
43
28
 
44
- ### SdAngularConfigProvider
29
+ - 부트스트랩 `providers` 에 1회 추가. `opt.clientName` — `SdAngularConfigProvider.clientName` 으로 설정되며 `SdLocalStorageProvider` 가 키 네임스페이스(`${clientName}.${key}`)로 사용.
30
+ - 설정하는 것: 테마 dark/fontSize 의 `SdLocalStorageProvider` 영속화(브라우저 전용), 전역 `window` error/unhandledrejection → `ErrorHandler` 라우팅, `SdAngularConfigProvider`, `SdOptionEventPlugin`(`EVENT_MANAGER_PLUGINS` multi), `SdGlobalErrorHandlerPlugin`(`ErrorHandler`), `provideZonelessChangeDetection()`, 서비스워커 업데이트 폴러(지수 백오프 5분→60분, 갱신 시 새로고침 확인), 라우팅 navigation busy 추적(`SdBusyProvider.globalBusyCount`).
45
31
 
46
32
  ```ts
47
- @Injectable({ providedIn: "root" }) class SdAngularConfigProvider { clientName: string }
33
+ bootstrapApplication(AppRoot, {
34
+ providers: [provideSdAngular({ clientName: "admin" }), /* ... */],
35
+ });
48
36
  ```
49
37
 
50
- - `clientName` — `provideSdAngular` 가 채우는 클라이언트 이름. 직접 set 하지 말고 `provideSdAngular` 로 주입. localStorage/서비스 클라이언트가 참조.
51
-
52
- ## 테마·배경
38
+ ## 코어 유틸
53
39
 
54
- ### SdThemeProvider
40
+ ### `mark`
55
41
 
56
42
  ```ts
57
- @Injectable({ providedIn: "root" }) class SdThemeProvider {
58
- dark: WritableSignal<boolean>;
59
- fontSizePresets: readonly number[]; // [12,14,16,20,24,28]
60
- fontSize: WritableSignal<number>; // 기본 12
61
- increaseFontSize(): void;
62
- decreaseFontSize(): void;
63
- }
43
+ function mark(sig: WritableSignal<any>): void
64
44
  ```
65
45
 
66
- - `dark` true `<body>` `sd-theme-dark` 클래스 토글. `provideSdAngular` localStorage 동기화.
67
- - `fontSize` — html 루트 `font-size(px)` 에 반영(rem 스케일 전체 변동). presets 안에서만 단계 이동 권장.
68
- - `increaseFontSize`/`decreaseFontSize` — presets 기준 다음/이전 단계로 이동. 경계면 무동작.
46
+ - 시그널 값을 얕은 복사(배열이면 `[...v]`, 객체면 `{ ...v }`)로 교체해 **새 참조**로 만들어 변경 알림만 발행. 값 자체는 동일. effect 강제 재발화·객체 시그널 내부 필드 변경 통지에 사용.
69
47
 
70
48
  ```ts
71
- inject(SdThemeProvider).dark.set(true);
49
+ <sd-textfield [(value)]="filter().name" (valueChange)="mark(filter)" />
50
+ doRefresh(): void { mark(this.lastFilter); }
72
51
  ```
73
52
 
74
- ### setupBgTheme
53
+ ### `FormatPipe`
75
54
 
76
- ```ts
77
- setupBgTheme(options?: {
78
- theme?: "primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray";
79
- lightness?: "lightest" | "lighter";
80
- }): void
81
- ```
55
+ standalone pipe, `name: "format"`. `transform(value: string | DateTime | DateOnly | undefined, format: string): string`.
82
56
 
83
- - `theme` 본문 배경에 적용할 테마색. 미지정 시 `--background-color` 해제(기본 배경). 화면 톤을 구분할 때 지정.
84
- - `lightness` 배경 명도. `"lightest"`(기본) 가 더 옅음, `"lighter"` 가 약간 진함.
57
+ - `value == null` `""`.
58
+ - `DateTime`/`DateOnly` `value.toFormatString(format)`.
59
+ - `string` → `format` 을 `|` 로 분리한 마스크 중 `X` 개수가 `value.length` 와 같은 첫 마스크 사용. `X` 는 좌→우로 값 문자로 치환, 비-`X` 문자는 리터럴 삽입. 일치 마스크 없으면 원본 반환. (예: `"XXX-XXXX"` 가 7자 문자열을 포맷)
85
60
 
86
- 컴포넌트 생성자(주입 컨텍스트)에서 호출. effect 로 `document.body` 의 `--background-color` 를 설정/cleanup.
87
-
88
- ## 설정·로그·인프라
89
-
90
- ### SdSystemLogProvider
61
+ ### `setSafeStyle`
91
62
 
92
63
  ```ts
93
- @Injectable({ providedIn: "root" }) class SdSystemLogProvider {
94
- writeFn?: (severity: "error" | "warn" | "log", ...data: any[]) => Promise<void> | void;
95
- writeAsync(severity: "error" | "warn" | "log", ...data: any[]): Promise<void>;
96
- }
64
+ function setSafeStyle(renderer: Renderer2, el: HTMLElement, style: Partial<CSSStyleDeclaration>): void
97
65
  ```
98
66
 
99
- - `writeFn` 외부 적재 훅. 지정하면 `writeAsync` 콘솔 로깅 함수도 호출(예: 서버 DB 적재). 미지정 시 콘솔만.
100
- - `writeAsync(severity, ...data)` — 콘솔(`logger[severity]`) 출력 후 `writeFn` 호출. `writeFn` 이 throw 해도 로깅으로 흡수. 전역 에러 핸들러가 내부적으로 사용.
67
+ - `style` 키를 `renderer.setStyle` 적용. 동적 스타일을 Renderer2 경유로 적용할 때.
101
68
 
102
- ### SdLocalStorageProvider
69
+ ### `setupBgTheme`
103
70
 
104
71
  ```ts
105
- @Injectable({ providedIn: "root" }) class SdLocalStorageProvider<T> {
106
- set<K extends keyof T & string>(key: K, value: T[K]): void;
107
- get<K extends keyof T & string>(key: K): T[K] | undefined;
108
- remove(key: keyof T & string): void;
109
- }
72
+ function setupBgTheme(options?: {
73
+ theme?: "primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray";
74
+ lightness?: "lightest" | "lighter"; // 기본 "lightest"
75
+ }): void
110
76
  ```
111
77
 
112
- - 키는 `<clientName>.<key>` prefix 되어 JSON 직렬화 저장. `get` 파싱 실패undefined(결측 보존).
113
- - 제네릭 `T` 로 키별 값 타입을 지정해 타입 안전하게 사용.
78
+ - 주입 컨텍스트에서 호출. `effect` 안에서 body `--background-color` `var(--theme-{theme}-{lightness})` 설정, 정리복원. SSR no-op. 화면별 배경 테마 색 지정에.
114
79
 
115
- ### SdSystemConfigProvider
80
+ ### `setupModelHook`
116
81
 
117
82
  ```ts
118
- @Injectable({ providedIn: "root" }) class SdSystemConfigProvider<T> {
119
- fn?: { set(key, data): Promise<void> | void; get(key): PromiseLike<unknown> };
120
- setAsync<K extends keyof T & string>(key: K, data: T[K] | undefined): Promise<void>;
121
- getAsync(key: keyof T & string): Promise<unknown>;
122
- }
83
+ function setupModelHook<T, S extends WritableSignal<T>>(
84
+ model: S, canFn: Signal<(item: T) => boolean | Promise<boolean>>,
85
+ ): void
123
86
  ```
124
87
 
125
- - `fn` 외부(서버) 저장 백엔드. 지정하면 set/get 서버로 위임, 미지정 `SdLocalStorageProvider` 사용. set 데이터가 null 이면 localStorage 경로에서 remove.
126
- - 시트/상태프리셋/모달 위치 등 영속 UI 설정 저장의 백엔드. 보통 `injectSdSystemConfigResource` 를 통해 사용.
88
+ - model 시그널의 `set`/`update` 래핑해 쓰기 전에 `canFn()(value)` 가드 통과를 강제. `false` 쓰기 스킵, `true` 진행, Promise 면 resolve 값이 명시적 `false` 때만 차단. reject `ErrorHandler` 라우팅. 주입 컨텍스트 필요. `SdCheckbox`/`SdSwitch`/`SdSharedDataSelectList` 의 `canChangeFn` 내부 기반.
127
89
 
128
- ### injectSdSystemConfigResource
90
+ ### 타입 헬퍼 (`directive-input-signals.ts`)
129
91
 
130
- ```ts
131
- injectSdSystemConfigResource<T>(options: { key: Signal<string | undefined> }): {
132
- value: Signal<T | undefined>; isLoading: Signal<boolean>; status; hasValue(): boolean;
133
- reload(): void; set(value: T | undefined): void; update(fn: (prev: T | undefined) => T | undefined): void;
134
- }
135
- ```
136
-
137
- - `options.key` — 설정 키 시그널. key 가 null 이면 로드/저장 안 함. 저장 키는 `<호스트엘리먼트태그>.<key>` 로 구성(컴포넌트 종류별 분리).
138
- - `value`/`isLoading`/`status` — Angular `resource` 위임. `set`/`update` 는 즉시 value 갱신 후 microtask 로 `SdSystemConfigProvider.setAsync` 영속화(에러는 `ErrorHandler`).
139
- - 주입 컨텍스트에서 호출(`ElementRef`/`SdSystemConfigProvider`/`ErrorHandler` inject). 시트·상태프리셋이 내부 사용.
92
+ - `DirectiveInputSignals<T>` — 컴포넌트/디렉티브 `T` 의 모든 `InputSignal<V>` 프로퍼티를 `{ prop: V }` 평면 객체로 추출(비-input 프로퍼티 제거), `undefined` 포함 필드는 optional 화. 모달/프린트 `inputs` 타입의 기반.
93
+ - `UndefToOptional<T>` 타입에 `undefined` 가 포함된 프로퍼티를 optional(`?`) 바꾸고 값에서 `undefined` 제거.
94
+ - `WithOptional<T, K extends keyof T>` = `Omit<T, K> & Partial<Pick<T, K>>` — 키 `K` 들을 optional 로.
95
+ - `SelectModalOutputResult<TKey = any>` `{ selectedKeys: TKey[] }`. 선택 모달의 close 페이로드 표준 형태.
140
96
 
141
- ### SdServiceClientFactoryProvider
97
+ ## 설정·로그·서비스 인프라
142
98
 
143
- ```ts
144
- @Injectable({ providedIn: "root" }) class SdServiceClientFactoryProvider {
145
- connectAsync(key: string, options?: Partial<ServiceConnectionOptions>): Promise<void>;
146
- closeAsync(key: string): Promise<void>;
147
- get(key: string): ServiceClient;
148
- }
149
- ```
99
+ ### `SdAngularConfigProvider`
150
100
 
151
- - `connectAsync(key, options)` `key` `ServiceClient` 생성·연결. options 미지정 시 현재 location(host/port/ssl)으로 접속. 이미 연결·이미 종료된 key 면 throw. 요청/응답 진행률을 progress 토스트로 표시.
152
- - `closeAsync(key)` — 연결 종료 후 해당 key 를 종료 상태로 표시(이후 재연결 불가). 미연결 key 면 throw.
153
- - `get(key)` — 연결된 클라이언트 반환. 미연결·종료 key 면 throw(silent 반환 안 함). 앱 서비스/이벤트 호출의 기반(공유데이터·서버 함수 provider 가 내부 사용).
101
+ `@Injectable({ providedIn: "root" })`. 필드 `clientName: string` `provideSdAngular` 주입한 클라이언트 이름.
154
102
 
155
- ### SdFileDialogProvider
103
+ ### `SdLocalStorageProvider<T>`
156
104
 
157
- ```ts
158
- @Injectable({ providedIn: "root" }) class SdFileDialogProvider {
159
- showAsync(multiple?: false, accept?: string): Promise<File | undefined>;
160
- showAsync(multiple: true, accept?: string): Promise<File[] | undefined>;
161
- }
162
- ```
105
+ `@Injectable({ providedIn: "root" })`. 키는 `${clientName}.${key}` 로 네임스페이스. SSR 가드(`set`/`remove` no-op, `get` → `undefined`).
163
106
 
164
- - `multiple` true 다중 선택(`File[]`), 미지정/false 단건(`File`). 타입이 오버로드로 분기.
165
- - `accept` 파일 형식 필터(예: `".xlsx"`, `"image/*"`). 취소·미선택 시 undefined.
107
+ - `set<K extends keyof T & string>(key: K, value: T[K]): void` JSON 직렬화 저장.
108
+ - `get<K extends keyof T & string>(key: K): T[K] | undefined` JSON 파싱; 없거나 파싱 실패 `undefined`.
109
+ - `remove(key: keyof T & string): void`.
166
110
 
167
- ```ts
168
- const file = await inject(SdFileDialogProvider).showAsync(false, ".xlsx");
169
- ```
111
+ ### `SdSystemConfigProvider<T>`
170
112
 
171
- ## 선택·정렬·확장 매니저
113
+ `@Injectable({ providedIn: "root" })`. 원격 `fn` 미지정 시 `SdLocalStorageProvider` 위임.
172
114
 
173
- 컴포넌트 작성 시트류 동작을 합성하는 헬퍼. 주입 컨텍스트가 아닌 일반 함수로, signal 바인딩을 받아 파생 시그널·조작 함수를 반환. `SdSheet` 내부도 이를 사용.
115
+ - `fn?: { set(key, data): Promise<void>|void; get(key): PromiseLike<unknown> }` 원격 저장소 연동 함수. 설정 로컬 대신 사용.
116
+ - `setAsync<K extends keyof T & string>(key: K, data: T[K] | undefined): Promise<void>` — `fn.set` 있으면 사용; 없으면 `data == null` 이면 로컬 remove, 아니면 저장.
117
+ - `getAsync(key: keyof T & string): Promise<...>` — `fn.get` 있으면 사용; 없으면 로컬 read.
174
118
 
175
- ### useSelectionManager
119
+ ### `injectSdSystemConfigResource<T>`
176
120
 
177
121
  ```ts
178
- useSelectionManager<TItem, TKey>(options: {
179
- displayItems: Signal<TItem[]>; selectedKeys: WritableSignal<TKey[]>;
180
- selectMode: Signal<"single" | "multi" | undefined>;
181
- getItemSelectableFn: Signal<((item: TItem) => boolean | string) | undefined>;
182
- trackByFn: Signal<(item: TItem, index: number) => TKey>;
183
- }): { hasSelectable; isAllSelected; getSelectable(item); getCanChangeFn(item); select(item); deselect(item); toggle(item); toggleAll(); isSelected(item); }
122
+ function injectSdSystemConfigResource<T>(options: { key: Signal<string | undefined> }): {
123
+ value: Signal<T | undefined>; isLoading: Signal<boolean>; status: Signal<ResourceStatus>;
124
+ hasValue: () => boolean; reload: () => boolean;
125
+ set: (value: T | undefined) => void; update: (fn: (prev: T | undefined) => T | undefined) => void;
126
+ }
184
127
  ```
185
128
 
186
- - `selectMode` `"single"`=단일(선택 기존 교체), `"multi"`=다중, undefined=선택 비활성.
187
- - `getItemSelectableFn` — 행별 선택 가능 여부. `true`=가능, `false`/undefined=불가, `string`=불가+사유(툴팁). `getSelectable` 이 이를 그대로 반환.
188
- - 키 비교는 참조 동일 또는 `obj.equal` 로 깊은 비교. `toggleAll` 은 선택 가능 항목 기준 전체 토글.
129
+ - 주입 컨텍스트에서 호출. 호스트 엘리먼트 태그 + `key()` 합친 키(`${elTag}.${key}`) `SdSystemConfigProvider.getAsync` 를 로드하는 `resource` 반환. `set` 은 값을 동기 갱신 후 microtask 로 `setAsync` 영속화(키 `undefined` 면 스킵). 시트가 사용자별 컬럼 설정을 저장하는 데 사용.
189
130
 
190
- ### useSortingManager
131
+ ### `SdSystemLogProvider`
191
132
 
192
- ```ts
193
- useSortingManager(options: { sorts: WritableSignal<SortingDef[]> }): {
194
- defMap: Signal<Map<string, { indexText?: string; desc: boolean }>>;
195
- toggle(key: string, multiple: boolean): void;
196
- sort<T>(items: T[]): T[];
197
- }
198
- // SortingDef = { key: string; desc: boolean }
199
- ```
133
+ `@Injectable({ providedIn: "root" })`.
200
134
 
201
- - `toggle(key, multiple)` 클릭 정렬 토글. `multiple`=true 다중 정렬 누적(asc→desc→제거 순환), false 단일 정렬로 교체. 헤더 클릭의 shift 여부를 넘김.
202
- - `defMap`정렬 중인 컬럼의 방향·표시순번(`indexText`, 2개 이상일 때만). `sort` null-우선 정렬로 클라이언트 정렬 수행.
135
+ - `writeFn?: (severity: "error" | "warn" | "log", ...data: any[]) => Promise<void> | void` 외부 싱크(DB ). 설정 `writeAsync` 추가로 호출. (클라이언트 시스템 로그 적재 컨벤션은 client-system-log.md)
136
+ - `writeAsync(severity: "error" | "warn" | "log", ...data: any[]): Promise<void>` 내부 로거에 기록 후, `writeFn` 있으면 await(에러는 삼키고 로깅). `SdToastProvider.try` / `SdGlobalErrorHandlerPlugin` 에러를 여기에 적재.
203
137
 
204
- ### useExpandingManager
138
+ ### `SdServiceClientFactoryProvider`
205
139
 
206
- ```ts
207
- useExpandingManager<T>(binding: {
208
- items: Signal<T[]>; expandedItems: WritableSignal<T[]>;
209
- getChildrenFn: Signal<((item: T, index: number) => T[] | undefined) | undefined>;
210
- sort: (items: T[]) => T[];
211
- }): { displayItems; hasExpandable; isAllExpanded; toggle(item); toggleAll(); isVisible(item); def(item); }
212
- // ExpandItemDef<T> = { item: T; parentDef: ExpandItemDef<T> | undefined; hasChildren: boolean; depth: number }
213
- ```
140
+ `@Injectable({ providedIn: "root" })`. 키 기반 `ServiceClient` 풀 관리. (Provider 정의·서비스 호출 컨벤션은 client-service.md)
214
141
 
215
- - `getChildrenFn`자식 배열 반환 함수(트리). undefined 평면.
216
- - `displayItems` — 펼침 상태를 반영해 평탄화된 표시 목록(접힌 노드 하위 제외 여부는 `isVisible` 판단). `def(item)` 항목의 depth/부모/자식유무 메타 반환(없으면 throw).
142
+ - `connectAsync(key: string, options?: Partial<ServiceConnectionOptions>): Promise<void>` `location` 기반 기본 옵션(host/port/ssl)에 `options` 머지해 클라이언트 생성·연결, `key` 로 저장. 이미 닫혔거나 연결된 키면 throw. request/response-progress 이벤트를 progress 토스트로 자동 배선.
143
+ - `closeAsync(key: string): Promise<void>` 닫고 맵에서 제거, 키를 닫힘으로 표시. 연결 키면 throw.
144
+ - `get(key: string): ServiceClient` — 연결된 클라이언트 반환. 닫힌 키/미연결 키면 throw.