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.
Files changed (78) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +12 -10
  3. package/bin/create-koppajs.js +0 -14
  4. package/package.json +4 -4
  5. package/template/README.md +19 -206
  6. package/template/_gitignore +0 -3
  7. package/template/index.html +1 -1
  8. package/template/package.json +9 -46
  9. package/template/public/favicon.png +0 -0
  10. package/template/public/koppajs-logo.png +0 -0
  11. package/template/src/app-view.kpa +1 -3
  12. package/template/tsconfig.json +2 -9
  13. package/template-overlays/router/README.md +25 -200
  14. package/template-overlays/router/index.html +1 -1
  15. package/template-overlays/router/package.json +10 -47
  16. package/template-overlays/router/src/app-view.kpa +21 -78
  17. package/template-overlays/router/src/home-page.kpa +23 -60
  18. package/template-overlays/router/src/main.ts +0 -9
  19. package/template-overlays/router/src/not-found-page.kpa +16 -48
  20. package/template-overlays/router/src/router-page.kpa +34 -69
  21. package/template-overlays/router/src/style.css +5 -29
  22. package/template/AI_CONSTITUTION.md +0 -50
  23. package/template/ARCHITECTURE.md +0 -84
  24. package/template/CHANGELOG.md +0 -35
  25. package/template/CONTRIBUTING.md +0 -89
  26. package/template/DECISION_HIERARCHY.md +0 -32
  27. package/template/DEVELOPMENT_RULES.md +0 -57
  28. package/template/LICENSE +0 -201
  29. package/template/RELEASE.md +0 -227
  30. package/template/ROADMAP.md +0 -34
  31. package/template/TESTING_STRATEGY.md +0 -96
  32. package/template/_editorconfig +0 -12
  33. package/template/_github/instructions/ai-workflow.md +0 -33
  34. package/template/_github/workflows/ci.yml +0 -41
  35. package/template/_github/workflows/release.yml +0 -58
  36. package/template/_husky/commit-msg +0 -8
  37. package/template/_husky/pre-commit +0 -1
  38. package/template/_prettierignore +0 -7
  39. package/template/commitlint.config.mjs +0 -6
  40. package/template/docs/adr/0001-keep-the-starter-minimal.md +0 -32
  41. package/template/docs/adr/0002-adopt-a-living-meta-layer.md +0 -30
  42. package/template/docs/adr/0003-rely-on-upstream-kpa-es-module-output.md +0 -32
  43. package/template/docs/adr/0004-adopt-an-automated-quality-baseline.md +0 -31
  44. package/template/docs/adr/0005-adopt-a-tag-driven-release-baseline.md +0 -45
  45. package/template/docs/adr/0006-adopt-commit-message-conventions.md +0 -39
  46. package/template/docs/adr/README.md +0 -37
  47. package/template/docs/adr/TEMPLATE.md +0 -18
  48. package/template/docs/architecture/module-boundaries.md +0 -47
  49. package/template/docs/meta/maintenance.md +0 -40
  50. package/template/docs/quality/quality-gates.md +0 -39
  51. package/template/docs/specs/README.md +0 -36
  52. package/template/docs/specs/TEMPLATE.md +0 -34
  53. package/template/docs/specs/app-bootstrap.md +0 -46
  54. package/template/docs/specs/counter-component.md +0 -48
  55. package/template/docs/specs/quality-workflow.md +0 -62
  56. package/template/eslint.config.mjs +0 -54
  57. package/template/playwright.config.ts +0 -31
  58. package/template/pnpm-lock.yaml +0 -3777
  59. package/template/prettier.config.mjs +0 -6
  60. package/template/public/favicon.svg +0 -15
  61. package/template/tests/e2e/app.spec.ts +0 -18
  62. package/template/tests/integration/main-bootstrap.test.ts +0 -33
  63. package/template/vite.config.d.mts +0 -5
  64. package/template/vitest.config.mjs +0 -19
  65. package/template-overlays/router/ARCHITECTURE.md +0 -86
  66. package/template-overlays/router/CHANGELOG.md +0 -50
  67. package/template-overlays/router/DEVELOPMENT_RULES.md +0 -57
  68. package/template-overlays/router/ROADMAP.md +0 -34
  69. package/template-overlays/router/TESTING_STRATEGY.md +0 -67
  70. package/template-overlays/router/docs/adr/0001-keep-the-starter-minimal.md +0 -32
  71. package/template-overlays/router/docs/architecture/module-boundaries.md +0 -39
  72. package/template-overlays/router/docs/meta/maintenance.md +0 -38
  73. package/template-overlays/router/docs/specs/README.md +0 -19
  74. package/template-overlays/router/docs/specs/app-bootstrap.md +0 -42
  75. package/template-overlays/router/docs/specs/router-navigation.md +0 -41
  76. package/template-overlays/router/pnpm-lock.yaml +0 -3786
  77. package/template-overlays/router/tests/e2e/app.spec.ts +0 -38
  78. package/template-overlays/router/tests/integration/main-bootstrap.test.ts +0 -150
