@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,17 @@
|
|
|
1
|
+
import { defineConfig } from 'vite-plus';
|
|
2
|
+
import { askr } from '@askrjs/vite';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [askr()],
|
|
6
|
+
esbuild: {
|
|
7
|
+
jsx: 'automatic',
|
|
8
|
+
jsxImportSource: '@askrjs/askr',
|
|
9
|
+
},
|
|
10
|
+
test: {
|
|
11
|
+
environment: 'jsdom',
|
|
12
|
+
globals: true,
|
|
13
|
+
coverage: {
|
|
14
|
+
reporter: ['text', 'json', 'html'],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# {{appName}}
|
|
2
|
+
|
|
3
|
+
Static site built with Askr, askr-ui, askr-themes, and the Askr CLI.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run dev # Vite dev server (runs as SPA for development)
|
|
9
|
+
npm run build # Build client assets and atomically publish dist/
|
|
10
|
+
npm run generate # Run full SSG through `askr ssg`
|
|
11
|
+
npm run preview # Serve production build locally
|
|
12
|
+
npm test # Vitest (jsdom)
|
|
13
|
+
npm run typecheck # tsc --noEmit
|
|
14
|
+
npm run lint # vite-plus lint
|
|
15
|
+
npm run fmt # vite-plus format
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Architecture
|
|
19
|
+
|
|
20
|
+
- **Framework:** Askr - actor-backed, fine-grained reactive UI. No virtual DOM.
|
|
21
|
+
- **Boot flow:** `src/main.tsx` starts the browser app with the shared `pageRegistry`.
|
|
22
|
+
- **SSG flow:** `ssg.config.ts` passes that same registry to the complete executable SSG config. `askr ssg` owns full and incremental generation.
|
|
23
|
+
- **Pages:** `src/pages/home.tsx`, `src/pages/about.tsx`, `src/pages/content.tsx`, and `src/pages/example.tsx` form the sample site.
|
|
24
|
+
- **Shell:** `src/app.tsx` owns the nav and page frame.
|
|
25
|
+
- **Theme primitives:** the starter composes `Header`, `Nav`, `NavLink`, `Container`, `Section`, `Stack`, `Box`, and `Block` from `@askrjs/themes` instead of hand-rolling shell/layout wrappers.
|
|
26
|
+
- **Components:** askr-ui headless components. Props use `onPress` (not `onClick`) and `asChild` for polymorphism.
|
|
27
|
+
- **Styling:** askr-themes CSS via public classes and `data-slot` selectors. Theme import lives in `src/styles.css`.
|
|
28
|
+
- **Routing:** keep `pageRegistry` in `src/routes.tsx` as the single route source of truth for both dev and SSG.
|
|
29
|
+
- **State:** `const [value, setValue] = state(initial)` and `derive()`. Keep starter routes synchronously prerenderable; if you add async data back, provide an SSR-safe strategy before expecting SSG to render it.
|
|
30
|
+
- **Vite plugin:** `askr()` from `@askrjs/vite` handles JSX transform.
|
|
31
|
+
|
|
32
|
+
## File Structure
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
ssg.config.ts # Routes, document renderer, and static asset sources
|
|
36
|
+
src/
|
|
37
|
+
main.tsx # Client entry: registers routes and boots createSPA
|
|
38
|
+
app.tsx # Root layout with nav
|
|
39
|
+
routes.tsx # Shared route registration source of truth
|
|
40
|
+
styles.css # Theme import + layout CSS
|
|
41
|
+
components/ # Reusable components
|
|
42
|
+
pages/ # Route page components
|
|
43
|
+
tests/ # Vitest tests
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Conventions
|
|
47
|
+
|
|
48
|
+
- TypeScript strict mode, ESM-only
|
|
49
|
+
- JSX import source: `@askrjs/askr`
|
|
50
|
+
- Add new pages in `src/pages/`, then update `pageRegistry` in `src/routes.tsx`
|
|
51
|
+
- Pass the shared registry through `ssg.config.ts` instead of maintaining a second hand-written route list
|
|
52
|
+
- Keep SSG execution behind `askr ssg`; do not add a parallel project-local generator
|
|
53
|
+
- Use askr-ui components for interactive elements and askr-themes layout/shell primitives for structure
|
|
54
|
+
- Style with `--ak-*` tokens
|
|
55
|
+
- Keep SSG routes synchronous at render time unless you intentionally wire SSR data into generation
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# {{appName}}
|
|
2
|
+
|
|
3
|
+
Static site built with [Askr](https://github.com/askrjs/askr).
|
|
4
|
+
|
|
5
|
+
## Development workflow
|
|
6
|
+
|
|
7
|
+
The starter keeps the authoring loop small and explicit:
|
|
8
|
+
|
|
9
|
+
1. Run `npm run dev` for the SPA-style editing experience.
|
|
10
|
+
2. Edit the page components in `src/pages/`.
|
|
11
|
+
3. Register routes in `src/routes.tsx`.
|
|
12
|
+
4. Run `npm run build` to build client assets and atomically generate `dist/`.
|
|
13
|
+
5. Run `npm run preview` to check the production build locally.
|
|
14
|
+
|
|
15
|
+
## Sample pages
|
|
16
|
+
|
|
17
|
+
- `/` introduces the starter and the basic developer loop.
|
|
18
|
+
- `/workflow` explains the edit, generate, and preview loop.
|
|
19
|
+
- `/content` shows the small explicit route map.
|
|
20
|
+
- `/preview` keeps one interactive page so you can verify hydration.
|
|
21
|
+
|
|
22
|
+
## Commands
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm run dev # Start dev server (runs as SPA)
|
|
26
|
+
npm run build # Build assets and generate the complete static site
|
|
27
|
+
npm run generate # Regenerate static HTML with the Askr CLI
|
|
28
|
+
npm run preview # Preview production build
|
|
29
|
+
npm test # Run tests
|
|
30
|
+
npm run lint # Lint code
|
|
31
|
+
npm run fmt # Format code
|
|
32
|
+
npm run typecheck # Type check
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Static generation
|
|
36
|
+
|
|
37
|
+
Run `npm run build` to compile browser assets and pre-render every route into `dist/`. The `askr ssg` command owns both full and incremental generation, and publishes routes, metadata, the incremental manifest, and browser assets together.
|
|
38
|
+
|
|
39
|
+
`ssg.config.ts` passes the same immutable route registry used in dev mode, so the shell and leaf pages stay in sync.
|
|
@@ -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": "npm run build:client && npm run generate",
|
|
8
|
+
"build:client": "vp build --outDir .askr/client",
|
|
9
|
+
"generate": "askr ssg --config ./ssg.config.ts --output ./dist",
|
|
10
|
+
"generate:incremental": "npm run generate -- --incremental",
|
|
11
|
+
"preview": "vp preview",
|
|
12
|
+
"test": "vp test run -c ./vitest.config.ts",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"lint": "vp lint .",
|
|
15
|
+
"lint:fix": "npm run lint -- --fix",
|
|
16
|
+
"fmt": "vp fmt .",
|
|
17
|
+
"check": "npm run lint && npm run typecheck && npm test && npm run build"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@askrjs/askr": ">=0.0.53 <0.1.0",
|
|
21
|
+
"@askrjs/themes": ">=0.0.12 <0.1.0",
|
|
22
|
+
"@askrjs/ui": ">=0.0.13 <0.1.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@askrjs/cli": ">=0.0.2 <0.1.0",
|
|
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
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PageFrame, SiteHeader } from './components/site-shell';
|
|
2
|
+
|
|
3
|
+
export { navItems } from './components/site-shell';
|
|
4
|
+
|
|
5
|
+
export default function App({ children }: { children?: unknown }) {
|
|
6
|
+
return (
|
|
7
|
+
<div class="site-shell">
|
|
8
|
+
<SiteHeader />
|
|
9
|
+
<main class="site-main">
|
|
10
|
+
<PageFrame>{children}</PageFrame>
|
|
11
|
+
</main>
|
|
12
|
+
</div>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { state, derive } from '@askrjs/askr';
|
|
2
|
+
import { Button } from '@askrjs/ui';
|
|
3
|
+
import { Box, Stack } from '@askrjs/themes/components';
|
|
4
|
+
import Badge from './badge';
|
|
5
|
+
|
|
6
|
+
export default function Counter() {
|
|
7
|
+
const [count, setCount] = state(0);
|
|
8
|
+
const parity = derive(() => (count() % 2 === 0 ? 'even' : 'odd'));
|
|
9
|
+
|
|
10
|
+
return (
|
|
11
|
+
<Box class="card counter">
|
|
12
|
+
<Stack gap="3">
|
|
13
|
+
<h2>Hydration check</h2>
|
|
14
|
+
<p class="text-muted">
|
|
15
|
+
This counter should still feel live after static generation.
|
|
16
|
+
</p>
|
|
17
|
+
<div class="counter-value">{count()}</div>
|
|
18
|
+
<div>
|
|
19
|
+
<Badge>{parity()}</Badge>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="counter-controls">
|
|
22
|
+
<Button onPress={() => setCount((c) => Math.max(0, c - 1))}>
|
|
23
|
+
- Decrement
|
|
24
|
+
</Button>
|
|
25
|
+
<Button onPress={() => setCount((c) => c + 1)}>+ Increment</Button>
|
|
26
|
+
</div>
|
|
27
|
+
</Stack>
|
|
28
|
+
</Box>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Link } from '@askrjs/askr/router';
|
|
2
|
+
import { Header } from '@askrjs/themes/components';
|
|
3
|
+
import {
|
|
4
|
+
Block,
|
|
5
|
+
Box,
|
|
6
|
+
Container,
|
|
7
|
+
Section,
|
|
8
|
+
Stack,
|
|
9
|
+
} from '@askrjs/themes/components';
|
|
10
|
+
import { Nav, NavLink } from '@askrjs/themes/components';
|
|
11
|
+
import Badge from './badge';
|
|
12
|
+
|
|
13
|
+
export const navItems = [
|
|
14
|
+
{ href: '/', label: 'Home' },
|
|
15
|
+
{ href: '/workflow', label: 'Workflow' },
|
|
16
|
+
{ href: '/content', label: 'Content' },
|
|
17
|
+
{ href: '/preview', label: 'Preview' },
|
|
18
|
+
] as const;
|
|
19
|
+
|
|
20
|
+
export function SiteHeader() {
|
|
21
|
+
return (
|
|
22
|
+
<Header position="sticky">
|
|
23
|
+
<Container size="xl" paddingY="md">
|
|
24
|
+
<Box class="navbar-shell">
|
|
25
|
+
<Box class="navbar-brand">
|
|
26
|
+
<Link class="brand" href="/">
|
|
27
|
+
<strong>{'{{appName}}'}</strong>
|
|
28
|
+
<span>Static site generation sample</span>
|
|
29
|
+
</Link>
|
|
30
|
+
</Box>
|
|
31
|
+
|
|
32
|
+
<Nav
|
|
33
|
+
as="div"
|
|
34
|
+
aria-label="Primary navigation"
|
|
35
|
+
class="navbar-group"
|
|
36
|
+
data-align="end"
|
|
37
|
+
>
|
|
38
|
+
{navItems.map((item) => (
|
|
39
|
+
<NavLink href={item.href}>{item.label}</NavLink>
|
|
40
|
+
))}
|
|
41
|
+
</Nav>
|
|
42
|
+
</Box>
|
|
43
|
+
</Container>
|
|
44
|
+
</Header>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function PageFrame({ children }: { children?: unknown }) {
|
|
49
|
+
return (
|
|
50
|
+
<Container size="xl" paddingY="2xl">
|
|
51
|
+
<Stack gap="8">{children}</Stack>
|
|
52
|
+
</Container>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function SectionHeader({
|
|
57
|
+
eyebrow,
|
|
58
|
+
title,
|
|
59
|
+
description,
|
|
60
|
+
actions,
|
|
61
|
+
}: {
|
|
62
|
+
eyebrow: string;
|
|
63
|
+
title: string;
|
|
64
|
+
description: string;
|
|
65
|
+
actions?: unknown;
|
|
66
|
+
}) {
|
|
67
|
+
return (
|
|
68
|
+
<Section class="section-header" paddingY="xl">
|
|
69
|
+
<Block gap="md">
|
|
70
|
+
<Stack gap="3" class="section-header-copy">
|
|
71
|
+
<Badge>{eyebrow}</Badge>
|
|
72
|
+
<h1>{title}</h1>
|
|
73
|
+
<p class="section-header-description">{description}</p>
|
|
74
|
+
</Stack>
|
|
75
|
+
|
|
76
|
+
{actions ?? null}
|
|
77
|
+
</Block>
|
|
78
|
+
</Section>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function CardGrid({ children }: { children?: unknown }) {
|
|
83
|
+
return <Box class="card-grid">{children}</Box>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function Card({
|
|
87
|
+
eyebrow,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
children,
|
|
91
|
+
}: {
|
|
92
|
+
eyebrow?: string;
|
|
93
|
+
title: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
children?: unknown;
|
|
96
|
+
}) {
|
|
97
|
+
return (
|
|
98
|
+
<Box class="card">
|
|
99
|
+
<Stack gap="3">
|
|
100
|
+
{eyebrow ? <Badge>{eyebrow}</Badge> : null}
|
|
101
|
+
<h2>{title}</h2>
|
|
102
|
+
{description ? <p>{description}</p> : null}
|
|
103
|
+
{children}
|
|
104
|
+
</Stack>
|
|
105
|
+
</Box>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function ActionRow({ children }: { children?: unknown }) {
|
|
110
|
+
return <Box class="action-row">{children}</Box>;
|
|
111
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { JSXElement } from '@askrjs/askr/foundations';
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
namespace JSX {
|
|
5
|
+
interface Element extends JSXElement {
|
|
6
|
+
readonly __askrSsgJsxElementBrand?: never;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface IntrinsicElements {
|
|
10
|
+
[elem: string]: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface ElementAttributesProperty {
|
|
14
|
+
props: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface ElementChildrenAttribute {
|
|
18
|
+
children: unknown;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Link } from '@askrjs/askr/router';
|
|
2
|
+
import { Button } from '@askrjs/ui';
|
|
3
|
+
import {
|
|
4
|
+
ActionRow,
|
|
5
|
+
Card,
|
|
6
|
+
CardGrid,
|
|
7
|
+
SectionHeader,
|
|
8
|
+
} from '../components/site-shell';
|
|
9
|
+
|
|
10
|
+
const steps = [
|
|
11
|
+
{
|
|
12
|
+
number: '01',
|
|
13
|
+
title: 'Start the dev server',
|
|
14
|
+
command: 'npm run dev',
|
|
15
|
+
body: 'Vite runs the sample as a SPA while you edit, so page changes feel immediate.',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
number: '02',
|
|
19
|
+
title: 'Edit a page',
|
|
20
|
+
command: 'src/pages/*.tsx',
|
|
21
|
+
body: 'Each page is a plain component. Keep view code, layout, and copy close together.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
number: '03',
|
|
25
|
+
title: 'Keep the route map explicit',
|
|
26
|
+
command: 'ssg.config.ts',
|
|
27
|
+
body: 'The static route list mirrors the pages the sample site actually ships.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
number: '04',
|
|
31
|
+
title: 'Generate and preview',
|
|
32
|
+
command: 'npm run generate && npm run preview',
|
|
33
|
+
body: 'Render the site to dist/static and verify the production output before you ship it.',
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
export default function Workflow() {
|
|
38
|
+
return (
|
|
39
|
+
<>
|
|
40
|
+
<SectionHeader
|
|
41
|
+
eyebrow="Workflow"
|
|
42
|
+
title="The authoring loop stays short."
|
|
43
|
+
description="This sample keeps the daily work obvious: edit a page, update the route map, generate static HTML, and preview the result."
|
|
44
|
+
actions={
|
|
45
|
+
<ActionRow>
|
|
46
|
+
<Button asChild>
|
|
47
|
+
<Link href="/content">See the route map</Link>
|
|
48
|
+
</Button>
|
|
49
|
+
<Button asChild>
|
|
50
|
+
<Link href="/preview">Open the preview</Link>
|
|
51
|
+
</Button>
|
|
52
|
+
</ActionRow>
|
|
53
|
+
}
|
|
54
|
+
/>
|
|
55
|
+
|
|
56
|
+
<CardGrid>
|
|
57
|
+
{steps.map((step) => (
|
|
58
|
+
<Card
|
|
59
|
+
eyebrow={step.number}
|
|
60
|
+
title={step.title}
|
|
61
|
+
description={step.body}
|
|
62
|
+
>
|
|
63
|
+
<p>
|
|
64
|
+
<code>{step.command}</code>
|
|
65
|
+
</p>
|
|
66
|
+
</Card>
|
|
67
|
+
))}
|
|
68
|
+
</CardGrid>
|
|
69
|
+
|
|
70
|
+
<Card
|
|
71
|
+
title="Why this feels good"
|
|
72
|
+
description="There is no hidden router magic. The generated site and the dev server read the same route definitions, so the UI you edit is the UI you ship."
|
|
73
|
+
>
|
|
74
|
+
<p>
|
|
75
|
+
<code>npm run dev</code>, <code>npm run generate</code>, and{' '}
|
|
76
|
+
<code>npm run preview</code> are the only commands you need to
|
|
77
|
+
remember.
|
|
78
|
+
</p>
|
|
79
|
+
</Card>
|
|
80
|
+
</>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Link } from '@askrjs/askr/router';
|
|
2
|
+
import { Button } from '@askrjs/ui';
|
|
3
|
+
import {
|
|
4
|
+
ActionRow,
|
|
5
|
+
Card,
|
|
6
|
+
CardGrid,
|
|
7
|
+
SectionHeader,
|
|
8
|
+
} from '../components/site-shell';
|
|
9
|
+
|
|
10
|
+
const routeMap = [
|
|
11
|
+
{
|
|
12
|
+
path: '/',
|
|
13
|
+
title: 'Home',
|
|
14
|
+
note: 'Start here and link out to the rest of the sample.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
path: '/workflow',
|
|
18
|
+
title: 'Workflow',
|
|
19
|
+
note: 'Show the edit, generate, and preview loop.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
path: '/content',
|
|
23
|
+
title: 'Content',
|
|
24
|
+
note: 'Keep the route list visible and easy to extend.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
path: '/preview',
|
|
28
|
+
title: 'Preview',
|
|
29
|
+
note: 'Keep one interactive page to confirm hydration.',
|
|
30
|
+
},
|
|
31
|
+
] as const;
|
|
32
|
+
|
|
33
|
+
export default function Content() {
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
<SectionHeader
|
|
37
|
+
eyebrow="Content"
|
|
38
|
+
title="Four routes, one clear source of truth."
|
|
39
|
+
description="Keep the starter small and predictable. Add more routes when the app actually needs them."
|
|
40
|
+
actions={
|
|
41
|
+
<ActionRow>
|
|
42
|
+
<Button asChild>
|
|
43
|
+
<Link href="/workflow">Read the workflow</Link>
|
|
44
|
+
</Button>
|
|
45
|
+
<Button asChild>
|
|
46
|
+
<Link href="/preview">Open the preview</Link>
|
|
47
|
+
</Button>
|
|
48
|
+
</ActionRow>
|
|
49
|
+
}
|
|
50
|
+
/>
|
|
51
|
+
|
|
52
|
+
<CardGrid>
|
|
53
|
+
{routeMap.map((route) => (
|
|
54
|
+
<Card
|
|
55
|
+
eyebrow={route.path}
|
|
56
|
+
title={route.title}
|
|
57
|
+
description={route.note}
|
|
58
|
+
/>
|
|
59
|
+
))}
|
|
60
|
+
</CardGrid>
|
|
61
|
+
</>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { state } from '@askrjs/askr';
|
|
2
|
+
import { Link } from '@askrjs/askr/router';
|
|
3
|
+
import { Button, Input } from '@askrjs/ui';
|
|
4
|
+
import Counter from '../components/counter';
|
|
5
|
+
import {
|
|
6
|
+
ActionRow,
|
|
7
|
+
Card,
|
|
8
|
+
CardGrid,
|
|
9
|
+
SectionHeader,
|
|
10
|
+
} from '../components/site-shell';
|
|
11
|
+
|
|
12
|
+
const sampleUsers: Record<
|
|
13
|
+
number,
|
|
14
|
+
{ name: string; email: string; note: string }
|
|
15
|
+
> = {
|
|
16
|
+
1: {
|
|
17
|
+
name: 'User 1',
|
|
18
|
+
email: 'user1@example.com',
|
|
19
|
+
note: 'Replace this with your own content or connect it to real data later.',
|
|
20
|
+
},
|
|
21
|
+
2: {
|
|
22
|
+
name: 'User 2',
|
|
23
|
+
email: 'user2@example.com',
|
|
24
|
+
note: 'This stays simple on purpose so the starter remains easy to delete or extend.',
|
|
25
|
+
},
|
|
26
|
+
3: {
|
|
27
|
+
name: 'User 3',
|
|
28
|
+
email: 'user3@example.com',
|
|
29
|
+
note: 'Interactive state still hydrates after static generation without adding async complexity.',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default function Preview() {
|
|
34
|
+
const [userId, setUserId] = state(1);
|
|
35
|
+
const user = sampleUsers[userId()] ?? {
|
|
36
|
+
name: `User ${userId()}`,
|
|
37
|
+
email: `user${userId()}@example.com`,
|
|
38
|
+
note: 'Use this route as a safe place to try small interactive changes.',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<>
|
|
43
|
+
<SectionHeader
|
|
44
|
+
eyebrow="Preview"
|
|
45
|
+
title="Interactive parts still work after static generation."
|
|
46
|
+
description="Keep one page interactive so you can verify hydration, state, and resource loading without turning the template into an app."
|
|
47
|
+
actions={
|
|
48
|
+
<ActionRow>
|
|
49
|
+
<Button asChild>
|
|
50
|
+
<Link href="/workflow">Read the workflow</Link>
|
|
51
|
+
</Button>
|
|
52
|
+
<Button asChild>
|
|
53
|
+
<Link href="/content">Review the routes</Link>
|
|
54
|
+
</Button>
|
|
55
|
+
</ActionRow>
|
|
56
|
+
}
|
|
57
|
+
/>
|
|
58
|
+
|
|
59
|
+
<CardGrid>
|
|
60
|
+
<Counter />
|
|
61
|
+
|
|
62
|
+
<Card
|
|
63
|
+
eyebrow="Interactive state"
|
|
64
|
+
title="State still hydrates after generation"
|
|
65
|
+
description="Change the user id to prove the generated page still responds in the browser."
|
|
66
|
+
>
|
|
67
|
+
<div class="preview-controls">
|
|
68
|
+
<Input
|
|
69
|
+
type="number"
|
|
70
|
+
min="1"
|
|
71
|
+
step="1"
|
|
72
|
+
value={String(userId())}
|
|
73
|
+
onInput={(event: Event) => {
|
|
74
|
+
const nextValue = Number.parseInt(
|
|
75
|
+
(event.target as HTMLInputElement).value,
|
|
76
|
+
10
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
setUserId(Number.isNaN(nextValue) ? 1 : Math.max(1, nextValue));
|
|
80
|
+
}}
|
|
81
|
+
/>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div class="resource-panel">
|
|
85
|
+
<div class="resource-status">
|
|
86
|
+
<span class="badge">Ready</span>
|
|
87
|
+
<span>Hydrated preview</span>
|
|
88
|
+
</div>
|
|
89
|
+
<h3>{user.name}</h3>
|
|
90
|
+
<p>{user.email}</p>
|
|
91
|
+
<p class="text-muted">{user.note}</p>
|
|
92
|
+
</div>
|
|
93
|
+
</Card>
|
|
94
|
+
</CardGrid>
|
|
95
|
+
</>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Link } from '@askrjs/askr/router';
|
|
2
|
+
import { Button } from '@askrjs/ui';
|
|
3
|
+
import {
|
|
4
|
+
ActionRow,
|
|
5
|
+
Card,
|
|
6
|
+
CardGrid,
|
|
7
|
+
SectionHeader,
|
|
8
|
+
} from '../components/site-shell';
|
|
9
|
+
|
|
10
|
+
const highlights = [
|
|
11
|
+
{
|
|
12
|
+
title: 'Fast feedback',
|
|
13
|
+
body: 'Run npm run dev and edit a page to stay in a SPA-style authoring loop.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
title: 'Deterministic output',
|
|
17
|
+
body: 'Keep one explicit route registry in src/routes.tsx so dev and generated output cannot drift.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
title: 'Hydrated preview',
|
|
21
|
+
body: 'Keep one interactive route so you can verify static output and browser behavior together.',
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export default function Home() {
|
|
26
|
+
return (
|
|
27
|
+
<>
|
|
28
|
+
<SectionHeader
|
|
29
|
+
eyebrow="Static site generation"
|
|
30
|
+
title="Build a multi-page site, then ship it as plain HTML."
|
|
31
|
+
description="This sample keeps the loop small: author routes, preview in the SPA dev server, generate static files, and inspect the output."
|
|
32
|
+
actions={
|
|
33
|
+
<ActionRow>
|
|
34
|
+
<Button asChild>
|
|
35
|
+
<Link href="/workflow">See the workflow</Link>
|
|
36
|
+
</Button>
|
|
37
|
+
<Button asChild>
|
|
38
|
+
<Link href="/preview">Open the preview</Link>
|
|
39
|
+
</Button>
|
|
40
|
+
</ActionRow>
|
|
41
|
+
}
|
|
42
|
+
/>
|
|
43
|
+
|
|
44
|
+
<CardGrid>
|
|
45
|
+
{highlights.map((highlight) => (
|
|
46
|
+
<Card title={highlight.title} description={highlight.body} />
|
|
47
|
+
))}
|
|
48
|
+
</CardGrid>
|
|
49
|
+
</>
|
|
50
|
+
);
|
|
51
|
+
}
|