@beyondwork/docx-react-component 1.0.0 → 1.0.2
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/README.md +44 -104
- package/package.json +66 -15
- package/src/api/public-types.ts +1 -1
- package/src/compare/diff-engine.ts +530 -0
- package/src/compare/export-redlines.ts +162 -0
- package/src/compare/snapshot.ts +37 -0
- package/src/core/commands/index.ts +1 -1
- package/src/core/state/editor-state.ts +2 -2
- package/src/index.ts +45 -0
- package/src/legal/bookmarks.ts +196 -0
- package/src/legal/cross-references.ts +356 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/runtime/document-runtime.ts +3 -5
- package/src/runtime/table-commands.ts +4 -1
- package/src/runtime/table-schema.ts +17 -2
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/ui/WordReviewEditor.tsx +256 -35
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +2 -2
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +16 -2
- package/.codex/config.toml +0 -5
- package/.corepack/v1/pnpm/10.30.3/.corepack +0 -1
- package/.corepack/v1/pnpm/10.30.3/LICENSE +0 -22
- package/.corepack/v1/pnpm/10.30.3/README.md +0 -240
- package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp +0 -6
- package/.corepack/v1/pnpm/10.30.3/dist/node-gyp-bin/node-gyp.cmd +0 -5
- package/.corepack/v1/pnpm/10.30.3/dist/pnpm.cjs +0 -195400
- package/.corepack/v1/pnpm/10.30.3/dist/pnpmrc +0 -2
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-arm64-2HJ4WGO6.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.darwin-x64-3G3H6IW4.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-arm64-msvc-Q6BARPPB.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/reflink.win32-x64-msvc-J2TZHRQI.node +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.bash +0 -31
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.fish +0 -22
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.ps1 +0 -193
- package/.corepack/v1/pnpm/10.30.3/dist/templates/completion.zsh +0 -27
- package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x64.exe +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/vendor/fastlist-0.3.0-x86.exe +0 -0
- package/.corepack/v1/pnpm/10.30.3/dist/worker.js +0 -10119
- package/.corepack/v1/pnpm/10.30.3/package.json +0 -192
- package/.cursor/mcp.json +0 -7
- package/.github/workflows/ci.yml +0 -35
- package/.mcp.json +0 -7
- package/.openclaw/workspace-state.json +0 -4
- package/.pnpmrc.json +0 -1
- package/.wave-launch.sh +0 -7
- package/.workspace-marker +0 -1
- package/AGENTS.md +0 -78
- package/CHANGELOG.md +0 -177
- package/DESIGN.md +0 -929
- package/HEARTBEAT.md +0 -7
- package/IDENTITY.md +0 -23
- package/SOUL.md +0 -36
- package/TOOLS.md +0 -40
- package/USER.md +0 -17
- package/docs/README.md +0 -107
- package/docs/agents/wave-cont-eval-role.md +0 -36
- package/docs/agents/wave-cont-qa-role.md +0 -52
- package/docs/agents/wave-deploy-verifier-role.md +0 -34
- package/docs/agents/wave-design-role.md +0 -47
- package/docs/agents/wave-documentation-role.md +0 -34
- package/docs/agents/wave-infra-role.md +0 -34
- package/docs/agents/wave-integration-role.md +0 -37
- package/docs/agents/wave-launcher-role.md +0 -41
- package/docs/agents/wave-orchestrator-role.md +0 -52
- package/docs/agents/wave-planner-role.md +0 -39
- package/docs/agents/wave-security-role.md +0 -40
- package/docs/architecture/docx/README.md +0 -10
- package/docs/architecture/future/README.md +0 -8
- package/docs/architecture/ooxml-upgrade-analysis.md +0 -134
- package/docs/architecture/platform/shared-openxml-editor-platform.md +0 -153
- package/docs/architecture/xlsx/canonical-workbook-model-and-commands.md +0 -187
- package/docs/architecture/xlsx/spreadsheet-editor-frontend-architecture.md +0 -150
- package/docs/comment-redline-overview.md +0 -350
- package/docs/concepts/context7-vs-skills.md +0 -118
- package/docs/concepts/operating-modes.md +0 -91
- package/docs/concepts/runtime-agnostic-orchestration.md +0 -111
- package/docs/concepts/what-is-a-wave.md +0 -217
- package/docs/context7/bundles.json +0 -222
- package/docs/context7/planner-agent/README.md +0 -28
- package/docs/context7/planner-agent/manifest.json +0 -83
- package/docs/context7/planner-agent/papers/cooperbench-why-coding-agents-cannot-be-your-teammates-yet.md +0 -3283
- package/docs/context7/planner-agent/papers/dova-deliberation-first-multi-agent-orchestration-for-autonomous-research-automation.md +0 -1699
- package/docs/context7/planner-agent/papers/dpbench-large-language-models-struggle-with-simultaneous-coordination.md +0 -2251
- package/docs/context7/planner-agent/papers/incremental-planning-to-control-a-blackboard-based-problem-solver.md +0 -1729
- package/docs/context7/planner-agent/papers/silo-bench-a-scalable-environment-for-evaluating-distributed-coordination-in-multi-agent-llm-systems.md +0 -3747
- package/docs/context7/planner-agent/papers/todoevolve-learning-to-architect-agent-planning-systems.md +0 -1675
- package/docs/context7/planner-agent/papers/verified-multi-agent-orchestration-a-plan-execute-verify-replan-framework-for-complex-query-resolution.md +0 -1173
- package/docs/context7/planner-agent/papers/why-do-multi-agent-llm-systems-fail.md +0 -5211
- package/docs/context7/planner-agent/topics/planning-and-orchestration.md +0 -24
- package/docs/evals/arm-templates/README.md +0 -13
- package/docs/evals/arm-templates/full-wave.json +0 -15
- package/docs/evals/arm-templates/single-agent.json +0 -15
- package/docs/evals/benchmark-catalog.json +0 -670
- package/docs/evals/cases/README.md +0 -47
- package/docs/evals/cases/wave-blackboard-inbox-targeting.json +0 -73
- package/docs/evals/cases/wave-contradiction-conflict.json +0 -104
- package/docs/evals/cases/wave-expert-routing-preservation.json +0 -69
- package/docs/evals/cases/wave-hidden-profile-private-evidence.json +0 -81
- package/docs/evals/cases/wave-premature-closure-guard.json +0 -71
- package/docs/evals/cases/wave-silo-cross-agent-state.json +0 -77
- package/docs/evals/cases/wave-simultaneous-lockstep.json +0 -92
- package/docs/evals/external-benchmarks.json +0 -85
- package/docs/evals/external-command-config.sample.json +0 -9
- package/docs/evals/external-command-config.swe-bench-pro.json +0 -8
- package/docs/evals/pilots/README.md +0 -47
- package/docs/evals/pilots/swe-bench-pro-public-full-wave-review-10.json +0 -64
- package/docs/evals/pilots/swe-bench-pro-public-pilot.json +0 -111
- package/docs/evals/wave-benchmark-program.md +0 -302
- package/docs/guides/planner.md +0 -220
- package/docs/guides/recommendations-0.8.9.md +0 -133
- package/docs/guides/signal-wrappers.md +0 -165
- package/docs/guides/terminal-surfaces.md +0 -96
- package/docs/image copy.png +0 -0
- package/docs/image.png +0 -0
- package/docs/images/image.png +0 -0
- package/docs/legal-feedback-architecture.md +0 -498
- package/docs/plans/component-cutover-matrix.json +0 -1072
- package/docs/plans/component-cutover-matrix.md +0 -307
- package/docs/plans/context7-wave-orchestrator.md +0 -155
- package/docs/plans/current-state.md +0 -198
- package/docs/plans/docx/README.md +0 -9
- package/docs/plans/examples/wave-benchmark-improvement.md +0 -108
- package/docs/plans/examples/wave-example-live-proof.md +0 -435
- package/docs/plans/master-plan.md +0 -224
- package/docs/plans/migration.md +0 -538
- package/docs/plans/operations/README.md +0 -7
- package/docs/plans/operations/wave-10-word-certification.md +0 -87
- package/docs/plans/operations/wave-8-railway-staging.md +0 -153
- package/docs/plans/operations/wave-9-manual-certification.md +0 -73
- package/docs/plans/platform/README.md +0 -9
- package/docs/plans/reference/legal-checklist-coverage.md +0 -258
- package/docs/plans/wave-orchestrator.md +0 -423
- package/docs/plans/waves/README.md +0 -75
- package/docs/plans/waves/completed/wave-0.md +0 -195
- package/docs/plans/waves/completed/wave-1.md +0 -379
- package/docs/plans/waves/completed/wave-10.md +0 -670
- package/docs/plans/waves/completed/wave-11.md +0 -335
- package/docs/plans/waves/completed/wave-12.md +0 -417
- package/docs/plans/waves/completed/wave-13.md +0 -316
- package/docs/plans/waves/completed/wave-14.md +0 -319
- package/docs/plans/waves/completed/wave-15.md +0 -321
- package/docs/plans/waves/completed/wave-16.md +0 -316
- package/docs/plans/waves/completed/wave-17.md +0 -331
- package/docs/plans/waves/completed/wave-18.md +0 -328
- package/docs/plans/waves/completed/wave-2.md +0 -438
- package/docs/plans/waves/completed/wave-3.md +0 -435
- package/docs/plans/waves/completed/wave-4.md +0 -430
- package/docs/plans/waves/completed/wave-5.md +0 -430
- package/docs/plans/waves/completed/wave-6.md +0 -430
- package/docs/plans/waves/completed/wave-7.md +0 -526
- package/docs/plans/waves/completed/wave-8.md +0 -596
- package/docs/plans/waves/completed/wave-9.md +0 -552
- package/docs/plans/waves/deferred/README.md +0 -14
- package/docs/plans/waves/deferred/encrypted-intake-contracts.md +0 -282
- package/docs/plans/waves/deferred/legal-feedback-wave-expansion.md +0 -308
- package/docs/plans/waves/deferred/wave-encrypted-intake.md +0 -451
- package/docs/plans/waves/design/README.md +0 -5
- package/docs/plans/waves/design/wave-1-a1.md +0 -309
- package/docs/plans/waves/reviews/README.md +0 -5
- package/docs/plans/waves/reviews/wave-0-cont-qa.md +0 -151
- package/docs/plans/waves/reviews/wave-1-cont-qa.md +0 -46
- package/docs/plans/waves/reviews/wave-10-accessibility-and-design.md +0 -51
- package/docs/plans/waves/reviews/wave-10-cont-qa.md +0 -24
- package/docs/plans/waves/reviews/wave-10-dashboard-proof.md +0 -46
- package/docs/plans/waves/reviews/wave-10-performance-signoff.md +0 -55
- package/docs/plans/waves/reviews/wave-10-regression-proof.md +0 -23
- package/docs/plans/waves/reviews/wave-10-release-audit.md +0 -31
- package/docs/plans/waves/reviews/wave-10-service-proof.md +0 -83
- package/docs/plans/waves/reviews/wave-10-word-certification.md +0 -31
- package/docs/plans/waves/reviews/wave-18-ai-contract-closure.md +0 -277
- package/docs/plans/waves/reviews/wave-18-cont-qa.md +0 -255
- package/docs/plans/waves/reviews/wave-18-parity-proof.md +0 -271
- package/docs/plans/waves/reviews/wave-19-cont-qa.md +0 -59
- package/docs/plans/waves/reviews/wave-2-cont-qa.md +0 -72
- package/docs/plans/waves/reviews/wave-20-cont-qa.md +0 -60
- package/docs/plans/waves/reviews/wave-25-cont-qa.md +0 -48
- package/docs/plans/waves/reviews/wave-28-cont-qa.md +0 -46
- package/docs/plans/waves/reviews/wave-29-cont-qa.md +0 -53
- package/docs/plans/waves/reviews/wave-3-cont-qa.md +0 -53
- package/docs/plans/waves/reviews/wave-3-core-proof.md +0 -77
- package/docs/plans/waves/reviews/wave-3-validator-proof.md +0 -73
- package/docs/plans/waves/reviews/wave-32-cont-qa.md +0 -43
- package/docs/plans/waves/reviews/wave-33-cont-qa.md +0 -526
- package/docs/plans/waves/reviews/wave-34-cont-qa.md +0 -100
- package/docs/plans/waves/reviews/wave-35-cont-qa.md +0 -145
- package/docs/plans/waves/reviews/wave-4-cont-qa.md +0 -47
- package/docs/plans/waves/reviews/wave-4-structure-proof.md +0 -69
- package/docs/plans/waves/reviews/wave-5-comment-proof.md +0 -158
- package/docs/plans/waves/reviews/wave-5-cont-qa.md +0 -68
- package/docs/plans/waves/reviews/wave-6-cont-qa.md +0 -416
- package/docs/plans/waves/reviews/wave-6-redline-proof.md +0 -130
- package/docs/plans/waves/reviews/wave-7-cont-qa.md +0 -82
- package/docs/plans/waves/reviews/wave-7-ooxml-compliance.md +0 -85
- package/docs/plans/waves/reviews/wave-7-preservation-proof.md +0 -119
- package/docs/plans/waves/reviews/wave-7-trust-ux.md +0 -87
- package/docs/plans/waves/reviews/wave-8-accessibility-and-design.md +0 -128
- package/docs/plans/waves/reviews/wave-8-cont-qa.md +0 -92
- package/docs/plans/waves/reviews/wave-8-live-proof.md +0 -140
- package/docs/plans/waves/reviews/wave-8-security.md +0 -47
- package/docs/plans/waves/reviews/wave-9-editor-embedding.md +0 -39
- package/docs/plans/waves/reviews/wave-9-fixture-runner.md +0 -56
- package/docs/plans/waves/reviews/wave-9-live-proof.md +0 -105
- package/docs/plans/waves/reviews/wave-9-usability-and-performance.md +0 -152
- package/docs/plans/waves/specs/README.md +0 -5
- package/docs/plans/waves/specs/wave-1-component-boundaries.md +0 -322
- package/docs/plans/waves/specs/wave-1-ooxml-contracts.md +0 -323
- package/docs/plans/waves/specs/wave-1-review-and-ui-contracts.md +0 -339
- package/docs/plans/waves/specs/wave-1-runtime-contracts.md +0 -509
- package/docs/plans/waves/wave-19.md +0 -341
- package/docs/plans/waves/wave-20.md +0 -308
- package/docs/plans/waves/wave-21.md +0 -289
- package/docs/plans/waves/wave-22.md +0 -221
- package/docs/plans/waves/wave-23.md +0 -295
- package/docs/plans/waves/wave-24.md +0 -286
- package/docs/plans/waves/wave-25.md +0 -313
- package/docs/plans/waves/wave-26.md +0 -300
- package/docs/plans/waves/wave-27.md +0 -299
- package/docs/plans/waves/wave-28.md +0 -368
- package/docs/plans/waves/wave-29.md +0 -303
- package/docs/plans/waves/wave-30.md +0 -307
- package/docs/plans/waves/wave-31.md +0 -231
- package/docs/plans/waves/wave-32.md +0 -152
- package/docs/plans/waves/wave-33.md +0 -147
- package/docs/plans/waves/wave-34.md +0 -148
- package/docs/plans/waves/wave-35.md +0 -141
- package/docs/plans/waves/wave-36.md +0 -146
- package/docs/plans/xlsx/README.md +0 -14
- package/docs/plans/xlsx/xlsx-fixture-corpus-and-certification-plan.md +0 -126
- package/docs/reference/cli-reference.md +0 -600
- package/docs/reference/coordination-and-closure.md +0 -487
- package/docs/reference/deep-research-report (15).md +0 -25
- package/docs/reference/docx/README.md +0 -10
- package/docs/reference/legal-checklist.md +0 -445
- package/docs/reference/live-proof-waves.md +0 -199
- package/docs/reference/ooxml-compliance.md +0 -129
- package/docs/reference/ooxml-feature-parity-matrix.md +0 -172
- package/docs/reference/platform/shared-ooxml-platform-guidance.md +0 -77
- package/docs/reference/prototype-agent-prompt-legal-fidelity.md +0 -155
- package/docs/reference/public-api.md +0 -456
- package/docs/reference/repository-guidance.md +0 -58
- package/docs/reference/runtime-config/README.md +0 -182
- package/docs/reference/runtime-config/claude.md +0 -110
- package/docs/reference/runtime-config/codex.md +0 -82
- package/docs/reference/runtime-config/opencode.md +0 -93
- package/docs/reference/sample-waves.md +0 -105
- package/docs/reference/skills.md +0 -237
- package/docs/reference/templates/AGENTS.md +0 -78
- package/docs/reference/templates/HEARTBEAT.md +0 -7
- package/docs/reference/templates/IDENTITY.md +0 -23
- package/docs/reference/templates/SOUL.md +0 -36
- package/docs/reference/templates/TOOLS.md +0 -40
- package/docs/reference/templates/USER.md +0 -17
- package/docs/reference/wave-control.md +0 -184
- package/docs/reference/wave-planning-lessons.md +0 -167
- package/docs/reference/word-review-editor-frontend-architecture.md +0 -479
- package/docs/reference/word-review-editor-ux-guide.md +0 -253
- package/docs/reference/xlsx/xlsx-ooxml-compliance.md +0 -137
- package/docs/research/agent-context-sources.md +0 -178
- package/docs/research/coordination-failure-review.md +0 -290
- package/docs/research/docx-react-component/Canonical Document Schema Specification for a React-based Word-compatible Editor.md +0 -2317
- package/docs/research/docx-react-component/Feature Compatibility Matrix for a React Word Compatible Legal Editor v1.md +0 -219
- package/docs/research/docx-react-component/React Component Architecture and Front-End Structure Specification for a Word-Compatible Legal Review Editor.md +0 -1112
- package/docs/research/docx-react-component/document_compatibility_and_testing_spec.md +0 -751
- package/docs/research/xlsx/raw/README.md +0 -13
- package/docs/roadmap.md +0 -174
- package/docs/superpowers/plans/2026-03-28-harness-control-bar.md +0 -677
- package/docs/superpowers/specs/2026-03-28-harness-control-bar-design.md +0 -274
- package/docs/xlsx-react/README.md +0 -38
- package/docs/xlsx-react/agent-llm-interaction-layer-docx-xlsx.md +0 -621
- package/docs/xlsx-react/canonical-workbook-model-and-commands.md +0 -948
- package/docs/xlsx-react/shared-openxml-editor-platform-docx-xlsx.md +0 -228
- package/docs/xlsx-react/spreadsheet-editor-component-architecture.md +0 -809
- package/docs/xlsx-react/spreadsheet-editor-frontend-architecture.md +0 -537
- package/docs/xlsx-react/spreadsheet-editor-ux-guide.md +0 -520
- package/docs/xlsx-react/xlsx-editor-research-pack.md +0 -871
- package/docs/xlsx-react/xlsx-fixture-corpus-and-certification-plan.md +0 -436
- package/docs/xlsx-react/xlsx-ooxml-compliance.md +0 -320
- package/examples/README.md +0 -16
- package/memory/MEMORY.md +0 -24
- package/pnpm-workspace.yaml +0 -4
- package/scripts/check-no-authored-js.sh +0 -13
- package/scripts/context7-api-check.sh +0 -65
- package/scripts/context7-export-env.sh +0 -42
- package/scripts/run-context7-mcp.sh +0 -8
- package/scripts/run-workspace-tests.sh +0 -15
- package/scripts/start-wave-10-local.sh +0 -189
- package/scripts/wave-agent-attach.sh +0 -47
- package/scripts/wave-auto-answer.sh +0 -118
- package/scripts/wave-dashboard-attach.sh +0 -13
- package/scripts/wave-launch.sh +0 -273
- package/scripts/wave-overnight-supervisor.sh +0 -145
- package/scripts/wave-status.sh +0 -379
- package/scripts/wave-watch.sh +0 -231
- package/services/README.md +0 -17
- package/services/openxml-validator/Dockerfile +0 -29
- package/services/openxml-validator/OpenXmlValidator.Api.csproj +0 -12
- package/services/openxml-validator/Program.cs +0 -436
- package/services/openxml-validator/README.md +0 -152
- package/services/openxml-validator/railway.json +0 -16
- package/services/react-word-editor/.tmp-a4/src/api/public-types.ts +0 -318
- package/services/react-word-editor/.tmp-a4/src/ui/WordReviewEditor.tsx +0 -1302
- package/services/react-word-editor/.tmp-a4/src/ui/editor-surface/editor-surface.tsx +0 -546
- package/services/react-word-editor/.tmp-a4/test/ui/word-review-editor.test.tsx +0 -146
- package/services/react-word-editor/.tmp-a4-build/src/api/public-types.js +0 -2
- package/services/react-word-editor/.tmp-a4-build/src/ui/WordReviewEditor.js +0 -818
- package/services/react-word-editor/.tmp-a4-build/src/ui/editor-surface/editor-surface.js +0 -229
- package/services/react-word-editor/.tmp-a4-build/test/ui/word-review-editor.test.js +0 -121
- package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.json +0 -21
- package/services/react-word-editor/.tmp-wave-4-a3-tsconfig.tsbuildinfo +0 -1
- package/services/react-word-editor/Dockerfile +0 -26
- package/services/react-word-editor/README.md +0 -254
- package/services/react-word-editor/app/api/certification/route.ts +0 -79
- package/services/react-word-editor/app/api/demo-sessions/route.ts +0 -109
- package/services/react-word-editor/app/api/deploy-health/route.ts +0 -23
- package/services/react-word-editor/app/api/exports/[exportId]/route.ts +0 -34
- package/services/react-word-editor/app/api/exports/route.ts +0 -81
- package/services/react-word-editor/app/api/fixtures/[fixtureId]/run/route.ts +0 -100
- package/services/react-word-editor/app/api/health/route.ts +0 -70
- package/services/react-word-editor/app/api/runs/[runId]/route.ts +0 -36
- package/services/react-word-editor/app/api/scenarios/[scenarioId]/run/route.ts +0 -85
- package/services/react-word-editor/app/api/sessions/[sessionId]/route.ts +0 -199
- package/services/react-word-editor/app/api/sessions/[sessionId]/source/route.ts +0 -45
- package/services/react-word-editor/app/api/uploads/route.ts +0 -70
- package/services/react-word-editor/app/api/validate/route.ts +0 -310
- package/services/react-word-editor/app/certification/[runId]/page.tsx +0 -14
- package/services/react-word-editor/app/certification/page.tsx +0 -32
- package/services/react-word-editor/app/dashboard/page.tsx +0 -7
- package/services/react-word-editor/app/demo/page.tsx +0 -30
- package/services/react-word-editor/app/demo/prototype-client.tsx +0 -1080
- package/services/react-word-editor/app/editor/[sessionId]/page.tsx +0 -33
- package/services/react-word-editor/app/fixtures/page.tsx +0 -7
- package/services/react-word-editor/app/globals.css +0 -121
- package/services/react-word-editor/app/layout.tsx +0 -32
- package/services/react-word-editor/app/page.tsx +0 -30
- package/services/react-word-editor/app/runs/[runId]/page.tsx +0 -34
- package/services/react-word-editor/app/wave-10-word-review/page.tsx +0 -7
- package/services/react-word-editor/components/harness-control-bar.tsx +0 -289
- package/services/react-word-editor/components/harness-editor-session-client.tsx +0 -1214
- package/services/react-word-editor/components/harness-workspace-page.tsx +0 -715
- package/services/react-word-editor/components/reduced-motion-toggle.tsx +0 -79
- package/services/react-word-editor/components/workspace-certification-panel.tsx +0 -307
- package/services/react-word-editor/lib/certification-bundle.ts +0 -796
- package/services/react-word-editor/lib/certification-store.ts +0 -661
- package/services/react-word-editor/lib/demo-fixtures.test.mjs +0 -195
- package/services/react-word-editor/lib/demo-fixtures.ts +0 -1519
- package/services/react-word-editor/lib/editor-session-summary.test.mjs +0 -68
- package/services/react-word-editor/lib/editor-session-summary.ts +0 -14
- package/services/react-word-editor/lib/editor-session.ts +0 -228
- package/services/react-word-editor/lib/exports-route.test.mjs +0 -32
- package/services/react-word-editor/lib/harness-client.ts +0 -347
- package/services/react-word-editor/lib/harness-config.json +0 -30
- package/services/react-word-editor/lib/harness-config.test.mjs +0 -31
- package/services/react-word-editor/lib/harness-config.ts +0 -21
- package/services/react-word-editor/lib/harness-editor-datastore.test.mjs +0 -220
- package/services/react-word-editor/lib/harness-editor-datastore.ts +0 -161
- package/services/react-word-editor/lib/private-mode.test.mjs +0 -42
- package/services/react-word-editor/lib/private-mode.ts +0 -61
- package/services/react-word-editor/lib/regression-report.test.mjs +0 -352
- package/services/react-word-editor/lib/regression-report.ts +0 -896
- package/services/react-word-editor/lib/run-artifacts.ts +0 -934
- package/services/react-word-editor/lib/run-history.ts +0 -755
- package/services/react-word-editor/lib/scenario-artifacts.test.mjs +0 -41
- package/services/react-word-editor/lib/scenario-artifacts.ts +0 -44
- package/services/react-word-editor/lib/storage.ts +0 -953
- package/services/react-word-editor/lib/validator-client.test.mjs +0 -54
- package/services/react-word-editor/lib/validator-client.ts +0 -95
- package/services/react-word-editor/lib/workspace-navigation.ts +0 -79
- package/services/react-word-editor/middleware.ts +0 -35
- package/services/react-word-editor/next-env.d.ts +0 -6
- package/services/react-word-editor/next.config.mjs +0 -15
- package/services/react-word-editor/package.json +0 -38
- package/services/react-word-editor/postcss.config.mjs +0 -8
- package/services/react-word-editor/railway.json +0 -21
- package/services/react-word-editor/scripts/wave-10-certification.mjs +0 -101
- package/services/react-word-editor/scripts/wave-9-live-usability-pilot.mjs +0 -911
- package/services/react-word-editor/tsconfig.json +0 -39
- package/services/react-word-editor/tsconfig.tsbuildinfo +0 -1
- package/skills/README.md +0 -48
- package/skills/domain-docx-compatibility/SKILL.md +0 -44
- package/skills/domain-docx-compatibility/skill.json +0 -19
- package/skills/domain-editor-architecture/SKILL.md +0 -49
- package/skills/domain-editor-architecture/skill.json +0 -19
- package/skills/domain-legal-review/SKILL.md +0 -39
- package/skills/domain-legal-review/skill.json +0 -19
- package/skills/provider-aws/SKILL.md +0 -117
- package/skills/provider-aws/adapters/claude.md +0 -1
- package/skills/provider-aws/adapters/codex.md +0 -1
- package/skills/provider-aws/references/service-verification.md +0 -39
- package/skills/provider-aws/skill.json +0 -54
- package/skills/provider-custom-deploy/SKILL.md +0 -64
- package/skills/provider-custom-deploy/skill.json +0 -50
- package/skills/provider-docker-compose/SKILL.md +0 -96
- package/skills/provider-docker-compose/adapters/local.md +0 -1
- package/skills/provider-docker-compose/skill.json +0 -53
- package/skills/provider-github-release/SKILL.md +0 -121
- package/skills/provider-github-release/adapters/claude.md +0 -1
- package/skills/provider-github-release/adapters/codex.md +0 -1
- package/skills/provider-github-release/skill.json +0 -55
- package/skills/provider-kubernetes/SKILL.md +0 -143
- package/skills/provider-kubernetes/adapters/claude.md +0 -1
- package/skills/provider-kubernetes/adapters/codex.md +0 -1
- package/skills/provider-kubernetes/references/kubectl-patterns.md +0 -58
- package/skills/provider-kubernetes/skill.json +0 -52
- package/skills/provider-railway/SKILL.md +0 -123
- package/skills/provider-railway/adapters/claude.md +0 -1
- package/skills/provider-railway/adapters/codex.md +0 -1
- package/skills/provider-railway/adapters/local.md +0 -1
- package/skills/provider-railway/adapters/opencode.md +0 -1
- package/skills/provider-railway/references/verification-commands.md +0 -39
- package/skills/provider-railway/skill.json +0 -71
- package/skills/provider-ssh-manual/SKILL.md +0 -97
- package/skills/provider-ssh-manual/skill.json +0 -54
- package/skills/repo-coding-rules/SKILL.md +0 -55
- package/skills/repo-coding-rules/skill.json +0 -34
- package/skills/role-cont-eval/SKILL.md +0 -91
- package/skills/role-cont-eval/adapters/codex.md +0 -1
- package/skills/role-cont-eval/skill.json +0 -36
- package/skills/role-cont-qa/SKILL.md +0 -100
- package/skills/role-cont-qa/adapters/claude.md +0 -1
- package/skills/role-cont-qa/skill.json +0 -36
- package/skills/role-deploy/SKILL.md +0 -97
- package/skills/role-deploy/skill.json +0 -36
- package/skills/role-design/SKILL.md +0 -50
- package/skills/role-design/skill.json +0 -36
- package/skills/role-documentation/SKILL.md +0 -76
- package/skills/role-documentation/skill.json +0 -36
- package/skills/role-implementation/SKILL.md +0 -45
- package/skills/role-implementation/skill.json +0 -36
- package/skills/role-infra/SKILL.md +0 -81
- package/skills/role-infra/skill.json +0 -36
- package/skills/role-integration/SKILL.md +0 -91
- package/skills/role-integration/skill.json +0 -36
- package/skills/role-planner/SKILL.md +0 -39
- package/skills/role-planner/skill.json +0 -21
- package/skills/role-research/SKILL.md +0 -65
- package/skills/role-research/skill.json +0 -36
- package/skills/role-security/SKILL.md +0 -60
- package/skills/role-security/skill.json +0 -36
- package/skills/runtime-claude/SKILL.md +0 -66
- package/skills/runtime-claude/skill.json +0 -36
- package/skills/runtime-codex/SKILL.md +0 -58
- package/skills/runtime-codex/skill.json +0 -36
- package/skills/runtime-local/SKILL.md +0 -46
- package/skills/runtime-local/skill.json +0 -36
- package/skills/runtime-opencode/SKILL.md +0 -58
- package/skills/runtime-opencode/skill.json +0 -36
- package/skills/signal-hygiene/SKILL.md +0 -51
- package/skills/signal-hygiene/skill.json +0 -20
- package/skills/tui-design/SKILL.md +0 -77
- package/skills/tui-design/references/tui-design.md +0 -259
- package/skills/tui-design/skill.json +0 -36
- package/skills/wave-core/SKILL.md +0 -141
- package/skills/wave-core/references/marker-syntax.md +0 -70
- package/skills/wave-core/skill.json +0 -35
- package/test/README.md +0 -16
- package/test/core/formatting-commands.test.ts +0 -285
- package/test/core/image-commands.test.ts +0 -298
- package/test/core/mapping.test.ts +0 -186
- package/test/core/text-commands.test.ts +0 -176
- package/test/fixtures/docx/F01-basic-contract.docx +0 -0
- package/test/fixtures/docx/F01-basic-contract.md +0 -33
- package/test/fixtures/docx/F02-headings-styles.docx +0 -0
- package/test/fixtures/docx/F02-headings-styles.md +0 -33
- package/test/fixtures/docx/F03-legal-outline-numbering.docx +0 -0
- package/test/fixtures/docx/F03-legal-outline-numbering.md +0 -34
- package/test/fixtures/docx/F04-restart-numbering-schedules.docx +0 -0
- package/test/fixtures/docx/F04-restart-numbering-schedules.md +0 -33
- package/test/fixtures/docx/F05-table-heavy-agreement.docx +0 -0
- package/test/fixtures/docx/F05-table-heavy-agreement.md +0 -34
- package/test/fixtures/docx/F06-merged-cells-signature-table.docx +0 -0
- package/test/fixtures/docx/F06-merged-cells-signature-table.md +0 -34
- package/test/fixtures/docx/F07-inline-images-exhibit.docx +0 -0
- package/test/fixtures/docx/F07-inline-images-exhibit.md +0 -34
- package/test/fixtures/docx/F08-hyperlinks.docx +0 -0
- package/test/fixtures/docx/F08-hyperlinks.md +0 -33
- package/test/fixtures/docx/F09-comments-single-paragraph.docx +0 -0
- package/test/fixtures/docx/F09-comments-single-paragraph.md +0 -33
- package/test/fixtures/docx/F10-threaded-comments-resolve.docx +0 -0
- package/test/fixtures/docx/F10-threaded-comments-resolve.md +0 -33
- package/test/fixtures/docx/F11-redlines-basic.docx +0 -0
- package/test/fixtures/docx/F11-redlines-basic.md +0 -33
- package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.docx +0 -0
- package/test/fixtures/docx/F12-redlines-paragraph-joins-splits.md +0 -33
- package/test/fixtures/docx/F13-comments-on-deleted-text.docx +0 -0
- package/test/fixtures/docx/F13-comments-on-deleted-text.md +0 -33
- package/test/fixtures/docx/F14-revisions-in-tables-and-lists.docx +0 -0
- package/test/fixtures/docx/F14-revisions-in-tables-and-lists.md +0 -33
- package/test/fixtures/docx/F15-sections-headers-footers.docx +0 -0
- package/test/fixtures/docx/F15-sections-headers-footers.md +0 -33
- package/test/fixtures/docx/F16-footnotes-endnotes.docx +0 -0
- package/test/fixtures/docx/F16-footnotes-endnotes.md +0 -33
- package/test/fixtures/docx/F17-fields-and-toc.docx +0 -0
- package/test/fixtures/docx/F17-fields-and-toc.md +0 -33
- package/test/fixtures/docx/F18-content-controls-template.docx +0 -0
- package/test/fixtures/docx/F18-content-controls-template.md +0 -33
- package/test/fixtures/docx/F19-custom-xml-doc-assembly.docx +0 -0
- package/test/fixtures/docx/F19-custom-xml-doc-assembly.md +0 -35
- package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.docx +0 -0
- package/test/fixtures/docx/F20-unknown-ooxml-and-alternatecontent.md +0 -33
- package/test/fixtures/docx/F21-malformed-broken-docx.docx +0 -0
- package/test/fixtures/docx/F21-malformed-broken-docx.md +0 -33
- package/test/fixtures/docx/README.md +0 -74
- package/test/fixtures/docx/certification-manifest.json +0 -104
- package/test/fixtures/docx/fixtures.manifest.json +0 -196
- package/test/fixtures/encrypted-docx/README.md +0 -27
- package/test/fixtures/encrypted-docx/certification-manifest.json +0 -9
- package/test/fixtures/encrypted-docx/fixtures.manifest.json +0 -47
- package/test/fixtures/scenarios/docx/README.md +0 -25
- package/test/fixtures/scenarios/docx/S01-sow-template.docx +0 -0
- package/test/fixtures/scenarios/docx/S01-sow-template.md +0 -30
- package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.docx +0 -0
- package/test/fixtures/scenarios/docx/S02-bw-partner-user-licence-agreement-redlines.md +0 -32
- package/test/fixtures/scenarios/docx/scenario-manifest.json +0 -53
- package/test/formats/xlsx/io/xlsx-import.test.ts +0 -766
- package/test/formats/xlsx/model/workbook.test.ts +0 -669
- package/test/helpers/dom-setup.ts +0 -124
- package/test/io/comment-roundtrip.test.ts +0 -272
- package/test/io/complex-content-roundtrip.test.ts +0 -632
- package/test/io/docx-compatibility-regression.test.ts +0 -199
- package/test/io/docx-session.test.ts +0 -1495
- package/test/io/footnotes-roundtrip.test.ts +0 -318
- package/test/io/headers-footers-roundtrip.test.ts +0 -547
- package/test/io/numbering-roundtrip.test.ts +0 -234
- package/test/io/package-reader.test.ts +0 -199
- package/test/io/paragraph-properties-roundtrip.test.ts +0 -129
- package/test/io/preserved-package-roundtrip.test.ts +0 -365
- package/test/io/property-completeness.test.ts +0 -292
- package/test/io/revision-roundtrip.test.ts +0 -347
- package/test/io/structural-blocks.test.ts +0 -202
- package/test/io/table-media-roundtrip.test.ts +0 -448
- package/test/io/table-properties-roundtrip.test.ts +0 -569
- package/test/io/table-roundtrip.test.ts +0 -302
- package/test/io/text-roundtrip.test.ts +0 -344
- package/test/model/canonical-document.test.ts +0 -285
- package/test/preservation/opaque-fragment-store.test.ts +0 -121
- package/test/preservation/package-preservation.test.ts +0 -395
- package/test/preservation/store.test.ts +0 -84
- package/test/review/comment-remapping.test.ts +0 -220
- package/test/review/comment-store.test.ts +0 -180
- package/test/review/move-revisions.test.ts +0 -143
- package/test/review/property-change-revisions.test.ts +0 -225
- package/test/review/revision-actions.test.ts +0 -330
- package/test/review/revision-store.test.ts +0 -193
- package/test/runtime/session-capabilities.test.ts +0 -260
- package/test/runtime/table-commands.test.ts +0 -356
- package/test/runtime/table-schema.test.ts +0 -221
- package/test/runtime/tracked-changes-toggle.test.ts +0 -107
- package/test/ui/comment-review-surface.test.tsx +0 -114
- package/test/ui/reduced-motion-toggle.test.tsx +0 -137
- package/test/ui/word-review-editor.imported-scenarios.test.tsx +0 -169
- package/test/ui/word-review-editor.interaction.test.tsx +0 -1198
- package/test/ui/word-review-editor.test.js +0 -188
- package/test/ui/word-review-editor.test.tsx +0 -280
- package/test/ui-tailwind/search-plugin.test.ts +0 -286
- package/test/validation/compatibility-engine.test.ts +0 -336
- package/test/validation/compatibility-report.test.ts +0 -189
- package/test/validation/low-priority-word-surfaces.test.ts +0 -282
- package/test/validation/malformed-doc.test.ts +0 -113
- package/test-results/.last-run.json +0 -4
- package/wave.config.json +0 -406
|
@@ -69,6 +69,27 @@ interface WordReviewEditorRuntime extends DocumentRuntime {
|
|
|
69
69
|
dispose?(): void;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
const VISUALLY_HIDDEN_STYLES: React.CSSProperties = {
|
|
73
|
+
position: "absolute",
|
|
74
|
+
width: "1px",
|
|
75
|
+
height: "1px",
|
|
76
|
+
padding: 0,
|
|
77
|
+
margin: "-1px",
|
|
78
|
+
overflow: "hidden",
|
|
79
|
+
clip: "rect(0 0 0 0)",
|
|
80
|
+
whiteSpace: "nowrap",
|
|
81
|
+
border: 0,
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const ACCESSIBLE_REGION_ORDER = [
|
|
85
|
+
"toolbar",
|
|
86
|
+
"document",
|
|
87
|
+
"review-rail",
|
|
88
|
+
"status",
|
|
89
|
+
] as const;
|
|
90
|
+
|
|
91
|
+
type AccessibleRegionId = (typeof ACCESSIBLE_REGION_ORDER)[number];
|
|
92
|
+
|
|
72
93
|
export function __createWordReviewEditorRefBridge(
|
|
73
94
|
runtime: WordReviewEditorRuntime,
|
|
74
95
|
): WordReviewEditorRef {
|
|
@@ -241,6 +262,8 @@ export const WordReviewEditor = forwardRef<WordReviewEditorRef, WordReviewEditor
|
|
|
241
262
|
const [showTrackedChanges, setShowTrackedChanges] = useState(false);
|
|
242
263
|
const [activeRevisionId, setActiveRevisionId] = useState<string | undefined>();
|
|
243
264
|
const runtimeRef = useRef<WordReviewEditorRuntime | null>(null);
|
|
265
|
+
const shellRef = useRef<HTMLDivElement | null>(null);
|
|
266
|
+
const lastAnnouncedErrorIdRef = useRef<string | null>(null);
|
|
244
267
|
const autosaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
245
268
|
const lastSavedRevisionTokenRef = useRef<string | null>(null);
|
|
246
269
|
const datastoreRef = useRef(datastore);
|
|
@@ -601,6 +624,10 @@ export const WordReviewEditor = forwardRef<WordReviewEditorRef, WordReviewEditor
|
|
|
601
624
|
|
|
602
625
|
const selectionPreview = summarizeSelectionPreview(snapshot);
|
|
603
626
|
const capabilities = deriveCapabilities(snapshot, reviewMode);
|
|
627
|
+
const diagnosticsModeMessage = getDiagnosticsModeMessage(loadError ?? snapshot.fatalError);
|
|
628
|
+
const accessibilityInstructionsId = `${documentId}-accessibility-instructions`;
|
|
629
|
+
const accessibilityStatusId = `${documentId}-accessibility-status`;
|
|
630
|
+
const accessibilityAlertId = `${documentId}-accessibility-alert`;
|
|
604
631
|
|
|
605
632
|
const dispatchSelection = (selection: PublicSelectionSnapshot) =>
|
|
606
633
|
activeRuntime.dispatch({
|
|
@@ -608,6 +635,46 @@ export const WordReviewEditor = forwardRef<WordReviewEditorRef, WordReviewEditor
|
|
|
608
635
|
selection: toRuntimeSelectionSnapshot(selection),
|
|
609
636
|
});
|
|
610
637
|
|
|
638
|
+
useEffect(() => {
|
|
639
|
+
const shell = shellRef.current;
|
|
640
|
+
if (!shell) {
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
applyRegionAttributes(shell);
|
|
645
|
+
}, [runtime, snapshot.fatalError, snapshot.isReady]);
|
|
646
|
+
|
|
647
|
+
useEffect(() => {
|
|
648
|
+
const shell = shellRef.current;
|
|
649
|
+
const fatalError = loadError ?? snapshot.fatalError;
|
|
650
|
+
if (!shell || !fatalError) {
|
|
651
|
+
lastAnnouncedErrorIdRef.current = null;
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (lastAnnouncedErrorIdRef.current === fatalError.errorId) {
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
lastAnnouncedErrorIdRef.current = fatalError.errorId;
|
|
660
|
+
const alertTarget = shell.querySelector<HTMLElement>("[data-wre-alert='true']");
|
|
661
|
+
alertTarget?.focus();
|
|
662
|
+
}, [loadError, snapshot.fatalError]);
|
|
663
|
+
|
|
664
|
+
function handleShellKeyDownCapture(event: React.KeyboardEvent<HTMLDivElement>): void {
|
|
665
|
+
if (event.key !== "F6") {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
const shell = shellRef.current;
|
|
670
|
+
if (!shell) {
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
event.preventDefault();
|
|
675
|
+
focusRelativeRegion(shell, event.shiftKey ? -1 : 1);
|
|
676
|
+
}
|
|
677
|
+
|
|
611
678
|
const editorCallbacks = {
|
|
612
679
|
onFocus: () => activeRuntime.focus(),
|
|
613
680
|
onBlur: () => activeRuntime.blur(),
|
|
@@ -668,45 +735,199 @@ export const WordReviewEditor = forwardRef<WordReviewEditorRef, WordReviewEditor
|
|
|
668
735
|
};
|
|
669
736
|
|
|
670
737
|
return (
|
|
671
|
-
<
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
738
|
+
<div
|
|
739
|
+
ref={shellRef}
|
|
740
|
+
role="region"
|
|
741
|
+
aria-label={`Word review editor for ${snapshot.sourceLabel ?? documentId}`}
|
|
742
|
+
aria-describedby={`${accessibilityInstructionsId} ${accessibilityStatusId}${
|
|
743
|
+
diagnosticsModeMessage ? ` ${accessibilityAlertId}` : ""
|
|
744
|
+
}`}
|
|
745
|
+
className="relative h-full"
|
|
746
|
+
onKeyDownCapture={handleShellKeyDownCapture}
|
|
747
|
+
>
|
|
748
|
+
<p id={accessibilityInstructionsId} style={VISUALLY_HIDDEN_STYLES}>
|
|
749
|
+
Press F6 to move focus between the toolbar, document surface, review rail, and status bar.
|
|
750
|
+
</p>
|
|
751
|
+
<div
|
|
752
|
+
id={accessibilityStatusId}
|
|
753
|
+
role="status"
|
|
754
|
+
aria-live="polite"
|
|
755
|
+
aria-atomic="true"
|
|
756
|
+
style={VISUALLY_HIDDEN_STYLES}
|
|
757
|
+
>
|
|
758
|
+
{buildAccessibilityStatusMessage(snapshot, loadError ?? undefined)}
|
|
759
|
+
</div>
|
|
760
|
+
{diagnosticsModeMessage ? (
|
|
761
|
+
<div
|
|
762
|
+
id={accessibilityAlertId}
|
|
763
|
+
data-wre-alert="true"
|
|
764
|
+
role="alert"
|
|
765
|
+
aria-live="assertive"
|
|
766
|
+
aria-atomic="true"
|
|
767
|
+
tabIndex={-1}
|
|
768
|
+
className="border-b border-danger/30 bg-danger/5 px-4 py-3 text-sm text-danger"
|
|
769
|
+
>
|
|
770
|
+
{diagnosticsModeMessage}
|
|
771
|
+
</div>
|
|
772
|
+
) : null}
|
|
773
|
+
<TwReviewWorkspace
|
|
774
|
+
snapshot={snapshot}
|
|
775
|
+
currentUserId={currentUser.userId}
|
|
776
|
+
capabilities={capabilities}
|
|
777
|
+
reviewMode={reviewMode}
|
|
778
|
+
viewMode={viewMode}
|
|
779
|
+
activeRailTab={activeRailTab}
|
|
780
|
+
activeCommentId={snapshot.comments.activeCommentId}
|
|
781
|
+
activeRevisionId={activeRevisionId}
|
|
782
|
+
showTrackedChanges={showTrackedChanges}
|
|
783
|
+
selectionPreview={selectionPreview}
|
|
784
|
+
onViewModeChange={setViewMode}
|
|
785
|
+
onActiveRailTabChange={setActiveRailTab}
|
|
786
|
+
onShowTrackedChangesChange={setShowTrackedChanges}
|
|
787
|
+
{...reviewCallbacks}
|
|
788
|
+
document={
|
|
789
|
+
<TwProseMirrorSurface
|
|
790
|
+
currentUser={currentUser}
|
|
791
|
+
snapshot={snapshot}
|
|
792
|
+
reviewMode={reviewMode}
|
|
793
|
+
markupDisplay={liveMarkupDisplay}
|
|
794
|
+
activeRevisionId={activeRevisionId}
|
|
795
|
+
showTrackedChanges={showTrackedChanges}
|
|
796
|
+
{...editorCallbacks}
|
|
797
|
+
onCommentActivated={(commentId) => {
|
|
798
|
+
activeRuntime.openComment(commentId);
|
|
799
|
+
setActiveRailTab("comments");
|
|
800
|
+
}}
|
|
801
|
+
onRevisionActivated={(revisionId) => {
|
|
802
|
+
setActiveRevisionId(revisionId);
|
|
803
|
+
setActiveRailTab("changes");
|
|
804
|
+
}}
|
|
805
|
+
/>
|
|
806
|
+
}
|
|
807
|
+
/>
|
|
808
|
+
</div>
|
|
706
809
|
);
|
|
707
810
|
},
|
|
708
811
|
);
|
|
709
812
|
|
|
813
|
+
function applyRegionAttributes(shell: HTMLElement): void {
|
|
814
|
+
const toolbar = shell.querySelector<HTMLElement>("header");
|
|
815
|
+
if (toolbar) {
|
|
816
|
+
toolbar.dataset.wreRegion = "toolbar";
|
|
817
|
+
toolbar.setAttribute("role", toolbar.getAttribute("role") ?? "toolbar");
|
|
818
|
+
toolbar.setAttribute("aria-label", toolbar.getAttribute("aria-label") ?? "Editor toolbar");
|
|
819
|
+
toolbar.tabIndex = -1;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
const documentSurface = shell.querySelector<HTMLElement>('[aria-label="Document surface"]');
|
|
823
|
+
if (documentSurface) {
|
|
824
|
+
documentSurface.dataset.wreRegion = "document";
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
const reviewRail = shell.querySelector<HTMLElement>('[aria-label="Review rail"]');
|
|
828
|
+
if (reviewRail) {
|
|
829
|
+
reviewRail.dataset.wreRegion = "review-rail";
|
|
830
|
+
reviewRail.tabIndex = -1;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
const statusBar = shell.querySelector<HTMLElement>("footer");
|
|
834
|
+
if (statusBar) {
|
|
835
|
+
statusBar.dataset.wreRegion = "status";
|
|
836
|
+
statusBar.setAttribute("role", statusBar.getAttribute("role") ?? "status");
|
|
837
|
+
statusBar.setAttribute("aria-label", statusBar.getAttribute("aria-label") ?? "Editor status bar");
|
|
838
|
+
statusBar.tabIndex = -1;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
function focusRelativeRegion(shell: HTMLElement, direction: -1 | 1): void {
|
|
843
|
+
const activeRegion = getActiveRegionId(shell);
|
|
844
|
+
const startIndex =
|
|
845
|
+
activeRegion === null ? (direction === 1 ? -1 : 0) : ACCESSIBLE_REGION_ORDER.indexOf(activeRegion);
|
|
846
|
+
|
|
847
|
+
for (let offset = 1; offset <= ACCESSIBLE_REGION_ORDER.length; offset += 1) {
|
|
848
|
+
const index =
|
|
849
|
+
(startIndex + direction * offset + ACCESSIBLE_REGION_ORDER.length) %
|
|
850
|
+
ACCESSIBLE_REGION_ORDER.length;
|
|
851
|
+
const regionId = ACCESSIBLE_REGION_ORDER[index];
|
|
852
|
+
const target = findRegionFocusTarget(shell, regionId);
|
|
853
|
+
if (target) {
|
|
854
|
+
target.focus();
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
function getActiveRegionId(shell: HTMLElement): AccessibleRegionId | null {
|
|
861
|
+
const activeElement = shell.ownerDocument.activeElement;
|
|
862
|
+
if (!(activeElement instanceof HTMLElement)) {
|
|
863
|
+
return null;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
const region = activeElement.closest<HTMLElement>("[data-wre-region]");
|
|
867
|
+
const regionId = region?.dataset.wreRegion;
|
|
868
|
+
return isAccessibleRegionId(regionId) ? regionId : null;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
function findRegionFocusTarget(
|
|
872
|
+
shell: HTMLElement,
|
|
873
|
+
regionId: AccessibleRegionId,
|
|
874
|
+
): HTMLElement | null {
|
|
875
|
+
const region = shell.querySelector<HTMLElement>(`[data-wre-region="${regionId}"]`);
|
|
876
|
+
if (!region) {
|
|
877
|
+
return null;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
if (regionId === "document" || regionId === "toolbar" || regionId === "review-rail" || regionId === "status") {
|
|
881
|
+
return region;
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
function isAccessibleRegionId(value: string | undefined): value is AccessibleRegionId {
|
|
886
|
+
return value === "toolbar" || value === "document" || value === "review-rail" || value === "status";
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
function buildAccessibilityStatusMessage(
|
|
890
|
+
snapshot: RuntimeRenderSnapshot,
|
|
891
|
+
loadError?: EditorError,
|
|
892
|
+
): string {
|
|
893
|
+
if (loadError) {
|
|
894
|
+
return `Editor failed to load. ${loadError.message}`;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
if (!snapshot.isReady) {
|
|
898
|
+
return "Editor loading. Document surface is not ready yet.";
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
if (snapshot.fatalError) {
|
|
902
|
+
return `Editor opened in diagnostics mode. ${snapshot.fatalError.message}`;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
return [
|
|
906
|
+
snapshot.readOnly ? "Read-only mode." : "Editing enabled.",
|
|
907
|
+
`${snapshot.comments.totalCount} comment${snapshot.comments.totalCount === 1 ? "" : "s"}.`,
|
|
908
|
+
`${snapshot.trackedChanges.totalCount} tracked change${
|
|
909
|
+
snapshot.trackedChanges.totalCount === 1 ? "" : "s"
|
|
910
|
+
}.`,
|
|
911
|
+
snapshot.compatibility.blockExport ? "Export blocked." : "Export available.",
|
|
912
|
+
].join(" ");
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
function getDiagnosticsModeMessage(error?: EditorError | null): string | null {
|
|
916
|
+
if (!error) {
|
|
917
|
+
return null;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
if (error.code === "package_corrupt") {
|
|
921
|
+
return `${error.message} The document opened in read-only diagnostics mode so you can inspect the issue safely, but editing and export stay blocked until you reload a valid .docx package.`;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
if (error.code === "validation_failed") {
|
|
925
|
+
return `${error.message} The document opened in read-only diagnostics mode because OOXML validation failed, so editing and export stay blocked until the source package is repaired.`;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
return error.isFatal ? error.message : null;
|
|
929
|
+
}
|
|
930
|
+
|
|
710
931
|
function normalizeEditorError(error: unknown): EditorError {
|
|
711
932
|
if (
|
|
712
933
|
typeof error === "object" &&
|
|
@@ -123,14 +123,14 @@ export function TwEditorSurface(props: TwEditorSurfaceProps) {
|
|
|
123
123
|
onCommentActivated={props.onCommentActivated}
|
|
124
124
|
onRevisionActivated={props.onRevisionActivated}
|
|
125
125
|
/>
|
|
126
|
-
) : (
|
|
126
|
+
) : block.kind === "opaque_block" ? (
|
|
127
127
|
<TwOpaqueBlock
|
|
128
128
|
key={block.blockId}
|
|
129
129
|
block={block}
|
|
130
130
|
selection={snapshot.selection}
|
|
131
131
|
onSelectionChange={props.onSelectionChange}
|
|
132
132
|
/>
|
|
133
|
-
),
|
|
133
|
+
) : null,
|
|
134
134
|
)
|
|
135
135
|
) : (
|
|
136
136
|
<p className="text-sm text-secondary leading-relaxed">
|
|
@@ -13,6 +13,20 @@
|
|
|
13
13
|
|
|
14
14
|
import type { Node as PMNode } from "prosemirror-model";
|
|
15
15
|
|
|
16
|
+
function resolveRenderedColspan(node: PMNode): number {
|
|
17
|
+
const colspan = node.attrs.colspan as number | undefined;
|
|
18
|
+
if (typeof colspan === "number" && colspan > 1) {
|
|
19
|
+
return colspan;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const gridSpan = node.attrs.gridSpan as number | undefined;
|
|
23
|
+
if (typeof gridSpan === "number" && gridSpan > 1) {
|
|
24
|
+
return gridSpan;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
|
|
16
30
|
/**
|
|
17
31
|
* NodeView for the table node.
|
|
18
32
|
* Renders as <table><tbody>...</tbody></table>.
|
|
@@ -67,7 +81,7 @@ export class TableCellNodeView {
|
|
|
67
81
|
? "border border-primary/20 p-2 align-top font-semibold bg-surface-raised"
|
|
68
82
|
: "border border-primary/20 p-2 align-top";
|
|
69
83
|
|
|
70
|
-
const colspan = node
|
|
84
|
+
const colspan = resolveRenderedColspan(node);
|
|
71
85
|
const rowspan = node.attrs.rowspan as number;
|
|
72
86
|
if (colspan > 1) (cell as HTMLTableCellElement).colSpan = colspan;
|
|
73
87
|
if (rowspan > 1) (cell as HTMLTableCellElement).rowSpan = rowspan;
|
|
@@ -85,7 +99,7 @@ export class TableCellNodeView {
|
|
|
85
99
|
const expectedTag = isHeader ? "TH" : "TD";
|
|
86
100
|
if (this.dom.tagName !== expectedTag) return false;
|
|
87
101
|
|
|
88
|
-
const colspan = node
|
|
102
|
+
const colspan = resolveRenderedColspan(node);
|
|
89
103
|
const rowspan = node.attrs.rowspan as number;
|
|
90
104
|
const cell = this.dom as HTMLTableCellElement;
|
|
91
105
|
cell.colSpan = colspan > 1 ? colspan : 1;
|
package/.codex/config.toml
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"locator":{"name":"pnpm","reference":"10.30.3"},"bin":{"pnpm":"./bin/pnpm.cjs","pnpx":"./bin/pnpx.cjs"},"hash":"sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
The MIT License (MIT)
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2015-2016 Rico Sta. Cruz and other contributors
|
|
4
|
-
Copyright (c) 2016-2025 Zoltan Kochan and other contributors
|
|
5
|
-
|
|
6
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
-
in the Software without restriction, including without limitation the rights
|
|
9
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
-
furnished to do so, subject to the following conditions:
|
|
12
|
-
|
|
13
|
-
The above copyright notice and this permission notice shall be included in all
|
|
14
|
-
copies or substantial portions of the Software.
|
|
15
|
-
|
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
-
SOFTWARE.
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
[简体中文](https://pnpm.io/zh/) |
|
|
2
|
-
[日本語](https://pnpm.io/ja/) |
|
|
3
|
-
[한국어](https://pnpm.io/ko/) |
|
|
4
|
-
[Italiano](https://pnpm.io/it/) |
|
|
5
|
-
[Português Brasileiro](https://pnpm.io/pt/)
|
|
6
|
-
|
|
7
|
-
<picture>
|
|
8
|
-
<source media="(prefers-color-scheme: light)" srcset="https://i.imgur.com/qlW1eEG.png">
|
|
9
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://i.imgur.com/qlW1eEG.png">
|
|
10
|
-
<img src="https://i.imgur.com/qlW1eEG.png" alt="pnpm">
|
|
11
|
-
</picture>
|
|
12
|
-
|
|
13
|
-
Fast, disk space efficient package manager:
|
|
14
|
-
|
|
15
|
-
* **Fast.** Up to 2x faster than the alternatives (see [benchmark](#benchmark)).
|
|
16
|
-
* **Efficient.** Files inside `node_modules` are linked from a single content-addressable storage.
|
|
17
|
-
* **[Great for monorepos](https://pnpm.io/workspaces).**
|
|
18
|
-
* **Strict.** A package can access only dependencies that are specified in its `package.json`.
|
|
19
|
-
* **Deterministic.** Has a lockfile called `pnpm-lock.yaml`.
|
|
20
|
-
* **Works as a Node.js version manager.** See [pnpm env use](https://pnpm.io/cli/env).
|
|
21
|
-
* **Works everywhere.** Supports Windows, Linux, and macOS.
|
|
22
|
-
* **Battle-tested.** Used in production by teams of [all sizes](https://pnpm.io/users) since 2016.
|
|
23
|
-
* [See the full feature comparison with npm and Yarn](https://pnpm.io/feature-comparison).
|
|
24
|
-
|
|
25
|
-
To quote the [Rush](https://rushjs.io/) team:
|
|
26
|
-
|
|
27
|
-
> Microsoft uses pnpm in Rush repos with hundreds of projects and hundreds of PRs per day, and we’ve found it to be very fast and reliable.
|
|
28
|
-
|
|
29
|
-
[](https://github.com/pnpm/pnpm/releases/latest)
|
|
30
|
-
[](https://opencollective.com/pnpm)
|
|
31
|
-
[](https://opencollective.com/pnpm)
|
|
32
|
-
[](https://x.com/intent/follow?screen_name=pnpmjs®ion=follow_link)
|
|
33
|
-
[](https://stand-with-ukraine.pp.ua)
|
|
34
|
-
|
|
35
|
-
## Platinum Sponsors
|
|
36
|
-
|
|
37
|
-
<table>
|
|
38
|
-
<tbody>
|
|
39
|
-
<tr>
|
|
40
|
-
<td align="center" valign="middle">
|
|
41
|
-
<a href="https://bit.dev/?utm_source=pnpm&utm_medium=readme" target="_blank"><img src="https://pnpm.io/img/users/bit.svg" width="80" alt="Bit"></a>
|
|
42
|
-
</td>
|
|
43
|
-
</tr>
|
|
44
|
-
</tbody>
|
|
45
|
-
</table>
|
|
46
|
-
|
|
47
|
-
## Gold Sponsors
|
|
48
|
-
|
|
49
|
-
<table>
|
|
50
|
-
<tbody>
|
|
51
|
-
<tr>
|
|
52
|
-
<td align="center" valign="middle">
|
|
53
|
-
<a href="https://sanity.io/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
54
|
-
<picture>
|
|
55
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/sanity.svg" />
|
|
56
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/sanity_light.svg" />
|
|
57
|
-
<img src="https://pnpm.io/img/users/sanity.svg" width="120" alt="Sanity" />
|
|
58
|
-
</picture>
|
|
59
|
-
</a>
|
|
60
|
-
</td>
|
|
61
|
-
<td align="center" valign="middle">
|
|
62
|
-
<a href="https://discord.com/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
63
|
-
<picture>
|
|
64
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/discord.svg" />
|
|
65
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/discord_light.svg" />
|
|
66
|
-
<img src="https://pnpm.io/img/users/discord.svg" width="220" alt="Discord" />
|
|
67
|
-
</picture>
|
|
68
|
-
</a>
|
|
69
|
-
</td>
|
|
70
|
-
<td align="center" valign="middle">
|
|
71
|
-
<a href="https://vite.dev/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
72
|
-
<img src="https://pnpm.io/img/users/vitejs.svg" width="42" alt="Vite">
|
|
73
|
-
</a>
|
|
74
|
-
</td>
|
|
75
|
-
</tr>
|
|
76
|
-
<tr>
|
|
77
|
-
<td align="center" valign="middle">
|
|
78
|
-
<a href="https://serpapi.com/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
79
|
-
<picture>
|
|
80
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/serpapi_dark.svg" />
|
|
81
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/serpapi_light.svg" />
|
|
82
|
-
<img src="https://pnpm.io/img/users/serpapi_dark.svg" width="160" alt="SerpApi" />
|
|
83
|
-
</picture>
|
|
84
|
-
</a>
|
|
85
|
-
</td>
|
|
86
|
-
<td align="center" valign="middle">
|
|
87
|
-
<a href="https://coderabbit.ai/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
88
|
-
<picture>
|
|
89
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/coderabbit.svg" />
|
|
90
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/coderabbit_light.svg" />
|
|
91
|
-
<img src="https://pnpm.io/img/users/coderabbit.svg" width="220" alt="CodeRabbit" />
|
|
92
|
-
</picture>
|
|
93
|
-
</a>
|
|
94
|
-
</td>
|
|
95
|
-
<td align="center" valign="middle">
|
|
96
|
-
<a href="https://workleap.com/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
97
|
-
<picture>
|
|
98
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/workleap.svg" />
|
|
99
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/workleap_light.svg" />
|
|
100
|
-
<img src="https://pnpm.io/img/users/workleap.svg" width="190" alt="Workleap" />
|
|
101
|
-
</picture>
|
|
102
|
-
</a>
|
|
103
|
-
</td>
|
|
104
|
-
</tr>
|
|
105
|
-
<tr>
|
|
106
|
-
<td align="center" valign="middle">
|
|
107
|
-
<a href="https://stackblitz.com/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
108
|
-
<picture>
|
|
109
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/stackblitz.svg" />
|
|
110
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/stackblitz_light.svg" />
|
|
111
|
-
<img src="https://pnpm.io/img/users/stackblitz.svg" width="190" alt="Stackblitz" />
|
|
112
|
-
</picture>
|
|
113
|
-
</a>
|
|
114
|
-
</td>
|
|
115
|
-
<td align="center" valign="middle">
|
|
116
|
-
<a href="https://nx.dev/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
117
|
-
<picture>
|
|
118
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/nx.svg" />
|
|
119
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/nx_light.svg" />
|
|
120
|
-
<img src="https://pnpm.io/img/users/nx.svg" width="50" alt="Nx" />
|
|
121
|
-
</picture>
|
|
122
|
-
</a>
|
|
123
|
-
</td>
|
|
124
|
-
</tr>
|
|
125
|
-
</tbody>
|
|
126
|
-
</table>
|
|
127
|
-
|
|
128
|
-
## Silver Sponsors
|
|
129
|
-
|
|
130
|
-
<table>
|
|
131
|
-
<tbody>
|
|
132
|
-
<tr>
|
|
133
|
-
<td align="center" valign="middle">
|
|
134
|
-
<a href="https://uscreen.de/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
135
|
-
<picture>
|
|
136
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/uscreen.svg" />
|
|
137
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/uscreen_light.svg" />
|
|
138
|
-
<img src="https://pnpm.io/img/users/uscreen.svg" width="180" alt="u|screen" />
|
|
139
|
-
</picture>
|
|
140
|
-
</a>
|
|
141
|
-
</td>
|
|
142
|
-
<td align="center" valign="middle">
|
|
143
|
-
<a href="https://leniolabs.com/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
144
|
-
<img src="https://pnpm.io/img/users/leniolabs.jpg" width="40" alt="Leniolabs_">
|
|
145
|
-
</a>
|
|
146
|
-
</td>
|
|
147
|
-
<td align="center" valign="middle">
|
|
148
|
-
<a href="https://depot.dev/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
149
|
-
<picture>
|
|
150
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/depot.svg" />
|
|
151
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/depot_light.svg" />
|
|
152
|
-
<img src="https://pnpm.io/img/users/depot.svg" width="100" alt="Depot" />
|
|
153
|
-
</picture>
|
|
154
|
-
</a>
|
|
155
|
-
</td>
|
|
156
|
-
</tr>
|
|
157
|
-
<tr>
|
|
158
|
-
<td align="center" valign="middle">
|
|
159
|
-
<a href="https://devowl.io/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
160
|
-
<picture>
|
|
161
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/devowlio.svg" />
|
|
162
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/devowlio.svg" />
|
|
163
|
-
<img src="https://pnpm.io/img/users/devowlio.svg" width="100" alt="devowl.io" />
|
|
164
|
-
</picture>
|
|
165
|
-
</a>
|
|
166
|
-
</td>
|
|
167
|
-
<td align="center" valign="middle">
|
|
168
|
-
<a href="https://cerbos.dev/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
169
|
-
<picture>
|
|
170
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/cerbos.svg" />
|
|
171
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/cerbos_light.svg" />
|
|
172
|
-
<img src="https://pnpm.io/img/users/cerbos.svg" width="90" alt="Cerbos" />
|
|
173
|
-
</picture>
|
|
174
|
-
</a>
|
|
175
|
-
</td>
|
|
176
|
-
<td align="center" valign="middle">
|
|
177
|
-
<a href="https://oomol.com/?utm_source=pnpm&utm_medium=readme" target="_blank">
|
|
178
|
-
<picture>
|
|
179
|
-
<source media="(prefers-color-scheme: light)" srcset="https://pnpm.io/img/users/oomol.svg" />
|
|
180
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://pnpm.io/img/users/oomol_light.svg" />
|
|
181
|
-
<img src="https://pnpm.io/img/users/oomol.svg" width="90" alt="OOMOL Studio" />
|
|
182
|
-
</picture>
|
|
183
|
-
</a>
|
|
184
|
-
</td>
|
|
185
|
-
</tr>
|
|
186
|
-
</tbody>
|
|
187
|
-
</table>
|
|
188
|
-
|
|
189
|
-
Support this project by [becoming a sponsor](https://opencollective.com/pnpm#sponsor).
|
|
190
|
-
|
|
191
|
-
## Background
|
|
192
|
-
|
|
193
|
-
pnpm uses a content-addressable filesystem to store all files from all module directories on a disk.
|
|
194
|
-
When using npm, if you have 100 projects using lodash, you will have 100 copies of lodash on disk.
|
|
195
|
-
With pnpm, lodash will be stored in a content-addressable storage, so:
|
|
196
|
-
|
|
197
|
-
1. If you depend on different versions of lodash, only the files that differ are added to the store.
|
|
198
|
-
If lodash has 100 files, and a new version has a change only in one of those files,
|
|
199
|
-
`pnpm update` will only add 1 new file to the storage.
|
|
200
|
-
1. All the files are saved in a single place on the disk. When packages are installed, their files are linked
|
|
201
|
-
from that single place consuming no additional disk space. Linking is performed using either hard-links or reflinks (copy-on-write).
|
|
202
|
-
|
|
203
|
-
As a result, you save gigabytes of space on your disk and you have a lot faster installations!
|
|
204
|
-
If you'd like more details about the unique `node_modules` structure that pnpm creates and
|
|
205
|
-
why it works fine with the Node.js ecosystem, read this small article: [Flat node_modules is not the only way](https://pnpm.io/blog/2020/05/27/flat-node-modules-is-not-the-only-way).
|
|
206
|
-
|
|
207
|
-
💖 Like this project? Let people know with a [tweet](https://r.pnpm.io/tweet)
|
|
208
|
-
|
|
209
|
-
## Installation
|
|
210
|
-
|
|
211
|
-
For installation options [visit our website](https://pnpm.io/installation).
|
|
212
|
-
|
|
213
|
-
## Usage
|
|
214
|
-
|
|
215
|
-
Just use pnpm in place of npm/Yarn. E.g., install dependencies via:
|
|
216
|
-
|
|
217
|
-
```
|
|
218
|
-
pnpm install
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
For more advanced usage, read [pnpm CLI](https://pnpm.io/pnpm-cli) on our website, or run `pnpm help`.
|
|
222
|
-
|
|
223
|
-
## Benchmark
|
|
224
|
-
|
|
225
|
-
pnpm is up to 2x faster than npm and Yarn classic. See all benchmarks [here](https://r.pnpm.io/benchmarks).
|
|
226
|
-
|
|
227
|
-
Benchmarks on an app with lots of dependencies:
|
|
228
|
-
|
|
229
|
-

|
|
230
|
-
|
|
231
|
-
## Support
|
|
232
|
-
|
|
233
|
-
- [Frequently Asked Questions](https://pnpm.io/faq)
|
|
234
|
-
- [X](https://x.com/pnpmjs)
|
|
235
|
-
- [Bluesky](https://bsky.app/profile/pnpm.io)
|
|
236
|
-
|
|
237
|
-
## License
|
|
238
|
-
|
|
239
|
-
[MIT](https://github.com/pnpm/pnpm/blob/main/LICENSE)
|
|
240
|
-
|