@cherishxn/agent-scaffold 0.0.0-stage → 1.1.0
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/LICENSE +21 -0
- package/README.md +99 -2
- package/THIRD_PARTY_NOTICES.md +18 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +105 -0
- package/dist/diagnostics.d.ts +10 -0
- package/dist/diagnostics.js +27 -0
- package/dist/generate.d.ts +55 -0
- package/dist/generate.js +159 -0
- package/dist/model.d.ts +33 -0
- package/dist/model.js +24 -0
- package/dist/verify.d.ts +67 -0
- package/dist/verify.js +278 -0
- package/package.json +52 -4
- package/schemas/manifest.json +171 -0
- package/schemas/plan.json +164 -0
- package/schemas/result.json +97 -0
- package/schemas/spec.json +50 -0
- package/skills/scaffold-use/SKILL.md +24 -0
- package/templates/catalog.json +37 -0
- package/templates/next-fullstack-antd/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/next-fullstack-antd/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/next-fullstack-antd/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/next-fullstack-antd/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/next-fullstack-antd/.dockerignore +18 -0
- package/templates/next-fullstack-antd/.env.example +13 -0
- package/templates/next-fullstack-antd/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/next-fullstack-antd/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/next-fullstack-antd/.scaffold-checks.json +7 -0
- package/templates/next-fullstack-antd/AGENTS.md +11 -0
- package/templates/next-fullstack-antd/CLAUDE.md +1 -0
- package/templates/next-fullstack-antd/DESIGN.md +208 -0
- package/templates/next-fullstack-antd/LICENSE +21 -0
- package/templates/next-fullstack-antd/README.md +64 -0
- package/templates/next-fullstack-antd/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/next-fullstack-antd/compose.yaml +18 -0
- package/templates/next-fullstack-antd/design/guide.md +61 -0
- package/templates/next-fullstack-antd/design/layout.css +6 -0
- package/templates/next-fullstack-antd/design/structure.json +107 -0
- package/templates/next-fullstack-antd/design/tokens.json +171 -0
- package/templates/next-fullstack-antd/design/widgets.css +30 -0
- package/templates/next-fullstack-antd/design/widgets.json +233 -0
- package/templates/next-fullstack-antd/docs/PROJECT.md +32 -0
- package/templates/next-fullstack-antd/docs/api.d.ts +544 -0
- package/templates/next-fullstack-antd/docs/openapi.json +461 -0
- package/templates/next-fullstack-antd/gitignore.template +19 -0
- package/templates/next-fullstack-antd/licenses/fastapi.txt +21 -0
- package/templates/next-fullstack-antd/licenses/nest.txt +22 -0
- package/templates/next-fullstack-antd/licenses/next.txt +21 -0
- package/templates/next-fullstack-antd/licenses/shadcn.txt +21 -0
- package/templates/next-fullstack-antd/licenses/sources.json +27 -0
- package/templates/next-fullstack-antd/licenses/spring.txt +202 -0
- package/templates/next-fullstack-antd/package-lock.json +494 -0
- package/templates/next-fullstack-antd/package.json +26 -0
- package/templates/next-fullstack-antd/playwright.config.ts +3 -0
- package/templates/next-fullstack-antd/project.json +8 -0
- package/templates/next-fullstack-antd/scripts/api-check.mjs +18 -0
- package/templates/next-fullstack-antd/scripts/api-contract.mjs +46 -0
- package/templates/next-fullstack-antd/scripts/design-coverage.mjs +20 -0
- package/templates/next-fullstack-antd/scripts/design-next-cleanup.mjs +13 -0
- package/templates/next-fullstack-antd/scripts/design-verify.mjs +154 -0
- package/templates/next-fullstack-antd/scripts/design.mjs +108 -0
- package/templates/next-fullstack-antd/scripts/project.mjs +120 -0
- package/templates/next-fullstack-antd/tests/contract-client.ts +20 -0
- package/templates/next-fullstack-antd/tests/contract.spec.ts +49 -0
- package/templates/next-fullstack-antd/tests/design/harness.tsx +63 -0
- package/templates/next-fullstack-antd/tests/ui.spec.ts +61 -0
- package/templates/next-fullstack-antd/web/Dockerfile +12 -0
- package/templates/next-fullstack-antd/web/app/api/auth/login/route.ts +1 -0
- package/templates/next-fullstack-antd/web/app/api/auth/logout/route.ts +1 -0
- package/templates/next-fullstack-antd/web/app/api/auth/me/route.ts +1 -0
- package/templates/next-fullstack-antd/web/app/api/health/route.ts +1 -0
- package/templates/next-fullstack-antd/web/app/api/records/[id]/route.ts +5 -0
- package/templates/next-fullstack-antd/web/app/api/records/route.ts +3 -0
- package/templates/next-fullstack-antd/web/app/layout.tsx +5 -0
- package/templates/next-fullstack-antd/web/app/page.tsx +2 -0
- package/templates/next-fullstack-antd/web/eslint.config.mjs +3 -0
- package/templates/next-fullstack-antd/web/lib/api.ts +35 -0
- package/templates/next-fullstack-antd/web/lib/auth.ts +10 -0
- package/templates/next-fullstack-antd/web/lib/db.ts +3 -0
- package/templates/next-fullstack-antd/web/lib/session.test.ts +15 -0
- package/templates/next-fullstack-antd/web/lib/validation.test.ts +3 -0
- package/templates/next-fullstack-antd/web/lib/validation.ts +5 -0
- package/templates/next-fullstack-antd/web/next-env.d.ts +7 -0
- package/templates/next-fullstack-antd/web/next.config.ts +3 -0
- package/templates/next-fullstack-antd/web/package.json +35 -0
- package/templates/next-fullstack-antd/web/pnpm-lock.yaml +3756 -0
- package/templates/next-fullstack-antd/web/pnpm-workspace.yaml +7 -0
- package/templates/next-fullstack-antd/web/prisma/migrations/202610190001_initial/migration.sql +99 -0
- package/templates/next-fullstack-antd/web/prisma/migrations/migration_lock.toml +1 -0
- package/templates/next-fullstack-antd/web/prisma/schema.prisma +72 -0
- package/templates/next-fullstack-antd/web/scripts/seed.ts +4 -0
- package/templates/next-fullstack-antd/web/src/App.tsx +29 -0
- package/templates/next-fullstack-antd/web/src/design-layout.css +7 -0
- package/templates/next-fullstack-antd/web/src/design-runtime.json +511 -0
- package/templates/next-fullstack-antd/web/src/design-tokens.css +168 -0
- package/templates/next-fullstack-antd/web/src/design-widgets.css +31 -0
- package/templates/next-fullstack-antd/web/src/structure-view.tsx +16 -0
- package/templates/next-fullstack-antd/web/src/styles.css +3 -0
- package/templates/next-fullstack-antd/web/src/ui.tsx +30 -0
- package/templates/next-fullstack-antd/web/src/widget-icon.tsx +5 -0
- package/templates/next-fullstack-antd/web/src/widget-types.ts +13 -0
- package/templates/next-fullstack-antd/web/src/workspace-model.ts +85 -0
- package/templates/next-fullstack-antd/web/tsconfig.json +42 -0
- package/templates/next-fullstack-antd/web/vitest.config.ts +2 -0
- package/templates/next-fullstack-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/next-fullstack-shadcn/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/next-fullstack-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/next-fullstack-shadcn/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/next-fullstack-shadcn/.dockerignore +18 -0
- package/templates/next-fullstack-shadcn/.env.example +13 -0
- package/templates/next-fullstack-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/next-fullstack-shadcn/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/next-fullstack-shadcn/.scaffold-checks.json +7 -0
- package/templates/next-fullstack-shadcn/AGENTS.md +11 -0
- package/templates/next-fullstack-shadcn/CLAUDE.md +1 -0
- package/templates/next-fullstack-shadcn/DESIGN.md +208 -0
- package/templates/next-fullstack-shadcn/LICENSE +21 -0
- package/templates/next-fullstack-shadcn/README.md +64 -0
- package/templates/next-fullstack-shadcn/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/next-fullstack-shadcn/compose.yaml +18 -0
- package/templates/next-fullstack-shadcn/design/guide.md +61 -0
- package/templates/next-fullstack-shadcn/design/layout.css +6 -0
- package/templates/next-fullstack-shadcn/design/structure.json +107 -0
- package/templates/next-fullstack-shadcn/design/tokens.json +171 -0
- package/templates/next-fullstack-shadcn/design/widgets.css +30 -0
- package/templates/next-fullstack-shadcn/design/widgets.json +233 -0
- package/templates/next-fullstack-shadcn/docs/PROJECT.md +32 -0
- package/templates/next-fullstack-shadcn/docs/api.d.ts +544 -0
- package/templates/next-fullstack-shadcn/docs/openapi.json +461 -0
- package/templates/next-fullstack-shadcn/gitignore.template +19 -0
- package/templates/next-fullstack-shadcn/licenses/fastapi.txt +21 -0
- package/templates/next-fullstack-shadcn/licenses/nest.txt +22 -0
- package/templates/next-fullstack-shadcn/licenses/next.txt +21 -0
- package/templates/next-fullstack-shadcn/licenses/shadcn.txt +21 -0
- package/templates/next-fullstack-shadcn/licenses/sources.json +27 -0
- package/templates/next-fullstack-shadcn/licenses/spring.txt +202 -0
- package/templates/next-fullstack-shadcn/package-lock.json +494 -0
- package/templates/next-fullstack-shadcn/package.json +26 -0
- package/templates/next-fullstack-shadcn/playwright.config.ts +3 -0
- package/templates/next-fullstack-shadcn/project.json +8 -0
- package/templates/next-fullstack-shadcn/scripts/api-check.mjs +18 -0
- package/templates/next-fullstack-shadcn/scripts/api-contract.mjs +46 -0
- package/templates/next-fullstack-shadcn/scripts/design-coverage.mjs +20 -0
- package/templates/next-fullstack-shadcn/scripts/design-next-cleanup.mjs +13 -0
- package/templates/next-fullstack-shadcn/scripts/design-verify.mjs +154 -0
- package/templates/next-fullstack-shadcn/scripts/design.mjs +108 -0
- package/templates/next-fullstack-shadcn/scripts/project.mjs +120 -0
- package/templates/next-fullstack-shadcn/tests/contract-client.ts +20 -0
- package/templates/next-fullstack-shadcn/tests/contract.spec.ts +49 -0
- package/templates/next-fullstack-shadcn/tests/design/harness.tsx +63 -0
- package/templates/next-fullstack-shadcn/tests/ui.spec.ts +61 -0
- package/templates/next-fullstack-shadcn/web/Dockerfile +12 -0
- package/templates/next-fullstack-shadcn/web/app/api/auth/login/route.ts +1 -0
- package/templates/next-fullstack-shadcn/web/app/api/auth/logout/route.ts +1 -0
- package/templates/next-fullstack-shadcn/web/app/api/auth/me/route.ts +1 -0
- package/templates/next-fullstack-shadcn/web/app/api/health/route.ts +1 -0
- package/templates/next-fullstack-shadcn/web/app/api/records/[id]/route.ts +5 -0
- package/templates/next-fullstack-shadcn/web/app/api/records/route.ts +3 -0
- package/templates/next-fullstack-shadcn/web/app/layout.tsx +4 -0
- package/templates/next-fullstack-shadcn/web/app/page.tsx +2 -0
- package/templates/next-fullstack-shadcn/web/eslint.config.mjs +3 -0
- package/templates/next-fullstack-shadcn/web/lib/api.ts +35 -0
- package/templates/next-fullstack-shadcn/web/lib/auth.ts +10 -0
- package/templates/next-fullstack-shadcn/web/lib/db.ts +3 -0
- package/templates/next-fullstack-shadcn/web/lib/session.test.ts +15 -0
- package/templates/next-fullstack-shadcn/web/lib/validation.test.ts +3 -0
- package/templates/next-fullstack-shadcn/web/lib/validation.ts +5 -0
- package/templates/next-fullstack-shadcn/web/next-env.d.ts +7 -0
- package/templates/next-fullstack-shadcn/web/next.config.ts +3 -0
- package/templates/next-fullstack-shadcn/web/package.json +39 -0
- package/templates/next-fullstack-shadcn/web/pnpm-lock.yaml +3286 -0
- package/templates/next-fullstack-shadcn/web/pnpm-workspace.yaml +7 -0
- package/templates/next-fullstack-shadcn/web/postcss.config.mjs +1 -0
- package/templates/next-fullstack-shadcn/web/prisma/migrations/202610190001_initial/migration.sql +99 -0
- package/templates/next-fullstack-shadcn/web/prisma/migrations/migration_lock.toml +1 -0
- package/templates/next-fullstack-shadcn/web/prisma/schema.prisma +72 -0
- package/templates/next-fullstack-shadcn/web/scripts/seed.ts +4 -0
- package/templates/next-fullstack-shadcn/web/src/App.tsx +30 -0
- package/templates/next-fullstack-shadcn/web/src/design-layout.css +7 -0
- package/templates/next-fullstack-shadcn/web/src/design-runtime.json +511 -0
- package/templates/next-fullstack-shadcn/web/src/design-tokens.css +168 -0
- package/templates/next-fullstack-shadcn/web/src/design-widgets.css +31 -0
- package/templates/next-fullstack-shadcn/web/src/structure-view.tsx +16 -0
- package/templates/next-fullstack-shadcn/web/src/styles.css +3 -0
- package/templates/next-fullstack-shadcn/web/src/tailwind.css +2 -0
- package/templates/next-fullstack-shadcn/web/src/ui.tsx +13 -0
- package/templates/next-fullstack-shadcn/web/src/widget-icon.tsx +5 -0
- package/templates/next-fullstack-shadcn/web/src/widget-types.ts +13 -0
- package/templates/next-fullstack-shadcn/web/src/workspace-model.ts +85 -0
- package/templates/next-fullstack-shadcn/web/tsconfig.json +42 -0
- package/templates/next-fullstack-shadcn/web/vitest.config.ts +2 -0
- package/templates/react-fastapi-antd/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/react-fastapi-antd/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/react-fastapi-antd/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/react-fastapi-antd/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/react-fastapi-antd/.dockerignore +18 -0
- package/templates/react-fastapi-antd/.env.example +13 -0
- package/templates/react-fastapi-antd/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/react-fastapi-antd/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/react-fastapi-antd/.scaffold-checks.json +7 -0
- package/templates/react-fastapi-antd/AGENTS.md +11 -0
- package/templates/react-fastapi-antd/CLAUDE.md +1 -0
- package/templates/react-fastapi-antd/DESIGN.md +208 -0
- package/templates/react-fastapi-antd/LICENSE +21 -0
- package/templates/react-fastapi-antd/README.md +64 -0
- package/templates/react-fastapi-antd/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/react-fastapi-antd/backend/.python-version +1 -0
- package/templates/react-fastapi-antd/backend/Dockerfile +10 -0
- package/templates/react-fastapi-antd/backend/alembic.ini +3 -0
- package/templates/react-fastapi-antd/backend/app/__init__.py +0 -0
- package/templates/react-fastapi-antd/backend/app/core/__init__.py +0 -0
- package/templates/react-fastapi-antd/backend/app/core/security.py +25 -0
- package/templates/react-fastapi-antd/backend/app/db.py +11 -0
- package/templates/react-fastapi-antd/backend/app/main.py +146 -0
- package/templates/react-fastapi-antd/backend/app/models.py +21 -0
- package/templates/react-fastapi-antd/backend/app/seed.py +21 -0
- package/templates/react-fastapi-antd/backend/migrations/env.py +9 -0
- package/templates/react-fastapi-antd/backend/migrations/versions/0001_initial.py +18 -0
- package/templates/react-fastapi-antd/backend/pyproject.toml +16 -0
- package/templates/react-fastapi-antd/backend/tests/test_api.py +27 -0
- package/templates/react-fastapi-antd/backend/uv.lock +1085 -0
- package/templates/react-fastapi-antd/compose.yaml +18 -0
- package/templates/react-fastapi-antd/design/guide.md +61 -0
- package/templates/react-fastapi-antd/design/layout.css +6 -0
- package/templates/react-fastapi-antd/design/structure.json +107 -0
- package/templates/react-fastapi-antd/design/tokens.json +171 -0
- package/templates/react-fastapi-antd/design/widgets.css +30 -0
- package/templates/react-fastapi-antd/design/widgets.json +233 -0
- package/templates/react-fastapi-antd/docs/PROJECT.md +32 -0
- package/templates/react-fastapi-antd/docs/api.d.ts +544 -0
- package/templates/react-fastapi-antd/docs/openapi.json +461 -0
- package/templates/react-fastapi-antd/gitignore.template +19 -0
- package/templates/react-fastapi-antd/licenses/fastapi.txt +21 -0
- package/templates/react-fastapi-antd/licenses/nest.txt +22 -0
- package/templates/react-fastapi-antd/licenses/next.txt +21 -0
- package/templates/react-fastapi-antd/licenses/shadcn.txt +21 -0
- package/templates/react-fastapi-antd/licenses/sources.json +27 -0
- package/templates/react-fastapi-antd/licenses/spring.txt +202 -0
- package/templates/react-fastapi-antd/package-lock.json +494 -0
- package/templates/react-fastapi-antd/package.json +26 -0
- package/templates/react-fastapi-antd/playwright.config.ts +3 -0
- package/templates/react-fastapi-antd/project.json +8 -0
- package/templates/react-fastapi-antd/scripts/api-check.mjs +18 -0
- package/templates/react-fastapi-antd/scripts/api-contract.mjs +46 -0
- package/templates/react-fastapi-antd/scripts/design-coverage.mjs +20 -0
- package/templates/react-fastapi-antd/scripts/design-next-cleanup.mjs +13 -0
- package/templates/react-fastapi-antd/scripts/design-verify.mjs +154 -0
- package/templates/react-fastapi-antd/scripts/design.mjs +108 -0
- package/templates/react-fastapi-antd/scripts/project.mjs +120 -0
- package/templates/react-fastapi-antd/tests/contract-client.ts +20 -0
- package/templates/react-fastapi-antd/tests/contract.spec.ts +49 -0
- package/templates/react-fastapi-antd/tests/design/harness.tsx +63 -0
- package/templates/react-fastapi-antd/tests/ui.spec.ts +61 -0
- package/templates/react-fastapi-antd/web/bun.lock +442 -0
- package/templates/react-fastapi-antd/web/eslint.config.mjs +3 -0
- package/templates/react-fastapi-antd/web/index.html +1 -0
- package/templates/react-fastapi-antd/web/package.json +28 -0
- package/templates/react-fastapi-antd/web/src/App.tsx +29 -0
- package/templates/react-fastapi-antd/web/src/design-layout.css +7 -0
- package/templates/react-fastapi-antd/web/src/design-runtime.json +511 -0
- package/templates/react-fastapi-antd/web/src/design-tokens.css +168 -0
- package/templates/react-fastapi-antd/web/src/design-widgets.css +31 -0
- package/templates/react-fastapi-antd/web/src/main.tsx +6 -0
- package/templates/react-fastapi-antd/web/src/structure-view.tsx +16 -0
- package/templates/react-fastapi-antd/web/src/styles.css +3 -0
- package/templates/react-fastapi-antd/web/src/ui.tsx +30 -0
- package/templates/react-fastapi-antd/web/src/widget-icon.tsx +5 -0
- package/templates/react-fastapi-antd/web/src/widget-types.ts +13 -0
- package/templates/react-fastapi-antd/web/src/workspace-model.ts +85 -0
- package/templates/react-fastapi-antd/web/tsconfig.json +22 -0
- package/templates/react-fastapi-antd/web/vite.config.ts +3 -0
- package/templates/react-fastapi-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/react-fastapi-shadcn/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/react-fastapi-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/react-fastapi-shadcn/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/react-fastapi-shadcn/.dockerignore +18 -0
- package/templates/react-fastapi-shadcn/.env.example +13 -0
- package/templates/react-fastapi-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/react-fastapi-shadcn/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/react-fastapi-shadcn/.scaffold-checks.json +7 -0
- package/templates/react-fastapi-shadcn/AGENTS.md +11 -0
- package/templates/react-fastapi-shadcn/CLAUDE.md +1 -0
- package/templates/react-fastapi-shadcn/DESIGN.md +208 -0
- package/templates/react-fastapi-shadcn/LICENSE +21 -0
- package/templates/react-fastapi-shadcn/README.md +64 -0
- package/templates/react-fastapi-shadcn/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/react-fastapi-shadcn/backend/.python-version +1 -0
- package/templates/react-fastapi-shadcn/backend/Dockerfile +10 -0
- package/templates/react-fastapi-shadcn/backend/alembic.ini +3 -0
- package/templates/react-fastapi-shadcn/backend/app/__init__.py +0 -0
- package/templates/react-fastapi-shadcn/backend/app/core/__init__.py +0 -0
- package/templates/react-fastapi-shadcn/backend/app/core/security.py +25 -0
- package/templates/react-fastapi-shadcn/backend/app/db.py +11 -0
- package/templates/react-fastapi-shadcn/backend/app/main.py +146 -0
- package/templates/react-fastapi-shadcn/backend/app/models.py +21 -0
- package/templates/react-fastapi-shadcn/backend/app/seed.py +21 -0
- package/templates/react-fastapi-shadcn/backend/migrations/env.py +9 -0
- package/templates/react-fastapi-shadcn/backend/migrations/versions/0001_initial.py +18 -0
- package/templates/react-fastapi-shadcn/backend/pyproject.toml +16 -0
- package/templates/react-fastapi-shadcn/backend/tests/test_api.py +27 -0
- package/templates/react-fastapi-shadcn/backend/uv.lock +1085 -0
- package/templates/react-fastapi-shadcn/compose.yaml +18 -0
- package/templates/react-fastapi-shadcn/design/guide.md +61 -0
- package/templates/react-fastapi-shadcn/design/layout.css +6 -0
- package/templates/react-fastapi-shadcn/design/structure.json +107 -0
- package/templates/react-fastapi-shadcn/design/tokens.json +171 -0
- package/templates/react-fastapi-shadcn/design/widgets.css +30 -0
- package/templates/react-fastapi-shadcn/design/widgets.json +233 -0
- package/templates/react-fastapi-shadcn/docs/PROJECT.md +32 -0
- package/templates/react-fastapi-shadcn/docs/api.d.ts +544 -0
- package/templates/react-fastapi-shadcn/docs/openapi.json +461 -0
- package/templates/react-fastapi-shadcn/gitignore.template +19 -0
- package/templates/react-fastapi-shadcn/licenses/fastapi.txt +21 -0
- package/templates/react-fastapi-shadcn/licenses/nest.txt +22 -0
- package/templates/react-fastapi-shadcn/licenses/next.txt +21 -0
- package/templates/react-fastapi-shadcn/licenses/shadcn.txt +21 -0
- package/templates/react-fastapi-shadcn/licenses/sources.json +27 -0
- package/templates/react-fastapi-shadcn/licenses/spring.txt +202 -0
- package/templates/react-fastapi-shadcn/package-lock.json +494 -0
- package/templates/react-fastapi-shadcn/package.json +26 -0
- package/templates/react-fastapi-shadcn/playwright.config.ts +3 -0
- package/templates/react-fastapi-shadcn/project.json +8 -0
- package/templates/react-fastapi-shadcn/scripts/api-check.mjs +18 -0
- package/templates/react-fastapi-shadcn/scripts/api-contract.mjs +46 -0
- package/templates/react-fastapi-shadcn/scripts/design-coverage.mjs +20 -0
- package/templates/react-fastapi-shadcn/scripts/design-next-cleanup.mjs +13 -0
- package/templates/react-fastapi-shadcn/scripts/design-verify.mjs +154 -0
- package/templates/react-fastapi-shadcn/scripts/design.mjs +108 -0
- package/templates/react-fastapi-shadcn/scripts/project.mjs +120 -0
- package/templates/react-fastapi-shadcn/tests/contract-client.ts +20 -0
- package/templates/react-fastapi-shadcn/tests/contract.spec.ts +49 -0
- package/templates/react-fastapi-shadcn/tests/design/harness.tsx +63 -0
- package/templates/react-fastapi-shadcn/tests/ui.spec.ts +61 -0
- package/templates/react-fastapi-shadcn/web/bun.lock +413 -0
- package/templates/react-fastapi-shadcn/web/eslint.config.mjs +3 -0
- package/templates/react-fastapi-shadcn/web/index.html +1 -0
- package/templates/react-fastapi-shadcn/web/package.json +33 -0
- package/templates/react-fastapi-shadcn/web/src/App.tsx +30 -0
- package/templates/react-fastapi-shadcn/web/src/design-layout.css +7 -0
- package/templates/react-fastapi-shadcn/web/src/design-runtime.json +511 -0
- package/templates/react-fastapi-shadcn/web/src/design-tokens.css +168 -0
- package/templates/react-fastapi-shadcn/web/src/design-widgets.css +31 -0
- package/templates/react-fastapi-shadcn/web/src/main.tsx +6 -0
- package/templates/react-fastapi-shadcn/web/src/structure-view.tsx +16 -0
- package/templates/react-fastapi-shadcn/web/src/styles.css +3 -0
- package/templates/react-fastapi-shadcn/web/src/tailwind.css +2 -0
- package/templates/react-fastapi-shadcn/web/src/ui.tsx +13 -0
- package/templates/react-fastapi-shadcn/web/src/widget-icon.tsx +5 -0
- package/templates/react-fastapi-shadcn/web/src/widget-types.ts +13 -0
- package/templates/react-fastapi-shadcn/web/src/workspace-model.ts +85 -0
- package/templates/react-fastapi-shadcn/web/tsconfig.json +22 -0
- package/templates/react-fastapi-shadcn/web/vite.config.ts +4 -0
- package/templates/react-nest-antd/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/react-nest-antd/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/react-nest-antd/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/react-nest-antd/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/react-nest-antd/.dockerignore +18 -0
- package/templates/react-nest-antd/.env.example +13 -0
- package/templates/react-nest-antd/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/react-nest-antd/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/react-nest-antd/.scaffold-checks.json +7 -0
- package/templates/react-nest-antd/AGENTS.md +11 -0
- package/templates/react-nest-antd/CLAUDE.md +1 -0
- package/templates/react-nest-antd/DESIGN.md +208 -0
- package/templates/react-nest-antd/LICENSE +21 -0
- package/templates/react-nest-antd/README.md +64 -0
- package/templates/react-nest-antd/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/react-nest-antd/backend/Dockerfile +12 -0
- package/templates/react-nest-antd/backend/eslint.config.mjs +3 -0
- package/templates/react-nest-antd/backend/jest.config.cjs +1 -0
- package/templates/react-nest-antd/backend/package.json +40 -0
- package/templates/react-nest-antd/backend/pnpm-lock.yaml +5165 -0
- package/templates/react-nest-antd/backend/pnpm-workspace.yaml +6 -0
- package/templates/react-nest-antd/backend/prisma/migrations/202610190001_initial/migration.sql +3 -0
- package/templates/react-nest-antd/backend/prisma/migrations/migration_lock.toml +1 -0
- package/templates/react-nest-antd/backend/prisma/schema.prisma +25 -0
- package/templates/react-nest-antd/backend/scripts/seed.ts +4 -0
- package/templates/react-nest-antd/backend/src/app.module.ts +43 -0
- package/templates/react-nest-antd/backend/src/main.ts +6 -0
- package/templates/react-nest-antd/backend/src/password.ts +3 -0
- package/templates/react-nest-antd/backend/src/validation.ts +7 -0
- package/templates/react-nest-antd/backend/test/api.test.ts +25 -0
- package/templates/react-nest-antd/backend/tsconfig.build.json +15 -0
- package/templates/react-nest-antd/backend/tsconfig.json +17 -0
- package/templates/react-nest-antd/compose.yaml +18 -0
- package/templates/react-nest-antd/design/guide.md +61 -0
- package/templates/react-nest-antd/design/layout.css +6 -0
- package/templates/react-nest-antd/design/structure.json +107 -0
- package/templates/react-nest-antd/design/tokens.json +171 -0
- package/templates/react-nest-antd/design/widgets.css +30 -0
- package/templates/react-nest-antd/design/widgets.json +233 -0
- package/templates/react-nest-antd/docs/PROJECT.md +32 -0
- package/templates/react-nest-antd/docs/api.d.ts +544 -0
- package/templates/react-nest-antd/docs/openapi.json +461 -0
- package/templates/react-nest-antd/gitignore.template +19 -0
- package/templates/react-nest-antd/licenses/fastapi.txt +21 -0
- package/templates/react-nest-antd/licenses/nest.txt +22 -0
- package/templates/react-nest-antd/licenses/next.txt +21 -0
- package/templates/react-nest-antd/licenses/shadcn.txt +21 -0
- package/templates/react-nest-antd/licenses/sources.json +27 -0
- package/templates/react-nest-antd/licenses/spring.txt +202 -0
- package/templates/react-nest-antd/package-lock.json +494 -0
- package/templates/react-nest-antd/package.json +26 -0
- package/templates/react-nest-antd/playwright.config.ts +3 -0
- package/templates/react-nest-antd/project.json +8 -0
- package/templates/react-nest-antd/scripts/api-check.mjs +18 -0
- package/templates/react-nest-antd/scripts/api-contract.mjs +46 -0
- package/templates/react-nest-antd/scripts/design-coverage.mjs +20 -0
- package/templates/react-nest-antd/scripts/design-next-cleanup.mjs +13 -0
- package/templates/react-nest-antd/scripts/design-verify.mjs +154 -0
- package/templates/react-nest-antd/scripts/design.mjs +108 -0
- package/templates/react-nest-antd/scripts/project.mjs +120 -0
- package/templates/react-nest-antd/tests/contract-client.ts +20 -0
- package/templates/react-nest-antd/tests/contract.spec.ts +49 -0
- package/templates/react-nest-antd/tests/design/harness.tsx +63 -0
- package/templates/react-nest-antd/tests/ui.spec.ts +61 -0
- package/templates/react-nest-antd/web/eslint.config.mjs +3 -0
- package/templates/react-nest-antd/web/index.html +1 -0
- package/templates/react-nest-antd/web/package.json +28 -0
- package/templates/react-nest-antd/web/pnpm-lock.yaml +2215 -0
- package/templates/react-nest-antd/web/src/App.tsx +29 -0
- package/templates/react-nest-antd/web/src/design-layout.css +7 -0
- package/templates/react-nest-antd/web/src/design-runtime.json +511 -0
- package/templates/react-nest-antd/web/src/design-tokens.css +168 -0
- package/templates/react-nest-antd/web/src/design-widgets.css +31 -0
- package/templates/react-nest-antd/web/src/main.tsx +6 -0
- package/templates/react-nest-antd/web/src/structure-view.tsx +16 -0
- package/templates/react-nest-antd/web/src/styles.css +3 -0
- package/templates/react-nest-antd/web/src/ui.tsx +30 -0
- package/templates/react-nest-antd/web/src/widget-icon.tsx +5 -0
- package/templates/react-nest-antd/web/src/widget-types.ts +13 -0
- package/templates/react-nest-antd/web/src/workspace-model.ts +85 -0
- package/templates/react-nest-antd/web/tsconfig.json +22 -0
- package/templates/react-nest-antd/web/vite.config.ts +3 -0
- package/templates/react-nest-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/react-nest-shadcn/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/react-nest-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/react-nest-shadcn/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/react-nest-shadcn/.dockerignore +18 -0
- package/templates/react-nest-shadcn/.env.example +13 -0
- package/templates/react-nest-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/react-nest-shadcn/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/react-nest-shadcn/.scaffold-checks.json +7 -0
- package/templates/react-nest-shadcn/AGENTS.md +11 -0
- package/templates/react-nest-shadcn/CLAUDE.md +1 -0
- package/templates/react-nest-shadcn/DESIGN.md +208 -0
- package/templates/react-nest-shadcn/LICENSE +21 -0
- package/templates/react-nest-shadcn/README.md +64 -0
- package/templates/react-nest-shadcn/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/react-nest-shadcn/backend/Dockerfile +12 -0
- package/templates/react-nest-shadcn/backend/eslint.config.mjs +3 -0
- package/templates/react-nest-shadcn/backend/jest.config.cjs +1 -0
- package/templates/react-nest-shadcn/backend/package.json +40 -0
- package/templates/react-nest-shadcn/backend/pnpm-lock.yaml +5165 -0
- package/templates/react-nest-shadcn/backend/pnpm-workspace.yaml +6 -0
- package/templates/react-nest-shadcn/backend/prisma/migrations/202610190001_initial/migration.sql +3 -0
- package/templates/react-nest-shadcn/backend/prisma/migrations/migration_lock.toml +1 -0
- package/templates/react-nest-shadcn/backend/prisma/schema.prisma +25 -0
- package/templates/react-nest-shadcn/backend/scripts/seed.ts +4 -0
- package/templates/react-nest-shadcn/backend/src/app.module.ts +43 -0
- package/templates/react-nest-shadcn/backend/src/main.ts +6 -0
- package/templates/react-nest-shadcn/backend/src/password.ts +3 -0
- package/templates/react-nest-shadcn/backend/src/validation.ts +7 -0
- package/templates/react-nest-shadcn/backend/test/api.test.ts +25 -0
- package/templates/react-nest-shadcn/backend/tsconfig.build.json +15 -0
- package/templates/react-nest-shadcn/backend/tsconfig.json +17 -0
- package/templates/react-nest-shadcn/compose.yaml +18 -0
- package/templates/react-nest-shadcn/design/guide.md +61 -0
- package/templates/react-nest-shadcn/design/layout.css +6 -0
- package/templates/react-nest-shadcn/design/structure.json +107 -0
- package/templates/react-nest-shadcn/design/tokens.json +171 -0
- package/templates/react-nest-shadcn/design/widgets.css +30 -0
- package/templates/react-nest-shadcn/design/widgets.json +233 -0
- package/templates/react-nest-shadcn/docs/PROJECT.md +32 -0
- package/templates/react-nest-shadcn/docs/api.d.ts +544 -0
- package/templates/react-nest-shadcn/docs/openapi.json +461 -0
- package/templates/react-nest-shadcn/gitignore.template +19 -0
- package/templates/react-nest-shadcn/licenses/fastapi.txt +21 -0
- package/templates/react-nest-shadcn/licenses/nest.txt +22 -0
- package/templates/react-nest-shadcn/licenses/next.txt +21 -0
- package/templates/react-nest-shadcn/licenses/shadcn.txt +21 -0
- package/templates/react-nest-shadcn/licenses/sources.json +27 -0
- package/templates/react-nest-shadcn/licenses/spring.txt +202 -0
- package/templates/react-nest-shadcn/package-lock.json +494 -0
- package/templates/react-nest-shadcn/package.json +26 -0
- package/templates/react-nest-shadcn/playwright.config.ts +3 -0
- package/templates/react-nest-shadcn/project.json +8 -0
- package/templates/react-nest-shadcn/scripts/api-check.mjs +18 -0
- package/templates/react-nest-shadcn/scripts/api-contract.mjs +46 -0
- package/templates/react-nest-shadcn/scripts/design-coverage.mjs +20 -0
- package/templates/react-nest-shadcn/scripts/design-next-cleanup.mjs +13 -0
- package/templates/react-nest-shadcn/scripts/design-verify.mjs +154 -0
- package/templates/react-nest-shadcn/scripts/design.mjs +108 -0
- package/templates/react-nest-shadcn/scripts/project.mjs +120 -0
- package/templates/react-nest-shadcn/tests/contract-client.ts +20 -0
- package/templates/react-nest-shadcn/tests/contract.spec.ts +49 -0
- package/templates/react-nest-shadcn/tests/design/harness.tsx +63 -0
- package/templates/react-nest-shadcn/tests/ui.spec.ts +61 -0
- package/templates/react-nest-shadcn/web/eslint.config.mjs +3 -0
- package/templates/react-nest-shadcn/web/index.html +1 -0
- package/templates/react-nest-shadcn/web/package.json +33 -0
- package/templates/react-nest-shadcn/web/pnpm-lock.yaml +1788 -0
- package/templates/react-nest-shadcn/web/src/App.tsx +30 -0
- package/templates/react-nest-shadcn/web/src/design-layout.css +7 -0
- package/templates/react-nest-shadcn/web/src/design-runtime.json +511 -0
- package/templates/react-nest-shadcn/web/src/design-tokens.css +168 -0
- package/templates/react-nest-shadcn/web/src/design-widgets.css +31 -0
- package/templates/react-nest-shadcn/web/src/main.tsx +6 -0
- package/templates/react-nest-shadcn/web/src/structure-view.tsx +16 -0
- package/templates/react-nest-shadcn/web/src/styles.css +3 -0
- package/templates/react-nest-shadcn/web/src/tailwind.css +2 -0
- package/templates/react-nest-shadcn/web/src/ui.tsx +13 -0
- package/templates/react-nest-shadcn/web/src/widget-icon.tsx +5 -0
- package/templates/react-nest-shadcn/web/src/widget-types.ts +13 -0
- package/templates/react-nest-shadcn/web/src/workspace-model.ts +85 -0
- package/templates/react-nest-shadcn/web/tsconfig.json +22 -0
- package/templates/react-nest-shadcn/web/vite.config.ts +4 -0
- package/templates/react-spring-antd/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/react-spring-antd/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/react-spring-antd/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/react-spring-antd/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/react-spring-antd/.dockerignore +18 -0
- package/templates/react-spring-antd/.env.example +13 -0
- package/templates/react-spring-antd/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/react-spring-antd/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/react-spring-antd/.scaffold-checks.json +7 -0
- package/templates/react-spring-antd/AGENTS.md +11 -0
- package/templates/react-spring-antd/CLAUDE.md +1 -0
- package/templates/react-spring-antd/DESIGN.md +208 -0
- package/templates/react-spring-antd/LICENSE +21 -0
- package/templates/react-spring-antd/README.md +64 -0
- package/templates/react-spring-antd/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/react-spring-antd/backend/.mvn/wrapper/maven-wrapper.properties +3 -0
- package/templates/react-spring-antd/backend/Dockerfile +11 -0
- package/templates/react-spring-antd/backend/mvnw +295 -0
- package/templates/react-spring-antd/backend/pom.xml +15 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Api.java +38 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/AppUser.java +11 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Application.java +7 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Errors.java +13 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/PersonalRecord.java +15 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Records.java +14 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Security.java +28 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Seed.java +13 -0
- package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Users.java +5 -0
- package/templates/react-spring-antd/backend/src/main/resources/application.properties +17 -0
- package/templates/react-spring-antd/backend/src/main/resources/db/migration/V1__initial.sql +3 -0
- package/templates/react-spring-antd/backend/src/main/resources/openapi.json +461 -0
- package/templates/react-spring-antd/backend/src/test/java/dev/scaffold/app/ApiTest.java +28 -0
- package/templates/react-spring-antd/backend/src/test/java/dev/scaffold/app/SessionExpiryTest.java +37 -0
- package/templates/react-spring-antd/compose.yaml +18 -0
- package/templates/react-spring-antd/design/guide.md +61 -0
- package/templates/react-spring-antd/design/layout.css +6 -0
- package/templates/react-spring-antd/design/structure.json +107 -0
- package/templates/react-spring-antd/design/tokens.json +171 -0
- package/templates/react-spring-antd/design/widgets.css +30 -0
- package/templates/react-spring-antd/design/widgets.json +233 -0
- package/templates/react-spring-antd/docs/PROJECT.md +32 -0
- package/templates/react-spring-antd/docs/api.d.ts +544 -0
- package/templates/react-spring-antd/docs/openapi.json +461 -0
- package/templates/react-spring-antd/gitignore.template +19 -0
- package/templates/react-spring-antd/licenses/fastapi.txt +21 -0
- package/templates/react-spring-antd/licenses/nest.txt +22 -0
- package/templates/react-spring-antd/licenses/next.txt +21 -0
- package/templates/react-spring-antd/licenses/shadcn.txt +21 -0
- package/templates/react-spring-antd/licenses/sources.json +27 -0
- package/templates/react-spring-antd/licenses/spring.txt +202 -0
- package/templates/react-spring-antd/package-lock.json +494 -0
- package/templates/react-spring-antd/package.json +26 -0
- package/templates/react-spring-antd/playwright.config.ts +3 -0
- package/templates/react-spring-antd/project.json +8 -0
- package/templates/react-spring-antd/scripts/api-check.mjs +18 -0
- package/templates/react-spring-antd/scripts/api-contract.mjs +46 -0
- package/templates/react-spring-antd/scripts/design-coverage.mjs +20 -0
- package/templates/react-spring-antd/scripts/design-next-cleanup.mjs +13 -0
- package/templates/react-spring-antd/scripts/design-verify.mjs +154 -0
- package/templates/react-spring-antd/scripts/design.mjs +108 -0
- package/templates/react-spring-antd/scripts/project.mjs +120 -0
- package/templates/react-spring-antd/tests/contract-client.ts +20 -0
- package/templates/react-spring-antd/tests/contract.spec.ts +49 -0
- package/templates/react-spring-antd/tests/design/harness.tsx +63 -0
- package/templates/react-spring-antd/tests/ui.spec.ts +61 -0
- package/templates/react-spring-antd/web/eslint.config.mjs +3 -0
- package/templates/react-spring-antd/web/index.html +1 -0
- package/templates/react-spring-antd/web/package.json +28 -0
- package/templates/react-spring-antd/web/pnpm-lock.yaml +2215 -0
- package/templates/react-spring-antd/web/src/App.tsx +29 -0
- package/templates/react-spring-antd/web/src/design-layout.css +7 -0
- package/templates/react-spring-antd/web/src/design-runtime.json +511 -0
- package/templates/react-spring-antd/web/src/design-tokens.css +168 -0
- package/templates/react-spring-antd/web/src/design-widgets.css +31 -0
- package/templates/react-spring-antd/web/src/main.tsx +6 -0
- package/templates/react-spring-antd/web/src/structure-view.tsx +16 -0
- package/templates/react-spring-antd/web/src/styles.css +3 -0
- package/templates/react-spring-antd/web/src/ui.tsx +30 -0
- package/templates/react-spring-antd/web/src/widget-icon.tsx +5 -0
- package/templates/react-spring-antd/web/src/widget-types.ts +13 -0
- package/templates/react-spring-antd/web/src/workspace-model.ts +85 -0
- package/templates/react-spring-antd/web/tsconfig.json +22 -0
- package/templates/react-spring-antd/web/vite.config.ts +3 -0
- package/templates/react-spring-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
- package/templates/react-spring-shadcn/.agents/skills/project-work/SKILL.md +10 -0
- package/templates/react-spring-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
- package/templates/react-spring-shadcn/.claude/skills/project-work/SKILL.md +10 -0
- package/templates/react-spring-shadcn/.dockerignore +18 -0
- package/templates/react-spring-shadcn/.env.example +13 -0
- package/templates/react-spring-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
- package/templates/react-spring-shadcn/.grok/skills/project-work/SKILL.md +10 -0
- package/templates/react-spring-shadcn/.scaffold-checks.json +7 -0
- package/templates/react-spring-shadcn/AGENTS.md +11 -0
- package/templates/react-spring-shadcn/CLAUDE.md +1 -0
- package/templates/react-spring-shadcn/DESIGN.md +208 -0
- package/templates/react-spring-shadcn/LICENSE +21 -0
- package/templates/react-spring-shadcn/README.md +64 -0
- package/templates/react-spring-shadcn/THIRD_PARTY_NOTICES.md +18 -0
- package/templates/react-spring-shadcn/backend/.mvn/wrapper/maven-wrapper.properties +3 -0
- package/templates/react-spring-shadcn/backend/Dockerfile +11 -0
- package/templates/react-spring-shadcn/backend/mvnw +295 -0
- package/templates/react-spring-shadcn/backend/pom.xml +15 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Api.java +38 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/AppUser.java +11 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Application.java +7 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Errors.java +13 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/PersonalRecord.java +15 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Records.java +14 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Security.java +28 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Seed.java +13 -0
- package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Users.java +5 -0
- package/templates/react-spring-shadcn/backend/src/main/resources/application.properties +17 -0
- package/templates/react-spring-shadcn/backend/src/main/resources/db/migration/V1__initial.sql +3 -0
- package/templates/react-spring-shadcn/backend/src/main/resources/openapi.json +461 -0
- package/templates/react-spring-shadcn/backend/src/test/java/dev/scaffold/app/ApiTest.java +28 -0
- package/templates/react-spring-shadcn/backend/src/test/java/dev/scaffold/app/SessionExpiryTest.java +37 -0
- package/templates/react-spring-shadcn/compose.yaml +18 -0
- package/templates/react-spring-shadcn/design/guide.md +61 -0
- package/templates/react-spring-shadcn/design/layout.css +6 -0
- package/templates/react-spring-shadcn/design/structure.json +107 -0
- package/templates/react-spring-shadcn/design/tokens.json +171 -0
- package/templates/react-spring-shadcn/design/widgets.css +30 -0
- package/templates/react-spring-shadcn/design/widgets.json +233 -0
- package/templates/react-spring-shadcn/docs/PROJECT.md +32 -0
- package/templates/react-spring-shadcn/docs/api.d.ts +544 -0
- package/templates/react-spring-shadcn/docs/openapi.json +461 -0
- package/templates/react-spring-shadcn/gitignore.template +19 -0
- package/templates/react-spring-shadcn/licenses/fastapi.txt +21 -0
- package/templates/react-spring-shadcn/licenses/nest.txt +22 -0
- package/templates/react-spring-shadcn/licenses/next.txt +21 -0
- package/templates/react-spring-shadcn/licenses/shadcn.txt +21 -0
- package/templates/react-spring-shadcn/licenses/sources.json +27 -0
- package/templates/react-spring-shadcn/licenses/spring.txt +202 -0
- package/templates/react-spring-shadcn/package-lock.json +494 -0
- package/templates/react-spring-shadcn/package.json +26 -0
- package/templates/react-spring-shadcn/playwright.config.ts +3 -0
- package/templates/react-spring-shadcn/project.json +8 -0
- package/templates/react-spring-shadcn/scripts/api-check.mjs +18 -0
- package/templates/react-spring-shadcn/scripts/api-contract.mjs +46 -0
- package/templates/react-spring-shadcn/scripts/design-coverage.mjs +20 -0
- package/templates/react-spring-shadcn/scripts/design-next-cleanup.mjs +13 -0
- package/templates/react-spring-shadcn/scripts/design-verify.mjs +154 -0
- package/templates/react-spring-shadcn/scripts/design.mjs +108 -0
- package/templates/react-spring-shadcn/scripts/project.mjs +120 -0
- package/templates/react-spring-shadcn/tests/contract-client.ts +20 -0
- package/templates/react-spring-shadcn/tests/contract.spec.ts +49 -0
- package/templates/react-spring-shadcn/tests/design/harness.tsx +63 -0
- package/templates/react-spring-shadcn/tests/ui.spec.ts +61 -0
- package/templates/react-spring-shadcn/web/eslint.config.mjs +3 -0
- package/templates/react-spring-shadcn/web/index.html +1 -0
- package/templates/react-spring-shadcn/web/package.json +33 -0
- package/templates/react-spring-shadcn/web/pnpm-lock.yaml +1788 -0
- package/templates/react-spring-shadcn/web/src/App.tsx +30 -0
- package/templates/react-spring-shadcn/web/src/design-layout.css +7 -0
- package/templates/react-spring-shadcn/web/src/design-runtime.json +511 -0
- package/templates/react-spring-shadcn/web/src/design-tokens.css +168 -0
- package/templates/react-spring-shadcn/web/src/design-widgets.css +31 -0
- package/templates/react-spring-shadcn/web/src/main.tsx +6 -0
- package/templates/react-spring-shadcn/web/src/structure-view.tsx +16 -0
- package/templates/react-spring-shadcn/web/src/styles.css +3 -0
- package/templates/react-spring-shadcn/web/src/tailwind.css +2 -0
- package/templates/react-spring-shadcn/web/src/ui.tsx +13 -0
- package/templates/react-spring-shadcn/web/src/widget-icon.tsx +5 -0
- package/templates/react-spring-shadcn/web/src/widget-types.ts +13 -0
- package/templates/react-spring-shadcn/web/src/workspace-model.ts +85 -0
- package/templates/react-spring-shadcn/web/tsconfig.json +22 -0
- package/templates/react-spring-shadcn/web/vite.config.ts +4 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package dev.scaffold.app;
|
|
2
|
+
import org.junit.jupiter.api.Test;
|
|
3
|
+
import org.springframework.beans.factory.annotation.Autowired;
|
|
4
|
+
import org.springframework.boot.test.context.SpringBootTest;
|
|
5
|
+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
|
|
6
|
+
import org.springframework.test.web.servlet.MockMvc;
|
|
7
|
+
import org.springframework.mock.web.MockHttpSession;
|
|
8
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
9
|
+
import java.util.Map;
|
|
10
|
+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
|
11
|
+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
|
12
|
+
@SpringBootTest @AutoConfigureMockMvc
|
|
13
|
+
class ApiTest {
|
|
14
|
+
@Autowired MockMvc mvc;@Autowired ObjectMapper json;
|
|
15
|
+
String origin=System.getenv("APP_ORIGIN");
|
|
16
|
+
MockHttpSession login(String key)throws Exception{return (MockHttpSession)mvc.perform(post("/api/auth/login").header("Origin",origin).contentType("application/json").content(json.writeValueAsString(Map.of("email",System.getenv(key),"password",System.getenv("SEED_PASSWORD"))))).andExpect(status().isOk()).andReturn().getRequest().getSession();}
|
|
17
|
+
@Test void ownershipAndLogout()throws Exception{
|
|
18
|
+
mvc.perform(get("/api/records")).andExpect(status().isUnauthorized());var a=login("SEED_A_EMAIL");var b=login("SEED_B_EMAIL");
|
|
19
|
+
mvc.perform(post("/api/records").session(a).header("Origin",origin).contentType("application/json").content("{\"title\":\"x\",\"content\":\"\",\"owner_id\":\"fake\"}")).andExpect(status().isUnprocessableEntity());
|
|
20
|
+
var result=mvc.perform(post("/api/records").session(a).header("Origin",origin).contentType("application/json").content("{\"title\":\"native test\",\"content\":\"saved\"}")).andExpect(status().isCreated()).andReturn();
|
|
21
|
+
var id=json.readTree(result.getResponse().getContentAsString()).get("id").asText();var path="/api/records/"+id;
|
|
22
|
+
mvc.perform(get(path).session(b)).andExpect(status().isNotFound());mvc.perform(delete(path).session(b).header("Origin",origin)).andExpect(status().isNotFound());
|
|
23
|
+
mvc.perform(get(path).session(a)).andExpect(jsonPath("$.content").value("saved"));
|
|
24
|
+
mvc.perform(delete(path).session(a).header("Origin",origin)).andExpect(status().isNoContent());
|
|
25
|
+
mvc.perform(post("/api/auth/logout").session(a).header("Origin",origin)).andExpect(status().isNoContent());
|
|
26
|
+
mvc.perform(get("/api/records")).andExpect(status().isUnauthorized());
|
|
27
|
+
}
|
|
28
|
+
}
|
package/templates/react-spring-antd/backend/src/test/java/dev/scaffold/app/SessionExpiryTest.java
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
package dev.scaffold.app;
|
|
2
|
+
import org.junit.jupiter.api.Test;
|
|
3
|
+
import org.springframework.boot.test.context.SpringBootTest;
|
|
4
|
+
import org.springframework.boot.test.context.TestConfiguration;
|
|
5
|
+
import org.springframework.boot.test.web.server.LocalServerPort;
|
|
6
|
+
import org.springframework.context.annotation.Bean;
|
|
7
|
+
import org.springframework.context.annotation.Import;
|
|
8
|
+
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
|
|
9
|
+
import jakarta.servlet.http.HttpSessionEvent;
|
|
10
|
+
import jakarta.servlet.http.HttpSessionListener;
|
|
11
|
+
import java.net.URI;
|
|
12
|
+
import java.net.http.HttpClient;
|
|
13
|
+
import java.net.http.HttpRequest;
|
|
14
|
+
import java.net.http.HttpResponse;
|
|
15
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
16
|
+
import java.util.Map;
|
|
17
|
+
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
18
|
+
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT,properties="server.servlet.session.cookie.secure=false")
|
|
19
|
+
@Import(SessionExpiryTest.ShortSession.class)
|
|
20
|
+
class SessionExpiryTest {
|
|
21
|
+
@LocalServerPort int port;
|
|
22
|
+
@TestConfiguration static class ShortSession {
|
|
23
|
+
@Bean ServletListenerRegistrationBean<HttpSessionListener> expiration(){
|
|
24
|
+
return new ServletListenerRegistrationBean<>(new HttpSessionListener(){public void sessionCreated(HttpSessionEvent event){event.getSession().setMaxInactiveInterval(1);}});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
@Test void actualServletSessionExpires()throws Exception{
|
|
28
|
+
var client=HttpClient.newHttpClient();var base="http://127.0.0.1:"+port;
|
|
29
|
+
var body=new ObjectMapper().writeValueAsString(Map.of("email",System.getenv("SEED_A_EMAIL"),"password",System.getenv("SEED_PASSWORD")));
|
|
30
|
+
var login=client.send(HttpRequest.newBuilder(URI.create(base+"/api/auth/login")).header("Origin",System.getenv("APP_ORIGIN")).header("Content-Type","application/json").POST(HttpRequest.BodyPublishers.ofString(body)).build(),HttpResponse.BodyHandlers.ofString());
|
|
31
|
+
assertEquals(200,login.statusCode());var cookie=login.headers().firstValue("set-cookie").orElseThrow().split(";")[0];
|
|
32
|
+
var request=HttpRequest.newBuilder(URI.create(base+"/api/auth/me")).header("Cookie",cookie).GET().build();
|
|
33
|
+
assertEquals(200,client.send(request,HttpResponse.BodyHandlers.discarding()).statusCode());
|
|
34
|
+
Thread.sleep(1500);
|
|
35
|
+
assertEquals(401,client.send(request,HttpResponse.BodyHandlers.discarding()).statusCode());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
services:
|
|
2
|
+
db:
|
|
3
|
+
image: postgres:17.9-alpine@sha256:c7526c0f6c3f30260a563d7bcf8ad778effac59a44f8ffa86678c35418338609
|
|
4
|
+
environment:
|
|
5
|
+
POSTGRES_USER: ${POSTGRES_USER:?run dev:setup first}
|
|
6
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?run dev:setup first}
|
|
7
|
+
POSTGRES_DB: ${POSTGRES_DB:?run dev:setup first}
|
|
8
|
+
ports:
|
|
9
|
+
- "127.0.0.1:${POSTGRES_PORT:-54329}:5432"
|
|
10
|
+
volumes:
|
|
11
|
+
- development-data:/var/lib/postgresql/data
|
|
12
|
+
healthcheck:
|
|
13
|
+
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
|
|
14
|
+
interval: 2s
|
|
15
|
+
timeout: 3s
|
|
16
|
+
retries: 30
|
|
17
|
+
volumes:
|
|
18
|
+
development-data:
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
**Scientific Workspace**:从 [CleerScience 官网](https://cleerscience.com/) 提炼的通用深色科技视觉。以近黑蓝底、冷白文字、冰蓝重点、直角薄边框和清晰排版传达秩序;各组件库使用同一份视觉、控件和结构规格。它服务于登录、列表与编辑任务,不把科学品牌、产品名或营销文案带入生成项目。
|
|
4
|
+
|
|
5
|
+
来源于 2026-10-20 对官网桌面 1440px 和手机 375px 的实际页面及计算样式观察。官网原值包括背景 #02040a、正文 #f4f8ff、冰蓝 #8fc3ff、0px 面板圆角;本模板沿用这些核心值。正文与控件对比度、实体表面、较小标题和 44px 以上操作尺寸是工具型界面的适配决定,并非官网原样复刻。背景视频、品牌标识、全屏叙事和科学插图不属于本模板。
|
|
6
|
+
|
|
7
|
+
**唯一编辑源**:`design/tokens.json`、`design/widgets.json`、`design/structure.json`、`design/guide.md` 及中立布局/控件样式。执行 `npm run design:sync` 生成本文件、design-tokens.css、design-layout.css、design-widgets.css、design-runtime.json,再执行 `npm run design:check`。不要直接修改派生产物;build/typecheck/lint 会拒绝漂移。YAML 是与组件库无关的有效 token;阴影等非标准字段在正文给出,避免伪装成官方 schema 字段。
|
|
8
|
+
|
|
9
|
+
## Colors
|
|
10
|
+
|
|
11
|
+
背景使用 `colors.background`,面板使用 `colors.surface`,输入区使用 `colors.control-background`。正文使用 `colors.text`,辅助说明使用 `colors.muted`,标题不降低透明度。不要把官网用于装饰的低透明度文字直接用于表单标签或必要说明。
|
|
12
|
+
|
|
13
|
+
`primary` 仅用于主要操作、当前选中项和可见焦点;按钮文字使用 `primary-text`,确保亮色按钮上的深色字可读。`primary-hover` / `primary-active` 表达交互状态。普通表面保持中性冷色,避免整页泛蓝或大面积发光。错误和成功使用各自的 background/border/text 组合,同时保留明确文字或状态角色。
|
|
14
|
+
|
|
15
|
+
必要文字对比度至少 4.5:1,焦点与操作控件边界至少 3:1;装饰分隔线可以更弱。对比度必须按实际背景检查,不能只比较两个透明 token。新项目若改变主色,需重新验证文字、hover、active 和焦点,不仅替换一个十六进制值。
|
|
16
|
+
|
|
17
|
+
## Typography
|
|
18
|
+
|
|
19
|
+
一套无衬线字体贯穿全站:Inter 可用时优先,否则落到系统字体与 PingFang SC / Microsoft YaHei;不主动下载字体。中文正文 {{typography.body.fontSize}}、行高 {{typography.body.lineHeight}},标签 {{typography.label.fontSize}},辅助信息 {{typography.caption.fontSize}};避免将官网 11px 导航字直接当作表单正文。
|
|
20
|
+
|
|
21
|
+
页面标题 {{typography.h1.fontSize}}、登录标题 {{typography.login-heading.fontSize}},手机分别 {{typography.mobile-page-heading.fontSize}}/{{typography.mobile-heading.fontSize}};h2 为 {{typography.h2.fontSize}},h3 为 {{typography.h3.fontSize}}。标题使用 560–600 字重与轻微负字距,中文不采用官网展示标题的 -0.075em 压缩。`eyebrow` 用 {{typography.eyebrow.fontSize}}、{{typography.eyebrow.fontWeight}} 字重、{{typography.eyebrow.letterSpacing}} 字距作短标签,不承载唯一操作说明。标题平衡换行,说明文字自然换行,长记录标题允许断行,账号单行省略。
|
|
22
|
+
|
|
23
|
+
具体字号、字重与行高以 typography 为准。所有套件严格使用同一按钮字号 {{typography.button.fontSize}} 与行高 {{typography.button.lineHeight}};不要混用第二套展示字体。
|
|
24
|
+
|
|
25
|
+
## Layout
|
|
26
|
+
|
|
27
|
+
沿用工作空间的信息结构:顶栏、页面标题、记录列表与编辑区。桌面 shell-max 为 {{spacing.shell-max}},水平边距 {{spacing.s32}};记录区两栏,登录页说明与表单两栏。面板间距 {{spacing.s24}},桌面面板内边距 {{widgets.panel.padding}}。避免为了科技感给每一行再套卡片。
|
|
28
|
+
|
|
29
|
+
在 `spacing.mobile-breakpoint`(当前 {{spacing.mobile-breakpoint}})收为单列,水平边距 {{spacing.s18}}、面板内边距 {{spacing.s20}}。375px 不允许横向溢出;操作区允许自然增长,不用全屏固定高度压缩内容。布局 CSS 与媒体查询由同一 token 源生成。
|
|
30
|
+
|
|
31
|
+
官网的超大留白、全屏分区与宽幅媒体可用于品牌落地页,但不是登录和 CRUD 页面默认规则。新增导航、统计卡或营销分区需要业务需求,不能由设计规范自行扩张功能。
|
|
32
|
+
|
|
33
|
+
## Elevation & Depth
|
|
34
|
+
|
|
35
|
+
面板首先依靠深浅表面和 1px 冷色边框分层;阴影为 `{{effects.panelShadow}}`,来自 design/tokens.json 的 effects.panelShadow。控件边框比装饰分隔线更清晰。选中记录增加冰蓝侧线与背景变化,不只靠文字颜色。
|
|
36
|
+
|
|
37
|
+
官网玻璃面板的 blur(14px) 和影像叠层可作为品牌页面参考;本工具使用实体表面保证阅读和性能,不全局加 backdrop-filter。禁止给每个按钮、输入框加辉光或重阴影。
|
|
38
|
+
|
|
39
|
+
## Shapes
|
|
40
|
+
|
|
41
|
+
`rounded.md` 为 {{rounded.md}}、`rounded.panel` 为 {{rounded.panel}}、`rounded.full` 为 {{rounded.full}}:按钮、输入、面板和标签保持精确直角。`full` 是沿用的 token 名,在当前主题不代表胶囊。修改形状时同步组件 token;所有尺寸的圆角由套件显式绑定,避免库派生出另一种圆角。
|
|
42
|
+
|
|
43
|
+
边框厚度通常为 1px。图标沿用所选组件库的简洁线性风格,保持光学尺寸一致;不复制官网 Logo 或专有插图。
|
|
44
|
+
|
|
45
|
+
## Components
|
|
46
|
+
|
|
47
|
+
主按钮:冰蓝填充、深色文字;secondary:深色表面与清晰描边;danger:暗红表面与浅红文字。按钮与单行输入高度 {{widgets.button.height}},保持键盘焦点。default/hover/active/focus/disabled/loading 与输入错误态由 design/widgets.json 定义,套件逐项翻译,不接受原生默认值偏差。颜色派生结果以共享 token 为准;图标使用同一份 SVG 几何,套件不得替换成近似图标。
|
|
48
|
+
|
|
49
|
+
输入:深色底、冷白输入文字、可读 placeholder,标签始终可见。加载时禁用重复提交;错误后保留输入;空态说明下一步;记录正文以纯文本显示。删除需确认,退出清除当前编辑内容。控件自身焦点、输入和禁用状态由原生控件/套件管理;登录身份、校验、记录状态与请求隔离只在框架无关的 workspace-model 中实现。页面区块顺序和嵌套来自 design/structure.json,框架视图负责绑定。上述行为由业务实现与 Playwright 测试负责,设计文件不替代执行逻辑。
|
|
50
|
+
|
|
51
|
+
动效只用于短暂状态反馈;遵循 150–250ms 的颜色/边框变化,不新增背景循环、滚动接管或入场延迟。`prefers-reduced-motion: reduce` 下取消非必要动画与过渡。品牌页面如果采用背景媒体,需静态后备、降低亮度、保障文字对比度,并单独验收性能。
|
|
52
|
+
|
|
53
|
+
## Do's and Don'ts
|
|
54
|
+
|
|
55
|
+
- UI 开发前读本文件;设计修改先改源,再 sync/check,最后看浏览器真实结果。
|
|
56
|
+
- 复用冷色中性层级、单一字体、直角薄边框与有限强调色;保持所选 UI 库的一致性。
|
|
57
|
+
- 验证默认、hover、active、focus、disabled、loading、empty、error,以及键盘与 375px 布局。
|
|
58
|
+
- 不将来源网站的行业、品牌内容、低对比装饰字或全屏动效当成通用业务要求。
|
|
59
|
+
- 不给每个面板加玻璃、光晕或渐变;库默认值与规格不符时修改套件,不反向修改规范。
|
|
60
|
+
- 全量执行控件/页面比较:位置容差 ≤0.6 CSS px;颜色、圆角、图标几何零容差;必须覆盖 widgets.json 和 structure.json 的全部声明项。
|
|
61
|
+
- 不直接编辑生成文件,不把文档格式通过当成浏览器验收通过,不根据项目简介随机改变视觉。
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
*{box-sizing:border-box}body{color-scheme:dark;margin:0;background:var(--design-colors-background);color:var(--design-colors-text);font-family:var(--design-typography-body-font-family);font-size:var(--design-typography-body-font-size);line-height:var(--design-typography-body-line-height)}button,input,textarea{font:inherit}button,a,input,textarea{touch-action:manipulation}button:focus-visible,a:focus-visible{outline:var(--design-spacing-s3) solid var(--design-colors-focus);outline-offset:var(--design-spacing-s3)}.app-shell{max-width:var(--design-spacing-shell-max);margin:auto;padding:0 var(--design-spacing-s32)}.topbar{display:flex;align-items:center;gap:var(--design-spacing-s20);min-height:var(--design-spacing-s88);border-bottom:var(--design-spacing-s1) solid var(--design-colors-border)}.brand{font-weight:var(--design-typography-eyebrow-font-weight);color:var(--design-colors-brand);text-decoration:none;font-size:var(--design-typography-h2-font-size)}.account{margin-left:auto;display:flex;gap:var(--design-spacing-s20);align-items:center;font-size:var(--design-typography-label-font-size)}main{padding:var(--design-spacing-s44) 0;min-height:calc(100vh - var(--design-spacing-footer-reserve))}h1,h2,h3,p{margin-top:0}h1,h2,h3{text-wrap:balance}p{text-wrap:pretty}h1{font-weight:var(--design-typography-h1-font-weight);font-size:var(--design-typography-h1-font-size);line-height:var(--design-typography-h1-line-height);letter-spacing:var(--design-typography-h1-letter-spacing);margin-bottom:var(--design-spacing-s12)}h2{font-weight:var(--design-typography-h2-font-weight);letter-spacing:var(--design-typography-h2-letter-spacing);font-size:var(--design-typography-h2-font-size);line-height:var(--design-typography-h2-line-height)}h3{font-weight:var(--design-typography-h3-font-weight);line-height:var(--design-typography-h3-line-height);font-size:var(--design-typography-h3-font-size)}.eyebrow{font-size:var(--design-typography-eyebrow-font-size);font-weight:var(--design-typography-eyebrow-font-weight);letter-spacing:var(--design-typography-eyebrow-letter-spacing);color:var(--design-colors-eyebrow);margin-bottom:var(--design-spacing-s14)}.muted{color:var(--design-colors-muted);font-size:var(--design-typography-label-font-size)}.intro{color:var(--design-colors-intro);font-size:var(--design-typography-intro-font-size);line-height:var(--design-typography-intro-line-height);max-width:var(--design-spacing-intro-max)}.page-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--design-spacing-s20);margin-bottom:var(--design-spacing-s28)}.workspace{display:grid;grid-template-columns:minmax(var(--design-spacing-list-min),.8fr) minmax(0,1.6fr);gap:var(--design-spacing-s24)}.panel{background:var(--design-components-panel-background-color);border:var(--design-spacing-s1) solid var(--design-colors-panel-border);border-radius:var(--design-components-panel-rounded);padding:var(--design-components-panel-padding);box-shadow:var(--design-effects-panel-shadow)}.login-layout{display:grid;grid-template-columns:1.15fr 1fr;align-items:center;gap:var(--design-spacing-s80);max-width:var(--design-spacing-login-max);margin:auto}.login-layout h1{font-size:var(--design-typography-login-heading-font-size);font-weight:var(--design-typography-login-heading-font-weight);line-height:var(--design-typography-login-heading-line-height);letter-spacing:var(--design-typography-login-heading-letter-spacing)}.login-card{max-width:var(--design-spacing-login-card-max);width:100%;justify-self:end}.field{display:flex;flex-direction:column;gap:var(--design-spacing-s8);margin:var(--design-spacing-s22) 0}.field label{font-weight:var(--design-typography-label-font-weight);font-size:var(--design-typography-label-font-size)}.record-list ul{padding:0;margin:0;list-style:none}.record-list li+li{border-top:var(--design-spacing-s1) solid var(--design-colors-divider)}.record-link{display:flex;flex-direction:column;gap:var(--design-spacing-s4);width:100%;padding:var(--design-spacing-s15) var(--design-spacing-s12);text-align:left;cursor:pointer;background:transparent;border:0;border-radius:var(--design-rounded-md);color:var(--design-colors-record-text)}.record-link strong{overflow-wrap:anywhere}.record-link span{color:var(--design-colors-record-meta);font-size:var(--design-typography-caption-font-size)}.record-link:hover,.record-link.active{background:var(--design-colors-record-hover)}.pagination{display:flex;align-items:center;justify-content:space-between;gap:var(--design-spacing-s8);border-top:var(--design-spacing-s1) solid var(--design-colors-pagination-border);margin-top:var(--design-spacing-s20);padding-top:var(--design-spacing-s20);font-size:var(--design-typography-caption-font-size)}.editor-heading,.editor-footer{display:flex;align-items:center;justify-content:space-between;gap:var(--design-spacing-s14)}.editor-heading h2{margin:0}.empty{padding:var(--design-spacing-s60) var(--design-spacing-s14);text-align:center;color:var(--design-colors-empty)}.empty h2,.empty h3{color:var(--design-colors-empty-heading)}.notice{padding:var(--design-spacing-s12) var(--design-spacing-s16);background:var(--design-colors-success-background);border:var(--design-spacing-s1) solid var(--design-colors-success-border);border-radius:var(--design-rounded-md);color:var(--design-colors-success-text)}.alert{margin:var(--design-spacing-s16) 0;padding:var(--design-spacing-s12) var(--design-spacing-s16);background:var(--design-colors-error-background);border:var(--design-spacing-s1) solid var(--design-colors-error-border);border-radius:var(--design-rounded-md);color:var(--design-colors-error-text)}footer{padding:var(--design-spacing-s20) 0;border-top:var(--design-spacing-s1) solid var(--design-colors-footer-border);color:var(--design-colors-footer-text);font-size:var(--design-typography-caption-font-size)}.badge{display:inline-flex;border:var(--design-spacing-s1) solid var(--design-colors-badge-border);padding:var(--design-spacing-s3) var(--design-spacing-s10);border-radius:var(--design-rounded-full);color:var(--design-colors-badge-text);font-size:var(--design-typography-eyebrow-font-size);white-space:nowrap}textarea{resize:vertical}@media(max-width:{{spacing.mobile-breakpoint}}){.app-shell{padding:0 var(--design-spacing-s18)}.topbar{flex-wrap:wrap;gap:var(--design-spacing-s10);padding:var(--design-spacing-s18) 0}.account{width:100%;justify-content:space-between}.workspace,.login-layout{grid-template-columns:1fr;gap:var(--design-spacing-s24)}.login-layout h1{font-size:var(--design-typography-mobile-heading-font-size);line-height:var(--design-typography-mobile-heading-line-height)}.login-card{max-width:none}.page-heading h1{font-size:var(--design-typography-mobile-page-heading-font-size);line-height:var(--design-typography-mobile-page-heading-line-height)}.panel{padding:var(--design-spacing-s20)}main{padding:var(--design-spacing-s28) 0}.pagination button{padding:var(--design-spacing-s6)}.badge{margin-left:auto}}
|
|
2
|
+
|
|
3
|
+
.account{min-width:0}.account span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.brand{overflow-wrap:anywhere}.workspace>*{min-width:0}
|
|
4
|
+
|
|
5
|
+
.record-link.active{box-shadow:inset 2px 0 var(--design-colors-primary)}
|
|
6
|
+
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important;scroll-behavior:auto!important}}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"root": {
|
|
4
|
+
"region": "app-shell",
|
|
5
|
+
"element": "div",
|
|
6
|
+
"children": [
|
|
7
|
+
{
|
|
8
|
+
"region": "topbar",
|
|
9
|
+
"element": "header",
|
|
10
|
+
"children": [
|
|
11
|
+
{
|
|
12
|
+
"region": "brand",
|
|
13
|
+
"element": "a",
|
|
14
|
+
"slot": "brand"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"region": "badge",
|
|
18
|
+
"element": "slot",
|
|
19
|
+
"slot": "badge"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"region": "account",
|
|
23
|
+
"element": "div",
|
|
24
|
+
"slot": "account"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"region": "page",
|
|
30
|
+
"element": "slot",
|
|
31
|
+
"slot": "page"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"region": "footer",
|
|
35
|
+
"element": "footer",
|
|
36
|
+
"slot": "footer"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"pages": {
|
|
41
|
+
"checking": {
|
|
42
|
+
"region": "checking",
|
|
43
|
+
"element": "main",
|
|
44
|
+
"slot": "checking"
|
|
45
|
+
},
|
|
46
|
+
"login": {
|
|
47
|
+
"region": "login-layout",
|
|
48
|
+
"element": "main",
|
|
49
|
+
"children": [
|
|
50
|
+
{
|
|
51
|
+
"region": "login-intro",
|
|
52
|
+
"element": "section",
|
|
53
|
+
"slot": "loginIntro"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"region": "login-card",
|
|
57
|
+
"element": "panel",
|
|
58
|
+
"slot": "loginCard"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"workspace": {
|
|
63
|
+
"region": "workspace-main",
|
|
64
|
+
"element": "main",
|
|
65
|
+
"children": [
|
|
66
|
+
{
|
|
67
|
+
"region": "page-heading",
|
|
68
|
+
"element": "div",
|
|
69
|
+
"slot": "heading"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"region": "feedback",
|
|
73
|
+
"element": "div",
|
|
74
|
+
"slot": "feedback"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"region": "workspace",
|
|
78
|
+
"element": "div",
|
|
79
|
+
"children": [
|
|
80
|
+
{
|
|
81
|
+
"region": "record-list",
|
|
82
|
+
"element": "panel",
|
|
83
|
+
"slot": "records"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"region": "editor",
|
|
87
|
+
"element": "panel",
|
|
88
|
+
"slot": "editor"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"scenarios": [
|
|
96
|
+
"checking",
|
|
97
|
+
"login",
|
|
98
|
+
"login-error",
|
|
99
|
+
"login-busy",
|
|
100
|
+
"workspace-empty",
|
|
101
|
+
"workspace-loading",
|
|
102
|
+
"workspace-records",
|
|
103
|
+
"editor-new",
|
|
104
|
+
"editor-existing",
|
|
105
|
+
"editor-error"
|
|
106
|
+
]
|
|
107
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tokens": {
|
|
3
|
+
"version": "alpha",
|
|
4
|
+
"name": "Scientific Workspace",
|
|
5
|
+
"description": "从 CleerScience 提炼的通用深色科技视觉,适配可读、安静的工具型界面。",
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": "#8fc3ff",
|
|
8
|
+
"primary-hover": "#b5d8ff",
|
|
9
|
+
"primary-active": "#69a9f3",
|
|
10
|
+
"primary-text": "#02040a",
|
|
11
|
+
"background": "#02040a",
|
|
12
|
+
"text": "#f4f8ff",
|
|
13
|
+
"surface": "#0b111d",
|
|
14
|
+
"focus": "#8fc3ff",
|
|
15
|
+
"border": "#283547",
|
|
16
|
+
"brand": "#f4f8ff",
|
|
17
|
+
"eyebrow": "#9baecb",
|
|
18
|
+
"muted": "#a1afc3",
|
|
19
|
+
"intro": "#b5c3d7",
|
|
20
|
+
"panel-border": "#283547",
|
|
21
|
+
"divider": "#202c3e",
|
|
22
|
+
"record-text": "#f4f8ff",
|
|
23
|
+
"record-meta": "#a1afc3",
|
|
24
|
+
"record-hover": "#142237",
|
|
25
|
+
"pagination-border": "#283547",
|
|
26
|
+
"empty": "#a1afc3",
|
|
27
|
+
"empty-heading": "#e2eeff",
|
|
28
|
+
"success-background": "#102b25",
|
|
29
|
+
"success-border": "#387c69",
|
|
30
|
+
"success-text": "#a2e6cc",
|
|
31
|
+
"error-background": "#311b24",
|
|
32
|
+
"error-border": "#8f4c61",
|
|
33
|
+
"error-text": "#ffbdcd",
|
|
34
|
+
"footer-border": "#283547",
|
|
35
|
+
"footer-text": "#a1afc3",
|
|
36
|
+
"badge-border": "#435773",
|
|
37
|
+
"badge-text": "#b5c3d7",
|
|
38
|
+
"control-focus": "#8fc3ff",
|
|
39
|
+
"control-border": "#657891",
|
|
40
|
+
"control-background": "#080e18",
|
|
41
|
+
"secondary-border": "#657891",
|
|
42
|
+
"secondary-text": "#e2eeff",
|
|
43
|
+
"secondary-hover": "#19283d",
|
|
44
|
+
"danger-border": "#ad6578",
|
|
45
|
+
"danger-background": "#311b24",
|
|
46
|
+
"danger-text": "#ffbdcd",
|
|
47
|
+
"danger-hover": "#472636"
|
|
48
|
+
},
|
|
49
|
+
"typography": {
|
|
50
|
+
"body": {
|
|
51
|
+
"fontFamily": "Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",sans-serif",
|
|
52
|
+
"fontSize": "16px",
|
|
53
|
+
"lineHeight": 1.65
|
|
54
|
+
},
|
|
55
|
+
"h1": {
|
|
56
|
+
"fontSize": "36px",
|
|
57
|
+
"lineHeight": 1.2,
|
|
58
|
+
"letterSpacing": "-0.03em",
|
|
59
|
+
"fontWeight": 560
|
|
60
|
+
},
|
|
61
|
+
"login-heading": {
|
|
62
|
+
"fontSize": "48px",
|
|
63
|
+
"lineHeight": 1.15,
|
|
64
|
+
"fontWeight": 560,
|
|
65
|
+
"letterSpacing": "-0.03em"
|
|
66
|
+
},
|
|
67
|
+
"h2": {
|
|
68
|
+
"fontSize": "20px",
|
|
69
|
+
"lineHeight": 1.4,
|
|
70
|
+
"fontWeight": 580,
|
|
71
|
+
"letterSpacing": "-0.02em"
|
|
72
|
+
},
|
|
73
|
+
"h3": {
|
|
74
|
+
"fontSize": "18px",
|
|
75
|
+
"fontWeight": 600,
|
|
76
|
+
"lineHeight": 1.5
|
|
77
|
+
},
|
|
78
|
+
"label": {
|
|
79
|
+
"fontSize": "14px",
|
|
80
|
+
"fontWeight": 600
|
|
81
|
+
},
|
|
82
|
+
"eyebrow": {
|
|
83
|
+
"fontSize": "11px",
|
|
84
|
+
"fontWeight": 700,
|
|
85
|
+
"letterSpacing": "0.22em",
|
|
86
|
+
"lineHeight": 1.5
|
|
87
|
+
},
|
|
88
|
+
"button": {
|
|
89
|
+
"fontSize": "14px",
|
|
90
|
+
"fontWeight": 600,
|
|
91
|
+
"lineHeight": "20px"
|
|
92
|
+
},
|
|
93
|
+
"caption": {
|
|
94
|
+
"fontSize": "12px"
|
|
95
|
+
},
|
|
96
|
+
"intro": {
|
|
97
|
+
"fontSize": "18px",
|
|
98
|
+
"lineHeight": 1.8
|
|
99
|
+
},
|
|
100
|
+
"mobile-heading": {
|
|
101
|
+
"fontSize": "32px",
|
|
102
|
+
"lineHeight": 1.2
|
|
103
|
+
},
|
|
104
|
+
"mobile-page-heading": {
|
|
105
|
+
"fontSize": "28px",
|
|
106
|
+
"lineHeight": 1.25
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"rounded": {
|
|
110
|
+
"md": "0px",
|
|
111
|
+
"panel": "0px",
|
|
112
|
+
"full": "0px"
|
|
113
|
+
},
|
|
114
|
+
"spacing": {
|
|
115
|
+
"s0": "0px",
|
|
116
|
+
"s1": "1px",
|
|
117
|
+
"s2": "2px",
|
|
118
|
+
"s3": "3px",
|
|
119
|
+
"s4": "4px",
|
|
120
|
+
"s6": "6px",
|
|
121
|
+
"s8": "8px",
|
|
122
|
+
"s10": "10px",
|
|
123
|
+
"s12": "12px",
|
|
124
|
+
"s14": "14px",
|
|
125
|
+
"s15": "15px",
|
|
126
|
+
"s16": "16px",
|
|
127
|
+
"s18": "18px",
|
|
128
|
+
"s20": "20px",
|
|
129
|
+
"s22": "22px",
|
|
130
|
+
"s24": "24px",
|
|
131
|
+
"s26": "26px",
|
|
132
|
+
"s28": "28px",
|
|
133
|
+
"s30": "30px",
|
|
134
|
+
"s32": "32px",
|
|
135
|
+
"s34": "34px",
|
|
136
|
+
"s38": "38px",
|
|
137
|
+
"s44": "44px",
|
|
138
|
+
"s48": "48px",
|
|
139
|
+
"s60": "60px",
|
|
140
|
+
"s80": "80px",
|
|
141
|
+
"s88": "88px",
|
|
142
|
+
"shell-max": "1240px",
|
|
143
|
+
"login-max": "1020px",
|
|
144
|
+
"intro-max": "460px",
|
|
145
|
+
"login-card-max": "430px",
|
|
146
|
+
"list-min": "260px",
|
|
147
|
+
"footer-reserve": "155px",
|
|
148
|
+
"mobile-breakpoint": "760px",
|
|
149
|
+
"control-min": "44px"
|
|
150
|
+
},
|
|
151
|
+
"components": {
|
|
152
|
+
"button-primary": {
|
|
153
|
+
"backgroundColor": "{colors.primary}",
|
|
154
|
+
"textColor": "{colors.primary-text}",
|
|
155
|
+
"rounded": "{rounded.md}",
|
|
156
|
+
"height": "{spacing.control-min}"
|
|
157
|
+
},
|
|
158
|
+
"panel": {
|
|
159
|
+
"backgroundColor": "{colors.surface}",
|
|
160
|
+
"padding": "{spacing.s26}",
|
|
161
|
+
"rounded": "{rounded.panel}"
|
|
162
|
+
},
|
|
163
|
+
"input": {
|
|
164
|
+
"rounded": "{rounded.md}"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"effects": {
|
|
169
|
+
"panelShadow": "0 16px 48px rgba(0,0,0,0.18)"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* These semantic hooks belong to the widget contract, never to a library. */
|
|
2
|
+
[data-widget]{box-sizing:border-box!important;font-family:var(--design-typography-body-font-family)!important;letter-spacing:normal!important;text-transform:none!important;box-shadow:none!important}
|
|
3
|
+
[data-widget="button"]{display:inline-flex!important;align-items:center!important;justify-content:center!important;gap:8px!important;vertical-align:middle!important;position:relative!important;min-width:0!important;height:var(--design-widgets-button-height)!important;min-height:var(--design-widgets-button-height)!important;padding:var(--design-widgets-button-padding-y) var(--design-widgets-button-padding-x)!important;margin:0!important;border:var(--design-widgets-button-border-width) solid transparent!important;border-radius:var(--design-widgets-button-radius)!important;font-size:var(--design-widgets-button-font-size)!important;font-weight:var(--design-widgets-button-font-weight)!important;line-height:var(--design-widgets-button-line-height)!important;cursor:pointer!important;text-align:center!important;white-space:nowrap!important;transition:background-color 180ms,border-color 180ms,color 180ms!important}
|
|
4
|
+
[data-widget="button"] [data-part="label"]{display:inline!important;margin:0!important;padding:0!important;font:inherit!important;line-height:inherit!important;color:inherit!important}
|
|
5
|
+
[data-widget="button"][data-variant="primary"]{background:var(--design-colors-primary)!important;color:var(--design-colors-primary-text)!important}
|
|
6
|
+
[data-widget="button"][data-variant="primary"]:hover{background:var(--design-colors-primary-hover)!important}
|
|
7
|
+
[data-widget="button"][data-variant="primary"]:active{background:var(--design-colors-primary-active)!important}
|
|
8
|
+
[data-widget="button"][data-variant="secondary"]{background:var(--design-colors-control-background)!important;color:var(--design-colors-secondary-text)!important;border-color:var(--design-colors-secondary-border)!important}
|
|
9
|
+
[data-widget="button"][data-variant="secondary"]:hover,[data-widget="button"][data-variant="secondary"]:active{background:var(--design-colors-secondary-hover)!important}
|
|
10
|
+
[data-widget="button"][data-variant="danger"]{background:var(--design-colors-danger-background)!important;color:var(--design-colors-danger-text)!important;border-color:var(--design-colors-danger-border)!important}
|
|
11
|
+
[data-widget="button"][data-variant="danger"]:hover,[data-widget="button"][data-variant="danger"]:active{background:var(--design-colors-danger-hover)!important}
|
|
12
|
+
[data-widget="button"]:disabled{opacity:.5!important;cursor:not-allowed!important;pointer-events:none!important}
|
|
13
|
+
[data-widget="input"],[data-widget="textarea"]{display:block!important;width:100%!important;min-width:0!important;margin:0!important;padding:var(--design-widgets-input-padding-y) var(--design-widgets-input-padding-x)!important;border:var(--design-widgets-input-border-width) solid var(--design-colors-control-border)!important;border-radius:var(--design-widgets-input-radius)!important;background:var(--design-colors-control-background)!important;color:var(--design-colors-text)!important;font-size:var(--design-widgets-input-font-size)!important;font-weight:400!important;line-height:var(--design-widgets-input-line-height)!important;outline:none!important;transition:border-color 180ms!important}
|
|
14
|
+
[data-widget="input"]{height:var(--design-widgets-input-height)!important;min-height:var(--design-widgets-input-height)!important}
|
|
15
|
+
[data-widget="textarea"]{padding:var(--design-widgets-textarea-padding-y) var(--design-widgets-textarea-padding-x)!important;border-width:var(--design-widgets-textarea-border-width)!important;border-radius:var(--design-widgets-textarea-radius)!important;font-size:var(--design-widgets-textarea-font-size)!important;line-height:var(--design-widgets-textarea-line-height)!important;resize:vertical!important;min-height:0!important}
|
|
16
|
+
[data-widget="input"]::placeholder,[data-widget="textarea"]::placeholder{color:var(--design-colors-muted)!important;opacity:1!important}
|
|
17
|
+
[data-widget="input"]:hover,[data-widget="textarea"]:hover{border-color:var(--design-colors-control-focus)!important}
|
|
18
|
+
[data-widget="input"][aria-invalid="true"],[data-widget="textarea"][aria-invalid="true"]{border-color:var(--design-colors-error-border)!important}
|
|
19
|
+
[data-widget="input"]:disabled,[data-widget="textarea"]:disabled{opacity:.5!important;cursor:not-allowed!important}
|
|
20
|
+
[data-widget="button"]:focus-visible,[data-widget="input"]:focus,[data-widget="textarea"]:focus{outline:2px solid var(--design-colors-control-focus)!important;outline-offset:2px!important}
|
|
21
|
+
[data-widget="alert"]{display:flex!important;align-items:flex-start!important;gap:var(--design-widgets-alert-gap)!important;margin:16px 0!important;padding:var(--design-widgets-alert-padding-y) var(--design-widgets-alert-padding-x)!important;border:var(--design-widgets-alert-border-width) solid var(--design-colors-error-border)!important;border-radius:var(--design-widgets-alert-radius)!important;background:var(--design-colors-error-background)!important;color:var(--design-colors-error-text)!important;font-size:var(--design-widgets-alert-font-size)!important;font-weight:400!important;line-height:var(--design-widgets-alert-line-height)!important}
|
|
22
|
+
[data-widget="alert"][data-variant="success"]{background:var(--design-colors-success-background)!important;color:var(--design-colors-success-text)!important;border-color:var(--design-colors-success-border)!important}
|
|
23
|
+
[data-widget="alert"] [data-part="icon"]{display:block!important;width:var(--design-widgets-alert-icon-size)!important;height:var(--design-widgets-alert-icon-size)!important;flex:none!important;margin:3px 0 0!important;color:inherit!important}
|
|
24
|
+
[data-widget="alert"] [data-part="message"]{display:block!important;margin:0!important;padding:0!important;font:inherit!important;line-height:inherit!important;color:inherit!important;overflow-wrap:anywhere}
|
|
25
|
+
[data-widget="badge"]{display:inline-flex!important;align-items:center!important;vertical-align:middle!important;white-space:nowrap!important;margin:0!important;padding:var(--design-widgets-badge-padding-y) var(--design-widgets-badge-padding-x)!important;border:var(--design-widgets-badge-border-width) solid var(--design-colors-badge-border)!important;border-radius:var(--design-widgets-badge-radius)!important;background:transparent!important;color:var(--design-colors-badge-text)!important;font-size:var(--design-widgets-badge-font-size)!important;font-weight:400!important;line-height:var(--design-widgets-badge-line-height)!important}
|
|
26
|
+
[data-widget="panel"]{background:var(--design-colors-surface)!important;border:var(--design-widgets-panel-border-width) solid var(--design-colors-panel-border)!important;border-radius:var(--design-widgets-panel-radius)!important;padding:var(--design-widgets-panel-padding)!important;box-shadow:var(--design-effects-panel-shadow)!important}
|
|
27
|
+
[data-widget="field"]{display:flex!important;flex-direction:column!important;gap:var(--design-widgets-field-gap)!important;margin:var(--design-widgets-field-margin-y) 0!important}
|
|
28
|
+
[data-widget="field"]>[data-part="label"]{font-size:var(--design-widgets-field-font-size)!important;font-weight:var(--design-widgets-field-font-weight)!important;line-height:var(--design-widgets-field-line-height)!important}
|
|
29
|
+
@media(max-width:{{spacing.mobile-breakpoint}}){[data-widget="panel"]{padding:var(--design-spacing-s20)!important}}
|
|
30
|
+
@media(prefers-reduced-motion:reduce){[data-widget]{transition-duration:0.01ms!important}}
|