@simplysm/sd-claude 14.0.65 → 14.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/claude/references/sd-requirement-source-handling.md +64 -0
- package/claude/references/sd-simplysm14/README.md +44 -40
- package/claude/references/sd-simplysm14/apis/angular/README.md +95 -0
- package/claude/references/sd-simplysm14/apis/angular/app-structure.md +49 -0
- package/claude/references/sd-simplysm14/apis/angular/buttons.md +42 -0
- package/claude/references/sd-simplysm14/apis/angular/crud.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/forms.md +63 -0
- package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +80 -0
- package/claude/references/sd-simplysm14/apis/angular/kanban.md +33 -0
- package/claude/references/sd-simplysm14/apis/angular/layout.md +41 -0
- package/claude/references/sd-simplysm14/apis/angular/modal.md +63 -0
- package/claude/references/sd-simplysm14/apis/angular/routing.md +45 -0
- package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +50 -0
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +42 -0
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +52 -0
- package/claude/references/sd-simplysm14/apis/angular/toast.md +46 -0
- package/claude/references/sd-simplysm14/apis/angular/visual.md +41 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +76 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +83 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +80 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +39 -0
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +112 -0
- package/claude/references/sd-simplysm14/apis/core-common/README.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-common/extensions.md +123 -0
- package/claude/references/sd-simplysm14/apis/core-common/features.md +46 -0
- package/claude/references/sd-simplysm14/apis/core-common/types.md +114 -0
- package/claude/references/sd-simplysm14/apis/core-common/utils.md +158 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +12 -0
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +64 -0
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +52 -0
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +81 -0
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +55 -0
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +111 -0
- package/claude/references/sd-simplysm14/apis/excel/README.md +81 -0
- package/claude/references/sd-simplysm14/apis/lint/README.md +80 -0
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +33 -0
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +77 -0
- package/claude/references/sd-simplysm14/apis/orm-common/executable.md +20 -0
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +92 -0
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +98 -0
- package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +128 -0
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +59 -0
- package/claude/references/sd-simplysm14/apis/sd-claude/README.md +9 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +50 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +155 -0
- package/claude/references/sd-simplysm14/apis/service-client/README.md +92 -0
- package/claude/references/sd-simplysm14/apis/service-common/README.md +29 -0
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +63 -0
- package/claude/references/sd-simplysm14/apis/service-common/messages.md +56 -0
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +64 -0
- package/claude/references/sd-simplysm14/apis/service-common/service-types.md +43 -0
- package/claude/references/sd-simplysm14/apis/service-server/README.md +20 -0
- package/claude/references/sd-simplysm14/apis/service-server/auth.md +31 -0
- package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +47 -0
- package/claude/references/sd-simplysm14/apis/service-server/define-service.md +71 -0
- package/claude/references/sd-simplysm14/apis/service-server/internals.md +41 -0
- package/claude/references/sd-simplysm14/apis/service-server/server.md +66 -0
- package/claude/references/sd-simplysm14/apis/storage/README.md +69 -0
- package/claude/references/sd-simplysm14/{client-component.md → manuals/client-component.md} +134 -128
- package/claude/references/sd-simplysm14/manuals/client-crud.md +102 -0
- package/claude/references/sd-simplysm14/manuals/client-demo.md +128 -0
- package/claude/references/sd-simplysm14/manuals/client-rules.md +7 -0
- package/claude/references/sd-simplysm14/{client-setup.md → manuals/client-setup.md} +2 -2
- package/claude/references/sd-simplysm14/{client-tab.md → manuals/client-tab.md} +13 -11
- package/claude/references/sd-simplysm14/{orm-union.md → manuals/orm-union.md} +1 -1
- package/claude/references/sd-simplysm14/manuals/orm.md +75 -0
- package/claude/rules/sd-base-rules.md +191 -79
- package/claude/scripts/sd_paths.py +22 -0
- package/claude/sd-check-bash.py +19 -0
- package/claude/sd-statusline.py +7 -12
- package/claude/skills/sd-commit/SKILL.md +8 -3
- package/claude/skills/sd-demo/SKILL.md +103 -62
- package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +42 -0
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +75 -0
- package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/golden.jsonl +5 -3
- package/claude/skills/sd-dev/SKILL.md +33 -63
- package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/golden.jsonl +3 -3
- package/claude/skills/sd-docs/SKILL.md +53 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +7 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +3 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +6 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +1 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +8 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +7 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +3 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +3 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +6 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +1 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +8 -0
- package/claude/skills/sd-docs/evals/golden.jsonl +2 -0
- package/claude/skills/sd-docs/references/subagent-prompt.md +100 -0
- package/claude/skills/sd-impl/SKILL.md +149 -46
- package/claude/skills/sd-impl/evals/fixtures/case-001-new-screen/spec.md +55 -0
- package/claude/skills/sd-impl/evals/fixtures/case-002-auto-process/spec.md +55 -0
- package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/packages/client/src/pages/book-list.ts +22 -0
- package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/spec.md +57 -0
- package/claude/skills/sd-impl/evals/fixtures/case-004-ambiguous-spec/spec.md +58 -0
- package/claude/skills/sd-impl/evals/fixtures/case-005-id-mismatch/spec.md +52 -0
- package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.test.ts +10 -0
- package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.ts +11 -0
- package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/data-access//352/261/260/353/236/230/354/262/230-/354/240/221/352/267/274.ts +12 -0
- package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/models//352/261/260/353/236/230/354/262/230.ts +8 -0
- package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/spec.md +77 -0
- package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/250/353/215/270.txt +1 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.txt +1 -0
- package/claude/skills/sd-impl/evals/golden.jsonl +6 -3
- package/claude/skills/sd-impl/references/spec-cross-check.md +82 -0
- package/claude/skills/sd-skill/SKILL.md +4 -4
- package/claude/skills/sd-skill/evals/golden.jsonl +1 -2
- package/claude/skills/sd-skill/references/eval-authoring.md +31 -0
- package/claude/skills/sd-skill/references/eval-run.md +1 -1
- package/claude/skills/sd-skill/references/skill-authoring.md +8 -5
- package/claude/skills/sd-skill/scripts/run_eval.py +39 -60
- package/claude/skills/sd-spec/SKILL.md +163 -105
- package/claude/skills/sd-spec/references/example-spec.md +585 -0
- package/claude/skills/sd-spec/references/spec-authoring.md +287 -0
- package/claude/skills/sd-spec/references/spec-md-template.md +15 -93
- package/claude/skills/sd-unpack/SKILL.md +7 -1
- package/claude/skills/sd-unpack/scripts/handlers/_common.py +10 -0
- package/claude/skills/sd-unpack/scripts/handlers/eml_handler.py +5 -13
- package/claude/skills/sd-unpack/scripts/handlers/msg_handler.py +3 -12
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +23 -37
- package/claude/skills/sd-unpack/scripts/handlers/office_worker.py +1 -4
- package/claude/skills/sd-unpack/scripts/handlers/pdf_handler.py +4 -13
- package/claude/skills/sd-unpack/scripts/unpack.py +4 -4
- package/claude/skills/sd-use/SKILL.md +1 -0
- package/claude/skills/sd-wip/SKILL.md +38 -0
- package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/_wip.md +3 -0
- package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/spec.md +15 -0
- package/claude/skills/sd-wip/evals/fixtures/with-existing-wip/.wips/260101120000_acct.md +6 -0
- package/claude/skills/sd-wip/evals/fixtures/with-existing-wip-for-compact/.wips/260101120000_acct.md +14 -0
- package/claude/skills/sd-wip/evals/golden.jsonl +4 -0
- package/claude/skills/sd-wip/references/compact.md +79 -0
- package/package.json +1 -1
- package/scripts/sd-entries.mjs +2 -2
- package/claude/references/sd-simplysm14/orm.md +0 -11
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -27
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/overview.md +0 -12
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Button.tsx +0 -12
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Input.tsx +0 -27
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -25
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/overview.md +0 -12
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/components/Input.tsx +0 -25
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-001-RTP/354/236/205/353/240/245/355/231/224/353/251/264/spec.md +0 -19
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-002-RTP/354/266/234/353/240/245/355/231/224/353/251/264/spec.md +0 -20
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/overview.md +0 -16
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Button.tsx +0 -6
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Input.tsx +0 -15
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-demo/references/demo-md-template.md +0 -92
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260301_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/232/224/354/262/255.eml +0 -5
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260305_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/354/232/224/354/262/255.eml +0 -6
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260310_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234.eml +0 -6
- package/claude/skills/sd-dev/evals/fixtures/single-req-auto-chain/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/start-from-plan/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-dev/evals/fixtures/start-from-plan/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/plan.md +0 -28
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -14
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/components/Input.tsx +0 -6
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/plan.md +0 -40
- package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/spec.md +0 -13
- package/claude/skills/sd-impl/evals/fixtures/multi-r/src/components/Input.tsx +0 -25
- package/claude/skills/sd-impl/evals/fixtures/multi-r/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -26
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-impl/references/impl-md-template.md +0 -87
- package/claude/skills/sd-impl/references/modes-and-failure.md +0 -65
- package/claude/skills/sd-plan/SKILL.md +0 -130
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -14
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/api/user.ts +0 -13
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/components/Input.tsx +0 -15
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/pages/UserList.tsx +0 -29
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -17
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/components/Input.tsx +0 -6
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/DEMO-001-/352/261/260/353/236/230/354/262/230/demo.md +0 -26
- package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -15
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/components/Input.tsx +0 -25
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/data/mock-customer.ts +0 -16
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/pages/CustomerList.tsx +0 -25
- package/claude/skills/sd-plan/evals/golden.jsonl +0 -3
- package/claude/skills/sd-plan/references/plan-md-template.md +0 -138
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260122_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/260/234/354/204/240/354/232/224/354/262/255.eml +0 -20
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260205_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/355/231/224/353/251/264/352/264/200/353/240/250.eml +0 -17
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260301_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234/354/262/264/352/263/204.eml +0 -18
- package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs/20260317_/352/263/240/352/260/235/354/202/254_/352/270/264/352/270/211/354/262/230/353/246/254/353/260/251/354/271/250.eml +0 -17
- package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs//355/232/214/354/235/230/353/214/200/353/263/270_20260320.txt +0 -13
- package/claude/skills/sd-spec/evals/fixtures/direct-simple/.gitkeep +0 -0
- package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/REQ-001-test/spec.md +0 -19
- package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/overview.md +0 -18
- package/claude/skills/sd-spec/evals/golden.jsonl +0 -4
- package/claude/skills/sd-spec/references/overview-md-template.md +0 -89
- package/claude/skills/sd-spec/references/raw-input-handling.md +0 -96
- package/claude/skills/sd-verify/SKILL.md +0 -96
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/impl.md +0 -20
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -14
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.test.ts +0 -11
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.ts +0 -7
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/impl.md +0 -21
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/plan.md +0 -21
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/src/pages/UserList.tsx +0 -19
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/impl.md +0 -19
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/plan.md +0 -14
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.test.ts +0 -10
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.ts +0 -7
- package/claude/skills/sd-verify/evals/golden.jsonl +0 -3
- package/claude/skills/sd-verify/references/verify-md-template.md +0 -99
- /package/claude/skills/{sd-demo/evals/fixtures/basic-single-req/src/pages → sd-wip/evals/fixtures/empty}/.gitkeep +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Requirement Source 부정확성 처리
|
|
2
|
+
|
|
3
|
+
## STT 텍스트 보정
|
|
4
|
+
|
|
5
|
+
**명백한 오타만 보정**. 보정 시 `[원문]` 발췌로 원본도 보존.
|
|
6
|
+
|
|
7
|
+
```markdown
|
|
8
|
+
> [2026-03-17 회의] "PDF에 빨간색으로 강조"
|
|
9
|
+
> [원문] "PDF에 빨간색으루 강조"
|
|
10
|
+
> 출처: .docs/회의대본_3.txt:L120
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
판정:
|
|
14
|
+
- ✅ 명백 (오타 1~2글자, 의미 자명): 보정
|
|
15
|
+
- ❌ 모호 (의미가 여러 갈래로 해석 가능): **사용자에게 즉시 확인**, 원문 그대로 발췌
|
|
16
|
+
|
|
17
|
+
## 화자 추정
|
|
18
|
+
|
|
19
|
+
회의록 화자가 부정확/누락된 경우 컨텍스트로 추정. `[추정: ...]` 표기.
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
> [2026-03-17 회의, 추정: B 차장] "주문 단위로 가는 게 맞다"
|
|
23
|
+
> 출처: .docs/회의대본_3.txt:L78-L80
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
판정:
|
|
27
|
+
- ✅ 컨텍스트로 명확: 추정
|
|
28
|
+
- ❌ 모호: **사용자에게 즉시 확인**, 화자 미상으로 발췌
|
|
29
|
+
|
|
30
|
+
## 모호 발화 처리
|
|
31
|
+
|
|
32
|
+
지시대명사·생략 표현·비격식 발언:
|
|
33
|
+
- "그거 그렇게" / "이렇게 가는 걸로" / "지난번처럼" / "알아서"
|
|
34
|
+
|
|
35
|
+
처리:
|
|
36
|
+
- **자동 해석 금지** (이전 발언/맥락 추측해서 채워 넣지 말 것)
|
|
37
|
+
- **사용자에게 즉시 확인** — "그거"가 무엇인지, "그렇게"가 어떤 방식인지
|
|
38
|
+
|
|
39
|
+
## 다중 화자 발언 섞임 (회의록)
|
|
40
|
+
|
|
41
|
+
여러 사람이 같은 주제를 다른 입장에서 말한 경우:
|
|
42
|
+
- 양쪽(또는 모든) 발언 모두 발췌 보존
|
|
43
|
+
- 사용자에게 어느 의견 채택할지 즉시 확인
|
|
44
|
+
|
|
45
|
+
## 비격식 메일 / paste
|
|
46
|
+
|
|
47
|
+
주어 생략, 맥락 누락:
|
|
48
|
+
- 보충 가능한 부분(자명한 주어 등): 발췌 시 `[추정 보충: ...]` 표기로 원문에 덧붙이지 않고 명시
|
|
49
|
+
- 모호한 부분: 사용자에게 즉시 확인
|
|
50
|
+
|
|
51
|
+
## 도메인 용어 다의성
|
|
52
|
+
|
|
53
|
+
Requirement Source 는 시스템 용어가 아니라 **현장 은어**. 같은 단어가 시스템상 여러 동작에 매핑될 수 있음.
|
|
54
|
+
|
|
55
|
+
- 예: "출고" → 창고간 재고이동 / 고객사 납품 / 차량 적재 / 그 외
|
|
56
|
+
- 예: "마감" → 일마감 / 월마감 / 정산마감 / 작업종료
|
|
57
|
+
- 예: "주문" → 고객 발주 / 내부 작업지시 / 견적 단계
|
|
58
|
+
|
|
59
|
+
**위험도 역설**: 일반적으로 들리는 업무 용어(출고/입고/재고/주문/마감/등록 등)일수록 더 의심. 낯선 용어는 자연스럽게 의문이 생기지만, 익숙한 용어는 모두가 안다고 착각함.
|
|
60
|
+
|
|
61
|
+
처리:
|
|
62
|
+
- **자동 매핑 금지**
|
|
63
|
+
- **사용자에게 즉시 확인** — "이 단어가 시스템상 어떤 동작을 가리키는지"
|
|
64
|
+
- **후보 나열 금지** — Claude 가 추측한 후보를 제시하면 사용자가 그 안에서만 고르게 가둠. 후보는 사용자가 답하게 둘 것
|
|
@@ -1,51 +1,55 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @simplysm/* v14 행동 지침
|
|
2
2
|
|
|
3
3
|
Claude 에이전트가 반드시 지켜야 할 행동 지침이다. (@simplysm/\* v14 포함시)
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 코드 위치 원칙
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
기본 위치는 **클라이언트**. 서버(`service-server`)는 다음 두 경우에만 둔다:
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
9
|
+
- **보안**: 클라이언트에 노출 불가한 자격증명/키, 권한 우회 위험, 외부에 직접 노출하면 안 되는 연산.
|
|
10
|
+
- **클라이언트 미지원**: 브라우저/모바일 런타임에서 실행 불가한 기능(특정 네이티브 API, 서버 측 자원 접근 등).
|
|
11
|
+
|
|
12
|
+
ORM 호출, 파일 변환, 비즈니스 로직 등은 위 두 사유에 해당하지 않는 한 클라이언트 코드에 직접 둔다. "서버에 두는 게 관행"이라는 이유로 service 로 이관하지 않는다.
|
|
13
|
+
|
|
14
|
+
## CLAUDE.md 명령어 표기
|
|
15
|
+
|
|
16
|
+
`CLAUDE.md` 작성 시, 검증 명령은 다음 역할로 표기한다.
|
|
17
|
+
|
|
18
|
+
- **기본 검증 (평소 사용)**: `pnpm check --fix` — typecheck + lint 일괄, 자동 수정 포함.
|
|
19
|
+
- **보조**: `pnpm typecheck`, `pnpm lint` — `pnpm check` 에서 문제 났을 때 각각 따로 보기 위함. 단독 사용은 회피.
|
|
11
20
|
|
|
12
21
|
## 개발 매뉴얼
|
|
13
22
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
트리거 조건이 처음 충족될 때 해당 자료를 Read.
|
|
24
|
+
|
|
25
|
+
| 트리거 | 매뉴얼 |
|
|
26
|
+
| ------------------------------------------------------- | ------------------------------------------------------ |
|
|
27
|
+
| 클라이언트 코드(앱·`@simplysm/angular`) 작성 — 항상 | [client-rules.md](./manuals/client-rules.md) |
|
|
28
|
+
| 화면 컴포넌트(`<domain>.<역할>.ts`) 작성/수정 | [client-component.md](./manuals/client-component.md) |
|
|
29
|
+
| `sd-crud-list` / `sd-crud-detail` 채택한 목록·단건 화면 | [client-crud.md](./manuals/client-crud.md) |
|
|
30
|
+
| 클라이언트 데모 컴포넌트 작성 | [client-demo.md](./manuals/client-demo.md) |
|
|
31
|
+
| `<sd-tab>` 사용 | [client-tab.md](./manuals/client-tab.md) |
|
|
32
|
+
| 새 앱 부트스트랩 또는 새 서비스·마스터 데이터 추가 | [client-setup.md](./manuals/client-setup.md) |
|
|
33
|
+
| DB 스키마 정의 또는 ORM 쿼리 작성 | [orm.md](./manuals/orm.md) |
|
|
34
|
+
| 이종 엔티티를 한 목록으로 합쳐 표시 (UNION) | [orm-union.md](./manuals/orm-union.md) |
|
|
19
35
|
|
|
20
36
|
## 패키지 인덱스
|
|
21
37
|
|
|
22
|
-
- **angular** —
|
|
23
|
-
- **capacitor-plugin-auto-update** —
|
|
24
|
-
- **capacitor-plugin-file-system** —
|
|
25
|
-
- **capacitor-plugin-intent** — Android
|
|
26
|
-
- **capacitor-plugin-usb-storage** — Android USB
|
|
27
|
-
- **core-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- **
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- **
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- 로거(consola)
|
|
41
|
-
- worker_threads 추상화
|
|
42
|
-
- **excel** — xlsx 파일 읽기/쓰기
|
|
43
|
-
- **lint** — 자체 ESLint 플러그인 + recommended 프리셋
|
|
44
|
-
- **orm-common** — DB 비종속 ORM 코어(쿼리 빌더·표현식·스키마·DDL)
|
|
45
|
-
- **orm-node** — Node DB 드라이버 연결(mssql/mysql/postgresql)
|
|
46
|
-
- **sd-claude** — 소비 앱에 Claude Code 셋업을 npm 으로 배포
|
|
47
|
-
- **sd-cli** — 모노레포 빌드/배포 오케스트레이터(tsc/esbuild/ngtsc/Capacitor/Electron)
|
|
48
|
-
- **service-client** — 서비스 서버 호출 클라이언트 SDK
|
|
49
|
-
- **service-common** — 서비스 서버↔클라이언트 프로토콜·타입 계약
|
|
50
|
-
- **service-server** — Fastify 기반 서비스 서버
|
|
51
|
-
- **storage** — FTP/SFTP 원격 파일 스토리지 클라이언트
|
|
38
|
+
- **angular** — Angular 21 standalone/signal/zoneless 기반 업무 클라이언트 UI 라이브러리. `provideSdAngular` 부트스트랩, 폼/시트/CRUD/모달/토스트/사이드바·탑바·드롭다운/공유데이터·칸반 등 화면 컴포넌트와 인프라 프로바이더 제공. 자세히: [apis/angular/README.md](./apis/angular/README.md)
|
|
39
|
+
- **capacitor-plugin-auto-update** — Android Capacitor 앱에서 APK 자동 업데이트와 APK 설치 권한·버전 조회. 자세히: [apis/capacitor-plugin-auto-update/README.md](./apis/capacitor-plugin-auto-update/README.md)
|
|
40
|
+
- **capacitor-plugin-file-system** — Capacitor 모바일/웹 파일 시스템 접근(권한·경로·디렉토리·파일 IO). 자세히: [apis/capacitor-plugin-file-system/README.md](./apis/capacitor-plugin-file-system/README.md)
|
|
41
|
+
- **capacitor-plugin-intent** — Android 인텐트 브로드캐스트 송수신 및 `startActivityForResult` 연동(산업용 스캐너·PDA·외부 결제 등). 자세히: [apis/capacitor-plugin-intent/README.md](./apis/capacitor-plugin-intent/README.md)
|
|
42
|
+
- **capacitor-plugin-usb-storage** — Android/Browser 에서 USB Mass Storage 장치 목록·권한·디렉토리/파일 읽기. 자세히: [apis/capacitor-plugin-usb-storage/README.md](./apis/capacitor-plugin-usb-storage/README.md)
|
|
43
|
+
- **core-browser** — 브라우저 전용. `Element`/`HTMLElement` 프로토타입 확장, DOM 탐색·포커스·레이아웃 보정, 클립보드/측정, 파일 다이얼로그·다운로드, 진행률 fetch, IndexedDB 키/값 저장소와 가상 파일시스템. 자세히: [apis/core-browser/README.md](./apis/core-browser/README.md)
|
|
44
|
+
- **core-common** — 공통 유틸리티(타입·에러·큐·이벤트·변환·확장 메서드·환경변수). simplysm 모든 패키지의 공용 기반. 자세히: [apis/core-common/README.md](./apis/core-common/README.md)
|
|
45
|
+
- **core-node** — Node 전용 IO/경로/프로세스/감시/consola/worker_threads 래퍼(`fsx`, `pathx`, `cpx`, `FsWatcher`, `setupConsola`, `Worker`/`createWorker`). 자세히: [apis/core-node/README.md](./apis/core-node/README.md)
|
|
46
|
+
- **excel** — xlsx 워크북을 열어 셀·시트·스타일·조건부서식·이미지를 읽고 쓰거나, Zod 스키마 기반 레코드 입출력. 자세히: [apis/excel/README.md](./apis/excel/README.md)
|
|
47
|
+
- **lint** — ESLint flat config 작성 시 `@simplysm/lint/eslint-recommended` 프리셋 또는 `@simplysm/lint/eslint-plugin` 개별 규칙 import. 자세히: [apis/lint/README.md](./apis/lint/README.md)
|
|
48
|
+
- **orm-common** — Dialect 독립 ORM 코어. `DbContext` 서브클래싱 + Table/View/Procedure 빌더 + `expr` AST + `Queryable` 체이닝으로 SQL 을 만들고 dialect QueryBuilder 로 렌더. 자세히: [apis/orm-common/README.md](./apis/orm-common/README.md)
|
|
49
|
+
- **orm-node** — Node 환경에서 `DbContext` 를 MSSQL/MySQL/PostgreSQL 실 연결에 붙이는 어댑터(`createOrm`), raw SQL/bulk insert (`createDbConn`). 자세히: [apis/orm-node/README.md](./apis/orm-node/README.md)
|
|
50
|
+
- **sd-claude** — `.claude/` 자산 배포 및 `sd-claude` CLI 만 제공. 라이브러리 코드 API 없음(npm 배포 전용). 자세히: [apis/sd-claude/README.md](./apis/sd-claude/README.md)
|
|
51
|
+
- **sd-cli** — `sd.config.ts` 작성 타입, Vitest 의 Angular AOT plugin(`sdAngularPlugin`), TS 패키지 증분 컴파일 엔진(`SdTsCompiler`). 자세히: [apis/sd-cli/README.md](./apis/sd-cli/README.md)
|
|
52
|
+
- **service-client** — `@simplysm/service-server` 와 WebSocket 으로 통신하는 클라이언트. RPC·이벤트 구독·파일 업/다운로드·원격 ORM 실행을 단일 `ServiceClient` 에서 제공(Node/브라우저 공용). 자세히: [apis/service-client/README.md](./apis/service-client/README.md)
|
|
53
|
+
- **service-common** — 서버/클라이언트가 공유하는 서비스 프로토콜·메시지·서비스 인터페이스·앱 구조·이벤트 정의. 자세히: [apis/service-common/README.md](./apis/service-common/README.md)
|
|
54
|
+
- **service-server** — Fastify + WebSocket 위에 서비스(`defineService`)·JWT 인증(`auth`)·빌트인 ORM/AutoUpdate/AppStructure·V1 레거시 호환을 부트스트랩(`createServiceServer().listen()`). 자세히: [apis/service-server/README.md](./apis/service-server/README.md)
|
|
55
|
+
- **storage** — FTP/FTPS/SFTP 원격 스토리지에 동일 인터페이스(`StorageClient`)로 파일 읽기/쓰기/관리. 자세히: [apis/storage/README.md](./apis/storage/README.md)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# @simplysm/angular
|
|
2
|
+
|
|
3
|
+
Angular 21 기반 클라이언트 UI 라이브러리. 폼/리스트/시트/모달/토스트 등 업무화면 컴포넌트와 부트스트랩 프로바이더를 모두 포함한다. 모든 컴포넌트는 standalone, signal/zoneless 기반.
|
|
4
|
+
|
|
5
|
+
## 사용 트리거 인덱스
|
|
6
|
+
|
|
7
|
+
- **앱 부트스트랩** — `provideSdAngular`, `SdAngularConfigProvider`, `setupBgTheme`, `SdSystemLogProvider`. 앱 부트스트랩/루트 컴포넌트에서 1회.
|
|
8
|
+
- **테마 (`SdThemeProvider`, `SdThemeSelector`)** — dark/fontSize 토글. `provideSdAngular`가 localStorage 자동 연동.
|
|
9
|
+
- **라우팅/페이지 컨텍스트** — 자세히: [routing.md](./routing.md). `SdRouterLink`, `injectViewTypeSignal`, `setupCanDeactivate` 등.
|
|
10
|
+
- **앱 구조/메뉴/권한** — 자세히: [app-structure.md](./app-structure.md). `SdAppStructureProvider`, `injectPermsSignal`, `SdMenu`.
|
|
11
|
+
- **모달** — 자세히: [modal.md](./modal.md). `SdModalProvider`, `SdModal`, `SdPromptModal`/`SdConfirmModal`, `SdAddressSearchModal`.
|
|
12
|
+
- **토스트** — 자세히: [toast.md](./toast.md). `SdToastProvider`(info/success/warning/danger/notify/try).
|
|
13
|
+
- **버튼류** — 자세히: [buttons.md](./buttons.md). `SdButton`, `SdAnchor`, `SdAdditionalButton`, `SdModalSelectButton`.
|
|
14
|
+
- **입력/폼 컨트롤** — 자세히: [forms.md](./forms.md). `SdForm`, `SdTextfield`/`SdTextarea`/`SdNumpad`/`SdRange`/`SdDateRangePicker`, `SdCheckbox`/`SdSwitch`/`SdCheckboxGroup(Item)`.
|
|
15
|
+
- **드롭다운/셀렉트** — 자세히: [select-dropdown.md](./select-dropdown.md). `SdDropdown(Popup)`, `SdSelect(Item|Button)`.
|
|
16
|
+
- **레이아웃 (사이드바/탑바)** — 자세히: [layout.md](./layout.md). `SdSidebar*`, `SdTopbar*`.
|
|
17
|
+
- **시트(테이블)** — 자세히: [sheet.md](./sheet.md). `SdSheet`, `SdSheetColumn`, `SdSheetColumnCellTemplate`, `SdSheetConfig*`.
|
|
18
|
+
- **CRUD 화면 골격** — 자세히: [crud.md](./crud.md). `SdBaseContainer`, `SdCrudList`, `SdCrudDetail`.
|
|
19
|
+
- **서버 공유 데이터 (`SharedData*` + 선택 컨트롤)** — 자세히: [shared-data.md](./shared-data.md). `SdSharedDataProvider`, `SdSharedDataSelect(Button|List)`, `matchesSearchText`.
|
|
20
|
+
- **선택/확장/정렬 매니저 훅** — 자세히: [selection-managers.md](./selection-managers.md). `useSelectionManager`, `useExpandingManager`, `useSortingManager`.
|
|
21
|
+
- **칸반 보드** — 자세히: [kanban.md](./kanban.md). `SdKanbanBoard`, `SdKanban`, `SdKanbanLane`.
|
|
22
|
+
- **시각 컴포넌트 (라벨/노트/프로그레스/달력/바코드/차트)** — 자세히: [visual.md](./visual.md).
|
|
23
|
+
- **인프라 프로바이더 (서비스 클라이언트/파일 다이얼로그/스토리지/시스템 설정/인쇄)** — 자세히: [infrastructure.md](./infrastructure.md).
|
|
24
|
+
- **`SdBusyContainer` / `SdBusyProvider`** — busy 오버레이. `provideSdAngular`가 라우터 navigation 동안 globalBusyCount 자동 증감.
|
|
25
|
+
- **`SdPermissionTable`** — `SdPermission<TModule>[]` 트리를 `Record<string, boolean>` 모델로 편집하는 권한표.
|
|
26
|
+
- **`SdStatePreset` / `SdStatePresetDef`** — 화면 상태(`state`)를 키별 프리셋으로 저장/복원. `SdSystemConfigProvider` 활용.
|
|
27
|
+
- **`SdTiptapEditor`** — Tiptap 기반 리치 에디터. `value`, `extensions`, `validatorFn`.
|
|
28
|
+
- **유틸 디렉티브/파이프 등** — 인라인 항목 참조.
|
|
29
|
+
- **유틸 타입/함수** — 인라인 항목 참조.
|
|
30
|
+
|
|
31
|
+
## 앱 부트스트랩
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
bootstrapApplication(AppComponent, {
|
|
35
|
+
providers: [provideSdAngular({ clientName: "myapp" }), provideRouter(routes)],
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- `provideSdAngular({ clientName })`: zoneless CD, NgIcons config, 글로벌 에러 핸들러(`SdGlobalErrorHandlerPlugin`), `SdOptionEventPlugin`(이벤트 `.capture`/`.passive`/`.once`), 테마 dark/fontSize ↔ localStorage 동기화, SwUpdate 폴링, Router navigation 중 `SdBusyProvider.globalBusyCount` 자동 ±1.
|
|
40
|
+
- `SdAngularConfigProvider.clientName`: localStorage 키 prefix·service client name 으로 사용. `provideSdAngular` 옵션에서 설정됨.
|
|
41
|
+
- `SdSystemLogProvider.writeFn?`: severity별 로그 후크 등록(서버 전송 등). 자동으로 console에도 출력.
|
|
42
|
+
- `setupBgTheme({ theme?, lightness? })`: 컴포넌트 constructor 내에서 호출. body `--background-color` CSS 변수 토글, 파괴 시 자동 복원.
|
|
43
|
+
|
|
44
|
+
## 테마
|
|
45
|
+
|
|
46
|
+
- `SdThemeProvider`: `dark = signal<boolean>`, `fontSize = signal<number>` (presets `[12,14,16,20,24,28]`), `increaseFontSize()`/`decreaseFontSize()`. dark면 body에 `sd-theme-dark` 클래스, fontSize는 html `font-size` 적용. `provideSdAngular`가 localStorage 영속화.
|
|
47
|
+
- `SdThemeSelector`: 토글 UI 컴포넌트.
|
|
48
|
+
|
|
49
|
+
## SdBusyContainer / SdBusyProvider
|
|
50
|
+
|
|
51
|
+
`<sd-busy-container [busy] [message] [type] [progressPercent]>`. type: `"spinner" | "bar" | "cube"`. `busy=true` 동안 keydown 차단.
|
|
52
|
+
`SdBusyProvider.globalBusyCount = signal(0)`. > 0이면 body 전면 오버레이.
|
|
53
|
+
|
|
54
|
+
## SdPermissionTable
|
|
55
|
+
|
|
56
|
+
`<sd-permission-table [items] [(value)] [disabled]>`. `items: SdPermission<TModule>[]` (`SdAppStructureUtils.getPermissions` 결과), `value: Record<string, boolean>` (코드.use|edit 형식).
|
|
57
|
+
|
|
58
|
+
## SdStatePreset
|
|
59
|
+
|
|
60
|
+
`<sd-state-preset [key] [(state)] [size]>`. `state` 를 `SdSystemConfigProvider` 키 `key` 아래 프리셋 배열로 저장/로드. 별 아이콘 클릭 → 이름 입력 모달 → 저장.
|
|
61
|
+
|
|
62
|
+
## SdTiptapEditor
|
|
63
|
+
|
|
64
|
+
`<sd-tiptap-editor [(value)] [disabled] [readonly] [required] [placeholder] [validatorFn] [extensions]>`. value=HTML string. `extensions?: AnyExtension[]` 으로 Tiptap 확장 주입.
|
|
65
|
+
|
|
66
|
+
## 유틸 디렉티브/파이프
|
|
67
|
+
|
|
68
|
+
이벤트·표시 보조용. constructor injection 또는 셀렉터 attach.
|
|
69
|
+
|
|
70
|
+
- `SdOptionEventPlugin`: `(click.capture)`, `(scroll.passive)`, `(touchmove.capture.passive)`, `(transitionend.once)` 등 `.capture/.passive/.once` 변형 이벤트 바인딩 활성화. `provideSdAngular`로 자동 등록.
|
|
71
|
+
- `SdResizeDirective` (`[sdResize]`): RO 기반 size 변화 emit (`{ heightChanged, widthChanged, target, contentRect }`).
|
|
72
|
+
- `SdIntersectionDirective` (`[sdIntersection]`): IO entry emit.
|
|
73
|
+
- `SdEvents`: 다양한 native event의 `.capture`/`.passive`/`.once` output 디렉티브 (예: `(scroll.passive)`, `(touchstart.passive)`).
|
|
74
|
+
- `SdCommandDirective`: `[sdRefreshCommand]`/`[sdSaveCommand]`/`[sdInsertCommand]` — Ctrl+Alt+L/Ctrl+S/Insert 단축키 emit. 최상위 열린 모달 또는 모달이 없을 때만 처리.
|
|
75
|
+
- `SdRipple` (`[sdRipple]="bool"`) / `setupRipple(enableFn?)`: pointerdown 시 원형 ripple.
|
|
76
|
+
- `SdShowEffect` (`[sdShowEffect]="bool"` + `[sdShowEffectType]="'l2r'|'t2b'"`) / `setupRevealOnShow`: viewport intersection 시 fade-in.
|
|
77
|
+
- `SdInvalid` (`[sdInvalid]="msg"`) / `setupInvalid(getMsg)`: hidden input의 customValidity 로 form 검증 + 표시 인디케이터.
|
|
78
|
+
- `SdTypedTemplate` (`<ng-template [typed]>`): template context 타입 추론용 (typeToken).
|
|
79
|
+
- `SdItemOfTemplate` (`<ng-template [itemOf]>`, ctx `{ $implicit, item, index, depth }`) — 컬렉션 컴포넌트 항목 템플릿.
|
|
80
|
+
- `FormatPipe` (`{{ v | format:fmt }}`): `DateTime`/`DateOnly`는 `toFormatString(fmt)`, string은 `X` 자리표시(예: `'XXX-XXXX-XXXX'`).
|
|
81
|
+
- `SdGap`: spacer. `height|width|widthEm` 또는 `heightPx|widthPx`. 단위 키: `xxs|xs|sm|default|lg|xl|xxl`.
|
|
82
|
+
- `SdCollapse [open]` / `SdCollapseIcon`: 접힘.
|
|
83
|
+
- `SdTab [(value)]`/`SdTabItem [value]`: 탭.
|
|
84
|
+
- `SdList`/`SdListItem`: 리스트. `SdListItem` `layout: "accordion"|"flat"`, `selectedIcon`, `contentStyle/Class`.
|
|
85
|
+
- `SdPagination [(currentPage)] [totalPageCount] [visiblePageCount=10]`.
|
|
86
|
+
- `mark(signal)`: array/object signal의 in-place mutation 후 shallow copy로 trigger.
|
|
87
|
+
- `setSafeStyle(renderer, el, partial)`: renderer.setStyle 일괄.
|
|
88
|
+
- `setupModelHook(model, canFn)`: WritableSignal의 set/update를 `canFn(value) -> boolean | Promise<boolean>`로 가로채기. constructor 내에서 호출.
|
|
89
|
+
|
|
90
|
+
## 유틸 타입/기타
|
|
91
|
+
|
|
92
|
+
- `DirectiveInputSignals<T>`: 컴포넌트의 InputSignal 프로퍼티만 추출(`{ name: T }`). undefined 필드는 optional.
|
|
93
|
+
- `UndefToOptional<T>`: undefined 포함 필드를 optional 로 변환.
|
|
94
|
+
- `WithOptional<T, K>`: 특정 키만 optional 로.
|
|
95
|
+
- `SelectModalOutputResult<TKey> = { selectedKeys: TKey[] }`: 모달 선택 결과.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# @simplysm/angular — app-structure
|
|
2
|
+
|
|
3
|
+
서버의 `AppStructureService`에서 받은 메뉴/권한 트리(`AppStructureItem<TModule>[]`)를 클라이언트 측에서 사용 가능 형태로 변환.
|
|
4
|
+
|
|
5
|
+
## `SdAppStructureProvider<TModule>`
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
const sas = inject<SdAppStructureProvider<MyModule>>(SdAppStructureProvider);
|
|
9
|
+
await sas.initialize("main"); // 서비스 키 → AppStructureService.getItems()
|
|
10
|
+
sas.usableModules.set(myModules); // 활성 모듈
|
|
11
|
+
sas.permRecord.set({ "order.list.use": true });
|
|
12
|
+
|
|
13
|
+
sas.usableMenus(); // Signal<SdMenu[]> (트리)
|
|
14
|
+
sas.usableFlatMenus(); // Signal<SdFlatMenu[]> (flat)
|
|
15
|
+
sas.getTitleByFullCode("order.list");
|
|
16
|
+
sas.getPermsByFullCode(["order.list"], ["use","edit"]);
|
|
17
|
+
sas.getPermissionsByStructure(items, codeChain);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
내부적으로 `SdAppStructureUtils.getMenus/getFlatMenus/getPermissions/...` 위임.
|
|
21
|
+
|
|
22
|
+
## `injectPermsSignal<K>(viewCodes, keys)`
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
const perms = injectPermsSignal(["order.list"], ["use", "edit"] as const);
|
|
26
|
+
perms(); // 갖고 있는 권한만 필터된 배열
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 타입
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
interface SdMenu { title; codeChain: string[]; url?; icon?; children? }
|
|
33
|
+
interface SdFlatMenu { titleChain; codeChain; modulesChain: TModule[][] }
|
|
34
|
+
interface SdPermission { title; codeChain; modules; perms: ("use"|"edit")[]?; children? }
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## `SdAppStructureUtils` 정적 메서드
|
|
38
|
+
|
|
39
|
+
- `getMenus(items, codeChain, usableModules, permRecord)` — `isNotMenu` 제외, 모듈 활성·`.use` 권한 통과한 항목.
|
|
40
|
+
- `getFlatMenus(items, usableModules, permRecord)` — 평탄화 + 부모 modules 누적 검사.
|
|
41
|
+
- `getPermissions(items, codeChain, usableModules)` — 권한 트리 (`SdPermissionTable` 입력용).
|
|
42
|
+
- `getFlatPermissions(items, usableModules)` — `@simplysm/service-common` 재노출.
|
|
43
|
+
- `getTitleByFullCode`, `getItemChainByFullCode`, `getPermsByFullCode`.
|
|
44
|
+
|
|
45
|
+
## 주의
|
|
46
|
+
|
|
47
|
+
- `permRecord` 키는 `"<code>.<perm>"` (예: `"order.list.use"`).
|
|
48
|
+
- 그룹 메뉴는 자식 중 하나라도 표시 가능해야 노출.
|
|
49
|
+
- Leaf 가 `perms`를 가지면 `.use` 권한 필수, `perms`가 없거나 권한 자체가 없으면 통과.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @simplysm/angular — buttons
|
|
2
|
+
|
|
3
|
+
## `<sd-button>`
|
|
4
|
+
|
|
5
|
+
`type: "button"|"submit" = "button"`, `theme`(`primary|secondary|info|success|warning|danger|gray|blue-gray|link|link-<theme>|link-rev`), `inline`, `inset`, `size: "sm"|"lg"`, `disabled`, `buttonStyle`, `buttonClass`. content projection.
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<sd-button [theme]="'primary'" (click)="save()">저장</sd-button>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## `<sd-anchor>`
|
|
12
|
+
|
|
13
|
+
링크형 클릭 요소. `disabled`, `theme`(`primary|secondary|...|blue-gray`, default `primary`). tabindex 자동.
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<sd-anchor [theme]="'danger'" (click)="del()">삭제</sd-anchor>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## `<sd-additional-button>`
|
|
20
|
+
|
|
21
|
+
본문 + 우측 부가 버튼 슬롯. `size`.
|
|
22
|
+
|
|
23
|
+
## `<sd-modal-select-button>`
|
|
24
|
+
|
|
25
|
+
검색 모달을 띄워 값을 선택받는 입력 위젯. `setupInvalid` 로 required 검증 내장.
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<sd-modal-select-button
|
|
29
|
+
[modal]="orderSelectModalInfo" <!-- SdSelectModalInfo<SdSelectModal<TKey>> -->
|
|
30
|
+
[(value)]="selectedKey" <!-- single 모드: TKey | multi 모드: TKey[] -->
|
|
31
|
+
[selectMode]="'single'"
|
|
32
|
+
[modalOptions]="{ resizable: true }"
|
|
33
|
+
[required]="true"
|
|
34
|
+
[disabled]="false"
|
|
35
|
+
[searchIcon]="customIcon">
|
|
36
|
+
{{ displayLabel() }}
|
|
37
|
+
</sd-modal-select-button>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- `SdSelectModal<TKey>` = `SdModalContentDef<SelectModalOutputResult<TKey>>` + `selectMode: InputSignal<"single"|"multi"|undefined>` + `selectedKeys: InputSignal<TKey[]>`.
|
|
41
|
+
- `SdSelectModalInfo<T>` = `SdModalInfo<T, "selectMode"|"selectedKeys">`.
|
|
42
|
+
- erase 아이콘 클릭 시 `value` 초기화(`undefined` 또는 `[]`).
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @simplysm/angular — crud
|
|
2
|
+
|
|
3
|
+
CRUD 화면 골격. 상단 명령바·필터·toolbar·페이지 페이저·시트를 갖춘 리스트 화면(`SdCrudList`)과 디테일 화면(`SdCrudDetail`)과 공통 컨테이너(`SdBaseContainer`).
|
|
4
|
+
|
|
5
|
+
## `<sd-base-container>`
|
|
6
|
+
|
|
7
|
+
페이지/모달 공통 컨테이너. `SdSharedDataProvider.wait()` 완료까지 busy 표시 후 `ready=true`.
|
|
8
|
+
|
|
9
|
+
inputs: `viewType: SdViewType` (required), `restricted`, `initialized`. models: `ready`, `busyCount`. content templates: `#topbarTpl`, `#commandTpl`, `#contentTpl`, `#bottomCommandTpl`.
|
|
10
|
+
|
|
11
|
+
```html
|
|
12
|
+
<sd-base-container [viewType]="vt">
|
|
13
|
+
<ng-template #commandTpl>...</ng-template>
|
|
14
|
+
<ng-template #contentTpl>...</ng-template>
|
|
15
|
+
</sd-base-container>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## `<sd-crud-list<TItem, TKey>>`
|
|
19
|
+
|
|
20
|
+
리스트+페이지+선택+삭제/복원 골격.
|
|
21
|
+
|
|
22
|
+
- 필수 input: `viewType`, `key`, `trackByFn: (TItem) => TKey`.
|
|
23
|
+
- inputs: `selectMode: "single"|"multi"`, `items`, `currDeletedItems`, `totalPageCount`, `itemsPerPage`, `visiblePageCount=10`, `readonly`, `restricted`, `initialized`.
|
|
24
|
+
- models: `ready`, `busyCount`, `selectedKeys: NonNullable<TKey>[]`, `currentPage`, `sorts: SortingDef[]`.
|
|
25
|
+
- outputs: `filterSubmit`, `submit`, `create`, `delete: TItem[]`, `restore: TItem[]`.
|
|
26
|
+
- content templates: `#commandTpl`, `#filterTpl`, `#toolTpl`, `#bottomCommandTpl` + `<sd-sheet-column>` 자식들이 자동으로 sheet 에 전달.
|
|
27
|
+
- 삭제된 아이템은 `text-decoration: line-through`.
|
|
28
|
+
- 모달 컨텍스트면 confirm/cancel 핸들러 자동 (`onModalSelectionConfirmClick`/`onModalSelectionCancelClick`).
|
|
29
|
+
|
|
30
|
+
## `<sd-crud-detail>`
|
|
31
|
+
|
|
32
|
+
단일 레코드 편집.
|
|
33
|
+
|
|
34
|
+
- 필수: `viewType`. inputs: `restricted`, `readonly`, `initialized`. models: `ready`, `busyCount`. output: `submit`. templates: `#commandTpl`, `#contentTpl`, `#bottomCommandTpl`.
|
|
35
|
+
- 저장 버튼 → 내부 `SdForm.requestSubmit()`.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# @simplysm/angular — forms
|
|
2
|
+
|
|
3
|
+
폼 컨테이너 + 입력 컨트롤. 모든 컨트롤은 `value` model 기반. native form validity API 사용 (`SdForm`이 submit 시 reportValidity 호출).
|
|
4
|
+
|
|
5
|
+
## `<sd-form>`
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<sd-form (formSubmit)="onSubmit($event)" (formInvalid)="onInvalid()">
|
|
9
|
+
<sd-textfield [type]="'text'" [(value)]="name" [required]="true" />
|
|
10
|
+
<sd-button [type]="'submit'">저장</sd-button>
|
|
11
|
+
</sd-form>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
- 내부에 hidden submit 버튼 자동 삽입(Enter 키 submit 지원).
|
|
15
|
+
- `requestSubmit()` 메서드 노출.
|
|
16
|
+
- invalid 시 reportValidity → `formInvalid` emit.
|
|
17
|
+
|
|
18
|
+
## `<sd-textfield<K>>`
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<sd-textfield [type]="'number'" [(value)]="qty" [min]="0" [max]="999" [step]="1" />
|
|
22
|
+
<sd-textfield [type]="'date'" [(value)]="dt" />
|
|
23
|
+
<sd-textfield [type]="'format'" [format]="'XXX-XXXX-XXXX'" [(value)]="phone" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`SdTextfieldTypes`: `number→number`, `text|password|color|email|format→string`, `date|month|year→DateOnly`, `datetime|datetime-sec→DateTime`, `time|time-sec→Time`. `sdTextfieldTypes` 배열로 키 목록 enum.
|
|
27
|
+
|
|
28
|
+
주요 input: `value` (model), `type` (required), `placeholder`, `title`, `inputStyle/Class`, `disabled/readonly/required` (booleanAttribute), `min/max/minlength/maxlength`, `pattern`, `validatorFn(value) => string | undefined` (커스텀 메시지), `format`, `step`, `autocomplete`, `minDigits`, `size`, `theme`.
|
|
29
|
+
|
|
30
|
+
## `<sd-textarea>`
|
|
31
|
+
|
|
32
|
+
`[(value)]: string`, `placeholder`, `title`, `minRows=1`, `size`, `validatorFn`, `theme`, `inputStyle/Class`.
|
|
33
|
+
|
|
34
|
+
## `<sd-numpad>`
|
|
35
|
+
|
|
36
|
+
숫자 키패드. `[(value)]: number`, `placeholder`.
|
|
37
|
+
|
|
38
|
+
## `<sd-range<K>>`
|
|
39
|
+
|
|
40
|
+
`type: K` (TextfieldTypes 키), `[(from)]`, `[(to)]: SdTextfieldTypes[K]`, `inputStyle`.
|
|
41
|
+
|
|
42
|
+
## `<sd-date-range-picker>`
|
|
43
|
+
|
|
44
|
+
`[(periodType)]: "일"|"월"|"범위" = "범위"`, `[(from)]: DateOnly`, `[(to)]: DateOnly`.
|
|
45
|
+
|
|
46
|
+
## `<sd-checkbox>` / `<sd-switch>`
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
<sd-checkbox [(value)]="agreed" [theme]="'primary'">동의</sd-checkbox>
|
|
50
|
+
<sd-switch [(value)]="enabled" [size]="'sm'" />
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`value: boolean` (model), `canChangeFn(value) => boolean | Promise<boolean>` — false 면 변경 차단. `radio` (checkbox만), `disabled`, `size`, `inline`, `inset`, `theme`, `contentStyle` (checkbox).
|
|
54
|
+
|
|
55
|
+
## `<sd-checkbox-group<T>>` / `<sd-checkbox-group-item<T>>`
|
|
56
|
+
|
|
57
|
+
`<sd-checkbox-group [(value)]="selected"> <sd-checkbox-group-item [value]="opt">{{opt}}</sd-checkbox-group-item> ... </sd-checkbox-group>`. value: `T[]` (다중).
|
|
58
|
+
|
|
59
|
+
## 검증
|
|
60
|
+
|
|
61
|
+
- 컨트롤 내부에서 `setupInvalid(getMessage)` 사용 (cf. directives). 빈 문자열이면 valid.
|
|
62
|
+
- `validatorFn` 은 컨트롤 입력값을 검사해 메시지 반환.
|
|
63
|
+
- `SdForm` submit 시 자동으로 reportValidity 호출 + invalid 인디케이터 표시.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @simplysm/angular — infrastructure
|
|
2
|
+
|
|
3
|
+
앱 인프라 프로바이더(전부 `providedIn: "root"` 또는 single instance).
|
|
4
|
+
|
|
5
|
+
## `SdServiceClientFactoryProvider`
|
|
6
|
+
|
|
7
|
+
`@simplysm/service-client` 의 `ServiceClient` 를 키별로 보관.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
const factory = inject(SdServiceClientFactoryProvider);
|
|
11
|
+
await factory.connectAsync("main", { host, port, ssl }); // 옵션 생략 시 location 기반
|
|
12
|
+
const client = factory.get("main");
|
|
13
|
+
await factory.closeAsync("main");
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- 같은 키 재연결 금지(`이미 연결된`/`이미 연결이 끊긴`). 한 번 close된 키는 재사용 불가.
|
|
17
|
+
- request/response progress → `SdToastProvider.info(message, true)` 로 진행률 토스트 자동.
|
|
18
|
+
- destroy 시 모든 클라이언트 close.
|
|
19
|
+
|
|
20
|
+
## `SdFileDialogProvider`
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
const file = await inject(SdFileDialogProvider).showAsync();
|
|
24
|
+
const files = await inject(SdFileDialogProvider).showAsync(true, "image/*");
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
cancel/empty → `undefined`. 동적 `<input type=file>` 생성/제거.
|
|
28
|
+
|
|
29
|
+
## `SdLocalStorageProvider<T>`
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
const ls = inject<SdLocalStorageProvider<Schema>>(SdLocalStorageProvider);
|
|
33
|
+
ls.set("theme", "dark");
|
|
34
|
+
const v = ls.get("theme");
|
|
35
|
+
ls.remove("theme");
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
키는 `<clientName>.<key>` 로 prefix. JSON 직렬화.
|
|
39
|
+
|
|
40
|
+
## `SdSystemConfigProvider<T>`
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
const cfg = inject<SdSystemConfigProvider<Schema>>(SdSystemConfigProvider);
|
|
44
|
+
cfg.fn = { set: (k, v) => svc.set(k, v), get: (k) => svc.get(k) }; // 옵션: 서버 연동
|
|
45
|
+
await cfg.setAsync("sheet.order", config);
|
|
46
|
+
const v = await cfg.getAsync("sheet.order");
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`fn` 미설정이면 `SdLocalStorageProvider` 폴백. SdSheet/SdModal/SdStatePreset 등이 자동 사용.
|
|
50
|
+
|
|
51
|
+
## `injectSdSystemConfigResource<T>({ key })`
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
const r = injectSdSystemConfigResource<MyConfig>({ key: keySignal });
|
|
55
|
+
r.value(); r.isLoading(); r.status();
|
|
56
|
+
r.set(v); r.update((prev) => ...); r.reload(); r.hasValue();
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
키는 `<elementTagName>.<key()>` 로 prefix. set 호출 시 화면 즉시 갱신 + queueMicrotask 로 비동기 영속화 (실패 시 ErrorHandler).
|
|
60
|
+
|
|
61
|
+
## `SdGlobalErrorHandlerPlugin`
|
|
62
|
+
|
|
63
|
+
`provideSdAngular`가 `ErrorHandler` 로 등록. 처리되지 않은 Error/PromiseRejectionEvent/ErrorEvent 캐치 → `SdSystemLogProvider.writeAsync("error", ...)` + 전면 오버레이 + ApplicationRef destroy. 클릭 시 reload(prod는 hash `/` 로 리셋).
|
|
64
|
+
|
|
65
|
+
## `SdOptionEventPlugin`
|
|
66
|
+
|
|
67
|
+
`provideSdAngular`가 `EVENT_MANAGER_PLUGINS` 로 등록. 이벤트명에 `.capture` / `.passive` / `.once` 접미 허용 (예: `(scroll.passive)`, `(click.capture.once)`).
|
|
68
|
+
|
|
69
|
+
## `SdPrintProvider`
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
await print.printAsync({ type: MyTpl, inputs: { ... } }, { size: "A4", margin: "0" });
|
|
73
|
+
const bytes = await print.getPdfBufferAsync({ type, inputs }, { orientation: "portrait", pageSize: "a4" });
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- 템플릿 컴포넌트는 `SdPrint` 구현 필요 (`initialized: Signal<boolean>`, optional `_optionalPrintInputs`).
|
|
77
|
+
- `SdPrintInput<T, X>` = `{ type; inputs: WithOptional<DirectiveInputSignals<T> 제외..., optional 키들> }`.
|
|
78
|
+
- print: `@page` + `@media print` 스타일 임시 주입 → `initialized=true` 및 이미지 로드 대기 → `window.print()`.
|
|
79
|
+
- PDF: `.page` 자식이 있으면 페이지별, 없으면 단일 페이지. `htmlToImage.toCanvas` (pixelRatio=4) → `jspdf.addImage`.
|
|
80
|
+
- 두 메서드 모두 진행 동안 `SdBusyProvider.globalBusyCount` ±1.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# @simplysm/angular — kanban
|
|
2
|
+
|
|
3
|
+
드래그·드롭 칸반 보드.
|
|
4
|
+
|
|
5
|
+
```html
|
|
6
|
+
<sd-kanban-board [(selectedValues)]="selected" (drop)="onDrop($event)">
|
|
7
|
+
<sd-kanban-lane [value]="laneA" [busy]="loading">
|
|
8
|
+
<sd-kanban [value]="card" [draggable]="true" [selectable]="true">{{ card.title }}</sd-kanban>
|
|
9
|
+
</sd-kanban-lane>
|
|
10
|
+
</sd-kanban-board>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## `<sd-kanban-board<L, T>>`
|
|
14
|
+
|
|
15
|
+
- `selectedValues = model<T[]>([])`.
|
|
16
|
+
- `drop = output<SdKanbanBoardDropInfo<L, T>>` (`{ sourceKanbanValue?, targetLaneValue?, targetKanbanValue? }`).
|
|
17
|
+
- `dragKanban = signal<SdKanbanDragRef | undefined>` — 자식이 드래그 시작 시 설정.
|
|
18
|
+
|
|
19
|
+
## `<sd-kanban-lane<L, T>>`
|
|
20
|
+
|
|
21
|
+
`value: L`, `busy`, `useCollapse`, `collapse` (model). drop target 구현.
|
|
22
|
+
|
|
23
|
+
## `<sd-kanban<L, T>>`
|
|
24
|
+
|
|
25
|
+
`value: T`, `draggable`, `selectable`, `contentClass`. drag ref + drop target 둘 다 구현(카드 위에 드롭 가능).
|
|
26
|
+
|
|
27
|
+
## 타입
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
interface SdKanbanBoardDropInfo<L, T> { sourceKanbanValue?: T; targetLaneValue?: L; targetKanbanValue?: T }
|
|
31
|
+
interface SdKanbanDragRef<_L, T> { value(): T | undefined; heightOnDrag(): number }
|
|
32
|
+
interface SdKanbanDropTarget<L, T> { targetLaneValue(): L | undefined; targetKanbanValue?(): T | undefined }
|
|
33
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# @simplysm/angular — layout
|
|
2
|
+
|
|
3
|
+
## 사이드바
|
|
4
|
+
|
|
5
|
+
```html
|
|
6
|
+
<sd-sidebar-container>
|
|
7
|
+
<sd-sidebar>
|
|
8
|
+
<sd-sidebar-user [userMenu]="userMenu">유저영역</sd-sidebar-user>
|
|
9
|
+
<sd-sidebar-menu [menus]="menus" [layout]="'accordion'" [getMenuIsSelectedFn]="isSel" />
|
|
10
|
+
</sd-sidebar>
|
|
11
|
+
<ng-content />
|
|
12
|
+
</sd-sidebar-container>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- `SdSidebarContainer`: `toggle = signal(false)`. Router NavigationStart 시 자동 false.
|
|
16
|
+
- `SdSidebar`: 부모 container의 toggle 추종.
|
|
17
|
+
- `SdSidebarMenu`: `menus: SdMenu[]`, `layout: "accordion"|"flat"`, `getMenuIsSelectedFn?`.
|
|
18
|
+
- `SdSidebarUser`: `userMenu?: SdSidebarUserMenu`.
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
interface SdSidebarUserMenu { /* see source */ }
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 탑바
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<sd-topbar-container>
|
|
28
|
+
<sd-topbar [sidebarContainer]="sc">
|
|
29
|
+
<sd-topbar-menu [menus]="menus" />
|
|
30
|
+
<sd-topbar-user [menus]="userMenus" />
|
|
31
|
+
</sd-topbar>
|
|
32
|
+
</sd-topbar-container>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- `SdTopbar`: `sidebarContainer?: SdSidebarContainer` 입력(미지정 시 inject 시도). 햄버거 버튼이 `sc.toggle` 토글.
|
|
36
|
+
- `SdTopbarMenu`: `menus: SdMenu[]`, `getMenuIsSelectedFn?`.
|
|
37
|
+
- `SdTopbarUser`: `menus: SdTopbarUserMenu[]` (required).
|
|
38
|
+
|
|
39
|
+
## 메뉴 데이터
|
|
40
|
+
|
|
41
|
+
`SdMenu` (`./app-structure.md` 참조)을 그대로 입력. 선택 상태는 `getIsMenuSelected(menu, fullPageCode, customFn?)` 또는 `getMenuIsSelectedFn` 으로.
|