create-koppajs 1.2.2 → 1.2.3
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/CHANGELOG.md +37 -0
- package/README.md +12 -10
- package/bin/create-koppajs.js +0 -14
- package/package.json +4 -4
- package/template/README.md +19 -206
- package/template/_gitignore +0 -3
- package/template/index.html +1 -1
- package/template/package.json +9 -46
- package/template/public/favicon.png +0 -0
- package/template/public/koppajs-logo.png +0 -0
- package/template/src/app-view.kpa +1 -3
- package/template/tsconfig.json +2 -9
- package/template-overlays/router/README.md +25 -200
- package/template-overlays/router/index.html +1 -1
- package/template-overlays/router/package.json +10 -47
- package/template-overlays/router/src/app-view.kpa +21 -78
- package/template-overlays/router/src/home-page.kpa +23 -60
- package/template-overlays/router/src/main.ts +0 -9
- package/template-overlays/router/src/not-found-page.kpa +16 -48
- package/template-overlays/router/src/router-page.kpa +34 -69
- package/template-overlays/router/src/style.css +5 -29
- package/template/AI_CONSTITUTION.md +0 -50
- package/template/ARCHITECTURE.md +0 -84
- package/template/CHANGELOG.md +0 -35
- package/template/CONTRIBUTING.md +0 -89
- package/template/DECISION_HIERARCHY.md +0 -32
- package/template/DEVELOPMENT_RULES.md +0 -57
- package/template/LICENSE +0 -201
- package/template/RELEASE.md +0 -227
- package/template/ROADMAP.md +0 -34
- package/template/TESTING_STRATEGY.md +0 -96
- package/template/_editorconfig +0 -12
- package/template/_github/instructions/ai-workflow.md +0 -33
- package/template/_github/workflows/ci.yml +0 -41
- package/template/_github/workflows/release.yml +0 -58
- package/template/_husky/commit-msg +0 -8
- package/template/_husky/pre-commit +0 -1
- package/template/_prettierignore +0 -7
- package/template/commitlint.config.mjs +0 -6
- package/template/docs/adr/0001-keep-the-starter-minimal.md +0 -32
- package/template/docs/adr/0002-adopt-a-living-meta-layer.md +0 -30
- package/template/docs/adr/0003-rely-on-upstream-kpa-es-module-output.md +0 -32
- package/template/docs/adr/0004-adopt-an-automated-quality-baseline.md +0 -31
- package/template/docs/adr/0005-adopt-a-tag-driven-release-baseline.md +0 -45
- package/template/docs/adr/0006-adopt-commit-message-conventions.md +0 -39
- package/template/docs/adr/README.md +0 -37
- package/template/docs/adr/TEMPLATE.md +0 -18
- package/template/docs/architecture/module-boundaries.md +0 -47
- package/template/docs/meta/maintenance.md +0 -40
- package/template/docs/quality/quality-gates.md +0 -39
- package/template/docs/specs/README.md +0 -36
- package/template/docs/specs/TEMPLATE.md +0 -34
- package/template/docs/specs/app-bootstrap.md +0 -46
- package/template/docs/specs/counter-component.md +0 -48
- package/template/docs/specs/quality-workflow.md +0 -62
- package/template/eslint.config.mjs +0 -54
- package/template/playwright.config.ts +0 -31
- package/template/pnpm-lock.yaml +0 -3777
- package/template/prettier.config.mjs +0 -6
- package/template/public/favicon.svg +0 -15
- package/template/tests/e2e/app.spec.ts +0 -18
- package/template/tests/integration/main-bootstrap.test.ts +0 -33
- package/template/vite.config.d.mts +0 -5
- package/template/vitest.config.mjs +0 -19
- package/template-overlays/router/ARCHITECTURE.md +0 -86
- package/template-overlays/router/CHANGELOG.md +0 -50
- package/template-overlays/router/DEVELOPMENT_RULES.md +0 -57
- package/template-overlays/router/ROADMAP.md +0 -34
- package/template-overlays/router/TESTING_STRATEGY.md +0 -67
- package/template-overlays/router/docs/adr/0001-keep-the-starter-minimal.md +0 -32
- package/template-overlays/router/docs/architecture/module-boundaries.md +0 -39
- package/template-overlays/router/docs/meta/maintenance.md +0 -38
- package/template-overlays/router/docs/specs/README.md +0 -19
- package/template-overlays/router/docs/specs/app-bootstrap.md +0 -42
- package/template-overlays/router/docs/specs/router-navigation.md +0 -41
- package/template-overlays/router/pnpm-lock.yaml +0 -3786
- package/template-overlays/router/tests/e2e/app.spec.ts +0 -38
- package/template-overlays/router/tests/integration/main-bootstrap.test.ts +0 -150
|
@@ -1,94 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
# __PROJECT_NAME__
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
<img src="https://public-assets-1b57ca06-687a-4142-a525-0635f7649a5c.s3.eu-central-1.amazonaws.com/koppajs/koppajs-logo-text-900x226.png" width="500" alt="KoppaJS Logo">
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
<br>
|
|
8
|
-
|
|
9
|
-
<div align="center">
|
|
10
|
-
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square" alt="License"></a>
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
<br>
|
|
14
|
-
|
|
15
|
-
<div align="center">
|
|
16
|
-
<h1 align="center">__PROJECT_NAME__</h1>
|
|
17
|
-
<h3 align="center">KoppaJS router starter project</h3>
|
|
18
|
-
<p align="center">
|
|
19
|
-
<i>Scaffolded from the official KoppaJS router starter baseline.</i>
|
|
20
|
-
</p>
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
<br>
|
|
24
|
-
|
|
25
|
-
<div align="center">
|
|
26
|
-
<p align="center">
|
|
27
|
-
<a href="https://github.com/koppajs/koppajs-documentation">Documentation</a>
|
|
28
|
-
·
|
|
29
|
-
<a href="https://github.com/koppajs/koppajs-core">KoppaJS Core</a>
|
|
30
|
-
·
|
|
31
|
-
<a href="https://github.com/koppajs/koppajs-router">KoppaJS Router</a>
|
|
32
|
-
·
|
|
33
|
-
<a href="https://github.com/koppajs/koppajs-vite-plugin">Vite Plugin</a>
|
|
34
|
-
</p>
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
<br>
|
|
38
|
-
|
|
39
|
-
<details>
|
|
40
|
-
<summary>Table of Contents</summary>
|
|
41
|
-
<ol>
|
|
42
|
-
<li><a href="#what-is-this">What is this?</a></li>
|
|
43
|
-
<li><a href="#requirements">Requirements</a></li>
|
|
44
|
-
<li><a href="#getting-started">Getting Started</a></li>
|
|
45
|
-
<li><a href="#quality-workflow">Quality Workflow</a></li>
|
|
46
|
-
<li><a href="#routing-overview">Routing Overview</a></li>
|
|
47
|
-
<li><a href="#project-structure">Project Structure</a></li>
|
|
48
|
-
<li><a href="#meta-layer">Meta Layer</a></li>
|
|
49
|
-
<li><a href="#community--contribution">Community & Contribution</a></li>
|
|
50
|
-
<li><a href="#license">License</a></li>
|
|
51
|
-
</ol>
|
|
52
|
-
</details>
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## What is this?
|
|
57
|
-
|
|
58
|
-
This project was scaffolded from the official KoppaJS router starter baseline.
|
|
59
|
-
|
|
60
|
-
It keeps the application intentionally small while demonstrating one extra
|
|
61
|
-
subsystem beyond the minimal starter:
|
|
62
|
-
|
|
63
|
-
- one HTML shell
|
|
64
|
-
- one TypeScript bootstrap file
|
|
65
|
-
- one root app shell component
|
|
66
|
-
- one router instance with a visible two-page flow
|
|
67
|
-
- one counter component on the home route
|
|
68
|
-
- one explicit catch-all route for unmatched paths
|
|
69
|
-
|
|
70
|
-
It also carries the same quality and governance baseline as the minimal starter:
|
|
71
|
-
|
|
72
|
-
- ESLint for source and tooling files
|
|
73
|
-
- Prettier plus `.editorconfig` for supported text formats
|
|
74
|
-
- Vitest for local unit and integration coverage
|
|
75
|
-
- Playwright for a real-browser smoke test
|
|
76
|
-
- Husky plus lint-staged for fast staged-file checks
|
|
77
|
-
- Conventional Commits enforcement via `commitlint`
|
|
78
|
-
- a tag-driven GitHub release baseline with `CHANGELOG.md` and `RELEASE.md`
|
|
79
|
-
|
|
80
|
-
Use it when you want to start from a small KoppaJS app that already shows how
|
|
81
|
-
route definitions, `data-route` links, and route-based outlet rendering fit
|
|
82
|
-
together.
|
|
83
|
-
|
|
84
|
-
---
|
|
3
|
+
KoppaJS router starter project scaffolded with `create-koppajs`.
|
|
85
4
|
|
|
86
5
|
## Requirements
|
|
87
6
|
|
|
88
|
-
- Node.js >= 22
|
|
89
|
-
- pnpm >= 10
|
|
90
|
-
|
|
91
|
-
---
|
|
7
|
+
- Node.js >= 22.12.0
|
|
8
|
+
- pnpm >= 10.24.0
|
|
92
9
|
|
|
93
10
|
## Getting Started
|
|
94
11
|
|
|
@@ -97,144 +14,52 @@ pnpm install
|
|
|
97
14
|
pnpm dev
|
|
98
15
|
```
|
|
99
16
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
pnpm exec playwright install chromium
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Useful commands:
|
|
17
|
+
## Scripts
|
|
107
18
|
|
|
108
19
|
```bash
|
|
109
|
-
pnpm lint
|
|
110
|
-
pnpm format:check
|
|
111
|
-
pnpm typecheck
|
|
112
|
-
pnpm test:run
|
|
113
|
-
pnpm test:coverage
|
|
114
20
|
pnpm build
|
|
21
|
+
pnpm typecheck
|
|
115
22
|
pnpm serve
|
|
116
|
-
pnpm release:check
|
|
117
23
|
```
|
|
118
24
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
## Quality Workflow
|
|
122
|
-
|
|
123
|
-
Fast local baseline:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
pnpm check
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Full validation, including Playwright:
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
pnpm validate
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Standalone browser smoke test:
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
pnpm test:e2e
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## Routing Overview
|
|
25
|
+
## Routing
|
|
144
26
|
|
|
145
27
|
The starter wires `@koppajs/koppajs-router` in `src/main.ts`.
|
|
146
28
|
|
|
147
|
-
The route table
|
|
29
|
+
The route table contains:
|
|
148
30
|
|
|
149
31
|
- `/` -> `home-page`
|
|
150
32
|
- `/router` -> `router-page`
|
|
151
33
|
- `*` -> `not-found-page`
|
|
152
34
|
|
|
153
|
-
The router renders into `#app-outlet`, updates active navigation state for
|
|
154
|
-
links that use `data-route`, and keeps the browser URL aligned with the current
|
|
155
|
-
page.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
35
|
## Project Structure
|
|
160
36
|
|
|
161
37
|
```text
|
|
162
38
|
__PROJECT_NAME__/
|
|
163
|
-
├── .
|
|
164
|
-
├── .github/
|
|
39
|
+
├── .gitattributes
|
|
165
40
|
├── .gitignore
|
|
166
|
-
├── .husky/
|
|
167
41
|
├── .npmrc
|
|
168
|
-
├── .
|
|
169
|
-
├── CHANGELOG.md
|
|
170
|
-
├── commitlint.config.mjs
|
|
171
|
-
├── AI_CONSTITUTION.md
|
|
172
|
-
├── ARCHITECTURE.md
|
|
173
|
-
├── CONTRIBUTING.md
|
|
174
|
-
├── DECISION_HIERARCHY.md
|
|
175
|
-
├── DEVELOPMENT_RULES.md
|
|
176
|
-
├── RELEASE.md
|
|
177
|
-
├── ROADMAP.md
|
|
178
|
-
├── TESTING_STRATEGY.md
|
|
179
|
-
├── eslint.config.mjs
|
|
42
|
+
├── README.md
|
|
180
43
|
├── index.html
|
|
181
44
|
├── package.json
|
|
182
|
-
├── playwright.config.ts
|
|
183
|
-
├── pnpm-lock.yaml
|
|
184
|
-
├── prettier.config.mjs
|
|
185
45
|
├── tsconfig.json
|
|
186
46
|
├── vite.config.mjs
|
|
187
|
-
├── vitest.config.mjs
|
|
188
|
-
├── docs/
|
|
189
|
-
│ ├── adr/
|
|
190
|
-
│ ├── architecture/
|
|
191
|
-
│ ├── meta/
|
|
192
|
-
│ ├── quality/
|
|
193
|
-
│ └── specs/
|
|
194
47
|
├── public/
|
|
195
|
-
│
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
└──
|
|
205
|
-
├── e2e/
|
|
206
|
-
├── integration/
|
|
207
|
-
└── unit/
|
|
48
|
+
│ ├── favicon.png
|
|
49
|
+
│ └── koppajs-logo.png
|
|
50
|
+
└── src/
|
|
51
|
+
├── app-view.kpa
|
|
52
|
+
├── counter-component.kpa
|
|
53
|
+
├── home-page.kpa
|
|
54
|
+
├── main.ts
|
|
55
|
+
├── not-found-page.kpa
|
|
56
|
+
├── router-page.kpa
|
|
57
|
+
└── style.css
|
|
208
58
|
```
|
|
209
59
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
## Meta Layer
|
|
213
|
-
|
|
214
|
-
The repository includes an explicit meta layer so architecture, testing, and
|
|
215
|
-
contributor rules evolve together with the codebase.
|
|
216
|
-
|
|
217
|
-
Start here:
|
|
218
|
-
|
|
219
|
-
- `DECISION_HIERARCHY.md`
|
|
220
|
-
- `AI_CONSTITUTION.md`
|
|
221
|
-
- `ARCHITECTURE.md`
|
|
222
|
-
- `DEVELOPMENT_RULES.md`
|
|
223
|
-
- `TESTING_STRATEGY.md`
|
|
224
|
-
- `CHANGELOG.md`
|
|
225
|
-
- `RELEASE.md`
|
|
226
|
-
- `docs/quality/quality-gates.md`
|
|
227
|
-
- `docs/adr/`
|
|
228
|
-
- `docs/specs/`
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
## Community & Contribution
|
|
233
|
-
|
|
234
|
-
Contribution workflow details live in `CONTRIBUTING.md`.
|
|
235
|
-
Update this section with your own repository links once the project has a
|
|
236
|
-
canonical home.
|
|
237
|
-
|
|
238
|
-
---
|
|
60
|
+
## Useful Links
|
|
239
61
|
|
|
240
|
-
|
|
62
|
+
- [KoppaJS documentation](https://github.com/koppajs/koppajs-documentation)
|
|
63
|
+
- [KoppaJS core](https://github.com/koppajs/koppajs-core)
|
|
64
|
+
- [KoppaJS router](https://github.com/koppajs/koppajs-router)
|
|
65
|
+
- [KoppaJS Vite plugin](https://github.com/koppajs/koppajs-vite-plugin)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>KoppaJS Router Starter</title>
|
|
7
|
-
<link rel="icon" type="image/
|
|
7
|
+
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
8
8
|
<link rel="stylesheet" href="/src/style.css" />
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
"version": "1.0.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "KoppaJS router application scaffolded with create-koppajs.",
|
|
6
|
-
"author": "Bastian Bensch",
|
|
7
|
-
"license": "Apache-2.0",
|
|
8
6
|
"keywords": [
|
|
9
7
|
"koppajs",
|
|
10
8
|
"koppa",
|
|
@@ -15,60 +13,25 @@
|
|
|
15
13
|
"web-components",
|
|
16
14
|
"router"
|
|
17
15
|
],
|
|
18
|
-
"packageManager": "pnpm@10.
|
|
16
|
+
"packageManager": "pnpm@10.33.2",
|
|
19
17
|
"engines": {
|
|
20
|
-
"node": ">=22",
|
|
21
|
-
"pnpm": ">=10"
|
|
18
|
+
"node": ">=22.12.0",
|
|
19
|
+
"pnpm": ">=10.24.0"
|
|
22
20
|
},
|
|
23
21
|
"scripts": {
|
|
24
22
|
"dev": "vite --host",
|
|
25
23
|
"build": "tsc --noEmit && vite build",
|
|
26
|
-
"lint": "eslint .",
|
|
27
|
-
"lint:fix": "eslint . --fix",
|
|
28
|
-
"format": "prettier . --write --ignore-unknown",
|
|
29
|
-
"format:check": "prettier . --check --ignore-unknown",
|
|
30
|
-
"test": "vitest run",
|
|
31
|
-
"test:watch": "vitest",
|
|
32
|
-
"test:run": "vitest run",
|
|
33
|
-
"test:coverage": "vitest run --coverage",
|
|
34
|
-
"test:e2e": "pnpm build && playwright test",
|
|
35
|
-
"test:e2e:headed": "pnpm build && playwright test --headed",
|
|
36
|
-
"test:e2e:ui": "pnpm build && playwright test --ui",
|
|
37
|
-
"check": "pnpm lint && pnpm format:check && pnpm typecheck && pnpm test:run && pnpm build",
|
|
38
|
-
"validate": "pnpm check && playwright test",
|
|
39
|
-
"release:check": "pnpm validate",
|
|
40
24
|
"typecheck": "tsc --noEmit",
|
|
41
|
-
"serve": "vite preview"
|
|
42
|
-
"serve:e2e": "vite preview --host 127.0.0.1 --strictPort --port 4173",
|
|
43
|
-
"prepare": "husky"
|
|
25
|
+
"serve": "vite preview"
|
|
44
26
|
},
|
|
45
27
|
"dependencies": {
|
|
46
|
-
"@koppajs/koppajs-core": "
|
|
47
|
-
"@koppajs/koppajs-router": "
|
|
28
|
+
"@koppajs/koppajs-core": "3.0.7",
|
|
29
|
+
"@koppajs/koppajs-router": "0.1.2"
|
|
48
30
|
},
|
|
49
31
|
"devDependencies": {
|
|
50
|
-
"@
|
|
51
|
-
"@
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"@playwright/test": "^1.58.2",
|
|
55
|
-
"@types/node": "^25.4.0",
|
|
56
|
-
"@vitest/coverage-v8": "^4.0.18",
|
|
57
|
-
"eslint": "^10.0.3",
|
|
58
|
-
"globals": "^17.4.0",
|
|
59
|
-
"husky": "^9.1.7",
|
|
60
|
-
"lint-staged": "^16.3.3",
|
|
61
|
-
"prettier": "^3.8.1",
|
|
62
|
-
"typescript": "^5.9.3",
|
|
63
|
-
"typescript-eslint": "^8.57.0",
|
|
64
|
-
"vite": "7.2.6",
|
|
65
|
-
"vitest": "^4.0.18"
|
|
66
|
-
},
|
|
67
|
-
"lint-staged": {
|
|
68
|
-
"*.{js,mjs,cjs,ts,mts,cts}": [
|
|
69
|
-
"eslint --fix",
|
|
70
|
-
"prettier --write"
|
|
71
|
-
],
|
|
72
|
-
"*.{css,html,json,md,yml,yaml}": "prettier --write"
|
|
32
|
+
"@koppajs/koppajs-vite-plugin": "1.0.4",
|
|
33
|
+
"@types/node": "25.6.0",
|
|
34
|
+
"typescript": "5.9.3",
|
|
35
|
+
"vite": "7.3.2"
|
|
73
36
|
}
|
|
74
37
|
}
|
|
@@ -1,20 +1,11 @@
|
|
|
1
1
|
[template]
|
|
2
2
|
<div class="app-shell">
|
|
3
|
-
<header class="
|
|
4
|
-
<
|
|
5
|
-
<img src="https://public-assets-1b57ca06-687a-4142-a525-0635f7649a5c.s3.eu-central-1.amazonaws.com/koppajs/koppajs-logo-text-900x226.png" width="320" alt="KoppaJS Logo" class="logo">
|
|
6
|
-
<p class="eyebrow">Router Starter</p>
|
|
7
|
-
<h1 class="title">Optional routing for new KoppaJS projects</h1>
|
|
8
|
-
<p class="lead">
|
|
9
|
-
This starter keeps the original lightweight baseline, adds
|
|
10
|
-
<code>@koppajs/koppajs-router</code>, and shows how route-based rendering
|
|
11
|
-
fits into a small app shell.
|
|
12
|
-
</p>
|
|
13
|
-
</div>
|
|
3
|
+
<header class="app-header">
|
|
4
|
+
<img src="/koppajs-logo.png" width="280" alt="KoppaJS Logo" class="logo">
|
|
14
5
|
|
|
15
6
|
<nav class="main-nav" aria-label="Primary">
|
|
16
7
|
<a data-route="/" href="/" class="nav-link">Home</a>
|
|
17
|
-
<a data-route="/router" href="/router" class="nav-link">Router
|
|
8
|
+
<a data-route="/router" href="/router" class="nav-link">Router</a>
|
|
18
9
|
</nav>
|
|
19
10
|
</header>
|
|
20
11
|
|
|
@@ -24,105 +15,57 @@
|
|
|
24
15
|
|
|
25
16
|
[css]
|
|
26
17
|
.app-shell {
|
|
27
|
-
width: min(
|
|
18
|
+
width: min(920px, calc(100vw - 2rem));
|
|
28
19
|
margin: 0 auto;
|
|
29
20
|
padding: 2rem 0 3rem;
|
|
30
21
|
}
|
|
31
22
|
|
|
32
|
-
.
|
|
33
|
-
display: grid;
|
|
34
|
-
gap: 1.5rem;
|
|
35
|
-
padding: 1.5rem;
|
|
36
|
-
border: 1px solid var(--border);
|
|
37
|
-
border-radius: 1.75rem;
|
|
38
|
-
background: linear-gradient(180deg, rgba(8, 17, 31, 0.88), rgba(8, 17, 31, 0.72));
|
|
39
|
-
box-shadow: var(--shadow);
|
|
40
|
-
backdrop-filter: blur(18px);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.hero-copy {
|
|
23
|
+
.app-header {
|
|
44
24
|
display: flex;
|
|
45
|
-
|
|
46
|
-
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: space-between;
|
|
27
|
+
gap: 1rem;
|
|
28
|
+
padding: 1rem 0 1.5rem;
|
|
29
|
+
border-bottom: 1px solid var(--border);
|
|
47
30
|
}
|
|
48
31
|
|
|
49
32
|
.logo {
|
|
50
|
-
width: min(
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.eyebrow {
|
|
54
|
-
font-size: 0.82rem;
|
|
55
|
-
letter-spacing: 0.3em;
|
|
56
|
-
text-transform: uppercase;
|
|
57
|
-
color: var(--accent);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.title {
|
|
61
|
-
font-size: clamp(2.1rem, 5vw, 3.6rem);
|
|
62
|
-
line-height: 1.05;
|
|
63
|
-
max-width: 14ch;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.lead {
|
|
67
|
-
max-width: 58ch;
|
|
68
|
-
color: var(--muted);
|
|
69
|
-
line-height: 1.65;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.lead code {
|
|
73
|
-
color: var(--accent-strong);
|
|
33
|
+
width: min(280px, 56vw);
|
|
74
34
|
}
|
|
75
35
|
|
|
76
36
|
.main-nav {
|
|
77
37
|
display: flex;
|
|
78
38
|
flex-wrap: wrap;
|
|
79
|
-
gap: 0.
|
|
39
|
+
gap: 0.6rem;
|
|
80
40
|
}
|
|
81
41
|
|
|
82
42
|
.nav-link {
|
|
83
43
|
display: inline-flex;
|
|
84
44
|
align-items: center;
|
|
85
45
|
justify-content: center;
|
|
86
|
-
min-height: 2.
|
|
87
|
-
padding: 0
|
|
46
|
+
min-height: 2.5rem;
|
|
47
|
+
padding: 0 1rem;
|
|
48
|
+
border: 1px solid var(--border);
|
|
88
49
|
border-radius: 999px;
|
|
89
|
-
border: 1px solid rgba(100, 220, 232, 0.24);
|
|
90
|
-
background: rgba(100, 220, 232, 0.06);
|
|
91
50
|
color: var(--text);
|
|
92
51
|
text-decoration: none;
|
|
93
|
-
transition: background 0.25s ease, border-color 0.25s ease, transform 0.15s ease;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
.nav-link:hover {
|
|
97
|
-
background: rgba(100, 220, 232, 0.12);
|
|
98
|
-
border-color: rgba(100, 220, 232, 0.4);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
.nav-link:active {
|
|
102
|
-
transform: translateY(1px);
|
|
103
52
|
}
|
|
104
53
|
|
|
54
|
+
.nav-link:hover,
|
|
105
55
|
.nav-link.is-active,
|
|
106
56
|
.nav-link[aria-current="page"] {
|
|
107
|
-
background: var(--accent);
|
|
108
57
|
border-color: var(--accent);
|
|
109
|
-
color:
|
|
110
|
-
font-weight: 700;
|
|
58
|
+
color: var(--accent);
|
|
111
59
|
}
|
|
112
60
|
|
|
113
61
|
.app-outlet {
|
|
114
|
-
padding-top:
|
|
62
|
+
padding-top: 2rem;
|
|
115
63
|
}
|
|
116
64
|
|
|
117
65
|
@media (max-width: 640px) {
|
|
118
|
-
.app-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.hero-panel {
|
|
124
|
-
padding: 1.15rem;
|
|
125
|
-
border-radius: 1.25rem;
|
|
66
|
+
.app-header {
|
|
67
|
+
align-items: flex-start;
|
|
68
|
+
flex-direction: column;
|
|
126
69
|
}
|
|
127
70
|
}
|
|
128
71
|
[/css]
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
[template]
|
|
2
|
-
<section class="page
|
|
2
|
+
<section class="page">
|
|
3
3
|
<div class="page-copy">
|
|
4
|
-
<p class="
|
|
5
|
-
<
|
|
6
|
-
<p
|
|
7
|
-
|
|
8
|
-
shows
|
|
9
|
-
the published KoppaJS router.
|
|
4
|
+
<p class="eyebrow">Home route</p>
|
|
5
|
+
<h1>KoppaJS router starter</h1>
|
|
6
|
+
<p>
|
|
7
|
+
This page is rendered for <code>/</code>. The counter stays here so the
|
|
8
|
+
starter shows component state and route rendering in the same small app.
|
|
10
9
|
</p>
|
|
11
10
|
|
|
12
|
-
<
|
|
13
|
-
<a data-route="/router" href="/router" class="page-link">Open the second page</a>
|
|
14
|
-
</div>
|
|
11
|
+
<a data-route="/router" href="/router" class="page-link">Open router page</a>
|
|
15
12
|
</div>
|
|
16
13
|
|
|
17
14
|
<counter-component></counter-component>
|
|
@@ -19,82 +16,48 @@
|
|
|
19
16
|
[/template]
|
|
20
17
|
|
|
21
18
|
[css]
|
|
22
|
-
.page
|
|
19
|
+
.page {
|
|
23
20
|
display: grid;
|
|
24
|
-
grid-template-columns: minmax(0,
|
|
25
|
-
gap:
|
|
21
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
22
|
+
gap: 2rem;
|
|
26
23
|
align-items: start;
|
|
27
|
-
padding: 1.5rem;
|
|
28
|
-
border: 1px solid var(--border);
|
|
29
|
-
border-radius: 1.75rem;
|
|
30
|
-
background: var(--surface);
|
|
31
|
-
box-shadow: var(--shadow);
|
|
32
|
-
backdrop-filter: blur(18px);
|
|
33
24
|
}
|
|
34
25
|
|
|
35
26
|
.page-copy {
|
|
36
|
-
display:
|
|
37
|
-
flex-direction: column;
|
|
27
|
+
display: grid;
|
|
38
28
|
gap: 1rem;
|
|
39
29
|
}
|
|
40
30
|
|
|
41
|
-
.
|
|
31
|
+
.eyebrow {
|
|
42
32
|
color: var(--accent);
|
|
43
33
|
font-size: 0.8rem;
|
|
44
|
-
letter-spacing: 0.
|
|
34
|
+
letter-spacing: 0.2em;
|
|
45
35
|
text-transform: uppercase;
|
|
46
36
|
}
|
|
47
37
|
|
|
48
|
-
|
|
49
|
-
font-size: clamp(
|
|
38
|
+
h1 {
|
|
39
|
+
font-size: clamp(2rem, 4vw, 3rem);
|
|
50
40
|
line-height: 1.1;
|
|
51
41
|
}
|
|
52
42
|
|
|
53
|
-
|
|
43
|
+
p {
|
|
44
|
+
max-width: 58ch;
|
|
54
45
|
color: var(--muted);
|
|
55
46
|
line-height: 1.7;
|
|
56
|
-
max-width: 54ch;
|
|
57
47
|
}
|
|
58
48
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
flex-wrap: wrap;
|
|
62
|
-
gap: 0.8rem;
|
|
49
|
+
code {
|
|
50
|
+
color: var(--accent);
|
|
63
51
|
}
|
|
64
52
|
|
|
65
53
|
.page-link {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
justify-content: center;
|
|
69
|
-
min-height: 2.8rem;
|
|
70
|
-
padding: 0 1.25rem;
|
|
71
|
-
border-radius: 999px;
|
|
72
|
-
background: rgba(100, 220, 232, 0.1);
|
|
73
|
-
border: 1px solid rgba(100, 220, 232, 0.3);
|
|
74
|
-
color: var(--accent-strong);
|
|
75
|
-
text-decoration: none;
|
|
76
|
-
transition: background 0.25s ease, transform 0.15s ease;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.page-link:hover {
|
|
80
|
-
background: rgba(100, 220, 232, 0.18);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.page-link:active {
|
|
84
|
-
transform: translateY(1px);
|
|
54
|
+
width: fit-content;
|
|
55
|
+
color: var(--accent);
|
|
85
56
|
}
|
|
86
57
|
|
|
87
|
-
@media (max-width:
|
|
88
|
-
.page
|
|
58
|
+
@media (max-width: 760px) {
|
|
59
|
+
.page {
|
|
89
60
|
grid-template-columns: 1fr;
|
|
90
|
-
justify-items: start;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
@media (max-width: 640px) {
|
|
95
|
-
.page-card {
|
|
96
|
-
padding: 1.15rem;
|
|
97
|
-
border-radius: 1.25rem;
|
|
98
61
|
}
|
|
99
62
|
}
|
|
100
63
|
[/css]
|
|
@@ -16,23 +16,14 @@ const ROUTE_LINK_SELECTOR = "a[data-route]";
|
|
|
16
16
|
const routes = [
|
|
17
17
|
{
|
|
18
18
|
path: "/",
|
|
19
|
-
name: "home",
|
|
20
|
-
title: "Home",
|
|
21
|
-
description: "Landing page for the KoppaJS router starter.",
|
|
22
19
|
componentTag: "home-page",
|
|
23
20
|
},
|
|
24
21
|
{
|
|
25
22
|
path: "/router",
|
|
26
|
-
name: "router",
|
|
27
|
-
title: "Router",
|
|
28
|
-
description: "Second page showing how the KoppaJS router starter works.",
|
|
29
23
|
componentTag: "router-page",
|
|
30
24
|
},
|
|
31
25
|
{
|
|
32
26
|
path: "*",
|
|
33
|
-
name: "not-found",
|
|
34
|
-
title: "Not found",
|
|
35
|
-
description: "Fallback page for unmatched routes in the router starter.",
|
|
36
27
|
componentTag: "not-found-page",
|
|
37
28
|
},
|
|
38
29
|
] satisfies readonly RouteDefinition[];
|