@@ -1,94 +1,11 @@
1
- <a id="readme-top"></a>
1
+ # __PROJECT_NAME__
2
2
 
3
- <div align="center">
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
- &middot;
29
- <a href="https://github.com/koppajs/koppajs-core">KoppaJS Core</a>
30
- &middot;
31
- <a href="https://github.com/koppajs/koppajs-router">KoppaJS Router</a>
32
- &middot;
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
- Install the Playwright browser once if you want to run the browser smoke test locally:
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 currently contains:
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
- ├── .editorconfig
164
- ├── .github/
39
+ ├── .gitattributes
165
40
  ├── .gitignore
166
- ├── .husky/
167
41
  ├── .npmrc
168
- ├── .prettierignore
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
- └── favicon.svg
196
- ├── src/
197
- │ ├── main.ts
198
- ├── style.css
199
- ├── app-view.kpa
200
- ├── counter-component.kpa
201
- ├── home-page.kpa
202
- ├── router-page.kpa
203
- │ └── not-found-page.kpa
204
- └── tests/
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
- ## License
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/svg+xml" href="/favicon.svg" />
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.12.1",
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": "^3.0.7",
47
- "@koppajs/koppajs-router": "^0.1.2"
28
+ "@koppajs/koppajs-core": "3.0.7",
29
+ "@koppajs/koppajs-router": "0.1.2"
48
30
  },
49
31
  "devDependencies": {
50
- "@commitlint/cli": "^20.1.0",
51
- "@commitlint/config-conventional": "^20.0.0",
52
- "@eslint/js": "^10.0.1",
53
- "@koppajs/koppajs-vite-plugin": "^1.0.4",
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="hero-panel">
4
- <div class="hero-copy">
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 Page</a>
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(1080px, calc(100vw - 2rem));
18
+ width: min(920px, calc(100vw - 2rem));
28
19
  margin: 0 auto;
29
20
  padding: 2rem 0 3rem;
30
21
  }
31
22
 
32
- .hero-panel {
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
- flex-direction: column;
46
- gap: 0.9rem;
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(320px, 72vw);
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.8rem;
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.8rem;
87
- padding: 0 1.15rem;
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: #07111e;
110
- font-weight: 700;
58
+ color: var(--accent);
111
59
  }
112
60
 
113
61
  .app-outlet {
114
- padding-top: 1.5rem;
62
+ padding-top: 2rem;
115
63
  }
116
64
 
117
65
  @media (max-width: 640px) {
118
- .app-shell {
119
- width: min(100vw - 1rem, 1080px);
120
- padding-top: 0.75rem;
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-card">
2
+ <section class="page">
3
3
  <div class="page-copy">
4
- <p class="section-label">Home route</p>
5
- <h2 class="page-title">A small starter, now with real navigation</h2>
6
- <p class="page-text">
7
- The home page keeps the original interactive counter so the starter still
8
- shows local state, while the navigation above now switches routes through
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
- <div class="page-actions">
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-card {
19
+ .page {
23
20
  display: grid;
24
- grid-template-columns: minmax(0, 1.1fr) auto;
25
- gap: 1.5rem;
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: flex;
37
- flex-direction: column;
27
+ display: grid;
38
28
  gap: 1rem;
39
29
  }
40
30
 
41
- .section-label {
31
+ .eyebrow {
42
32
  color: var(--accent);
43
33
  font-size: 0.8rem;
44
- letter-spacing: 0.28em;
34
+ letter-spacing: 0.2em;
45
35
  text-transform: uppercase;
46
36
  }
47
37
 
48
- .page-title {
49
- font-size: clamp(1.7rem, 3vw, 2.7rem);
38
+ h1 {
39
+ font-size: clamp(2rem, 4vw, 3rem);
50
40
  line-height: 1.1;
51
41
  }
52
42
 
53
- .page-text {
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
- .page-actions {
60
- display: flex;
61
- flex-wrap: wrap;
62
- gap: 0.8rem;
49
+ code {
50
+ color: var(--accent);
63
51
  }
64
52
 
65
53
  .page-link {
66
- display: inline-flex;
67
- align-items: center;
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: 840px) {
88
- .page-card {
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[];