@askrjs/cli 0.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/LICENSE +201 -0
- package/README.md +140 -0
- package/dist/add-DqhqRzBQ.js +555 -0
- package/dist/add-DqhqRzBQ.js.map +1 -0
- package/dist/add.js +3 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/create.js +923 -0
- package/dist/create.js.map +1 -0
- package/dist/is-direct-execution-Cdlr-ZUl.js +20 -0
- package/dist/is-direct-execution-Cdlr-ZUl.js.map +1 -0
- package/dist/openapi.js +127 -0
- package/dist/openapi.js.map +1 -0
- package/dist/skills/askr-accessibility/SKILL.md +68 -0
- package/dist/skills/askr-accessibility/agents/openai.yaml +4 -0
- package/dist/skills/askr-agent-execution/SKILL.md +85 -0
- package/dist/skills/askr-agent-execution/agents/openai.yaml +4 -0
- package/dist/skills/askr-agent-workflows/SKILL.md +57 -0
- package/dist/skills/askr-agent-workflows/agents/openai.yaml +4 -0
- package/dist/skills/askr-api-integration/SKILL.md +79 -0
- package/dist/skills/askr-api-integration/agents/openai.yaml +4 -0
- package/dist/skills/askr-app-builder/SKILL.md +99 -0
- package/dist/skills/askr-app-builder/agents/openai.yaml +4 -0
- package/dist/skills/askr-auth-access/SKILL.md +74 -0
- package/dist/skills/askr-auth-access/agents/openai.yaml +4 -0
- package/dist/skills/askr-cli-vite/SKILL.md +76 -0
- package/dist/skills/askr-cli-vite/agents/openai.yaml +4 -0
- package/dist/skills/askr-dashboard-charts/SKILL.md +82 -0
- package/dist/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
- package/dist/skills/askr-design-system/SKILL.md +86 -0
- package/dist/skills/askr-design-system/agents/openai.yaml +4 -0
- package/dist/skills/askr-env-config/SKILL.md +74 -0
- package/dist/skills/askr-env-config/agents/openai.yaml +4 -0
- package/dist/skills/askr-error-loading-empty/SKILL.md +89 -0
- package/dist/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
- package/dist/skills/askr-file-upload-artifacts/SKILL.md +77 -0
- package/dist/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
- package/dist/skills/askr-forms-tables-crud/SKILL.md +98 -0
- package/dist/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
- package/dist/skills/askr-mental-model/SKILL.md +109 -0
- package/dist/skills/askr-mental-model/agents/openai.yaml +4 -0
- package/dist/skills/askr-migration-react/SKILL.md +81 -0
- package/dist/skills/askr-migration-react/agents/openai.yaml +4 -0
- package/dist/skills/askr-observability-debugging/SKILL.md +83 -0
- package/dist/skills/askr-observability-debugging/agents/openai.yaml +4 -0
- package/dist/skills/askr-project-structure/SKILL.md +79 -0
- package/dist/skills/askr-project-structure/agents/openai.yaml +4 -0
- package/dist/skills/askr-query-mutation/SKILL.md +115 -0
- package/dist/skills/askr-query-mutation/agents/openai.yaml +4 -0
- package/dist/skills/askr-realtime-streaming/SKILL.md +76 -0
- package/dist/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
- package/dist/skills/askr-resources-data/SKILL.md +100 -0
- package/dist/skills/askr-resources-data/agents/openai.yaml +4 -0
- package/dist/skills/askr-routing-layouts/SKILL.md +107 -0
- package/dist/skills/askr-routing-layouts/agents/openai.yaml +4 -0
- package/dist/skills/askr-runtime-reactivity/SKILL.md +92 -0
- package/dist/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
- package/dist/skills/askr-ssr-ssg/SKILL.md +76 -0
- package/dist/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
- package/dist/skills/askr-testing-determinism/SKILL.md +75 -0
- package/dist/skills/askr-testing-determinism/agents/openai.yaml +4 -0
- package/dist/skills/askr-theming/SKILL.md +86 -0
- package/dist/skills/askr-theming/agents/openai.yaml +4 -0
- package/dist/skills/askr-ui-composition/SKILL.md +92 -0
- package/dist/skills/askr-ui-composition/agents/openai.yaml +4 -0
- package/dist/skills-Bh0mEhIx.js +682 -0
- package/dist/skills-Bh0mEhIx.js.map +1 -0
- package/dist/skills.js +3 -0
- package/dist/ssg.js +188 -0
- package/dist/ssg.js.map +1 -0
- package/dist/templates/full-stack/AGENTS.md +12 -0
- package/dist/templates/full-stack/README.md +18 -0
- package/dist/templates/full-stack/gitignore.template +4 -0
- package/dist/templates/full-stack/index.html +14 -0
- package/dist/templates/full-stack/package.json +37 -0
- package/dist/templates/full-stack/server.ts +13 -0
- package/dist/templates/full-stack/src/action-authorizations.ts +10 -0
- package/dist/templates/full-stack/src/actions/create-message.ts +10 -0
- package/dist/templates/full-stack/src/i18n.ts +8 -0
- package/dist/templates/full-stack/src/main.tsx +12 -0
- package/dist/templates/full-stack/src/pages/home.tsx +25 -0
- package/dist/templates/full-stack/src/pages/layout.tsx +33 -0
- package/dist/templates/full-stack/src/pages/not-found.tsx +4 -0
- package/dist/templates/full-stack/src/routes.tsx +20 -0
- package/dist/templates/full-stack/src/schemas.ts +11 -0
- package/dist/templates/full-stack/src/server/action-registry.ts +12 -0
- package/dist/templates/full-stack/src/server/actions/create-message.ts +14 -0
- package/dist/templates/full-stack/src/server/app.ts +66 -0
- package/dist/templates/full-stack/src/server/dependencies.ts +55 -0
- package/dist/templates/full-stack/src/server/entry-server.ts +8 -0
- package/dist/templates/full-stack/src/telemetry.ts +4 -0
- package/dist/templates/full-stack/src/vite-server.d.ts +6 -0
- package/dist/templates/full-stack/tests/actions/create-message.test.ts +13 -0
- package/dist/templates/full-stack/tsconfig.json +16 -0
- package/dist/templates/full-stack/vite.config.ts +11 -0
- package/dist/templates/spa/AGENTS.md +60 -0
- package/dist/templates/spa/README.md +96 -0
- package/dist/templates/spa/gitignore.template +16 -0
- package/dist/templates/spa/index.html +13 -0
- package/dist/templates/spa/package.json +35 -0
- package/dist/templates/spa/src/adapters/operations-client.ts +90 -0
- package/dist/templates/spa/src/components/shared/metric-card.tsx +27 -0
- package/dist/templates/spa/src/components/shared/status-badge.tsx +24 -0
- package/dist/templates/spa/src/features/operations/operations.query.ts +9 -0
- package/dist/templates/spa/src/main.tsx +10 -0
- package/dist/templates/spa/src/pages/_layout.tsx +9 -0
- package/dist/templates/spa/src/pages/_routes.tsx +27 -0
- package/dist/templates/spa/src/pages/app/_layout.tsx +94 -0
- package/dist/templates/spa/src/pages/app/_routes.tsx +10 -0
- package/dist/templates/spa/src/pages/app/admin-home.tsx +152 -0
- package/dist/templates/spa/src/pages/app/agent-runs.tsx +93 -0
- package/dist/templates/spa/src/pages/app/settings.tsx +91 -0
- package/dist/templates/spa/src/pages/auth/_layout.tsx +38 -0
- package/dist/templates/spa/src/pages/auth/_routes.tsx +6 -0
- package/dist/templates/spa/src/pages/auth/login.tsx +63 -0
- package/dist/templates/spa/src/pages/not-found.tsx +22 -0
- package/dist/templates/spa/src/pages/public/_layout.tsx +47 -0
- package/dist/templates/spa/src/pages/public/_routes.tsx +6 -0
- package/dist/templates/spa/src/pages/public/home.tsx +143 -0
- package/dist/templates/spa/src/shared/format.ts +12 -0
- package/dist/templates/spa/src/shared/navigation.ts +15 -0
- package/dist/templates/spa/src/styles/components.css +49 -0
- package/dist/templates/spa/src/styles/layout.css +192 -0
- package/dist/templates/spa/src/styles/reset.css +44 -0
- package/dist/templates/spa/src/styles/theme.css +57 -0
- package/dist/templates/spa/src/styles/tokens.css +20 -0
- package/dist/templates/spa/src/styles.css +7 -0
- package/dist/templates/spa/src/styles.d.ts +1 -0
- package/dist/templates/spa/tests/app.test.tsx +37 -0
- package/dist/templates/spa/tests/components/shared.test.tsx +12 -0
- package/dist/templates/spa/tests/resources.test.ts +22 -0
- package/dist/templates/spa/tsconfig.json +20 -0
- package/dist/templates/spa/tsconfig.node.json +10 -0
- package/dist/templates/spa/vite.config.ts +24 -0
- package/dist/templates/spa/vitest.config.ts +17 -0
- package/dist/templates/ssg/AGENTS.md +55 -0
- package/dist/templates/ssg/README.md +39 -0
- package/dist/templates/ssg/gitignore.template +17 -0
- package/dist/templates/ssg/index.html +13 -0
- package/dist/templates/ssg/package.json +35 -0
- package/dist/templates/ssg/src/app.tsx +14 -0
- package/dist/templates/ssg/src/components/badge.tsx +3 -0
- package/dist/templates/ssg/src/components/counter.tsx +30 -0
- package/dist/templates/ssg/src/components/site-shell.tsx +111 -0
- package/dist/templates/ssg/src/jsx.d.ts +23 -0
- package/dist/templates/ssg/src/main.tsx +8 -0
- package/dist/templates/ssg/src/pages/about.tsx +82 -0
- package/dist/templates/ssg/src/pages/content.tsx +63 -0
- package/dist/templates/ssg/src/pages/example.tsx +97 -0
- package/dist/templates/ssg/src/pages/home.tsx +51 -0
- package/dist/templates/ssg/src/resources/user.ts +15 -0
- package/dist/templates/ssg/src/routes.tsx +15 -0
- package/dist/templates/ssg/src/styles.css +89 -0
- package/dist/templates/ssg/src/vite-env.d.ts +5 -0
- package/dist/templates/ssg/ssg.config.ts +34 -0
- package/dist/templates/ssg/tests/app.test.tsx +19 -0
- package/dist/templates/ssg/tests/components/counter.test.tsx +18 -0
- package/dist/templates/ssg/tests/resources.test.ts +11 -0
- package/dist/templates/ssg/tests/ssg-config.test.ts +11 -0
- package/dist/templates/ssg/tsconfig.json +20 -0
- package/dist/templates/ssg/tsconfig.node.json +10 -0
- package/dist/templates/ssg/vite.config.ts +24 -0
- package/dist/templates/ssg/vitest.config.ts +17 -0
- package/dist/templates/ssr/AGENTS.md +28 -0
- package/dist/templates/ssr/README.md +38 -0
- package/dist/templates/ssr/gitignore.template +16 -0
- package/dist/templates/ssr/index.html +13 -0
- package/dist/templates/ssr/package.json +34 -0
- package/dist/templates/ssr/server.ts +16 -0
- package/dist/templates/ssr/src/app.tsx +21 -0
- package/dist/templates/ssr/src/components/counter.tsx +26 -0
- package/dist/templates/ssr/src/entry-server.tsx +10 -0
- package/dist/templates/ssr/src/main.tsx +11 -0
- package/dist/templates/ssr/src/pages/about.tsx +75 -0
- package/dist/templates/ssr/src/pages/example.tsx +113 -0
- package/dist/templates/ssr/src/pages/home.tsx +56 -0
- package/dist/templates/ssr/src/resources/user.ts +15 -0
- package/dist/templates/ssr/src/routes.tsx +13 -0
- package/dist/templates/ssr/src/styles.css +148 -0
- package/dist/templates/ssr/src/vite-server.d.ts +7 -0
- package/dist/templates/ssr/tests/app.test.tsx +24 -0
- package/dist/templates/ssr/tests/components/counter.test.tsx +13 -0
- package/dist/templates/ssr/tests/resources.test.ts +11 -0
- package/dist/templates/ssr/tsconfig.json +22 -0
- package/dist/templates/ssr/tsconfig.node.json +10 -0
- package/dist/templates/ssr/tsconfig.server.json +15 -0
- package/dist/templates/ssr/vite.config.ts +25 -0
- package/dist/templates/ssr/vitest.config.ts +13 -0
- package/dist/templates/startkit/AGENTS.md +77 -0
- package/dist/templates/startkit/README.md +192 -0
- package/dist/templates/startkit/gitignore.template +16 -0
- package/dist/templates/startkit/index.html +13 -0
- package/dist/templates/startkit/package.json +35 -0
- package/dist/templates/startkit/src/components/app-header.tsx +93 -0
- package/dist/templates/startkit/src/components/app-sidebar.tsx +95 -0
- package/dist/templates/startkit/src/components/data-table.tsx +80 -0
- package/dist/templates/startkit/src/components/empty-state.tsx +13 -0
- package/dist/templates/startkit/src/components/page-header.tsx +23 -0
- package/dist/templates/startkit/src/components/stat-card.tsx +24 -0
- package/dist/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
- package/dist/templates/startkit/src/features/accounts/account-table.tsx +79 -0
- package/dist/templates/startkit/src/lib/format.ts +31 -0
- package/dist/templates/startkit/src/lib/mock-data.ts +441 -0
- package/dist/templates/startkit/src/lib/routes.ts +116 -0
- package/dist/templates/startkit/src/main.tsx +12 -0
- package/dist/templates/startkit/src/pages/_layout.tsx +56 -0
- package/dist/templates/startkit/src/pages/auth/_layout.tsx +7 -0
- package/dist/templates/startkit/src/pages/auth/login.tsx +129 -0
- package/dist/templates/startkit/src/pages/home.tsx +83 -0
- package/dist/templates/startkit/src/pages/not-found.tsx +24 -0
- package/dist/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
- package/dist/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
- package/dist/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
- package/dist/templates/startkit/src/pages/workspace/settings.tsx +218 -0
- package/dist/templates/startkit/src/router.tsx +7 -0
- package/dist/templates/startkit/src/routes/auth-config.ts +38 -0
- package/dist/templates/startkit/src/routes/auth.ts +8 -0
- package/dist/templates/startkit/src/routes/index.ts +28 -0
- package/dist/templates/startkit/src/routes/public.ts +8 -0
- package/dist/templates/startkit/src/routes/workspace/accounts.ts +8 -0
- package/dist/templates/startkit/src/routes/workspace/index.ts +14 -0
- package/dist/templates/startkit/src/styles/components.css +396 -0
- package/dist/templates/startkit/src/styles/layout.css +192 -0
- package/dist/templates/startkit/src/styles/reset.css +38 -0
- package/dist/templates/startkit/src/styles/theme.css +76 -0
- package/dist/templates/startkit/src/styles/tokens.css +67 -0
- package/dist/templates/startkit/src/styles.css +7 -0
- package/dist/templates/startkit/src/toast.ts +55 -0
- package/dist/templates/startkit/src/utils/join-classes.ts +4 -0
- package/dist/templates/startkit/src/vite-env.d.ts +5 -0
- package/dist/templates/startkit/tests/app.test.tsx +32 -0
- package/dist/templates/startkit/tests/preferences.test.ts +43 -0
- package/dist/templates/startkit/tests/resources.test.ts +82 -0
- package/dist/templates/startkit/tsconfig.json +20 -0
- package/dist/templates/startkit/tsconfig.node.json +10 -0
- package/dist/templates/startkit/vite.config.ts +32 -0
- package/dist/templates/startkit/vitest.config.ts +13 -0
- package/dist/update-DyW1na5V.js +1140 -0
- package/dist/update-DyW1na5V.js.map +1 -0
- package/dist/update.js +3 -0
- package/package.json +84 -0
- package/skills/askr-accessibility/SKILL.md +68 -0
- package/skills/askr-accessibility/agents/openai.yaml +4 -0
- package/skills/askr-agent-execution/SKILL.md +85 -0
- package/skills/askr-agent-execution/agents/openai.yaml +4 -0
- package/skills/askr-agent-workflows/SKILL.md +57 -0
- package/skills/askr-agent-workflows/agents/openai.yaml +4 -0
- package/skills/askr-api-integration/SKILL.md +79 -0
- package/skills/askr-api-integration/agents/openai.yaml +4 -0
- package/skills/askr-app-builder/SKILL.md +99 -0
- package/skills/askr-app-builder/agents/openai.yaml +4 -0
- package/skills/askr-auth-access/SKILL.md +74 -0
- package/skills/askr-auth-access/agents/openai.yaml +4 -0
- package/skills/askr-cli-vite/SKILL.md +76 -0
- package/skills/askr-cli-vite/agents/openai.yaml +4 -0
- package/skills/askr-dashboard-charts/SKILL.md +82 -0
- package/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
- package/skills/askr-design-system/SKILL.md +86 -0
- package/skills/askr-design-system/agents/openai.yaml +4 -0
- package/skills/askr-env-config/SKILL.md +74 -0
- package/skills/askr-env-config/agents/openai.yaml +4 -0
- package/skills/askr-error-loading-empty/SKILL.md +89 -0
- package/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
- package/skills/askr-file-upload-artifacts/SKILL.md +77 -0
- package/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
- package/skills/askr-forms-tables-crud/SKILL.md +98 -0
- package/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
- package/skills/askr-mental-model/SKILL.md +109 -0
- package/skills/askr-mental-model/agents/openai.yaml +4 -0
- package/skills/askr-migration-react/SKILL.md +81 -0
- package/skills/askr-migration-react/agents/openai.yaml +4 -0
- package/skills/askr-observability-debugging/SKILL.md +83 -0
- package/skills/askr-observability-debugging/agents/openai.yaml +4 -0
- package/skills/askr-project-structure/SKILL.md +79 -0
- package/skills/askr-project-structure/agents/openai.yaml +4 -0
- package/skills/askr-query-mutation/SKILL.md +115 -0
- package/skills/askr-query-mutation/agents/openai.yaml +4 -0
- package/skills/askr-realtime-streaming/SKILL.md +76 -0
- package/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
- package/skills/askr-resources-data/SKILL.md +100 -0
- package/skills/askr-resources-data/agents/openai.yaml +4 -0
- package/skills/askr-routing-layouts/SKILL.md +107 -0
- package/skills/askr-routing-layouts/agents/openai.yaml +4 -0
- package/skills/askr-runtime-reactivity/SKILL.md +92 -0
- package/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
- package/skills/askr-ssr-ssg/SKILL.md +76 -0
- package/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
- package/skills/askr-testing-determinism/SKILL.md +75 -0
- package/skills/askr-testing-determinism/agents/openai.yaml +4 -0
- package/skills/askr-theming/SKILL.md +86 -0
- package/skills/askr-theming/agents/openai.yaml +4 -0
- package/skills/askr-ui-composition/SKILL.md +92 -0
- package/skills/askr-ui-composition/agents/openai.yaml +4 -0
- package/templates/full-stack/AGENTS.md +12 -0
- package/templates/full-stack/README.md +18 -0
- package/templates/full-stack/gitignore.template +4 -0
- package/templates/full-stack/index.html +14 -0
- package/templates/full-stack/package.json +37 -0
- package/templates/full-stack/server.ts +13 -0
- package/templates/full-stack/src/action-authorizations.ts +10 -0
- package/templates/full-stack/src/actions/create-message.ts +10 -0
- package/templates/full-stack/src/i18n.ts +8 -0
- package/templates/full-stack/src/main.tsx +12 -0
- package/templates/full-stack/src/pages/home.tsx +25 -0
- package/templates/full-stack/src/pages/layout.tsx +33 -0
- package/templates/full-stack/src/pages/not-found.tsx +4 -0
- package/templates/full-stack/src/routes.tsx +20 -0
- package/templates/full-stack/src/schemas.ts +11 -0
- package/templates/full-stack/src/server/action-registry.ts +12 -0
- package/templates/full-stack/src/server/actions/create-message.ts +14 -0
- package/templates/full-stack/src/server/app.ts +66 -0
- package/templates/full-stack/src/server/dependencies.ts +55 -0
- package/templates/full-stack/src/server/entry-server.ts +8 -0
- package/templates/full-stack/src/telemetry.ts +4 -0
- package/templates/full-stack/src/vite-server.d.ts +6 -0
- package/templates/full-stack/tests/actions/create-message.test.ts +13 -0
- package/templates/full-stack/tsconfig.json +16 -0
- package/templates/full-stack/vite.config.ts +11 -0
- package/templates/spa/AGENTS.md +60 -0
- package/templates/spa/README.md +96 -0
- package/templates/spa/gitignore.template +16 -0
- package/templates/spa/index.html +13 -0
- package/templates/spa/package.json +35 -0
- package/templates/spa/src/adapters/operations-client.ts +90 -0
- package/templates/spa/src/components/shared/metric-card.tsx +27 -0
- package/templates/spa/src/components/shared/status-badge.tsx +24 -0
- package/templates/spa/src/features/operations/operations.query.ts +9 -0
- package/templates/spa/src/main.tsx +10 -0
- package/templates/spa/src/pages/_layout.tsx +9 -0
- package/templates/spa/src/pages/_routes.tsx +27 -0
- package/templates/spa/src/pages/app/_layout.tsx +94 -0
- package/templates/spa/src/pages/app/_routes.tsx +10 -0
- package/templates/spa/src/pages/app/admin-home.tsx +152 -0
- package/templates/spa/src/pages/app/agent-runs.tsx +93 -0
- package/templates/spa/src/pages/app/settings.tsx +91 -0
- package/templates/spa/src/pages/auth/_layout.tsx +38 -0
- package/templates/spa/src/pages/auth/_routes.tsx +6 -0
- package/templates/spa/src/pages/auth/login.tsx +63 -0
- package/templates/spa/src/pages/not-found.tsx +22 -0
- package/templates/spa/src/pages/public/_layout.tsx +47 -0
- package/templates/spa/src/pages/public/_routes.tsx +6 -0
- package/templates/spa/src/pages/public/home.tsx +143 -0
- package/templates/spa/src/shared/format.ts +12 -0
- package/templates/spa/src/shared/navigation.ts +15 -0
- package/templates/spa/src/styles/components.css +49 -0
- package/templates/spa/src/styles/layout.css +192 -0
- package/templates/spa/src/styles/reset.css +44 -0
- package/templates/spa/src/styles/theme.css +57 -0
- package/templates/spa/src/styles/tokens.css +20 -0
- package/templates/spa/src/styles.css +7 -0
- package/templates/spa/src/styles.d.ts +1 -0
- package/templates/spa/tests/app.test.tsx +37 -0
- package/templates/spa/tests/components/shared.test.tsx +12 -0
- package/templates/spa/tests/resources.test.ts +22 -0
- package/templates/spa/tsconfig.json +20 -0
- package/templates/spa/tsconfig.node.json +10 -0
- package/templates/spa/vite.config.ts +24 -0
- package/templates/spa/vitest.config.ts +17 -0
- package/templates/ssg/AGENTS.md +55 -0
- package/templates/ssg/README.md +39 -0
- package/templates/ssg/gitignore.template +17 -0
- package/templates/ssg/index.html +13 -0
- package/templates/ssg/package.json +35 -0
- package/templates/ssg/src/app.tsx +14 -0
- package/templates/ssg/src/components/badge.tsx +3 -0
- package/templates/ssg/src/components/counter.tsx +30 -0
- package/templates/ssg/src/components/site-shell.tsx +111 -0
- package/templates/ssg/src/jsx.d.ts +23 -0
- package/templates/ssg/src/main.tsx +8 -0
- package/templates/ssg/src/pages/about.tsx +82 -0
- package/templates/ssg/src/pages/content.tsx +63 -0
- package/templates/ssg/src/pages/example.tsx +97 -0
- package/templates/ssg/src/pages/home.tsx +51 -0
- package/templates/ssg/src/resources/user.ts +15 -0
- package/templates/ssg/src/routes.tsx +15 -0
- package/templates/ssg/src/styles.css +89 -0
- package/templates/ssg/src/vite-env.d.ts +5 -0
- package/templates/ssg/ssg.config.ts +34 -0
- package/templates/ssg/tests/app.test.tsx +19 -0
- package/templates/ssg/tests/components/counter.test.tsx +18 -0
- package/templates/ssg/tests/resources.test.ts +11 -0
- package/templates/ssg/tests/ssg-config.test.ts +11 -0
- package/templates/ssg/tsconfig.json +20 -0
- package/templates/ssg/tsconfig.node.json +10 -0
- package/templates/ssg/vite.config.ts +24 -0
- package/templates/ssg/vitest.config.ts +17 -0
- package/templates/ssr/AGENTS.md +28 -0
- package/templates/ssr/README.md +38 -0
- package/templates/ssr/gitignore.template +16 -0
- package/templates/ssr/index.html +13 -0
- package/templates/ssr/package.json +34 -0
- package/templates/ssr/server.ts +16 -0
- package/templates/ssr/src/app.tsx +21 -0
- package/templates/ssr/src/components/counter.tsx +26 -0
- package/templates/ssr/src/entry-server.tsx +10 -0
- package/templates/ssr/src/main.tsx +11 -0
- package/templates/ssr/src/pages/about.tsx +75 -0
- package/templates/ssr/src/pages/example.tsx +113 -0
- package/templates/ssr/src/pages/home.tsx +56 -0
- package/templates/ssr/src/resources/user.ts +15 -0
- package/templates/ssr/src/routes.tsx +13 -0
- package/templates/ssr/src/styles.css +148 -0
- package/templates/ssr/src/vite-server.d.ts +7 -0
- package/templates/ssr/tests/app.test.tsx +24 -0
- package/templates/ssr/tests/components/counter.test.tsx +13 -0
- package/templates/ssr/tests/resources.test.ts +11 -0
- package/templates/ssr/tsconfig.json +22 -0
- package/templates/ssr/tsconfig.node.json +10 -0
- package/templates/ssr/tsconfig.server.json +15 -0
- package/templates/ssr/vite.config.ts +25 -0
- package/templates/ssr/vitest.config.ts +13 -0
- package/templates/startkit/AGENTS.md +77 -0
- package/templates/startkit/README.md +192 -0
- package/templates/startkit/gitignore.template +16 -0
- package/templates/startkit/index.html +13 -0
- package/templates/startkit/package.json +35 -0
- package/templates/startkit/src/components/app-header.tsx +93 -0
- package/templates/startkit/src/components/app-sidebar.tsx +95 -0
- package/templates/startkit/src/components/data-table.tsx +80 -0
- package/templates/startkit/src/components/empty-state.tsx +13 -0
- package/templates/startkit/src/components/page-header.tsx +23 -0
- package/templates/startkit/src/components/stat-card.tsx +24 -0
- package/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
- package/templates/startkit/src/features/accounts/account-table.tsx +79 -0
- package/templates/startkit/src/lib/format.ts +31 -0
- package/templates/startkit/src/lib/mock-data.ts +441 -0
- package/templates/startkit/src/lib/routes.ts +116 -0
- package/templates/startkit/src/main.tsx +12 -0
- package/templates/startkit/src/pages/_layout.tsx +56 -0
- package/templates/startkit/src/pages/auth/_layout.tsx +7 -0
- package/templates/startkit/src/pages/auth/login.tsx +129 -0
- package/templates/startkit/src/pages/home.tsx +83 -0
- package/templates/startkit/src/pages/not-found.tsx +24 -0
- package/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
- package/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
- package/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
- package/templates/startkit/src/pages/workspace/settings.tsx +218 -0
- package/templates/startkit/src/router.tsx +7 -0
- package/templates/startkit/src/routes/auth-config.ts +38 -0
- package/templates/startkit/src/routes/auth.ts +8 -0
- package/templates/startkit/src/routes/index.ts +28 -0
- package/templates/startkit/src/routes/public.ts +8 -0
- package/templates/startkit/src/routes/workspace/accounts.ts +8 -0
- package/templates/startkit/src/routes/workspace/index.ts +14 -0
- package/templates/startkit/src/styles/components.css +396 -0
- package/templates/startkit/src/styles/layout.css +192 -0
- package/templates/startkit/src/styles/reset.css +38 -0
- package/templates/startkit/src/styles/theme.css +76 -0
- package/templates/startkit/src/styles/tokens.css +67 -0
- package/templates/startkit/src/styles.css +7 -0
- package/templates/startkit/src/toast.ts +55 -0
- package/templates/startkit/src/utils/join-classes.ts +4 -0
- package/templates/startkit/src/vite-env.d.ts +5 -0
- package/templates/startkit/tests/app.test.tsx +32 -0
- package/templates/startkit/tests/preferences.test.ts +43 -0
- package/templates/startkit/tests/resources.test.ts +82 -0
- package/templates/startkit/tsconfig.json +20 -0
- package/templates/startkit/tsconfig.node.json +10 -0
- package/templates/startkit/vite.config.ts +32 -0
- package/templates/startkit/vitest.config.ts +13 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
@import '@askrjs/themes/default';
|
|
2
|
+
|
|
3
|
+
/* Layout */
|
|
4
|
+
body {
|
|
5
|
+
margin: 0;
|
|
6
|
+
background: var(--ak-color-bg);
|
|
7
|
+
color: var(--ak-color-fg);
|
|
8
|
+
font-family: var(--ak-font-family);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
header {
|
|
12
|
+
border-bottom: 1px solid var(--ak-color-border);
|
|
13
|
+
padding: var(--ak-space-md) var(--ak-space-xl);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
header nav {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: space-between;
|
|
20
|
+
max-width: var(--ak-layout-content-max-width);
|
|
21
|
+
margin: 0 auto;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
header nav a {
|
|
25
|
+
color: var(--ak-color-fg);
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
font-size: var(--ak-font-size-md);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
header nav a:hover {
|
|
31
|
+
color: var(--ak-color-primary);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
main {
|
|
35
|
+
max-width: var(--ak-layout-content-max-width);
|
|
36
|
+
margin: 0 auto;
|
|
37
|
+
padding: var(--ak-space-xl);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Utility */
|
|
41
|
+
.nav-links {
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
gap: var(--ak-space-lg);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.section {
|
|
48
|
+
margin-bottom: var(--ak-space-xl);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.text-center {
|
|
52
|
+
text-align: center;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.text-muted {
|
|
56
|
+
color: var(--ak-color-muted);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
h1,
|
|
60
|
+
h2,
|
|
61
|
+
h3 {
|
|
62
|
+
color: var(--ak-color-fg);
|
|
63
|
+
margin: 0 0 var(--ak-space-md);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
p {
|
|
67
|
+
line-height: 1.6;
|
|
68
|
+
margin: 0 0 var(--ak-space-md);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
code {
|
|
72
|
+
background: var(--ak-color-surface-muted);
|
|
73
|
+
padding: 0.15em 0.4em;
|
|
74
|
+
border-radius: var(--ak-radius-sm);
|
|
75
|
+
font-size: 0.9em;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Feature grid */
|
|
79
|
+
.features {
|
|
80
|
+
display: grid;
|
|
81
|
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
82
|
+
gap: var(--ak-space-lg);
|
|
83
|
+
margin: var(--ak-space-xl) 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.feature-card {
|
|
87
|
+
background: var(--ak-color-surface);
|
|
88
|
+
border: 1px solid var(--ak-color-border);
|
|
89
|
+
border-radius: var(--ak-radius-md);
|
|
90
|
+
padding: var(--ak-space-lg);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Counter */
|
|
94
|
+
.counter {
|
|
95
|
+
background: var(--ak-color-surface);
|
|
96
|
+
border: 1px solid var(--ak-color-border);
|
|
97
|
+
border-radius: var(--ak-radius-md);
|
|
98
|
+
padding: var(--ak-space-xl);
|
|
99
|
+
text-align: center;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.counter-value {
|
|
103
|
+
font-size: 4rem;
|
|
104
|
+
font-weight: 800;
|
|
105
|
+
color: var(--ak-color-primary);
|
|
106
|
+
margin: var(--ak-space-lg) 0;
|
|
107
|
+
line-height: 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.counter-controls {
|
|
111
|
+
display: flex;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
gap: var(--ak-space-md);
|
|
114
|
+
margin-top: var(--ak-space-lg);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Component showcase */
|
|
118
|
+
.showcase-section {
|
|
119
|
+
background: var(--ak-color-surface);
|
|
120
|
+
border: 1px solid var(--ak-color-border);
|
|
121
|
+
border-radius: var(--ak-radius-md);
|
|
122
|
+
padding: var(--ak-space-lg);
|
|
123
|
+
margin-bottom: var(--ak-space-lg);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.showcase-section h3 {
|
|
127
|
+
margin-bottom: var(--ak-space-md);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Hero buttons */
|
|
131
|
+
.hero-actions {
|
|
132
|
+
display: flex;
|
|
133
|
+
gap: var(--ak-space-md);
|
|
134
|
+
justify-content: center;
|
|
135
|
+
margin: var(--ak-space-xl) 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Responsive */
|
|
139
|
+
@media (max-width: 48rem) {
|
|
140
|
+
.features {
|
|
141
|
+
grid-template-columns: 1fr;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.hero-actions {
|
|
145
|
+
flex-direction: column;
|
|
146
|
+
align-items: stretch;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vite-plus/test';
|
|
2
|
+
|
|
3
|
+
describe('App Component', () => {
|
|
4
|
+
it('renders layout with navigation', () => {
|
|
5
|
+
const app = (
|
|
6
|
+
<div>
|
|
7
|
+
<header>
|
|
8
|
+
<nav>
|
|
9
|
+
<strong>Askr</strong>
|
|
10
|
+
<div>
|
|
11
|
+
<a href="/example">Example</a>
|
|
12
|
+
<a href="/about">About</a>
|
|
13
|
+
</div>
|
|
14
|
+
</nav>
|
|
15
|
+
</header>
|
|
16
|
+
<main>
|
|
17
|
+
<p>Content goes here</p>
|
|
18
|
+
</main>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
expect(app).toBeDefined();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vite-plus/test';
|
|
2
|
+
import { renderToString } from '@askrjs/askr/ssr';
|
|
3
|
+
import Counter from '../../src/components/counter';
|
|
4
|
+
|
|
5
|
+
describe('Counter', () => {
|
|
6
|
+
it('renders its initial state during SSR', () => {
|
|
7
|
+
const html = renderToString(() => <Counter />);
|
|
8
|
+
|
|
9
|
+
expect(html).toContain('counter-value');
|
|
10
|
+
expect(html).toContain('>0<');
|
|
11
|
+
expect(html).toContain('>even<');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vite-plus/test';
|
|
2
|
+
import { fetchUser } from '../src/resources/user';
|
|
3
|
+
|
|
4
|
+
describe('SSR Resources', () => {
|
|
5
|
+
it('creates a resource for fetching user data', () => {
|
|
6
|
+
// Resources are called during component render
|
|
7
|
+
// Here we just verify the function is defined
|
|
8
|
+
expect(fetchUser).toBeDefined();
|
|
9
|
+
expect(typeof fetchUser).toBe('function');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"allowSyntheticDefaultImports": true,
|
|
11
|
+
"strict": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true,
|
|
15
|
+
"jsx": "preserve",
|
|
16
|
+
"jsxImportSource": "@askrjs/askr",
|
|
17
|
+
"types": ["vite/client"]
|
|
18
|
+
},
|
|
19
|
+
"include": ["src"],
|
|
20
|
+
"exclude": ["dist"],
|
|
21
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["ES2022"],
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
7
|
+
"strict": true,
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"outDir": "dist/server",
|
|
11
|
+
"noEmit": false,
|
|
12
|
+
"types": ["node"]
|
|
13
|
+
},
|
|
14
|
+
"include": ["server.ts", "src/vite-server.d.ts"]
|
|
15
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defineConfig } from 'vite-plus';
|
|
2
|
+
import { askr } from '@askrjs/vite';
|
|
3
|
+
import { askrServer } from '@askrjs/vite/server';
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [askr(), askrServer({ entry: './src/entry-server.tsx' })],
|
|
7
|
+
lint: {
|
|
8
|
+
ignorePatterns: ['dist/**', 'node_modules/**', 'coverage/**'],
|
|
9
|
+
},
|
|
10
|
+
fmt: {
|
|
11
|
+
semi: true,
|
|
12
|
+
singleQuote: true,
|
|
13
|
+
trailingComma: 'es5',
|
|
14
|
+
printWidth: 80,
|
|
15
|
+
tabWidth: 2,
|
|
16
|
+
},
|
|
17
|
+
server: {
|
|
18
|
+
port: 5173,
|
|
19
|
+
open: true,
|
|
20
|
+
},
|
|
21
|
+
build: {
|
|
22
|
+
manifest: true,
|
|
23
|
+
sourcemap: true,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineConfig } from 'vite-plus';
|
|
2
|
+
import { askr } from '@askrjs/vite';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [askr()],
|
|
6
|
+
test: {
|
|
7
|
+
environment: 'jsdom',
|
|
8
|
+
globals: true,
|
|
9
|
+
coverage: {
|
|
10
|
+
reporter: ['text', 'json', 'html'],
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# {{appName}}
|
|
2
|
+
|
|
3
|
+
Client-side SPA built with Askr, askr-ui, and askr-themes.
|
|
4
|
+
|
|
5
|
+
## Agent Workflow
|
|
6
|
+
|
|
7
|
+
- Read `package.json`, `src/main.tsx`, `src/router.tsx`, the nearest route file, and the nearest feature folder before editing.
|
|
8
|
+
- Use Askr skills in this order when scope is unclear: `askr-app-builder`, `askr-mental-model`, `askr-project-structure`, then the specialized skill for the touched surface.
|
|
9
|
+
- Prefer the smallest change that matches the existing route, feature, shell, and style conventions.
|
|
10
|
+
- Validate with the narrowest relevant executable check first, then widen only if needed.
|
|
11
|
+
|
|
12
|
+
## Commands
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm run dev # Vite dev server with HMR (port 5173)
|
|
16
|
+
npm run build # Production build to dist/
|
|
17
|
+
npm run preview # Serve production build locally
|
|
18
|
+
npm test # Vitest (jsdom)
|
|
19
|
+
npm run typecheck # tsc --noEmit
|
|
20
|
+
npm run lint # ESLint
|
|
21
|
+
npm run fmt # Prettier
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
- **Framework:** Askr - actor-backed, fine-grained reactive UI. No virtual DOM.
|
|
27
|
+
- **Components:** askr-ui headless components (Button, Accordion, Toggle, Input, etc.). Props use `onPress` (not `onClick`), `asChild` for polymorphism, `data-slot` attributes for styling hooks.
|
|
28
|
+
- **Styling:** askr-themes CSS via `[data-slot]` selectors. Keep `src/styles.css` as a thin entrypoint and organize styles in `src/styles/*` using layers (reset/tokens/theme/layout/components).
|
|
29
|
+
- **Routing:** `createRouteRegistry()` composes `group()` and `route()` declarations in `src/router.tsx`. Use `currentRoute()` inside components and navigate with `<Link href="...">`.
|
|
30
|
+
- **State:** Prefer `const [value, setValue] = state(initial)`. Read with `value()`, update with `setValue(...)`. `derive()` for computed values. `resource()` for async data.
|
|
31
|
+
- **Data flow:** Keep sample data in `src/lib/mock-data.ts`, not inline in pages. Read async data with `resource()` and keep mock mutations in the same lib boundary.
|
|
32
|
+
- **Preferences:** Keep persistent appearance/session helpers in the lib boundary and initialize at app bootstrap.
|
|
33
|
+
- **Vite plugin:** `askr()` from `@askrjs/vite` handles JSX transform - no manual esbuild config needed.
|
|
34
|
+
|
|
35
|
+
## Do Not Invent By Default
|
|
36
|
+
|
|
37
|
+
- React hooks, React Router patterns, or `useEffect`-style data loading.
|
|
38
|
+
- Generic query-client or global-store abstractions when `resource()`, `createQuery()`, or `createMutation()` already fit.
|
|
39
|
+
- App-local `Button`, `Card`, `Panel`, `Sidebar`, `Navbar`, `EmptyState`, `HStack`, or `VStack` clones before checking `@askrjs/ui` and `@askrjs/themes`.
|
|
40
|
+
- Route-local API clients or DTO mapping inside page components.
|
|
41
|
+
|
|
42
|
+
## File Structure
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
src/
|
|
46
|
+
main.tsx # Entry: createSPA + navigate
|
|
47
|
+
app.tsx # Root layout with nav
|
|
48
|
+
router.tsx # Route registration
|
|
49
|
+
styles.css # Style entrypoint
|
|
50
|
+
styles/ # reset/tokens/theme/layout/components layers
|
|
51
|
+
components/ # App-level reusable components
|
|
52
|
+
layouts/ # app and auth route layouts
|
|
53
|
+
features/ # feature-scoped UI modules
|
|
54
|
+
pages/ # Route page components
|
|
55
|
+
lib/ # Mock data + formatting helpers
|
|
56
|
+
tests/ # Vitest tests
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Conventions
|
|
60
|
+
|
|
61
|
+
- TypeScript strict mode, ESM-only
|
|
62
|
+
- JSX import source: `@askrjs/askr`
|
|
63
|
+
- Use askr-ui components instead of raw HTML for interactive elements
|
|
64
|
+
- Prefer composed components from `src/components/*` for app surfaces like panels, headers, tables, and empty states
|
|
65
|
+
- Style with tokens; avoid hardcoded non-theme colors in component classes
|
|
66
|
+
- Keep spacing on a strict rhythm: 4/8/16/24/32/48
|
|
67
|
+
- Keep typography to a small semantic scale (title/section/body/muted)
|
|
68
|
+
- Prefer subtle borders over heavy shadows or decorative effects
|
|
69
|
+
- Ensure consistent hover/focus-visible/disabled/empty/error treatment across components
|
|
70
|
+
- Prettier + ESLint enforced
|
|
71
|
+
|
|
72
|
+
## Validation
|
|
73
|
+
|
|
74
|
+
- Run the narrowest relevant test first.
|
|
75
|
+
- Run `npm run typecheck` for type-sensitive changes.
|
|
76
|
+
- Run `npm run build` when app boot, routing, or packaging changes.
|
|
77
|
+
- Confirm loading, empty, error, stale, and pending states remain truthful for user-visible flows.
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# {{appName}} starter kit
|
|
2
|
+
|
|
3
|
+
A production-ready Askr starter built to feel like a real product from day one.
|
|
4
|
+
|
|
5
|
+
It ships with opinionated defaults for routing boundaries, layout composition,
|
|
6
|
+
state handling, and interface polish so you can focus on product behavior instead
|
|
7
|
+
of project plumbing.
|
|
8
|
+
|
|
9
|
+
Stack:
|
|
10
|
+
|
|
11
|
+
- `@askrjs/askr`
|
|
12
|
+
- `@askrjs/auth`
|
|
13
|
+
- `@askrjs/ui`
|
|
14
|
+
- `@askrjs/themes` (default)
|
|
15
|
+
- Lucide icons via `@askrjs/lucide`
|
|
16
|
+
- plain CSS with layers and design tokens
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install
|
|
22
|
+
npm run dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Then run quality checks before your first commit:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run check
|
|
29
|
+
npm run fmt:check
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Command reference
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm run dev # Local dev server with HMR
|
|
36
|
+
npm run build # Production build
|
|
37
|
+
npm run preview # Preview production build
|
|
38
|
+
npm run typecheck # TypeScript checks
|
|
39
|
+
npm run lint # ESLint across project files
|
|
40
|
+
npm test # Vitest suite
|
|
41
|
+
npm run fmt # Format full project with Prettier
|
|
42
|
+
npm run fmt:check # Verify formatting
|
|
43
|
+
npm run check # lint + typecheck + tests + production build
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Routes and layout model
|
|
47
|
+
|
|
48
|
+
Routes are registered in src/router.tsx and split into explicit groups:
|
|
49
|
+
|
|
50
|
+
- Public routes: / (landing)
|
|
51
|
+
- Auth routes: /login (centered auth layout)
|
|
52
|
+
- Protected routes: /dashboard, /accounts, /settings (app shell layout)
|
|
53
|
+
- Fallback route: /\* (not found)
|
|
54
|
+
|
|
55
|
+
The root app wrapper in `src/pages/_layout.tsx` owns cross-cutting UI such as toast.
|
|
56
|
+
|
|
57
|
+
## Project structure
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
src/
|
|
61
|
+
main.tsx
|
|
62
|
+
router.tsx
|
|
63
|
+
|
|
64
|
+
routes/
|
|
65
|
+
index.ts
|
|
66
|
+
auth.ts
|
|
67
|
+
auth-config.ts
|
|
68
|
+
public.ts
|
|
69
|
+
workspace/
|
|
70
|
+
index.ts
|
|
71
|
+
accounts.ts
|
|
72
|
+
|
|
73
|
+
pages/
|
|
74
|
+
_layout.tsx
|
|
75
|
+
home.tsx
|
|
76
|
+
not-found.tsx
|
|
77
|
+
auth/
|
|
78
|
+
_layout.tsx
|
|
79
|
+
login.tsx
|
|
80
|
+
workspace/
|
|
81
|
+
_layout.tsx
|
|
82
|
+
dashboard.tsx
|
|
83
|
+
settings.tsx
|
|
84
|
+
accounts/
|
|
85
|
+
index.tsx
|
|
86
|
+
|
|
87
|
+
components/
|
|
88
|
+
app-sidebar.tsx
|
|
89
|
+
app-header.tsx
|
|
90
|
+
stat-card.tsx
|
|
91
|
+
data-table.tsx
|
|
92
|
+
empty-state.tsx
|
|
93
|
+
page-header.tsx
|
|
94
|
+
|
|
95
|
+
features/
|
|
96
|
+
accounts/
|
|
97
|
+
account-table.tsx
|
|
98
|
+
account-filters.tsx
|
|
99
|
+
|
|
100
|
+
lib/
|
|
101
|
+
mock-data.ts
|
|
102
|
+
format.ts
|
|
103
|
+
routes.ts
|
|
104
|
+
|
|
105
|
+
styles.css
|
|
106
|
+
styles/
|
|
107
|
+
reset.css
|
|
108
|
+
tokens.css
|
|
109
|
+
theme.css
|
|
110
|
+
layout.css
|
|
111
|
+
components.css
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## How routing works
|
|
115
|
+
|
|
116
|
+
`src/router.tsx` creates one registry with `createRouteRegistry()`. The files in
|
|
117
|
+
`src/routes` compose its `group()` and `route()` declarations:
|
|
118
|
+
|
|
119
|
+
- A shared root wrapper for providers
|
|
120
|
+
- Auth layout only for /login
|
|
121
|
+
- App layout only for protected routes
|
|
122
|
+
- Function-based auth requirements redirect unauthenticated users from protected routes to /login
|
|
123
|
+
|
|
124
|
+
This keeps route ownership clear and avoids one mega-layout for every page type.
|
|
125
|
+
|
|
126
|
+
## How layouts work
|
|
127
|
+
|
|
128
|
+
- App layout (`src/pages/workspace/_layout.tsx`): sidebar + sticky header + content area.
|
|
129
|
+
- Auth layout (`src/pages/auth/_layout.tsx`): minimal centered shell for forms.
|
|
130
|
+
|
|
131
|
+
Use app layout for authenticated product surfaces and auth layout for onboarding/login flows.
|
|
132
|
+
|
|
133
|
+
## How to add a page
|
|
134
|
+
|
|
135
|
+
1. Create a new page file in the matching branch under `src/pages`.
|
|
136
|
+
2. Register it in the matching file under `src/routes`.
|
|
137
|
+
3. Place the route in the correct layout group (public, auth, protected).
|
|
138
|
+
4. If protected, use the existing function requirements such as `requireUser()`,
|
|
139
|
+
`requireRole()`, or `requirePermission()` at the narrowest owning route or group.
|
|
140
|
+
|
|
141
|
+
## First-hour customization checklist
|
|
142
|
+
|
|
143
|
+
1. Update brand name, colors, and typography tokens in src/styles/tokens.css.
|
|
144
|
+
2. Replace mock user/session data in src/lib/mock-data.ts.
|
|
145
|
+
3. Swap dashboard/account samples for domain-specific features.
|
|
146
|
+
4. Wire login and route auth logic to your real auth provider.
|
|
147
|
+
5. Replace placeholders in landing and settings copy with product language.
|
|
148
|
+
6. Add one end-to-end happy-path test for your primary workflow.
|
|
149
|
+
|
|
150
|
+
## How to add a component
|
|
151
|
+
|
|
152
|
+
1. Put shared UI in `src/components`.
|
|
153
|
+
2. Put domain-specific pieces in `src/features/<feature-name>`.
|
|
154
|
+
3. Keep component APIs prop-driven and small.
|
|
155
|
+
4. Prefer composing `@askrjs/ui` and `@askrjs/themes/components` before inventing new abstractions.
|
|
156
|
+
|
|
157
|
+
## Styling organization
|
|
158
|
+
|
|
159
|
+
The CSS architecture is intentionally layered:
|
|
160
|
+
|
|
161
|
+
- reset.css: baseline resets
|
|
162
|
+
- tokens.css: design tokens (colors, spacing, type scale, radius)
|
|
163
|
+
- theme.css: global typography and high-level theme values
|
|
164
|
+
- layout.css: page/shell structure and responsive behavior
|
|
165
|
+
- components.css: component and slot-level styling
|
|
166
|
+
|
|
167
|
+
Guidelines:
|
|
168
|
+
|
|
169
|
+
- Use token variables for spacing and colors.
|
|
170
|
+
- Keep a calm neutral palette and one accent color.
|
|
171
|
+
- Prefer subtle borders over heavy shadows.
|
|
172
|
+
- Keep radius and motion restrained.
|
|
173
|
+
|
|
174
|
+
## UX patterns included
|
|
175
|
+
|
|
176
|
+
- Loading states (skeletons)
|
|
177
|
+
- Empty states
|
|
178
|
+
- Error states
|
|
179
|
+
- Disabled actions
|
|
180
|
+
- Form validation examples
|
|
181
|
+
- Toast example
|
|
182
|
+
- Modal example
|
|
183
|
+
|
|
184
|
+
## Notes
|
|
185
|
+
|
|
186
|
+
Data is intentionally mock-only and deterministic.
|
|
187
|
+
|
|
188
|
+
When integrating backend services:
|
|
189
|
+
|
|
190
|
+
1. Keep API calls and data transforms in src/lib.
|
|
191
|
+
2. Preserve AbortController signal forwarding in async operations.
|
|
192
|
+
3. Keep route guards and layout boundaries explicit in src/router.tsx.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>{{appName}}</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="app"></div>
|
|
11
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{appName}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "vp dev",
|
|
7
|
+
"build": "vp build",
|
|
8
|
+
"preview": "vp preview",
|
|
9
|
+
"test": "vp test run",
|
|
10
|
+
"test:watch": "vp test --watch",
|
|
11
|
+
"typecheck": "tsc --noEmit",
|
|
12
|
+
"lint": "vp lint .",
|
|
13
|
+
"lint:fix": "npm run lint -- --fix",
|
|
14
|
+
"fmt": "vp fmt .",
|
|
15
|
+
"fmt:check": "vp fmt --check .",
|
|
16
|
+
"check": "npm run lint && npm run typecheck && npm test && npm run build"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@askrjs/askr": ">=0.0.53 <0.1.0",
|
|
20
|
+
"@askrjs/auth": ">=0.0.1 <0.1.0",
|
|
21
|
+
"@askrjs/lucide": ">=0.0.3 <0.1.0",
|
|
22
|
+
"@askrjs/themes": ">=0.0.12 <0.1.0",
|
|
23
|
+
"@askrjs/ui": ">=0.0.13 <0.1.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@askrjs/vite": ">=0.0.6 <0.1.0",
|
|
27
|
+
"@types/node": "^26.0.0",
|
|
28
|
+
"jsdom": "^29.1.1",
|
|
29
|
+
"typescript": "^6.0.3",
|
|
30
|
+
"vite-plus": "^0.2.4"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
34
|
+
}
|
|
35
|
+
}
|