From 61c6f8d1f1078fb859b73e426e16bc8e466d810c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=88=98=ED=98=84?= Date: Mon, 12 Oct 2026 17:58:30 +0900 Subject: [PATCH] feat(org-chart): add core cards and fixed-layout integration --- docs/org-chart/README.md | 91 +++ docs/org-chart/architecture.md | 117 ++++ docs/org-chart/card-design-stage1.md | 87 +++ docs/org-chart/card-design-stage2.md | 122 ++++ docs/org-chart/data-contract.md | 261 ++++++++ docs/org-chart/framework-integration.md | 179 +++++ docs/org-chart/implementation-plan.md | 110 ++++ docs/org-chart/implementation-report-p1.md | 95 +++ docs/org-chart/implementation-report-p2.md | 109 +++ docs/org-chart/implementation-report-p3.1.md | 43 ++ docs/org-chart/implementation-report-p3.2.md | 73 +++ docs/org-chart/implementation-report-p3.md | 54 ++ docs/org-chart/implementation-report-v0.1.md | 72 ++ docs/org-chart/integration.md | 91 +++ docs/org-chart/quality-review-p1.md | 163 +++++ .../react-integration-report-v0.1.md | 83 +++ docs/org-chart/standalone-components-p1.md | 60 ++ docs/org-chart/ui-composition.md | 114 ++++ examples/org-chart-react/README.md | 82 +++ examples/org-chart-react/app.tsx | 91 +++ examples/org-chart-react/index.css | 9 + examples/org-chart-react/index.html | 13 + examples/org-chart-react/p1.css | 12 + examples/org-chart-react/p1.html | 5 + examples/org-chart-react/p1.tsx | 32 + .../org-chart-react/verify-boundaries.mjs | 72 ++ examples/org-chart-react/verify-package.mjs | 52 ++ examples/org-chart-react/verify.mjs | 312 +++++++++ examples/org-chart-react/vite.config.ts | 11 + examples/org-chart/app.js | 32 + examples/org-chart/audit-quality-pixels.py | 91 +++ examples/org-chart/classic.html | 25 + .../org-chart/create-business-card-assets.py | 116 ++++ examples/org-chart/create-fixtures.mjs | 15 + examples/org-chart/create-p1-fixture.mjs | 56 ++ examples/org-chart/data-p1.json | 618 ++++++++++++++++++ examples/org-chart/data-v1.json | 113 ++++ examples/org-chart/data-v2.json | 123 ++++ examples/org-chart/demo.css | 8 + examples/org-chart/index.html | 28 + examples/org-chart/p1-app.js | 15 + examples/org-chart/p1-classic.html | 13 + examples/org-chart/p1.css | 12 + examples/org-chart/p1.html | 16 + examples/org-chart/prepare.mjs | 40 ++ examples/org-chart/serve.mjs | 18 + examples/org-chart/verify-card-content.mjs | 204 ++++++ examples/org-chart/verify-card-design.mjs | 201 ++++++ .../org-chart/verify-final-card-check.mjs | 142 ++++ .../org-chart/verify-final-logo-check.mjs | 70 ++ .../org-chart/verify-final-status-check.mjs | 107 +++ examples/org-chart/verify-guard-p1.mjs | 139 ++++ examples/org-chart/verify-p1.mjs | 568 ++++++++++++++++ examples/org-chart/verify-p2.mjs | 338 ++++++++++ examples/org-chart/verify-p3.1.mjs | 195 ++++++ examples/org-chart/verify-p3.2.mjs | 254 +++++++ examples/org-chart/verify-p3.mjs | 436 ++++++++++++ examples/org-chart/verify-package.mjs | 43 ++ .../org-chart/verify-quality-boundaries.mjs | 38 ++ examples/org-chart/verify-quality-p1.mjs | 183 ++++++ examples/org-chart/verify.mjs | 218 ++++++ package-lock.json | 269 +++++++- package.json | 13 + packages/org-chart-react/README.md | 95 +++ packages/org-chart-react/build.mjs | 41 ++ packages/org-chart-react/package.json | 24 + packages/org-chart-react/src/OrgChart.tsx | 121 ++++ packages/org-chart-react/src/index.ts | 5 + packages/org-chart-react/src/types.ts | 13 + packages/org-chart-react/tsconfig.build.json | 10 + packages/org-chart-react/tsconfig.json | 16 + packages/org-chart/README.md | 100 +++ packages/org-chart/build.mjs | 40 ++ packages/org-chart/package.json | 23 + .../src/assets/affiliations/README.md | 21 + .../src/assets/affiliations/baron.png | Bin 0 -> 13175 bytes .../src/assets/affiliations/halla.png | Bin 0 -> 9606 bytes .../src/assets/affiliations/hanmac.png | Bin 0 -> 11828 bytes .../assets/affiliations/jangheon-industry.png | Bin 0 -> 16683 bytes .../src/assets/affiliations/jangheon.png | Bin 0 -> 56063 bytes .../org-chart/src/assets/affiliations/ptc.png | Bin 0 -> 7613 bytes .../src/assets/affiliations/saman.png | Bin 0 -> 20584 bytes packages/org-chart/src/assets/cards/README.md | 13 + .../src/assets/cards/경영기획팀-sm.svg | 15 + .../org-chart/src/assets/cards/경영기획팀.svg | 15 + .../org-chart/src/assets/cards/대표자.svg | 15 + .../src/assets/cards/디자인기획팀-sm.svg | 15 + .../src/assets/cards/디자인기획팀.svg | 15 + .../src/assets/cards/사업관리팀-sm.svg | 15 + .../org-chart/src/assets/cards/사업관리팀.svg | 15 + .../src/assets/cards/솔루션통합팀-sm.svg | 15 + .../src/assets/cards/솔루션통합팀.svg | 15 + .../src/assets/cards/인재성장팀-sm.svg | 15 + .../org-chart/src/assets/cards/인재성장팀.svg | 15 + .../src/assets/cards/통합시스템 디비전-sm.svg | 15 + .../src/assets/cards/통합시스템 디비전.svg | 15 + .../src/assets/person-placeholder.svg | 5 + .../src/assets/workdesk/1-8-4x-1@2x.png | Bin 0 -> 44551 bytes .../src/assets/workdesk/Frame2@3x.png | Bin 0 -> 4341 bytes .../org-chart/src/assets/workdesk/Group.svg | 32 + .../org-chart/src/assets/workdesk/README.md | 11 + .../org-chart/src/assets/workdesk/bg_main.png | Bin 0 -> 25189 bytes .../org-chart/src/assets/workdesk/bg_sky.png | Bin 0 -> 271232 bytes .../workdesk/team-arrow-blue-purple.png | Bin 0 -> 295654 bytes .../assets/workdesk/team-arrow-blue-short.png | Bin 0 -> 250789 bytes .../workdesk/team-arrow-purple-teal.png | Bin 0 -> 316191 bytes .../assets/workdesk/team-arrow-teal-green.png | Bin 0 -> 281435 bytes packages/org-chart/src/components.ts | 24 + .../org-chart/src/core/affiliation-bar.ts | 37 ++ .../org-chart/src/core/affiliation-mark.ts | 45 ++ .../org-chart/src/core/affiliation-summary.ts | 42 ++ packages/org-chart/src/core/contrast.test.ts | 97 +++ packages/org-chart/src/core/contrast.ts | 93 +++ .../src/core/department-card-assets.ts | 53 ++ .../org-chart/src/core/department-colors.ts | 185 ++++++ packages/org-chart/src/core/employee-card.ts | 129 ++++ .../src/core/employee-info-dialog.ts | 105 +++ packages/org-chart/src/core/engine.ts | 143 ++++ packages/org-chart/src/core/index.ts | 366 +++++++++++ packages/org-chart/src/core/logo-legend.ts | 17 + .../org-chart/src/core/org-chart-content.ts | 208 ++++++ packages/org-chart/src/core/org-chart-tree.ts | 10 + .../org-chart/src/core/organization-totals.ts | 95 +++ .../src/core/person-name-overflow.ts | 72 ++ .../org-chart/src/core/position-summary.ts | 82 +++ packages/org-chart/src/core/render.ts | 140 ++++ .../src/core/representative-card-asset.ts | 14 + packages/org-chart/src/core/status-summary.ts | 45 ++ packages/org-chart/src/core/style-presets.ts | 76 +++ packages/org-chart/src/core/types.ts | 48 ++ packages/org-chart/src/core/vendor.d.ts | 38 ++ .../org-chart/src/core/workdesk-artwork.ts | 103 +++ .../org-chart/src/core/workdesk-layout.ts | 55 ++ .../src/data/content-selectors.test.ts | 133 ++++ .../org-chart/src/data/content-selectors.ts | 79 +++ packages/org-chart/src/data/data.test.ts | 241 +++++++ packages/org-chart/src/data/index.ts | 6 + packages/org-chart/src/data/normalize.ts | 27 + packages/org-chart/src/data/snapshot.ts | 14 + packages/org-chart/src/data/source.ts | 61 ++ packages/org-chart/src/data/summary.ts | 56 ++ packages/org-chart/src/data/types.ts | 96 +++ packages/org-chart/src/data/validate.ts | 145 ++++ packages/org-chart/src/index.ts | 5 + .../org-chart/src/styles/design-tokens.css | 68 ++ .../org-chart/src/styles/employee-card.css | 335 ++++++++++ .../src/styles/employee-info-dialog.css | 48 ++ .../src/styles/org-chart-content.css | 147 +++++ .../src/styles/org-chart-p3-summary.css | 119 ++++ .../src/styles/org-chart-readonly.css | 296 +++++++++ packages/org-chart/src/styles/org-chart.css | 55 ++ .../org-chart/src/styles/summary-sections.css | 141 ++++ packages/org-chart/test.mjs | 17 + packages/org-chart/tsconfig.build.json | 10 + packages/org-chart/tsconfig.json | 14 + src/org-chart/core-component-preview.tsx | 81 +++ src/org-chart/org-chart-cards.stories.tsx | 28 + src/org-chart/org-chart-p1.stories.tsx | 56 ++ src/org-chart/org-chart-stories.css | 61 ++ src/org-chart/org-chart-summary.stories.tsx | 30 + src/org-chart/org-chart.stories.tsx | 217 ++++++ 161 files changed, 13044 insertions(+), 1 deletion(-) create mode 100644 docs/org-chart/README.md create mode 100644 docs/org-chart/architecture.md create mode 100644 docs/org-chart/card-design-stage1.md create mode 100644 docs/org-chart/card-design-stage2.md create mode 100644 docs/org-chart/data-contract.md create mode 100644 docs/org-chart/framework-integration.md create mode 100644 docs/org-chart/implementation-plan.md create mode 100644 docs/org-chart/implementation-report-p1.md create mode 100644 docs/org-chart/implementation-report-p2.md create mode 100644 docs/org-chart/implementation-report-p3.1.md create mode 100644 docs/org-chart/implementation-report-p3.2.md create mode 100644 docs/org-chart/implementation-report-p3.md create mode 100644 docs/org-chart/implementation-report-v0.1.md create mode 100644 docs/org-chart/integration.md create mode 100644 docs/org-chart/quality-review-p1.md create mode 100644 docs/org-chart/react-integration-report-v0.1.md create mode 100644 docs/org-chart/standalone-components-p1.md create mode 100644 docs/org-chart/ui-composition.md create mode 100644 examples/org-chart-react/README.md create mode 100644 examples/org-chart-react/app.tsx create mode 100644 examples/org-chart-react/index.css create mode 100644 examples/org-chart-react/index.html create mode 100644 examples/org-chart-react/p1.css create mode 100644 examples/org-chart-react/p1.html create mode 100644 examples/org-chart-react/p1.tsx create mode 100644 examples/org-chart-react/verify-boundaries.mjs create mode 100644 examples/org-chart-react/verify-package.mjs create mode 100644 examples/org-chart-react/verify.mjs create mode 100644 examples/org-chart-react/vite.config.ts create mode 100644 examples/org-chart/app.js create mode 100644 examples/org-chart/audit-quality-pixels.py create mode 100644 examples/org-chart/classic.html create mode 100644 examples/org-chart/create-business-card-assets.py create mode 100644 examples/org-chart/create-fixtures.mjs create mode 100644 examples/org-chart/create-p1-fixture.mjs create mode 100644 examples/org-chart/data-p1.json create mode 100644 examples/org-chart/data-v1.json create mode 100644 examples/org-chart/data-v2.json create mode 100644 examples/org-chart/demo.css create mode 100644 examples/org-chart/index.html create mode 100644 examples/org-chart/p1-app.js create mode 100644 examples/org-chart/p1-classic.html create mode 100644 examples/org-chart/p1.css create mode 100644 examples/org-chart/p1.html create mode 100644 examples/org-chart/prepare.mjs create mode 100644 examples/org-chart/serve.mjs create mode 100644 examples/org-chart/verify-card-content.mjs create mode 100644 examples/org-chart/verify-card-design.mjs create mode 100644 examples/org-chart/verify-final-card-check.mjs create mode 100644 examples/org-chart/verify-final-logo-check.mjs create mode 100644 examples/org-chart/verify-final-status-check.mjs create mode 100644 examples/org-chart/verify-guard-p1.mjs create mode 100644 examples/org-chart/verify-p1.mjs create mode 100644 examples/org-chart/verify-p2.mjs create mode 100644 examples/org-chart/verify-p3.1.mjs create mode 100644 examples/org-chart/verify-p3.2.mjs create mode 100644 examples/org-chart/verify-p3.mjs create mode 100644 examples/org-chart/verify-package.mjs create mode 100644 examples/org-chart/verify-quality-boundaries.mjs create mode 100644 examples/org-chart/verify-quality-p1.mjs create mode 100644 examples/org-chart/verify.mjs create mode 100644 packages/org-chart-react/README.md create mode 100644 packages/org-chart-react/build.mjs create mode 100644 packages/org-chart-react/package.json create mode 100644 packages/org-chart-react/src/OrgChart.tsx create mode 100644 packages/org-chart-react/src/index.ts create mode 100644 packages/org-chart-react/src/types.ts create mode 100644 packages/org-chart-react/tsconfig.build.json create mode 100644 packages/org-chart-react/tsconfig.json create mode 100644 packages/org-chart/README.md create mode 100644 packages/org-chart/build.mjs create mode 100644 packages/org-chart/package.json create mode 100644 packages/org-chart/src/assets/affiliations/README.md create mode 100644 packages/org-chart/src/assets/affiliations/baron.png create mode 100644 packages/org-chart/src/assets/affiliations/halla.png create mode 100644 packages/org-chart/src/assets/affiliations/hanmac.png create mode 100644 packages/org-chart/src/assets/affiliations/jangheon-industry.png create mode 100644 packages/org-chart/src/assets/affiliations/jangheon.png create mode 100644 packages/org-chart/src/assets/affiliations/ptc.png create mode 100644 packages/org-chart/src/assets/affiliations/saman.png create mode 100644 packages/org-chart/src/assets/cards/README.md create mode 100644 packages/org-chart/src/assets/cards/경영기획팀-sm.svg create mode 100644 packages/org-chart/src/assets/cards/경영기획팀.svg create mode 100644 packages/org-chart/src/assets/cards/대표자.svg create mode 100644 packages/org-chart/src/assets/cards/디자인기획팀-sm.svg create mode 100644 packages/org-chart/src/assets/cards/디자인기획팀.svg create mode 100644 packages/org-chart/src/assets/cards/사업관리팀-sm.svg create mode 100644 packages/org-chart/src/assets/cards/사업관리팀.svg create mode 100644 packages/org-chart/src/assets/cards/솔루션통합팀-sm.svg create mode 100644 packages/org-chart/src/assets/cards/솔루션통합팀.svg create mode 100644 packages/org-chart/src/assets/cards/인재성장팀-sm.svg create mode 100644 packages/org-chart/src/assets/cards/인재성장팀.svg create mode 100644 packages/org-chart/src/assets/cards/통합시스템 디비전-sm.svg create mode 100644 packages/org-chart/src/assets/cards/통합시스템 디비전.svg create mode 100644 packages/org-chart/src/assets/person-placeholder.svg create mode 100644 packages/org-chart/src/assets/workdesk/1-8-4x-1@2x.png create mode 100644 packages/org-chart/src/assets/workdesk/Frame2@3x.png create mode 100644 packages/org-chart/src/assets/workdesk/Group.svg create mode 100644 packages/org-chart/src/assets/workdesk/README.md create mode 100644 packages/org-chart/src/assets/workdesk/bg_main.png create mode 100644 packages/org-chart/src/assets/workdesk/bg_sky.png create mode 100644 packages/org-chart/src/assets/workdesk/team-arrow-blue-purple.png create mode 100644 packages/org-chart/src/assets/workdesk/team-arrow-blue-short.png create mode 100644 packages/org-chart/src/assets/workdesk/team-arrow-purple-teal.png create mode 100644 packages/org-chart/src/assets/workdesk/team-arrow-teal-green.png create mode 100644 packages/org-chart/src/components.ts create mode 100644 packages/org-chart/src/core/affiliation-bar.ts create mode 100644 packages/org-chart/src/core/affiliation-mark.ts create mode 100644 packages/org-chart/src/core/affiliation-summary.ts create mode 100644 packages/org-chart/src/core/contrast.test.ts create mode 100644 packages/org-chart/src/core/contrast.ts create mode 100644 packages/org-chart/src/core/department-card-assets.ts create mode 100644 packages/org-chart/src/core/department-colors.ts create mode 100644 packages/org-chart/src/core/employee-card.ts create mode 100644 packages/org-chart/src/core/employee-info-dialog.ts create mode 100644 packages/org-chart/src/core/engine.ts create mode 100644 packages/org-chart/src/core/index.ts create mode 100644 packages/org-chart/src/core/logo-legend.ts create mode 100644 packages/org-chart/src/core/org-chart-content.ts create mode 100644 packages/org-chart/src/core/org-chart-tree.ts create mode 100644 packages/org-chart/src/core/organization-totals.ts create mode 100644 packages/org-chart/src/core/person-name-overflow.ts create mode 100644 packages/org-chart/src/core/position-summary.ts create mode 100644 packages/org-chart/src/core/render.ts create mode 100644 packages/org-chart/src/core/representative-card-asset.ts create mode 100644 packages/org-chart/src/core/status-summary.ts create mode 100644 packages/org-chart/src/core/style-presets.ts create mode 100644 packages/org-chart/src/core/types.ts create mode 100644 packages/org-chart/src/core/vendor.d.ts create mode 100644 packages/org-chart/src/core/workdesk-artwork.ts create mode 100644 packages/org-chart/src/core/workdesk-layout.ts create mode 100644 packages/org-chart/src/data/content-selectors.test.ts create mode 100644 packages/org-chart/src/data/content-selectors.ts create mode 100644 packages/org-chart/src/data/data.test.ts create mode 100644 packages/org-chart/src/data/index.ts create mode 100644 packages/org-chart/src/data/normalize.ts create mode 100644 packages/org-chart/src/data/snapshot.ts create mode 100644 packages/org-chart/src/data/source.ts create mode 100644 packages/org-chart/src/data/summary.ts create mode 100644 packages/org-chart/src/data/types.ts create mode 100644 packages/org-chart/src/data/validate.ts create mode 100644 packages/org-chart/src/index.ts create mode 100644 packages/org-chart/src/styles/design-tokens.css create mode 100644 packages/org-chart/src/styles/employee-card.css create mode 100644 packages/org-chart/src/styles/employee-info-dialog.css create mode 100644 packages/org-chart/src/styles/org-chart-content.css create mode 100644 packages/org-chart/src/styles/org-chart-p3-summary.css create mode 100644 packages/org-chart/src/styles/org-chart-readonly.css create mode 100644 packages/org-chart/src/styles/org-chart.css create mode 100644 packages/org-chart/src/styles/summary-sections.css create mode 100644 packages/org-chart/test.mjs create mode 100644 packages/org-chart/tsconfig.build.json create mode 100644 packages/org-chart/tsconfig.json create mode 100644 src/org-chart/core-component-preview.tsx create mode 100644 src/org-chart/org-chart-cards.stories.tsx create mode 100644 src/org-chart/org-chart-p1.stories.tsx create mode 100644 src/org-chart/org-chart-stories.css create mode 100644 src/org-chart/org-chart-summary.stories.tsx create mode 100644 src/org-chart/org-chart.stories.tsx diff --git a/docs/org-chart/README.md b/docs/org-chart/README.md new file mode 100644 index 0000000..8f56b07 --- /dev/null +++ b/docs/org-chart/README.md @@ -0,0 +1,91 @@ +# HMDesign OrgChart — 개발 전 설계 기준 + +> 현재 P1 기준(2026-10-12): 공통 HM Theme와 분리된 독립 디자인을 사용한다. [개별 컴포넌트·스타일 API](standalone-components-p1.md)와 [구현·검증 결과](implementation-report-p1.md)를 따른다. 아래 초기 설계와 v0.1 보고서는 과거 기록이며 Theme 필수 연결·reserved hub/status는 최신 사용법이 아니다. + +상태: **문서 초안 / 사용자 검토 대기 / 구현 미착수**. 기준일: 2026-10-12(KST). + +확정 요구사항은 이번 사용자 요청에서 확정된 범위다. `제안`은 승인 전 설계 후보이며, `TBD`는 정책 또는 기술 검토가 필요한 항목이다. 문서 검증의 PASS는 실행 기능의 PASS를 의미하지 않는다. + +## 1. 목적과 문서 읽기 순서 + +여러 업무 화면의 콘텐츠 컨테이너에서 재사용할 Framework-independent OrgChart를 설계한다. 1차 공식 개발 대상은 **Vanilla HTML/JavaScript와 React 두 환경**이다. 표준 DOM API와 JavaScript/TypeScript 기반 Core를 우선하고 React는 별도 Wrapper로 연결한다. Core는 framework runtime과 HM React Component를 직접 import하지 않는다. 특정 Dashboard, Header 높이 또는 Navigation에 종속시키지 않는다. JSON과 향후 REST API가 같은 계약을 제공하며 각 환경의 공개 사용 방식은 유지해야 한다. + +1. 이 문서: 확정 범위와 기존 기준과의 차이. +2. [Architecture](architecture.md): 계층별 책임, 의존성, 공개 사용 방식 초안. +3. [Data Contract](data-contract.md): 정규화 계약, TypeScript·JSON Schema 초안, 검증·집계. +4. [UI Composition](ui-composition.md): 콘텐츠 구성, HM 재사용, 컨테이너·접근성. +5. [Integration](integration.md): 엔진 공식 근거, React·Theme 연동, JSON → API 교체. +6. [Implementation Plan](implementation-plan.md): 단계별 완료 조건, Storybook, TBD·리스크, 이번 문서 검증 기록. +7. [Framework Integration](framework-integration.md): Vanilla·React 사용 계약과 예시, 생명주기, CSS·Theme·배포 검증, 미지원 환경. + +## 2. 작업 환경 확인 + +읽기 전용 확인 결과, 다음 환경이 존재한다. + +- 실제 Git Root·작업 경로: `D:\디자인시스템\HMDesign-OrgChart`. +- 현재 브랜치: `feature/orgchart-package`. +- 시작 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c`. +- 공식 origin(fetch/push): `https://gitea.hmac.kr/b25027/HMDesign.git`. +- 운영 Worktree: `D:\디자인시스템\HMDesign`의 `main`. 기존 Worktree를 재사용하며 새 Worktree는 생성하지 않았다. +- 시작 시 Local `main`, Feature, 두 remote-tracking ref와 `git ls-remote`의 원격 두 브랜치 SHA가 모두 위 HEAD와 일치했다. `main...feature/orgchart-package`의 좌/우 독자 Commit 수는 `0 / 0`이다. +- 시작 시 개발·운영 Working Tree는 모두 깨끗하고 staged 변경도 없었다. +- 루트 [package.json](../../package.json)의 npm workspaces는 `packages/*`; 현재 패키지는 `@hm-design/ui`, `@hm-design/center-graphic`이다. OrgChart 패키지는 아직 없다. +- 루트 React/React DOM은 `19.3.0`, Storybook은 `10.6.1`, Tailwind는 `4.3.3`이다. 이는 저장소 manifest 확인이며 설치 상태·호환성 검증 결과가 아니다. +- 기존 문서는 `docs/components`, `docs/patterns`, `docs/guidelines`, `docs/reports`, `docs/center-graphic`으로 구분된다. 독립 도메인인 [Center Graphic](../center-graphic/README.md)의 선례에 맞춰 `docs/org-chart`를 신규 설계 문서 위치로 선택했다. + +이번 작업은 이 디렉터리의 Markdown 신규 작성만 허용한다. 구현, 설치, package/lockfile·Theme·Component·Pattern·Storybook 변경, Stage·Commit·Push·Merge는 수행하지 않는다. 운영 프로젝트와 `main`도 변경하지 않는다. + +## 3. 확정 요구사항 + +- 엔진은 `dabeng/OrgChart`를 사용한다. 채택할 정확한 버전·배포 모듈 방식은 기술 검증 후 확정한다. [공식 데모](https://dabeng.github.io/OrgChart/), [공식 저장소](https://github.com/dabeng/OrgChart). +- 포함 콘텐츠: 제목·설명, 최상위 리더, 중앙 허브, 부문·실·Div, 셀·팀, 직원 프로필, 조직 계층·연결선, 조직 간 추가 관계, 팀별 인원, 파견·휴직 그룹, 관계사별 인원, 전체 인원 집계. +- 제외: Header, GNB, LNB, Dashboard Header, 페이지 전체 Layout, Routing, 신규 페이지 등록, 전역 Navigation, 상위 앱 인증 처리. +- 최신 추가 요청을 우선하여 Core 노드는 Framework-independent HTML/CSS로 표현하고 HM Theme를 CSS Custom Properties로 연결한다. 공개 React Component는 React 호스트/Adapter의 적합한 영역에서 재사용을 검토하고 Core에는 직접 import하지 않는다. 기존 Color/Semantic Token·Typography·Spacing·Radius 기준을 참조하되 기존 Theme·Component·Pattern이나 공통 디자인 규칙은 변경하지 않는다. +- 조직·직원·관계사·추가 관계·표현 설정·Metadata를 ID 기반으로 분리한다. 엔진용 중첩 트리는 ViewModel에서 파생하며 원본 계약이 아니다. +- Data Source → Data Validation → Normalized Data Contract → ViewModel / Adapter → OrgChart UI를 유지한다. JSON Mock, 외부 JSON, 향후 REST API 공급 방식은 같은 계약을 제공한다. +- 조직·직원·관계·표현 설정 변경은 가능한 한 데이터만 바꿔 반영한다. 집계는 직원 원본에서 계산한다. 미확정 집계 정책을 코드 기본값으로 숨기지 않는다. +- Validation 실패는 제어된 Error 상태로 전환하고 화면 전체 비정상 종료를 방지한다. +- 검토 너비는 390/768/1280/1440px이다. 컨테이너 기준으로 검토하고 모바일 전략은 기술 검토 후 확정한다. +- Storybook은 OrgChart 콘텐츠 단독·가상 데이터 검증용으로 설계한다. Header/Dashboard 조합 Story는 제외한다. +- 실제 API 명세가 없으므로 Endpoint·인증 방식·권한·캐시·재시도 정책은 TBD다. 실제 인물·개인정보는 재사용하지 않는다. +- 1차 공식 개발 대상은 Vanilla HTML/JavaScript와 React다. Vue·Angular·기타 framework는 이번 개발 범위에서 제외하고 Core의 향후 확장 가능성만 유지한다. 공식 개발 대상 지정과 실제 지원 완료는 구별하며 현재 실행 지원은 모두 NOT VERIFIED다. +- Core는 엔진·데이터·Validation·Data Source Adapter·집계·Mount/Update/Reload/Destroy를 공통 관리한다. npm·ESM·브라우저 번들·별도 CSS·타입 선언·Framework Adapter 배포를 검증한다. Theme 미연결 정책은 TBD다. +- 두 환경은 동일 JSON 계약·Data Source Interface·Validation·집계·노드 UI·HM Theme CSS Variables·차트 인터랙션을 사용한다. React Wrapper에 별도 엔진/노드 디자인/업무 로직을 중복 구현하지 않는다. + +## 4. 제안과 자료 한계 + +- 패키지 경로 `packages/org-chart`, 이름 `@hm-design/org-chart`는 **제안 유지**다. `packages/*`와 양립 가능함을 확인했지만 이름·공개 Export·의존성 승인이나 생성은 하지 않았다. +- 최신 확정 요청의 우선 검토안은 `@hm-design/org-chart` Core + `@hm-design/org-chart-react` Wrapper 두 패키지다. 실제 분리는 기존 build 연결과 의존성 검증 후 최종 결정한다. +- 문서의 함수·Interface·Schema·폴더·Story 이름은 구현 초안이다. 현재 공개 API처럼 import하거나 사용하지 않는다. +- Workdesk 조직도 캡처를 시각 레퍼런스로 사용하는 요구는 확정이다. 그러나 이번 첨부에는 작업 지시 텍스트만 있고 캡처 파일은 없다. 콘텐츠 8영역은 사용자 설명에서 도출했다. 실제 카드 크기·색상·곡선·배치·시각적 일치는 **NOT VERIFIED**이며 추정으로 확정하지 않는다. +- 가상 직원은 `가상직원 가`처럼 예시임을 식별할 수 있는 명칭을 사용한다. 사진은 null/fallback 또는 승인된 가상 asset만 사용한다. + +## 5. 기존 지침과 적용 차이 + +기존 기준은 [AGENTS.md](../../AGENTS.md), [화면 선택·완료 계약](../guidelines/ai-screen-contract.md), [공개 인덱스](../guidelines/component-pattern-reference.md), [현재 추가 수정 기준](../guidelines/publisher-additional-review-2026-10-10.md), [Runtime Theme](../guidelines/runtime-theme.md)를 참조한다. 공통 기준 전체를 복제하지 않는다. + +- **경로·브랜치·Git 정책 충돌**: 기존 AGENTS는 `HMDesign-Gitea-Transfer/main` 수정과 검증 후 Commit/Push를 요구한다. 이번 요청은 `HMDesign-OrgChart/feature/orgchart-package`의 문서 전용, 운영 `main` 보존, Commit/Push 금지다. 이번 명시적 요청을 우선 적용하며 기존 AGENTS는 수정하지 않는다. 이 예외를 향후 구현·릴리스 권한으로 일반화하지 않는다. +- **Storybook 범위 해석**: 기존 규칙은 신규 업무 전체 화면 등록과 대표 Story 교체를 금지한다. 이번 요청은 신규 패키지의 콘텐츠 단독 Story 설계다. 이를 컴포넌트/도메인 검증으로 분리하며 전체 업무 화면을 등록하지 않는다. 미래 코드 등록 전에 분류·경로를 승인받는다. +- **Navigation·Dashboard 규칙 적용 범위**: 페이지 소비자는 기존 단일 Navigation 규칙을 따른다. 콘텐츠 패키지가 모드를 선택하거나 Dashboard 48px Header·960px 최소 폭을 내장하지 않는다. 상위 컨테이너 제약은 소비자가 제공한다. +- **Guard 범위**: 이번 산출물은 Markdown만 있고 React target/bootstrap이 없다. 화면 생성 Guard를 억지로 실행하거나 PASS를 만들지 않는다. 미래 UI 검증의 적합한 target과 범위는 [Implementation Plan](implementation-plan.md)에서 별도로 다룬다. +- **CENTER 선례의 차이**: OrgChart Core의 framework 독립성과 HM CSS Token 재사용을 함께 유지한다. CENTER의 전용 Token 정책을 복사하지 않는다. +- **Framework 요구와 기존 React 원칙 충돌**: 기존 AGENTS의 신규 React 화면·HM Component 렌더링 원칙은 최신 추가 요청의 Core 독립성·HTML/CSS 노드 조건에 맞춰 제한한다. Core 표준 DOM 표현을 이번 OrgChart 전용 예외로 기록하며 기존 지침을 자동 수정하지 않는다. React 업무 화면 소비자는 적합한 HM 공개 Component를 계속 사용한다. Vanilla 배포는 기존 Runtime Portability 계약과 함께 검증한다. + +## 6. 확정 요구사항 추적 + +- A 프로젝트 목적·패키지 제안 → 이 문서, Architecture §1. +- B 콘텐츠 범위·페이지 제외 → 이 문서 §3, UI Composition §1. +- C HM 재사용 → UI Composition §2, Integration §3. +- D 공급 계층 → Architecture §2, Integration §4. +- E 데이터 모델 → Data Contract §1–3. +- F 데이터 변경·유지보수 → Architecture §4, Integration §4. +- G Validation → Data Contract §4. +- H 인원 집계 → Data Contract §5. +- I 엔진 기술 검토 → Integration §1–2. +- J 화면 8영역·가상 데이터 → UI Composition §1, Data Contract §3. +- K 반응형·컨테이너 → UI Composition §3. +- L 콘텐츠 Storybook → Implementation Plan §2. +- M API 전환 점검 → Integration §4–5. +- 추가 Framework-independent 요구 → Architecture 전체, Framework Integration 전체, Implementation Plan §1–3. + +문서화 다음 단계는 사용자 검토·승인이다. 이 문서 작성만으로 개발, 설치 또는 Commit/Push가 승인되지는 않는다. diff --git a/docs/org-chart/architecture.md b/docs/org-chart/architecture.md new file mode 100644 index 0000000..346e4d3 --- /dev/null +++ b/docs/org-chart/architecture.md @@ -0,0 +1,117 @@ +# OrgChart Architecture + +상태: 개발 전 설계. 확정 범위·환경·우선순위는 [README](README.md)를 따른다. 최신 추가 요청에 따라 Framework-independent Core를 기준으로 한다. + +## 1. 독립 Core와 패키지 제안 + +확정: Core는 React·Vue runtime에 의존하지 않는다. 표준 DOM API와 JavaScript/TypeScript를 사용하고 dabeng/OrgChart 엔진을 Core에서 관리한다. 데이터 계약·Validation·Data Source Adapter·집계는 공통이다. Routing·로그인·Navigation·상위 Layout은 소유하지 않는다. + +`packages/org-chart` / `@hm-design/org-chart`는 제안이다. npm workspaces `packages/*`와 양립할 수 있음을 확인했지만 생성·명칭 승인은 하지 않았다. + +우선 검토안은 Core `@hm-design/org-chart`와 React Wrapper `@hm-design/org-chart-react` 두 패키지다. 경로 후보는 `packages/org-chart`와 `packages/org-chart-react`다. workspace·build 연결과 Core 소비에 React가 따라오지 않는 dependency·bundle 경계를 입증하고 최종 분리를 결정한다. 같은 패키지의 `/react` subpath는 우선안이 불가능할 때의 비교 항목만 남긴다. Vue·Angular·기타 framework는 이번 범위에서 제외한다. 실제 분리·경로·Export는 승인 전이다. + +향후 책임별 구조 예시이며 이번에는 파일을 만들지 않는다. + +```text +packages/org-chart/ 제안: framework-independent Core + src/ + index.ts 공개 Core facade와 type + data/ 계약·Validation·집계(DOM도 비의존) + sources/ JSON Mock / 외부 JSON 공급 + view-model/ ID index·파생 트리·표시 모델 + engine/ dabeng adapter·DOM·생명주기 + renderers/ 표준 DOM 노드·콘텐츠·안전한 텍스트 + styles/ 컨테이너 scope·Theme mapping·Overlay + 브라우저 entry·빌드 설정 승인 후 결정 +packages/org-chart-react/ 우선 검토안: React 연결만 담당 +src/org-chart/ 콘텐츠 단독 Story·가상 fixture 제안 위치 +``` + +Core는 `@hm-design/ui` React API·`@hm-design/center-graphic`을 import하지 않는다. HM Theme CSS는 호스트의 별도 제공 또는 승인된 standalone 배포 경로로 연결한다. Theme 때문에 React peer를 가진 UI 전체 패키지 설치를 Vanilla의 필수 조건으로 만들지 않는다. 엔진 dependency의 버전·포함 범위는 TBD다. React Wrapper만 React/React DOM peer를 검토한다. + +루트 [build-package.mjs](../../scripts/build-package.mjs)는 현재 `ui`, `center-graphic`만 허용한다. workspace 자동 탐색만으로 신규 빌드가 완성되지 않는다. 미래 별도 build 또는 최소 기존 빌드 연결 승인이 필요하다. 배포·의존성 격리는 [Framework Integration](framework-integration.md)에서 검증한다. + +## 2. 데이터 흐름과 계층 책임 + +```text +JSON Mock / 외부 JSON / 미래 REST API + ↓ Data Source Adapter: 원본 필드 매핑 +동일 normalized 계약 후보(unknown) + ↓ Data Validation: 구조·참조·정책 검증 +검증 성공한 Normalized Data Contract(OrgChartData) + ↓ ViewModel / Engine Adapter +조직별 표시 모델·집계·engine용 파생 트리·추가 relation 모델 + ↓ Framework-independent Core +DOM 콘텐츠·engine 계층 영역·Relation Overlay 후보 + ↑ 동일 Core 생명주기 호출 +Vanilla 호스트 / React Wrapper (동일 Core 재사용) +``` + +Source 매핑은 Validation 이전에 공통 계약 후보를 만든다. 검증 후 신뢰된 계약과 구별한다. TypeScript cast만으로 신뢰하지 않고 모든 Source가 같은 runtime validator를 거친다. + +- Data Source: 데이터를 읽고 매핑한다. 네트워크·취소·향후 캐시를 담당하며 engine DOM이나 framework를 알지 못한다. +- Validation: Schema Version·필수 값·ID·참조·순환·상태·관계·입력 안전성을 검사한다. 성공 데이터 또는 위치별 issue를 반환한다. +- Normalized Contract: 조직·직원·관계사·관계·표현·Metadata를 분리한다. engine용 `children`·`relationship`·`className`은 저장하지 않는다. +- ViewModel / 집계: index·하위 조직·정렬·leader·직원 그룹·집계를 순수 변환한다. 모든 환경이 같은 함수를 사용한다. +- Engine Adapter: 복사한 파생 트리만 전달하며 DOM mount/update/dispose를 관리한다. 원본 수정·fetch·공통 UI 변경은 금지한다. +- Core facade / DOM Renderer: 요청 경쟁, Validation, 상태, 콘텐츠 DOM, 인스턴스 ID, 생명주기·Overlay를 관리한다. 텍스트는 `textContent` 등 안전한 경로로 처리한다. +- React Wrapper(Framework Adapter): React mount/effect/ref/cleanup과 Props를 Core에 연결한다. Validation·집계·engine·노드 디자인·인터랙션 재구현은 금지한다. 다른 framework Adapter는 이번에 설계 구체화/구현하지 않고 동일 facade의 향후 확장성만 보존한다. +- 상위 앱: 컨테이너·Theme bootstrap·Routing·로그인/권한·API client를 소유한다. React 호스트는 적합한 HM 공개 Component 조합을 사용할 수 있다. + +## 3. 공개 생명주기 초안 + +현재 Export가 아닌 제안이다. 데이터 type은 [Data Contract](data-contract.md)와 연결한다. `HTMLElement`는 DOM 경계에만 사용한다. + +```ts +interface OrgChartDataSource { + load(context: { signal: AbortSignal }): Promise; +} +type ValidationIssue = { code: string; path: string; message: string }; +type OrgChartIssue = ValidationIssue | { + code: "SOURCE_LOAD" | "SOURCE_PARSE" | "SOURCE_MAP"; + path: "dataSource"; + message: string; +}; +type OrgChartState = + | { status: "loading" } + | { status: "empty" } + | { status: "ready"; dataVersion: string; aggregation: AggregationResult } + | { status: "error"; issues: readonly OrgChartIssue[] }; +interface OrgChartOptions { + dataSource: OrgChartDataSource; + aggregationPolicy?: ApprovedAggregationPolicy; + interaction?: { pan: boolean; zoom: boolean }; // 공개 옵션 후보, 기본값 TBD + onStateChange?: (state: OrgChartState) => void; +} +interface OrgChartHandle { + mount(container: HTMLElement): Promise; + update(input: unknown): Promise; + reload(source?: OrgChartDataSource): Promise; + destroy(): void; +} +declare function createOrgChart(options: OrgChartOptions): OrgChartHandle; +``` + +`update`는 normalized 스냅샷 후보를 검증·반영하고 `reload`는 현재 또는 새 Source를 읽는다. 두 동작은 동일 Validation·집계·render 경로를 사용한다. 데이터 실패는 state callback으로 전달해 페이지 종료를 방지한다. 호출 순서·Promise·정리 규칙은 [Framework Integration](framework-integration.md)을 따른다. + +구조·참조·cycle·보안의 fatal Validation issue는 차트 Error다. 집계 정책 미확정은 차트 Error와 구별하여 ready의 AggregationResult `unavailable`로 전달하는 제안이다. Source 로딩·JSON 구문·매핑 실패도 제어된 Error지만 code/path로 Validation 오류와 구별하고 서버 원문을 전달하지 않는다. warning·업무 승인 필요 issue의 공개 전달 형식과 치명도는 API 승인 전 확정한다. + +API Source로 전환해도 facade·각 framework의 사용 구조는 유지하고 Source만 바꾼다. 인증은 호스트 client가 처리한다. 검색·다운로드·편집·추가 메뉴·상세 모달은 이번 범위가 아니다. + +## 4. 데이터 변경과 갱신 + +조직 추가/삭제·명칭·parent 이동, 직원 추가/삭제·조직 이동·직위/직책·사진·상태·관계사 변경, relation 변경, 기준일·제목 변경은 스냅샷 → Validation → ViewModel 재계산으로 반영한다. 전체 재계산 방식을 우선 검토하고 정렬은 Data Contract의 초안을 따른다. + +Source 전환·reload·update마다 이전 작업을 취소하고 revision을 비교해 늦은 응답을 무시한다. Metadata 버전이 같아도 새 스냅샷은 검증한다. engine에는 복사본만 전달한다. 확장 상태·focus·zoom 보존은 PoC 후 결정하며 복원 키는 안정된 도메인 ID다. + +검증·집계·render는 Core가 소유한 동일 불변 스냅샷을 사용한다. JSON Source의 캡처 시점은 생성 시점으로 제안하고 update는 호출 시 입력을 확보한다. 최종 DOM/state 반영 직전에도 revision·destroy 상태를 검사한다. consumer가 원본 객체를 나중에 바꿔 이미 반영한 화면·숫자가 암묵적으로 바뀌면 계약 실패다. + +데이터만 바꾸는 범위는 승인된 계약의 유형·상태·표현 옵션 안이다. 새 업무 정책·관계 의미·카드 기능은 계약/UI 버전 변경이 필요할 수 있다. 모든 미래 변경을 무조건 무코드로 약속하지 않는다. + +## 5. 엔진과 콘텐츠 경계 + +엔진은 조직 parent-child와 기본 계층 연결선을 담당한다. 직원은 조직 ID로 조회해 노드/그룹에 표시하고 리더를 조직으로 중복 삽입하지 않는다. + +중앙 허브가 실제 조직인지 설명 콘텐츠인지 TBD다. 임시 visual root는 내부에서만 생성하고 집계에서 제외한다. 다중 root 처리도 미확정이다. `OrganizationRelation`은 parent-child와 별도이며 engine `relationship` 플래그로 치환하지 않는다. 특수 곡선·교차 관계·고정 배치는 별도 Overlay/Layout 후보로 검토한다. 추가 relation은 집계 분모를 변경하지 않는다. + +완료 조건과 미결정 의존성은 [Implementation Plan](implementation-plan.md)을 따른다. diff --git a/docs/org-chart/card-design-stage1.md b/docs/org-chart/card-design-stage1.md new file mode 100644 index 0000000..6202eef --- /dev/null +++ b/docs/org-chart/card-design-stage1.md @@ -0,0 +1,87 @@ +# HMDesign OrgChart P1 — 카드 디자인 1단계 결과 + +RESULT: **PASS — 요청한 카드 디자인 범위**. 원본 Guard는 기존 Token 추적 문제로 **FAIL**이며 이를 전체 릴리스 PASS로 치환하지 않았다. + +## 작업 정보 + +- 작업 폴더: `D:\디자인시스템\HMDesign-OrgChart` +- 브랜치: `feature/orgchart-package` +- 작업 전/후 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c` +- Started At: 2026-10-12 12:34:53 KST +- Completed At: 2026-10-12 12:56:20 KST +- Actual Duration: 21분 27초 +- Variance: 최초 예상 하한 30분 대비 8분 33초 단축 / 상한 45분 대비 23분 33초 단축. +- Estimated Duration: 최초 30–45분. 대표자·사업관리 추가 요청 후 40–60분으로 조정. +- 기존 package.json/package-lock.json 수정과 OrgChart 미추적 구현을 보존했다. Commit/Push/Merge/브랜치 생성/main 수정은 하지 않았다. + +## 구현 결과 + +1. **SVG 자산 방식**: 전달된 10개 SVG를 원본 그대로 복사했다. Vite `?inline`으로 ESM/IIFE에 포함해 HTML/React/file://에서 외부 경로 의존 없이 사용한다. 배경은 장식용 img(`alt=""`, `aria-hidden`, `object-fit:contain`)이며 SVG의 path·gradient를 유지한다. 기존 박스 테두리·배경·우측 가상 장식은 자산 variant에만 제거한다. +2. **조직별 매핑**: `department-card-assets.ts`에서 사업관리·경영기획·디자인기획·솔루션영업·인재성장·통합시스템 6개 부서를 매핑한다. 하위 셀/팀은 실제 parentId를 따라 해당 부서 자산을 상속한다. 사용자 승인에 따라 솔루션통합팀 SVG를 기존 solution-sales에 연결하며 조직명/JSON은 바꾸지 않았다. 알려지지 않은 조직은 기존 카드 디자인을 유지한다. +3. **대표자**: 본문으로 전달된 146×74 SVG를 `대표자.svg`로 저장했다. `representative-card-asset.ts`로 부서와 별도 관리하고 기존 topLeader 독립 슬롯에만 사용한다. Full Composition의 최상단 가상리더 00 카드 1개에 적용했다. +4. **부서 조직장/직원**: 기존 organization.leaderId 및 kind 판별을 재사용한다. 조직장 146×68, 일반 직원 108×52이며 하위 IS/디자인 팀 리더도 146×68이다. 판별 규칙이나 데이터 계약을 변경하지 않았다. 파견·휴직 보조 영역의 카드·배치는 유지했다. +5. **사업관리 신규 벡터**: PNG(`D:\디자인시스템\카드 이미지\사업관리`, 확장자 없음, 408×191)에서 외곽 1,048개 RGBA 표본과 내측 5,619개 표본을 사용했다. 외곽 색상 `#DEE6F0 / #A8BBD1 / #577BA5`, 마지막 alpha 0.6; 내측 `#FFFFFF / #E0E6F4`. 기존 같은 크기 카드의 path와 곡선을 재사용하고 PNG에서 내측 그라데이션 방향도 복원했다. 두 자산에 텍스트·로고·사진·래스터는 없다. 원본 SHA-256은 `a8353bbf3869e4935c78a6774741d304836deb427d290586b439277022b2695f`다. +6. **데이터 레이어**: 이름·직위·직책·상태·프로필·실제 회사 로고 renderer를 유지했다. 새 작은 카드에만 데이터 폰트·간격을 맞추고 로고 영역을 14px 고정 높이로 두어 숨겨진 fallback의 줄바꿈이 이름 영역과 겹치지 않게 했다. 로고의 투명 배경·정상 이미지 시 fallback 숨김은 유지했다. +7. **Storybook**: 사용자 메뉴 5개와 내부 Story 8개를 유지했다. Department Colors는 대표자 1종과 6개 부서의 2종, 총 13개 카드 specimen·실제 크기·자산 출처를 표시한다. 기존 대비 MODEL/미승인 후보 24개 출력도 유지했다. Full Composition은 같은 Core renderer를 사용한다. 새 메뉴를 만들거나 기존 Story를 대체하지 않았다. +8. **독립 패키지**: 자산·스타일은 @hm-design/org-chart 내부에 한정했다. React Wrapper/공개 exports/JSON/공통 Theme/AI Guard/허브/Summary/관계선은 변경하지 않았다. Navigation은 기존 Header 없는 Core 콘텐츠를 유지했다. 이번 작업에는 목록 검색 요구가 없어 FilterBar를 추가하지 않았다. + +## 변경 파일 — 이번 작업만 + +신규: + +- `packages/org-chart/src/assets/cards/` SVG 13개(전달 10개, 대표자 1개, 사업관리 생성 2개) 및 README.md. +- `packages/org-chart/src/core/department-card-assets.ts` +- `packages/org-chart/src/core/representative-card-asset.ts` +- `examples/org-chart/create-business-card-assets.py` +- `examples/org-chart/verify-card-design.mjs` +- `docs/org-chart/card-design-stage1.md` + +수정: + +- `packages/org-chart/src/core/employee-card.ts` — 장식 SVG 레이어/내부 자산 옵션. +- `packages/org-chart/src/core/render.ts` — 조직장·직원 부서 자산 선택. +- `packages/org-chart/src/core/org-chart-content.ts` — 대표자 전용 자산. +- `packages/org-chart/src/core/department-colors.ts` — 카드 specimen/크기/출처/대표자 표시. +- `packages/org-chart/src/core/vendor.d.ts` — svg?inline 타입 선언. +- `packages/org-chart/src/styles/employee-card.css` — 자산 variant 크기/장식 제거/데이터 레이어 조정. +- `packages/org-chart/src/styles/org-chart-content.css` — specimen caption 및 대표자 미리보기 정렬. + +생성 산출물: packages/org-chart/dist, examples/org-chart/dist, examples/org-chart-react/dist, storybook-static. 검증 근거는 기존 기록과 별도 `test-results/org-chart-card-design/`에 보존했다. + +## 최종 통합 검증 + +- Core Typecheck **PASS**: `npm.cmd run typecheck:org-chart`. +- Story/preview consumer Typecheck **PASS**: `npm.cmd exec -- tsc -p tsconfig.app.json --noEmit`. +- Core ESM/IIFE/types/CSS Build **PASS**: `npm.cmd run build:org-chart`. +- HTML prepare / React demo Build **PASS**. React Wrapper 소스 변경이 없어 기존 Wrapper 검증을 반복하지 않았다. +- Storybook production Build **PASS**. 기존 500kB chunk 경고는 남아 있으며 빌드 실패는 없다. +- 최종 Chrome **231/231 PASS**, console/runtime error **0**. +- Department Colors / Full Composition / HTML / React / file:// classic 각각 390/768/1280/1440px에서 로딩·원본 크기·배경 장식 제거·실제 DOM Range 텍스트와 프로필/로고의 카드 경계·겹침·페이지 overflow를 확인했다. +- 6개 부서 전체 매핑, 대표자 단독 top slot, 사업관리 조직장/직원 구분, 기존 status 카드 보존 **PASS**. 대표자/조직장/직원 프로필에 로컬 이미지 fixture를 넣어 경계와 로딩을 확인했으며 원본 JSON은 수정하지 않았다. +- HTML/React/file:// 카드의 computed geometry/장식/이미지 표시/위치 판정 일치 **PASS**. 전체 화면 픽셀 동일성이나 모든 사용자 데이터 조합의 적합성을 뜻하지 않는다. +- 원본 SVG 10개의 SHA-256 동일 **PASS**. Logo/JSON/Wrapper/Story 원본 보존은 preservation.json으로 확인한다. +- 사업관리 PNG와 신규 큰 SVG를 Chrome canvas로 원본 408×191 크기에 렌더링해 흰 배경 합성 RGB를 비교했다. 전체 픽셀 채널 평균 오차 **1.113/255**, 95백분위 **1.094/255**. geometry/안티앨리어싱 차이를 포함하며 임의의 지각적 동일성 인증은 아니다. 색상 유사성 검사 **PASS**, 직접 시각 확인 완료. +- 기존 Core 데이터·Summary·전체 Guard 회귀는 재실행하지 않았다. 중간 실패는 작은 카드 로고 높이와 PNG 내측 그라데이션 방향에 한정해 수정했으며, 수정된 산출물의 최종 표시를 재검증했다. + +### Guard 원본 결과 + +수정된 파일만 PARTIAL/STORYBOOK으로 실행했다. 대표자·사업관리 추가 요청으로 코드 graph가 변경된 후 해당 최종 범위를 한 번 더 실행했고, 기존 결과는 guard-five-departments.json으로 보존했다. 원본 status/staticStatus **FAIL**: TOKEN-001 8건, TOKEN-002 NOT VERIFIED 6건, SCOPE-001 NOT VERIFIED 4건. 기존 품질 보고와 같은 Shadow CSS/setProperty/선택적 입력 추적 문제이며 이 작업에서 공통 검사기를 변경하지 않았다. + +`styleEvidence`: STATIC **PASS**, RUNTIME **NOT VERIFIED**, DESIGN_INTENT **PASS**, FINAL **NOT VERIFIED**. 이 값은 Guard 증거 연결 상태다. 별도 브라우저 PASS가 raw FAIL을 덮어쓰지 않는다. 결합 styleVerification은 생성/승격하지 않았다. 카드 전용 하드코드 geometry는 공통 HM Component override가 아니라 승인된 OrgChart SVG의 원본 크기다. + +## 남은 이슈 + +- 검사한 가상 데이터의 텍스트·이미지·로고는 잘림/겹침 없이 표시된다. 매우 긴 소비자 이름·직책·임의 폰트 override는 **NOT VERIFIED**이며 고정 카드 크기에서 추가 정책이 필요할 수 있다. +- 작은 실제 로고의 판독성 한계는 남는다. 원본 로고는 crop/recolor하지 않았다. +- PNG로부터 SVG 그라데이션을 복원하므로 래스터 안티앨리어싱까지 정확히 같다는 보장은 없다. 투명도 포함 채널 비교와 원본 SHA를 보존했다. +- 허브·관계선·부서 헤더 대비의 기존 REVIEW와 Guard 추적 FAIL은 다음 별도 작업 대상이다. 전체 Workdesk 레이아웃 비교/통계 재설계/운영 API/전체 접근성 검증은 이번 범위에서 **NOT VERIFIED**. + +미리보기: `http://127.0.0.1:6028/?path=/story/orgchart--department-colors`, `http://127.0.0.1:6028/?path=/story/orgchart--full-composition`. 직접 열기 결과: `examples/org-chart/dist/p1-classic.html`. + +## 완료 기록 + +Started At: **2026-10-12 12:34:53 KST**. Completed At: **2026-10-12 12:56:20 KST**. Actual Duration: **21분 27초**. Estimated Duration: **최초 30–45분**, 추가 요청 후 **40–60분**. Variance: 최초 예상 대비 **하한 −8분 33초 / 상한 −23분 33초**. 시간은 실제 clock 도구로 확인했다. + +최종 SHA 보존 확인: baseline 111개 중 승인 범위 수정 7개, 나머지 104개 유지, 삭제 0개. 신규 소스/자산/문서 19개. root manifests/기존 Story/JSON/로고/React Wrapper/Guard/기존 보고서의 시작값은 유지했다. staged file 0개, branch/HEAD 동일. 근거: `test-results/org-chart-card-design/preservation.json`. + +Guard snapshot 후 자산 출처를 설명하는 주석과 문서만 정리했다. 실행 동작과 Guard 분석 대상의 Token/CSS 구현은 최종 검사 이후 변경하지 않았다. 정상 Typecheck/Build/browser 검사를 문서 편집 때문에 반복하지 않았다. diff --git a/docs/org-chart/card-design-stage2.md b/docs/org-chart/card-design-stage2.md new file mode 100644 index 0000000..4195fdc --- /dev/null +++ b/docs/org-chart/card-design-stage2.md @@ -0,0 +1,122 @@ +# OrgChart 카드 디자인 2단계 — Typography 및 내부 콘텐츠 + +> P3.2 후속 확정: 대표자 카드에는 모든 직책·역할·상태 뱃지와 빈 뱃지 행을 생성하지 않는다. `대표이사`·`홍 길 동`, 승인 카드 146×74 및 기존 Typography를 유지한다. `대표이사`는 표시 계층에만 적용하며 직원 데이터·팝업 원문과 다른 1Depth/2Depth 뱃지는 보존한다. [현재 표시 계약](ui-composition.md#p32-후속--대표자-뱃지-미사용-2026-10-12)이 아래 과거 기록보다 우선한다. + +> P3.2 최신 계약은 [P3.2 보고서](implementation-report-p3.2.md)를 따른다. 대표자는 그대로, 대형 이름 24px·직위 18px, 소형 이름 18px·직위 15px이다. 기존 가중치·line-height·컬러는 보존한다. readOnly 파견/휴직은 일반 소형의 108×52 카드·24×44 사진·텍스트 레이아웃을 공유하고 전용 회색 색상을 유지한다. 상태 타이틀은 일반 2Depth 기본 20px/700/19.7px, 카드 로고만 기존 실제 표시의 1.5배다. 아래 수치·검증은 역사 기록이다. + +> P3.1 최신 표시 계약은 [P3.1 보고서](implementation-report-p3.1.md)를 따른다. Noto Sans KR을 OrgChart scope에 적용하며 직위 공백은 표시에서만 제거한다. 조회 화면의 `경영진` 직책 뱃지만 제거하고 실제 직위·다른 뱃지·데이터는 보존한다. 사진 없음/실패에는 공통 사각 `person-placeholder.svg`를 표시한다. 아래 P3 및 P2의 수치와 검증은 역사 기록이다. + +> P3 최신 표시 계약: 카드/SVG 크기와 기존 Typography는 유지한다. 표시 이름만 `홍 길 동`, 직위·직책 뱃지는 원문이다. 대표자를 포함하여 직위와 뱃지는 같은 행(Gap 4px), 이름은 아래 행(Gap 0px)이다. 모든 조직 타이틀↔첫 카드 Gap은 8px이다. Workdesk 태그 Border/색상/폰트와 사각형 사진 슬롯을 적용하며, 사진 없음에는 새 프로필 이미지가 없다. 실제 결과는 [P3 보고서](implementation-report-p3.md)에 기록한다. 아래 P2 및 이전 수치·검증은 역사 기록으로 보존한다. + +RESULT: PARTIAL + +지정 Typography·Gap·말줄임·전체 이름 제공 구현과 해당 범위 검증은 PASS입니다. 제공한 Workdesk 캡처 경로의 파일과 폴더가 현재 없어 사진·텍스트·로고의 실제 운영 화면 정렬 일치는 NOT VERIFIED입니다. Guard 원본 FAIL도 유지합니다. + +## 작업 정보 + +- 작업 폴더: `D:\디자인시스템\HMDesign-OrgChart` +- 브랜치: `feature/orgchart-package` +- 작업 전/후 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c` (동일) +- Started At: 2026-10-12 12:58:39 KST +- Completed At: 2026-10-12 13:17:42 KST +- Actual Duration: 19분 3초 +- Estimated Duration: 30–45분 +- Variance: 최소 예상 30분보다 10분 57초 짧음 +- 기존 Working Tree 보존, Stage·Commit·Push·Merge·브랜치 생성 없음. + +## 구현 결과 + +1. 대표자: 직위 `#224387 / 20px / 400 / 22px / -0.8px`, 이름 `#071D3A / 24px / 600 / 30px / -0.8px` 적용. +2. 그룹장: 직위 `#797979 / 20px / 400 / 22px / -0.8px`, 이름 `#071D3A / 24px / 600 / 30px / -0.96px` 적용. +3. 일반 직원: 직위 `#797979 / 15px / 400 / 18px / -0.6px`, 이름 `#071D3A / 20px / 600 / 24px / -0.8px` 적용. 위 값의 순서는 color / font-size / font-weight / line-height / letter-spacing입니다. +4. 직위와 이름을 별도 세로 Flex 컨테이너에 두고 gap·margin·padding을 모두 0으로 적용했습니다. 카드 Padding과 사진·텍스트 사이 간격은 보존했습니다. +5. 사진은 왼쪽, 직위·이름은 오른쪽, 실제 회사 로고는 우측 상단에 유지했습니다. 기존 직책 배지는 사진 아래쪽 독립 영역으로 배치했습니다. SVG 카드의 상태 텍스트는 접근성 읽기에 유지하고 별도 세 번째 시각 행을 만들지 않았습니다. 파견·휴직 별도 영역의 카드 스타일은 보존했습니다. +6. 카드 크기는 대표자 146×74, 그룹장 146×68, 일반 직원 108×52입니다. 프로필 영역은 각각 36×36, 32×32, 24×24로 이전 단계와 동일합니다. 폰트·사진·카드 크기를 축소하지 않았습니다. +7. 긴 이름에만 말줄임을 적용합니다. 전체 문자열은 DOM에 유지하고, 실제 Overflow 카드만 Tab 순서에 포함합니다. Hover와 Focus로 같은 Shadow Root의 전체 이름 툴팁을 열고 `aria-describedby`로 연결합니다. 툴팁 위로 포인터를 이동할 수 있고 Escape로 닫을 수 있습니다. ResizeObserver·글꼴 로딩으로 판정을 갱신하고 기존 AbortSignal에서 관찰자·이벤트·툴팁을 정리합니다. +8. 기본 가상 이름 41개를 자연스러운 2–3음절 한국어 이름으로 바꿨습니다. 직원 ID·직위·소속·상태·프로필·인원수·JSON 계약은 그대로입니다. 실제 직원 개인정보를 복사하지 않았습니다. + +## Storybook 및 공통 적용 + +- Department Colors: 대표자와 6개 조직의 그룹장·직원 카드에 같은 Core Typography 적용. 기존 메뉴 내 “긴 이름 검증 시작/종료”로 대표자·그룹장·직원 각 1개의 긴 이름을 확인할 수 있습니다. 기본값은 짧은 이름입니다. +- Full Composition: 최상단 대표자, 6개 조직 그룹장, 일반 직원 카드의 기본 이름·Typography·로고 배치 확인. +- 사용자용 메뉴 Logo / Department Colors / Position Summary / Affiliation Summary / Full Composition 5개 유지. +- 내부 OrgChart/Content Story 8개 보존. 별도 신규 Story 메뉴 없음. +- HTML·React는 같은 Core 렌더러와 전용 CSS를 사용하며, 390/768/1280/1440px의 카드 Computed Style·크기·콘텐츠 측정값이 일치했습니다. +- 로컬 미리보기: [Department Colors](http://127.0.0.1:6030/?path=/story/orgchart--department-colors), [Full Composition](http://127.0.0.1:6030/?path=/story/orgchart--full-composition). + +## 변경 파일 + +신규 파일: + +- `packages/org-chart/src/core/person-name-overflow.ts`: Overflow 판정·Hover/Focus 툴팁·접근성·정리. +- `examples/org-chart/verify-card-content.mjs`: 이번 단계의 브라우저 검증. +- `docs/org-chart/card-design-stage2.md`: 이 보고서. + +수정 파일: + +- `packages/org-chart/src/core/employee-card.ts`: SVG 카드의 직위/이름 전용 컨테이너 및 배지 영역. +- `packages/org-chart/src/styles/employee-card.css`: 종류별 Typography·Gap·말줄임·Focus·툴팁. +- `src/org-chart/org-chart-p1.stories.tsx`: 기존 Department Colors 내 긴 이름 검증 토글. +- `examples/org-chart/create-p1-fixture.mjs`: 자연스러운 가상 이름 생성. +- `examples/org-chart/data-p1.json`: 이름 필드만 갱신. + +생성 결과: `packages/org-chart/dist/`, HTML/React demo dist, `storybook-static/`, `test-results/org-chart-card-content/`. 공통 Theme·Guard·공개 API·React Wrapper·차트 엔진·허브·Summary 구현은 변경하지 않았습니다. + +## 최종 검증 + +- 변경 패키지 Typecheck: PASS. +- Story 소비 코드 Typecheck (`tsconfig.app.json`): PASS. +- 변경 패키지 Build (ESM / browser IIFE / types / CSS): PASS. +- HTML 준비 및 React demo Build: PASS. +- Storybook production Build: PASS. 기존 큰 chunk 경고는 남아 있습니다. +- 실제 Chrome 브라우저: **368/368 PASS**, console/runtime 오류 0. +- 대표자/그룹장/직원 Computed Style, weight·line-height·letter-spacing·색상·Gap·margin·padding: PASS. +- Department Colors 및 Full Composition 렌더링: PASS. +- 짧은 이름: 줄바꿈·잘림 없이 표시, 불필요한 Tab 진입 없음. +- 긴 이름: Overflow 카드에만 ellipsis·Tab Focus·전체 이름 툴팁, Hover·툴팁 Hover·실제 키보드 Tab·Escape·Focus 유지·접근성 트리 전체 문자열: PASS. +- 긴 이름을 짧은 이름으로 복구할 때 툴팁 제거: PASS. +- 카드 크기와 프로필 크기 보존, 사진/텍스트/로고/배지 겹침, 가시 텍스트 범위, 페이지 Overflow: PASS. 실제 이미지 로딩 사례도 검증했습니다. +- HTML·React 4개 뷰포트 Computed Style/콘텐츠 일치: PASS. +- 데이터 비교: 이름 필드 외 값 동일, JSON 계약·직원 수·소속·프로필 보존 PASS. +- 시작 파일 130개 중 125개 해시 동일, 누락 없음. 변경은 위 5개 기존 파일뿐입니다. +- SVG 13개와 실제 로고 PNG 7개 해시 모두 동일. 이전 품질 보완 파일 및 1단계 보고서 보존. +- `git diff --check`: PASS. 기존 Stage 파일 없음, HEAD·브랜치 동일. +- 기존 1단계 231개 검사는 재실행하지 않았습니다. 통계·데이터 Core 전체·AI Guard 전체 회귀도 재실행하지 않았습니다. + +증거: + +- `test-results/org-chart-card-content/browser.json`: 브라우저 버전, 368개 결과, 카드별 측정값. +- `test-results/org-chart-card-content/preservation.json`: 해시 보존, Story 수, Git 상태. +- `test-results/org-chart-card-content/baseline.json`: 시작 파일 해시. +- `test-results/org-chart-card-content/data-p1-before.json`: 이름 변경 전 비교 기준. +- `test-results/org-chart-card-content/*-normal.png`, `composition-1440.png`, `representative-tooltip-visible.png`: 실제 렌더링 화면. + +### Guard 원본 상태 + +요청 파일을 대상으로 PARTIAL / STORYBOOK Guard를 1회 실행했습니다. 원본 `status=FAIL / staticStatus=FAIL`을 보존합니다. + +- TOKEN-001 FAIL 8개: 변경하지 않은 `department-colors.ts` 및 `style-presets.ts`의 OrgChart 전용 동적 CSS 변수 추적. +- 이전 1단계 FAIL 항목과 code·file·line·message가 모두 동일합니다. +- TOKEN-002 NOT VERIFIED 6개, 패키지 CSS 추적 SCOPE-001 NOT VERIFIED 1개. +- styleEvidence: STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT NOT VERIFIED / FINAL NOT VERIFIED. 기존 Story 레이아웃 CSS의 디자인 의도 항목을 포함한 원본 결과이며, 이번 브라우저 증거로 원본을 덮어쓰지 않았습니다. +- `test-results/org-chart-card-content/guard-storybook.json`에 전체 원본 저장. +- 이번 카드 동작의 PASS와 Guard 전체 상태를 구분합니다. Guard 수정은 범위에서 제외합니다. + +## 남은 차이 및 NOT VERIFIED + +- `D:\디자인시스템\HMDesign-OrgChart-References\workdesk-orgchart.png`와 상위 References 폴더가 현재 없습니다. 따라서 실제 Workdesk 사진·텍스트·로고 위치, 글꼴 및 미세 정렬 일치는 NOT VERIFIED입니다. 지정 확정 CSS 수치는 우선 적용했습니다. +- 기존 OrgChart 글꼴 설정을 유지했습니다. 실제 Workdesk의 글꼴 차이에 따른 시각적 차이는 캡처를 확인한 후 판단해야 합니다. +- 브라우저 접근성 트리와 키보드 동작은 PASS이나, 별도의 실제 스크린리더 음성 낭독은 NOT VERIFIED입니다. +- Guard의 기존 추적 FAIL/NOT VERIFIED는 미해소입니다. +- 긴 이름을 완전히 한 줄로 표시하려면 고정 카드 폭을 초과하므로, 사용자 확정대로 크기·폰트를 유지하고 말줄임과 전체 이름 툴팁을 적용했습니다. +- 전체 레이아웃·관계선·허브·통계 재설계는 다음 단계 범위이며 이번에는 변경하지 않았습니다. + +## P2 최신 확정 표시 규칙 — 2026-10-12 + +위 2단계 기록과 검증 결과는 보존한다. 조회 전용 Full Composition의 현재 적용 기준은 [P2 보고서](implementation-report-p2.md)다. + +- Depth 1 조직장만 146×68, Depth 2 이하 조직장은 108×52 소형 SVG. 독립 카드와 interactive 모드의 기존 조직장 선택은 유지한다. +- 가상 직원의 이름은 표시 계층에서 `홍 길 동`으로 통일하고 직위·직책에도 연속 한글 사이 공백을 적용한다. 원본 데이터 문자열에는 공백을 삽입하지 않는다. +- 기존 font-size, font-weight, line-height, 컬러와 내부 직위/뱃지 행 ↔ 이름 행 gap 0px는 유지한다. 글자 간격에 관한 이전 표시보다 이번 확정 지시를 우선한다. +- 외부 1Depth 헤더 ↔ 대형 카드 gap은 최종 8px이며, 이전 P2 초안의 10px는 적용하지 않는다. 아래 Depth 헤더 ↔ 소형 카드는 10px다. +- 긴 직책의 공백 표시가 회사 로고와 겹치지 않도록 조회 전용 대형 카드의 뱃지를 같은 행 안에서 아래로 정렬하고 로고 위치를 3px 올렸다. SVG·로고 원본, 글자/로고 크기 및 내부 행 높이는 변경하지 않았다. diff --git a/docs/org-chart/data-contract.md b/docs/org-chart/data-contract.md new file mode 100644 index 0000000..d407973 --- /dev/null +++ b/docs/org-chart/data-contract.md @@ -0,0 +1,261 @@ +# OrgChart Data Contract + +상태: **JSON Schema / TypeScript 초안, 승인 전**. ID 기반 분리·동일 계약 사용·Validation·원본 집계는 확정 요구다. 아래 필드명·enum·null·버전 값은 제안이다. 모든 환경이 이 계약과 같은 검증·집계를 공유한다. [Architecture](architecture.md), [API 전환](integration.md)을 함께 읽는다. + +## 1. 정규화 모델과 TypeScript 초안 + +ID는 엔티티별 배열 안에서 유일한 불투명 문자열이다. 이름·배열 위치로 연결하지 않는다. 조직은 `parentId`, 직원은 `organizationId`·`affiliationId`, 조직장은 `leaderId`, 추가 관계는 두 조직 ID를 참조한다. 서로 다른 엔티티의 같은 ID 문자열은 허용할지 TBD이며, DOM에는 엔티티·인스턴스 prefix를 별도로 붙인다. + +```ts +type ID = string; +type OrganizationType = "root" | "division" | "office" | "div" | "cell" | "team"; +type WorkStatus = "active" | "dispatched" | "onLeave"; +type RelationType = "cooperation" | "support"; + +interface Organization { + id: ID; + parentId: ID | null; + name: string; + type: OrganizationType; + leaderId: ID | null; + displayOrder: number; +} +interface Employee { + id: ID; + organizationId: ID; + affiliationId: ID; + name: string; + position: string; // 직위. jobTitle(직책)과 구별 + jobTitle: string | null; + profileImage: string | null; + workStatus: WorkStatus; +} +interface Affiliation { id: ID; name: string } +interface OrganizationRelation { + id: ID; + sourceOrganizationId: ID; + targetOrganizationId: ID; + type: RelationType; +} +interface PresentationConfig { + title: string; + description: string | null; + hubText: string | null; + groups: { + showEmployees: boolean; + showSummary: boolean; + showDispatched: boolean; + showOnLeave: boolean; + showAffiliations: boolean; + }; + organizationOrder: ID[]; +} +interface Metadata { + schemaVersion: "0.1-draft"; + asOfDate: string; // YYYY-MM-DD, 유효한 실제 날짜 + dataVersion: string; + updatedAt: string | null; // timezone을 포함한 RFC 3339 갱신 시각 + updateNote: string | null; +} +interface OrgChartData { + organizations: Organization[]; + employees: Employee[]; + affiliations: Affiliation[]; + relations: OrganizationRelation[]; + presentation: PresentationConfig; + metadata: Metadata; +} +``` + +제안된 `root/division/office/div/cell/team`은 최상위/부문/실/Div/셀/팀 표현이다. 실제 조직 유형·업무 상태·관계 유형 vocabulary, 직위 필수 여부, 무소속·관계사 미지정 허용은 **TBD**다. 새로운 enum은 schema/API 버전과 함께 확장하고 알 수 없는 값을 임의 재직 상태로 치환하지 않는다. + +`schemaVersion`은 계약 호환성, `dataVersion`은 스냅샷 식별이다. 서로 대신 쓰지 않는다. 부모 null은 root 후보, leader null은 공석 후보, 이미지 null은 가상 fallback을 뜻하는 초안이다. API에서 필드 생략이 가능한지와 null 허용은 승인 후 확정한다. + +표현 설정은 표시만 바꾸고 원본 소속·집계 분모를 변경하지 않는다. 순서는 제안상 `organizationOrder`에 있는 ID 우선 → 나머지 형제 `displayOrder` → 동률 ID 순서로 결정한다. 전역 목록이 계층 parent를 바꾸지는 않는다. 실제 정렬 우선순위는 TBD다. PresentationConfig에 CSS·HTML·DOM 좌표·API URL을 받지 않는다. + +## 2. JSON Schema 초안 + +JSON Schema Draft 2020-12 제안이다. `format`을 실제 검사하는 validator 설정이 필요하다. 아래 구조는 JSON 구문 검증 대상이며 runtime validator 구현 또는 Schema 승인 결과가 아니다. 중복 ID·참조·순환·업무 규칙은 §4의 별도 검증이 필요하다. 모든 필드를 required로 하고 nullable을 명시하는 엄격한 초안이며 API 매핑에서 같은 형태로 변환한다. + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "HMDesign OrgChart draft", + "type": "object", + "additionalProperties": false, + "required": ["organizations", "employees", "affiliations", "relations", "presentation", "metadata"], + "properties": { + "organizations": {"type": "array", "items": {"$ref": "#/$defs/Organization"}}, + "employees": {"type": "array", "items": {"$ref": "#/$defs/Employee"}}, + "affiliations": {"type": "array", "items": {"$ref": "#/$defs/Affiliation"}}, + "relations": {"type": "array", "items": {"$ref": "#/$defs/OrganizationRelation"}}, + "presentation": {"$ref": "#/$defs/PresentationConfig"}, + "metadata": {"$ref": "#/$defs/Metadata"} + }, + "$defs": { + "ID": {"type": "string", "minLength": 1}, + "Text": {"type": "string", "minLength": 1}, + "NullableText": {"anyOf": [{"$ref": "#/$defs/Text"}, {"type": "null"}]}, + "NullableID": {"anyOf": [{"$ref": "#/$defs/ID"}, {"type": "null"}]}, + "Organization": { + "type": "object", "additionalProperties": false, + "required": ["id", "parentId", "name", "type", "leaderId", "displayOrder"], + "properties": { + "id": {"$ref": "#/$defs/ID"}, + "parentId": {"$ref": "#/$defs/NullableID"}, + "name": {"$ref": "#/$defs/Text"}, + "type": {"enum": ["root", "division", "office", "div", "cell", "team"]}, + "leaderId": {"$ref": "#/$defs/NullableID"}, + "displayOrder": {"type": "integer", "minimum": 0} + } + }, + "Employee": { + "type": "object", "additionalProperties": false, + "required": ["id", "organizationId", "affiliationId", "name", "position", "jobTitle", "profileImage", "workStatus"], + "properties": { + "id": {"$ref": "#/$defs/ID"}, + "organizationId": {"$ref": "#/$defs/ID"}, + "affiliationId": {"$ref": "#/$defs/ID"}, + "name": {"$ref": "#/$defs/Text"}, + "position": {"$ref": "#/$defs/Text"}, + "jobTitle": {"$ref": "#/$defs/NullableText"}, + "profileImage": {"anyOf": [{"type": "string", "format": "uri-reference", "minLength": 1}, {"type": "null"}]}, + "workStatus": {"enum": ["active", "dispatched", "onLeave"]} + } + }, + "Affiliation": { + "type": "object", "additionalProperties": false, + "required": ["id", "name"], + "properties": {"id": {"$ref": "#/$defs/ID"}, "name": {"$ref": "#/$defs/Text"}} + }, + "OrganizationRelation": { + "type": "object", "additionalProperties": false, + "required": ["id", "sourceOrganizationId", "targetOrganizationId", "type"], + "properties": { + "id": {"$ref": "#/$defs/ID"}, + "sourceOrganizationId": {"$ref": "#/$defs/ID"}, + "targetOrganizationId": {"$ref": "#/$defs/ID"}, + "type": {"enum": ["cooperation", "support"]} + } + }, + "PresentationConfig": { + "type": "object", "additionalProperties": false, + "required": ["title", "description", "hubText", "groups", "organizationOrder"], + "properties": { + "title": {"$ref": "#/$defs/Text"}, + "description": {"$ref": "#/$defs/NullableText"}, + "hubText": {"$ref": "#/$defs/NullableText"}, + "organizationOrder": {"type": "array", "uniqueItems": true, "items": {"$ref": "#/$defs/ID"}}, + "groups": { + "type": "object", "additionalProperties": false, + "required": ["showEmployees", "showSummary", "showDispatched", "showOnLeave", "showAffiliations"], + "properties": { + "showEmployees": {"type": "boolean"}, "showSummary": {"type": "boolean"}, + "showDispatched": {"type": "boolean"}, "showOnLeave": {"type": "boolean"}, + "showAffiliations": {"type": "boolean"} + } + } + } + }, + "Metadata": { + "type": "object", "additionalProperties": false, + "required": ["schemaVersion", "asOfDate", "dataVersion", "updatedAt", "updateNote"], + "properties": { + "schemaVersion": {"const": "0.1-draft"}, + "asOfDate": {"type": "string", "format": "date"}, + "dataVersion": {"$ref": "#/$defs/Text"}, + "updatedAt": {"anyOf": [{"type": "string", "format": "date-time"}, {"type": "null"}]}, + "updateNote": {"$ref": "#/$defs/NullableText"} + } + } + } +} +``` + +빈 문자열·공백만 있는 필수 값은 runtime Validation에서 거부하도록 제안한다. `minLength`만으로 공백 검사가 끝나지 않는다. 입력 길이·배열 크기·깊이 상한은 실제 데이터 규모 검토 후 TBD로 확정한다. + +## 3. 가상 JSON 스냅샷 예시 + +실제 인사 정보와 사진이 없는 예시다. Schema 값은 초안이며 아래 데이터가 운영 계약으로 승인된 것은 아니다. + +```json +{ + "organizations": [ + {"id": "org-root", "parentId": null, "name": "가상 사업본부", "type": "root", "leaderId": "emp-a", "displayOrder": 0}, + {"id": "team-a", "parentId": "org-root", "name": "가상 기획팀", "type": "team", "leaderId": "emp-b", "displayOrder": 1}, + {"id": "team-b", "parentId": "org-root", "name": "가상 운영팀", "type": "team", "leaderId": null, "displayOrder": 2} + ], + "employees": [ + {"id": "emp-a", "organizationId": "org-root", "affiliationId": "aff-a", "name": "가상직원 가", "position": "대표", "jobTitle": "본부장", "profileImage": null, "workStatus": "active"}, + {"id": "emp-b", "organizationId": "team-a", "affiliationId": "aff-a", "name": "가상직원 나", "position": "책임", "jobTitle": "팀장", "profileImage": null, "workStatus": "active"}, + {"id": "emp-c", "organizationId": "team-a", "affiliationId": "aff-b", "name": "가상직원 다", "position": "선임", "jobTitle": null, "profileImage": null, "workStatus": "dispatched"}, + {"id": "emp-d", "organizationId": "team-b", "affiliationId": "aff-b", "name": "가상직원 라", "position": "선임", "jobTitle": null, "profileImage": null, "workStatus": "onLeave"} + ], + "affiliations": [{"id": "aff-a", "name": "가상 관계사 A"}, {"id": "aff-b", "name": "가상 관계사 B"}], + "relations": [{"id": "rel-a", "sourceOrganizationId": "team-a", "targetOrganizationId": "team-b", "type": "cooperation"}], + "presentation": { + "title": "가상 조직도", "description": "설계 검토용 가상 데이터", "hubText": "협업 중심", + "groups": {"showEmployees": true, "showSummary": true, "showDispatched": true, "showOnLeave": true, "showAffiliations": true}, + "organizationOrder": ["org-root", "team-a", "team-b"] + }, + "metadata": {"schemaVersion": "0.1-draft", "asOfDate": "2026-10-12", "dataVersion": "mock-1", "updatedAt": null, "updateNote": "초안 예시"} +} +``` + +직원 고유 ID 수 4, 상태별 raw 수 2/1/1은 fixture 산술 기준이다. 업무상 재직/전체 인원과 파견·휴직 포함 여부는 §5의 정책 승인이 필요하다. 조직장 카드와 상태 그룹에 같은 직원이 보이더라도 raw ID 수가 늘어나지 않아야 한다. + +## 4. Validation과 오류 상태 + +제안 순서: 구조·버전 → 각 collection ID index → parent/직원/관계사/leader 참조 → cycle/root → 업무 규칙·입력 안전성. invalid 데이터를 engine로 전달하지 않는다. + +- `SCHEMA_VERSION`: 승인된 버전과 불일치. 자동 추정·silent migration 금지. +- `DUPLICATE_ID`: 같은 collection 내 ID 중복. 임의 last-write-wins 금지. +- `REQUIRED_VALUE`: 누락/null 위반/공백뿐인 필수 값/잘못된 타입. +- `ORGANIZATION_REFERENCE`: 직원 소속이 존재하지 않음. 삭제 시 parent/직원 이동을 일관된 스냅샷으로 제공해야 한다. +- `PARENT_REFERENCE` / `HIERARCHY_CYCLE`: 없는 parent, 자기 parent, 다단계 순환. 정렬로 cycle을 은폐하지 않는다. +- `LEADER_REFERENCE`: leader 직원이 없음. leader가 동일 조직/하위 조직/타 조직 소속이어도 되는지는 TBD이며 정책 없는 불일치는 승인 요구 issue로 보고한다. +- `AFFILIATION_REFERENCE`: 직원 관계사 없음. 미지정 소속 허용 정책은 TBD. +- `INVALID_STATUS` / `INVALID_TYPE`: 허용 vocabulary 외 값. 제안 enum이 실제 승인 목록을 대신하지 않는다. +- `RELATION_REFERENCE` / `INVALID_RELATION`: 없는 양 끝 조직, 자기 관계, 중복 양 끝+유형, 허용되지 않은 유형을 검사한다. 관계 방향·대칭·역방향 중복 허용은 TBD. 일반 관계의 cycle은 조직 parent cycle과 구별한다. +- `PRESENTATION_REFERENCE`: organizationOrder의 없는 ID·중복·정렬 정책 위반. +- `UNSAFE_INPUT`: 실행 가능한 HTML/스크립트 payload·위험한 이미지 URL·제어문자/식별 교란 입력을 검사한다. 표시 문자열은 plain text, external `className/style/nodeTemplate`는 받지 않는다. image scheme/origin·상대 경로 정책·길이 상한은 승인 후 확정한다. JSON Schema `uri-reference`만으로 URL 안전성을 보장하지 않는다. + +입력 검사와 출력 안전성은 함께 적용한다. 정상 문자열을 무조건 삭제하지 않고 거부/경고 기준을 문서화한다. DOM 텍스트는 `textContent`로 출력하고 engine 템플릿에는 외부 문자열을 직접 삽입하지 않는다. engine ID는 내부 안전 ID로 변환한다. HTML escaping만으로 이미지 URL 검사를 대체하지 않는다. + +구조·참조·cycle·보안 실패는 Error 상태로 전환하고 engine mount/update를 중단한다. 사용자 메시지는 해당 데이터가 표시 불가능함을 설명하되 원본 개인정보를 노출하지 않는다. partial 데이터 자동 제거는 별도 승인 전 하지 않는다. 직원 0명과 조직 0개의 Empty 정의, 갱신 실패 시 직전 유효 화면 유지 여부는 TBD다. 미확정 집계 정책은 차트 유효성과 분리하여 집계를 `unavailable`로 표시하는 방식을 제안한다. + +fatal Validation issue는 차트 Error로 처리한다. 집계 정책 미확정은 fatal data issue가 아니며 유효한 차트의 ready와 별도 AggregationResult `unavailable`로 공존하는 안을 제안한다. Source의 HTTP/JSON/매핑 실패는 dataSource 위치의 별도 code로 구별한다. warning·업무 승인 필요 issue의 치명도와 공개 반환 형식은 승인 전 TBD다. 어떤 경로도 원본 서버 오류·개인정보를 callback에 그대로 전달하지 않는다. + +Validation·집계·render는 같은 불변 스냅샷을 사용하며 engine는 별도 복사본만 받는다. Source가 여러 API/페이지를 조합할 때의 시간 일관성은 ID 참조 검사와 별도로 보장해야 한다. Source 캡처·revision 반영 계약은 Architecture/Framework Integration을 따른다. + +## 5. 인원 집계와 미확정 정책 + +원본 `employees`에서 계산하며 DOM 카드·engine 노드 수를 세지 않는다. Validation 통과 직원 ID 집합을 사용하고 parent 트리의 하위 조직을 통해 집계한다. 추가 관계·허브·접힌/숨겨진 카드·표시 설정은 조직 소속을 변경하지 않는다. + +- 조직 직접 인원: 해당 organizationId의 직원 집합. +- 하위 포함 인원: 자기 조직 + 승인된 parent 트리 하위 조직의 직원 ID 합집합. +- 직위별 인원: 정해진 대상 집합을 `position`으로 그룹화. 직책과 혼합하지 않는다. +- 재직/파견/휴직: 승인된 상태 매핑과 포함 정책을 적용한다. raw 상태 카운트와 재직 정의는 구별한다. +- 관계사별 인원: `affiliationId`로 그룹화하고 동일한 승인 정책을 적용한다. +- 전체 인원: 승인된 전체 대상의 직원 ID 집합. 하위 포함 조직별 숫자를 더하면 중복되므로 그 합을 총원으로 쓰지 않는다. + +집계 정책은 PresentationConfig와 별도로 제공하는 제안이다. 아래 type의 값이나 default는 아직 승인되지 않았다. + +```ts +interface ApprovedAggregationPolicy { + policyVersion: string; + includedStatuses: WorkStatus[]; + activeStatuses: WorkStatus[]; + includeLeaders: boolean; + membershipMode: "primaryOnly" | "uniqueEmployee"; +} +type AggregationResult = + | { status: "unavailable"; reason: "policyRequired" } + | { status: "ready"; policyVersion: string; total: number }; +``` + +TBD: 파견·휴직을 재직/전체/팀/관계사에 포함하는지, 조직장 포함·겸직 조직장 배분, 조직 간 중복 소속, 파견 원소속/파견지 기준, 퇴사·예정 상태 필요 여부, 관계사 합과 총원 관계. 초안의 단일 `organizationId`는 복수 소속을 표현하지 못한다. 복수 소속이 필요하면 별도 Membership 계약과 schema revision을 승인하고 집계 mode를 확정한다. `uniqueEmployee` 후보만으로 현재 복수 소속이 지원된다고 주장하지 않는다. + +정책 없이 임의 총원을 표시하지 않는다. 향후 테스트에는 leader 중복 표시, 상태 변경, 조직 이동, 하위 포함 중복 제거, 관계사 이동, 표시 숨김, 동일 JSON의 Vanilla/React 집계 일치를 포함한다. 같은 조건에 같은 결과가 나와야 한다. + +집계 정책 자체도 policyVersion·지원 membershipMode·허용 status·중복 status·업무상 상호 관계를 검증한다. `activeStatuses`와 `includedStatuses`의 관계, leader 제외가 어느 조직의 어떤 직원에 적용되는지는 승인 전 TBD다. 필드 값만 받아 임의 해석하지 않는다. 환경별 정렬 일치를 위해 ID 비교 기준·locale 의존 정렬 여부도 확정한다. diff --git a/docs/org-chart/framework-integration.md b/docs/org-chart/framework-integration.md new file mode 100644 index 0000000..9ccf1f3 --- /dev/null +++ b/docs/org-chart/framework-integration.md @@ -0,0 +1,179 @@ +# OrgChart Framework Integration + +상태: 설계 계약·사용 예시 제안. **현재 package/Wrapper/HTML bundle은 존재하지 않으며 예시 API·경로도 승인 전이다.** 이 문서는 코드를 생성하거나 지원 완료를 주장하지 않는다. [Architecture](architecture.md)의 facade와 [Data Contract](data-contract.md)를 공통 기준으로 한다. + +## 1. 지원 범위와 책임 + +1차 공식 개발 대상은 **Vanilla HTML/JavaScript와 React만**이다. 현재 두 환경 모두 구현 미착수·실행 **NOT VERIFIED**다. Vue·Angular·기타 framework는 이번 개발 범위에서 제외하며 Adapter 구현·배포·지원 검증을 계획에 포함하지 않는다. 최초 추가 요청의 Vue 설계 항목은 최신 지원 범위 확정으로 대체했다. 향후 Core facade를 연결할 수 있도록 framework 독립성만 유지한다. + +우선 검토 구성은 `@hm-design/org-chart`(Core), `@hm-design/org-chart-react`(React Wrapper)다. 실제 경로·두 패키지 분리는 workspace/build/dependency 검토 후 최종 승인한다. React Wrapper는 Engine Adapter와 다르다: Wrapper는 React와 Core 사이, Engine Adapter는 Core와 dabeng 사이에 있다. Data Source Adapter는 외부 형식과 normalized 계약 사이에 있다. + +- Core: 표준 DOM, 공통 계약·Validation·ViewModel·집계·engine·노드 UI·Theme CSS·인터랙션·요청 취소·생명주기. +- Vanilla 호스트: container 제공, Source·options 전달, Theme/CSS/script 로딩, 페이지 제거 시 Destroy. +- React Wrapper: ref/effect로 Core mount, Props 변경을 update/reload 또는 설정 재생성에 연결, 언마운트 시 Destroy. 공통 업무 로직·렌더링 엔진·노드 디자인을 재구현하지 않는다. +- 상위 앱: Layout·Navigation·Routing·API 인증·권한·Theme 공급. Core에 React context나 인증 hook을 요구하지 않는다. + +두 환경은 동일 JSON 입력 → 동일 Validation → 동일 계층·집계 → 동일 Core 노드·Theme·인터랙션을 사용한다. React 외부 HM Component는 페이지 조합이며 Core 내부 노드의 다른 디자인을 만드는 근거가 아니다. + +## 2. 생명주기 계약 초안 + +메서드 이름은 확정 생명주기 요구를 구체화한 API 제안이다. engine 자체의 destroy 지원과 혼동하지 않는다. + +1. `createOrgChart(options)`: DOM 생성·요청 없이 Handle을 만든다. framework import와 전역 window 접근 부작용을 ESM import 시 피하는 안을 검토한다. +2. `mount(container)`: 연결된 HTMLElement의 전용 자식 root를 소유하고 첫 Source를 읽는다. 호스트의 sibling/기존 콘텐츠를 지우지 않는다. 한 Handle에 한 container이며 중복 mount는 명시적 호출 오류로 거부한다. +3. `update(input)`: mounted 상태에서 normalized 스냅샷 후보를 검증·집계·렌더한다. Source fetch 없이 스냅샷만 바꾼다. 현재 Source 객체는 유지하므로 이후 reload는 그 Source를 다시 읽는다. +4. `reload(source?)`: mounted 상태에서 현재/교체 Source를 읽고 같은 반영 경로를 사용한다. JSON → Mock API/실제 API 전환의 공개 지점이다. +5. `destroy()`: 동기·반복 안전한 최종 정리. 진행 요청 abort·revision 무효화·콜백 중단, Core/engine 이벤트·Observer·frame/timer·DOM·인스턴스 참조를 정리한다. destroyed Handle은 재사용하지 않고 새 Handle을 만든다. + +mount/update/reload는 Promise 제안이다. 데이터·Source 실패는 Error state로 알리고 Promise를 정상 완료하는 방식을 우선 검토한다. 잘못된 호출 순서·사용법은 명시적 오류로 reject한다. abort/새 revision에 의해 폐기된 작업은 unhandled rejection 없이 종료하고 DOM/상태를 바꾸지 않는다. mount 진행 중에도 이미 확보한 container의 update/reload는 이전 작업을 무효화한다. mount 전·destroy 후 update/reload는 오류다. Promise 완료는 해당 revision의 반영 또는 controlled error 전환까지이며 이미지/폰트의 모든 로드 완료를 뜻하지 않는다. + +상태 전이는 loading → ready/empty/error다. update는 동기 validation 중에도 같은 state 의미를 유지한다. Empty 정의와 갱신 중/실패 시 직전 화면 유지 정책은 TBD다. 같은 Metadata 버전이라도 새 입력을 무시하지 않는다. reload/update 경쟁은 마지막 시작 revision이 우선하도록 제안한다. + +엔진 정리 가능성은 최초 PoC에서 입증해야 한다. document 이벤트·관찰자를 해제할 경로를 찾지 못하면 Destroy 완료를 PASS로 표시하지 않는다. core가 소유하지 않은 engine 자원을 `innerHTML = ""`만으로 정리했다고 판단하지 않는다. 제한/통합 대안을 승인받기 전 기능 개발을 확대하지 않는다. + +engine 재생성 전 이전 chart가 살아 있는 동안 기존 pan/zoom·minimap 등의 해제 가능성을 확인한다. update/reload 반복 후에도 이벤트/Observer가 증가하지 않는지 검사한다. Core와 데이터 계층의 DOM 없는 import는 upstream 직접 import와 구별하며 지연 engine 로딩/변환 entry를 검증한다. + +## 3. 데이터 Source 사용 예시 + +아래 `createJSONSource`·`createExternalJSONSource`도 제안 API다. 모든 반환값은 같은 validator를 통과한다. 가상 데이터 `data`는 Data Contract §3 스냅샷을 뜻한다. + +```ts +// 제안 API; 아직 설치 가능한 공개 함수가 아니다. +const jsonSource = createJSONSource(data); +const externalSource = createExternalJSONSource({ url: configuredJsonUrl }); +// URL은 호스트 설정. Core에 회사 서버 주소를 하드코딩하지 않는다. +``` + +JSON Mock은 객체 스냅샷을 공급하고 consumer 입력을 수정하지 않는다. External JSON은 AbortSignal·HTTP 오류·JSON 구문 오류를 처리한다. source가 JSON을 반환했다는 이유만으로 Validation을 생략하지 않는다. + +JSON Source는 생성 시점 입력을 캡처하는 안, update는 호출 시점 입력을 확보하는 안을 제안한다. 같은 객체의 외부 mutation을 자동 변경 알림으로 취급하지 않는다. 검증·집계·DOM 반영은 Core 소유 불변 스냅샷에서 수행하고 최종 state/DOM commit 직전 revision·destroy 상태를 다시 확인한다. + +API가 마련됐을 때의 공통 계약 예시: + +```ts +// OrgChartDataSource, OrgChartData는 문서의 초안 type이다. +function createApiSource( + request: (signal: AbortSignal) => Promise, + mapResponse: (raw: unknown) => OrgChartData +): OrgChartDataSource { + return { + async load({ signal }) { + return mapResponse(await request(signal)); + } + }; +} +const apiSource = createApiSource(hostApiRequest, mapApiResponse); +await handle.reload(apiSource); // Core/노드 UI/집계/React Wrapper는 유지 +``` + +실제 request·mapping은 명세 확정 후 호스트에서 작성한다. mapResponse type 선언은 보안 경계가 아니며 Core가 결과를 재검증한다. Endpoint·인증·재시도·캐시를 임의로 예시에 넣지 않는다. Mock API는 같은 fixture를 Promise로 반환하고 지연/오류를 주입하여 실제 서버 없이 전환을 검증한다. + +## 4. Vanilla HTML 사용 예시 + +아래 asset 이름·`window.HMOrgChart` namespace는 미래 browser bundle **제안**이며 파일을 제작한 것이 아니다. React 설치 없이 classic script + 별도 CSS + inline JSON으로 `file://` 직접 실행을 검증할 예시다. 포장된 Theme CSS·font·Core CSS·번들이 모두 상대 경로로 제공돼야 한다. + +```html + + + + + + 가상 조직도 검증 + + + + +
+ + + + + +``` + +위 예시는 실행 검증 전 설계용이다. inline JSON은 가상 데이터만 사용한다. pagehide 이후 bfcache 복귀가 필요한 앱은 새 instance의 재mount를 호스트에서 계획한다. SPA 콘텐츠 제거에서는 pagehide에만 의존하지 않고 해당 제거 시점에 Destroy한다. + +ESM 비교 예시(HTTP(S) static server에서 우선 검증): + +```js +import { createOrgChart, createJSONSource } from "./assets/orgchart.esm.js"; +const handle = createOrgChart({ dataSource: createJSONSource(data) }); +await handle.mount(document.getElementById("orgchart-host")); +``` + +bare npm specifier는 일반 HTML에서 자동 해석되지 않는다. file://의 module/fetch 제한과 서버 기반 ESM 실행을 구별한다. `file://`에서는 inline JSON + classic bundle 경로를 검증하고 외부 JSON fetch가 가능하다고 보장하지 않는다. External JSON/API는 HTTP(S)·CORS·호스트 권한 조건에서 별도로 검증한다. + +## 5. React 사용 예시와 Wrapper 계약 + +아래 package names·Component/Prop은 우선 분리안의 예시이며 실제 Export가 아니다. 동일 Core CSS·Theme를 사용한다. React 호스트의 기존 CSS entry 순서를 지키고 HM 공개 Component를 사용하는 주변 영역은 해당 HM Tailwind source/Theme 규칙을 유지한다. + +```tsx +import { useMemo } from "react"; +import { createJSONSource } from "@hm-design/org-chart"; +import { OrgChart } from "@hm-design/org-chart-react"; +import "@hm-design/org-chart/style.css"; +// 기존 앱 Theme entry에서 @hm-design/ui/theme.css를 연결한다. + +function OrgChartContent({ data }: { data: OrgChartData }) { + const dataSource = useMemo(() => createJSONSource(data), [data]); + return ; +} +``` + +Props 후보는 dataSource·aggregationPolicy·interaction·onStateChange다. title/description/group/order는 공통 데이터의 PresentationConfig를 사용한다. React 전용 표현·집계 옵션을 따로 만들지 않는다. 직접 스냅샷 Prop 추가는 public API 승인 후 검토한다. + +Wrapper 동작: 최초 ref container 확보 → Core 생성·mount; dataSource 교체 → 기존 Handle.reload(newSource); 동일 Source의 내부 값 변경은 명시적 reload 또는 새 immutable Source로 전달한다. 새 객체를 매 렌더 생성해 불필요한 reload를 유발하지 않는다. options 중 집계·인터랙션 변경은 Core의 갱신 API 확장 또는 cleanup 후 instance 재생성 중 PoC로 결정한다. 미확정 옵션을 조용히 무시하지 않는다. + +언마운트는 destroy; effect cleanup→setup이 반복되는 React StrictMode에서도 새 instance만 mount한다. promise 경쟁·늦은 callback·변경되지 않은 props에 의한 중복 engine 생성·callback identity로 인한 무한 reload를 검사한다. Core가 DOM을 소유하는 전용 container 자식에 React가 동시에 노드를 render하지 않는다. Framework wrapper는 engine/node/Validation/집계 CSS를 복제하지 않는다. + +SSR/Server Components의 DOM 렌더링은 이번 지원 완료 범위가 아니다. import 시 브라우저 global 부작용·React client boundary·hydrate 안전성은 검토하고 미확인 기능은 NOT VERIFIED로 남긴다. + +## 6. CSS·Theme·배포 방식 + +같은 Core CSS와 HM Variables mapping을 모든 배포가 사용한다. 호스트는 Theme를 로드하고 Core는 컨테이너 내부 전용 selector만 사용한다. Theme 정책과 실제 선언 근거는 [Integration §3](integration.md#3-hm-theme-연결)을 따른다. + +- npm: Core ESM + type + CSS, Wrapper ESM + type 후보. exports/types/files/sideEffects를 설계하고 package tarball 안에서 실제 import·CSS·font/asset 존재를 검증한다. 실제 publish는 별도 승인이다. +- ESM: npm bundler import와 브라우저 상대 URL import를 구별한다. Core에 React/React DOM 또는 unresolved bare dependency가 섞이지 않도록 검증한다. +- browser bundle: IIFE/UMD 중 직접 script 사용 형식을 선택한다. `window.HMOrgChart` 후보, 엔진 포함 여부·외부 dependency·license·크기·CSP를 검토한다. inline page 예시는 CSP 승인 완료를 뜻하지 않는다. +- CSS: Core 스타일을 별도 `style.css` export/상대 asset로 제공하고 Theme를 중복 주입하지 않는다. upstream CSS의 container 밖 누출도 포함해 scope를 검증한다. +- TypeScript: Core 선언에는 React type이 없어야 하고 Wrapper만 React Props를 가진다. JS consumer에 TS transpilation을 요구하지 않는다. +- Theme 미연결: 승인된 scope 기본 스타일 제공 vs Theme 필수 연결 중 **TBD**다. 어느 정책이든 HTML/React가 같아야 한다. approved 기본값 없이 fallback 팔레트를 새로 만들지 않는다. + +Root의 기존 build script는 두 패키지만 처리하므로 새 Core·Wrapper build 연결 범위는 승인 후 확정한다. 엔진 CommonJS/UMD를 ESM·browser bundle로 변환할 수 있는지, export 기능 dependencies가 필수로 포함되는지, DOM-only engine와 adapter의 tree-shaking 가능성은 **NOT VERIFIED**다. 단순히 빌드 설정을 제안했다는 이유로 배포 가능 PASS를 내지 않는다. + +Vanilla Theme를 위해 Core dependency/peer에 React peer를 가진 `@hm-design/ui` 전체 package를 필수로 추가하지 않는다. 승인된 호스트 asset/별도 Theme 산출 경로에서 React 미설치 consumer 동작을 확인한다. Core/engine CSS 누출, 호스트 Theme의 전역 영향, 전달된 font의 상대 URL은 서로 다른 검증 대상이다. + +Theme owner는 호스트 하나이며 Core는 scope를 상속한다. 별도 Scoped Theme는 기존 `[data-hm-theme]` mapping 재계산·Scoped partial Default 의미를 따르고 Core가 자동 주입/reset하지 않는다. Global A/Scoped B의 두 instance가 서로 영향을 주지 않는지 확인한다. + +## 7. 최소 통합 검증 계획 + +동일 가상 fixture·공통 설정·Theme로 두 환경을 비교한다. 테스트가 확인해야 할 차이를 명시하고 같은 검사 반복을 피한다. + +1. React 설치 없는 HTML 단독 페이지에서 표시. `file://` classic bundle과 HTTP(S) ESM의 asset/console 결과를 각각 기록. +2. React에서 같은 Core로 동일 계층·노드 UI·인터랙션 표시. 새 렌더링 엔진이 없는지 dependency/code 검토. +3. 같은 JSON의 조직 ID·parent·순서·leader·직원 그룹과 공통 집계 결과 일치. +4. 조직 추가/삭제/이동·직원 이동/상태/관계사/사진·title/기준일 변경 후 재검증과 갱신. consumer 원본 객체를 바꿔도 이미 캡처/반영한 스냅샷과 집계가 암묵적으로 바뀌지 않음. +5. JSON → Mock API Source → JSON 전환, API 매핑 계약·loading/error·응답 경쟁·abort 확인. +6. HM Theme 연결 및 승인된 Theme 미연결 정책. computed Variables·node CSS·font·scope가 두 환경에서 일치. Global A + Scoped B + 두 instance의 독립성·Theme owner와 cleanup도 확인. +7. mount/update/reload/destroy·연속 remount·StrictMode·다중 instance에서 이벤트/Observer/timer/DOM 잔존과 늦은 callback 확인. +8. CSS 전역 충돌과 390/768/1280/1440px Overflow·키보드·focus·읽기 가능성 검증. +9. Core build·npm/ESM/browser bundle·CSS/type/license와 React dependency 미포함 검증. +10. 공식 운영 main·기존 UI/Theme/Storybook과 무관 파일 보존 증거. 코드 중복·공통 Core 재사용 검토. + +Vue/Angular 실행 검증은 여기 포함하지 않는다. 기술 제약·승인 게이트는 [Implementation Plan](implementation-plan.md)을 따른다. diff --git a/docs/org-chart/implementation-plan.md b/docs/org-chart/implementation-plan.md new file mode 100644 index 0000000..1b66208 --- /dev/null +++ b/docs/org-chart/implementation-plan.md @@ -0,0 +1,110 @@ +# OrgChart Implementation Plan + +상태: 설계 검토 후 수행할 개발 계획. **이번 작업은 Markdown만 작성하며 구현을 시작하지 않는다.** 1차 공식 개발 대상은 Vanilla HTML/JavaScript와 React다. Vue·Angular·기타 framework는 제외한다. [README](README.md)의 요구사항 추적과 [Framework Integration](framework-integration.md)의 통합 검증을 따른다. + +## 1. 단계별 계획과 완료 조건 + +### 1단계 — 설계 승인·핵심 기술 PoC + +사용자가 이 문서를 검토한 뒤 후속 개발 권한을 확인한다. Core/React Wrapper 두 패키지 분리안과 실제 workspace/build 연결 범위를 결정한다. engine 배포 버전을 고정하고 native DOM·module import·custom node·완전 cleanup·CSS scope를 소규모 PoC로 확인한다. 캡처가 제공되면 콘텐츠 8영역·허브·곡선·카드 배치를 대조한다. + +완료 조건: 정확한 engine version/tag/배포 artifact·license와 dependency 범위가 기록됨; React 없는 HTML 구동 가능성, Destroy·다중 instance·custom node 가능성 근거 확보; node Theme mapping·미연결 정책·모바일 선택의 승인 필요 범위가 구분됨. 완전 정리가 불가능하면 기능 구현을 확대하지 않고 차단 사항·대안을 보고한다. 이 기술 PoC는 뒤 단계의 전제라 필요한 최소 중간 검증에 해당한다. + +### 2단계 — 공통 데이터 계약·Validation·집계 + +Schema 초안의 필드/enum/null/version/root/leader·복수 소속과 집계 정책을 승인하고 순수 JS/TS 데이터 계층을 구현한다. JSON Mock/외부 JSON Source와 공통 validator를 만든다. API 명세 없이 Mock API Source로 교체 계약을 확인한다. + +완료 조건: 원본 ID 모델·동일 Source Interface; 중복 ID/참조/cycle/상태/관계/안전 입력 실패가 controlled issue로 변환됨; 승인된 집계 정책으로 단일 ID·하위 포함·상태/관계사 이동이 결정적 결과를 생성함. 미승인 정책은 code default로 숨기지 않음. UI·framework 의존 없이 사용할 수 있음. + +### 3단계 — Vanilla Core와 콘텐츠 + +승인한 패키지/build 구조에서 engine adapter, DOM 노드 UI, 제목·허브·summary·상태/관계사 영역을 구현한다. mount/update/reload/destroy, Source 경쟁·취소·instance scope·Core CSS·Theme 연결을 구현한다. Overlay/Layout은 PoC와 승인한 디자인만 구현한다. + +완료 조건: Core에 React import 없음; API endpoint/Navigation/로그인 의존 없음; 데이터만 변경해 조직·직원·relation·제목 갱신; 승인 정책의 집계; 요청된 인터랙션·사용자 상태·정리 보장; HTML 단독 배포 예시의 runtime 목표 명확. 임의 추가 검색/Export/메뉴/drag 편집은 없음. + +### 4단계 — React Wrapper와 콘텐츠 Storybook + +Wrapper는 Core 생성·ref·props 전달·Source 변경·언마운트 cleanup만 연결한다. 동일 Core UI와 CSS를 사용하고 Storybook은 콘텐츠 단독으로 구성한다. 기존 Component/Pattern/Theme/대표 Story는 보존한다. 현 [Storybook main](../../.storybook/main.ts)의 glob은 `src/**/*.stories.ts(x)`이며 패키지 내부 Story는 자동 포함되지 않는다. `src/org-chart/*.stories.tsx`는 제안 위치다. + +완료 조건: engine/Validation/집계/노드 UI 중복 없음; 데이터 변경·StrictMode·unmount 시 동일 Core 계약 준수; 모든 Story는 가상 데이터만 사용; Header/Dashboard/신규 페이지 조합 없음. 지원 Props와 stale response 동작을 명시함. + +### 5단계 — 배포·최종 통합 검증 + +npm/ESM/browser bundle·CSS·`.d.ts`와 license·asset·dependency 포함 범위를 실제 build와 consumer에서 확인한다. §3의 최종 검증을 변경 최종 상태 기준으로 한 번 종합 실행한다. 실패를 수정한 경우 영향받은 검사만 다시 수행한다. 같은 조건으로 이미 성공한 검사를 형식적으로 반복하지 않는다. + +완료 조건: HTML과 React의 공통 기능/디자인/데이터/집계/인터랙션 일치; 네 컨테이너 너비의 실행 증거; JSON → Mock API 교체; lifecycle/CSS/접근성·asset 결과; build와 browser 결과 별도 보고; NOT VERIFIED·TBD를 감추지 않음; 운영 main 및 요청 밖 파일 보존. 실제 API 지원 완료와 npm publish는 이 단계에서 자동 주장하거나 수행하지 않는다. + +## 2. Storybook 구성 제안 + +최상위 `OrgChart` 콘텐츠 그룹 후보다. 이름·기본 sidebar 대표 Story와 세부 검증 Story 배치는 승인 후 확정한다. 기존 All Story나 navigation Pattern 대표 Story를 교체하지 않는다. + +- Basic OrgChart: 작은 가상 ID 계층, 기본 노드. +- Leader Hierarchy: 최상위/하위 leader, 공석, 허브 처리. +- Organization / Team / Cell: 부문·실·Div·셀·팀, 정렬·다단계 계층. +- Employee Cards: 이름·직위/직책·이미지 실패/fallback·긴 텍스트. +- Summary Table: 직접/하위 포함·직위/상태 집계, 정책 필요 상태. +- Multiple Affiliations: 같은 집계 정책의 관계사별 숫자와 총원. +- Dispatched / On Leave: 상태 변경, 원소속 표시 정책, 중복 카드와 ID 집계 구별. +- Full OrgChart Content: 8개 콘텐츠 영역과 추가 관계. Header·GNB/LNB·Dashboard 전체 조합 제외. +- JSON Data Update: 조직/직원 이동·추가/삭제·상태/사진·명칭·기준일 갱신. +- Mock API Data Source: 같은 fixture의 지연/실패/응답 경쟁, JSON Source 전환. +- Loading / Empty / Error: schema/참조/cycle/정책 오류·제어된 상태. +- Responsive Container: 390/768/1280/1440px와 부모 크기 변경, 다중 instance. + +Storybook은 React Wrapper의 실제 Core를 검증한다. Vanilla 단독 consumer 검증을 Storybook 성공으로 대체하지 않는다. 지원하지 않는 API·인증·직원 개인정보나 verification Story의 부가 기능을 신규 요구로 복사하지 않는다. + +## 3. 최종 통합 검증 + +[Framework Integration §7](framework-integration.md#7-최소-통합-검증-계획)의 10항목을 최종 증거의 공통 기준으로 사용한다. 다음을 관련 항목에 연결한다. + +- 데이터: 모든 Validation 실패 유형·leader/하위 포함/상태/관계사 집계·immutable 원본·같은 입력의 결정적 결과·JSON/Mock API parity. +- HTML/React: 동일 조직 ID/parent/순서/leader/직원 그룹·계산 숫자·노드 UI·Theme·키보드/zoom/확장 상태. Wrapper의 다른 engine 구현 부재와 Core 코드 재사용을 검토. +- lifecycle: data update/reload 경쟁·abort·StrictMode·반복 mount/unmount·destroy 두 번·destroy 후 callback 없음·두 instance의 DOM ID/이벤트/scroll/focus 격리. 이벤트/Observer/DOM 수와 제거 후 동작 증거를 남김. +- lifecycle 재생성: 이전 chart 참조를 잃기 전 handler/Observer 정리, 반복 init/update/reload의 누적 이벤트 검사. facade import와 engine의 DOM global 부작용을 구별하고 지연 로딩 entry를 확인. +- 컨테이너: 네 너비의 캡처·computed style·document/내부 scrollWidth/clientWidth·scrollHeight/clientHeight, 긴 명칭·ID 한 줄 식별·이미지/폰트 로드·absolute 알림 기준·Overlay 좌표. +- 접근성: 이름/label 연결, Tab/Enter/Space/Escape 등 해당 기능 키보드·focus 복귀, disabled/readOnly, screen reader 상태 설명. 실행하지 않은 범위는 NOT VERIFIED. +- 배포: package tarball imports·browser-ready ESM/classic bundle·별도 CSS/타입/상대 asset·React 미설치 HTML·Theme 미연결 승인 정책·CSP/CORS 범위. typecheck/build/browser를 구분하고 통과한 조건만 PASS. +- Theme 배포·소유권: React peer 없는 Vanilla Theme 공급 경로, Core/engine CSS와 호스트 Theme global 영향 구별, 상대 font URL, Global A/Scoped B 두 instance의 computed·Default/partial·cleanup. Wrapper의 별도 summary/state/node 구현 부재 확인. +- 영향: 최종 Git diff·요구사항·관련 docs/Storybook 정합성·불필요한 변경·운영 main/기존 Component/Pattern/Theme 보존. + +관련 TypeScript·build·Storybook 명령은 미래 승인된 package scripts로 결정한다. 현재 package의 `prebuild/pretypecheck`가 생성물을 만들 수 있어 문서 전용 작업에서 실행하지 않는다. + +Guard는 React consumer target이 실제 존재할 때 [Guard 정책](../guidelines/ai-generation-guard.md)의 적합한 범위·files/result로 1회 적용한다. PARTIAL 콘텐츠 검사가 전체 페이지 계약을 대체하지 않는다. Vanilla Core는 React bootstrap 전제와 충돌할 수 있으므로 기존 [Runtime Portability](../guidelines/runtime-portability.md)를 바탕으로 검사 적용 범위를 별도 합의하고 자동 PASS를 만들지 않는다. Guard 원본 status/staticStatus와 Runtime 증거를 구별하고 STYLE의 STATIC/RUNTIME/DESIGN_INTENT/FINAL을 함께 보고한다. 현재 지침을 이번 문서 작업에서 고치지 않는다. + +## 4. TBD 결정 목록과 리스크 + +- **패키지/배포**: 두 package 최종 분리·경로·exports·type·dependency/peer·build 연결·Core npm 이름·browser namespace/format·engine 고정 버전. vanilla용 bare-import 없는 bundle과 React dependency 격리가 필요하다. +- **생명주기**: upstream 완전 disposal·Observer·document 이벤트 해제, 갱신 시 상태/focus/zoom 보존, 옵션 갱신 방식·대용량 전체 rebuild 성능. +- **데이터**: schemaVersion·enum/null/필수 값·ID 범위·root 수·무소속·leader 소속/겸직·관계 방향/중복·복수 소속 계약·정렬 우선순위·안전 입력 상한. +- **집계**: 파견/휴직 포함·재직 정의·조직장 포함·원소속/파견지·직원 ID 중복·관계사/총원 분모. 승인 없이는 숫자를 업무 기준으로 확정하지 않는다. +- **디자인/모바일**: 캡처 자료 미제공, 허브 실체·곡선 Overlay·카드 anchor·노드/그룹 배치·읽기 가능한 최소 폭/배율·zoom limit·모바일 방식·Theme 미연결 정책. computed 일치와 디자인 승인도 구별한다. +- **API/보안**: 실제 endpoint/auth/권한·캐시/재시도·갱신·버전·이미지 권한·개인정보·외부 입력/URL 정책. 명세 없는 부분은 상상해 구현하지 않는다. +- **지침 정합성**: 기존 React/HM 재사용 원칙과 framework-independent 노드의 예외, 공식 일반 수정 경로와 Feature 문서 경로, Guard runtime 전제. README의 차이를 보존하고 작업별 사용자 지시를 우선한다. + +Vue·Angular·기타 framework Adapter는 TBD 개발 범위가 아니라 **이번 범위 제외**다. 미래 별도 요청이 있어야 개발 대상으로 편입한다. + +## 5. 이번 문서 작업의 검증 기록 + +기준 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c`, 경로 `HMDesign-OrgChart`, 브랜치 `feature/orgchart-package`. 최초/최신 추가 요청의 확정 요구를 README에서 추적한다. + +- PASS: 작업 전 Git root/branch/HEAD/origin/운영 Worktree·원격 main/Feature SHA·깨끗한 Working Tree 확인. +- PASS: 현재 workspace·package export·Storybook glob·CSS entry·선택 Component/Pattern·Token 실제 파일 확인. 이는 읽기 전용 구조 확인이며 신규 API/배포 검증은 아니다. +- PASS: 문서 7개에 콘텐츠 독립성·Core/React Wrapper·같은 계약/집계/노드/Theme/인터랙션·Source 교체·페이지 제외·TBD·개발 게이트를 반영. +- PASS: 기존 `node scripts/check-doc-links.mjs` 실행에서 Markdown 118개·내부 링크 620개·problems 0. 신규 OrgChart 문서의 내부 링크는 53개다. 외부 URL 도달성 전체 검사는 포함하지 않는다. +- PASS: JSON code/inline 블록 3개 구문, JavaScript/HTML inline script 2개 구문, 가상 fixture의 required/type/enum/null·ID 참조·parent cycle·raw 수 2/1/1, Schema와 TypeScript 초안의 필드 일치를 읽기 전용으로 확인했다. Schema에 사용한 일부 keyword의 구조 검사이며 완전 Draft 2020-12 validator나 TypeScript typecheck가 아니다. +- PASS: 최종 확인 시 개발 Worktree는 `docs/org-chart/*.md` 7개만 untracked, 기존 tracked/staged diff 0. 운영 Worktree는 깨끗하고 Local/원격 main·Feature SHA는 시작 HEAD 그대로였다. package/lockfile·기존 UI/Theme/Storybook/AGENTS 수정, 설치·새 Worktree·Stage·Commit·Push 없음. +- NOT VERIFIED: 캡처 시각 대조, engine 고정 tag/npm 배포물 동일성, 실행/빌드/HTML bundle/React Wrapper/Theme computed/접근성·반응형·생명주기·실제 API. 구현 전 문서 작업이라 실행 검사 PASS를 내지 않는다. +- NOT VERIFIED: 완전한 JSON Schema validation과 TypeScript compiler/typecheck. 현재 Worktree의 관련 dependency가 없어 설치하지 않았고 필드/구문 확인으로 지원 완료를 주장하지 않는다. +- 적용 대상 없음: 이번 화면 생성 Guard(typecheck/build 포함). React bootstrap·UI 변경 없이 Markdown만 작성하므로 실행하지 않는다. + +이 단계의 최종 산출물은 사용자 검토 대상 설계 문서다. 다음 기능 개발·설치·Stage·Commit·Push는 시작하지 않고 사용자 검토 및 승인을 기다린다. + +## 6. 병렬 읽기 전용 검토 통합 + +사용자 요청으로 분석 작업자 3개를 동시에 사용했다. 각 작업자는 읽기 전용으로 검토했고 문서 작성·수정은 메인 작업자만 수행했다. 기존 링크/fixture 검사는 작업자마다 중복 실행하지 않았다. + +- **엔진 HTML·React 호환성**: 이전 chart를 잃기 전 update/reload cleanup, 문자열 template + createNode 안전 DOM 우선안, DOM global import 부작용·지연 로딩, 우선 두 패키지 표현 통일을 Integration/Architecture/Framework Integration에 통합했다. +- **HM Theme·Token·UI**: React peer 없는 Vanilla Theme 공급, host Theme와 Core/engine CSS 영향 구별, 상대 font, Scoped mapping/Default/owner, Wrapper의 summary/state/node 중복 금지를 Architecture/Integration/UI Composition/Framework Integration에 통합했다. +- **데이터·Validation·API 확장**: fatal data issue와 집계 unavailable/Source 실패의 경계, immutable 스냅샷·최종 revision 확인, 여러 API/페이지의 완전한 동일 기준 스냅샷 조립, 집계 정책 자체 검사·결정적 정렬 조건을 Data Contract/Architecture/Integration/Framework Integration에 통합했다. + +각 검토는 설계·공식 소스의 정적 근거다. 실제 이벤트 누수·빌드·computed·API 일관성이 검증됐다는 뜻이 아니며 해당 NOT VERIFIED를 유지한다. 중복 문서·구현 코드·별도 리뷰 파일은 만들지 않았다. diff --git a/docs/org-chart/implementation-report-p1.md b/docs/org-chart/implementation-report-p1.md new file mode 100644 index 0000000..26ca4ae --- /dev/null +++ b/docs/org-chart/implementation-report-p1.md @@ -0,0 +1,95 @@ +# HMDesign OrgChart P1 결과 — 2026-10-12 + +RESULT: **PARTIAL**. 최종 요청의 독립 디자인·개별 공개 API·5개 Story 메뉴·HTML/React 기능 검증은 완료했다. 원본 Guard의 정적 토큰 추적 FAIL, 실측 흰색 부서명 컬러의 일부 명도 대비 부족, Workdesk 픽셀 일치 미검증은 아래에 보존한다. 전체 디자인 승인 또는 배포 승인으로 해석하지 않는다. + +## 개발 환경과 보존 + +- 실제 수정 경로: `D:\디자인시스템\HMDesign-OrgChart`. +- 기존 브랜치: `feature/orgchart-package`; 새 브랜치를 생성하지 않았다. +- 작업 전/후 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c`. Local `main` 및 기존 `origin/main` ref도 동일 SHA다. Git 쓰기 작업 없이 확인했다. 원격 HEAD는 이번 P1에서 새로 조회하지 않았다. +- 공통 UI/Theme/Pattern, 기존 Wrapper 구현, 원본 JSON v1/v2, 기존 v0.1 구현·React 검증 보고서를 보존했다. 시작 시 기존 package.json/lock 수정 및 untracked 패키지 작업을 유지했다. +- 시작 snapshot 671개 파일과 비교한 요청 범위 밖 변경은 0건이다(`test-results/org-chart-p1/preservation.json`). 기존 main checkout은 접근 제한으로 직접 Working Tree 검증하지 못했다. 그 경로에 수정 명령을 실행하지 않았다. +- 별도 브랜치·Stage·Commit·Push·Merge를 수행하지 않았다. 작업은 미커밋 상태다. `git diff --check` 통과. + +## 병렬 작업과 통합 + +사용자의 최초 P1 병렬 구현 요청에 따라 실제 두 Track을 병렬 실행했다. Track A는 공통 EmployeeCard, 조직별 presentation preset, 정식 로고 mapping, 독립 디자인 변수에 집중했다. Track B는 순수 summary selector, Position/Affiliation/Status DOM 모듈, 독립 Story 및 변경 범위 browser verifier를 담당했다. Main은 공통 controller/Tree/Content 통합, 공개 factory, 실제 Workdesk/Figma 근거 확인, 배포 예제와 canonical Story, 빌드·최종 증거 연결을 담당했다. 책임 파일을 분리했고 공유 파일 충돌은 없었다. 정상 테스트를 두 Track에서 반복하지 않았다. + +## 디자인·콘텐츠 구현 + +1. `OrgChartContent`가 독립 Tree와 Summary를 조합한다. 리더·허브는 조직 트리의 가짜 parent를 만들지 않는다. 기존 organization ID/parentId를 유지한다. +2. 최상위 리더, 조직장, 일반 직원은 같은 Core `createEmployeeCard`를 사용한다. 직위·직책·소속 로고·근무 상태를 표시하며 null/실패 프로필 이미지는 이니셜로 대체한다. React 카드 UI는 추가하지 않았다. +3. 중앙 협업·소통 허브는 `presentation.hubText`로 표시한다. 추가 관계선은 구현하지 않았다. +4. 사업관리·경영기획·인재성장·통합시스템 Div·디자인기획·솔루션영업과 확인된 셀/팀 명칭을 fixture에 사용한다. 6개 branch는 organization ID preset에 연결하고 하위 셀/팀이 variant를 상속한다. fixture membership/leader/직위는 가상 설정이다. +5. 우측 PositionSummary는 organization × position 교차표, 직접/하위 포함 인원, 상태별 Raw Count를 같은 summary/selector에서 계산한다. 좁은 container에서는 표와 트리 각각 내부 스크롤을 제공한다. +6. 하단 AffiliationSummary는 7개 관계사 명칭과 실제 로고, 가상 Raw Count를 표시한다. 0명 관계사 3곳도 표시한다. +7. 파견·휴직은 독립 StatusSummary 안에서 원본 직원 참조로 표시한다. 전체 인원에 다시 더하지 않는다. 각 그룹 flag를 독립 적용한다. +8. 카드·Typography·Spacing·Border·Radius·Gradient는 OrgChart 내부 CSS와 presentation preset으로 관리한다. 공통 HM Token을 필수로 사용하지 않고 Theme가 없는 호스트에서도 표시된다. 전용 public 변수만 외부 override에 사용한다. CSS는 Shadow DOM/내부 shell에 격리된다. +9. Full Composition에 Header·GNB·LNB·페이지 Routing을 추가하지 않았다. Storybook 외부 검증 controls만 기존 공개 HM Button을 사용하며 Core 자체의 Theme 의존성과 구분한다. +10. 같은 fake JSON, validation/normalize/summary/lifecycle, Core DOM/CSS를 HTML과 React가 공유한다. 기존 React Wrapper 구현과 Props API는 변경하지 않았다. + +## 컬러와 로고 근거 + +Workdesk `https://workdesk.hmac.kr/`, 표시 버전 `v1.2610.9c5e`, 2026-10-12 관찰. 6개 visible 조직 heading 부모의 computed background-image와 heading white text를 읽었다. + +- 사업관리 `.h33`: `#194d82 → #1d395c`. +- 경영기획 `.h33.org-team-link`: `#2164a8 → #254975`. +- 인재성장 `.h38.org-team-link`: `#0f6ace → #044a94`. +- 통합시스템 Div `.h310.org-team-link`: `#8c67b6 → #5d3494`. +- 디자인기획 `.h312.org-team-link`: `#09a7a2 → #00847f`. +- 솔루션영업 `.h36.org-team-link`: `#5a963c → #3f7629`. + +부서명 텍스트 실측값은 모두 `#ffffff`. 이는 헤더 측정이며 직원 카드 전체 원본 스타일을 검증한 값이 아니다. 카드 배경, 기본 Typography/Spacing/Radius 및 헤더 시작색을 재사용한 카드 테두리는 DESIGN_ADAPTATION으로 명시했다. 임의 기본값을 공식 Workdesk 값으로 확정하지 않았다. 기존 공통 Theme 값에 억지로 맞추지 않았다. + +정식 로고 7종은 접근 가능한 Figma 파일 `Plr6RRLi5XnLIn60x9aG1s`의 footer `22:179`, logo nodes `22:181/187/193/199/205/211/217`에서 받은 PNG다. `(주)한맥기술`, `(주)삼안`, `(주)장헌`, `장헌산업`, `PTC`, `한라산업개발`, `바론컨설턴트`. affiliation ID로 Core map에 연결하며 같은 자산을 카드·하단 summary·Logo에서 사용한다. 원본 PNG/크기/SHA256/출처는 `packages/org-chart/src/assets/affiliations/README.md`에 기록한다. 임시 Figma URL은 배포에 필요 없고 bundle에 inline된다. 실제 프로필 사진·개인정보는 가져오지 않았다. 로고 미확보 항목은 이 7종 범위에서 없다. 미매핑 ID/파일 오류는 명칭 텍스트 fallback으로 처리한다. + +## 공개 API·파일 변경 + +패키지 root에 `createOrgChartTree`, `createPositionSummary`, `createAffiliationSummary`, `createStatusSummary`, 타입 `OrgChartSummaryComponentOptions`를 additive export했다. 기존 API와 `0.1-draft` schema는 유지한다. Summary는 `stylesheetUrl` 하나만 필요하며 Tree는 기존 engine/core URL pair를 사용한다. 모든 factory는 기존 OrgChartHandle을 반환한다. 다른 업무 페이지의 container에 각각 mount/update/reload/destroy할 수 있으며 전체 OrgChart나 Header를 요구하지 않는다. [사용법과 override 예시](standalone-components-p1.md). + +- 주요 Core 변경: `core/index.ts`, `render.ts`, `employee-card.ts`, `affiliation-mark.ts`, `style-presets.ts`, `src/index.ts`, `build.mjs`, `vendor.d.ts`. +- 독립 모듈: `org-chart-content.ts`, `org-chart-tree.ts`, `position-summary.ts`, `affiliation-summary.ts`, `status-summary.ts`, `logo-legend.ts`, `department-colors.ts`, `components.ts`. +- 데이터: `content-selectors.ts`와 신규 7개 selector 테스트. 기존 validator/schema/source/aggregation 계약을 바꾸지 않았다. +- 스타일: `design-tokens.css`, `employee-card.css`, `summary-sections.css`, `org-chart-content.css`, `org-chart.css`. 빌드가 모든 내부 CSS를 `dist/style.css` 하나로 inline한다. +- 예제: 가상 `data-p1.json`과 생성기, Theme 없는 `p1.html/p1-classic.html/p1-app.js/p1.css`, React `p1.html/p1.tsx/p1.css`; 기존 examples entry 유지. React Vite input에 P1 entry만 추가했다. +- Storybook: Core component preview, card/internal summary Story, canonical P1 Story. 기존 8개 Story에는 `internal` tag만 추가하여 메뉴에서 숨기고 테스트/내용은 보존했다. 신규 card/status verification Story도 숨겼다. +- 사용자용 OrgChart 메뉴는 **Logo / Department Colors / Position Summary / Affiliation Summary / Full Composition** 5개뿐이다. Department Colors는 실제 swatch/HEX/CSS variable, 카드 배경·직원 텍스트·부서명 텍스트·border/Gradient, OrgChart 전용 여부와 실측/기본값 근거를 표시한다. +- 추가 npm dependency: 없음. 현재 React 19/Storybook 10.6.1/engine 6.0.0을 유지한다. 별도 Summary npm 패키지를 만들지 않았다. + +## 검증 결과와 범위 + +- Core typecheck: 초기 점검 후 Department Colors의 literal union Set 타입 오류를 수정했다. 최종 Core 빌드에 포함된 TS declaration compiler 통과. +- Story/source graph typecheck: `npm.cmd exec -- tsc -p tsconfig.app.json --noEmit` 최종 PASS. +- Core ESM/IIFE/declaration/CSS build PASS. 공개 root import는 DOM 없는 Node에서 정상이고 기존 createOrgChart와 4개 신규 factory 모두 function으로 확인했다. +- 기존 Wrapper typecheck/build PASS. 그 이후 Wrapper 구현은 변경하지 않았다. +- HTML prepare, 별도 React consumer production build, Storybook production build PASS. 500kB chunk와 Storybook plugin timing 경고는 남았으며 오류는 아니다. +- 새 selector 7개 테스트 **7/7 PASS**. 원본 data 테스트/기존 69·79 browser suite를 재실행하지 않았다. +- 최초 신규 browser 검증 **197 checks: 196 PASS / 1 FAIL**. 유일 실패는 개별 meta의 storySort global-only 콘솔 오류였다. 해당 옵션을 제거하고 Storybook만 재빌드했다. +- 오류 및 실제 메뉴 선택 재검증 **4/4 PASS**: 수정된 canonical 5개 iframe 콘솔 오류 0, 실제 manager/sidebar 5개 항목 정확 노출, 내부 검증 그룹 기본 숨김, manager 오류 0. 정상 196개 검사는 반복하지 않았다. 최초 report의 FAIL은 삭제하지 않고 후속 해소 증거로 연결한다. +- Browser Chrome `155.0.8059.39`. HTML/React 가상41명, 18조직, 상태·소속·이동 JSON, 원본 집계/정책 미확정 메시지, group별 표시, keyboard collapse/expand/focus, 긴 이름/직위/직책, null/broken profile, 실로고 로딩·텍스트 fallback, destroy 검증 PASS. +- `390/768/1280/1440px`: HTML/React/Full Composition 문서 overflow·글자 bounds·Navigation 없음 PASS. 트리/교차표 내부 overflow는 의도한 스크롤이다. 전체 6개 branch가 작은 폭에서 한 화면에 모두 보인다는 의미는 아니다. +- Theme 미연결 HTML/React 실제 CSS PASS; host 공통 HM 변수 override에 영향 없음, public OrgChart override 적용 및 다른 instance/page에 영향 없음 PASS. 6개 조직별 Shadow DOM Gradient와 Department Colors legend/실제 카드색 일치 PASS. +- 독립 Summary 3종 및 Tree의 공개 dist API mount/update/destroy PASS. Summary에 engine stylesheet 없고 Tree root leader가 누락되지 않음 확인. +- 로컬 첫 브라우저 접근은 sandbox `ERR_NETWORK_ACCESS_DENIED`로 검사 전 중단됐다. 승인된 로컬 서버 환경에서 신규 검증을 실행했으며 운영 사이트를 수정하지 않았다. + +증거 파일: `test-results/org-chart-p1/browser.json`, `storybook-console-recheck.json`, `preservation.json`, `contrast.json`, `storybook-build.log`; HTML/React/Full Composition 각 4개 폭 PNG와 `storybook-sidebar.png`. 원본 v0.1/React 보고서·검증 artifacts는 유지한다. + +## Guard·명도 대비·남은 한계 + +Storybook PARTIAL Guard 원본: **status/staticStatus FAIL**, TOKEN-001 3개(`resolved-bg-surface`, `current-border`, `current-gradient`) 및 TOKEN-002 동적 변수 미검증. 최신 menu 파일 재검사도 같은 static FAIL을 보존한다. Guard는 `?url`로 가져온 private CSS를 일반 consumer CSS 적용으로 간주하지 않아 Shadow DOM 주입과 `style.setProperty` 선언을 static graph에서 연결하지 못한다. `resolved-bg-surface`는 `design-tokens.css`, current 변수는 `applyOrganizationStyle`에서 선언하며 실제 렌더의 6개 swatch/card/Gradient와 override 검증은 PASS다. 공통 Theme/Guard를 변경해 이 결과를 숨기지 않았다. 이 정적 FAIL을 Runtime PASS로 덮거나 전체 Guard PASS로 보고하지 않는다. + +Storybook Style: **STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT NOT VERIFIED / FINAL NOT VERIFIED**(Guard 자체 기준). React consumer Guard: **status NOT VERIFIED / static NOT APPLICABLE**, RENDER-002 실제 bootstrap 브라우저 확인 요구; Style **STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT PASS / FINAL NOT VERIFIED**. 관련 브라우저 증거는 위의 별도 결과다. 원본 Guard JSON을 유지한다. 일반 HM React Component style override를 추가하지 않았다. OrgChart 독립 디자인 의도는 사용자의 2026-10-12 최종 지시를 근거로 적용했다. + +흰색 텍스트와 측정 Gradient stop의 WCAG 대비를 계산했다. 일반 텍스트 4.5:1 기준: 통합시스템 시작색 4.44:1, 디자인기획 시작색 2.97:1, 솔루션영업 시작색 3.58:1은 미달한다. 다른 stop은 4.5:1 이상이다. 디자인기획 시작색은 큰 텍스트 3:1 기준도 약간 미달한다. 실측 디자인을 임의로 공식 보정하지 않고 원래 값을 유지했으며 접근성 개선 시 OrgChart 전용 department-color/gradient를 교체할 수 있다. 대비 검증을 전체 AA PASS로 표시하지 않는다. 기본 직원 foreground/흰 배경은 충분한 대비를 가진다. + +Workdesk 최신 화면의 큰 배치와 실제 heading 컬러를 반영했으나 픽셀 일치, 카드 모든 spacing/radius/typography의 Figma 상세 정밀 측정은 NOT VERIFIED다. 실제 조직 parent/leader/membership 및 운영 인원은 Mock의 검증 대상이 아니다. Screen reader speech, 물리 touch, SSR/hydration, heap/GC 완전 회복은 NOT VERIFIED다. 원본이 비활성화한 pan/zoom/drag/export는 추가하지 않았다. 복잡한 협업 관계선·직원 상세·정책 승인 및 실제 HR/API 전환은 P2 범위다. + +## 시간 기록 (KST) + +- Started At: 2026-10-12 10:49:28 KST +- Completed At: 2026-10-12 11:32:48 KST +- Actual Duration: 0시간 43분 20초 +- Estimated Duration: 최초 2–3시간 +- Variance: 예상보다 76분 40초–136분 40초 단축 + +Commit·Push·Merge: **진행하지 않음**. diff --git a/docs/org-chart/implementation-report-p2.md b/docs/org-chart/implementation-report-p2.md new file mode 100644 index 0000000..a1ee550 --- /dev/null +++ b/docs/org-chart/implementation-report-p2.md @@ -0,0 +1,109 @@ +# OrgChart P2 — Depth별 카드와 Workdesk Full Composition + +RESULT: **PASS — 현재 P1 fixture의 조회 전용 Full Composition 수정 범위**. + +실제 조직 계층에 따라 1Depth 조직장만 대형 카드를 사용하고, 2Depth 조직장은 소형 카드로 표시한다. Workdesk 원본 연결선·협업 화살표·장식을 공통 Core에 적용했다. 기존 Guard 미검증과 이전 검사의 FAIL은 이 결과와 별도로 보존한다. Workdesk 전체 픽셀 일치나 모든 데이터 조합의 지원을 뜻하지 않는다. + +## 작업 범위와 보존 + +- 수정 경로: `D:\디자인시스템\HMDesign-OrgChart`, 브랜치 `feature/orgchart-package`. +- Workdesk 원본 `D:\디자인시스템\gpd-workdesk\sample\조직도_v1.3`는 읽기 전용으로 참조했다. 운영 main에는 수정하지 않았다. +- 기존 미커밋 변경은 시작 파일 해시와 비교해 보존했다. 원본 카드 SVG·회사 로고·공통 Theme·Component·Pattern·Storybook 메뉴·독립 컴포넌트 API를 유지했다. +- 직원 41명의 원본 fixture는 변경하지 않았다. 직원 ID·이름·리더 정보·직위·소속·상태·조직 관계·집계 계약도 그대로다. +- Stage·Commit·Push·Merge·Reset·Rebase를 수행하지 않았다. + +## 카드·이름·간격 + +- 변경 전: 하위 조직장도 모두 대형 `leader` 자산을 사용했다. 조회 전용 외부 margin이 후속 직원 margin 규칙에 덮여 실제 헤더↔카드 간격은 0px이었다. +- 변경 후 대표자: 전용 SVG **146×74px** 유지. +- 변경 후 1Depth: 주요 조직장 6명 모두 기존 대형 SVG **146×68px** 사용. +- 변경 후 2Depth: fixture의 기존 조직장 3명 모두 소형 SVG **108×52px** 사용. 다른 일반 직원도 소형 카드를 유지한다. +- 대형 여부는 직책 문자열이나 리더 플래그 단독이 아니라 원본 `parentId` 조상 관계로 계산한다. semantic leader 구분과 직책 뱃지는 보존하며 독립·interactive 화면의 카드 정책은 유지한다. +- 최신 사용자 수정 기준으로 1Depth 외부 간격은 **8px**, 2Depth 이하 헤더↔첫 카드 간격은 **10px**다. 화면의 17개 조직 노드에서 Depth별 간격을 확인했다. +- Storybook 1920px 측정값을 Stage 좌표로 환산하면 1Depth 헤더 Y **254.1875px**, 높이 **36px**, 대형 카드 상단 **298.1875px**다. 6개 외부 간격은 약 **8.000002px**, 하위 조직 간격은 **9.99998–10.00001px**였다. +- Full Composition의 대표자·조직장·직원·파견·휴직을 포함한 렌더 카드 43개의 이름은 모두 **홍 길 동**으로 표시한다. 접근성 이름은 **홍길동**이다. 직위·직책도 요청한 한글 자간 표시를 적용하며 원본 데이터는 변경하지 않는다. +- 확정 Typography·카드 크기·프로필 크기와 직위↔이름 내부 gap **0px**를 유지했다. 외부 헤더 간격과 내부 행 간격을 분리했다. + +## Workdesk 원본 디자인 적용 + +- 활성 compact `screenD` 곡선 3개, 대표자↔허브 중앙선, 실제 헤더 상단 중앙을 따라가는 사업관리 곡선의 **SVG Path 5개**를 적용했다. 사업관리 곡선은 원본 renderer의 계산식을 사용한다. +- Stroke `#45639F`, width `0.893023`, dasharray `1.79 1.79`, fill `none`을 사용한다. 기존 상단 pseudo 연결선은 해당 원본 artwork preset에서 숨겨 중복을 제거했다. +- 원본에서 하위 조직 SVG 블록은 비활성 상태이며 현재 사용 가능한 별도 원본 Path가 없다. 하위 셀·팀은 기존 엔진의 실제 계층 경로를 보존하고 원본 점선 스타일을 적용했다. 원본에 없는 관계를 추가하지 않았다. +- 협업 화살표는 원본 PNG 4종으로 **5개**를 배치했다. 원본 SVG image 방식과 `preserveAspectRatio="none"`을 유지한다. +- `Group.svg`, `bg_sky.png`, `bg_main.png`, `Frame2@3x.png`, `1-8-4x-1@2x.png`와 화살표 4종, 총 **9개 자산**을 복사했다. SHA-256이 Workdesk 원본과 모두 일치한다. +- `?inline` import로 Core ESM/IIFE에 자산을 포함해 외부 Workdesk 서버 의존성을 제거했다. HTML·React·직접 열기 classic에서 동일한 자산을 사용한다. +- 장식 0, SVG 선·화살표 4, 조직 7, 허브 12, 통계 18, 파견·휴직 32, 대표자 35의 레이어를 구성했다. 전체 artwork는 카드와 같은 Stage 안에서 함께 축소된다. +- 우측 조직별 총인원, 좌하단 파견·휴직의 가로 2개 그룹, 하단 관계사 한 줄 현황을 유지한다. 독립 PositionSummary의 상세 교차표 기능은 보존했다. + +## HTML·React·Storybook과 반응형 + +- HTML `p1.html?mode=readOnly`, 직접 열기 `p1-classic.html?mode=readOnly`, React `p1.html?mode=readOnly`, 기존 Full Composition Story가 같은 Core DOM/CSS를 사용한다. +- React 예제에 HTML과 같은 `mode` query 처리를 연결했다. 별도 React 노드 UI를 만들지 않았다. +- 기준 Stage **1920×914.5px**와 기존 폭·높이 기반 단일 비례축소를 유지한다. 작은 화면에서 카드 종류를 바꾸거나 조직을 재배열하지 않는다. +- 1920×1080: scale **0.983333**. +- 1440×900: scale **0.733333**. +- 1280×800: scale **0.650000**. +- 768×1024: scale **0.383333**. +- 390×844: scale **0.186458**. +- 네 진입 경로의 조직·카드·간격·통계·자산·축소 측정값이 일치했다. Storybook의 베이지 호스트 배경과 HTML의 흰 배경 때문에 바깥 배경 톤은 다르다. +- 390px에서도 구조 전체가 함께 축소되지만 글자는 매우 작다. 모바일에서 원본 크기 가독성을 제공한다는 의미는 아니다. + +## 검증과 근거 + +- OrgChart Core·React Wrapper Typecheck: **PASS**. +- Core ESM/IIFE·타입·CSS 및 Wrapper Build: **PASS**. +- React 소비 예제 production Build: **PASS**. 약 2.53MB chunk 경고는 원본 이미지 inline 포함에 따른 것으로 남겨 두었다. +- 현재 Storybook dev **6041**의 Full Composition: **PASS**. 전체 Storybook production Build는 이번에 재실행하지 않았다. +- Chrome `155.0.8059.39`, 네 진입 경로·다섯 뷰포트의 P2 브라우저 검사: **484/484 PASS**, 새 console/runtime 오류 **0**. +- 대표자·Depth별 카드 크기, 실제 조상 Depth, 17개 조직의 외부 간격, 이름·직책 뱃지·원본 fixture 보존, Stage geometry·overflow, 카드·헤더·화살표·통계의 사각형 겹침을 확인했다. +- Tooltip 검증은 실제 표시된 홍 길 동 이름 1개의 폭을 일시적으로 **8px**로 제한해 overflow를 유도했다. 실제 hover·tooltip hover·키보드 Tab·Escape·focus 유지·숨김 scroll extent·복구를 확인하고 폭을 원복했다. fixture나 표시 이름을 검증용 긴 이름으로 바꾸지 않았다. +- 1920/1440/390px HTML·Storybook PNG를 육안 확인했다. 실제 텍스트 glyph 충돌과 화살표의 카드 침범은 발견하지 않았다. 확정 내부 gap 0에서 Noto 글꼴의 DOM Range ascent/descent envelope가 교차할 수 있으므로 해당 원시 측정값은 실제 glyph 충돌과 구분해 보존했다. +- 곡선 Path의 bounding box만으로 실제 곡선 겹침을 판정하지 않았다. 라우팅·레이어는 저장된 전체 화면 캡처로 확인했고 자동 곡선 충돌 검증은 **NOT VERIFIED**다. + +증거 파일: + +- [P2 browser 결과·측정값](../../test-results/org-chart-p2/browser.json). +- [기존 소스 변경 범위](../../test-results/org-chart-p2/source-changes.json), [시작 해시](../../test-results/org-chart-p2/source-baseline.json), [원본 자산 SHA 비교](../../test-results/org-chart-p2/asset-preservation.json). +- [Storybook 1920](../../test-results/org-chart-p2/storybook-1920x1080.png), [1440](../../test-results/org-chart-p2/storybook-1440x900.png), [390](../../test-results/org-chart-p2/storybook-390x844.png). +- [HTML 1920](../../test-results/org-chart-p2/html-1920x1080.png), [1440](../../test-results/org-chart-p2/html-1440x900.png), [390](../../test-results/org-chart-p2/html-390x844.png). +- [Storybook Full Composition](http://127.0.0.1:6041/?path=/story/orgchart--full-composition), [독립 iframe](http://127.0.0.1:6041/iframe.html?id=orgchart--full-composition&viewMode=story). + +## Guard·기존 FAIL·미검증 + +- React 소비 예제에 PARTIAL Guard를 실행했다. 원본 `staticStatus=NOT APPLICABLE`, `status=NOT VERIFIED`, `RENDER-002`를 보존한다. +- `styleEvidence`: STATIC **PASS**, RUNTIME **NOT VERIFIED**, DESIGN_INTENT **PASS**, FINAL **NOT VERIFIED**. Guard CSS checks는 `[]`이며 Core Shadow CSS를 검사 범위에 포함하지 못했다. 이를 Core 스타일 전체 정적 PASS로 확대하지 않는다. +- [Guard 원본](../../test-results/org-chart-p2/guard-react.json)과 실제 P2 브라우저 증거는 별도 파일로 보존하며 Runtime PASS로 원본 status를 덮어쓰지 않았다. +- 기존 `verify-p1.mjs` [baseline](../../test-results/org-chart-full-composition/verify-p1-baseline.json)·[after](../../test-results/org-chart-full-composition/verify-p1-after.json)의 **197건 중 145 PASS / 동일 52 FAIL**을 보존하고 재실행하지 않았다. 이전 fixture·root·교차표·내부 스크롤·Typography 기대값 관련 실패와 P2 검사를 구분한다. +- 사용자가 언급한 v0 `verify.mjs` FAIL **9건**은 이번에 독립 확인하지 못했다. 현재 저장된 [v0 report](../../test-results/org-chart-browser/report.json)는 **6건 중 2 FAIL**로, 이 기록만으로 9건을 확정하지 않는다. 검사 삭제나 무조건적인 기대값 PASS 변경은 없다. +- **NOT VERIFIED**: 실제 운영 Workdesk 최신 화면과의 완전한 픽셀 일치, 전체 스크린리더, 자동 곡선/글꼴 ink 충돌 판정, 모든 미매핑 조직·혼합 root 데이터 조합, 전체 Storybook production Build. + +## 변경 파일 + +기존 소스 6개: + +- [render.ts](../../packages/org-chart/src/core/render.ts): 실제 조상 Depth에 따른 readOnly 카드 자산·헤더 역할. +- [employee-card.ts](../../packages/org-chart/src/core/employee-card.ts): readOnly 표시 이름·한글 간격·접근성 이름. +- [status-summary.ts](../../packages/org-chart/src/core/status-summary.ts): 상태 카드에도 동일 표시 옵션 전달. +- [org-chart-content.ts](../../packages/org-chart/src/core/org-chart-content.ts): 대표자 표시와 공통 artwork 조합. +- [org-chart-readonly.css](../../packages/org-chart/src/styles/org-chart-readonly.css): 헤더·카드 간격, 원본 장식·레이어·계층선, 파견/휴직 가로 그룹. +- [React p1.tsx](../../examples/org-chart-react/p1.tsx): HTML과 같은 readOnly query 진입. + +추가 소스·자산·문서: + +- [workdesk-artwork.ts](../../packages/org-chart/src/core/workdesk-artwork.ts): 원본 Path·5개 image 화살표·장식·동적 사업관리 연결선. +- [Workdesk 자산 README](../../packages/org-chart/src/assets/workdesk/README.md) 및 해당 디렉터리의 원본 자산 9개. +- [verify-p2.mjs](../../examples/org-chart/verify-p2.mjs): 기존 검사와 분리된 P2 브라우저 검증. +- 이 보고서와 현재 계약을 반영한 [UI Composition](ui-composition.md), [카드 디자인 2단계](card-design-stage2.md). +- [React 예제 README](../../examples/org-chart-react/README.md): 조회 전용 query와 P2 검증 실행 안내. + +패키지·HTML/React build 산출물과 `test-results/org-chart-p2/` 증거를 생성했다. 이전 보고서·검증 기록을 보존했으며 Commit·Push·Merge는 미진행이다. + +별도 [런타임 증거](../../test-results/org-chart-p2/runtime-evidence.json)에 원본 Guard 해시와 브라우저·시각 검토 상태를 연결했다. 현재 source/contract fingerprint가 원본 Guard와 일치함을 확인했다. 원본 status는 변경하지 않았다. 카드 41개의 직위/뱃지 행 하단과 이름 행 상단 간격도 실측 0px(부동소수점 오차 내)이다. + +## 시간 기록 + +- Started At: 2026-10-12 14:52:51 KST +- Completed At: 2026-10-12 15:15:24 KST +- Actual Duration: 22분 33초 +- Estimated Duration: 약 45~60분 +- Variance: 예상보다 22분 27초~37분 27초 단축 diff --git a/docs/org-chart/implementation-report-p3.1.md b/docs/org-chart/implementation-report-p3.1.md new file mode 100644 index 0000000..811da9f --- /dev/null +++ b/docs/org-chart/implementation-report-p3.1.md @@ -0,0 +1,43 @@ +# HMDesign OrgChart P3.1 — 잔여 디자인 정밀 보완 + +RESULT: **PASS — 요청한 P3.1 변경 범위**. + +집중 브라우저 검사 **486/486 PASS**, 신규 콘솔·런타임 오류 **0건**. 기존 [P3의 732/732 기록](implementation-report-p3.md)은 역사 근거로 보존했고 전체 suite를 재실행하지 않았다. Guard 원본 및 결합 전체 상태는 **NOT VERIFIED**로 유지한다. + +1. **Noto Sans KR**: OrgChart 전용 기본 token에 적용했다. 기존 `public/fonts/NotoSansKR-variable.ttf`를 HTML의 기존 복사 경로와 React bundler 경로에서 재사용하고 Storybook의 기존 HM font-face를 사용한다. HM Theme는 변경하지 않았다. 카드·직위·타이틀·허브·표·관계사·파견/휴직·팝업의 computed family를 확인했으며 네 실행 경로의 대표 9개 텍스트에서 Chrome CDP로 실제 custom-font 글리프 사용을 확인했다. 파일 내부 family 이름은 `Noto Sans KR Thin`, PostScript 이름은 `NotoSansKR`와 가중치별 suffix다. 이는 fallback 글꼴이 아니다. 한국어 Core shell의 `lang="ko"`로 `en` Storybook host와 `ko` HTML의 가운데점 글리프 폭 차이도 제거했다. +2. **1Depth·2Depth**: 1Depth를 20px/700/36px·실제 헤더 36px로 맞췄다. 경영기획 2Depth는 원본 `.hw`의 18px/600/16.9px를 적용했다. 인재성장은 같은 기존 값, 나머지는 20px/700/19.7px를 유지한다. 2Depth 114×30.4px·기존 Gradient·Radius 7.1px·Shadow·정렬을 유지했다. 모든 타이틀↔첫 카드 Gap 8px를 실제 측정했다. +3. **경영진 뱃지**: Full Composition의 `workdeskPresentation`에서 `jobTitle.trim() === '경영진'`인 뱃지 DOM만 생성하지 않는다. 빈 attribute container도 생성하지 않는다. 실제 직위·직책 데이터·팝업·통계는 그대로다. 현재 fixture의 대표자 `position="경영진"`, `jobTitle="실장"`은 유지한다. 따라서 대표자 직위 글자와 표의 `경영진` 열은 정상적으로 남는다. +4. **기타 뱃지·이름**: 실장·팀장·디비전장 등의 원본 뱃지는 유지한다. 이름은 기존 `홍 길 동`, 직위는 표시 계층에서만 공백을 제거한다. JSON을 수정하지 않는다. 기존 fixture에 경영진 직책 뱃지가 없어 대표자/1Depth/2Depth/일반/파견/휴직의 메모리 전용 변형을 별도로 검사했다. 여섯 역할에서 뱃지 미표시·직위 유지, 팝업의 원본 직책 보존, interactive 공통 렌더러의 별도 표시 정책을 확인했다. +5. **허브**: 원본 21px/750/24px·아이콘 20px·Gap 8px·좌우 Padding 22/24px·높이 42px를 유지했다. 기존 상속 `max-width:100%`가 198px 축 폭으로 텍스트를 제한하던 부분을 해제했다. 중심을 X 935에 명시하여 실제 폭 약 219.016px에서도 연결선 축을 유지한다. 기존 말풍선 SVG·배경·곡선은 변경하지 않았다. +6. **사진 없음**: 신규 공통 `person-placeholder.svg` 한 종을 모든 카드에서 같은 inline 자산으로 사용한다. 연한 사각 배경·중립 사람 실루엣이며 실사/원형 아바타/장식 없음. 실제 이미지 우선, 이미지 decode 실패 시 공통 SVG fallback을 확인했다. 승인 카드의 예약 슬롯 36×62/32×56/24×44 및 P3 파견/휴직 28×28을 유지한다. 원본 슬롯 55×76/54×70/38×52는 승인 카드보다 커서 복사하지 않았다. +7. **인원 현황 표**: 기존 표 폭 330px·위치·14px/400/1.15·좌우 조직명 padding 7px·행 19px/합계 20px·정렬·Border를 유지했다. 조직명 열 112px, 경영진 열 46px, 나머지는 잔여 폭을 배분한다. `nowrap`을 적용했으며 모든 셀의 실제 텍스트 Range가 셀 내부 한 줄로 들어가는지 확인했다. 숨김·말줄임·글자 축소 없음. 표 높이는 약 200.375px에서 172px로 줄었다. 가상 41명·조직별/직위별 계산·관계사 바는 보존했다. +8. **변경 파일**: 구현·예제·문서 14개. 재생성된 dist와 전체 해시 차이는 [파일 기록](../../test-results/org-chart-p3.1/source-changes.json)에 있다. + + - `packages/org-chart/src/core/employee-card.ts`, `src/core/index.ts` + - `packages/org-chart/src/styles/design-tokens.css`, `employee-card.css`, `org-chart-readonly.css`, `org-chart-p3-summary.css` + - 신규 `packages/org-chart/src/assets/person-placeholder.svg` + - `examples/org-chart/p1.css`, `examples/org-chart-react/p1.css`, 신규 `examples/org-chart/verify-p3.1.mjs` + - `packages/org-chart/README.md`, `docs/org-chart/ui-composition.md`, `card-design-stage2.md`, 이 보고서 + +9. **화면별 결과**: HTML HTTP·직접 `file://` classic·React production HTTP·실제 Storybook 6041 모두 1920×1080, 1440×900, 1280×800, 768×1024, 390×844에서 PASS. 문서 scroll/client 폭·높이가 같고 모든 카드가 Stage 내부에 들어간다. 모바일은 기존 전체 비례 축소라 글자가 작지만 팝업은 축소하지 않는다. [1920 HTML](../../test-results/org-chart-p3.1/html-1920x1080.png), [1920 Storybook](../../test-results/org-chart-p3.1/storybook-1920x1080.png), [390 Storybook](../../test-results/org-chart-p3.1/storybook-390x844.png)을 육안 검토했다. +10. **HTML·React 동일성**: 네 경로의 카드 내용/좌표/크기·허브 위치/폭·표 내용/폭을 화면별로 비교하여 일치했다. 같은 Core와 SVG를 사용하며 HTML 모방 화면을 만들지 않았다. React Wrapper와 Storybook 소스·사용자 메뉴 세 개는 변경하지 않았다. +11. **회귀·검증**: Core/Wrapper Typecheck, Core ESM/IIFE/타입/CSS build, Wrapper build, HTML prepare, React 소비 production build PASS. 여섯 카드 역할의 데스크톱/모바일 팝업·focus trap·ESC 복귀, 대표자 Enter/Space/닫기, HTML/React의 실제 키보드 그룹 링크 이동을 확인했다. 146×74/146×68/108×52 카드 및 P3 상태 카드 114×54 보존. 상태 카드 114×54와 슬롯 28×28은 이번 도입값이 아니라 기존 P3 측정값이다. 기존 큰 이미지 inline chunk 약 2.54MB 경고는 유지한다. 마지막 들여쓰기 정리 뒤 재빌드한 runtime 파일 73개는 검증 시점과 byte 동일하여 브라우저를 반복하지 않았다. +12. **남은 Workdesk 차이**: 원본 Pretendard 대신 이번 확정 Noto Sans KR을 적용한다. 승인 카드 때문에 원본보다 작은 사진 슬롯을 유지한다. 표 열/행과 인원은 현재 가상 fixture를 따른다. 원본 운영 화면과 완전한 픽셀 일치 및 곡선/글리프 ink 자동 교차 검사는 NOT VERIFIED다. 확장형 Auto Layout/layoutConfig API 없음. +13. **Guard·NOT VERIFIED**: 최종 유효 PARTIAL Guard는 React bootstrap `p1.html`에 실행했다. 원본 staticStatus `NOT APPLICABLE`, status `NOT VERIFIED`, `RENDER-002`를 보존한다. 원본 및 결합 CSS 상태는 STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT PASS / FINAL NOT VERIFIED다. 별도 Runtime은 PASS이며 이름 있는 computed 측정은 PASS이나 Core Shadow CSS 전체의 정적/의도 인증으로 확대하지 않는다. 최초 Guard는 target 기준 result 경로를 중복 지정해 ENTRY/SCOPE 미검증이 발생했다. 해당 실행은 [잘못된 인자 진단](../../test-results/org-chart-p3.1/guard-initial-invalid-result-path.json)으로 보존하고 인자만 바로잡았다. 실제 운영 Workdesk 픽셀 일치, 모든 임의 데이터/테마/브라우저, 스크린리더 발화, 실물 touch, 전체 Storybook production build는 NOT VERIFIED다. +14. **보존·Git**: 작업 경로 `D:\디자인시스템\HMDesign-OrgChart`, 브랜치 `feature/orgchart-package`, HEAD `d18e3c33801e165e17b6d971e2f6198eed483c3c` 유지. Workdesk 원본·운영 main 미수정. JSON·승인 SVG·로고·Workdesk 장식·HM Theme·Guard·과거 검사/보고서·package manifests 등 보존 대상 216개 해시 동일. 시작 시 기존 미커밋 package.json/package-lock.json 및 OrgChart 작업을 보존했다. Stage·Commit·Push·Merge·Reset·Rebase·Force Push 미진행. + +초기 집중 검사 102 FAIL도 [초기 기록](../../test-results/org-chart-p3.1/browser-initial.json)에 남긴다. 다섯 화면의 실행 경로 동일성 실패는 host 언어에 따른 허브 폭 차이였고 `lang="ko"`로 수정했다. 나머지 97건은 기존 상태 카드 크기/slot, `.hw` ID, variable font 내부 이름, fixture에 없는 뱃지에 대한 검사 기준을 정확히 잡지 못한 진단 오류였다. 원본 P3의 기대값이나 FAIL 기록은 수정하지 않았다. + +검증 근거: [최종 browser JSON](../../test-results/org-chart-p3.1/browser.json), [원본 Guard](../../test-results/org-chart-p3.1/guard-react.json), [Runtime](../../test-results/org-chart-p3.1/runtime-evidence.json), [결합 증거](../../test-results/org-chart-p3.1/linked-evidence.json), [runtime byte 동등성](../../test-results/org-chart-p3.1/artifact-format-equivalence.json). + +Workdesk 읽기 전용 근거: `index.css`의 `.hw` 2858–2865, 그룹 헤더 3703–3751, 2Depth 표면 3776–3786, 폭 3884–3899, 허브 2472–2542, 표 1432–1673; `index.html` 255–282 및 `org-dashboard-renderer.js` 1638–1663. P3가 남긴 원본 수치 근거도 보존한다. + +미리보기: [Storybook Full Composition](http://127.0.0.1:6041/?path=/story/orgchart--full-composition). + +작업 시간: + +- Started At: 2026-10-12 16:01:00 KST +- Completed At: 2026-10-12 16:30:44 KST +- Actual Duration: 29분 44초 +- Estimated Duration: 35–50분 +- Variance: 예상보다 5분 16초–20분 16초 단축 diff --git a/docs/org-chart/implementation-report-p3.2.md b/docs/org-chart/implementation-report-p3.2.md new file mode 100644 index 0000000..839410e --- /dev/null +++ b/docs/org-chart/implementation-report-p3.2.md @@ -0,0 +1,73 @@ +# HMDesign OrgChart P3.2 — 카드 Typography·파견/휴직·로고 크기 보정 + +RESULT: **PASS — 요청한 P3.2 변경 범위**. 집중 브라우저 **431/431 PASS**, 정책 측정 보완 **13/13 PASS**, 신규 콘솔·런타임 오류 **0건**. Typecheck·관련 Build PASS. P3.1의 486건 전체 suite를 반복하지 않았으며 기존 보고서·검증 증거 115개 파일을 보존했다. Guard 원본과 결합 전체 상태는 **NOT VERIFIED**로 유지한다. + +## 변경 전후 px + +아래는 실제 Chrome computed style과 Stage 축소 배율을 제거한 크기다. 측정 원본의 소수점 오차는 약 0.0001px 이내이며 아래 정수는 반올림한 값이다. [43개 카드 전체 측정](../../test-results/org-chart-p3.2/before-after-px.json)에 원시 값·컬러·로고 alpha 영역을 남겼다. + +- **1Depth 대형 카드**: 이름 **24→24px**, weight 600·line-height 30px 유지. 직위 **20→18px**, weight 400·line-height 22px 유지. 기존 이름 #071D3A·직위 #797979·letter-spacing 유지. 카드 **146×68**, 사진 **32×56**, 사진↔텍스트 **10px** 유지. +- **2Depth/일반 소형 카드**: 이름 **20→18px**, weight 600·line-height 24px 유지. 직위 **15→15px**, weight 400·line-height 18px 유지. 기존 이름 #323232·직위 #797979·letter-spacing 유지. 카드 **108×52**, 사진 **24×44**, 사진↔텍스트 **4px** 유지. 2Depth의 semantic leader도 동일한 소형 규격이다. +- **대표자**: 이름 **24px/600/30px**, 직위 **20px/400/22px**, 기존 #071D3A/#224387·letter-spacing 유지. 카드 **146×74**, 사진 **36×62** 유지. +- **파견·휴직 타이틀**: **14px/700/20px → 20px/700/19.7px**. 일반 2Depth의 기본 Typography와 같은 CSS 변수 세 개를 공유한다. 전용 회색 Gradient, Border·Shadow·108×24 타이틀 표면은 유지한다. 경영기획·인재성장의 기존 **18px/600/16.9px** 예외는 변경하지 않았다. +- **파견·휴직 직원**: 이름 **13px/700/18px → 18px/600/24px**, 직위 **10px/400/13px → 15px/400/18px**. 일반 소형 카드와 같은 콘텐츠 DOM·Typography 변수·사진 영역·텍스트 좌표·간격을 재사용한다. 이름 #3E4650·직위 #555F6A, 기존 회색 Gradient·Border·Radius·로고 grayscale(1)/opacity 0.72 유지. 이름 아래 별도 상태 문구 없음. +- **파견·휴직 크기 차이**: P3.1 실제값은 카드 **114×54**, 사진 **28×28**이었다. 이번 명시된 최신 요구값인 카드 **108×52**, 사진 **24×44**로 보정했다. 이를 기존 108×52를 그대로 보존한 것으로 표현하지 않는다. 1px Border를 유지하면서 padding을 3px로 조정하여 일반 소형의 4px 사진 원점·32px 텍스트 원점과 일치한다. +- **타이틀↔첫 카드 Gap**: 일반 조직 및 파견·휴직 모두 **8→8px**. 직위↔이름 행 Gap **0px**. +- **Font/name/badge**: Noto Sans KR·기존 호스트 font-face/폰트 파일 유지. 이름은 **홍 길 동**, 직위·뱃지의 글자 사이 공백은 표시에서만 제거한다. 직원 JSON·팝업의 원문 데이터는 변경하지 않는다. + +## 카드 로고 적용 범위 + +렌더링된 43개 직원 카드(대표자 1, 대형 6, 소형 34, 파견·휴직 2) 모두 기존 회사/관계사 PNG를 실제로 표시한다. 원본 SVG·PNG를 수정하지 않고 직원 카드 selector에만 확대를 적용했다. + +- **소형**: 기존 실제 contain 영역 **12×12→18×18px**, 정확히 **1.5배**. 컨테이너는 투명한 1px inset을 포함해 14×14→20×20이다. 카드 기준 image origin **(88, 3)px**. +- **대형·대표자**: 실제 contain 영역 **14×14→21×21px**, 정확히 **1.5배**. 컨테이너 16×16→23×23, image origin **(124, 1)px**. top/right 0으로 옮겨 뱃지와의 여유를 확보했다. +- **파견·휴직**: 실제 contain 영역 **14×14→21×21px**, 정확히 **1.5배**. image origin **(85, 1)px**. 파견의 이전 CSS image box는 14×24였지만 object-fit:contain으로 원본 정사각 로고가 실제 표시된 영역은 14×14였다. 원시 box 높이를 단순 1.5배하는 방식으로 확대하지 않았다. +- 모든 원본은 transparent padding을 포함하므로 이미지 box와 실제 유색 로고 영역은 다르다. 예를 들어 한맥 21px box의 유색 범위는 약 **15.5835×9.5011px**다. **contain 영역과 PNG alpha 영역의 폭·높이 모두 1.5배**를 비교했다. +- 원본 비율 유지, 추가 배경·테두리·그림자 없음. 승인 카드 전체 크기 변경 없음. 로고 alpha 영역과 이름·직위·뱃지·프로필 영역 충돌 **0건**, 카드 밖 잘림 **0건**. 이번 fixture에서 1.5배를 모두 수용하므로 별도 최대 크기 제약은 없다. +- 하단 관계사별 인원 현황의 로고 box·바 전체 좌표·집계 문자열은 이전 측정과 동일하다. 확대 selector는 footer에 적용되지 않는다. + +## 수정 파일 + +기존 파일 **6개**를 변경하고 **2개**를 추가했다. 기존 미커밋 package.json/package-lock.json 및 OrgChart 작업은 보존했다. + +1. [employee-card.ts](../../packages/org-chart/src/core/employee-card.ts): readOnly 상태 카드의 공통 compact 콘텐츠 DOM, 표시 뱃지 공백 제거. 공개 API 변경 없음. +2. [employee-card.css](../../packages/org-chart/src/styles/employee-card.css): 요청 Typography, 일반/상태 공통 스타일, 카드 한정 로고 확대·위치. +3. [org-chart-readonly.css](../../packages/org-chart/src/styles/org-chart-readonly.css): 일반 2Depth/상태 타이틀 Typography 변수 공유, 대형 로고 top 조정. +4. [ui-composition.md](ui-composition.md): P3.2 최신 계약 추가. 과거 절 보존. +5. [card-design-stage2.md](card-design-stage2.md): P3.2 우선 안내 추가. 과거 절 보존. +6. [Core README](../../packages/org-chart/README.md): P3.2 현재 규격·적용 범위 추가. +7. 신규 [verify-p3.2.mjs](../../examples/org-chart/verify-p3.2.mjs): 변경 전 capture, 변경 항목 집중 검사, 정책 측정 보완 모드. +8. 신규 이 보고서. + +관련 Core ESM/IIFE/타입/CSS, Wrapper, HTML example dist, React production dist만 재생성했다. 기존 package manifests/lock·JSON·승인 카드 SVG·로고 PNG·공통 사람 아이콘·Storybook 소스·Theme는 보존한다. 기존 파일 해시와 6개 변경 파일 diff는 [source-changes](../../test-results/org-chart-p3.2/source-changes.json) 및 같은 디렉터리의 diff/에 기록했다. + +## 검증 결과 + +- **PASS**: [집중 브라우저 431/431](../../test-results/org-chart-p3.2/browser.json). HTML HTTP, 직접 file:// classic, React production HTTP, 실제 Storybook의 **1920×1080 / 1440×900 / 1280×800 / 768×1024 / 390×844**, 총 20 captures. 요청 Typography·상태 규격·로고 1.5·카드 크기·Gap·사진 아이콘·집계·하단 로고·경영진 뱃지 미표시를 확인했다. +- **PASS**: 모든 화면의 document scrollWidth=clientWidth, scrollHeight=clientHeight. 모든 카드와 콘텐츠는 Stage 안에 들어간다. 기존 전체 자동 축소 정책을 유지한다. 390px는 기존처럼 전체 비례 축소되어 글자가 작다. +- **PASS**: 대표자·1Depth·소형·파견·휴직 팝업을 네 실행 경로의 데스크톱/390에서 확인했다. 원문 정보·축소하지 않는 팝업·Tab focus trap·ESC 카드 focus 복귀 유지. HTML/React의 1Depth 링크 설정과 실제 Enter navigation 확인. +- **PASS**: 같은 Core의 카드 Typography·위치·크기가 네 실행 경로에서 동일하다. Storybook 사용자 메뉴는 기존 세 개다. Core/Wrapper/Storybook 공개 계약·메뉴를 추가하지 않았다. +- **PASS**: [정책 보완 13/13](../../test-results/org-chart-p3.2/policy-browser.json). 초기 검사 도구의 배경/화살표 selector는 빈 shell/잘못된 attribute를 측정했다. 구현은 그대로 두고 selector만 바로잡아 readOnly·collapse 0·#F5F8FB·연결 path 5·협업 arrow 5를 네 경로의 1920에서 별도 확인했다. 통과한 431건은 다시 실행하지 않았다. +- **PASS**: Core/Wrapper Typecheck, Core ESM/IIFE/타입/CSS Build, Wrapper Build, HTML prepare, React 소비 production Build. 로그는 test-results/org-chart-p3.2/의 typecheck-*.log/build-*.log/prepare-html.log. 기존 inline image chunk 약 2.54MB의 Vite 경고는 유지된다. 신규 브라우저 console/runtime 오류 **0건**. +- **PASS**: 구현 세 파일의 before 대비 코드 검토에서 추가 수정 필요 사항 없음. 실제 [1920 Storybook](../../test-results/org-chart-p3.2/storybook-1920x1080.png), [1920 React](../../test-results/org-chart-p3.2/react-1920x1080.png), [390 Storybook](../../test-results/org-chart-p3.2/storybook-390x844.png) 육안 확인. +- **PASS**: 보존 스냅샷의 기존 **266개 중 260개 동일**, 예정한 **6개만 변경**. Workdesk **45개 모두 동일**, 기존 P3.1 증거 **115개 모두 동일**. JSON·직원 41명·원본 자산 보존. [변경 전 스냅샷](../../test-results/org-chart-p3.2/baseline-preservation.json), [최종 보존 결과](../../test-results/org-chart-p3.2/source-changes.json). +- **PARTIAL / NOT VERIFIED**: [PARTIAL Guard 원본](../../test-results/org-chart-p3.2/guard-react.json)은 staticStatus **NOT APPLICABLE**, status **NOT VERIFIED**, RENDER-002를 유지한다. p1 React bootstrap 소비 graph 검사이며 내부 Core Shadow CSS의 전체 정적 인증을 의미하지 않는다. 원본/결합 CSS는 **STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT PASS / FINAL NOT VERIFIED**. [별도 Runtime](../../test-results/org-chart-p3.2/runtime-evidence.json) 및 [결합 증거](../../test-results/org-chart-p3.2/linked-evidence.json)의 runtimeStatus는 **PASS**, 이름 있는 computed CSS 측정은 PASS다. 원본 미검증을 덮어쓰지 않았다. +- **FAIL**: 최종 요청 범위에서 **0건**. 최초 baseline의 Storybook 연결 실패는 sandbox/server 실행 환경 차이였다. 서버 실행 환경을 맞춘 뒤 baseline 20개 capture를 완료했다. [초기 진단](../../test-results/org-chart-p3.2/baseline-browser-initial-server-isolation.json)은 보존했다. + +## 미해결·검증 한계 + +요청한 fixture의 1.5배 크기 제한이나 구현 미해결 사항은 없다. 다만 임의의 새 데이터/외부 Theme/다른 브라우저, 운영 Workdesk 전체 픽셀 일치, 전체 Storybook production Build, 스크린리더 발화·실물 touch는 **NOT VERIFIED**다. 기존 P3.1 전체 486건을 현재 결과로 재인증하지 않았다. + +PNG alpha bounding box와 텍스트 Range/프로필의 교차는 검사했다. Noto Sans KR의 인접 행 Range 외곽은 line-height보다 커 겹칠 수 있으므로 이를 곧바로 글자 충돌로 판정하지 않았다. 실제 글리프 ink 간 교차를 자동 인증한 것은 아니며 이 항목은 **NOT VERIFIED**다. 대표 화면은 육안으로 읽힘·로고/글자 분리를 확인했다. + +## 작업 시간·Git + +- Started At: 2026-10-12 16:34:08 KST +- Completed At: 2026-10-12 16:51:16 KST +- Actual Duration: 17분 8초 +- Estimated Duration: 25분 +- Variance: 7분 52초 단축 +- 작업 폴더: D:\디자인시스템\HMDesign-OrgChart +- 브랜치: feature/orgchart-package +- 시작/완료 HEAD: d18e3c33801e165e17b6d971e2f6198eed483c3c (동일) +- 원본 Workdesk·운영 HMDesign main 미수정. Stage·Commit·Push·Merge·Reset·Rebase 없음. diff --git a/docs/org-chart/implementation-report-p3.md b/docs/org-chart/implementation-report-p3.md new file mode 100644 index 0000000..b33e392 --- /dev/null +++ b/docs/org-chart/implementation-report-p3.md @@ -0,0 +1,54 @@ +# HMDesign OrgChart P3 — 디자인 및 조회 기능 + +RESULT: **PASS — 보존된 41명 fixture와 P3 변경 범위**. + +HTML·직접 열기 classic·React·실제 Storybook에서 P3 검사 **732/732 PASS**, 신규 브라우저 오류 **0**. 기존 P2·P1 검사를 재실행하거나 기대값을 바꾸지 않았다. Guard의 원본 미검증은 별도로 보존한다. + +1. **P2 대비 수정**: 조회 배경, 하위 연결선, 이름/직위 표시, 직책 뱃지, 타이틀 간격, 하위 조직 제목, 허브, 사진 슬롯, 상태 카드, 조직별 교차표, 관계사 바, 링크, 정보 팝업, 컨테이너 높이 맞춤 및 Storybook 메뉴를 수정했다. 조직 관계·순서·41명 데이터와 승인 자산은 유지했다. +2. **Workdesk 반영**: 읽기 전용 원본 `D:\디자인시스템\gpd-workdesk\sample\조직도_v1.3`의 실제 HTML/CSS/SVG를 확인했다. 배경 `#F5F8FB`, 하위 타이틀의 크기·그라데이션·그림자·글꼴 수치, 직책 뱃지의 팀별 색, 허브 SVG/텍스트, 통계 표 및 관계사 바를 반영했다. [원본 수치·경로 증거](../../test-results/org-chart-p3/workdesk-summary-source-evidence.json)를 보존했다. +3. **카드·타이틀·뱃지·허브**: 대표자 146×74, 1Depth 조직장 146×68, 2Depth 조직장/일반 직원 108×52px 유지. 조회 이름은 `홍 길 동`, 직위와 직책은 원본 문자열이다. 직위와 직책 뱃지를 한 줄에 gap 4px로 놓고 이름과의 gap 0px 유지. 모든 타이틀↔첫 카드 gap 8px. 하위 제목 표면은 114×30.4px이며 부모 팀 색을 상속한다. 허브는 원본 말풍선 SVG, 아이콘 20px/gap 8px, 텍스트 21px/750/24px. 대표자 및 긴 디비전장 뱃지는 동일한 22px 행 내부 하단 정렬로 승인 SVG 우상단 로고와의 충돌을 피했다. +4. **연결선**: 조회 전용에서 엔진의 하위 pseudo 연결선을 숨겼다. 기존 대표자↔허브↔주요 조직 연결 SVG Path 5개, 협업 화살표 5개 및 장식은 유지했다. interactive 연결선·접기 동작은 유지했다. 선을 지우거나 조직 관계를 바꾸지 않았다. +5. **사진/상태**: 사진 없음은 비원형의 빈 직사각형 슬롯으로 표시한다. 실제 직원 사진이나 임의 인물 이미지를 사용하지 않았다. 기존 승인 카드의 예약 너비 36/32/24px를 유지하고 높이를 62/56/44px로 조정했다. 조회 compact 파견·휴직 카드의 이름 하단 상태 문구만 숨기고 그룹 제목과 원본 상태 데이터는 유지한다. +6. **조직별 표 데이터**: 원본 employees에서 `조직 × 직위`를 계산한다. 최상위 직접 소속 1명과 주요 6개 조직의 하위 포함 집계를 분리해 중복 없이 41명. 행 소계는 총괄기획실 1, 사업관리 2, 경영기획 7, 인재성장 7, 통합시스템 10, 디자인기획 10, 솔루션영업 4. 직위 합계는 경영진 1/수석 6/책임 12/선임 11/연구 11. 독립 PositionSummary 공개 API는 유지한다. +7. **관계사 집계**: 기존 회사 로고를 사용한 제목 없는 한 줄 바. 한맥 11, 삼안 11, 장헌 0, 장헌산업 0, 피티씨 9, 한라 0, 바론 10, 총 41명. 바 높이 약 55.4px, 로고 39.3px, 글꼴 19.6px 및 원본 간격·그림자 반영. DOM의 43개 카드는 상태 요약 2개 중복 표시를 포함하며 직원 수는 41명이다. +8. **1Depth 링크**: 공개 `organizationLinks?: Readonly>` 옵션을 Core와 React에 추가했다. 원본 조상 관계가 1Depth이며 URL이 지정된 제목만 링크다. 미지정 제목은 일반 제목. HTTP(S)/상대 URL을 지원하며 다른 scheme·credentials는 거부한다. 기본 실제 URL은 넣지 않았다. 검증에서만 로컬 증명 경로를 사용해 실제 이동·키보드·focus 및 카드 이벤트 분리를 확인했다. +9. **직원 팝업**: 대표자/1Depth/2Depth/일반/파견/휴직 카드 click·Enter·Space로 조회한다. 기존 데이터의 이름·직위·소속·직책·관계사·상태만 표시한다. 닫기/ESC/focus trap/원래 카드 focus 복귀 확인. 팝업은 Stage 밖 native dialog top layer로 표시되며 transform 없음, 데스크톱 폭 420px/390px 화면 폭 358px. 공개 `onEmployeeClick(employee, context)` 지정 시 기본 팝업 대신 호출한다. React callback의 최신 값과 동시 이벤트를 검증했다. 기존 tooltip은 팝업 직전 정리한다. +10. **Scale/Overflow**: 기준 디자인 1920×914.5px. 실제 host·조상 높이·padding·max-height와 viewport를 사용하며 임의 Header 48px 차감 없음. 네 경로 모두 같은 측정값이며 문서 client/scroll 폭·높이 동일, 카드/주요 영역 사각형 충돌 및 Stage 밖 콘텐츠 0건. + + - 1920×1080: scale 0.9833333333, Stage 1888×899.2584px, 문서 1920×1080. + - 1440×900: scale 0.7333333333, Stage 1408×670.6334px, 문서 1440×900. + - 1280×800: scale 0.6500000000, Stage 1248×594.4250px, 문서 1280×800. + - 768×1024: scale 0.3833333333, Stage 736×350.5583px, 문서 768×1024. + - 390×844: scale 0.1864583333, Stage 358×170.5161px, 문서 390×844. + - 추가 높이 조건: 1920×650 scale 0.6754098256, Stage 높이 617.6623px. 고정/max-height 400px host scale 0.4371584574, Stage 높이 399.7814px. 재부착된 400px host의 외부 20px/내부 12px padding에서 가용 높이 336px, scale 0.3672130903, Stage 높이 335.8164px. + + Stage의 layout scroll extent는 transform 전 1920×915px로 남는다. 실제 변환된 모든 콘텐츠 경계가 가용 영역 안에 들어오는 것을 별도로 확인했으므로 `overflow:hidden`만으로 잘림을 숨긴 결과가 아니다. offsetHeight 915는 CSS 높이 914.5의 정수 반올림이며 높이 계산은 소폭 안전 여유를 둔다. + +11. **Storybook**: 사용자 메뉴는 `Logo · Personnel Summary` / `Department Colors` / `Full Composition` 3개. 통합 페이지에서 기존 Logo·PositionSummary·AffiliationSummary Core를 각각 렌더링한다. 기존 독립 검증 Story는 internal로 보존했다. 실제 6041 index·manager·페이지를 확인했으며 메뉴 통합과 Full Composition 배치는 분리했다. +12. **수정 파일**: 기존 소스/문서 27개와 신규 구현·검사·보고 파일은 아래 목록. 재생성된 dist 및 정확한 시작 해시 차이는 [전체 파일 기록](../../test-results/org-chart-p3/source-changes.json)에 있다. 기존 package.json/package-lock.json의 미커밋 변경은 추가로 수정하지 않았다. + + - Core: `packages/org-chart/src/core/{employee-card,status-summary,render,types,index,org-chart-content,organization-totals,affiliation-bar}.ts`, `src/index.ts`, `src/styles/{employee-card,org-chart-readonly,org-chart}.css`, `build.mjs`, `README.md`. + - 신규 Core: `packages/org-chart/src/core/employee-info-dialog.ts`, `src/styles/employee-info-dialog.css`, `src/styles/org-chart-p3-summary.css`. + - React: `packages/org-chart-react/src/{OrgChart.tsx,types.ts}`, `README.md`. + - 예제: `examples/org-chart/{p1-app.js,p1.css}`, 신규 `verify-p3.mjs`; `examples/org-chart-react/{p1.tsx,p1.css,README.md}`. + - Story: `src/org-chart/{org-chart-p1.stories.tsx,org-chart-stories.css}`. + - 문서: `docs/org-chart/{integration,ui-composition,card-design-stage2}.md` 및 이 P3 보고서. P1/P2 보고서는 수정하지 않았다. + - 산출물: Core/Wrapper/HTML/React dist, `test-results/org-chart-p3`의 브라우저 JSON·원본 Guard·별도 runtime/linked evidence·진단 이력·캡처·시작/변경 해시. `assemble-evidence.mjs`는 저장된 증거만 연결하며 테스트를 재실행하지 않는다. + +13. **HTML·React 검증**: Core/Wrapper typecheck, Core ESM/IIFE/타입/CSS 및 Wrapper build, HTML prepare, React 소비 예제 production build PASS. 공통 Core의 geometry·표·카드가 HTML HTTP/file classic/React HTTP/Storybook에서 일치했다. Chrome 155.0.8059.39의 5개 화면, 링크/callback/키보드, 6종 카드×2화면×4경로 팝업 48개 측정, 높이 제한 조건을 포함해 **732/732 PASS**. 원본 이미지 inline 때문에 React 약 2.54MB chunk 경고는 유지한다. 실제 테스트는 live Storybook 6041이며 오래된 `storybook-static` 결과를 최종 근거로 사용하지 않는다. +14. **기존 PASS/신규 FAIL**: 승인 SVG·로고·장식·41명 fixture·P1/P2 보고서·기존 검사 등 보존 대상 38개 해시 동일. 관련 interactive/독립 API/공통 Core 회귀는 P3 검사에서 PASS. P2 484건과 오래된 verify/verify-p1 suite 전체는 재실행하지 않았으므로 전체 기존 PASS를 재인증하지 않는다. 알려진 과거 FAIL 기록·기대값을 그대로 보존했다. 초기 P3 522건/63 FAIL과 중간 554건/10 FAIL JSON도 보존했으며 최종 신규 FAIL 0. 제품의 focus 복귀/뱃지 겹침/재부착 host padding 오류 및 검사 환경의 오래된 Storybook 경로·선택자·Chrome 0px letter-spacing 직렬화 근거를 수정했다. 실패를 필터링하지 않았다. +15. **남은 시각적 차이**: 원본 Pretendard Variable 대신 기존 승인 글꼴을 유지한다. 원본 사진 55×76/54×70/38×52는 승인 카드보다 커서 그대로 복사하지 않고 슬롯 크기를 맞췄다. 긴 뱃지 행 정렬은 로고 충돌 방지를 위한 조정이다. 표의 실제 열/행은 현재 fixture를 기반으로 하며 원본 API의 직위 목록은 제공되지 않았다. 긴 `경영진`/`통합시스템 Div` 줄바꿈으로 표 높이는 약 200.375px. 바 폭은 기준 좌표에 맞춰 1806px(원본 약 1805.7px). 최종 Storybook 1920/390 및 HTML 1920 캡처를 육안 확인했다. 모바일은 전체 화면 비례축소로 글자가 작지만 정보 팝업은 축소하지 않는다. +16. **Guard/NOT VERIFIED**: PARTIAL Guard를 최종 React bootstrap에 1회 실행. 원본 staticStatus `NOT APPLICABLE`, status `NOT VERIFIED`, `RENDER-002` 보존. 원본 CSS STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT PASS / FINAL NOT VERIFIED, checks `[]`. [별도 runtime](../../test-results/org-chart-p3/runtime-evidence.json)은 동일 소스·계약 fingerprint와 브라우저 증거 SHA로 연결했다. [결합 증거](../../test-results/org-chart-p3/linked-evidence.json)는 Runtime PASS·명시한 computed CSS PASS이나 Guard의 정적 적용 범위/스타일 미검증 때문에 전체 status NOT VERIFIED를 유지한다. Core Shadow CSS 전체 Guard 인증, 실제 운영 Workdesk 픽셀 일치, 자동 glyph/곡선 교차 검사, 모든 임의 데이터/테마/브라우저, screen reader 발화·실물 touch, 전체 Storybook production build는 NOT VERIFIED. +17. **Git/원본 보존**: `D:\디자인시스템\HMDesign-OrgChart`, `feature/orgchart-package`, HEAD `d18e3c33801e165e17b6d971e2f6198eed483c3c`. Workdesk 원본과 HMDesign main을 수정하지 않았다. 기존 미커밋 작업을 보존하고 Stage·Commit·Push·Merge·Reset·Rebase를 수행하지 않았다. + +검증 근거: [최종 browser JSON](../../test-results/org-chart-p3/browser.json), [1920 캡처](../../test-results/org-chart-p3/storybook-1920x1080.png), [390 캡처](../../test-results/org-chart-p3/storybook-390x844.png), [원본 Guard](../../test-results/org-chart-p3/guard-react.json), [초기 진단](../../test-results/org-chart-p3/browser-initial.json), [중간 진단](../../test-results/org-chart-p3/browser-after-card-fixes.json). + +미리보기: [Storybook Full Composition](http://127.0.0.1:6041/?path=/story/orgchart--full-composition). + +작업 시간: + +- Started At: 2026-10-12 15:19:27 KST +- Completed At: 2026-10-12 15:56:54 KST +- Actual Duration: 37분 27초 +- Estimated Duration: 45~60분 +- Variance: 예상보다 7분 33초~22분 33초 단축 diff --git a/docs/org-chart/implementation-report-v0.1.md b/docs/org-chart/implementation-report-v0.1.md new file mode 100644 index 0000000..8f0192e --- /dev/null +++ b/docs/org-chart/implementation-report-v0.1.md @@ -0,0 +1,72 @@ +# HMDesign OrgChart v0.1 구현·최종 검증 보고 + +RESULT: **PASS** — 이번 요청의 Core/JSON/Vanilla 최소 완료 조건 12개 충족. React Wrapper·Storybook 및 미검증 후속 항목을 포함한 전체 MVP 완료 판정은 아닙니다. + +## 개발 환경과 보존 + +- 작업 경로: `D:\디자인시스템\HMDesign-OrgChart` +- 브랜치: `feature/orgchart-package` +- 작업 전/후 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c` (동일) +- origin(fetch/push): `https://gitea.hmac.kr/b25027/HMDesign.git` +- Local main, 공식 원격 main/Feature도 위 SHA 그대로. 운영 `D:\디자인시스템\HMDesign` Working Tree 깨끗함을 작업 전/후 읽기 전용으로 확인. +- 시작 시 기존 미추적 파일: `docs/org-chart/*.md` 7개. 모두 SHA-256 일치 확인(7/7); 삭제·초기화·전면 수정 없음. +- 기존 `packages/ui`, `packages/center-graphic`, Theme/Token/Storybook/AGENTS 및 Spike 수정 없음. 최종 tracked diff는 루트 package.json·package-lock.json뿐. +- Stage/Commit/Push/Merge 없음. Staged diff 비어 있음. main/운영 프로젝트 수정 없음. +- 수행 방식: Track A(Data), Track B(Core/CSS) 병렬 구현 + 읽기 전용 검토 작업자. Main만 package/export/build/examples와 최종 통합을 수정·관리함. + +## 구현 결과 + +1. 신규 패키지: `packages/org-chart`, `@hm-design/org-chart@0.1.0`. React/React DOM peer·런타임 의존성 없음. +2. 직접 의존성: `orgchart@6.0.0` 고정. upstream 전이 의존성 `html2canvas@1.4.1`, `json-digger@2.0.2`, `jspdf@4.2.1` 및 그 의존성이 lockfile에 추가됨. OrgChart 외 무관한 직접 의존성 추가 없음. export UI는 비활성화하며 export 라이브러리는 브라우저 번들에 포함되지 않음. upstream MIT 고지를 배포 산출물에 포함. +3. Data Contract: 조직/직원/관계사를 ID로 분리하고 문서의 `displayOrder/jobTitle/profileImage/workStatus` 유지. 버전은 문서 초안의 `0.1-draft`. 최신 요청에 따른 최상위 schemaVersion 필수 추가; metadata.schemaVersion은 선택 호환 mirror로 일치 검사. relations/presentation 및 일부 metadata 확장 필드는 선택. 조직·직원 ID namespace는 독립. +4. JSON Source: 객체 또는 주입 URL, 선택 fetch를 지원. 객체는 생성 시 캡처하고 load마다 독립 불변 snapshot 반환. HTTP/JSON/취소 오류를 구별하고 서버 원문을 노출하지 않음. 기본 native fetch를 globalThis에 바인딩. 외부 JSON은 HTTP에서 검증; file:// 예제는 inline JSON 사용. +5. Validation: 필수 값·타입·버전·날짜·중복 ID·참조·parent cycle·leader/관계사·상태·관계·presentation·위험한 HTML/이미지 URL 검증. 구조화된 code/path/message 반환. 외부 문자열은 textContent로 렌더링하고 engine ID는 내부 prefix+숫자로 생성. +6. Summary: 고유 직원 ID 기준 raw total, 조직 direct/inclusive, 직위·관계사·상태 집계. 조직 이동/추가/삭제와 표시 옵션 독립성 테스트. 업무상 총원 포함 정책을 기본값으로 숨기지 않으며 미주입은 policyRequired, 미지원 정책은 unsupportedPolicy. 지원 정책 범위는 명시적 primaryOnly·leader 포함 및 유효 상태 목록. raw 숫자는 승인된 재직 총원이 아님. +7. Core: createOrgChart, mount(container?), update, reload(source?), destroy, subscribe, getState. 마지막 시작 revision 우선·AbortSignal·immutable 입력·최종 commit 검사·재진입 callback 방어. mount 중 CSS load/error를 확인. 요청 및 data 실패는 error state, 잘못된 호출 순서는 사용 오류. destroy는 동기·반복 안전·terminal. +8. Node UI: 조직·부서, 조직장·직원, 이름·직위·직책·상태, 사진/fallback, 원본 조직별 인원. 계층 연결선과 native 버튼 키보드 확장/축소. 여러 root는 독립 엔진으로 실제 조직 관계를 보존. 갱신 시 확장 상태는 초기화; 제거된 focus는 viewport로 복귀. +9. Theme: 호스트의 기존 HM Theme 변수/폰트를 상속. node와 연결선은 기존 Semantic 변수, radius/font 사용. Shadow DOM 안에 upstream engine.css와 전용 style.css를 로드하여 전역 selector 누출 방지. 예제 Theme 산출물은 실제 공개 CSS Entry에서 생성하고 기존 폰트/OFL을 포함; 독립 유지되는 Theme 복제본 없음. +10. Export: ESM index.js + index.d.ts, style.css, engine.css, classic browser subpath. IIFE는 window.HMOrgChart. 브라우저 번들에 unresolved bare import 없음. stylesheets의 실제 URL을 호스트가 stylesheetUrls로 주입해야 함. +11. 예제: `examples/org-chart/dist/index.html`(HTTP ESM/외부 JSON), `classic.html`(직접 열기/Classic inline JSON). build outputs/public Entry만 소비하며 Spike 코드 참조 없음. reload·이동/추가 update·destroy·새 instance 생성 controls. 가상 조직·직원만 사용. + +## 최종 검증 + +- **PASS** TypeScript: `npm run typecheck --workspaces --if-present` — OrgChart/UI/Center Graphic 모두 통과. root 앱 production build를 실행한 결과로 해석하지 않음. +- **PASS** Package Build: ESM 123.50 kB(gzip 29.36), IIFE 126.34 kB(gzip 29.55), 선언/CSS/license 생성. +- **PASS** 데이터 테스트 22/22: 계약/참조/순환/URL/정책/추가·삭제·이동/중복 방지/불변성/취소·늦은 응답/native fetch receiver 회귀. +- **PASS** Chrome 155.0.8059.39 실제 브라우저 검사 69/69: HTTP ESM + file:// Classic 각각 mount/custom node/summary/reload/update; 네 너비 document overflow·내부 scroll geometry·HM color/font/radius·1줄 ID·Theme 연결선 정렬; keyboard Enter/Space·focus 복귀; depth-3 확장 state; 두 instance/Scoped Theme; source/validation error·latest revision·reentrant destroy·late callback 차단; 5회 mount/reload/destroy 자원 안정성. Console/runtime errors 0. +- **PASS** Destroy 관찰 범위: 전용 DOM 제거·호스트 sibling과 다른 instance 보존·chart observer 0·전역 listener 수 안정·요청 abort·destroy 이후 callback 0. Playwright 자체 observer/listener를 chart 자원과 구분함. 전체 heap 회수를 판정한 결과가 아님. +- **PASS** npm tarball consumer: 실제 tarball 추출, DOM 없는 public ESM import, public CSS/browser export, 엄격한 NodeNext 타입 소비(React types 없음), fixture validation/summary. React가 미설치된 사용자 npm 환경에서 새로 dependency install하는 테스트까지 수행한 것은 아님; HTML은 React를 로드하지 않음. +- **PASS** 기존 main/설계 문서/패키지 소스 보존, Git diff --check, 문서 링크 검사(119 files/620 links/problems 0). +- **NOT VERIFIED** AI Guard 원본 status/staticStatus/runtimeStatus. 1회 PARTIAL 실행에서 ENTRY-001/SCOPE-001, checkedFiles=[]: Vanilla package가 React consumer graph 전제에 포함되지 않음. Guard/Theme/Component 규칙 수정 없음. 원본 styleEvidence는 STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT PASS / FINAL NOT VERIFIED, checks=[]이며 비어 있는 검사 PASS를 디자인 승인으로 사용하지 않음. +- 별도 CSS 증거: 실제 선언 존재 확인 PASS, 위 제한된 browser computed·overflow/interaction PASS. **DESIGN_INTENT와 FINAL은 NOT VERIFIED**: reference 디자인 승인·전체 시각 parity를 주장하지 않음. + +검증 증거: `test-results/org-chart-browser/report.json` 및 HTTP/file:// 네 너비 PNG, `test-results/org-chart-consumer/report.json`, `test-results/org-chart-preservation.json`, `test-results/org-chart-pack.json`. 이 생성물은 Git ignored이며 source test harness는 보존함. + +## 변경 내역 + +- 수정: `package.json`(6개 OrgChart 실행 scripts), `package-lock.json`(workspace link와 upstream dependency graph). 이미 등록된 packages/* workspace는 변경하지 않음. 기존 @babel/runtime의 dev 표시 제거는 새 production 전이 dependency 영향이며 버전 교체가 아님. +- 신규 패키지: package.json, README.md, tsconfig.json, tsconfig.build.json, build.mjs, test.mjs, src/index.ts; data/{types,index,validate,normalize,summary,snapshot,source,data.test}.ts; core/{types,index,engine,render}.ts, core/vendor.d.ts; styles/org-chart.css. +- 신규 예제: index.html, classic.html, app.js, demo.css, data-v1.json, data-v2.json, prepare.mjs, serve.mjs, verify.mjs, verify-package.mjs, create-fixtures.mjs. +- 신규 보고서: 이 파일. 기존 7개 설계 문서는 수정하지 않음. +- dependency install은 초기 sandbox DNS 실패 후 승인된 실행으로 완료. npm cleanup에서 ignored node_modules 일부 EPERM 경고가 있었으나 설치 exit 0이며 후속 typecheck/build/runtime 모두 통과. +- 공식 tag 웹 조회는 실패했으므로 npm 6.0.0 배포물과 특정 upstream git tag의 byte 동일성은 **NOT VERIFIED**. 설치 manifest와 lock integrity를 기준으로 버전을 고정함. + +## 설계 정합성과 후속 작업 + +- Architecture/Framework Integration의 공통 데이터→검증→ViewModel→engine→DOM 및 terminal lifecycle 유지. 공개 target snippet에 필요한 CSS URL 계약 추가와 schemaVersion 위치 변화는 위에 명시. 기존 문서의 구현 전/미착수 상태는 과거 기록으로 보존; 신규 package README/이 보고서가 현재 실행 계약. +- 다중 root는 임의 parent 없이 forest 렌더링. leader cross-organization은 정책 미정으로 LEADER_APPROVAL_REQUIRED. 조직 0개는 오류, 직원 0명은 valid ready. +- hubText/showDispatched/showOnLeave는 reserved 필드이며 별도 허브/상태 영역 UI는 이번 최소 범위에서 구현하지 않음. showEmployees/showSummary/showAffiliations는 실제 지원. 추가 관계는 검증하고 계층선 미포함 안내만 표시; 복잡한 relation overlay 제외. +- pan/zoom/minimap/drag/export 비활성화. 390px은 읽을 수 있는 원래 크기와 내부 가로 스크롤로 표시; 고급 반응형 처리·확장/scroll state 보존 제외. +- React Wrapper는 ref/effect·Props/Source→동일 Core·unmount cleanup만 연결. Validation/집계/engine/node/style 중복 구현 금지. Storybook은 이후 가상 fixture·error/loading·policy·Theme scope·lifecycle 콘텐츠 Story로 구성. +- 기술적 리스크: 6.0.0 내부 init observer hook에 의존하는 managed subclass. 버전 upgrade 전 재검토 필요. upstream anonymous node/transition 이벤트는 제거된 DOM과 함께 GC 가능한 참조가 되며 완전 GC·heap 회수는 **NOT VERIFIED**. 매우 큰 데이터의 성능/깊이 상한·보안 CSP/origin 정책·실제 API/auth·screen reader announcements·reference 시각 일치·Theme 미연결 동작·React runtime은 **NOT VERIFIED**. +- Commit/Push/Merge는 요청대로 보류. 이후 사용자 승인 없이 수행하지 않음. + +## 시간 기록 (Asia/Seoul) + +- Started At: 2026-10-12 10:00:28 KST +- Completed At: 2026-10-12 10:19:19 KST +- Actual Duration: 18분 51초 +- Estimated Duration: 최초 약 2~3시간 +- Variance: 예상 하한 2시간 대비 101분 9초 단축; 예상 상한 3시간 대비 161분 9초 단축 + +예상은 참고값입니다. 기존 PoC/설치 환경 재사용과 병렬 구현으로 실제 시간이 줄었으며 미검증 항목을 PASS로 대체하지 않았습니다. diff --git a/docs/org-chart/integration.md b/docs/org-chart/integration.md new file mode 100644 index 0000000..7bc0188 --- /dev/null +++ b/docs/org-chart/integration.md @@ -0,0 +1,91 @@ +# OrgChart Integration + +상태: 공식 문서·소스 읽기 기반 기술 검토. 설치·실행·번들·브라우저 PoC는 수행하지 않았다. 모든 지원 완료 판정은 **NOT VERIFIED**다. 최신 범위는 Vanilla HTML/JavaScript + React이며 [Framework Integration](framework-integration.md)에서 같은 Core를 연결한다. + +## 1. 엔진 버전·라이선스·근거 + +확정 엔진은 [dabeng/OrgChart](https://github.com/dabeng/OrgChart)다. 별도 프로젝트 `react-orgchart`를 채택한 것으로 해석하지 않는다. 확인일은 2026-10-12(KST)이며 웹 자료는 이후 변경될 수 있다. + +- [공식 릴리스 목록](https://github.com/dabeng/OrgChart/releases)은 6.0.0을 최신으로 표시하고 v6부터 native JavaScript로 전환하여 jQuery 의존성을 제거했다고 설명한다. **6.0.0을 우선 검증 후보로 제안**하되 지원/고정 버전 확정은 아니다. 구버전 jQuery 연동 예제를 그대로 사용하지 않는다. +- 확인한 [master package.json](https://raw.githubusercontent.com/dabeng/OrgChart/master/package.json)의 version은 6.0.0, main은 `dist/js/orgchart.min.js`, dependencies는 html2canvas/json-digger/jspdf다. 이 의존성을 Core의 필수 기능 또는 배포물에서 자동 제외 가능하다고 단정하지 않는다. Export/download는 요청되지 않았으므로 UI에는 추가하지 않으며 transitive bundle 영향은 조사한다. +- [공식 LICENSE](https://raw.githubusercontent.com/dabeng/OrgChart/master/LICENSE)와 manifest는 MIT를 표시한다. 엔진 재배포 시 고지·라이선스 포함을 계획하고 실제 배포 artifact의 라이선스와 transitive 의존성은 별도로 확인한다. +- [README](https://github.com/dabeng/OrgChart#readme), [JS 소스](https://raw.githubusercontent.com/dabeng/OrgChart/master/src/js/orgchart.js), [CSS 소스](https://raw.githubusercontent.com/dabeng/OrgChart/master/src/css/orgchart.css), [데모 index](https://dabeng.github.io/OrgChart/)를 읽었다. 데모를 브라우저에서 실행하거나 화면을 대조하지 않았다. +- v6.0.0 tag의 raw 파일 조회와 release API 조회는 도구에서 실패했다. 따라서 **master 소스와 고정 tag/npm 배포물의 동일성은 NOT VERIFIED**다. 구현 전에 배포된 버전·tag·소스 hash·라이선스를 다시 대조하고 설치 후보를 고정한다. npm registry 배포/ESM entry/type 선언 존재도 아직 확인하지 않았다. + +## 2. 기능·구조 검토와 책임 분리 + +아래는 upstream 문서/소스에 기능 경로가 있음을 확인한 결과이며 HMDesign에서의 동작 PASS가 아니다. + +- **데이터·계층**: README는 JSON/UL 데이터와 `children` 기반 계층을 설명한다. Core의 flat ID 계약을 Engine Adapter가 파생 트리로 변환한다. engine에 UI 데이터를 원본 그대로 넘기지 않는다. +- **커스텀 노드**: `nodeTemplate(data)`와 `createNode(node, data)` 경로가 있다. 읽은 master는 template 반환값을 문자열 결합하므로 Element 반환 지원을 가정하지 않는다. **정적 skeleton 문자열 + createNode callback의 DOM/textContent 구성**을 우선 검토한다. engine edge/계층을 지우지 않고 콘텐츠 전용 자식만 관리한다. 고정 버전의 callback 순서·크기 측정·확장/축소는 PoC로 확인하며 React root를 노드 안에 만들지 않는다. +- **확장·축소**: show/hide parent/children/siblings 계열 API가 문서화돼 있다. 깊은 조직·custom 노드·focus·키보드와 함께 검증한다. +- **pan·zoom**: pan/zoom과 한계 옵션이 있다. CSS transform·touch·wheel·호스트 스크롤·Overlay 좌표 결합은 미검증이다. 기능 노출과 설정 기본값은 PoC 후 확정한다. +- **가로·세로 배치**: direction/verticalLevel/hybrid/compact 관련 문서가 있다. 일부 조합 제약이 안내되므로 모든 조합 지원으로 쓰지 않는다. 가로/세로 스크롤은 콘텐츠 컨테이너 책임과 함께 검사한다. +- **데이터 갱신**: `init`/`setOptions`의 데이터 교체 경로가 있다. 일관성·성능·확장/zoom 상태 유지까지 보장된 것은 아니다. + +JS 소스의 init은 기존 chart DOM을 제거·재생성하고 node 생성은 입력에 parentId를 추가하는 경로가 있다. 템플릿 문자열은 `insertAdjacentHTML` 경로로 삽입되므로 외부 텍스트 직접 주입은 금지한다. Core가 복사한 engine 데이터와 안전한 텍스트/ID를 제공해야 한다. [소스 근거](https://raw.githubusercontent.com/dabeng/OrgChart/master/src/js/orgchart.js). + +같은 소스에 이벤트 해제 함수와 Observer 사용은 있으나 공개 완결 `destroy()`는 읽은 소스/README에서 확인하지 못했다. Core의 Destroy는 **engine API가 아니라 우리가 보장해야 할 facade 계약**이다. 인스턴스 제거만으로 document 이벤트·Observer가 정리됐다고 주장하지 않는다. 소스 검토에서 관찰된 정리 한계는 최초 PoC의 차단 조건이며 필요하면 engine 버전/기능 제한/명시적 disposal 지원 또는 승인된 별도 통합 대안을 검토한다. 이번에는 upstream/기존 코드를 수정하지 않는다. [JS 검토 근거](https://raw.githubusercontent.com/dabeng/OrgChart/master/src/js/orgchart.js). + +여러 인스턴스는 chartClass 관련 문서만으로 격리를 보장할 수 없다. 컨테이너 Element 전달·인스턴스별 DOM ID·container 내부 query·이벤트·focus·zoom을 실제 검증한다. `.orgchart .node .title/.content` 등 upstream CSS의 고정 크기·색상·generic descendant selector가 custom 콘텐츠와 충돌할 수 있다. engine CSS와 Core CSS를 컨테이너 내부로 제한하고 다른 HM 요소를 비교한다. [CSS 근거](https://raw.githubusercontent.com/dabeng/OrgChart/master/src/css/orgchart.css). + +특수 곡선 연결선·중앙 허브·그룹별 자유 카드 배치·교차 조직 relation을 기본 기능만으로 표현할 수 있다는 근거는 확보하지 못했다. **NOT VERIFIED / 별도 PoC**다. 계층 연결선은 engine, 추가 관계는 Relation Overlay, 허브/summary/상태 그룹은 콘텐츠 Layout의 책임으로 나눠 검토한다. fixed 좌표·engine hierarchy 왜곡으로 reference를 맞추지 않는다. + +update/reload도 cleanup 대상이다. master의 pan/zoom 해제 경로는 현재 chart에 저장된 handler를 조회하므로 init 후 이전 handler를 회수하지 못할 위험이 있다. **이전 chart 참조를 잃기 전에** pan/zoom·minimap·관련 observer와 이벤트를 정리할 수 있는지 PoC로 확인한다. 반복 재생성 후 container/document 이벤트 수·응답 횟수 증가를 검사한다. 소스상 위험이며 실제 누수 재현은 NOT VERIFIED다. + +master는 모듈 평가 시 window/document를 참조하는 경로도 있어 DOM 없는 import 안전성을 주장할 수 없다. Core facade·데이터 계층 import를 engine 로딩에서 분리하고 지연 로딩 또는 승인된 변환 entry를 검증한다. native ESM export가 이미 존재한다고 가정하지 않는다. + +## 3. HM Theme 연결 + +Core 노드는 framework와 무관한 동일 HTML/CSS다. React Wrapper가 다른 노드 디자인을 만들지 않는다. Token 정책은 [Runtime Theme](../guidelines/runtime-theme.md), [Token 가이드](../guidelines/테마-토큰-가이드.md), [Runtime Portability](../guidelines/runtime-portability.md)를 따른다. + +확인한 선언은 [default.css](../../packages/ui/src/theme/default.css)의 `--hm-sem-bg-content`, `--hm-sem-fg-primary`, `--hm-sem-fg-secondary`, `--hm-sem-stroke-default`, `--hm-radius-container` 등이다. 노드 surface/상태/연결선의 **최종 매핑은 디자인 승인 전**이며 content 배경 변수를 Card White 면으로 자동 적용하지 않는다. Typography와 spacing은 모든 것이 공개 runtime 입력은 아니다. [card.css](../../packages/ui/src/theme/card.css), [avatar.css](../../packages/ui/src/theme/avatar.css), [table.css](../../packages/ui/src/theme/table.css), [tailwind.css](../../packages/ui/src/tailwind.css)의 실제 규칙을 참고하되 없는 `--hm-spacing-*` 같은 Token을 추측하지 않는다. + +React 호스트는 기존 CSS entry `index.css → hm-theme.css`와 공개 HM CSS 순서를 유지한다. Core CSS는 별도로 연결한다. Vanilla는 browser-ready Theme CSS와 상대 fonts/assets가 필요하며 Tailwind 원본 CSS/bare npm import를 그대로 ``에 넣지 않는다. [Theme-only 배포](../guidelines/theme-delivery.md)의 현재 `theme-dist/themes`는 JSON 산출물이므로 standalone CSS가 이미 제공된다고 오인하지 않는다. + +Core scope는 전용 컨테이너 class 내부로 제한하고 HM 전역 변수 재선언·global reset·HM Component selector override를 금지한다. OrgChart 전용 alias가 필요하면 기존 의미의 변수를 참조하고 scope에서만 선언한다. Theme 없는 환경의 기본 스타일 제공/필수 연결/오류 정책은 TBD다. 임의 fallback 색으로 미정의 Token을 감추지 않는다. 정확한 standalone Theme artifact 경로·포함 범위·CSS import flatten·font 경로는 배포 PoC에서 확정한다. + +Vanilla의 dependency/peer에 `@hm-design/ui` 전체 패키지를 추가해 Theme를 해결하면 React/React DOM/Tailwind peer가 설치 조건에 영향을 줄 수 있다. 승인된 호스트 CSS asset 또는 React peer 없는 Theme 산출 경로를 비교하고 React 미설치 consumer에서 실제 설치·동작을 검증한다. 현재 설치 동작은 NOT VERIFIED다. + +현재 `packages/ui/src/theme.css` 원본은 전체 Component/Pattern CSS import와 절대 `/fonts/` 경로를 포함한다. Core prefix만으로 호스트 Theme까지 scope된다고 주장하지 않는다. Vanilla Theme는 전체 CSS와 필요한 변수·font 제공 범위를 구별하고 상대 font 경로를 확인한다. Core/engine CSS 누출과 호스트 Theme 자체의 전역 영향을 별도로 기록한다. + +Theme 적용/해제의 owner는 호스트다. Core는 제공된 scope를 상속하고 Theme를 자동 주입/reset하지 않는다. 별도 Scoped Theme는 기존 `[data-hm-theme]`에서 mapping을 재계산하는 계약과 Scoped partial의 미지정 값이 HM Default를 쓰는 의미를 따른다. 단순 후손 override로 Global 값을 재계산한 것처럼 간주하지 않는다. Global A + Scoped B + 두 instance의 computed 값·독립성·cleanup을 검증한다. + +## 4. JSON에서 REST API로 전환 + +공통 `OrgChartDataSource.load({signal}) → Promise`은 normalized 계약 후보를 반환한다. JSON Mock·외부 JSON·API adapter는 모두 같은 validator·ViewModel·집계·Core renderer를 사용한다. [사용 예시](framework-integration.md#3-데이터-source-사용-예시)를 참고한다. + +바뀌는 영역: 호스트의 Source 생성/선택, 실제 API client 설정, 원본 응답 매핑, 취소·권한·이미지 접근·향후 캐시/재시도 정책, Source 계약 테스트. 고정 계약과 다른 응답은 API adapter에서 변환한다. + +유지되는 영역: normalized 필드/ID 계약(승인 버전 기준), runtime Validation, 집계 정책과 공통 함수, engine 변환, Core DOM·노드 디자인·Theme CSS, Core facade, React Wrapper의 Props 구조, 콘텐츠 단독 Story. Core나 Wrapper가 서버 URL/원본 필드에 직접 의존하면 완료 조건 실패다. + +실제 API가 생겨 schema를 확장해야 하면 Source 전환만으로 끝나는 것처럼 표현하지 않고 contract migration을 별도 승인한다. Mock API Story는 지연/오류/응답 경쟁을 흉내내는 가상 Source이며 실제 서버·인증 검증으로 보고하지 않는다. + +여러 endpoint/pagination으로 수집하면 Source Adapter가 완전한 collection과 같은 기준의 스냅샷을 조립해 한 번에 반환한다. 부분 페이지·서로 다른 버전의 조직/직원/관계를 Core에 순차 반영하지 않는다. ID 참조 검사를 통과해도 시간 일관성을 입증한 것은 아니다. 서버 일관성·버전 확인·재시도 방법은 실제 API 명세 전 TBD다. + +## 5. API 전환 전 결정 항목 + +실제 명세가 없어 다음은 모두 TBD다: Endpoint·메서드·응답 schema·인증/인가·데이터 권한, 갱신 주기·캐시/만료·재시도/오류 처리, 프로필 이미지 권한/origin/만료, 개인정보 노출/로그/보존 정책, dataVersion·기준일·updatedAt의 의미와 충돌 처리. 임의 회사 주소·토큰·인증 규칙은 예시에 넣지 않는다. + +HTML 환경도 상위 앱 API client가 인증을 담당한다. React 전용 hook/context를 API adapter의 필수 전제로 삼지 않는다. 공유 스냅샷이 같으면 두 환경의 조직 구조·집계·Theme·인터랙션 결과가 같아야 한다. + +## 6. P3 조회 API 추가 — 2026-10-12 + +위 초기 기술 검토 기록은 보존한다. 현재 패키지의 추가 API는 [Core README](../../packages/org-chart/README.md#organization-links-and-employee-information-p3)와 [React README](../../packages/org-chart-react/README.md#public-api)에 기술한다. 런타임 검증 결과는 해당 구현 보고서에서 별도로 확인한다. + +- `organizationLinks`는 기존 조직 ID별 외부 설정 URL map이다. 원본 계층의 1Depth 제목에만 적용하며 누락·빈 URL은 일반 제목으로 남는다. 실제 URL을 패키지에서 만들지 않는다. HTTP(S)·상대 URL을 허용하고 다른 scheme·잘못된 URL·credentials는 생성 시 `TypeError`로 거부한다. 링크는 native 키보드 이동·Focus 표시를 지원하며 카드 클릭과 분리된다. +- 대표자·조직장·직원·파견·휴직 카드의 클릭·Enter·Space는 기본 조회 dialog를 연다. `readOnly`에서도 조회하며 수정 UI는 없다. 이름·직위·조직·직책·관계사·근무 상태 중 기존 값만 표시하고 없는 선택 필드는 생략한다. readOnly 가상 표시 이름은 카드의 `홍 길 동`과 일치하며 데이터는 변경하지 않는다. +- 기본 native modal은 축소 Stage 밖의 같은 Core shell에 위치한다. 닫기 버튼·ESC·Focus trap·카드로 Focus 복귀를 처리하고 정보 팝업을 열면 이름 tooltip을 닫는다. HTML과 React는 같은 구현을 사용한다. +- 선택적 `onEmployeeClick(employee, context)`를 제공하면 기본 팝업 대신 호스트 callback을 실행한다. context는 기존 `organization`·`affiliation`, Focus 가능한 `trigger` 카드, `originalEvent`를 담는다. 이 경우 호스트가 팝업 접근성과 정리를 담당한다. 기존 API를 제거하지 않는 추가 옵션이다. +- Vanilla는 생성 옵션으로 전달하고 설정을 변경할 때 새 handle을 만든다. React는 같은 이름의 Props로 전달한다. 새 URL map 또는 callback 유무 변경은 재생성하며, callback 함수 identity만 바뀌면 최신 committed callback을 사용한다. 공개 Core `setOptions`는 추가하지 않았다. + +```js +const chart = createOrgChart({ + ...configuredBaseOptions, + organizationLinks: configuredOrganizationLinks, + // 생략하면 Core 기본 조회 팝업 사용 + onEmployeeClick(employee, context) { + openEmployeeInformation(employee, context); + }, +}); +``` diff --git a/docs/org-chart/quality-review-p1.md b/docs/org-chart/quality-review-p1.md new file mode 100644 index 0000000..fd0826b --- /dev/null +++ b/docs/org-chart/quality-review-p1.md @@ -0,0 +1,163 @@ +# HMDesign OrgChart P1 — 품질 보완 및 디자인 검수 + +RESULT: **PARTIAL** + +이번 변경은 기존 P1의 Gradient 대비 검사, Department Colors, 실제 로고 표시, Guard 원인 분석으로 제한했다. 사용자가 최종 확인한 대로 Workdesk 전체 디자인 재현 첨부는 참고 자료로만 사용했다. 전체 배치·카드 구조를 다시 개발하지 않았다. 기존 기능·데이터 계약·공개 API·React Wrapper·공통 Theme/Token·운영 main은 보존했다. + +## 작업 정보 + +- 작업 폴더: `D:\디자인시스템\HMDesign-OrgChart` +- 브랜치: `feature/orgchart-package` +- 전/후 HEAD: `d18e3c33801e165e17b6d971e2f6198eed483c3c` +- 실제 병렬 수행: Track A/B/C 읽기 전용 분석을 병렬 수행했다. 이후 B는 대비 모듈과 Department Colors, C는 두 Summary Story의 가상 데이터 안내, 메인은 로고 렌더링·CSS·검증·보고서를 담당했다. 같은 파일의 동시 수정은 없었다. +- Started At: 2026-10-12 11:55:44 KST +- Completed At: 2026-10-12 12:25:20 KST +- Actual Duration: 29분 36초 +- Variance: 최초 예상 하한 45분 대비 15분 24초 단축, 상한 90분 대비 60분 24초 단축. 병렬 분석 및 기존 PASS 재사용으로 재검증 범위를 줄였다. +- Estimated Duration: 45–90분. 필요한 범위만 검사하며 시간을 채우기 위한 재검증은 하지 않았다. + +## Track A — Guard: 원인 분석 PASS, 전체 해결 PARTIAL + +공통 Guard를 변경하거나 검사 규칙을 비활성화하지 않았다. 실제 `themeAnalysis`에 인메모리 fixture를 전달한 최소 재현 8/8이 통과했다. 이는 **오탐 재현 PASS이며 실제 Guard PASS가 아니다**. + +최종 PARTIAL/STORYBOOK Guard 결과는 원본 `status=FAIL`, `staticStatus=FAIL`로 보존했다. TOKEN-001 FAIL 8건, TOKEN-002 NOT VERIFIED 6건, SCOPE-001 NOT VERIFIED 3건이다. + +- Shadow CSS 연결 누락 1건: `--hm-orgchart-resolved-bg-surface`는 `design-tokens.css`에 선언되고 공개 CSS로 번들되어 Shadow DOM에 연결된다. Guard graph는 `?url` import와 Shadow link의 연결을 증명하지 못한다. +- `setProperty` 정의 미수집 4건: `current-gradient`, `current-card-background`, `current-border`는 `applyOrganizationStyle`이 정의한다. Guard가 이 DOM 선언을 수집하지 않아 참조를 미선언으로 판정한다. +- 선택적 입력 오분류 3건: 대비 후보의 `--hm-orgchart-contrast-candidate-color` 및 `--hm-orgchart-contrast-candidate-chip-background`는 로컬 fallback을 가진 외부 override 입력이다. 기본값은 각각 `#10243b`, `#ffffff`이며 실제로 정상 적용된다. 공식 Theme 변수의 누락과 동일하게 처리하는 현재 검사 정책은 이 계약을 표현하지 못한다. +- 동적 TOKEN-002 6건: 유한한 조직 preset/legend 문자열 조합을 정적으로 해석하지 못한다. +- CSS SCOPE-001 3건: 카드·콘텐츠·통계 CSS는 실제 Core CSS 번들과 Shadow link에 포함되지만 Storybook graph 범위 밖으로 판정된다. + +브라우저에서 Shadow CSS 로딩, 6개 preset의 computed 값, fallback과 HTML/React 동일 렌더링을 확인했다. 이 증거로 raw FAIL을 덮어쓰지 않았다. 검사한 범위에서 실제 Production 미선언 변수 결함은 발견하지 못했다. + +`styleEvidence`: STATIC **PASS**, RUNTIME **NOT VERIFIED**, DESIGN_INTENT **NOT VERIFIED**, FINAL **NOT VERIFIED**. 이 값은 Guard의 증거 연결 상태이며 별도 브라우저 PASS와 구분한다. 이번에는 결합 `styleVerification`으로 승격하지 않았다. + +승인 필요한 최소 공통 Guard 변경안: 증명 가능한 Shadow CSS 연결, `setProperty` 정의 수집, 유한 후보 해석, 명시적 선택적 입력 계약 지원. Guard 분석기·style inventory/증거 연결·관련 회귀 fixture와 문서에 영향이 있으므로 별도 승인 전에 구현하지 않는다. 전역 CSS 강제 연결, dummy 선언, 변수 namespace 변경, fallback 일괄 면제는 적용하지 않았다. + +근거: `test-results/org-chart-quality/guard-reproduction.json`, `guard-storybook.json`. 분석기 SHA 전/후 동일하며 기존 P1 Guard 원본도 유지했다. + +## Track B — Color Contrast: PARTIAL + +기준은 [WCAG 2.2 Contrast Minimum](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html)의 일반 텍스트 4.5:1, 큰 텍스트 3:1 및 [Non-text Contrast](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html)의 의미 있는 UI/그래픽 3:1이다. 판정에는 반올림 전 값을 사용했다. 로고를 변색하지 않았다. + +### 측정 방법과 범위 + +Core의 제한된 opaque sRGB/세로 Gradient 모델과 실제 Chrome DPR1 PNG를 분리해 기록했다. 모델은 Gradient stop, 전체 구간, DOM Range의 텍스트 line 구간을 구분한다. PNG에서는 텍스트 옆 빈 padding 열의 실제 배경 픽셀과 computed foreground를 사용한다. 안티앨리어싱된 글자 픽셀로 전경색을 추측하지 않았다. 모델과 픽셀 차이가 2 channel 값을 초과하거나 스크롤에 가려지면 NOT VERIFIED다. + +지원하지 않는 alpha·복수 배경·다른 각도·다른 색 공간·합성 효과 등은 임의로 PASS하지 않는다. 이번 PNG 검사의 84개 가려진/일치하지 않은 probe는 NOT VERIFIED로 남겼다. 그중 솔루션영업 두 부서명은 마지막 가지로 스크롤한 별도 캡처에서 추가 검증했다. 숫자는 화면별 반복 측정이며 서로 다른 접근성 요구사항의 개수가 아니다. 전체 WCAG 인증으로 확대하지 않는다. + +### 기존 HEX와 실제 텍스트 대비 + +6개 헤더 Gradient와 흰 부서명 `#ffffff`는 Workdesk `v1.2610.9c5e`, 2026-10-12의 기존 computed 근거를 유지했다. 직원 카드 배경은 자체 기본 `#ffffff`이고 테두리 기본은 해당 조직 시작색이다. 카드 면·테두리·geometry는 **DESIGN_ADAPTATION**, 공식 Workdesk 실측으로 승격하지 않았다. 변수 prefix에 `-card-background`, `-department-color`, `-border`, `-gradient`를 각각 사용한다. + +- 사업관리: `#194d82 → #1d395c`, `--hm-orgchart-business-management-*`. 흰색 stop 최소 8.659:1. Full 실제 부서명 9.357:1 **PASS**. +- 경영기획: `#2164a8 → #254975`, `--hm-orgchart-business-planning-*`. stop 최소 6.082:1. Full 실제 부서명 약 6.654–6.676:1 **PASS**. +- 인재성장: `#0f6ace → #044a94`, `--hm-orgchart-talent-growth-*`. stop 최소 5.286:1. Full 실제 부서명 약 5.879–5.882:1 **PASS**. +- 통합시스템 Div: `#8c67b6 → #5d3494`, `--hm-orgchart-integrated-system-*`. stop 최소 4.439:1이지만 Full 실제 텍스트 구간은 약 5.008–5.197:1 **PASS**. stop 하나만으로 실제 텍스트를 FAIL 처리하지 않았다. +- 디자인기획: `#09a7a2 → #00847f`, `--hm-orgchart-design-planning-*`. stop 최소 2.974:1. Full의 15px bold 부서명 약 3.188–3.263:1 **REVIEW**. Department Colors의 19.5px bold 제목은 약 3.228:1로 큰 텍스트 기준 **PASS**, 일반 크기 비교는 약 3.263:1 **REVIEW**다. 큰 제목의 PASS를 Full에 대입하지 않았다. +- 솔루션영업: `#5a963c → #3f7629`, `--hm-orgchart-solution-sales-*`. stop 최소 3.582:1. 스크롤 후 Full 15px 부서명 약 3.916–3.917:1 **REVIEW**. Department Colors 큰 제목 약 3.922:1 **PASS**, 일반 크기 비교 약 3.922:1 **REVIEW**다. + +위 Full 수치는 1440px 대표 실측이다. Department Colors의 화면 내 MODEL 값은 픽셀 실측과 별도이며 실제 geometry·브라우저 반올림에 따라 차이가 있다. UI에 MODEL임을 명시했다. Default 값만 검사했으며 모든 소비자 override 조합의 대비를 보장하지 않는다. + +기타 확인: + +- 직원 이름 `#10243b / #ffffff`: 15.701:1 **PASS**. +- 직위·상태의 보조 텍스트 `#596575 / #ffffff`: 5.927:1 **PASS**. 기본 콘텐츠 면 `#f4f7fb` 기준 약 5.516:1. +- 직책 배지 및 통계 헤더/숫자 텍스트: 검사한 solid 조합 **PASS**. 원본 값 변경 없음. +- 협업 허브 `#45639f → #809dd7` 위 흰 일반 텍스트: 실제 약 3.321:1 **REVIEW**; stop 최소 약 2.720:1. 허브 색은 Workdesk 실측으로 확인된 브랜드 값이 아니라 자체 디자인 기본값이다. +- 관계 표현 연결선 `#bac7d7`: 실제 Storybook 배경 `#f5f0e5`와 약 1.510:1, 흰 면과 1.716:1 **REVIEW**. 모든 카드 프레임·테이블 divider를 무조건 의미 있는 UI 경계로 판정하지는 않았다. 부모-자식 관계 연결선은 정보 전달 그래픽으로 검토했다. +- 키보드 focus-visible: 실제 2px solid `#45639f`, Storybook 배경 대비 5.222:1 **PASS**. 전체 키보드/스크린리더 검증으로 확대하지 않았다. + +### 적용한 보완과 승인 대기안 + +**실제 Production 브랜드 HEX 변경: 0건.** Department Colors에 `Aa`, 실제 변수/HEX, 카드 배경과 부서명 전경 구분, 일반/큰 텍스트 대비, stop 보수값, MODEL/NOT VERIFIED 및 미적용 후보 표시를 추가했다. resize 시 실제 텍스트 구간을 다시 계산한다. + +중요한 색상·geometry 변경은 승인 없이 적용하지 않았다. 후보는 `UNAPPROVED_NOT_APPLIED`로 표시하며 Full Composition에 반영하지 않았다. + +- 디자인기획 흰 부서명 → `#000000` 후보: 전체 Gradient stop 최소 4.607:1. 텍스트 브랜드 표현 변경에 대한 승인 후 실제 화면 재검증 필요. +- 모든 Gradient의 단순 `#10243b` 전경 후보는 어두운 조직에서 실패한다. Department Colors에 실패 수치도 표시해 보편적 해결안으로 제시하지 않았다. +- 디자인기획/솔루션영업: 흰 label backing `#ffffff` + `#10243b` 후보는 15.701:1. 기존 Gradient를 유지하지만 새 시각 요소이므로 승인 대기. 솔루션영업은 검정/흰색 어느 하나도 전체 Gradient 전 구간을 일반 텍스트 기준으로 통과하지 않는다(검정 stop 최소 3.835:1). +- 큰 bold 텍스트 사용은 별도 대안이며 layout 영향을 확인하고 승인한 뒤 실제 geometry에서 다시 검사해야 한다. +- 허브: 흰 backing + 짙은 텍스트 또는 배경/크기 보완 승인 필요. 후보 수치와 actual 허브 적용은 구분했다. +- 의미 있는 연결선 `#bac7d7 → #7b899d` 후보: 실제 Storybook 배경 3.128:1, 흰 면 3.555:1, `#f4f7fb` 3.308:1. `--hm-orgchart-stroke-default` 보완 범위와 시각 의도 승인 후 적용할 수 있다. 적용하지 않았다. + +근거: `browser.json`, `contrast-pixels.json`, `contrast-last-branch.json`, `boundaries.json` 및 대응 PNG. + +## Track C — Storybook: 변경 표시 범위 PASS + +사용자용 메뉴 **Logo / Department Colors / Position Summary / Affiliation Summary / Full Composition** 5개 유지. 기존 내부 Story 8개 및 테스트 로직 유지. + +- Logo: Figma 정식 Footer에서 확보한 7개 PNG(한맥·삼안·장헌·장헌산업·피티씨·한라·바론)와 ID 매핑 유지. 473×473 원본 SHA와 RGBA 투명성 유지, 수정·재제작·가상 대체 없음. 누락 Asset **0건**. 원본 이미지 비율은 contain으로 보존했다. +- 로고 최소 수정: 이미지의 흰 CSS 배경을 transparent로 변경하고, 로고 정상일 때 fallback 글자가 투명 영역 뒤에 보이지 않도록 숨겼다. 이미지 실패 시 fallback을 다시 표시하며 관계사명 접근성 이름을 유지했다. 기존 실제 broken-image PASS를 재사용하고 이번에는 변경된 handler 표시만 검사했다. +- 한라처럼 가로 wordmark인 원본은 직원 16px mark에서 실제 ink 높이가 약 4px, Summary 28px에서는 약 7px라 작은 크기의 판독성 한계가 남는다. 원본 비율을 임의로 crop/recolor하지 않았다. 크기/여백 변경은 후속 디자인 검토 대상이다. +- Department Colors: 6개 조직명, 실제 HEX/CSS Variable, Gradient/Border, 원본 출처와 자체 디자인 구분, 실제 computed/model 대비·미승인 후보 표시 정상. 390px 줄바꿈 정상. +- Position Summary / Affiliation Summary: 두 Story에 가상 직원 자동 집계·운영 인원 아님 안내를 추가했다. Core selector/표/정책은 변경하지 않았다. 가상 raw total 41, 관계사 0명 세 항목 표시를 유지한다. 실제 인사 집계 정책 승인으로 간주하지 않는다. +- Full Composition: 리더·허브·6개 그룹과 부서/팀·직원 카드·직위 통계·관계사 통계·파견/휴직을 유지했다. Header·GNB·LNB·Dashboard Layout 없음. 390/768에서는 통계 아래 배치, 1280/1440에서는 오른쪽 통계 배치. 조직도 및 표의 내부 스크롤 유지, 변경으로 인한 새 겹침/페이지 overflow 없음. +- Position Summary 최초 390px PNG의 안내 첫 paint가 불완전해 그 화면만 다시 확인했다. DOM·최종 PNG에서 두 줄 전체 문장 정상. 원본 캡처를 보존하고 `position-note-recheck.json`과 `storybook-position-summary-390-final.png`를 최종 근거로 사용한다. +- HTML/React: 4개 폭의 computed 카드·로고 스타일 일치. 이미 촬영한 PNG를 비교한 결과 390/768/1280/1440 모두 픽셀 동일. 별도 React UI를 추가하지 않았다. + +독립 API는 변경하지 않았다. `OrgChartTree`, `PositionSummary`, `AffiliationSummary`, `StatusSummary`의 기존 factory/React Wrapper/P1 독립 사용 PASS를 재사용한다. 두 Summary의 변경 Story 렌더링은 이번 브라우저 검사로 확인했다. 사용법은 기존 [공개 컴포넌트·스타일 API](standalone-components-p1.md)를 유지한다. + +확인된 Workdesk 차이는 유지했다: IS/디자인 하위 팀의 세로 배치, 추가 root 카드·ID/raw metadata·collapse control, 더 큰 전체 높이, 18행 상세 통계, 1440px Story host 제한과 마지막 가지 내부 스크롤, 파견/휴직의 after-tree 배치. 이는 이번 변경으로 생긴 회귀가 아니며 사용자가 예고한 별도 전체 디자인 작업에서 다룬다. 픽셀 완전 일치 PASS가 아니다. + +근거: `test-results/org-chart-quality/visual-review.json`. Workdesk 최신 화면은 조직명/색/배치 참고로만 사용했고 실제 직원 개인정보·운영 인원수를 fixture에 복제하지 않았다. Figma Dev Mode 미확인 속성을 실측이라고 기재하지 않았다. + +## 검증 및 재사용 + +이번에 실행: + +- Core Typecheck: `npm.cmd run typecheck:org-chart` **PASS**. +- 변경 Story/preview source Typecheck: `npm.cmd exec -- tsc -p tsconfig.app.json --noEmit` **PASS**. +- Core Package Build: `npm.cmd run build:org-chart` **PASS**(ESM/IIFE/types/CSS). +- HTML demo prepare 및 React demo Vite Build **PASS**. React Wrapper 구현 변경 없음. +- Storybook production Build **PASS**. 기존 큰 chunk 경고가 있으며 이번 작업에서 배포 구조를 리팩터링하지 않았다. +- 신규 대비 unit **10/10 PASS**: 수학/비반올림 경계/일반·큰 텍스트/Gradient 구간/unsupported NOT VERIFIED. 기존 unit output을 지우지 않는 별도 폴더로 실행. +- 변경 UI browser **62/62 PASS**, console/runtime error 0. 5개 Story 390/1440 및 Full 768/1280, Theme 미연결 HTML/React 4개 폭 확인. +- Position 390 안내만 후속 **PASS**, 가려진 솔루션영업 제목 2곳 후속 대비 **REVIEW**. 정상 데이터/생명주기 검사를 반복하지 않았다. +- Guard 재현 **8/8 PASS**; 최종 관련 Guard 원본 **FAIL**(앞서 원인/범위 기록). +- 실제 텍스트 대비: 검증된 부분 PASS/REVIEW 구분, 가려지거나 모델 불일치한 부분 NOT VERIFIED 유지. +- `git diff --check` **PASS**. 운영 `D:\디자인시스템\HMDesign`은 읽기 전용 확인: `main`, 동일 HEAD, Working Tree clean. Commit/Push/Merge/새 브랜치/공통 코드 수정 없음. + +재사용한 근거: 기존 Core 22/22, HTML 69/69, React 79/79, P1 selector 7/7, P1 browser의 성공 196건 및 console/menu 후속 4/4. 원본 기록은 [P1 구현 보고](implementation-report-p1.md)와 `test-results/org-chart-p1/`에 유지한다. Data Source/validation/집계/JSON 갱신/lifecycle/API/Wrapper/원본 Story 로직이 변경되지 않아 전체 테스트를 다시 실행하지 않았다. 현재 검사는 변경된 스타일·표시·신규 대비 모델·관련 Guard 문제에 한정했다. + +## 변경 파일 — 이번 품질 작업만 + +시작 706파일 SHA snapshot과 비교해 기존 파일 삭제 0건, 수정 7건, 신규 소스/검증 6건과 이 보고서 1건이다. 기존 `package.json`, `package-lock.json` 미커밋 변경, 원본 자산·7개 설계 문서·P1 보고/Story·Spike·공통 코드의 시작값은 보존했다. + +수정: + +1. `packages/org-chart/src/core/affiliation-mark.ts` — fallback span과 정상/오류 표시 연결. +2. `packages/org-chart/src/core/department-colors.ts` — 대비 정보와 미적용 비교 후보. +3. `packages/org-chart/src/styles/employee-card.css` — 로고 투명 배경 및 fallback 숨김. +4. `packages/org-chart/src/styles/org-chart-content.css` — Department Colors 비교 표시만. +5. `packages/org-chart/src/styles/summary-sections.css` — standalone 주석 정정만. +6. `src/org-chart/core-component-preview.tsx` — Department Colors resize 계산/cleanup. +7. `src/org-chart/org-chart-p1.stories.tsx` — 두 독립 Summary의 가상 데이터 안내. + +신규: + +8. `packages/org-chart/src/core/contrast.ts` — 내부 대비 모델(공개 API 추가 없음). +9. `packages/org-chart/src/core/contrast.test.ts` — 신규 모델 10개 검증. +10. `examples/org-chart/verify-guard-p1.mjs` — Guard 최소 오탐 재현. +11. `examples/org-chart/verify-quality-p1.mjs` — 변경 UI 62개 검사/PNG/값 수집. +12. `examples/org-chart/audit-quality-pixels.py` — PNG 읽기 전용 대비 감사. +13. `examples/org-chart/verify-quality-boundaries.mjs` — 실제 연결선/포커스 CSS 확인. +14. `docs/org-chart/quality-review-p1.md` — 이번 결과 기록. + +`test-results/org-chart-quality/`에는 신규 증거, 실행 로그, PNG 및 baseline을 별도 보존했다. Build 산출물은 기존 생성 경로에서 갱신했다. + +## 최종 판정 / 승인 / 후속 + +**PARTIAL**: 로고 표시·Department Colors 설명·가상 안내·변경 렌더링 보완은 PASS다. 실제 대비 부족과 공통 Guard 개선 승인이 남아 전체 P1을 PASS로 처리하지 않는다. 원본 Guard FAIL은 분석상 오탐으로 구분했지만 승인·수정 없이 PASS로 치환하지 않았다. + +승인 대기: 디자인기획/솔루션영업/허브의 텍스트·backing·크기 선택, 의미 있는 연결선 대비 보완, 공통 Guard 제한적 추적 개선. 모두 미적용이다. Workdesk 전체 배치 수정은 사용자가 지정한 별도 Codex 작업으로 남긴다. + +NOT VERIFIED: 전체 Heap/GC 회수, 전체 스크린리더, 미확인 Figma Dev Mode 속성, Workdesk 픽셀 완전 일치, 실제 HR API, 미승인 집계 정책, 무관한 Guard 항목, 지원하지 않거나 가려진 contrast probe, 모든 소비자 override의 접근성. + +후속 P2: 전체 디자인 작업 결과의 확인, 승인된 대비 대안만 적용/부분 재검사, 작은 wordmark 크기 검토, 승인된 집계 정책·실제 API·전체 접근성·메모리 검증. Commit·Push·Merge는 수행하지 않았다. + +## 완료 기록 + +Started At: **2026-10-12 11:55:44 KST**. Completed At: **2026-10-12 12:25:20 KST**(최종 검사 종료 시각). Actual Duration: **29분 36초**. Estimated Duration: **45–90분**. Variance: **하한 대비 −15분 24초 / 상한 대비 −60분 24초**. 보고서 정리와 결과 표시 시간은 별도다. + +최종 보존 근거: `test-results/org-chart-quality/preservation.json` — baseline 706개 중 수정 7개, 유지 699개, 삭제 0개, 신규 7개(보고서 포함), HEAD/main 동일, diff check 0. Preview: `http://127.0.0.1:6027/?path=/story/orgchart--full-composition`. diff --git a/docs/org-chart/react-integration-report-v0.1.md b/docs/org-chart/react-integration-report-v0.1.md new file mode 100644 index 0000000..f6363e4 --- /dev/null +++ b/docs/org-chart/react-integration-report-v0.1.md @@ -0,0 +1,83 @@ +# HMDesign OrgChart v0.1 React Wrapper · Storybook 통합 검증 + +RESULT: **PASS** — 이번 요청의 React 통합 MVP 완료 조건 13개를 충족했습니다. 아래 NOT VERIFIED는 별도 한계로 보존하며 모든 기능·디자인·배포 환경의 검증 완료를 뜻하지 않습니다. + +## 구현 결과 + +1. 작업 경로 `D:\디자인시스템\HMDesign-OrgChart`, 브랜치 `feature/orgchart-package`. 사용자 첨부 요청의 별도 작업/Git 지시를 적용했습니다. 운영 `D:\디자인시스템\HMDesign` 및 `main`은 수정하지 않았습니다. +2. 작업 전/후 HEAD, Local main, 공식 원격 main/Feature 모두 `d18e3c33801e165e17b6d971e2f6198eed483c3c`. 공식 origin은 `https://gitea.hmac.kr/b25027/HMDesign.git`입니다. 시작/완료 시 원격을 읽기 전용으로 확인했습니다. +3. 신규 `packages/org-chart-react`, `@hm-design/org-chart-react@0.1.0`. Core `@hm-design/org-chart@0.1.0` dependency, React `^19.0.0` peer. React DOM은 Wrapper가 사용하지 않아 별도 dependency/peer를 추가하지 않았으며 소비 앱이 제공합니다. 설치 package/lock과 React/DOM `19.3.0`, Storybook `10.6.1`, 엔진 `6.0.0` 일치를 확인했습니다. +4. Runtime Export는 `OrgChart`. Type Export는 `OrgChartProps` 및 Core 공개 타입의 type-only re-export입니다. Props는 공개 `OrgChartOptions`에서 container/onStateChange를 제외하여 재사용합니다. 필수 `dataSource`, `stylesheetUrls`; 선택 `aggregationPolicy`, `className`, `style`, `onStateChange`, `onLifecycleError`. 제목·직원·Zoom 등 임의 Props는 추가하지 않았습니다. +5. 생명주기는 Core 생성 → 구독 → mount, Source identity 교체 → reload, cleanup → 구독 해제·destroy입니다. 최초 추가 Reload가 없고 Callback 변경만으로 재생성하지 않습니다. Core가 변경 setter를 제공하지 않는 Policy identity/CSS URL 값 변경은 정리 후 재생성합니다. 같은 URL 문자열의 새 객체는 재생성하지 않습니다. Source/Policy 내부 mutation은 변경 알림으로 취급하지 않습니다. +6. committed Callback, 소유권, Source 갱신을 순서대로 layout effect에 연결했습니다. commit과 passive cleanup 사이의 오래된 요청 Callback 가능 구간을 닫습니다. generation/operation 검사는 이전 인스턴스 Promise의 늦은 rejection을 차단하며 Core revision/AbortSignal이 오래된 데이터 응답을 차단합니다. Wrapper 안에 DOM 엔진·Validation·Summary·노드 UI·엔진 정리 로직을 복제하지 않았습니다. +7. ESM과 선언을 자체 최소 build.mjs로 생성하며 React, JSX runtime, Core를 external로 유지합니다. 산출물의 client boundary를 보존했습니다. 기존 공통 build 스크립트는 수정하지 않았습니다. 최종 Wrapper ESM 약 3.09 kB/gzip 0.92 kB입니다. +8. 기존 HM Theme/폰트를 호스트에서 제공하고 공개 engine.css/style.css의 실제 URL을 Shadow DOM에 주입합니다. Storybook의 기존 preview CSS/decorator를 그대로 사용하며 별도 소비자는 공개 Theme entry를 사용합니다. Production의 해시 Asset URL과 폰트 로드를 실제 확인했습니다. 새 Theme·브랜드 팔레트나 reset을 만들지 않았습니다. +9. `src/org-chart/org-chart.stories.tsx`, 분류 `OrgChart/Content`. 기존 glob에 포함되므로 `.storybook/main.ts`/preview 변경이 없습니다. 기존 Component/Pattern Story를 바꾸지 않았습니다. 모든 Story는 공개 Wrapper와 Strict Mode를 사용합니다. +10. 필수 Story 8개: Basic Organization, Organization Hierarchy, Employee Cards, Organization Summary, JSON Data Update, Loading / Empty / Error, Responsive Container, Multiple Instances. 기존 HTML v1/v2 JSON을 직접 import하며 추가 시나리오는 파생 가상 데이터 및 같은 Source Interface만 사용합니다. 주변 조작은 공개 HM Button을 실제 렌더링합니다. +11. Navigation·Header·Dashboard·CSV·추가 업무 메뉴·API는 없습니다. FilterBar/DataTable은 검색·필터·정렬·선택 요구가 없어 사용하지 않습니다. 노드/상태/집계는 Framework-independent Core의 승인된 책임이며 React HM 위젯으로 복제하지 않습니다. +12. 실제 empty 화면을 구현한 것으로 표시하지 않습니다. 직원 0명은 Ready, 조직 0개는 Error입니다. Zoom/Pan은 비활성 상태로 유지합니다. hubText/showDispatched/showOnLeave 등 기존 reserved 영역, 복잡한 relation overlay도 추가 구현하지 않았습니다. + +## 최종 통합 검증 + +- **PASS** Wrapper Typecheck: `npm run typecheck:org-chart-react`. 최종 생명주기 수정 후 다시 확인했습니다. +- **PASS** 루트 앱·Storybook TypeScript graph: `tsc -p tsconfig.app.json --noEmit`. 별도 React 소비자도 strict Bundler 타입 검사를 통과했습니다. +- **PASS** Wrapper Package Build: ESM/선언/client boundary/external 확인. Storybook prebuild의 기존 workspace 빌드도 Core/UI/Center Graphic을 포함해 성공했습니다. +- **PASS** 실제 npm tarball Public Export 및 선언: 추출된 Core/Wrapper에서 DOM 없는 ESM import, strict NodeNext consumer, 필수 Source와 미지원 Zoom/container 타입 경계 확인. React/compiler는 현재 검증 환경에서 제공합니다. 새 PC의 fresh dependency install 결과로 해석하지 않습니다. +- **PASS** Storybook Production Build: 최종 Wrapper/Story/CSS 상태의 `storybook build` 성공. 큰 기존 chunk 및 plugin timing 경고가 있으나 build 실패는 없습니다. +- **PASS** Storybook 실제 브라우저: Production의 8개 Story와 개발 6025의 실제 Wrapper 노드 실행. JSON v2 갱신, Unmount/Mount, Source 오류·복구, 직원/조직 0개, 취소를 무시하는 늦은 응답, A 갱신/제거 시 B identity·데이터·Callback 유지 확인. +- **PASS** 독립 React Consumer: `examples/org-chart-react`의 공개 package import·Vite Production Build·실제 Chrome 실행, 초기 mount/Source 교체/최신 Callback/Unmount. Storybook 성공을 소비자 성공으로 대신하지 않았습니다. +- **PASS** 개발 React Strict Mode: setup → cleanup → setup에서 두 번의 Source load와 최종 Ready 1회, 활성 Core host 1개. Production은 replay 없이 초기 load/Ready 각 1회임을 별도로 확인했습니다. 두 Source load는 Strict Mode의 의도된 setup 반복이며 Wrapper의 초기 이중 Reload가 아닙니다. +- **PASS** 생명주기: Callback/className 변경 시 같은 Core·추가 load 없음; Source 교체 시 같은 Core reload; Policy/CSS URL 변경 시 새 Core; 같은 CSS URL 값은 유지. 실패한 구성의 lifecycle callback, 정상 오류→Ready 복구, 늦은 응답·Unmount 후 Callback 차단, 5회 반복 mount/unmount의 DOM/관찰자 기준 유지, 최종 Core DOM/관찰자 0 확인. +- **PASS** HTML/React 공통 데이터: v1 조직 3개·직원 4명·직접 Root/A/B 1/2/1, v2 조직 3개·직원 5명·직접 1/1/3. DOM의 organization ID/parentId·employee ID·노드 텍스트·Heading·Summary를 비교하여 일치했습니다. +- **PASS** Theme CSS: HTML/React의 전경·surface·radius·폰트 computed 일치, 기존 Theme 변수 상속, 두 CSS link의 실제 stylesheet 로드, scoped Theme 변경 시 다른 인스턴스 유지, Engine selector의 light DOM 오염 없음. +- **PASS** 반응형: 실제 390/768/1280/1440px에서 소비자 및 Basic/Employee/Responsive Story의 document overflow·노드 겹침·텍스트 폭·null 사진 fallback 확인. scrollWidth/clientWidth 및 scrollHeight/clientHeight 측정을 저장했습니다. 390px은 원래 노드 크기와 내부 가로 스크롤을 유지합니다. 실제 scrollLeft 이동도 확인했습니다. 소비자 Grid item min-width와 Story Grid track을 수정하여 문서 overflow를 제거했습니다. +- **PASS** 키보드: Enter/Space 접기·펼치기 및 데이터 교체로 기존 focus가 제거될 때 안정된 Core viewport로 복귀. 접기 애니메이션이 끝나기 전 재입력은 기존 Core가 거부하므로 검사도 실제 transition 완료를 기다립니다. +- **PASS** 기존 Vanilla: 기존 HTTP HTML의 v1→v2 비교 및 `file://` classic의 Ready 4명→Update 5명 smoke. 변경 없는 기존 22개 데이터 테스트/69개 전체 브라우저 검사는 반복하지 않았습니다. +- **PASS** Chrome `155.0.8059.39`: 통합 검사 **70/70**, 추가 경계 검사 **9/9**, console/pageerror **0**. 대표 390px 긴 텍스트·Responsive 및 1440px 소비자 캡처도 육안 확인했습니다. +- **PASS** 보존: 시작 파일 **614/614 SHA-256 일치**, 기존 Core/HTML/7개 설계 문서/이전 구현 보고/UI/Center Graphic/Theme/Story/공유 build 설정 보존. `git diff --check` 통과. 운영 main Working Tree는 시작·완료 시 깨끗합니다. Staged diff는 비어 있으며 Stage/Commit/Push/Merge가 없습니다. + +## Guard와 미검증 + +- Storybook과 독립 소비자에 범위별 PARTIAL Guard를 실행했습니다. 최종 원본 status/staticStatus는 **NOT VERIFIED**, FAIL 0입니다. Storybook의 동적 width, 소비자의 동적 className 및 실제 브라우저 증명 요구를 그대로 유지합니다. +- 원본 CSS styleEvidence는 **STATIC PASS / RUNTIME NOT VERIFIED / DESIGN_INTENT NOT VERIFIED / FINAL NOT VERIFIED**입니다. 별도 브라우저 computed·컨테이너 검사 PASS는 기록한 요소/상태/폭의 증거이며 Guard 원본이나 디자인 의도 승인을 덮어쓰지 않습니다. Guard 결합 판정은 수행하지 않았습니다. +- 최초 소비자 Guard의 target 상대경로 입력이 맞지 않아 checkedFiles=[] 진단이 발생했습니다. 원본 `guard-consumer-initial.json`을 보존하고 상대경로/entry를 교정한 실제 graph 검사를 별도로 저장했습니다. Story CSS 수정 후 CSS-only PARTIAL은 NOT APPLICABLE이어서 최종 Story graph 검사를 별도로 저장했습니다. 빈 검사 결과를 PASS로 계산하지 않았습니다. +- **NOT VERIFIED** 완전한 Heap/GC 회수, 전체 스크린리더·SSR/hydration, 모든 브라우저/모바일 touch, 매우 큰 데이터 성능·깊이, Workdesk 원본과의 시각적 일치, Theme 미연결 스타일, 실제 API/auth, fresh npm registry 설치 및 임의 배포 base/CSP/origin입니다. +- Scope 한계: 공개 Props의 arbitrary className/style 및 모든 외부 데이터·Theme 조합은 전수 검사하지 않았습니다. readOnly/disabled 입력 필드는 없는 콘텐츠 패키지이며 전체 업무 화면 접근성 검증으로 해석하지 않습니다. +- 기술적 리스크: 기존 Core의 엔진 6.0.0 내부 init observer hook 의존은 유지됩니다. 엔진 upgrade 시 정리 계약 재검토가 필요합니다. Policy identity 변경은 재생성되므로 immutable/memoized Props를 권장합니다. Core 갱신 시 expansion/scroll state 보존은 추가하지 않았습니다. +- 도구 이슈: 로컬 npm symlink EPERM 및 sandbox Chrome loopback 차단은 허용된 실행 권한으로 재시도해 해결했습니다. 최초 sandbox Storybook의 사용자 설정/registry 쓰기 경고도 접근 가능한 개발 서버 재실행 후 사라졌습니다. 운영 6024 서버를 중단하지 않았습니다. + +## 파일과 증거 + +이번 변경(기존 작업 위에 추가): + +- 수정 `package.json`: 기존 OrgChart scripts 유지, Wrapper build/typecheck·소비자 build/dev/browser scripts, Core/Wrapper root dependency 연결. +- 수정 `package-lock.json`: root Core/Wrapper dependency, Wrapper workspace link·manifest. 해당 추가를 제거하고 원래 CRLF로 재직렬화한 SHA가 시작 lockfile SHA와 일치하므로 기존 dependency graph/버전은 보존했습니다. npm 재직렬화로 line ending은 LF입니다. +- 신규 `packages/org-chart-react/{package.json,build.mjs,tsconfig.json,tsconfig.build.json,README.md,src/OrgChart.tsx,src/types.ts,src/index.ts}`. +- 신규 `src/org-chart/{org-chart.stories.tsx,org-chart-stories.css}`. +- 신규 `examples/org-chart-react/{index.html,index.css,app.tsx,vite.config.ts,README.md,verify.mjs,verify-package.mjs,verify-boundaries.mjs}`. +- 신규 이 보고서. 시작 시 기존 package/lock의 Core 관련 diff와 untracked docs/examples/Core는 이번 신규 변경과 구별하여 보존했습니다. + +검증 생성물(Git ignored): + +- `test-results/org-chart-react/report.json`: 70개 검사, HTML/React snapshots, four-width 측정과 PNG. +- `test-results/org-chart-react/boundaries.json`: 추가 9개 경계 검사. +- `test-results/org-chart-react/tarball-consumer/report.json`: public archive/declaration 검사. +- `test-results/org-chart-react/preservation.json`, `baseline.json`, `baseline-lock-reconstructed.json`: 시작/완료 보존 근거. +- `test-results/org-chart-react/guard-storybook-final.json`, `guard-consumer.json`: 최종 원본 Guard. 초기/부분 진단도 별도 보존. +- `test-results/org-chart-react/storybook-build.log`: 최종 Production Build 로그. + +확인용 개발 URL: + +- Storybook `http://127.0.0.1:6025/?path=/story/orgchart-content--basic-organization`. +- 독립 React 소비자 `http://127.0.0.1:6026/`. +- 기존 운영 Storybook `6024`, 원래 PID `19932` 유지. + +## 시간 기록 (Asia/Seoul) + +- Started At: 2026-10-12 10:24:24 KST +- Completed At: 2026-10-12 10:42:39 KST +- Actual Duration: 18분 15초 +- Estimated Duration: 최초 2~3시간 +- Variance: 예상 하한 2시간 대비 101분 45초 단축; 예상 상한 3시간 대비 161분 45초 단축 + +예상 시간은 참고값입니다. 기존 Core/설치 환경과 병렬 구현을 재사용해 실제 시간이 줄었으며 미검증을 PASS로 대체하지 않았습니다. Commit·Push·Merge는 사용자 요청대로 진행하지 않았습니다. diff --git a/docs/org-chart/standalone-components-p1.md b/docs/org-chart/standalone-components-p1.md new file mode 100644 index 0000000..87eb7dc --- /dev/null +++ b/docs/org-chart/standalone-components-p1.md @@ -0,0 +1,60 @@ +# OrgChart P1 독립 디자인과 개별 컴포넌트 + +2026-10-12 최종 요청을 적용한다. 기존 공통 Theme 필수 연결 규칙은 OrgChart에 적용하지 않는다. 과거 v0.1 검증 기록은 당시 구현 기록으로 보존한다. + +## 공개 API와 스타일 + +패키지 root 공개 API에 `createOrgChartTree`, `createPositionSummary`, `createAffiliationSummary`, `createStatusSummary`를 추가한다. 기존 `createOrgChart`, Source, schema, summary 및 React Wrapper API는 유지한다. 모든 factory가 기존 `mount/update/reload/destroy/subscribe/getState` handle을 반환한다. + +```js +import { createPositionSummary, createAffiliationSummary, createOrgChartTree, + JsonOrgChartDataSource } from '@hm-design/org-chart'; +import coreUrl from '@hm-design/org-chart/style.css?url'; +import engineUrl from '@hm-design/org-chart/engine.css?url'; + +const source = new JsonOrgChartDataSource(dataset); +const position = createPositionSummary({ container: positionElement, + dataSource: source, stylesheetUrl: coreUrl }); +const affiliation = createAffiliationSummary({ container: affiliationElement, + dataSource: source, stylesheetUrl: coreUrl }); +const tree = createOrgChartTree({ container: treeElement, dataSource: source, + stylesheetUrls: { core: coreUrl, engine: engineUrl } }); +await Promise.all([position.mount(), affiliation.mount(), tree.mount()]); +// 상위 페이지가 DOM container를 자유롭게 배치하고 표시·숨김을 관리한다. +await position.update(nextDataset); +position.destroy(); affiliation.destroy(); tree.destroy(); +``` + +`?url`은 Vite 사용 예시다. 일반 HTML은 배포한 CSS 실제 URL을 전달한다. `/browser` classic bundle도 같은 factory를 `window.HMOrgChart`로 제공한다. ESM import/handle 생성은 DOM 없이 가능하며 mount에만 연결된 HTMLElement가 필요하다. Summary는 engine을 로드하지 않고 engine.css도 필요 없다. 각 모듈은 Header·Routing·전체 페이지에 의존하지 않는다. + +React에서는 기존 전체 `OrgChart` Wrapper를 그대로 사용한다. 개별 모듈은 위 factory를 ref/effect에서 mount하고 cleanup에서 destroy하면 된다. JSX 카드·테이블·데이터 계산을 복제하지 않는다. Source는 공유할 수 있으며 각 handle은 동일한 validate/normalize/calculateSummary 흐름을 사용한다. 상위 페이지가 여러 handle에 nextDataset을 전달한다. 자동 전역 데이터 저장소는 추가하지 않는다. + +## 독립 디자인 입력 + +OrgChart는 Shadow DOM 안에서 `engine.css → style.css`를 적용한다. `style.css`는 모든 내부 CSS를 포함하며 공통 HM Theme가 없어도 기본 디자인을 가진다. 공통 Theme·Token·Component는 변경하지 않는다. + +```css +.other-page-summary { + --hm-orgchart-font-family: Arial, sans-serif; + --hm-orgchart-spacing-lg: 20px; + --hm-orgchart-radius-container: 6px; + --hm-orgchart-bg-surface: #ffffff; +} +.custom-chart { + --hm-orgchart-design-planning-card-background: #f4ffff; + --hm-orgchart-design-planning-card-color: #10243b; + --hm-orgchart-design-planning-department-color: #ffffff; + --hm-orgchart-design-planning-border: #00847f; + --hm-orgchart-design-planning-gradient: linear-gradient(#00847f, #005b57); +} +``` + +위 예시는 외부 사용자 override 예시이며 공식 Workdesk 값 확정이 아니다. public 변수를 container에 설정한다. `resolved-*`, `current-*`는 내부 구현 변수다. 기본 변수 전체 목록은 `packages/org-chart/src/styles/design-tokens.css`, 조직별 목록·실측 근거는 `core/style-presets.ts`에서 관리한다. 조직별 ID에 연결하고 하위 셀·팀은 상위 variant를 상속한다. JSON 직원 객체에 컬러를 추가하지 않는다. 카드 배경·직원 텍스트·부서명 텍스트·테두리·Gradient를 각각 바꿀 수 있다. + +## Composition·데이터·디자인 근거 + +`core/org-chart-content.ts`에서 독립 Tree와 Summary 모듈을 선택해 배치한다. 기본 placement는 직위=side, 관계사=footer, 파견·휴직=belowTree이며 내부 `ContentComposition.placements`로 바꿀 수 있다. 외부 호출자는 공개 개별 API의 container를 직접 배치한다. 기존 presentation flags로 전체 조합의 표시를 관리하며 계약 필드 추가 없이 처리한다. + +Workdesk `v1.2610.9c5e` 운영 화면에서 확인한 조직 명칭과 6개 조직 헤더 Gradient·흰색 부서명 텍스트를 사용한다. 일반 배경·카드 테두리·Typography·간격·Radius는 독립 구현 기본값(DESIGN_ADAPTATION); 원본 카드 세부값은 NOT VERIFIED다. Figma 접근 가능한 정식 회사 로고 7종은 Core에서 affiliation ID로 매핑하고 카드·현황·Logo에서 재사용한다. 출처·원본 SHA256은 `packages/org-chart/src/assets/affiliations/README.md`에 기록한다. 미매핑/파일 오류는 회사 명칭 텍스트 대체를 사용하고 임의 로고를 생성하지 않는다. + +P1 fixture는 실제 조직명과 관계사명만 사용한다. 직원 41명과 직위·직책·소속·근무 상태는 가상이며 프로필은 null/이니셜 placeholder다. 관계사 3곳은 0명을 유지한다. Raw Count는 가상 JSON 고유 employee ID로 자동 계산하고 실제 HR 인원수나 승인된 집계 정책으로 표시하지 않는다. diff --git a/docs/org-chart/ui-composition.md b/docs/org-chart/ui-composition.md new file mode 100644 index 0000000..fa5b04d --- /dev/null +++ b/docs/org-chart/ui-composition.md @@ -0,0 +1,114 @@ +# OrgChart UI Composition + +## P3.2 후속 — 대표자 뱃지 미사용 (2026-10-12) + +대표자 카드는 모든 실행 경로와 독립 견본에서 직책·역할·상태 뱃지 및 빈 attributes/뱃지 행을 생성하지 않는다. 표시 직위 `대표이사`, 이름 `홍 길 동`, 승인 카드 146×74 및 기존 Typography·사진·로고를 유지하며 직위↔이름 간격은 0px이다. 원본 fixture의 대표자 직위는 `경영진`이므로 `대표이사`는 카드 표시에만 적용한다. 직원 JSON·정보 팝업 원문·공개 API와 다른 1Depth/2Depth 카드의 뱃지 정책은 그대로 유지한다. 아래 P3.2 및 이전 보고서·검증은 당시 기록으로 보존한다. + +## P3.2 현재 계약 (2026-10-12) + +[P3.2 보고서](implementation-report-p3.2.md)의 카드 Typography·상태 영역·로고 보정이 아래 P3.1 수치보다 우선한다. 과거 검증 기록은 그대로 보존한다. + +- 대표자 Typography는 유지한다. 대형 이름 24px/600/30px, 직위 18px/400/22px; 소형 이름 18px/600/24px, 직위 15px/400/18px이다. 기존 컬러·letter-spacing·Noto Sans KR 및 `홍 길 동`을 유지한다. 직위·뱃지 공백은 표시 계층에서만 제거한다. +- readOnly 파견·휴직은 SVG 없이 일반 소형 카드의 공통 콘텐츠 레이아웃과 Typography를 재사용한다. 카드 108×52, 사진 24×44, 사진↔텍스트 4px, 직위↔이름 0px이다. 기존 회색 표면·문자색·로고 grayscale을 유지하며 별도 상태 행은 없다. P3.1의 실제 114×54/사진 28×28에서 이번 요청값으로 보정한다. +- 상태 타이틀은 일반 2Depth 기본 20px/700/19.7px를 공유하며 회색 Gradient를 유지한다. 경영기획/인재성장 18px/600/16.9px 예외는 보존한다. 타이틀↔첫 카드 Gap 8px를 유지한다. +- 카드 로고의 실제 contain 표시 영역은 소형 12×12→18×18, 대형·대표자·파견·휴직 14×14→21×21이다. 원본 PNG·승인 SVG 및 하단 관계사 현황 로고는 수정하지 않는다. 직원 카드 selector에만 적용하며 비율·투명 배경을 유지한다. + +## P3.1 현재 계약 (2026-10-12) + +잔여 디자인 보완의 최신 계약은 [P3.1 보고서](implementation-report-p3.1.md)가 우선한다. 아래 P3/P2 및 초기 설계의 검증 기록은 당시 범위 그대로 보존한다. + +- OrgChart 전용 기본 폰트는 Noto Sans KR이다. 기존 `public/fonts/NotoSansKR-variable.ttf`와 호스트 font-face를 재사용하며 HM Theme는 수정하지 않는다. 한국어 Core shell은 `lang="ko"`로 HTML/React/Storybook의 글리프 조형을 맞춘다. +- 이름은 `홍 길 동`, 직위는 표시에서만 공백을 제거한다. Full Composition은 `jobTitle`이 `경영진`인 뱃지만 생성하지 않으며 기타 직책 문자열·원본 데이터·팝업·통계는 유지한다. 원본 `position="경영진"` 텍스트는 유지한다. +- 1Depth는 20px/700/36px·헤더 높이 36px이다. 2Depth 경영기획/인재성장은 18px/600/16.9px, 나머지는 기존 20px/700/19.7px다. 114×30.4 표면·Gradient·Radius·Shadow 및 모든 타이틀↔첫 카드 Gap 8px를 보존한다. +- 허브는 원본 21px/750/24px·아이콘 20px·Gap 8px·좌우 Padding 22/24px·높이 42px를 유지한다. 최대 폭 상속 제약을 해제하고 X 935 중심축을 유지한다. +- 사진 없음/로드 실패는 공통 `person-placeholder.svg`를 사용한다. 실제 사진이 있으면 우선한다. 승인 사진 슬롯 36×62/32×56/24×44, P3 상태 카드 슬롯 28×28 및 비원형 처리를 유지한다. +- 우측 표는 전체 330px 안에서 조직명/경영진 열을 112/46px로 재배분해 한 줄로 표시한다. 나머지 열은 잔여 폭을 나눈다. 숨김/말줄임/폰트 축소 없이 원본 14px, 기존 계산 41명·위치·셀 정렬·행 높이를 보존한다. +- 대표자 146×74, 1Depth 146×68, 하위 108×52 및 P3 상태 카드 114×54를 유지한다. 확장형 Auto Layout/layoutConfig·메뉴·Navigation·공개 API 추가 없음. + +## P3 현재 계약 (2026-10-12) + +아래 초기 설계와 P2 기록은 보존한다. 충돌하는 표시 계약은 [P3 보고서](implementation-report-p3.md)가 우선한다. 범위는 기존 독립 HTML·React 공통 Core와 해당 Storybook 페이지이며 Navigation·Header를 추가하지 않는다. 기존 semantic table/native dialog는 공통 Vanilla Core adapter를 유지하기 위한 선택이다. FilterBar·DataTable의 검색/정렬/페이지 기능은 요구되지 않아 추가하지 않는다. + +- Full Composition 기본 배경 `#F5F8FB`, 원본 장식·허브 곡선·협업 화살표 유지. 조회 전용 엔진의 하위 연결선 생성 경로는 모두 숨긴다. +- 대표자 146×74, 1Depth 146×68, 하위 108×52 유지. 모든 조직 타이틀↔첫 카드 간격 8px, 직위/뱃지↔이름 행 0px. 이름만 `홍 길 동`, 직위·뱃지는 원문. +- 하위 헤더는 Workdesk 소스의 114×30.4 표면·상위 조직 Gradient·Radius 7.1·Shadow를 적용한다. HR은 18px/600/16.9, 다른 헤더는 20px/700/19.7이다. 허브는 원본 SVG 아이콘 20px·Gap 8px·텍스트 21px/750/24를 사용한다. +- 사진 없음은 원형 기본 아바타 대신 빈 사각형 예약 영역이다. 원본에 기본 이미지가 없으며 승인 카드의 기존 폭을 유지하는 디자인 조정이다. 실제 직원 사진은 포함하지 않는다. +- 우측은 직위별 표(주요 조직 하위 포함, 루트 직속, 직위별 열, 소계, 계). 가상 직원 41명·원본 조직 관계·독립 PositionSummary API를 보존한다. 상태 그룹의 카드 하단 상태 문구만 제거한다. 관계사 바는 제목 없는 한 줄이다. +- 축소는 단일 비례 배율 `min(1, 가용 폭 / Stage 폭, 실제 컨테이너 가용 높이 / Stage 높이)`다. 연결 후 실제 Shadow/호스트 조상과 viewport를 관찰한다. 임의 Header 높이나 viewport 절반 offset 제한은 없다. +- `organizationLinks`가 지정된 1Depth 제목만 링크다. `onEmployeeClick`이 없으면 Stage 바깥 native modal에서 기존 직원 정보를 조회한다. 닫기·ESC·키보드 Focus를 지원한다. +- 사용자 메뉴는 `Logo · Personnel Summary`, `Department Colors`, `Full Composition`이다. 이전 단독 Story ID는 내부 태그로 보존한다. + +실제 브라우저 측정과 미검증은 P3 보고서에 기록한다. 과거 PASS/FAIL을 이번 상태로 덮어쓰지 않는다. + +상태: 콘텐츠 설계, 실행·시각 검증 미수행. [README](README.md)의 확정 범위와 최신 Core 독립성을 따른다. Workdesk 캡처 파일은 이번 첨부에 없어 아래 구성은 사용자 텍스트의 8영역을 기준으로 한다. 실제 이미지와의 배치·색상·카드·곡선 비교는 **NOT VERIFIED**다. + +위 상태와 초기 설계 절은 과거 기록이다. 현재 조회 전용 구현은 3a절과 [P2 구현·검증 보고서](implementation-report-p2.md)를 따른다. P2에서는 읽기 전용 Workdesk 로컬 소스와 자산을 확인하고 실제 HTML·React·Storybook을 검증했다. 운영 Workdesk와의 전체 픽셀 일치 여부는 별도 미검증이다. + +## 1. 콘텐츠 구성과 데이터 연결 + +1. **제목·설명**: PresentationConfig의 title/description과 Metadata 기준일. Header·PageHeader·브랜드 Navigation을 생성하지 않는다. +2. **최상위 리더 카드**: 승인된 root 조직의 leaderId를 Employee에 연결한다. 공석·여러 root·겸직 leader 표현은 TBD다. 같은 직원을 중복 집계하지 않는다. +3. **중앙 허브**: hubText의 콘텐츠. 조직 entity인지 설명 허브인지, 리더와의 연결 방식은 TBD다. 조직장 ID나 직원 ID를 허브에 임의 부여하지 않는다. +4. **조직별 그룹**: Organization parent/type/order로 부문·실·Div를 구성한다. 조직 사이 기본 계층 연결선은 engine가 담당한다. +5. **셀·팀·구성원**: 같은 조직 계약에서 cell/team을 표현하고 직원은 organizationId로 조회한다. 이름·직위·직책·이미지/fallback·상태를 조합한다. 직원 전체를 조직 트리의 nested 원본으로 저장하지 않는다. +6. **우측 인원 현황**: 조직 직접/하위 포함·직위별 등 승인된 집계. 우측은 넓은 컨테이너에서의 배치 후보이며 작은 화면에서는 문서 흐름으로 이동하는 안을 검토한다. +7. **파견·휴직 영역**: 같은 직원 원본의 상태별 그룹. 본 조직 카드와 동시 노출/이동 표시 정책은 TBD이며 표시와 집계를 분리한다. +8. **관계사별 인원·총원**: Affiliation과 승인 정책을 사용하는 집계. 조직별 하위 포함 수를 단순 합산하지 않는다. 집계 정책 미승인 시 미확정 상태를 설명한다. + +추가 조직 관계는 OrganizationRelation에서 별도 표시한다. 관계 의미·방향·범례·곡선·anchor는 승인 전 확정하지 않는다. 관계를 parent hierarchy로 오인하지 않도록 텍스트 설명을 함께 제공하는 안을 검토한다. 고정 좌표로 인원 수나 조직 배치를 하드코딩하지 않는다. + +## 2. HM 재사용과 Core DOM 경계 + +최신 사용자 요구에 따라 Core는 React Component를 import하지 않는다. OrgChart 전용 표준 HTML/CSS가 **공통 Component를 대체하는 신규 HM primitive**가 되지 않도록 범위를 콘텐츠에 제한한다. 기존 Component·Pattern·Theme·대표 Story는 보존한다. + +재사용의 두 경로를 구별한다. + +- Core: HM CSS Custom Properties와 기존 Typography·Spacing·Radius 기준을 참조한다. 노드에는 전용 class를 쓰고 HM `data-slot` 또는 일반 Card/Avatar selector를 흉내내지 않는다. 이 예외와 기존 React 지침의 충돌은 README에 기록했다. +- React 소비 앱(Core 콘텐츠 밖): 적합한 주변 콘텐츠에서 공개 `@hm-design/ui` API를 실제 렌더링하는 방향을 검토한다. Wrapper는 Core summary/loading/error/node를 다른 HM UI로 대체하지 않는다. Core 노드마다 React root를 만드는 설계도 채택하지 않는다. 공통 Core의 콘텐츠·디자인·인터랙션을 유지한다. + +확인한 공개 자료: + +- [Card 문서](../components/card.md), [Card All](../../src/components/card.stories.tsx), [구현](../../packages/ui/src/components/ui/card.tsx): surface/content와 Header/Title/Description/Content 조합. Core 외부의 React 콘텐츠 묶음에서 재사용 후보다. +- [Avatar 문서](../components/avatar.md), [Avatar All](../../src/components/avatar.stories.tsx), [구현](../../packages/ui/src/components/ui/avatar.tsx): 이미지/fallback, sm/default/lg. Core는 ``/안전한 텍스트 fallback을 사용하고 React 호스트에서는 공개 Avatar 후보를 검토한다. +- [Table 문서](../components/table.md), [Table All](../../src/components/table.stories.tsx): 정적 표이며 정렬/선택/페이지는 DataTable 책임이다. 요청된 Summary는 동일 Core의 semantic table로 설계한다. React 소비 앱의 별도 주변 표에서 공개 Table을 검토할 수 있지만 Wrapper가 Summary를 중복 구현하지 않는다. 기존 Table 최소 폭 520px은 Core의 확정 최소 폭이 아니며 사용한 주변 표는 390px 내부 스크롤을 확인한다. +- [공개 인덱스](../guidelines/component-pattern-reference.md)의 Badge/Alert/Skeleton/ScrollArea/Button/Label은 해당 기능 확정 시 문서·대표 Story·Props를 더 확인한다. 현재 import나 재사용 PASS로 보고하지 않는다. + +Pattern 선택 근거: FilterBar는 검색·조회 조건용이다. 현재 검색/필터 요구가 없어 추가하지 않는다. DataTable의 정렬/선택/페이지도 요구가 없어 사용하지 않는 방향이다. DashboardLayout/GNB/LNB/PageHeader는 페이지 Shell/Navigation 책임이므로 제외한다. LoadingScreen은 전체 화면용이라 콘텐츠 loading에 바로 사용하지 않는다. 상태 콘텐츠는 Core가 관리하고 React 주변 조합은 기존 Alert/Skeleton을 검토한다. 이는 개발 시 선택 근거이며 구현 재사용 검증은 **NOT VERIFIED**다. + +## 3. 컨테이너·반응형·Overflow + +Core는 부모의 실제 콘텐츠 크기를 사용한다. viewport에서 Header 높이를 빼거나 GNB/LNB/Dashboard 모드를 읽지 않는다. Dashboard 소비자가 960px 내부 콘텐츠를 주는 경우에도 이를 Core 전역 최소 폭으로 일반화하지 않는다. + +390/768/1280/1440px 각각에서 콘텐츠 컨테이너를 직접 제한하여 검사한다. 숫자는 검증 기준이며 확정된 breakpoint·카드 폭이 아니다. + +- 390px: 가로 조직도 내부 스크롤·읽을 수 있는 텍스트 배율, 요약/상태 영역 흐름 배치, touch와 focus 접근을 검토한다. 전체 화면을 축소해 텍스트를 읽을 수 없게 하는 기본값은 확정하지 않는다. +- 768px: 조직 분기 wrap과 가로 스크롤, summary의 옆/아래 배치, 긴 조직명·직위·ID를 검사한다. +- 1280/1440px: 전체 계층·리더·허브·우측 summary·추가 관계·직원 카드의 겹침과 여백을 검사한다. +- 조직 수·깊이·직원 수가 증가하면 내부 scroll container가 확장되고 페이지 전체 가로 Overflow는 발생하지 않아야 한다. CSS transform zoom은 layout 크기와 다를 수 있으므로 보이는 영역과 scrollWidth/clientWidth를 함께 측정한다. +- `ResizeObserver`·이미지 로드·폰트 로드·노드 확장·줌·스크롤마다 Overlay 좌표가 동일 좌표계에서 갱신돼야 한다. transform 중복 적용과 stale anchor를 검사한다. +- 모바일 방식은 내부 가로 scroll, branch 축소, 세로 대체 표현 중 PoC로 결정한다. 대체 표현은 승인 전 추가 개발 요구로 만들지 않는다. 최소 콘텐츠 폭·zoom 한계·초기 배율·wheel 우선순위·높이 제약·스크롤 책임은 TBD다. + +문서와 내부 컨테이너의 scrollWidth/clientWidth 및 scrollHeight/clientHeight를 기록한다. absolute 알림/overlay의 위치 기준은 해당 인스턴스의 relative 컨테이너여야 한다. 긴 label 줄바꿈과 ID 한 줄 식별 가능성, 접힌 영역에 숨은 focus, 두 인스턴스의 독립 scroll/zoom을 검사한다. + +### 3a. 조회 전용 Full Composition (`displayMode: 'readOnly'`, 2026-10-12) + +- Storybook `OrgChart / Full Composition`, HTML·React `p1.html?mode=readOnly`가 사용한다. 기본값 `interactive`와 내부 검증 Story·독립 컴포넌트는 변경하지 않는다. +- 생성하지 않는 요소: 하위 조직 접기/펼치기 button, 조직 종류·ID·원본 직원 수·조직장 안내 문구, 제목 설명·추가 관계 안내, 상태 그룹 정책 문구. 조직 그룹 외곽 카드(배경·Border·Radius·Padding)는 CSS로 제거하고 조직/셀·팀 헤더·카드·연결선은 유지한다. +- 배치: Workdesk 실측 1920 × 914.5 캔버스, 대표자·허브 축 X 935, 조직 헤더 X 32/268/505/858/1336/1689(`core/workdesk-layout.ts`, organization ID 기준 presentation preset). 통합시스템 Div·디자인기획 하위는 가로, 나머지는 세로. preset이 없는 조직이 있으면 중앙 흐름 배치로 대체한다. +- 요약: 우측 상단 `조직별 인원 현황`(루트 직속 + 주요 조직 하위 포함 인원 + 계), 좌하단 파견·휴직(제목 108px pill, 카드 유지), 하단 관계사 바(제목 없음, 로고·회사명·인원·총계). 모두 같은 Summary/selector에서 계산한다. +- 축소: `scale = min(1, 가용 폭 / 1920, (viewport 높이 − 문서 offset) / 914.5)`(offset은 viewport 절반까지만 반영). transform scale 1회, 내부 가로 스크롤 없음. +- P2 카드: 실제 `parentId` 조상 관계로 Depth를 계산한다. 대표자 146×74, 1Depth 조직장만 146×68, 2Depth 이하 조직장은 해당 부서의 108×52 소형 SVG를 사용한다. semantic leader와 직책 뱃지는 유지하며 interactive·독립 카드 선택은 보존한다. 전달 자산이 없는 조직의 기존 fallback 정책은 유지한다. +- 최신 확정 표시: 조회 전용 직원 이름은 대표자·파견·휴직을 포함해 모두 `홍 길 동`. 직위·직책·이름의 연속 한글 사이에는 표시 계층에서 공백을 넣고 접근성 이름은 원문을 사용한다. 원본 JSON 이름·ID·조직·인원 계산은 변경하지 않는다. 기존 font-size/weight/line-height/color와 내부 0px 행 간격을 유지한다. +- P2 간격: 1Depth 헤더 높이 36px, Y 약 254.19px, 대형 카드 사이 실제 8px. 2Depth 헤더와 첫 카드 사이 실제 10px. 하단 상태/관계사 슬롯은 측정 캔버스 내에서 고정 배치하여 전체 높이 914.5px와 겹침 없는 배치를 유지한다. +- P2 장식: `core/workdesk-artwork.ts`가 원본 compact 허브 곡선 3개·중앙선·사업관리 추가 곡선, PNG 협업 화살표 5개와 배경/허브 이미지 5개를 같은 Stage에 렌더한다. 원본 9종 자산은 byte 그대로 복사하고 ESM/IIFE에 포함한다. 기존 상단 pseudo 연결선은 이 preset에서 제거한다. 하위 팀의 실사용 원본 SVG는 없어 기존 engine 관계 경로를 유지한다. +- P2 검증: HTML HTTP·classic file://·React production·Storybook에서 1920/1440/1280/768/390px 484건 PASS. Guard 원본의 NOT VERIFIED와 런타임 PASS는 별도 증거로 보존한다. 상세 측정·남은 차이·기존 FAIL은 P2 보고서에 기록한다. + +## 4. 접근성·상태·개인정보 + +Core DOM은 제목 계층·조직/직원 그룹·표의 caption/header를 semantic하게 구성한다. engine 기본 DOM이 완전한 ARIA tree라고 가정하지 않는다. tree 역할 채택 시 키보드 계약 전체를 검증하고, 그렇지 않으면 계층 설명을 제공할 구조를 검토한다. + +확장·축소/zoom 조작이 구현될 경우 키보드로 접근 가능한 표준 button과 접근성 이름·focus indicator·disabled 상태를 제공한다. readOnly 데이터 조직도에 수정·drag 메뉴를 추가하지 않는다. 상호작용 후 focus 복귀, 제거된 노드 focus 이동, 오류/로딩 안내의 screen reader 노출과 과도한 알림을 검사한다. 입력 컨트롤이 새로 승인되면 React 호스트는 공개 Label, Core는 framework 독립성 때문에 native label/control 연결을 명시한다. + +이미지 접근 실패는 가상 fallback을 보여주며 불필요한 이름 중복 읽기를 피한다. 사진의 origin·권한·실패 정책은 API 연동 시 결정한다. 직원 ID·이름·사진 원본을 로그/오류 메시지에 무분별하게 남기지 않는다. reference의 실제 인물을 fixture로 재사용하지 않는다. + +Loading/Empty/Error/Ready, 직원 없는 조직, 공석 leader, 상태 그룹 비어 있음, 정책 없는 집계, 갱신 중 상태를 별도 검증한다. 갱신 중 기존 화면 유지와 부분 오류 허용 정책은 TBD다. 사용자 검토 전에 이러한 설계 후보를 기능 PASS로 표시하지 않는다. diff --git a/examples/org-chart-react/README.md b/examples/org-chart-react/README.md new file mode 100644 index 0000000..887a7ad --- /dev/null +++ b/examples/org-chart-react/README.md @@ -0,0 +1,82 @@ +# OrgChart React public-package consumer + +## P3 follow-up + +`p1.html?mode=readOnly` uses the updated common Core with the position matrix, +group links and employee information dialog. No navigation URLs are preset. +The development-only `window.OrgChartP1React.setOptions({ organizationLinks, +onEmployeeClick })` helper applies public React props to the current fixture; +it is not a new Core handle method. `setData` remains available. + +After building Core/Wrapper and both examples, run the focused +`node examples/org-chart/verify-p3.mjs`. Evidence goes to +`test-results/org-chart-p3`; prior P1/P2 scripts and results remain unchanged. + +This independent Vite consumer imports the built public entries of +`@hm-design/org-chart-react`, `@hm-design/org-chart` and `@hm-design/ui/theme.css`. +It imports the original Vanilla v1/v2 JSON files directly. It is a verification +example, with fictitious data and a `window.OrgChartReactDemo` inspection seam; +it has no server/login integration or production business controls. + +From the repository root, build packages before the consumer: + +```sh +npm run build:packages +npm run build:org-chart-react-example +npm run dev:org-chart-react-example +``` + +Development URL: `http://127.0.0.1:6026/` (strict port). Strict Mode effect replay +is checked in development. The production output has its own HTTP browser smoke +and update checks. This ESM output is for HTTP deployment; it is not a direct-open +`file://` artifact. The existing Vanilla `examples/org-chart/dist/classic.html` +remains the direct-open example. + +Core CSS URL imports become deployment assets and are passed into each Shadow DOM. +The public HM Theme import emits its existing font assets. Grid/flex consumers +must allow their chart-containing items to shrink (`min-width: 0`); horizontal +overflow belongs to the Core viewport rather than the document. + +Browser tooling is supplied by the verification environment, not added to the +package dependencies. Configure `ORGCHART_PLAYWRIGHT_MODULE` and optionally +`ORGCHART_CHROME`, using absolute paths. Start the separate Storybook server on +6025 and consumer on 6026, then: + +```sh +# Set these environment variables using your shell's syntax: +# ORGCHART_CONSUMER_URL=http://127.0.0.1:6026 +# ORGCHART_STORYBOOK_URL=http://127.0.0.1:6025 +npm run test:org-chart-react-browser +node examples/org-chart-react/verify-boundaries.mjs +``` + +`verify.mjs` inspects real Core DOM, compares Vanilla/React snapshots, exercises +React and Storybook lifecycles and records screenshots/metrics at four widths. +`verify-boundaries.mjs` checks production updates, source identity semantics, +actual horizontal scrolling, global CSS isolation and direct-open Vanilla smoke. +Both write evidence under ignored `test-results/org-chart-react/`. + +To check the actual package archive and declarations without another build: + +```sh +npm pack -w @hm-design/org-chart --ignore-scripts --pack-destination test-results +npm pack -w @hm-design/org-chart-react --ignore-scripts --pack-destination test-results +node examples/org-chart-react/verify-package.mjs +``` + +The tarball test uses extracted Core/Wrapper packages with the environment's +React/compiler; it does not establish a fresh remote-registry installation. + +## P2 read-only Full Composition + +Open `p1.html?mode=readOnly` to use the same read-only Core composition as the +Vanilla example and Storybook `orgchart--full-composition`. Plain `p1.html` +retains the existing interactive mode. The query changes presentation only. +All displayed names are `홍 길 동`; the employee fixture and aggregation remain +unchanged. Department leaders use card assets by actual ancestry depth. + +After building the Core, preparing the HTML example and building this consumer, +run `node examples/org-chart/verify-p2.mjs` from the repository root. Set +`ORGCHART_STORYBOOK_URL` to the current Storybook server when checking dev. +The focused verifier records screenshots and measurements in +`test-results/org-chart-p2`; it preserves existing v0/P1 test expectations. diff --git a/examples/org-chart-react/app.tsx b/examples/org-chart-react/app.tsx new file mode 100644 index 0000000..a47e6b6 --- /dev/null +++ b/examples/org-chart-react/app.tsx @@ -0,0 +1,91 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { OrgChart, type OrgChartProps } from '@hm-design/org-chart-react'; +import { JsonOrgChartDataSource, type OrgChartDataSource, type OrgChartState } from '@hm-design/org-chart'; +import engineUrl from '@hm-design/org-chart/engine.css?url'; +import coreUrl from '@hm-design/org-chart/style.css?url'; +import v1 from '../org-chart/data-v1.json'; +import v2 from '../org-chart/data-v2.json'; +import './index.css'; + +// An independent production-built consumer of public package entries. This +// inspection seam exercises React Props only; it never reaches into the engine. +const events: { instance: string; callback: number; state: OrgChartState }[] = []; +const lifecycleErrors: string[] = []; +const requests: Record = {}; +function track(name: string, source: OrgChartDataSource): OrgChartDataSource { + requests[name] = { loads: 0, aborts: 0 }; + return { + load(options) { + requests[name].loads++; + options?.signal?.addEventListener('abort', () => { requests[name].aborts++; }, { once: true }); + return source.load(options); + }, + }; +} +const noEmployees = structuredClone(v1); +noEmployees.employees = []; +for (const organization of noEmployees.organizations) organization.leaderId = null; +const noOrganizations = structuredClone(v1); +noOrganizations.organizations = []; +const sources = { + v1: track('v1', new JsonOrgChartDataSource(v1)), + v2: track('v2', new JsonOrgChartDataSource(v2)), + zeroEmployees: track('zeroEmployees', new JsonOrgChartDataSource(noEmployees)), + zeroOrganizations: track('zeroOrganizations', new JsonOrgChartDataSource(noOrganizations)), + error: track('error', { async load() { throw new Error('Fictitious source failure'); } }), +}; +let releaseSlow: (() => void) | undefined; +const slowSource = track('slow', { + load() { return new Promise(resolve => { releaseSlow = () => resolve(structuredClone(v1)); }); }, +}); +type Configuration = { + sourceA: OrgChartDataSource; + sourceB: OrgChartDataSource; + mountedA: boolean; + mountedB: boolean; + callback: number; + aggregationPolicy: OrgChartProps['aggregationPolicy']; + stylesheetUrls: OrgChartProps['stylesheetUrls']; + className: string; +}; +let configuration: Configuration = { + sourceA: sources.v1, sourceB: sources.v2, mountedA: true, mountedB: false, + callback: 1, aggregationPolicy: undefined, + stylesheetUrls: { engine: engineUrl, core: coreUrl }, className: 'consumer-chart', +}; +const root = createRoot(document.getElementById('root')!); +function render(patch: Partial = {}) { + configuration = { ...configuration, ...patch }; + const callback = configuration.callback; + const chart = (instance: 'A' | 'B', source: OrgChartDataSource) => ( +
+ { events.push({ instance, callback, state }); }} + onLifecycleError={error => { lifecycleErrors.push(error instanceof Error ? error.message : String(error)); }} + /> +
+ ); + root.render( + +

가상 JSON 데이터 · React Strict Mode · 공개 OrgChart 패키지 사용

+
+ {configuration.mountedA && chart('A', configuration.sourceA)} + {configuration.mountedB && chart('B', configuration.sourceB)} +
+
, + ); +} +const demo = { + render, sources, slowSource, events, lifecycleErrors, requests, + releaseSlow: () => releaseSlow?.(), + get configuration() { return configuration; }, + destroy: () => root.unmount(), +}; +declare global { interface Window { OrgChartReactDemo: typeof demo } } +window.OrgChartReactDemo = demo; +render(); diff --git a/examples/org-chart-react/index.css b/examples/org-chart-react/index.css new file mode 100644 index 0000000..b73a8af --- /dev/null +++ b/examples/org-chart-react/index.css @@ -0,0 +1,9 @@ +@import "@hm-design/ui/theme.css"; + +/* Consumer content geometry; the chart owns its internal scroll container. */ +body { margin: 0; background: var(--hm-sem-bg-content); color: var(--hm-sem-fg-primary); font-family: var(--hm-font-family-base); } +main { padding: 16px; } +.consumer-charts { display: grid; gap: 24px; min-width: 0; } +.consumer-charts > section { min-width: 0; } +.consumer-chart { min-width: 0; max-width: 100%; } +.consumer-note { margin: 0 0 16px; } diff --git a/examples/org-chart-react/index.html b/examples/org-chart-react/index.html new file mode 100644 index 0000000..1a8ae70 --- /dev/null +++ b/examples/org-chart-react/index.html @@ -0,0 +1,13 @@ + + + + + + + HM OrgChart React Consumer + + +
+ + + diff --git a/examples/org-chart-react/p1.css b/examples/org-chart-react/p1.css new file mode 100644 index 0000000..cdbbf63 --- /dev/null +++ b/examples/org-chart-react/p1.css @@ -0,0 +1,12 @@ +/* Bundler resolves the same font used by HTML and the HM Storybook host. */ +@font-face { + font-family: 'Noto Sans KR'; + src: url('../../public/fonts/NotoSansKR-variable.ttf') format('truetype'); + font-style: normal; + font-weight: 100 900; + font-display: swap; +} +body { margin: 0; background: #ffffff; } +main { padding: 16px; } +.consumer-chart { min-width: 0; } +html[data-orgchart-mode="readOnly"] body { background: #F5F8FB; } diff --git a/examples/org-chart-react/p1.html b/examples/org-chart-react/p1.html new file mode 100644 index 0000000..35319f0 --- /dev/null +++ b/examples/org-chart-react/p1.html @@ -0,0 +1,5 @@ + + +HM OrgChart P1 · React Full Composition +
+ diff --git a/examples/org-chart-react/p1.tsx b/examples/org-chart-react/p1.tsx new file mode 100644 index 0000000..31ea8f9 --- /dev/null +++ b/examples/org-chart-react/p1.tsx @@ -0,0 +1,32 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { OrgChart, type OrgChartProps } from '@hm-design/org-chart-react'; +import { JsonOrgChartDataSource, type OrgChartState } from '@hm-design/org-chart'; +import engineUrl from '@hm-design/org-chart/engine.css?url'; +import coreUrl from '@hm-design/org-chart/style.css?url'; +import fixture from '../org-chart/data-p1.json'; +import './p1.css'; + +const root = createRoot(document.getElementById('root')!); +const events: OrgChartState[] = []; +const errors: string[] = []; +const displayMode = new URLSearchParams(location.search).get('mode') === 'readOnly' ? 'readOnly' : 'interactive'; +document.documentElement.dataset.orgchartMode = displayMode; +type QueryOptions = Pick; +let queryOptions: QueryOptions = {}; +let currentData: unknown = fixture; +function setData(data: unknown) { + currentData = data; + root.render( events.push(state)} onLifecycleError={error => errors.push(String(error))} + />); +} +// Optional public-prop seam for consumer integration checks; no URLs are preset. +function setOptions(options: QueryOptions) { queryOptions = options; setData(currentData); } +const demo = { data: fixture, events, errors, setData, setOptions, destroy: () => root.unmount() }; +declare global { interface Window { OrgChartP1React: typeof demo } } +window.OrgChartP1React = demo; +setData(fixture); diff --git a/examples/org-chart-react/verify-boundaries.mjs b/examples/org-chart-react/verify-boundaries.mjs new file mode 100644 index 0000000..2af120b --- /dev/null +++ b/examples/org-chart-react/verify-boundaries.mjs @@ -0,0 +1,72 @@ +import assert from 'node:assert/strict'; +import http from 'node:http'; +import path from 'node:path'; +import { readFile, writeFile } from 'node:fs/promises'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const root = fileURLToPath(new URL('../../', import.meta.url)); +const { chromium } = await import(process.env.ORGCHART_PLAYWRIGHT_MODULE ? pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href : 'playwright'); +const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://localhost'); + const file = path.resolve(root, 'examples/org-chart-react/dist', '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const base = path.join(root, 'examples/org-chart-react/dist'); + const relative = path.relative(base, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) { response.writeHead(403).end(); return; } + response.setHeader('Content-Type', { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.ttf': 'font/ttf' }[path.extname(file)] || 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } +}); +await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); +const browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME || 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); +const results = [], errors = []; +const check = (condition, name, detail) => { results.push({ name, status: condition ? 'PASS' : 'FAIL', detail }); assert.ok(condition, name); }; +try { + const page = await browser.newPage({ viewport: { width: 390, height: 900 } }); + page.on('pageerror', error => errors.push(error.message)); + page.on('console', message => { if(message.type() === 'error') errors.push(message.text()); }); + await page.goto(`http://127.0.0.1:${server.address().port}`); + await page.waitForFunction(() => window.OrgChartReactDemo?.events.at(-1)?.state.status === 'ready'); + check(await page.evaluate(() => window.OrgChartReactDemo.requests.v1.loads === 1 && window.OrgChartReactDemo.events.filter(event => event.state.status === 'ready').length === 1), 'production mount has one initial load and one ready callback'); + const layout = await page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot, viewport = shadow.querySelector('.hm-orgchart-viewport'); + viewport.scrollLeft = viewport.scrollWidth - viewport.clientWidth; + return { width: document.documentElement.clientWidth, documentScrollWidth: document.documentElement.scrollWidth, internalScrollLeft: viewport.scrollLeft }; + }); + check(layout.documentScrollWidth <= 390 && layout.internalScrollLeft > 0, 'production 390px page containment and actual internal horizontal scrolling', layout); + const pollution = await page.evaluate(() => { + const container = document.createElement('div'), node = document.createElement('div'); + node.textContent = 'Light DOM CSS isolation probe'; container.append(node); document.body.append(container); + const read = () => { const style = getComputedStyle(node); return { width: style.width, margin: style.margin, background: style.backgroundColor, textAlign: style.textAlign, border: style.border, font: style.fontFamily }; }; + const before = read(); container.className = 'orgchart'; node.className = 'node'; const after = read(); container.remove(); + return { before, after }; + }); + check(JSON.stringify(pollution.before) === JSON.stringify(pollution.after), 'Engine selectors do not pollute light DOM', pollution); + const hostId = await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance'); + await page.evaluate(async () => { + const demo = window.OrgChartReactDemo; + const next = await demo.sources.v2.load(); + demo.sources.v1.load = async () => structuredClone(next); + demo.render({ callback: 9, className: 'consumer-chart boundary' }); + }); + await page.waitForFunction(() => document.querySelector('.consumer-chart.boundary')); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === hostId && await page.evaluate(() => window.OrgChartReactDemo.events.at(-1).state.summary.raw.total === 4), 'same source internal mutation and unrelated render do not imply reload'); + await page.evaluate(() => { const demo = window.OrgChartReactDemo; demo.render({ sourceA: { load: options => demo.sources.v1.load(options) } }); }); + await page.waitForFunction(() => window.OrgChartReactDemo.events.at(-1)?.state.dataVersion === 'mock-2'); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === hostId && await page.evaluate(() => window.OrgChartReactDemo.events.at(-1).state.summary.raw.total === 5 && window.OrgChartReactDemo.events.at(-1).callback === 9), 'production source identity update uses same Core with new 5-person summary and latest callback'); + await page.evaluate(() => window.OrgChartReactDemo.render({ mountedA: false })); + await page.waitForFunction(() => !document.querySelector('.hm-orgchart-host')); + check(await page.locator('.hm-orgchart-host').count() === 0, 'production unmount removes Core'); + await page.goto(pathToFileURL(path.join(root, 'examples/org-chart/dist/classic.html')).href); + await page.waitForFunction(() => window.orgChartReady); + check(await page.evaluate(() => window.OrgChartDemo.chart.getState().summary.raw.total === 4), 'existing direct-open Vanilla classic remains ready with common v1 total 4'); + await page.evaluate(() => window.OrgChartDemo.update()); + check(await page.evaluate(() => window.OrgChartDemo.chart.getState().summary.raw.total === 5), 'existing direct-open Vanilla classic v2 update remains total 5'); + check(errors.length === 0, 'boundary browser checks have zero console/runtime errors', errors); +} catch(error) { + results.push({ name: 'verification completion', status: 'FAIL', detail: error.stack }); process.exitCode = 1; +} finally { + await writeFile(path.join(root, 'test-results/org-chart-react/boundaries.json'), JSON.stringify({ browser: await browser.version(), results, errors }, null, 2)); + await browser.close(); await new Promise(resolve => server.close(resolve)); + console.log(JSON.stringify({ pass: results.filter(result => result.status === 'PASS').length, fail: results.filter(result => result.status === 'FAIL').length, errors })); +} diff --git a/examples/org-chart-react/verify-package.mjs b/examples/org-chart-react/verify-package.mjs new file mode 100644 index 0000000..eaba13b --- /dev/null +++ b/examples/org-chart-react/verify-package.mjs @@ -0,0 +1,52 @@ +import assert from 'node:assert/strict'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import { execFileSync } from 'node:child_process'; +import path from 'node:path'; + +const root = fileURLToPath(new URL('../../', import.meta.url)); +const consumer = path.join(root, 'test-results/org-chart-react/tarball-consumer'); +await mkdir(consumer, { recursive: true }); +for (const name of ['org-chart', 'org-chart-react']) { + const destination = path.join(consumer, 'node_modules/@hm-design', name); + await mkdir(destination, { recursive: true }); + execFileSync('tar.exe', ['-xzf', path.join(root, `test-results/hm-design-${name}-0.1.0.tgz`), '-C', destination, '--strip-components=1']); +} +await writeFile(path.join(consumer, 'package.json'), JSON.stringify({ name: 'org-chart-react-tarball-consumer', private: true, type: 'module' })); +const require = createRequire(path.join(consumer, 'package.json')); +const module = await import(pathToFileURL(require.resolve('@hm-design/org-chart-react')).href); +assert.deepEqual(Object.keys(module), ['OrgChart']); +assert.equal(typeof module.OrgChart, 'function'); +const manifest = JSON.parse(await readFile(path.join(consumer, 'node_modules/@hm-design/org-chart-react/package.json'), 'utf8')); +assert.deepEqual(manifest.dependencies, { '@hm-design/org-chart': '0.1.0' }); +assert.deepEqual(manifest.peerDependencies, { react: '^19.0.0' }); +const bundle = await readFile(require.resolve('@hm-design/org-chart-react'), 'utf8'); +assert.ok(bundle.startsWith('"use client";')); +for (const dependency of ['react', 'react/jsx-runtime', '@hm-design/org-chart']) assert.ok(bundle.includes(`from "${dependency}"`) || bundle.includes(`from '${dependency}'`)); +assert.ok(!bundle.includes('ManagedOrgChart') && !bundle.includes('validateOrgChartDataset') && !bundle.includes('JsonOrgChartDataSource')); +await writeFile(path.join(consumer, 'consumer.tsx'), `import { OrgChart, type OrgChartProps, type OrgChartDataSource, type OrgChartState, type OrgChartDataset } from '@hm-design/org-chart-react'; +import { JsonOrgChartDataSource } from '@hm-design/org-chart'; +declare const data: OrgChartDataset; +const source: OrgChartDataSource = new JsonOrgChartDataSource(data); +const props: OrgChartProps = { dataSource: source, stylesheetUrls: { engine: './engine.css', core: './style.css' }, onStateChange(state: OrgChartState) { if(state.status === 'ready') void state.summary.raw.total; }, onLifecycleError(error: unknown) { void error; } }; +export const consumer = ; +// @ts-expect-error dataSource is a required Core source interface +export const missingSource = ; +// @ts-expect-error wrapper does not expose engine controls +export const unsupportedZoom = ; +// @ts-expect-error Core-owned container cannot be supplied through React Props +export const unsupportedContainer = ; +`); +await writeFile(path.join(consumer, 'tsconfig.json'), JSON.stringify({ compilerOptions: { target: 'ES2022', module: 'NodeNext', moduleResolution: 'NodeNext', jsx: 'react-jsx', strict: true, noEmit: true, skipLibCheck: false, types: ['react'] }, include: ['consumer.tsx'] })); +const localRequire = createRequire(import.meta.url); +const typescriptManifest = localRequire.resolve('typescript/package.json'); +const typescript = JSON.parse(await readFile(typescriptManifest, 'utf8')); +execFileSync(process.execPath, [path.resolve(path.dirname(typescriptManifest), typescript.bin.tsc), '-p', path.join(consumer, 'tsconfig.json')], { stdio: 'inherit' }); +const report = { + status: 'PASS', + checks: ['Actual tarball runtime/public export without DOM', 'Strict NodeNext declarations using extracted Core/Wrapper', 'Required source and unsupported Props type boundaries', 'React/Core remain external', 'ESM client boundary retained'], + limitation: 'React and compiler supplied by verification environment; fresh remote-registry dependency installation and SSR/hydration are not verified.', +}; +await writeFile(path.join(consumer, 'report.json'), JSON.stringify(report, null, 2)); +console.log(JSON.stringify(report)); diff --git a/examples/org-chart-react/verify.mjs b/examples/org-chart-react/verify.mjs new file mode 100644 index 0000000..0a3f046 --- /dev/null +++ b/examples/org-chart-react/verify.mjs @@ -0,0 +1,312 @@ +import assert from 'node:assert/strict'; +import http from 'node:http'; +import path from 'node:path'; +import { readFile, mkdir, writeFile } from 'node:fs/promises'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-react'); +await mkdir(output, { recursive: true }); +const modulePath = process.env.ORGCHART_PLAYWRIGHT_MODULE; +const { chromium } = await import(modulePath ? pathToFileURL(modulePath).href : 'playwright'); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.json': 'application/json', '.css': 'text/css', '.ttf': 'font/ttf', '.woff2': 'font/woff2', '.svg': 'image/svg+xml' }; +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://localhost'); + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) { response.writeHead(403).end(); return; } + response.setHeader('Content-Type', mime[path.extname(file)] || 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + return { server, origin: `http://127.0.0.1:${server.address().port}` }; +} +const consumer = await serve(path.join(root, 'examples/org-chart-react/dist')); +const vanilla = await serve(path.join(root, 'examples/org-chart/dist')); +const storybook = await serve(path.join(root, 'storybook-static')); +const browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME || 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); +const results = [], errors = [], metrics = [], snapshots = {}; +function check(condition, name, detail) { + results.push({ name, status: condition ? 'PASS' : 'FAIL', detail }); + assert.ok(condition, `${name}: ${JSON.stringify(detail)}`); +} +function captureErrors(page, transport) { + page.on('pageerror', error => errors.push({ transport, type: 'pageerror', message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ transport, type: 'console', message: message.text() }); }); +} +async function snapshot(page, selector = '.hm-orgchart-host') { + return page.locator(selector).first().evaluate(host => { + const shadow = host.shadowRoot; + const nodes = [...shadow.querySelectorAll('.node')]; + return { + organizations: nodes.map(node => ({ + id: node.dataset.organizationId, + parentId: node.parentElement.parentElement.closest('.hierarchy')?.querySelector(':scope > .node')?.dataset.organizationId || null, + employees: [...node.querySelectorAll('.hm-orgchart-employee')].map(employee => employee.dataset.employeeId), + text: node.querySelector('.hm-orgchart-organization').textContent, + })), + summary: shadow.querySelector('.hm-orgchart-summary')?.textContent, + heading: shadow.querySelector('.hm-orgchart-heading')?.textContent, + css: [...shadow.querySelectorAll('link')].map(link => ({ href: link.href, loaded: !!link.sheet })), + style: (() => { const s = getComputedStyle(shadow.querySelector('.hm-orgchart-organization')); return { color: s.color, background: s.backgroundColor, font: s.fontFamily, radius: s.borderRadius }; })(), + }; + }); +} +async function ready(page, instance = 'A', version) { + await page.waitForFunction(({ instance, version }) => { + const event = window.OrgChartReactDemo.events.filter(event => event.instance === instance).at(-1); + const host = document.querySelector(`[data-instance="${instance}"] .hm-orgchart-host`); + return !!host?.shadowRoot.querySelector('.hm-orgchart-shell[aria-busy="false"] .node') && event?.state.status === 'ready' && (!version || event.state.dataVersion === version); + }, { instance, version }); +} +async function patch(page, value) { await page.evaluate(value => window.OrgChartReactDemo.render(value), value); } +async function source(page, name, instance = 'A') { + await page.evaluate(({ name, instance }) => window.OrgChartReactDemo.render({ [`source${instance}`]: window.OrgChartReactDemo.sources[name] }), { name, instance }); +} +try { + const context = await browser.newContext({ viewport: { width: 1440, height: 1100 } }); + await context.addInitScript(() => { + const NativeObserver = window.MutationObserver; + const observers = new Map(); + window.MutationObserver = class extends NativeObserver { + observe(...args) { observers.set(this, args[0]); return super.observe(...args); } + disconnect() { observers.delete(this); return super.disconnect(); } + }; + window.chartObservers = () => [...observers.values()].filter(target => target.getRootNode()?.host?.classList.contains('hm-orgchart-host')).length; + }); + const html = await context.newPage(); + captureErrors(html, 'vanilla-http'); + await html.goto(`${vanilla.origin}/index.html`); + await html.waitForFunction(() => window.orgChartReady); + snapshots.htmlV1 = await snapshot(html); + const page = await context.newPage(); + captureErrors(page, 'react-production'); + if (process.env.ORGCHART_CONSUMER_URL) { + const production = await context.newPage(); captureErrors(production, 'react-production'); + await production.goto(consumer.origin); await ready(production, 'A', 'mock-1'); + snapshots.reactProduction = await snapshot(production); + check(JSON.stringify(snapshots.reactProduction.organizations) === JSON.stringify(snapshots.htmlV1.organizations) && snapshots.reactProduction.css.every(link => link.loaded), 'independent production React Consumer: public imports, assets and identical HTML nodes'); + await production.close(); + } + await page.goto(process.env.ORGCHART_CONSUMER_URL || consumer.origin); + await ready(page, 'A', 'mock-1'); + snapshots.reactV1 = await snapshot(page); + check(JSON.stringify(snapshots.reactV1.organizations) === JSON.stringify(snapshots.htmlV1.organizations), 'HTML/React v1 hierarchy, employee placement and identical node UI', snapshots.reactV1.organizations); + check(snapshots.reactV1.summary === snapshots.htmlV1.summary && snapshots.reactV1.heading === snapshots.htmlV1.heading, 'HTML/React v1 identical summary and presentation'); + check(JSON.stringify(snapshots.reactV1.style) === JSON.stringify(snapshots.htmlV1.style), 'HTML/React identical computed theme', snapshots.reactV1.style); + check(snapshots.reactV1.css.length === 2 && snapshots.reactV1.css.every(link => link.loaded), 'production Shadow DOM CSS assets loaded', snapshots.reactV1.css); + const initial = await page.evaluate(() => ({ events: window.OrgChartReactDemo.events, requests: window.OrgChartReactDemo.requests, observers: window.chartObservers() })); + const expectedLoads = process.env.ORGCHART_CONSUMER_URL ? 2 : 1; + check(initial.requests.v1.loads === expectedLoads && initial.events.filter(event => event.state.status === 'ready').length === 1, 'Strict Mode: expected initial load count and single ready (development replay; production single setup)', initial); + check(await page.locator('.hm-orgchart-host').count() === 1, 'Strict Mode: exactly one active Core host'); + const hostId = await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance'); + await patch(page, { callback: 2, className: 'consumer-chart changed' }); + await page.waitForFunction(() => document.querySelector('.consumer-chart.changed')); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === hostId && (await page.evaluate(() => window.OrgChartReactDemo.requests.v1.loads)) === expectedLoads, 'callback/className-only render retains Core and does not reload'); + await source(page, 'v2'); + await ready(page, 'A', 'mock-2'); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === hostId, 'source identity uses reload on the same Core host'); + const stateV2 = await page.evaluate(() => window.OrgChartReactDemo.events.at(-1)); + check(stateV2.callback === 2 && stateV2.state.summary.raw.total === 5 && stateV2.state.summary.raw.byOrganization['team-a'].direct === 1 && stateV2.state.summary.raw.byOrganization['team-b'].direct === 3, 'latest callback and v2 expected 1/1/3 placement, total 5', stateV2); + await html.evaluate(() => window.OrgChartDemo.update()); + snapshots.htmlV2 = await snapshot(html); + snapshots.reactV2 = await snapshot(page); + check(JSON.stringify(snapshots.reactV2.organizations) === JSON.stringify(snapshots.htmlV2.organizations) && snapshots.reactV2.summary === snapshots.htmlV2.summary, 'HTML/React v2 data, hierarchy, employee nodes and aggregation parity'); + + for (const width of [390, 768, 1280, 1440]) { + await page.setViewportSize({ width, height: 1100 }); + await page.evaluate(() => document.fonts.ready); + const metric = await page.locator('.hm-orgchart-host').evaluate(host => { + const shadow = host.shadowRoot, viewport = shadow.querySelector('.hm-orgchart-viewport'); + const rectangles = [...shadow.querySelectorAll('.node')].map(node => node.getBoundingClientRect()); + const overlap = rectangles.some((a, index) => rectangles.slice(index + 1).some(b => Math.min(a.right, b.right) - Math.max(a.left, b.left) > 1 && Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top) > 1)); + const organization = shadow.querySelector('.hm-orgchart-organization'), style = getComputedStyle(organization); + const probe = document.createElement('div'); + probe.style.color = 'var(--hm-sem-fg-primary)'; probe.style.background = 'var(--hm-sem-bg-surface)'; probe.style.borderRadius = 'var(--hm-radius-container)'; shadow.append(probe); + const expectedStyle = getComputedStyle(probe), expected = { color: expectedStyle.color, background: expectedStyle.backgroundColor, radius: expectedStyle.borderRadius }; + const match = expected.color === style.color && expected.background === style.backgroundColor && expected.radius === style.borderRadius; + probe.remove(); + const nodes = [...shadow.querySelectorAll('.node')], rect = nodes[0].getBoundingClientRect(); + const centers = nodes.slice(1).map(node => { const r = node.getBoundingClientRect(); return r.x + r.width / 2; }); + return { + document: { clientWidth: document.documentElement.clientWidth, scrollWidth: document.documentElement.scrollWidth, clientHeight: document.documentElement.clientHeight, scrollHeight: document.documentElement.scrollHeight }, + host: { clientWidth: host.clientWidth, scrollWidth: host.scrollWidth, clientHeight: host.clientHeight, scrollHeight: host.scrollHeight }, + viewport: { clientWidth: viewport.clientWidth, scrollWidth: viewport.scrollWidth, clientHeight: viewport.clientHeight, scrollHeight: viewport.scrollHeight, overflowX: getComputedStyle(viewport).overflowX }, + overlap, themeMatch: match, expected, color: style.color, background: style.backgroundColor, radius: style.borderRadius, font: style.fontFamily, + fontLoaded: document.fonts.check('13px "Noto Sans KR"'), idWhiteSpace: getComputedStyle(shadow.querySelector('.hm-orgchart-domain-id')).whiteSpace, + connectorsAligned: Math.abs(rect.x + rect.width / 2 - (centers[0] + centers[1]) / 2) < 2, + connectorTheme: getComputedStyle(nodes[1], '::before').backgroundColor === getComputedStyle(viewport).borderTopColor, + }; + }); + metrics.push({ width, ...metric }); + check(metric.document.scrollWidth <= width && metric.host.scrollWidth <= metric.host.clientWidth && metric.viewport.overflowX === 'auto' && !metric.overlap, `${width}px container overflow/scroll/no overlap`, metric); + check(metric.themeMatch && metric.font.includes('Noto Sans KR') && metric.fontLoaded && metric.idWhiteSpace === 'nowrap' && metric.connectorsAligned && metric.connectorTheme, `${width}px theme/fonts/IDs/connectors`, metric); + await page.screenshot({ path: path.join(output, `react-consumer-${width}.png`), fullPage: true }); + } + const toggle = page.locator('.hm-orgchart-toggle').first(); + await toggle.focus(); await toggle.press('Enter'); + await page.waitForFunction(() => !document.querySelector('.hm-orgchart-host').shadowRoot.querySelector('.sliding')); + check(await toggle.getAttribute('aria-expanded') === 'false', 'React keyboard Enter collapses'); + await toggle.press('Space'); + await page.waitForFunction(() => !document.querySelector('.hm-orgchart-host').shadowRoot.querySelector('.sliding')); + check(await toggle.getAttribute('aria-expanded') === 'true', 'React keyboard Space expands'); + await source(page, 'v1'); await ready(page, 'A', 'mock-1'); + check(await page.locator('.hm-orgchart-viewport').evaluate(element => element.getRootNode().activeElement === element), 'source reload restores removed keyboard focus to stable viewport'); + + await page.evaluate(() => window.OrgChartReactDemo.render({ sourceA: window.OrgChartReactDemo.slowSource })); + await page.waitForFunction(() => window.OrgChartReactDemo.requests.slow.loads === 1); + await source(page, 'v2'); await ready(page, 'A', 'mock-2'); + const beforeLate = await page.evaluate(() => window.OrgChartReactDemo.events.length); + await page.evaluate(() => window.OrgChartReactDemo.releaseSlow()); + await page.waitForTimeout(100); + check(await page.evaluate(() => window.OrgChartReactDemo.events.at(-1).state.dataVersion === 'mock-2' && window.OrgChartReactDemo.requests.slow.aborts === 1) && (await page.evaluate(() => window.OrgChartReactDemo.events.length)) === beforeLate, 'superseded abort-ignoring source cannot update DOM/callback'); + await source(page, 'error'); + await page.waitForFunction(() => window.OrgChartReactDemo.events.at(-1).state.status === 'error'); + check(await page.locator('.hm-orgchart-issues').count() === 1, 'source failure controlled error state'); + await source(page, 'v1'); await ready(page, 'A', 'mock-1'); + check(await page.locator('.hm-orgchart-issues').count() === 0, 'Error to Ready recovery via source replacement'); + await source(page, 'zeroEmployees'); await ready(page); + check((await page.evaluate(() => window.OrgChartReactDemo.events.at(-1).state.summary.raw.total)) === 0, 'zero employees remains Ready with total 0'); + await source(page, 'zeroOrganizations'); + await page.waitForFunction(() => window.OrgChartReactDemo.events.at(-1).state.status === 'error'); + check(await page.locator('.hm-orgchart-issues').count() === 1, 'zero organizations is Error; no fabricated empty state'); + await source(page, 'v1'); await ready(page, 'A', 'mock-1'); + await page.evaluate(() => window.OrgChartReactDemo.render({ aggregationPolicy: { policyVersion: 'consumer-test', includedStatuses: ['active'], activeStatuses: ['active'], includeLeaders: true, membershipMode: 'primaryOnly' } })); + await page.waitForFunction(() => window.OrgChartReactDemo.events.at(-1).state.aggregation?.status === 'ready'); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') !== hostId && (await page.evaluate(() => window.OrgChartReactDemo.events.at(-1).state.aggregation.counts.total)) === 2, 'policy change safely recreates Core and uses explicit test policy'); + let currentHost = await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance'); + await page.evaluate(() => window.OrgChartReactDemo.render({ stylesheetUrls: { ...window.OrgChartReactDemo.configuration.stylesheetUrls } })); + await page.waitForTimeout(70); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === currentHost, 'equal stylesheet URL values retain Core'); + await page.evaluate(() => { const urls = window.OrgChartReactDemo.configuration.stylesheetUrls; window.OrgChartReactDemo.render({ stylesheetUrls: { engine: urls.engine + '?consumer=2', core: urls.core }, aggregationPolicy: undefined }); }); + await page.waitForFunction(oldId => document.querySelector('.hm-orgchart-host')?.dataset.orgchartInstance !== oldId, currentHost); + await ready(page); + check(await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') !== currentHost && (await snapshot(page)).css.every(link => link.loaded), 'changed stylesheet URL safely recreates and loads assets'); + + await patch(page, { mountedB: true }); await ready(page, 'B', 'mock-2'); + const bHost = await page.locator('[data-instance="B"] .hm-orgchart-host').getAttribute('data-orgchart-instance'); + const bSnapshot = await snapshot(page, '[data-instance="B"] .hm-orgchart-host'); + await source(page, 'v2'); await ready(page, 'A', 'mock-2'); + check(await page.locator('.hm-orgchart-host').count() === 2 && JSON.stringify(await snapshot(page, '[data-instance="B"] .hm-orgchart-host')) === JSON.stringify(bSnapshot), 'two simultaneous instances; A update preserves B'); + await page.evaluate(() => { document.querySelector('[data-instance="A"]').style.setProperty('--hm-sem-bg-surface', getComputedStyle(document.documentElement).getPropertyValue('--hm-sem-bg-content')); }); + check((await snapshot(page, '[data-instance="A"] .hm-orgchart-host')).style.background !== bSnapshot.style.background && (await snapshot(page, '[data-instance="B"] .hm-orgchart-host')).style.background === bSnapshot.style.background, 'scoped existing Theme variable change inherits through Shadow DOM and isolates B'); + await patch(page, { mountedA: false }); + await page.waitForFunction(() => !document.querySelector('[data-instance="A"]')); + check(await page.locator('.hm-orgchart-host').count() === 1 && await page.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === bHost, 'A unmount preserves B and its Core identity'); + const bObservers = await page.evaluate(() => window.chartObservers()); + for (let iteration = 0; iteration < 5; iteration++) { + await patch(page, { mountedA: true }); await ready(page, 'A', 'mock-2'); + await page.waitForFunction(() => document.querySelectorAll('.hm-orgchart-host').length === 2); + await patch(page, { mountedA: false }); + await page.waitForFunction(() => document.querySelectorAll('.hm-orgchart-host').length === 1); + } + check(await page.evaluate(() => window.chartObservers()) === bObservers, 'five Strict Mode mount/unmount cycles preserve B observer baseline'); + await patch(page, { mountedA: true }); await ready(page, 'A', 'mock-2'); + await page.evaluate(() => window.OrgChartReactDemo.render({ sourceA: window.OrgChartReactDemo.slowSource })); + await page.waitForFunction(() => window.OrgChartReactDemo.requests.slow.loads === 2); + await patch(page, { mountedA: false }); + await page.waitForFunction(() => !document.querySelector('[data-instance="A"]')); + const unmountEvents = await page.evaluate(() => window.OrgChartReactDemo.events.length); + await page.evaluate(() => window.OrgChartReactDemo.releaseSlow()); await page.waitForTimeout(100); + check((await page.evaluate(() => window.OrgChartReactDemo.events.length)) === unmountEvents, 'late response after unmount cannot emit callback'); + check((await page.evaluate(() => window.OrgChartReactDemo.lifecycleErrors.length)) === 0, 'normal lifecycle has no rejected-use errors'); + await patch(page, { mountedA: true, stylesheetUrls: { engine: '', core: '' } }); + await page.waitForFunction(() => window.OrgChartReactDemo.lifecycleErrors.length > 0); + check(await page.locator('.hm-orgchart-host').count() === 0, 'invalid Core configuration is reported via lifecycle error without leaked hosts'); + await page.evaluate(() => window.OrgChartReactDemo.destroy()); + check(await page.locator('.hm-orgchart-host').count() === 0 && await page.evaluate(() => window.chartObservers()) === 0, 'terminal React root unmount removes all Core DOM/observers'); + + const index = JSON.parse(await readFile(path.join(root, 'storybook-static/index.json'), 'utf8')); + const stories = Object.values(index.entries).filter(entry => entry.title === 'OrgChart/Content' && entry.type === 'story'); + check(stories.length === 8, 'production Storybook registers exactly eight OrgChart stories', stories.map(story => ({ id: story.id, name: story.name }))); + const sb = await context.newPage(); captureErrors(sb, 'storybook-production'); + for (const story of stories) { + await sb.goto(`${storybook.origin}/iframe.html?id=${story.id}&viewMode=story`); + await sb.waitForFunction(() => [...document.querySelectorAll('.hm-orgchart-host')].some(host => host.shadowRoot.querySelector('.hm-orgchart-organization, .hm-orgchart-issues, .hm-orgchart-state:not(:empty)'))); + if (story.id.includes('loading')) { + check((await sb.locator('.hm-orgchart-state').allTextContents()).some(text => text.includes('불러오는')), `${story.name}: actual loading source`); + } else { + await sb.waitForFunction(() => [...document.querySelectorAll('.hm-orgchart-host')].every(host => host.shadowRoot.querySelector('.hm-orgchart-organization'))); + check(await sb.locator('.node').count() >= 3, `${story.name}: real Core nodes rendered`); + } + if (story.id.includes('json-data-update')) { + await sb.getByRole('button', { name: 'JSON v2', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('mock-2')); + check((await sb.locator('.hm-orgchart-raw-total').textContent()).includes('5명'), 'Storybook JSON v1 to v2 recalculates 5 employees'); + await sb.getByRole('button', { name: 'Unmount', exact: true }).click(); + check(await sb.locator('.hm-orgchart-host').count() === 0, 'Storybook Unmount removes Core'); + await sb.getByRole('button', { name: 'Mount', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('.hm-orgchart-host')?.shadowRoot.querySelector('.node')); + check(await sb.locator('.hm-orgchart-host').count() === 1, 'Storybook remount creates one Core'); + } + if (story.id.includes('loading')) { + await sb.getByRole('button', { name: 'Source Error', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('error')); + check(await sb.locator('.hm-orgchart-issues').count() === 1, 'Storybook source error controlled by Core'); + await sb.getByRole('button', { name: 'Ready v2 / 복구', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('mock-2')); + check(await sb.locator('.node').count() === 3, 'Storybook Error to Ready recovery'); + await sb.getByRole('button', { name: '직원 0명 (Ready)', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('story-zero-employees')); + check((await sb.locator('.hm-orgchart-raw-total').textContent()).includes('0명'), 'Storybook zero employees Ready'); + await sb.getByRole('button', { name: '조직 0개 (Error)', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('error')); + check(await sb.locator('.hm-orgchart-issues').count() === 1, 'Storybook zero organizations Error'); + await sb.getByRole('button', { name: '느린 v1 (취소 무시)', exact: true }).click(); + await sb.getByRole('button', { name: 'Ready v2 / 복구', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('mock-2')); + const outputBefore = await sb.locator('output').textContent(); + await sb.waitForTimeout(4100); + check(await sb.locator('output').textContent() === outputBefore, 'Storybook stale abort-ignoring response produces no callback'); + } + if (story.id.includes('multiple-instances')) { + const b = sb.getByRole('region', { name: 'OrgChart B', exact: true }); + const bIdentity = await b.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance'); + const bState = await b.locator('output').textContent(); + await sb.getByRole('button', { name: 'A → JSON v2', exact: true }).click(); + await sb.waitForFunction(() => document.querySelector('output')?.textContent.includes('mock-2')); + await sb.getByRole('button', { name: 'A Unmount', exact: true }).click(); + check(await sb.locator('.hm-orgchart-host').count() === 1 && await b.locator('.hm-orgchart-host').getAttribute('data-orgchart-instance') === bIdentity && await b.locator('output').textContent() === bState, 'Storybook A update/unmount leaves B identity, data and callback count unchanged'); + } + if (story.id.includes('basic-organization') || story.id.includes('employee-cards') || story.id.includes('responsive-container')) { + for (const width of [390, 768, 1280, 1440]) { + await sb.setViewportSize({ width, height: 1100 }); + if (story.id.includes('responsive-container')) await sb.getByRole('button', { name: `${width}px`, exact: true }).click(); + const dimensions = await sb.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + const nodes = [...shadow.querySelectorAll('.node')], viewport = shadow.querySelector('.hm-orgchart-viewport'); + const rects = nodes.map(node => node.getBoundingClientRect()); + return { + clientWidth: document.documentElement.clientWidth, scrollWidth: document.documentElement.scrollWidth, + viewport: { clientWidth: viewport.clientWidth, scrollWidth: viewport.scrollWidth, clientHeight: viewport.clientHeight, scrollHeight: viewport.scrollHeight }, + nodeWidths: rects.map(rect => rect.width), + overlap: rects.some((a, index) => rects.slice(index + 1).some(b => Math.min(a.right,b.right)-Math.max(a.left,b.left)>1 && Math.min(a.bottom,b.bottom)-Math.max(a.top,b.top)>1)), + avatars: [...shadow.querySelectorAll('.hm-orgchart-avatar')].every(avatar => avatar.textContent && !avatar.querySelector('img')), + textFits: [...shadow.querySelectorAll('.hm-orgchart-person-name,.hm-orgchart-person-role,.hm-orgchart-organization-name')].every(element => element.scrollWidth <= element.clientWidth), + }; + }); + metrics.push({ story: story.name, width, ...dimensions }); + check(dimensions.scrollWidth <= width && !dimensions.overlap && dimensions.textFits && dimensions.avatars, `${story.name}: ${width}px document scroll/overlap/long text/profile fallback`, dimensions); + await sb.screenshot({ path: path.join(output, `${story.id}-${width}.png`), fullPage: true }); + } + } + await sb.screenshot({ path: path.join(output, `${story.id}.png`), fullPage: true }); + } + if (process.env.ORGCHART_STORYBOOK_URL) { + await sb.goto(`${process.env.ORGCHART_STORYBOOK_URL}/iframe.html?id=orgchart-content--basic-organization&viewMode=story`); + await sb.waitForFunction(() => document.querySelector('.hm-orgchart-host')?.shadowRoot.querySelector('.hm-orgchart-organization')); + check(await sb.locator('.node').count() === 3, 'development Storybook on reserved separate port executes real Wrapper'); + } + check(errors.length === 0, 'browser console/runtime errors are zero across consumer, Vanilla and Storybook', errors); +} catch (error) { + results.push({ name: 'verification completion', status: 'FAIL', detail: error.stack }); + process.exitCode = 1; +} finally { + await writeFile(path.join(output, 'report.json'), JSON.stringify({ browser: await browser.version(), results, errors, metrics, snapshots }, null, 2)); + await browser.close(); + for (const { server } of [consumer, vanilla, storybook]) await new Promise(resolve => server.close(resolve)); + console.log(JSON.stringify({ pass: results.filter(result => result.status === 'PASS').length, fail: results.filter(result => result.status === 'FAIL').length, errors, report: path.join(output, 'report.json') })); +} diff --git a/examples/org-chart-react/vite.config.ts b/examples/org-chart-react/vite.config.ts new file mode 100644 index 0000000..120994f --- /dev/null +++ b/examples/org-chart-react/vite.config.ts @@ -0,0 +1,11 @@ +import path from 'node:path'; +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + root: path.resolve(import.meta.dirname), + base: './', + plugins: [react()], + server: { host: '127.0.0.1', port: 6026, strictPort: true }, + build: { outDir: 'dist', emptyOutDir: true, rolldownOptions: { input: { index: path.resolve(import.meta.dirname, 'index.html'), p1: path.resolve(import.meta.dirname, 'p1.html') } } }, +}); diff --git a/examples/org-chart/app.js b/examples/org-chart/app.js new file mode 100644 index 0000000..b65be54 --- /dev/null +++ b/examples/org-chart/app.js @@ -0,0 +1,32 @@ +export function startDemo(api, inlineFixtures) { + const { createOrgChart, JsonOrgChartDataSource } = api; + const container = document.getElementById('chart-host'); + const status = document.getElementById('status'); + const stylesheetUrls = { + engine: new URL('./assets/engine.css', location.href).href, + core: new URL('./assets/style.css', location.href).href, + }; + const source = () => new JsonOrgChartDataSource(inlineFixtures ? inlineFixtures.initial : './data-v1.json'); + let chart; + function create() { + chart?.destroy(); + chart = createOrgChart({ container, dataSource: source(), stylesheetUrls, onStateChange(state) { + status.textContent = state.status === 'ready' ? `Ready · ${state.dataVersion}` + : state.status === 'error' ? `Error · ${state.issues.map(issue => issue.code).join(', ')}` : state.status; + } }); + return chart.mount(); + } + async function update() { + const data = inlineFixtures ? inlineFixtures.changed : await (await fetch('./data-v2.json')).json(); + await chart.update(data); + } + function destroy() { chart.destroy(); status.textContent = 'Destroyed · 새 인스턴스로 다시 생성할 수 있습니다.'; } + const actions = { reload: () => chart.reload(), update, destroy, recreate: create }; + for (const [id, action] of Object.entries(actions)) document.getElementById(id).addEventListener('click', () => { + Promise.resolve().then(action).catch(() => { status.textContent = 'Core 호출 순서를 확인하세요.'; }); + }); + window.addEventListener('pagehide', () => chart.destroy(), { once: true }); + // This example's inspection seam uses only public Core APIs, never engine internals. + window.OrgChartDemo = { api, container, stylesheetUrls, source, create, update, destroy, get chart() { return chart; } }; + create().then(() => { window.orgChartReady = true; }).catch(() => { status.textContent = 'Mount failed'; }); +} diff --git a/examples/org-chart/audit-quality-pixels.py b/examples/org-chart/audit-quality-pixels.py new file mode 100644 index 0000000..ca82e22 --- /dev/null +++ b/examples/org-chart/audit-quality-pixels.py @@ -0,0 +1,91 @@ +"""Read browser PNG backgrounds beside text; never edit production images. + +Sample positions cover DOM text line bounds, with a clear padding-column probe +for the current vertical opaque gradients. Pixel sampling and the sRGB CSS model +are distinct evidence; unsupported/clipped painting is NOT VERIFIED. +""" +import json +import math +import re +import sys +from pathlib import Path +from PIL import Image + +ROOT = Path(__file__).resolve().parents[2] +OUT = ROOT / 'test-results' / 'org-chart-quality' +report = json.loads((OUT / (sys.argv[1] if len(sys.argv) > 1 else 'browser.json')).read_text(encoding='utf-8')) + +def rgb(value): + match = re.fullmatch(r'rgba?\((\d+(?:\.\d+)?),\s*(\d+(?:\.\d+)?),\s*(\d+(?:\.\d+)?)(?:,\s*(1))?\)', value) + return tuple(map(float, match.groups()[:3])) if match else None + +def luminance(color): + def linear(channel): + encoded = channel / 255 + return encoded / 12.92 if encoded <= .04045 else ((encoded + .055) / 1.055) ** 2.4 + return sum(weight * linear(channel) for weight, channel in zip((.2126, .7152, .0722), color)) + +def contrast(first, second): + a, b = sorted((luminance(first), luminance(second))) + return (b + .05) / (a + .05) + +evidence = [] +for measurement in report['measurements']: + image = Image.open(OUT / measurement['screenshot']).convert('RGB') + for item in measurement['colors']: + foreground = rgb(item['color']) + behind = item['behind'] + entry = dict(label=measurement['label'], width=measurement['width'], selector=item['className'], + organizationId=item.get('organizationId'), variant=item.get('variant'), target=item.get('target'), + foreground=item['color'], fontSize=item['fontSize'], fontWeight=item['fontWeight']) + threshold = 3 if item['fontSize'] >= 24 or (float(item['fontWeight']) >= 700 and item['fontSize'] >= 14 * 96 / 72) else 4.5 + entry['threshold'] = threshold + if not foreground or not behind: + entry.update(status='NOT VERIFIED', reason='Unknown foreground/background composition') + elif behind['gradient'] == 'none': + background = rgb(behind['background']) + if background: + value = contrast(foreground, background) + entry.update(status='PASS' if value >= threshold else 'REVIEW', method='computed opaque solid', ratio=value, background=behind['background']) + else: + entry.update(status='NOT VERIFIED', reason='Transparent/unsupported solid composition') + else: + stops = re.findall(r'rgb\((\d+),\s*(\d+),\s*(\d+)\)\s+(0|100)%', behind['gradient']) + box, lines, clip = behind['box'], item['ranges'], item.get('clip') + angle = re.search(r'linear-gradient\(([^r][^,]*),', behind['gradient']) + if len(stops) != 2 or not lines or (angle and angle.group(1).strip() != '180deg'): + entry.update(status='NOT VERIFIED', reason='Unsupported gradient/text range') + else: + colors = [tuple(map(int, stop[:3])) for stop in stops] + # Probe an empty padding column, inside corners and before text. + text_left = min(line['x'] for line in lines) + x = math.floor(min(text_left - 2, box['x'] + max(4, (text_left - box['x']) / 2))) + samples, deltas = [], [] + for line in lines: + for y in range(math.ceil(line['y']), math.floor(line['y'] + line['height']) + 1): + if not (0 <= x < image.width and 0 <= y < image.height): + continue + if clip and not (clip['x'] + 1 <= x < clip['x'] + clip['width'] - 1 and clip['y'] + 1 <= y < clip['y'] + clip['height'] - 1): + continue + offset = (y + .5 - box['y']) / box['height'] + if not 0 <= offset <= 1: + continue + pixel = image.getpixel((x, y)) + modeled = tuple(a + (b - a) * offset for a, b in zip(*colors)) + delta = max(abs(a - b) for a, b in zip(pixel, modeled)) + deltas.append(delta) + samples.append(dict(x=x, y=y, background=pixel, contrast=contrast(foreground, pixel), modelDelta=delta)) + if not samples or max(deltas) > 2: + entry.update(status='NOT VERIFIED', reason='Probe clipped, overpainted or disagrees with supported sRGB painting model', sampled=len(samples), maxModelDelta=max(deltas) if deltas else None) + else: + minimum = min(samples, key=lambda sample: sample['contrast']) + entry.update(status='PASS' if minimum['contrast'] >= threshold else 'REVIEW', method='PNG background beside actual DOM text lines', + ratio=minimum['contrast'], sampled=len(samples), maxModelDelta=max(deltas), weakest=minimum, + conservativeStopMinimum=min(contrast(foreground, color) for color in colors)) + evidence.append(entry) + +result = dict(method='DPR1 Chrome PNG; opaque foreground from computed CSS; padding-column gradient probes over DOM Range line bounds', + thresholds='Unrounded 4.5 normal / 3 large; no logo recoloring; no full WCAG certification', + results=evidence, statusCounts={status: sum(item['status'] == status for item in evidence) for status in ('PASS', 'REVIEW', 'NOT VERIFIED')}) +(OUT / (sys.argv[2] if len(sys.argv) > 2 else 'contrast-pixels.json')).write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8') +print(json.dumps(result['statusCounts'])) diff --git a/examples/org-chart/classic.html b/examples/org-chart/classic.html new file mode 100644 index 0000000..e6cc7d4 --- /dev/null +++ b/examples/org-chart/classic.html @@ -0,0 +1,25 @@ + + + + + HM OrgChart · 직접 열기 예제 + + + + +
+

OrgChart Core · 직접 열기 예제

+

가상 JSON을 Classic 번들로 실행합니다. file://에서 외부 JSON Fetch는 사용하지 않습니다.

+
+ + + + +
+

준비 중

+
+ + + + + diff --git a/examples/org-chart/create-business-card-assets.py b/examples/org-chart/create-business-card-assets.py new file mode 100644 index 0000000..9ab2adf --- /dev/null +++ b/examples/org-chart/create-business-card-assets.py @@ -0,0 +1,116 @@ +"""Extract business-management PNG colors into matching vector card templates. + +Reads the reference only. No bitmap is embedded in the generated SVGs. +Usage: python create-business-card-assets.py +""" +import hashlib +import json +import re +import shutil +import sys +from pathlib import Path + +import numpy as np +from PIL import Image + +root = Path(__file__).resolve().parents[2] +reference = Path(sys.argv[1]) +image = Image.open(reference).convert('RGBA') +pixels = np.asarray(image, dtype=float) +width, height = image.size +scale = np.array([width / 146, height / 68]) +start = np.array([124.527, 13.2139]) * scale +end = np.array([91.4091, 70.3397]) * scale +vector = end - start + +# Probe only the flat outer bands, away from rounded corners and inner face. +probes = ([(x, 2) for x in range(20, width - 20)] + + [(3, y) for y in range(20, height - 15)] + + [(width - 4, y) for y in range(20, height - 15)] + + [(x, height - 3) for x in range(20, width - 20)]) +coordinates = np.array(probes, dtype=float) + 0.5 +times = np.clip((coordinates - start) @ vector / (vector @ vector), 0, 1) +values = np.array([pixels[y, x] for x, y in probes]) +basis = np.zeros((len(times), 3)) +first = times <= 0.72 +basis[first, 0] = 1 - times[first] / 0.72 +basis[first, 1] = times[first] / 0.72 +basis[~first, 1] = (1 - times[~first]) / 0.28 +basis[~first, 2] = (times[~first] - 0.72) / 0.28 + +# Test both interpolation representations rather than assuming raster alpha. +fits = [] +for premultiplied in (False, True): + samples = values.copy() + if premultiplied: + samples[:, :3] *= samples[:, 3:] / 255 + stops = np.linalg.lstsq(basis, samples, rcond=None)[0] + predicted = basis @ stops + if premultiplied: + predicted[:, :3] /= np.maximum(predicted[:, 3:], 1) / 255 + stops[:, :3] /= np.maximum(stops[:, 3:], 1) / 255 + error = float(np.abs(predicted - values).mean()) + fits.append((error, premultiplied, np.clip(stops, 0, 255))) +error, premultiplied, stops = min(fits, key=lambda item: item[0]) + +# Use plateau medians for the clamped endpoints, reducing raster edge noise. +stops[0] = np.median(values[times == 0], axis=0) +stops[2] = np.median(values[times == 1], axis=0) +colors = ['#' + ''.join(f'{int(round(channel)):02X}' for channel in row[:3]) for row in stops] +opacities = [round(float(row[3] / 255), 2) for row in stops] +inner_top = pixels[9:35, 20:150].reshape(-1, 4) +inner_bottom = pixels[height - 13:height - 6, 20:150].reshape(-1, 4) +inner_colors = ['#' + ''.join(f'{int(round(channel)):02X}' for channel in row[:3]) + for row in [np.median(inner_top, axis=0), np.median(inner_bottom, axis=0)]] + +# Recover the inner face's gradient direction from its unclamped RGB plane. +# Colors alone are insufficient: retaining the template's gradient direction +# would leave a visible tone difference despite matching all endpoint colors. +inner_start_rgb = np.array([int(inner_colors[0][i:i + 2], 16) for i in (1, 3, 5)]) +inner_end_rgb = np.array([int(inner_colors[1][i:i + 2], 16) for i in (1, 3, 5)]) +delta = inner_start_rgb - inner_end_rgb +inner_points, inner_times = [], [] +for y in range(12, height - 12, 2): + for x in range(20, min(220, width // 2 + 16), 2): + rgb = pixels[y, x, :3] + t = float((inner_start_rgb - rgb) @ delta / (delta @ delta)) + if 0.06 < t < 0.94 and pixels[y, x, 3] == 255: + inner_points.append([(x + 0.5) / scale[0], (y + 0.5) / scale[1], 1]) + inner_times.append(t) +plane = np.linalg.lstsq(np.array(inner_points), np.array(inner_times), rcond=None)[0] +gradient_vector = plane[:2] / (plane[:2] @ plane[:2]) +inner_start = np.array([78.0741, (-plane[2] - plane[0] * 78.0741) / plane[1]]) +inner_end = inner_start + gradient_vector + +assets = root / 'packages/org-chart/src/assets/cards' +for suffix in ('', '-sm'): + template = (assets / f'경영기획팀{suffix}.svg').read_text(encoding='utf-8') + # Retain the supplied department geometry and its size-specific gradients. + for original, replacement in zip(['#DEE6F0', '#A8BBD1', '#577BA5'], colors): + template = template.replace(f'stop-color="{original}"', f'stop-color="{replacement}"') + template = template.replace(f'stop-color="{colors[2]}"', f'stop-color="{colors[2]}" stop-opacity="{opacities[2]}"') + template = template.replace('stop-color="white"', f'stop-color="{inner_colors[0]}"') + template = template.replace('stop-color="#E0E6F4"', f'stop-color="{inner_colors[1]}"') + template = template.replace('paint0_linear_', 'business_management_outer_').replace('paint1_linear_', 'business_management_inner_') + size_scale = np.array([1, 1]) if not suffix else np.array([108 / 146, 52 / 68]) + p1, p2 = inner_start * size_scale, inner_end * size_scale + template = re.sub(r'(]+>', + lambda match: f'{match[1]} x1="{p1[0]:.4f}" y1="{p1[1]:.4f}" x2="{p2[0]:.4f}" y2="{p2[1]:.4f}" gradientUnits="userSpaceOnUse">', template) + template = template.replace('offset="0.97"', 'offset="1"') + (assets / f'사업관리팀{suffix}.svg').write_text(template, encoding='utf-8') + +output = root / 'test-results/org-chart-card-design' +output.mkdir(parents=True, exist_ok=True) +shutil.copyfile(reference, output / 'business-management-reference.png') +evidence = { + 'reference': str(reference), 'sha256': hashlib.sha256(reference.read_bytes()).hexdigest(), + 'referenceSize': [width, height], 'outerStops': colors, 'outerOpacities': opacities, + 'innerStops': inner_colors, 'outerStopOffsets': [0, 0.72, 1], + 'innerGradientStart': inner_start.tolist(), 'innerGradientEnd': inner_end.tolist(), + 'innerSampleCount': len(inner_points), + 'sampleCount': len(probes), 'fitMeanAbsoluteRGBAError': error, + 'premultipliedFit': premultiplied, + 'method': 'Outer-band RGBA samples fitted to the supplied department gradient geometry; endpoint plateau medians and inner-face medians. Inner gradient direction recovered from unclamped RGB plane. Reference PNG is preserved; geometry reuses department SVG paths.', +} +(output / 'business-management-colors.json').write_text(json.dumps(evidence, ensure_ascii=False, indent=2), encoding='utf-8') +print(json.dumps(evidence, ensure_ascii=False, indent=2)) diff --git a/examples/org-chart/create-fixtures.mjs b/examples/org-chart/create-fixtures.mjs new file mode 100644 index 0000000..e8d197b --- /dev/null +++ b/examples/org-chart/create-fixtures.mjs @@ -0,0 +1,15 @@ +// One-time fixture authoring helper; normal example builds read the checked-in fixtures. +import { readFile, writeFile } from 'node:fs/promises'; +const document = await readFile(new URL('../../docs/org-chart/data-contract.md', import.meta.url), 'utf8'); +const snippets = [...document.matchAll(/```json\r?\n([\s\S]*?)\r?\n```/g)].map(match => JSON.parse(match[1])); +const initial = snippets.find(value => Array.isArray(value.organizations)); +if (!initial) throw new Error('No documented fictitious dataset'); +initial.schemaVersion = '0.1-draft'; +initial.presentation.description = '가상 데이터 · 원본 집계와 업무상 총원은 구분됩니다.'; +const changed = structuredClone(initial); +changed.metadata.dataVersion = 'mock-2'; +changed.organizations[1].name = '가상 전략기획팀'; +changed.employees.find(person => person.id === 'emp-c').organizationId = 'team-b'; +changed.employees.push({ id: 'emp-e', organizationId: 'team-b', affiliationId: 'aff-a', name: '가상직원 마', position: '책임', jobTitle: null, profileImage: null, workStatus: 'active' }); +for (const [file, value] of [['data-v1.json', initial], ['data-v2.json', changed]]) + await writeFile(new URL(file, import.meta.url), JSON.stringify(value, null, 2) + '\n'); diff --git a/examples/org-chart/create-p1-fixture.mjs b/examples/org-chart/create-p1-fixture.mjs new file mode 100644 index 0000000..98c26c4 --- /dev/null +++ b/examples/org-chart/create-p1-fixture.mjs @@ -0,0 +1,56 @@ +import { writeFile } from 'node:fs/promises'; + +// Organization names were observed on Workdesk. Membership, employees and +// every count below are synthetic, not an export of production HR data. +const groups = [ + ['business-management', '사업관리', 'office', []], + ['business-planning', '경영기획', 'office', ['경영기획 셀', '사업관리 셀']], + ['talent-growth', '인재성장', 'office', ['HR기획 셀', '자산관리 셀']], + ['integrated-system', '통합시스템 Div', 'div', ['IS 1팀', 'IS 2팀', 'IS 3팀']], + ['design-planning', '디자인기획', 'office', ['UX 셀', '영상 셀', '편집 셀']], + ['solution-sales', '솔루션영업', 'office', ['S/W 셀']], +]; +const affiliations = [ + ['hanmac', '(주)한맥기술'], ['saman', '(주)삼안'], ['jangheon', '(주)장헌'], + ['jangheon-industry', '장헌산업'], ['ptc', 'PTC'], ['halla', '한라산업개발'], ['baron', '바론컨설턴트'], +].map(([id, name]) => ({ id, name })); +const organizations = [{ id: 'general-planning', parentId: null, name: '총괄기획실', type: 'root', leaderId: 'mock-leader-00', displayOrder: 0 }]; +// Invented display names only; never sourced from a Workdesk employee capture. +const names = [ + '김솔', '이도윤', '박하준', '정지우', '최예린', '한준서', '오수아', + '강민서', '윤시우', '서다은', '배지안', '임서준', '송하린', '조유찬', + '신도하', '문예은', '권지호', '안채원', '유시온', '홍서아', '고은우', + '남하윤', '백도현', '노유나', '장태오', '양서진', '진서율', '구민재', + '전하은', '심이준', '차소율', '우지율', '손예준', '함다온', '허지유', + '황서우', '성유빈', '곽지후', '류다인', '하주원', '이봄', +]; +const employees = [{ id: 'mock-leader-00', organizationId: 'general-planning', affiliationId: 'hanmac', name: names[0], position: '경영진', jobTitle: '실장', profileImage: null, workStatus: 'active' }]; +let person = 1; +for (const [index, [id, name, type, cells]] of groups.entries()) { + const leaderId = `mock-leader-${String(index + 1).padStart(2, '0')}`; + organizations.push({ id, parentId: 'general-planning', name, type, leaderId, displayOrder: index }); + employees.push({ id: leaderId, organizationId: id, affiliationId: ['hanmac', 'saman', 'baron'][index % 3], name: names[employees.length], position: '수석', jobTitle: type === 'div' ? '디비전장' : '팀장', profileImage: null, workStatus: 'active' }); + const employeeOrganizations = cells.length ? cells.map((cell, cellIndex) => { + const childId = `${id}-${cellIndex + 1}`; + organizations.push({ id: childId, parentId: id, name: cell, type: cell.includes('팀') ? 'team' : 'cell', leaderId: null, displayOrder: cellIndex }); + return childId; + }) : [id]; + for (const childId of employeeOrganizations) for (let member = 0; member < (cells.length ? 3 : 1); member++) { + const employeeId = `mock-employee-${String(person).padStart(2, '0')}`; + const isTeamLeader = childId.startsWith('integrated-system-') && member === 0; + employees.push({ id: employeeId, organizationId: childId, affiliationId: ['hanmac', 'saman', 'ptc', 'baron'][person % 4], name: names[employees.length], position: ['책임', '선임', '연구'][member % 3], jobTitle: isTeamLeader ? '팀장' : null, profileImage: null, workStatus: person === 3 ? 'dispatched' : person === 25 ? 'onLeave' : 'active' }); + if (isTeamLeader) organizations.find(item => item.id === childId).leaderId = employeeId; + person++; + } +} +const fixture = { + schemaVersion: '0.1-draft', organizations, employees, affiliations, relations: [], + presentation: { + title: '총괄기획실 조직도', description: '실제 조직명 · 가상 직원 정보 및 인원 통계 · 운영 인원수가 아닙니다.', hubText: '협업 · 소통 허브', + groups: { showEmployees: true, showSummary: true, showDispatched: true, showOnLeave: true, showAffiliations: true }, + organizationOrder: ['general-planning', ...groups.map(([id]) => id)], + }, + metadata: { asOfDate: '2026-10-12', dataVersion: 'p1-virtual-employees-v1', updateNote: '운영 HR 정보와 무관한 가상 구성' }, +}; +await writeFile(new URL('./data-p1.json', import.meta.url), `${JSON.stringify(fixture, null, 2)}\n`); +console.log(`P1 fixture: ${organizations.length} organizations / ${employees.length} synthetic employees`); diff --git a/examples/org-chart/data-p1.json b/examples/org-chart/data-p1.json new file mode 100644 index 0000000..9b5e57f --- /dev/null +++ b/examples/org-chart/data-p1.json @@ -0,0 +1,618 @@ +{ + "schemaVersion": "0.1-draft", + "organizations": [ + { + "id": "general-planning", + "parentId": null, + "name": "총괄기획실", + "type": "root", + "leaderId": "mock-leader-00", + "displayOrder": 0 + }, + { + "id": "business-management", + "parentId": "general-planning", + "name": "사업관리", + "type": "office", + "leaderId": "mock-leader-01", + "displayOrder": 0 + }, + { + "id": "business-planning", + "parentId": "general-planning", + "name": "경영기획", + "type": "office", + "leaderId": "mock-leader-02", + "displayOrder": 1 + }, + { + "id": "business-planning-1", + "parentId": "business-planning", + "name": "경영기획 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 0 + }, + { + "id": "business-planning-2", + "parentId": "business-planning", + "name": "사업관리 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 1 + }, + { + "id": "talent-growth", + "parentId": "general-planning", + "name": "인재성장", + "type": "office", + "leaderId": "mock-leader-03", + "displayOrder": 2 + }, + { + "id": "talent-growth-1", + "parentId": "talent-growth", + "name": "HR기획 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 0 + }, + { + "id": "talent-growth-2", + "parentId": "talent-growth", + "name": "자산관리 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 1 + }, + { + "id": "integrated-system", + "parentId": "general-planning", + "name": "통합시스템 Div", + "type": "div", + "leaderId": "mock-leader-04", + "displayOrder": 3 + }, + { + "id": "integrated-system-1", + "parentId": "integrated-system", + "name": "IS 1팀", + "type": "team", + "leaderId": "mock-employee-14", + "displayOrder": 0 + }, + { + "id": "integrated-system-2", + "parentId": "integrated-system", + "name": "IS 2팀", + "type": "team", + "leaderId": "mock-employee-17", + "displayOrder": 1 + }, + { + "id": "integrated-system-3", + "parentId": "integrated-system", + "name": "IS 3팀", + "type": "team", + "leaderId": "mock-employee-20", + "displayOrder": 2 + }, + { + "id": "design-planning", + "parentId": "general-planning", + "name": "디자인기획", + "type": "office", + "leaderId": "mock-leader-05", + "displayOrder": 4 + }, + { + "id": "design-planning-1", + "parentId": "design-planning", + "name": "UX 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 0 + }, + { + "id": "design-planning-2", + "parentId": "design-planning", + "name": "영상 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 1 + }, + { + "id": "design-planning-3", + "parentId": "design-planning", + "name": "편집 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 2 + }, + { + "id": "solution-sales", + "parentId": "general-planning", + "name": "솔루션영업", + "type": "office", + "leaderId": "mock-leader-06", + "displayOrder": 5 + }, + { + "id": "solution-sales-1", + "parentId": "solution-sales", + "name": "S/W 셀", + "type": "cell", + "leaderId": null, + "displayOrder": 0 + } + ], + "employees": [ + { + "id": "mock-leader-00", + "organizationId": "general-planning", + "affiliationId": "hanmac", + "name": "김솔", + "position": "경영진", + "jobTitle": "실장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-leader-01", + "organizationId": "business-management", + "affiliationId": "hanmac", + "name": "이도윤", + "position": "수석", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-01", + "organizationId": "business-management", + "affiliationId": "saman", + "name": "박하준", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-leader-02", + "organizationId": "business-planning", + "affiliationId": "saman", + "name": "정지우", + "position": "수석", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-02", + "organizationId": "business-planning-1", + "affiliationId": "ptc", + "name": "최예린", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-03", + "organizationId": "business-planning-1", + "affiliationId": "baron", + "name": "한준서", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "dispatched" + }, + { + "id": "mock-employee-04", + "organizationId": "business-planning-1", + "affiliationId": "hanmac", + "name": "오수아", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-05", + "organizationId": "business-planning-2", + "affiliationId": "saman", + "name": "강민서", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-06", + "organizationId": "business-planning-2", + "affiliationId": "ptc", + "name": "윤시우", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-07", + "organizationId": "business-planning-2", + "affiliationId": "baron", + "name": "서다은", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-leader-03", + "organizationId": "talent-growth", + "affiliationId": "baron", + "name": "배지안", + "position": "수석", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-08", + "organizationId": "talent-growth-1", + "affiliationId": "hanmac", + "name": "임서준", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-09", + "organizationId": "talent-growth-1", + "affiliationId": "saman", + "name": "송하린", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-10", + "organizationId": "talent-growth-1", + "affiliationId": "ptc", + "name": "조유찬", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-11", + "organizationId": "talent-growth-2", + "affiliationId": "baron", + "name": "신도하", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-12", + "organizationId": "talent-growth-2", + "affiliationId": "hanmac", + "name": "문예은", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-13", + "organizationId": "talent-growth-2", + "affiliationId": "saman", + "name": "권지호", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-leader-04", + "organizationId": "integrated-system", + "affiliationId": "hanmac", + "name": "안채원", + "position": "수석", + "jobTitle": "디비전장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-14", + "organizationId": "integrated-system-1", + "affiliationId": "ptc", + "name": "유시온", + "position": "책임", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-15", + "organizationId": "integrated-system-1", + "affiliationId": "baron", + "name": "홍서아", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-16", + "organizationId": "integrated-system-1", + "affiliationId": "hanmac", + "name": "고은우", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-17", + "organizationId": "integrated-system-2", + "affiliationId": "saman", + "name": "남하윤", + "position": "책임", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-18", + "organizationId": "integrated-system-2", + "affiliationId": "ptc", + "name": "백도현", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-19", + "organizationId": "integrated-system-2", + "affiliationId": "baron", + "name": "노유나", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-20", + "organizationId": "integrated-system-3", + "affiliationId": "hanmac", + "name": "장태오", + "position": "책임", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-21", + "organizationId": "integrated-system-3", + "affiliationId": "saman", + "name": "양서진", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-22", + "organizationId": "integrated-system-3", + "affiliationId": "ptc", + "name": "진서율", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-leader-05", + "organizationId": "design-planning", + "affiliationId": "saman", + "name": "구민재", + "position": "수석", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-23", + "organizationId": "design-planning-1", + "affiliationId": "baron", + "name": "전하은", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-24", + "organizationId": "design-planning-1", + "affiliationId": "hanmac", + "name": "심이준", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-25", + "organizationId": "design-planning-1", + "affiliationId": "saman", + "name": "차소율", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "onLeave" + }, + { + "id": "mock-employee-26", + "organizationId": "design-planning-2", + "affiliationId": "ptc", + "name": "우지율", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-27", + "organizationId": "design-planning-2", + "affiliationId": "baron", + "name": "손예준", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-28", + "organizationId": "design-planning-2", + "affiliationId": "hanmac", + "name": "함다온", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-29", + "organizationId": "design-planning-3", + "affiliationId": "saman", + "name": "허지유", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-30", + "organizationId": "design-planning-3", + "affiliationId": "ptc", + "name": "황서우", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-31", + "organizationId": "design-planning-3", + "affiliationId": "baron", + "name": "성유빈", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-leader-06", + "organizationId": "solution-sales", + "affiliationId": "baron", + "name": "곽지후", + "position": "수석", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-32", + "organizationId": "solution-sales-1", + "affiliationId": "hanmac", + "name": "류다인", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-33", + "organizationId": "solution-sales-1", + "affiliationId": "saman", + "name": "하주원", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + }, + { + "id": "mock-employee-34", + "organizationId": "solution-sales-1", + "affiliationId": "ptc", + "name": "이봄", + "position": "연구", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + } + ], + "affiliations": [ + { + "id": "hanmac", + "name": "(주)한맥기술" + }, + { + "id": "saman", + "name": "(주)삼안" + }, + { + "id": "jangheon", + "name": "(주)장헌" + }, + { + "id": "jangheon-industry", + "name": "장헌산업" + }, + { + "id": "ptc", + "name": "PTC" + }, + { + "id": "halla", + "name": "한라산업개발" + }, + { + "id": "baron", + "name": "바론컨설턴트" + } + ], + "relations": [], + "presentation": { + "title": "총괄기획실 조직도", + "description": "실제 조직명 · 가상 직원 정보 및 인원 통계 · 운영 인원수가 아닙니다.", + "hubText": "협업 · 소통 허브", + "groups": { + "showEmployees": true, + "showSummary": true, + "showDispatched": true, + "showOnLeave": true, + "showAffiliations": true + }, + "organizationOrder": [ + "general-planning", + "business-management", + "business-planning", + "talent-growth", + "integrated-system", + "design-planning", + "solution-sales" + ] + }, + "metadata": { + "asOfDate": "2026-10-12", + "dataVersion": "p1-virtual-employees-v1", + "updateNote": "운영 HR 정보와 무관한 가상 구성" + } +} diff --git a/examples/org-chart/data-v1.json b/examples/org-chart/data-v1.json new file mode 100644 index 0000000..625dca7 --- /dev/null +++ b/examples/org-chart/data-v1.json @@ -0,0 +1,113 @@ +{ + "organizations": [ + { + "id": "org-root", + "parentId": null, + "name": "가상 사업본부", + "type": "root", + "leaderId": "emp-a", + "displayOrder": 0 + }, + { + "id": "team-a", + "parentId": "org-root", + "name": "가상 기획팀", + "type": "team", + "leaderId": "emp-b", + "displayOrder": 1 + }, + { + "id": "team-b", + "parentId": "org-root", + "name": "가상 운영팀", + "type": "team", + "leaderId": null, + "displayOrder": 2 + } + ], + "employees": [ + { + "id": "emp-a", + "organizationId": "org-root", + "affiliationId": "aff-a", + "name": "가상직원 가", + "position": "대표", + "jobTitle": "본부장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "emp-b", + "organizationId": "team-a", + "affiliationId": "aff-a", + "name": "가상직원 나", + "position": "책임", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "emp-c", + "organizationId": "team-a", + "affiliationId": "aff-b", + "name": "가상직원 다", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "dispatched" + }, + { + "id": "emp-d", + "organizationId": "team-b", + "affiliationId": "aff-b", + "name": "가상직원 라", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "onLeave" + } + ], + "affiliations": [ + { + "id": "aff-a", + "name": "가상 관계사 A" + }, + { + "id": "aff-b", + "name": "가상 관계사 B" + } + ], + "relations": [ + { + "id": "rel-a", + "sourceOrganizationId": "team-a", + "targetOrganizationId": "team-b", + "type": "cooperation" + } + ], + "presentation": { + "title": "가상 조직도", + "description": "가상 데이터 · 원본 집계와 업무상 총원은 구분됩니다.", + "hubText": "협업 중심", + "groups": { + "showEmployees": true, + "showSummary": true, + "showDispatched": true, + "showOnLeave": true, + "showAffiliations": true + }, + "organizationOrder": [ + "org-root", + "team-a", + "team-b" + ] + }, + "metadata": { + "schemaVersion": "0.1-draft", + "asOfDate": "2026-10-12", + "dataVersion": "mock-1", + "updatedAt": null, + "updateNote": "초안 예시" + }, + "schemaVersion": "0.1-draft" +} diff --git a/examples/org-chart/data-v2.json b/examples/org-chart/data-v2.json new file mode 100644 index 0000000..7fe03bf --- /dev/null +++ b/examples/org-chart/data-v2.json @@ -0,0 +1,123 @@ +{ + "organizations": [ + { + "id": "org-root", + "parentId": null, + "name": "가상 사업본부", + "type": "root", + "leaderId": "emp-a", + "displayOrder": 0 + }, + { + "id": "team-a", + "parentId": "org-root", + "name": "가상 전략기획팀", + "type": "team", + "leaderId": "emp-b", + "displayOrder": 1 + }, + { + "id": "team-b", + "parentId": "org-root", + "name": "가상 운영팀", + "type": "team", + "leaderId": null, + "displayOrder": 2 + } + ], + "employees": [ + { + "id": "emp-a", + "organizationId": "org-root", + "affiliationId": "aff-a", + "name": "가상직원 가", + "position": "대표", + "jobTitle": "본부장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "emp-b", + "organizationId": "team-a", + "affiliationId": "aff-a", + "name": "가상직원 나", + "position": "책임", + "jobTitle": "팀장", + "profileImage": null, + "workStatus": "active" + }, + { + "id": "emp-c", + "organizationId": "team-b", + "affiliationId": "aff-b", + "name": "가상직원 다", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "dispatched" + }, + { + "id": "emp-d", + "organizationId": "team-b", + "affiliationId": "aff-b", + "name": "가상직원 라", + "position": "선임", + "jobTitle": null, + "profileImage": null, + "workStatus": "onLeave" + }, + { + "id": "emp-e", + "organizationId": "team-b", + "affiliationId": "aff-a", + "name": "가상직원 마", + "position": "책임", + "jobTitle": null, + "profileImage": null, + "workStatus": "active" + } + ], + "affiliations": [ + { + "id": "aff-a", + "name": "가상 관계사 A" + }, + { + "id": "aff-b", + "name": "가상 관계사 B" + } + ], + "relations": [ + { + "id": "rel-a", + "sourceOrganizationId": "team-a", + "targetOrganizationId": "team-b", + "type": "cooperation" + } + ], + "presentation": { + "title": "가상 조직도", + "description": "가상 데이터 · 원본 집계와 업무상 총원은 구분됩니다.", + "hubText": "협업 중심", + "groups": { + "showEmployees": true, + "showSummary": true, + "showDispatched": true, + "showOnLeave": true, + "showAffiliations": true + }, + "organizationOrder": [ + "org-root", + "team-a", + "team-b" + ] + }, + "metadata": { + "schemaVersion": "0.1-draft", + "asOfDate": "2026-10-12", + "dataVersion": "mock-2", + "updatedAt": null, + "updateNote": "초안 예시" + }, + "schemaVersion": "0.1-draft" +} diff --git a/examples/org-chart/demo.css b/examples/org-chart/demo.css new file mode 100644 index 0000000..49a90fc --- /dev/null +++ b/examples/org-chart/demo.css @@ -0,0 +1,8 @@ +body { margin: 0; font-family: var(--hm-font-family-base); color: var(--hm-sem-fg-primary); background: var(--hm-sem-bg-content); } +main { padding: var(--hm-card-padding); } +h1 { margin: 0; font-size: var(--hm-card-title-font-size); font-weight: var(--hm-card-title-font-weight); } +main > p { color: var(--hm-sem-fg-secondary); } +.demo-controls { display: flex; flex-wrap: wrap; gap: 8px; } +.demo-controls button { font: inherit; color: var(--hm-sem-fg-primary); background: var(--hm-sem-bg-surface); border: 1px solid var(--hm-sem-stroke-default); border-radius: var(--hm-radius-control-md); padding: 8px 12px; cursor: pointer; } +.demo-controls button:focus-visible { outline: 2px solid var(--hm-sem-stroke-input-focus); outline-offset: 2px; } +#chart-host { min-width: 0; } diff --git a/examples/org-chart/index.html b/examples/org-chart/index.html new file mode 100644 index 0000000..74562ff --- /dev/null +++ b/examples/org-chart/index.html @@ -0,0 +1,28 @@ + + + + + HM OrgChart · Vanilla JSON 예제 + + + + +
+

OrgChart Core · JSON 예제

+

가상 조직·직원 데이터입니다. 표시된 원본 직원 수는 업무상 재직 총원과 구분됩니다.

+
+ + + + +
+

준비 중

+
+
+ + + diff --git a/examples/org-chart/p1-app.js b/examples/org-chart/p1-app.js new file mode 100644 index 0000000..af84a33 --- /dev/null +++ b/examples/org-chart/p1-app.js @@ -0,0 +1,15 @@ +export async function startP1(api, inlineFixture) { + const data = inlineFixture ?? await new api.JsonOrgChartDataSource('./data-p1.json').load(); + const stylesheetUrls = { + engine: new URL('./assets/engine.css', location.href).href, + core: new URL('./assets/style.css', location.href).href, + }; + // ?mode=readOnly shows the view-only Workdesk composition; the default stays interactive. + const displayMode = new URLSearchParams(location.search).get('mode') === 'readOnly' ? 'readOnly' : 'interactive'; + document.documentElement.dataset.orgchartMode = displayMode; + const chart = api.createOrgChart({ container: document.getElementById('chart-host'), dataSource: new api.JsonOrgChartDataSource(data), stylesheetUrls, displayMode }); + // Development inspection seam: public Core API only. No engine internals. + window.OrgChartP1 = { api, data, chart, stylesheetUrls, setData: next => chart.update(next) }; + window.addEventListener('pagehide', () => chart.destroy(), { once: true }); + await chart.mount(); +} diff --git a/examples/org-chart/p1-classic.html b/examples/org-chart/p1-classic.html new file mode 100644 index 0000000..171fe4d --- /dev/null +++ b/examples/org-chart/p1-classic.html @@ -0,0 +1,13 @@ + + + + + HM OrgChart P1 · 직접 열기 + + + +
+ + + + diff --git a/examples/org-chart/p1.css b/examples/org-chart/p1.css new file mode 100644 index 0000000..338be5d --- /dev/null +++ b/examples/org-chart/p1.css @@ -0,0 +1,12 @@ +/* Reuse the existing local variable font; only OrgChart selects this family. */ +@font-face { + font-family: 'Noto Sans KR'; + src: url('./assets/fonts/NotoSansKR-variable.ttf') format('truetype'); + font-style: normal; + font-weight: 100 900; + font-display: swap; +} +body { margin: 0; background: #ffffff; } +main { padding: 16px; } +#chart-host { min-width: 0; } +html[data-orgchart-mode="readOnly"] body { background: #F5F8FB; } diff --git a/examples/org-chart/p1.html b/examples/org-chart/p1.html new file mode 100644 index 0000000..0d0a7c5 --- /dev/null +++ b/examples/org-chart/p1.html @@ -0,0 +1,16 @@ + + + + + HM OrgChart P1 · Full Composition + + + +
+ + + diff --git a/examples/org-chart/prepare.mjs b/examples/org-chart/prepare.mjs new file mode 100644 index 0000000..9828190 --- /dev/null +++ b/examples/org-chart/prepare.mjs @@ -0,0 +1,40 @@ +import { cp, mkdir, readFile, writeFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +const example = fileURLToPath(new URL('./', import.meta.url)); +const root = path.resolve(example, '../..'); +const output = path.join(example, 'dist'); +await mkdir(path.join(output, 'assets'), { recursive: true }); +// The host's theme is generated from the existing public CSS entry; no maintained theme fork. +async function flatten(file, seen = new Set()) { + const full = path.resolve(file); + if (seen.has(full)) throw new Error('Theme CSS import cycle'); + const stack = new Set(seen).add(full); + const source = await readFile(full, 'utf8'); + const matches = [...source.matchAll(/@import\s+["']([^"']+)["'];/g)]; + let result = '', cursor = 0; + for (const match of matches) { + result += source.slice(cursor, match.index) + await flatten(path.resolve(path.dirname(full), match[1]), stack); + cursor = match.index + match[0].length; + } + return result + source.slice(cursor); +} +const theme = (await flatten(path.join(root, 'packages/ui/src/theme.css'))) + .replace('/fonts/NotoSansKR-variable.ttf', './fonts/NotoSansKR-variable.ttf'); +await writeFile(path.join(output, 'assets/hm-theme.css'), theme); +await cp(path.join(root, 'public/fonts'), path.join(output, 'assets/fonts'), { recursive: true }); +for (const file of ['index.js', 'orgchart.browser.js', 'style.css', 'engine.css']) + await cp(path.join(root, 'packages/org-chart/dist', file), path.join(output, 'assets', file)); +await cp(path.join(root, 'packages/org-chart/dist/licenses'), path.join(output, 'assets/licenses'), { recursive: true }); +for (const file of ['index.html', 'classic.html', 'app.js', 'demo.css', 'data-v1.json', 'data-v2.json', 'data-p1.json', 'p1.html', 'p1-classic.html', 'p1-app.js', 'p1.css']) + await cp(path.join(example, file), path.join(output, file)); +const initial = JSON.parse(await readFile(path.join(example, 'data-v1.json'), 'utf8')); +const changed = JSON.parse(await readFile(path.join(example, 'data-v2.json'), 'utf8')); +await writeFile(path.join(output, 'fixtures.js'), `window.OrgChartFixtures = ${JSON.stringify({initial, changed})};\n`); +const app = await readFile(path.join(example, 'app.js'), 'utf8'); +await writeFile(path.join(output, 'app-classic.js'), app.replace('export function startDemo', 'function startDemo')); +const p1 = JSON.parse(await readFile(path.join(example, 'data-p1.json'), 'utf8')); +await writeFile(path.join(output, 'p1-fixture.js'), `window.OrgChartP1Fixture = ${JSON.stringify(p1)};\n`); +const p1App = await readFile(path.join(example, 'p1-app.js'), 'utf8'); +await writeFile(path.join(output, 'p1-app-classic.js'), p1App.replace('export async function startP1', 'async function startP1')); +console.log(`OrgChart HTML example: ${output}`); diff --git a/examples/org-chart/serve.mjs b/examples/org-chart/serve.mjs new file mode 100644 index 0000000..2966784 --- /dev/null +++ b/examples/org-chart/serve.mjs @@ -0,0 +1,18 @@ +import http from 'node:http'; +import { readFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +const base = fileURLToPath(new URL('./dist/', import.meta.url)); +const mime = { '.html': 'text/html; charset=utf-8', '.js': 'text/javascript; charset=utf-8', '.json': 'application/json; charset=utf-8', '.css': 'text/css; charset=utf-8', '.ttf': 'font/ttf' }; +const port = Number(process.env.ORGCHART_PORT || 4178); +http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://localhost'); + const file = path.resolve(base, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(base, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) { response.writeHead(403).end(); return; } + const data = await readFile(file); + response.setHeader('Content-Type', mime[path.extname(file)] || 'application/octet-stream'); + response.setHeader('Cache-Control', 'no-store'); response.end(data); + } catch { response.writeHead(404).end(); } +}).listen(port, '127.0.0.1', () => console.log(`OrgChart example: http://127.0.0.1:${port}`)); diff --git a/examples/org-chart/verify-card-content.mjs b/examples/org-chart/verify-card-content.mjs new file mode 100644 index 0000000..4d273ce --- /dev/null +++ b/examples/org-chart/verify-card-content.mjs @@ -0,0 +1,204 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// Stage 2 only: typography, data placement, overflow and accessible tooltip. +// Do not repeat Stage 1's gradient/data/Summary/engine suites. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-card-content'); +await mkdir(output, { recursive: true }); +const { chromium } = await import(process.env.ORGCHART_PLAYWRIGHT_MODULE ? pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href : 'playwright'); +const results = [], errors = [], measurements = [], servers = []; +const check = (value, name, detail) => results.push({ name, status: value ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.ttf': 'font/ttf' }; +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + if (url.pathname === '/profile-fixture.svg') { + response.setHeader('Content-Type', 'image/svg+xml'); + return response.end(''); + } + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); servers.push(server); + return `http://127.0.0.1:${server.address().port}`; +} +async function ready(page) { + await page.waitForFunction(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host')?.shadowRoot; + return shadow?.querySelector('[data-card-asset] .hm-orgchart-person-name[data-name-overflow]') + && [...shadow.querySelectorAll('link')].every(link => !!link.sheet); + }); + await page.evaluate(async () => { + await document.fonts.ready; + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + await Promise.all([...shadow.querySelectorAll('img')].map(img => img.decode().catch(() => {}))); + }); +} +async function measure(page) { + return page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const rect = element => { const b = element.getBoundingClientRect(); return { left: b.left, right: b.right, top: b.top, bottom: b.bottom, width: b.width, height: b.height }; }; + const typography = element => { + const style = getComputedStyle(element); + return Object.fromEntries(['color', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'margin', 'padding', 'whiteSpace', 'textOverflow', 'fontFamily'].map(key => [key, style[key]])); + }; + const cards = [...shadow.querySelectorAll('[data-card-asset]')].map(card => { + const role = card.querySelector('.hm-orgchart-person-role'), name = card.querySelector('.hm-orgchart-person-name'); + const avatar = card.querySelector('.hm-orgchart-avatar'), logo = card.querySelector('.hm-orgchart-affiliation-mark'); + const bounds = rect(card), roleBounds = rect(role), nameBounds = rect(name), issues = []; + const overlap = (a, b) => Math.min(a.right, b.right) - Math.max(a.left, b.left) > 1 && Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top) > 1; + const contained = b => b.left >= bounds.left - 1 && b.right <= bounds.right + 1 && b.top >= bounds.top - 1 && b.bottom <= bounds.bottom + 1; + for (const [label, element] of [['role', role], ['name', name], ['avatar', avatar], ['logo', logo]]) if (!contained(rect(element))) issues.push(`${label} outside card`); + for (const element of [role, name]) { + // A clipped name's DOM Range intentionally retains the full text width; + // visible text is intersected with its clipping box for collision checks. + const range = document.createRange(); range.selectNodeContents(element); + for (const r of range.getClientRects()) { + const box = rect(element); + const visible = { left: Math.max(r.left, box.left), right: Math.min(r.right, box.right), top: Math.max(r.top, box.top), bottom: Math.min(r.bottom, box.bottom) }; + if (overlap(visible, rect(avatar))) issues.push(`${element.className}: avatar overlap`); + if (overlap(visible, rect(logo))) issues.push(`${element.className}: logo overlap`); + } + } + const badge = card.querySelector('.hm-orgchart-job-title'); + if (badge) { + if (!contained(rect(badge))) issues.push('badge outside card'); + if (overlap(rect(badge), rect(avatar)) || overlap(rect(badge), nameBounds)) issues.push('badge overlap'); + } + return { id: card.dataset.employeeId, size: card.dataset.cardAssetSize, name: name.textContent, role: typography(role), person: typography(name), + width: bounds.width, height: bounds.height, avatarWidth: rect(avatar).width, avatarHeight: rect(avatar).height, + textGap: nameBounds.top - roleBounds.bottom, cssGap: getComputedStyle(card.querySelector('.hm-orgchart-person-text')).gap, + overflow: name.dataset.nameOverflow, focusable: name.getAttribute('tabindex'), description: !!name.getAttribute('aria-describedby'), + nameWidth: name.clientWidth, nameScrollWidth: name.scrollWidth, issues, + imageLoaded: !!avatar.querySelector('img')?.naturalWidth, + logoTransparent: getComputedStyle(logo.querySelector('img')).backgroundColor === 'rgba(0, 0, 0, 0)', + fallbackHidden: getComputedStyle(logo.querySelector('.hm-orgchart-affiliation-fallback')).visibility === 'hidden' }; + }); + const viewport = shadow.querySelector('.hm-orgchart-viewport'); + return { cards, pageOverflow: document.documentElement.scrollWidth > innerWidth + 1, + extents: { document: [document.documentElement.scrollWidth, document.documentElement.scrollHeight, document.documentElement.clientWidth, document.documentElement.clientHeight], + viewport: viewport ? [viewport.scrollWidth, viewport.scrollHeight, viewport.clientWidth, viewport.clientHeight] : null }, + orphanTooltips: [...shadow.querySelectorAll('[role=tooltip]')].filter(tip => !shadow.querySelector(`[aria-describedby="${tip.id}"]`)).length }; + }); +} +function verifyTypography(value, label) { + for (const size of ['representative', 'leader', 'employee']) { + const cards = value.cards.filter(card => card.size === size), small = size === 'employee'; + check(cards.length > 0 && cards.every(card => card.role.color === (size === 'representative' ? 'rgb(34, 67, 135)' : 'rgb(121, 121, 121)') + && card.role.fontSize === (small ? '15px' : '20px') && card.role.fontWeight === '400' && card.role.lineHeight === (small ? '18px' : '22px') + && card.role.letterSpacing === (small ? '-0.6px' : '-0.8px')), `${label}/${size}: position exact computed typography`); + check(cards.every(card => card.person.color === 'rgb(7, 29, 58)' && card.person.fontSize === (small ? '20px' : '24px') && card.person.fontWeight === '600' + && card.person.lineHeight === (small ? '24px' : '30px') && card.person.letterSpacing === (size === 'leader' ? '-0.96px' : '-0.8px')), `${label}/${size}: name exact computed typography`); + check(cards.every(card => card.cssGap === '0px' && card.textGap === 0 && card.role.margin === '0px' && card.role.padding === '0px' + && card.person.margin === '0px' && card.person.padding === '0px'), `${label}/${size}: zero gap/margins/padding between two text rows`); + check(cards.every(card => card.width === (small ? 108 : 146) && card.height === (size === 'representative' ? 74 : small ? 52 : 68) + && card.avatarWidth === (size === 'representative' ? 36 : small ? 24 : 32) && card.avatarHeight === card.avatarWidth), `${label}/${size}: original card/profile dimensions retained`); + } + check(value.cards.every(card => card.issues.length === 0), `${label}: content collisions/bounds`, value.cards.filter(card => card.issues.length)); + check(value.cards.every(card => card.logoTransparent && card.fallbackHidden), `${label}: transparent original logos/fallback retained`); + check(!value.pageOverflow && value.orphanTooltips === 0, `${label}: no new page overflow/orphan tooltip`); +} +async function tooltipChecks(page, label) { + const names = page.locator('[data-card-asset] .hm-orgchart-person-name[data-name-overflow=true]'); + for (const size of ['representative', 'leader', 'employee']) { + const name = page.locator(`[data-card-asset-size="${size}"] .hm-orgchart-person-name[data-name-overflow=true]`).first(); + await name.scrollIntoViewIfNeeded(); + await name.hover(); + const description = await name.getAttribute('aria-describedby'), tip = page.locator(`#${description}`); + check(await tip.isVisible() && await tip.innerText() === await name.innerText(), `${label}/${size}: hover shows complete original name`); + await tip.hover(); + check(await tip.isVisible(), `${label}/${size}: tooltip hoverable`); + await page.mouse.move(0, 0); + await page.waitForFunction(() => [...document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot.querySelectorAll('[role=tooltip]')].every(tip => tip.hidden)); + // Tab through the real keyboard order from this explicit preceding control. + await name.evaluate(element => { const previous = document.createElement('button'); previous.textContent = 'keyboard test start'; element.before(previous); previous.focus(); }); + await page.keyboard.press('Tab'); + check(await name.evaluate(element => element.getRootNode().activeElement === element) && await tip.isVisible(), `${label}/${size}: Tab focus reveals full name`); + check((await name.ariaSnapshot()).includes(await name.innerText()) && await name.getAttribute('aria-describedby') === await tip.getAttribute('id'), `${label}/${size}: full text retained in Chromium accessibility representation/description`); + await page.keyboard.press('Escape'); + check(!(await tip.isVisible()) && await name.evaluate(element => element.getRootNode().activeElement === element), `${label}/${size}: Escape dismisses, focus retained`); + const tipBox = await tip.evaluate(element => { element.hidden = false; const b = element.getBoundingClientRect(); element.hidden = true; return { left: b.left, right: b.right, top: b.top, bottom: b.bottom }; }); + const screen = page.viewportSize(); + check(tipBox.left >= 0 && tipBox.right <= screen.width + 1 && tipBox.top >= 0 && tipBox.bottom <= screen.height + 1, `${label}/${size}: tooltip inside browser viewport`); + await name.evaluate(element => element.previousElementSibling.remove()); + } + check(await names.count() === 3, `${label}: only the three explicit long-name cases are focusable`); +} +let browser; +try { + const origins = await Promise.all(['storybook-static', 'examples/org-chart/dist', 'examples/org-chart-react/dist'].map(directory => serve(path.join(root, directory)))); + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME ?? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await browser.newContext({ viewport: { width: 1440, height: 1000 }, reducedMotion: 'reduce' }); + const routes = [['department-colors', `${origins[0]}/iframe.html?id=orgchart--department-colors&viewMode=story`], + ['full-composition', `${origins[0]}/iframe.html?id=orgchart--full-composition&viewMode=story`], ['html', `${origins[1]}/p1.html`], ['react', `${origins[2]}/p1.html`]]; + for (const [label, url] of routes) { + const page = await context.newPage(); + page.on('pageerror', error => errors.push({ label, message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ label, message: message.text() }); }); + await page.goto(url); await ready(page); + for (const width of [390, 768, 1280, 1440]) { + await page.setViewportSize({ width, height: 1000 }); await ready(page); + const value = await measure(page); measurements.push({ label, width, ...value }); verifyTypography(value, `${label}/${width}`); + check(value.cards.every(card => /^[가-힣]{2,3}$/.test(card.name) && card.overflow === 'false' && card.focusable === null && card.person.textOverflow === 'clip'), `${label}/${width}: natural short names remain complete and outside tab order`); + } + if (label === 'department-colors') { + await page.locator('.hm-orgchart-representative-preview').screenshot({ path: path.join(output, 'representative-normal.png') }); + for (const [index, department] of [[0, 'business-management'], [1, 'business-planning'], [3, 'integrated-system']]) await page.locator('.hm-orgchart-preview-grid').nth(index).screenshot({ path: path.join(output, `${department}-normal.png`) }); + await page.getByRole('button', { name: '긴 이름 검증 시작' }).click(); await ready(page); + for (const width of [390, 1440]) { + await page.setViewportSize({ width, height: 1000 }); await ready(page); + const value = await measure(page); measurements.push({ label: 'storybook-long', width, ...value }); verifyTypography(value, `storybook-long/${width}`); + check(value.cards.filter(card => card.overflow === 'true').length === 3 && value.cards.filter(card => card.overflow === 'true').every(card => card.person.textOverflow === 'ellipsis' && card.focusable === '0' && card.description), `storybook-long/${width}: ellipsis and focus only on overflowing names`); + await tooltipChecks(page, `storybook-long/${width}`); + } + await page.locator('.hm-orgchart-representative-preview').scrollIntoViewIfNeeded(); + await page.locator('[data-card-asset-size=representative] .hm-orgchart-person-name').focus(); + await page.screenshot({ path: path.join(output, 'representative-long-focus.png') }); + await page.getByRole('button', { name: '긴 이름 검증 종료' }).click(); await ready(page); + check((await measure(page)).orphanTooltips === 0 && await page.locator('[role=tooltip]').count() === 0, 'Story long -> normal disposes tooltip nodes'); + } + if (label === 'full-composition') { + await page.locator('.node[data-organization-id=business-management]').scrollIntoViewIfNeeded(); + await page.screenshot({ path: path.join(output, 'composition-1440.png') }); + } + if (label === 'html') { + await page.evaluate(async () => { + const next = structuredClone(window.OrgChartP1.data); + for (const id of ['mock-leader-00', 'mock-leader-01', 'mock-employee-01']) { + const person = next.employees.find(item => item.id === id); + person.name = '아주긴가상이름표시검증사례'; person.profileImage = `${location.origin}/profile-fixture.svg`; + } + await window.OrgChartP1.setData(next); + }); await ready(page); + const value = await measure(page); verifyTypography(value, 'html-long-images'); + check(value.cards.filter(card => card.overflow === 'true').every(card => card.imageLoaded), 'long names keep original-size profile images'); + await tooltipChecks(page, 'html-long-images'); + } + await page.close(); + } + for (const width of [390, 768, 1280, 1440]) { + const html = measurements.find(item => item.label === 'html' && item.width === width); + const react = measurements.find(item => item.label === 'react' && item.width === width); + check(JSON.stringify(html.cards) === JSON.stringify(react.cards), `HTML/React computed typography/content parity/${width}`); + } + const before = JSON.parse(await readFile(path.join(output, 'data-p1-before.json'), 'utf8')); + const after = JSON.parse(await readFile(path.join(root, 'examples/org-chart/data-p1.json'), 'utf8')); + for (const employee of before.employees) employee.name = after.employees.find(item => item.id === employee.id).name; + check(JSON.stringify(before) === JSON.stringify(after), 'fixture change is exclusively synthetic display names; contract/count/membership/profile preserved'); + check(errors.length === 0, 'browser console/runtime errors', errors); +} finally { + await writeFile(path.join(output, 'browser.json'), JSON.stringify({ browser: browser?.version(), results, errors, measurements }, null, 2)); + await browser?.close(); + for (const server of servers) await new Promise(resolve => server.close(resolve)); +} +const failures = results.filter(result => result.status === 'FAIL'); +console.log(JSON.stringify({ checks: results.length, failures: failures.map(result => ({ name: result.name, issues: result.detail?.length })) }, null, 2)); +if (failures.length) process.exitCode = 1; diff --git a/examples/org-chart/verify-card-design.mjs b/examples/org-chart/verify-card-design.mjs new file mode 100644 index 0000000..cee3f74 --- /dev/null +++ b/examples/org-chart/verify-card-design.mjs @@ -0,0 +1,201 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, writeFile, mkdir, readdir } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// Verify only the new card assets/layout; do not repeat Core/Summary suites. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-card-design'); +await mkdir(output, { recursive: true }); +const { chromium } = await import(process.env.ORGCHART_PLAYWRIGHT_MODULE ? pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href : 'playwright'); +const results = [], measurements = [], errors = [], servers = []; +const check = (value, name, detail) => results.push({ name, status: value ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.ttf': 'font/ttf', '.svg': 'image/svg+xml' }; +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + if (url.pathname === '/profile-fixture.svg') { + response.setHeader('Content-Type', 'image/svg+xml'); + return response.end(''); + } + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + servers.push(server); + return `http://127.0.0.1:${server.address().port}`; +} +async function ready(page) { + await page.waitForFunction(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host')?.shadowRoot; + return shadow?.querySelector('[data-card-asset]') && [...shadow.querySelectorAll('link')].every(link => !!link.sheet); + }); + await page.evaluate(async () => { + await document.fonts.ready; + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + await Promise.all([...shadow.querySelectorAll('img')].map(img => img.decode().catch(() => {}))); + }); +} +async function measure(page) { + return page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const cards = [...shadow.querySelectorAll('[data-card-asset]')].map(card => { + const bounds = card.getBoundingClientRect(), background = card.querySelector('.hm-orgchart-card-background'); + const avatar = card.querySelector('.hm-orgchart-avatar').getBoundingClientRect(); + const logo = card.querySelector('.hm-orgchart-affiliation-mark')?.getBoundingClientRect(); + const style = getComputedStyle(card), issues = []; + const contained = rect => rect.left >= bounds.left - 1 && rect.right <= bounds.right + 1 && rect.top >= bounds.top - 1 && rect.bottom <= bounds.bottom + 1; + const overlap = (a, b) => b && Math.min(a.right, b.right) - Math.max(a.left, b.left) > 1 && Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top) > 1; + if (!contained(avatar)) issues.push('avatar outside card'); + if (logo && !contained(logo)) issues.push('logo outside card'); + for (const element of card.querySelectorAll('.hm-orgchart-person-name, .hm-orgchart-person-role, .hm-orgchart-job-title, .hm-orgchart-status-label')) { + const range = document.createRange(); range.selectNodeContents(element); + for (const rect of range.getClientRects()) { + if (!contained(rect)) issues.push(`${element.className}: text outside card`); + if (overlap(rect, avatar)) issues.push(`${element.className}: avatar overlap`); + if (overlap(rect, logo)) issues.push(`${element.className}: logo overlap`); + } + } + return { id: card.dataset.employeeId, department: card.dataset.cardAsset, size: card.dataset.cardAssetSize, kind: card.dataset.cardKind, inTopSlot: !!card.closest('.hm-orgchart-top-leaders'), + width: bounds.width, height: bounds.height, backgroundLoaded: background.complete && background.naturalWidth > 0, + naturalWidth: background.naturalWidth, naturalHeight: background.naturalHeight, embedded: background.src.startsWith('data:image/svg+xml'), + border: style.borderWidth, radius: style.borderRadius, fill: style.backgroundColor, + decoration: getComputedStyle(card, '::before').content, issues, + logoLoaded: !!card.querySelector('.hm-orgchart-affiliation-mark img')?.naturalWidth, + fallbackHidden: getComputedStyle(card.querySelector('.hm-orgchart-affiliation-fallback')).visibility === 'hidden', + logoBackground: getComputedStyle(card.querySelector('.hm-orgchart-affiliation-mark img')).backgroundColor, + avatarImage: !!card.querySelector('.hm-orgchart-avatar img')?.naturalWidth }; + }); + return { cards, documentOverflow: document.documentElement.scrollWidth > innerWidth + 1, + legacyCards: [...shadow.querySelectorAll('.hm-orgchart-employee:not([data-card-asset])')].map(card => ({ id: card.dataset.employeeId, status: card.dataset.workStatus, kind: card.dataset.cardKind })), + contrastCount: shadow.querySelectorAll('.hm-orgchart-contrast-result').length, + headings: [...shadow.querySelectorAll('.hm-orgchart-color-department-name')].map(item => item.textContent) }; + }); +} +function verify(value, label) { + check(value.cards.length > 0 && value.cards.every(card => card.backgroundLoaded && card.embedded), `${label}: actual embedded SVGs load`); + check(value.cards.every(card => card.width === (card.size === 'employee' ? 108 : 146) && card.height === (card.size === 'representative' ? 74 : card.size === 'leader' ? 68 : 52) + && card.naturalWidth === card.width && card.naturalHeight === card.height), `${label}: native card sizes/ratios`); + check(value.cards.every(card => card.size === (card.kind === 'topLeader' ? 'representative' : card.kind === 'employee' ? 'employee' : 'leader')), `${label}: representative/leader/employee remain distinct`); + check(value.cards.every(card => card.border === '0px' && card.radius === '0px' && card.fill === 'rgba(0, 0, 0, 0)' && card.decoration === 'none'), `${label}: original SVG shape without legacy box decoration`); + check(value.cards.every(card => card.issues.length === 0), `${label}: text/avatar/logo bounds and collisions`, value.cards.filter(card => card.issues.length)); + check(value.cards.every(card => card.logoLoaded && card.fallbackHidden && card.logoBackground === 'rgba(0, 0, 0, 0)'), `${label}: existing transparent logos/fallback preserved`); + check(!value.documentOverflow, `${label}: no page overflow`); +} +let browser; +try { + const origins = await Promise.all(['storybook-static', 'examples/org-chart/dist', 'examples/org-chart-react/dist'].map(directory => serve(path.join(root, directory)))); + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME ?? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await browser.newContext({ viewport: { width: 1440, height: 1000 }, deviceScaleFactor: 1, reducedMotion: 'reduce' }); + const index = JSON.parse(await readFile(path.join(root, 'storybook-static/index.json'), 'utf8')); + const entries = Object.values(index.entries).filter(entry => entry.type === 'story' && entry.title.startsWith('OrgChart')); + check(entries.filter(entry => !entry.tags?.includes('internal')).map(entry => entry.id).sort().join() === ['logo', 'department-colors', 'position-summary', 'affiliation-summary', 'full-composition'].map(id => `orgchart--${id}`).sort().join(), 'five public Storybook menus preserved'); + check(entries.filter(entry => entry.title === 'OrgChart/Content' && entry.tags.includes('internal')).length === 8, 'eight internal Stories preserved'); + const assets = await readdir(path.join(root, 'packages/org-chart/src/assets/cards')); + const source = process.env.ORGCHART_CARD_SOURCE; + if (source) for (const file of assets.filter(file => file.endsWith('.svg') && !['대표자.svg', '사업관리팀.svg', '사업관리팀-sm.svg'].includes(file))) { + const hash = buffer => createHash('sha256').update(buffer).digest('hex'); + check(hash(await readFile(path.join(source, file))) === hash(await readFile(path.join(root, 'packages/org-chart/src/assets/cards', file))), `original SHA-256 preserved: ${file}`); + } + const routes = [ + ['department-colors', `${origins[0]}/iframe.html?id=orgchart--department-colors&viewMode=story`], + ['full-composition', `${origins[0]}/iframe.html?id=orgchart--full-composition&viewMode=story`], + ['html', `${origins[1]}/p1.html`], ['react', `${origins[2]}/p1.html`], + ['file-classic', pathToFileURL(path.join(root, 'examples/org-chart/dist/p1-classic.html')).href], + ]; + for (const [label, url] of routes) { + const page = await context.newPage(); + page.on('pageerror', error => errors.push({ label, message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ label, message: message.text() }); }); + await page.goto(url); await ready(page); + for (const width of [390, 768, 1280, 1440]) { + await page.setViewportSize({ width, height: 1000 }); await ready(page); + const value = await measure(page); measurements.push({ label, width, ...value }); verify(value, `${label}/${width}`); + if (label === 'department-colors') { + check(value.cards.length === 13 && new Set(value.cards.filter(card => card.department !== 'representative').map(card => card.department)).size === 6, `${label}/${width}: six departments, both card sizes plus representative`); + check(value.contrastCount === 24 && value.headings.length === 6, `${label}/${width}: existing contrast display retained`); + } else { + check(new Set(value.cards.filter(card => card.department !== 'representative').map(card => card.department)).size === 6, `${label}/${width}: all six mapped branches present`); + check(value.cards.filter(card => card.department === 'representative').length === 1 && value.cards.some(card => card.id === 'mock-leader-00' && card.size === 'representative' && card.inTopSlot), `${label}/${width}: representative alone in top-leader slot`); + check(value.cards.some(card => card.id === 'mock-leader-01' && card.department === 'business-management' && card.size === 'leader') + && value.cards.some(card => card.id === 'mock-employee-01' && card.department === 'business-management' && card.size === 'employee'), `${label}/${width}: business-management maps its own two sizes`); + check(value.legacyCards.some(card => card.status !== 'active'), `${label}/${width}: supplementary status cards unchanged`); + } + } + if (label === 'department-colors') { + await page.screenshot({ path: path.join(output, 'department-colors-1440.png'), fullPage: true }); + await page.locator('.hm-orgchart-representative-preview').screenshot({ path: path.join(output, 'representative-card.png') }); + for (const [number, department] of [[0, 'business-management'], [1, 'business-planning'], [2, 'talent-growth'], [3, 'integrated-system'], [4, 'design-planning'], [5, 'solution-sales']]) { + await page.locator('.hm-orgchart-preview-grid').nth(number).screenshot({ path: path.join(output, `${department}-cards.png`) }); + } + } + if (label === 'full-composition') { + for (const department of ['business-management', 'business-planning', 'integrated-system', 'solution-sales']) { + await page.locator(`.node[data-organization-id="${department}"]`).scrollIntoViewIfNeeded(); + await page.screenshot({ path: path.join(output, `composition-${department}-1440.png`) }); + } + } + if (label === 'html') { + // A local image fixture tests the retained profile data layer without + // changing the source JSON or copying personal employee data. + await page.evaluate(async () => { + const next = structuredClone(window.OrgChartP1.data); + for (const id of ['mock-leader-00', 'mock-leader-02', 'mock-employee-02']) next.employees.find(item => item.id === id).profileImage = `${location.origin}/profile-fixture.svg`; + await window.OrgChartP1.setData(next); + }); + await ready(page); + const value = await measure(page); + const profiles = value.cards.filter(card => ['mock-leader-00', 'mock-leader-02', 'mock-employee-02'].includes(card.id)); + check(profiles.length === 3 && profiles.every(card => card.avatarImage && card.issues.length === 0), 'representative/leader/employee profile images retain bounds over SVG'); + } + await page.close(); + } + for (const width of [390, 768, 1280, 1440]) { + const canonical = value => JSON.stringify(value.cards); + const html = measurements.find(item => item.label === 'html' && item.width === width); + const react = measurements.find(item => item.label === 'react' && item.width === width); + const classic = measurements.find(item => item.label === 'file-classic' && item.width === width); + check(canonical(html) === canonical(react) && canonical(html) === canonical(classic), `HTML/React/file:// shared card rendering parity/${width}`); + } + const colorPage = await context.newPage(); + const reference = await readFile(path.join(output, 'business-management-reference.png')); + const vector = await readFile(path.join(root, 'packages/org-chart/src/assets/cards/사업관리팀.svg')); + const comparison = await colorPage.evaluate(async ({ reference, vector }) => { + const render = async (src) => { + const image = new Image(); image.src = src; await image.decode(); + const canvas = document.createElement('canvas'); canvas.width = 408; canvas.height = 191; + const ctx = canvas.getContext('2d'); ctx.drawImage(image, 0, 0, 408, 191); + return { pixels: ctx.getImageData(0, 0, 408, 191).data, png: canvas.toDataURL() }; + }; + const a = await render(reference), b = await render(vector), errors = []; + for (let i = 0; i < a.pixels.length; i += 4) { + for (let channel = 0; channel < 3; channel++) { + const ca = a.pixels[i + channel] * a.pixels[i + 3] / 255 + 255 - a.pixels[i + 3]; + const cb = b.pixels[i + channel] * b.pixels[i + 3] / 255 + 255 - b.pixels[i + 3]; + errors.push(Math.abs(ca - cb)); + } + } + const mean = errors.reduce((sum, value) => sum + value, 0) / errors.length; + errors.sort((x, y) => x - y); + return { meanRGBChannelError: mean, percentile95ChannelError: errors[Math.floor(errors.length * 0.95)], generatedPreview: b.png }; + }, { reference: `data:image/png;base64,${reference.toString('base64')}`, vector: `data:image/svg+xml;base64,${vector.toString('base64')}` }); + await writeFile(path.join(output, 'business-management-generated.png'), Buffer.from(comparison.generatedPreview.split(',')[1], 'base64')); + delete comparison.generatedPreview; + await writeFile(path.join(output, 'business-management-comparison.json'), JSON.stringify({ ...comparison, method: 'Chrome canvas, reference and generated SVG at reference raster dimensions, RGB over white, all pixels. Geometry/antialias differences included; not a perceptual certification.' }, null, 2)); + check(comparison.meanRGBChannelError < 3 && comparison.percentile95ChannelError < 8, 'business-management PNG versus SVG rendered color similarity', comparison); + await colorPage.close(); + check(errors.length === 0, 'browser console/runtime errors', errors); +} finally { + await writeFile(path.join(output, 'browser.json'), JSON.stringify({ browser: browser?.version(), results, errors, measurements }, null, 2)); + await browser?.close(); + for (const server of servers) await new Promise(resolve => server.close(resolve)); +} +const failures = results.filter(result => result.status === 'FAIL'); +console.log(JSON.stringify({ checks: results.length, failures: failures.map(result => ({ name: result.name, detail: result.detail?.length })) }, null, 2)); +if (failures.length) process.exitCode = 1; diff --git a/examples/org-chart/verify-final-card-check.mjs b/examples/org-chart/verify-final-card-check.mjs new file mode 100644 index 0000000..6fd4254 --- /dev/null +++ b/examples/org-chart/verify-final-card-check.mjs @@ -0,0 +1,142 @@ +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +import { createHash } from 'node:crypto'; + +// Only the eight final card requirements; existing 368-check evidence is untouched. +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href); +const output = 'test-results/org-chart-final-check'; +await mkdir(output, { recursive: true }); +const fixture = JSON.parse(await readFile('examples/org-chart/data-p1.json', 'utf8')); +const results = [], measurements = [], errors = []; +const check = (ok, name, actual) => results.push({ name, status: ok ? 'PASS' : 'FAIL', actual }); +const browser = await chromium.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: true }); +const origin = process.env.ORGCHART_STORY_ORIGIN ?? 'http://127.0.0.1:6031'; +const collisionRepair = process.argv.includes('--collision-repair'); +async function capture(story, scenario, data) { + const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); + page.on('pageerror', error => errors.push({ story, scenario, message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ story, scenario, message: message.text() }); }); + if (data) await page.route('**/examples/org-chart/data-p1.json*', route => route.fulfill({ + status: 200, contentType: 'application/javascript', body: `export default ${JSON.stringify(data)};`, + })); + await page.goto(`${origin}/iframe.html?id=orgchart--${story}&viewMode=story`); + await page.waitForFunction(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host')?.shadowRoot; + return shadow?.querySelector('[data-card-asset] .hm-orgchart-person-name[data-name-overflow]') + && [...shadow.querySelectorAll('link')].every(link => link.sheet); + }); + await page.evaluate(async () => { + await document.fonts.ready; + const root = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + await Promise.all([...root.querySelectorAll('img')].map(image => image.decode().catch(() => {}))); + }); + const cards = await page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const box = element => { const r = element.getBoundingClientRect(); return { x: r.x, y: r.y, right: r.right, bottom: r.bottom, width: r.width, height: r.height }; }; + // Collision checks use painted logo pixels, not the transparent container. + const logoInk = mark => { + const img = mark?.querySelector('img'); + if (!img?.naturalWidth) return null; + const canvas = document.createElement('canvas'); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; + const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); + const pixels = ctx.getImageData(0, 0, canvas.width, canvas.height).data; + let left = canvas.width, right = -1, top = canvas.height, bottom = -1; + for (let y = 0; y < canvas.height; y++) for (let x = 0; x < canvas.width; x++) if (pixels[(y * canvas.width + x) * 4 + 3] > 16) { + left = Math.min(left, x); right = Math.max(right, x + 1); top = Math.min(top, y); bottom = Math.max(bottom, y + 1); + } + if (right < 0) return null; + const b = box(img), scale = Math.min(b.width / canvas.width, b.height / canvas.height); + const x = b.x + (b.width - canvas.width * scale) / 2, y = b.y + (b.height - canvas.height * scale) / 2; + return { x: x + left * scale, y: y + top * scale, right: x + right * scale, bottom: y + bottom * scale }; + }; + return [...shadow.querySelectorAll('[data-card-asset]')].map(card => { + const avatar = card.querySelector('.hm-orgchart-avatar'), text = card.querySelector('.hm-orgchart-person-text'); + const name = card.querySelector('.hm-orgchart-person-name'), position = card.querySelector('.hm-orgchart-person-role'); + const row = card.querySelector('.hm-orgchart-position-row'); + const badge = card.querySelector('.hm-orgchart-job-title'), attrs = card.querySelector('.hm-orgchart-person-attributes'); + const logo = card.querySelector('.hm-orgchart-affiliation-mark'); + const nameStyle = getComputedStyle(name), positionStyle = getComputedStyle(position), cardStyle = getComputedStyle(card); + const a = box(avatar), t = box(text), n = box(name), p = box(position), b = badge && box(badge), l = logoInk(logo); + const overlap = (u, v) => Math.min(u.right, v.right) - Math.max(u.x, v.x) > 1 && Math.min(u.bottom, v.bottom) - Math.max(u.y, v.y) > 1; + const collisions = []; + if (overlap(a, t)) collisions.push('avatar/text'); + if (b && overlap(b, a)) collisions.push('badge/avatar'); + if (b && overlap(b, n)) collisions.push('badge/name'); + if (l && overlap(l, a)) collisions.push('logo/avatar'); + if (l && overlap(l, n)) collisions.push('logo/name'); + if (l && b && overlap(l, b)) collisions.push('logo/badge'); + if (l) { + const range = document.createRange(); range.selectNodeContents(position); + for (const r of range.getClientRects()) if (overlap(l, { x: r.x, y: r.y, right: r.right, bottom: r.bottom })) collisions.push('logo/position'); + } + const bs = badge && getComputedStyle(badge); + return { id: card.dataset.employeeId, size: card.dataset.cardAssetSize, bounds: box(card), avatar: a, + columnGap: cardStyle.columnGap, photoTextGap: t.x - a.right, textGap: getComputedStyle(text).rowGap, + actualTextGap: n.y - p.bottom, nameColor: nameStyle.color, + row: row ? { display: getComputedStyle(row).display, alignItems: getComputedStyle(row).alignItems, gap: getComputedStyle(row).columnGap, + nameGap: n.y - box(row).bottom, badgeGap: b ? b.x - p.right : null, badgeMargin: bs?.margin ?? null, children: row.children.length } : null, + nameMargin: nameStyle.margin, namePadding: nameStyle.padding, positionMargin: positionStyle.margin, positionPadding: positionStyle.padding, + badge: badge ? { text: badge.textContent, fontSize: bs.fontSize, fontWeight: bs.fontWeight, + color: bs.color, background: bs.backgroundColor, bounds: b } : null, + attributesHeight: box(attrs).height, attributesPosition: getComputedStyle(attrs).position, + collisions }; + }); + }); + measurements.push({ story, scenario, cards }); + for (const card of cards) { + const prefix = `${story}/${scenario}/${card.id}/${card.size}`; + if (!collisionRepair) { + if (card.size === 'leader') check(card.columnGap === '10px' && Math.abs(card.photoTextGap - 10) < 0.1, `${prefix}: leader gap`, [card.columnGap, card.photoTextGap]); + if (card.size === 'employee') { + check(card.columnGap === '4px' && Math.abs(card.photoTextGap - 4) < 0.1, `${prefix}: employee gap`, [card.columnGap, card.photoTextGap]); + check(card.nameColor === 'rgb(50, 50, 50)', `${prefix}: name color`, card.nameColor); + } + check(card.textGap === '0px' && Math.abs(card.actualTextGap) < 0.1 && [card.nameMargin, card.namePadding, card.positionMargin, card.positionPadding].every(value => value === '0px'), `${prefix}: text gap`, card.actualTextGap); + const person = (data ?? fixture).employees.find(item => item.id === card.id); + check(card.badge?.text === person.jobTitle || (!person.jobTitle && !card.badge), `${prefix}: jobTitle-driven badge`, { jobTitle: person.jobTitle, badge: card.badge?.text ?? null }); + if (!person.jobTitle) check(card.attributesHeight === 0 && card.attributesPosition === 'absolute', `${prefix}: no empty badge space`, card.attributesHeight); + if (card.badge && card.size !== 'representative') check(card.badge.fontSize === (card.size === 'leader' ? '9px' : '8.5px') && card.badge.fontWeight === (card.size === 'leader' ? '700' : '600'), `${prefix}: badge typography`, card.badge); + if (card.size !== 'representative') { + check(card.row?.display === 'flex' && card.row.alignItems === 'center' && card.row.gap === '4px' && Math.abs(card.row.nameGap) < 0.1, `${prefix}: position/badge row and zero name gap`, card.row); + if (card.badge) check(Math.abs(card.row.badgeGap - 4) < 0.1 && card.row.badgeMargin === '0px', `${prefix}: actual position/badge gap and margin`, card.row); + else check(card.row.children === 1, `${prefix}: position only without badge`, card.row.children); + } + const dimensions = card.size === 'employee' ? [108, 52, 24] : card.size === 'leader' ? [146, 68, 32] : [146, 74, 36]; + check(card.bounds.width === dimensions[0] && card.bounds.height === dimensions[1] && card.avatar.width === dimensions[2] && card.avatar.height === dimensions[2], `${prefix}: preserved dimensions`, dimensions); + } + check(card.collisions.length === 0, `${prefix}: related collisions`, card.collisions); + } + if (!collisionRepair && (scenario === 'normal' || scenario === 'roles')) await page.screenshot({ path: `${output}/${story}-${scenario}.png`, fullPage: true }); + await page.close(); + return cards; +} +try { + const sample = await capture('department-colors', 'normal'); + await capture('full-composition', 'normal'); + if (!collisionRepair) { + const smallIds = sample.filter(card => card.size === 'employee').slice(0, 2).map(card => card.id); + check(smallIds.length === 2, 'two small-card role fixtures available', smallIds); + const roles = structuredClone(fixture); + smallIds.forEach((id, index) => { roles.employees.find(item => item.id === id).jobTitle = index ? '셀장' : '팀장'; }); + const noRole = structuredClone(fixture); + const leaderId = sample.find(card => card.size === 'leader').id; + noRole.employees.find(item => item.id === leaderId).jobTitle = null; + for (const story of ['department-colors', 'full-composition']) { + const cards = await capture(story, 'roles', roles); + for (const [index, id] of smallIds.entries()) check(cards.some(card => card.id === id && card.size === 'employee' && card.badge?.text === (index ? '셀장' : '팀장')), `${story}: small ${index ? 'cell' : 'team'} badge`, id); + const empty = await capture(story, 'no-role', noRole); + check(empty.some(card => card.id === leaderId && !card.badge && card.attributesHeight === 0), `${story}: leader without role has no badge/space`, leaderId); + } + } +} finally { await browser.close(); } +check(errors.length === 0, 'browser console/runtime errors', errors); +const baseline = JSON.parse(await readFile(`${output}/baseline.json`, 'utf8')); +const changed = []; +for (const [file, hash] of Object.entries(baseline)) { + const current = createHash('sha256').update(await readFile(file)).digest('hex'); + if (current !== hash) changed.push(file); +} +if (!collisionRepair) check(changed.length === 3 && changed.includes('packages/org-chart/src/core/employee-card.ts') && changed.includes('packages/org-chart/src/styles/employee-card.css') && changed.includes('packages/org-chart/src/styles/summary-sections.css'), 'preserved SVG/logo/JSON/API/Stories/368 evidence/Guard; only 3 existing files changed', changed); +await writeFile(`${output}/${collisionRepair ? 'card-collision-repair' : 'browser'}.json`, JSON.stringify({ results, measurements, errors, changed, fixtureNote: 'Role/no-role scenarios alter only intercepted in-memory browser JSON modules; repository JSON is unchanged.' }, null, 2)); +console.log(JSON.stringify({ checks: results.length, pass: results.filter(item => item.status === 'PASS').length, failures: results.filter(item => item.status === 'FAIL'), errors, changed }, null, 2)); +if (results.some(item => item.status === 'FAIL')) process.exitCode = 1; diff --git a/examples/org-chart/verify-final-logo-check.mjs b/examples/org-chart/verify-final-logo-check.mjs new file mode 100644 index 0000000..9fe49b8 --- /dev/null +++ b/examples/org-chart/verify-final-logo-check.mjs @@ -0,0 +1,70 @@ +import { readFile, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href); +const output = 'test-results/org-chart-final-check'; +const baselineMode = process.argv.includes('--baseline'); +const repairMode = process.argv.includes('--geometry-repair'); +const browser = await chromium.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: true }); +const measurements = [], results = [], errors = []; +const check = (ok, name, actual) => results.push({ name, status: ok ? 'PASS' : 'FAIL', actual }); +const previous = baselineMode ? [] : JSON.parse(await readFile(`${output}/logo-before.json`, 'utf8')); +try { + for (const story of ['department-colors', 'full-composition']) { + const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); + let expectedImageFailure = false; + page.on('pageerror', error => errors.push(error.message)); + page.on('console', item => { if (item.type() === 'error' && !(expectedImageFailure && item.text().includes('ERR_INVALID_URL'))) errors.push(item.text()); }); + await page.goto(`${process.env.ORGCHART_STORY_ORIGIN}/iframe.html?id=orgchart--${story}&viewMode=story`); + await page.waitForFunction(() => { + const root = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host')?.shadowRoot; + return root?.querySelector('[data-card-asset]') && [...root.querySelectorAll('link')].every(link => link.sheet); + }); + await page.evaluate(async () => { + await document.fonts.ready; + const root = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + await Promise.all([...root.querySelectorAll('img')].map(image => image.decode().catch(() => {}))); + }); + const logos = await page.evaluate(() => { + const root = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const rect = element => { const b = element.getBoundingClientRect(); return { x: b.x, y: b.y, width: b.width, height: b.height }; }; + return [...root.querySelectorAll('[data-card-kind] .hm-orgchart-affiliation-mark')].map(mark => { + const img = mark.querySelector('img'), style = getComputedStyle(mark), fallback = mark.querySelector('.hm-orgchart-affiliation-fallback'); + return { id: mark.closest('[data-card-kind]').dataset.employeeId, kind: mark.closest('[data-card-kind]').dataset.cardKind, + bounds: rect(mark), image: img ? rect(img) : null, imageFit: img && getComputedStyle(img).objectFit, + background: style.backgroundColor, borders: [style.borderTopWidth, style.borderRightWidth, style.borderBottomWidth, style.borderLeftWidth], + borderStyle: style.borderTopStyle, shadow: style.boxShadow, + imageBackground: img && getComputedStyle(img).backgroundColor, + before: getComputedStyle(mark, '::before').content, after: getComputedStyle(mark, '::after').content, + loaded: !!img?.naturalWidth, fallbackVisibility: getComputedStyle(fallback).visibility }; + }); + }); + measurements.push({ story, logos }); + if (!baselineMode) { + for (const [index, logo] of logos.entries()) { + const before = previous.find(item => item.story === story).logos[index]; + if (!repairMode) check(logo.background === 'rgba(0, 0, 0, 0)' && logo.borders.every(value => value === '0px') && logo.borderStyle === 'none' && logo.shadow === 'none', `${story}/${logo.id}: transparent borderless container`, logo); + check(JSON.stringify(logo.bounds) === JSON.stringify(before.bounds) && JSON.stringify(logo.image) === JSON.stringify(before.image) && logo.imageFit === 'contain', `${story}/${logo.id}: unchanged container/image geometry`, { before, after: logo }); + if (!repairMode) check(logo.loaded && logo.fallbackVisibility === 'hidden' && logo.imageBackground === 'rgba(0, 0, 0, 0)' && ['none', 'normal'].includes(logo.before) && ['none', 'normal'].includes(logo.after), `${story}/${logo.id}: loaded transparent image and no fallback/decorations`, logo); + } + await page.locator('[data-employee-id="mock-leader-04"]').screenshot({ path: `${output}/${story}-logo-card.png` }); + expectedImageFailure = true; + const failure = await page.evaluate(async () => { + const root = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const mark = root.querySelector('[data-card-asset] .hm-orgchart-affiliation-mark'); + mark.querySelector('img').src = 'data:image/png;base64,invalid-image'; + await new Promise(resolve => setTimeout(resolve, 100)); + const fallback = mark.querySelector('.hm-orgchart-affiliation-fallback'); + return { noImage: !mark.querySelector('img'), available: mark.dataset.logoAvailable, visibility: getComputedStyle(fallback).visibility, text: fallback.textContent }; + }); + if (!repairMode) check(failure.noImage && failure.available === 'false' && failure.visibility === 'visible' && !!failure.text, `${story}: failed image retains fallback`, failure); + } + await page.close(); + } +} finally { await browser.close(); } +if (baselineMode) await writeFile(`${output}/logo-before.json`, JSON.stringify(measurements, null, 2)); +else { + check(errors.length === 0, 'browser console/runtime errors', errors); + await writeFile(`${output}/${repairMode ? 'logo-geometry-repair' : 'logo-browser'}.json`, JSON.stringify({ results, measurements, errors }, null, 2)); + console.log(JSON.stringify({ checks: results.length, pass: results.filter(item => item.status === 'PASS').length, failures: results.filter(item => item.status === 'FAIL'), errors }, null, 2)); + if (results.some(item => item.status === 'FAIL')) process.exitCode = 1; +} diff --git a/examples/org-chart/verify-final-status-check.mjs b/examples/org-chart/verify-final-status-check.mjs new file mode 100644 index 0000000..d36245c --- /dev/null +++ b/examples/org-chart/verify-final-status-check.mjs @@ -0,0 +1,107 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href); +const output = 'test-results/org-chart-final-check'; +const baselineMode = process.argv.includes('--baseline'); +const colorsRepair = process.argv.includes('--colors-repair'); +const browser = await chromium.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: true }); +const results = [], measurements = [], errors = []; +const check = (ok, name, actual) => results.push({ name, status: ok ? 'PASS' : 'FAIL', actual }); +async function measure(url, label) { + const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); + page.on('pageerror', error => errors.push({ label, message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ label, message: message.text() }); }); + await page.goto(url); + await page.waitForFunction(() => { + const root = document.querySelector('.hm-orgchart-host')?.shadowRoot; + return root?.querySelector('.hm-orgchart-status-group') && [...root.querySelectorAll('link')].every(link => link.sheet); + }); + await page.evaluate(async () => { + await document.fonts.ready; + const root = document.querySelector('.hm-orgchart-host').shadowRoot; + await Promise.all([...root.querySelectorAll('img')].map(image => image.decode().catch(() => {}))); + }); + const value = await page.evaluate(() => { + const root = document.querySelector('.hm-orgchart-host').shadowRoot; + const properties = (element, keys) => { const s = getComputedStyle(element); return Object.fromEntries(keys.map(key => [key, s[key]])); }; + const typography = element => properties(element, ['fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'margin', 'padding']); + const box = element => { const b = element.getBoundingClientRect(); return { x: b.x, y: b.y, right: b.right, bottom: b.bottom }; }; + const overlap = (a, b) => Math.min(a.right, b.right) - Math.max(a.x, b.x) > 1 && Math.min(a.bottom, b.bottom) - Math.max(a.y, b.y) > 1; + const organization = [...root.querySelectorAll('[data-card-asset]')].map(card => ({ id: card.dataset.employeeId, + card: properties(card, ['backgroundImage', 'border', 'width', 'height', 'columnGap']), + name: properties(card.querySelector('.hm-orgchart-person-name'), ['color', 'fontSize', 'fontWeight']), + logo: properties(card.querySelector('.hm-orgchart-affiliation-mark img'), ['filter', 'opacity', 'width', 'height']) })); + const groups = [...root.querySelectorAll('.hm-orgchart-status-group')].map(group => ({ + status: group.dataset.workStatus, titleText: group.querySelector('h3').textContent, + title: properties(group.querySelector('h3'), ['backgroundImage', 'border', 'boxShadow']), + cards: [...group.querySelectorAll('.hm-orgchart-employee')].map(card => { + const role = card.querySelector('.hm-orgchart-person-role'), name = card.querySelector('.hm-orgchart-person-name'); + const avatar = card.querySelector('.hm-orgchart-avatar'), mark = card.querySelector('.hm-orgchart-affiliation-mark'), image = mark.querySelector('img'); + const collisions = []; + const roleRange = document.createRange(); roleRange.selectNodeContents(role); + const nameRange = document.createRange(); nameRange.selectNodeContents(name); + for (const [kind, range] of [['role', roleRange], ['name', nameRange]]) for (const r of range.getClientRects()) { + const textBox = { x: r.x, y: r.y, right: r.right, bottom: r.bottom }; + if (overlap(textBox, box(avatar))) collisions.push(`${kind}/avatar`); + if (overlap(textBox, box(image))) collisions.push(`${kind}/logo`); + } + return { id: card.dataset.employeeId, card: properties(card, ['margin', 'backgroundImage', 'border', 'borderRadius', 'cursor', 'columnGap', 'filter', 'opacity']), + roleColor: getComputedStyle(role).color, nameColor: getComputedStyle(name).color, + roleTypography: typography(role), nameTypography: typography(name), + logo: properties(image, ['filter', 'opacity']), mark: properties(mark, ['backgroundColor', 'border', 'boxShadow', 'filter', 'opacity']), collisions }; + }) + })); + return { organization, groups, radiusVariable: getComputedStyle(root.querySelector('.hm-orgchart-shell')).getPropertyValue('--br-3_5').trim(), + resolvedRadius: getComputedStyle(root.querySelector('.hm-orgchart-shell')).getPropertyValue('--hm-orgchart-resolved-radius-container').trim() }; + }); + if (!baselineMode) await page.locator('.hm-orgchart-status-summary').screenshot({ path: `${output}/${label}-status.png` }); + await page.close(); + return value; +} +let server; +try { + const storyUrl = `${process.env.ORGCHART_STORY_ORIGIN}/iframe.html?id=orgchart--full-composition&viewMode=story`; + const react = await measure(storyUrl, 'react'); + if (baselineMode) await writeFile(`${output}/status-before.json`, JSON.stringify(react, null, 2)); + else { + const baseline = JSON.parse(await readFile(`${output}/status-before.json`, 'utf8')); + if (!colorsRepair) check(JSON.stringify(react.organization) === JSON.stringify(baseline.organization), 'normal organization cards and colored logos unchanged', react.organization.length); + const directory = path.resolve('examples/org-chart/dist'); + server = http.createServer(async (req, res) => { + try { + const file = path.resolve(directory, '.' + decodeURIComponent(new URL(req.url, 'http://localhost').pathname)); + if (path.relative(directory, file).startsWith('..')) return res.writeHead(403).end(); + res.setHeader('Content-Type', ({ '.html': 'text/html', '.css': 'text/css', '.js': 'application/javascript', '.json': 'application/json', '.ttf': 'font/ttf' })[path.extname(file)] ?? 'application/octet-stream'); + res.end(await readFile(file)); + } catch { res.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + const html = await measure(`http://127.0.0.1:${server.address().port}/p1.html`, 'html'); + measurements.push({ label: 'react', ...react }, { label: 'html', ...html }); + check(JSON.stringify(react.groups) === JSON.stringify(html.groups), 'HTML and React status groups computed styles match', react.groups.map(group => group.status)); + for (const group of react.groups) { + const before = baseline.groups.find(item => item.status === group.status); + if (colorsRepair) { + for (const card of group.cards) check(card.roleColor === 'rgb(85, 95, 106)' && card.nameColor === 'rgb(62, 70, 80)', `${group.status}/${card.id}: repaired text colors`, [card.roleColor, card.nameColor]); + continue; + } + check(group.title.backgroundImage === 'linear-gradient(rgb(135, 144, 156) 0%, rgb(104, 114, 126) 100%)' && group.title.border === '1px solid rgba(92, 101, 112, 0.52)' && group.title.boxShadow === 'rgba(75, 84, 96, 0.18) 0px 7px 16px 0px', `${group.status}: title gradient/border/shadow`, group.title); + for (const card of group.cards) { + const old = before.cards.find(item => item.id === card.id); + check(card.card.backgroundImage === 'linear-gradient(rgb(244, 245, 246) 0%, rgb(223, 227, 231) 100%)' && card.card.border === '1px solid rgba(120, 130, 142, 0.35)' && card.card.borderRadius === '4px' && card.card.margin === '0px' && card.card.cursor === 'pointer', `${group.status}/${card.id}: card surface`, card.card); + check(card.roleColor === 'rgb(85, 95, 106)' && card.nameColor === 'rgb(62, 70, 80)', `${group.status}/${card.id}: text colors`, [card.roleColor, card.nameColor]); + check(JSON.stringify(card.roleTypography) === JSON.stringify(old.roleTypography) && JSON.stringify(card.nameTypography) === JSON.stringify(old.nameTypography) && card.card.columnGap === old.card.columnGap, `${group.status}/${card.id}: existing typography and gap preserved`, { role: card.roleTypography, name: card.nameTypography, gap: card.card.columnGap }); + check(card.logo.filter === 'grayscale(1)' && card.logo.opacity === '0.72' && card.mark.filter === 'none' && card.mark.opacity === '1' && card.card.filter === 'none' && card.card.opacity === '1', `${group.status}/${card.id}: image-only filter/opacity`, card.logo); + check(card.mark.backgroundColor === 'rgba(0, 0, 0, 0)' && card.mark.border === '0px none rgb(89, 101, 117)' && card.mark.boxShadow === 'none', `${group.status}/${card.id}: transparent logo frame`, card.mark); + check(card.collisions.length === 0, `${group.status}/${card.id}: profile/text/logo collisions`, card.collisions); + } + check(group.titleText === before.titleText && group.cards.length === before.cards.length, `${group.status}: same employee IDs/counts`, group.cards.map(card => card.id)); + } + check(errors.length === 0, 'browser errors', errors); + await writeFile(`${output}/${colorsRepair ? 'status-colors-repair' : 'status-browser'}.json`, JSON.stringify({ results, measurements, errors }, null, 2)); + console.log(JSON.stringify({ checks: results.length, pass: results.filter(item => item.status === 'PASS').length, failures: results.filter(item => item.status === 'FAIL'), errors }, null, 2)); + if (results.some(item => item.status === 'FAIL')) process.exitCode = 1; + } +} finally { await browser.close(); if (server) await new Promise(resolve => server.close(resolve)); } diff --git a/examples/org-chart/verify-guard-p1.mjs b/examples/org-chart/verify-guard-p1.mjs new file mode 100644 index 0000000..f78a202 --- /dev/null +++ b/examples/org-chart/verify-guard-p1.mjs @@ -0,0 +1,139 @@ +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +import { createHash } from 'node:crypto'; +import { fileURLToPath } from 'node:url'; +import { performance } from 'node:perf_hooks'; +import { parse } from '@babel/parser'; +import postcss from 'postcss'; +import { themeAnalysis } from '../../scripts/guard-theme-analysis.mjs'; + +const root = fileURLToPath(new URL('../../', import.meta.url)); +const script = fileURLToPath(import.meta.url); +const rawFile = path.join(root, 'test-results/org-chart-p1/guard-storybook-menu-recheck.json'); +const output = path.join(root, 'test-results/org-chart-quality/guard-reproduction.json'); +const started = performance.now(); +const hash = file => createHash('sha256').update(fs.readFileSync(file)).digest('hex'); +const rawHashBefore = hash(rawFile); +const raw = JSON.parse(fs.readFileSync(rawFile, 'utf8')); +const analyzerHashBefore = hash(path.join(root, 'scripts/guard-theme-analysis.mjs')); + +function walk(node, visitor, parent = null, field = null) { + if (!node || typeof node !== 'object') return; + if (node.type) visitor(node, parent, field); + for (const [key, value] of Object.entries(node)) { + if (['loc', 'start', 'end', 'comments', 'tokens', 'extra'].includes(key)) continue; + if (Array.isArray(value)) value.forEach(item => walk(item, visitor, node, key)); + else if (value && typeof value === 'object') walk(value, visitor, node, key); + } +} + +/** In-memory fixtures use the function's existing injected parser interface. + * The script itself is a readable CSS-file sentinel because the real analyzer + * reads files before invoking its parser. The parser returns the supplied + * fixture CSS AST; no fixture files or production code are changed. */ +function analyze(label, jsSource, cssSource) { + const jsFile = `memory://${label}.js`; + const records = [{ file: jsFile, edges: [], ast: parse(jsSource, { sourceType: 'module' }) }]; + if (cssSource !== undefined) records.push({ file: script, edges: [], css: true }); + const issues = []; + const result = themeAnalysis({ + records, workspace: root, + postcss: { parse: () => postcss.parse(cssSource ?? '', { from: `memory://${label}.css` }) }, + walk, selectedFile: () => true, + add: (severity, code, file, node, message) => issues.push({ + severity, code, file: file === script ? `memory://${label}.css` : file, + line: node?.loc?.start?.line ?? node?.source?.start?.line ?? 1, message, + }), + }); + return { + label, fixture: { js: jsSource, css: cssSource ?? null }, + analyzerStatus: issues.some(issue => issue.severity === 'FAIL') ? 'FAIL' + : issues.length ? 'NOT VERIFIED' : 'PASS', + definitions: result.definitions, references: result.references.map(ref => ({ + ...ref, file: ref.file === script ? `memory://${label}.css` : ref.file, + })), dynamic: result.dynamic, incomplete: result.incomplete, issues, + }; +} + +const measurements = []; +const assertions = []; +function check(name, condition) { + assertions.push({ name, status: condition ? 'PASS' : 'FAIL' }); + assert.ok(condition, name); +} +let failure; +try { + const graphSource = 'const background = "var(--hm-orgchart-resolved-bg-surface)";'; + const excluded = analyze('shadow-css-excluded', graphSource); + const included = analyze('shadow-css-included', graphSource, + '.hm-orgchart-shell { --hm-orgchart-resolved-bg-surface: #ffffff; }'); + measurements.push(excluded, included); + check('Excluded Shadow CSS reference reproduces TOKEN-001 FAIL', + excluded.issues.some(issue => issue.code === 'TOKEN-001' && issue.severity === 'FAIL')); + check('Connected CSS declaration resolves the identical reference', + included.analyzerStatus === 'PASS' && included.definitions.includes('--hm-orgchart-resolved-bg-surface')); + + const setterSource = 'element.style.setProperty("--hm-orgchart-current-border", "#194d82");\n' + + 'element.style.setProperty("--hm-orgchart-accent", "var(--hm-orgchart-current-border)");'; + const setterOnly = analyze('set-property-not-collected', setterSource); + const setterWithCss = analyze('set-property-with-css-declaration', setterSource, + '.hm-orgchart-group { --hm-orgchart-current-border: #194d82; }'); + measurements.push(setterOnly, setterWithCss); + check('Actual literal setProperty definition is absent from analyzer definitions', + !setterOnly.definitions.includes('--hm-orgchart-current-border') && setterOnly.analyzerStatus === 'FAIL'); + check('CSS definition resolves setProperty reference without changing JS fixture', + setterWithCss.analyzerStatus === 'PASS'); + + const optional = analyze('optional-public-input-with-fallback', '', + '.hm-orgchart-shell { --hm-orgchart-resolved-fg-primary: var(--hm-orgchart-fg-primary, #10243b); }'); + measurements.push(optional); + const optionalReference = optional.references.find(ref => ref.name === '--hm-orgchart-fg-primary'); + check('Optional standalone input with valid fallback is still classified TOKEN-001 FAIL', + optionalReference?.fallback === true && optionalReference.status === 'FAIL' + && optional.issues.some(issue => issue.code === 'TOKEN-001' && issue.severity === 'FAIL')); + + // Diagnostic namespace control only. Renaming OrgChart inputs is NOT a fix. + const otherNamespace = analyze('external-input-namespace-control', '', + '.content { --resolved-fg-primary: var(--external-fg-primary, #10243b); }'); + measurements.push(otherNamespace); + check('Same fallback shape outside HM namespace is NOT VERIFIED, not FAIL', + otherNamespace.analyzerStatus === 'NOT VERIFIED' && otherNamespace.references[0]?.fallback === true); + check('Historical raw report remains FAIL with the original three TOKEN-001 findings', + raw.status === 'FAIL' && raw.staticStatus === 'FAIL' + && raw.issues.filter(issue => issue.code === 'TOKEN-001').length === 3); + check('Original Guard output and analyzer source hashes remain unchanged', + hash(rawFile) === rawHashBefore && hash(path.join(root, 'scripts/guard-theme-analysis.mjs')) === analyzerHashBefore); +} catch (error) { + failure = { name: error.name, message: error.message }; +} + +const report = { + schemaVersion: 1, + purpose: 'Minimal reproduction of existing analyzer behavior; assertion PASS is NOT OrgChart quality or Guard PASS', + reproductionStatus: failure ? 'FAIL' : 'PASS', + generatedAt: new Date().toISOString(), durationMs: Math.round((performance.now() - started) * 100) / 100, + assertions, measurements, + originalGuard: { + file: 'test-results/org-chart-p1/guard-storybook-menu-recheck.json', + sha256Before: rawHashBefore, sha256After: hash(rawFile), status: raw.status, staticStatus: raw.staticStatus, + relevantIssues: raw.issues.filter(issue => ['TOKEN-001', 'TOKEN-002'].includes(issue.code)), + }, + analyzer: { file: 'scripts/guard-theme-analysis.mjs', sha256Before: analyzerHashBefore, + sha256After: hash(path.join(root, 'scripts/guard-theme-analysis.mjs')) }, + scope: 'In-memory fixtures passed directly to the actual exported themeAnalysis; no full Guard suite or browser checks', + limitations: [ + 'This demonstrates analyzer limitations; it does not implement a revised Guard policy', + 'Fixture graph inclusion is controlled directly; real Shadow URL dataflow is not implemented or rerun', + 'The CSS declaration control is a fixture, not a production dummy declaration proposal', + 'The external namespace control is diagnostic; production namespace renaming would be a bypass', + 'Original Guard FAIL remains unchanged; runtime evidence cannot overwrite that FAIL', + 'Common Guard changes require separate user approval', + ], + ...(failure ? { failure } : {}), +}; +fs.mkdirSync(path.dirname(output), { recursive: true }); +fs.writeFileSync(output, `${JSON.stringify(report, null, 2)}\n`); +console.log(JSON.stringify({ reproductionStatus: report.reproductionStatus, assertions: assertions.length, + measurements: measurements.length, originalGuardStatus: raw.status, output: path.relative(root, output) })); +if (failure) process.exitCode = 1; diff --git a/examples/org-chart/verify-p1.mjs b/examples/org-chart/verify-p1.mjs new file mode 100644 index 0000000..364b441 --- /dev/null +++ b/examples/org-chart/verify-p1.mjs @@ -0,0 +1,568 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, mkdir, writeFile } from 'node:fs/promises'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// Verification tooling is supplied by the environment, never shipped in Core. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-p1'); +await mkdir(output, { recursive: true }); +const fixture = JSON.parse(await readFile(path.join(root, 'examples/org-chart/data-p1.json'), 'utf8')); +const modulePath = process.env.ORGCHART_PLAYWRIGHT_MODULE; +const { chromium } = await import(modulePath ? pathToFileURL(modulePath).href : 'playwright'); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.json': 'application/json', '.css': 'text/css', '.ttf': 'font/ttf', '.woff2': 'font/woff2', '.png': 'image/png', '.svg': 'image/svg+xml' }; +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) { response.writeHead(403).end(); return; } + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + return { server, origin: `http://127.0.0.1:${server.address().port}` }; +} + +const results = [], errors = [], metrics = [], snapshots = []; +const check = (condition, name, detail) => results.push({ name, status: condition ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const same = (left, right) => JSON.stringify(left) === JSON.stringify(right); +const clone = data => structuredClone(data); +const dataWith = (data, version) => { const next = clone(data); next.metadata.dataVersion = version; return next; }; +function captureErrors(page, label) { + page.on('pageerror', error => errors.push({ label, type: 'pageerror', message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ label, type: 'console', message: message.text() }); }); +} + +async function ready(page, transport, version) { + await page.waitForFunction(({ transport, version }) => { + const api = transport === 'vanilla' ? window.OrgChartP1 : window.OrgChartP1React; + const state = transport === 'vanilla' ? api?.chart?.getState() : api?.events?.at(-1); + const shadow = document.querySelector('.hm-orgchart-host')?.shadowRoot; + return state?.status === 'ready' && state.dataVersion === version && shadow?.querySelector('.hm-orgchart-composition .node'); + }, { transport, version }, { timeout: 20000 }); + await page.evaluate(async () => { + await document.fonts.ready; + const shadow = document.querySelector('.hm-orgchart-host')?.shadowRoot; + await Promise.all([...shadow.querySelectorAll('.hm-orgchart-affiliation-mark img')].map(image => image.complete ? Promise.resolve() : new Promise(resolve => { + image.addEventListener('load', resolve, { once: true }); image.addEventListener('error', resolve, { once: true }); + }))); + }); +} +async function setData(page, transport, data) { + await page.evaluate(async ({ transport, data }) => { + const api = transport === 'vanilla' ? window.OrgChartP1 : window.OrgChartP1React; + await api.setData(data); + }, { transport, data }); + await ready(page, transport, data.metadata.dataVersion); +} + +/** Transport-neutral snapshot: no generated IDs, stylesheet hashes or host URLs. */ +async function snapshot(page) { + return page.evaluate(() => { + const host = document.querySelector('.hm-orgchart-host'); + const shadow = host.shadowRoot; + const text = element => element?.textContent?.replace(/\s+/g, ' ').trim() ?? ''; + const employees = scope => [...scope.querySelectorAll('.hm-orgchart-employee')].map(card => ({ + id: card.dataset.employeeId, kind: card.dataset.cardKind, status: card.dataset.workStatus, + name: text(card.querySelector('.hm-orgchart-person-name')), position: text(card.querySelector('.hm-orgchart-person-role')), + jobTitle: text(card.querySelector('.hm-orgchart-job-title')), + affiliation: card.querySelector('.hm-orgchart-affiliation-mark')?.dataset.affiliationId ?? null, + })); + return { + heading: text(shadow.querySelector('.hm-orgchart-heading')), + title: text(shadow.querySelector('.hm-orgchart-title')), + hub: text(shadow.querySelector('.hm-orgchart-hub')), + nodes: [...shadow.querySelectorAll('.node')].map(node => { + const hierarchy = node.closest('.hierarchy'); + const parent = hierarchy?.parentElement?.closest('.hierarchy')?.querySelector(':scope > .node'); + return { id: node.dataset.organizationId, type: node.dataset.organizationType, depth: Number(node.dataset.depth), parentId: parent?.dataset.organizationId ?? null, + name: text(node.querySelector('.hm-orgchart-organization-name')), employees: employees(node) }; + }), + topLeaders: employees(shadow.querySelector('.hm-orgchart-top-leaders') ?? document.createElement('div')), + components: [...shadow.querySelectorAll('[data-component]')].map(element => element.dataset.component), + positions: shadow.querySelector('.hm-orgchart-position-summary') ? { + total: text(shadow.querySelector('.hm-orgchart-position-summary .hm-orgchart-raw-total')), + policy: [...shadow.querySelectorAll('.hm-orgchart-position-summary .hm-orgchart-policy')].map(text), + headers: [...shadow.querySelectorAll('.hm-orgchart-position-table thead th')].map(text), + rows: [...shadow.querySelectorAll('.hm-orgchart-position-table tbody tr')].map(row => ({ id: row.dataset.organizationId, name: text(row.querySelector('th')), cells: [...row.querySelectorAll('td')].map(text) })), + totals: [...shadow.querySelectorAll('.hm-orgchart-position-table tfoot td')].map(text), + statuses: text(shadow.querySelector('.hm-orgchart-status-totals')), + } : null, + affiliations: [...shadow.querySelectorAll('.hm-orgchart-affiliation-item')].map(item => ({ + id: item.dataset.affiliationId, count: text(item.querySelector('dd')), + label: item.querySelector('.hm-orgchart-affiliation-mark')?.getAttribute('aria-label'), + logo: item.querySelector('.hm-orgchart-affiliation-mark img')?.getAttribute('src') ?? null, + })), + affiliationTotal: text(shadow.querySelector('.hm-orgchart-affiliation-summary .hm-orgchart-raw-total')), + statuses: [...shadow.querySelectorAll('.hm-orgchart-status-group')].map(group => ({ status: group.dataset.workStatus, + heading: text(group.querySelector('h3')), employees: employees(group), empty: text(group.querySelector('.hm-orgchart-content-empty')) })), + }; + }); +} + +function expectedCounts(data) { + const employees = [...new Map(data.employees.map(employee => [employee.id, employee])).values()]; + const organizations = new Map(data.organizations.map(org => [org.id, org])); + const positions = new Map(), affiliations = new Map(data.affiliations.map(item => [item.id, 0])); + const direct = new Map(data.organizations.map(org => [org.id, 0])); + const inclusive = new Map(direct), matrix = new Map(data.organizations.map(org => [org.id, new Map()])); + const statuses = { active: 0, dispatched: 0, onLeave: 0 }; + for (const employee of employees) { + positions.set(employee.position, (positions.get(employee.position) ?? 0) + 1); + affiliations.set(employee.affiliationId, (affiliations.get(employee.affiliationId) ?? 0) + 1); + direct.set(employee.organizationId, direct.get(employee.organizationId) + 1); + const row = matrix.get(employee.organizationId); row.set(employee.position, (row.get(employee.position) ?? 0) + 1); + statuses[employee.workStatus]++; + let org = organizations.get(employee.organizationId); + while (org) { inclusive.set(org.id, inclusive.get(org.id) + 1); org = organizations.get(org.parentId); } + } + return { total: employees.length, employees, positions, affiliations, direct, inclusive, matrix, statuses }; +} +function checkCounts(current, data, label) { + const expected = expectedCounts(data); + const positionNames = current.positions.headers.slice(1, -2); + check(current.positions.rows.length === data.organizations.length, `${label}: every organization has a cross-table row`); + check(current.positions.rows.every(row => { + const cells = row.cells.map(Number); + return positionNames.every((position, index) => cells[index] === (expected.matrix.get(row.id)?.get(position) ?? 0)) + && cells.at(-2) === expected.direct.get(row.id) && cells.at(-1) === expected.inclusive.get(row.id); + }), `${label}: direct organization×position cells and inclusive counts match unique primary membership`, current.positions.rows); + check(positionNames.every((position, index) => Number(current.positions.totals[index]) === expected.positions.get(position)) + && Number(current.positions.totals.at(-2)) === expected.total && current.positions.totals.at(-1) === '—', `${label}: direct totals are disjoint; inclusive counts are not added`, current.positions.totals); + check(current.positions.total.includes(`${expected.total}명`) && current.affiliationTotal.includes(`${expected.total}명`), `${label}: Position and Affiliation totals reuse the same Raw Count`); + check(current.affiliations.length === data.affiliations.length && current.affiliations.every(item => parseInt(item.count) === expected.affiliations.get(item.id)), `${label}: every declared affiliation count is correct`, current.affiliations.map(({ id, count }) => ({ id, count }))); + check(current.statuses.every(group => { + const matching = expected.employees.filter(employee => employee.workStatus === group.status); + return parseInt(group.heading.split('·').at(-1)) === matching.length && same(group.employees.map(employee => employee.id).sort(), matching.map(employee => employee.id).sort()); + }), `${label}: status groups use original employee IDs without inflating total`, current.statuses.map(group => ({ status: group.status, ids: group.employees.map(employee => employee.id) }))); + check(current.positions.policy.some(text => text.includes('총원 미확정')) && current.positions.policy.some(text => text.includes('조직장') && text.includes('파견') && text.includes('휴직')), `${label}: Raw inclusion policy is visible; business total remains unapproved`); +} + +async function measure(page) { + return page.evaluate(() => { + const host = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host'); + const shadow = host.shadowRoot; + const viewport = shadow.querySelector('.hm-orgchart-viewport'); + const summary = shadow.querySelector('.hm-orgchart-summary-scroll'); + const dimensions = element => element && ({ clientWidth: element.clientWidth, scrollWidth: element.scrollWidth, clientHeight: element.clientHeight, scrollHeight: element.scrollHeight, overflowX: getComputedStyle(element).overflowX }); + const textElements = [...shadow.querySelectorAll('.hm-orgchart-person-name, .hm-orgchart-person-role, .hm-orgchart-organization-name')].filter(element => element.getBoundingClientRect().height > 0); + const cards = [...shadow.querySelectorAll('.node')].map(element => element.getBoundingClientRect()).filter(rect => rect.height > 0); + const sample = shadow.querySelector('.hm-orgchart-employee, .hm-orgchart-position-summary'); + return { + document: dimensions(document.documentElement), host: dimensions(host), viewport: dimensions(viewport), summary: dimensions(summary), + ids: [...shadow.querySelectorAll('.hm-orgchart-domain-id')].map(element => ({ text: element.textContent, title: element.title, whiteSpace: getComputedStyle(element).whiteSpace, height: element.clientHeight, scrollHeight: element.scrollHeight })), + textFits: textElements.every(element => element.scrollWidth <= element.clientWidth + 1 && element.scrollHeight <= element.clientHeight + 1), + textIssues: textElements.filter(element => element.scrollWidth > element.clientWidth + 1 || element.scrollHeight > element.clientHeight + 1).map(element => ({ className: element.className, text: element.textContent, ...dimensions(element) })), + nodeOverlap: cards.some((a, index) => cards.slice(index + 1).some(b => Math.min(a.right, b.right) - Math.max(a.left, b.left) > 1 && Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top) > 1)), + font: sample ? getComputedStyle(sample).fontFamily : null, foreground: sample ? getComputedStyle(sample).color : null, + background: sample ? getComputedStyle(sample).backgroundColor : null, radius: sample ? getComputedStyle(sample).borderRadius : null, + tokens: [...getComputedStyle(shadow.querySelector('.hm-orgchart-shell'))].filter(key => key.startsWith('--hm-orgchart-')).map(key => ({ key, value: getComputedStyle(shadow.querySelector('.hm-orgchart-shell')).getPropertyValue(key).trim() })), + cssLoaded: [...shadow.querySelectorAll('link[rel=stylesheet]')].every(link => !!link.sheet), + portraitsFallback: [...shadow.querySelectorAll('.hm-orgchart-avatar')].every(avatar => avatar.textContent.trim() && !avatar.querySelector('img')), + logos: [...shadow.querySelectorAll('.hm-orgchart-affiliation-item .hm-orgchart-affiliation-mark')].map(mark => ({ id: mark.dataset.affiliationId, available: mark.dataset.logoAvailable, src: mark.querySelector('img')?.getAttribute('src'), loaded: !!mark.querySelector('img')?.complete && mark.querySelector('img').naturalWidth > 0 })), + navigationCount: shadow.querySelectorAll('nav, .hm-dashboard-header, [data-slot=sidebar], .hm-gnb, .hm-lnb').length, + }; + }); +} + +async function styleIsolation(page, transport) { + const evidence = await page.evaluate(async () => { + const host = document.querySelector('.hm-orgchart-host'); + const shadow = host.shadowRoot; + const sample = shadow.querySelector('.hm-orgchart-employee[data-card-kind=employee]'); + const signature = () => { + const style = getComputedStyle(sample); + return { foreground: style.color, background: style.backgroundColor, font: style.fontFamily, radius: style.borderRadius, border: style.borderTopColor }; + }; + const initial = signature(); + // Document CSS must be optional; private Shadow stylesheet links stay mounted. + const documentLinks = [...document.querySelectorAll('link[rel=stylesheet]')]; + documentLinks.forEach(link => link.remove()); + await new Promise(resolve => requestAnimationFrame(resolve)); + const withoutTheme = signature(); + for (const [property, value] of [['--hm-sem-bg-surface', '#ff0000'], ['--hm-sem-fg-primary', '#ff0000'], ['--hm-radius-container', '99px'], ['--hm-font-family-base', 'monospace']]) host.style.setProperty(property, value); + const alteredHM = signature(); + const sentinel = document.createElement('span'); + sentinel.textContent = 'Host style isolation sentinel'; + sentinel.style.color = 'rgb(55, 66, 77)'; sentinel.style.backgroundColor = 'rgb(88, 99, 110)'; + document.body.append(sentinel); + const sentinelBefore = { color: getComputedStyle(sentinel).color, background: getComputedStyle(sentinel).backgroundColor }; + // Public inputs intentionally remain undeclared; defaults resolve on the + // shadow shell so a host input can inherit without being masked by :host. + const token = '--hm-orgchart-bg-surface'; + host.style.setProperty(token, 'rgb(7, 23, 41)'); + const scopedOverride = signature(); + const sentinelAfter = { color: getComputedStyle(sentinel).color, background: getComputedStyle(sentinel).backgroundColor }; + if (token) host.style.removeProperty(token); + for (const property of ['--hm-sem-bg-surface', '--hm-sem-fg-primary', '--hm-radius-container', '--hm-font-family-base']) host.style.removeProperty(property); + sentinel.remove(); + await Promise.all(documentLinks.map(link => new Promise(resolve => { + link.addEventListener('load', resolve, { once: true }); link.addEventListener('error', resolve, { once: true }); document.head.append(link); + }))); + return { initial, withoutTheme, alteredHM, scopedOverride, token, sentinelBefore, sentinelAfter, restored: signature(), removedDocumentStyles: documentLinks.length }; + }); + metrics.push({ transport, stage: 'private-style-isolation', ...evidence }); + check(same(evidence.initial, evidence.withoutTheme), `${transport}: Core style is unchanged without host HM Theme CSS`, evidence); + check(same(evidence.withoutTheme, evidence.alteredHM), `${transport}: unrelated host HM color/radius/font variables cannot change private OrgChart style`, evidence); + check(evidence.token && evidence.scopedOverride.background === 'rgb(7, 23, 41)' && same(evidence.sentinelBefore, evidence.sentinelAfter), `${transport}: scoped OrgChart surface override affects its instance only`, evidence); + check(same(evidence.initial, evidence.restored), `${transport}: removing the scoped override restores standalone defaults`, evidence); +} + +async function standaloneFactories(page) { + const evidence = await page.evaluate(async data => { + const api = window.OrgChartP1.api; + const stylesheetUrls = window.OrgChartP1.stylesheetUrls; + const existing = document.querySelector('.hm-orgchart-host'); + const originalBackground = getComputedStyle(existing.shadowRoot.querySelector('.hm-orgchart-employee[data-card-kind=employee]')).backgroundColor; + const results = []; + for (const [factory, selector] of [['createPositionSummary', '.hm-orgchart-position-summary'], ['createAffiliationSummary', '.hm-orgchart-affiliation-summary'], ['createStatusSummary', '.hm-orgchart-status-summary']]) { + const container = document.createElement('div'); container.style.maxWidth = '760px'; document.body.append(container); + const events = []; + const handle = api[factory]({ container, dataSource: new api.JsonOrgChartDataSource(data), stylesheetUrl: stylesheetUrls.core, onStateChange: state => events.push(state) }); + await handle.mount(); + const shadow = container.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const mounted = { state: handle.getState().status, total: handle.getState().summary?.raw.total, + modules: shadow.querySelectorAll(selector).length, nodes: shadow.querySelectorAll('.node').length, + foreign: shadow.querySelectorAll('.hm-orgchart-composition, .hm-orgchart-heading, .hm-orgchart-hub, .hm-orgchart-viewport').length, + links: [...shadow.querySelectorAll('link')].map(link => link.getAttribute('href')), + headings: shadow.textContent, + }; + const zero = structuredClone(data); zero.metadata.dataVersion = `${factory}-zero`; + zero.employees = []; for (const org of zero.organizations) org.leaderId = null; + await handle.update(zero); + const currentShadow = container.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + const updated = { state: handle.getState().status, version: handle.getState().dataVersion, total: handle.getState().summary?.raw.total, + employees: currentShadow.querySelectorAll('[data-employee-id]').length, + affiliations: [...currentShadow.querySelectorAll('.hm-orgchart-affiliation-count')].map(element => element.textContent), + emptyGroups: [...currentShadow.querySelectorAll('.hm-orgchart-content-empty')].map(element => element.textContent), + }; + const sibling = document.createElement('p'); sibling.textContent = 'Host-owned sibling'; container.append(sibling); + handle.destroy(); handle.destroy(); + results.push({ factory, mounted, updated, eventStatuses: events.map(state => state.status), + destroyed: handle.getState().status, remaining: container.children.length, siblingPreserved: sibling.isConnected }); + container.remove(); + } + const container = document.createElement('div'); document.body.append(container); + const tree = api.createOrgChartTree({ container, dataSource: new api.JsonOrgChartDataSource(data), stylesheetUrls }); + await tree.mount(); + const treeShadow = container.querySelector('.hm-orgchart-host').shadowRoot; + const onlyTree = { ready: tree.getState().status, nodes: treeShadow.querySelectorAll('.node').length, + employeeIDs: [...new Set([...treeShadow.querySelectorAll('[data-employee-id]')].map(element => element.dataset.employeeId))].sort(), + forbidden: treeShadow.querySelectorAll('.hm-orgchart-heading,.hm-orgchart-hub,.hm-orgchart-composition,.hm-orgchart-position-summary,.hm-orgchart-affiliation-summary,.hm-orgchart-status-summary').length, + viewport: treeShadow.querySelectorAll('.hm-orgchart-viewport').length, + }; + const moved = structuredClone(data); moved.metadata.dataVersion = 'standalone-tree-updated'; + moved.employees.find(employee => employee.id === 'mock-employee-01').organizationId = 'solution-sales-1'; + await tree.update(moved); + const nextShadow = container.querySelector('.hm-orgchart-host').shadowRoot; + onlyTree.updatedVersion = tree.getState().dataVersion; + onlyTree.employeeMoved = !![...nextShadow.querySelectorAll('.node')].find(node => node.dataset.organizationId === 'solution-sales-1')?.querySelector('[data-employee-id="mock-employee-01"]'); + tree.destroy(); onlyTree.destroyed = container.children.length === 0; container.remove(); + const existingBackground = getComputedStyle(existing.shadowRoot.querySelector('.hm-orgchart-employee[data-card-kind=employee]')).backgroundColor; + return { summaries: results, tree: onlyTree, originalBackground, existingBackground }; + }, fixture); + metrics.push({ stage: 'standalone-public-factories', ...evidence }); + for (const item of evidence.summaries) { + check(item.mounted.state === 'ready' && item.mounted.total === 41 && item.mounted.modules === 1 && item.mounted.nodes === 0 && item.mounted.foreign === 0 && item.mounted.links.length === 1, `${item.factory}: public factory mounts only its own summary without engine, heading or composition`, item.mounted); + check(item.updated.state === 'ready' && item.updated.version === `${item.factory}-zero` && item.updated.total === 0 && item.updated.employees === 0 + && (item.factory !== 'createAffiliationSummary' || item.updated.affiliations.length === 7 && item.updated.affiliations.every(text => text === '0명')) + && (item.factory !== 'createStatusSummary' || item.updated.emptyGroups.length === 2), `${item.factory}: update refreshes shared Raw Count and removes stale cards`, item.updated); + check(item.destroyed === 'destroyed' && item.remaining === 1 && item.siblingPreserved, `${item.factory}: destroy releases only owned auxiliary DOM and preserves host siblings`, item); + } + check(evidence.tree.ready === 'ready' && evidence.tree.nodes === 18 && evidence.tree.viewport === 1 && evidence.tree.forbidden === 0 + && same(evidence.tree.employeeIDs, fixture.employees.map(employee => employee.id).sort()), 'createOrgChartTree: public standalone tree preserves all source employees with no heading/hub/summary composition', evidence.tree); + check(evidence.tree.updatedVersion === 'standalone-tree-updated' && evidence.tree.employeeMoved && evidence.tree.destroyed, 'createOrgChartTree: standalone update and destroy retain engine lifecycle', evidence.tree); + check(evidence.originalBackground === evidence.existingBackground, 'standalone factories do not alter the existing full-composition instance'); +} + +const expectedOldIds = ['basic-organization', 'organization-hierarchy', 'employee-cards', 'organization-summary', 'json-data-update', 'loading-empty-error', 'responsive-container', 'multiple-instances'].map(id => `orgchart-content--${id}`); +const canonicalStoryIds = ['logo', 'department-colors', 'position-summary', 'affiliation-summary', 'full-composition'].map(id => `orgchart--${id}`); +const internalStoryIds = [ + ...['business-management', 'business-planning', 'talent-growth', 'integrated-system', 'design-planning', 'solution-sales', 'top-leader', 'organization-leader', 'employee'].map(id => `orgchart-components-cards--${id}`), + ...['position-summary', 'affiliation-summary', 'status-summary'].map(id => `orgchart-components-summaries--${id}`), +]; +// Canonical entries cover every component once; only the three distinct employee +// kinds additionally need their internal preview. Registry preservation is static. +const renderedStoryIds = [...canonicalStoryIds, ...internalStoryIds.slice(6, 9)]; +const measuredGradients = [ + ['#194d82', '#1d395c', 'rgb(25, 77, 130)', 'rgb(29, 57, 92)'], + ['#2164a8', '#254975', 'rgb(33, 100, 168)', 'rgb(37, 73, 117)'], + ['#0f6ace', '#044a94', 'rgb(15, 106, 206)', 'rgb(4, 74, 148)'], + ['#8c67b6', '#5d3494', 'rgb(140, 103, 182)', 'rgb(93, 52, 148)'], + ['#09a7a2', '#00847f', 'rgb(9, 167, 162)', 'rgb(0, 132, 127)'], + ['#5a963c', '#3f7629', 'rgb(90, 150, 60)', 'rgb(63, 118, 41)'], +]; + +/** A Story metadata fix only invalidates its console checks. Preserve the full + * browser.json run and recheck those five iframes plus the newly requested + * actual manager sidebar, without repeating Core/React/summary/width checks. */ +async function recheckStorybookConsole() { + const retryResults = [], retryErrors = [], rendered = []; + const checkRetry = (condition, name, detail) => retryResults.push({ name, status: condition ? 'PASS' : 'FAIL', detail }); + const server = await serve(path.join(root, 'storybook-static')); + let retryBrowser; + let sidebar; + try { + retryBrowser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME || 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await retryBrowser.newContext({ viewport: { width: 1440, height: 1080 } }); + const iframe = await context.newPage(); + iframe.on('pageerror', error => retryErrors.push({ surface: 'iframe', type: 'pageerror', message: error.message })); + iframe.on('console', message => { if (message.type() === 'error') retryErrors.push({ surface: 'iframe', type: 'console', message: message.text() }); }); + for (const id of canonicalStoryIds) { + await iframe.goto(`${server.origin}/iframe.html?id=${id}&viewMode=story`); + await iframe.waitForFunction(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host')?.shadowRoot; + return shadow?.querySelector('[data-component]') && [...shadow.querySelectorAll('link')].every(link => link.sheet); + }, undefined, { timeout: 20000 }); + rendered.push(id); + } + checkRetry(retryErrors.filter(error => error.surface === 'iframe').length === 0 && rendered.length === 5, 'five corrected canonical Story iframes emit no console/runtime errors', { rendered, errors: retryErrors.filter(error => error.surface === 'iframe') }); + const manager = await context.newPage(); + manager.on('pageerror', error => retryErrors.push({ surface: 'manager', type: 'pageerror', message: error.message })); + manager.on('console', message => { if (message.type() === 'error') retryErrors.push({ surface: 'manager', type: 'console', message: message.text() }); }); + await manager.goto(`${server.origin}/?path=/story/orgchart--full-composition`); + await manager.waitForSelector('#storybook-explorer-tree [data-item-id="orgchart--full-composition"]', { timeout: 20000 }); + sidebar = await manager.evaluate(() => [...document.querySelectorAll('#storybook-explorer-tree [data-item-id]')].filter(row => row.dataset.itemId.startsWith('orgchart') && row.getBoundingClientRect().height > 0).map(row => ({ id: row.dataset.itemId, label: row.textContent.trim() }))); + const visibleStories = sidebar.filter(row => row.id.startsWith('orgchart--')).map(row => row.id).sort(); + checkRetry(same(visibleStories, [...canonicalStoryIds].sort()), 'actual Storybook sidebar exposes exactly the approved five OrgChart Story entries', sidebar); + checkRetry(sidebar.every(row => !row.id.startsWith('orgchart-content') && !row.id.startsWith('orgchart-components')), + 'actual default sidebar hides the original/internal reference groups while preserving their direct routes', sidebar); + await manager.screenshot({ path: path.join(output, 'storybook-sidebar.png'), fullPage: true }); + checkRetry(retryErrors.filter(error => error.surface === 'manager').length === 0, 'actual Storybook manager and its preview emit no console/runtime errors', retryErrors.filter(error => error.surface === 'manager')); + } catch (error) { + retryResults.push({ name: 'selected Storybook console/sidebar recheck completion', status: 'FAIL', detail: error.stack }); + } finally { + const report = { browser: retryBrowser?.version() ?? null, mode: 'storybook-console-only', preservedInitialReport: path.join(output, 'browser.json'), results: retryResults, errors: retryErrors, rendered, sidebar, + limits: ['196 previously successful Core/React/component checks were not repeated', 'This run only rechecks corrected Story metadata and newly verifies the default manager sidebar'] }; + const reportPath = path.join(output, 'storybook-console-recheck.json'); + await writeFile(reportPath, JSON.stringify(report, null, 2)); + if (retryBrowser) await retryBrowser.close(); + await new Promise(resolve => server.server.close(resolve)); + const failed = retryResults.filter(result => result.status === 'FAIL'); + if (failed.length) process.exitCode = 1; + console.log(JSON.stringify({ passed: retryResults.filter(result => result.status === 'PASS').length, failed, report: reportPath, sidebarScreenshot: path.join(output, 'storybook-sidebar.png') }, null, 2)); + } +} + +if (process.argv.includes('--storybook-console-only')) { + await recheckStorybookConsole(); + process.exit(process.exitCode ?? 0); +} + +let browser; +const servers = []; +try { + const productionStyles = await readFile(path.join(root, 'packages/org-chart/dist/style.css'), 'utf8'); + const foreignHMVariables = [...productionStyles.matchAll(/var\(\s*(--hm-(?!orgchart-)[a-z0-9-]+)/g)].map(match => match[1]); + check(foreignHMVariables.length === 0, 'shipped Core stylesheet references only the private OrgChart namespace rather than host HM Theme variables', [...new Set(foreignHMVariables)]); + const vanilla = await serve(path.join(root, 'examples/org-chart/dist')); servers.push(vanilla); + const react = await serve(path.join(root, 'examples/org-chart-react/dist')); servers.push(react); + const storybook = await serve(path.join(root, 'storybook-static')); servers.push(storybook); + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME || 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await browser.newContext({ viewport: { width: 1440, height: 1080 } }); + const pages = new Map(); + for (const [transport, origin] of [['vanilla', vanilla.origin], ['react', react.origin]]) { + const page = await context.newPage(); pages.set(transport, page); captureErrors(page, transport); + await page.goto(`${origin}/p1.html`); + await ready(page, transport, fixture.metadata.dataVersion); + const initial = await snapshot(page); snapshots.push({ transport, stage: 'initial', value: initial }); + check(initial.nodes.length === 18 && expectedCounts(fixture).total === 41, `${transport}: P1 fixture contains 18 real-name organizations and 41 virtual employee IDs`); + check(initial.title === fixture.presentation.title && initial.hub === fixture.presentation.hubText, `${transport}: heading and independent hub come from JSON`); + check(initial.nodes.every(node => fixture.organizations.find(org => org.id === node.id)?.parentId === node.parentId), `${transport}: rendered hierarchy retains every original parentId`, initial.nodes.map(({ id, parentId }) => ({ id, parentId }))); + const topEmployee = fixture.organizations.find(org => org.parentId === null)?.leaderId; + check(initial.topLeaders.length === 1 && initial.topLeaders[0].id === topEmployee && initial.topLeaders[0].kind === 'topLeader' + && initial.nodes.every(node => node.employees.every(employee => employee.id !== topEmployee)), `${transport}: top leader is independent and is not duplicated in the tree`); + check(initial.nodes.filter(node => node.depth === 1).length === 6 && initial.components.includes('OrgChartTree'), `${transport}: six primary organization groups preserve the engine tree boundary`); + check(['PositionSummary', 'AffiliationSummary', 'StatusSummary'].every(name => initial.components.filter(value => value === name).length === 1), `${transport}: three independent summary modules are composed once`); + checkCounts(initial, fixture, `${transport}: initial`); + for (const width of [390, 768, 1280, 1440]) { + await page.setViewportSize({ width, height: 1080 }); + const measurement = await measure(page); metrics.push({ transport, stage: 'initial', width, ...measurement }); + check(measurement.document.scrollWidth <= measurement.document.clientWidth + 1, `${transport}: ${width}px document has no horizontal overflow`, measurement.document); + check(measurement.viewport.scrollWidth > measurement.viewport.clientWidth && measurement.viewport.overflowX === 'auto', `${transport}: ${width}px wide tree uses internal scrolling`, measurement.viewport); + check(measurement.textFits && !measurement.nodeOverlap && measurement.ids.every(item => item.whiteSpace === 'nowrap' && item.title === item.text && item.scrollHeight <= item.height + 1), `${transport}: ${width}px text bounds, node separation and one-line IDs`, { textIssues: measurement.textIssues, overlap: measurement.nodeOverlap, ids: measurement.ids }); + check(measurement.cssLoaded && measurement.tokens.length >= 10 && measurement.tokens.every(item => item.value) && measurement.font && measurement.background !== 'rgba(0, 0, 0, 0)' && measurement.radius !== '0px', `${transport}: ${width}px independent OrgChart defaults and loaded Shadow styles`, { tokens: measurement.tokens, font: measurement.font, background: measurement.background, radius: measurement.radius }); + check(measurement.logos.length === 7 && measurement.logos.every(item => item.available === 'true' && item.loaded && item.src.startsWith('data:image/')), `${transport}: ${width}px all seven acquired affiliation logos load`, measurement.logos.map(({ id, available, loaded }) => ({ id, available, loaded }))); + check(measurement.portraitsFallback && measurement.navigationCount === 0, `${transport}: ${width}px virtual portrait fallback and content-only UI`); + await page.screenshot({ path: path.join(output, `${transport}-${width}.png`), fullPage: true }); + } + await page.setViewportSize({ width: 1440, height: 1080 }); + await styleIsolation(page, transport); + const toggle = page.locator('.hm-orgchart-toggle').first(); + await toggle.focus(); await toggle.press('Enter'); + await page.waitForFunction(() => !document.querySelector('.hm-orgchart-host').shadowRoot.querySelector('.sliding')); + check(await toggle.getAttribute('aria-expanded') === 'false' && await toggle.evaluate(element => element.getRootNode().activeElement === element), `${transport}: keyboard Enter collapses hierarchy and keeps focus`); + await toggle.press('Space'); + await page.waitForFunction(() => !document.querySelector('.hm-orgchart-host').shadowRoot.querySelector('.sliding')); + check(await toggle.getAttribute('aria-expanded') === 'true', `${transport}: keyboard Space expands hierarchy`); + } + check(same(snapshots.find(item => item.transport === 'vanilla').value, snapshots.find(item => item.transport === 'react').value), 'HTML and React initial Core DOM and automatic summary snapshots are identical'); + + const changed = dataWith(fixture, 'p1-browser-json-v2'); + const moved = changed.employees.find(employee => employee.id === 'mock-employee-01'); + moved.organizationId = 'solution-sales-1'; moved.affiliationId = 'halla'; moved.workStatus = 'onLeave'; + moved.name = '가상직원 긴 이름과 콘텐츠 줄바꿈 검증 01'; moved.position = '가상 장기 프로젝트 연구 및 운영 담당 수석'; + moved.jobTitle = '가상 프로젝트 담당'; + changed.presentation.title = 'JSON 갱신 · 가상 직원 이동 및 상태 변경'; + for (const [transport, page] of pages) { + await page.locator('.hm-orgchart-summary-scroll').focus(); + await setData(page, transport, changed); + check(await page.evaluate(() => document.querySelector('.hm-orgchart-host').shadowRoot.activeElement?.classList.contains('hm-orgchart-viewport')), `${transport}: summary keyboard focus returns to stable tree after composition regeneration`); + const current = await snapshot(page); snapshots.push({ transport, stage: 'changed', value: current }); + check(current.title === changed.presentation.title && current.nodes.find(node => node.id === moved.organizationId)?.employees.some(employee => employee.id === moved.id && employee.name === moved.name && employee.position === moved.position), `${transport}: changed JSON moves and updates the same employee card`); + checkCounts(current, changed, `${transport}: changed JSON`); + for (const width of [390, 768, 1280, 1440]) { + await page.setViewportSize({ width, height: 1080 }); + const measurement = await measure(page); metrics.push({ transport, stage: 'long-text', width, ...measurement }); + check(measurement.textFits && measurement.document.scrollWidth <= width + 1, `${transport}: ${width}px long employee name, position and job title fit with contained table scrolling`, { textIssues: measurement.textIssues, document: measurement.document, summary: measurement.summary }); + } + check(current.statuses.find(group => group.status === 'onLeave').employees.some(employee => employee.id === moved.id) && !current.statuses.find(group => group.status === 'dispatched').employees.some(employee => employee.id === moved.id), `${transport}: state groups update without stale employee cards`); + // Flags select independent components rather than alter the employee source or counts. + const cases = [ + ['hide-position', { showSummary: false }, { position: false, affiliations: true, dispatched: true, onLeave: true }], + ['hide-affiliation', { showAffiliations: false }, { position: true, affiliations: false, dispatched: true, onLeave: true }], + ['hide-dispatched', { showDispatched: false }, { position: true, affiliations: true, dispatched: false, onLeave: true }], + ['hide-onleave', { showOnLeave: false }, { position: true, affiliations: true, dispatched: true, onLeave: false }], + ['hide-both-status', { showDispatched: false, showOnLeave: false }, { position: true, affiliations: true, dispatched: false, onLeave: false }], + ]; + for (const [name, flags, expected] of cases) { + const data = dataWith(changed, `${transport}-${name}`); Object.assign(data.presentation.groups, flags); + await setData(page, transport, data); + const current = await snapshot(page); + check(!!current.positions === expected.position && !!current.affiliations.length === expected.affiliations + && current.statuses.some(group => group.status === 'dispatched') === expected.dispatched + && current.statuses.some(group => group.status === 'onLeave') === expected.onLeave + && current.components.includes('StatusSummary') === (expected.dispatched || expected.onLeave), `${transport}: ${name} changes only its independent component`, current.components); + check(!current.positions || Number(current.positions.totals.at(-2)) === 41, `${transport}: ${name} cannot alter Raw Count`); + } + const zeroAffiliation = dataWith(changed, `${transport}-zero-affiliation`); + for (const employee of zeroAffiliation.employees) if (employee.affiliationId === 'baron') employee.affiliationId = 'hanmac'; + await setData(page, transport, zeroAffiliation); + check((await snapshot(page)).affiliations.find(item => item.id === 'baron')?.count === '0명', `${transport}: zero-count declared affiliations stay visible`); + const zeroStatus = dataWith(changed, `${transport}-zero-status`); + for (const employee of zeroStatus.employees) employee.workStatus = 'active'; + await setData(page, transport, zeroStatus); + check((await snapshot(page)).statuses.every(group => group.employees.length === 0 && group.empty && group.heading.includes('0명')), `${transport}: enabled empty status groups have explicit empty content`); + // A successful HTTP response containing non-image bytes triggers img.error, + // avoiding expected network-console failures while testing the actual fallback. + await page.route('**/p1-invalid-portrait.png', route => route.fulfill({ status: 200, contentType: 'image/png', body: 'not a png' })); + const brokenImage = dataWith(changed, `${transport}-image-fallback`); + brokenImage.employees.find(employee => employee.id === moved.id).profileImage = './p1-invalid-portrait.png'; + await setData(page, transport, brokenImage); + const brokenCards = page.locator(`.hm-orgchart-employee[data-employee-id="${moved.id}"]`); + for (let index = 0; index < await brokenCards.count(); index++) await brokenCards.nth(index).scrollIntoViewIfNeeded(); + await page.waitForFunction(id => [...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('.hm-orgchart-employee')].filter(card => card.dataset.employeeId === id).every(card => !card.querySelector('.hm-orgchart-avatar img')), moved.id); + check(await page.evaluate(id => [...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('.hm-orgchart-employee')].filter(card => card.dataset.employeeId === id).every(card => card.querySelector('.hm-orgchart-avatar').textContent.trim()), moved.id), `${transport}: invalid profile images safely return to initials`); + await page.unroute('**/p1-invalid-portrait.png'); + await setData(page, transport, dataWith(changed, 'p1-browser-final-changed')); + snapshots.push({ transport, stage: 'restored-changed', value: await snapshot(page) }); + check(transport !== 'react' || await page.evaluate(() => window.OrgChartP1React.errors.length === 0), `${transport}: auxiliary regeneration has no lifecycle error`); + } + check(same(...snapshots.filter(item => item.stage === 'restored-changed').map(item => item.value)), 'HTML and React Core snapshots remain identical after JSON and independent visibility updates'); + + const index = JSON.parse(await readFile(path.join(root, 'storybook-static/index.json'), 'utf8')); + const old = Object.values(index.entries).filter(entry => entry.title === 'OrgChart/Content' && entry.type === 'story'); + check(old.length === 8 && same(old.map(entry => entry.id).sort(), [...expectedOldIds].sort()) && old.every(entry => entry.tags.includes('internal')), 'all original eight Storybook entries remain registered as internal without re-running their baseline suite', old.map(entry => entry.id)); + check(internalStoryIds.every(id => index.entries[id]?.type === 'story' && index.entries[id].tags.includes('internal')), 'twelve isolated card/summary Stories are preserved as internal references', internalStoryIds); + const visible = Object.values(index.entries).filter(entry => entry.title === 'OrgChart' && entry.type === 'story' && !entry.tags.includes('internal')).map(entry => entry.id).sort(); + check(same(visible, [...canonicalStoryIds].sort()), 'canonical OrgChart offers exactly the five approved user-visible entries', visible); + const sb = await context.newPage(); captureErrors(sb, 'storybook'); + for (const id of renderedStoryIds) { + if (!index.entries[id]) continue; + await sb.goto(`${storybook.origin}/iframe.html?id=${id}&viewMode=story`); + await sb.waitForFunction(() => { + const host = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host'); + const shadow = host?.shadowRoot; + return shadow?.querySelector('[data-component]') && [...shadow.querySelectorAll('link')].every(link => link.sheet); + }, undefined, { timeout: 20000 }); + await sb.waitForFunction(() => [...document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot.querySelectorAll('.hm-orgchart-affiliation-mark img')].every(image => image.complete)); + const component = await sb.evaluate(() => { + const host = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host'), shadow = host.shadowRoot; + const organizationName = shadow.querySelector('.hm-orgchart-organization-name'); + const node = shadow.querySelector('.node'); + return { components: [...shadow.querySelectorAll('[data-component]')].map(element => element.dataset.component), nodeCount: shadow.querySelectorAll('.node').length, + employees: [...shadow.querySelectorAll('.hm-orgchart-employee')].map(card => ({ id: card.dataset.employeeId, kind: card.dataset.cardKind })), + gradients: organizationName ? { background: getComputedStyle(organizationName).backgroundImage, variable: getComputedStyle(node).getPropertyValue('--hm-orgchart-group-background').trim() } : null, + body: document.body.textContent, title: organizationName?.textContent, + hasPosition: !!shadow.querySelector('.hm-orgchart-position-summary'), hasAffiliation: !!shadow.querySelector('.hm-orgchart-affiliation-summary'), hasStatus: !!shadow.querySelector('.hm-orgchart-status-summary'), + linksLoaded: [...shadow.querySelectorAll('link')].every(link => link.sheet), + }; + }); + snapshots.push({ transport: 'storybook', stage: id, value: component }); + check(component.linksLoaded, `${id}: real Core preview and Shadow CSS load`); + if (id === 'orgchart--position-summary' || id === 'orgchart--affiliation-summary') { + const kind = id.endsWith('position-summary') ? 'PositionSummary' : id.endsWith('affiliation-summary') ? 'AffiliationSummary' : 'StatusSummary'; + check(component.nodeCount === 0 && same(component.components, [kind]) + && component.hasPosition === (kind === 'PositionSummary') && component.hasAffiliation === (kind === 'AffiliationSummary') && component.hasStatus === (kind === 'StatusSummary'), `${id}: standalone summary has exactly its Core module and no engine tree`, component.components); + } else if (id.endsWith('full-composition')) { + check(component.nodeCount === 18 && ['OrgChartTree', 'PositionSummary', 'AffiliationSummary', 'StatusSummary'].every(name => component.components.includes(name)), `${id}: composition contains shared tree plus all independent summaries`); + for (const width of [390, 768, 1280, 1440]) { + await sb.setViewportSize({ width, height: 1080 }); + const measurement = await measure(sb); metrics.push({ transport: 'storybook', stage: id, width, ...measurement }); + check(measurement.document.scrollWidth <= width + 1 && measurement.textFits && measurement.navigationCount === 0, `${id}: ${width}px content composition has no document overflow or clipped text`, { document: measurement.document, textIssues: measurement.textIssues }); + await sb.screenshot({ path: path.join(output, `${id}-${width}.png`), fullPage: true }); + } + await sb.setViewportSize({ width: 1440, height: 1080 }); + await sb.getByRole('button', { name: 'PositionSummary 숨기기', exact: true }).click(); + await sb.waitForFunction(() => !document.querySelector('.hm-orgchart-host').shadowRoot.querySelector('.hm-orgchart-position-summary')); + check(await sb.locator('.hm-orgchart-affiliation-summary').count() === 1 && await sb.locator('.hm-orgchart-status-summary').count() === 1, `${id}: Story button independently hides PositionSummary`); + await sb.getByRole('button', { name: '가상 JSON v2 반영', exact: true }).click(); + await sb.waitForFunction(() => [...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('[data-work-status=onLeave] [data-employee-id]')].some(element => element.dataset.employeeId === 'mock-employee-01')); + check(await sb.locator('.hm-orgchart-affiliation-summary .hm-orgchart-raw-total').textContent() === 'Raw Count · 전체 41명', `${id}: Story JSON update reuses 41 unique virtual employees`); + } else if (id.endsWith('top-leader') || id.endsWith('organization-leader') || id.endsWith('--employee')) { + const kind = id.endsWith('top-leader') ? 'topLeader' : id.endsWith('organization-leader') ? 'leader' : 'employee'; + check(component.nodeCount === 0 && component.employees.length === 1 && component.employees[0].kind === kind && same(component.components, ['EmployeeCard']), `${id}: standalone ${kind} uses one actual Core employee card`, component.employees); + } else if (id === 'orgchart--department-colors') { + await sb.waitForFunction(() => { + const values = [...document.querySelector('.hm-orgchart-component-host').shadowRoot.querySelectorAll('.hm-orgchart-color-value')]; + return values.length === 30 && values.every(element => element.textContent.trim()); + }); + const colors = await sb.evaluate(() => [...document.querySelector('.hm-orgchart-component-host').shadowRoot.querySelectorAll('.hm-orgchart-color-preview[data-group-variant]')].map(row => ({ + variant: Number(row.dataset.groupVariant), + text: row.textContent, + background: getComputedStyle(row.querySelector('[data-color-variable$="-gradient"]')).backgroundImage, + variable: getComputedStyle(row).getPropertyValue('--hm-orgchart-group-background').trim(), + declarations: [...row.querySelectorAll('[data-color-variable]')].map(element => ({ variable: element.dataset.colorVariable, property: element.dataset.cssProperty, applied: getComputedStyle(element).getPropertyValue(element.dataset.cssProperty), valueText: element.parentElement.querySelector('.hm-orgchart-color-value')?.textContent })), + card: (() => { const card = row.querySelector('.hm-orgchart-employee'); const style = getComputedStyle(card); return { background: style.backgroundColor, color: style.color, border: style.borderTopColor }; })(), + }))); + check(colors.length === 6, `${id}: all six department color components are rendered`, colors); + for (const color of colors) { + const [start, end, rgbStart, rgbEnd] = measuredGradients[color.variant]; + check(color.background.includes('linear-gradient') && color.background.includes(rgbStart) && color.background.includes(rgbEnd) + && color.variable === `linear-gradient(180deg, ${start} 0%, ${end} 100%)` + && color.text.includes(start) && color.text.includes(end) && color.declarations.length === 5 + && color.declarations.every(item => item.variable.startsWith('--hm-orgchart-') && item.valueText?.includes('#')), `${id}: variant ${color.variant} applies exact measured gradient and documents HEX/CSS variables`, color); + check(color.declarations.find(item => item.variable.endsWith('-card-background')).applied === color.card.background + && color.declarations.find(item => item.variable.endsWith('-card-color')).applied === color.card.color + && color.declarations.find(item => item.variable.endsWith('-border')).applied === color.card.border, `${id}: variant ${color.variant} legend values match the actual card styles`, color.card); + } + } else if (id === 'orgchart--logo') { + const logos = await sb.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-component-host').shadowRoot; + return { marks: [...shadow.querySelectorAll('.hm-orgchart-affiliation-mark')].map(mark => ({ id: mark.dataset.affiliationId, label: mark.getAttribute('aria-label'), src: mark.querySelector('img')?.getAttribute('src'), loaded: !!mark.querySelector('img')?.complete && mark.querySelector('img').naturalWidth > 0 })), text: shadow.textContent, + counts: shadow.querySelectorAll('.hm-orgchart-affiliation-count, .hm-orgchart-raw-total, .hm-orgchart-position-table').length }; + }); + check(component.nodeCount === 0 && component.components.includes('Logo') && logos.marks.length === 7 && logos.marks.every(mark => mark.loaded && mark.src.startsWith('data:image/') && mark.label) + && fixture.affiliations.every(affiliation => logos.text.includes(affiliation.name)) && logos.counts === 0, `${id}: standalone Logo uses all seven named assets without statistics`, logos.marks.map(({ id, label, loaded }) => ({ id, label, loaded }))); + } + } + await standaloneFactories(pages.get('vanilla')); + await pages.get('vanilla').evaluate(() => window.OrgChartP1.chart.destroy()); + check(await pages.get('vanilla').locator('.hm-orgchart-host').count() === 0, 'destroy releases composed tree and all auxiliary summary DOM'); + check(await pages.get('react').evaluate(() => window.OrgChartP1React.errors.length === 0), 'React wrapper lifecycle error boundary remains clear'); + check(errors.length === 0, 'targeted P1 Vanilla, React and canonical/employee Stories have no console/runtime errors', errors); +} catch (error) { + results.push({ name: 'P1 browser harness completion', status: 'FAIL', detail: error.stack }); +} finally { + const report = { browser: browser?.version() ?? null, results, errors, metrics, snapshots, + limits: ['Figma Dev Mode detailed properties NOT VERIFIED', 'Workdesk pixel parity NOT VERIFIED; gradient checks verify the recorded measured header sources only', 'Screen-reader announcements and heap/GC behavior NOT VERIFIED', 'Original 69/79 browser suites deliberately not repeated'] }; + await writeFile(path.join(output, 'browser.json'), JSON.stringify(report, null, 2)); + if (browser) await browser.close(); + for (const { server } of servers) await new Promise(resolve => server.close(resolve)); + const failed = results.filter(result => result.status === 'FAIL'); + if (failed.length) process.exitCode = 1; + console.log(JSON.stringify({ passed: results.filter(result => result.status === 'PASS').length, failed, report: path.join(output, 'browser.json') }, null, 2)); +} diff --git a/examples/org-chart/verify-p2.mjs b/examples/org-chart/verify-p2.mjs new file mode 100644 index 0000000..8710613 --- /dev/null +++ b/examples/org-chart/verify-p2.mjs @@ -0,0 +1,338 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, mkdir, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// P2-only browser evidence. Existing v0/P1 expectations and reports are retained. +// ESM HTML and React use HTTP; the classic HTML is opened directly with file://. +// No Chrome file-access flag is used, so classic portability is tested honestly. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-p2'); +await mkdir(output, { recursive: true }); +const fixturePath = path.join(root, 'examples/org-chart/data-p1.json'); +const fixtureBytes = await readFile(fixturePath); +const fixtureHash = createHash('sha256').update(fixtureBytes).digest('hex'); +const fixture = JSON.parse(fixtureBytes.toString('utf8')); +const bundledPlaywright = 'C:\\Users\\user\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\node_modules\\playwright\\index.mjs'; +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE ?? bundledPlaywright).href); +const viewports = [{ width: 1920, height: 1080 }, { width: 1440, height: 900 }, { width: 1280, height: 800 }, { width: 768, height: 1024 }, { width: 390, height: 844 }]; +const expectedArrows = [[194.15, 311.75, 66.25, 19.8], [430.4, 311.75, 66.25, 19.8], [666.65, 302, 183.75, 42], [1044, 302, 258.92, 42], [1520.55, 305, 135.35, 36]]; +const results = [], measurements = [], errors = [], screenshots = [], servers = []; +const check = (condition, name, detail) => results.push({ name, status: condition ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const near = (actual, expected, tolerance = 0.2) => Number.isFinite(actual) && Math.abs(actual - expected) <= tolerance; +const spacedKorean = text => text.replace(/([가-힣])(?=[가-힣])/g, '$1 '); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.json': 'application/json', '.css': 'text/css', '.svg': 'image/svg+xml', '.png': 'image/png', '.ttf': 'font/ttf', '.woff2': 'font/woff2' }; +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + servers.push(server); + return `http://127.0.0.1:${server.address().port}`; +} +function captureErrors(page, route) { + page.on('pageerror', error => errors.push({ route, type: 'pageerror', message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ route, type: 'console', message: message.text() }); }); +} +async function ready(page, mode = 'readOnly') { + await page.waitForFunction(expectedMode => { + const shadow = document.querySelector('.hm-orgchart-host')?.shadowRoot; + return shadow?.querySelector(`.hm-orgchart-composition[data-display-mode="${expectedMode}"] [data-card-asset]`) + && !shadow.querySelector('.hm-orgchart-state')?.textContent + && [...shadow.querySelectorAll('link[rel=stylesheet]')].every(link => !!link.sheet); + }, mode, { timeout: 20000 }); + await page.evaluate(async () => { + await document.fonts.ready; + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + await Promise.all([...shadow.querySelectorAll('img')].map(image => image.decode().catch(() => {}))); + await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); + }); +} +async function measure(page) { + return page.evaluate(async () => { + const host = document.querySelector('.hm-orgchart-host'); + const shadow = host.shadowRoot; + const composition = shadow.querySelector('.hm-orgchart-composition'); + const stage = shadow.querySelector('.hm-orgchart-stage'); + const origin = stage.getBoundingClientRect(); + // dataset.scale is rounded to four digits; measured transform is required + // to recover the small cards accurately at the 390px viewport. + const scale = origin.width / stage.offsetWidth; + const rect = element => { + const box = element.getBoundingClientRect(); + return { x: (box.left - origin.left) / scale, y: (box.top - origin.top) / scale, width: box.width / scale, height: box.height / scale }; + }; + const dimensions = element => element ? { clientWidth: element.clientWidth, scrollWidth: element.scrollWidth, clientHeight: element.clientHeight, scrollHeight: element.scrollHeight, overflowX: getComputedStyle(element).overflowX, overflowY: getComputedStyle(element).overflowY } : null; + const text = element => element?.textContent?.replace(/\s+/g, ' ').trim() ?? ''; + const overlaps = (a, b) => Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x) > 0.75 && Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y) > 0.75; + const fingerprint = source => { + let hash = 2166136261; + for (let index = 0; index < source.length; index++) hash = Math.imul(hash ^ source.charCodeAt(index), 16777619); + return (hash >>> 0).toString(16); + }; + const cards = [...shadow.querySelectorAll('.hm-orgchart-employee[data-card-asset]')].map(card => { + const node = card.closest('.node[data-organization-id]'); + const background = card.querySelector('.hm-orgchart-card-background'); + const css = getComputedStyle(card); + const personName = card.querySelector('.hm-orgchart-person-name'); + const cardBox = rect(card), avatarBox = rect(card.querySelector('.hm-orgchart-avatar')); + const logoBox = card.querySelector('.hm-orgchart-affiliation-mark') ? rect(card.querySelector('.hm-orgchart-affiliation-mark')) : null; + const contentIssues = [], textBoxes = [], fontRangeOverlaps = []; + const personText = card.querySelector('.hm-orgchart-person-text'); + const positionLine = personText?.firstElementChild; + const lineBoxes = { position: positionLine ? rect(positionLine) : null, name: rect(personName) }; + const role = card.querySelector('.hm-orgchart-person-role'); + const badge = card.querySelector('.hm-orgchart-position-row .hm-orgchart-job-title'); + const horizontalRoleBadgeGap = badge ? rect(badge).x - rect(role).x - rect(role).width : null; + if (lineBoxes.position && lineBoxes.position.y + lineBoxes.position.height > lineBoxes.name.y + 0.3) contentIssues.push('position/name: actual line-box overlap'); + if (horizontalRoleBadgeGap !== null && horizontalRoleBadgeGap < -0.3) contentIssues.push('role/badge: horizontal element-box overlap'); + const contained = box => box.x >= cardBox.x - 0.5 && box.y >= cardBox.y - 0.5 && box.x + box.width <= cardBox.x + cardBox.width + 0.5 && box.y + box.height <= cardBox.y + cardBox.height + 0.5; + for (const element of card.querySelectorAll('.hm-orgchart-person-name, .hm-orgchart-person-role, .hm-orgchart-job-title')) { + if (element.clientWidth > 0 && element.scrollWidth > element.clientWidth + 1) contentIssues.push(`${element.className}: horizontal text overflow`); + const range = document.createRange(); range.selectNodeContents(element); + for (const box of range.getClientRects()) { + const textBox = { x: (box.left - origin.left) / scale, y: (box.top - origin.top) / scale, width: box.width / scale, height: box.height / scale }; + if (!contained(textBox)) contentIssues.push(`${element.className}: text outside card`); + if (overlaps(textBox, avatarBox)) contentIssues.push(`${element.className}: avatar overlap`); + if (logoBox && overlaps(textBox, logoBox)) contentIssues.push(`${element.className}: logo overlap`); + textBoxes.push({ className: element.className, box: textBox }); + } + } + // Range rectangles contain the font ascent/descent envelope, including + // unpainted space. Noto Sans KR can make adjacent 0-gap line envelopes + // intersect despite distinct element line boxes and non-overlapping ink. + // Retain these metrics for visual review; never classify them as glyph + // collisions or silently claim that screenshot pixels were verified. + for (const [index, a] of textBoxes.entries()) for (const b of textBoxes.slice(index + 1)) if (a.className !== b.className && overlaps(a.box, b.box)) fontRangeOverlaps.push({ a: a.className, b: b.className, horizontal: Math.min(a.box.x + a.box.width, b.box.x + b.box.width) - Math.max(a.box.x, b.box.x), vertical: Math.min(a.box.y + a.box.height, b.box.y + b.box.height) - Math.max(a.box.y, b.box.y) }); + if (!contained(avatarBox)) contentIssues.push('avatar outside card'); + if (logoBox && !contained(logoBox)) contentIssues.push('logo outside card'); + return { + employeeId: card.dataset.employeeId, organizationId: node?.dataset.organizationId ?? null, + depth: node ? Number(node.dataset.organizationDepth ?? node.dataset.depth) : null, + kind: card.dataset.cardKind, asset: card.dataset.cardAsset, size: card.dataset.cardAssetSize, + topSlot: !!card.closest('.hm-orgchart-top-leaders'), box: rect(card), + naturalWidth: background?.naturalWidth ?? 0, naturalHeight: background?.naturalHeight ?? 0, + embedded: !!background?.src.startsWith('data:image/svg+xml'), loaded: !!background?.complete && background.naturalWidth > 0, + name: text(personName), role: text(card.querySelector('.hm-orgchart-person-role')), badge: text(card.querySelector('.hm-orgchart-job-title')), + nameAccessible: personName.getAttribute('aria-label'), roleAccessible: card.querySelector('.hm-orgchart-person-role')?.getAttribute('aria-label'), badgeAccessible: card.querySelector('.hm-orgchart-job-title')?.getAttribute('aria-label'), + nameStyle: { fontSize: getComputedStyle(personName).fontSize, fontWeight: getComputedStyle(personName).fontWeight, textOverflow: getComputedStyle(personName).textOverflow }, + contentIssues, textBoxes, lineBoxes, horizontalRoleBadgeGap, fontRangeOverlaps, + radius: css.borderRadius, border: css.borderWidth, fill: css.backgroundColor, + }; + }); + const headers = [...shadow.querySelectorAll('.node[data-organization-id] .hm-orgchart-organization-name')].map(header => { + const node = header.closest('.node'); + const card = node.querySelector('.hm-orgchart-employee'); + const box = rect(header); + const wrapperCss = getComputedStyle(header.parentElement); + return { organizationId: node.dataset.organizationId, depth: Number(node.dataset.organizationDepth ?? node.dataset.depth), text: text(header), box, + firstCardKind: card?.dataset.cardKind ?? null, headerCardGap: card ? rect(card).y - box.y - box.height : null, + wrapperBorder: wrapperCss.borderWidth, wrapperFill: wrapperCss.backgroundColor, wrapperShadow: wrapperCss.boxShadow }; + }); + const overlay = shadow.querySelector('.hm-orgchart-workdesk-overlay'); + const arrows = await Promise.all([...shadow.querySelectorAll('.hm-orgchart-workdesk-overlay image[data-arrow]')].map(async element => { + const source = element.getAttribute('href') ?? element.getAttributeNS('http://www.w3.org/1999/xlink', 'href') ?? ''; + const image = new Image(); image.src = source; + await image.decode().catch(() => {}); + return { id: element.dataset.arrow, x: Number(element.getAttribute('x')), y: Number(element.getAttribute('y')), width: Number(element.getAttribute('width')), height: Number(element.getAttribute('height')), + box: rect(element), embedded: source.startsWith('data:image/png'), fingerprint: fingerprint(source), loaded: image.complete && image.naturalWidth > 0, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight, + preserveAspectRatio: element.getAttribute('preserveAspectRatio') }; + })); + const decorations = [...shadow.querySelectorAll('img[data-workdesk-asset]')].map(image => ({ asset: image.dataset.workdeskAsset, box: rect(image), embedded: image.src.startsWith('data:image/'), fingerprint: fingerprint(image.src), loaded: image.complete && image.naturalWidth > 0, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight })); + const connectors = [...shadow.querySelectorAll('.hm-orgchart-workdesk-overlay path[data-connector]')].map(element => ({ id: element.dataset.connector, path: element.getAttribute('d'), stroke: getComputedStyle(element).stroke, strokeWidth: getComputedStyle(element).strokeWidth, dasharray: getComputedStyle(element).strokeDasharray, fill: getComputedStyle(element).fill, box: rect(element) })); + const physical = [...cards.map(card => ({ type: 'card', id: card.employeeId, box: card.box })), ...headers.map(header => ({ type: 'header', id: header.organizationId, box: header.box }))]; + const collisions = []; + for (const [index, a] of physical.entries()) for (const b of physical.slice(index + 1)) if (overlaps(a.box, b.box)) collisions.push({ a: `${a.type}:${a.id}`, b: `${b.type}:${b.id}` }); + const arrowCollisions = arrows.flatMap(arrow => physical.filter(item => overlaps(arrow.box, item.box)).map(item => ({ arrow: arrow.id, item: `${item.type}:${item.id}` }))); + const summaries = [...shadow.querySelectorAll('.hm-orgchart-organization-totals, .hm-orgchart-affiliation-bar')].map(element => ({ className: element.className, box: rect(element), text: text(element) })); + const summaryCollisions = summaries.flatMap(summary => physical.filter(item => overlaps(summary.box, item.box)).map(item => ({ summary: summary.className, item: `${item.type}:${item.id}` }))); + const pseudo = selector => [...shadow.querySelectorAll(selector)].map(element => { + const before = getComputedStyle(element, '::before'), after = getComputedStyle(element, '::after'); + return { className: element.className, before: { content: before.content, display: before.display }, after: { content: after.content, display: after.display } }; + }); + return { + scale, recordedScale: composition.dataset.scale, baseWidth: origin.width / scale, baseHeight: origin.height / scale, + stageTransform: getComputedStyle(stage).transform, displayMode: composition.dataset.displayMode, + document: dimensions(document.documentElement), viewport: dimensions(shadow.querySelector('.hm-orgchart-viewport')), + cards, headers, arrows, decorations, connectors, overlayViewBox: overlay?.getAttribute('viewBox') ?? null, + presentationNames: [...shadow.querySelectorAll('.hm-orgchart-employee .hm-orgchart-person-name')].map(element => ({ text: text(element), accessible: element.getAttribute('aria-label'), overflow: element.scrollWidth > element.clientWidth })), + presentationPeople: [...shadow.querySelectorAll('.hm-orgchart-employee')].map(card => ({ employeeId: card.dataset.employeeId, + role: text(card.querySelector('.hm-orgchart-person-role')), roleAccessible: card.querySelector('.hm-orgchart-person-role')?.getAttribute('aria-label'), + badge: text(card.querySelector('.hm-orgchart-job-title')), badgeAccessible: card.querySelector('.hm-orgchart-job-title')?.getAttribute('aria-label') })), + collisions, arrowCollisions, summaryCollisions, summaries, + debugCount: shadow.querySelectorAll('.hm-orgchart-toggle, .hm-orgchart-kind, .hm-orgchart-domain-id, .hm-orgchart-node-count, .hm-orgchart-vacancy, .hm-orgchart-description, .hm-orgchart-policy').length, + hostControls: document.querySelectorAll('.hm-orgchart-story-controls').length, + largeMatrixCount: shadow.querySelectorAll('.hm-orgchart-position-table, .hm-orgchart-position-summary').length, + totalsCount: shadow.querySelectorAll('.hm-orgchart-organization-totals').length, + affiliationBarCount: shadow.querySelectorAll('.hm-orgchart-affiliation-bar').length, + affiliationBarRows: [...shadow.querySelectorAll('.hm-orgchart-affiliation-bar-item')].map(element => rect(element).y), + affiliationTotal: text(shadow.querySelector('.hm-orgchart-affiliation-bar-total dd')), + statusGroups: [...shadow.querySelectorAll('.hm-orgchart-status-group')].map(element => ({ status: element.dataset.workStatus, text: text(element.querySelector('h3')), box: rect(element), border: getComputedStyle(element).borderWidth })), + originalBranchPseudos: pseudo('.hm-orgchart-axis, .hm-orgchart-hub, .hm-orgchart-forest, .hm-orgchart-tree'), + }; + }); +} +function verify(value, label, viewport) { + const top = value.cards.filter(card => card.kind === 'topLeader'); + const depth1 = value.cards.filter(card => card.kind === 'leader' && card.depth === 1); + const deeper = value.cards.filter(card => card.kind === 'leader' && card.depth >= 2); + const sizeMatches = (card, size, width, height) => card.size === size && near(card.box.width, width) && near(card.box.height, height) && card.naturalWidth === width && card.naturalHeight === height; + check(top.length === 1 && top[0].topSlot && sizeMatches(top[0], 'representative', 146, 74), `${label}: representative alone uses 146×74 card`); + check(depth1.length === 6 && depth1.every(card => sizeMatches(card, 'leader', 146, 68)), `${label}: all six actual Depth 1 leaders use 146×68 cards`, depth1.map(card => ({ id: card.employeeId, size: card.size, box: card.box }))); + check(deeper.length > 0 && deeper.every(card => sizeMatches(card, 'employee', 108, 52)), `${label}: every actual Depth ≥2 leader uses 108×52 card`, deeper.map(card => ({ id: card.employeeId, depth: card.depth, size: card.size, box: card.box }))); + check(deeper.every(card => spacedKorean(fixture.employees.find(employee => employee.id === card.employeeId)?.jobTitle ?? '') === card.badge && card.badge), `${label}: small leader cards preserve supplied job-title badges with requested Korean spacing`, deeper.map(card => ({ id: card.employeeId, badge: card.badge }))); + check(value.presentationNames.length > 0 && value.presentationNames.every(name => name.text === '홍 길 동' && name.accessible === '홍길동' && !name.overflow), `${label}: every displayed person name is 홍 길 동, fits, and retains an unspaced accessible name`, value.presentationNames); + check(value.presentationPeople.every(card => { + const employee = fixture.employees.find(employee => employee.id === card.employeeId); + return employee && card.role === spacedKorean(employee.position) && card.roleAccessible === employee.position && card.badge === spacedKorean(employee.jobTitle ?? '') && (!employee.jobTitle || card.badgeAccessible === employee.jobTitle); + }), `${label}: positions and job-title badges use one normal inter-Korean space while accessible labels retain original text`); + check(value.cards.every(card => card.contentIssues.length === 0), `${label}: text stays within card/avatar/logo boundaries; actual line boxes and horizontal role/badge boxes do not overlap`, value.cards.filter(card => card.contentIssues.length).map(card => ({ id: card.employeeId, issues: card.contentIssues, textBoxes: card.textBoxes, lineBoxes: card.lineBoxes, horizontalRoleBadgeGap: card.horizontalRoleBadgeGap }))); + check(value.cards.every(card => card.loaded && card.embedded), `${label}: original embedded card SVG assets load`); + const leaders = value.headers.filter(header => header.firstCardKind === 'leader'); + check(leaders.filter(header => header.depth === 1).length === 6 && leaders.every(header => near(header.headerCardGap, header.depth === 1 ? 8 : 10, 0.3)), `${label}: header-to-leader boundingRect gap is 8px at Depth 1 and 10px below`, leaders.map(header => ({ id: header.organizationId, depth: header.depth, gap: header.headerCardGap }))); + check(value.displayMode === 'readOnly' && value.debugCount === 0 && value.hostControls === 0, `${label}: read-only composition has no collapse/test/debug content`); + check(value.headers.every(header => header.wrapperBorder === '0px' && header.wrapperFill === 'rgba(0, 0, 0, 0)' && header.wrapperShadow === 'none'), `${label}: organization groups retain unframed presentation`); + check(value.totalsCount === 1 && value.affiliationBarCount === 1 && value.largeMatrixCount === 0, `${label}: compact organization totals and untitled affiliation bar are retained`); + check(value.affiliationTotal === `${new Set(fixture.employees.map(employee => employee.id)).size}명` && Math.max(...value.affiliationBarRows) - Math.min(...value.affiliationBarRows) < 1, `${label}: affiliation counts retain one base-canvas row and fixture total`); + check(value.statusGroups.length === 2 && value.statusGroups.every(group => group.border === '0px' && !group.text.includes('·')), `${label}: dispatched/on-leave groups retain compact presentation`); + check(near(value.baseWidth, 1920, 0.3) && near(value.baseHeight, 914.5, 1) && value.scale > 0 && value.scale <= 1, `${label}: entire 1920×914.5 base stage scales uniformly`, { width: value.baseWidth, height: value.baseHeight, scale: value.scale }); + check(value.document.scrollWidth <= viewport.width + 1, `${label}: document has no horizontal overflow`, value.document); + check(value.overlayViewBox?.replace(/\s+/g, ' ').trim() === '0 0 1920 914.5', `${label}: connectors and arrows share stage coordinates`); + check(value.arrows.length === 5 && value.arrows.every((arrow, index) => [arrow.x, arrow.y, arrow.width, arrow.height].every((number, coordinate) => near(number, expectedArrows[index][coordinate], 0.05)) && arrow.preserveAspectRatio === 'none' && arrow.embedded && arrow.loaded), `${label}: five embedded collaboration arrows retain source placement`, value.arrows); + check(value.decorations.length === 5 && value.decorations.every(asset => asset.embedded && asset.loaded), `${label}: five Workdesk decorations load without external URLs`, value.decorations); + check(value.connectors.length === 5 && value.connectors.some(connector => /[Cc]/.test(connector.path ?? '')) && value.connectors.every(connector => connector.path && connector.fill === 'none' && connector.stroke === 'rgb(69, 99, 159)' && near(parseFloat(connector.strokeWidth), 0.893, 0.03) && connector.dasharray.split(/[ ,]+/).every(number => near(parseFloat(number), 1.79, 0.03))), `${label}: source overlay curves retain stroke, fill, width and dash pattern`, value.connectors); + check(value.collisions.length === 0, `${label}: card/header rectangles do not overlap`, value.collisions); + check(value.arrowCollisions.length === 0, `${label}: collaboration arrow rectangles do not intersect cards/headers`, value.arrowCollisions); + check(value.summaryCollisions.length === 0, `${label}: compact summary rectangles do not intersect cards/headers`, value.summaryCollisions); +} +async function tooltip(page, transport) { + const lowerOrganization = fixture.organizations.find(organization => organization.parentId && fixture.organizations.find(parent => parent.id === organization.parentId)?.parentId && organization.leaderId); + const employeeId = lowerOrganization.leaderId; + const fullName = '홍 길 동'; + const name = page.locator(`.hm-orgchart-employee[data-employee-id="${employeeId}"] .hm-orgchart-person-name`); + await name.waitFor({ state: 'visible' }); + // All requested default names must fit. Induce a narrow name box locally to + // exercise overflow behavior without altering fixture or presentation text. + const originalInlineStyle = await name.getAttribute('style'); + await name.evaluate(element => { element.style.width = '8px'; element.style.maxWidth = '8px'; }); + await page.waitForFunction(id => document.querySelector('.hm-orgchart-host').shadowRoot.querySelector(`.hm-orgchart-employee[data-employee-id="${id}"] .hm-orgchart-person-name`)?.dataset.nameOverflow === 'true', employeeId); + const before = await page.evaluate(id => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + const name = shadow.querySelector(`.hm-orgchart-employee[data-employee-id="${id}"] .hm-orgchart-person-name`); + const tip = shadow.getElementById(name.getAttribute('aria-describedby')); + return { fullText: name.textContent, tabIndex: name.tabIndex, ellipsis: getComputedStyle(name).textOverflow, tipHidden: tip.hidden, documentHeight: document.documentElement.scrollHeight, viewportHeight: shadow.querySelector('.hm-orgchart-viewport').scrollHeight }; + }, employeeId); + check(before.fullText === fullName && before.tabIndex === 0 && before.ellipsis === 'ellipsis' && before.tipHidden, `${transport}: induced overflow preserves 홍 길 동 and exposes focusable ellipsis`, before); + await name.hover(); + const tip = page.locator('.hm-orgchart-person-name-tooltip:not([hidden])'); + await tip.waitFor({ state: 'visible' }); + check(await tip.textContent() === fullName, `${transport}: hover exposes complete requested name in tooltip`); + await tip.hover(); + check(await tip.isVisible(), `${transport}: tooltip remains hoverable`); + await page.mouse.move(0, 0); + await page.waitForFunction(() => [...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('[role=tooltip]')].every(tip => tip.hidden)); + // The only overflowed name is in the normal tab order: use the keyboard, + // rather than locator.focus(), to prove actual Tab activation. + await page.evaluate(() => document.activeElement?.blur()); + let reached = false; + for (let step = 0; step < 100 && !reached; step++) { + await page.keyboard.press('Tab'); + reached = await page.evaluate(id => document.querySelector('.hm-orgchart-host').shadowRoot.activeElement?.closest(`[data-employee-id="${id}"]`)?.dataset.employeeId === id, employeeId); + } + check(reached && await tip.isVisible(), `${transport}: keyboard Tab focus opens complete tooltip`); + await page.keyboard.press('Escape'); + check(!(await tip.isVisible()), `${transport}: Escape dismisses tooltip while focus stays on name`); + const after = await page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + return { documentHeight: document.documentElement.scrollHeight, viewportHeight: shadow.querySelector('.hm-orgchart-viewport').scrollHeight, activeClass: shadow.activeElement?.className }; + }); + check(before.documentHeight === after.documentHeight && before.viewportHeight === after.viewportHeight && after.activeClass === 'hm-orgchart-person-name', `${transport}: hidden tooltip does not inflate scroll extents or lose focus`, { before, after }); + await page.keyboard.press('Tab'); + check(!(await tip.isVisible()), `${transport}: moving focus keeps tooltip dismissed`); + await name.evaluate((element, originalInlineStyle) => originalInlineStyle === null ? element.removeAttribute('style') : element.setAttribute('style', originalInlineStyle), originalInlineStyle); + await page.waitForFunction(id => document.querySelector('.hm-orgchart-host').shadowRoot.querySelector(`.hm-orgchart-employee[data-employee-id="${id}"] .hm-orgchart-person-name`)?.dataset.nameOverflow === 'false', employeeId); + check(await name.getAttribute('tabindex') === null && await name.getAttribute('aria-describedby') === null, `${transport}: restoring the name box removes overflow-only focus and tooltip attributes`); +} +function sameGeometry(a, b) { + if (a.cards.length !== b.cards.length || a.headers.length !== b.headers.length) return false; + const boxesEqual = (first, second) => ['x', 'y', 'width', 'height'].every(key => near(first[key], second[key], 0.4)); + return a.cards.every((card, index) => { + const other = b.cards[index]; + return ['employeeId', 'organizationId', 'depth', 'kind', 'asset', 'size', 'badge', 'name', 'role'].every(key => card[key] === other[key]) && boxesEqual(card.box, other.box); + }) && a.headers.every((header, index) => header.organizationId === b.headers[index].organizationId && boxesEqual(header.box, b.headers[index].box)) + && JSON.stringify(a.connectors.map(({ id, path }) => ({ id, path }))) === JSON.stringify(b.connectors.map(({ id, path }) => ({ id, path }))) + && JSON.stringify(a.arrows.map(({ fingerprint, x, y, width, height }) => ({ fingerprint, x, y, width, height }))) === JSON.stringify(b.arrows.map(({ fingerprint, x, y, width, height }) => ({ fingerprint, x, y, width, height }))); +} +let browser; +try { + const [htmlOrigin, reactOrigin] = await Promise.all([serve(path.join(root, 'examples/org-chart/dist')), serve(path.join(root, 'examples/org-chart-react/dist'))]); + const storybookOrigin = process.env.ORGCHART_STORYBOOK_URL?.replace(/\/$/, '') ?? await serve(path.join(root, 'storybook-static')); + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME ?? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await browser.newContext({ deviceScaleFactor: 1, reducedMotion: 'reduce' }); + const routes = [ + { label: 'html', transport: 'html', url: `${htmlOrigin}/p1.html?mode=readOnly` }, + { label: 'file-classic', transport: 'html', url: `${pathToFileURL(path.join(root, 'examples/org-chart/dist/p1-classic.html')).href}?mode=readOnly` }, + { label: 'react', transport: 'react', url: `${reactOrigin}/p1.html?mode=readOnly` }, + { label: 'storybook', transport: null, url: `${storybookOrigin}/iframe.html?id=orgchart--full-composition&viewMode=story` }, + ]; + for (const route of routes) { + const page = await context.newPage(); captureErrors(page, route.label); + try { + await page.setViewportSize(viewports[0]); + await page.goto(route.url); await ready(page); + for (const viewport of viewports) { + await page.setViewportSize(viewport); await ready(page); + const value = await measure(page); + measurements.push({ route: route.label, ...viewport, ...value }); + verify(value, `${route.label}/${viewport.width}×${viewport.height}`, viewport); + const filename = `${route.label}-${viewport.width}x${viewport.height}.png`; + await page.screenshot({ path: path.join(output, filename), fullPage: true }); screenshots.push(filename); + } + if (route.transport && route.label !== 'file-classic') { + await page.setViewportSize(viewports[1]); await ready(page); + await tooltip(page, route.transport); + } + } catch (error) { check(false, `${route.label}: browser verification completed`, { message: error.message }); } + finally { await page.close(); } + } + for (const viewport of viewports) { + const values = ['html', 'file-classic', 'react', 'storybook'].map(route => measurements.find(item => item.route === route && item.width === viewport.width)); + check(values.every(Boolean) && values.slice(1).every(value => sameGeometry(values[0], value)), `HTML/React/classic/Story shared Core geometry and asset parity/${viewport.width}`, { routes: values.map(value => value?.route ?? 'missing'), toleranceInBasePixels: 0.4 }); + } + const interactive = await context.newPage(); captureErrors(interactive, 'interactive'); + await interactive.goto(`${htmlOrigin}/p1.html`); await ready(interactive, 'interactive'); + const preserved = await interactive.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + const node = [...shadow.querySelectorAll('.node')].find(node => Number(node.dataset.organizationDepth ?? node.dataset.depth) >= 2 && node.querySelector('[data-card-kind=leader]')); + const card = node?.querySelector('[data-card-kind=leader]'); + return { organizationId: node?.dataset.organizationId, size: card?.dataset.cardAssetSize, width: card?.offsetWidth, height: card?.offsetHeight, toggleCount: shadow.querySelectorAll('.hm-orgchart-toggle').length, overlayCount: shadow.querySelectorAll('.hm-orgchart-workdesk-overlay').length }; + }); + check(preserved.size === 'leader' && preserved.width === 146 && preserved.height === 68 && preserved.toggleCount > 0 && preserved.overlayCount === 0, 'interactive default preserves existing lower-leader large-card policy and controls', preserved); + await interactive.close(); + check(createHash('sha256').update(await readFile(fixturePath)).digest('hex') === fixtureHash, 'P2 browser verifier preserves original employee fixture bytes and IDs', { sha256: fixtureHash }); + check(errors.length === 0, 'P2 routes have no browser console/runtime errors', errors); +} catch (error) { check(false, 'P2 verifier setup/completion', { message: error.message }); } +finally { + await writeFile(path.join(output, 'browser.json'), JSON.stringify({ + browser: browser?.version(), scope: 'P2 only; no existing v0/P1 suite expectation changes', + transportPolicy: 'HTTP for ESM/React; true file:// classic without file-access browser flag', + tooltipMethod: 'Induced 8px name width on one rendered 홍 길 동, restored after real hover/Tab/Escape. Fixture and displayed text are unchanged.', + fixtureSha256: fixtureHash, + connectorCollisionVerification: 'NOT VERIFIED by automation: path bounding boxes do not represent curved segments. Review saved full-page screenshots for routing and overlap.', + textInkCollisionVerification: 'NOT VERIFIED by automation: font Range ascent/descent envelopes may overlap at the confirmed 0px internal row gap. Actual element line boxes, horizontal role/badge boxes, horizontal overflow and card/avatar/logo boundaries are checked; fontRangeOverlaps retain raw envelopes for screenshot pixel review.', + results, errors, measurements, screenshots, + }, null, 2)); + await browser?.close(); + for (const server of servers) await new Promise(resolve => server.close(resolve)); +} +const failures = results.filter(result => result.status === 'FAIL'); +console.log(JSON.stringify({ output, checks: results.length, failureCount: failures.length, failures: failures.slice(0, 20).map(result => result.name), ...(failures.length > 20 ? { additionalFailures: failures.length - 20 } : {}) }, null, 2)); +if (failures.length) process.exitCode = 1; diff --git a/examples/org-chart/verify-p3.1.mjs b/examples/org-chart/verify-p3.1.mjs new file mode 100644 index 0000000..a61c7db --- /dev/null +++ b/examples/org-chart/verify-p3.1.mjs @@ -0,0 +1,195 @@ +import http from 'node:http'; +import path from 'node:path'; +import fs from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// P3.1 change-specific checks. The prior 732 checks and their evidence are retained. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-p3.1'); +const fixtureBytes = await fs.readFile(path.join(root, 'examples/org-chart/data-p1.json')); +const fixture = JSON.parse(fixtureBytes); +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE ?? 'C:/Users/user/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright/index.mjs').href); +const viewports = [{ width: 1920, height: 1080 }, { width: 1440, height: 900 }, { width: 1280, height: 800 }, { width: 768, height: 1024 }, { width: 390, height: 844 }]; +const results = [], measurements = [], fontEvidence = [], errors = [], servers = []; +const check = (pass, name, detail) => results.push({ name, status: pass ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const near = (a, b, tolerance = .4) => Number.isFinite(a) && Math.abs(a - b) <= tolerance; +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.ttf': 'font/ttf', '.svg': 'image/svg+xml' }; +await fs.mkdir(output, { recursive: true }); +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + if (url.pathname === '/__p31_link') return response.end('

Group link reached

'); + if (url.pathname === '/__p31_photo.svg') { response.setHeader('Content-Type', 'image/svg+xml'); return response.end(''); } + if (url.pathname === '/__p31_bad_photo.png') { response.setHeader('Content-Type', 'image/png'); return response.end('intentional invalid image bytes'); } + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await fs.readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); servers.push(server); + return `http://127.0.0.1:${server.address().port}`; +} +async function ready(page, mode = 'readOnly') { + await page.waitForFunction(mode => { + const s = document.querySelector('.hm-orgchart-host')?.shadowRoot; + return s?.querySelector(`.hm-orgchart-composition[data-display-mode="${mode}"] [data-card-asset]`) && [...s.querySelectorAll('link[rel=stylesheet]')].every(l => l.sheet); + }, mode, { timeout: 25000 }); + await page.evaluate(async () => { + await document.fonts.load('700 20px "Noto Sans KR"', '홍 길 동 협업 소통 허브 경영진 통합시스템'); + await document.fonts.ready; + await Promise.all([...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('img')].map(i => i.decode().catch(() => {}))); + await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); + }); +} +async function measure(page) { + return page.evaluate(() => { + const s = document.querySelector('.hm-orgchart-host').shadowRoot, stage = s.querySelector('.hm-orgchart-stage'); + const origin = stage.getBoundingClientRect(), scale = origin.width / 1920; + const rect = e => { const r = e.getBoundingClientRect(); return { x: (r.x - origin.x) / scale, y: (r.y - origin.y) / scale, width: r.width / scale, height: r.height / scale }; }; + const style = (e, props) => Object.fromEntries(props.map(p => [p, getComputedStyle(e)[p]])); + const props = ['fontFamily', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing']; + const cards = [...s.querySelectorAll('.hm-orgchart-employee')].map(c => ({ + id: c.dataset.employeeId, size: c.dataset.cardAssetSize, kind: c.dataset.cardKind, box: rect(c), + name: c.querySelector('.hm-orgchart-person-name').textContent, role: c.querySelector('.hm-orgchart-person-role').textContent, + badge: c.querySelector('.hm-orgchart-job-title')?.textContent ?? '', photo: c.dataset.photoState, + image: c.querySelector('.hm-orgchart-avatar img') && { src: c.querySelector('.hm-orgchart-avatar img').src, naturalWidth: c.querySelector('.hm-orgchart-avatar img').naturalWidth, placeholder: c.querySelector('.hm-orgchart-avatar img').dataset.photoPlaceholder }, + avatar: { box: rect(c.querySelector('.hm-orgchart-avatar')), ...style(c.querySelector('.hm-orgchart-avatar'), ['borderRadius']) }, + emptyAttributes: !!c.querySelector('.hm-orgchart-person-attributes:empty'), + text: [...c.querySelectorAll('.hm-orgchart-person-name,.hm-orgchart-person-role,.hm-orgchart-job-title')].map(e => ({ text: e.textContent, box: rect(e), clientWidth: e.clientWidth, scrollWidth: e.scrollWidth, ...style(e, props) })), + })); + const headers = [...s.querySelectorAll('.node[data-organization-id]')].map(n => { + const h = n.querySelector('.hm-orgchart-organization-name'), first = n.querySelector('.hm-orgchart-employee'); + return { id: n.dataset.organizationId, depth: Number(n.dataset.organizationDepth), box: rect(h), gap: first ? rect(first).y - rect(h).y - rect(h).height : null, ...style(h, [...props, 'backgroundImage', 'textAlign', 'borderRadius', 'boxShadow']) }; + }); + const hub = s.querySelector('.hm-orgchart-hub'), label = hub.querySelector('.hm-orgchart-hub-label'), icon = hub.querySelector('.hm-orgchart-hub-icon'); + const cells = [...s.querySelectorAll('.hm-orgchart-workdesk-position-table th,.hm-orgchart-workdesk-position-table td')].map(e => { + const r = document.createRange(); r.selectNodeContents(e); + const ranges = [...r.getClientRects()].filter(r => r.width > 0).map(r => ({ x: (r.x - origin.x) / scale, y: (r.y - origin.y) / scale, width: r.width / scale, height: r.height / scale })); + return { text: e.textContent, box: rect(e), ranges, ...style(e, ['whiteSpace', 'textOverflow', 'overflowX', 'paddingLeft', 'paddingRight', ...props]) }; + }); + const fontViolations = [...s.querySelectorAll('.hm-orgchart-shell *')].filter(e => [...e.childNodes].some(n => n.nodeType === 3 && n.textContent.trim()) && !getComputedStyle(e).fontFamily.includes('Noto Sans KR')).map(e => ({ class: e.className, text: e.textContent, fontFamily: getComputedStyle(e).fontFamily })); + const table = s.querySelector('.hm-orgchart-workdesk-position-table'); + return { scale, cards, headers, hub: { box: rect(hub), icon: rect(icon), label: rect(label), axis: rect(s.querySelector('.hm-orgchart-axis')), ...style(hub, ['paddingLeft', 'paddingRight', 'gap']), font: style(label, props), paths: icon.querySelectorAll('path').length }, cells, fontViolations, + table: { box: rect(table), rows: [...table.rows].map(r => [...r.cells].map(c => c.textContent)), total: table.querySelector('[data-total-count]').textContent }, + document: { clientWidth: document.documentElement.clientWidth, scrollWidth: document.documentElement.scrollWidth, clientHeight: document.documentElement.clientHeight, scrollHeight: document.documentElement.scrollHeight }, + outside: cards.filter(c => c.box.x < -.5 || c.box.y < -.5 || c.box.x + c.box.width > 1920.5 || c.box.y + c.box.height > 915), + connectorPaths: s.querySelectorAll('.hm-orgchart-workdesk-overlay path').length, + footer: s.querySelector('.hm-orgchart-affiliation-bar').textContent, + }; + }); +} +async function glyphFonts(page, route, selectors) { + const session = await page.context().newCDPSession(page); + await session.send('DOM.enable'); await session.send('CSS.enable'); + for (const [name, selector] of selectors) { + const target = page.locator(selector).first(); + await target.evaluate(e => e.setAttribute('data-p31-font-proof', 'yes')); + const { root: dom } = await session.send('DOM.getDocument', { depth: -1, pierce: true }); + const find = node => node.attributes?.some((a, i) => i % 2 === 0 && a === 'data-p31-font-proof') ? node : [...(node.children ?? []), ...(node.shadowRoots ?? [])].map(find).find(Boolean); + const node = find(dom); + const value = await session.send('CSS.getPlatformFontsForNode', { nodeId: node.nodeId }); + fontEvidence.push({ route, name, ...value }); + // This variable font's internal family is "Noto Sans KR Thin" even at bold weights. + check(value.fonts.length > 0 && value.fonts.every(f => f.familyName.startsWith('Noto Sans KR') && f.postScriptName.startsWith('NotoSansKR') && f.isCustomFont && f.glyphCount > 0), `${route}: actual glyph font ${name}`, value.fonts); + await target.evaluate(e => e.removeAttribute('data-p31-font-proof')); + } + await session.detach(); +} +function verify(m, route, v) { + const name = `${route}/${v.width}×${v.height}`; + check(!m.fontViolations.length, `${name}: every text family is scoped Noto Sans KR`, m.fontViolations); + check(m.cards.length === 43 && m.cards.every(c => c.name === '홍 길 동' && c.role === fixture.employees.find(e => e.id === c.id).position.replace(/\s+/gu, '')), `${name}: display-only name/position; 43 cards`, m.cards.map(c => [c.id,c.name,c.role])); + check(m.cards.every(c => c.badge !== '경영진' && c.badge === ((fixture.employees.find(e => e.id === c.id).jobTitle?.trim() === '경영진') ? '' : fixture.employees.find(e => e.id === c.id).jobTitle ?? '')), `${name}: executive badge absent; other raw badges retained`); + check(m.cards.every(c => !c.emptyAttributes), `${name}: no empty badge/attribute container`); + check(m.cards.every(c => { const [w,h] = c.size === 'representative' ? [146,74] : c.size === 'leader' ? [146,68] : c.size === 'employee' ? [108,52] : [114,54]; return near(c.box.width,w) && near(c.box.height,h); }), `${name}: approved card sizes and existing P3 status sizes preserved`); + check(m.cards.every(c => { const [w,h] = c.size === 'representative' ? [36,62] : c.size === 'leader' ? [32,56] : c.size === 'employee' ? [24,44] : [28,28]; return c.photo === 'placeholder' && c.image?.placeholder === 'true' && c.image.naturalWidth > 0 && near(c.avatar.box.width,w) && near(c.avatar.box.height,h) && c.avatar.borderRadius !== '50%'; }) && new Set(m.cards.map(c => c.image?.src)).size === 1, `${name}: common decoded square icon in every noncircular slot`); + check(m.headers.filter(h => h.depth === 1).every(h => h.fontSize === '20px' && h.fontWeight === '700' && h.lineHeight === '36px' && near(h.box.height,36)), `${name}: 1Depth 20/700/36 and header36`, m.headers.filter(h => h.depth === 1)); + check(m.headers.filter(h => h.depth >= 2).every(h => { const small = h.id.startsWith('talent-growth-') || h.id.startsWith('business-planning-'); return h.fontSize === (small ? '18px':'20px') && h.fontWeight === (small?'600':'700') && h.lineHeight === (small?'16.9px':'19.7px') && near(h.box.width,114) && near(h.box.height,30.4); }), `${name}: 2Depth source typography/surface`, m.headers.filter(h => h.depth >= 2)); + check(m.headers.every(h => h.gap === null || near(h.gap,8)), `${name}: all title-to-first-card gaps 8px`, m.headers.map(h => [h.id,h.gap])); + check(m.hub.font.fontSize === '21px' && m.hub.font.fontWeight === '750' && m.hub.font.lineHeight === '24px' && m.hub.paddingLeft === '22px' && m.hub.paddingRight === '24px' && m.hub.gap === '8px' && near(m.hub.box.height,42) && near(m.hub.icon.width,20) && near(m.hub.icon.height,20) && near(m.hub.icon.y+10,m.hub.label.y+m.hub.label.height/2) && near(m.hub.box.x+m.hub.box.width/2,m.hub.axis.x+m.hub.axis.width/2) && m.hub.paths === 3, `${name}: hub font/padding/icon/axis alignment`, m.hub); + check(m.cells.every(c => c.whiteSpace === 'nowrap' && c.textOverflow !== 'ellipsis' && c.ranges.length === 1 && c.ranges[0].x >= c.box.x + parseFloat(c.paddingLeft) - .5 && c.ranges[0].x+c.ranges[0].width <= c.box.x+c.box.width-parseFloat(c.paddingRight)+.5), `${name}: every table label fits on one line without clipping`, m.cells.filter(c => c.ranges.length !== 1 || c.ranges[0].width > c.box.width-parseFloat(c.paddingLeft)-parseFloat(c.paddingRight)+.5)); + check(near(m.table.box.width,330,1) && m.table.total === '41' && m.footer.includes('41'), `${name}: table width/count and footer retained`, { table:m.table.box,total:m.table.total }); + check(m.document.scrollWidth === m.document.clientWidth && m.document.scrollHeight === m.document.clientHeight && !m.outside.length, `${name}: no page scroll; every card inside stage`, m.document); + check(m.cards.every(c => c.text.every(t => t.scrollWidth <= t.clientWidth+1 && t.box.x >= c.box.x-.5 && t.box.x+t.box.width <= c.box.x+c.box.width+.5)), `${name}: card typography has no new horizontal overflow`); +} +const dialogTargets = [['representative','.hm-orgchart-top-leaders .hm-orgchart-employee'],['depth1','.node[data-organization-depth="1"] .hm-orgchart-employee[data-card-kind="leader"]'],['depth2','.node[data-organization-depth="2"] .hm-orgchart-employee[data-card-kind="leader"]'],['employee','.hm-orgchart-engine .hm-orgchart-employee[data-card-kind="employee"]'],['dispatched','.hm-orgchart-status-group[data-work-status="dispatched"] .hm-orgchart-employee'],['onLeave','.hm-orgchart-status-group[data-work-status="onLeave"] .hm-orgchart-employee']]; +async function dialogs(page, route, viewport) { + await page.setViewportSize(viewport); await ready(page); + for (const [kind, selector] of dialogTargets) { + const card = page.locator(selector).first(), dialog = page.locator('dialog[open]'); + const id = await card.getAttribute('data-employee-id'); + await card.click(); await dialog.waitFor({ state:'visible' }); + const value = await dialog.evaluate(d => ({ fields:Object.fromEntries([...d.querySelectorAll('dt')].map(t=>[t.textContent,t.nextElementSibling.textContent])), font:getComputedStyle(d).fontFamily, width:d.getBoundingClientRect().width, scaled:!!d.closest('.hm-orgchart-stage'), transform:getComputedStyle(d).transform })); + const employee = fixture.employees.find(e=>e.id===id); + check(value.fields['이름']==='홍 길 동' && value.fields['직위']===employee.position && (!employee.jobTitle || value.fields['직책']===employee.jobTitle) && value.font.includes('Noto Sans KR') && !value.scaled && value.transform==='none' && near(value.width,Math.min(420,viewport.width-32)), `${route}/${viewport.width}: ${kind} popup retains data/font/unscaled size`, value); + if (kind==='representative' && viewport.width===1920) await glyphFonts(page,route,[['popup name','dialog[open] dd']]); + await page.keyboard.press('Tab'); await page.keyboard.press('Shift+Tab'); + check(await dialog.evaluate(d=>d.contains(d.getRootNode().activeElement)),`${route}/${viewport.width}: ${kind} modal focus trap`); + await page.keyboard.press('Escape'); await dialog.waitFor({state:'hidden'}); + check(await card.evaluate(e=>e.getRootNode().activeElement===e),`${route}/${viewport.width}: ${kind} ESC focus return`); + if(kind==='representative') { await card.press('Enter'); await dialog.waitFor({state:'visible'}); await dialog.locator('button').click(); await dialog.waitFor({state:'hidden'}); await card.press('Space'); await dialog.waitFor({state:'visible'}); await page.keyboard.press('Escape'); check(await card.evaluate(e=>e.getRootNode().activeElement===e),`${route}/${viewport.width}: Enter/Space/close preserve activation`); } + } +} +async function setData(page,data,transport) { await page.evaluate(async({data,transport})=>{ if(transport==='react')window.OrgChartP1React.setData(data);else await window.OrgChartP1.setData(data); },{data,transport}); await ready(page); } +let browser; +try { + const htmlOrigin = await serve(path.join(root,'examples/org-chart/dist')); + const reactOrigin = await serve(path.join(root,'examples/org-chart-react/dist')); + browser = await chromium.launch({executablePath:process.env.ORGCHART_CHROME ?? 'C:/Program Files/Google/Chrome/Application/chrome.exe',headless:true}); + const context = await browser.newContext(); + const routes = [{name:'html',url:`${htmlOrigin}/p1.html?mode=readOnly`},{name:'file-classic',url:pathToFileURL(path.join(root,'examples/org-chart/dist/p1-classic.html')).href+'?mode=readOnly'},{name:'react',url:`${reactOrigin}/p1.html?mode=readOnly`},{name:'storybook',url:'http://127.0.0.1:6041/iframe.html?id=orgchart--full-composition&viewMode=story'}]; + for(const route of routes) { + const page = await context.newPage(); page.on('pageerror',e=>errors.push({route:route.name,type:'runtime',message:e.message})); page.on('console',e=>{if(e.type()==='error')errors.push({route:route.name,type:'console',message:e.text()});}); + try { + await page.goto(route.url); await ready(page); + for(const viewport of viewports) { await page.setViewportSize(viewport); await ready(page); const m = await measure(page); measurements.push({route:route.name,...viewport,...m}); verify(m,route.name,viewport); if([1920,390].includes(viewport.width))await page.screenshot({path:path.join(output,`${route.name}-${viewport.width}x${viewport.height}.png`)}); } + await page.setViewportSize(viewports[0]); await ready(page); + await glyphFonts(page,route.name,[['card name','.hm-orgchart-person-name'],['card position','.hm-orgchart-person-role'],['1Depth','.node[data-organization-depth="1"] .hm-orgchart-organization-name'],['2Depth','.node[data-organization-depth="2"] .hm-orgchart-organization-name'],['hub','.hm-orgchart-hub-label'],['table','.hm-orgchart-workdesk-position-table th'],['footer','.hm-orgchart-affiliation-bar-item dt'],['status','.hm-orgchart-status-group .hm-orgchart-summary-title']]); + await dialogs(page,route.name,viewports[0]); await dialogs(page,route.name,viewports.at(-1)); + if(['html','react'].includes(route.name)) { + const data = structuredClone(fixture); data.employees[0].profileImage=`${htmlOrigin}/__p31_photo.svg`; data.employees[1].profileImage=`${htmlOrigin}/__p31_bad_photo.png`; data.employees[2].position='책 임'; + await setData(page,data,route.name); + const imageState = await page.evaluate(ids=>ids.map(id=>{const c=document.querySelector('.hm-orgchart-host').shadowRoot.querySelector(`[data-employee-id="${id}"]`),i=c.querySelector('.hm-orgchart-avatar img');return {id,photo:c.dataset.photoState,src:i.src,width:i.naturalWidth,role:c.querySelector('.hm-orgchart-person-role').textContent};}),data.employees.slice(0,3).map(e=>e.id)); + check(imageState[0].photo==='image' && imageState[0].width===80 && imageState[1].photo==='placeholder' && imageState[1].width===64 && imageState[2].role==='책임' && data.employees[2].position==='책 임',`${route.name}: real image precedence/load-failure fallback/display whitespace`,imageState); + await setData(page,fixture,route.name); + // The preserved fixture has position=경영진 but no jobTitle=경영진. + // Exercise the requested badge policy with in-memory variants, never edit JSON. + const executiveIds = await page.evaluate(selectors=>selectors.map(selector=>document.querySelector('.hm-orgchart-host').shadowRoot.querySelector(selector).dataset.employeeId),dialogTargets.map(t=>t[1])); + const executiveData = structuredClone(fixture); + for(const employee of executiveData.employees)if(executiveIds.includes(employee.id))employee.jobTitle='경영진'; + await setData(page,executiveData,route.name); + const executiveState = await page.evaluate(ids=>[...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('.hm-orgchart-employee')].filter(c=>ids.includes(c.dataset.employeeId)).map(c=>({id:c.dataset.employeeId,badge:c.querySelector('.hm-orgchart-job-title')?.textContent,role:c.querySelector('.hm-orgchart-person-role').textContent,empty:!!c.querySelector('.hm-orgchart-person-attributes:empty')})),executiveIds); + check(executiveState.length>=6 && executiveState.every(c=>!c.badge&&!c.empty&&c.role===fixture.employees.find(e=>e.id===c.id).position),`${route.name}: executive badge suppressed in all six card roles; positions preserved`,executiveState); + await page.locator(dialogTargets[0][1]).click();await page.locator('dialog[open]').waitFor({state:'visible'}); + const rawRole=await page.locator('dialog[open]').evaluate(d=>[...d.querySelectorAll('dt')].find(t=>t.textContent==='직책')?.nextElementSibling.textContent); + check(rawRole==='경영진' && executiveData.employees.find(e=>e.id===executiveIds[0]).jobTitle==='경영진',`${route.name}: hidden badge remains in data and popup contract`);await page.keyboard.press('Escape'); + await setData(page,fixture,route.name); + const id=fixture.organizations.find(o=>o.parentId===fixture.organizations.find(o=>o.parentId===null).id).id; + const links={[id]:`${route.name==='html'?htmlOrigin:reactOrigin}/__p31_link`}; + await page.evaluate(async({links,transport})=>{if(transport==='react')window.OrgChartP1React.setOptions({organizationLinks:links});else {const s=window.OrgChartP1;s.chart.destroy();s.chart=s.api.createOrgChart({container:document.getElementById('chart-host'),dataSource:new s.api.JsonOrgChartDataSource(s.data),stylesheetUrls:s.stylesheetUrls,displayMode:'readOnly',organizationLinks:links});await s.chart.mount();}},{links,transport:route.name}); await ready(page); + const link=page.locator('.hm-orgchart-organization-link');check(await link.count()===1,`${route.name}: only configured 1Depth title links`);await link.focus();await Promise.all([page.waitForURL(links[id]),page.keyboard.press('Enter')]);check(await page.locator('#proof').textContent()==='Group link reached',`${route.name}: keyboard group link navigation`); + } + } catch(error) { check(false,`${route.name}: focused verification completed`,{message:error.message,stack:error.stack}); } + await page.close(); + } + for(const v of viewports) { + const variants=measurements.filter(m=>m.width===v.width); + const base=variants.find(m=>m.route==='html'); + const equal=(a,b)=>['x','y','width','height'].every(k=>near(a[k],b[k])); + check(variants.length===4 && variants.every(m=>m.cards.length===base.cards.length && m.cards.every((c,i)=>equal(c.box,base.cards[i].box)&&c.name===base.cards[i].name&&c.role===base.cards[i].role&&c.badge===base.cards[i].badge&&c.image.src===base.cards[i].image.src)&&equal(m.hub.box,base.hub.box)&&JSON.stringify(m.table.rows)===JSON.stringify(base.table.rows)&&equal(m.table.box,base.table.box)),`HTML/classic/React/Storybook identical content/geometry/${v.width}`); + } + const standalone=await context.newPage();await standalone.goto(`${htmlOrigin}/p1.html`);await ready(standalone,'interactive'); + const standaloneData=structuredClone(fixture);standaloneData.employees[0].jobTitle='경영진';await standalone.evaluate(async data=>window.OrgChartP1.setData(data),standaloneData);await ready(standalone,'interactive'); + check((await standalone.locator('.hm-orgchart-job-title').allTextContents()).includes('경영진'),'shared renderer preserves executive badge outside readOnly Full Composition');await standalone.close(); + const index=await fetch('http://127.0.0.1:6041/index.json').then(r=>r.json());const userStories=Object.values(index.entries).filter(e=>e.title==='OrgChart'&&e.type==='story'&&!e.tags?.includes('internal'));check(userStories.length===3,'existing Storybook three user menus retained',userStories.map(e=>e.name)); + check(!errors.length,'no new browser console/runtime errors',errors); +} finally { + await browser?.close(); for(const server of servers)await new Promise(r=>server.close(r)); + const summary={total:results.length,pass:results.filter(r=>r.status==='PASS').length,fail:results.filter(r=>r.status==='FAIL').length}; + await fs.writeFile(path.join(output,'browser.json'),JSON.stringify({scope:'P3.1 only; P3 732 checks retained without rerun',fixtureSha256:createHash('sha256').update(fixtureBytes).digest('hex'),summary,results,measurements,fontEvidence,errors},null,2)); + console.log(JSON.stringify({summary,errors,failures:results.filter(r=>r.status==='FAIL').map(r=>r.name)},null,2));if(summary.fail)process.exitCode=1; +} diff --git a/examples/org-chart/verify-p3.2.mjs b/examples/org-chart/verify-p3.2.mjs new file mode 100644 index 0000000..f1e972d --- /dev/null +++ b/examples/org-chart/verify-p3.2.mjs @@ -0,0 +1,254 @@ +import http from 'node:http'; +import path from 'node:path'; +import fs from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// P3.2 change-specific evidence. Existing P3.1 486-check evidence is preserved. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-p3.2'); +const baselineMode = process.argv.includes('--baseline'); +const policiesOnly = process.argv.includes('--policies-only'); +const fixtureBytes = await fs.readFile(path.join(root, 'examples/org-chart/data-p1.json')); +const fixture = JSON.parse(fixtureBytes); +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE ?? 'C:/Users/user/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright/index.mjs').href); +const viewports = [{ width: 1920, height: 1080 }, { width: 1440, height: 900 }, { width: 1280, height: 800 }, { width: 768, height: 1024 }, { width: 390, height: 844 }]; +const storyOrigin = process.env.ORGCHART_STORY_ORIGIN ?? 'http://127.0.0.1:6041'; +const results = [], measurements = [], errors = [], servers = []; +const check = (pass, name, detail) => results.push({ name, status: pass ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const near = (a, b, tolerance = .4) => Number.isFinite(a) && Math.abs(a - b) <= tolerance; +const sameBox = (a, b) => a && b && ['x', 'y', 'width', 'height'].every(k => near(a[k], b[k])); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.ttf': 'font/ttf', '.svg': 'image/svg+xml' }; +await fs.mkdir(output, { recursive: true }); +const previous = baselineMode || policiesOnly ? null : JSON.parse(await fs.readFile(path.join(output, 'baseline-browser.json'), 'utf8')); +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + if (url.pathname === '/__p32_link') return response.end('

Group link reached

'); + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await fs.readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); servers.push(server); + return `http://127.0.0.1:${server.address().port}`; +} +async function ready(page) { + await page.waitForFunction(() => { + const s = document.querySelector('.hm-orgchart-host')?.shadowRoot; + return s?.querySelector('.hm-orgchart-composition[data-display-mode="readOnly"] [data-card-asset]') && [...s.querySelectorAll('link[rel=stylesheet]')].every(l => l.sheet); + }, null, { timeout: 25000 }); + await page.evaluate(async () => { + await document.fonts.load('600 18px "Noto Sans KR"', '홍 길 동'); + await document.fonts.ready; + await Promise.all([...document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('img')].map(i => i.decode().catch(() => {}))); + await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))); + }); +} +async function measure(page) { + return page.evaluate(() => { + const s = document.querySelector('.hm-orgchart-host').shadowRoot, stage = s.querySelector('.hm-orgchart-stage'); + const origin = stage.getBoundingClientRect(), scale = origin.width / 1920; + const rect = e => { const r = e.getBoundingClientRect(); return { x: (r.x - origin.x) / scale, y: (r.y - origin.y) / scale, width: r.width / scale, height: r.height / scale }; }; + const relative = (r, c) => ({ x: r.x - c.x, y: r.y - c.y, width: r.width, height: r.height }); + const style = (e, props) => Object.fromEntries(props.map(p => [p, getComputedStyle(e)[p]])); + const typography = ['fontFamily', 'fontSize', 'fontWeight', 'lineHeight', 'color', 'letterSpacing']; + const contained = (a, b, tolerance = .5) => a.x >= b.x - tolerance && a.y >= b.y - tolerance && a.x + a.width <= b.x + b.width + tolerance && a.y + a.height <= b.y + b.height + tolerance; + const overlap = (a, b) => a && b && Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x) > .5 && Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y) > .5; + const inks = new Map(); + // Reuse the approved P3 logo test method: natural PNG alpha bounds (>16), + // transformed through object-fit:contain. Transparent image padding is excluded. + const logoPixels = img => { + if (!img?.naturalWidth) return null; + if (!inks.has(img.src)) { + const canvas = document.createElement('canvas'); canvas.width = img.naturalWidth; canvas.height = img.naturalHeight; + const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); + const pixels = ctx.getImageData(0, 0, canvas.width, canvas.height).data; + let left = canvas.width, right = -1, top = canvas.height, bottom = -1; + for (let y = 0; y < canvas.height; y++) for (let x = 0; x < canvas.width; x++) if (pixels[(y * canvas.width + x) * 4 + 3] > 16) { + left = Math.min(left, x); right = Math.max(right, x + 1); top = Math.min(top, y); bottom = Math.max(bottom, y + 1); + } + inks.set(img.src, { left, right, top, bottom }); + } + const a = inks.get(img.src), b = rect(img), fit = Math.min(b.width / img.naturalWidth, b.height / img.naturalHeight); + const x = b.x + (b.width - img.naturalWidth * fit) / 2, y = b.y + (b.height - img.naturalHeight * fit) / 2; + return { x: x + a.left * fit, y: y + a.top * fit, width: (a.right - a.left) * fit, height: (a.bottom - a.top) * fit }; + }; + const textMeasure = e => { + const box = rect(e), r = document.createRange(); r.selectNodeContents(e); + const ranges = [...r.getClientRects()].filter(r => r.width > 0).map(r => ({ x: (r.x - origin.x) / scale, y: (r.y - origin.y) / scale, width: r.width / scale, height: r.height / scale })); + return { text: e.textContent, box, ranges, clientWidth: e.clientWidth, scrollWidth: e.scrollWidth, ...style(e, typography) }; + }; + const cards = [...s.querySelectorAll('.hm-orgchart-employee')].map(c => { + const box = rect(c), status = c.closest('.hm-orgchart-status-group')?.dataset.workStatus ?? null; + const avatar = rect(c.querySelector('.hm-orgchart-avatar')), mark = c.querySelector('.hm-orgchart-affiliation-mark'), img = mark?.querySelector('img'); + const imageBox = img && rect(img), fit = img?.naturalWidth ? Math.min(imageBox.width / img.naturalWidth, imageBox.height / img.naturalHeight) : 0; + const contentBox = img ? { x: imageBox.x + (imageBox.width - img.naturalWidth * fit) / 2, y: imageBox.y + (imageBox.height - img.naturalHeight * fit) / 2, width: img.naturalWidth * fit, height: img.naturalHeight * fit } : null; + const logo = img ? { box: imageBox, contentBox, local: relative(imageBox, box), ink: logoPixels(img), naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight, src: img.src, ...style(img, ['objectFit', 'filter', 'opacity', 'backgroundColor']) } : null; + const text = [...c.querySelectorAll('.hm-orgchart-person-name,.hm-orgchart-person-role,.hm-orgchart-job-title')].map(textMeasure); + const collisions = [], outside = []; + if (!contained(avatar, box)) outside.push('avatar'); + if (logo && !contained(logo.box, box)) outside.push('logo image box'); + if (logo?.ink && overlap(logo.ink, avatar)) collisions.push('logo/avatar'); + for (const t of text) { + if (t.scrollWidth > t.clientWidth + 1) outside.push(`${t.text}: horizontal overflow`); + for (const r of t.ranges) { + // Text Range includes font ascent/descent, and is conservative for logo + // and avatar tests. Adjacent Range-to-Range intersections are recorded + // separately; they are not treated as painted glyph collisions. + const visible = { x: Math.max(r.x, t.box.x), y: r.y, width: Math.max(0, Math.min(r.x + r.width, t.box.x + t.box.width) - Math.max(r.x, t.box.x)), height: r.height }; + if (!contained(r, box)) outside.push(`${t.text}: text Range outside card`); + if (overlap(visible, avatar)) collisions.push(`${t.text}/avatar`); + if (logo?.ink && overlap(visible, logo.ink)) collisions.push(`${t.text}/logo ink`); + } + } + const fontRangeOverlaps = []; + for (const [i, a] of text.entries()) for (const b of text.slice(i + 1)) for (const ar of a.ranges) for (const br of b.ranges) if (overlap(ar, br)) fontRangeOverlaps.push([a.text, b.text]); + const name = textMeasure(c.querySelector('.hm-orgchart-person-name')), role = textMeasure(c.querySelector('.hm-orgchart-person-role')); + const photo = c.querySelector('.hm-orgchart-avatar img'); + return { key: `${status ?? 'tree'}:${c.dataset.employeeId}`, id: c.dataset.employeeId, status, size: c.dataset.cardAssetSize ?? null, kind: c.dataset.cardKind, box, + name, role, badge: c.querySelector('.hm-orgchart-job-title')?.textContent ?? '', statusLabel: c.querySelector('.hm-orgchart-status-label')?.textContent ?? '', + avatar: { box: avatar, local: relative(avatar, box), photoState: c.dataset.photoState, placeholder: photo.dataset.photoPlaceholder, naturalWidth: photo.naturalWidth }, + nameLocal: relative(name.box, box), roleLocal: relative(role.box, box), text, logo, mark: mark ? { box: rect(mark), ...style(mark, ['backgroundColor', 'border', 'boxShadow']) } : null, + surface: style(c, ['backgroundImage', 'border', 'borderRadius', 'padding', 'columnGap']), collisions, outside, fontRangeOverlaps }; + }); + const headers = [...s.querySelectorAll('.node[data-organization-id]')].map(n => { + const h = n.querySelector('.hm-orgchart-organization-name'), first = n.querySelector('.hm-orgchart-employee'); + return { id: n.dataset.organizationId, depth: Number(n.dataset.organizationDepth), box: rect(h), gap: first ? rect(first).y - rect(h).y - rect(h).height : null, ...style(h, typography) }; + }); + const statusHeaders = [...s.querySelectorAll('.hm-orgchart-status-group')].map(g => { + const h = g.querySelector('.hm-orgchart-summary-title'), first = g.querySelector('.hm-orgchart-employee'); + return { status: g.dataset.workStatus, text: h.textContent, box: rect(h), gap: first ? rect(first).y - rect(h).y - rect(h).height : null, ...style(h, [...typography, 'backgroundImage']) }; + }); + const footer = s.querySelector('.hm-orgchart-affiliation-bar'), table = s.querySelector('.hm-orgchart-workdesk-position-table'); + return { scale, cards, headers, statusHeaders, + footer: { box: rect(footer), text: footer.textContent, logos: [...footer.querySelectorAll('.hm-orgchart-affiliation-mark img')].map(img => ({ id: img.parentElement.dataset.affiliationId, box: rect(img), ...style(img, ['width', 'height']) })) }, + table: { box: rect(table), text: table.textContent, total: table.querySelector('[data-total-count]').textContent }, + document: { clientWidth: document.documentElement.clientWidth, scrollWidth: document.documentElement.scrollWidth, clientHeight: document.documentElement.clientHeight, scrollHeight: document.documentElement.scrollHeight }, + policies: { displayMode: s.querySelector('.hm-orgchart-composition').dataset.displayMode, collapseButtons: s.querySelectorAll('.hm-orgchart-toggle').length, connectorPaths: s.querySelectorAll('.hm-orgchart-workdesk-overlay path').length, arrows: s.querySelectorAll('.hm-orgchart-workdesk-overlay [data-arrow]').length, background: getComputedStyle(s.querySelector('.hm-orgchart-composition')).backgroundColor }, + stage: rect(stage) }; + }); +} +async function measurePolicies(page) { + return page.evaluate(() => { + const s = document.querySelector('.hm-orgchart-host').shadowRoot; + const composition = s.querySelector('.hm-orgchart-composition'); + return { displayMode: composition.dataset.displayMode, collapseButtons: s.querySelectorAll('.hm-orgchart-toggle').length, + connectorPaths: s.querySelectorAll('.hm-orgchart-workdesk-overlay path').length, + arrows: s.querySelectorAll('.hm-orgchart-workdesk-overlay [data-arrow]').length, + background: getComputedStyle(composition).backgroundColor }; + }); +} +function verify(m, before, route, viewport) { + const label = `${route}/${viewport.width}×${viewport.height}`; + check(m.cards.length === before.cards.length && m.cards.every(c => before.cards.some(b => b.key === c.key)), `${label}: same employee IDs and rendered count`); + check(m.cards.every(c => c.name.text === '홍 길 동' && !/\s/u.test(c.role.text) && !/\s/u.test(c.badge) && c.name.fontFamily.includes('Noto Sans KR') && c.role.fontFamily.includes('Noto Sans KR')), `${label}: Noto Sans KR, spaced names and compact position/badge text`); + check(m.cards.every(c => { + const b = before.cards.find(b => b.key === c.key); + const preserved = ['fontWeight', 'lineHeight', 'color', 'letterSpacing']; + if (c.status) return c.name.fontSize === '18px' && c.role.fontSize === '15px'; + if (c.size === 'representative') return [...preserved, 'fontSize'].every(p => c.name[p] === b.name[p] && c.role[p] === b.role[p]); + return c.name.fontSize === (c.size === 'leader' ? '24px' : '18px') && c.role.fontSize === (c.size === 'leader' ? '18px' : '15px') && preserved.every(p => c.name[p] === b.name[p] && c.role[p] === b.role[p]); + }), `${label}: requested card typography; representative and other approved properties preserved`); + const general = m.headers.find(h => h.id === 'integrated-system-1'); + check(general && m.statusHeaders.every(h => ['fontSize', 'fontWeight', 'lineHeight'].every(p => h[p] === general[p]) && h.backgroundImage === before.statusHeaders.find(b => b.status === h.status).backgroundImage), `${label}: status title equals standard 2Depth typography; gray gradient retained`, m.statusHeaders); + const normal = m.cards.find(c => !c.status && c.size === 'employee' && c.kind === 'employee' && !c.badge); + const common = ['fontSize', 'fontWeight', 'lineHeight', 'letterSpacing']; + check(normal && m.cards.filter(c => c.status).every(c => sameBox(c.avatar.local, normal.avatar.local) && sameBox(c.nameLocal, normal.nameLocal) && sameBox(c.roleLocal, normal.roleLocal) && common.every(p => c.name[p] === normal.name[p] && c.role[p] === normal.role[p]) && c.statusLabel === '' && c.name.color === before.cards.find(b => b.key === c.key).name.color && c.role.color === before.cards.find(b => b.key === c.key).role.color), `${label}: status photo/text geometry and typography equals compact cards; own colors retained; no status line`, m.cards.filter(c => c.status).map(c => ({ key: c.key, avatar: c.avatar.local, name: c.nameLocal, role: c.roleLocal }))); + check(m.cards.filter(c => c.status).every(c => { const b = before.cards.find(b => b.key === c.key); return ['backgroundImage', 'border', 'borderRadius'].every(p => c.surface[p] === b.surface[p]) && c.logo.filter === b.logo.filter && c.logo.opacity === b.logo.opacity; }), `${label}: status card surface and image-only grayscale/opacity retained`); + check(m.cards.every(c => { const [w, h] = c.size === 'representative' ? [146, 74] : c.size === 'leader' ? [146, 68] : [108, 52]; return near(c.box.width, w) && near(c.box.height, h); }), `${label}: card sizes remain 146×74/146×68/108×52; status corrected to requested108×52`); + check([...m.headers, ...m.statusHeaders].every(h => h.gap === null || near(h.gap, 8)), `${label}: every title↔first card gap8px`); + check(m.cards.every(c => c.logo && c.logo.naturalWidth && c.logo.objectFit === 'contain' && c.logo.src === before.cards.find(b => b.key === c.key).logo?.src && ['width', 'height'].every(p => { const old = before.cards.find(b => b.key === c.key).logo; const fitted = old.contentBox ?? { width: old.naturalWidth * Math.min(old.box.width / old.naturalWidth, old.box.height / old.naturalHeight), height: old.naturalHeight * Math.min(old.box.width / old.naturalWidth, old.box.height / old.naturalHeight) }; return near(c.logo.contentBox[p] / fitted[p], 1.5, .005); }) && ['width', 'height'].every(p => near(c.logo.ink[p] / before.cards.find(b => b.key === c.key).logo.ink[p], 1.5, .005))), `${label}: all actual card logo contained images and painted ink scale1.5×; assets/ratio retained`, m.cards.map(c => ({ key: c.key, image: c.logo?.box, fitted: c.logo?.contentBox, ink: c.logo?.ink }))); + check(m.cards.every(c => c.mark.backgroundColor === 'rgba(0, 0, 0, 0)' && c.mark.border.startsWith('0px none') && c.mark.boxShadow === 'none'), `${label}: card logos have no added frame/background/shadow`); + check(m.cards.every(c => !c.collisions.length && !c.outside.length), `${label}: no logo/avatar/visible text overlap or clipping`, m.cards.filter(c => c.collisions.length || c.outside.length).map(c => ({ key: c.key, collisions: c.collisions, outside: c.outside }))); + check(m.cards.every(c => c.avatar.photoState === 'placeholder' && c.avatar.placeholder === 'true' && c.avatar.naturalWidth > 0 && c.badge !== '경영진'), `${label}: common photo placeholder and no executive badge`); + check(m.footer.text === before.footer.text && sameBox(m.footer.box, before.footer.box) && m.footer.logos.length === before.footer.logos.length && m.footer.logos.every((l, i) => sameBox(l.box, before.footer.logos[i].box)), `${label}: footer counts/geometry/logos unchanged`); + check(m.table.text === before.table.text && m.table.total === '41' && sameBox(m.table.box, before.table.box) && m.policies.displayMode === 'readOnly' && m.policies.collapseButtons === 0 && m.policies.connectorPaths === before.policies.connectorPaths && m.policies.arrows === 5 && m.policies.background === 'rgb(245, 248, 251)', `${label}: readOnly/background/connectors/statistics policies retained`, m.policies); + check(m.document.scrollWidth === m.document.clientWidth && m.document.scrollHeight === m.document.clientHeight && m.cards.every(c => c.box.x >= -.5 && c.box.y >= -.5 && c.box.x + c.box.width <= 1920.5 && c.box.y + c.box.height <= 915), `${label}: no page scroll; cards contained in scaled stage`, m.document); +} +const dialogTargets = [['representative', '.hm-orgchart-top-leaders .hm-orgchart-employee'], ['depth1', '.node[data-organization-depth="1"] .hm-orgchart-employee[data-card-kind="leader"]'], ['small', '.hm-orgchart-engine .hm-orgchart-employee[data-card-asset-size="employee"]'], ['dispatched', '.hm-orgchart-status-group[data-work-status="dispatched"] .hm-orgchart-employee'], ['onLeave', '.hm-orgchart-status-group[data-work-status="onLeave"] .hm-orgchart-employee']]; +async function dialogs(page, route, viewport) { + await page.setViewportSize(viewport); await ready(page); + for (const [kind, selector] of dialogTargets) { + const card = page.locator(selector).first(), dialog = page.locator('dialog[open]'), id = await card.getAttribute('data-employee-id'); + await card.click(); await dialog.waitFor({ state: 'visible' }); + const value = await dialog.evaluate(d => ({ fields: Object.fromEntries([...d.querySelectorAll('dt')].map(t => [t.textContent, t.nextElementSibling.textContent])), scaled: !!d.closest('.hm-orgchart-stage'), transform: getComputedStyle(d).transform, width: d.getBoundingClientRect().width })); + const employee = fixture.employees.find(e => e.id === id); + check(value.fields['이름'] === '홍 길 동' && value.fields['직위'] === employee.position && (!employee.jobTitle || value.fields['직책'] === employee.jobTitle) && !value.scaled && value.transform === 'none' && near(value.width, Math.min(420, viewport.width - 32)), `${route}/${viewport.width}: ${kind} popup retains data/unscaled size`, value); + await page.keyboard.press('Tab'); await page.keyboard.press('Shift+Tab'); + check(await dialog.evaluate(d => d.contains(d.getRootNode().activeElement)), `${route}/${viewport.width}: ${kind} popup focus trap`); + await page.keyboard.press('Escape'); await dialog.waitFor({ state: 'hidden' }); + check(await card.evaluate(e => e.getRootNode().activeElement === e), `${route}/${viewport.width}: ${kind} ESC focus return`); + } +} +async function links(page, route, origin) { + const id = fixture.organizations.find(o => o.parentId === fixture.organizations.find(o => o.parentId === null).id).id; + const configured = { [id]: `${origin}/__p32_link` }; + await page.evaluate(async ({ configured, transport }) => { + if (transport === 'react') window.OrgChartP1React.setOptions({ organizationLinks: configured }); + else { const s = window.OrgChartP1; s.chart.destroy(); s.chart = s.api.createOrgChart({ container: document.getElementById('chart-host'), dataSource: new s.api.JsonOrgChartDataSource(s.data), stylesheetUrls: s.stylesheetUrls, displayMode: 'readOnly', organizationLinks: configured }); await s.chart.mount(); } + }, { configured, transport: route }); + await ready(page); + const link = page.locator('.hm-orgchart-organization-link'); check(await link.count() === 1, `${route}: only configured 1Depth title becomes link`); + await link.focus(); await Promise.all([page.waitForURL(configured[id]), page.keyboard.press('Enter')]); + check(await page.locator('#proof').textContent() === 'Group link reached', `${route}: real1Depth keyboard link navigation`); +} +let browser; +try { + const htmlOrigin = await serve(path.join(root, 'examples/org-chart/dist')); + const reactOrigin = await serve(path.join(root, 'examples/org-chart-react/dist')); + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME ?? 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: true }); + const context = await browser.newContext(); + const routes = [{ name: 'html', url: `${htmlOrigin}/p1.html?mode=readOnly`, origin: htmlOrigin }, { name: 'file-classic', url: pathToFileURL(path.join(root, 'examples/org-chart/dist/p1-classic.html')).href + '?mode=readOnly' }, { name: 'react', url: `${reactOrigin}/p1.html?mode=readOnly`, origin: reactOrigin }, { name: 'storybook', url: `${storyOrigin}/iframe.html?id=orgchart--full-composition&viewMode=story` }]; + for (const route of routes) { + const page = await context.newPage(); + page.on('pageerror', e => errors.push({ route: route.name, type: 'runtime', message: e.message })); + page.on('console', e => { if (e.type() === 'error') errors.push({ route: route.name, type: 'console', message: e.text() }); }); + try { + await page.goto(route.url); await ready(page); + if (policiesOnly) { + await page.setViewportSize(viewports[0]); await ready(page); + const policies = await measurePolicies(page); + measurements.push({ route: route.name, ...viewports[0], policies }); + check(policies.displayMode === 'readOnly' && policies.collapseButtons === 0, `${route.name}: readOnly has no actual hm-orgchart-toggle controls`, policies); + check(policies.background === 'rgb(245, 248, 251)', `${route.name}: actual composition background is #F5F8FB`, policies.background); + check(policies.connectorPaths === 5 && policies.arrows === 5, `${route.name}: actual overlay retains five connector paths and five collaboration arrows`, policies); + } else { + for (const viewport of viewports) { + await page.setViewportSize(viewport); await ready(page); + const m = await measure(page); measurements.push({ route: route.name, ...viewport, ...m }); + if (!baselineMode) verify(m, previous.measurements.find(b => b.route === route.name && b.width === viewport.width), route.name, viewport); + if ([1920, 390].includes(viewport.width)) await page.screenshot({ path: path.join(output, `${baselineMode ? 'baseline-' : ''}${route.name}-${viewport.width}x${viewport.height}.png`) }); + } + if (!baselineMode) { + await dialogs(page, route.name, viewports[0]); await dialogs(page, route.name, viewports.at(-1)); + if (['html', 'react'].includes(route.name)) await links(page, route.name, route.origin); + } + } + } catch (error) { check(false, `${route.name}: focused browser capture completed`, { message: error.message, stack: error.stack }); } + await page.close(); + } + if (policiesOnly) check(!errors.length, 'no new console/runtime errors during policy-only capture', errors); + else if (!baselineMode) { + for (const viewport of viewports) { + const variants = measurements.filter(m => m.width === viewport.width), base = variants.find(m => m.route === 'html'); + check(variants.length === 4 && variants.every(m => m.cards.length === base.cards.length && m.cards.every((c, i) => sameBox(c.box, base.cards[i].box) && sameBox(c.nameLocal, base.cards[i].nameLocal) && sameBox(c.roleLocal, base.cards[i].roleLocal) && c.name.fontSize === base.cards[i].name.fontSize && c.role.fontSize === base.cards[i].role.fontSize && sameBox(c.logo.box, base.cards[i].logo.box))), `HTML/classic/React/Storybook same card typography/geometry/${viewport.width}`); + } + const index = await fetch(`${storyOrigin}/index.json`).then(r => r.json()); + const stories = Object.values(index.entries).filter(e => e.title === 'OrgChart' && e.type === 'story' && !e.tags?.includes('internal')); + check(stories.length === 3, 'existing Storybook three user menus retained', stories.map(e => e.name)); + check(!errors.length, 'no new console/runtime errors', errors); + } +} finally { + await browser?.close(); for (const server of servers) await new Promise(resolve => server.close(resolve)); + const summary = { total: results.length, pass: results.filter(r => r.status === 'PASS').length, fail: results.filter(r => r.status === 'FAIL').length }; + const report = { scope: policiesOnly ? 'P3.2 measurement-selector correction only; retain browser.json and do not repeat passed typography/logo/layout/dialog/link checks' : 'P3.2 changes only; prior P3.1 486 checks retained without rerun', baselineMode, policiesOnly, fixtureSha256: createHash('sha256').update(fixtureBytes).digest('hex'), summary, results, measurements, errors, + collisionMethod: 'Natural PNG alpha bounds >16 transformed through object-fit contain, versus visible text Range and avatar rectangles. Adjacent font Range envelopes are recorded only; painted font glyph interpenetration is not certified by this test.' }; + await fs.writeFile(path.join(output, policiesOnly ? 'policy-browser.json' : baselineMode ? 'baseline-browser.json' : 'browser.json'), JSON.stringify(report, null, 2)); + console.log(JSON.stringify({ baselineMode, policiesOnly, captures: measurements.length, summary, errors, failures: results.filter(r => r.status === 'FAIL').map(r => r.name) }, null, 2)); + if (summary.fail || (baselineMode && measurements.length !== routesLength())) process.exitCode = 1; +} +function routesLength() { return 4 * viewports.length; } diff --git a/examples/org-chart/verify-p3.mjs b/examples/org-chart/verify-p3.mjs new file mode 100644 index 0000000..553663b --- /dev/null +++ b/examples/org-chart/verify-p3.mjs @@ -0,0 +1,436 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, mkdir, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// P3 impact checks only. P2's 484 checks and every earlier report are retained. +// Runtime layout, accessibility interaction, and data aggregation are measured; +// font ink and curved connector routing still require saved-image review. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-p3'); +const fixturePath = path.join(root, 'examples/org-chart/data-p1.json'); +const fixtureBytes = await readFile(fixturePath); +const fixtureHash = createHash('sha256').update(fixtureBytes).digest('hex'); +const fixture = JSON.parse(fixtureBytes.toString('utf8')); +const playwrightPath = process.env.ORGCHART_PLAYWRIGHT_MODULE ?? 'C:\\Users\\user\\.cache\\codex-runtimes\\codex-primary-runtime\\dependencies\\node\\node_modules\\playwright\\index.mjs'; +const { chromium } = await import(pathToFileURL(playwrightPath).href); +const viewports = [{ width: 1920, height: 1080 }, { width: 1440, height: 900 }, { width: 1280, height: 800 }, { width: 768, height: 1024 }, { width: 390, height: 844 }]; +const results = [], measurements = [], interactions = [], errors = [], screenshots = [], servers = []; +const check = (condition, name, detail) => results.push({ name, status: condition ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const near = (actual, expected, tolerance = 0.25) => Number.isFinite(actual) && Math.abs(actual - expected) <= tolerance; +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.json': 'application/json', '.css': 'text/css', '.svg': 'image/svg+xml', '.png': 'image/png', '.ttf': 'font/ttf', '.woff2': 'font/woff2' }; +await mkdir(output, { recursive: true }); +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + if (url.pathname === '/__p3_link_proof') { + response.setHeader('Content-Type', 'text/html'); + return response.end('P3 verifier navigation proof

Configured organization link reached

'); + } + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + servers.push(server); + return `http://127.0.0.1:${server.address().port}`; +} +function captureErrors(page, route) { + page.on('pageerror', error => errors.push({ route, type: 'pageerror', message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ route, type: 'console', message: message.text() }); }); +} +async function ready(page, mode = 'readOnly') { + await page.waitForFunction(expectedMode => { + const shadow = document.querySelector('.hm-orgchart-host')?.shadowRoot; + return shadow?.querySelector(`.hm-orgchart-composition[data-display-mode="${expectedMode}"] [data-card-asset]`) + && !shadow.querySelector('.hm-orgchart-state')?.textContent + && [...shadow.querySelectorAll('link[rel=stylesheet]')].every(link => !!link.sheet); + }, mode, { timeout: 20000 }); + await page.evaluate(async () => { + await document.fonts.ready; + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + await Promise.all([...shadow.querySelectorAll('img')].map(image => image.decode().catch(() => {}))); + await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); + }); +} +async function measure(page) { + return page.evaluate(() => { + const host = document.querySelector('.hm-orgchart-host'), shadow = host.shadowRoot; + // Chrome can serialize a zero letter-spacing as "normal". Compare against + // an independently authored zero-spacing probe, not a guessed string. + const zeroSpacingProbe = document.createElement('span'); + zeroSpacingProbe.textContent = '홍 길 동'; + zeroSpacingProbe.style.letterSpacing = '0'; + shadow.append(zeroSpacingProbe); + const zeroSpacingSerialization = { authored: zeroSpacingProbe.style.letterSpacing, computed: getComputedStyle(zeroSpacingProbe).letterSpacing }; + zeroSpacingProbe.remove(); + const composition = shadow.querySelector('.hm-orgchart-composition'), stage = shadow.querySelector('.hm-orgchart-stage'); + const origin = stage.getBoundingClientRect(), scale = origin.width / stage.offsetWidth; + const rect = element => { + if (!element) return null; + const box = element.getBoundingClientRect(); + return { x: (box.left - origin.left) / scale, y: (box.top - origin.top) / scale, width: box.width / scale, height: box.height / scale }; + }; + const screenRect = element => { + const box = element.getBoundingClientRect(); + return { x: box.x, y: box.y, width: box.width, height: box.height, right: box.right, bottom: box.bottom }; + }; + const dimensions = element => ({ clientWidth: element.clientWidth, scrollWidth: element.scrollWidth, clientHeight: element.clientHeight, scrollHeight: element.scrollHeight, overflowX: getComputedStyle(element).overflowX, overflowY: getComputedStyle(element).overflowY }); + const text = element => element?.textContent?.replace(/\s+/g, ' ').trim() ?? ''; + const overlaps = (a, b) => Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x) > 0.75 && Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y) > 0.75; + const contained = (inner, outer, tolerance = 0.75) => inner.x >= outer.x - tolerance && inner.y >= outer.y - tolerance && inner.x + inner.width <= outer.x + outer.width + tolerance && inner.y + inner.height <= outer.y + outer.height + tolerance; + const cssValues = (element, properties) => element ? Object.fromEntries(properties.map(name => [name, getComputedStyle(element)[name]])) : null; + const cards = [...shadow.querySelectorAll('.hm-orgchart-employee')].map(card => { + const node = card.closest('.node'), box = rect(card), name = card.querySelector('.hm-orgchart-person-name'); + const role = card.querySelector('.hm-orgchart-person-role'), badge = card.querySelector('.hm-orgchart-job-title'); + const row = card.querySelector('.hm-orgchart-position-row'), avatar = card.querySelector('.hm-orgchart-avatar'); + const textBoxes = [...card.querySelectorAll('.hm-orgchart-person-role, .hm-orgchart-person-name, .hm-orgchart-job-title')].map(element => { + const range = document.createRange(); range.selectNodeContents(element); + const envelopes = [...range.getClientRects()].map(rangeBox => ({ x: (rangeBox.x - origin.left) / scale, y: (rangeBox.y - origin.top) / scale, width: rangeBox.width / scale, height: rangeBox.height / scale })); + return { className: element.className, box: rect(element), clientWidth: element.clientWidth, scrollWidth: element.scrollWidth, envelopes }; + }); + const issues = textBoxes.flatMap(item => [ + ...(item.scrollWidth > item.clientWidth + 1 ? [`${item.className}: horizontal text overflow`] : []), + ...(!contained(item.box, box) ? [`${item.className}: element outside card`] : []), + ...(item.envelopes.some(envelope => envelope.x < box.x - 0.75 || envelope.x + envelope.width > box.x + box.width + 0.75) ? [`${item.className}: text outside horizontal card bounds`] : []), + ]); + const logo = card.querySelector('.hm-orgchart-affiliation-mark'); + const avatarBox = rect(avatar), logoBox = rect(logo); + for (const item of textBoxes) { + if (overlaps(item.box, avatarBox)) issues.push(`${item.className}: avatar element overlap`); + if (logoBox && item.envelopes.some(envelope => overlaps(envelope, logoBox))) issues.push(`${item.className}: text envelope/logo overlap`); + } + return { + id: card.dataset.employeeId, kind: card.dataset.cardKind, asset: card.dataset.cardAsset ?? null, size: card.dataset.cardAssetSize ?? null, + organizationId: node?.dataset.organizationId ?? null, depth: node ? Number(node.dataset.organizationDepth ?? node.dataset.depth) : null, + statusGroup: card.closest('.hm-orgchart-status-group')?.dataset.workStatus ?? null, box, + name: text(name), role: text(role), badge: text(badge), nameAccessible: name.getAttribute('aria-label'), + photoState: card.dataset.photoState, avatarText: text(avatar), avatarBox, avatarStyle: cssValues(avatar, ['borderRadius', 'backgroundColor']), + photoStyle: cssValues(avatar.querySelector('img'), ['objectFit']), + rowGap: row ? rect(name).y - rect(row).y - rect(row).height : null, + badgeGap: row && badge ? rect(badge).x - rect(role).x - rect(role).width : null, + badgeInRow: !badge || !!badge.closest('.hm-orgchart-position-row'), + badgeStyle: cssValues(badge, ['color', 'backgroundColor', 'borderTopWidth', 'borderTopColor', 'borderRadius', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'paddingLeft', 'paddingRight']), + nameStyle: cssValues(name, ['fontSize', 'fontWeight', 'lineHeight']), + roleStyle: cssValues(role, ['fontSize', 'fontWeight', 'lineHeight']), + statusLabels: card.querySelectorAll('.hm-orgchart-status-label').length, + keyboardRole: card.getAttribute('role'), tabIndex: card.tabIndex, issues, textBoxes, + }; + }); + const headers = [...shadow.querySelectorAll('.node[data-organization-id] .hm-orgchart-organization-name')].map(header => { + const node = header.closest('.node'), box = rect(header), first = node.querySelector('.hm-orgchart-employee'); + return { id: node.dataset.organizationId, depth: Number(node.dataset.organizationDepth ?? node.dataset.depth), text: text(header), box, + gap: first ? rect(first).y - box.y - box.height : null, + style: cssValues(header, ['backgroundImage', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'textAlign', 'padding', 'borderRadius', 'boxShadow']), link: header.querySelector('a')?.getAttribute('href') ?? null }; + }); + const pseudoRoutes = [...shadow.querySelectorAll('.hm-orgchart-engine .hierarchy, .hm-orgchart-engine .node')].flatMap(element => ['::before', '::after'].map(pseudo => ({ className: element.className, depth: element.dataset.depth ?? null, pseudo, content: getComputedStyle(element, pseudo).content, display: getComputedStyle(element, pseudo).display }))); + const overlay = shadow.querySelector('.hm-orgchart-workdesk-overlay'); + const connectors = [...shadow.querySelectorAll('.hm-orgchart-workdesk-overlay path[data-connector]')].map(element => ({ id: element.dataset.connector, path: element.getAttribute('d') })); + const arrows = [...shadow.querySelectorAll('.hm-orgchart-workdesk-overlay image[data-arrow]')].map(element => ({ id: element.dataset.arrow, href: (element.getAttribute('href') ?? '').slice(0, 40), box: rect(element) })); + const table = shadow.querySelector('.hm-orgchart-workdesk-position-table'); + const tableData = table ? { + title: text(shadow.querySelector('.hm-orgchart-organization-totals-title')), + header: [...table.querySelectorAll('thead th')].map(text), + rows: [...table.querySelectorAll('tbody tr')].map(row => ({ id: row.dataset.organizationId, scope: row.dataset.countScope, values: [...row.children].map(text) })), + total: [...table.querySelectorAll('tfoot tr > *')].map(text), box: rect(table), + } : null; + const hub = shadow.querySelector('.hm-orgchart-hub'), hubIcon = hub?.querySelector('.hm-orgchart-hub-icon'), hubLabel = hub?.querySelector('.hm-orgchart-hub-label'); + const bar = shadow.querySelector('.hm-orgchart-affiliation-bar'); + const barItems = [...shadow.querySelectorAll('.hm-orgchart-affiliation-bar-item')].map(item => ({ id: item.dataset.affiliationId ?? 'total', count: Number(item.dataset.employeeCount ?? item.dataset.totalCount), box: rect(item), logoLoaded: [...item.querySelectorAll('img')].every(image => image.complete && image.naturalWidth > 0) })); + const modules = [...shadow.querySelectorAll('.hm-orgchart-organization-totals, .hm-orgchart-affiliation-bar, .hm-orgchart-hub')].map(element => ({ id: element.className, box: rect(element) })); + const physical = [...cards.map(card => ({ id: `card:${card.id}:${card.statusGroup ?? 'tree'}`, box: card.box })), ...headers.map(header => ({ id: `header:${header.id}`, box: header.box }))]; + const collisions = []; + for (const [index, a] of physical.entries()) for (const b of physical.slice(index + 1)) if (overlaps(a.box, b.box)) collisions.push({ a: a.id, b: b.id }); + const moduleCollisions = modules.flatMap(module => physical.filter(item => overlaps(module.box, item.box)).map(item => ({ module: module.id, item: item.id }))); + for (const [index, a] of modules.entries()) for (const b of modules.slice(index + 1)) if (overlaps(a.box, b.box)) moduleCollisions.push({ a: a.id, b: b.id }); + const outsideStage = [...physical, ...modules].filter(item => !contained(item.box, { x: 0, y: 0, width: stage.offsetWidth, height: stage.offsetHeight })).map(item => item.id); + return { + scale, recordedScale: composition.dataset.scale, baseWidth: stage.offsetWidth, baseHeight: stage.offsetHeight, zeroSpacingSerialization, + screen: { stage: screenRect(stage), composition: screenRect(composition), host: screenRect(host) }, + background: { body: getComputedStyle(document.body).backgroundColor, composition: getComputedStyle(composition).backgroundColor, stage: getComputedStyle(stage).backgroundColor }, + document: dimensions(document.documentElement), composition: dimensions(composition), stage: dimensions(stage), host: dimensions(host), + cards, headers, pseudoRoutes, connectors, arrows, overlayViewBox: overlay?.getAttribute('viewBox'), + decorations: [...shadow.querySelectorAll('img[data-workdesk-asset]')].map(image => ({ id: image.dataset.workdeskAsset, loaded: image.complete && image.naturalWidth > 0 })), + table: tableData, bar: bar ? { box: rect(bar), titleCount: bar.querySelectorAll('h1,h2,h3').length, items: barItems } : null, + hub: { box: rect(hub), iconBox: rect(hubIcon), labelBox: rect(hubLabel), paths: hubIcon?.querySelectorAll('path').length ?? 0, + gap: hubLabel && hubIcon ? rect(hubLabel).x - rect(hubIcon).x - rect(hubIcon).width : null, + style: cssValues(hubLabel, ['fontSize', 'fontWeight', 'lineHeight', 'letterSpacing']), text: text(hubLabel) }, + status: [...shadow.querySelectorAll('.hm-orgchart-status-group')].map(group => ({ status: group.dataset.workStatus, heading: text(group.querySelector('h3')) })), + collisions, moduleCollisions, outsideStage, debugCount: shadow.querySelectorAll('.hm-orgchart-toggle, .hm-orgchart-kind, .hm-orgchart-domain-id, .hm-orgchart-node-count, .hm-orgchart-vacancy, .hm-orgchart-description, .hm-orgchart-policy').length, + }; + }); +} + +const preferredPositions = ['경영진', '수석', '책임', '선임', '연구']; +const positions = [...preferredPositions.filter(position => fixture.employees.some(employee => employee.position === position)), ...new Set(fixture.employees.map(employee => employee.position).filter(position => !preferredPositions.includes(position)))]; +const organizationById = new Map(fixture.organizations.map(organization => [organization.id, organization])); +const depthOf = id => { let depth = 0; while (organizationById.get(id)?.parentId) { id = organizationById.get(id).parentId; depth++; } return depth; }; +const majorRows = fixture.organizations.filter(organization => depthOf(organization.id) <= 1); +const descendantsOf = id => { const ids = [id]; for (let index = 0; index < ids.length; index++) ids.push(...fixture.organizations.filter(organization => organization.parentId === ids[index]).map(organization => organization.id)); return ids; }; +const expectedRows = majorRows.map(organization => { + const scope = organization.parentId === null && fixture.organizations.some(item => item.parentId === organization.id) ? 'direct' : 'inclusive'; + const ids = scope === 'direct' ? [organization.id] : descendantsOf(organization.id); + const employees = fixture.employees.filter(employee => ids.includes(employee.organizationId)); + return { id: organization.id, scope, values: [organization.name, ...positions.map(position => String(employees.filter(employee => employee.position === position).length)), String(employees.length)] }; +}).filter(row => row.scope !== 'direct' || Number(row.values.at(-1)) > 0); +const expectedTotal = ['계', ...positions.map(position => String(fixture.employees.filter(employee => employee.position === position).length)), String(fixture.employees.length)]; +function verify(value, label, viewport) { + const assetCards = value.cards.filter(card => card.asset); + const first = assetCards.filter(card => card.depth === 1 && card.kind === 'leader'); + const smaller = assetCards.filter(card => card.depth >= 2 || card.kind === 'employee'); + check(value.background.body === 'rgb(245, 248, 251)' && value.background.composition === 'rgb(245, 248, 251)' && value.background.stage === 'rgb(245, 248, 251)', `${label}: Full Composition background #F5F8FB`, value.background); + check(value.pseudoRoutes.every(pseudo => ['none', 'normal'].includes(pseudo.content) || pseudo.display === 'none'), `${label}: every engine hierarchy/node pseudo connector is hidden`, value.pseudoRoutes.filter(pseudo => !['none', 'normal'].includes(pseudo.content) && pseudo.display !== 'none')); + check(value.connectors.length === 5 && value.connectors.every(connector => connector.path) && value.arrows.length === 5 && value.overlayViewBox === '0 0 1920 914.5', `${label}: existing five Workdesk curve paths and five collaboration arrow assets retained`, { connectors: value.connectors, arrows: value.arrows.map(arrow => arrow.id) }); + check(value.decorations.length > 0 && value.decorations.every(image => image.loaded), `${label}: original Workdesk decoration assets remain loaded`, value.decorations); + check(value.cards.every(card => card.name === '홍 길 동' && card.nameAccessible === '홍길동' && card.role === fixture.employees.find(employee => employee.id === card.id)?.position && card.badge === (fixture.employees.find(employee => employee.id === card.id)?.jobTitle ?? '')), `${label}: only names are spaced; positions and badges preserve raw strings`, value.cards.map(({ id, name, role, badge }) => ({ id, name, role, badge }))); + check(assetCards.every(card => near(card.rowGap, 0) && card.badgeInRow && (card.badgeGap === null || near(card.badgeGap, 4))), `${label}: role and badge share one row, gap4; position/name gap0`, assetCards.map(({ id, rowGap, badgeGap, badgeInRow }) => ({ id, rowGap, badgeGap, badgeInRow }))); + check(value.zeroSpacingSerialization.authored === '0px' && assetCards.filter(card => card.badge).every(card => { + const small = card.size === 'employee', style = card.badgeStyle; + return style.borderTopWidth === '1px' && style.borderRadius === '4px' && style.letterSpacing === value.zeroSpacingSerialization.computed && style.fontSize === (small ? '8.5px' : '9px') && style.fontWeight === (small ? '600' : '700') && style.lineHeight === (small ? '8.5px' : '9px') && style.paddingLeft === (small ? '2px' : '3px') && style.paddingRight === (small ? '2px' : '3px'); + }), `${label}: badge source border/radius/font restored`, { zeroSpacingSerialization: value.zeroSpacingSerialization, badges: assetCards.filter(card => card.badge).map(({ id, badgeStyle }) => ({ id, badgeStyle })) }); + const tagColors = { 'business-planning': 'rgb(37, 78, 126)', 'talent-growth': 'rgb(14, 103, 200)', 'integrated-system': 'rgb(110, 71, 160)', 'design-planning': 'rgb(6, 154, 149)', 'solution-sales': 'rgb(81, 139, 53)' }; + check(assetCards.filter(card => card.badge).every(card => card.badgeStyle.color === (tagColors[card.asset] ?? 'rgb(14, 84, 146)')), `${label}: organization-specific badge source colors`, assetCards.filter(card => card.badge).map(({ id, asset, badgeStyle }) => ({ id, asset, color: badgeStyle.color }))); + check(assetCards.filter(card => card.badge).every(card => { + const color = tagColors[card.asset] ?? 'rgb(14, 84, 146)', alpha = card.asset in tagColors ? ['0.1', '0.26'] : ['0.08', '0.2']; + const rgba = value => color.replace('rgb(', 'rgba(').replace(')', `, ${value})`); + return card.badgeStyle.backgroundColor === rgba(alpha[0]) && card.badgeStyle.borderTopColor === rgba(alpha[1]); + }), `${label}: badge source background and border tint`, assetCards.filter(card => card.badge).map(({ id, badgeStyle }) => ({ id, background: badgeStyle.backgroundColor, border: badgeStyle.borderTopColor }))); + check(value.cards.every(card => card.avatarStyle.borderRadius === '3.5px' && card.avatarText === '' && card.photoState === 'empty'), `${label}: no-photo state is empty rectangular slot with no circular avatar or copied photo`, value.cards.map(({ id, avatarStyle, avatarText, photoState }) => ({ id, avatarStyle, avatarText, photoState }))); + check(assetCards.some(card => card.kind === 'topLeader' && near(card.box.width, 146) && near(card.box.height, 74)) && first.length === 6 && first.every(card => near(card.box.width, 146) && near(card.box.height, 68)) && smaller.length > 0 && smaller.every(card => near(card.box.width, 108) && near(card.box.height, 52)), `${label}: approved representative/Depth1/deeper card sizes preserved`); + check(value.headers.filter(header => header.gap !== null).every(header => near(header.gap, 8)), `${label}: every organization header-to-first-card gap8`, value.headers.map(({ id, depth, gap }) => ({ id, depth, gap }))); + check(value.headers.filter(header => header.depth >= 2).every(header => near(header.box.width, 114) && near(header.box.height, 30.4) && header.style.backgroundImage.startsWith('linear-gradient') && header.style.borderRadius === '7.1px' && header.style.textAlign === 'center'), `${label}: deeper group source header geometry and gradient`, value.headers.filter(header => header.depth >= 2)); + const headerGradients = { 'business-management': ['rgb(25, 77, 130)', 'rgb(29, 57, 92)'], 'business-planning': ['rgb(33, 100, 168)', 'rgb(37, 73, 117)'], 'talent-growth': ['rgb(15, 106, 206)', 'rgb(4, 74, 148)'], 'integrated-system': ['rgb(140, 103, 182)', 'rgb(93, 52, 148)'], 'design-planning': ['rgb(9, 167, 162)', 'rgb(0, 132, 127)'], 'solution-sales': ['rgb(90, 150, 60)', 'rgb(63, 118, 41)'] }; + check(value.headers.filter(header => header.depth >= 2).every(header => { + let id = header.id; while (depthOf(id) > 1) id = organizationById.get(id).parentId; + const expected = headerGradients[id], hr = id === 'talent-growth'; + return expected?.every(color => header.style.backgroundImage.includes(color)) && header.style.fontSize === (hr ? '18px' : '20px') && header.style.fontWeight === (hr ? '600' : '700') && header.style.lineHeight === (hr ? '16.9px' : '19.7px'); + }), `${label}: deeper headers inherit original parent color and source typography`, value.headers.filter(header => header.depth >= 2).map(({ id, style }) => ({ id, style }))); + check(value.hub.paths === 3 && near(value.hub.iconBox?.width, 20) && near(value.hub.iconBox?.height, 20) && near(value.hub.gap, 8) && value.hub.style.fontSize === '21px' && value.hub.style.fontWeight === '750' && value.hub.style.lineHeight === '24px', `${label}: original hub icon and source text metrics`, value.hub); + check(value.hub.iconBox && value.hub.labelBox && [value.hub.iconBox, value.hub.labelBox].every(box => box.x >= value.hub.box.x - 0.5 && box.y >= value.hub.box.y - 0.5 && box.x + box.width <= value.hub.box.x + value.hub.box.width + 0.5 && box.y + box.height <= value.hub.box.y + value.hub.box.height + 0.5), `${label}: hub icon and label remain inside source pill`, value.hub); + check(value.status.every(group => group.heading === (group.status === 'dispatched' ? '파견' : '휴직')) && value.cards.filter(card => card.statusGroup).every(card => card.statusLabels === 0), `${label}: compact status headers retained and below-name labels removed`, value.status); + check(value.table?.title === '직위별 인원 현황 (팀별)' && JSON.stringify(value.table?.header) === JSON.stringify(['팀원', ...positions, '소계']) && JSON.stringify(value.table?.rows) === JSON.stringify(expectedRows) && JSON.stringify(value.table?.total) === JSON.stringify(expectedTotal) && fixture.employees.length === 41, `${label}: position matrix cross-counts original 41 employees`, { actual: value.table, expectedRows, expectedTotal }); + check(value.bar && value.bar.titleCount === 0 && near(value.bar.box.height, 55.4) && value.bar.items.every(item => near(item.box.y, value.bar.items[0].box.y)) && value.bar.items.every(item => item.logoLoaded) && value.bar.items.every(item => item.count === (item.id === 'total' ? fixture.employees.length : fixture.employees.filter(employee => employee.affiliationId === item.id).length)), `${label}: untitled one-row affiliation bar height55.4 and original counts/logos`, value.bar); + check(value.cards.every(card => card.issues.length === 0), `${label}: card text has no horizontal overflow or element collisions`, value.cards.filter(card => card.issues.length).map(({ id, issues, textBoxes }) => ({ id, issues, textBoxes }))); + check(value.collisions.length === 0 && value.moduleCollisions.length === 0 && value.outsideStage.length === 0, `${label}: cards/headers/modules do not overlap or fall outside stage`, { collisions: value.collisions, modules: value.moduleCollisions, outside: value.outsideStage }); + check(value.document.scrollWidth <= value.document.clientWidth && value.document.scrollHeight <= value.document.clientHeight && value.screen.stage.right <= viewport.width + 1 && value.screen.stage.bottom <= viewport.height + 1 && value.screen.composition.width <= viewport.width && value.screen.composition.height >= value.screen.stage.height - 1, `${label}: proportionally fitted whole composition; no document scrolling or viewport clipping`, { scale: value.scale, baseWidth: value.baseWidth, baseHeight: value.baseHeight, document: value.document, screen: value.screen }); + check(value.debugCount === 0 && value.cards.every(card => card.keyboardRole === 'button' && card.tabIndex === 0), `${label}: view-only cards retain keyboard information lookup without edit/collapse UI`, { debugCount: value.debugCount }); +} + +async function dialogs(page, label, viewport) { + await page.setViewportSize(viewport); await ready(page); + const targets = await page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + const selectors = [ + ['representative', '.hm-orgchart-top-leaders .hm-orgchart-employee'], + ['depth1', '.node[data-organization-depth="1"] .hm-orgchart-employee[data-card-kind="leader"]'], + ['depth2', '.node[data-organization-depth="2"] .hm-orgchart-employee[data-card-kind="leader"]'], + ['employee', '.hm-orgchart-engine .hm-orgchart-employee[data-card-kind="employee"]'], + ['dispatched', '.hm-orgchart-status-group[data-work-status="dispatched"] .hm-orgchart-employee'], + ['onLeave', '.hm-orgchart-status-group[data-work-status="onLeave"] .hm-orgchart-employee'], + ]; + return selectors.map(([kind, selector]) => ({ kind, selector, id: shadow.querySelector(selector)?.dataset.employeeId })); + }); + for (const target of targets) { + if (!target.id) { check(false, `${label}: ${target.kind} dialog target exists`); continue; } + const trigger = page.locator(target.selector).first(), dialog = page.locator('dialog.hm-orgchart-employee-dialog[open]'); + await trigger.click(); await dialog.waitFor({ state: 'visible' }); + const value = await dialog.evaluate(element => { + const rect = element.getBoundingClientRect(), shadow = element.getRootNode(); + const fields = [...element.querySelectorAll('dt')].map(term => [term.textContent, term.nextElementSibling.textContent]); + return { employeeId: element.dataset.employeeId, fields, rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom }, insideStage: !!element.closest('.hm-orgchart-stage'), transform: getComputedStyle(element).transform, ariaModal: element.getAttribute('aria-modal'), focus: shadow.activeElement?.className, editCount: element.querySelectorAll('input,select,textarea,[contenteditable]').length }; + }); + interactions.push({ route: label, viewport, target: target.kind, ...value }); + const employee = fixture.employees.find(employee => employee.id === target.id); + const fields = Object.fromEntries(value.fields); + check(value.employeeId === employee.id && fields['이름'] === '홍 길 동' && fields['직위'] === employee.position && fields['소속'] === organizationById.get(employee.organizationId)?.name && (!employee.jobTitle || fields['직책'] === employee.jobTitle) && value.fields.every(([field]) => ['이름', '직위', '소속', '직책', '관계사', '근무 상태'].includes(field)) && value.editCount === 0, `${label}/${viewport.width}: ${target.kind} dialog shows only real fixture fields`, value); + check(!value.insideStage && value.transform === 'none' && value.ariaModal === 'true' && value.rect.width >= Math.min(300, viewport.width - 32) && value.rect.right <= viewport.width + 1 && value.rect.bottom <= viewport.height + 1 && value.rect.x >= 0 && value.rect.y >= 0, `${label}/${viewport.width}: ${target.kind} modal remains unscaled and unclipped`, value.rect); + await page.keyboard.press('Tab'); await page.keyboard.press('Shift+Tab'); + const trapped = await dialog.evaluate(element => element.contains(element.getRootNode().activeElement)); + check(trapped && value.focus === 'hm-orgchart-employee-dialog-close', `${label}/${viewport.width}: ${target.kind} modal receives and traps keyboard focus`); + await page.keyboard.press('Escape'); await dialog.waitFor({ state: 'hidden' }); + check(await trigger.evaluate(element => element.getRootNode().activeElement === element), `${label}/${viewport.width}: ${target.kind} ESC restores triggering card focus`); + await trigger.press('Enter'); await dialog.waitFor({ state: 'visible' }); + await dialog.locator('.hm-orgchart-employee-dialog-close').click(); await dialog.waitFor({ state: 'hidden' }); + check(await trigger.evaluate(element => element.getRootNode().activeElement === element), `${label}/${viewport.width}: ${target.kind} Enter opens; Close restores card focus`); + } +} + +async function configure(page, transport, options) { + if (transport === 'react') { + await page.evaluate(({ links, callback }) => { + if (typeof window.OrgChartP1React?.setOptions !== 'function') throw new Error('React P1 example does not expose public-prop setOptions seam'); + window.OrgChartP1React.setOptions({ organizationLinks: links, onEmployeeClick: callback ? (employee, context) => { + window.__p3CallbackEvents.push({ employeeId: employee.id, organizationId: context.organization?.id, affiliationId: context.affiliation?.id, triggerId: context.trigger.dataset.employeeId, eventType: context.originalEvent.type }); + } : undefined }); + }, options); + } else { + await page.evaluate(async ({ links, callback }) => { + const seam = window.OrgChartP1; seam.chart.destroy(); + seam.chart = seam.api.createOrgChart({ container: document.getElementById('chart-host'), dataSource: new seam.api.JsonOrgChartDataSource(seam.data), stylesheetUrls: seam.stylesheetUrls, displayMode: 'readOnly', organizationLinks: links, + onEmployeeClick: callback ? (employee, context) => { + window.__p3CallbackEvents.push({ employeeId: employee.id, organizationId: context.organization?.id, affiliationId: context.affiliation?.id, triggerId: context.trigger.dataset.employeeId, eventType: context.originalEvent.type }); + } : undefined }); + await seam.chart.mount(); + }, options); + } + await ready(page); +} +async function linksAndCallbacks(page, transport, routeUrl, targetUrl) { + const major = fixture.organizations.find(organization => depthOf(organization.id) === 1); + await page.evaluate(() => { window.__p3CallbackEvents = []; }); + await configure(page, transport, { links: { [major.id]: targetUrl }, callback: true }); + const info = await page.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + return { links: [...shadow.querySelectorAll('.hm-orgchart-organization-link')].map(link => ({ href: link.href, role: link.tagName, tabIndex: link.tabIndex, id: link.closest('.node').dataset.organizationId })), ordinaryTitles: [...shadow.querySelectorAll('.node[data-organization-depth="1"] .hm-orgchart-organization-name')].filter(header => !header.querySelector('a')).length }; + }); + check(info.links.length === 1 && info.links[0].id === major.id && info.links[0].href === targetUrl && info.links[0].role === 'A' && info.links[0].tabIndex === 0 && info.ordinaryTitles === 5, `${transport}: only explicitly mapped 1Depth title is a native link`, info); + const card = page.locator('.hm-orgchart-top-leaders .hm-orgchart-employee'); + await card.click(); + await page.waitForFunction(() => window.__p3CallbackEvents.length === 1); + const first = await page.evaluate(() => ({ callbacks: window.__p3CallbackEvents, openDialogs: document.querySelector('.hm-orgchart-host').shadowRoot.querySelectorAll('dialog[open]').length })); + check(first.callbacks.length === 1 && first.openDialogs === 0 && first.callbacks[0].triggerId === first.callbacks[0].employeeId && first.callbacks[0].organizationId && first.callbacks[0].affiliationId, `${transport}: custom callback fires once with fixture/context and replaces default dialog`, first); + await card.press('Enter'); await card.press('Space'); + const keyboard = await page.evaluate(() => window.__p3CallbackEvents); + check(keyboard.length === 3 && keyboard.slice(1).every(event => event.eventType === 'keydown'), `${transport}: Enter/Space each activate callback once`, keyboard); + await page.evaluate(() => document.querySelector('.hm-orgchart-host').shadowRoot.activeElement?.blur()); + let reached = false; + for (let step = 0; step < 60 && !reached; step++) { + await page.keyboard.press('Tab'); + reached = await page.evaluate(() => document.querySelector('.hm-orgchart-host').shadowRoot.activeElement?.classList.contains('hm-orgchart-organization-link') ?? false); + } + const linkFocus = await page.locator('.hm-orgchart-organization-link').evaluate(element => ({ matches: element.matches(':focus-visible'), outlineStyle: getComputedStyle(element).outlineStyle, outlineWidth: getComputedStyle(element).outlineWidth })); + check(reached && linkFocus.matches && linkFocus.outlineStyle === 'solid' && parseFloat(linkFocus.outlineWidth) >= 2, `${transport}: real Tab reaches title link with visible focus`, linkFocus); + check((await page.evaluate(() => window.__p3CallbackEvents)).length === 3, `${transport}: title focus does not activate employee callback`); + await Promise.all([page.waitForURL(targetUrl), page.keyboard.press('Enter')]); + check(await page.locator('#proof').textContent() === 'Configured organization link reached', `${transport}: native keyboard link reaches configured verifier URL`); + await page.goto(routeUrl); await ready(page); + await page.evaluate(() => { window.__p3CallbackEvents = []; }); + await configure(page, transport, { links: {}, callback: false }); + check(await page.locator('.hm-orgchart-organization-link').count() === 0, `${transport}: removing configured links restores ordinary titles`); + await page.locator('.hm-orgchart-top-leaders .hm-orgchart-employee').click(); + await page.locator('dialog[open]').waitFor({ state: 'visible' }); + check(true, `${transport}: clearing custom callback restores default Core dialog`); + await page.keyboard.press('Escape'); +} +function sameGeometry(a, b) { + if (!a || !b || a.cards.length !== b.cards.length || a.headers.length !== b.headers.length) return false; + const boxesEqual = (first, second) => ['x', 'y', 'width', 'height'].every(key => near(first[key], second[key], 0.4)); + return a.cards.every((card, index) => ['id', 'kind', 'size', 'asset', 'name', 'role', 'badge'].every(key => card[key] === b.cards[index][key]) && boxesEqual(card.box, b.cards[index].box)) + && a.headers.every((header, index) => header.id === b.headers[index].id && boxesEqual(header.box, b.headers[index].box)) + && JSON.stringify(a.connectors) === JSON.stringify(b.connectors) + && JSON.stringify(a.table && { ...a.table, box: undefined }) === JSON.stringify(b.table && { ...b.table, box: undefined }) + && a.table && b.table && boxesEqual(a.table.box, b.table.box); +} + +let browser; +try { + const [htmlOrigin, reactOrigin] = await Promise.all([serve(path.join(root, 'examples/org-chart/dist')), serve(path.join(root, 'examples/org-chart-react/dist'))]); + // The user identified the live 6041 Storybook; never silently verify a stale + // storybook-static build from P2 instead of that requested running server. + const storybookOrigin = process.env.ORGCHART_STORYBOOK_URL?.replace(/\/$/, '') ?? 'http://127.0.0.1:6041'; + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME ?? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await browser.newContext({ deviceScaleFactor: 1, reducedMotion: 'reduce' }); + const routes = [ + { label: 'html', transport: 'html', url: `${htmlOrigin}/p1.html?mode=readOnly` }, + { label: 'file-classic', transport: 'html', url: `${pathToFileURL(path.join(root, 'examples/org-chart/dist/p1-classic.html')).href}?mode=readOnly` }, + { label: 'react', transport: 'react', url: `${reactOrigin}/p1.html?mode=readOnly` }, + { label: 'storybook', transport: null, url: `${storybookOrigin}/iframe.html?id=orgchart--full-composition&viewMode=story` }, + ]; + for (const route of routes) { + const page = await context.newPage(); captureErrors(page, route.label); + try { + await page.setViewportSize(viewports[0]); await page.goto(route.url); await ready(page); + for (const viewport of viewports) { + await page.setViewportSize(viewport); await ready(page); + const value = await measure(page); measurements.push({ route: route.label, ...viewport, ...value }); + verify(value, `${route.label}/${viewport.width}×${viewport.height}`, viewport); + if (viewport.width === 1920 || viewport.width === 390) { + const filename = `${route.label}-${viewport.width}x${viewport.height}.png`; + await page.screenshot({ path: path.join(output, filename), fullPage: true }); screenshots.push(filename); + } + } + await dialogs(page, route.label, viewports[0]); + await dialogs(page, route.label, viewports.at(-1)); + if (route.label === 'html' || route.label === 'react') { + await page.setViewportSize(viewports[0]); + await linksAndCallbacks(page, route.transport, route.url, `${route.label === 'html' ? htmlOrigin : reactOrigin}/__p3_link_proof`); + } + } catch (error) { check(false, `${route.label}: P3 browser verification completed`, { message: error.message, stack: error.stack }); } + finally { await page.close(); } + } + for (const viewport of viewports) { + const values = ['html', 'file-classic', 'react', 'storybook'].map(route => measurements.find(item => item.route === route && item.width === viewport.width)); + check(values.every(Boolean) && values.slice(1).every(value => sameGeometry(values[0], value)), `HTML/classic/React/Story shared Core geometry and matrix/${viewport.width}`, { routes: values.map(value => value?.route ?? 'missing'), basePixelTolerance: 0.4 }); + } + const fitPage = await context.newPage(); captureErrors(fitPage, 'host-fit'); + await fitPage.setViewportSize({ width: 1920, height: 650 }); await fitPage.goto(routes[0].url); await ready(fitPage); + const shortValue = await measure(fitPage); measurements.push({ route: 'short-height', width: 1920, height: 650, ...shortValue }); + check(shortValue.document.scrollHeight <= shortValue.document.clientHeight && shortValue.screen.stage.bottom <= 650 && shortValue.scale <= (650 - shortValue.screen.composition.y) / shortValue.baseHeight + 0.002, 'short1920×650: fit respects actual visible height without assuming host header', shortValue.screen); + await fitPage.setViewportSize(viewports[0]); + await fitPage.evaluate(() => { document.getElementById('chart-host').style.height = '400px'; }); await ready(fitPage); + const fixed = await measure(fitPage); measurements.push({ route: 'fixed400-host', width: 1920, height: 1080, ...fixed }); + check(fixed.screen.stage.height <= 400.5 && fixed.screen.composition.height <= 400.5 && fixed.scale <= 400 / fixed.baseHeight + 0.002 && fixed.screen.stage.bottom <= fixed.screen.host.y + 400.5, 'explicit400px container: fit uses host height without clipping whole composition', { scale: fixed.scale, screen: fixed.screen }); + await fitPage.evaluate(() => { + const host = document.getElementById('chart-host'); host.style.height = ''; host.style.maxHeight = '400px'; + }); await ready(fitPage); + const maxHeight = await measure(fitPage); measurements.push({ route: 'max-height400-host', width: 1920, height: 1080, ...maxHeight }); + check(maxHeight.screen.stage.height <= 400.5 && maxHeight.screen.composition.height <= 400.5 && maxHeight.scale <= 400 / maxHeight.baseHeight + 0.002, 'max-height400px container: fit respects ancestor max-height', { scale: maxHeight.scale, screen: maxHeight.screen }); + await fitPage.evaluate(() => { + const host = document.getElementById('chart-host'); host.style.maxHeight = ''; host.style.height = '400px'; host.style.boxSizing = 'border-box'; host.style.padding = '20px'; + const chartRoot = host.querySelector('.hm-orgchart-host'); const inner = document.createElement('div'); inner.style.padding = '12px'; inner.style.boxSizing = 'border-box'; + host.append(inner); inner.append(chartRoot); + }); await ready(fitPage); + const padded = await measure(fitPage); measurements.push({ route: 'nested-padding400-host', width: 1920, height: 1080, ...padded }); + check(padded.screen.stage.height <= 336.5 && padded.scale <= 336 / padded.baseHeight + 0.002 && padded.screen.stage.bottom <= padded.screen.host.y + 336.5, '400px border-box ancestor: fit subtracts20px outer and12px inner vertical padding', { scale: padded.scale, screen: padded.screen }); + await fitPage.close(); + + const index = await (await fetch(`${storybookOrigin}/index.json`)).json(); + const entries = Object.values(index.entries ?? {}); + const visible = entries.filter(entry => entry.title === 'OrgChart' && entry.type === 'story' && !entry.tags?.includes('internal')); + check(JSON.stringify(visible.map(entry => entry.name).sort()) === JSON.stringify(['Logo · Personnel Summary', 'Department Colors', 'Full Composition'].sort()), 'Storybook index: exactly three user-facing OrgChart pages', visible.map(({ id, name, tags }) => ({ id, name, tags }))); + check(['orgchart--logo', 'orgchart--position-summary', 'orgchart--affiliation-summary'].every(id => entries.some(entry => entry.id === id && entry.tags?.includes('internal'))), 'Storybook index: independent component verification Stories retained'); + const combined = await context.newPage(); captureErrors(combined, 'combined-summary'); + await combined.goto(`${storybookOrigin}/iframe.html?id=orgchart--logo-personnel-summary&viewMode=story`); + await combined.waitForFunction(() => [...document.querySelectorAll('.hm-orgchart-component-host')].filter(host => host.shadowRoot?.querySelector('[data-component]')).length >= 3); + const combinedContent = await combined.evaluate(() => [...document.querySelectorAll('.hm-orgchart-component-host')].map(host => [...host.shadowRoot.querySelectorAll('[data-component]')].map(element => element.dataset.component)).flat()); + check(['Logo', 'PositionSummary', 'AffiliationSummary'].every(name => combinedContent.includes(name)), 'Storybook combined page renders all three existing Core components', combinedContent); + await combined.close(); + const manager = await context.newPage(); captureErrors(manager, 'storybook-manager'); + await manager.goto(`${storybookOrigin}/?path=/story/orgchart--full-composition`); + await manager.locator('a[href*="orgchart--full-composition"]').first().waitFor({ state: 'visible', timeout: 20000 }); + const sidebar = await manager.evaluate(() => [...document.querySelectorAll('a[href*="/story/orgchart--"]')].filter(element => element.getBoundingClientRect().width && element.getBoundingClientRect().height).map(element => ({ name: element.textContent.trim(), href: element.getAttribute('href') }))); + check(sidebar.length === 3 && ['logo-personnel-summary', 'department-colors', 'full-composition'].every(id => sidebar.some(item => item.href.includes(`orgchart--${id}`))), 'Storybook manager: actual visible OrgChart sidebar contains only three pages', sidebar); + await manager.close(); + + const interactivePage = await context.newPage(); captureErrors(interactivePage, 'interactive'); + await interactivePage.goto(`${htmlOrigin}/p1.html`); await ready(interactivePage, 'interactive'); + const preserved = await interactivePage.evaluate(() => { + const shadow = document.querySelector('.hm-orgchart-host').shadowRoot; + return { toggles: shadow.querySelectorAll('.hm-orgchart-toggle').length, visibleRoutes: [...shadow.querySelectorAll('.hm-orgchart-engine .hierarchy')].some(element => !['none', 'normal'].includes(getComputedStyle(element, '::before').content) && getComputedStyle(element, '::before').display !== 'none'), statusLabels: shadow.querySelector('.hm-orgchart-status-group .hm-orgchart-status-label')?.textContent }; + }); + check(preserved.toggles > 0 && preserved.visibleRoutes && ['파견', '휴직'].includes(preserved.statusLabels), 'interactive view preserves existing collapse, hierarchy routes and status labels', preserved); + await interactivePage.close(); + check(createHash('sha256').update(await readFile(fixturePath)).digest('hex') === fixtureHash, 'P3 verifier preserves original 41-person fixture bytes', { sha256: fixtureHash }); + check(errors.length === 0, 'P3 routes have no browser runtime/console errors', errors); +} catch (error) { check(false, 'P3 verifier setup/completion', { message: error.message, stack: error.stack }); } +finally { + await writeFile(path.join(output, 'browser.json'), JSON.stringify({ + browser: browser?.version(), scope: 'P3 impacts only; P2/old suites and expectations are unchanged', fixtureSha256: fixtureHash, + transportPolicy: 'HTTP ESM/React/Storybook and true file:// classic without file-access Chrome flags', + testLinkPolicy: '/__p3_link_proof URLs exist only in the verifier-owned local HTTP servers; no actual product URL/data was invented', + connectorRoutingInk: 'NOT VERIFIED automatically: inspect representative screenshots for curved route/ink intersections', + textInkCollision: 'NOT VERIFIED automatically: confirmed gap0 may overlap font envelopes; measured element boxes and horizontal text limits are checked', + originalPhotoPolicy: 'Workdesk has rectangular photo slots and no explicit missing-photo asset. Fictitious cards use transparent empty slots, no real employee photo copied.', + results, errors, measurements, interactions, screenshots, + }, null, 2)); + await browser?.close(); + for (const server of servers) await new Promise(resolve => server.close(resolve)); +} +const failures = results.filter(result => result.status === 'FAIL'); +console.log(JSON.stringify({ output, checks: results.length, failureCount: failures.length, failures: failures.slice(0, 30).map(result => result.name), ...(failures.length > 30 ? { additionalFailures: failures.length - 30 } : {}) }, null, 2)); +if (failures.length) process.exitCode = 1; diff --git a/examples/org-chart/verify-package.mjs b/examples/org-chart/verify-package.mjs new file mode 100644 index 0000000..0729646 --- /dev/null +++ b/examples/org-chart/verify-package.mjs @@ -0,0 +1,43 @@ +import assert from 'node:assert/strict'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import { execFileSync } from 'node:child_process'; +import path from 'node:path'; +const root = fileURLToPath(new URL('../../', import.meta.url)); +const consumer = path.join(root, 'test-results/org-chart-consumer'); +const packageRoot = path.join(consumer, 'node_modules/@hm-design/org-chart'); +await mkdir(packageRoot, { recursive: true }); +execFileSync('tar.exe', ['-xzf', path.join(root, 'test-results/hm-design-org-chart-0.1.0.tgz'), '-C', packageRoot, '--strip-components=1']); +await writeFile(path.join(consumer, 'package.json'), JSON.stringify({name:'org-chart-isolated-consumer',private:true,type:'module'})); +const manifest = JSON.parse(await readFile(path.join(packageRoot, 'package.json'), 'utf8')); +assert.deepEqual(manifest.dependencies, {orgchart:'6.0.0'}); +assert.equal(manifest.peerDependencies, undefined); +const consumerRequire = createRequire(path.join(consumer, 'package.json')); +for (const subpath of ['', '/style.css', '/engine.css', '/browser']) await readFile(consumerRequire.resolve(`@hm-design/org-chart${subpath}`)); +const module = await import(pathToFileURL(consumerRequire.resolve('@hm-design/org-chart')).href); +assert.equal(typeof module.createOrgChart, 'function'); +assert.equal(typeof module.JsonOrgChartDataSource, 'function'); +const fixture = JSON.parse(await readFile(new URL('data-v1.json', import.meta.url), 'utf8')); +assert.equal(module.validateOrgChartDataset(fixture).valid, true); +assert.equal(module.calculateSummary(fixture).raw.total, 4); +for (const file of ['index.js','orgchart.browser.js']) { + const bundle = await readFile(path.join(packageRoot, 'dist', file), 'utf8'); + assert.ok(!/\b(?:import|export)\s+[^;\n]*?from\s*['"](?!\.)/.test(bundle)); + assert.ok(!/\bimport\s*\(\s*['"](?!\.)/.test(bundle)); + assert.ok(!/from\s*['"]react(?:-dom)?['"]/.test(bundle)); +} +await writeFile(path.join(consumer, 'consumer.ts'), `import { createOrgChart, JsonOrgChartDataSource, type OrgChartDataset, type OrgChartDataSource } from '@hm-design/org-chart'; +declare const data: OrgChartDataset; +const source: OrgChartDataSource = new JsonOrgChartDataSource(data); +const handle = createOrgChart({dataSource:source,stylesheetUrls:{engine:'engine.css',core:'style.css'}}); +const stop = handle.subscribe(state=>{if(state.status==='ready') console.log(state.summary.raw.total);}); +stop(); handle.destroy();\n`); +await writeFile(path.join(consumer, 'tsconfig.json'), JSON.stringify({compilerOptions:{target:'ES2022',module:'NodeNext',moduleResolution:'NodeNext',lib:['ES2022','DOM'],strict:true,noEmit:true,types:[],skipLibCheck:false},include:['consumer.ts']})); +const require = createRequire(import.meta.url); +const tscManifest = require.resolve('typescript/package.json'); +const typescript = JSON.parse(await readFile(tscManifest, 'utf8')); +execFileSync(process.execPath, [path.resolve(path.dirname(tscManifest), typescript.bin.tsc), '-p', path.join(consumer,'tsconfig.json')], {stdio:'inherit'}); +const report = {status:'PASS',checks:['Tarball public ESM import without DOM','Public CSS/browser entries exist','Strict NodeNext public declarations without React types','No unresolved bare imports in browser/ESM bundles','Tarball validated fixture and summary','No React peer/runtime dependency'],consumer}; +await writeFile(path.join(consumer,'report.json'), JSON.stringify(report,null,2)); +console.log(JSON.stringify(report,null,2)); diff --git a/examples/org-chart/verify-quality-boundaries.mjs b/examples/org-chart/verify-quality-boundaries.mjs new file mode 100644 index 0000000..ba19aca --- /dev/null +++ b/examples/org-chart/verify-quality-boundaries.mjs @@ -0,0 +1,38 @@ +import { writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href); +const browser = await chromium.launch({ executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', headless: true }); +try { + const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); + await page.goto('http://127.0.0.1:6027/iframe.html?id=orgchart--full-composition&viewMode=story'); + await page.waitForFunction(() => document.querySelector('.hm-orgchart-host')?.shadowRoot?.querySelector('.hm-orgchart-toggle')); + const result = await page.evaluate(async () => { + const root = document.querySelector('.hm-orgchart-host').shadowRoot; + await document.fonts.ready; + const shell = root.querySelector('.hm-orgchart-shell'); + const read = (element, pseudo) => { + const css = getComputedStyle(element, pseudo); + return { background: css.backgroundColor, border: css.borderTopColor, borderWidth: css.borderTopWidth, outline: css.outlineColor, outlineWidth: css.outlineWidth, outlineStyle: css.outlineStyle, content: css.content }; + }; + const hierarchy = [...root.querySelectorAll('.hierarchy')].find(element => getComputedStyle(element, '::before').content !== 'none'); + const node = [...root.querySelectorAll('.node')].find(element => getComputedStyle(element, '::before').content !== 'none'); + const backgroundChain = []; + for (let element = root.querySelector('.hm-orgchart-engine'); element; element = element.parentElement ?? element.getRootNode()?.host) { + const css = getComputedStyle(element); + backgroundChain.push({ className: element.className, tag: element.tagName, background: css.backgroundColor, image: css.backgroundImage }); + } + return { canvas: getComputedStyle(shell).backgroundColor, viewport: read(root.querySelector('.hm-orgchart-viewport')), + backgroundChain, + hierarchy: hierarchy ? read(hierarchy, '::before') : null, node: node ? read(node, '::before') : null, + toggle: read(root.querySelector('.hm-orgchart-toggle')), resolved: Object.fromEntries(['stroke-default', 'stroke-input-focus', 'bg-content', 'bg-surface'].map(key => [key, getComputedStyle(shell).getPropertyValue('--hm-orgchart-resolved-' + key).trim()])) }; + }); + await page.keyboard.press('Tab'); + const focused = await page.evaluate(() => { + const root = document.querySelector('.hm-orgchart-host').shadowRoot; + const viewport = root.querySelector('.hm-orgchart-viewport'); viewport.focus(); + const css = getComputedStyle(viewport); + return { focusVisible: viewport.matches(':focus-visible'), outline: css.outlineColor, width: css.outlineWidth, style: css.outlineStyle }; + }); + await writeFile('test-results/org-chart-quality/boundaries.json', JSON.stringify({ ...result, focused, interpretation: 'Hierarchy connection lines convey parent-child relation; retain contrast REVIEW instead of automatically treating all lines as decorative. Button text identifies the control, frame decoration alone is not automatically SC 1.4.11 failure.' }, null, 2)); + console.log(JSON.stringify({ ...result, focused })); +} finally { await browser.close(); } diff --git a/examples/org-chart/verify-quality-p1.mjs b/examples/org-chart/verify-quality-p1.mjs new file mode 100644 index 0000000..08acb56 --- /dev/null +++ b/examples/org-chart/verify-quality-p1.mjs @@ -0,0 +1,183 @@ +import http from 'node:http'; +import path from 'node:path'; +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +// Quality-only verification. No data/source/lifecycle regression suite is run. +const root = fileURLToPath(new URL('../../', import.meta.url)); +const output = path.join(root, 'test-results/org-chart-quality'); +await mkdir(output, { recursive: true }); +const { chromium } = await import(process.env.ORGCHART_PLAYWRIGHT_MODULE ? pathToFileURL(process.env.ORGCHART_PLAYWRIGHT_MODULE).href : 'playwright'); +const results = [], errors = [], measurements = [], screenshots = []; +const check = (value, name, detail) => results.push({ name, status: value ? 'PASS' : 'FAIL', ...(detail === undefined ? {} : { detail }) }); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.json': 'application/json', '.png': 'image/png', '.ttf': 'font/ttf' }; +async function serve(directory) { + const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + const file = path.resolve(directory, '.' + decodeURIComponent(url.pathname === '/' ? '/index.html' : url.pathname)); + const relative = path.relative(directory, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) return response.writeHead(403).end(); + response.setHeader('Content-Type', mime[path.extname(file)] ?? 'application/octet-stream'); + response.end(await readFile(file)); + } catch { response.writeHead(404).end(); } + }); + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + return { server, origin: `http://127.0.0.1:${server.address().port}` }; +} +function captureErrors(page, label) { + page.on('pageerror', error => errors.push({ label, type: 'pageerror', message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ label, type: 'console', message: message.text() }); }); +} +async function ready(page) { + await page.waitForFunction(() => { + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host')?.shadowRoot; + return shadow?.querySelector('.hm-orgchart-shell') && [...shadow.querySelectorAll('link')].every(link => !!link.sheet) + && !shadow.querySelector('.hm-orgchart-state')?.textContent.includes('불러오는'); + }, undefined, { timeout: 20000 }); + await page.evaluate(async () => { + await document.fonts.ready; + const shadow = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host').shadowRoot; + await Promise.all([...shadow.querySelectorAll('.hm-orgchart-affiliation-mark img')].map(image => image.decode().catch(() => {}))); + await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve))); + }); +} +async function measure(page) { + return page.evaluate(() => { + const host = document.querySelector('.hm-orgchart-host, .hm-orgchart-component-host'); + const shadow = host.shadowRoot; + const rect = element => { + const box = element.getBoundingClientRect(); + return { x: box.x + scrollX, y: box.y + scrollY, width: box.width, height: box.height }; + }; + const ranges = element => { + const range = document.createRange(); range.selectNodeContents(element); + return [...range.getClientRects()].map(box => ({ x: box.x + scrollX, y: box.y + scrollY, width: box.width, height: box.height })); + }; + const dimensions = element => element ? { clientWidth: element.clientWidth, scrollWidth: element.scrollWidth, overflowX: getComputedStyle(element).overflowX } : null; + const visible = element => element.getBoundingClientRect().width > 0 && element.getBoundingClientRect().height > 0; + const text = [...shadow.querySelectorAll('.hm-orgchart-person-name, .hm-orgchart-person-role, .hm-orgchart-organization-name, .hm-orgchart-contrast-result, .hm-orgchart-affiliation-name')].filter(visible); + const textIssues = text.filter(element => element.scrollWidth > element.clientWidth + 1 || element.scrollHeight > element.clientHeight + 1).map(element => ({ className: element.className, text: element.textContent, box: rect(element) })); + const styles = element => { + const css = getComputedStyle(element); + return { color: css.color, background: css.backgroundColor, gradient: css.backgroundImage, font: css.fontFamily, fontSize: parseFloat(css.fontSize), fontWeight: css.fontWeight, border: css.borderTopColor, radius: css.borderRadius }; + }; + const backgroundFor = element => { + for (let current = element; current; current = current.parentElement) { + const css = getComputedStyle(current); + if (css.backgroundImage !== 'none') return { ...styles(current), box: rect(current) }; + if (css.backgroundColor !== 'rgba(0, 0, 0, 0)' && css.backgroundColor !== 'transparent') return { ...styles(current), box: rect(current) }; + } + return null; + }; + const selectors = '.hm-orgchart-organization-name, .hm-orgchart-hub, [data-contrast-target], .hm-orgchart-person-name, .hm-orgchart-person-role, .hm-orgchart-job-title, .hm-orgchart-status-label, .hm-orgchart-summary-title, .hm-orgchart-position-table th, .hm-orgchart-position-table td, .hm-orgchart-toggle'; + const colors = [...shadow.querySelectorAll(selectors)].filter(visible).map(element => ({ + className: element.className, organizationId: element.closest('[data-organization-id]')?.dataset.organizationId, + variant: element.closest('[data-group-variant]')?.dataset.groupVariant, + target: element.dataset.contrastTarget ?? null, + text: element.textContent.trim(), box: rect(element), ranges: ranges(element), ...styles(element), behind: backgroundFor(element), + clip: element.closest('.hm-orgchart-viewport, .hm-orgchart-summary-scroll') ? rect(element.closest('.hm-orgchart-viewport, .hm-orgchart-summary-scroll')) : null, + })); + const logos = [...shadow.querySelectorAll('.hm-orgchart-affiliation-mark')].map(mark => { + const image = mark.querySelector('img'); + return { id: mark.dataset.affiliationId, label: mark.getAttribute('aria-label'), box: rect(mark), + available: mark.dataset.logoAvailable, fallbackVisibility: getComputedStyle(mark.querySelector('.hm-orgchart-affiliation-fallback')).visibility, + loaded: !!image?.complete && image.naturalWidth > 0, naturalWidth: image?.naturalWidth, naturalHeight: image?.naturalHeight, + fit: image ? getComputedStyle(image).objectFit : null, imageBackground: image ? getComputedStyle(image).backgroundColor : null, + source: image?.src ?? null }; + }); + const cardStyles = [...shadow.querySelectorAll('.hm-orgchart-employee')].map(element => ({ id: element.dataset.employeeId, kind: element.dataset.cardKind, ...styles(element) })); + return { documentWidth: document.documentElement.scrollWidth, textIssues, viewport: dimensions(shadow.querySelector('.hm-orgchart-viewport')), + summary: dimensions(shadow.querySelector('.hm-orgchart-summary-scroll')), logos, colors, cardStyles, + rowResults: [...shadow.querySelectorAll('.hm-orgchart-contrast-result')].map(element => ({ text: element.textContent, ...element.dataset })), + policy: [...shadow.querySelectorAll('.hm-orgchart-policy')].map(element => element.textContent), + components: [...shadow.querySelectorAll('[data-component]')].map(element => element.dataset.component), + variables: [...shadow.querySelectorAll('[data-color-variable]')].map(element => ({ variable: element.dataset.colorVariable, property: element.dataset.cssProperty, computed: getComputedStyle(element).getPropertyValue(element.dataset.cssProperty), value: element.parentElement.querySelector('.hm-orgchart-color-value').textContent })), + navigation: shadow.querySelectorAll('nav, .hm-dashboard-header, .hm-gnb, .hm-lnb, [data-slot=sidebar]').length }; + }); +} +function compactSources(measurement) { + for (const logo of measurement.logos) { + logo.sha256 = logo.source?.startsWith('data:image/png;base64,') ? createHash('sha256').update(Buffer.from(logo.source.split(',')[1], 'base64')).digest('hex') : null; + delete logo.source; + } + return measurement; +} +let browser; +const servers = []; +try { + for (const directory of ['storybook-static', 'examples/org-chart/dist', 'examples/org-chart-react/dist']) servers.push(await serve(path.join(root, directory))); + browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME ?? 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); + const context = await browser.newContext({ viewport: { width: 1440, height: 1000 }, deviceScaleFactor: 1, reducedMotion: 'reduce' }); + const canonical = ['logo', 'department-colors', 'position-summary', 'affiliation-summary', 'full-composition']; + const index = JSON.parse(await readFile(path.join(root, 'storybook-static/index.json'), 'utf8')); + const menu = Object.values(index.entries).filter(entry => entry.type === 'story' && entry.title.startsWith('OrgChart') && !entry.tags?.includes('internal')).map(entry => entry.id).sort(); + check(JSON.stringify(menu) === JSON.stringify(canonical.map(name => `orgchart--${name}`).sort()), 'final build retains exactly five public OrgChart menu entries', menu); + const internal = Object.values(index.entries).filter(entry => entry.type === 'story' && entry.title === 'OrgChart/Content'); + check(internal.length === 8 && internal.every(entry => entry.tags.includes('internal')), 'original eight verification Stories remain tagged internal'); + const sourceHashes = new Map(); + for (const id of ['hanmac', 'saman', 'jangheon', 'jangheon-industry', 'ptc', 'halla', 'baron']) sourceHashes.set(id, createHash('sha256').update(await readFile(path.join(root, `packages/org-chart/src/assets/affiliations/${id}.png`))).digest('hex')); + for (const name of canonical) { + const page = await context.newPage(); captureErrors(page, name); + await page.goto(`${servers[0].origin}/iframe.html?id=orgchart--${name}&viewMode=story`); await ready(page); + if (name.endsWith('summary')) check(await page.locator('body').innerText().then(text => text.includes('가상') && text.includes('운영')), `${name}: independent Story identifies virtual headcounts`); + for (const width of name === 'full-composition' ? [390, 768, 1280, 1440] : [390, 1440]) { + await page.setViewportSize({ width, height: 1000 }); await ready(page); + const value = compactSources(await measure(page)); value.label = `storybook-${name}`; value.width = width; + measurements.push(value); + check(value.documentWidth <= width + 1 && value.textIssues.length === 0, `${name} ${width}px: changed content has no page overflow or clipped text`, value.textIssues); + check(value.navigation === 0, `${name} ${width}px: no page Navigation added`); + if (value.logos.length) check(value.logos.every(logo => logo.loaded && logo.fit === 'contain' && logo.naturalWidth === 473 && logo.naturalHeight === 473 && logo.sha256 === sourceHashes.get(logo.id) && logo.imageBackground === 'rgba(0, 0, 0, 0)' && logo.fallbackVisibility === 'hidden'), `${name} ${width}px: original transparent logos and ID mappings are preserved`); + const file = `${value.label}-${width}.png`; value.screenshot = file; + await page.screenshot({ path: path.join(output, file), fullPage: true }); screenshots.push(file); + } + if (name === 'department-colors') { + const value = measurements.at(-1); + check(value.variables.length === 30 && value.variables.every(item => item.value.includes('#')), 'Department Colors retains all six HEX and variable legends'); + check(value.rowResults.length >= 18 && value.rowResults.every(item => item.contrastStatus && !item.text.includes('NaN')), 'Department Colors exposes current and unapplied candidate contrast results', value.rowResults); + } + if (name === 'logo') { + const result = await page.evaluate(async () => { + const shadow = document.querySelector('.hm-orgchart-component-host').shadowRoot; + const mark = shadow.querySelector('.hm-orgchart-affiliation-mark'); + const image = mark.querySelector('img'); + const fallback = mark.querySelector('.hm-orgchart-affiliation-fallback'); + const before = { label: mark.getAttribute('aria-label'), visibility: getComputedStyle(fallback).visibility }; + image.dispatchEvent(new Event('error')); + return { before, after: { label: mark.getAttribute('aria-label'), visibility: getComputedStyle(fallback).visibility, available: mark.dataset.logoAvailable, text: fallback.textContent, imageRemoved: !mark.querySelector('img') } }; + }); + check(result.before.visibility === 'hidden' && result.after.visibility === 'visible' && result.after.available === 'false' && result.after.text && result.after.imageRemoved && result.after.label === result.before.label, 'transparent logo change retains text fallback and accessible company name on error', result); + } + await page.close(); + } + for (const [transport, server] of [['html', servers[1]], ['react', servers[2]]]) { + const page = await context.newPage(); captureErrors(page, transport); + await page.goto(`${server.origin}/p1.html`); await ready(page); + for (const width of [390, 768, 1280, 1440]) { + await page.setViewportSize({ width, height: 1000 }); await ready(page); + const value = compactSources(await measure(page)); value.label = transport; value.width = width; measurements.push(value); + check(value.documentWidth <= width + 1 && value.textIssues.length === 0 && value.navigation === 0, `${transport} ${width}px: logo style change preserves layout and text`); + check(value.logos.every(logo => logo.loaded && logo.fit === 'contain' && logo.imageBackground === 'rgba(0, 0, 0, 0)' && logo.fallbackVisibility === 'hidden'), `${transport} ${width}px: transparent logo layer applied inside Shadow DOM`); + const file = `${transport}-${width}.png`; value.screenshot = file; + await page.screenshot({ path: path.join(output, file), fullPage: true }); screenshots.push(file); + } + await page.close(); + } + for (const width of [390, 768, 1280, 1440]) { + const html = measurements.find(item => item.label === 'html' && item.width === width); + const react = measurements.find(item => item.label === 'react' && item.width === width); + check(JSON.stringify(html.cardStyles) === JSON.stringify(react.cardStyles) && JSON.stringify(html.logos.map(logo => [logo.id, logo.sha256, logo.fit, logo.imageBackground])) === JSON.stringify(react.logos.map(logo => [logo.id, logo.sha256, logo.fit, logo.imageBackground])), `${width}px: HTML and React retain identical Core card colors and logo rendering`); + } + check(errors.length === 0, 'changed five Stories and theme-free HTML/React emit no console/runtime errors', errors); +} catch (error) { results.push({ name: 'quality harness completion', status: 'FAIL', detail: error.stack }); } +finally { + await writeFile(path.join(output, 'browser.json'), JSON.stringify({ browser: browser?.version() ?? null, results, errors, measurements, screenshots, + reused: ['Core22/22', 'HTML69/69', 'React79/79', 'P1 selector7/7', 'P1 successful196 plus console/menu4/4'], + limits: ['No data/lifecycle regression suites repeated', 'Contrast model and pixel samples are reported separately; no all-screen WCAG certification'] }, null, 2)); + if (browser) await browser.close(); + for (const { server } of servers) await new Promise(resolve => server.close(resolve)); + const failed = results.filter(result => result.status === 'FAIL'); + if (failed.length) process.exitCode = 1; + console.log(JSON.stringify({ passed: results.filter(result => result.status === 'PASS').length, failed, report: path.join(output, 'browser.json') }, null, 2)); +} diff --git a/examples/org-chart/verify.mjs b/examples/org-chart/verify.mjs new file mode 100644 index 0000000..5ef3330 --- /dev/null +++ b/examples/org-chart/verify.mjs @@ -0,0 +1,218 @@ +import assert from 'node:assert/strict'; +import http from 'node:http'; +import { readFile, mkdir, writeFile } from 'node:fs/promises'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import path from 'node:path'; + +// Browser tooling belongs to the verification environment, not the production package. +const playwright = process.env.ORGCHART_PLAYWRIGHT_MODULE; +const { chromium } = await import(playwright ? pathToFileURL(playwright).href : 'playwright'); +const example = fileURLToPath(new URL('./dist/', import.meta.url)); +const output = fileURLToPath(new URL('../../test-results/org-chart-browser/', import.meta.url)); +await mkdir(output, { recursive: true }); +const mime = { '.html': 'text/html', '.js': 'text/javascript', '.json': 'application/json', '.css': 'text/css', '.ttf': 'font/ttf' }; +const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://localhost'); + const file = path.resolve(example, '.' + decodeURIComponent(url.pathname)); + const relative = path.relative(example, file); + if (relative.startsWith('..') || path.isAbsolute(relative)) { response.writeHead(403).end(); return; } + const data = await readFile(file); + response.setHeader('Content-Type', mime[path.extname(file)] || 'application/octet-stream'); + response.end(data); + } catch { response.writeHead(404).end(); } +}); +await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); +const origin = `http://127.0.0.1:${server.address().port}`; +const browser = await chromium.launch({ executablePath: process.env.ORGCHART_CHROME || 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', headless: true }); +const results = [], errors = [], metrics = []; +const check = (condition, name, detail) => { results.push({ name, status: condition ? 'PASS' : 'FAIL', detail }); assert.ok(condition, `${name}: ${JSON.stringify(detail)}`); }; +try { + const context = await browser.newContext({ viewport: { width: 1440, height: 980 } }); + await context.addInitScript(() => { + const NativeObserver = window.MutationObserver; + const activeObservers = new Map(); + window.MutationObserver = class extends NativeObserver { + observe(...args) { activeObservers.set(this, args[0]); return super.observe(...args); } + disconnect() { activeObservers.delete(this); return super.disconnect(); } + }; + const nativeAdd = EventTarget.prototype.addEventListener; + const nativeRemove = EventTarget.prototype.removeEventListener; + const listeners = []; + const capture = options => typeof options === 'boolean' ? options : !!options?.capture; + EventTarget.prototype.addEventListener = function(type, callback, options) { + if ((this === window || this === document) && callback && !listeners.some(item => item.target === this && item.type === type && item.callback === callback && item.capture === capture(options))) { + const item = { target: this, type, callback, capture: capture(options) }; + listeners.push(item); + options?.signal?.addEventListener('abort', () => { const i = listeners.indexOf(item); if (i >= 0) listeners.splice(i, 1); }, { once: true }); + } + return nativeAdd.call(this, type, callback, options); + }; + EventTarget.prototype.removeEventListener = function(type, callback, options) { + const index = listeners.findIndex(item => item.target === this && item.type === type && item.callback === callback && item.capture === capture(options)); + if (index >= 0) listeners.splice(index, 1); + return nativeRemove.call(this, type, callback, options); + }; + window.orgChartResources = () => ({ + observers: activeObservers.size, + chartObservers: [...activeObservers.values()].filter(target=>target.getRootNode()?.host?.classList.contains('hm-orgchart-host')).length, + globalListeners: listeners.map(item => `${item.target === document ? 'document' : 'window'}:${item.type}`).sort(), + }); + }); + for (const [transport, url] of [['http-esm', `${origin}/index.html`], ['file-classic', pathToFileURL(path.join(example, 'classic.html')).href]]) { + const page = await context.newPage(); + page.on('pageerror', error => errors.push({ transport, type: 'pageerror', message: error.message })); + page.on('console', message => { if (message.type() === 'error') errors.push({ transport, type: 'console', message: message.text() }); }); + await page.goto(url); + await page.waitForFunction(() => window.orgChartReady); + const state = await page.evaluate(() => { + const root = window.OrgChartDemo.container.firstElementChild.shadowRoot; + return { state: window.OrgChartDemo.chart.getState(), nodes: root.querySelectorAll('.node').length, + topLeaders: [...root.querySelectorAll('.hm-orgchart-top-leaders [data-employee-id]')].map(card => card.dataset.employeeId), + shownEmployees: [...root.querySelectorAll('.hm-orgchart-top-leaders [data-employee-id], .hm-orgchart-forest [data-employee-id]')].map(card => card.dataset.employeeId).sort() }; + }); + await page.screenshot({path:path.join(output, `${transport}-initial.png`),fullPage:true}); + check(state.state.status === 'ready', `${transport}: initial ready state`, state); + // Composition contract: a root whose only direct employee is its leader shows that + // leader as the standalone top card, and its child organizations become the engine roots. + check(state.nodes === 2 && state.topLeaders.join() === 'emp-a' && state.shownEmployees.join() === 'emp-a,emp-b,emp-c,emp-d' && state.state.summary.raw.total === 4, `${transport}: mount + JSON + custom nodes`, state); + check(state.state.aggregation.status === 'unavailable', `${transport}: no hidden business policy`); + const baseline = await page.evaluate(() => window.orgChartResources()); + + for (const width of [1440, 1280, 768, 390]) { + await page.setViewportSize({ width, height: 980 }); + await page.evaluate(() => document.fonts.ready); + const measurement = await page.evaluate(() => { + const root = window.OrgChartDemo.container.firstElementChild.shadowRoot; + const node = root.querySelector('.hm-orgchart-organization'); + const style = getComputedStyle(node); + const host = window.OrgChartDemo.container; + const viewport = root.querySelector('.hm-orgchart-viewport'); + return { + document: { width: document.documentElement.clientWidth, scrollWidth: document.documentElement.scrollWidth, height: document.documentElement.clientHeight, scrollHeight: document.documentElement.scrollHeight }, + host: { width: host.clientWidth, scrollWidth: host.scrollWidth, height: host.clientHeight, scrollHeight: host.scrollHeight }, + viewport: viewport && { width: viewport.clientWidth, scrollWidth: viewport.scrollWidth, height: viewport.clientHeight, scrollHeight: viewport.scrollHeight, overflowX: getComputedStyle(viewport).overflowX }, + color: style.color, background: style.backgroundColor, font: style.fontFamily, radius: style.borderRadius, + themeColor: getComputedStyle(host).getPropertyValue('--hm-sem-fg-primary').trim(), + themeBackground: getComputedStyle(host).getPropertyValue('--hm-sem-bg-surface').trim(), + themeRadius: getComputedStyle(host).getPropertyValue('--hm-radius-container').trim(), + idWhiteSpace: getComputedStyle(root.querySelector('.hm-orgchart-domain-id')).whiteSpace, + fontLoaded: document.fonts.check('13px "Noto Sans KR"'), + connectorColor: getComputedStyle([...root.querySelectorAll('.node')][1], '::before').backgroundColor, + borderColor: getComputedStyle(viewport).borderTopColor, + parentCenter: (()=>{const n=root.querySelector('.node').getBoundingClientRect();return n.x+n.width/2;})(), + childCenters: [...root.querySelectorAll('.node')].slice(1).map(element=>{const n=element.getBoundingClientRect();return n.x+n.width/2;}), + }; + }); + metrics.push({ transport, width, ...measurement }); + check(measurement.document.scrollWidth <= width, `${transport}: ${width}px document overflow`, measurement); + check(measurement.themeColor && measurement.background !== 'rgba(0, 0, 0, 0)' && measurement.font.includes('Noto Sans KR') && measurement.fontLoaded, `${transport}: ${width}px HM theme + font`, measurement); + check(measurement.idWhiteSpace === 'nowrap', `${transport}: ${width}px one-line organization IDs`); + check(measurement.connectorColor === measurement.borderColor && Math.abs(measurement.parentCenter - (measurement.childCenters[0]+measurement.childCenters[1])/2)<2, `${transport}: ${width}px themed + aligned hierarchy connectors`, measurement); + await page.screenshot({ path: path.join(output, `${transport}-${width}.png`), fullPage: true }); + } + // Shadow DOM buttons have native keyboard activation and retain focus on collapse. + const toggle = page.locator('.hm-orgchart-toggle').first(); + await toggle.focus(); + await toggle.press('Enter'); + await page.waitForFunction(() => !window.OrgChartDemo.container.firstElementChild.shadowRoot.querySelector('.sliding')); + check(await toggle.getAttribute('aria-expanded') === 'false', `${transport}: keyboard collapse`); + check(await toggle.evaluate(element => element.getRootNode().activeElement === element), `${transport}: collapse focus retained`); + await toggle.press('Space'); + await page.waitForFunction(() => !window.OrgChartDemo.container.firstElementChild.shadowRoot.querySelector('.sliding')); + check(await toggle.getAttribute('aria-expanded') === 'true', `${transport}: keyboard expand`); + await toggle.focus(); + await page.evaluate(() => window.OrgChartDemo.update()); + check(await page.evaluate(() => { + const root = window.OrgChartDemo.container.firstElementChild.shadowRoot; + return root.activeElement?.classList.contains('hm-orgchart-viewport'); + }), `${transport}: focus returns to viewport after regeneration`); + const updated = await page.evaluate(() => window.OrgChartDemo.chart.getState()); + check(updated.status === 'ready' && updated.summary.raw.total === 5 && updated.summary.raw.byOrganization['team-a'].direct === 1 && updated.summary.raw.byOrganization['team-b'].direct === 3, `${transport}: update + movement + add + recalculated counts`, updated); + await page.evaluate(() => window.OrgChartDemo.chart.reload()); + check(await page.evaluate(() => window.OrgChartDemo.chart.getState().summary.raw.total) === 4, `${transport}: reload source remains initial`); + await page.evaluate(async () => { + const demo = window.OrgChartDemo; + const data = structuredClone(await demo.source().load()); + data.organizations.push({id:'depth-three',parentId:'team-a',name:'가상 하위 셀',type:'cell',leaderId:null,displayOrder:0}); + await demo.chart.update(data); + }); + const rootToggle = page.locator('.hm-orgchart-toggle').first(); + await rootToggle.click(); + await page.waitForFunction(() => !window.OrgChartDemo.container.firstElementChild.shadowRoot.querySelector('.sliding')); + await rootToggle.click(); + await page.waitForFunction(() => !window.OrgChartDemo.container.firstElementChild.shadowRoot.querySelector('.sliding')); + const nested = await page.evaluate(() => { + const root = window.OrgChartDemo.container.firstElementChild.shadowRoot; + const node = [...root.querySelectorAll('.node')].find(node=>node.dataset.organizationId==='team-a'); + const grandchild = [...root.querySelectorAll('.node')].find(node=>node.dataset.organizationId==='depth-three'); + return {expanded:node.querySelector('.hm-orgchart-toggle').getAttribute('aria-expanded'),visible:grandchild.getBoundingClientRect().height > 0 && !grandchild.closest('.isCollapsedDescendant')}; + }); + check((nested.expanded === 'true') === nested.visible, `${transport}: depth-three descendant toggle matches visibility`, nested); + await page.evaluate(() => window.OrgChartDemo.chart.reload()); + const lifecycle = await page.evaluate(async () => { + const { api, chart, source, stylesheetUrls, container } = window.OrgChartDemo; + const initial = await source().load(); + const changed = structuredClone(initial); changed.metadata.dataVersion = 'newest'; changed.employees.pop(); + let resolveOld, oldSignal; + const oldSource = { load({signal}) { oldSignal = signal; return new Promise(resolve => { resolveOld = resolve; }); } }; + const pending = chart.reload(oldSource); + await chart.update(changed); + changed.employees.length = 0; + resolveOld(initial); await pending; + const race = { version: chart.getState().dataVersion, total: chart.getState().summary.raw.total, aborted: oldSignal.aborted }; + await chart.reload({load: async () => { throw new Error('private server detail'); }}); + const sourceError = chart.getState(); + const invalid = structuredClone(initial); invalid.organizations[0].name = ''; + await chart.update(invalid); + const validationError = chart.getState(); + await chart.reload(source()); + const sibling = document.createElement('p'); sibling.textContent = 'host sibling'; container.append(sibling); + const secondHost = document.createElement('div'); secondHost.setAttribute('data-hm-theme', ''); + secondHost.style.setProperty('--hm-sem-fg-primary', getComputedStyle(container).getPropertyValue('--hm-sem-fg-secondary')); + secondHost.style.setProperty('--hm-radius-container', '0px'); container.after(secondHost); + const second = api.createOrgChart({container:secondHost, dataSource:source(), stylesheetUrls}); await second.mount(); + const firstRoot = container.firstElementChild.shadowRoot, secondRoot = secondHost.firstElementChild.shadowRoot; + const firstIds = [...firstRoot.querySelectorAll('[id]')].map(element => element.id); + const secondIds = [...secondRoot.querySelectorAll('[id]')].map(element => element.id); + const scopes = { distinctIds: !firstIds.some(id => secondIds.includes(id)), firstColor:getComputedStyle(firstRoot.querySelector('.hm-orgchart-organization')).color, secondColor:getComputedStyle(secondRoot.querySelector('.hm-orgchart-organization')).color, secondRadius:getComputedStyle(secondRoot.querySelector('.hm-orgchart-organization')).borderRadius }; + chart.destroy(); chart.destroy(); + const destroy = { remaining:container.children.length, siblingPreserved:sibling.isConnected, secondReady:second.getState().status === 'ready' }; + second.destroy(); secondHost.remove(); sibling.remove(); + for (let i = 0; i < 5; i++) { const next = api.createOrgChart({container, dataSource:source(), stylesheetUrls}); await next.mount(); await next.reload(); next.destroy(); } + const resources = window.orgChartResources(); + const reentrantHost = document.createElement('div'); container.after(reentrantHost); + let reentrant; + reentrant = api.createOrgChart({container:reentrantHost,stylesheetUrls,dataSource:source(),onStateChange(state){if(state.status==='loading')reentrant.destroy();}}); + await reentrant.mount(); + const reentrantDestroy = reentrantHost.children.length===0 && reentrant.getState().status==='destroyed'; reentrantHost.remove(); + const pendingHost = document.createElement('div'); container.after(pendingHost); + let resolvePending, signalPending, callbackCount = 0; + const destroyed = api.createOrgChart({container:pendingHost,stylesheetUrls,dataSource:{load({signal}){signalPending=signal;return new Promise(resolve=>{resolvePending=resolve;});}},onStateChange(){callbackCount++;}}); + const mounting = destroyed.mount(); + // Allow stylesheet loading before the source is entered. + while (!resolvePending) await new Promise(resolve=>setTimeout(resolve,0)); + destroyed.destroy(); const atDestroy = callbackCount; resolvePending(initial); await mounting; + const late = {children:pendingHost.children.length,aborted:signalPending.aborted,callbacksAfterDestroy:callbackCount-atDestroy}; pendingHost.remove(); + await window.OrgChartDemo.create(); + return {race,sourceError,validationError,scopes,destroy,resources,late,reentrantDestroy}; + }); + check(lifecycle.race.version === 'newest' && lifecycle.race.total === 3 && lifecycle.race.aborted, `${transport}: stale response aborted + immutable update`, lifecycle.race); + check(lifecycle.sourceError.status === 'error' && !JSON.stringify(lifecycle.sourceError).includes('private server detail'), `${transport}: sanitized loading failure`, lifecycle.sourceError); + check(lifecycle.validationError.status === 'error' && lifecycle.validationError.issues.some(issue=>issue.code==='UNSAFE_INPUT'), `${transport}: validation blocks engine payload`, lifecycle.validationError); + check(lifecycle.scopes.distinctIds && lifecycle.scopes.firstColor !== lifecycle.scopes.secondColor && lifecycle.scopes.secondRadius === '0px', `${transport}: multiple instances + scoped theme`, lifecycle.scopes); + check(lifecycle.destroy.remaining === 1 && lifecycle.destroy.siblingPreserved && lifecycle.destroy.secondReady, `${transport}: destroy preserves host sibling + other instance`, lifecycle.destroy); + check(lifecycle.resources.chartObservers === 0 && lifecycle.resources.observers === baseline.observers && JSON.stringify(lifecycle.resources.globalListeners) === JSON.stringify(baseline.globalListeners), `${transport}: repeated lifecycle resource stability`, { baseline, after:lifecycle.resources }); + check(lifecycle.late.children === 0 && lifecycle.late.aborted && lifecycle.late.callbacksAfterDestroy === 0, `${transport}: destroy suppresses late callback`, lifecycle.late); + check(lifecycle.reentrantDestroy, `${transport}: reentrant loading callback destroy`); + await page.close(); + } + check(errors.length === 0, 'No browser runtime/console errors', errors); +} catch (error) { + results.push({ name: 'Harness completion', status: 'FAIL', detail: error.stack }); + process.exitCode = 1; +} finally { + await writeFile(path.join(output, 'report.json'), JSON.stringify({ browser:browser.version(), results, errors, metrics, limits:['Full heap/GC recovery not verified','Screen reader announcement not verified','No visual reference supplied','Advanced responsive layout out of scope'] }, null, 2)); + await browser.close(); await new Promise(resolve => server.close(resolve)); +} +console.log(JSON.stringify({ passed:results.filter(row=>row.status==='PASS').length, failed:results.filter(row=>row.status==='FAIL'), report:path.join(output,'report.json') }, null, 2)); diff --git a/package-lock.json b/package-lock.json index b452687..acf9d44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,8 @@ ], "dependencies": { "@hm-design/center-graphic": "*", + "@hm-design/org-chart": "*", + "@hm-design/org-chart-react": "*", "@hm-design/ui": "*", "lucide-react": "^1.49.0", "react": "19.3.0", @@ -436,7 +438,6 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1209,6 +1210,14 @@ "resolved": "packages/center-graphic", "link": true }, + "node_modules/@hm-design/org-chart": { + "resolved": "packages/org-chart", + "link": true + }, + "node_modules/@hm-design/org-chart-react": { + "resolved": "packages/org-chart-react", + "link": true + }, "node_modules/@hm-design/ui": { "resolved": "packages/ui", "link": true @@ -4625,6 +4634,19 @@ "undici-types": "~7.14.0" } }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", + "license": "MIT" + }, + "node_modules/@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/react": { "version": "19.3.0", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", @@ -4652,6 +4674,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/validate-npm-package-name": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/validate-npm-package-name/-/validate-npm-package-name-4.0.2.tgz", @@ -5248,6 +5277,15 @@ "node": "18 || 20 || >=22" } }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.11.27", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.27.tgz", @@ -5448,6 +5486,26 @@ ], "license": "CC-BY-4.0" }, + "node_modules/canvg": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", + "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "rgbcolor": "^1.0.1", + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/chai": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", @@ -5697,6 +5755,21 @@ "node": ">=6.6.0" } }, + "node_modules/core-js": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", @@ -5780,6 +5853,15 @@ "node": ">= 8" } }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -5995,6 +6077,16 @@ "dev": true, "license": "MIT" }, + "node_modules/dompurify": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.16.tgz", + "integrity": "sha512-sqo+pNp3qRhCIpbgRi1y8Tgk27Bo2Ry7w0dC1NBeNTdZChWjz9Xb/KOoZbRP/R6pQZ80Qw8YhXw13hWWBbMRnQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -6427,6 +6519,17 @@ "node": ">=8.6.0" } }, + "node_modules/fast-png": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", + "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", + "license": "MIT", + "dependencies": { + "@types/pako": "^2.0.3", + "iobuffer": "^5.3.2", + "pako": "^2.1.0" + } + }, "node_modules/fast-uri": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", @@ -6472,6 +6575,12 @@ } } }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "license": "MIT" + }, "node_modules/figures": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", @@ -6791,6 +6900,19 @@ "node": ">=16.9.0" } }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -6883,6 +7005,12 @@ "dev": true, "license": "ISC" }, + "node_modules/iobuffer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", + "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", + "license": "MIT" + }, "node_modules/ip-address": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.3.tgz", @@ -7178,6 +7306,12 @@ "node": ">=6" } }, + "node_modules/json-digger": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/json-digger/-/json-digger-2.0.2.tgz", + "integrity": "sha512-d8Zq9WXlhfkzlDTgSa5B5C/pmR+NVaUVNtBm3tFVQhwAnlBn8AdNGj5fS7DuD61lA9Enn+Fq1sADYg1vCVXDXw==", + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -7232,6 +7366,23 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jspdf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz", + "integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-png": "^6.2.0", + "fflate": "^0.8.1" + }, + "optionalDependencies": { + "canvg": "^3.0.11", + "core-js": "^3.6.0", + "dompurify": "^3.3.1", + "html2canvas": "^1.0.0-rc.5" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -8034,6 +8185,17 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/orgchart": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/orgchart/-/orgchart-6.0.0.tgz", + "integrity": "sha512-ykRCXH3gnOB4Y80RN/ifEviZvFj1AMFSmTgTlPeLzcP1aNIUQcq+GyyO1j65hDIpkpSOhl1hIyC+7GrHIdcxmg==", + "license": "MIT", + "dependencies": { + "html2canvas": "^1.4.1", + "json-digger": "^2.0.2", + "jspdf": "^4.2.1" + } + }, "node_modules/oxc-parser": { "version": "0.127.0", "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.127.0.tgz", @@ -8142,6 +8304,22 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8269,6 +8447,13 @@ "node": ">= 14.16" } }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT", + "optional": true + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8556,6 +8741,16 @@ } } }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "optional": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, "node_modules/range-parser": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", @@ -8795,6 +8990,13 @@ "node": ">=8" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT", + "optional": true + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -8881,6 +9083,16 @@ "node": ">=0.10.0" } }, + "node_modules/rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", + "optional": true, + "engines": { + "node": ">= 0.8.15" + } + }, "node_modules/rolldown": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.12.tgz", @@ -9337,6 +9549,16 @@ "node": ">=0.10.0" } }, + "node_modules/stackblur-canvas": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -9562,6 +9784,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/systeminformation": { "version": "5.33.15", "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.15.tgz", @@ -9609,6 +9841,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -9948,6 +10189,15 @@ "dev": true, "license": "MIT" }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", @@ -10445,6 +10695,23 @@ "react-dom": "^19.0.0" } }, + "packages/org-chart": { + "name": "@hm-design/org-chart", + "version": "0.1.0", + "dependencies": { + "orgchart": "6.0.0" + } + }, + "packages/org-chart-react": { + "name": "@hm-design/org-chart-react", + "version": "0.1.0", + "dependencies": { + "@hm-design/org-chart": "0.1.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, "packages/ui": { "name": "@hm-design/ui", "version": "0.1.0", diff --git a/package.json b/package.json index 55b0fd4..7bc53ca 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,22 @@ "typecheck": "tsc -b && npm run typecheck --workspaces --if-present", "build:ui": "npm run build -w @hm-design/ui", "build:center-graphic": "npm run build -w @hm-design/center-graphic", + "build:org-chart": "npm run build -w @hm-design/org-chart", + "typecheck:org-chart": "npm run typecheck -w @hm-design/org-chart", + "test:org-chart": "npm run test -w @hm-design/org-chart", + "build:org-chart-example": "npm run build:org-chart && node examples/org-chart/prepare.mjs", + "dev:org-chart-example": "node examples/org-chart/serve.mjs", + "test:org-chart-browser": "node examples/org-chart/verify.mjs", + "build:org-chart-react": "npm run build -w @hm-design/org-chart-react", + "typecheck:org-chart-react": "npm run typecheck -w @hm-design/org-chart-react", + "build:org-chart-react-example": "vite build --config examples/org-chart-react/vite.config.ts", + "dev:org-chart-react-example": "vite --config examples/org-chart-react/vite.config.ts", + "test:org-chart-react-browser": "node examples/org-chart-react/verify.mjs", "build:packages": "npm run build --workspaces --if-present" }, "dependencies": { + "@hm-design/org-chart": "*", + "@hm-design/org-chart-react": "*", "@hm-design/center-graphic": "*", "@hm-design/ui": "*", "lucide-react": "^1.49.0", diff --git a/packages/org-chart-react/README.md b/packages/org-chart-react/README.md new file mode 100644 index 0000000..0767fef --- /dev/null +++ b/packages/org-chart-react/README.md @@ -0,0 +1,95 @@ +# @hm-design/org-chart-react v0.1 + +React 19 lifecycle adapter for `@hm-design/org-chart@0.1.0`. The wrapper renders one empty host container and delegates all organization DOM, engine work, validation, summaries, interactions and Shadow DOM styles to the existing Vanilla Core. It has no navigation, page layout, fetch client or separate node design. + +## Usage + +```tsx +import { useMemo } from 'react'; +import { JsonOrgChartDataSource } from '@hm-design/org-chart'; +import { OrgChart } from '@hm-design/org-chart-react'; +import type { OrgChartDataset, OrgChartState } from '@hm-design/org-chart-react'; +import engineCssUrl from '@hm-design/org-chart/engine.css?url'; +import coreCssUrl from '@hm-design/org-chart/style.css?url'; +// Core P1 supplies standalone OrgChart design; no HM Theme/font import needed. + +const stylesheetUrls = { engine: engineCssUrl, core: coreCssUrl }; + +export function OrganizationContent({ data }: { data: OrgChartDataset }) { + const dataSource = useMemo(() => new JsonOrgChartDataSource(data), [data]); + const onStateChange = (state: OrgChartState) => { + // Data/source/validation/style failures are state.status === 'error'. + // A ready state contains the Core's shared summary and dataVersion. + void state; + }; + return ( + { console.error('OrgChart lifecycle failed', error); }} + /> + ); +} +``` + +The `?url` imports above are Vite asset imports, not a universal browser feature. Other hosts resolve the two Core public CSS entries to actual deployment URLs. Importing CSS only into the document does not style the Core's Shadow DOM. Engine CSS is linked first, then standalone Core CSS. P1 owns its colors, typography and geometry without depending on HM Theme. Set public `--hm-orgchart-*` properties on the wrapper container to override only this instance. No HM common variables are redefined. The wrapper does not depend on `@hm-design/ui`; P3 adds lookup Props without replacing the Core renderer. For independent Tree/Summary integration, use the [Core factories](../../docs/org-chart/standalone-components-p1.md) in a ref/effect without copying their UI. + +## Public API + +Named runtime export: `OrgChart`. Type exports: `OrgChartProps` and the Core's public types, reexported as types only. Runtime helpers such as `JsonOrgChartDataSource` remain available from `@hm-design/org-chart`. + +`OrgChartProps` reuses `Omit`: + +- Required `dataSource`: the same Core `OrgChartDataSource` interface, `load(options?: { signal?: AbortSignal }): Promise`. +- Required `stylesheetUrls`: `{ engine: string; core: string }`, the exact Core asset contract. +- Optional `displayMode`: `'interactive'` (default) or `'readOnly'`, passed to the Core composition. Changing it recreates the Core handle. +- Optional `organizationLinks`: existing organization-ID-to-URL map, applied only to original 1Depth titles. Missing/blank values retain plain titles. Core validates HTTP(S)/relative URLs and rejects invalid URLs, other schemes and credentials. Treat the map as immutable and memoize it; a new map recreates the handle. +- Optional `onEmployeeClick(employee, context)`: host-owned information UI, replacing the Core's built-in popup. `context` contains the existing `organization`, `affiliation`, focusable `trigger` card and `originalEvent`. It works in both modes and receives untouched Employee data. +- Optional `aggregationPolicy`: the Core's `ApprovedAggregationPolicy`. +- Optional `className` and `style`: applied only to React's outer container. +- Optional `onStateChange(state: OrgChartState)`: latest committed callback receives actual Core state changes. +- Optional `onLifecycleError(error: unknown)`: reports unexpected Core creation or rejected mount/reload calls and unexpected cleanup errors. Controlled data, source, validation, rendering and stylesheet failures use the Core's `error` state instead. + +The container is owned by React; its dedicated children are owned by Core. There are no React children, imperative handle, title, employee or engine manipulation Props. Titles, descriptions, presentation groups, organization order and metadata use the common data contract. An omitted lifecycle error callback leaves unexpected operation errors handled but does not produce a second error UI or console log. Consumer state callback errors follow the Core's isolation behavior; lifecycle error callback exceptions are also contained. + +Without `onEmployeeClick`, all employee cards open the same Core read-only information dialog on click, Enter or Space. It uses only existing employee/organization/affiliation fields and omits missing values. readOnly names match the displayed `홍 길 동` card while source data remains unchanged. The native modal sits outside the scaled Stage and supports Close, ESC, focus trapping and return to the card. Group-link events remain separate; a visible name tooltip closes before popup activation. A custom callback owns its popup's accessibility and cleanup. + +```tsx + openEmployeeInformation(employee, context)} +/> +``` + +Both map and popup function above are supplied by the host; no real destination URL or employee information is embedded in the package. Omit the callback for the default popup. + +## Lifecycle and updates + +Mount creates one new Core handle, subscribes to its state and calls `mount(container)`. Mount already loads the source; the wrapper does not perform an additional initial reload. The wrapper does not synthesize `idle`, `destroyed` or `empty` callbacks. Current Core emits `loading`, then `ready`/`error`; employees `[]` is ready, organizations `[]` is error. An `empty` type member does not establish a supported Empty State. + +A new `dataSource` object triggers the existing handle's `reload(nextSource)`. This starts Core's latest revision and aborts or ignores older responses. Updating fields inside the same source object is not a reload signal. `JsonOrgChartDataSource` captures inline input at its construction; create a new source for a new immutable snapshot. Memoize sources rather than constructing one on every render. + +Changing callback identity updates the latest committed callback without reload or recreation. Adding/removing `onEmployeeClick` switches built-in/custom popup ownership and recreates the handle. Abandoned concurrent renders do not update callbacks. Policy or `organizationLinks` identity changes, displayMode changes, or either stylesheet URL string value changes dispose the previous handle and create a new one because the Core offers no configuration setter. Replacing the stylesheet URL object with the same two strings does not recreate. Treat policy and link-map objects as immutable and memoize them; changing an object internally is not a configuration update signal. + +Cleanup invalidates the wrapper generation, unsubscribes, calls Core's terminal `destroy()` and clears its handle reference. React Strict Mode's setup → cleanup → setup uses a fresh handle. Old generations cannot deliver state/lifecycle callbacks to the new instance; superseded operation rejection handlers are also ignored. Cleanup runs before replacement, leaving at most one active Core per wrapper container. The wrapper does not repeat engine disposal or DOM removal itself. + +Core regeneration resets expansion/scroll state according to the existing Core contract. Source errors can recover by replacing the source; Core validation/summary/node behavior remains identical to Vanilla. Invalid runtime Props that prevent Core construction are lifecycle usage errors: fix them and remount the component (for example by changing its React key). No rendered fallback silently replaces an invalid configuration. + +Committed callback publication, Core ownership and source updates use layout effects in that order. Cleanup/reload runs synchronously with React commit, so a pending old response cannot notify in a gap before passive cleanup. Server rendering produces only the outer container; SSR/hydration remains outside the verified scope. + +## Package boundary and verification limits + +The build emits ESM `dist/index.js` plus TypeScript declarations, preserves the `"use client"` boundary and leaves React (including `react/jsx-runtime`) and `@hm-design/org-chart` external. React is a `^19.0.0` peer, matching the repository's existing React package convention; Core `0.1.0` is a runtime dependency. React DOM is supplied by the consuming app and is not imported by this package. Core must be built before wrapper typecheck/build in this workspace because dependency resolution uses its public declarations. + +From the repository root: + +```sh +npm run typecheck --workspace @hm-design/org-chart-react +npm run build --workspace @hm-design/org-chart-react +``` + +Storybook is one React host, not proof of every consumer deployment. This adapter does not add pan/zoom, advanced mobile reflow, additional relation overlays or reserved Core presentation sections. SSR/hydration, full screen reader behavior, complete heap/GC recovery, Theme-less rendering, Workdesk reference visual approval and production consumers require their own evidence. Public ESM import without a DOM does not establish SSR/hydration support. Consult the final integration report for the actual typecheck/build/browser/consumer results. diff --git a/packages/org-chart-react/build.mjs b/packages/org-chart-react/build.mjs new file mode 100644 index 0000000..2f51571 --- /dev/null +++ b/packages/org-chart-react/build.mjs @@ -0,0 +1,41 @@ +import { build } from 'vite'; +import { readFile, writeFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import { createRequire } from 'node:module'; +import { execFileSync } from 'node:child_process'; +import path from 'node:path'; + +const root = fileURLToPath(new URL('./', import.meta.url)); +const require = createRequire(import.meta.url); +const manifest = JSON.parse(await readFile(path.join(root, 'package.json'), 'utf8')); +const externals = Object.keys({ ...manifest.dependencies, ...manifest.peerDependencies }); + +await build({ + configFile: false, + root, + publicDir: false, + build: { + target: 'es2022', + outDir: 'dist', + minify: false, + lib: { entry: path.join(root, 'src/index.ts'), formats: ['es'], fileName: () => 'index.js' }, + rolldownOptions: { + external: id => externals.some(dependency => id === dependency || id.startsWith(`${dependency}/`)), + onwarn(warning, warn) { + // Restore the client boundary on the final public entry below. + if (warning.code === 'MODULE_LEVEL_DIRECTIVE') return; + warn(warning); + }, + }, + }, +}); + +const typescriptManifest = require.resolve('typescript/package.json'); +const typescript = JSON.parse(await readFile(typescriptManifest, 'utf8')); +execFileSync(process.execPath, [ + path.resolve(path.dirname(typescriptManifest), typescript.bin.tsc), + '-p', path.join(root, 'tsconfig.build.json'), +], { stdio: 'inherit' }); + +const entry = path.join(root, 'dist/index.js'); +await writeFile(entry, `"use client";\n${await readFile(entry, 'utf8')}`); diff --git a/packages/org-chart-react/package.json b/packages/org-chart-react/package.json new file mode 100644 index 0000000..914cc31 --- /dev/null +++ b/packages/org-chart-react/package.json @@ -0,0 +1,24 @@ +{ + "name": "@hm-design/org-chart-react", + "version": "0.1.0", + "description": "React lifecycle adapter for the framework-independent HM OrgChart Core.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": ["dist", "README.md"], + "sideEffects": false, + "scripts": { + "typecheck": "tsc -p tsconfig.json", + "build": "node build.mjs", + "prepack": "npm run build" + }, + "dependencies": { "@hm-design/org-chart": "0.1.0" }, + "peerDependencies": { "react": "^19.0.0" } +} diff --git a/packages/org-chart-react/src/OrgChart.tsx b/packages/org-chart-react/src/OrgChart.tsx new file mode 100644 index 0000000..10f38ed --- /dev/null +++ b/packages/org-chart-react/src/OrgChart.tsx @@ -0,0 +1,121 @@ +"use client"; + +import { useLayoutEffect, useRef } from 'react'; +import { createOrgChart } from '@hm-design/org-chart'; +import type { OrgChartDataSource, OrgChartHandle } from '@hm-design/org-chart'; +import type { OrgChartProps } from './types.js'; + +interface Instance { + readonly handle: OrgChartHandle; + readonly generation: number; + source: OrgChartDataSource; + operation: number; +} + +/** A React host for the exact same Core used by Vanilla HTML. */ +export function OrgChart({ + dataSource, + aggregationPolicy, + stylesheetUrls, + displayMode, + organizationLinks, + onEmployeeClick, + className, + style, + onStateChange, + onLifecycleError, +}: OrgChartProps) { + const containerRef = useRef(null); + const instanceRef = useRef(null); + const generationRef = useRef(0); + const committedRef = useRef({ dataSource, onStateChange, onLifecycleError, onEmployeeClick }); + + // Publish committed values before Core effects run, without letting callback + // identity changes or abandoned concurrent renders alter Core ownership. + useLayoutEffect(() => { + committedRef.current = { dataSource, onStateChange, onLifecycleError, onEmployeeClick }; + }, [dataSource, onStateChange, onLifecycleError, onEmployeeClick]); + + const engineStylesheetUrl = stylesheetUrls.engine; + const coreStylesheetUrl = stylesheetUrls.core; + const hasEmployeeCallback = typeof onEmployeeClick === 'function'; + + // Ownership changes are synchronous with the commit: an old request cannot + // notify between a committed unmount/source change and a passive cleanup. + useLayoutEffect(() => { + const container = containerRef.current; + if (!container) return; + const generation = ++generationRef.current; + let handle: OrgChartHandle | undefined; + let unsubscribe: (() => void) | undefined; + + const reportError = (error: unknown) => { + if (generationRef.current !== generation) return; + try { committedRef.current.onLifecycleError?.(error); } + catch { /* Consumer errors must not leave rejected lifecycle promises. */ } + }; + + try { + const source = committedRef.current.dataSource; + handle = createOrgChart({ + dataSource: source, + aggregationPolicy, + stylesheetUrls: { engine: engineStylesheetUrl, core: coreStylesheetUrl }, + displayMode, + organizationLinks, + onEmployeeClick: hasEmployeeCallback ? (employee, context) => { + if (generationRef.current === generation) committedRef.current.onEmployeeClick?.(employee, context); + } : undefined, + }); + const instance: Instance = { handle, source, generation, operation: 1 }; + instanceRef.current = instance; + unsubscribe = handle.subscribe(state => { + if (instanceRef.current === instance && generationRef.current === generation) { + committedRef.current.onStateChange?.(state); + } + }); + // Core mount performs the first load. The source effect below compares + // identity against this record and does not load the initial source again. + const operation = instance.operation; + void handle.mount(container).catch(error => { + if (instanceRef.current === instance && instance.operation === operation) reportError(error); + }); + } catch (error) { + reportError(error); + } + + return () => { + // Invalidate callbacks and promise continuations before terminal disposal. + if (generationRef.current === generation) ++generationRef.current; + if (instanceRef.current?.generation === generation) instanceRef.current = null; + try { unsubscribe?.(); } + catch (error) { + try { committedRef.current.onLifecycleError?.(error); } + catch { /* A consumer callback cannot prevent terminal Core disposal. */ } + } + finally { + try { handle?.destroy(); } + catch (error) { + try { committedRef.current.onLifecycleError?.(error); } + catch { /* Cleanup still completes when the consumer callback throws. */ } + } + } + }; + }, [aggregationPolicy, engineStylesheetUrl, coreStylesheetUrl, displayMode, organizationLinks, hasEmployeeCallback]); + + useLayoutEffect(() => { + const instance = instanceRef.current; + if (!instance || instance.source === dataSource) return; + instance.source = dataSource; + const operation = ++instance.operation; + // Core reload synchronously starts a new revision, aborting/ignoring earlier + // source requests even when their Promise or engine import is still pending. + void instance.handle.reload(dataSource).catch(error => { + if (instanceRef.current !== instance || generationRef.current !== instance.generation || instance.operation !== operation) return; + try { committedRef.current.onLifecycleError?.(error); } + catch { /* Consumer errors must not become unhandled Promise rejections. */ } + }); + }, [dataSource]); + + return
; +} diff --git a/packages/org-chart-react/src/index.ts b/packages/org-chart-react/src/index.ts new file mode 100644 index 0000000..6726cdc --- /dev/null +++ b/packages/org-chart-react/src/index.ts @@ -0,0 +1,5 @@ +"use client"; + +export { OrgChart } from './OrgChart.js'; +export type { OrgChartProps } from './types.js'; +export type * from '@hm-design/org-chart'; diff --git a/packages/org-chart-react/src/types.ts b/packages/org-chart-react/src/types.ts new file mode 100644 index 0000000..d575d21 --- /dev/null +++ b/packages/org-chart-react/src/types.ts @@ -0,0 +1,13 @@ +import type { CSSProperties } from 'react'; +import type { OrgChartOptions, OrgChartState } from '@hm-design/org-chart'; + +/** The Core owns data, rendering, organization links and employee information + * interactions; React owns its dedicated container. */ +export interface OrgChartProps extends Omit { + className?: string; + style?: CSSProperties; + /** Latest committed callback. Controlled data/style failures arrive as error states. */ + onStateChange?: (state: OrgChartState) => void; + /** Unexpected create/mount/reload/cleanup errors, rather than controlled error states. */ + onLifecycleError?: (error: unknown) => void; +} diff --git a/packages/org-chart-react/tsconfig.build.json b/packages/org-chart-react/tsconfig.build.json new file mode 100644 index 0000000..bca2eb9 --- /dev/null +++ b/packages/org-chart-react/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "declaration": true, + "emitDeclarationOnly": true, + "rootDir": "src", + "outDir": "dist" + } +} diff --git a/packages/org-chart-react/tsconfig.json b/packages/org-chart-react/tsconfig.json new file mode 100644 index 0000000..0cb675c --- /dev/null +++ b/packages/org-chart-react/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noEmit": true, + "types": ["react"] + }, + "include": ["src"] +} diff --git a/packages/org-chart/README.md b/packages/org-chart/README.md new file mode 100644 index 0000000..7ab56a0 --- /dev/null +++ b/packages/org-chart/README.md @@ -0,0 +1,100 @@ +# @hm-design/org-chart v0.1 + +Framework-independent TypeScript/DOM Core backed by **dabeng orgchart 6.0.0**. No React runtime, wrapper, Storybook, navigation or API client. This version renders organizational hierarchy and employee/leader cards; additional relations are validated but are not drawn. + +P1 composes a separate top leader, presentation-only hub, hierarchy, position/affiliation summaries and dispatched/onLeave groups. The same `presentation.groups` fields hide each group independently. The hub does not create a fictitious organization or change `parentId`. + +```js +import { createOrgChart, JsonOrgChartDataSource } from '@hm-design/org-chart'; + +const chart = createOrgChart({ + container: document.getElementById('chart'), + dataSource: new JsonOrgChartDataSource(configuredJsonUrl), + // Host/bundler resolves the two exported CSS assets to absolute URLs. + stylesheetUrls: { engine: engineCssUrl, core: coreCssUrl }, + onStateChange(state) { /* idle/loading/ready/error/destroyed */ }, +}); +await chart.mount(); +await chart.update(nextDataset); +await chart.reload(); +chart.destroy(); +``` + +`displayMode` (optional, default `'interactive'`) selects the full composition presentation. `'readOnly'` is the view-only Workdesk layout: the hierarchy is fully expanded with no collapse buttons or diagnostic text (kind, ID, raw counts, vacancy, description), summaries use compact presenters of the same Summary (organization-by-position table, untitled affiliation bar and status groups), and a 1920 × 914.5 design canvas scales proportionally to the available container width and height. Standalone components ignore it. + +## Organization links and employee information (P3) + +### P3.2 follow-up: representative badges + +Representative cards never render job-title, role or status badges, empty attribute wrappers or a badge row, including standalone specimens. They display `대표이사` / `홍 길 동`, retaining the approved 146×74 asset and existing typography, with no gap between position and name. The fixture's raw representative position (`경영진`), employee data and dialog fields remain unchanged. Other 1Depth/2Depth badge policies are preserved. This display policy takes precedence over the historical P3.2/P3.1 notes below. + +### P3.2 compact typography and card logos + +Large department cards use 24px names / 18px positions; compact cards use 18px names / 15px positions. Representative typography and the existing weights, line heights and colors are retained. Read-only dispatched/onLeave cards share the compact content layout (108×52 card, 24×44 photo slot), with their original gray surface and text colors. Status headers share the standard 2Depth 20px/700/19.7px typography; existing department-specific exceptions remain. Position and badge whitespace is removed only for display. + +Employee-card logo contain boxes scale exactly 1.5×: small 12→18px; representative/large/status 14→21px. Original assets and footer logos stay unchanged. See [P3.2 report](../../docs/org-chart/implementation-report-p3.2.md) for before/after browser measurements and preservation evidence. Historical P3.1 geometry below describes that earlier stage. + +### P3.1 display policy and local font loading + +The OrgChart-scoped default family is **Noto Sans KR**; existing `--hm-orgchart-font-family` overrides remain available. The host must register its font-face once: HM Storybook already loads the existing HM Theme face. The HTML P1 host loads the unchanged `public/fonts/NotoSansKR-variable.ttf` copied to `assets/fonts/`; the React P1 host references that same source through its bundler. Global HM Theme files are unchanged. The Korean Core shell declares `lang="ko"` for consistent glyph shaping across host languages. + +Read-only Full Composition suppresses only the `경영진` **job-title badge**. Positions (including a literal `경영진` position), other raw badges, employee records, popup fields and statistics are retained. Position whitespace is removed only in the card display. Other renderer modes keep their badge policy. All card types share one rectangular neutral SVG for a missing or failed profile image; an available profile image takes precedence. Approved cards, photo-slot dimensions and P3 status-card geometry are unchanged. See [P3.1 report](../../docs/org-chart/implementation-report-p3.1.md) for focused browser evidence and limits. + +Optional `organizationLinks: Readonly>` maps existing organization IDs to host-configured URLs. Only original hierarchy depth 1 titles become native links. Missing, undefined or blank URLs keep ordinary titles; no destination is generated. HTTP(S) and relative URLs are accepted; invalid URLs, other schemes and credentials reject construction with `TypeError`. Group links retain native keyboard navigation and a visible focus outline, separately from employee activation. + +All employee cards, including the representative and dispatched/onLeave cards, support click, Enter and Space in both modes. By default they open a read-only native information dialog in the unscaled shell, outside the Stage. It shows only existing name, position, organization, job title, affiliation and work-status values; unavailable optional values are omitted. The readOnly fictitious display name matches the activated card (`홍 길 동`); underlying employee data stays unchanged. Close button, ESC, modal focus trapping and card focus restoration are provided. A name-overflow tooltip closes when information UI opens. + +To use a host-owned popup, provide the additive callback below. Supplying it replaces the built-in dialog; the host then owns popup accessibility and cleanup. The callback receives the unchanged Employee and resolved existing organization/affiliation, the focusable trigger card and original event. + +```js +const chart = createOrgChart({ + ...configuredBaseOptions, + organizationLinks: configuredOrganizationLinks, + onEmployeeClick(employee, { organization, affiliation, trigger, originalEvent }) { + openEmployeeInformation({ employee, organization, affiliation, trigger, originalEvent }); + }, +}); +``` + +Omit `onEmployeeClick` to use the default popup. Vanilla options are captured at construction; use a new handle to change the URL map or callback. There is no public Core `setOptions` method. + +`mount(container)` also accepts the container at mount time. Constructing a handle and importing the ESM facade require no DOM. Mount requires a connected HTMLElement. One handle owns one container, preserving host siblings. Duplicate mount and update/reload before mount or after destroy reject with a usage error. Data/Source failures become structured `error` states and resolve the operation. Destroy is synchronous, idempotent and terminal; use a new handle to mount again. `subscribe(listener)` returns an unsubscribe function; `getState()` returns the immutable current state. Consumer callback errors do not break the Core. + +`update` captures its input immediately and preserves the current Source. `reload(source?)` optionally replaces it. The last started operation wins; earlier requests are aborted, and stale responses cannot commit. Call completion means the operation was applied, superseded, or produced a controlled error, rather than that every image/font finished loading. Regeneration resets expand/scroll state; removed keyboard focus moves to the scroll region. + +## Data contract + +Public `OrgChartDataset`, `Organization`, `Employee`, `Affiliation`, `Metadata`, `PresentationConfig` and Source types are exported with declarations. Preserve documented names: `displayOrder`, `jobTitle`, `profileImage`, `workStatus`. The supported schema version remains **`0.1-draft`**; no silent migration is performed. The latest implementation request requires top-level `schemaVersion`; `metadata.schemaVersion` is an optional compatibility mirror and must match when supplied. `metadata.updatedAt/updateNote` and dataset `relations/presentation` are optional extensions. The original seven design documents are historical drafts and are preserved. + +Organization and employee IDs have independent namespaces. All references are checked; duplicate IDs within a collection, unknown fields, missing values, type errors, invalid dates/versions/statuses, parent cycles, unsafe markup/URLs and empty organizations produce `{valid:false, issues:[{code,path,message}]}` from `validateOrgChartDataset`. Zero employees is valid. Leaders outside their assigned organization require a future approved rule and are rejected with `LEADER_APPROVAL_REQUIRED`. Multiple roots remain separate trees, without a fabricated parent. Order is presentation order, then displayOrder, then code-unit ID order. + +`normalizeOrgChartDataset` and `calculateSummary` accept validated datasets. `calculateSummary` exposes `raw` counts for unique original employee IDs: total, direct/inclusive per organization, position, affiliation and status. These literal source counts are **not an approved business headcount**. No policy gives `aggregation.status='unavailable'`/`policyRequired`. A caller may provide an explicitly approved policy (`policyVersion`, `includedStatuses`, `activeStatuses`, `includeLeaders:true`, `membershipMode:'primaryOnly'`). Unsupported leader exclusion/multiple-membership rules or invalid policies return `unsupportedPolicy`. This release does not infer business meaning for dispatched/onLeave status. + +`JsonOrgChartDataSource` accepts an inline dataset or an HTTP(S)/relative URL, optionally `{fetch}`. Inline input is captured at construction; every load returns a fresh immutable snapshot. External HTTP/JSON errors are sanitized and distinguished by `OrgChartSourceError.code`. Source output is unknown until Core validation. Future API sources implement `load(options?:{signal?:AbortSignal}):Promise` and do not change Core APIs. URL paths are injected by the host, not embedded in Core. External JSON Fetch is an HTTP example; it is not supported as a file:// transport. + +## Theme and CSS ownership + +P1 **ships an independent OrgChart design**. It requires no HM Theme, React/UI peer or font download. Resolve the two exported CSS assets to URLs; the Core loads them only into its dedicated open Shadow DOM. `style.css` includes its own scoped defaults and contains no private CSS imports. Summary-only components require only this CSS. `/browser` is a classic IIFE exposing `window.HMOrgChart`; `dist/index.js` is bundled ESM with no bare package imports. + +All colors, typography, spacing, borders, radius and gradients belong to `src/styles/design-tokens.css` and `src/core/style-presets.ts`. Public `--hm-orgchart-*` inputs inherit from the caller's container; internal `--hm-orgchart-resolved-*` aliases resolve defaults without overriding inherited inputs. HM Theme variables do not affect this design. Workdesk organization header gradients and white heading text are measured; neutral/card styling is a documented design adaptation, not an official Workdesk value. Existing v0.1 demos and historical validation records are preserved. P1 theme-free examples are `dist/p1.html` (HTTP/ESM) and `dist/p1-classic.html` (direct file/inline JSON). See [standalone component integration](../../docs/org-chart/standalone-components-p1.md). + +## Engine disposal boundary + +Upstream provides no official destroy API. The facade clears its DOM, aborts requests and generation event signals, clears callback/data/engine references and disconnects the init observer through a narrow managed subclass hook. pan/zoom/minimap/drag/export are disabled to bound resource ownership; hierarchy expansion uses native buttons and engine show/hide methods. Transition listeners are removed with their discarded DOM. Browser verification records repeated lifecycle DOM, global event listener and active observer stability. It does **not** establish complete heap/GC recovery. The hook depends on pinned 6.0.0 internals and must be re-audited before an engine upgrade. + +## Build and examples + +From the repository root: + +```sh +npm run typecheck:org-chart +npm run test:org-chart +npm run build:org-chart-example +npm run dev:org-chart-example +``` + +Open `http://127.0.0.1:4178/index.html` for bundled ESM + external JSON. Open `examples/org-chart/dist/classic.html` directly for classic bundle + inline fictitious JSON. Both use package build outputs, never Spike code. Example controls demonstrate reload, employee movement/addition, destroy and recreation. Build artifacts are Git-ignored; source fixtures are checked in. + +`npm run test:org-chart-browser` expects Playwright supplied by the verification environment. If not installed locally, set `ORGCHART_PLAYWRIGHT_MODULE` to its absolute `index.mjs`/`index.js` and optionally `ORGCHART_CHROME` to a Chrome executable. Production has no browser-test dependency. Evidence is written under `test-results/org-chart-browser/`. + +The React wrapper owns only ref/effect lifecycle, source/props updates and cleanup, including forwarding the additive P3 lookup options; HTML and React render the same Core. Standalone `createOrgChartTree`, `createPositionSummary`, `createAffiliationSummary` and `createStatusSummary` factories are exported at the package root and return the existing `OrgChartHandle`. The three public OrgChart Stories are Logo · Personnel Summary, Department Colors and Full Composition. Original verification Stories and independent component Stories remain available under the excluded `internal` tag. diff --git a/packages/org-chart/build.mjs b/packages/org-chart/build.mjs new file mode 100644 index 0000000..b558b5d --- /dev/null +++ b/packages/org-chart/build.mjs @@ -0,0 +1,40 @@ +import { build } from 'vite'; +import { cp, mkdir, readFile, writeFile } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; +import { createRequire } from 'node:module'; +import { execFileSync } from 'node:child_process'; +import path from 'node:path'; + +const root = fileURLToPath(new URL('./', import.meta.url)); +const require = createRequire(import.meta.url); +const engineRoot = path.dirname(require.resolve('orgchart/package.json')); +const engine = JSON.parse(await readFile(path.join(engineRoot, 'package.json'), 'utf8')); +if (engine.version !== '6.0.0') throw new Error('Expected pinned orgchart 6.0.0'); +// Keep upstream UMD evaluation inside the deferred import; bundling removes bare imports. +for (const format of ['es', 'iife']) { + await build({ + configFile: false, root, publicDir: false, + build: { + target: 'es2022', outDir: 'dist', emptyOutDir: false, minify: false, + lib: { + entry: path.join(root, 'src/index.ts'), name: 'HMOrgChart', formats: [format], + fileName: () => format === 'es' ? 'index.js' : 'orgchart.browser.js', + }, + rolldownOptions: { output: { codeSplitting: false } }, + }, + }); +} +const typescriptManifest = require.resolve('typescript/package.json'); +const typescript = JSON.parse(await readFile(typescriptManifest, 'utf8')); +execFileSync(process.execPath, [path.resolve(path.dirname(typescriptManifest), typescript.bin.tsc), '-p', path.join(root, 'tsconfig.build.json')], { stdio: 'inherit' }); +// Ship one self-contained public CSS asset. ?url and file:// consumers cannot +// rely on source-relative imports or a bundler to discover private style files. +const coreStyles = await readFile(path.join(root, 'src/styles/org-chart.css'), 'utf8'); +const inlinedStyles = await Promise.all(['design-tokens.css', 'employee-card.css', 'summary-sections.css', 'org-chart-content.css', 'org-chart-readonly.css', 'org-chart-p3-summary.css', 'employee-info-dialog.css'].map(async file => [file, await readFile(path.join(root, 'src/styles', file), 'utf8')])); +let publicStyles = coreStyles; +for (const [file, css] of inlinedStyles) publicStyles = publicStyles.replace(`@import './${file}';`, css); +await writeFile(path.join(root, 'dist/style.css'), publicStyles); +await cp(path.join(engineRoot, 'dist/css/orgchart.css'), path.join(root, 'dist/engine.css')); +await mkdir(path.join(root, 'dist/licenses'), { recursive: true }); +await cp(path.join(engineRoot, 'LICENSE'), path.join(root, 'dist/licenses/orgchart-MIT.txt')); +await writeFile(path.join(root, 'dist/licenses/README.txt'), 'Bundled engine: dabeng orgchart 6.0.0 (MIT). Upstream UMD references html2canvas/jspdf only for export, which this Core disables. Those export libraries are not bundled or supported. json-digger is not imported by the shipped UMD. The npm dependency retains the upstream dependency manifest.\n'); diff --git a/packages/org-chart/package.json b/packages/org-chart/package.json new file mode 100644 index 0000000..d767c41 --- /dev/null +++ b/packages/org-chart/package.json @@ -0,0 +1,23 @@ +{ + "name": "@hm-design/org-chart", + "version": "0.1.0", + "description": "Framework-independent HM OrgChart core, data contract and JSON sources.", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js", "default": "./dist/index.js" }, + "./style.css": "./dist/style.css", + "./engine.css": "./dist/engine.css", + "./browser": "./dist/orgchart.browser.js" + }, + "files": ["dist", "README.md"], + "sideEffects": ["**/*.css"], + "scripts": { + "typecheck": "tsc -p tsconfig.json", + "build": "node build.mjs", + "test": "node test.mjs", + "prepack": "npm run build" + }, + "dependencies": { "orgchart": "6.0.0" } +} diff --git a/packages/org-chart/src/assets/affiliations/README.md b/packages/org-chart/src/assets/affiliations/README.md new file mode 100644 index 0000000..952ee3a --- /dev/null +++ b/packages/org-chart/src/assets/affiliations/README.md @@ -0,0 +1,21 @@ +# 관계사 로고 출처 + +사용자가 공식 접근 가능한 Figma Asset 재사용을 명시적으로 요청하여, 2026-10-12에 아래 Figma 파일의 관계사별 집계 Footer에서 가져온 PNG를 보존했습니다. 원본 로고를 그대로 사용하며 OrgChart 공통 카드·Footer는 같은 로컬 Asset을 참조합니다. + +- Figma file key: `Plr6RRLi5XnLIn60x9aG1s` +- Footer 원본: [관계사별 집계 Footer, node 22:179](https://www.figma.com/design/Plr6RRLi5XnLIn60x9aG1s/?node-id=22-179) +- 확인일: `2026-10-12` (KST) +- 사용 범위: OrgChart 내부 관계사 표시. 실제 인물 프로필 사진은 다운로드하지 않았습니다. +- 배포 경로: 로컬 PNG를 `?inline` import하여 번들에 포함합니다. Figma 임시 원격 다운로드 URL은 배포하지 않습니다. +- 로고 필드·Employee JSON 데이터 계약은 추가하지 않습니다. 기존 관계사 ID와 내부 Asset 매핑을 사용하며, 매핑이 없는 ID나 이미지 오류는 관계사명 모노그램으로 대체합니다. +- 접근 가능한 원본 Footer의 시각적 확인 결과를 근거로 합니다. 통합 카드·Footer의 최종 브라우저 검증은 별도 통합 검증 기록을 따릅니다. + +원본 Node 및 저장 파일 SHA-256 (모두 0바이트 초과 확인): + +- `hanmac.png` — node `22:181`; 11,828 bytes; `db154af30d5ef875d097006c92dc5bdd70962ed2538cfdd385c87b39cecb3cfa` +- `saman.png` — node `22:187`; 20,584 bytes; `5167420984ef7b0603f8203f35a99ffcfcbc7981186beb785ce38a1665fda60c` +- `jangheon.png` — node `22:193`; 56,063 bytes; `6b4047ae6ecc451121470885d1f382b3f499c838968a02120d6d3dd643503e63` +- `jangheon-industry.png` — node `22:199`; 16,683 bytes; `6d12832bfe067414889d6db2ec4ee4910f5d2e61dbd86b9edd1516ca2a51733d` +- `ptc.png` — node `22:205`; 7,613 bytes; `12c22132e83be1f4feb23e5f761b73a85366ae399387cd6b40782d501dd7cadb` +- `halla.png` — node `22:211`; 9,606 bytes; `f92408ae7f129e3427c1456de0d9da855bbd652e72b97728e3cdc6b11fa6d12b` +- `baron.png` — node `22:217`; 13,175 bytes; `089014f781d6b741397388eb87c70b9817e848eb5960fc5b7933033b724ca351` diff --git a/packages/org-chart/src/assets/affiliations/baron.png b/packages/org-chart/src/assets/affiliations/baron.png new file mode 100644 index 0000000000000000000000000000000000000000..944d77d80df7ca5aced8a0ae43fe87795fe4d0e1 GIT binary patch literal 13175 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 literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/affiliations/halla.png b/packages/org-chart/src/assets/affiliations/halla.png new file mode 100644 index 0000000000000000000000000000000000000000..8646bfc7907ec03b8945f666c80ca61ec239ecb3 GIT binary patch literal 9606 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 literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/affiliations/hanmac.png b/packages/org-chart/src/assets/affiliations/hanmac.png new file mode 100644 index 0000000000000000000000000000000000000000..a644b49e73d52e4e9c4463a97c976e89996ee4f2 GIT binary patch literal 11828 zcmeHtWmJ@3+bOt9FFuD`nEV^mnnaut>ow3U9Emu%~Z- zg!sUJldQ`ppo7R+#lQ^YKfEu9(?l#MqL@gnsX$ZAbKTg+m@XANYbfqF z$vBtclqKzU{|?_ECiDJonHZIntJgeJZB{bP(biH;#^X7>>H&q8uA+m7#%JCKX8b*M z=s0b$`P<+m-m;iqbJ8AnfGLn^(L|b{J`X9AnrPcyu=GB62>g`g?%Vd#t_&S_SwG`J zv#M5NQ^w@~+Tm5xV2x)U8E>6USX5Pvf9Pg3qpruTIBu&Z!#uD!0dIR7>}Z;8y9*Hh|2VA9cH#7%$% zq+H|}6Wssw(DOT{$GiL<-OS|C^DO?0i-^FRV>CIy?^W5M5Mrt4i^x--VBWEbxp|YD z$^G~Oxh1z1xgL4Uvai6PJD>O!IIBvAT}IgNNY3!@)T$!SodLO5Np_Hu!vYyEDKVk3 zmx|wJ#Q*-u$n=HoC9wj;L`8CiN?b^}LUZRJ%ZTtMh{$}EMd2D&W)PL+tUF~T1$!o>zHm2HU_@?Hk-Y@uF zH)db0AoNfq_UAcw+UG{Mg0N2y1;Nh-?MPaICJeYd(V4ezOjr~9gZlPG*F z(|mlmQPf@OptCM|j2RS0{4kCzilO5@=?`u8NtI_=5#8e_*{F()s`>Y3t4SwO7-#5O%g$DE)FRTp>2S5EsqaK8`g2K%8}F}oop!<|^UE-u z^;%LBKkb7gRK5TMGh%d@m`>em#>jWqg3C+lfs?y0*HYpu#S*)`Oz}+fynv!!|E)K% z=I~OZYaAOdXE5%m zSHD`T_!PT`jsk0!n|B7JDbIBN8PqNvo%9X&DH_&u>^}2&8b*i_YjH%*cbtDJWZ;*a z6+4E0-;>uVrM6l1WO^HGf^YuDGkZCm7Ze0^KZc5c-^zzjnmijm74hawWi` zGj=4;CqXH1I#nqLXk1ID;x76s&!{lp2Gw%HXUkbU8a@p~hNgNjN{)H~L$n>chtf5; zCOr=7C@+99zE_alIy1U0zIH~gla*^6Zy1K%)np2?lB*d*R5T}+L3R1MFklRgG?Re< zD?6_$jaZ%MKRx^=YWDf5?p^(QsLYnT0cDZ&R%7ldcln^$S>dQlrxL2fjdL#v^@r(C zO>WB!Gh#(z*_zqIc-f7(O61X1Gm)@==O6DDZOdk7PGy!xZAX$OK5>^7V5f%Q8%Mti z>gJE+9+3KkSyGm(nf`a3F}X5Kv0ewe;+}MRyX-6eaXMRgEB-Rtmd1>X7}Z$h``r6Q zVGZH4qPCw67vesbpzskFAaw2H4H#!mvA}{w)$$A8IHz6rM(1Za=mYuF9EOPZyZ?3B z8qTt#er-oh^B-*5dlIIeWu5T9yt{rVSGz;HTEl^NirMeDDoh%2nNMUz_N#uw6nA>9 zkY~&ZhYBVZPx*+~p+3A@<%sU--jhl=(s%1)EDt*GGOS#%EI1H&{L_9qlP{gz4Y>3LgTcX;R3L4;$7g^=?EfXwxwCth_9!uZXiwdRU_Gap9fVv_J7?WaCjciqX$yJ5Dq# z=K=jnDzOI4fmvd=em>>cqEYOSW?Sf28Nxb=ilzVLP2L2;=4h$expcl|1QoelGQ|&( zfHgi}3!YDVS<7xya2mOD{--PCiJz14h+k)MM|WDeWmS7$MG}Q?nLf*-2jT$}_ON7T z`D)dx1xcR=Jr#QOS;YcFRR%7uvVV&roiDMUPnywaJ5e$ep03w61VeO+ON#popv-$z z{Hs%4gOXNVd}7?cpuSp7+V&(Nql5ljsbNN6R#yhH zr5~Qe{czgn)AaM*UeF3?d`?|$cJF>+#x~IRo04Hic4v&mi43nqzndZd0^q#?Pot^x z%-9-?P2s9e5KbxJHHA+QT11D z*2MxXEw8zVtV>3$s@Bc56pSBUHq==oS665zRVugjrf9E3phfDk+g?|lDK^Rd(=PJw zdePG4epF&XrciXHhE7V0*w6LZiqShQx|X|RSX3p}?@-x>!@`_74BDly|8q^cvvT0XmTbCv{N zVM1&D6RP8@?{n)BBSI4aG8e!z11#YI(uW6rUz_OXSL%K5;lk5b=w$&bCFkOP^y^Vm`kQlVee({ z;qzAyN0m&a9+-g7ofbzO)0&;79_YcZ(chnS`#T)u0BoXJSF>1nynmL-X6-j7&*%Su zTW|C+uaQPqN^Z*)?FNC9QlHMK=~eMz?L72CKj}ei4}!k zAL*sCT#l?8NTkuQWo`I2kxGYtC4J)jZZ7t7$>d8DBT?t8A#)!x;lbiJ`~BzjPY=^% zH*90RlCmC^y+h&WA6qaA_%$(b>%|zFRT=OnA0bcUI0OnM+clZd zZs0)gXG6`d)ke@-ANgN~OU3<$wYjIEUyniiJL^~0^|ncDasesT1DDgKb)S!t3ziwr zHIsZOH;pn_t)&QOzl?5qYTc!;D9bEi=S-s^Zj#*0zQ<`f3Bz^ho=E&7_dZ~gkwE#w z-Kimf1Nj3Cav~ym^c7SuP(|_3=VUQ2*%&$?9xEy@vP^1qQfhmzzrSslRo)_@wQC)u z;W1rMV5~5CL#`j8j*1AXO^;C)k|LTG-Tu8uUHP4-9=||~aE2Jyk?mRxQoimmPvJxS zM|-J@q@}Fa|K6t2JY{t(&Y)+)b`1qVN+&39Zqfbj3(VI5B@zKujsx1|iCWBb>6FTO zSn>#C#r@koLHdWn-#bmp0M4E6P) zUr`=?q^}Ans+E6UN9+5Qyo+j+Qt3_YuYziHF-Yyjx}ZmhJdx5rgOc>+jtRaGjYK?v ziocDwIsG}CcTb|hz5VTH4erHf8Qj>I{-4h>)DmoHypmt_f5{t-Ya?)I4RV;vtEz=} zAaqg|d^nRHHMpM(PJJwFHFR;Whs&?vRRdtoZo`9K;4rRC`cy+o2n-PZ^_8^I-MYl` zW!~aY_^61J=~B%#>F$Zx2~S24Hp|4t!+0L02x>t=O(p_V)->W;o|`P3Rca`usjsiWWhOkqAx zkPa$N1r^WWORzD|%)57}O7`9g{X1_oAvZ+iBy`fuxQA`u5z{|{)~tMiyj7*&29R_> zdA#87GJ6k6NMFsV30RvuvXS}so!x4Sh|||lF<1|t!>ZlY{MOOzc=@oLq-GE94uID> zbwPh6A?1!Ujcf-Slcq6m%~W!{h6x-NyB;TR({Fofao>5EMsusAx~Ut#%HJz6RA-0i zaO<6sr#I~aLLuq*WM7sn6M83##~KI;W7;hVz`ioTglWxUs}2>AcZk-ZF{+R&KT5^l z`17J0;FW%Q*V6;YN&C*s z1(liV4Db2ShJ+2(k3 zPE9HDY1RCXqxt{ARCHWd%gX(#l$9gYXJx~E7Egggt3rrP4Ehj+Mt|;J+L~Drk+Rq@_=w`00Rg5d?=CUoY93bD?dkjbKejvY4K_ z_#@PsqVGD8TzbkQr6R&r&OX3?b+}9g^8zfz#L^$gBhyD(Rz<2Cf>v|^fE|na;RMm> zs)b+A`PgKlZY`0+f;Iu#gt^yk^QF!@UEosv;%6}`AgHLxy}^@QGeR16DBYTYxp(Jo z5SYPuZNtqUtxw-vccfbu38x5g$v$$3zBJZe_Ac-u*FWh7nP62ckQFAm zAdU0G3ezKYBnVzX4anBEgwf9xTU9+gVu}F4fFPRwZ~72Lg%o;;Rv$hOZ0BVnT{*|f z?-a}-;Ii2qvg3ZEaMy4APM4Hn) zPO>)nxy`rC87hhrX@d~^=p8&>tWT$?$SmVnkqAYOUkX9W>B+SbSw$fpan($Y`s9&> zYtZPS(lA2(xUCf7D%k=g3%8yFk|o#@0UT*dS1^qx6enP~bAsOgE;dH5;!l}_lkjAs z%P*GSUJl0T1Cd-FGQ^vo9MrE$dD%>*h|XqbMEu4DgB#L4JqNAA>dSAA-@qRg3phz} z6>8v?5*#mvYu384FwWn5#+phd>JJ}?tj~fo9*Zp2i@#_+rz~a2*|FFI0;^N)Pv%At zXy9HWb@!Z}Wiyd``5;9F(<9dAvk_07D0^Ld$)q&`7=m#rGHA!R8vAwJySrx9MlVr~ z&CINnw)-FZ%oV5!r^q@PDLk_5`mrfXql%s$MomU<5o4n$ah8!khQ^OuuQlOz)-%ej zo*Xkl`ha(o8R;6WCi{VY>L%VyeiV?AJICI$nmJ_Q`CJgmo_C5B!hwL(eAk1=gmB97 z1AQDyoOLTj>;+)fxx#8g=^M_T|MqEoXv+IZR`x?`#Hcu{9N8|S_ww;ry+81l&OsKJ znb~J_{rK2>N%LD<0FgWM9^n)*?rvAT&EdIkqjO=<-|;0Wwr*lxxr{zhoQc;=6xj_f z!1^L?&bM9=n^m`h3}+K5&IGg?o3f6fo1OJ~^OiydeE+!ZC+5+!vh6%4k?7zr%LK|Jx_{p{b!NE34eGU4ZQc0RLi#nj3c`f*g2fVy}Ux zGWyufE;K$iO0NGZ^*z$X2q)Mvos6P_bQp04MP;DSU1&0F6yuzjg!{@-c#s3@`=Ib2 z0ge@zi*XANl8SLm&-h|kHsH0wcwV%J^YfRtEZ~3_-bjw0=^7FXa}bTKMwOM%^HlbbxwE7`i-H7#rI5S749f_HW85~!S60jyEW=gjV(#Ty z*6oNSgl%nXtICK-C&3SXa6OyoPPeT^>~MsAUP37ME-L~k1M@6;*m3=2#xY&qL)NpQ z#b&N`O#J?47g2~(ffT>j3Mj}i9gA=Zve@Ke1h7R>^pzOywinxJ7tsWqUgcMl3;y`+ z8FZ-pRus6>Xlk_|)KHmN*a@gCliHUc<0K z@jztRG2LFbU+UAhdmf^%3Y8k#JXaX$-9MHgU4k!v*9??TmwJ~$<)?l;J$!WmLBQy}jeL(&*(qq*Zb}1PqGiM2*CZX0^Qo(i4o^?M#)JnpdJ9ngA*MvEQ4~7e7YD@4dgGRi#m78O4@Xg&g`7ncLIf9j_EJIx}}&3nBD`#R)m$x zx`tUO@t;YCW6TrkZ@*$_a3K+(tH@zchHHrqCM`SWhD75%n-g28!&Lyp!BIY=k6sX4 zO?1$UY)(uxK-HDH%7w@Du_=w0=wJ+hdut=M1M^}Le86G0W9|vCia5;QayGFO-Bq6+ z5v23eZv{j_QB~gOf-@(^q#|vKX>tj6Hqz#v3Hk+~5lXAUr6Iw;_33WFz&|8En^t=p z@N-^_2`p|3pmaqL5Vnds7-s=+wB2R!K|I-`2mhbEL0youfv4b15MiSRIWV)Th$#&p zD-b@GeEf!svwS+J<}xcaCpM=l08H~oauKbLr?9w`U{L5rstCs}3Bu-wl=tH*EdFU{ zxszd~2`8RvC4K2|=b;wh-!ATF#t)4Hh(Zs~#Q};F8+RvvuToJ2dKpLF0}O$13||^e z5~7l^t&%qrbg$xg@mdBa!x5-m%-}2h>PpfDa2YOibEN%Q-bDYTGs^-;_btI`ZR(dy zAT8W(d41|YpSooO%l_zC{PfTU*wAY#Y``sNxszEwzGEbHuK*ppk=)?*MUCDSvQPr- zqImO;h{dDCTyh8e)5#e1?03s`)px@#bNuM`jY4QVS^>MRy5uOlhmx$FXrr%8DAGB( zd#Qev{q!(C1`V;n9aG`$acg&S^cgK6Z9Ka>h1+siy z(62uFf#=}IT>PI){Et`U8WYrkn|y7Sq$-u9rKIrs&9UTDXT^s@0OILkmP zN2UqiUJCPgl{+5+uUP+_@znBdz}OcEKcko7>sq9TBiTkkNRx7;vTep=UZ-ZL&UzD-p(MkNdT z;?*@n%6u*K$PivEfT%S1p0v4Mc^W^QfmEVhZgnG^V6%!XCNKicd0qV`d9^u5})t4#{K{3 zy*K*$`)?yju&}=Tgz{ryWyV`zW9@$c5n}~$fDEv(B-wg!uoj8Hv{+agDwSAR-g0m} ztk!$*Xa7C)zd(Tltpz-+imJ?L1PGep(=$2jsuRlj5;BqK@)&)bl57veNRKsL;DE!L zER6)92a(-tJ^%nfcXJ=s7tO$7jT*I2DY=2i`ssdPVsI2t$(S^MPH&*mrL`knrH&jz z3=Qo@d1lQ)w?&0-ZTXy)$Zb%SB}FSFya59)4$R!%1wcmuB{DCa6er(j%0eoYvcy2d z0~r}bWcl&DGBgB>!a#G!7MG9(nOcL*L$AdbBOWYZ(KH&p^XutjpTngs@4$ zShizxhT6GT3p?8AIi$QCmiaY6AcJcl*Lm=^f(%rD?R96ZPp7XsHhg^do1Y${nu#gt zVU?|!#}?^!r+CRTTDA-fECfLM$PL_bA?B$dzL!>-=1)A0Op&1W7)A1e3`mUUaQ(SZ z5jw?bI}MCj+6$j9hsXas)U}-)n>T<1)gU%>ZFwx+cOa9z0i(;g{o>7>vUiEl1p(^s zlcG(5=VMuOa#v&(e;l}Mq#@;zJmiqLRp_r1(z%e_#;1py1hb*C@XoJekAn6r5G|O9 z*;CgoSjyV~tv=BgdO26cBp1|UQLPKkxv z&wU_p^uS;iyV5=`oHg?I02nwD=+D%mYzUs#On$LV52ghRUgFZ4p*swx{c$dU_^pvA z0B{jhMbgFz>W{KDfVqkSeCK}6-_sAze_Imb)_8(ceRCUdU#(&ON}az+I;-B3(^r5i zx^7uga0d+g1mXx@uI|+sK!Ld4g(HpYLz6irQJ_ktO0TcLkGgq`F0$=8Lly@hxx~{b z8jhc%CF9aJl~3IeP%74*hipoTKa&9oI`+ZoxYHqb)MN}kM+~_gt;*}H8|&7$yMYW8 zhMaHg!q=C$rq!v~Qo{-=pZoqzF7Bs;(V0C_sSKwFw?ms;8ahEs9=5R{%PKP-KiH%p zSg+rYGzt`DodBABz_eJM&Cd;RCV*gi&sq6*_dv-g=_T)I>n4Zt#6 z_X(FxrZF{vz((JLmdcqKb$jMF?UX2x=Ipqi?7^eLBY@dY_{>=9U z+_^S0nwv*^59R{~_rB{?Iyt|R(Xrh1SmUdE)bmgb{sDPxVei5+N?}J~2u)2C4u7N! zSJYH0*z{)xJU3|#Q}3&F@^5Rsc5psP#W3OUd$MpvijRp3g`DD#6F=;=z5Q6Q*$8B% zM}eJG-e8be6^K_56 zk6y!P9@R!Zb8(~lo0!^fYql$gxX08PGX9z02)1*~Nx-yp{OO=CIV&Hbw_kO$!k?uB zvcP{n0~O(V7JEDOYmk8$Kx*@&8l=6hJ|k>^nyEvj(mDpTG`P8Gm%mwO9vSNbGN?8a z0)I%&F?Tr<{$~SLSpPFw1!{GM?@KFgfTdKnUtMQ*?Xq)kndqbqH~j;$+9NTk$#I6P0Jlf6zzH(2`?+cJITM~g#6y(6sIMafED)6Vm9r5#(<)%{`Xseq96l* zK(0h9PeGLSkz_OGkz}QhdfE?+^Y?(tlEXr1tBd+@8%4YYfuqy|EBN&;l9AclU>m65m@ zzw8f&Od3>qx#=JLAR=6}0%8^AK%Tpq_`O(y1pz>&T?i#5>7i=dq^V{}_QG?sfU)cPru> zlg0gh1{d^bV4H*h_bQT$Bs#R*=j&&mz4gBTR|pG`yX1kpRo@UW-cRuZcT4VIfJ1eu zRCbM{#!_bY#aoT@brTiV{hR^D1ZCW6#D2kiYQI@9jDfXn5KshZ>r?6RFL z7ooVsbdo*v|EgCVL1Sa_rt@Qc(g8}{kyM5YTT4Blg9l)cj7+zAv6Q_;07{@@=i<5m zeHDR4?`Py_0og&j1r9(i`6bU&ImPSlgC{5eSp{bC@O>DmP)DMD`>hn{jruS+(=n+r zSNq*HKl1R~&bh;@QW;?u8T-F<0MNzvqM&J9Kxvr%(ckwczz9J403>5jGP$#>Qb`0n zF#xKZzloL1*7G;sU(K?M}4+Ig$9ilY=ONQ@k8d z$yiSDO+2v38{kqIj~_VrUkVCn_iqNc{RbcmTei(k1f1|N6SUR#Hi_g`Impfx;4vfs z2LXzWV?^~TC-;VU#5bA1B2>qOW{Kd3t<)J@383^bjHsbe>LFBTU1uQ_OQn*sP?^FI zup9ZC>WXk@z}sQ~2cAnRlmD2BVLh4IBNtMH@1!g#UIzk6W8y3hRsi!G0uBM=qX(nI znNo)D4By)P0Z;0TV$dxA9;eNWw$7Q z-s}LX#TPsU1psxUvflMR&_x8A#v(zyU^D~lgh--7IOR{EQY1Yzd`F4m5huuC=$5j) z;(K-!lUE30@Xe7&Z04*Up#DDKj+Yoqz>4aT-DyyQA6rO0Fr4ca`iWJ*Fr7973VpC> z;WE|$0zjd06Gh%Rs2AjxaaQ|2P&0Jg=rt@Do?4|e3)lH0Xh`Y-WV4I_-j09a+B`8*YN}B z_Y^9XbcGvDJQhyQu^`y3Eovrntn<-2m<_b{R!#hQ;?DOGglYA5ZAun87IvNTZYi0} zql{Vj;_akMa4rjXX!CZRvrRT?A{pe*WNjoHQzB{B)H%cl5Y}g+lO!?%;P1)X~PdI5w)ujUJ&4`l(AFw(A<%S zO954f4Y=#H{{dW5n0PY6g9jzbP7W_ezAC>{$C;o~e!sAdW7>D=y54?pcy{tED8B(w z5kK%e^+H;$7pYEhObATOi1j0`$(Y|dM7^?$fNuw-+5iYZ#>yB`96118=rIt=@A$tFS7{ zzpPB!7IJZ{v8&|v-;I0()=3E*c-I-SE!iopl6o;O)bxYMIW~Tmo#wr?1gpXAW!(!N zdETwZEA=A}3J_O`bAtUXpn@JES5# z%vv1tMY*NdSE>P7Gk{C16Id3A06F+`6E10GcngMJYy+qv?tiWWE`GC3P%48gY7PuY zx%9M>gn4Sn_z{ECsAVKrJ^zUv&sv&^v9N-4{yUKTzfFPF8|-0ZU%#j;Z!2&O91E=Y LN}*iNH28l23s)Je literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/affiliations/jangheon-industry.png b/packages/org-chart/src/assets/affiliations/jangheon-industry.png new file mode 100644 index 0000000000000000000000000000000000000000..7bde5b7e8ee747dc5756485fdb2197492b1a2736 GIT binary patch literal 16683 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 Uvwua8|FfqSNMF51&Gyaz0C5auX8-^I literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/affiliations/ptc.png b/packages/org-chart/src/assets/affiliations/ptc.png new file mode 100644 index 0000000000000000000000000000000000000000..199520f96d259fa962d52c44215d00cf23757cd1 GIT binary patch literal 7613 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 Bgi`d4DRkO0S33Ag9Hc= zd~g1{TU+(*);{f5`>^{kQ)f9n5|({#gVUVW8&`VK4QF^2EYmfs(rkDvW)tsk2|>z}{LT3xZu@sriD&bbbn zZPI{B>eL_2pZm9+FSoA-aTe6}@qKZ)!4M^)U-Cw-wRPiMGKw}FS9S(Q5gkc6xU9}A zhmRZiN5AwwWHor#Ber5XKjA3s_nnAX#AP~u1rlB);*b=-@-}?OcA}7O*)N>hc7Tm; z*)BZIR&FsK?3iL3PF+rstPIuCx0YL@BQ|l%vD<9Yx2>Fp6y#2kekKmFKr6-yag4?B zApS-EBva1%jr!)I&7TE&9(q{hO@}G-+shCO+!Vr)=K}GOwhqKljgVWcfrQXOnrjQg zwv{IO)>)jicpbc-E1af2Xd)bRWm7DliDUbQa8L{b>bceCrfyg=w3zHWd5Pmxi62_y zjSa#b&2jF==mGNj`taE+5YqLT3aK_VWP=`#hn~%AKgN`Q0P>SK7sm>U!68_d9#Y_x{{7 z!VW*WR=04*(IeTCYg!}R14b$$CO=a3k>EXP?`HvKbO8b7HoyPEwh}F8UXy^YETb2s zbY6KqyaU}(%OBnlt#H$25w8U(Ta%x01`-k`gmhN=B-}YCZm3Q6Ypgw7!FD!?V8%O= z_bNHT^I~=kK}27*OfWrvTTJf~#NZrL()F2Q{pjwBiioV`YiN8%KJDv%J{%6fslJQy^oE{D@8~CO986VFtD$EZz?Kh$5O`M_e*!uhW z+c|CWu<+Q>$%qbMMUQi*5X!O4X!T2e>`p#&{`4l+%Ro0(rayPVa95Z2le?jNt_9s2 z?X{W>r=_r>`yhIt*?}Kz_e8fAFy^;$H}lHrn}+pB`oeo-1E9^RGVd0%Iv>Ag5n?LD z%7pFl9nrBJ<0C|072StH57$?>2jZB(p@EOl4#`GO;PBy>yeJUq*rI2g%benV$p7n2 z(ui}c{jx=C($f3}pMFsniEQiYyPy=UtEfZ-M#MX2LJgGb-G_I*obZ;%cyksT3*4pZ z9m)@J>SvLbFIq-%>e~&+uI%xWOIJ)BskN{_Ih8P&Qh^Knk4gm!Vnme8wrHw0-6oS+ z6D-~M;~9=H_lhAtUkH0KxFYOGEpVVYXi4Nxq%hR`)W1u$z9NQTW>v*>IOPXI|bx2|0oG%eG<~-QHD5h82Kgy~z!ibj*9D}}PCjd<^R_~kW z--+o>?6=O-7)#MOT$yTEXW?&pZ0GR-Vdvn3OL&=g@HL|fvEA-EkK9zKXWukC*_UGX*JI8r^R3559BA2ot1x`vpzla`JSxOB$@9Hx>C-6uilcB zi)+{C@itNnpR2|Jv3Bf+<$t-MRy;I;2!mgXE|c5e^gPl|O~)SY?-(4oC8@NJ^FVmW zNc9;cw3B zFOXDYTkwu=BZZMhOy9;|p7Q(n7c=*-i>M@-9v0ds_J7XFF}|c7;z`i_u4R??-RKD` z*g7_1s16}}G0cqL=EY7ep}z89Rz{pd$YAL3^2-b1ASteU?xI4(R*@@?1$)E(ma}8P zsM8CV+h6DUj8rJE4`2_o29xsn2tj5|$!?t&O-}pvN{EK{!S~PTqRd=3J9cM%4q?W3 z`b+-DJ4J1;4GHMS?`y&S)RYhL*o%flvlkAuJH7R-2ab;P1j4y!yS`vY3>m!{rpuwr{=WmdS>^u}8bV~f-;!ha9Xil@l)crp;+4?60T7Tx|TD)#sD4)DJS+Z^B z{3A2aN_6zpz~Ya{Kr6u!*G={x-ho!UBT2F9J(bVjNt`mJD0-QG*@QO_mTj65xp{Oh z&r+qy1;{6`HJoAT%riC}wDDKg58a)D9q%XU3UGj^l*&JYFKnPdcMig?4JDRp5JFF`Xy6P3fIL1_vIx* z);4e9Ii4b)=^bMip_?xOW}>swoOK^Y5=t4BhBsZ=Wy|ZSmilrF6-_}{V4};= z&LBkMim63i1jWsq@|I+$T5j^ZbH#xKX2MQtkiED5$nx6ug}IL=wwM%GvJ@>fIy5e} z%#8g_ZyjR(U71XMVcL4S>{)pkR-@L?`Q?@lX7gOp`y)B7Ig)Z})0C#xt&kmz#y#HV zQr-Y?5D&qYdO}R%PLeCa{@@4F?QAC4lU7}J+sU`}g!hwl9h2ekm9Dg!xew$(TT1#P z9TOGvsG>%r)uY8J_oUEjsX|T8&oN9wWMY-6g8jAfqp()ZGP}d0jP&`zg@c3}=a-;M zy}`P0yFFDG-Z#$IeDUj?#WFC{>gGCf!)g{QJJD+1aA}S(?s|HSLJl$SvqiHvCSvD} z*N)y}frmzTr3LPtwOO~@iME87v1>=^V>71hNGQ^yrnGhQk(K{;O_SPJu8u160-13o zC(%8=7%JV??PUTJ`?)Z?JqH)w`8UQTA1>$X7~wxT8g6ZvG6Dl4j%Ss>1aWCoya?L2 zbnfwycDg>(+Oq@kLP^S5+fmC4elJGSo`|D+c@^;C({c%D^(3R3b?p zQjeEbaJ-a3ysgAeFEFLv00fcKF-Ef-KoB}rU^Kr12m&W(jAjLZz;}9q(Hxnp??=A0 zi`m=<5Tr}Rn2SKuE+~vKBlC}FP&rQfWg3E?>rQe>^+uOc`g@rfumNI>zuzl{MuGLRvk;Vm4@omb$RibrkeQ|aPCC3Zz=7A$` zIuuH!o$^CYkRwPN|9LbBR)oy8K*dCi#dc(@JvL@`epCX%}BtGOx%G(sFOpc)EkGlOehe3kL?YEg1c)?pG@Q}U!X zmKa$-QdVarHCEmrE?&l*5z2wFBy(uCGUTj)OoemIx_@H+-R`L*^^!VvokX#JhiL`K zP7>?u2U45wrUh|dbu_PdHSi(6Jp(7fqE*c?&0v=ur zO(W{q^+KVJg!`u293sn@INd`gY6sn_ zC*+-NDl{gUKatw^aH(fP?lHGNBmXH=+{yGgA?6HtfShh3|HP#1ic{LDskXnvnZwe- zlq;C6lKW!a+g~{r6OzFUoj0Y5IrMX>r$d%77Ifm$98h;MP{@Nzh)yf_U$J5)O@n1N zxwhUL51CIi-EzXz3f~-Xhzhl?AM|is;(kM}QT2a|lbX+4&^OK0%AlZONVd}nC;eH8 z>vAICa65Yu=@0Z#9iQG)4PF0M4Ti1V`tD7BK$)EWE~OVM?M*< zEKq$$!NF<=Lms^Ph3KD1N*Xd}2Qt8h1{n#H;)`F>KwXje+$7dS{H`6Sll}Kk&R;Za z$ICW-5&LPr$Yg+{%gV_wjfV3G)QxFs_ZA!Co$SYT2w}k_QG!{^$eQ#}9@Gf&q>wR)%Z#0lT%417DhMVdyJG4malzjL&<%L3@xTzOf-Lk$bZY? zsvHwx2Hp60#la^V8DX~SamjRaf4Uj(xTgRLO~9f;8*9Hdr~%49EDs-iyYV0%`reGO z7^3n~%h<%t59h9i7jarzKjg#{BRDxzdxJAKEDAS-Io%-^{SDV*8siR%x?%Vp9F=JN zLEY{(bVi^6!ehM(${1c4s1PG%AaV0)qD~zq_Ln29Gl&pcNXx$P9vn{kOsdnGS+WZi zv~$#0-l_t)Lj}0wha$17wU+jBUd5_cmKst{z7toE(s_g*O-uMq^9AvCW%_hz(}@j@=*V=H6O#L9L1xmG?A$DvAMH0rtetQ_@!}Tk zirbmB%cAwYL!SMi8Q?e$6&l;|O+B6eqdt2zKB*e?6_{P$3T~nhjVY=xPZ~_|;CwYg z?b033Z2Xt5nNB;mI}|(QApFG~Qi=jvj4813ObXP^m8jOz!PWlu{Y>N}mz8LrSFh9^{RgTrb#xEquzvoKGOqaR>Fh^;)VPyfP_gAZeqA^y6tvbK ziL%knd_@XDn+U!~H%ex3oLt$i_O}G35W;oJIoOSTXJ)vKy3exR_kPi?-h79Wa6Nu+ ziY}LP??JkhN6Yh8m3=5-bRoO4AGPxP^^*Ig5%=98clM2H;FWh!u&_NeAD;(px4#W8 zz|Z-4)Uv3uR2h9OCivdy`ZV~DMm`?b;}53jXjiYE(W(Xx%~xBWbWz{^84BKy*}41N zcDu-z$W<%{59PIK`K{Y}UE6TEGG1}}sNCoN?0hRtR;DQzqvOxR#qw+Q!xwt}Z(cn1 z289k#y?o^2r%Y(4^pn~dgciO}9*9Y}?|d8oV7EoRrveJS$D(?1Kc8dF*${}&HSxUz zWB5_MvplvR6~y#p?Lwefjs%lngn6kAhjQ1}G<3f6&>a-Y^oYua*l9H!|BrN~oJ>RW zW9=tL`X>s8msPsE)-q?bQl#3ZQ5enk2R#ofMj!v@CJqe?37-eniUe4`$WM}y(NggK zzd<-^NC0S>x5EwHTdCg$XMTN+_AgE_{dU$>j&7O_8fm8RDI7I$Kg~pK9O6+p{u*Hc zGslRzaV)&mQ-HsuaQ*?R`GUYfT!UHwCtfQMn4RbOJPXY~6sLa-Bk5gq5jTD;~}Gs5kuO^ z+(fOredvaf5XE5zL=QfMKmF-FlTj|Wm>o3nWO5~t4f28;bJ*lss&u`@Km13tjB%~sR zxxJF)KjQ4M>wyiGBRrRsD~Fm*P+Y@HbwBsuM+mP(mAe=_1g|uD`QtKB!RNCfz1l;r zoi0~*?(KJ+8`w)}8&Gtm#SSww#-BzrF*8{&dTf|AhIXhZH(&i~?6S1_K zv_Pg85Sp4D+lFc_7ZTvCAZk5gbe62S$d3k!Qex_J5U&*I5Q65^l>sbX>S@L@(iJ+| zcp3m;x-s5Fpqj{t=FUMmT#q$8AfDBPJnFtFo6;3-I;(151r6RZ-X1iso+$m)=JHPCq~iUMnH77DhtF911+<;mqklXk^1T= z?UZE$)_zxX0qtLERcKv&_INspjGg%-CNQol*`G=2M{e8T#9=cn9f`;>AU7^!Pk39q zQ?sQZs`q1<@SxJiTfK%rBL);rdQj;GerCAW#KnjrtfYDP6^$24fc8C zk*Fhqh4p1seUE9_x9@%;(L-PE(_~W_$LkcM%_Uq2RY8jr!c$v@vuW(=-B!<*2CFF) z%CphbK^)^u0bqSHv#D}PdihPlt(41RxIbFRaJFB-BEdGERU%TNsP#iv;cGnQb`+adFMan>F~LulIK*e;U>iY}_pN@Q*10PtxiSv_u3sbrY>wrbJ+7QJQfWNrz&{4A*C#GX|3}g&X;O33I~Frb zMpmJGS$gCmNpYnA2~waqX~cxpW0#oZA~v7>W=7Ze7c7L%OrJtb#&<-xz5H;>x0U*s%XBJ{nCYf|0k zjNKk3H`Ta|w+_iqf7mMCt9)GJx>%a&a5S7HN@--qy`YUd<7%kUQ1{ouh=aAdOI|{gc=QCW?r_vi`R+eic zGxpHj{{6jViRVmf{zUQ-Z9U_+Gt6NVyC;0|{U6xOBQ3@3}%;`nr z(Rih5+ePe`VVySh7JOn{pDhxdZ5j}Q^&7Jcq3D87{yh8J`|!7%YPC#~0(A-9y2g(Qa0RTAxU!&TYc7kk^x$l$R26yi9}uJeA&Siaw|)j#S>{;SlB{^oSK z5Z$PJBl0Up=jkcWly9@U+l?jMhSuu=#bF0KwYH|k))!%+?mK-x>ng^x7mE`EB+_^7 z{s;398|*nXwFJAQz~gxGvPC0pdFy$ZQ*Y^$`uru~$)}#D5LT$jPo=skY1a=k8z?LKl%sJIApl9zw@ zjjyM2R^QSWo!lP#HQm=e9A4#Vit3TZ)LH)N&Y5=0c4N_Y#vRaWt6zFJ|T(z38PQp>VW-|7!~X z60@pOAI@2yJez0M?@u)0CyJ97AN4j0AUBvwi$Vba=Po?|kh6aEzU0=RZR=PIF7q*; z^||2RcdBnKKs6s<;V7y6zd*Ey#D4yiJ4{AKO2NZID&P74W#Zy9aIT*|1K`D98;&NA z^kgX<#>IhjT^3`F7i|nwa~B?VNU8v*im9^(Rm!kD0TU=KKI1?#@hkn~v4bkV2t`47 zDI7_1O`lnzBlI~I2J%dwS>pYpJ^_>kHbTFFCI8@mzY74Q^#IqL$gCDrL#ojEx`(dU z4hWy{u=tNuJ^!e%u=o(F|9GKc|K<1*`SED@b=?l2e+oB2m5i1I{{}Ngh8;dJpnw5M zKL>?F|8B@XD<0*UO1+BuCr1hgdy!O<oe-B`>Y>qG52C)a!ud%NSdg)%T1OO z;d>FmmEcqFbe^7qe2I&-X$Q0veeF5g>ZBZcxjyPMrG*(~o@v(DhlCk@N$Is)*2c?w z`WzVoi#&yx)Tjs4daE~-B~9DSxyG9kte5|4qBx8JRdQE;g{b7Qb-hng{%n~B@rVy^ zgw63fJ%2KL+IHdeKBk7knR6*XXI-;~TdtFDaLTLMF2F`xs^vR?t%lT%gE|*x#uTbgo^t;5hqCu_qmN-rSp#L?u>r z6YJ-VM9~>^g1bgj2VFTASaVIOEog!H!WR+2P>TQ+G%J764;?ZTE$QJR015S5C^o`c zkEt>}%IF!6sHpqXxtF93emSCZEJWm)Qk#B2DC?@hO%;#!W55wuJk7mh0$nrfk8916 z(%QE#4EcI8sdrS0h#DPmeyKF`Dm9}~9AxqE&Gv}HUO*_Rc*%-;nu<|XGmfkv$^$CJ zEX;kQ^?h*K5nesYAckz)kQiz}8r4(E*r{M0G0m5{s9EE#&^gwbZ^j!z=QdO24`0Hd zAbWBGtu1}b?Z1LA2I0-_s>x&cl@em#E!p>BoifAi%qN@Wpl&|j$Rfszm;*`6^Bla0 zoho5Z#v#nw2I@6`{h14aL1|tE?#N?-+J>F?o2ld};Qq`OOJa3fFPt@scky%@+iGM7 zb3>kONE_6|s!ooDgh9L9%ou&txe}7FyMQI-aC zN4k3y(`PM~yAjKIL=`Ni=0ia>_8-F>O>Gg9%j;NG_V75<*m7sqUCj=`3eQ50A=~KQ zM0`B2?VqoVY-cMT?_`@Yp5TXG8?BxO%uw%Ty#l|U(r9DD zH!0s=b+Vig8-@4^DFDTb>wL|3(Mg~7Yb@sxOjkyna`&nu-sNoG|B5R{dq#l?^9 zC0deH5MZUks!V$Zir1Br)>K;+G#V{=0q=ncI>We{|ok)^#ejT9knus$!FH^iG* zksgNVY1G1-VVGAi69M88m(oa&F3NSykRVSaermoEHwFBIB|>t8fo4Z-s2_Ga^WwE$ zp6FIZl_p{Gm3^7P0fW!S=I$9dn~#|%fkp~Sc^yA0Vvj5>zot4{@Co_G4DDyF8kk(C z*&v3NWO1yB+UQ83JPTM$z{^mFDnB4kQmII}vb2Rn-1h)qiM?Ks@Mpi7q88~L3*%n4 z!pEx~X(z6p_v5I%y@iEvvo`if{30av8<20Z?fDD!Z>t@X&oz z+-B3dq%-Ue{(O(1sF3xB(7W3Gj8%P|`x+hr!pyH#&r-vm92*~t^(w+{1|!(ITy^ku zVrHSQ@`h|c?XVB`Gl}Ze&3ry>chl^wxQA24M@I3(M~Hg!Kup zT={OFc>TGK7!rD75y81bVg7oK#wDxvUClio`Idy9Mb*Zr%!#tA^7<^hvQ5#jeFXB! zLcr70W#Hyh)mu`06D8&wQ$tK5bR*FPRUenN%*4(W}A5KFGE4 zR<0c8eaTEg`9Y&HLY%(GjseUX{cJ_KSjW48?Ps46$J(!oQrpW{CN-gW6a5>(^ zAllf-`G{LX!H^PTXki;fO&t|C%C;@BB5n3eb!M%mU~`rYT z#$;lozFhr%ZL&a%z>u0{#X&n`RTEM&@QhHp&me}LMPQP2n-NiF4V^6DD0Yy#s~y$K!dUd%BB+KjDWzMyiXclP@Jj%f`>oKM#l_at(z-Y?GdQJCkj+D@L@WX6!nB>Rxpin*-Rp;flb>v zW8-HnqC+)}=unhYpCI!_0-n>qJ>#yrQo8lme&zW>H2VVi?#QQEd?e`s7W3q4%%#ll zUww}c^8p={Jp4vADUc`yIHtQvjOPRo*qTz~X;W_E;niS4=D5Knvwh=|AZ5_o)P{tKWC3r_oxyu6ITS~B%`N@~ZwXwFbjrEew35x#4u8bdG#w{) zN@`J*xx^3qO;e;Cmk0IwtgtY~X6-%4)~Ct}v4gx(PaTMJDT8d`GnzEa1bl#6|NZ_( zeVwtsLbM_jKrT$NcT6tC9%L?vgBS+UXaIQCQ}>xgdOh7FSW%`9Nl{7_%Na9<&lF)t zKzpU6S2bYqQ9n~FZa+(g_$eb;5+;ziudMPx+|DrfASvA zM*;7@(!GTm@Jj~x&D@n4*0~r;yzh#c^9sk@tlV1KxE5CWM1XNT-m z-ak0EOA(4ovCVEjjylsl^o|}jVlOTKZ9UG>a<6D&Y{2sm7I6qUtGJ%Mnc4l_F5mP> zgyWTgL>Z@K0cO9g5n@3{%B$4Otf~K;R^!O~SeWP#iH+{!u3Mxaje78U5-ifc;H{@e z>&2$xV`SofvzQ~(rIyncTqckU0TO1Stl&dg>F*aW8jySVv0=$VGLw1?pPS6ishZN3 zO^RSVZhGsLDQ{czm~#1$jfHI2ijrtgmUMQ?eV|ab+YeB}imNruhRe`5vsZPPxsW3H zPW2DBO*?Tjo!H+?xp^Y&vvjm$puT-uU;%K$yS=(|SH1TFuft9kQ9~7|Z(tv?k*qze zhJ0Y-d*f5$UE$!>PtMr@U~Rs#|hJIB^`)y5gkJvxi`@l}e{pj+Nkp35^* z(YhgI<=hc;e-oe!!b-v7)=X(cL_0qVIsMKeS(-cPb`sQoyE{K%^}XpYYZ*uDl_a4! zU|_i0CrOyOFL|#caY2otN)Ce_KIiT^3cJVv(MQlfc2xTj?Y(Mnu1O9rLwjT>I({-i zZr<{Tm)UO9(K8pa6CMUl+BCUYM=Z3P{`%y}59jK9eK#qWz$>=cTVJxC9|JHTw2?e_uMUCWFBNED$FQk)B6^MSdeAVQGCf3 zMLA6a!=nfhpN-X8O${32<+416ep+19}GU_aTTR_E5uVqlHZ!o!Td4&GF7;=eCJRSszW1>KA#k^X2BaA&X>U{99^(FL@9Ie1n z?Iv$M%#nZP3DS+_Ciw&+k!3zEf#Bupl0A2?=mM@c-38*wBg%=fn{lcPf*QY(vi9o7 zXjA1V*jr>`*>iPO`SDQK+*CuYRMi5GZ)C$(A37cx1W*?$BFZ1(dja0JIl?bA;*)t4 zqVu&_XXTe|?PHNzlSEY594u3A*#b|R`aRXMWW@Rig10l&TCn3ma1>zXvn$499yVPc zl%=&-{IC%R9Ti5$4LF3&`<(54%f3iOck5+PP?EDeQH*CRP*t+Eqh1R=8$wYP8P6e0 z=x!8JO!in}R7Hv+ybXV^DUxg!ytunk6KlokZ3^N*QcdLCbkG2cHAYkR47}c?P&4EW zwkGwrS#g2>d%Cd;^wHI+vI9U1Sq>e z@XXLK09ac}SE%7`DB03oy|!;SoYg2_FP+8gZIa+Xs<{OO#kGb{a=n-=;NzD=IAzSp z9u3|eFdl6Fz18II9tVsD@VX4MW!K%xMN|2r*8dH9b3TiqiZoj$rZ}kkrd4A!tcxDw znF*>~w1~6`{@=hmhtn7<1%wkdzSpAgr;8z2`AXl6YJ}PHOCCwbOgWYqGgdWFrBTPH zS#Vf0PVWLE2eQ1Vtno7OaeFdOz zr4h8_r8$dXQ>i)6l|A8X<|9Szeu|j~=hmK8;?iibD7XJtz0PDzjd+Det9A3fy zjSB#f8U){@CfpSOT?R_?3m}^jVe!e9O29B8Y~YXWc{*4P|menr1&7i?SGC^~SyksP?rGsTO>^@;|*@KXU~?ccBe zj}jn#l%okI%g4u4DoAd&kB=4f!`M`CSw7Zasii(vz_rE8;Q7}`CakA`%kqQOrV8lt zR%OBhkLBa%)Z9TbfXgeN#QOga{GU8IJ*JD)a=7WEz*U4RQZ#1)?_;dr@b0vw%iW9e zPmcvjl!WhA(@-_-GVHjvr_tAq8SW!k( zCHM2Zd9o=|U_l+eh-CgZh!+@SK~UpR{!-XLp$-Uu&qP%p{_9uu;a|TH-v6~95wPGt zlq9YG>!%+H2q*AZ`cL@3sQD~HmfmZ~iMZicQ6fECcoW9}W2Lg`a`?j~@=u7#a3O zxd1_jvpa-aTGny(w;+^7nw*tw47_^wC;fpo??v;Md~3 z#tXU(-e{%_o@hY2x_mY3Bw+q~dG}>oo4V(cHdW8@{jAHC2c<%zP&-znvsI}YkiQ~Q zfCH}p>pU`wM{0#%TOKuCc8~XBjN9hE@2(~U$3}U2%4Uya0lK9D-R~sr%e%zG+4gf_ z%ihK#!6&rA)8?gKcl{n~6Jj%;2kqR4zPX6WzObqLQ9WVtu4p&8ktKlB-pPal|EXTmkK`VYbzkN;%HW-s6xOSv6m=?hPv3{TAK7CcM^*h? zYn(Wr;qz;&L&v3qo2Q2EM5@+Hukyb%5L&}Yaui-E`^Gn#>OhpiGtWUUqMM??2$RHP}&YXyGF7oSDn#}ZZEaKCX)4T{&f#@}hH|KuL&7vG z6@4H;_47R4J(WA7?Xx-$D7U2x)8b?l9fh@61@%{RGgWH`pqF{M}TlcLu3yeVG+2Y^%8f=|?{ydY1xTS@V?!Lsg{`IJYX7LNAQF-7!f zVUthhtDi^BFC;{s5m{7&#?+7&PgXqj8QekE#qmG}RK$G3;zK zuDs#^rs%1#9@&p&fjJLXcV0Dq(xf!9dJ03K*`7eCX{4PA{pUhDQSFDU;J8ShI+jfA z76Bxi7SyT^I1;VCZwRo{*RtO_P`MCIOKW5tt8O~d7)0Ql+8M!9*$%858U>JUQ`*FH zp!F5+p?+H6*r3edakU9lNXi<)Iu0s(o|UY}ZEB4(yfb$^7dMldXadftaKLr{0zbn7qok9P_dgo$udJpbf3<+x)E$%_O6w|AxL9p zWY(nbSv7Foh@M}^+Kr;6-$_IMH;|{<_0bK1G3{-D!^5grjn&*8)ewWn5jJwshJ_ zWE&ycy}sUy=9F#w_(}B)w<yj+6MFtIaUDYmY z(>qVE=tj2}O*M{qQ5Q)=RuYk0ERrgcxD+m3L<#a#}@c90pV)BxZ;Evt4KVJXo@ib4pAQqUyuy3j@*Y!Yxy){dBic zxx@I2G2iqGv9bMcvX6Au0( z|8iLUO&PQxjE;h`mL}nm=kl$ucvQOC{6#h^dL7pHuRgff7COdx+RfS#1uk5U`puWp z&Xuugilmq3)OPu+jlWe)w=>6U%u8lykRm^PNFZkRXM-uwmW#Z6xKuE&EH!?~XQH)( z_SMdiif$rWLY<*or&O}ykc=?}_e|)4L{qkT6lG}&Rb-uYND;3Hk&e>bZW#(S)aEiB zk$KC>_sL~hOi3!RvZ_Y6hO)zm>>388d(9Vu%e``@K~MQc>j!-l zEzQyqsqHAMlAuVGgYx@f;~gObvFcIS$ZXuS-3xmntJ;mrZ9QFozD6`}SkZd<$=v!` zB9XvLyu?G}i=Ue)6PHo?V2}OSFS~hzN4WL^iy54eRY)%Xve|*zQHZaV!OIsm<)^jr zu54y~uA@BkaWix!XAx-GC8<`+rp59?P_Q5|4N7{a^-|{TcQ3_snD>hBh?sVT_L4SV z>b4%ecWnhKvlMv7A8cNW!-bK8&F9|1WQ7nh13j`auJ93|hCVxHg7h+ey^4U_x2LrY zDuLuq!3Ug{U`Z0;x#cjnW^*3Lx+zn|t@R$pB;KmI!YLR1alc`__k!PvtSg1srAsV` z&DFTfRaN)Ilh-4y=rgUO`t3)}w`E|Nwj7zBE4vY0n*Cy${`CBd8LpzqDT>>A!}NzGnh4EGytlBVlCb{ZftZvi^ zQLq2m91b>~GV~?~j-;y3^RreYQA6D&_LUni$@Bz?$K{NXhL*GX>K_$SWH8S~YO_Pf zoJ-XrxpHE!H`UXTFPVv4BV_oYfQP+3eQbY zV~hwIB-w(kP?iM+^G$mD5(k??><=PNcSG0>m)xjK9aZ;bN1H0CG1Y2bA}@Z{Sl+Ql z^9ozrZ@n~59A}OTw8|+JsML?$^<%#Z)~I5$5iwsYg}56hU04!Y7c;&@D)$wSrHn_M z`2_Bb<@do_{ecW$i%nW*d|GHk%%a6BYliy{W9vv|A=t^$H-U%zW(PG7^BQU)vO>|o z`=FZ@{YHtVpt^cKP{s5fXHwN7ayrHqi$^TG&G~ zklL6lc^X?~Ki(PUB?@)pnMo&18Mke?KT^(7B8{#Ft3U zm!?hPsLc#V@^1LXzn1jG&>rwnER-C!QM`tV#ZpG<3t6s)wC-H@p}v*#(k|}Ykf--- z#z&&kz4=CeN^d)6{{213bpQ8@;?i}2z?ihF^k$%etgtQ_fR==1H6I24o#SG>S6(*c z)+!?e)0Fa}OO2nabcaT31nv3oxl_JQf1WbW8Vaw=TKh#`;+&sNiupk?C2^GQdu?LM zj&z|_^%myJ9nP|-RoQ*uaUJ5;Kx}odkGo3OwyyT8Tlo66uSg^+0F@vzyRp>Wj~TGh z$#TCo&eZ+)?~iqvMM7a+L7-+zAG$K}S!fnO-ei|b8`6{-;9m@PZ!}s;%%^_r73X_p z+u*g5VW0bNVp`*L=&W79h*l-nF%ul&Y0#a)jbxq!^@=;jr3|J{{A($C-EpBRh=03l zSn>!YH1|rfFSB`P*Z~~XUfDY6Vwp}ux5L&Eb)?~nYE9f2A>S-m&Gb}sXFZckVs&@D zr+!$m7FfC|oKl_X;3SpW`oO+OWLZ|Cx3eFpm1x8+HDj3MGP@tQ?neth(|>B9wxoGB zGT#?eXzyxFeRTGie>7vT3rKVBe7~jFHjPi#_G1<<2y+fGCjw>9py_%5slUVpo$wL^ zvuxS#FXPZolb5&1jpI(7+{Uj;Kw%Lf{_t=Y{%B^Ub55Sdu|b+A_0$KbzZi2%&9}al z8>sV*&WIU3G+Zz|7`m=5hY47e3KH~b3+c4&;aJl~3F%&57B1!V!3AAir&@_ zI^pD~t&beR40B@08aj6($5ES65z_5N@vD+S2enAU4E8QIX_zz*(G2b4`A}bKqe|at zmIc#ys8yv}f$2|`-k?IdZ%+#7<8|nq&yLjU15Tu0y3N_%ZYiEP%&54t!hpHv7P#L! zW`MPZlYW)Yl{So@=kgs(zkNQ`cTe5Q{!Uw!g&DP@TGsxK{c+^l6XH^) zbKI)l93;{vMJuP`NU3(-0~!q3gv05qHv8S-oEh_HoEtQDUmrd|lv4`?_yh(2$&k<{ zf>o>)!7kPZJD8gcb1H{l6xp9f9`qHrV>`nQ9&?$#G$Yh&Jye_D`!f0nJR6%cQPlF# zW5y=_z2PMHwZF~$+i=F)mO{aT+7WIt6*~DLv7&8cMg7}Ef#FJTu%ty6;m}}?|AcOZ z(W6^qGN%$kU;$4RKg4{UVUn;xsi)O4Z;Bz%Kukxi8yTOfX+B@cD1)N>1ua#4kGROD zfNn$|^A}%=-fykk)umidm-?1eZ@##Z6Hqr=Iop;-GB8#AiMBr^75Ljg1KH|e!DyD- zC^r{iZ`)gP29D@Yu?kmjwWB=d(QiU)A6H*~ngPMu`00=QJGyLI%|duk-Vk9gVus!_ zf+BB?JHhz465D~j*rV5zS%v;PBXZN%RU+9Bxk>Bgog|0Y2v!&s;2_VOMhUuYSY&E( zd~Nu+zr;t4Nux$OP!_)|M;FyX`1fL~38pb8-lZ49!MehTv(b%Y-sI?RHF}QO()i!5 z|D`8eOe1R4-`RHPB-NYupnivgK3i$eogKaLv%jTJE2bG$&SuNwl0pV89fb7iPv7!+ zrOwo1`>~5?x^-)4jA>SVe;an_9!)RblAw6!CY`7!O5ZrHMYu*@3cM%wu2Vlx!(}db zR2hffwr4YfI-o-r2j@tHwCD=rv0xfWf9_M)2Ze)OEiP$u5-)mNWFFzUI~*}#y}7Vu z)+iCDO@*2&TXm}-c1l_F6Rz|0q#Skv<_(-fZywa$gfNQ&i4=_GhfX~G*xS2jjzbZUe zhkEIdHu5jRNffnuC5}9$COmjiDa|n$Oy$)(VwHj59~vd!EWr{ z>Xm;&J20N*D7}q8_|t2jNKMxA;PBuXCc~Y~h^q7H*shjpI%hgs|+C z=I%A4&9K8p;CB|CA+4kdhTUPY;Y^GYd%XJhbz{jedH04GR#nyO$hr9MD)sj0a)|q@IN$Re%drC#Eq=-uFNMa5! z4g|(_z2Boj3c%JZ&hH7*&gcJk4}L$&%MO5UBH<@q&^Bj(RHC3^`GKiC1-~=<4H!DF zfW#gT(&wUTBYre-ZNrfuw!$k*BS1F30%kh#k7ymV&`OT#6|_J+6_&lII@d}c`lu@a z_lFUVHvA1Bc(_lt4T7AlL$^8%_`QbMUMPJpbCD?+#Av_3zk@t=+7ieKXI(kd%mZs+ z&QPoknEw}o89~!O-b9n58aAjx-jgoX2MEwA{1PX7tH@X7+X#vyw^X|`GkpXwmz;fc z{C@DfrBV|1G~nt$sRjU5w(BlD8RPw(bq-(PuszREz1z|XMKvfQXDu*+7p{giW pfc>t1_UiioHMaj*0dhyVL@-&7*7r#QR|oF#`p)+Z>-4ps{{xy)a@PO= literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/cards/README.md b/packages/org-chart/src/assets/cards/README.md new file mode 100644 index 0000000..0d09d84 --- /dev/null +++ b/packages/org-chart/src/assets/cards/README.md @@ -0,0 +1,13 @@ +# OrgChart 1단계 카드 자산 + +- `대표자.svg`: 사용자가 본문으로 전달한 SVG. 최상단 독립 `topLeader` 전용, 146×74. 부서 자산 매핑에 넣지 않는다. +- `사업관리팀.svg`, `사업관리팀-sm.svg`: 사용자 PNG에서 색상·알파·내측 그라데이션 방향을 추출한 벡터. 조직장 146×68 / 일반 직원 108×52. PNG를 SVG에 삽입하지 않는다. +- 경영기획팀 / 디자인기획팀 / 솔루션통합팀 / 인재성장팀 / 통합시스템 디비전의 큰·작은 SVG 10개: `D:\디자인시스템\카드 이미지`에서 원본 바이트를 그대로 복사했다. SHA-256 일치는 `test-results/org-chart-card-design/browser.json`에서 확인한다. + +부서 매핑은 `src/core/department-card-assets.ts`, 대표자 전용 매핑은 `src/core/representative-card-asset.ts`에 있다. `solution-sales`에 솔루션통합팀 자산을 쓰는 것은 이번 작업에서 사용자가 명시 승인했다. 하위 조직은 실제 `parentId`로 상위 부서 자산을 찾으며 데이터 JSON을 수정하지 않는다. + +사업관리 PNG 원본은 확장자가 없는 `D:\디자인시스템\카드 이미지\사업관리`(PNG, 408×191)다. 추출 색은 외곽 `#DEE6F0 → #A8BBD1 → #577BA5`(마지막 opacity 0.6), 내측 `#FFFFFF → #E0E6F4`다. 경영기획과 색상 끝점은 같지만 사업관리 PNG의 투명도와 내측 그라데이션 방향을 별도로 유지했다. + +재생성: `examples/org-chart/create-business-card-assets.py <원본 PNG 경로>`. Pillow/numpy가 필요하다. 추출 근거는 `business-management-colors.json`, Chrome 실제 래스터 비교는 `business-management-comparison.json`에 보존한다. 신규 벡터의 외곽·곡선 path는 같은 크기의 경영기획 SVG를 재사용한다. + +SVG는 `?inline`으로 번들에 포함되고 별도 장식 이미지 레이어로 렌더링된다. 직원 이름·직위·직책·상태·프로필·관계사 로고는 기존 데이터 레이어다. 파견/휴직 보조 영역에는 새 자산을 전달하지 않는다. 고정 카드 크기의 소비자 override는 이 원본 비율 variant에 적용하지 않는다. diff --git a/packages/org-chart/src/assets/cards/경영기획팀-sm.svg b/packages/org-chart/src/assets/cards/경영기획팀-sm.svg new file mode 100644 index 0000000..908c772 --- /dev/null +++ b/packages/org-chart/src/assets/cards/경영기획팀-sm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/경영기획팀.svg b/packages/org-chart/src/assets/cards/경영기획팀.svg new file mode 100644 index 0000000..6537692 --- /dev/null +++ b/packages/org-chart/src/assets/cards/경영기획팀.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/대표자.svg b/packages/org-chart/src/assets/cards/대표자.svg new file mode 100644 index 0000000..54e2709 --- /dev/null +++ b/packages/org-chart/src/assets/cards/대표자.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/디자인기획팀-sm.svg b/packages/org-chart/src/assets/cards/디자인기획팀-sm.svg new file mode 100644 index 0000000..0e06f6f --- /dev/null +++ b/packages/org-chart/src/assets/cards/디자인기획팀-sm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/디자인기획팀.svg b/packages/org-chart/src/assets/cards/디자인기획팀.svg new file mode 100644 index 0000000..851c5ed --- /dev/null +++ b/packages/org-chart/src/assets/cards/디자인기획팀.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/사업관리팀-sm.svg b/packages/org-chart/src/assets/cards/사업관리팀-sm.svg new file mode 100644 index 0000000..721f00e --- /dev/null +++ b/packages/org-chart/src/assets/cards/사업관리팀-sm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/사업관리팀.svg b/packages/org-chart/src/assets/cards/사업관리팀.svg new file mode 100644 index 0000000..0169c47 --- /dev/null +++ b/packages/org-chart/src/assets/cards/사업관리팀.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/솔루션통합팀-sm.svg b/packages/org-chart/src/assets/cards/솔루션통합팀-sm.svg new file mode 100644 index 0000000..baa0845 --- /dev/null +++ b/packages/org-chart/src/assets/cards/솔루션통합팀-sm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/솔루션통합팀.svg b/packages/org-chart/src/assets/cards/솔루션통합팀.svg new file mode 100644 index 0000000..4aaa71e --- /dev/null +++ b/packages/org-chart/src/assets/cards/솔루션통합팀.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/인재성장팀-sm.svg b/packages/org-chart/src/assets/cards/인재성장팀-sm.svg new file mode 100644 index 0000000..450d299 --- /dev/null +++ b/packages/org-chart/src/assets/cards/인재성장팀-sm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/인재성장팀.svg b/packages/org-chart/src/assets/cards/인재성장팀.svg new file mode 100644 index 0000000..574b620 --- /dev/null +++ b/packages/org-chart/src/assets/cards/인재성장팀.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/통합시스템 디비전-sm.svg b/packages/org-chart/src/assets/cards/통합시스템 디비전-sm.svg new file mode 100644 index 0000000..97374d4 --- /dev/null +++ b/packages/org-chart/src/assets/cards/통합시스템 디비전-sm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/cards/통합시스템 디비전.svg b/packages/org-chart/src/assets/cards/통합시스템 디비전.svg new file mode 100644 index 0000000..cdd6c5b --- /dev/null +++ b/packages/org-chart/src/assets/cards/통합시스템 디비전.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/person-placeholder.svg b/packages/org-chart/src/assets/person-placeholder.svg new file mode 100644 index 0000000..cb28b95 --- /dev/null +++ b/packages/org-chart/src/assets/person-placeholder.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/org-chart/src/assets/workdesk/1-8-4x-1@2x.png b/packages/org-chart/src/assets/workdesk/1-8-4x-1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e29afa36f31186228f5727affc3933073b45bf3f GIT binary patch literal 44551 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/org-chart/src/assets/workdesk/README.md b/packages/org-chart/src/assets/workdesk/README.md new file mode 100644 index 0000000..8489f4e --- /dev/null +++ b/packages/org-chart/src/assets/workdesk/README.md @@ -0,0 +1,11 @@ +# Workdesk Full Composition artwork + +These nine files are copied byte-for-byte from the read-only source +`D:\디자인시스템\gpd-workdesk\sample\조직도_v1.3\public`. +They are embedded by `?inline` imports in the shared Core ESM/IIFE bundles, so +HTML and React need no external Workdesk server or asset URL. + +The compact `screenD` hub paths and original arrow placements are implemented +in `core/workdesk-artwork.ts`. Lower organization relationships retain the +existing engine routes because the source lower SVG block is hidden. +Approved card SVGs and company logo files are untouched. diff --git a/packages/org-chart/src/assets/workdesk/bg_main.png b/packages/org-chart/src/assets/workdesk/bg_main.png new file mode 100644 index 0000000000000000000000000000000000000000..99546b7fea152d183f1ee82e689d396f39a1019d GIT binary patch literal 25189 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

Uks&JHQyZsMf3{L@YkgQQ}Q)e13M}Dgkyt5-F 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

e%_@54+Z^sc_~ZqlPcm4{r^5q!Hi4YMQq^2 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

_@VRyi5z#2E@%J}FV&b*J_(cTSNx{)@ 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 literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/workdesk/team-arrow-blue-purple.png b/packages/org-chart/src/assets/workdesk/team-arrow-blue-purple.png new file mode 100644 index 0000000000000000000000000000000000000000..b700d1677dd2344bf2e2e4fb159809449c0c2239 GIT binary patch literal 295654 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

@5B(qN6zf5HBQ(&f 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∨x?C`wq4U5uDyF+iKqR-iNyPn6zZK9Ah#Y1;b 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

n2L1y3^S_RE5Qt`B>(*K~(8 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�%-DP%<4h+bA4D)OAI?uKs;a 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বScaTx3uPLp}$Wj)rc7W+aO~u-1B}WMUux5 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

    8Yt#`kS_?A3n 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 literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/workdesk/team-arrow-blue-short.png b/packages/org-chart/src/assets/workdesk/team-arrow-blue-short.png new file mode 100644 index 0000000000000000000000000000000000000000..b1374e555ce7ea0b5cf7ab12ec7c398ddfaffd8d GIT binary patch literal 250789 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
    F<3f(`OE8 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Μy=Y(eCP2Xg{nwDi+u3~C#QO@$<*(b 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 z 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
    aF!aE}!AK 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 literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/workdesk/team-arrow-purple-teal.png b/packages/org-chart/src/assets/workdesk/team-arrow-purple-teal.png new file mode 100644 index 0000000000000000000000000000000000000000..d401e5c632ff39455d1217616f66e16242398343 GIT binary patch literal 316191 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�+&eI)MiaKoE&W;|G6bPrbH( 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

    W`^RI(U2l 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%0DKMmyL%aQM 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�Ax{l1W(Ji1(h|$8 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

    {5PP8+Og#(+l}tjn%b+STSgCS-Aw6+vG5Cq*<7 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 literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/assets/workdesk/team-arrow-teal-green.png b/packages/org-chart/src/assets/workdesk/team-arrow-teal-green.png new file mode 100644 index 0000000000000000000000000000000000000000..029df1ee03cfb9cd7a4a6b8d180042ad3b98a85a GIT binary patch literal 281435 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

    As)~u6 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 z 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 JrTGE-{tw93BoY7s literal 0 HcmV?d00001 diff --git a/packages/org-chart/src/components.ts b/packages/org-chart/src/components.ts new file mode 100644 index 0000000..4355797 --- /dev/null +++ b/packages/org-chart/src/components.ts @@ -0,0 +1,24 @@ +import { createOrgChartView } from './core/index.js'; +import type { OrgChartHandle, OrgChartOptions } from './core/types.js'; + +/** Standalone summaries share the same source, validation, update/reload and + * dispose contract as OrgChart. Only the independent core CSS is required. */ +export interface OrgChartSummaryComponentOptions extends Pick { + stylesheetUrl: string; +} +function summaryOptions(options: OrgChartSummaryComponentOptions): OrgChartOptions { + return { ...options, stylesheetUrls: { core: options.stylesheetUrl, engine: '' } }; +} +export function createPositionSummary(options: OrgChartSummaryComponentOptions): OrgChartHandle { + return createOrgChartView(summaryOptions(options), 'positionSummary'); +} +export function createAffiliationSummary(options: OrgChartSummaryComponentOptions): OrgChartHandle { + return createOrgChartView(summaryOptions(options), 'affiliationSummary'); +} +export function createStatusSummary(options: OrgChartSummaryComponentOptions): OrgChartHandle { + return createOrgChartView(summaryOptions(options), 'statusSummary'); +} +/** Tree-only component: no title, leader composition, hub or summary modules. */ +export function createOrgChartTree(options: OrgChartOptions): OrgChartHandle { + return createOrgChartView(options, 'tree'); +} diff --git a/packages/org-chart/src/core/affiliation-bar.ts b/packages/org-chart/src/core/affiliation-bar.ts new file mode 100644 index 0000000..606c72b --- /dev/null +++ b/packages/org-chart/src/core/affiliation-bar.ts @@ -0,0 +1,37 @@ +import { selectAffiliationSummary } from '../data/content-selectors.js'; +import type { RenderContext } from './render.js'; +import { createAffiliationMark } from './affiliation-mark.js'; + +/** Read-only composition presenter: one untitled line of logo · name · count and + * the total. The standalone AffiliationSummary keeps its titled card layout; + * both use the same selector and Summary counts. */ +export function createAffiliationBar(document: Document, context: RenderContext, signal: AbortSignal): HTMLElement { + const section = document.createElement('section'); + section.className = 'hm-orgchart-affiliation-bar'; + section.dataset.contentSection = 'affiliation-bar'; + section.setAttribute('aria-label', '관계사별 인원 현황'); + const list = document.createElement('dl'); + list.className = 'hm-orgchart-affiliation-bar-list'; + for (const { affiliation, count } of selectAffiliationSummary(context.data, context.summary)) { + const item = document.createElement('div'); + item.className = 'hm-orgchart-affiliation-bar-item'; + item.dataset.affiliationId = affiliation.id; + item.dataset.employeeCount = String(count); + const name = document.createElement('dt'); + name.textContent = affiliation.name; + name.prepend(createAffiliationMark(document, affiliation.id, affiliation.name, signal)); + const value = document.createElement('dd'); + value.textContent = `${count}명`; + item.append(name, value); + list.append(item); + } + const total = document.createElement('div'); + total.className = 'hm-orgchart-affiliation-bar-item hm-orgchart-affiliation-bar-total'; + total.dataset.totalCount = String(context.summary.raw.total); + const label = document.createElement('dt'); label.textContent = '총계'; + const value = document.createElement('dd'); value.textContent = `${context.summary.raw.total}명`; + total.append(label, value); + list.append(total); + section.append(list); + return section; +} diff --git a/packages/org-chart/src/core/affiliation-mark.ts b/packages/org-chart/src/core/affiliation-mark.ts new file mode 100644 index 0000000..021c86b --- /dev/null +++ b/packages/org-chart/src/core/affiliation-mark.ts @@ -0,0 +1,45 @@ +import hanmac from '../assets/affiliations/hanmac.png?inline'; +import saman from '../assets/affiliations/saman.png?inline'; +import jangheon from '../assets/affiliations/jangheon.png?inline'; +import jangheonIndustry from '../assets/affiliations/jangheon-industry.png?inline'; +import ptc from '../assets/affiliations/ptc.png?inline'; +import halla from '../assets/affiliations/halla.png?inline'; +import baron from '../assets/affiliations/baron.png?inline'; + +// Asset mapping is an internal presentation concern; the employee/affiliation +// JSON contract continues to use only its existing id and name fields. +const logos = new Map([ + ['hanmac', hanmac], ['saman', saman], ['jangheon', jangheon], + ['jangheon-industry', jangheonIndustry], ['ptc', ptc], ['halla', halla], ['baron', baron], +]); + +/** Shared by employee cards and the affiliation summary footer. */ +export function createAffiliationMark( + document: Document, affiliationId: string, name: string, signal?: AbortSignal, +): HTMLElement { + const mark = document.createElement('span'); + mark.className = 'hm-orgchart-affiliation-mark'; + mark.dataset.affiliationId = affiliationId; + mark.setAttribute('role', 'img'); + mark.setAttribute('aria-label', `관계사 ${name}`); + mark.title = name; + const fallback = document.createElement('span'); + fallback.className = 'hm-orgchart-affiliation-fallback'; + fallback.textContent = Array.from(name.trim()).slice(0, 2).join('') || '?'; + mark.append(fallback); + + const logo = logos.get(affiliationId); + mark.dataset.logoAvailable = String(Boolean(logo)); + if (logo) { + const image = document.createElement('img'); + image.alt = ''; + image.decoding = 'async'; + image.addEventListener('error', () => { + image.remove(); + mark.dataset.logoAvailable = 'false'; + }, { once: true, ...(signal ? { signal } : {}) }); + image.src = logo; + mark.append(image); + } + return mark; +} diff --git a/packages/org-chart/src/core/affiliation-summary.ts b/packages/org-chart/src/core/affiliation-summary.ts new file mode 100644 index 0000000..a230b81 --- /dev/null +++ b/packages/org-chart/src/core/affiliation-summary.ts @@ -0,0 +1,42 @@ +import { selectAffiliationSummary } from '../data/content-selectors.js'; +import type { RenderContext } from './render.js'; +import { createAffiliationMark } from './affiliation-mark.js'; + +export function createAffiliationSummary(document: Document, context: RenderContext): HTMLElement { + const section = document.createElement('section'); + section.className = 'hm-orgchart-affiliation-summary'; + section.dataset.contentSection = 'affiliation-summary'; + section.setAttribute('aria-label', '관계사별 원본 인원 현황'); + const heading = document.createElement('h3'); + heading.className = 'hm-orgchart-summary-title'; + heading.textContent = '관계사별 인원 현황'; + const total = document.createElement('p'); + total.className = 'hm-orgchart-raw-total'; + total.textContent = `Raw Count · 전체 ${context.summary.raw.total}명`; + section.append(heading, total); + const list = document.createElement('dl'); + list.className = 'hm-orgchart-affiliation-list'; + for (const { affiliation, count } of selectAffiliationSummary(context.data, context.summary)) { + const item = document.createElement('div'); + item.className = 'hm-orgchart-affiliation-item'; + item.dataset.affiliationId = affiliation.id; + const name = document.createElement('dt'); + name.className = 'hm-orgchart-affiliation-name'; + // The contract has no logo field. The declared name is the safe textual fallback. + name.textContent = affiliation.name; + name.prepend(createAffiliationMark(document, affiliation.id, affiliation.name)); + const value = document.createElement('dd'); + value.className = 'hm-orgchart-affiliation-count'; + value.textContent = `${count}명`; + item.append(name, value); + list.append(item); + } + section.append(list); + if (!context.data.affiliations.length) { + const empty = document.createElement('p'); + empty.className = 'hm-orgchart-content-empty'; + empty.textContent = '등록된 관계사가 없습니다.'; + section.append(empty); + } + return section; +} diff --git a/packages/org-chart/src/core/contrast.test.ts b/packages/org-chart/src/core/contrast.test.ts new file mode 100644 index 0000000..0314740 --- /dev/null +++ b/packages/org-chart/src/core/contrast.test.ts @@ -0,0 +1,97 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { contrastRatio, evaluateGradientContrast, parseOpaqueColor, parseVerticalGradient, relativeLuminance, textContrastThreshold } from './contrast.js'; + +const near = (actual: number, expected: number, tolerance = 0.001) => assert.ok(Math.abs(actual - expected) < tolerance, `${actual} ≈ ${expected}`); +const integrated = 'linear-gradient(180deg, #8c67b6 0%, #5d3494 100%)'; +const design = 'linear-gradient(180deg, rgb(9, 167, 162) 0%, rgb(0, 132, 127) 100%)'; + +test('standard sRGB luminance and contrast use unrounded channels with symmetric ratios', () => { + near(relativeLuminance([0, 0, 0]), 0); + near(relativeLuminance([255, 255, 255]), 1); + near(contrastRatio([0, 0, 0], [255, 255, 255]), 21); + near(contrastRatio([16, 36, 59], [255, 255, 255]), 15.7005); + near(contrastRatio([89, 101, 117], [244, 247, 251]), 5.5160); + assert.equal(contrastRatio([16, 36, 59], [255, 255, 255]), contrastRatio([255, 255, 255], [16, 36, 59])); +}); + +test('color parser accepts opaque HEX and computed RGB, rejects transparent/unknown compositing', () => { + assert.deepEqual(parseOpaqueColor('#09a7a2'), [9, 167, 162]); + assert.deepEqual(parseOpaqueColor('#fff'), [255, 255, 255]); + assert.deepEqual(parseOpaqueColor('rgb(16 36 59)'), [16, 36, 59]); + assert.deepEqual(parseOpaqueColor('rgba(16, 36, 59, 1)'), [16, 36, 59]); + for (const value of ['rgba(0, 0, 0, 0.5)', '#ffffff80', 'transparent', 'red', 'rgb(100% 0% 0%)', 'color(display-p3 1 0 0)', 'rgb(256, 0, 0)']) assert.equal(parseOpaqueColor(value), null); +}); + +test('large text threshold uses measured size/weight and does not treat 15px bold as large', () => { + assert.equal(textContrastThreshold(15, 700), 4.5); + assert.equal(textContrastThreshold(19.5, 700), 3); + assert.equal(textContrastThreshold(18.6, 700), 4.5); + assert.equal(textContrastThreshold(14 * 96 / 72, 700), 3); + assert.equal(textContrastThreshold(19.5, 500), 4.5); + assert.equal(textContrastThreshold(24, 400), 3); +}); + +test('restricted gradient parser preserves RGB commas and explicit ordered percent stops', () => { + assert.equal(parseVerticalGradient(design)!.stops.length, 2); + assert.deepEqual(parseVerticalGradient(design)!.stops[0]!.color, [9, 167, 162]); + assert.equal(parseVerticalGradient('linear-gradient(180deg, #000 0%, #fff 25%, #000 100%)')!.stops[1]!.offset, 0.25); + for (const value of ['linear-gradient(90deg, #000 0%, #fff 100%)', 'linear-gradient(180deg in oklab, #000 0%, #fff 100%)', 'linear-gradient(180deg, #000, #fff)', 'linear-gradient(180deg, #000 0px, #fff 100px)', 'linear-gradient(180deg, #000 0%, #fff 50%)', 'linear-gradient(180deg, #000 0%, #fff 0%, #000 100%)', 'linear-gradient(180deg, #000 0%, #fff 100%), url(x)', 'url(image.png)', 'repeating-linear-gradient(180deg, #000 0%, #fff 100%)']) assert.equal(parseVerticalGradient(value), null, value); +}); + +test('browser-computed omitted default angle is equivalent to 180deg, without inferring omitted stops', () => { + const computed = 'linear-gradient(rgb(9, 167, 162) 0%, rgb(0, 132, 127) 100%)'; + assert.deepEqual(parseVerticalGradient(computed), parseVerticalGradient(design)); + const input = { foreground: '#fff', ranges: [{ top: 6, bottom: 24 }], backgroundHeight: 30 }; + assert.deepEqual(evaluateGradientContrast({ ...input, backgroundImage: computed }), evaluateGradientContrast({ ...input, backgroundImage: design })); + assert.equal(parseVerticalGradient('linear-gradient(rgb(9, 167, 162), rgb(0, 132, 127))'), null); +}); + +test('inset actual text model can pass while a conservative stop value is below 4.5', () => { + const result = evaluateGradientContrast({ foreground: '#fff', backgroundImage: integrated, ranges: [{ top: 6, bottom: 24 }], backgroundHeight: 30 }); + assert.equal(result.status, 'MODEL'); + near(result.stopMinimum!, 4.4391); + assert.ok(result.stopMinimum! < 4.5); + assert.ok(result.textRegionMinimum! > 5); + assert.ok(result.textRegionMinimum! > result.fullGradientMinimum!); +}); + +test('current large title and normal Full title thresholds remain independent for the same actual area', () => { + const result = evaluateGradientContrast({ foreground: '#fff', backgroundImage: design, ranges: [{ top: 6, bottom: 24 }], backgroundHeight: 30 }); + assert.ok(result.textRegionMinimum! >= textContrastThreshold(19.5, 700)); + assert.ok(result.textRegionMinimum! < textContrastThreshold(15, 700)); + const black = evaluateGradientContrast({ foreground: '#000', backgroundImage: design, ranges: [{ top: 0, bottom: 30 }], backgroundHeight: 30 }); + near(black.fullGradientMinimum!, 4.6070); + assert.ok(black.fullGradientMinimum! >= 4.5); +}); + +test('all actual line ranges are included, preserving a weak wrapped line', () => { + const first = evaluateGradientContrast({ foreground: '#fff', backgroundImage: integrated, ranges: [{ top: 60, bottom: 80 }], backgroundHeight: 100 }); + const wrapped = evaluateGradientContrast({ foreground: '#fff', backgroundImage: integrated, ranges: [{ top: 60, bottom: 80 }, { top: 0, bottom: 10 }], backgroundHeight: 100 }); + assert.ok(first.textRegionMinimum! > 4.5); + near(wrapped.textRegionMinimum!, wrapped.stopMinimum!); + assert.ok(wrapped.textRegionMinimum! < first.textRegionMinimum!); +}); + +test('stop minima never substitute for whole-gradient sampling when foreground meets an interior color', () => { + const result = evaluateGradientContrast({ foreground: '#777', backgroundImage: 'linear-gradient(180deg, #000 0%, #fff 100%)', ranges: [{ top: 40, bottom: 55 }], backgroundHeight: 100 }); + assert.ok(result.stopMinimum! > 4); + assert.ok(result.fullGradientMinimum! < 1.02); + assert.ok(result.textRegionMinimum! < 1.03); +}); + +test('unsupported backgrounds, alpha, missing/clipped ranges and unbounded sample requests remain NOT VERIFIED', () => { + const valid = { foreground: '#fff', backgroundImage: integrated, ranges: [{ top: 2, bottom: 20 }], backgroundHeight: 30 }; + for (const input of [ + { ...valid, foreground: 'rgba(255, 255, 255, 0.5)' }, { ...valid, backgroundImage: 'url(x)' }, + { ...valid, ranges: [] }, { ...valid, ranges: [{ top: -1, bottom: 20 }] }, + { ...valid, ranges: [{ top: 2, bottom: 31 }] }, { ...valid, ranges: [{ top: 20, bottom: 2 }] }, + { ...valid, backgroundHeight: NaN }, { ...valid, backgroundHeight: 0 }, { ...valid, sampleStep: 0 }, + { ...valid, sampleStep: 0.000001 }, + ]) { + const result = evaluateGradientContrast(input); + assert.equal(result.status, 'NOT VERIFIED'); + assert.equal(result.textRegionMinimum, undefined); + assert.ok(result.reason); + } +}); diff --git a/packages/org-chart/src/core/contrast.ts b/packages/org-chart/src/core/contrast.ts new file mode 100644 index 0000000..06c002e --- /dev/null +++ b/packages/org-chart/src/core/contrast.ts @@ -0,0 +1,93 @@ +/** Internal contrast arithmetic. Results model opaque legacy sRGB colors; + * they are not pixel measurements or a claim about every rendered instance. */ +export type Rgb = readonly [number, number, number]; +export interface VerticalGradient { stops: readonly { color: Rgb; offset: number }[] } +export interface ContrastModel { + status: 'MODEL' | 'NOT VERIFIED'; + reason?: string; + stopMinimum?: number; + fullGradientMinimum?: number; + textRegionMinimum?: number; +} + +export function parseOpaqueColor(value: string): Rgb | null { + const text = value.trim(); + if (/^#[\da-f]{6}$/i.test(text)) return [1, 3, 5].map(index => parseInt(text.slice(index, index + 2), 16)) as unknown as Rgb; + if (/^#[\da-f]{3}$/i.test(text)) return [...text.slice(1)].map(part => parseInt(part + part, 16)) as unknown as Rgb; + const match = /^rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(text); + if (!match || (match[4] !== undefined && Number(match[4]) !== 1)) return null; + const channels = match.slice(1, 4).map(Number); + return channels.every(channel => Number.isFinite(channel) && channel >= 0 && channel <= 255) ? channels as unknown as Rgb : null; +} + +export function relativeLuminance(color: Rgb): number { + const channels = color.map(channel => { + const encoded = channel / 255; + return encoded <= 0.04045 ? encoded / 12.92 : ((encoded + 0.055) / 1.055) ** 2.4; + }); + return channels[0]! * 0.2126 + channels[1]! * 0.7152 + channels[2]! * 0.0722; +} + +export function contrastRatio(foreground: Rgb, background: Rgb): number { + const first = relativeLuminance(foreground), second = relativeLuminance(background); + return (Math.max(first, second) + 0.05) / (Math.min(first, second) + 0.05); +} + +/** Restricted intentionally: no alpha, images, multiple layers, omitted stops, + * other angles, color spaces, relative units, or repeating gradients. + * Computed CSS may omit the default 180deg angle; that is equivalent. */ +export function parseVerticalGradient(value: string): VerticalGradient | null { + const outer = /^linear-gradient\(\s*(?:180deg\s*,\s*)?(.*)\)$/i.exec(value.trim()); + if (!outer) return null; + const parts = outer[1]!.split(/,(?![^()]*\))/); + const stops: { color: Rgb; offset: number }[] = []; + for (const part of parts) { + const match = /^\s*(#[\da-f]+|rgba?\([^()]*\))\s+([\d.]+)%\s*$/i.exec(part); + const color = match && parseOpaqueColor(match[1]!); + const offset = match ? Number(match[2]) / 100 : NaN; + if (!color || !Number.isFinite(offset) || offset < 0 || offset > 1 || (stops.length > 0 && offset <= stops.at(-1)!.offset)) return null; + stops.push({ color, offset }); + } + return stops.length >= 2 && stops[0]!.offset === 0 && stops.at(-1)!.offset === 1 ? { stops } : null; +} + +function gradientColor(gradient: VerticalGradient, offset: number): Rgb { + let index = 1; + while (index < gradient.stops.length - 1 && offset > gradient.stops[index]!.offset) index++; + const before = gradient.stops[index - 1]!, after = gradient.stops[index]!; + const amount = (offset - before.offset) / (after.offset - before.offset); + return before.color.map((channel, channelIndex) => channel + (after.color[channelIndex]! - channel) * amount) as unknown as Rgb; +} + +export function textContrastThreshold(fontSizePx: number, fontWeight: number): 3 | 4.5 { + return fontSizePx >= 24 || (fontWeight >= 700 && fontSizePx >= 14 * 96 / 72) ? 3 : 4.5; +} + +/** Ranges are actual text line rectangles in CSS px relative to the gradient + * painting box, not the padded heading rectangle. The whole-gradient sample + * and stop sample are reported separately; neither substitutes for text area. */ +export function evaluateGradientContrast(input: { + foreground: string; + backgroundImage: string; + ranges: readonly { top: number; bottom: number }[]; + backgroundHeight: number; + sampleStep?: number; +}): ContrastModel { + const foreground = parseOpaqueColor(input.foreground), gradient = parseVerticalGradient(input.backgroundImage); + if (!foreground || !gradient) return { status: 'NOT VERIFIED', reason: '지원하지 않는 색상/gradient: 불투명 sRGB 180deg 및 명시적 % stop만 지원' }; + const height = input.backgroundHeight, step = input.sampleStep ?? 1; + if (!Number.isFinite(height) || height <= 0 || !Number.isFinite(step) || step <= 0 || height / step > 10000 || input.ranges.length === 0 || input.ranges.some(range => !Number.isFinite(range.top) || !Number.isFinite(range.bottom) || range.top < 0 || range.bottom > height || range.bottom <= range.top)) { + return { status: 'NOT VERIFIED', reason: '텍스트 범위/배경 높이/샘플 간격 확인 불가' }; + } + const ratioAt = (offset: number) => contrastRatio(foreground, gradientColor(gradient, offset)); + const stopMinimum = Math.min(...gradient.stops.map(stop => contrastRatio(foreground, stop.color))); + let fullGradientMinimum = stopMinimum; + for (let index = 0; index <= 256; index++) fullGradientMinimum = Math.min(fullGradientMinimum, ratioAt(index / 256)); + let textRegionMinimum = Infinity; + for (const range of input.ranges) { + textRegionMinimum = Math.min(textRegionMinimum, ratioAt(range.top / height), ratioAt(range.bottom / height)); + for (let y = range.top + step; y < range.bottom; y += step) textRegionMinimum = Math.min(textRegionMinimum, ratioAt(y / height)); + for (const stop of gradient.stops) if (stop.offset * height >= range.top && stop.offset * height <= range.bottom) textRegionMinimum = Math.min(textRegionMinimum, ratioAt(stop.offset)); + } + return { status: 'MODEL', stopMinimum, fullGradientMinimum, textRegionMinimum }; +} diff --git a/packages/org-chart/src/core/department-card-assets.ts b/packages/org-chart/src/core/department-card-assets.ts new file mode 100644 index 0000000..c173c8c --- /dev/null +++ b/packages/org-chart/src/core/department-card-assets.ts @@ -0,0 +1,53 @@ +import businessLeader from '../assets/cards/경영기획팀.svg?inline'; +import businessEmployee from '../assets/cards/경영기획팀-sm.svg?inline'; +import managementLeader from '../assets/cards/사업관리팀.svg?inline'; +import managementEmployee from '../assets/cards/사업관리팀-sm.svg?inline'; +import designLeader from '../assets/cards/디자인기획팀.svg?inline'; +import designEmployee from '../assets/cards/디자인기획팀-sm.svg?inline'; +import solutionLeader from '../assets/cards/솔루션통합팀.svg?inline'; +import solutionEmployee from '../assets/cards/솔루션통합팀-sm.svg?inline'; +import talentLeader from '../assets/cards/인재성장팀.svg?inline'; +import talentEmployee from '../assets/cards/인재성장팀-sm.svg?inline'; +import systemLeader from '../assets/cards/통합시스템 디비전.svg?inline'; +import systemEmployee from '../assets/cards/통합시스템 디비전-sm.svg?inline'; + +export type DepartmentCardSize = 'leader' | 'employee'; +export interface DepartmentCardAsset { + departmentId: string; + label: string; + size: DepartmentCardSize; + url: string; + width: number; + height: number; +} + +// Presentation-only mapping. The ten supplied SVGs are copied byte-for-byte; +// business-management uses vectors generated from the supplied PNG's colors. +// Vite embeds both in ESM/IIFE bundles, including file:// consumers. +// User-approved alias: 솔루션통합팀 assets -> existing solution-sales data. +const departments = new Map([ + ['business-management', { label: '사업관리팀', leader: managementLeader, employee: managementEmployee }], + ['business-planning', { label: '경영기획팀', leader: businessLeader, employee: businessEmployee }], + ['design-planning', { label: '디자인기획팀', leader: designLeader, employee: designEmployee }], + ['solution-sales', { label: '솔루션통합팀', leader: solutionLeader, employee: solutionEmployee }], + ['talent-growth', { label: '인재성장팀', leader: talentLeader, employee: talentEmployee }], + ['integrated-system', { label: '통합시스템 Div', leader: systemLeader, employee: systemEmployee }], +]); + +/** Resolve actual ancestry; do not infer a department from ID spelling/colors. + * Unknown organizations and departments without supplied assets stay unchanged. */ +export function getDepartmentCardAsset( + departmentId: string, size: DepartmentCardSize, + organizations: readonly { id: string; parentId: string | null }[] = [], +): DepartmentCardAsset | undefined { + const visited = new Set(); + let current: string | null = departmentId; + while (current && !visited.has(current)) { + visited.add(current); + const entry = departments.get(current); + if (entry) return { departmentId: current, label: entry.label, size, url: entry[size], + width: size === 'leader' ? 146 : 108, height: size === 'leader' ? 68 : 52 }; + current = organizations.find(item => item.id === current)?.parentId ?? null; + } + return undefined; +} diff --git a/packages/org-chart/src/core/department-colors.ts b/packages/org-chart/src/core/department-colors.ts new file mode 100644 index 0000000..80c9949 --- /dev/null +++ b/packages/org-chart/src/core/department-colors.ts @@ -0,0 +1,185 @@ +import type { RenderContext } from './render'; +import { applyOrganizationStyle, organizationStylePresets } from './style-presets'; +import { createEmployeeCard } from './employee-card'; +import { contrastRatio, evaluateGradientContrast, parseOpaqueColor, textContrastThreshold } from './contrast'; +import { getDepartmentCardAsset } from './department-card-assets'; +import { representativeCardAsset } from './representative-card-asset'; + +export function createDepartmentColors(document: Document, context: RenderContext, signal: AbortSignal): HTMLElement { + const section = document.createElement('section'); section.className = 'hm-orgchart-department-colors'; + const note = document.createElement('p'); + note.textContent = 'OrgChart 독립 디자인. 대표자 전용 SVG 146×74, 부서 조직장 SVG 146×68, 일반 직원 SVG 108×52를 구분합니다. 5개 조직은 전달된 원본 SVG이며 사업관리는 전달 PNG의 색상·투명도를 추출해 제작한 SVG입니다. 솔루션통합팀 자산은 기존 솔루션영업에 매핑합니다. 아래 색상 견본은 기존 헤더·기본 카드 CSS 값이며 SVG 픽셀 색상이 아닙니다. 공통 HM Theme Token을 사용하지 않습니다. 직원과 인원 통계는 가상 데이터입니다.'; + section.append(note); + const contrastNote = document.createElement('p'); contrastNote.className = 'hm-orgchart-contrast-note'; + contrastNote.textContent = '대비는 불투명 sRGB 180deg gradient와 실제 텍스트 Range의 줄별 영역을 사용한 계산 MODEL입니다(픽셀 실측 아님). 전체 stop 최소값은 실제 글자 영역 판정과 별도로 표시합니다. 큰 Story 제목의 PASS는 Full Composition 15px 일반 텍스트의 PASS를 뜻하지 않습니다. 후보는 미승인·운영 미적용이며 브랜드 gradient를 유지하더라도 텍스트/배경 변경 승인이 필요합니다.'; + section.append(contrastNote); + const representative = context.data.employees.find(item => context.topLeaderIds.has(item.id)); + if (representative) { + const preview = document.createElement('section'); preview.className = 'hm-orgchart-representative-preview'; + const title = document.createElement('h2'); title.textContent = '대표자 전용 카드 · 146×74'; + const caption = document.createElement('p'); caption.textContent = '최상단 단독 리더 전용 SVG이며 부서 조직장(146×68)과 별도 종류입니다.'; + preview.append(title, createEmployeeCard(document, representative, { kind: 'topLeader', cardAsset: representativeCardAsset, + affiliationName: context.data.affiliations.find(item => item.id === representative.affiliationId)?.name }, signal), caption); + section.append(preview); + } + for (let index = 0; index < organizationStylePresets.length; index++) { + const preset = organizationStylePresets[index]!; + const row = document.createElement('section'); row.className = 'hm-orgchart-color-preview'; + applyOrganizationStyle(row, index); + const heading = document.createElement('h2'); heading.className = 'hm-orgchart-color-department-name'; heading.textContent = preset.label; + heading.dataset.contrastTarget = 'current'; + const source = document.createElement('p'); source.textContent = `${preset.source} · ${preset.observedOn} · ${preset.version} · ${preset.selector}`; + const legend = document.createElement('dl'); legend.className = 'hm-orgchart-color-legend'; + const entries = [ + ['카드 배경', 'card-background', 'current-card-background', 'background-color', 'DESIGN_ADAPTATION: OrgChart 기본값'], + ['직원 텍스트', 'card-color', 'current-card-color', 'color', 'DESIGN_ADAPTATION: OrgChart 기본값'], + ['부서명 텍스트', 'department-color', 'current-department-color', 'color', `WORKDESK_COMPUTED: ${preset.departmentColor}`], + ['테두리', 'border', 'current-border', 'background-color', `DESIGN_ADAPTATION: ${preset.borderColor}, 헤더 시작색 재사용; 원본 카드 테두리 NOT VERIFIED`], + ['Gradient', 'gradient', 'current-gradient', 'background-image', `WORKDESK_COMPUTED: ${preset.backgroundImage}`], + ]; + for (const [label, suffix, resolved, property, evidence] of entries) { + const term = document.createElement('dt'); term.textContent = label!; + const detail = document.createElement('dd'); + const swatch = document.createElement('span'); swatch.className = 'hm-orgchart-color-swatch'; + swatch.style.setProperty(property!, `var(--hm-orgchart-${resolved})`); + if (property === 'color') { + swatch.textContent = 'Aa'; + swatch.style.background = suffix === 'department-color' ? 'var(--hm-orgchart-current-gradient)' : 'var(--hm-orgchart-current-card-background)'; + } + swatch.dataset.colorVariable = `${preset.variablePrefix}-${suffix}`; swatch.dataset.cssProperty = property; + const variable = document.createElement('code'); variable.textContent = swatch.dataset.colorVariable; + const value = document.createElement('span'); value.className = 'hm-orgchart-color-value'; + const provenance = document.createElement('span'); provenance.textContent = `${evidence} · OrgChart 전용 변수`; + detail.append(swatch, variable, value, provenance); legend.append(term, detail); + } + const cards = document.createElement('div'); cards.className = 'hm-orgchart-preview-grid'; + const organization = context.data.organizations.find(item => item.id === preset.organizationId); + const descendants = new Set([preset.organizationId]); + for (const item of context.orderedOrganizations) if (item.parentId && descendants.has(item.parentId)) descendants.add(item.id); + const leader = context.data.employees.find(item => item.id === organization?.leaderId); + const leaderIds = new Set(context.data.organizations.map(item => item.leaderId).filter(Boolean)); + const employee = context.data.employees.find(item => descendants.has(item.organizationId) && !leaderIds.has(item.id)); + for (const [person, size] of [[leader, 'leader'], [employee, 'employee']] as const) { + if (!person) continue; + const asset = getDepartmentCardAsset(preset.organizationId, size); + const specimen = document.createElement('div'); specimen.className = 'hm-orgchart-card-specimen'; + const caption = document.createElement('p'); caption.className = 'hm-orgchart-card-caption'; + caption.textContent = asset ? `${asset.label} · ${size === 'leader' ? '조직장' : '일반 직원'} ${asset.width}×${asset.height} · ${asset.departmentId === 'business-management' ? 'PNG 색상 추출 SVG' : '원본 SVG'}` : `${preset.label} · ${size === 'leader' ? '조직장' : '일반 직원'} · 기존 기본 카드(전달 자산 없음)`; + specimen.append(createEmployeeCard(document, person, { kind: size, cardAsset: asset, affiliationName: context.data.affiliations.find(item => item.id === person.affiliationId)?.name }, signal), caption); + cards.append(specimen); + } + const contrast = document.createElement('section'); contrast.className = 'hm-orgchart-contrast-comparison'; + const comparisonTitle = document.createElement('h3'); comparisonTitle.textContent = '텍스트 대비 MODEL · 현재 / 일반 제목 / 미적용 후보'; + const normal = document.createElement('div'); normal.className = 'hm-orgchart-contrast-normal'; normal.dataset.contrastTarget = 'full-normal'; normal.textContent = preset.label; + const candidate = document.createElement('div'); candidate.className = 'hm-orgchart-contrast-candidate'; candidate.dataset.contrastTarget = 'candidate'; candidate.dataset.designStatus = 'UNAPPROVED_NOT_APPLIED'; candidate.textContent = preset.label; + candidate.style.color = 'var(--hm-orgchart-contrast-candidate-color, #10243b)'; + const chip = document.createElement('div'); chip.className = 'hm-orgchart-contrast-chip'; chip.dataset.designStatus = 'UNAPPROVED_NOT_APPLIED'; + const chipLabel = document.createElement('span'); chipLabel.className = 'hm-orgchart-contrast-chip-label'; chipLabel.dataset.contrastTarget = 'candidate-chip'; chipLabel.textContent = preset.label; + chipLabel.style.color = 'var(--hm-orgchart-contrast-candidate-color, #10243b)'; chipLabel.style.backgroundColor = 'var(--hm-orgchart-contrast-candidate-chip-background, #ffffff)'; chip.append(chipLabel); + const results = document.createElement('dl'); results.className = 'hm-orgchart-contrast-results'; + for (const [key, label] of [['current', '현재 Story 제목: 실제 크기 기준'], ['full-normal', 'Full 제목 동등 예제: 15px bold 일반 텍스트'], ['candidate', '후보 #10243b: 미승인·미적용'], ['candidate-chip', '후보 white label + #10243b: 미승인·미적용']]) { + const term = document.createElement('dt'); term.textContent = label; + const result = document.createElement('dd'); result.className = 'hm-orgchart-contrast-result'; result.dataset.contrastFor = key; result.dataset.contrastStatus = 'NOT VERIFIED'; result.textContent = 'NOT VERIFIED · CSS/텍스트 영역 측정 대기'; results.append(term, result); + } + const stops = document.createElement('p'); stops.className = 'hm-orgchart-contrast-stops'; stops.textContent = '전체 gradient stop 및 흑색 대안 MODEL: NOT VERIFIED'; + contrast.append(comparisonTitle, normal, candidate, chip, results, stops); + row.append(heading, source, legend, cards, contrast); section.append(row); + } + return section; +} + +export function updateDepartmentColorValues(root: HTMLElement): void { + const window = root.ownerDocument.defaultView; + if (!window) return; + for (const swatch of root.querySelectorAll('[data-color-variable]')) { + const raw = window.getComputedStyle(swatch).getPropertyValue(swatch.dataset.cssProperty!); + const value = swatch.parentElement!.querySelector('.hm-orgchart-color-value')!; + const text = raw.replace(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/g, (_, r: string, g: string, b: string) => `#${[r, g, b].map(part => Number(part).toString(16).padStart(2, '0')).join('')}`); + if (value.textContent !== text) value.textContent = text; + } + updateDepartmentContrastValues(root); +} + +/** Runtime DOM geometry feeds the pure model. Unknown compositing stays NV; + * this deliberately does not claim to inspect browser-rendered pixel colors. */ +export function updateDepartmentContrastValues(root: HTMLElement): void { + const window = root.ownerDocument.defaultView; + if (!window) return; + for (const row of root.querySelectorAll('.hm-orgchart-color-preview')) { + for (const target of row.querySelectorAll('[data-contrast-target]')) { + const output = row.querySelector(`[data-contrast-for="${target.dataset.contrastTarget}"]`); + if (!output) continue; + const measurement = measureTextContrast(target); + output.dataset.contrastStatus = measurement.status; + output.dataset.contrastModel = measurement.model; + if (output.textContent !== measurement.text) output.textContent = measurement.text; + for (const key of ['contrastRatio', 'contrastThreshold', 'contrastFontSize', 'contrastFontWeight'] as const) delete output.dataset[key]; + if (measurement.ratio !== undefined) output.dataset.contrastRatio = String(measurement.ratio); + if (measurement.threshold !== undefined) output.dataset.contrastThreshold = String(measurement.threshold); + if (measurement.fontSize !== undefined) output.dataset.contrastFontSize = String(measurement.fontSize); + if (measurement.fontWeight !== undefined) output.dataset.contrastFontWeight = String(measurement.fontWeight); + } + const heading = row.querySelector('[data-contrast-target="current"]')!; + const style = window.getComputedStyle(heading), height = heading.getBoundingClientRect().height; + const current = evaluateGradientContrast({ foreground: style.color, backgroundImage: style.backgroundImage, ranges: [{ top: 0, bottom: height }], backgroundHeight: height }); + const black = evaluateGradientContrast({ foreground: '#000000', backgroundImage: style.backgroundImage, ranges: [{ top: 0, bottom: height }], backgroundHeight: height }); + const stops = row.querySelector('.hm-orgchart-contrast-stops')!; + stops.dataset.contrastModel = current.status; + const stopText = current.status === 'MODEL' && black.status === 'MODEL' + ? `전체 stop 최소 ${current.stopMinimum!.toFixed(2)}:1 · 전체 gradient 257지점 MODEL 최소 ${current.fullGradientMinimum!.toFixed(2)}:1 (실제 텍스트 영역 아님; 일괄 판정하지 않음). 미적용 #000 대안 전체 MODEL 최소 ${black.fullGradientMinimum!.toFixed(3)}:1. 디자인기획 기본 gradient의 #000 대안은 약 4.607:1이며 승인 전 미적용.` + : `전체 gradient MODEL NOT VERIFIED · ${current.reason ?? black.reason}`; + if (stops.textContent !== stopText) stops.textContent = stopText; + if (current.stopMinimum !== undefined) stops.dataset.contrastStopMinimum = String(current.stopMinimum); else delete stops.dataset.contrastStopMinimum; + if (black.fullGradientMinimum !== undefined) stops.dataset.contrastBlackMinimum = String(black.fullGradientMinimum); else delete stops.dataset.contrastBlackMinimum; + } +} + +interface TextMeasurement { status: 'PASS' | 'REVIEW' | 'NOT VERIFIED'; model: 'MODEL' | 'NOT VERIFIED'; text: string; ratio?: number; threshold?: number; fontSize?: number; fontWeight?: number } +function measureTextContrast(target: HTMLElement): TextMeasurement { + const window = target.ownerDocument.defaultView!; + const unknown = (reason: string): TextMeasurement => ({ status: 'NOT VERIFIED', model: 'NOT VERIFIED', text: `NOT VERIFIED · ${reason}` }); + for (let element: HTMLElement | null = target; element;) { + const style = window.getComputedStyle(element); + if (Number(style.opacity) !== 1 || style.filter !== 'none' || style.transform !== 'none' || style.mixBlendMode !== 'normal' || (style.backdropFilter && style.backdropFilter !== 'none')) return unknown('opacity/filter/transform/blend의 색상 합성 지원 안 함'); + const tree = element.getRootNode(); + element = element.parentElement ?? ((tree as ShadowRoot).host as HTMLElement | undefined) ?? null; + } + const style = window.getComputedStyle(target), box = target.getBoundingClientRect(); + if (style.textShadow !== 'none') return unknown('text-shadow 지원 안 함'); + const fontSize = Number.parseFloat(style.fontSize), fontWeight = style.fontWeight === 'bold' ? 700 : style.fontWeight === 'normal' ? 400 : Number(style.fontWeight); + if (!Number.isFinite(fontSize) || !Number.isFinite(fontWeight)) return unknown('텍스트 크기/굵기 확인 불가'); + const threshold = textContrastThreshold(fontSize, fontWeight); + const ranges: { top: number; bottom: number }[] = []; + const walker = target.ownerDocument.createTreeWalker(target, 4 /* SHOW_TEXT */); + const lineRects: DOMRect[] = []; + let node: Node | null; + while ((node = walker.nextNode())) { + if (!node.textContent?.trim()) continue; + const range = target.ownerDocument.createRange(); range.selectNodeContents(node); + lineRects.push(...Array.from(range.getClientRects()).filter(rect => rect.width > 0 && rect.height > 0)); + } + if (lineRects.length === 0 || box.height <= 0) return unknown('실제 텍스트 Range 없음'); + let ratio: number | undefined; + if (style.backgroundImage === 'none') { + const foreground = parseOpaqueColor(style.color), background = parseOpaqueColor(style.backgroundColor); + if (!foreground || !background) return unknown('불투명 solid 배경/텍스트만 지원'); + if (lineRects.some(rect => rect.left < box.left || rect.right > box.right || rect.top < box.top || rect.bottom > box.bottom)) return unknown('텍스트가 solid 배경 영역 밖에 있음'); + ratio = contrastRatio(foreground, background); + } else { + if (!['auto', 'auto auto'].includes(style.backgroundSize) || style.backgroundPosition !== '0% 0%' || !['border-box', 'padding-box', 'content-box'].includes(style.backgroundOrigin)) return unknown('background size/position/origin 지원 안 함'); + const borderTop = Number.parseFloat(style.borderTopWidth), borderBottom = Number.parseFloat(style.borderBottomWidth); + const borderLeft = Number.parseFloat(style.borderLeftWidth), borderRight = Number.parseFloat(style.borderRightWidth); + const content = style.backgroundOrigin === 'content-box', includeBorder = style.backgroundOrigin === 'border-box'; + const top = box.top + (includeBorder ? 0 : borderTop) + (content ? Number.parseFloat(style.paddingTop) : 0); + const bottom = box.bottom - (includeBorder ? 0 : borderBottom) - (content ? Number.parseFloat(style.paddingBottom) : 0); + const left = box.left + (includeBorder ? 0 : borderLeft) + (content ? Number.parseFloat(style.paddingLeft) : 0); + const right = box.right - (includeBorder ? 0 : borderRight) - (content ? Number.parseFloat(style.paddingRight) : 0); + if (lineRects.some(rect => rect.left < left || rect.right > right)) return unknown('텍스트가 gradient painting box 밖에 있음'); + for (const rect of lineRects) ranges.push({ top: rect.top - top, bottom: rect.bottom - top }); + const model = evaluateGradientContrast({ foreground: style.color, backgroundImage: style.backgroundImage, ranges, backgroundHeight: bottom - top }); + if (model.status !== 'MODEL') return unknown(model.reason!); + ratio = model.textRegionMinimum!; + } + const status = ratio >= threshold ? 'PASS' : 'REVIEW'; + return { status, model: 'MODEL', ratio, threshold, fontSize, fontWeight, text: `${status} · 실제 Range 영역 MODEL 최소 ${ratio.toFixed(2)}:1 / 기준 ${threshold}:1 · ${fontSize}px / ${fontWeight}. 픽셀 실측 아님; 현재 예제 영역에만 해당.` }; +} diff --git a/packages/org-chart/src/core/employee-card.ts b/packages/org-chart/src/core/employee-card.ts new file mode 100644 index 0000000..6493eef --- /dev/null +++ b/packages/org-chart/src/core/employee-card.ts @@ -0,0 +1,129 @@ +import type { Employee } from '../data/index.js'; +import personPlaceholder from '../assets/person-placeholder.svg?inline'; +import { createAffiliationMark } from './affiliation-mark.js'; +import type { DepartmentCardAsset } from './department-card-assets.js'; +import type { RepresentativeCardAsset } from './representative-card-asset.js'; +import { observePersonNameOverflow } from './person-name-overflow.js'; + +const statusNames = { active: '재직', dispatched: '파견', onLeave: '휴직' } as const; + +export interface EmployeeCardOptions { + kind: 'topLeader' | 'leader' | 'employee'; + affiliationName?: string; + cardAsset?: DepartmentCardAsset | RepresentativeCardAsset; + /** Full Composition presentation only; the employee dataset is untouched. */ + workdeskPresentation?: boolean; + /** Compact read-only status groups already convey this label in their header. */ + hideStatusLabel?: boolean; +} + +function text(document: Document, tag: string, className: string, value: string): HTMLElement { + const element = document.createElement(tag); + element.className = className; + element.textContent = value; + return element; +} + +/** Content renderer shared by the hierarchy and supplementary status groups. */ +export function createEmployeeCard( + document: Document, employee: Employee, options: EmployeeCardOptions, signal: AbortSignal, +): HTMLElement { + const leader = options.kind !== 'employee'; + const representative = options.kind === 'topLeader' || options.cardAsset?.size === 'representative'; + const compactStatus = Boolean(options.workdeskPresentation && options.hideStatusLabel && !options.cardAsset); + const styledCard = Boolean(options.cardAsset) || compactStatus; + const presentationName = options.workdeskPresentation || representative; + const displayName = presentationName ? '홍길동' : employee.name; + const displayedName = presentationName ? '홍 길 동' : displayName; + const card = document.createElement('div'); + card.className = `hm-orgchart-employee${leader ? ' hm-orgchart-leader' : ''}`; + card.dataset.employeeId = employee.id; + card.dataset.cardKind = options.kind; + card.dataset.workStatus = employee.workStatus; + if (options.workdeskPresentation) card.dataset.workdeskPresentation = 'true'; + if (compactStatus) card.dataset.cardLayout = 'compact'; + if (options.cardAsset) { + const asset = options.cardAsset; + card.dataset.cardAsset = 'departmentId' in asset ? asset.departmentId : 'representative'; + card.dataset.cardAssetSize = asset.size; + const background = document.createElement('img'); + background.className = 'hm-orgchart-card-background'; + background.alt = ''; + background.setAttribute('aria-hidden', 'true'); + background.width = asset.width; + background.height = asset.height; + background.src = asset.url; + card.append(background); + } + + // One neutral icon is shared by every card type and both runtime adapters. + // The approved rectangular photo slots keep their existing dimensions. + const avatar = document.createElement('span'); + avatar.className = 'hm-orgchart-avatar'; + avatar.setAttribute('aria-hidden', 'true'); + const image = document.createElement('img'); + image.alt = ''; + image.loading = 'lazy'; + image.decoding = 'async'; + image.referrerPolicy = 'no-referrer'; + const showPlaceholder = () => { + card.dataset.photoState = 'placeholder'; + image.dataset.photoPlaceholder = 'true'; + image.src = personPlaceholder; + }; + if (employee.profileImage) { + card.dataset.photoState = 'image'; + image.addEventListener('error', showPlaceholder, { once: true, signal }); + // Images have already passed the dataset URL validation. No HTML parsing. + image.src = employee.profileImage; + } else showPlaceholder(); + avatar.append(image); + + const details = document.createElement('div'); + details.className = 'hm-orgchart-employee-details'; + const displayedPosition = representative ? '대표이사' : employee.position.replace(/\s+/gu, ''); + const position = text(document, 'span', 'hm-orgchart-person-role', displayedPosition); + const name = text(document, 'strong', 'hm-orgchart-person-name', displayedName); + if (presentationName) { + position.setAttribute('aria-label', representative ? displayedPosition : employee.position); + name.setAttribute('aria-label', displayName); + } + const inlineRoleBadge = styledCard && !representative; + const positionRow = inlineRoleBadge ? document.createElement('div') : null; + if (positionRow) { + positionRow.className = 'hm-orgchart-position-row'; + positionRow.append(position); + } + if (styledCard) { + const personText = document.createElement('div'); personText.className = 'hm-orgchart-person-text'; + personText.append(positionRow ?? position, name); details.append(personText); + observePersonNameOverflow(card, name, signal); + } else details.append(position, name); + const attributes = document.createElement('div'); + attributes.className = 'hm-orgchart-person-attributes'; + // Representative cards show only position/name in every consumer. Raw employee + // roles remain available to dialogs/statistics; other cards keep their policy. + const hideExecutiveBadge = options.workdeskPresentation && employee.jobTitle?.trim() === '경영진'; + if (!representative && !hideExecutiveBadge && (employee.jobTitle || (leader && !options.cardAsset))) { + const rawBadge = employee.jobTitle || '조직장'; + const badge = text(document, 'span', 'hm-orgchart-job-title', options.workdeskPresentation ? rawBadge.replace(/\s+/gu, '') : rawBadge); + if (options.workdeskPresentation) badge.setAttribute('aria-label', employee.jobTitle || '조직장'); + badge.title = badge.textContent!; + (positionRow ?? attributes).append(badge); + } + if (!representative && !options.hideStatusLabel) attributes.append(text(document, 'span', 'hm-orgchart-status-label', statusNames[employee.workStatus])); + if (styledCard) { + card.append(avatar, details); + if (attributes.childElementCount) card.append(attributes); + } else { + if (attributes.childElementCount) details.append(attributes); + card.append(avatar, details); + } + + if (options.affiliationName) { + const affiliation = createAffiliationMark(document, employee.affiliationId, options.affiliationName, signal); + card.dataset.hasAffiliation = 'true'; + card.append(affiliation); + } + return card; +} diff --git a/packages/org-chart/src/core/employee-info-dialog.ts b/packages/org-chart/src/core/employee-info-dialog.ts new file mode 100644 index 0000000..c35ce06 --- /dev/null +++ b/packages/org-chart/src/core/employee-info-dialog.ts @@ -0,0 +1,105 @@ +import type { Employee } from '../data/index.js'; +import type { OrgChartEmployeeClickContext } from './types.js'; + +const statusNames = { active: '재직', dispatched: '파견', onLeave: '휴직' } as const; + +export interface EmployeeInfoDialog { + show(employee: Employee, context: OrgChartEmployeeClickContext): void; + close(): void; +} + +/** The native modal lives in the unscaled shell and enters the browser's top + * layer. It keeps the Core shared by HTML and React, including focus handling. */ +export function createEmployeeInfoDialog( + shell: HTMLElement, signal: AbortSignal, prefix: string, readOnly: boolean, +): EmployeeInfoDialog { + const document = shell.ownerDocument; + const dialog = document.createElement('dialog'); + dialog.className = 'hm-orgchart-employee-dialog'; + dialog.dataset.component = 'EmployeeInfoDialog'; + dialog.setAttribute('aria-modal', 'true'); + const header = document.createElement('div'); + header.className = 'hm-orgchart-employee-dialog-header'; + const title = document.createElement('h2'); + title.id = `${prefix}-employee-dialog-title`; + title.textContent = '직원 정보'; + dialog.setAttribute('aria-labelledby', title.id); + const closeButton = document.createElement('button'); + closeButton.type = 'button'; + closeButton.className = 'hm-orgchart-employee-dialog-close'; + closeButton.textContent = '닫기'; + closeButton.setAttribute('aria-label', '직원 정보 닫기'); + const fields = document.createElement('dl'); + fields.className = 'hm-orgchart-employee-dialog-fields'; + header.append(title, closeButton); + dialog.append(header, fields); + shell.append(dialog); + let trigger: HTMLElement | undefined; + + function restoreFocus(): void { + const previous = trigger; + // close() restores synchronously, while the native close event is queued. + // Only a real activation owns a return target: a second close notification + // (or routine render cleanup before the dialog ever opens) must not focus + // the shell and displace the card's restored focus. + if (!previous) return; + trigger = undefined; + if (signal.aborted || !shell.isConnected) return; + (previous?.isConnected ? previous : shell).focus({ preventScroll: true }); + } + function close(): void { + if (dialog.open) dialog.close(); + restoreFocus(); + } + closeButton.addEventListener('click', close, { signal }); + dialog.addEventListener('cancel', event => { + event.preventDefault(); + close(); + }, { signal }); + dialog.addEventListener('close', () => { if (!dialog.open) restoreFocus(); }, { signal }); + dialog.addEventListener('keydown', event => { + if (event.key !== 'Tab') return; + const focusable = [...dialog.querySelectorAll('button:not(:disabled), a[href], [tabindex="0"]')]; + const first = focusable[0]; + const last = focusable[focusable.length - 1]; + const active = (dialog.getRootNode() as ShadowRoot).activeElement; + if ((event.shiftKey && active === first) || (!event.shiftKey && active === last) || !dialog.contains(active)) { + event.preventDefault(); + (event.shiftKey ? last : first)?.focus(); + } + }, { signal }); + signal.addEventListener('abort', () => { + trigger = undefined; + if (dialog.open) dialog.close(); + dialog.remove(); + }, { once: true }); + + return { + close, + show(employee, context) { + if (signal.aborted) return; + // Never synthesize contact details, dates or other personal information. + const entries: [string, string | null | undefined][] = [ + ['이름', readOnly ? context.trigger.querySelector('.hm-orgchart-person-name')?.textContent ?? employee.name : employee.name], + ['직위', employee.position], + ['소속', context.organization?.name], + ['직책', employee.jobTitle], + ['관계사', context.affiliation?.name], + ['근무 상태', statusNames[employee.workStatus]], + ]; + fields.replaceChildren(); + for (const [label, value] of entries) { + if (!value) continue; + const term = document.createElement('dt'); + term.textContent = label; + const detail = document.createElement('dd'); + detail.textContent = value; + fields.append(term, detail); + } + dialog.dataset.employeeId = employee.id; + trigger = context.trigger; + if (!dialog.open) dialog.showModal(); + closeButton.focus({ preventScroll: true }); + }, + }; +} diff --git a/packages/org-chart/src/core/engine.ts b/packages/org-chart/src/core/engine.ts new file mode 100644 index 0000000..12ad39a --- /dev/null +++ b/packages/org-chart/src/core/engine.ts @@ -0,0 +1,143 @@ +import type OrgChart from 'orgchart'; +import type { EngineNode } from 'orgchart'; + +export type RenderEngineNode = EngineNode; +export interface EngineAdapter { + update(data: RenderEngineNode[]): void; + toggle(node: HTMLElement): boolean | undefined; + dispose(): void; +} + +/** Importing the public facade never evaluates the upstream browser-only module. */ +export async function loadEngine() { + const { default: Upstream } = await import('orgchart'); + // 6.0.0 has no destroy(). Its init observer is local to triggerInitEvent. + // Override that narrow hook on our subclass to keep the resource disposable. + return class ManagedOrgChart extends Upstream { + declare initObserver?: MutationObserver; + override init(options?: Parameters[0]): OrgChart { + try { + return super.init(options); + } catch (error) { + this.disconnectInitObserver(); + this.chart?.remove(); + this.chart = null; + throw error; + } + } + override triggerInitEvent(): void { + this.disconnectInitObserver(); + const Observer = this.chartContainer?.ownerDocument.defaultView?.MutationObserver; + if (!Observer || !this.chartContainer) return; + const observer = new Observer(() => { + observer.disconnect(); + if (this.initObserver === observer) this.initObserver = undefined; + if (this.chart) this.handleCompactNodes(); + }); + this.initObserver = observer; + observer.observe(this.chartContainer, { childList: true }); + } + disconnectInitObserver(): void { + this.initObserver?.disconnect(); + this.initObserver = undefined; + } + }; +} + +export type EngineConstructor = Awaited>; + +export function createEngineAdapter( + Engine: EngineConstructor, + viewport: HTMLElement, + data: RenderEngineNode[], + decorate: (node: HTMLElement, data: RenderEngineNode, signal: AbortSignal) => void, +): EngineAdapter { + const Abort = viewport.ownerDocument.defaultView?.AbortController ?? AbortController; + let generation = new Abort(); + let instances: (OrgChart & { disconnectInitObserver(): void })[] = []; + let disposed = false; + const forest = viewport.ownerDocument.createElement('div'); + forest.className = 'hm-orgchart-forest'; + viewport.append(forest); + function releaseGeneration(): void { + generation.abort(); + for (const instance of instances) { + instance.disconnectInitObserver(); + // Keep the old chart reference until upstream feature cleanup is complete. + instance.unbindPan(); instance.unbindZoom(); instance.detachMinimap(); + } + } + function disposeInstances(): void { + releaseGeneration(); + for (const instance of instances) { + instance.chart?.remove(); + instance.chart = null; instance.chartContainer = null; + instance.opts = {}; instance.options = {}; + } + instances = []; + forest.replaceChildren(); + } + function build(roots: RenderEngineNode[]): void { + try { + for (const root of roots) { + const treeContainer = viewport.ownerDocument.createElement('div'); + treeContainer.className = 'hm-orgchart-tree'; + forest.append(treeContainer); + const instance = new Engine(treeContainer, { + data: root, pan: false, zoom: false, minimap: false, draggable: false, exportButton: false, + chartClass: 'hm-orgchart-engine', + nodeTemplate: () => '

    ', + createNode: (node, value) => decorate(node, value, generation.signal), + }); + instances.push(instance); + } + } catch (error) { disposeInstances(); throw error; } + } + function syncButtons(): void { + for (const instance of instances) { + for (const node of instance.chart?.querySelectorAll('.node') ?? []) { + const button = node.querySelector('.hm-orgchart-toggle'); + if (!button) continue; + const expanded = instance.getNodeState(node, 'children').visible && !node.closest('.hierarchy')?.classList.contains('isChildrenCollapsed'); + button.setAttribute('aria-expanded', String(expanded)); + const label = expanded ? '하위 조직 접기' : '하위 조직 펼치기'; + button.textContent = label; + button.setAttribute('aria-label', `${node.querySelector('.hm-orgchart-organization-name')?.textContent ?? ''} ${label}`); + } + } + } + function bindGeneration(): void { + forest.addEventListener('transitionend', syncButtons, { signal: generation.signal }); + } + build(data); + bindGeneration(); + return { + update(next) { + if (disposed) throw new Error('OrgChart engine is disposed'); + releaseGeneration(); + generation = new Abort(); + if (next.length === instances.length) { + for (let index = 0; index < next.length; index++) instances[index].init({ data: next[index] }); + } else { + disposeInstances(); + generation = new Abort(); + build(next); + } + bindGeneration(); + }, + toggle(node) { + const instance = instances.find(candidate => candidate.chart?.contains(node)); + if (!instance || node.closest('.hierarchy')?.querySelector('.sliding')) return undefined; + const expanded = instance.getNodeState(node, 'children').visible; + if (expanded) instance.hideChildren(node); else instance.showChildren(node); + syncButtons(); + return !expanded; + }, + dispose() { + if (disposed) return; + disposed = true; + disposeInstances(); + viewport.replaceChildren(); + }, + }; +} diff --git a/packages/org-chart/src/core/index.ts b/packages/org-chart/src/core/index.ts new file mode 100644 index 0000000..c633940 --- /dev/null +++ b/packages/org-chart/src/core/index.ts @@ -0,0 +1,366 @@ +import { calculateSummary, normalizeOrgChartDataset, validateOrgChartDataset } from '../data/index.js'; +import type { OrgChartDataSource, ValidationIssue } from '../data/index.js'; +import { createEngineAdapter, loadEngine } from './engine.js'; +import type { EngineAdapter, EngineConstructor } from './engine.js'; +import { decorateNode, engineTree } from './render.js'; +import { createOrgChartTree } from './org-chart-tree.js'; +import { createOrgChartContent } from './org-chart-content.js'; +import { createPositionSummary } from './position-summary.js'; +import { createAffiliationSummary } from './affiliation-summary.js'; +import { createStatusSummary } from './status-summary.js'; +import { createEmployeeInfoDialog } from './employee-info-dialog.js'; +import type { EmployeeInfoDialog } from './employee-info-dialog.js'; +import type { RenderContext } from './render.js'; +import type { OrgChartEmployeeClickContext, OrgChartHandle, OrgChartOptions, OrgChartState } from './types.js'; + +export type { OrgChartEmployeeClickContext, OrgChartHandle, OrgChartOptions, OrgChartOrganizationLinks, OrgChartState } from './types.js'; + +const owners = new WeakMap(); +let instanceSequence = 0; + +function freeze(value: T, seen = new WeakSet()): T { + if (value && typeof value === 'object' && !seen.has(value)) { + seen.add(value); + for (const child of Object.values(value)) freeze(child, seen); + Object.freeze(value); + } + return value; +} + +function snapshot(input: unknown): unknown { + // JSON objects are captured before any async boundary. A failure is controlled. + return freeze(structuredClone(input)); +} + +/** Framework-independent facade; construction has no DOM or request side effects. */ +export function createOrgChart(options: OrgChartOptions): OrgChartHandle { + return createOrgChartView(options, 'composition'); +} + +export type CoreView = 'composition' | 'tree' | 'positionSummary' | 'affiliationSummary' | 'statusSummary'; + +/** One source/validation/lifecycle controller for full and standalone views. + * Summary-only views never load the engine or require its stylesheet. */ +export function createOrgChartView(options: OrgChartOptions, view: CoreView): OrgChartHandle { + const needsEngine = view === 'composition' || view === 'tree'; + if (!options.dataSource || typeof options.dataSource.load !== 'function') throw new TypeError('An OrgChartDataSource is required'); + if (!options.stylesheetUrls?.core || (needsEngine && !options.stylesheetUrls.engine)) throw new TypeError('Provide the required OrgChart stylesheet URLs'); + const stylesheetUrls = { ...options.stylesheetUrls }; + if (options.displayMode !== undefined && options.displayMode !== 'interactive' && options.displayMode !== 'readOnly') throw new TypeError('displayMode must be "interactive" or "readOnly"'); + const readOnly = view === 'composition' && options.displayMode === 'readOnly'; + const organizationLinks: Record = Object.create(null); + if (options.onEmployeeClick !== undefined && typeof options.onEmployeeClick !== 'function') throw new TypeError('onEmployeeClick must be a function'); + const employeeClickCallback = options.onEmployeeClick; + for (const [id, value] of Object.entries(options.organizationLinks ?? {})) { + if (value === undefined || value === '') continue; + if (typeof value !== 'string') throw new TypeError('organizationLinks values must be URL strings'); + const href = value.trim(); + if (!href) continue; + let url: URL; + try { url = new URL(href, 'https://orgchart.invalid/'); } + catch { throw new TypeError('organizationLinks must contain valid HTTP(S) or relative URLs'); } + if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password) throw new TypeError('organizationLinks must contain valid HTTP(S) or relative URLs'); + organizationLinks[id] = href; + } + let preferredContainer = options.container; + let source: OrgChartDataSource | undefined = options.dataSource; + let policy = options.aggregationPolicy ? freeze(structuredClone(options.aggregationPolicy)) : undefined; + let state: OrgChartState = freeze({ status: 'idle' }); + let destroyed = false; + let revision = 0; + let request: AbortController | undefined; + let container: HTMLElement | undefined; + let root: HTMLElement | undefined; + let shell: HTMLElement | undefined; + let status: HTMLElement | undefined; + let content: HTMLElement | undefined; + let viewport: HTMLElement | undefined; + let engine: EngineAdapter | undefined; + let renderContext: RenderContext | undefined; + let Engine: EngineConstructor | undefined; + let styleReady: Promise | undefined; + let cancelStyles: (() => void) | undefined; + let contentGeneration: AbortController | undefined; + let interactions: AbortController | undefined; + let employeeDialog: EmployeeInfoDialog | undefined; + const owner = Symbol('hm-orgchart-owner'); + const prefix = `hm-orgchart-${++instanceSequence}`; + const listeners = new Set<(state: OrgChartState) => void>(); + if (options.onStateChange) listeners.add(options.onStateChange); + + function active(version: number): boolean { return !destroyed && version === revision; } + + function notify(next: OrgChartState): void { + state = freeze(next); + const notifiedState = state; + for (const listener of [...listeners]) { + // Reentrant update/reload/destroy may supersede this notification. + if (destroyed || state !== notifiedState) break; + if (!listeners.has(listener)) continue; + try { listener(notifiedState); } catch { /* Consumer callbacks do not break Core lifecycle. */ } + } + } + + function assertMounted(): void { + if (destroyed) throw new Error('OrgChart handle is destroyed; create a new handle'); + if (!container) throw new Error('Mount OrgChart before update or reload'); + } + + function begin(): { version: number; signal: AbortSignal } { + request?.abort(); + const Abort = container?.ownerDocument.defaultView?.AbortController ?? AbortController; + request = new Abort(); + const version = ++revision; + status!.textContent = '조직도를 불러오는 중입니다.'; + shell!.setAttribute('aria-busy', 'true'); + const signal = request.signal; + notify({ status: 'loading' }); + return { version, signal }; + } + + function releaseView(): void { + employeeDialog?.close(); + contentGeneration?.abort(); + contentGeneration = undefined; + engine?.dispose(); + engine = undefined; + renderContext = undefined; + viewport = undefined; + content?.replaceChildren(); + } + + function activateEmployee(event: MouseEvent | KeyboardEvent): void { + if (event.defaultPrevented || !renderContext || !content) return; + const Element = content.ownerDocument.defaultView?.Element; + if (!Element || !(event.target instanceof Element)) return; + // Links, collapse buttons and any future nested controls own their events. + if (event.target.closest('a, button, input, select, textarea')) return; + const card = event.target.closest('.hm-orgchart-employee'); + if (!card || !content.contains(card)) return; + const employee = renderContext.data.employees.find(item => item.id === card.dataset.employeeId); + if (!employee) return; + event.preventDefault(); + event.stopPropagation(); + card.focus({ preventScroll: true }); + // A name tooltip can be open from pointer hover. Close it before opening + // information UI; the existing hover/focus tooltip behavior stays intact. + for (const tip of shell?.querySelectorAll('.hm-orgchart-person-name-tooltip') ?? []) tip.hidden = true; + for (const name of content.querySelectorAll('[data-tooltip-open="true"]')) name.dataset.tooltipOpen = 'false'; + const context: OrgChartEmployeeClickContext = { + organization: renderContext.data.organizations.find(item => item.id === employee.organizationId), + affiliation: renderContext.data.affiliations.find(item => item.id === employee.affiliationId), + trigger: card, + originalEvent: event, + }; + if (employeeClickCallback) { + try { employeeClickCallback(employee, context); } + catch { /* Consumer callbacks do not interrupt Core event/lifecycle ownership. */ } + } else employeeDialog?.show(employee, context); + } + + function prepareEmployeeCards(element: HTMLElement): void { + for (const card of element.querySelectorAll('.hm-orgchart-employee')) { + card.tabIndex = 0; + card.setAttribute('role', 'button'); + if (!employeeClickCallback) card.setAttribute('aria-haspopup', 'dialog'); + const name = card.querySelector('.hm-orgchart-person-name')?.textContent ?? ''; + const position = card.querySelector('.hm-orgchart-person-role')?.textContent ?? ''; + card.setAttribute('aria-label', `${name} ${position} 직원 정보 보기`); + } + } + + function fail(version: number, issues: readonly ValidationIssue[]): void { + if (!active(version)) return; + releaseView(); + shell!.setAttribute('aria-busy', 'false'); + status!.textContent = '조직도를 표시할 수 없습니다.'; + const document = content!.ownerDocument; + const list = document.createElement('ul'); + list.className = 'hm-orgchart-issues'; + for (const issue of issues) { + const row = document.createElement('li'); + row.textContent = `${issue.code} · ${issue.path}: ${issue.message}`; + list.append(row); + } + content!.append(list); + notify({ status: 'error', issues }); + } + + async function apply(input: unknown, version: number): Promise { + if (!active(version)) return; + let captured: unknown; + try { captured = snapshot(input); } + catch { + fail(version, [{ code: 'INPUT_SNAPSHOT', path: '$', message: 'Input must be a cloneable JSON dataset' }]); + return; + } + const validation = validateOrgChartDataset(captured); + if (!validation.valid) { fail(version, validation.issues); return; } + const data = freeze(validation.data); + const normalized = normalizeOrgChartDataset(data); + const summary = freeze(calculateSummary(data, policy)); + const topLeaderIds = new Set(view === 'composition' ? normalized.roots.filter(node => node.organization.type === 'root' && node.organization.leaderId).map(node => node.organization.leaderId!) : []); + const nextContext: RenderContext = { data, summary, orderedOrganizations: [], employeesByOrganization: normalized.employeesByOrganization, topLeaderIds, readOnly, organizationLinks }; + // Composition shows the root leader as the standalone top card, so the root's direct + // organizations become the horizontal engine roots (data and parentId stay untouched). + // A root with other direct employees keeps its node so those employees stay visible. + const flattenRoot = (node: typeof normalized.roots[number]) => view === 'composition' && node.organization.type === 'root' && !!node.organization.leaderId + && (normalized.employeesByOrganization.get(node.organization.id) ?? []).every(employee => employee.id === node.organization.leaderId); + const flattened = normalized.roots.some(flattenRoot); + const tree = engineTree(flattened ? normalized.roots.flatMap(node => flattenRoot(node) ? node.children : [node]) : normalized.roots, prefix, nextContext, flattened ? 1 : 0); + const styleIssues = await styleReady; + if (!active(version)) return; + if (styleIssues) { fail(version, styleIssues); return; } + const LoadedEngine = needsEngine ? Engine ?? await loadEngine() : undefined; + // Last-started operation wins even if an upstream engine import was pending. + if (!active(version)) return; + if (LoadedEngine) Engine = LoadedEngine; + const document = content!.ownerDocument; + employeeDialog?.close(); + contentGeneration?.abort(); + const Abort = document.defaultView?.AbortController ?? AbortController; + contentGeneration = new Abort(); + renderContext = nextContext; + if (needsEngine && !viewport) { + viewport = createOrgChartTree(document); + content!.append(viewport); + } + const activeElement = root!.shadowRoot?.activeElement; + if (needsEngine) { + if (engine) engine.update(tree); + else engine = createEngineAdapter(Engine!, viewport!, tree, (node, value, signal) => { + if (renderContext) decorateNode(node, value, renderContext, signal, target => engine?.toggle(target)); + }); + } + // If regeneration removed keyboard focus, offer the stable viewport next. + const nextContent = view === 'composition' ? createOrgChartContent(document, nextContext, viewport!, contentGeneration.signal) + : view === 'tree' ? viewport! + : view === 'positionSummary' ? createPositionSummary(document, nextContext) + : view === 'affiliationSummary' ? createAffiliationSummary(document, nextContext) + : createStatusSummary(document, nextContext, contentGeneration.signal); + prepareEmployeeCards(nextContent); + content!.replaceChildren(nextContent); + const restoreFocus = !!activeElement && (activeElement === viewport || !activeElement.isConnected); + if (restoreFocus) (readOnly ? shell! : viewport ?? content!.querySelector('.hm-orgchart-summary-scroll') ?? shell!).focus({ preventScroll: true }); + shell!.setAttribute('aria-busy', 'false'); + status!.textContent = ''; + if (!active(version)) return; + notify({ status: 'ready', dataVersion: data.metadata.dataVersion, summary, aggregation: summary.aggregation }); + } + + async function reload(nextSource?: OrgChartDataSource): Promise { + assertMounted(); + if (nextSource) { + if (typeof nextSource.load !== 'function') throw new TypeError('An OrgChartDataSource is required'); + source = nextSource; + } + const { version, signal } = begin(); + if (!active(version)) return; + let input: unknown; + try { + input = await source!.load({ signal }); + } catch (error) { + if (!active(version) || signal.aborted) return; + const sourceCode = error && typeof error === 'object' && 'code' in error && ['SOURCE_LOAD', 'SOURCE_PARSE', 'SOURCE_MAP', 'SOURCE_URL', 'SOURCE_SNAPSHOT'].includes(String(error.code)) ? String(error.code) : 'SOURCE_LOAD'; + fail(version, [{ code: sourceCode, path: 'dataSource', message: 'Data source or chart rendering failed; verify the source and CSS configuration' }]); + return; + } + try { if (active(version)) await apply(input, version); } + catch { fail(version, [{ code: 'CORE_RENDER', path: 'core', message: 'Chart rendering failed' }]); } + } + + return { + async mount(nextContainer = preferredContainer) { + if (destroyed) throw new Error('OrgChart handle is destroyed; create a new handle'); + if (container) throw new Error('OrgChart is already mounted'); + const Element = nextContainer?.ownerDocument.defaultView?.HTMLElement; + if (!Element || !(nextContainer instanceof Element) || !nextContainer.isConnected) throw new TypeError('Mount requires a connected HTMLElement'); + if (owners.has(nextContainer)) throw new Error('Another OrgChart instance owns this container'); + container = nextContainer; + owners.set(container, owner); + const document = container.ownerDocument; + root = document.createElement('div'); + root.className = 'hm-orgchart-host'; + root.dataset.orgchartInstance = prefix; + const shadow = root.attachShadow({ mode: 'open' }); + const styleDisposers: (() => void)[] = []; + const styles = [...(needsEngine ? [{ key: 'engine', href: stylesheetUrls.engine }] : []), { key: 'core', href: stylesheetUrls.core }]; + styleReady = Promise.all(styles.map(({ key, href }) => new Promise(resolve => { + const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = href; + let settled = false; + const finish = (issue?: ValidationIssue) => { + if (settled) return; + settled = true; + link.removeEventListener('load', loaded); link.removeEventListener('error', failed); + resolve(issue); + }; + const loaded = () => finish(); + const failed = () => finish({ code: 'CORE_STYLE', path: `stylesheetUrls.${key}`, message: 'Required OrgChart stylesheet failed to load' }); + link.addEventListener('load', loaded); link.addEventListener('error', failed); + styleDisposers.push(() => finish()); + shadow.append(link); + }))).then(results => { + const issues = results.filter((issue): issue is ValidationIssue => !!issue); + return issues.length ? issues : undefined; + }); + cancelStyles = () => { for (const dispose of styleDisposers) dispose(); }; + shell = document.createElement('section'); + shell.className = 'hm-orgchart-shell'; + // The Core's Korean labels must shape identically in ko HTML and en Storybook hosts. + shell.lang = 'ko'; + shell.tabIndex = -1; + shell.setAttribute('aria-label', '조직도 콘텐츠'); + status = document.createElement('p'); status.className = 'hm-orgchart-state'; status.setAttribute('role', 'status'); status.setAttribute('aria-live', 'polite'); + content = document.createElement('div'); content.className = 'hm-orgchart-content'; + shell.append(status, content); shadow.append(shell); container.append(root); + const Abort = document.defaultView?.AbortController ?? AbortController; + interactions = new Abort(); + employeeDialog = createEmployeeInfoDialog(shell, interactions.signal, prefix, readOnly); + content.addEventListener('click', activateEmployee, { signal: interactions.signal }); + content.addEventListener('keydown', event => { + if (event.key === 'Enter' || event.key === ' ') activateEmployee(event); + }, { signal: interactions.signal }); + await reload(); + }, + async update(input) { + assertMounted(); + // Capture before begin() invokes callbacks that can mutate consumer input. + let captured: unknown; + try { captured = snapshot(input); } + catch { + const { version } = begin(); + fail(version, [{ code: 'INPUT_SNAPSHOT', path: '$', message: 'Input must be a cloneable JSON dataset' }]); + return; + } + const { version } = begin(); + if (!active(version)) return; + try { await apply(captured, version); } + catch { fail(version, [{ code: 'CORE_RENDER', path: 'core', message: 'Chart rendering failed' }]); } + }, + reload, + destroy() { + if (destroyed) return; + destroyed = true; + ++revision; + request?.abort(); request = undefined; + cancelStyles?.(); cancelStyles = undefined; styleReady = undefined; + interactions?.abort(); interactions = undefined; + employeeDialog = undefined; + releaseView(); + root?.remove(); + if (container && owners.get(container) === owner) owners.delete(container); + container = undefined; preferredContainer = undefined; + root = undefined; shell = undefined; status = undefined; content = undefined; + source = undefined; policy = undefined; Engine = undefined; + listeners.clear(); + state = freeze({ status: 'destroyed' }); + }, + subscribe(listener) { + if (destroyed) throw new Error('OrgChart handle is destroyed; create a new handle'); + if (typeof listener !== 'function') throw new TypeError('Listener must be a function'); + listeners.add(listener); + return () => { listeners.delete(listener); }; + }, + getState() { return state; }, + }; +} diff --git a/packages/org-chart/src/core/logo-legend.ts b/packages/org-chart/src/core/logo-legend.ts new file mode 100644 index 0000000..4ec0f51 --- /dev/null +++ b/packages/org-chart/src/core/logo-legend.ts @@ -0,0 +1,17 @@ +import type { RenderContext } from './render'; +import { createAffiliationMark } from './affiliation-mark'; + +export function createLogoLegend(document: Document, context: RenderContext, signal: AbortSignal): HTMLElement { + const section = document.createElement('section'); + section.className = 'hm-orgchart-logo-legend'; + const heading = document.createElement('h2'); heading.textContent = '관계사·회사 로고'; + const list = document.createElement('ul'); list.className = 'hm-orgchart-logo-list'; + for (const affiliation of context.data.affiliations) { + const item = document.createElement('li'); + const name = document.createElement('span'); name.textContent = affiliation.name; + item.append(createAffiliationMark(document, affiliation.id, affiliation.name, signal), name); + list.append(item); + } + section.append(heading, list); + return section; +} diff --git a/packages/org-chart/src/core/org-chart-content.ts b/packages/org-chart/src/core/org-chart-content.ts new file mode 100644 index 0000000..3ead12c --- /dev/null +++ b/packages/org-chart/src/core/org-chart-content.ts @@ -0,0 +1,208 @@ +import { createEmployeeCard } from './employee-card.js'; +import { createHeading, type RenderContext } from './render.js'; +import { createPositionSummary } from './position-summary.js'; +import { createAffiliationSummary } from './affiliation-summary.js'; +import { createStatusSummary } from './status-summary.js'; +import { representativeCardAsset } from './representative-card-asset.js'; +import { createOrganizationTotals } from './organization-totals.js'; +import { createAffiliationBar } from './affiliation-bar.js'; +import { applyWorkdeskLayout } from './workdesk-layout.js'; +import { addWorkdeskArtwork } from './workdesk-artwork.js'; + +type SummaryComponent = 'PositionSummary' | 'AffiliationSummary' | 'StatusSummary'; +type ContentSlot = 'side' | 'footer' | 'belowTree'; +export interface ContentComposition { + placements: Record; +} +/** Internal composition contract: move modules here without editing the tree, + * recalculating data, adding React UI, or changing the npm public API. */ +export const defaultComposition: ContentComposition = { + placements: { PositionSummary: 'side', AffiliationSummary: 'footer', StatusSummary: 'belowTree' }, +}; + +export function createOrgChartContent( + document: Document, context: RenderContext, tree: HTMLElement, + signal: AbortSignal, composition: ContentComposition = defaultComposition, +): HTMLElement { + // Scale wrapper (`content`) > Base Stage (`stage`). Only the stage is transformed. + const readOnly = context.readOnly === true; + const content = document.createElement('div'); + content.className = 'hm-orgchart-composition'; + content.dataset.component = 'OrgChartContent'; + content.dataset.displayMode = readOnly ? 'readOnly' : 'interactive'; + const stage = document.createElement('div'); + stage.className = 'hm-orgchart-stage'; + content.append(stage); + const main = document.createElement('div'); + main.className = 'hm-orgchart-main'; + const heading = createHeading(document, context); + const leaders = document.createElement('section'); + leaders.className = 'hm-orgchart-top-leaders'; + leaders.setAttribute('aria-label', '최상위 조직 리더'); + for (const id of context.topLeaderIds) { + const employee = context.data.employees.find(item => item.id === id)!; + leaders.append(createEmployeeCard(document, employee, { + kind: 'topLeader', + workdeskPresentation: readOnly, + cardAsset: representativeCardAsset, + affiliationName: context.data.affiliations.find(item => item.id === employee.affiliationId)?.name, + }, signal)); + } + const hub = document.createElement('p'); + hub.className = 'hm-orgchart-hub'; + hub.dataset.component = 'CollaborationHub'; + hub.textContent = context.data.presentation?.hubText ?? ''; + if (readOnly && hub.textContent) { + // Actual inline icon from Workdesk index.html .hub-icon; Frame2 is decoration. + const label = document.createElement('span'); + label.className = 'hm-orgchart-hub-label'; + label.textContent = hub.textContent; + const icon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + icon.classList.add('hm-orgchart-hub-icon'); + icon.setAttribute('viewBox', '0 0 24 24'); + icon.setAttribute('fill', 'none'); + icon.setAttribute('aria-hidden', 'true'); + icon.setAttribute('focusable', 'false'); + for (const d of ['M8.5 11.2h7', 'M8.5 15h4.7', 'M7.2 18.6 4 21v-4.7a7.2 7.2 0 0 1-1.6-4.5C2.4 7.6 6.2 4.2 11 4.2s8.6 3.4 8.6 7.6-3.8 7.6-8.6 7.6c-1.3 0-2.6-.3-3.8-.8Z']) { + const path = document.createElementNS(icon.namespaceURI, 'path'); + path.setAttribute('d', d); + icon.append(path); + } + hub.replaceChildren(icon, label); + } + if (readOnly) { + // Title on the left; the top leader and hub share the canvas axis column. + const axis = document.createElement('div'); + axis.className = 'hm-orgchart-axis'; + if (leaders.childElementCount) axis.append(leaders); + if (hub.textContent) axis.append(hub); + main.append(heading, axis); + // No scroll container in the fitted canvas: a labelled, non-focusable region. + tree.removeAttribute('tabindex'); + tree.setAttribute('aria-label', '조직 계층도'); + if (applyWorkdeskLayout(tree)) addWorkdeskArtwork(stage, hub, signal); + } else { + const intro = document.createElement('div'); + intro.className = 'hm-orgchart-intro'; + intro.append(heading); + if (leaders.childElementCount) intro.append(leaders); + main.append(intro); + if (hub.textContent) main.append(hub); + } + main.append(tree); + const slots = { side: document.createElement('aside'), footer: document.createElement('div'), belowTree: document.createElement('div') }; + for (const [slot, element] of Object.entries(slots)) { + element.className = `hm-orgchart-slot-${slot}`; + element.dataset.contentSlot = slot; + } + slots.side.setAttribute('aria-label', '조직도 인원 현황'); + const groups = context.data.presentation?.groups; + // Each module consumes the same context and can be hidden independently. + // Read-only uses compact presenters of the same Summary; standalone components are unchanged. + const modules: [SummaryComponent, boolean, () => HTMLElement][] = [ + ['PositionSummary', groups?.showSummary !== false, () => readOnly ? createOrganizationTotals(document, context) : createPositionSummary(document, context)], + ['AffiliationSummary', groups?.showAffiliations !== false, () => readOnly ? createAffiliationBar(document, context, signal) : createAffiliationSummary(document, context)], + ['StatusSummary', groups?.showDispatched !== false || groups?.showOnLeave !== false, () => createStatusSummary(document, context, signal, { compact: readOnly })], + ]; + for (const [name, visible, create] of modules) { + if (!visible) continue; + const element = create(); + element.dataset.component = name; + slots[composition.placements[name]].append(element); + } + if (slots.belowTree.childElementCount) main.append(slots.belowTree); + stage.append(main); + if (slots.side.childElementCount) stage.append(slots.side); + else content.classList.add('hm-orgchart-composition-no-side'); + if (slots.footer.childElementCount) stage.append(slots.footer); + observeStageScale(content, stage, signal, readOnly); + return content; +} + +/** Proportional fit: one uniform scale for the whole stage, never above 1. + * The stage's offsetWidth/Height are unscaled layout sizes, so the wrapper + * height is derived as height * scale. One observer and one pending frame per + * instance; both end when the content generation aborts. + * `fitHeight` fits the actual containing content box and viewport. It never + * assumes a host Header or reserves an arbitrary 48px. */ +function observeStageScale(wrapper: HTMLElement, stage: HTMLElement, signal: AbortSignal, fitHeight = false): void { + const view = wrapper.ownerDocument.defaultView; + if (!view) return; + let frame: number | undefined; + let applied = { scale: NaN, width: NaN, height: NaN }; + const ancestors: HTMLElement[] = []; + const collectAncestors = () => { + // The constructor runs before insertion; discover the real host only once + // the wrapper is connected. Refresh when a host reparents its chart too. + const next: HTMLElement[] = []; + let ancestor: HTMLElement | null = wrapper.parentElement; + while (ancestor) { + next.push(ancestor); + const parent: HTMLElement | null = ancestor.parentElement; + const root = ancestor.getRootNode(); + ancestor = parent ?? (root instanceof view.ShadowRoot ? root.host as HTMLElement : null); + } + if (fitHeight) { + for (const element of ancestors) if (!next.includes(element)) observer.unobserve(element); + for (const element of next) if (!ancestors.includes(element)) observer.observe(element); + } + ancestors.splice(0, ancestors.length, ...next); + }; + const heightLimit = () => { + const top = wrapper.getBoundingClientRect().top; + let bottom = view.innerHeight; + let trailingPadding = 0; + for (const element of ancestors) { + const css = view.getComputedStyle(element); + const padding = parseFloat(css.paddingBottom) || 0; + trailingPadding += padding; + // Typed OM keeps 'auto' distinct from a resolved natural pixel height. + // Falling back to an inline height still supports explicit host containers. + const typed = (element as HTMLElement & { computedStyleMap?: () => Map }).computedStyleMap?.(); + const height = typed?.get('height')?.toString() ?? element.style.height; + const boundedHeight = (!!height && height !== 'auto') || css.maxHeight !== 'none'; + const constrained = boundedHeight && element !== wrapper.ownerDocument.body && element !== wrapper.ownerDocument.documentElement; + if (constrained) { + const rect = element.getBoundingClientRect(); + bottom = Math.min(bottom, rect.bottom - (parseFloat(css.borderBottomWidth) || 0) - trailingPadding); + } + } + return Math.max(0, Math.min(bottom - top, view.innerHeight - top - trailingPadding)); + }; + const apply = () => { + frame = undefined; + if (signal.aborted || !wrapper.isConnected) return; + collectAncestors(); + const available = wrapper.clientWidth; // integer floor: never overflows the host + const baseWidth = stage.offsetWidth; + const baseHeight = stage.offsetHeight; + if (!available || !baseWidth || !baseHeight) return; + let scale = Math.min(1, available / baseWidth); + if (fitHeight) { + const availableHeight = heightLimit(); + scale = Math.min(scale, availableHeight / baseHeight); + } + if (Math.abs(scale - applied.scale) < 0.0005 && baseWidth === applied.width && baseHeight === applied.height) return; + const scaleChanged = scale !== applied.scale; + applied = { scale, width: baseWidth, height: baseHeight }; + stage.style.transform = scale < 1 ? `scale(${scale})` : ''; + wrapper.style.height = `${baseHeight * scale}px`; + wrapper.dataset.scale = scale.toFixed(4); + wrapper.dataset.baseWidth = String(baseWidth); + wrapper.dataset.baseHeight = String(baseHeight); + // Open tooltips were positioned from pre-scale geometry; let them close. + if (scaleChanged) wrapper.dispatchEvent(new view.CustomEvent('hm-orgchart-scale', { bubbles: true })); + }; + const schedule = () => { if (frame === undefined && !signal.aborted) frame = view.requestAnimationFrame(apply); }; + const observer = new view.ResizeObserver(schedule); + observer.observe(wrapper); + observer.observe(stage); + wrapper.ownerDocument.fonts?.addEventListener('loadingdone', schedule, { signal }); + // Viewport height changes do not resize the wrapper; observe them directly. + if (fitHeight) view.addEventListener('resize', schedule, { signal }); + signal.addEventListener('abort', () => { + observer.disconnect(); + if (frame !== undefined) view.cancelAnimationFrame(frame); + frame = undefined; + }, { once: true }); +} diff --git a/packages/org-chart/src/core/org-chart-tree.ts b/packages/org-chart/src/core/org-chart-tree.ts new file mode 100644 index 0000000..4472fbb --- /dev/null +++ b/packages/org-chart/src/core/org-chart-tree.ts @@ -0,0 +1,10 @@ +/** Stable engine/focus boundary; summaries never become engine nodes. */ +export function createOrgChartTree(document: Document): HTMLElement { + const viewport = document.createElement('div'); + viewport.className = 'hm-orgchart-viewport'; + viewport.dataset.component = 'OrgChartTree'; + viewport.tabIndex = 0; + viewport.setAttribute('role', 'region'); + viewport.setAttribute('aria-label', '조직 계층도 가로 스크롤 영역'); + return viewport; +} diff --git a/packages/org-chart/src/core/organization-totals.ts b/packages/org-chart/src/core/organization-totals.ts new file mode 100644 index 0000000..d29fa83 --- /dev/null +++ b/packages/org-chart/src/core/organization-totals.ts @@ -0,0 +1,95 @@ +import { selectMajorOrganizationTotals, selectOrganizationPositionCounts } from '../data/content-selectors.js'; +import type { RenderContext } from './render.js'; + +function text(document: Document, tag: string, className: string, value: string): HTMLElement { + const element = document.createElement(tag); + element.className = className; + element.textContent = value; + return element; +} + +/** Read-only Workdesk matrix: disjoint major organization rows, position + * columns and one subtotal. The independent PositionSummary retains its + * detailed direct/inclusive counts, aggregation policy and public API. */ +export function createOrganizationTotals(document: Document, context: RenderContext): HTMLElement { + const section = document.createElement('section'); + section.className = 'hm-orgchart-organization-totals'; + section.dataset.contentSection = 'organization-totals'; + const title = text(document, 'h3', 'hm-orgchart-organization-totals-title', '직위별 인원 현황 (팀별)'); + section.append(title); + + // Keep the source's five position columns where they exist. Additional + // declared positions remain visible rather than being dropped or relabelled. + const declaredPositions = Object.keys(context.summary.raw.byPosition); + const preferredPositions = ['경영진', '수석', '책임', '선임', '연구']; + const positions = [ + ...preferredPositions.filter(position => declaredPositions.includes(position)), + ...declaredPositions.filter(position => !preferredPositions.includes(position)), + ]; + section.style.setProperty('--hm-orgchart-workdesk-summary-width', `${84 + (positions.length + 1) * 41}px`); + const matrix = selectOrganizationPositionCounts(context.data); + const children = new Map(); + for (const organization of context.data.organizations) { + if (organization.parentId === null) continue; + const siblings = children.get(organization.parentId) ?? []; + siblings.push(organization.id); + children.set(organization.parentId, siblings); + } + const frame = document.createElement('div'); + frame.className = 'hm-orgchart-workdesk-summary-frame'; + const table = document.createElement('table'); + table.className = 'hm-orgchart-workdesk-position-table'; + table.setAttribute('aria-label', '직위별 인원 현황 (팀별)'); + const columns = document.createElement('colgroup'); + for (let index = 0; index < positions.length + 2; index++) { + const column = document.createElement('col'); + column.className = index === 0 ? 'hm-orgchart-workdesk-label-column' : 'hm-orgchart-workdesk-value-column'; + columns.append(column); + } + const head = document.createElement('thead'); + const header = document.createElement('tr'); + for (const label of ['팀원', ...positions, '소계']) { + const cell = document.createElement('th'); + cell.scope = 'col'; + cell.textContent = label; + header.append(cell); + } + head.append(header); + const body = document.createElement('tbody'); + for (const { organization, scope, count } of selectMajorOrganizationTotals(context.data, context.summary)) { + const row = document.createElement('tr'); + row.dataset.organizationId = organization.id; + row.dataset.countScope = scope; + const label = document.createElement('th'); + label.scope = 'row'; + label.textContent = organization.name; + row.append(label); + const organizations = [organization.id]; + if (scope === 'inclusive') { + for (let index = 0; index < organizations.length; index++) organizations.push(...children.get(organizations[index]!) ?? []); + } + for (const position of positions) { + const positionCount = organizations.reduce((sum, id) => sum + (matrix.get(id)?.get(position) ?? 0), 0); + const cell = text(document, 'td', 'hm-orgchart-workdesk-count-cell', String(positionCount)); + cell.dataset.position = position; + row.append(cell); + } + row.append(text(document, 'td', 'hm-orgchart-workdesk-count-cell hm-orgchart-workdesk-subtotal', String(count))); + body.append(row); + } + const foot = document.createElement('tfoot'); + const total = document.createElement('tr'); + const totalLabel = document.createElement('th'); + totalLabel.scope = 'row'; + totalLabel.textContent = '계'; + total.append(totalLabel); + for (const position of positions) total.append(text(document, 'td', 'hm-orgchart-workdesk-count-cell', String(context.summary.raw.byPosition[position] ?? 0))); + const totalCount = text(document, 'td', 'hm-orgchart-workdesk-count-cell hm-orgchart-workdesk-subtotal', String(context.summary.raw.total)); + totalCount.dataset.totalCount = String(context.summary.raw.total); + total.append(totalCount); + foot.append(total); + table.append(columns, head, body, foot); + frame.append(table); + section.append(frame); + return section; +} diff --git a/packages/org-chart/src/core/person-name-overflow.ts b/packages/org-chart/src/core/person-name-overflow.ts new file mode 100644 index 0000000..3c50ecf --- /dev/null +++ b/packages/org-chart/src/core/person-name-overflow.ts @@ -0,0 +1,72 @@ +let tooltipSequence = 0; + +/** Presentation-only overflow. Keep the complete text node for accessibility; + * cropped names enter the tab order and expose a hoverable/dismissible tooltip. + * Each observer/listener/tooltip belongs to the existing card abort boundary. */ +export function observePersonNameOverflow(card: HTMLElement, name: HTMLElement, signal: AbortSignal): void { + const document = card.ownerDocument; + const window = document.defaultView; + if (!window) return; + const tooltip = document.createElement('span'); + tooltip.id = `hm-orgchart-person-name-tip-${++tooltipSequence}`; + tooltip.className = 'hm-orgchart-person-name-tooltip'; + tooltip.setAttribute('role', 'tooltip'); + tooltip.textContent = name.textContent; + tooltip.hidden = true; + let timer: number | undefined; + let hoveringTooltip = false; + let scaleListening = false; + const focused = () => (name.getRootNode() as ShadowRoot).activeElement === name; + function cancelTimer(): void { if (timer !== undefined) window!.clearTimeout(timer); timer = undefined; } + function hide(): void { cancelTimer(); tooltip.hidden = true; name.dataset.tooltipOpen = 'false'; } + function refresh(): void { + if (signal.aborted || !name.isConnected || name.clientWidth === 0) return; + const overflow = name.scrollWidth > name.clientWidth; + name.dataset.nameOverflow = String(overflow); + if (overflow) { + name.tabIndex = 0; + name.setAttribute('aria-describedby', tooltip.id); + // Fixed positioning avoids adding hidden content to tree/document scroll + // extents. Append inside the same Shadow Root for IDREF accessibility. + const shell = card.closest('.hm-orgchart-shell'); + shell?.append(tooltip); + // Full Composition scale changes move cards without a window resize. + if (shell && !scaleListening) { scaleListening = true; shell.addEventListener('hm-orgchart-scale', hide, { signal }); } + } else { + name.removeAttribute('tabindex'); + name.removeAttribute('aria-describedby'); + hide(); + tooltip.remove(); + } + } + function show(): void { + cancelTimer(); + refresh(); + if (name.dataset.nameOverflow !== 'true') return; + tooltip.hidden = false; + name.dataset.tooltipOpen = 'true'; + const bounds = name.getBoundingClientRect(); + const tip = tooltip.getBoundingClientRect(); + const left = Math.max(8, Math.min(bounds.left, window!.innerWidth - tip.width - 8)); + const below = bounds.bottom + 6; + const top = below + tip.height <= window!.innerHeight - 8 ? below : Math.max(8, bounds.top - tip.height - 6); + tooltip.style.left = `${left}px`; + tooltip.style.top = `${top}px`; + } + name.addEventListener('mouseenter', show, { signal }); + name.addEventListener('mouseleave', () => { + if (!focused()) timer = window.setTimeout(() => { if (!hoveringTooltip) hide(); }, 180); + }, { signal }); + name.addEventListener('focus', show, { signal }); + name.addEventListener('blur', () => { if (!hoveringTooltip) hide(); }, { signal }); + name.addEventListener('keydown', event => { if (event.key === 'Escape') hide(); }, { signal }); + tooltip.addEventListener('mouseenter', () => { hoveringTooltip = true; cancelTimer(); }, { signal }); + tooltip.addEventListener('mouseleave', () => { hoveringTooltip = false; if (!focused()) hide(); }, { signal }); + window.addEventListener('scroll', hide, { capture: true, signal }); + window.addEventListener('resize', hide, { signal }); + document.fonts.addEventListener('loadingdone', refresh, { signal }); + const observer = new window.ResizeObserver(refresh); + observer.observe(name); + void document.fonts.ready.then(refresh); + signal.addEventListener('abort', () => { cancelTimer(); observer.disconnect(); tooltip.remove(); }, { once: true }); +} diff --git a/packages/org-chart/src/core/position-summary.ts b/packages/org-chart/src/core/position-summary.ts new file mode 100644 index 0000000..38c43a5 --- /dev/null +++ b/packages/org-chart/src/core/position-summary.ts @@ -0,0 +1,82 @@ +import { selectOrganizationPositionCounts } from '../data/content-selectors.js'; +import type { RenderContext } from './render.js'; + +function text(document: Document, tag: string, className: string, value: string): HTMLElement { + const element = document.createElement(tag); + element.className = className; + element.textContent = value; + return element; +} + +/** Independent, passive content component; composition controls its visibility and placement. */ +export function createPositionSummary(document: Document, context: RenderContext): HTMLElement { + const section = document.createElement('section'); + section.className = 'hm-orgchart-summary hm-orgchart-position-summary'; + section.setAttribute('aria-label', '조직 및 직위별 원본 인원 현황'); + section.dataset.contentSection = 'position-summary'; + section.append(text(document, 'h3', 'hm-orgchart-summary-title', '조직 · 직위별 인원 현황')); + section.append(text(document, 'p', 'hm-orgchart-raw-total', `Raw Count · 원본 직원 전체 ${context.summary.raw.total}명`)); + section.append(text(document, 'p', 'hm-orgchart-policy', '원본 직원 ID를 직접 소속 조직에서 한 번 집계합니다. 조직장 · 파견 · 휴직을 포함하며 업무 총원 정책을 뜻하지 않습니다.')); + section.append(text(document, 'p', 'hm-orgchart-policy', context.summary.aggregation.status === 'ready' + ? `승인 정책 ${context.summary.aggregation.policyVersion}: 총원 ${context.summary.aggregation.counts.total}명` + : '정책 총원 미확정: 집계 정책 승인이 필요합니다.')); + + const scroll = document.createElement('div'); + scroll.className = 'hm-orgchart-summary-scroll'; + scroll.tabIndex = 0; + scroll.setAttribute('role', 'region'); + scroll.setAttribute('aria-label', '조직 및 직위별 인원 표, 가로 스크롤 가능'); + const table = document.createElement('table'); + table.className = 'hm-orgchart-position-table'; + const caption = document.createElement('caption'); + caption.textContent = '직위별 교차 인원과 소계는 직접 소속 기준입니다. 하위 포함 수는 서로 합산하지 않습니다.'; + const positions = Object.keys(context.summary.raw.byPosition); + const matrix = selectOrganizationPositionCounts(context.data); + const head = document.createElement('thead'); + const headerRow = document.createElement('tr'); + for (const label of ['조직', ...positions, '소계 (직접)', '하위 포함']) { + const cell = document.createElement('th'); + cell.scope = 'col'; + cell.textContent = label; + headerRow.append(cell); + } + head.append(headerRow); + const body = document.createElement('tbody'); + for (const organization of context.orderedOrganizations) { + const row = document.createElement('tr'); + row.dataset.organizationId = organization.id; + const name = document.createElement('th'); + name.scope = 'row'; + name.textContent = organization.name; + row.append(name); + for (const position of positions) row.append(text(document, 'td', 'hm-orgchart-count-cell', String(matrix.get(organization.id)?.get(position) ?? 0))); + const counts = context.summary.raw.byOrganization[organization.id]; + row.append(text(document, 'td', 'hm-orgchart-count-cell hm-orgchart-subtotal', String(counts?.direct ?? 0))); + row.append(text(document, 'td', 'hm-orgchart-count-cell hm-orgchart-inclusive', String(counts?.inclusive ?? 0))); + body.append(row); + } + const foot = document.createElement('tfoot'); + const totalRow = document.createElement('tr'); + const totalLabel = document.createElement('th'); + totalLabel.scope = 'row'; + totalLabel.textContent = '전체 합계'; + totalRow.append(totalLabel); + for (const position of positions) totalRow.append(text(document, 'td', 'hm-orgchart-count-cell', String(context.summary.raw.byPosition[position] ?? 0))); + totalRow.append(text(document, 'td', 'hm-orgchart-count-cell', String(context.summary.raw.total))); + const inclusiveTotal = text(document, 'td', 'hm-orgchart-inclusive', '—'); + inclusiveTotal.setAttribute('aria-label', '하위 포함 수는 중복되어 합산하지 않음'); + totalRow.append(inclusiveTotal); + foot.append(totalRow); + table.append(caption, head, body, foot); + scroll.append(table); + section.append(scroll); + + section.append(text(document, 'h4', 'hm-orgchart-group-title', '근무 상태별 원본 직원')); + const statuses = document.createElement('dl'); + statuses.className = 'hm-orgchart-summary-group hm-orgchart-status-totals'; + for (const [key, label] of [['active', '재직'], ['dispatched', '파견'], ['onLeave', '휴직']] as const) { + statuses.append(text(document, 'dt', '', label), text(document, 'dd', '', `${context.summary.raw.byStatus[key]}명`)); + } + section.append(statuses); + return section; +} diff --git a/packages/org-chart/src/core/render.ts b/packages/org-chart/src/core/render.ts new file mode 100644 index 0000000..15ffddf --- /dev/null +++ b/packages/org-chart/src/core/render.ts @@ -0,0 +1,140 @@ +import type { Employee, OrgChartDataset, OrgChartSummary, OrganizationTreeNode } from '../data/index.js'; +import type { RenderEngineNode } from './engine.js'; +import { createEmployeeCard } from './employee-card.js'; +import { applyOrganizationStyle, organizationStylePresets } from './style-presets.js'; +import { getDepartmentCardAsset } from './department-card-assets.js'; +import type { OrgChartOrganizationLinks } from './types.js'; + +const organizationNames = { root: '최상위 조직', division: '부문', office: '실', div: 'Div', cell: '셀', team: '팀' } as const; + +export interface RenderContext { + data: OrgChartDataset; + summary: OrgChartSummary; + orderedOrganizations: OrganizationTreeNode['organization'][]; + employeesByOrganization: ReadonlyMap; + topLeaderIds: ReadonlySet; + /** View-only composition: no collapse controls or diagnostic text are created. */ + readOnly?: boolean; + organizationLinks?: OrgChartOrganizationLinks; +} + +export function engineTree(roots: OrganizationTreeNode[], prefix: string, context: RenderContext, startDepth = 0): RenderEngineNode[] { + function convert(tree: OrganizationTreeNode, depth: number, variant: number): RenderEngineNode { + variant = organizationStylePresets.find(preset => preset.organizationId === tree.organization.id)?.id ?? variant; + const index = context.orderedOrganizations.length; + context.orderedOrganizations.push(tree.organization); + return { + id: `${prefix}-org-${index}`, name: '', organizationIndex: index, depth, groupVariant: variant, + ...(tree.children.length ? { children: tree.children.map((child, childIndex) => convert(child, depth + 1, context.readOnly ? variant : depth === startDepth ? childIndex % 6 : variant)) } : {}), + }; + } + // Multiple actual roots stay independent; no fictitious organizational parent. + return roots.map((tree, index) => convert(tree, startDepth, index % 6)); +} + +function text(document: Document, tag: string, className: string, value: string): HTMLElement { + const element = document.createElement(tag); + element.className = className; + element.textContent = value; + return element; +} + +export function decorateNode( + node: HTMLElement, value: RenderEngineNode, context: RenderContext, + signal: AbortSignal, toggle: (node: HTMLElement) => boolean | undefined, +): void { + const organization = context.orderedOrganizations[Number(value.organizationIndex)]; + if (!organization) return; + const document = node.ownerDocument; + const card = node.querySelector('.hm-orgchart-organization')!; + node.dataset.organizationId = organization.id; + node.dataset.depth = String(value.depth); + // Engine roots can be flattened for composition. Card policy uses the + // original ancestry rather than the engine's display depth or job title. + let organizationDepth = 0; + let ancestor = organization; + while (ancestor.parentId) { + const parent = context.data.organizations.find(item => item.id === ancestor.parentId); + if (!parent) break; + organizationDepth++; + ancestor = parent; + } + node.dataset.organizationDepth = String(organizationDepth); + applyOrganizationStyle(node, Number(value.groupVariant)); + node.dataset.organizationType = organization.type; + // Header role is styling-only: depth 0-1 are organization titles, deeper nodes are cell/team headers. + node.dataset.headerRole = (context.readOnly ? organizationDepth : Number(value.depth)) <= 1 ? 'organization' : 'group'; + // Hide upstream mouse-only arrows, retaining the engine's hierarchy connectors. + for (const edge of node.querySelectorAll('.edge')) edge.setAttribute('aria-hidden', 'true'); + const readOnly = context.readOnly === true; + // Kind, ID, raw counts and vacancy notes are diagnostic; read-only shows the header and people only. + if (!readOnly) card.append(text(document, 'span', 'hm-orgchart-kind', organizationNames[organization.type])); + const heading = text(document, 'h3', 'hm-orgchart-organization-name', organization.name); + const href = organizationDepth === 1 ? context.organizationLinks?.[organization.id] : undefined; + if (href) { + const link = document.createElement('a'); + link.className = 'hm-orgchart-organization-link'; + link.href = href; + link.textContent = organization.name; + heading.replaceChildren(link); + // Native links retain keyboard and browser navigation semantics; this + // click must not also reach the upstream node selection/collapse handler. + link.addEventListener('click', event => event.stopPropagation(), { signal }); + link.addEventListener('keydown', event => event.stopPropagation(), { signal }); + } + card.append(heading); + if (!readOnly) { + const id = text(document, 'span', 'hm-orgchart-domain-id', organization.id); + id.title = organization.id; + card.append(id); + const counts = context.summary.raw.byOrganization[organization.id]; + card.append(text(document, 'p', 'hm-orgchart-node-count', `원본 직원: 직접 ${counts?.direct ?? 0}명 · 하위 포함 ${counts?.inclusive ?? 0}명`)); + } + const leader = organization.leaderId ? context.data.employees.find(employee => employee.id === organization.leaderId) : undefined; + const affiliationName = (employee: Employee) => context.data.affiliations.find(item => item.id === employee.affiliationId)?.name; + if (leader && !context.topLeaderIds.has(leader.id)) card.append(createEmployeeCard(document, leader, { + kind: 'leader', affiliationName: affiliationName(leader), workdeskPresentation: readOnly, + cardAsset: getDepartmentCardAsset(organization.id, readOnly && organizationDepth !== 1 ? 'employee' : 'leader', context.data.organizations), + }, signal)); + else if (readOnly) { /* The top leader card or an empty slot needs no placeholder text. */ } + else if (leader) card.append(text(document, 'p', 'hm-orgchart-vacancy', '조직장: 상단 독립 카드')); + else card.append(text(document, 'p', 'hm-orgchart-vacancy', '조직장 미지정')); + if (context.data.presentation?.groups.showEmployees !== false) { + const employees = document.createElement('div'); + employees.className = 'hm-orgchart-employees'; + for (const employee of context.employeesByOrganization.get(organization.id) ?? []) { + if (employee.id !== leader?.id && !context.topLeaderIds.has(employee.id)) employees.append(createEmployeeCard(document, employee, { kind: 'employee', workdeskPresentation: readOnly, affiliationName: affiliationName(employee), cardAsset: getDepartmentCardAsset(organization.id, 'employee', context.data.organizations) }, signal)); + } + card.append(employees); + } + // Read-only hierarchy is always fully expanded; no toggle (and no leftover space) is created. + if (value.children?.length && !readOnly) { + const button = document.createElement('button'); + button.type = 'button'; + button.className = 'hm-orgchart-toggle'; + button.textContent = '하위 조직 접기'; + button.setAttribute('aria-label', `${organization.name} 하위 조직 접기`); + button.setAttribute('aria-expanded', 'true'); + button.addEventListener('click', event => { + event.stopPropagation(); + const expanded = toggle(node); + if (expanded === undefined) return; + button.setAttribute('aria-expanded', String(expanded)); + const label = expanded ? '하위 조직 접기' : '하위 조직 펼치기'; + button.textContent = label; + button.setAttribute('aria-label', `${organization.name} ${label}`); + }, { signal }); + card.append(button); + } +} + +export function createHeading(document: Document, context: RenderContext): HTMLElement { + const header = document.createElement('header'); + header.className = 'hm-orgchart-heading'; + header.append(text(document, 'h2', 'hm-orgchart-title', context.data.presentation?.title ?? '조직도')); + // Read-only keeps the title and as-of date; description and relation notes are explanatory text. + if (context.data.presentation?.description && !context.readOnly) header.append(text(document, 'p', 'hm-orgchart-description', context.data.presentation.description)); + header.append(text(document, 'p', 'hm-orgchart-date', `기준일 ${context.data.metadata.asOfDate}`)); + if (context.data.relations?.length && !context.readOnly) header.append(text(document, 'p', 'hm-orgchart-description', `추가 관계 ${context.data.relations.length}건은 이번 기본 조직 계층선에 포함되지 않습니다.`)); + return header; +} diff --git a/packages/org-chart/src/core/representative-card-asset.ts b/packages/org-chart/src/core/representative-card-asset.ts new file mode 100644 index 0000000..87203ec --- /dev/null +++ b/packages/org-chart/src/core/representative-card-asset.ts @@ -0,0 +1,14 @@ +import url from '../assets/cards/대표자.svg?inline'; + +export interface RepresentativeCardAsset { + size: 'representative'; + label: string; + url: string; + width: number; + height: number; +} + +/** Separate from department mapping: only the standalone topLeader uses it. */ +export const representativeCardAsset: RepresentativeCardAsset = { + size: 'representative', label: '대표자 전용', url, width: 146, height: 74, +}; diff --git a/packages/org-chart/src/core/status-summary.ts b/packages/org-chart/src/core/status-summary.ts new file mode 100644 index 0000000..c61c252 --- /dev/null +++ b/packages/org-chart/src/core/status-summary.ts @@ -0,0 +1,45 @@ +import { selectStatusGroups } from '../data/content-selectors.js'; +import { createEmployeeCard } from './employee-card.js'; +import type { RenderContext } from './render.js'; + +/** `compact` is the read-only composition form: label-only headers and no policy note. */ +export function createStatusSummary(document: Document, context: RenderContext, signal: AbortSignal, { compact = false } = {}): HTMLElement { + const section = document.createElement('section'); + section.className = 'hm-orgchart-status-summary'; + section.dataset.contentSection = 'status-summary'; + section.setAttribute('aria-label', '파견 및 휴직 직원'); + const affiliations = new Map(context.data.affiliations.map(affiliation => [affiliation.id, affiliation.name])); + for (const { status, employees, count } of selectStatusGroups(context.data, context.summary)) { + const group = document.createElement('section'); + group.className = 'hm-orgchart-status-group'; + group.dataset.workStatus = status; + const label = status === 'dispatched' ? '파견' : '휴직'; + group.setAttribute('aria-label', `${label} 직원`); + const heading = document.createElement('h3'); + heading.className = 'hm-orgchart-summary-title'; + heading.textContent = compact ? label : `${label} · ${count}명`; + if (compact) heading.setAttribute('aria-label', `${label} ${count}명`); + group.append(heading); + const cards = document.createElement('div'); + cards.className = 'hm-orgchart-status-employees'; + for (const employee of employees) { + cards.append(createEmployeeCard(document, employee, { kind: 'employee', workdeskPresentation: context.readOnly, + hideStatusLabel: compact && context.readOnly, affiliationName: affiliations.get(employee.affiliationId) }, signal)); + } + group.append(cards); + if (!employees.length) { + const empty = document.createElement('p'); + empty.className = 'hm-orgchart-content-empty'; + empty.textContent = `${label} 직원이 없습니다.`; + group.append(empty); + } + if (!compact) { + const note = document.createElement('p'); + note.className = 'hm-orgchart-policy'; + note.textContent = '원본 직원의 상태별 별도 표시입니다. 전체 인원에 중복 합산하지 않습니다.'; + group.append(note); + } + section.append(group); + } + return section; +} diff --git a/packages/org-chart/src/core/style-presets.ts b/packages/org-chart/src/core/style-presets.ts new file mode 100644 index 0000000..f126413 --- /dev/null +++ b/packages/org-chart/src/core/style-presets.ts @@ -0,0 +1,76 @@ +/** Presentation-only colors measured from Workdesk organization headers. + * Header measurements do not verify employee card edges/fills. Standalone + * OrgChart defaults and employee JSON remain separate from this local config. */ +const status = 'WORKDESK_COMPUTED' as const; +const source = 'https://workdesk.hmac.kr/' as const; +const observedOn = '2026-10-12' as const; +const version = 'v1.2610.9c5e' as const; +const foregroundVariable = '--hm-orgchart-resolved-on-action-primary' as const; +const cardBackground = 'var(--hm-orgchart-resolved-bg-surface)' as const; +const departmentColor = '#ffffff' as const; +const cardStyleStatus = 'DESIGN_ADAPTATION' as const; +const verificationScope = 'Organization header background only; employee card edges/fills NOT VERIFIED' as const; + +export const organizationStylePresets = [ + { + id: 0, label: '사업관리', accentColor: '#194d82', + organizationId: 'business-management', variablePrefix: '--hm-orgchart-business-management', + cardBackground, departmentColor, borderColor: '#194d82', cardStyleStatus, + backgroundImage: 'linear-gradient(180deg, #194d82 0%, #1d395c 100%)', + foregroundVariable, status, source, observedOn, version, selector: '.h33', verificationScope, + }, + { + id: 1, label: '경영기획', accentColor: '#2164a8', + organizationId: 'business-planning', variablePrefix: '--hm-orgchart-business-planning', + cardBackground, departmentColor, borderColor: '#2164a8', cardStyleStatus, + backgroundImage: 'linear-gradient(180deg, #2164a8 0%, #254975 100%)', + foregroundVariable, status, source, observedOn, version, selector: '.h33.org-team-link', verificationScope, + }, + { + id: 2, label: '인재성장', accentColor: '#0f6ace', + organizationId: 'talent-growth', variablePrefix: '--hm-orgchart-talent-growth', + cardBackground, departmentColor, borderColor: '#0f6ace', cardStyleStatus, + backgroundImage: 'linear-gradient(180deg, #0f6ace 0%, #044a94 100%)', + foregroundVariable, status, source, observedOn, version, selector: '.h38.org-team-link', verificationScope, + }, + { + id: 3, label: '통합시스템 Div', accentColor: '#8c67b6', + organizationId: 'integrated-system', variablePrefix: '--hm-orgchart-integrated-system', + cardBackground, departmentColor, borderColor: '#8c67b6', cardStyleStatus, + backgroundImage: 'linear-gradient(180deg, #8c67b6 0%, #5d3494 100%)', + foregroundVariable, status, source, observedOn, version, selector: '.h310.org-team-link', verificationScope, + }, + { + id: 4, label: '디자인기획', accentColor: '#09a7a2', + organizationId: 'design-planning', variablePrefix: '--hm-orgchart-design-planning', + cardBackground, departmentColor, borderColor: '#09a7a2', cardStyleStatus, + backgroundImage: 'linear-gradient(180deg, #09a7a2 0%, #00847f 100%)', + foregroundVariable, status, source, observedOn, version, selector: '.h312.org-team-link', verificationScope, + }, + { + id: 5, label: '솔루션영업', accentColor: '#5a963c', + organizationId: 'solution-sales', variablePrefix: '--hm-orgchart-solution-sales', + cardBackground, departmentColor, borderColor: '#5a963c', cardStyleStatus, + backgroundImage: 'linear-gradient(180deg, #5a963c 0%, #3f7629 100%)', + foregroundVariable, status, source, observedOn, version, selector: '.h36.org-team-link', verificationScope, + }, +] as const; + +export function applyOrganizationStyle(element: HTMLElement, variant: number): void { + const preset = organizationStylePresets[variant] ?? organizationStylePresets[0]; + element.dataset.groupVariant = String(preset.id); + const prefix = preset.variablePrefix; + element.style.setProperty('--hm-orgchart-current-card-background', + `var(${prefix}-card-background, var(--hm-orgchart-card-background, ${preset.cardBackground}))`); + element.style.setProperty('--hm-orgchart-current-card-color', + `var(${prefix}-card-color, var(--hm-orgchart-card-color, var(--hm-orgchart-resolved-fg-primary)))`); + element.style.setProperty('--hm-orgchart-current-department-color', + `var(${prefix}-department-color, var(--hm-orgchart-department-color, ${preset.departmentColor}))`); + element.style.setProperty('--hm-orgchart-current-border', + `var(${prefix}-border, var(--hm-orgchart-border, ${preset.borderColor}))`); + element.style.setProperty('--hm-orgchart-current-gradient', + `var(${prefix}-gradient, var(--hm-orgchart-gradient, ${preset.backgroundImage}))`); + // Compatibility aliases remain local to this presentation element. + element.style.setProperty('--hm-orgchart-accent', 'var(--hm-orgchart-current-border)'); + element.style.setProperty('--hm-orgchart-group-background', 'var(--hm-orgchart-current-gradient)'); +} diff --git a/packages/org-chart/src/core/types.ts b/packages/org-chart/src/core/types.ts new file mode 100644 index 0000000..199a22b --- /dev/null +++ b/packages/org-chart/src/core/types.ts @@ -0,0 +1,48 @@ +import type { Affiliation, ApprovedAggregationPolicy, Employee, OrgChartDataSource, OrgChartSummary, Organization, ValidationIssue } from '../data/index.js'; + +export type OrgChartState = + | { readonly status: 'idle' | 'loading' | 'empty' | 'destroyed' } + | { readonly status: 'ready'; readonly dataVersion: string; readonly summary: OrgChartSummary; readonly aggregation: OrgChartSummary['aggregation'] } + | { readonly status: 'error'; readonly issues: readonly ValidationIssue[] }; + +/** 'interactive' (default) keeps collapse controls and diagnostic text. + * 'readOnly' is the view-only Workdesk composition: expanded hierarchy, no + * controls or development text, compact summaries on a fitted design canvas. */ +export type OrgChartDisplayMode = 'interactive' | 'readOnly'; + +/** Links are keyed by the existing organization ID. Only 1Depth titles use them. */ +export type OrgChartOrganizationLinks = Readonly>; + +export interface OrgChartEmployeeClickContext { + readonly organization: Organization | undefined; + readonly affiliation: Affiliation | undefined; + /** Focusable card that activated this request, outside the default dialog. */ + readonly trigger: HTMLElement; + readonly originalEvent: MouseEvent | KeyboardEvent; +} + +export interface OrgChartOptions { + container?: HTMLElement; + dataSource: OrgChartDataSource; + aggregationPolicy?: ApprovedAggregationPolicy; + /** Resolved CSS URLs inserted in the instance's Shadow DOM, in this order. */ + stylesheetUrls: { engine: string; core: string }; + /** Full composition presentation only; standalone views ignore it. */ + displayMode?: OrgChartDisplayMode; + /** No entry (or an empty URL) keeps an ordinary title. HTTP(S) and relative URLs are supported. */ + organizationLinks?: OrgChartOrganizationLinks; + /** Optional host-owned information UI. When supplied, it replaces the default read-only dialog. + * Called for every employee card in interactive and readOnly modes. */ + onEmployeeClick?: (employee: Employee, context: OrgChartEmployeeClickContext) => void; + onStateChange?: (state: OrgChartState) => void; +} + +export interface OrgChartHandle { + mount(container?: HTMLElement): Promise; + update(input: unknown): Promise; + reload(source?: OrgChartDataSource): Promise; + /** Terminal, idempotent disposal. Create a new handle for a later mount. */ + destroy(): void; + subscribe(listener: (state: OrgChartState) => void): () => void; + getState(): OrgChartState; +} diff --git a/packages/org-chart/src/core/vendor.d.ts b/packages/org-chart/src/core/vendor.d.ts new file mode 100644 index 0000000..3a22943 --- /dev/null +++ b/packages/org-chart/src/core/vendor.d.ts @@ -0,0 +1,38 @@ +declare module '*.svg?inline' { + const url: string; + export default url; +} +declare module '*.png?inline' { + const url: string; + export default url; +} +declare module 'orgchart' { + export interface EngineNode { id: string; name: string; children?: EngineNode[]; [key: string]: unknown } + export interface EngineOptions { + data: EngineNode | EngineNode[]; + pan: boolean; + zoom: boolean; + minimap: boolean; + draggable: boolean; + exportButton: boolean; + chartClass: string; + nodeTemplate: () => string; + createNode: (node: HTMLElement, data: EngineNode) => void; + } + export default class OrgChart { + constructor(container: HTMLElement, options: EngineOptions); + chart: HTMLElement | null; + chartContainer: HTMLElement | null; + opts: Partial; + options: Partial; + init(options?: Partial): OrgChart; + triggerInitEvent(): void; + handleCompactNodes(): void; + getNodeState(node: HTMLElement, relation: string): { visible: boolean }; + hideChildren(node: HTMLElement): void; + showChildren(node: HTMLElement): void; + unbindPan(): void; + unbindZoom(): void; + detachMinimap(): void; + } +} diff --git a/packages/org-chart/src/core/workdesk-artwork.ts b/packages/org-chart/src/core/workdesk-artwork.ts new file mode 100644 index 0000000..bc19c87 --- /dev/null +++ b/packages/org-chart/src/core/workdesk-artwork.ts @@ -0,0 +1,103 @@ +import ring from '../assets/workdesk/Group.svg?inline'; +import sky from '../assets/workdesk/bg_sky.png?inline'; +import meeting from '../assets/workdesk/bg_main.png?inline'; +import hubFrame from '../assets/workdesk/Frame2@3x.png?inline'; +import grid from '../assets/workdesk/1-8-4x-1@2x.png?inline'; +import blueShort from '../assets/workdesk/team-arrow-blue-short.png?inline'; +import bluePurple from '../assets/workdesk/team-arrow-blue-purple.png?inline'; +import purpleTeal from '../assets/workdesk/team-arrow-purple-teal.png?inline'; +import tealGreen from '../assets/workdesk/team-arrow-teal-green.png?inline'; +import { workdeskCanvas } from './workdesk-layout.js'; + +const svgNamespace = 'http://www.w3.org/2000/svg'; +const hubPaths = [ + ['hub-to-business', 'M411.134 66.9559C456.067 45.0289 560.802 1.17493 695.801 1.17493'], + ['hub-to-design-solution', 'M1258.34 66.9559C1203.65 45.0289 1044.265 1.17493 848.038 1.17493'], + ['hub-to-teams-arc', 'M143.631104 74.8701C350.174 18.7487 874.423 -59.8214 1660.47 74.8701'], +] as const; +const arrows = [ + ['blue-short-1', blueShort, 194.15, 311.75, 66.25, 19.8], + ['blue-short-2', blueShort, 430.40, 311.75, 66.25, 19.8], + ['blue-purple', bluePurple, 666.65, 302, 183.75, 42], + ['purple-teal', purpleTeal, 1044, 302, 258.916, 42], + ['teal-green', tealGreen, 1520.55, 305, 135.349, 36], +] as const; + +/** Local, byte-preserved Workdesk artwork embedded by the package bundler. + * All geometry belongs to the same stage as the cards (one uniform scale). + * Original compact screenD paths are from org-dashboard-data.js; the obsolete + * static HTML fourth hub path and hidden executive branch are not rendered. */ +export function addWorkdeskArtwork(stage: HTMLElement, hub: HTMLElement, signal: AbortSignal): void { + const document = stage.ownerDocument; + stage.dataset.workdeskArtwork = 'true'; + const decoration = (id: string, source: string, parent = stage) => { + const image = document.createElement('img'); + image.className = `hm-orgchart-workdesk-decoration hm-orgchart-workdesk-${id}`; + image.dataset.workdeskAsset = id; + image.alt = ''; + image.setAttribute('aria-hidden', 'true'); + image.draggable = false; + image.src = source; + parent.append(image); + }; + decoration('ring', ring); + decoration('sky', sky); + decoration('meeting', meeting); + decoration('grid', grid); + decoration('hub-frame', hubFrame, hub); + + const overlay = document.createElementNS(svgNamespace, 'svg'); + overlay.classList.add('hm-orgchart-workdesk-overlay'); + overlay.setAttribute('viewBox', `0 0 ${workdeskCanvas.width} ${workdeskCanvas.height}`); + overlay.setAttribute('aria-hidden', 'true'); + overlay.setAttribute('focusable', 'false'); + const path = (id: string, d: string, parent: SVGElement = overlay) => { + const element = document.createElementNS(svgNamespace, 'path'); + element.dataset.connector = id; + element.setAttribute('d', d); + element.setAttribute('fill', 'none'); + element.setAttribute('stroke', '#45639F'); + element.setAttribute('stroke-width', '0.893023'); + element.setAttribute('stroke-dasharray', '1.79 1.79'); + parent.append(element); + return element; + }; + const curves = document.createElementNS(svgNamespace, 'g'); + curves.setAttribute('transform', 'translate(162 202)'); + overlay.append(curves); + for (const [id, d] of hubPaths) path(id, d, curves); + path('representative-to-hub', 'M935 142V286').setAttribute('transform', 'translate(0 -17)'); + const business = path('hub-to-business-management', 'M834 204C650 204 250 235 105 256.2'); + for (const [id, source, x, y, width, height] of arrows) { + const image = document.createElementNS(svgNamespace, 'image'); + image.dataset.arrow = id; + for (const [key, value] of Object.entries({ x, y, width, height, href: source, preserveAspectRatio: 'none' })) image.setAttribute(key, String(value)); + overlay.append(image); + } + stage.append(overlay); + + // The original management curve follows the live header's top-center. + // Convert transformed DOM bounds back to the stage coordinate system. + const view = document.defaultView; + if (!view) return; + let frame: number | undefined; + const update = () => { + frame = undefined; + if (signal.aborted || !stage.isConnected) return; + const header = stage.querySelector('.node[data-organization-id="business-management"] .hm-orgchart-organization-name'); + if (!header) return; + const origin = stage.getBoundingClientRect(); + const bounds = header.getBoundingClientRect(); + const scale = origin.width / stage.offsetWidth; + if (!scale) return; + const x = (bounds.left + bounds.width / 2 - origin.left) / scale; + const y = (bounds.top - origin.top) / scale + 2; + business.setAttribute('d', `M834 204C650 204 250 235 ${x.toFixed(2)} ${y.toFixed(2)}`); + }; + const schedule = () => { if (frame === undefined && !signal.aborted) frame = view.requestAnimationFrame(update); }; + const observer = new view.ResizeObserver(schedule); + observer.observe(stage); + document.fonts?.addEventListener('loadingdone', schedule, { signal }); + view.addEventListener('resize', schedule, { signal }); + signal.addEventListener('abort', () => { observer.disconnect(); if (frame !== undefined) view.cancelAnimationFrame(frame); }, { once: true }); +} diff --git a/packages/org-chart/src/core/workdesk-layout.ts b/packages/org-chart/src/core/workdesk-layout.ts new file mode 100644 index 0000000..3e880b6 --- /dev/null +++ b/packages/org-chart/src/core/workdesk-layout.ts @@ -0,0 +1,55 @@ +/** Read-only composition geometry measured on the authenticated Workdesk + * organization chart (v1.2610.9c5e, 2026-10-12). Presentation-only: keyed by + * organization ID like style-presets; data, parentId and order stay untouched. + * Organizations without an entry fall back to the centered flow layout. */ +export const workdeskCanvas = { width: 1920, height: 914.5, axisX: 935 } as const; + +/** Header width equals the leader card (146px); columns are placed by header center. */ +const headerWidth = 146; + +export interface WorkdeskColumnLayout { + organizationId: string; + /** Measured header left edge (px) on the 1920 canvas. */ + headerX: number; + /** Child cells/teams: vertical stack (default) or one horizontal row. */ + children: 'vertical' | 'horizontal'; +} + +export const workdeskColumns: readonly WorkdeskColumnLayout[] = [ + { organizationId: 'business-management', headerX: 32, children: 'vertical' }, + { organizationId: 'business-planning', headerX: 268, children: 'vertical' }, + { organizationId: 'talent-growth', headerX: 505, children: 'vertical' }, + { organizationId: 'integrated-system', headerX: 858, children: 'horizontal' }, + { organizationId: 'design-planning', headerX: 1336, children: 'horizontal' }, + { organizationId: 'solution-sales', headerX: 1689, children: 'vertical' }, +]; + +/** Applies column centers and child arrangement to the rendered engine forest. + * Runs after every engine (re)build; returns false when any top-level + * organization has no measured column, so the caller keeps the flow layout. */ +export function applyWorkdeskLayout(viewport: HTMLElement): boolean { + const forest = viewport.querySelector('.hm-orgchart-forest'); + if (!forest) return false; + const trees = [...forest.querySelectorAll(':scope > .hm-orgchart-tree')]; + const columns = trees.map(tree => { + const id = tree.querySelector('.node[data-organization-id]')?.dataset.organizationId; + return workdeskColumns.find(column => column.organizationId === id); + }); + for (const node of forest.querySelectorAll('.node[data-organization-id]')) { + const column = workdeskColumns.find(item => item.organizationId === node.dataset.organizationId); + if (column?.children === 'horizontal') node.dataset.childrenLayout = 'horizontal'; + else delete node.dataset.childrenLayout; + } + const placed = trees.length > 0 && columns.every(Boolean); + if (!placed) { + delete forest.dataset.layout; + for (const tree of trees) tree.style.removeProperty('--hm-orgchart-column-center'); + return false; + } + const centers = columns.map(column => column!.headerX + headerWidth / 2); + trees.forEach((tree, index) => tree.style.setProperty('--hm-orgchart-column-center', `${centers[index]}px`)); + forest.dataset.layout = 'workdesk'; + forest.style.setProperty('--hm-orgchart-branch-start', `${Math.min(...centers)}px`); + forest.style.setProperty('--hm-orgchart-branch-end', `${Math.max(...centers)}px`); + return true; +} diff --git a/packages/org-chart/src/data/content-selectors.test.ts b/packages/org-chart/src/data/content-selectors.test.ts new file mode 100644 index 0000000..9d0bcb7 --- /dev/null +++ b/packages/org-chart/src/data/content-selectors.test.ts @@ -0,0 +1,133 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { selectAffiliationSummary, selectMajorOrganizationTotals, selectOrganizationPositionCounts, selectStatusGroups } from './content-selectors.js'; +import { calculateSummary } from './summary.js'; +import type { OrgChartDataset } from './types.js'; + +function fixture(): OrgChartDataset { + return { + schemaVersion: '0.1-draft', + organizations: [ + { id: 'root', parentId: null, name: '가상 본부', type: 'root', leaderId: 'leader', displayOrder: 0 }, + { id: 'team', parentId: 'root', name: '가상 팀', type: 'team', leaderId: null, displayOrder: 1 }, + { id: 'empty', parentId: 'root', name: '빈 가상 팀', type: 'team', leaderId: null, displayOrder: 2 }, + ], + employees: [ + { id: 'leader', organizationId: 'root', affiliationId: 'first', name: '가상 가', position: '대표', jobTitle: '본부장', profileImage: null, workStatus: 'active' }, + { id: 'sent', organizationId: 'team', affiliationId: 'second', name: '가상 나', position: '책임', jobTitle: null, profileImage: null, workStatus: 'dispatched' }, + { id: 'leave', organizationId: 'team', affiliationId: 'first', name: '가상 다', position: '책임', jobTitle: null, profileImage: null, workStatus: 'onLeave' }, + ], + affiliations: [{ id: 'first', name: '가상 관계사 가' }, { id: 'second', name: '가상 관계사 나' }, { id: 'zero', name: '가상 관계사 다' }], + metadata: { asOfDate: '2026-10-12', dataVersion: 'selector-test' }, + }; +} + +test('position matrix uses direct primary membership, includes leaders and all work statuses', () => { + const data = fixture(); + const matrix = selectOrganizationPositionCounts(data); + const summary = calculateSummary(data); + assert.deepEqual([...matrix.get('root')!], [['대표', 1]]); + assert.deepEqual([...matrix.get('team')!], [['책임', 2]]); + assert.equal(matrix.get('empty')!.size, 0); + assert.equal(matrix.get('root')!.get('책임'), undefined); + assert.equal(summary.raw.byOrganization.root!.inclusive, 3); + for (const organization of data.organizations) { + assert.equal([...matrix.get(organization.id)!.values()].reduce((sum, count) => sum + count, 0), summary.raw.byOrganization[organization.id]!.direct); + } + for (const [position, count] of Object.entries(summary.raw.byPosition)) { + assert.equal([...matrix.values()].reduce((sum, row) => sum + (row.get(position) ?? 0), 0), count); + } + assert.equal([...matrix.values()].flatMap(row => [...row.values()]).reduce((sum, count) => sum + count, 0), summary.raw.total); + assert.equal(summary.aggregation.status, 'unavailable'); +}); + +test('duplicate IDs cannot inflate matrix or status groups and original Employee references survive', () => { + const data = fixture(); + data.employees.push({ ...data.employees[1]!, organizationId: 'root', position: '대표' }); + const summary = calculateSummary(data); + const matrix = selectOrganizationPositionCounts(data); + assert.equal(matrix.get('team')!.get('책임'), 2); + assert.equal(matrix.get('root')!.get('대표'), 1); + const groups = selectStatusGroups(data, summary); + assert.equal(groups[0]!.employees.length, 1); + assert.strictEqual(groups[0]!.employees[0], data.employees[1]); + assert.strictEqual(groups[1]!.employees[0], data.employees[2]); + assert.equal(summary.raw.total, 3); +}); + +test('opaque prototype-like organization IDs and position strings remain ordinary matrix keys', () => { + const data = fixture(); + data.organizations[1]!.id = '__proto__'; + data.employees[1]!.organizationId = '__proto__'; + data.employees[2]!.organizationId = '__proto__'; + data.employees[1]!.position = 'constructor'; + data.employees[2]!.position = '__proto__'; + const row = selectOrganizationPositionCounts(data).get('__proto__')!; + assert.equal(row.get('constructor'), 1); + assert.equal(row.get('__proto__'), 1); +}); + +test('affiliation summary preserves declared order, zero entries and original affiliation objects', () => { + const data = fixture(); + const summary = calculateSummary(data); + const rows = selectAffiliationSummary(data, summary); + assert.deepEqual(rows.map(row => [row.affiliation.id, row.count]), [['first', 2], ['second', 1], ['zero', 0]]); + assert.strictEqual(rows[2]!.affiliation, data.affiliations[2]); + assert.equal(rows.reduce((sum, row) => sum + row.count, 0), summary.raw.total); +}); + +test('status flags independently hide groups without changing Raw Count or affiliation totals', () => { + const data = fixture(); + const summary = calculateSummary(data); + data.presentation = { + title: '가상 조직도', description: null, hubText: null, organizationOrder: [], + groups: { showEmployees: false, showSummary: false, showAffiliations: false, showDispatched: false, showOnLeave: true }, + }; + assert.deepEqual(selectStatusGroups(data, summary).map(group => group.status), ['onLeave']); + data.presentation.groups.showDispatched = true; + data.presentation.groups.showOnLeave = false; + assert.deepEqual(selectStatusGroups(data, summary).map(group => group.status), ['dispatched']); + data.presentation.groups.showDispatched = false; + assert.deepEqual(selectStatusGroups(data, summary), []); + assert.deepEqual(calculateSummary(data), summary); + assert.equal(selectAffiliationSummary(data, summary).length, 3); +}); + +test('zero employees retains all organization/affiliation rows and both empty status groups', () => { + const data = fixture(); + data.employees = []; + data.organizations[0]!.leaderId = null; + const summary = calculateSummary(data); + assert.equal(selectOrganizationPositionCounts(data).size, 3); + assert.ok([...selectOrganizationPositionCounts(data).values()].every(row => row.size === 0)); + assert.ok(selectAffiliationSummary(data, summary).every(row => row.count === 0)); + assert.deepEqual(selectStatusGroups(data, summary).map(group => [group.status, group.count, group.employees.length]), [['dispatched', 0, 0], ['onLeave', 0, 0]]); +}); + +test('new JSON snapshot updates matrix, affiliations and status groups without a cached count', () => { + const data = fixture(); + const before = calculateSummary(data); + data.employees[1]!.organizationId = 'root'; + data.employees[1]!.position = '수석'; + data.employees[1]!.affiliationId = 'zero'; + data.employees[1]!.workStatus = 'active'; + const after = calculateSummary(data); + const matrix = selectOrganizationPositionCounts(data); + assert.equal(matrix.get('root')!.get('수석'), 1); + assert.equal(matrix.get('team')!.get('책임'), 1); + assert.deepEqual(selectAffiliationSummary(data, after).map(row => row.count), [2, 0, 1]); + assert.equal(selectStatusGroups(data, after)[0]!.employees.length, 0); + assert.equal(before.raw.byStatus.dispatched, 1); + assert.equal(after.raw.total, before.raw.total); +}); + +test('major organization totals: root direct members then inclusive root children, summing to the raw total', () => { + const data = fixture(); + data.organizations.push({ id: 'cell', parentId: 'team', name: '가상 셀', type: 'cell', leaderId: null, displayOrder: 3 }); + data.employees.push({ id: 'member', organizationId: 'cell', affiliationId: 'zero', name: '가상 라', position: '선임', jobTitle: null, profileImage: null, workStatus: 'active' }); + const summary = calculateSummary(data); + const rows = selectMajorOrganizationTotals(data, summary); + assert.deepEqual(rows.map(row => [row.organization.id, row.scope, row.count]), [['root', 'direct', 1], ['team', 'inclusive', 3], ['empty', 'inclusive', 0]]); + assert.equal(rows.reduce((sum, row) => sum + row.count, 0), summary.raw.total); + assert.equal(rows.some(row => row.organization.id === 'cell'), false); +}); diff --git a/packages/org-chart/src/data/content-selectors.ts b/packages/org-chart/src/data/content-selectors.ts new file mode 100644 index 0000000..ab94fb8 --- /dev/null +++ b/packages/org-chart/src/data/content-selectors.ts @@ -0,0 +1,79 @@ +import { normalizeOrgChartDataset } from './normalize.js'; +import type { Employee, OrgChartDataset, OrgChartSummary, Organization, WorkStatus } from './types.js'; + +/** Internal content selectors: these do not expand the package's public data API. */ +function uniqueEmployees(data: OrgChartDataset): Employee[] { + const seen = new Set(); + return data.employees.filter(employee => { + if (seen.has(employee.id)) return false; + seen.add(employee.id); + return true; + }); +} + +/** Literal unique IDs in their primary organization, including leaders and all statuses. + * Inclusive organization counts stay in Summary; they must never be summed as a subtotal. + * Map keys safely retain opaque organization IDs and position names such as __proto__. + */ +export function selectOrganizationPositionCounts(data: OrgChartDataset): ReadonlyMap> { + const counts = new Map>(); + for (const organization of data.organizations) counts.set(organization.id, new Map()); + for (const employee of uniqueEmployees(data)) { + const row = counts.get(employee.organizationId); + if (row) row.set(employee.position, (row.get(employee.position) ?? 0) + 1); + } + return counts; +} + +export function selectAffiliationSummary(data: OrgChartDataset, summary: OrgChartSummary) { + // Include all declared affiliations, including zero, without recounting employees. + return data.affiliations.map(affiliation => ({ + affiliation, + count: summary.raw.byAffiliation[affiliation.id] ?? 0, + })); +} + +export interface MajorOrganizationTotal { + organization: Organization; + /** 'direct' for a root's own members (e.g. its leader); 'inclusive' for a major organization. */ + scope: 'direct' | 'inclusive'; + count: number; +} + +/** Compact totals for the read-only composition: each root's direct members, then + * each major (root child) organization including its cells/teams. Primary + * membership is single, so the rows are disjoint and add up to the raw total. */ +export function selectMajorOrganizationTotals(data: OrgChartDataset, summary: OrgChartSummary): MajorOrganizationTotal[] { + const rows: MajorOrganizationTotal[] = []; + for (const root of normalizeOrgChartDataset(data).roots) { + const counts = summary.raw.byOrganization[root.organization.id]; + if (!root.children.length) { + rows.push({ organization: root.organization, scope: 'inclusive', count: counts?.inclusive ?? 0 }); + continue; + } + if (counts?.direct) rows.push({ organization: root.organization, scope: 'direct', count: counts.direct }); + for (const child of root.children) { + rows.push({ organization: child.organization, scope: 'inclusive', count: summary.raw.byOrganization[child.organization.id]?.inclusive ?? 0 }); + } + } + return rows; +} + +export interface StatusContentGroup { + status: Extract; + employees: readonly Employee[]; + count: number; +} + +export function selectStatusGroups(data: OrgChartDataset, summary: OrgChartSummary): StatusContentGroup[] { + const employees = uniqueEmployees(data); + const groups: StatusContentGroup[] = []; + if (data.presentation?.groups.showDispatched !== false) { + groups.push({ status: 'dispatched', employees: employees.filter(employee => employee.workStatus === 'dispatched'), count: summary.raw.byStatus.dispatched }); + } + if (data.presentation?.groups.showOnLeave !== false) { + groups.push({ status: 'onLeave', employees: employees.filter(employee => employee.workStatus === 'onLeave'), count: summary.raw.byStatus.onLeave }); + } + // Cards retain original Employee references. A second display never changes Summary. + return groups; +} diff --git a/packages/org-chart/src/data/data.test.ts b/packages/org-chart/src/data/data.test.ts new file mode 100644 index 0000000..f1ca605 --- /dev/null +++ b/packages/org-chart/src/data/data.test.ts @@ -0,0 +1,241 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { + calculateSummary, JsonOrgChartDataSource, normalizeOrgChartDataset, OrgChartSourceError, + snapshotOrgChartDataset, validateOrgChartDataset, type ApprovedAggregationPolicy, type OrgChartDataset, +} from './index.js'; + +function fixture(): OrgChartDataset { + return { + schemaVersion: '0.1-draft', + organizations: [ + { id: 'root', parentId: null, name: '가상 본부', type: 'root', leaderId: 'a', displayOrder: 0 }, + { id: 'team-a', parentId: 'root', name: '가상 기획팀', type: 'team', leaderId: 'b', displayOrder: 2 }, + { id: 'team-b', parentId: 'root', name: '가상 운영팀', type: 'team', leaderId: null, displayOrder: 1 }, + ], + employees: [ + { id: 'a', organizationId: 'root', affiliationId: 'aff-a', name: '가상직원 가', position: '대표', jobTitle: '본부장', profileImage: null, workStatus: 'active' }, + { id: 'b', organizationId: 'team-a', affiliationId: 'aff-a', name: '가상직원 나', position: '책임', jobTitle: '팀장', profileImage: null, workStatus: 'active' }, + { id: 'c', organizationId: 'team-a', affiliationId: 'aff-b', name: '가상직원 다', position: '선임', jobTitle: null, profileImage: './profiles/virtual.png', workStatus: 'dispatched' }, + { id: 'd', organizationId: 'team-b', affiliationId: 'aff-b', name: '가상직원 라', position: '선임', jobTitle: null, profileImage: 'https://example.invalid/virtual.png', workStatus: 'onLeave' }, + ], + affiliations: [{ id: 'aff-a', name: '가상 관계사 A' }, { id: 'aff-b', name: '가상 관계사 B' }], + metadata: { asOfDate: '2026-10-12', dataVersion: 'test-1' }, + }; +} +function codes(input: unknown): string[] { + const result = validateOrgChartDataset(input); + assert.equal(result.valid, false); + return result.valid ? [] : result.issues.map(issue => issue.code); +} +const policy: ApprovedAggregationPolicy = { + policyVersion: 'approved-test-1', includedStatuses: ['active', 'dispatched'], activeStatuses: ['active'], + includeLeaders: true, membershipMode: 'primaryOnly', +}; + +test('minimal v0.1-draft dataset validates and owns an immutable copy', () => { + const original = fixture(); + const result = validateOrgChartDataset(original); + assert.equal(result.valid, true); + if (!result.valid) return; + original.organizations[0]!.name = 'Changed'; + assert.equal(result.data.organizations[0]!.name, '가상 본부'); + assert.ok(Object.isFrozen(result.data.employees[0])); +}); +test('version is required at top level; compatibility metadata mirror must agree', () => { + const original = fixture() as unknown as Record; + delete original.schemaVersion; + assert.ok(codes(original).includes('SCHEMA_VERSION')); + const incompatible = fixture(); + (incompatible.metadata as unknown as Record).schemaVersion = 'future'; + assert.ok(codes(incompatible).includes('SCHEMA_VERSION')); +}); +test('required fields, nullability, whitespace and unknown fields are rejected', () => { + const original = fixture(); + original.organizations[0]!.name = ' '; + original.employees[0]!.position = null as unknown as string; + (original.organizations[1] as unknown as Record).nodeTemplate = ''; + assert.ok(codes(original).includes('REQUIRED_VALUE')); + assert.ok(codes(original).includes('UNKNOWN_FIELD')); +}); +test('dates are real calendar dates and timestamps require valid clock/timezone', () => { + for (const date of ['2026-02-30', '2026-13-01', '2026-1-1']) { + const original = fixture(); original.metadata.asOfDate = date; + assert.ok(codes(original).includes('REQUIRED_VALUE')); + } + const original = fixture(); original.metadata.updatedAt = '2026-10-12T24:00:00Z'; + assert.ok(codes(original).includes('REQUIRED_VALUE')); + original.metadata.updatedAt = '2026-10-12T11:23:45+09:00'; + assert.equal(validateOrgChartDataset(original).valid, true); +}); +test('zero employees is valid; zero organizations is a data error', () => { + const original = fixture(); original.employees = []; + original.organizations.forEach(org => { org.leaderId = null; }); + assert.equal(validateOrgChartDataset(original).valid, true); + original.organizations = []; + assert.ok(codes(original).includes('EMPTY_ORGANIZATIONS')); +}); +test('duplicate collection IDs never overwrite an earlier item', () => { + const original = fixture(); original.employees.push({ ...original.employees[0]! }); + assert.ok(codes(original).includes('DUPLICATE_ID')); +}); +test('employee, parent, affiliation and leader references are checked', () => { + const original = fixture(); + original.employees[0]!.organizationId = 'missing'; + original.employees[1]!.affiliationId = 'missing'; + original.organizations[2]!.parentId = 'missing'; + original.organizations[2]!.leaderId = 'missing'; + const failures = codes(original); + for (const code of ['ORGANIZATION_REFERENCE', 'AFFILIATION_REFERENCE', 'PARENT_REFERENCE', 'LEADER_REFERENCE']) assert.ok(failures.includes(code)); +}); +test('leader cross-organization membership requires explicit business approval', () => { + const original = fixture(); original.organizations[2]!.leaderId = 'b'; + assert.ok(codes(original).includes('LEADER_APPROVAL_REQUIRED')); +}); +test('self-parent and multi-level cycles are rejected independently of sorting', () => { + const original = fixture(); original.organizations[0]!.parentId = 'team-a'; + assert.ok(codes(original).includes('HIERARCHY_CYCLE')); + original.organizations[0]!.parentId = 'root'; + assert.ok(codes(original).includes('HIERARCHY_CYCLE')); +}); +test('unknown vocabularies are rejected without implicit status mapping', () => { + const original = fixture(); original.employees[0]!.workStatus = 'retired' as never; + original.organizations[0]!.type = 'unknown' as never; + assert.ok(codes(original).includes('INVALID_STATUS')); + assert.ok(codes(original).includes('INVALID_TYPE')); +}); +test('relation endpoints, self-relations and duplicate directed relations are checked', () => { + const original = fixture(); + original.relations = [ + { id: 'r1', sourceOrganizationId: 'team-a', targetOrganizationId: 'team-b', type: 'support' }, + { id: 'r2', sourceOrganizationId: 'team-a', targetOrganizationId: 'team-b', type: 'support' }, + { id: 'r3', sourceOrganizationId: 'missing', targetOrganizationId: 'missing', type: 'support' }, + ]; + assert.ok(codes(original).includes('INVALID_RELATION')); + assert.ok(codes(original).includes('RELATION_REFERENCE')); +}); +test('markup, executable URLs and identifier control characters are rejected', () => { + for (const image of ['javascript:alert(1)', 'data:image/svg+xml,', '//host.invalid/x', 'file:///x', 'https://user:password@example.invalid/x', 'images\\x.png']) { + const original = fixture(); original.employees[0]!.profileImage = image; + assert.ok(codes(original).includes('UNSAFE_INPUT')); + } + const original = fixture(); original.employees[0]!.name = ''; + original.organizations[1]!.id += '\u202e'; + assert.ok(codes(original).includes('UNSAFE_INPUT')); +}); +test('normalization preserves hierarchy, forest roots and deterministic presentation order', () => { + const original = fixture(); + original.organizations.push({ id: 'other-root', parentId: null, name: '추가 본부', type: 'root', leaderId: null, displayOrder: 1 }); + const natural = normalizeOrgChartDataset(original); + assert.deepEqual(natural.roots.map(node => node.organization.id), ['root', 'other-root']); + assert.deepEqual(natural.roots[0]!.children.map(node => node.organization.id), ['team-b', 'team-a']); + original.presentation = { + title: '가상 조직도', description: null, hubText: null, + groups: { showEmployees: false, showSummary: true, showDispatched: false, showOnLeave: false, showAffiliations: false }, + organizationOrder: ['team-a'], + }; + assert.equal(validateOrgChartDataset(original).valid, true); + assert.deepEqual(normalizeOrgChartDataset(original).roots[0]!.children.map(node => node.organization.id), ['team-a', 'team-b']); + original.presentation.organizationOrder.push('missing'); + assert.ok(codes(original).includes('PRESENTATION_REFERENCE')); +}); +test('raw summary uses unique IDs, primary membership and position rather than job title', () => { + const original = fixture(); const summary = calculateSummary(original); + assert.equal(summary.raw.total, 4); + assert.deepEqual(summary.raw.byOrganization.root, { direct: 1, inclusive: 4 }); + assert.deepEqual(summary.raw.byOrganization['team-a'], { direct: 2, inclusive: 2 }); + assert.equal(summary.raw.byPosition['선임'], 2); + assert.equal(summary.raw.byPosition['팀장'], undefined); + assert.equal(summary.raw.byAffiliation['aff-b'], 2); + assert.deepEqual(summary.raw.byStatus, { active: 2, dispatched: 1, onLeave: 1 }); + assert.deepEqual(summary.aggregation, { status: 'unavailable', reason: 'policyRequired' }); +}); +test('approved filtering changes business counts; raw counts and hidden groups remain unchanged', () => { + const original = fixture(); const result = calculateSummary(original, policy); + assert.equal(result.raw.total, 4); + assert.equal(result.aggregation.status, 'ready'); + if (result.aggregation.status === 'ready') { + assert.equal(result.aggregation.counts.total, 3); + assert.equal(result.aggregation.counts.byOrganization.root!.inclusive, 3); + assert.equal(result.aggregation.counts.byStatus.onLeave, 0); + } + original.presentation = { + title: '가상 조직도', description: null, hubText: '설명 콘텐츠', + groups: { showEmployees: false, showSummary: false, showDispatched: false, showOnLeave: false, showAffiliations: false }, + organizationOrder: ['team-b'], + }; + original.relations = [{ id: 'rel-a', sourceOrganizationId: 'team-a', targetOrganizationId: 'team-b', type: 'cooperation' }]; + assert.deepEqual(calculateSummary(original, policy), result); + original.employees[2]!.organizationId = 'team-b'; + original.employees[2]!.workStatus = 'active'; + original.employees[2]!.affiliationId = 'aff-a'; + const moved = calculateSummary(original); + assert.equal(moved.raw.byOrganization['team-a']!.direct, 1); + assert.equal(moved.raw.byOrganization['team-b']!.direct, 2); + assert.equal(moved.raw.byStatus.active, 3); + assert.equal(moved.raw.byAffiliation['aff-a'], 3); +}); +test('ambiguous or invalid business policy stays unavailable', () => { + for (const invalid of [ + { ...policy, includeLeaders: false }, { ...policy, membershipMode: 'uniqueEmployee' }, + { ...policy, policyVersion: '' }, { ...policy, includedStatuses: ['active', 'active'] }, + { ...policy, includedStatuses: ['dispatched'] }, + ]) { + const result = calculateSummary(fixture(), invalid as ApprovedAggregationPolicy); + assert.deepEqual(result.aggregation, { status: 'unavailable', reason: 'unsupportedPolicy' }); + } +}); +test('prototype-like opaque IDs and positions cannot corrupt summary records', () => { + const original = fixture(); original.employees[0]!.position = '__proto__'; + assert.equal(calculateSummary(original).raw.byPosition['__proto__'], 1); +}); +test('source captures inline input once and returns owned copies', async () => { + const original = fixture(); const source = new JsonOrgChartDataSource(original); + original.metadata.dataVersion = 'consumer-mutated'; + const first = await source.load() as OrgChartDataset; + assert.equal(first.metadata.dataVersion, 'test-1'); + assert.notEqual(first, await source.load()); + assert.ok(Object.isFrozen(first)); + const snapshot = snapshotOrgChartDataset(original); + assert.notEqual(snapshot, original); +}); +test('URL source passes cancellation signal and captures the response', async () => { + const controller = new AbortController(); let receivedSignal: AbortSignal | null | undefined; + const source = new JsonOrgChartDataSource('./virtual.json', { fetch: (async (_url, options) => { + receivedSignal = options?.signal; + return new Response(JSON.stringify(fixture()), { status: 200 }); + }) as typeof fetch }); + assert.equal(validateOrgChartDataset(await source.load({ signal: controller.signal })).valid, true); + assert.equal(receivedSignal, controller.signal); +}); +test('default network source loads with a receiver-sensitive browser-native fetch', async () => { + const originalFetch = globalThis.fetch; + globalThis.fetch = async function(this: unknown) { + if (this !== globalThis) throw new TypeError('Illegal invocation'); + return new Response(JSON.stringify(fixture()), { status: 200 }); + } as typeof fetch; + try { + const source = new JsonOrgChartDataSource('./virtual.json'); + assert.equal(validateOrgChartDataset(await source.load()).valid, true); + } finally { + globalThis.fetch = originalFetch; + } +}); +test('source errors distinguish HTTP, parsing, unsafe URL and abort without leaking upstream text', async () => { + assert.throws(() => new JsonOrgChartDataSource('javascript:alert(1)'), (error: unknown) => error instanceof OrgChartSourceError && error.code === 'SOURCE_URL'); + const failed = new JsonOrgChartDataSource('/virtual.json', { fetch: (async () => { throw new Error('PRIVATE_SERVER_ERROR'); }) as typeof fetch }); + await assert.rejects(failed.load(), (error: unknown) => error instanceof OrgChartSourceError && error.code === 'SOURCE_LOAD' && !error.message.includes('PRIVATE')); + const http = new JsonOrgChartDataSource('/virtual.json', { fetch: (async () => new Response('private', { status: 500 })) as typeof fetch }); + await assert.rejects(http.load(), (error: unknown) => error instanceof OrgChartSourceError && error.code === 'SOURCE_LOAD'); + const parse = new JsonOrgChartDataSource('/virtual.json', { fetch: (async () => new Response('{invalid')) as typeof fetch }); + await assert.rejects(parse.load(), (error: unknown) => error instanceof OrgChartSourceError && error.code === 'SOURCE_PARSE'); + const controller = new AbortController(); controller.abort(); + await assert.rejects(failed.load({ signal: controller.signal }), (error: unknown) => error instanceof OrgChartSourceError && error.code === 'SOURCE_ABORT'); +}); +test('late ignored abort response cannot become a successful source result', async () => { + const controller = new AbortController(); + const source = new JsonOrgChartDataSource('/virtual.json', { fetch: (async () => { + controller.abort(); return new Response(JSON.stringify(fixture())); + }) as typeof fetch }); + await assert.rejects(source.load({ signal: controller.signal }), (error: unknown) => error instanceof OrgChartSourceError && error.code === 'SOURCE_ABORT'); +}); diff --git a/packages/org-chart/src/data/index.ts b/packages/org-chart/src/data/index.ts new file mode 100644 index 0000000..a698460 --- /dev/null +++ b/packages/org-chart/src/data/index.ts @@ -0,0 +1,6 @@ +export * from './types.js'; +export { validateOrgChartDataset, isSafeImageUrl } from './validate.js'; +export { normalizeOrgChartDataset } from './normalize.js'; +export { calculateSummary } from './summary.js'; +export { snapshotOrgChartDataset } from './snapshot.js'; +export { JsonOrgChartDataSource, OrgChartSourceError, type OrgChartSourceErrorCode, type JsonOrgChartDataSourceOptions } from './source.js'; diff --git a/packages/org-chart/src/data/normalize.ts b/packages/org-chart/src/data/normalize.ts new file mode 100644 index 0000000..fb07749 --- /dev/null +++ b/packages/org-chart/src/data/normalize.ts @@ -0,0 +1,27 @@ +import type { Employee, NormalizedOrgChartDataset, OrganizationTreeNode, OrgChartDataset } from './types.js'; + +/** Pure derivation for validated datasets. Multiple roots remain a forest. */ +export function normalizeOrgChartDataset(data: OrgChartDataset): NormalizedOrgChartDataset { + const organizationsById = new Map(data.organizations.map(org => [org.id, org])); + const employeesByOrganization = new Map(data.organizations.map(org => [org.id, []])); + for (const employee of data.employees) employeesByOrganization.get(employee.organizationId)?.push(employee); + const nodes = new Map(data.organizations.map(org => [org.id, { organization: org, children: [] }])); + const roots: OrganizationTreeNode[] = []; + for (const node of nodes.values()) { + if (node.organization.parentId === null) roots.push(node); + else nodes.get(node.organization.parentId)?.children.push(node); + } + const order = new Map((data.presentation?.organizationOrder ?? []).map((id, index) => [id, index])); + const compare = (a: OrganizationTreeNode, b: OrganizationTreeNode) => { + const aOrder = order.get(a.organization.id) ?? Infinity; + const bOrder = order.get(b.organization.id) ?? Infinity; + if (aOrder !== bOrder) return aOrder < bOrder ? -1 : 1; + const difference = a.organization.displayOrder - b.organization.displayOrder; + if (difference) return difference; + // Code-unit order is deterministic across environments and independent of locale. + return a.organization.id < b.organization.id ? -1 : a.organization.id > b.organization.id ? 1 : 0; + }; + roots.sort(compare); + for (const node of nodes.values()) node.children.sort(compare); + return { roots, organizationsById, employeesByOrganization }; +} diff --git a/packages/org-chart/src/data/snapshot.ts b/packages/org-chart/src/data/snapshot.ts new file mode 100644 index 0000000..e81b8fc --- /dev/null +++ b/packages/org-chart/src/data/snapshot.ts @@ -0,0 +1,14 @@ +/** Own a JSON-like input at the call boundary; never retain consumer objects. */ +export function snapshotOrgChartDataset(input: T): T { + const copy = structuredClone(input); + const pending: unknown[] = [copy]; + const seen = new WeakSet(); + while (pending.length) { + const current = pending.pop(); + if (current === null || typeof current !== 'object' || seen.has(current)) continue; + seen.add(current); + for (const child of Object.values(current)) pending.push(child); + Object.freeze(current); + } + return copy; +} diff --git a/packages/org-chart/src/data/source.ts b/packages/org-chart/src/data/source.ts new file mode 100644 index 0000000..0d9e8bf --- /dev/null +++ b/packages/org-chart/src/data/source.ts @@ -0,0 +1,61 @@ +import { snapshotOrgChartDataset } from './snapshot.js'; +import type { OrgChartDataSource } from './types.js'; + +export type OrgChartSourceErrorCode = 'SOURCE_LOAD' | 'SOURCE_PARSE' | 'SOURCE_ABORT' | 'SOURCE_URL' | 'SOURCE_SNAPSHOT'; +export class OrgChartSourceError extends Error { + readonly path = 'dataSource'; + constructor(readonly code: OrgChartSourceErrorCode, message: string) { + super(message); + this.name = 'OrgChartSourceError'; + } +} +export interface JsonOrgChartDataSourceOptions { fetch?: typeof globalThis.fetch } +/** Inline JSON is captured at construction; URL sources load a fresh snapshot on each call. */ +export class JsonOrgChartDataSource implements OrgChartDataSource { + private readonly inline: unknown; + private readonly url: string | undefined; + private readonly fetcher: typeof globalThis.fetch | undefined; + constructor(input: unknown, options: JsonOrgChartDataSourceOptions = {}) { + // Browser-native fetch may require the global Window receiver. Retaining it as + // an instance property must not accidentally call it with this source as `this`. + this.fetcher = options.fetch ?? globalThis.fetch?.bind(globalThis); + if (typeof input === 'string' || input instanceof URL) { + const url = String(input); + if (!safeSourceUrl(url)) throw new OrgChartSourceError('SOURCE_URL', 'Data source URL must use HTTP(S) or a relative JSON path.'); + this.url = url; + } else { + try { this.inline = snapshotOrgChartDataset(input); } + catch { throw new OrgChartSourceError('SOURCE_SNAPSHOT', 'Data source input must be cloneable JSON.'); } + } + } + async load(options: { signal?: AbortSignal } = {}): Promise { + const signal = options.signal; + const aborted = () => { if (signal?.aborted) throw new OrgChartSourceError('SOURCE_ABORT', 'Data source request was cancelled.'); }; + aborted(); + if (this.url === undefined) return snapshotOrgChartDataset(this.inline); + if (!this.fetcher) throw new OrgChartSourceError('SOURCE_LOAD', 'No fetch implementation is available.'); + let response: Response; + try { response = await this.fetcher(this.url, { signal }); } + catch { + aborted(); + throw new OrgChartSourceError('SOURCE_LOAD', 'Data source could not be loaded.'); + } + aborted(); + if (!response.ok) throw new OrgChartSourceError('SOURCE_LOAD', 'Data source returned an unsuccessful response.'); + let payload: unknown; + try { payload = await response.json(); } + catch { + aborted(); + throw new OrgChartSourceError('SOURCE_PARSE', 'Data source response is not valid JSON.'); + } + aborted(); + try { return snapshotOrgChartDataset(payload); } + catch { throw new OrgChartSourceError('SOURCE_SNAPSHOT', 'Data source response must be cloneable JSON.'); } + } +} +function safeSourceUrl(value: string): boolean { + if (!value.trim() || /[\s\\<>\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/.test(value) || value.startsWith('//')) return false; + if (!/^[a-z][a-z\d+.-]*:/i.test(value)) return !/%(?:0[0-9a-f]|1[0-9a-f]|7f|5c)/i.test(value); + try { const parsed = new URL(value); return ['http:', 'https:'].includes(parsed.protocol) && !parsed.username && !parsed.password; } + catch { return false; } +} diff --git a/packages/org-chart/src/data/summary.ts b/packages/org-chart/src/data/summary.ts new file mode 100644 index 0000000..5784d67 --- /dev/null +++ b/packages/org-chart/src/data/summary.ts @@ -0,0 +1,56 @@ +import { normalizeOrgChartDataset } from './normalize.js'; +import type { ApprovedAggregationPolicy, Employee, OrgChartDataset, OrgChartSummary, SummaryCounts, WorkStatus } from './types.js'; + +const statuses: WorkStatus[] = ['active', 'dispatched', 'onLeave']; +function supportedPolicy(policy: ApprovedAggregationPolicy): boolean { + const validStatuses = (values: unknown): values is WorkStatus[] => Array.isArray(values) + && values.every(value => statuses.includes(value)) && new Set(values).size === values.length; + return !!policy && typeof policy.policyVersion === 'string' && !!policy.policyVersion.trim() + && !/[\u0000-\u001f<>]/.test(policy.policyVersion) + && validStatuses(policy.includedStatuses) && validStatuses(policy.activeStatuses) + && policy.activeStatuses.every(status => policy.includedStatuses.includes(status)) + && policy.includeLeaders === true && policy.membershipMode === 'primaryOnly'; +} +function count(data: OrgChartDataset, employees: readonly Employee[]): SummaryCounts { + const counts: SummaryCounts = { + total: 0, + byOrganization: Object.create(null) as SummaryCounts['byOrganization'], + byPosition: Object.create(null) as SummaryCounts['byPosition'], + byAffiliation: Object.create(null) as SummaryCounts['byAffiliation'], + byStatus: { active: 0, dispatched: 0, onLeave: 0 }, + }; + for (const org of data.organizations) counts.byOrganization[org.id] = { direct: 0, inclusive: 0 }; + for (const affiliation of data.affiliations) counts.byAffiliation[affiliation.id] = 0; + const seen = new Set(); + for (const employee of employees) { + if (seen.has(employee.id)) continue; + seen.add(employee.id); + counts.total += 1; + counts.byOrganization[employee.organizationId]!.direct += 1; + counts.byPosition[employee.position] = (counts.byPosition[employee.position] ?? 0) + 1; + counts.byAffiliation[employee.affiliationId] = (counts.byAffiliation[employee.affiliationId] ?? 0) + 1; + counts.byStatus[employee.workStatus] += 1; + } + // Single primary membership makes child totals disjoint; compute a postorder iteratively. + const stack = [...normalizeOrgChartDataset(data).roots]; + const traversal = []; + while (stack.length) { + const node = stack.pop()!; + traversal.push(node); + stack.push(...node.children); + } + for (let index = traversal.length - 1; index >= 0; index--) { + const node = traversal[index]!; + counts.byOrganization[node.organization.id]!.inclusive = counts.byOrganization[node.organization.id]!.direct + + node.children.reduce((sum, child) => sum + counts.byOrganization[child.organization.id]!.inclusive, 0); + } + return counts; +} +/** Raw counts are literal unique employee IDs, independent of presentation or business totals. */ +export function calculateSummary(data: OrgChartDataset, policy?: ApprovedAggregationPolicy): OrgChartSummary { + const raw = count(data, data.employees); + if (!policy) return { raw, aggregation: { status: 'unavailable', reason: 'policyRequired' } }; + if (!supportedPolicy(policy)) return { raw, aggregation: { status: 'unavailable', reason: 'unsupportedPolicy' } }; + const selected = data.employees.filter(employee => policy.includedStatuses.includes(employee.workStatus)); + return { raw, aggregation: { status: 'ready', policyVersion: policy.policyVersion, counts: count(data, selected) } }; +} diff --git a/packages/org-chart/src/data/types.ts b/packages/org-chart/src/data/types.ts new file mode 100644 index 0000000..933b808 --- /dev/null +++ b/packages/org-chart/src/data/types.ts @@ -0,0 +1,96 @@ +export const SCHEMA_VERSION = '0.1-draft' as const; +export type ID = string; +export type OrganizationType = 'root' | 'division' | 'office' | 'div' | 'cell' | 'team'; +export type WorkStatus = 'active' | 'dispatched' | 'onLeave'; +export type RelationType = 'cooperation' | 'support'; + +export interface Organization { + id: ID; + parentId: ID | null; + name: string; + type: OrganizationType; + leaderId: ID | null; + displayOrder: number; +} +export interface Employee { + id: ID; + organizationId: ID; + affiliationId: ID; + name: string; + position: string; + jobTitle: string | null; + profileImage: string | null; + workStatus: WorkStatus; +} +export interface Affiliation { id: ID; name: string } +export interface OrganizationRelation { + id: ID; + sourceOrganizationId: ID; + targetOrganizationId: ID; + type: RelationType; +} +export interface PresentationConfig { + title: string; + description: string | null; + hubText: string | null; + groups: { + showEmployees: boolean; + showSummary: boolean; + showDispatched: boolean; + showOnLeave: boolean; + showAffiliations: boolean; + }; + organizationOrder: ID[]; +} +export interface Metadata { + /** Compatibility mirror; the top-level schemaVersion is authoritative. */ + schemaVersion?: typeof SCHEMA_VERSION; + asOfDate: string; + dataVersion: string; + updatedAt?: string | null; + updateNote?: string | null; +} +export interface OrgChartDataset { + schemaVersion: typeof SCHEMA_VERSION; + organizations: Organization[]; + employees: Employee[]; + affiliations: Affiliation[]; + relations?: OrganizationRelation[]; + presentation?: PresentationConfig; + metadata: Metadata; +} +export interface OrgChartDataSource { + load(options?: { signal?: AbortSignal }): Promise; +} +export interface ValidationIssue { code: string; path: string; message: string } +export type ValidationResult = + | { valid: true; data: OrgChartDataset } + | { valid: false; issues: ValidationIssue[] }; +export interface OrganizationTreeNode { + organization: Organization; + children: OrganizationTreeNode[]; +} +export interface NormalizedOrgChartDataset { + roots: OrganizationTreeNode[]; + organizationsById: ReadonlyMap; + employeesByOrganization: ReadonlyMap; +} +export interface SummaryCounts { + total: number; + byOrganization: Record; + byPosition: Record; + byAffiliation: Record; + byStatus: Record; +} +export interface ApprovedAggregationPolicy { + policyVersion: string; + includedStatuses: WorkStatus[]; + activeStatuses: WorkStatus[]; + includeLeaders: boolean; + membershipMode: 'primaryOnly' | 'uniqueEmployee'; +} +export type AggregationPolicy = ApprovedAggregationPolicy; +export type AggregationResult = + | { status: 'unavailable'; reason: 'policyRequired' | 'unsupportedPolicy' } + | { status: 'ready'; policyVersion: string; counts: SummaryCounts }; +export interface OrgChartSummary { raw: SummaryCounts; aggregation: AggregationResult } diff --git a/packages/org-chart/src/data/validate.ts b/packages/org-chart/src/data/validate.ts new file mode 100644 index 0000000..fdc4509 --- /dev/null +++ b/packages/org-chart/src/data/validate.ts @@ -0,0 +1,145 @@ +import { SCHEMA_VERSION, type OrgChartDataset, type ValidationIssue, type ValidationResult } from './types.js'; +import { snapshotOrgChartDataset } from './snapshot.js'; + +const organizationTypes = ['root', 'division', 'office', 'div', 'cell', 'team']; +const statuses = ['active', 'dispatched', 'onLeave']; +const relationTypes = ['cooperation', 'support']; +const unsafeText = /[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]|<\/?[a-z][^>]*>|(?:javascript|vbscript)\s*:/i; +type RecordValue = Record; +function record(input: unknown): input is RecordValue { + return !!input && typeof input === 'object' && !Array.isArray(input) + && (Object.getPrototypeOf(input) === Object.prototype || Object.getPrototypeOf(input) === null); +} +export function isSafeImageUrl(input: string): boolean { + if (!input.trim() || unsafeText.test(input) || /\s|\\/.test(input)) return false; + if (/^[a-z][a-z\d+.-]*:/i.test(input)) { + try { const url = new URL(input); return ['https:', 'http:'].includes(url.protocol) && !url.username && !url.password; } + catch { return false; } + } + // Protocol-relative URLs inherit network origins; require an explicit HTTP(S) URL instead. + return !input.startsWith('//') && !/%(?:0[0-9a-f]|1[0-9a-f]|7f|5c)/i.test(input); +} +function validDate(value: string): boolean { + if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return false; + const parsed = new Date(value); + return Number.isFinite(parsed.getTime()) && parsed.toISOString().slice(0, 10) === value; +} +function validTimestamp(value: string): boolean { + const match = /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|([+-])(\d{2}):(\d{2}))$/.exec(value); + return !!match && validDate(match[1]!) && Number(match[2]) < 24 && Number(match[3]) < 60 + && Number(match[4]) < 60 && (!match[6] || Number(match[6]) < 24) && (!match[7] || Number(match[7]) < 60) + && Number.isFinite(Date.parse(value)); +} + +/** Strict contract validation. Messages contain no input values or server details. */ +export function validateOrgChartDataset(input: unknown): ValidationResult { + const issues: ValidationIssue[] = []; + const issue = (code: string, path: string, message: string) => issues.push({ code, path, message }); + const object = (value: unknown, path: string, keys: string[]): value is RecordValue => { + if (!record(value)) { issue('REQUIRED_VALUE', path, 'Expected a plain JSON object.'); return false; } + for (const key of Object.keys(value)) if (!keys.includes(key)) issue('UNKNOWN_FIELD', `${path}.${key}`, 'Field is not part of this contract.'); + return true; + }; + const text = (value: unknown, path: string, nullable = false): boolean => { + if (nullable && value === null) return true; + if (typeof value !== 'string' || !value.trim()) { issue('REQUIRED_VALUE', path, 'Expected a non-empty text value.'); return false; } + if (unsafeText.test(value)) { issue('UNSAFE_INPUT', path, 'Text contains unsupported executable markup or control characters.'); return false; } + return true; + }; + const choice = (value: unknown, path: string, allowed: string[], code: string) => { + if (typeof value !== 'string' || !allowed.includes(value)) issue(code, path, 'Value is outside the supported contract vocabulary.'); + }; + const collection = (value: unknown, path: string, keys: string[], inspect: (item: RecordValue, path: string) => void, optional = false) => { + if (optional && value === undefined) return; + if (!Array.isArray(value)) { issue('REQUIRED_VALUE', path, 'Expected an array.'); return; } + const ids = new Set(); + value.forEach((item, index) => { + const location = `${path}[${index}]`; + if (!object(item, location, keys)) return; + if (text(item.id, `${location}.id`)) { + if (ids.has(item.id as string)) issue('DUPLICATE_ID', `${location}.id`, 'ID must be unique within its collection.'); + ids.add(item.id as string); + } + inspect(item, location); + }); + }; + if (!object(input, '$', ['schemaVersion', 'organizations', 'employees', 'affiliations', 'relations', 'presentation', 'metadata'])) return { valid: false, issues }; + if (input.schemaVersion !== SCHEMA_VERSION) issue('SCHEMA_VERSION', '$.schemaVersion', 'Unsupported or missing schema version.'); + collection(input.organizations, '$.organizations', ['id', 'parentId', 'name', 'type', 'leaderId', 'displayOrder'], (org, path) => { + text(org.parentId, `${path}.parentId`, true); text(org.name, `${path}.name`); text(org.leaderId, `${path}.leaderId`, true); + choice(org.type, `${path}.type`, organizationTypes, 'INVALID_TYPE'); + if (!Number.isSafeInteger(org.displayOrder) || (org.displayOrder as number) < 0) issue('REQUIRED_VALUE', `${path}.displayOrder`, 'Expected a non-negative safe integer.'); + }); + if (Array.isArray(input.organizations) && input.organizations.length === 0) issue('EMPTY_ORGANIZATIONS', '$.organizations', 'At least one organization is required.'); + collection(input.employees, '$.employees', ['id', 'organizationId', 'affiliationId', 'name', 'position', 'jobTitle', 'profileImage', 'workStatus'], (employee, path) => { + for (const key of ['organizationId', 'affiliationId', 'name', 'position']) text(employee[key], `${path}.${key}`); + text(employee.jobTitle, `${path}.jobTitle`, true); + if (text(employee.profileImage, `${path}.profileImage`, true) && typeof employee.profileImage === 'string' && !isSafeImageUrl(employee.profileImage)) issue('UNSAFE_INPUT', `${path}.profileImage`, 'Image URL must use HTTP(S) or a safe relative path.'); + choice(employee.workStatus, `${path}.workStatus`, statuses, 'INVALID_STATUS'); + }); + collection(input.affiliations, '$.affiliations', ['id', 'name'], (affiliation, path) => { text(affiliation.name, `${path}.name`); }); + collection(input.relations, '$.relations', ['id', 'sourceOrganizationId', 'targetOrganizationId', 'type'], (relation, path) => { + text(relation.sourceOrganizationId, `${path}.sourceOrganizationId`); text(relation.targetOrganizationId, `${path}.targetOrganizationId`); + choice(relation.type, `${path}.type`, relationTypes, 'INVALID_RELATION'); + }, true); + if (object(input.metadata, '$.metadata', ['schemaVersion', 'asOfDate', 'dataVersion', 'updatedAt', 'updateNote'])) { + const meta = input.metadata; + if (meta.schemaVersion !== undefined && meta.schemaVersion !== SCHEMA_VERSION) issue('SCHEMA_VERSION', '$.metadata.schemaVersion', 'Compatibility schema version must match the top-level version.'); + if (text(meta.asOfDate, '$.metadata.asOfDate') && !validDate(meta.asOfDate as string)) issue('REQUIRED_VALUE', '$.metadata.asOfDate', 'Expected a real calendar date in YYYY-MM-DD format.'); + text(meta.dataVersion, '$.metadata.dataVersion'); + if (meta.updatedAt !== undefined && text(meta.updatedAt, '$.metadata.updatedAt', true) && typeof meta.updatedAt === 'string' && !validTimestamp(meta.updatedAt)) issue('REQUIRED_VALUE', '$.metadata.updatedAt', 'Expected an RFC 3339 timestamp with timezone.'); + if (meta.updateNote !== undefined) text(meta.updateNote, '$.metadata.updateNote', true); + } + if (input.presentation !== undefined && object(input.presentation, '$.presentation', ['title', 'description', 'hubText', 'groups', 'organizationOrder'])) { + const presentation = input.presentation; + text(presentation.title, '$.presentation.title'); text(presentation.description, '$.presentation.description', true); text(presentation.hubText, '$.presentation.hubText', true); + const flags = ['showEmployees', 'showSummary', 'showDispatched', 'showOnLeave', 'showAffiliations']; + if (object(presentation.groups, '$.presentation.groups', flags)) for (const flag of flags) if (typeof presentation.groups[flag] !== 'boolean') issue('REQUIRED_VALUE', `$.presentation.groups.${flag}`, 'Expected a boolean.'); + if (!Array.isArray(presentation.organizationOrder)) issue('REQUIRED_VALUE', '$.presentation.organizationOrder', 'Expected an array of organization IDs.'); + else presentation.organizationOrder.forEach((id, index) => text(id, `$.presentation.organizationOrder[${index}]`)); + } + if (issues.length) return { valid: false, issues }; + const data = input as unknown as OrgChartDataset; + const organizations = new Map(data.organizations.map(org => [org.id, org])); + const employees = new Map(data.employees.map(employee => [employee.id, employee])); + const affiliations = new Set(data.affiliations.map(affiliation => affiliation.id)); + data.organizations.forEach((org, index) => { + if (org.parentId !== null && !organizations.has(org.parentId)) issue('PARENT_REFERENCE', `$.organizations[${index}].parentId`, 'Parent organization does not exist.'); + if (org.leaderId !== null) { + const leader = employees.get(org.leaderId); + if (!leader) issue('LEADER_REFERENCE', `$.organizations[${index}].leaderId`, 'Leader employee does not exist.'); + else if (leader.organizationId !== org.id) issue('LEADER_APPROVAL_REQUIRED', `$.organizations[${index}].leaderId`, 'Leader membership outside this organization requires an approved business policy.'); + } + }); + data.employees.forEach((employee, index) => { + if (!organizations.has(employee.organizationId)) issue('ORGANIZATION_REFERENCE', `$.employees[${index}].organizationId`, 'Employee organization does not exist.'); + if (!affiliations.has(employee.affiliationId)) issue('AFFILIATION_REFERENCE', `$.employees[${index}].affiliationId`, 'Employee affiliation does not exist.'); + }); + const checked = new Set(); + for (const org of data.organizations) { + if (checked.has(org.id)) continue; + const chain = new Set(); + let current: typeof org | undefined = org; + while (current && !checked.has(current.id)) { + if (chain.has(current.id)) { issue('HIERARCHY_CYCLE', '$.organizations', 'Organization parent references contain a cycle.'); break; } + chain.add(current.id); + current = current.parentId === null ? undefined : organizations.get(current.parentId); + } + for (const id of chain) checked.add(id); + } + const relationKeys = new Set(); + data.relations?.forEach((relation, index) => { + if (!organizations.has(relation.sourceOrganizationId) || !organizations.has(relation.targetOrganizationId)) issue('RELATION_REFERENCE', `$.relations[${index}]`, 'Relation endpoint organization does not exist.'); + const key = JSON.stringify([relation.sourceOrganizationId, relation.targetOrganizationId, relation.type]); + if (relation.sourceOrganizationId === relation.targetOrganizationId || relationKeys.has(key)) issue('INVALID_RELATION', `$.relations[${index}]`, 'Self-relations and duplicate directed relations are unsupported.'); + relationKeys.add(key); + }); + const orderIds = new Set(); + data.presentation?.organizationOrder.forEach((id, index) => { + if (!organizations.has(id) || orderIds.has(id)) issue('PRESENTATION_REFERENCE', `$.presentation.organizationOrder[${index}]`, 'Presentation order requires existing, unique organization IDs.'); + orderIds.add(id); + }); + if (issues.length) return { valid: false, issues }; + try { return { valid: true, data: snapshotOrgChartDataset(data) }; } + catch { return { valid: false, issues: [{ code: 'UNSAFE_INPUT', path: '$', message: 'Input must be a cloneable JSON dataset.' }] }; } +} diff --git a/packages/org-chart/src/index.ts b/packages/org-chart/src/index.ts new file mode 100644 index 0000000..b56c539 --- /dev/null +++ b/packages/org-chart/src/index.ts @@ -0,0 +1,5 @@ +export * from './data/index.js'; +export { createOrgChart } from './core/index.js'; +export type { OrgChartDisplayMode, OrgChartEmployeeClickContext, OrgChartHandle, OrgChartOptions, OrgChartOrganizationLinks, OrgChartState } from './core/types.js'; +export { createOrgChartTree, createPositionSummary, createAffiliationSummary, createStatusSummary } from './components.js'; +export type { OrgChartSummaryComponentOptions } from './components.js'; diff --git a/packages/org-chart/src/styles/design-tokens.css b/packages/org-chart/src/styles/design-tokens.css new file mode 100644 index 0000000..ad25f52 --- /dev/null +++ b/packages/org-chart/src/styles/design-tokens.css @@ -0,0 +1,68 @@ +/* Standalone OrgChart design defaults. No HM Theme dependency. + Only the six organization header gradients were measured in Workdesk. + Neutral surfaces, card styling, typography and geometry are independent + design adaptations, not verified official Workdesk values. + Public --hm-orgchart-* inputs are intentionally NOT declared here: host + overrides must inherit through the Shadow DOM. Resolve defaults locally. */ +.hm-orgchart-shell { + --hm-orgchart-resolved-bg-surface: var(--hm-orgchart-bg-surface, #ffffff); + --hm-orgchart-resolved-bg-content: var(--hm-orgchart-bg-content, #f4f7fb); + --hm-orgchart-resolved-bg-subtle: var(--hm-orgchart-bg-subtle, #e9edf3); + --hm-orgchart-resolved-bg-brand: var(--hm-orgchart-bg-brand, linear-gradient(180deg, #45639f 0%, #809dd7 100%)); + --hm-orgchart-resolved-fg-primary: var(--hm-orgchart-fg-primary, #10243b); + --hm-orgchart-resolved-fg-secondary: var(--hm-orgchart-fg-secondary, #596575); + --hm-orgchart-resolved-stroke-default: var(--hm-orgchart-stroke-default, #bac7d7); + --hm-orgchart-resolved-stroke-input-default: var(--hm-orgchart-stroke-input-default, #d3dce8); + --hm-orgchart-resolved-stroke-input-focus: var(--hm-orgchart-stroke-input-focus, #45639f); + --hm-orgchart-resolved-accent: var(--hm-orgchart-accent-color, #eef2fa); + --hm-orgchart-resolved-on-accent: var(--hm-orgchart-on-accent, #224387); + --hm-orgchart-resolved-action-primary: var(--hm-orgchart-action-primary, #45639f); + --hm-orgchart-resolved-on-action-primary: var(--hm-orgchart-on-action-primary, #ffffff); + --hm-orgchart-resolved-font-family: var(--hm-orgchart-font-family, 'Noto Sans KR', 'Malgun Gothic', Arial, sans-serif); + --hm-orgchart-resolved-font-weight-bold: var(--hm-orgchart-font-weight-bold, 700); + --hm-orgchart-resolved-font-weight-medium: var(--hm-orgchart-font-weight-medium, 500); + --hm-orgchart-resolved-radius-container: var(--hm-orgchart-radius-container, 4px); + --hm-orgchart-resolved-radius-control-md: var(--hm-orgchart-radius-control-md, 4px); + --hm-orgchart-resolved-radius-pill: var(--hm-orgchart-radius-pill, 999px); + + --hm-orgchart-resolved-spacing-xs: var(--hm-orgchart-spacing-xs, 4px); + --hm-orgchart-resolved-spacing-sm: var(--hm-orgchart-spacing-sm, 8px); + --hm-orgchart-resolved-spacing-md: var(--hm-orgchart-spacing-md, 12px); + --hm-orgchart-resolved-spacing-lg: var(--hm-orgchart-spacing-lg, 16px); + --hm-orgchart-resolved-spacing-xl: var(--hm-orgchart-spacing-xl, 20px); + --hm-orgchart-resolved-spacing-xxl: var(--hm-orgchart-spacing-xxl, 24px); + --hm-orgchart-resolved-border-width: var(--hm-orgchart-border-width, 1px); + --hm-orgchart-resolved-border-top-width: var(--hm-orgchart-border-top-width, 3px); + --hm-orgchart-resolved-font-size-title: var(--hm-orgchart-font-size-title, 24px); + --hm-orgchart-resolved-font-size-base: var(--hm-orgchart-font-size-base, 13px); + --hm-orgchart-resolved-font-size-person: var(--hm-orgchart-font-size-person, 13px); + --hm-orgchart-resolved-font-size-meta: var(--hm-orgchart-font-size-meta, 10px); + --hm-orgchart-resolved-card-width-employee: var(--hm-orgchart-card-width-employee, 114px); + --hm-orgchart-resolved-card-width-leader: var(--hm-orgchart-card-width-leader, 154px); + --hm-orgchart-resolved-card-width-top-leader: var(--hm-orgchart-card-width-top-leader, 155px); + --hm-orgchart-resolved-card-height-employee: var(--hm-orgchart-card-height-employee, 54px); + --hm-orgchart-resolved-card-height-leader: var(--hm-orgchart-card-height-leader, 72px); + --hm-orgchart-resolved-card-height-top-leader: var(--hm-orgchart-card-height-top-leader, 78px); + + --hm-orgchart-resolved-table-background: var(--hm-orgchart-table-background, var(--hm-orgchart-resolved-bg-surface)); + --hm-orgchart-resolved-table-text: var(--hm-orgchart-table-text, var(--hm-orgchart-resolved-fg-primary)); + --hm-orgchart-resolved-table-font-size: var(--hm-orgchart-table-font-size, 12px); + --hm-orgchart-resolved-table-line-height: var(--hm-orgchart-table-line-height, 18px); + --hm-orgchart-resolved-table-cell-padding-x: var(--hm-orgchart-table-cell-padding-x, 8px); + --hm-orgchart-resolved-table-cell-padding-y: var(--hm-orgchart-table-cell-padding-y, 6px); + --hm-orgchart-resolved-table-divider-color: var(--hm-orgchart-table-divider-color, var(--hm-orgchart-resolved-stroke-input-default)); + --hm-orgchart-resolved-table-divider-width: var(--hm-orgchart-table-divider-width, var(--hm-orgchart-resolved-border-width)); + --hm-orgchart-resolved-table-header-background: var(--hm-orgchart-table-header-background, #edf2f8); + --hm-orgchart-resolved-table-header-text: var(--hm-orgchart-table-header-text, #224387); + --hm-orgchart-resolved-table-header-font-size: var(--hm-orgchart-table-header-font-size, 12px); + --hm-orgchart-resolved-table-header-font-weight: var(--hm-orgchart-table-header-font-weight, var(--hm-orgchart-resolved-font-weight-bold)); + --hm-orgchart-resolved-table-header-border-top: var(--hm-orgchart-table-header-border-top, var(--hm-orgchart-resolved-stroke-input-focus)); + --hm-orgchart-resolved-table-header-border-bottom: var(--hm-orgchart-table-header-border-bottom, var(--hm-orgchart-resolved-stroke-input-default)); + --hm-orgchart-resolved-table-row-hover-background: var(--hm-orgchart-table-row-hover-background, var(--hm-orgchart-resolved-bg-content)); + --hm-orgchart-resolved-table-footer-background: var(--hm-orgchart-table-footer-background, var(--hm-orgchart-resolved-bg-subtle)); + --hm-orgchart-resolved-table-footer-font-weight: var(--hm-orgchart-table-footer-font-weight, var(--hm-orgchart-resolved-font-weight-medium)); + --hm-orgchart-resolved-table-caption-color: var(--hm-orgchart-table-caption-color, var(--hm-orgchart-resolved-fg-secondary)); + --hm-orgchart-resolved-table-caption-font-size: var(--hm-orgchart-table-caption-font-size, 11px); + --hm-orgchart-resolved-table-caption-line-height: var(--hm-orgchart-table-caption-line-height, 16px); + --hm-orgchart-resolved-table-caption-gap: var(--hm-orgchart-table-caption-gap, 8px); +} diff --git a/packages/org-chart/src/styles/employee-card.css b/packages/org-chart/src/styles/employee-card.css new file mode 100644 index 0000000..b14eca7 --- /dev/null +++ b/packages/org-chart/src/styles/employee-card.css @@ -0,0 +1,335 @@ +/* OrgChart content cards, not overrides of HM React components. + Colors, typography and geometry use standalone OrgChart variables. + Observed card geometry is a minimum; text may increase the card height. */ +.hm-orgchart-employee[data-card-kind] { + position: relative; + display: flex; + align-items: center; + gap: 6px; + width: var(--hm-orgchart-resolved-card-width-employee); + min-width: var(--hm-orgchart-resolved-card-width-employee); + min-height: var(--hm-orgchart-resolved-card-height-employee); + margin: 0; + padding: 6px; + border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-current-border, var(--hm-orgchart-resolved-stroke-default)); + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-current-card-background, var(--hm-orgchart-resolved-bg-surface)); + color: var(--hm-orgchart-current-card-color, var(--hm-orgchart-resolved-fg-primary)); + font-family: var(--hm-orgchart-resolved-font-family); + text-align: left; +} +.hm-orgchart-employee[data-card-kind]::before { + content: ""; + position: absolute; + z-index: 0; + top: 0; + right: 0; + width: 42px; + height: 10px; + border-radius: 0 var(--hm-orgchart-resolved-radius-container) 0 100%; + background: var(--hm-orgchart-resolved-bg-content); + pointer-events: none; +} +.hm-orgchart-employee[data-card-kind="leader"], +.hm-orgchart-employee[data-card-kind="topLeader"] { + width: var(--hm-orgchart-resolved-card-width-leader); + min-width: var(--hm-orgchart-resolved-card-width-leader); + min-height: var(--hm-orgchart-resolved-card-height-leader); + gap: 8px; + padding: 8px; + border-top: var(--hm-orgchart-resolved-border-top-width) solid var(--hm-orgchart-current-border, var(--hm-orgchart-resolved-action-primary)); + background: var(--hm-orgchart-current-card-background, var(--hm-orgchart-resolved-bg-content)); +} +.hm-orgchart-employee[data-card-kind="topLeader"] { + width: var(--hm-orgchart-resolved-card-width-top-leader); + min-width: var(--hm-orgchart-resolved-card-width-top-leader); + min-height: var(--hm-orgchart-resolved-card-height-top-leader); + border-color: var(--hm-orgchart-accent, var(--hm-orgchart-resolved-action-primary)); + background: var(--hm-orgchart-current-card-background, var(--hm-orgchart-resolved-bg-surface)); +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-avatar { + position: relative; + z-index: 1; + display: flex; + flex: 0 0 28px; + width: 28px; + height: 28px; + align-items: center; + justify-content: center; + overflow: hidden; + border-radius: 3.5px; + background: var(--hm-orgchart-resolved-bg-subtle); + color: var(--hm-orgchart-resolved-fg-secondary); + font-size: 13px; + font-weight: var(--hm-orgchart-resolved-font-weight-medium); +} +.hm-orgchart-employee[data-card-kind="leader"] .hm-orgchart-avatar { flex-basis: 36px; width: 36px; height: 36px; } +.hm-orgchart-employee[data-card-kind="topLeader"] .hm-orgchart-avatar { flex-basis: 40px; width: 40px; height: 40px; } +.hm-orgchart-employee[data-card-kind] .hm-orgchart-avatar img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-avatar img[data-photo-placeholder="true"] { + object-fit: contain; + background: #f1f5f8; +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-employee-details { position: relative; z-index: 1; flex: 1 1 0; min-width: 0; } +.hm-orgchart-employee[data-card-kind] .hm-orgchart-person-name { + display: block; + font-size: 13px; + line-height: 18px; + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + overflow-wrap: anywhere; + word-break: normal; +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-person-role { + display: block; + font-size: 10px; + line-height: 13px; + color: var(--hm-orgchart-resolved-fg-secondary); + overflow-wrap: anywhere; +} +.hm-orgchart-employee[data-card-kind][data-has-affiliation="true"] .hm-orgchart-person-role { padding-right: 18px; } +.hm-orgchart-employee[data-card-kind] .hm-orgchart-person-attributes { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 2px 4px; +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-job-title { + padding: 0 3px; + border-radius: var(--hm-orgchart-resolved-radius-control-md); + background: var(--hm-orgchart-resolved-accent); + color: var(--hm-orgchart-resolved-on-accent); + font-size: 10px; + line-height: 14px; + font-weight: var(--hm-orgchart-resolved-font-weight-medium); + overflow-wrap: anywhere; + max-width: 100%; +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-status-label { + font-size: 10px; + line-height: 14px; + color: var(--hm-orgchart-resolved-fg-secondary); + overflow-wrap: anywhere; +} +.hm-orgchart-employee[data-card-kind][data-work-status="dispatched"], +.hm-orgchart-employee[data-card-kind][data-work-status="onLeave"] { border-style: dashed; } +.hm-orgchart-employee[data-card-kind] .hm-orgchart-affiliation-mark { + position: absolute; + z-index: 1; + top: 4px; + right: 4px; + width: 16px; + min-height: 16px; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid var(--hm-orgchart-resolved-stroke-input-default); + border-radius: var(--hm-orgchart-resolved-radius-control-md); + background: var(--hm-orgchart-resolved-bg-content); + color: var(--hm-orgchart-resolved-fg-secondary); + font-size: 8px; + line-height: 12px; + overflow-wrap: anywhere; +} +.hm-orgchart-affiliation-mark img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: contain; + background: transparent; +} +/* Card image boxes are 1.5 times the P3.1 display: 14 -> 21px. + Keep the 1px transparent inset; summary logos stay unchanged. */ +.hm-orgchart-employee[data-card-kind] .hm-orgchart-affiliation-mark { + top: 0; + right: 0; + width: 23px; + height: 23px; + min-height: 23px; + background: transparent; + border: none; + box-shadow: none; + padding: 1px; +} +.hm-orgchart-employee[data-card-kind] .hm-orgchart-affiliation-mark img { + inset: 1px; + width: calc(100% - 2px); + height: calc(100% - 2px); +} +.hm-orgchart-affiliation-mark[data-logo-available="true"] .hm-orgchart-affiliation-fallback { visibility: hidden; } + +/* Approved SVG cards and compact read-only status cards share content layout. + Status cards retain their separate gray surface and do not receive an SVG. */ +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) { + box-sizing: border-box; + width: 108px; + min-width: 108px; + height: 52px; + min-height: 52px; + padding: 4px; + gap: 4px; + border: 0; + border-radius: 0; + background: transparent; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"], +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] { + width: 146px; + min-width: 146px; + height: 68px; + min-height: 68px; + padding: 6px; + gap: 6px; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] { height: 74px; min-height: 74px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"] { column-gap: 10px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])::before { content: none; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-card-background { + position: absolute; + z-index: 0; + inset: 0; + width: 100%; + height: 100%; + object-fit: contain; + pointer-events: none; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-avatar { flex-basis: 24px; width: 24px; height: 24px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"] .hm-orgchart-avatar { flex-basis: 32px; width: 32px; height: 32px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] .hm-orgchart-avatar { flex-basis: 36px; width: 36px; height: 36px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) { + --hm-orgchart-person-position-color: #797979; + --hm-orgchart-person-position-size: 15px; + --hm-orgchart-person-position-line-height: 18px; + --hm-orgchart-person-position-letter-spacing: -0.6px; + --hm-orgchart-person-name-size: 18px; + --hm-orgchart-person-name-line-height: 24px; + --hm-orgchart-person-name-letter-spacing: -0.8px; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"], +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] { + --hm-orgchart-person-position-size: 20px; + --hm-orgchart-person-position-line-height: 22px; + --hm-orgchart-person-position-letter-spacing: -0.8px; + --hm-orgchart-person-name-size: 24px; + --hm-orgchart-person-name-line-height: 30px; + --hm-orgchart-person-name-letter-spacing: -0.96px; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] { + --hm-orgchart-person-position-color: #224387; + --hm-orgchart-person-name-letter-spacing: -0.8px; +} +.hm-orgchart-employee[data-card-asset][data-card-asset-size="leader"] { --hm-orgchart-person-position-size: 18px; } +/* Retain the status border while matching the approved small photo/text origins. */ +.hm-orgchart-employee[data-card-layout="compact"] { padding: 3px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-text { display: flex; flex-direction: column; gap: 0; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-position-row { display: flex; align-items: center; gap: 4px; margin: 0; padding: 0; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-position-row .hm-orgchart-person-role { flex: 0 0 auto; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-position-row .hm-orgchart-job-title { flex: 0 0 auto; margin: 0; } +/* The source's compact tag shares the position row. Align its lower edge with + that row so long raw tags clear the unchanged upper-right affiliation logo + within the approved 146px cards; row/name gap and typography stay intact. */ +.hm-orgchart-employee[data-workdesk-presentation="true"][data-card-asset="integrated-system"][data-card-asset-size="leader"] .hm-orgchart-position-row .hm-orgchart-job-title { align-self: flex-end; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-role, +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-name { margin: 0; padding: 0; white-space: nowrap; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-has-affiliation="true"] .hm-orgchart-person-role { padding: 0; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-role { + color: var(--hm-orgchart-person-position-color); + font-size: var(--hm-orgchart-person-position-size); + font-weight: 400; + line-height: var(--hm-orgchart-person-position-line-height); + letter-spacing: var(--hm-orgchart-person-position-letter-spacing); +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-name { + color: #071D3A; + font-size: var(--hm-orgchart-person-name-size); + font-weight: 600; + line-height: var(--hm-orgchart-person-name-line-height); + letter-spacing: var(--hm-orgchart-person-name-letter-spacing); + overflow: hidden; + text-overflow: clip; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-name[data-name-overflow="true"] { text-overflow: ellipsis; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]):is([data-card-asset-size="employee"], [data-card-layout="compact"]) .hm-orgchart-person-name { color: #323232; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-name:focus-visible { outline: 2px solid var(--hm-orgchart-resolved-stroke-input-focus); outline-offset: 1px; } +.hm-orgchart-employee[data-card-asset-size="employee"] .hm-orgchart-affiliation-mark { top: 2px; right: 1px; width: 20px; height: 20px; min-height: 20px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]):is([data-card-asset-size="employee"], [data-card-layout="compact"]) .hm-orgchart-affiliation-fallback { font-size: 6px; white-space: nowrap; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-person-attributes { position: absolute; z-index: 1; left: 3px; bottom: 3px; width: 28px; justify-content: center; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"] .hm-orgchart-person-attributes, +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] .hm-orgchart-person-attributes { left: 4px; width: 36px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-job-title { max-width: 100%; padding: 0 2px; font-size: 8px; line-height: 12px; letter-spacing: -0.2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"] .hm-orgchart-job-title { font-size: 9px; font-weight: 700; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]):is([data-card-asset-size="employee"], [data-card-layout="compact"]) .hm-orgchart-job-title { font-size: 8.5px; font-weight: 600; } +/* Workdesk source: index.css .rank-position/.role-rank and .bg-*. + Preserve the approved SVG geometry and position/name typography. The photo + slot uses the existing reserved width because the approved cards are smaller + than Workdesk's source cards; missing photos use the shared neutral icon. */ +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]), +.hm-orgchart-employee[data-workdesk-presentation="true"] { + --hm-orgchart-role-tag-color: #0e5492; + --hm-orgchart-role-tag-background: rgba(14, 84, 146, 0.08); + --hm-orgchart-role-tag-border: rgba(14, 84, 146, 0.2); +} +.hm-orgchart-employee[data-card-asset="business-planning"] { + --hm-orgchart-role-tag-color: #254e7e; + --hm-orgchart-role-tag-background: rgba(37, 78, 126, 0.1); + --hm-orgchart-role-tag-border: rgba(37, 78, 126, 0.26); +} +.hm-orgchart-employee[data-card-asset="talent-growth"] { + --hm-orgchart-role-tag-color: #0e67c8; + --hm-orgchart-role-tag-background: rgba(14, 103, 200, 0.1); + --hm-orgchart-role-tag-border: rgba(14, 103, 200, 0.26); +} +.hm-orgchart-employee[data-card-asset="integrated-system"] { + --hm-orgchart-role-tag-color: #6e47a0; + --hm-orgchart-role-tag-background: rgba(110, 71, 160, 0.1); + --hm-orgchart-role-tag-border: rgba(110, 71, 160, 0.26); +} +.hm-orgchart-employee[data-card-asset="design-planning"] { + --hm-orgchart-role-tag-color: #069a95; + --hm-orgchart-role-tag-background: rgba(6, 154, 149, 0.1); + --hm-orgchart-role-tag-border: rgba(6, 154, 149, 0.26); +} +.hm-orgchart-employee[data-card-asset="solution-sales"] { + --hm-orgchart-role-tag-color: #518b35; + --hm-orgchart-role-tag-background: rgba(81, 139, 53, 0.1); + --hm-orgchart-role-tag-border: rgba(81, 139, 53, 0.26); +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-avatar, +.hm-orgchart-employee[data-workdesk-presentation="true"] .hm-orgchart-avatar { + border-radius: 3.5px; + background: transparent; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-avatar { height: 44px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="leader"] .hm-orgchart-avatar { height: 56px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"])[data-card-asset-size="representative"] .hm-orgchart-avatar { height: 62px; } +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-job-title, +.hm-orgchart-employee[data-workdesk-presentation="true"] .hm-orgchart-job-title { + display: inline-flex; + align-items: center; + min-height: 13px; + padding: 0 3px; + border: 1px solid var(--hm-orgchart-role-tag-border); + border-radius: 4px; + background: var(--hm-orgchart-role-tag-background); + color: var(--hm-orgchart-role-tag-color); + font-size: 9px; + font-weight: 700; + line-height: 1; + letter-spacing: 0; +} +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]):is([data-card-asset-size="employee"], [data-card-layout="compact"]) .hm-orgchart-job-title { + padding: 0 2px; + font-size: 8.5px; + font-weight: 600; +} +/* Status is retained for assistive reading; the specified two-line card + composition has no third status row. Supplementary status cards are intact. */ +.hm-orgchart-employee:is([data-card-asset], [data-card-layout="compact"]) .hm-orgchart-status-label { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } +.hm-orgchart-person-name-tooltip { position: fixed; z-index: 10; box-sizing: border-box; max-width: min(320px, calc(100vw - 16px)); padding: 6px 8px; border: 1px solid #224387; border-radius: 4px; background: #ffffff; color: #071D3A; font-family: var(--hm-orgchart-resolved-font-family); font-size: 14px; line-height: 20px; overflow-wrap: anywhere; pointer-events: auto; } +.hm-orgchart-person-name-tooltip[hidden] { display: none; } diff --git a/packages/org-chart/src/styles/employee-info-dialog.css b/packages/org-chart/src/styles/employee-info-dialog.css new file mode 100644 index 0000000..ee30e6a --- /dev/null +++ b/packages/org-chart/src/styles/employee-info-dialog.css @@ -0,0 +1,48 @@ +.hm-orgchart-organization-link { + display: block; + color: inherit; + text-decoration: none; + border-radius: inherit; +} +.hm-orgchart-organization-link:hover { text-decoration: underline; } +.hm-orgchart-organization-link:focus-visible, +.hm-orgchart-employee[role="button"]:focus-visible, +.hm-orgchart-employee-dialog-close:focus-visible { + outline: 2px solid var(--hm-orgchart-resolved-stroke-input-focus); + outline-offset: 3px; +} +.hm-orgchart-employee[role="button"] { cursor: pointer; } +.hm-orgchart-employee-dialog { + width: min(420px, calc(100vw - 32px)); + max-width: calc(100vw - 32px); + max-height: calc(100dvh - 32px); + padding: var(--hm-orgchart-resolved-spacing-xxl); + border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-resolved-stroke-default); + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-resolved-bg-surface); + color: var(--hm-orgchart-resolved-fg-primary); + font: inherit; + overflow: auto; +} +.hm-orgchart-employee-dialog::backdrop { + background: color-mix(in srgb, var(--hm-orgchart-resolved-fg-primary) 38%, transparent); +} +.hm-orgchart-employee-dialog-header { display: flex; align-items: center; justify-content: space-between; gap: var(--hm-orgchart-resolved-spacing-lg); } +.hm-orgchart-employee-dialog-header h2 { margin: 0; font-size: 18px; font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-employee-dialog-close { + padding: var(--hm-orgchart-resolved-spacing-xs) var(--hm-orgchart-resolved-spacing-sm); + border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-resolved-stroke-default); + border-radius: var(--hm-orgchart-resolved-radius-control-md); + background: var(--hm-orgchart-resolved-bg-content); + color: inherit; + font: inherit; + cursor: pointer; +} +.hm-orgchart-employee-dialog-fields { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: var(--hm-orgchart-resolved-spacing-md) var(--hm-orgchart-resolved-spacing-lg); + margin: var(--hm-orgchart-resolved-spacing-xl) 0 0; +} +.hm-orgchart-employee-dialog-fields dt { color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-employee-dialog-fields dd { margin: 0; overflow-wrap: anywhere; } diff --git a/packages/org-chart/src/styles/org-chart-content.css b/packages/org-chart/src/styles/org-chart-content.css new file mode 100644 index 0000000..69ee9e8 --- /dev/null +++ b/packages/org-chart/src/styles/org-chart-content.css @@ -0,0 +1,147 @@ +/* Content composition only; no Header/Navigation or HM component overrides. */ +/* Full Composition: Scale wrapper (.hm-orgchart-composition) > Base Stage (.hm-orgchart-stage). + The stage keeps its natural width (tree + side) and is uniformly scaled by Core JS; + there is no reflow breakpoint and no inner horizontal scroll. Column/group gaps are + screen-only layout values (no data or parentId change). */ +.hm-orgchart-composition { position: relative; width: 100%; min-width: 0; overflow: hidden; } +.hm-orgchart-stage { + /* Engine padding (32px) + node margins (16px) already separate the six 252px + organization columns; the tree wrapper adds no extra width. */ + --hm-orgchart-column-gap: 0px; + display: grid; + grid-template-columns: max-content 330px; + column-gap: var(--hm-orgchart-resolved-spacing-xl); + align-items: start; + width: max-content; + transform-origin: 0 0; +} +.hm-orgchart-composition-no-side .hm-orgchart-stage { grid-template-columns: max-content; } +/* Stage-level rows: intro/hub are centered on the whole stage (tree + side). */ +.hm-orgchart-main { display: contents; } +.hm-orgchart-slot-side, .hm-orgchart-slot-footer, .hm-orgchart-slot-belowTree { min-width: 0; } +.hm-orgchart-slot-side { grid-column: 2; grid-row: 1 / span 4; } +.hm-orgchart-slot-footer { grid-column: 1 / -1; grid-row: 5; margin-top: 16px; contain: inline-size; } +.hm-orgchart-slot-side, .hm-orgchart-slot-footer, .hm-orgchart-slot-belowTree { display: grid; gap: 16px; } +.hm-orgchart-slot-belowTree { grid-column: 1; grid-row: 4; margin-top: 16px; contain: inline-size; } +.hm-orgchart-intro { grid-column: 1 / -1; grid-row: 1; contain: inline-size; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: start; gap: 16px; } +.hm-orgchart-intro .hm-orgchart-heading { grid-column: 1; } +.hm-orgchart-top-leaders { grid-column: 2; display: flex; justify-content: center; gap: 12px; } +.hm-orgchart-hub { + grid-column: 1 / -1; + grid-row: 2; + position: relative; + width: fit-content; + max-width: 100%; + margin: 28px auto 18px; + z-index: 1; + padding: 8px 20px; + border-radius: var(--hm-orgchart-resolved-radius-pill); + background: var(--hm-orgchart-resolved-bg-brand); + color: var(--hm-orgchart-resolved-on-action-primary); + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + overflow-wrap: anywhere; +} +.hm-orgchart-hub::before, .hm-orgchart-hub::after { + content: ''; + position: absolute; + left: 50%; + height: 18px; + border-left: 1px dashed var(--hm-orgchart-resolved-stroke-default); + pointer-events: none; +} +.hm-orgchart-hub::before { bottom: 100%; } +.hm-orgchart-hub::after { top: 100%; } +/* Stage 4: hub-to-organization branch lines (visual only, not data relations). + Each top-level tree draws its own bar segment so the six branches read as one row. */ +.hm-orgchart-main > .hm-orgchart-viewport { grid-column: 1; grid-row: 3; overflow: visible; padding-top: 0; border-top-color: transparent; border-radius: 0 0 var(--hm-orgchart-resolved-radius-container) var(--hm-orgchart-resolved-radius-container); } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-forest { align-items: flex-start; justify-content: flex-start; } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree { position: relative; padding: 18px calc(var(--hm-orgchart-column-gap) / 2) 0; } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree::before, +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree::after { content: ''; position: absolute; top: 0; pointer-events: none; border-top: 1px dashed var(--hm-orgchart-resolved-stroke-default); } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree::before { left: 0; right: 0; } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree:first-child::before { left: 50%; } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree:last-child::before { right: 50%; } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree:only-child::before { display: none; } +.hm-orgchart-main > .hm-orgchart-viewport .hm-orgchart-tree::after { left: 50%; height: 18px; border-top: 0; border-left: 1px dashed var(--hm-orgchart-resolved-stroke-default); } +/* Six top branches are siblings supplied by the data. Deeper cells/teams stack + inside their branch, with engine hierarchy and collapse behavior intact. */ +.hm-orgchart-engine.orgchart .node[data-depth] { width: 204px; } +.hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-organization { + width: 204px; + padding: 10px; + background: var(--hm-orgchart-current-card-background); + border-top: var(--hm-orgchart-resolved-border-top-width) solid var(--hm-orgchart-current-border); +} +.hm-orgchart-engine.orgchart .node[data-depth="0"] { width: 244px; } +.hm-orgchart-engine.orgchart .node[data-depth="0"] .hm-orgchart-organization { width: 244px; } +.hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth="1"]) > .nodes, +.hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth="2"]) > .nodes, +.hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth="3"]) > .nodes { flex-direction: column; align-items: center; } +/* Stacked siblings: the engine's horizontal sibling bar becomes a vertical + spine through the 20px engine node margin above each cell/team. */ +.hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth="1"]) > .nodes > .hierarchy::before, +.hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth="2"]) > .nodes > .hierarchy::before, +.hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth="3"]) > .nodes > .hierarchy::before { top: -20px; left: calc(50% - 1px); width: 2px; height: 20px; border-width: 0 0 0 2px; } +/* Stage 3 headers. Colors come from the per-organization preset variables; + sizes are DESIGN_ADAPTATION (Workdesk computed size/padding NOT VERIFIED). */ +.hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-organization-name { + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + margin: 8px 0 0; + text-align: center; + border-radius: var(--hm-orgchart-resolved-radius-container); + color: var(--hm-orgchart-current-department-color); +} +.hm-orgchart-engine.orgchart .node[data-header-role="organization"] .hm-orgchart-organization-name { + min-height: var(--hm-orgchart-title-height, 40px); + padding: 6px 12px; + background: var(--hm-orgchart-group-background); + font-size: var(--hm-orgchart-title-font-size, 18px); + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + line-height: var(--hm-orgchart-title-line-height, 26px); +} +.hm-orgchart-engine.orgchart .node[data-header-role="group"] .hm-orgchart-organization-name { + min-height: var(--hm-orgchart-group-header-height, 32px); + padding: 4px 8px; + background: var(--hm-orgchart-current-border); + font-size: var(--hm-orgchart-group-header-font-size, 14px); + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + line-height: var(--hm-orgchart-group-header-line-height, 20px); +} +.hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-leader { margin: 10px auto; } +.hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-employees { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 10px; } +.hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-employee { flex-shrink: 0; } +.hm-orgchart-preview-grid { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-top: 12px; } +.hm-orgchart-card-specimen { display: flex; flex-direction: column; align-items: center; gap: 4px; max-width: 100%; } +.hm-orgchart-card-caption { margin: 0; max-width: 180px; font-size: 11px; line-height: 16px; text-align: center; } +.hm-orgchart-component-cards { min-width: 0; } +.hm-orgchart-logo-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--hm-orgchart-resolved-spacing-lg); padding: 0; list-style: none; } +.hm-orgchart-logo-list li { display: flex; flex-direction: column; align-items: center; gap: var(--hm-orgchart-resolved-spacing-sm); padding: var(--hm-orgchart-resolved-spacing-lg); border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-resolved-stroke-default); border-radius: var(--hm-orgchart-resolved-radius-container); } +.hm-orgchart-logo-list .hm-orgchart-affiliation-mark { position: relative; width: 96px; height: 96px; } +.hm-orgchart-department-colors { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr)); gap: var(--hm-orgchart-resolved-spacing-lg); } +.hm-orgchart-department-colors > p { grid-column: 1 / -1; } +.hm-orgchart-representative-preview { grid-column: 1 / -1; } +.hm-orgchart-color-preview { min-width: 0; padding: var(--hm-orgchart-resolved-spacing-lg); border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-current-border); border-radius: var(--hm-orgchart-resolved-radius-container); background: var(--hm-orgchart-current-card-background); overflow-wrap: anywhere; } +.hm-orgchart-color-department-name { display: flex; align-items: center; justify-content: center; min-height: var(--hm-orgchart-title-height, 40px); padding: 6px 12px; font-size: var(--hm-orgchart-title-font-size, 18px); line-height: var(--hm-orgchart-title-line-height, 26px); font-weight: var(--hm-orgchart-resolved-font-weight-bold); background: var(--hm-orgchart-current-gradient); color: var(--hm-orgchart-current-department-color); border-radius: var(--hm-orgchart-resolved-radius-container); } +.hm-orgchart-color-legend { display: grid; grid-template-columns: 72px minmax(0, 1fr); gap: var(--hm-orgchart-resolved-spacing-sm); } +.hm-orgchart-color-legend dd { margin: 0; display: grid; gap: 4px; } +.hm-orgchart-color-swatch { display: block; width: 44px; height: 22px; border: 1px solid var(--hm-orgchart-resolved-stroke-default); } +.hm-orgchart-color-swatch[data-css-property="color"] { text-align: center; font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-contrast-normal, .hm-orgchart-contrast-candidate, .hm-orgchart-contrast-chip { + margin: var(--hm-orgchart-resolved-spacing-sm) 0; + padding: 4px 8px; + font-size: 15px; + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + line-height: 22px; + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-current-gradient); + color: var(--hm-orgchart-current-department-color); +} +.hm-orgchart-contrast-candidate { color: var(--hm-orgchart-contrast-candidate-color, #10243b); } +.hm-orgchart-contrast-chip-label { display: inline-block; background: var(--hm-orgchart-contrast-candidate-chip-background, #ffffff); color: var(--hm-orgchart-contrast-candidate-color, #10243b); padding: 0 4px; border-radius: var(--hm-orgchart-resolved-radius-control-md); } +.hm-orgchart-contrast-comparison { min-width: 0; } +.hm-orgchart-contrast-results { margin: var(--hm-orgchart-resolved-spacing-sm) 0; } +.hm-orgchart-contrast-results dd { margin-left: 0; } +.hm-orgchart-contrast-result, .hm-orgchart-contrast-stops { margin: var(--hm-orgchart-resolved-spacing-xs) 0; } diff --git a/packages/org-chart/src/styles/org-chart-p3-summary.css b/packages/org-chart/src/styles/org-chart-p3-summary.css new file mode 100644 index 0000000..2b6da84 --- /dev/null +++ b/packages/org-chart/src/styles/org-chart-p3-summary.css @@ -0,0 +1,119 @@ +/* P3 read-only summary presenters. Values are from Workdesk index.css: + headcount-panel / bold-text / sidebar- / #summary-table and the bottom + .section legend. These are standalone OrgChart content, not HM overrides. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-organization-totals { + display: flex; + flex-direction: column; + align-items: flex-end; + width: calc(var(--hm-orgchart-workdesk-summary-width) + 2px); + overflow: visible; + border: 0; + border-radius: 0; + background: none; + color: #18253a; + font-size: 14px; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-organization-totals-title { + width: 176px; + margin: 0; + padding: 4px 0; + border-radius: 7px 0 0 0; + background: linear-gradient(180deg, #004890, #00366f); + color: #fff; + font-size: 14px; + font-weight: 700; + line-height: 15.2px; + text-align: center; +} +.hm-orgchart-workdesk-summary-frame { + width: 100%; + box-shadow: 0 6.5px 12.9px rgba(51, 73, 96, 0.11); + border: 0.8px solid #c4d3e2; + border-radius: 6.33px 0 6.33px 6.33px; + background: #fff; + overflow: hidden; +} +.hm-orgchart-workdesk-position-table { + width: var(--hm-orgchart-workdesk-summary-width); + table-layout: fixed; + border-collapse: separate; + border-spacing: 0; + color: #18253a; + font-size: 14px; + line-height: 1.15; + text-align: center; +} +/* Preserve the 330px fixture table while giving its complete organization + labels and three-character first position enough room at the source's 14px. + Remaining numeric columns share the available width without changing data. */ +.hm-orgchart-workdesk-label-column { width: 112px; } +.hm-orgchart-workdesk-value-column { width: auto; } +.hm-orgchart-workdesk-value-column:nth-child(2) { width: 46px; } +.hm-orgchart-workdesk-position-table th, +.hm-orgchart-workdesk-position-table td { + height: 19px; + padding: 0; + border-top: 0.5px solid #d7e1ea; + font-weight: 400; + vertical-align: middle; + white-space: nowrap; + overflow-wrap: normal; +} +.hm-orgchart-workdesk-position-table th:first-child { padding: 0 7px; } +.hm-orgchart-workdesk-position-table :is(th, td) + :is(th, td) { border-left: 0.8px solid #d7e1ea; } +.hm-orgchart-workdesk-position-table thead { color: #223149; } +.hm-orgchart-workdesk-position-table thead th, +.hm-orgchart-workdesk-position-table tfoot :is(th, td) { background: #f2f6fa; } +.hm-orgchart-workdesk-position-table tfoot :is(th, td) { height: 20px; } +.hm-orgchart-workdesk-count-cell { font-variant-numeric: tabular-nums; } + +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 55.4px; + min-height: 55.4px; + padding: 0 19px; + border: 0; + border-radius: 10.7px; + background: rgba(255, 255, 255, 0.82); + box-shadow: 0 5.4px 14.3px rgba(44, 68, 96, 0.08); + color: #1c2534; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar-list { + flex-wrap: nowrap; + gap: 26.8px; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar-item { + position: relative; + height: 42.9px; + min-height: 42.9px; + padding: 0; + gap: 4px; + font-size: 19.6px; + font-weight: 500; + line-height: 19.7px; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar-item + .hm-orgchart-affiliation-bar-item { border: 0; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar-item + .hm-orgchart-affiliation-bar-item::before { + content: ''; + position: absolute; + top: 50%; + left: -13.9px; + width: 0.9px; + height: 21.4px; + background: rgba(113, 142, 176, 0.48); + transform: translateY(-50%); +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar-item dt { gap: 0.9px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar .hm-orgchart-affiliation-mark { + width: 39.3px; + height: 39.3px; + flex-basis: 39.3px; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar .hm-orgchart-affiliation-mark img { object-fit: cover; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-affiliation-bar-total { + color: #071d3a; + font-weight: 700; +} diff --git a/packages/org-chart/src/styles/org-chart-readonly.css b/packages/org-chart/src/styles/org-chart-readonly.css new file mode 100644 index 0000000..e87e00b --- /dev/null +++ b/packages/org-chart/src/styles/org-chart-readonly.css @@ -0,0 +1,296 @@ +/* Read-only composition (displayMode: 'readOnly'): Workdesk-style view-only canvas. + Scoped to the composition attribute; interactive composition, standalone + components and the HM Theme are unaffected. Canvas geometry follows the + measured Workdesk layout (1920 × 914.5, axis X 935); spacing that differs + from Workdesk is a DESIGN_ADAPTATION to the confirmed card sizes. */ +.hm-orgchart-composition[data-display-mode="readOnly"] { + --hm-orgchart-group-title-font-size: 20px; + --hm-orgchart-group-title-font-weight: 700; + --hm-orgchart-group-title-line-height: 19.7px; + background: #F5F8FB; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage { + position: relative; + isolation: isolate; + display: grid; + /* Heading | zero-width axis column at X 935 | side. */ + grid-template-columns: 935px 0 minmax(0, 1fr); + grid-template-rows: auto auto 1fr auto; + grid-template-areas: + "heading axis side" + "tree tree tree" + "status status status" + "footer footer footer"; + column-gap: 0; + width: max-content; + min-width: 1920px; + min-height: 914.5px; + padding: 12px 0; + background: #F5F8FB; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-heading { grid-area: heading; justify-self: start; align-self: start; max-width: calc(100% - 52px - 96px); margin: 0 0 0 52px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-title { font-size: 32px; line-height: 40px; letter-spacing: -0.5px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-date { margin: 4px 0 0; font-size: 14px; line-height: 20px; } + +/* Top leader and hub on the canvas axis, joined by one dashed line. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-axis { + grid-area: axis; + justify-self: center; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + width: max-content; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-axis::before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 50%; + border-left: 1px dashed var(--hm-orgchart-resolved-stroke-default); + pointer-events: none; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-top-leaders { position: relative; z-index: 1; grid-column: auto; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-hub { grid-area: auto; margin: auto 0 18px; white-space: nowrap; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-hub::before { content: none; } + +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-slot-side { grid-area: side; justify-self: end; align-self: start; margin-right: 20px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-slot-belowTree { grid-area: status; align-self: end; margin: 12px 0 0 52px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-slot-footer { grid-area: footer; margin: 8px 57px 0; } + +/* Hierarchy: no scroll frame; columns are positioned by measured header centers. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-main > .hm-orgchart-viewport { grid-area: tree; padding: 0; border: 0; border-radius: 0; overflow: visible; } +/* Positioned columns are visually translated; keep their layout overhang out of the canvas width. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-viewport:has(> .hm-orgchart-forest[data-layout="workdesk"]) { contain: inline-size; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-forest[data-layout="workdesk"] { display: grid; position: relative; width: 100%; min-width: 0; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-forest[data-layout="workdesk"] > .hm-orgchart-tree { + grid-area: 1 / 1; + justify-self: start; + width: max-content; + margin-left: var(--hm-orgchart-column-center); + translate: -50% 0; +} +/* One hub branch bar from the first to the last column center. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-forest[data-layout="workdesk"]::before { + content: ''; + position: absolute; + top: 0; + left: var(--hm-orgchart-branch-start); + width: calc(var(--hm-orgchart-branch-end) - var(--hm-orgchart-branch-start)); + border-top: 1px dashed var(--hm-orgchart-resolved-stroke-default); + pointer-events: none; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-forest[data-layout="workdesk"] > .hm-orgchart-tree::before { content: none; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart { min-width: 0; padding: 0; } + +/* Organization nodes: header + people only, no group card frame. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] { width: max-content; min-width: 108px; margin: 0 8px 16px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="organization"] { + --hm-orgchart-title-height: 36px; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-organization { + display: flex; + flex-direction: column; + align-items: center; + width: auto; + padding: 0; + border: 0; + border-radius: 0; + background: none; + box-shadow: none; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-organization-name { align-self: stretch; margin: 0; } +/* Workdesk 1Depth typography; vertical padding must not enlarge the 36px header. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="organization"] .hm-orgchart-organization-name { + min-width: 146px; + height: 36px; + padding: 0 12px; + font-size: 20px; + font-weight: 700; + line-height: 36px; + white-space: nowrap; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="group"] { + --hm-orgchart-group-header-height: 30.4px; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="group"] .hm-orgchart-organization-name { + align-self: center; + width: 114px; + min-width: 114px; + min-height: 30.4px; + padding: 0; + background: var(--hm-orgchart-current-gradient); + border-radius: 7.1px; + box-shadow: 0 3.6px 8px rgba(45, 73, 104, 0.2); + font-size: var(--hm-orgchart-group-title-font-size); + font-weight: var(--hm-orgchart-group-title-font-weight); + line-height: var(--hm-orgchart-group-title-line-height); + letter-spacing: normal; + text-align: center; +} +/* Workdesk .hw/.hr labels share compact typography; .sw/.ux retain 20px/700. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="group"][data-organization-id^="business-planning-"] .hm-orgchart-organization-name, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="group"][data-organization-id^="talent-growth-"] .hm-orgchart-organization-name { font-size: 18px; font-weight: 600; line-height: 16.9px; } +/* Stacked cells: the vertical spine follows the 16px node gap. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-depth]) > .nodes > .hierarchy::before { top: -16px; height: 16px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-leader { margin: 8px 0 0; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-employees { flex-direction: column; flex-wrap: nowrap; align-items: center; gap: 8px; margin-top: 8px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-employees:empty { display: none; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-employee { margin-top: 0; } +/* Final external gap: this must follow the generic employee margin reset. + Keeping semantic leader class preserves badges while SVG size uses ancestry. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-depth] .hm-orgchart-employee.hm-orgchart-leader { margin: 8px 0 0; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="group"] .hm-orgchart-employee.hm-orgchart-leader { margin-top: 8px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node[data-header-role="group"] .hm-orgchart-employees:first-of-type { margin-top: 8px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-employee-details { gap: 0; } + +/* Cells/teams of Div and Design: one horizontal row with the engine's sibling bar. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-children-layout="horizontal"]) > .nodes { flex-direction: row; align-items: flex-start; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-children-layout="horizontal"]) > .nodes > .hierarchy::before { + top: -9px; left: 0; width: 100%; height: auto; border-width: 2px 0 0 0; +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-children-layout="horizontal"]) > .nodes > .hierarchy:first-child::before { left: calc(50% - 1px); width: calc(50% + 1px); } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-children-layout="horizontal"]) > .nodes > .hierarchy:last-child::before { left: 0; width: calc(50% + 1px); } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy:has(> .node[data-children-layout="horizontal"]) > .nodes > .hierarchy:only-child::before { left: calc(50% - 1px); width: 2px; } + +/* Workdesk compact artwork. Preserve flow placement for unknown organizations; + the measured preset alone enables this original 1920×914.5 coordinate layer. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] { grid-template-rows: 224.2px auto 1fr auto; height: 914.5px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-axis { width: 198px; height: 224.2px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-top-leaders { position: absolute; top: 35.3px; z-index: 35; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-hub { + position: absolute; + top: 176px; + left: 50%; + translate: -50% 0; + z-index: 12; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + width: max-content; + /* The fixed 198px axis is a center anchor, not a text-width constraint. */ + max-width: none; + min-width: 198px; + height: 42px; + margin: 0; + padding: 9px 24px 9px 22px; + border-radius: 892.1px; + background: linear-gradient(-28.46deg, #809dd7, #45639f 79.33%); + gap: 8px; +} +.hm-orgchart-hub-icon { width: 20px; height: 20px; flex: 0 0 20px; stroke: #f8fcff; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; filter: drop-shadow(0 0 8px rgba(0, 0, 0, 0.38)); } +.hm-orgchart-hub-label { position: relative; font-size: 21px; font-weight: 750; line-height: 24px; letter-spacing: normal; background: linear-gradient(180deg, #dbeeff, #f8fcff 15.38%, #fff 48.08%, #f4faff 79.33%, #dbeeff); background-clip: text; -webkit-text-fill-color: transparent; filter: drop-shadow(0 0 10px rgba(0, 0, 0, 0.5)); } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-axis::before, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-hub::after, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-forest::before, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-tree::after { content: none; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-viewport { position: relative; z-index: 7; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-heading, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-slot-footer { position: relative; z-index: 7; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-slot-side { position: relative; z-index: 18; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-slot-belowTree { position: relative; z-index: 32; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-slot-belowTree { position: absolute; left: 32px; bottom: 70px; width: 240px; margin: 0; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-status-summary { gap: 12px; flex-wrap: nowrap; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-stage[data-workdesk-artwork] .hm-orgchart-slot-footer { position: absolute; left: 57px; right: 57px; bottom: 12px; margin: 0; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-person-role, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-person-name, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-job-title { white-space: nowrap; } +/* Keep the logo above the unchanged position row. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-employee[data-card-asset-size="leader"] .hm-orgchart-affiliation-mark { top: 0; } +.hm-orgchart-workdesk-overlay { position: absolute; inset: 0; width: 1920px; height: 914.5px; z-index: 4; pointer-events: none; } +.hm-orgchart-workdesk-decoration { position: absolute; z-index: 0; pointer-events: none; user-select: none; object-fit: contain; } +.hm-orgchart-workdesk-ring { top: 0; left: 50%; width: 1757px; height: 901px; translate: -50% 0; mix-blend-mode: multiply; } +.hm-orgchart-workdesk-sky { inset: 0; width: 100%; height: 100%; object-position: top center; opacity: 0.1; } +.hm-orgchart-workdesk-meeting { left: 68px; bottom: 32px; width: 557px; height: 344px; opacity: 0.8; mix-blend-mode: multiply; } +.hm-orgchart-workdesk-grid { left: 62px; bottom: 18.9px; width: 1768px; height: 275px; } +.hm-orgchart-workdesk-hub-frame { inset: 0; width: 100%; height: 100%; z-index: -1; object-position: top; } +/* P3: artwork owns representative/hub/top-level routes. Hide every engine + hierarchy route in readOnly only, including upstream pseudo-element paths. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy::before, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .hierarchy::after, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node::before, +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-engine.orgchart .node::after { content: none; display: none; } + +/* Organization totals (compact presenter of the shared Summary). */ +.hm-orgchart-organization-totals { + width: 332px; + overflow: hidden; + border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-resolved-table-divider-color); + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-resolved-table-background); + color: var(--hm-orgchart-resolved-table-text); +} +.hm-orgchart-organization-totals-title { + margin: 0; + padding: 3px 8px; + background: var(--hm-orgchart-resolved-table-header-text); + color: var(--hm-orgchart-resolved-on-action-primary); + font-size: 13px; + line-height: 18px; + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + text-align: center; +} +.hm-orgchart-organization-totals-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); margin: 0; } +.hm-orgchart-organization-total { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + min-width: 0; + padding: 3px 10px; + border-top: var(--hm-orgchart-resolved-table-divider-width) solid var(--hm-orgchart-resolved-table-divider-color); + font-size: var(--hm-orgchart-resolved-table-font-size); + line-height: var(--hm-orgchart-resolved-table-line-height); +} +.hm-orgchart-organization-total:nth-child(odd) { border-right: var(--hm-orgchart-resolved-table-divider-width) solid var(--hm-orgchart-resolved-table-divider-color); } +.hm-orgchart-organization-total:nth-child(odd):last-child { grid-column: 1 / -1; border-right: 0; } +.hm-orgchart-organization-total dt { min-width: 0; overflow-wrap: anywhere; } +.hm-orgchart-organization-total dd { flex: 0 0 auto; margin: 0; font-variant-numeric: tabular-nums; font-weight: var(--hm-orgchart-resolved-font-weight-medium); } +.hm-orgchart-organization-total-sum { background: var(--hm-orgchart-resolved-table-footer-background); font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-organization-total-sum dd { font-weight: var(--hm-orgchart-resolved-font-weight-bold); } + +/* Status groups: header pill + cards, no surrounding card. Title/card colors + come from the confirmed status styles in summary-sections.css. */ +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-status-summary { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 12px 48px; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-status-group { display: grid; justify-items: start; gap: 8px; padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; } +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-status-group > .hm-orgchart-summary-title { + display: flex; + align-items: center; + justify-content: center; + width: 108px; + min-height: 24px; + margin: 0; + border-radius: var(--hm-orgchart-resolved-radius-container); + color: var(--hm-orgchart-resolved-on-action-primary); + font-size: var(--hm-orgchart-group-title-font-size); + font-weight: var(--hm-orgchart-group-title-font-weight); + line-height: var(--hm-orgchart-group-title-line-height); +} +.hm-orgchart-composition[data-display-mode="readOnly"] .hm-orgchart-status-employees { gap: 12px; margin: 0; } + +/* Affiliation bar: one untitled line of logo · name · count and the total. */ +.hm-orgchart-affiliation-bar { + padding: 8px 24px; + border: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-resolved-stroke-input-default); + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-resolved-bg-surface); +} +.hm-orgchart-affiliation-bar-list { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; row-gap: 4px; margin: 0; } +.hm-orgchart-affiliation-bar-item { display: flex; align-items: center; gap: 6px; padding: 0 20px; font-size: 16px; line-height: 24px; white-space: nowrap; } +.hm-orgchart-affiliation-bar-item + .hm-orgchart-affiliation-bar-item { border-left: var(--hm-orgchart-resolved-border-width) solid var(--hm-orgchart-resolved-stroke-default); } +.hm-orgchart-affiliation-bar-item dt { display: flex; align-items: center; gap: 6px; } +.hm-orgchart-affiliation-bar-item dd { margin: 0; font-variant-numeric: tabular-nums; } +.hm-orgchart-affiliation-bar-total { font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-affiliation-bar .hm-orgchart-affiliation-mark { + position: relative; + display: inline-flex; + flex: 0 0 24px; + align-items: center; + justify-content: center; + width: 24px; + height: 20px; + font-size: 9px; +} diff --git a/packages/org-chart/src/styles/org-chart.css b/packages/org-chart/src/styles/org-chart.css new file mode 100644 index 0000000..4bfbdb6 --- /dev/null +++ b/packages/org-chart/src/styles/org-chart.css @@ -0,0 +1,55 @@ +@import './design-tokens.css'; +@import './employee-card.css'; +@import './summary-sections.css'; +@import './org-chart-content.css'; +@import './org-chart-readonly.css'; +@import './org-chart-p3-summary.css'; +@import './employee-info-dialog.css'; +/* Standalone defaults are scoped to the shell; only OrgChart public variables + inherit across the Shadow DOM boundary. No host HM Theme is required. */ +:host { display: block; min-width: 0; max-width: 100%; font: inherit; } +.hm-orgchart-shell { position: relative; min-width: 0; color: var(--hm-orgchart-resolved-fg-primary); font-family: var(--hm-orgchart-resolved-font-family); font-size: var(--hm-orgchart-resolved-font-size-base); line-height: 1.5; } +.hm-orgchart-shell *, .hm-orgchart-shell *::before, .hm-orgchart-shell *::after { box-sizing: border-box; } +.hm-orgchart-state:empty { display: none; } +.hm-orgchart-state, .hm-orgchart-issues { padding: 12px; background: var(--hm-orgchart-resolved-bg-content); border-radius: var(--hm-orgchart-resolved-radius-container); } +.hm-orgchart-heading { margin-bottom: 16px; } +.hm-orgchart-title { margin: 0; font-size: var(--hm-orgchart-resolved-font-size-title); line-height: 1.4; font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-description, .hm-orgchart-date { margin: 4px 0; color: var(--hm-orgchart-resolved-fg-secondary); overflow-wrap: anywhere; } +.hm-orgchart-viewport { width: 100%; max-width: 100%; min-width: 0; overflow: auto; padding: 8px 0; border: 1px solid var(--hm-orgchart-resolved-stroke-default); border-radius: var(--hm-orgchart-resolved-radius-container); } +.hm-orgchart-viewport:focus-visible, .hm-orgchart-toggle:focus-visible { outline: 2px solid var(--hm-orgchart-resolved-stroke-input-focus); outline-offset: 2px; } +.hm-orgchart-forest { display: flex; width: max-content; min-width: 100%; } +.hm-orgchart-tree { flex: 0 0 auto; } +.hm-orgchart-engine.orgchart { min-width: 100%; background-image: none; user-select: text; padding: 20px 16px 0; } +.hm-orgchart-engine.orgchart .node { width: 244px; margin-right: 8px; margin-left: 8px; padding: 0; border: 0; background: none; text-align: left; } +.hm-orgchart-engine.orgchart .node:hover, .hm-orgchart-engine.orgchart .node.focused { background: none; } +.hm-orgchart-engine.orgchart .node .edge { display: none; } +.hm-orgchart-engine.orgchart .hierarchy { text-align: center; } +.hm-orgchart-engine.orgchart .hierarchy::before { border-color: var(--hm-orgchart-resolved-stroke-default); } +.hm-orgchart-engine.orgchart > ul > li > ul li > .node::before { background-color: var(--hm-orgchart-resolved-stroke-default); } +.hm-orgchart-engine.orgchart .hierarchy:not(.couple) > .node:has(+ .nodes)::after { background-color: var(--hm-orgchart-resolved-stroke-default); } +.hm-orgchart-organization { width: 244px; padding: 12px; border: 1px solid var(--hm-orgchart-resolved-stroke-default); border-radius: var(--hm-orgchart-resolved-radius-container); background: var(--hm-orgchart-resolved-bg-surface); } +.hm-orgchart-kind { display: block; font-size: 11px; color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-organization-name { margin: 2px 0 0; font-size: 15px; line-height: 22px; overflow-wrap: anywhere; } +.hm-orgchart-domain-id { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-node-count, .hm-orgchart-vacancy { margin: 8px 0; font-size: 11px; color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-employee { display: flex; gap: 8px; align-items: center; margin-top: 8px; } +.hm-orgchart-leader { padding: 8px; background: var(--hm-orgchart-resolved-bg-content); border-radius: var(--hm-orgchart-resolved-radius-container); } +.hm-orgchart-avatar { position: relative; display: flex; flex: 0 0 32px; width: 32px; height: 32px; align-items: center; justify-content: center; border-radius: 50%; overflow: hidden; background: var(--hm-orgchart-resolved-bg-subtle); color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-avatar img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; } +.hm-orgchart-employee-details { min-width: 0; } +.hm-orgchart-person-name, .hm-orgchart-person-role, .hm-orgchart-status-label { display: block; overflow-wrap: anywhere; } +.hm-orgchart-person-role, .hm-orgchart-status-label { font-size: 11px; color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-toggle { display: block; width: 100%; margin-top: 12px; padding: 6px 8px; border: 1px solid var(--hm-orgchart-resolved-stroke-default); border-radius: var(--hm-orgchart-resolved-radius-container); background: var(--hm-orgchart-resolved-bg-surface); color: var(--hm-orgchart-resolved-fg-primary); font: inherit; cursor: pointer; } +.hm-orgchart-summary { margin-top: 16px; min-width: 0; } +.hm-orgchart-summary-title { margin: 0 0 8px; font-size: 15px; } +.hm-orgchart-raw-total, .hm-orgchart-policy { margin: 4px 0; } +.hm-orgchart-policy { color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-summary table { width: 100%; border-collapse: collapse; table-layout: fixed; margin-top: 12px; } +.hm-orgchart-summary caption { padding-bottom: 8px; text-align: left; color: var(--hm-orgchart-resolved-fg-secondary); } +.hm-orgchart-summary th, .hm-orgchart-summary td { padding: 8px; border-bottom: 1px solid var(--hm-orgchart-resolved-stroke-default); text-align: left; overflow-wrap: anywhere; } +.hm-orgchart-summary th { font-weight: 500; } +.hm-orgchart-group-title { margin: 12px 0 4px; font-size: 13px; } +.hm-orgchart-summary-group { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 16px; margin: 0; } +.hm-orgchart-summary-group dt { overflow-wrap: anywhere; } +.hm-orgchart-summary-group dd { margin: 0; } +@media (prefers-reduced-motion: reduce) { .hm-orgchart-engine.orgchart .node { transition-duration: 0.01ms; } } diff --git a/packages/org-chart/src/styles/summary-sections.css b/packages/org-chart/src/styles/summary-sections.css new file mode 100644 index 0000000..320c85a --- /dev/null +++ b/packages/org-chart/src/styles/summary-sections.css @@ -0,0 +1,141 @@ +/* Independent content summaries inside Core's Shadow DOM. Colors and radii use + the standalone OrgChart defaults in design-tokens.css. + Content gaps/dimensions are local geometry, not overrides of HM components. */ +.hm-orgchart-position-summary, +.hm-orgchart-affiliation-summary, +.hm-orgchart-status-group { + min-width: 0; + padding: 16px; + border: 1px solid var(--hm-orgchart-resolved-stroke-default); + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-resolved-bg-surface); +} +.hm-orgchart-position-summary { margin-top: 0; } +.hm-orgchart-position-summary .hm-orgchart-summary-title, +.hm-orgchart-affiliation-summary .hm-orgchart-summary-title, +.hm-orgchart-status-summary .hm-orgchart-summary-title { + margin: 0 0 8px; + font-size: 15px; + font-weight: var(--hm-orgchart-resolved-font-weight-bold); + line-height: 1.5; +} +.hm-orgchart-position-summary .hm-orgchart-raw-total, +.hm-orgchart-affiliation-summary .hm-orgchart-raw-total { + margin: 0 0 8px; + font-weight: var(--hm-orgchart-resolved-font-weight-medium); +} +.hm-orgchart-position-summary .hm-orgchart-policy, +.hm-orgchart-status-summary .hm-orgchart-policy { + margin: 4px 0; + color: var(--hm-orgchart-resolved-fg-secondary); + font-size: 11px; + overflow-wrap: anywhere; +} +.hm-orgchart-summary-scroll { max-width: 100%; overflow: auto; margin-top: 12px; } +.hm-orgchart-summary-scroll:focus-visible { + outline: 2px solid var(--hm-orgchart-resolved-stroke-input-focus); + outline-offset: 2px; +} +.hm-orgchart-summary .hm-orgchart-position-table { + width: max-content; + min-width: 100%; + margin-top: 0; + table-layout: auto; + border-collapse: collapse; + color: var(--hm-orgchart-resolved-table-text); + background: var(--hm-orgchart-resolved-table-background); + font-size: var(--hm-orgchart-resolved-table-font-size); + line-height: var(--hm-orgchart-resolved-table-line-height); +} +.hm-orgchart-summary .hm-orgchart-position-table caption { + max-width: 480px; + padding: 0 0 var(--hm-orgchart-resolved-table-caption-gap); + text-align: left; + color: var(--hm-orgchart-resolved-table-caption-color); + font-size: var(--hm-orgchart-resolved-table-caption-font-size); + line-height: var(--hm-orgchart-resolved-table-caption-line-height); +} +.hm-orgchart-summary .hm-orgchart-position-table th, +.hm-orgchart-summary .hm-orgchart-position-table td { + min-width: 64px; + max-width: 160px; + padding: var(--hm-orgchart-resolved-table-cell-padding-y) var(--hm-orgchart-resolved-table-cell-padding-x); + border-bottom: var(--hm-orgchart-resolved-table-divider-width) solid var(--hm-orgchart-resolved-table-divider-color); + font-variant-numeric: tabular-nums; + overflow-wrap: anywhere; + vertical-align: middle; +} +.hm-orgchart-summary .hm-orgchart-position-table th:first-child { min-width: 100px; } +.hm-orgchart-summary .hm-orgchart-position-table thead th { + background: var(--hm-orgchart-resolved-table-header-background); + color: var(--hm-orgchart-resolved-table-header-text); + border-top: var(--hm-orgchart-resolved-table-divider-width) solid var(--hm-orgchart-resolved-table-header-border-top); + border-bottom-color: var(--hm-orgchart-resolved-table-header-border-bottom); + font-size: var(--hm-orgchart-resolved-table-header-font-size); + font-weight: var(--hm-orgchart-resolved-table-header-font-weight); +} +.hm-orgchart-summary .hm-orgchart-position-table tbody th { font-weight: var(--hm-orgchart-resolved-font-weight-medium); } +.hm-orgchart-summary .hm-orgchart-position-table .hm-orgchart-count-cell { text-align: right; } +.hm-orgchart-summary .hm-orgchart-position-table .hm-orgchart-subtotal { font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-summary .hm-orgchart-position-table .hm-orgchart-inclusive { color: var(--hm-orgchart-resolved-fg-secondary); text-align: right; } +.hm-orgchart-summary .hm-orgchart-position-table tfoot { + background: var(--hm-orgchart-resolved-table-footer-background); + font-weight: var(--hm-orgchart-resolved-table-footer-font-weight); +} +.hm-orgchart-summary .hm-orgchart-position-table tbody tr:hover { background: var(--hm-orgchart-resolved-table-row-hover-background); } +.hm-orgchart-status-totals { font-size: 12px; } +.hm-orgchart-affiliation-list { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 160px), 1fr)); + gap: 8px; + margin: 12px 0 0; +} +.hm-orgchart-affiliation-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + min-width: 0; + padding: 12px; + border: 1px solid var(--hm-orgchart-resolved-stroke-input-default); + border-radius: var(--hm-orgchart-resolved-radius-container); + background: var(--hm-orgchart-resolved-bg-content); +} +.hm-orgchart-affiliation-name { min-width: 0; overflow-wrap: anywhere; font-weight: var(--hm-orgchart-resolved-font-weight-medium); } +.hm-orgchart-affiliation-name { display: flex; align-items: center; gap: 8px; } +.hm-orgchart-affiliation-name .hm-orgchart-affiliation-mark { + display: inline-flex; + position: relative; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + flex: 0 0 28px; + font-size: 10px; +} +.hm-orgchart-affiliation-count { flex: 0 0 auto; margin: 0; font-variant-numeric: tabular-nums; font-weight: var(--hm-orgchart-resolved-font-weight-bold); } +.hm-orgchart-status-summary { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); + gap: 16px; + min-width: 0; +} +.hm-orgchart-status-summary:empty { display: none; } +.hm-orgchart-status-employees { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px; margin-bottom: 12px; } +.hm-orgchart-status-employees .hm-orgchart-employee { margin-top: 0; } +.hm-orgchart-status-group > .hm-orgchart-summary-title { + background: linear-gradient(180deg, #87909c 0%, #68727e 100%); + border: 1px solid rgba(92, 101, 112, 0.52); + box-shadow: 0 7px 16px rgba(75, 84, 96, 0.18); +} +.hm-orgchart-status-group .hm-orgchart-employee[data-card-kind] { + margin: 0; + background-image: linear-gradient(180deg, #f4f5f6 0%, #dfe3e7 100%) !important; + border: 1px solid rgba(120, 130, 142, 0.35); + border-radius: var(--br-3_5, var(--hm-orgchart-resolved-radius-container)); + cursor: pointer; +} +.hm-orgchart-status-group .hm-orgchart-employee[data-card-kind] .hm-orgchart-person-role { color: #555f6a; } +.hm-orgchart-status-group .hm-orgchart-employee[data-card-kind] .hm-orgchart-person-name { color: #3e4650; } +.hm-orgchart-status-group .hm-orgchart-affiliation-mark img { filter: grayscale(1); opacity: 0.72; } +.hm-orgchart-content-empty { margin: 8px 0; color: var(--hm-orgchart-resolved-fg-secondary); font-size: 12px; } diff --git a/packages/org-chart/test.mjs b/packages/org-chart/test.mjs new file mode 100644 index 0000000..7164d4f --- /dev/null +++ b/packages/org-chart/test.mjs @@ -0,0 +1,17 @@ +import { build } from 'vite'; +import { globSync } from 'node:fs'; +import { execFileSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +const root = fileURLToPath(new URL('./', import.meta.url)); +// Optional exact paths let a change run only its affected tests; default keeps +// the existing full data test command and discovery unchanged. +const selected = process.argv.slice(2).map(file => file.replaceAll('\\', '/')); +const tests = [...globSync('src/**/*.test.ts', { cwd: root })].filter(file => !selected.length || selected.includes(file.replaceAll('\\', '/'))); +if (!tests.length) throw new Error('No OrgChart data tests found'); +await build({ configFile: false, root, publicDir: false, build: { + outDir: '../../test-results/org-chart-unit', emptyOutDir: true, target: 'node22', minify: false, + lib: { entry: Object.fromEntries(tests.map((file, i) => [`test-${i}`, path.join(root, file)])), formats: ['es'], fileName: (_, entry) => `${entry}.mjs` }, + rolldownOptions: { external: [/^node:/] }, +} }); +execFileSync(process.execPath, ['--test', ...tests.map((_, i) => path.join(root, '../../test-results/org-chart-unit', `test-${i}.mjs`))], { stdio: 'inherit' }); diff --git a/packages/org-chart/tsconfig.build.json b/packages/org-chart/tsconfig.build.json new file mode 100644 index 0000000..bca2eb9 --- /dev/null +++ b/packages/org-chart/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "declaration": true, + "emitDeclarationOnly": true, + "rootDir": "src", + "outDir": "dist" + } +} diff --git a/packages/org-chart/tsconfig.json b/packages/org-chart/tsconfig.json new file mode 100644 index 0000000..6e9226a --- /dev/null +++ b/packages/org-chart/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "skipLibCheck": false, + "noEmit": true, + "types": [] + }, + "include": ["src"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/src/org-chart/core-component-preview.tsx b/src/org-chart/core-component-preview.tsx new file mode 100644 index 0000000..58da22e --- /dev/null +++ b/src/org-chart/core-component-preview.tsx @@ -0,0 +1,81 @@ +/// +import { useLayoutEffect, useRef } from 'react'; +import { calculateSummary, normalizeOrgChartDataset, validateOrgChartDataset } from '@hm-design/org-chart'; +import engineUrl from '@hm-design/org-chart/engine.css?url'; +import coreUrl from '@hm-design/org-chart/style.css?url'; +import { createEmployeeCard, type EmployeeCardOptions } from '../../packages/org-chart/src/core/employee-card'; +import { decorateNode, engineTree, type RenderContext } from '../../packages/org-chart/src/core/render'; +import { applyOrganizationStyle } from '../../packages/org-chart/src/core/style-presets'; +import { createPositionSummary } from '../../packages/org-chart/src/core/position-summary'; +import { createAffiliationSummary } from '../../packages/org-chart/src/core/affiliation-summary'; +import { createStatusSummary } from '../../packages/org-chart/src/core/status-summary'; +import { createLogoLegend } from '../../packages/org-chart/src/core/logo-legend'; +import { createDepartmentColors, updateDepartmentColorValues } from '../../packages/org-chart/src/core/department-colors'; +import fixture from '../../examples/org-chart/data-p1.json'; + +type PreviewKind = 'Logo' | 'DepartmentColors' | 'PositionSummary' | 'AffiliationSummary' | 'StatusSummary' | 'EmployeeCard' | 'OrganizationCards'; +interface Props { kind: PreviewKind; data?: unknown; variant?: number; cardKind?: EmployeeCardOptions['kind'] } + +/** Story host only. Every pixel/card/count is rendered by the same Core modules + * used by Vanilla HTML and the production React Wrapper, not JSX copies. */ +export function CoreComponentPreview({ kind, data = fixture, variant = 0, cardKind = 'employee' }: Props) { + const ref = useRef(null); + useLayoutEffect(() => { + const validation = validateOrgChartDataset(data); + const host = ref.current!; + if (!validation.valid) { host.textContent = validation.issues.map(issue => issue.code).join(', '); return; } + const dataset = validation.data; + const normalized = normalizeOrgChartDataset(dataset); + const context: RenderContext = { + data: dataset, summary: calculateSummary(dataset), orderedOrganizations: [], employeesByOrganization: normalized.employeesByOrganization, + topLeaderIds: new Set(normalized.roots.filter(node => node.organization.type === 'root' && node.organization.leaderId).map(node => node.organization.leaderId!)), + }; + engineTree(normalized.roots, 'component-preview', context); + const controller = new AbortController(); + const root = document.createElement('div'); + root.className = 'hm-orgchart-component-host'; + const shadow = root.attachShadow({ mode: 'open' }); + for (const href of [engineUrl, coreUrl]) { + const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = href; shadow.append(link); + link.addEventListener('load', () => updateDepartmentColorValues(shell), { signal: controller.signal }); + } + const shell = document.createElement('section'); + shell.className = 'hm-orgchart-shell'; + let component: HTMLElement; + if (kind === 'Logo') component = createLogoLegend(document, context, controller.signal); + else if (kind === 'DepartmentColors') component = createDepartmentColors(document, context, controller.signal); + else if (kind === 'PositionSummary') component = createPositionSummary(document, context); + else if (kind === 'AffiliationSummary') component = createAffiliationSummary(document, context); + else if (kind === 'StatusSummary') component = createStatusSummary(document, context, controller.signal); + else if (kind === 'OrganizationCards') { + const organization = normalized.roots[0]?.children[variant]?.organization ?? normalized.roots[0]!.organization; + const wrapper = document.createElement('div'); + wrapper.className = 'hm-orgchart-engine orgchart hm-orgchart-component-cards'; + component = document.createElement('div'); component.className = 'node'; + const card = document.createElement('article'); card.className = 'hm-orgchart-organization'; component.append(card); + decorateNode(component, { id: 'preview-org', name: '', organizationIndex: context.orderedOrganizations.indexOf(organization), depth: 1, groupVariant: variant }, context, controller.signal, () => undefined); + // Branch members stay in their actual fixture organizations; previews use + // the shared EmployeeCard renderer without modifying primary membership. + const roster = document.createElement('div'); roster.className = 'hm-orgchart-preview-grid'; + const descendants = new Set([organization.id]); + for (const item of context.orderedOrganizations) if (item.parentId && descendants.has(item.parentId)) descendants.add(item.id); + for (const employee of dataset.employees.filter(item => descendants.has(item.organizationId) && item.id !== organization.leaderId).slice(0, 3)) { + roster.append(createEmployeeCard(document, employee, { kind: 'employee', affiliationName: dataset.affiliations.find(item => item.id === employee.affiliationId)?.name }, controller.signal)); + } + component.append(roster); wrapper.append(component); component = wrapper; + } else { + const organization = normalized.roots[0]?.children[variant]?.organization ?? normalized.roots[0]!.organization; + const id = cardKind === 'topLeader' ? normalized.roots[0]!.organization.leaderId : organization.leaderId; + const employee = cardKind !== 'employee' ? dataset.employees.find(item => item.id === id) : dataset.employees.find(item => item.id !== id && item.organizationId === organization.id) ?? dataset.employees.find(item => !item.jobTitle); + component = createEmployeeCard(document, employee ?? dataset.employees[0]!, { kind: cardKind, affiliationName: dataset.affiliations.find(item => item.id === employee?.affiliationId)?.name }, controller.signal); + applyOrganizationStyle(component, variant); + } + component.dataset.component = kind; + shell.append(component); shadow.append(shell); host.replaceChildren(root); + updateDepartmentColorValues(shell); + const observer = kind === 'DepartmentColors' ? new ResizeObserver(() => updateDepartmentColorValues(shell)) : undefined; + observer?.observe(root); + return () => { observer?.disconnect(); controller.abort(); root.remove(); }; + }, [kind, data, variant, cardKind]); + return
    ; +} diff --git a/src/org-chart/org-chart-cards.stories.tsx b/src/org-chart/org-chart-cards.stories.tsx new file mode 100644 index 0000000..589dad3 --- /dev/null +++ b/src/org-chart/org-chart-cards.stories.tsx @@ -0,0 +1,28 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { CoreComponentPreview } from './core-component-preview'; +import { organizationStylePresets } from '../../packages/org-chart/src/core/style-presets'; + +const meta = { title: 'OrgChart/Components/Cards', tags: ['internal'], component: CoreComponentPreview, parameters: { layout: 'padded', controls: { disable: true } } } satisfies Meta; +export default meta; +type Story = StoryObj; +function organization(variant: number): Story { + const preset = organizationStylePresets[variant]!; + return { + name: preset.label, + args: { kind: 'OrganizationCards', variant }, + render: () =>
    +

    {preset.label} · 실측 헤더 컬러 {preset.accentColor} · {preset.backgroundImage}

    +

    OrgChart 전용 --hm-orgchart-accent / --hm-orgchart-group-background. Workdesk {preset.version}, {preset.observedOn}, {preset.selector}. 직원 정보와 통계는 가상 데이터입니다. 카드 배경은 OrgChart 독립 기본값을 사용합니다.

    + +
    , + }; +} +export const BusinessManagement = organization(0); +export const BusinessPlanning = organization(1); +export const TalentGrowth = organization(2); +export const IntegratedSystem = organization(3); +export const DesignPlanning = organization(4); +export const SolutionSales = organization(5); +export const TopLeader: Story = { name: '최상위 리더', args: { kind: 'EmployeeCard', cardKind: 'topLeader' } }; +export const OrganizationLeader: Story = { name: '조직장', args: { kind: 'EmployeeCard', cardKind: 'leader' } }; +export const Employee: Story = { name: '일반 직원', args: { kind: 'EmployeeCard', cardKind: 'employee' } }; diff --git a/src/org-chart/org-chart-p1.stories.tsx b/src/org-chart/org-chart-p1.stories.tsx new file mode 100644 index 0000000..790d458 --- /dev/null +++ b/src/org-chart/org-chart-p1.stories.tsx @@ -0,0 +1,56 @@ +import { StrictMode, useMemo, useState } from 'react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Button } from '@hm-design/ui'; +import { OrgChart } from '@hm-design/org-chart-react'; +import { JsonOrgChartDataSource } from '@hm-design/org-chart'; +import engineUrl from '@hm-design/org-chart/engine.css?url'; +import coreUrl from '@hm-design/org-chart/style.css?url'; +import fixture from '../../examples/org-chart/data-p1.json'; +import './org-chart-stories.css'; +import { CoreComponentPreview } from './core-component-preview'; + +const compositionSource = new JsonOrgChartDataSource(fixture); +const compositionStylesheets = { engine: engineUrl, core: coreUrl }; + +/** View-only Workdesk composition: the same Core/React Wrapper with + * displayMode="readOnly". No Story notes, test controls or collapse buttons; + * JSON update/lifecycle and collapse checks stay in the internal Content Stories. */ +function CompositionPreview() { + return
    + +
    ; +} +function DepartmentTypographyPreview() { + const [longNames, setLongNames] = useState(false); + const data = useMemo(() => { + const data = structuredClone(fixture); + if (longNames) for (const id of ['mock-leader-00', 'mock-leader-01', 'mock-employee-01']) { + data.employees.find(item => item.id === id)!.name = '아주긴가상이름표시검증사례'; + } + return data; + }, [longNames]); + return
    +

    기본 이름은 2–3음절의 가상 이름입니다. 긴 이름 검증에서는 폰트·사진·카드 크기를 유지하며 말줄임된 이름에 Hover 또는 Tab Focus로 전체 이름을 확인하고 Escape로 닫을 수 있습니다.

    +
    + +
    ; +} +const meta = { title: 'OrgChart', component: CompositionPreview, parameters: { layout: 'padded', controls: { disable: true } }, decorators: [(Story) => ] } satisfies Meta; +export default meta; +type Story = StoryObj; +export const LogoPersonnelSummary: Story = { + name: 'Logo · Personnel Summary', + render: () =>
    + + + +
    , +}; +export const DepartmentColors: Story = { name: 'Department Colors', render: () => }; +export const FullComposition: Story = { name: 'Full Composition' }; + +// Preserve existing standalone Story IDs for verification and direct links. +// The default manager excludes "internal"; user-facing navigation has three pages. +export const Logo: Story = { name: 'Logo', tags: ['internal'], render: () => }; +export const PositionSummary: Story = { name: 'Position Summary', tags: ['internal'], render: () => <>

    가상 직원 데이터 자동 집계 · 실제 운영 인원수가 아닙니다.

    }; +export const AffiliationSummary: Story = { name: 'Affiliation Summary', tags: ['internal'], render: () => <>

    가상 직원 데이터 자동 집계 · 실제 운영 인원수가 아닙니다.

    }; diff --git a/src/org-chart/org-chart-stories.css b/src/org-chart/org-chart-stories.css new file mode 100644 index 0000000..5eefff5 --- /dev/null +++ b/src/org-chart/org-chart-stories.css @@ -0,0 +1,61 @@ +/* Story host layout only. Core nodes/styles remain inside their Shadow DOM. */ +.hm-orgchart-story { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 1rem; + width: 100%; + min-width: 0; + max-width: 1880px; +} + +/* Full Composition scales itself to the available width; no host cap. */ +.hm-orgchart-story-full { max-width: none; } +body:has(.hm-orgchart-story-full) { background: #F5F8FB; } +.hm-orgchart-story-full { background: #F5F8FB; } + +.hm-orgchart-story-note { + margin: 0; + overflow-wrap: anywhere; +} + +.hm-orgchart-story-controls { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + min-width: 0; +} + +.hm-orgchart-story-state { + display: block; + overflow-wrap: anywhere; +} + +.hm-orgchart-story-chart, +.hm-orgchart-story-responsive, +.hm-orgchart-story-instance { + min-width: 0; + max-width: 100%; +} + +.hm-orgchart-story-chart { + width: 100%; +} + +.hm-orgchart-story-instances { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; + min-width: 0; +} + +.hm-orgchart-story-instance { + display: grid; + align-content: start; + gap: 0.5rem; +} + +@media (max-width: 767px) { + .hm-orgchart-story-instances { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/src/org-chart/org-chart-summary.stories.tsx b/src/org-chart/org-chart-summary.stories.tsx new file mode 100644 index 0000000..0264860 --- /dev/null +++ b/src/org-chart/org-chart-summary.stories.tsx @@ -0,0 +1,30 @@ +import type { Meta, StoryObj } from "@storybook/react-vite" +import { CoreComponentPreview } from "./core-component-preview" + +// The shared P1 fixture uses real organization/company names, virtual employees, +// and automatic Raw Count. Acquired logo mapping stays in the shared Core/asset +// layer; Stories do not duplicate summary UI or add employee data fields. +const meta = { + title: "OrgChart/Components/Summaries", + tags: ["internal"], + component: CoreComponentPreview, + args: { kind: "PositionSummary" }, + parameters: { layout: "padded", controls: { disable: true } }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const PositionSummary: Story = { + render: () => , +} + +export const AffiliationSummary: Story = { + args: { kind: "AffiliationSummary" }, + render: () => , +} + +export const StatusSummary: Story = { + args: { kind: "StatusSummary" }, + render: () => , +} diff --git a/src/org-chart/org-chart.stories.tsx b/src/org-chart/org-chart.stories.tsx new file mode 100644 index 0000000..0205fd4 --- /dev/null +++ b/src/org-chart/org-chart.stories.tsx @@ -0,0 +1,217 @@ +import { StrictMode, useCallback, useState, type ReactNode } from "react" +import type { Meta, StoryObj } from "@storybook/react-vite" +import { Button } from "@hm-design/ui" +import { OrgChart } from "@hm-design/org-chart-react" +import { JsonOrgChartDataSource, type OrgChartDataSource, type OrgChartState } from "@hm-design/org-chart" +import engineCssUrl from "@hm-design/org-chart/engine.css?url" +import coreCssUrl from "@hm-design/org-chart/style.css?url" +import dataV1 from "../../examples/org-chart/data-v1.json" +import dataV2 from "../../examples/org-chart/data-v2.json" +import "./org-chart-stories.css" + +// These are the same source files consumed by the Vanilla examples. The Core +// validates the unknown JSON, rather than a Story casting it to a trusted type. +const sourceV1 = new JsonOrgChartDataSource(dataV1) +const sourceV2 = new JsonOrgChartDataSource(dataV2) +const stylesheetUrls = { engine: engineCssUrl, core: coreCssUrl } + +const hierarchyData = structuredClone(dataV1) +hierarchyData.presentation.groups.showEmployees = false +hierarchyData.presentation.groups.showSummary = false +const hierarchySource = new JsonOrgChartDataSource(hierarchyData) + +const employeeData = structuredClone(dataV1) +employeeData.presentation.groups.showSummary = false +employeeData.organizations[1].name = "가상 기획팀 · 긴 조직명을 가진 콘텐츠 표시 확인" +employeeData.employees[2].name = "가상직원 긴 이름 표시 확인" +employeeData.employees[2].position = "가상 장기 프로젝트 기획 및 운영 담당 선임" +employeeData.employees[2].jobTitle = "가상 콘텐츠 및 협업 담당" +const employeeSource = new JsonOrgChartDataSource(employeeData) + +const noEmployeeData = structuredClone(dataV1) +noEmployeeData.employees = [] +for (const organization of noEmployeeData.organizations) organization.leaderId = null +noEmployeeData.metadata.dataVersion = "story-zero-employees" +const noEmployeeSource = new JsonOrgChartDataSource(noEmployeeData) + +const noOrganizationData = structuredClone(noEmployeeData) +noOrganizationData.organizations = [] +noOrganizationData.relations = [] +noOrganizationData.presentation.organizationOrder = [] +noOrganizationData.metadata.dataVersion = "story-zero-organizations" +const noOrganizationSource = new JsonOrgChartDataSource(noOrganizationData) + +/** Test transport only: chart DOM, validation and errors remain owned by Core. */ +function delayedSource(payload: unknown, delayMs: number, fail = false, ignoreAbort = false): OrgChartDataSource { + return { + load({ signal } = {}) { + return new Promise((resolve, reject) => { + const abort = () => { + clearTimeout(timer) + signal?.removeEventListener("abort", abort) + reject(new DOMException("Story source cancelled", "AbortError")) + } + const timer = setTimeout(() => { + signal?.removeEventListener("abort", abort) + if (fail) reject(new Error("Fictitious Story source failure")) + else resolve(structuredClone(payload)) + }, delayMs) + if (!ignoreAbort) { + if (signal?.aborted) abort() + else signal?.addEventListener("abort", abort, { once: true }) + } + }) + }, + } +} + +function Content({ note, children }: { note: string; children: ReactNode }) { + return

    {note}

    {children}
    +} + +function StateOutput({ state, updates, label = "현재 상태" }: { state: OrgChartState; updates: number; label?: string }) { + return ( + + {label}: {state.status} + {state.status === "ready" && ` · ${state.dataVersion} · 원본 직원 ${state.summary.raw.total}명`} + {state.status === "error" && ` · ${state.issues.map(issue => issue.code).join(", ")}`} + {` · 상태 알림 ${updates}회`} + + ) +} + +function useChartState() { + const [state, setState] = useState({ status: "idle" }) + const [updates, setUpdates] = useState(0) + const onStateChange = useCallback((next: OrgChartState) => { + setState(next) + setUpdates(count => count + 1) + }, []) + return { state, updates, onStateChange } +} + +function DataUpdateContent() { + const [source, setSource] = useState(sourceV1) + const [mounted, setMounted] = useState(true) + const status = useChartState() + return ( + +
    + + + +
    + + {mounted && } +
    + ) +} + +function LoadingContent() { + const [source, setSource] = useState(() => delayedSource(dataV1, 1800)) + const status = useChartState() + return ( + +
    + + + + + + +
    + + +
    + ) +} + +function ResponsiveContent() { + const [width, setWidth] = useState(390) + return ( + +
    + {[390, 768, 1280, 1440].map(value => )} +
    +
    + +
    +
    + ) +} + +function MultipleContent() { + const [sourceA, setSourceA] = useState(sourceV1) + const [mountedA, setMountedA] = useState(true) + const a = useChartState() + const b = useChartState() + return ( + +
    + + + +
    +
    +
    + + {mountedA && } +
    +
    + + +
    +
    +
    + ) +} + +const meta = { + title: "OrgChart/Content", + tags: ["internal"], + component: OrgChart, + parameters: { + layout: "padded", + docs: { description: { component: "OrgChart v0.1 콘텐츠: React Wrapper → 동일 Vanilla Core → dabeng 엔진 / HM Theme / 노드 UI. 기존 HTML JSON을 공유하며 Navigation·Zoom/Pan·실제 인사 데이터는 포함하지 않습니다." } }, + }, + args: { dataSource: sourceV1, stylesheetUrls }, + argTypes: { + dataSource: { control: false }, + stylesheetUrls: { control: false }, + aggregationPolicy: { control: false }, + onStateChange: { control: false }, + onLifecycleError: { control: false }, + className: { control: false }, + style: { control: false }, + }, + decorators: [(Story) => ], +} satisfies Meta +export default meta +type Story = StoryObj + +export const BasicOrganization: Story = { + name: "Basic Organization", + render: args => , +} + +export const OrganizationHierarchy: Story = { + name: "Organization Hierarchy", + args: { dataSource: hierarchySource }, + render: args => , +} + +export const EmployeeCards: Story = { + name: "Employee Cards", + args: { dataSource: employeeSource }, + render: args => , +} + +export const OrganizationSummary: Story = { + name: "Organization Summary", + render: args => , +} + +export const JSONDataUpdate: Story = { name: "JSON Data Update", render: () => } +export const LoadingEmptyError: Story = { name: "Loading / Empty / Error", render: () => } +export const ResponsiveContainer: Story = { name: "Responsive Container", render: () => } +export const MultipleInstances: Story = { name: "Multiple Instances", render: () => }

    3Hl2n%7852bD#g6(1N)pRQZ2t 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 z zucd0b2=VjraB?(!ctVIaOi|VnE|Vr!)1|vSGzf1cDlbE_N*Ry!x12cY6u$aq+llje zy%twS5^B_TEYOCdSLl#oNarFM*X;U~R%3u6a5uzL@RU$gqtO2i4 z(msJ6%(o}LU~JnwEaxN(0Uy)LV`T=O{H9YM`sF1%pZ&EP+`3*o>Br0^W)tA1C|+I@ z$h^AOf=hIFZA@`iX&A$uFt}a>8Nz5jPVg~D`RVjV&Y9I-zZpX1LG8HnDAUH{H?M>< zmY{WBU;@c(Em6^@*aOzB6$&CJrd%y|6|!^e5{?Ee!+J=_@@89Z z?^7T`>>e_BAeAgC|4b9_@g9Z{a}o;6q2TNaLbTnqK-GU0#;t9CNn}?VP`}+8P<}I+ zs|Nfzw-o0QuyG;X?KeG*3AV=8Wu{{ON%P6zGiMnMR8LR{*lk6<#&+19VP7m?;CX0z zmYlQ)1MHx`rC~_!{0c8d>%w^l$z~1f=}YFfWq3dcnD zGNxuYXJLfJ;D%4F-a8d_{NcrNudC#6z?hxwa1Yg(y2`N9Wsd=+eTyO9{%#D{T<}XNlop}{1~`zaQG+b* z_qN<}Eg{J8W0|i}L#zuyOwJbb=3vdk%hC50eYf;IIW1SY%VGx87R<^07zcVUw6nG5 zi^hZ7W?IOSzdnbQ$~E@V8{~}G+RnN8fmu7bsZocj#pZ{1q%F$@FB z#-jlwSMA_@vQ+~^7^&DPusJr1n27sBf;CiXJs_HE=&edKi636zvkbVZv?W%mDVPwY zQ46055gsO1Kf&Qxyu=WAqKGw0Gy zv5RBYh*v3mR1_uRtXir7l!cBHtZY5>46pb+6_T1P8zY(r?0L+{ z>yFfIMbYABEG&Y1{-oH7pseV2Sr__RzsrkUL}$)f*Cmv9^866AqI!MGFc z4Dr*(X`^5uMKA?|lI8vQd*GO!U)PO>oC^=Xagl##h$aW_TPLkD%^ChyT7w5Mc^op5 zuPPq4^q(Vsy17gi(A2b55&ZrW#mBSd9$rilwx|(Hp_K z6jL9oQ&p(BBp7NEya|xiJ7L zdEBD8ys2zec(~v5yF0h3(J21VhRgAUXpR%gHFF3bulFBF=>3?E_tcL=e5cNhESEb( z_`7%W4~Os#L>$z<+RAS$Q^z~~TyG4gV$NGCtB7X&wePh!U09AWA`yLy%(>HGPn~v` zrx6ToW^fhd-2(*>vYNBEX{zox=yL=IdBomIA6diC+TXtyVMIyf?oLG_<7C0>*dJOtWwYnO1sI;752+fe=TMEw zci*Q!8oroVV~}2L5_t76gqFGKXRnw;REf3mp$DV3Xkmxh{n%_8&}Fn8YZs9GCm`M~AoHcr$ZZ-^nliWww( z*MWvAuN%V`>Vu%q7LA)xc1rljnw$qZ<{0zFUMAZF^84R>?0jaN=VTA9nzUHUP?l%R z^w9y{YKrk-YvrFto60N*m{WKrqt zpBCH;5JC_<8;vH6#a+`cU$Y|w!$L*JwWfhxDT}K}+l(7e1Td?pF~9#ETr;*RyvfD5 zuJuOk3L=EA^zWrVxre@8Hdzg3RPnFl|JLKVhZb`8-*8f$v>w<`Vff^%$=oj|N!T(D z*^LRPk(-5;x#bJEJ)sqOIfad{)las)eXAH2*=34uAq^;f9}Is?d8zp zc=@Ql2h`;=pQG>sBLm43WjOw;IA(F@R8822ng;J<2#9CD;MV?SQC5unBS;LLKnW2Y z_H--WQQA-Qa!`NoNlg^_9>8(mzfL}vutwwD{7}L8-sB*NQDtwR0eiYUdxxyKoTTL* z)TS^n*h4PguDpD!%sZ7pxlGpk4GSAi1c=ic1>T- zCKti?zR-_li?fnftq47Tgv%Hx)kz-JFw-x^f4)Qiu_wb4bD>rTL%e^uQP53q9_TE| zMOTGndZ-F}uJckXQJ#Z#O%q^WCSHyz5Q%#I8c;=Ts_=j)vLk+%a0qr|HSd)3dU|oJ zl2_jYf%VK^4C8{_BOr>}JYSG_69aFpWYaQ*wPtBkpwUN~iJqXs?lWr(kKgVpR!$#w z6$>!I-S92FdCPQ`D4Qq`Cf@sTOz5)3PZadB>w0iso9zNy zE=4V|hn+xaTkOS<2FXtIAb6VLEp$!HCMq9P!M!+xXmgn@&fbd=TW1p`cH(Qg7hkq% z#fNp|;4AWA_UD4sfQic$!PN|kvcOfx7J?LPgm)4J(s_tU>?1!91RNecS4#z+s<6HO znH%r#@l+@6=g^(3cSKZ9n=YTZEnwE3vdRO!?{cg6Uzg@YRZS(~>S6%TFN$#cd)ZA0 zSuznqwh=V3>IuGI_IFQ`HkaV(qWa91%T^SP?yeQgg3`|fq}l}Kc%m5C9?n-NQ7^+u zk!z$b#y6U~%!XnmvAR&GK=sInHY{UN8}%u}L0dN(8zmNxAdQTEg5cM>LLww?C#cz@ z;E1gUT%#USn)t~q5cVhMw_)k2$F3eh(Qxi%k3Ha(N-%@rIg>dKv#lzWli-OceM?j0 zyluaKAKe^0%C)sBYFm|hj1jK4ReR^6%}YPZf1LFWTEa!e$%wITim-WJG^%%e_8_=0(Wy;>{jn!iz)ob)0MM^7YFu%5Mh2ACi|xh@7Sq6JKKn zB9rjiQ|HMdX_Irgf78KP#gZ{yyhk(3H^&0! z>j{NO4We_&1lchQ?s{-~^7b&t5Do{5mfOSKC6F`^FcwOrG{;C`@K4B