@madojs/mado 0.10.1 → 0.11.1

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 (219) hide show
  1. package/AGENTS.md +24 -26
  2. package/CHANGELOG.md +95 -0
  3. package/README.md +22 -47
  4. package/TODO.md +52 -48
  5. package/dist/src/component.d.ts +2 -1
  6. package/dist/src/component.js +5 -2
  7. package/dist/src/component.js.map +1 -1
  8. package/dist/src/each.d.ts +1 -1
  9. package/dist/src/each.js +1 -1
  10. package/dist/src/each.js.map +1 -1
  11. package/dist/src/html/bindings.js +3 -3
  12. package/dist/src/html/bindings.js.map +1 -1
  13. package/dist/src/index.d.ts +11 -6
  14. package/dist/src/index.js +5 -3
  15. package/dist/src/index.js.map +1 -1
  16. package/dist/src/lazy.d.ts +1 -1
  17. package/dist/src/lazy.js +1 -1
  18. package/dist/src/lazy.js.map +1 -1
  19. package/dist/src/page.d.ts +17 -21
  20. package/dist/src/page.js +7 -12
  21. package/dist/src/page.js.map +1 -1
  22. package/dist/src/router/manifest.d.ts +1 -1
  23. package/dist/src/router/manifest.js +21 -13
  24. package/dist/src/router/manifest.js.map +1 -1
  25. package/dist/src/router/match.d.ts +2 -2
  26. package/dist/src/router/match.js +3 -3
  27. package/dist/src/router/match.js.map +1 -1
  28. package/dist/src/router/navigation.js +1 -1
  29. package/dist/src/router/navigation.js.map +1 -1
  30. package/dist/src/vite/index.d.ts +10 -0
  31. package/dist/src/vite/index.js +33 -0
  32. package/dist/src/vite/index.js.map +1 -0
  33. package/docs/en/00-the-mado-way.md +25 -12
  34. package/docs/en/01-routing.md +90 -142
  35. package/docs/en/02-project-layout.md +59 -53
  36. package/docs/en/03-static-bake.md +5 -6
  37. package/docs/en/05-why-mado.md +6 -6
  38. package/docs/en/06-for-backenders.md +18 -22
  39. package/docs/en/08-llm-zero-history-test.md +9 -14
  40. package/docs/en/09-shadow-vs-light-dom.md +28 -36
  41. package/docs/en/10-app-architecture.md +158 -96
  42. package/docs/en/11-layouts.md +22 -24
  43. package/docs/en/12-auth-and-api.md +89 -182
  44. package/docs/en/13-deployment.md +18 -22
  45. package/docs/en/14-testing.md +4 -4
  46. package/docs/en/16-bake-cookbook.md +11 -12
  47. package/docs/en/18-api-freeze-map.md +6 -4
  48. package/docs/en/20-v1-stability.md +1 -1
  49. package/docs/fr/00-the-mado-way.md +55 -90
  50. package/docs/fr/01-routing.md +70 -152
  51. package/docs/fr/02-project-layout.md +61 -42
  52. package/docs/fr/03-static-bake.md +1 -1
  53. package/docs/fr/05-why-mado.md +6 -6
  54. package/docs/fr/06-for-backenders.md +7 -7
  55. package/docs/fr/08-llm-zero-history-test.md +21 -48
  56. package/docs/fr/09-shadow-vs-light-dom.md +43 -162
  57. package/docs/fr/10-app-architecture.md +110 -33
  58. package/docs/fr/11-layouts.md +24 -12
  59. package/docs/fr/12-auth-and-api.md +63 -22
  60. package/docs/fr/13-deployment.md +7 -10
  61. package/docs/fr/14-testing.md +1 -1
  62. package/docs/fr/16-bake-cookbook.md +2 -2
  63. package/docs/fr/18-api-freeze-map.md +1 -1
  64. package/docs/fr/20-v1-stability.md +1 -1
  65. package/docs/recipes/nginx/README.md +13 -0
  66. package/docs/ru/00-the-mado-way.md +53 -75
  67. package/docs/ru/01-routing.md +68 -143
  68. package/docs/ru/02-project-layout.md +61 -41
  69. package/docs/ru/03-static-bake.md +2 -2
  70. package/docs/ru/05-why-mado.md +6 -6
  71. package/docs/ru/06-for-backenders.md +7 -7
  72. package/docs/ru/08-llm-zero-history-test.md +9 -14
  73. package/docs/ru/09-shadow-vs-light-dom.md +43 -178
  74. package/docs/ru/10-app-architecture.md +115 -63
  75. package/docs/ru/11-layouts.md +24 -24
  76. package/docs/ru/12-auth-and-api.md +57 -35
  77. package/docs/ru/13-deployment.md +7 -11
  78. package/docs/ru/14-testing.md +1 -1
  79. package/docs/ru/16-bake-cookbook.md +12 -6
  80. package/docs/ru/18-api-freeze-map.md +5 -3
  81. package/docs/ru/20-v1-stability.md +1 -1
  82. package/docs/uk/00-the-mado-way.md +70 -44
  83. package/docs/uk/01-routing.md +41 -47
  84. package/docs/uk/02-project-layout.md +68 -41
  85. package/docs/uk/03-static-bake.md +1 -2
  86. package/docs/uk/06-for-backenders.md +3 -3
  87. package/docs/uk/08-llm-zero-history-test.md +22 -24
  88. package/docs/uk/09-shadow-vs-light-dom.md +37 -86
  89. package/docs/uk/10-app-architecture.md +72 -31
  90. package/docs/uk/11-layouts.md +25 -12
  91. package/docs/uk/12-auth-and-api.md +58 -22
  92. package/docs/uk/13-deployment.md +4 -3
  93. package/docs/uk/14-testing.md +1 -1
  94. package/docs/uk/18-api-freeze-map.md +1 -1
  95. package/docs/uk/20-v1-stability.md +1 -1
  96. package/llms.txt +14 -15
  97. package/package.json +18 -11
  98. package/scripts/_config.mjs +15 -161
  99. package/scripts/bake.mjs +74 -63
  100. package/scripts/cli/generate.mjs +348 -0
  101. package/scripts/cli/help.mjs +27 -0
  102. package/scripts/cli/index.mjs +79 -0
  103. package/scripts/cli/init.mjs +153 -0
  104. package/scripts/cli/release.mjs +152 -0
  105. package/scripts/cli/run.mjs +96 -0
  106. package/scripts/cli.mjs +2 -621
  107. package/scripts/package-smoke.mjs +4 -1
  108. package/scripts/preview.mjs +13 -37
  109. package/scripts/size-budget.mjs +5 -2
  110. package/scripts/vite.default.mjs +11 -0
  111. package/starters/default/.editorconfig +12 -0
  112. package/starters/default/README.md +74 -0
  113. package/starters/default/eslint.config.mjs +256 -0
  114. package/starters/default/index.html +13 -0
  115. package/starters/default/package.json +30 -0
  116. package/starters/default/public/favicon.svg +4 -0
  117. package/starters/default/src/app.routes.ts +39 -0
  118. package/starters/default/src/layouts/app-shell.layout.ts +35 -0
  119. package/starters/default/src/layouts/auth-shell.layout.ts +17 -0
  120. package/starters/default/src/main.ts +16 -0
  121. package/starters/default/src/modules/auth/_contracts/auth-api.types.ts +17 -0
  122. package/starters/default/src/modules/auth/auth.connector.ts +45 -0
  123. package/starters/default/src/modules/auth/auth.guard.ts +22 -0
  124. package/starters/default/src/modules/auth/auth.public.ts +9 -0
  125. package/starters/default/src/modules/auth/auth.routes.ts +8 -0
  126. package/starters/default/src/modules/auth/auth.service.ts +71 -0
  127. package/starters/default/src/modules/auth/auth.types.ts +15 -0
  128. package/starters/default/src/modules/auth/login.page.ts +62 -0
  129. package/starters/default/src/modules/billing/_contracts/stripe.types.ts +17 -0
  130. package/starters/default/src/modules/billing/api/stripe.connector.ts +71 -0
  131. package/starters/default/src/modules/billing/billing.public.ts +5 -0
  132. package/starters/default/src/modules/billing/billing.routes.ts +9 -0
  133. package/starters/default/src/modules/billing/billing.types.ts +15 -0
  134. package/starters/default/src/modules/billing/components/invoice-status-badge.component.ts +43 -0
  135. package/starters/default/src/modules/billing/data/invoices.resource.ts +35 -0
  136. package/starters/default/src/modules/billing/pages/invoice-detail.page.ts +70 -0
  137. package/starters/default/src/modules/billing/pages/invoices-list.page.ts +73 -0
  138. package/starters/default/src/modules/home/home.page.ts +34 -0
  139. package/starters/default/src/modules/home/not-found.page.ts +11 -0
  140. package/starters/default/src/shared/http/http-client.ts +86 -0
  141. package/starters/default/src/shared/http/http-error.ts +37 -0
  142. package/starters/default/src/shared/http/interceptors.ts +59 -0
  143. package/starters/default/src/shared/lib/format-date.ts +19 -0
  144. package/starters/default/src/shared/styles/content.css +70 -0
  145. package/starters/default/src/shared/styles/reset.css +32 -0
  146. package/starters/default/src/shared/styles/shell.css +57 -0
  147. package/starters/default/src/shared/styles/tokens.css +44 -0
  148. package/starters/default/src/shared/ui/x-button.component.ts +49 -0
  149. package/starters/default/src/shared/ui/x-spinner.component.ts +22 -0
  150. package/starters/default/src/styles.d.ts +1 -0
  151. package/starters/default/src/vite-env.d.ts +1 -0
  152. package/starters/default/tsconfig.json +24 -0
  153. package/starters/default/vite.config.ts +9 -0
  154. package/MADO_V1_PLAN.md +0 -179
  155. package/ROADMAP.md +0 -178
  156. package/dist/src/html.d.ts +0 -18
  157. package/dist/src/html.js +0 -17
  158. package/dist/src/html.js.map +0 -1
  159. package/dist/src/router.d.ts +0 -13
  160. package/dist/src/router.js +0 -13
  161. package/dist/src/router.js.map +0 -1
  162. package/scripts/bundle.mjs +0 -212
  163. package/scripts/llm-zero-history-smoke.mjs +0 -93
  164. package/scripts/new.mjs +0 -80
  165. package/scripts/showcase-regression.mjs +0 -392
  166. package/server/serve.mjs +0 -455
  167. package/starters/admin/README.md +0 -63
  168. package/starters/admin/index.html +0 -28
  169. package/starters/admin/mado.config.json +0 -22
  170. package/starters/admin/package.json +0 -24
  171. package/starters/admin/public/favicon.svg +0 -4
  172. package/starters/admin/src/components/x-button.ts +0 -82
  173. package/starters/admin/src/components/x-input.ts +0 -105
  174. package/starters/admin/src/layouts/app.ts +0 -101
  175. package/starters/admin/src/layouts/auth.ts +0 -41
  176. package/starters/admin/src/lib/api.ts +0 -184
  177. package/starters/admin/src/lib/auth.ts +0 -83
  178. package/starters/admin/src/main.ts +0 -15
  179. package/starters/admin/src/pages/admin/dashboard.ts +0 -48
  180. package/starters/admin/src/pages/admin/order-detail.ts +0 -80
  181. package/starters/admin/src/pages/admin/orders.ts +0 -117
  182. package/starters/admin/src/pages/home.ts +0 -34
  183. package/starters/admin/src/pages/login.ts +0 -70
  184. package/starters/admin/src/pages/not-found.ts +0 -12
  185. package/starters/admin/src/routes.ts +0 -40
  186. package/starters/admin/src/styles/global.ts +0 -86
  187. package/starters/admin/tsconfig.json +0 -15
  188. package/starters/crud/README.md +0 -33
  189. package/starters/crud/index.html +0 -28
  190. package/starters/crud/mado.config.json +0 -20
  191. package/starters/crud/package.json +0 -24
  192. package/starters/crud/src/components/app-shell.ts +0 -56
  193. package/starters/crud/src/components/ticket-detail.ts +0 -33
  194. package/starters/crud/src/components/ticket-form.ts +0 -69
  195. package/starters/crud/src/components/ticket-list.ts +0 -66
  196. package/starters/crud/src/lib/api.ts +0 -76
  197. package/starters/crud/src/main.ts +0 -9
  198. package/starters/crud/src/pages/home.ts +0 -34
  199. package/starters/crud/src/pages/not-found.ts +0 -12
  200. package/starters/crud/src/pages/ticket-detail.ts +0 -7
  201. package/starters/crud/src/pages/ticket-new.ts +0 -7
  202. package/starters/crud/src/pages/tickets.ts +0 -7
  203. package/starters/crud/src/routes.ts +0 -11
  204. package/starters/crud/src/styles/global.ts +0 -155
  205. package/starters/crud/tsconfig.json +0 -15
  206. package/starters/minimal/README.md +0 -21
  207. package/starters/minimal/index.html +0 -28
  208. package/starters/minimal/mado.config.json +0 -20
  209. package/starters/minimal/package.json +0 -24
  210. package/starters/minimal/src/components/app-counter.ts +0 -31
  211. package/starters/minimal/src/main.ts +0 -9
  212. package/starters/minimal/src/pages/home.ts +0 -35
  213. package/starters/minimal/src/pages/not-found.ts +0 -14
  214. package/starters/minimal/src/routes.ts +0 -8
  215. package/starters/minimal/src/styles/global.ts +0 -60
  216. package/starters/minimal/tsconfig.json +0 -15
  217. package/templates/page-detail.ts +0 -63
  218. package/templates/page-form.ts +0 -94
  219. package/templates/page-list.ts +0 -79
package/AGENTS.md CHANGED
@@ -3,8 +3,6 @@
3
3
  > This file is read by AI agents in IDEs (Cursor, Cline, Copilot, Continue, etc.).
4
4
  > Goal: prevent them from generating React-like code where Mado should be used.
5
5
  >
6
- > The v0.6 product-surface push is archived in
7
- > [`MADO_V1_PLAN.md`](./MADO_V1_PLAN.md). New work should follow `ROADMAP.md`
8
6
  > / `TODO.md` unless the user explicitly resumes that tracker.
9
7
 
10
8
  ## Project at a glance
@@ -12,7 +10,7 @@
12
10
  - **Mado** — a calm browser-native SPA framework for internal tools, admin panels and business apps.
13
11
  - Built on Web Components + signals + tagged-template `html`.
14
12
  - Zero runtime dependencies. Generated apps use dev tooling (`typescript`,
15
- `esbuild`, `linkedom`) for build/bundle/bake/release.
13
+ `vite`, `linkedom`) for dev/build/bake/release.
16
14
  - Small TypeScript core in `src/`; production size budgets are enforced in CI.
17
15
 
18
16
  ## HARD RULES — violation = bug
@@ -210,13 +208,14 @@ or `<title>`. Keep SVG internals in one `<svg>...</svg>` template.
210
208
  ### 8. Routing — `routes()` + `page()`
211
209
 
212
210
  ```ts
213
- // routes.ts — manifest
211
+ // app.routes.ts — app manifest
214
212
  import { routes } from "@madojs/mado";
215
- export default routes({
216
- "/": () => import("./pages/home.js"),
217
- "/users/:id": () => import("./pages/user.js"),
218
- "*": () => import("./pages/not-found.js"),
219
- });
213
+ export const manifest = {
214
+ "/": () => import("./modules/home/home.page.js"),
215
+ "/users/:id": () => import("./modules/users/pages/user.page.js"),
216
+ "*": () => import("./modules/home/not-found.page.js"),
217
+ };
218
+ export default routes(manifest);
220
219
 
221
220
  // page file
222
221
  import { page, html } from "@madojs/mado";
@@ -226,8 +225,8 @@ export default page<{ id: string }>({
226
225
  });
227
226
  ```
228
227
 
229
- - Each page is a **separate file** in `pages/` with `export default page({...})`.
230
- - Import via `() => import("./pages/foo.js")` — this enables code-splitting via ESM.
228
+ - Each page is a **separate file** under `src/modules/<module>/` with `export default page({...})`.
229
+ - Import via `() => import("./modules/<module>/pages/foo.page.js")` — this enables code-splitting via ESM.
231
230
  - Programmatic navigation: `import { navigate } from "@madojs/mado"; navigate("/users/42")`.
232
231
  - Layouts are declared in the route manifest via `layout()`. Treat
233
232
  `layout.view({ child })` as a stateless wrapper around `${child}` and shared
@@ -399,7 +398,8 @@ not SSR with hydration and not a Next-style SSG runtime.
399
398
  ## SOFT GUIDELINES — recommended, but not critical
400
399
 
401
400
  - **TypeScript strict.** Use `noUncheckedIndexedAccess`-aware code (with `!` or a type guard).
402
- - **Import using `.js`** (not `.ts`) this is required by ES modules in the browser: `import { foo } from "./bar.js"`.
401
+ - **Imports:** generated Vite apps may use extensionless local imports. Browser-native
402
+ package examples that run without Vite should use `.js` specifiers.
403
403
  - **Public imports only.** App code imports from `@madojs/mado` and, when
404
404
  needed, side-effect `@madojs/mado/devtools.js`. Other package subpaths and
405
405
  `dist/src/*` are internal.
@@ -411,40 +411,38 @@ not SSR with hydration and not a Next-style SSG runtime.
411
411
 
412
412
  ```
413
413
  src/
414
- ├── routes.ts ← route manifest, ONE file
415
414
  ├── main.ts ← entry: mount to #app
416
- ├── pages/ one page = one file
417
- ├── components/ reusable x-* components
418
- ├── layouts/ optional route layout modules (`page({ child })`)
419
- └── lib/ API client, contexts, pure logic
415
+ ├── app.routes.ts app map, exports `manifest` + default routes(...)
416
+ ├── layouts/ app-zone layout modules (`page({ child })`)
417
+ ├── shared/ ui, http, lib, styles
418
+ └── modules/ bounded contexts with pages/data/api/services
420
419
  ```
421
420
 
422
421
  ## App architecture for LLM
423
422
 
424
423
  When generating an app, prefer the blessed production shape from
425
- `docs/en/10-app-architecture.md` and the `starters/admin/` example:
424
+ `docs/en/10-app-architecture.md` and the `starters/default/` example:
426
425
 
427
426
  - `src/main.ts` mounts `routesApi.view` and imports only global styles,
428
427
  providers, and tiny shared components.
429
- - `src/routes.ts` exports both `manifest` and `default routes(manifest, ...)`.
428
+ - `src/app.routes.ts` exports both `manifest` and `default routes(manifest, ...)`.
430
429
  - Put route wrappers in `src/layouts/` via `layout()`, not ad-hoc shell logic
431
430
  inside every page.
432
- - Put backend access in `src/lib/api.ts` and auth/session logic in
433
- `src/lib/auth.ts`; guards call auth helpers, pages call API helpers.
434
- - Put one page per file under `src/pages/`; a page imports the feature
435
- components it renders.
431
+ - Put backend access in module `*.connector.ts` files over `shared/http`.
432
+ - Put one page per file under the starter's module/page convention; a page imports
433
+ the feature components it renders.
436
434
  - Use `resource()` for reads, `mutation(..., { invalidates })` for writes,
437
435
  and `useForm()` for form state/validation.
438
436
  - Use `mado release` as the production path. `out/` is the only deploy
439
- artifact; `dist/` is internal build output.
437
+ artifact for apps; framework package tests still build `dist/src`.
440
438
 
441
439
  ## Where to find specific answers
442
440
 
443
441
  | Question | File |
444
442
  | -------------------------------- | -------------------------------- |
445
443
  | How does reactivity work? | `src/signal.ts` (283 lines) |
446
- | How are templates parsed? | `src/html.ts` (1013 lines) |
447
- | How does the router work? | `src/router.ts` (~530 lines) |
444
+ | How are templates parsed? | `src/html/` |
445
+ | How does the router work? | `src/router/` |
448
446
  | How does resource + cache work? | `src/resource.ts` (297 lines) |
449
447
  | How do forms work? | `src/forms.ts` (212 lines) |
450
448
  | How should an app be structured? | `docs/en/10-app-architecture.md` |
package/CHANGELOG.md CHANGED
@@ -2,6 +2,101 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.11.1 - 2026-06-21
6
+
7
+ Patch release for CI/release workflow cleanup after the Vite migration.
8
+
9
+ ### Fixed
10
+
11
+ - **CI no longer references removed legacy paths or scripts.** The main workflow
12
+ now checks the current repo surface (`src`, `scripts`, `starters`, `test`,
13
+ docs and GitHub metadata) instead of removed `examples`, `server`,
14
+ `templates`, `ROADMAP.md`, root `nginx.conf`, and `Dockerfile` paths.
15
+
16
+ - **Removed the deleted `npm run llm:smoke` CI step.** LLM guidance is now
17
+ covered by docs and package smoke checks rather than the old examples-based
18
+ smoke script.
19
+
20
+ - **Replaced the stale browser workflow.** The old scheduled browser workflow
21
+ called a missing `npm run test:browser`; it now runs the publish gate, size
22
+ budget and package smoke checks as a weekly smoke workflow.
23
+
24
+ - **Release workflow now runs the same gate used locally.** Tag releases run
25
+ `prepublishOnly`, size budgets and package smoke before packing/publishing.
26
+
27
+ - **Cleaned CodeQL/static-analysis findings.** Tests no longer use async
28
+ Promise executors, dead smoke reads, unused helpers/imports, or misleading
29
+ mutation assertions; diagnostics and bake branches were clarified without
30
+ changing runtime behavior.
31
+
32
+ ## 0.11.0 - 2026-06-21
33
+
34
+ Vite-era release. Mado keeps the browser-native runtime, but generated apps now
35
+ use Vite for dev/build/release instead of Mado maintaining its own app bundler.
36
+
37
+ ### Added
38
+
39
+ - **Vite plugin subpath.** `@madojs/mado/vite` exports `mado()`, the canonical
40
+ Vite plugin for app projects. It provides Mado defaults for app builds while
41
+ leaving runtime code dependency-free.
42
+
43
+ - **Canonical default starter.** `mado init` now scaffolds the single official
44
+ starter from `starters/default`: Vite config, `public/`, module-oriented app
45
+ structure, Shadow DOM-friendly CSS, CLI generator conventions, and no old
46
+ importmap/dist entry paths.
47
+
48
+ - **`mado new` generators.** The CLI can scaffold modules, pages, connectors,
49
+ resources, services, forms, components, guards, and layouts using the default
50
+ starter conventions.
51
+
52
+ ### Changed
53
+
54
+ - **`mado dev` runs Vite.** Development now uses Vite's dev server instead of a
55
+ custom Mado dev server. Mado-specific HMR is intentionally simple full reload.
56
+
57
+ - **`mado release` is Vite-first.** Release now cleans `out/`, typechecks, runs
58
+ Vite build, bakes route HTML from the production `out/index.html`, writes
59
+ static host files, and precompresses assets.
60
+
61
+ - **Bake uses Vite module loading.** Route manifests are loaded through Vite's
62
+ module/SSR loader, so TypeScript, aliases, env handling, and plugin resolution
63
+ match the app build path.
64
+
65
+ - **Baked route HTML is written directly into `out/<route>/index.html`.**
66
+ `out/baked/` is no longer part of the default deploy artifact. Use
67
+ `mado release --keep-bake-dir` only when a debug copy is useful.
68
+
69
+ - **CLI internals were split into `scripts/cli/`.** The public `mado` binary is
70
+ unchanged, but command implementation is no longer one large script.
71
+
72
+ - **Tests are grouped by context.** Test files now live under `test/bake`,
73
+ `test/cli`, `test/html`, `test/package`, `test/router`, and `test/runtime`.
74
+
75
+ ### Removed
76
+
77
+ - **Legacy app bundler and server code.** The custom bundle/server path and
78
+ config-loader compatibility layer were removed in favor of Vite.
79
+
80
+ - **Bundled examples and old starters.** Large examples were extracted out of
81
+ the package repository. `starters/admin`, `starters/crud`, and
82
+ `starters/minimal` were replaced by `starters/default`.
83
+
84
+ - **Legacy root artifacts.** The Docker/nginx deployment sample moved to
85
+ `docs/recipes/nginx/`, and archived v1 planning documents were removed from
86
+ the active repository surface.
87
+
88
+ - **Core compatibility aliases.** Legacy `src/html.ts` and `src/router.ts`
89
+ alias files were removed now that the pre-stable public surface has been
90
+ cleaned up.
91
+
92
+ ### Docs
93
+
94
+ - Rewrote EN/RU/FR/UK docs around the new model: `index.html` is the Vite
95
+ entry, `public/` is static copy input, and `out/` is the deploy artifact.
96
+ - Updated architecture, routing, bake, deployment, testing, Shadow DOM/style,
97
+ LLM guidance, and starter docs to point at the canonical default starter.
98
+ - Synced `TODO.md` into a small backlog instead of a stale roadmap-style list.
99
+
5
100
  ## 0.10.1 - 2026-06-12
6
101
 
7
102
  Patch release for the production bake/preview path.
package/README.md CHANGED
@@ -23,6 +23,7 @@
23
23
  [![CI](https://github.com/madojs/mado/actions/workflows/ci.yml/badge.svg)](https://github.com/madojs/mado/actions/workflows/ci.yml)
24
24
  [![Browser Regression](https://github.com/madojs/mado/actions/workflows/browser.yml/badge.svg)](https://github.com/madojs/mado/actions/workflows/browser.yml)
25
25
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
26
+ [![Donate: PayPal](https://img.shields.io/badge/Donate-PayPal-ff3f59.svg)](https://www.paypal.com/paypalme/tsekhmister)
26
27
 
27
28
  Mado is a browser-native SPA framework for teams that want routing, forms,
28
29
  data fetching and state management — without turning their frontend into an
@@ -85,8 +86,8 @@ Mado stays useful by saying no. These are intentionally out of scope:
85
86
 
86
87
  - **vs Lit** — Lit is better for design systems. Mado is for whole apps:
87
88
  router, data, forms and prerender in one package, no assembly required.
88
- - **vs Solid** — Solid is faster and more mature. It also requires Vite + a
89
- babel plugin. Mado requires nothing but `tsc`.
89
+ - **vs Solid** — Solid is faster and more mature. Mado keeps a smaller runtime
90
+ and uses Vite only as the development/build transport layer.
90
91
  - **vs htmx** — htmx is excellent when your backend owns HTML. Mado is for
91
92
  cases where you want a real SPA: local state, optimistic updates, cached
92
93
  resources, lazy modules and persisted UI state.
@@ -96,8 +97,8 @@ Mado stays useful by saying no. These are intentionally out of scope:
96
97
  Routing, forms, state, data fetching and prerendering — without ecosystem tax:
97
98
 
98
99
  - No runtime dependencies to audit, update or break
99
- - No bundler required to start (`tsc` is enough)
100
- - Fewer moving parts to debug
100
+ - Vite-powered dev/build without a framework-specific bundler to maintain
101
+ - Fewer Mado-specific moving parts to debug
101
102
  - Compact API surface you can learn in a day
102
103
  - Lower long-term cognitive load
103
104
 
@@ -105,7 +106,7 @@ Routing, forms, state, data fetching and prerendering — without ecosystem tax:
105
106
  Runtime budget:
106
107
  enforced in CI with npm run size
107
108
  Runtime dependencies: 0
108
- Required dev dependencies: typescript, esbuild, linkedom
109
+ Required dev dependencies: typescript, vite, linkedom
109
110
  ```
110
111
 
111
112
  ## Quick Start
@@ -119,34 +120,10 @@ npm install
119
120
  npm run dev
120
121
  ```
121
122
 
122
- The admin starter gives you the blessed production shape: layouts, guards,
123
- auth/API client, forms and a small admin shell.
124
-
125
- ```bash
126
- npm exec --package @madojs/mado@latest -- mado init dashboard --starter admin
127
- cd dashboard
128
- npm install
129
- npm run dev
130
- ```
131
-
132
- The CRUD starter is a compact resource/mutation/forms example:
133
-
134
- ```bash
135
- npm exec --package @madojs/mado@latest -- mado init my-app --starter crud
136
- ```
137
-
138
- ### Try the flagship example
139
-
140
- ```bash
141
- git clone https://github.com/madojs/mado.git
142
- cd mado
143
- npm install
144
- npm run build
145
- npm run serve -- showcase
146
- ```
147
-
148
- The showcase is a CRM-shaped pressure app with auth, tables, filters, nested
149
- routes, context services, forms and real data patterns.
123
+ The default starter is the blessed production shape: app-zone layouts, guards,
124
+ module boundaries, API connectors, resources, forms and a small admin shell.
125
+ Larger demos live outside this package in the separate `madojs-examples`
126
+ workspace/repository.
150
127
 
151
128
  ## How it works
152
129
 
@@ -204,7 +181,7 @@ export default routes({
204
181
  });
205
182
  ```
206
183
 
207
- Lazy loading, nested routes, query params, guards, hover prefetch, scroll
184
+ Lazy loading, layout groups, query params, guards, hover prefetch, scroll
208
185
  restoration, error boundary, View Transitions.
209
186
 
210
187
  ### Data — resource + mutation
@@ -266,13 +243,12 @@ mado release
266
243
  ```
267
244
 
268
245
  Build-time prerender of routes into static HTML with meta tags and JSON-LD.
269
- No hydration runtime. For dynamic content, see the Cloudflare edge-prerender
270
- PoC in [`examples/cloudflare`](./examples/cloudflare/).
246
+ No hydration runtime. Keep personalized or real-time content in the client SPA.
271
247
 
272
248
  ## Production
273
249
 
274
250
  ```bash
275
- mado release # typecheck + build + bundle + bake + promote baked HTML + copy public -> out/
251
+ mado release # typecheck + vite build + bake + static deploy files -> out/
276
252
  mado preview # serve out/ like a static host
277
253
  ```
278
254
 
@@ -283,11 +259,11 @@ any static CDN.
283
259
 
284
260
  ```bash
285
261
  mado init my-app # scaffold new app
286
- mado init dashboard --starter admin
287
- mado dev # dev server with hot reload
288
- mado build # tsc compile
262
+ mado dev # Vite dev server
263
+ mado build # tsc compile (framework/package work)
289
264
  mado typecheck # type check without emit
290
265
  mado test # run test suite
266
+ mado new module billing # scaffold canonical app files
291
267
  mado release # full production build
292
268
  mado preview # serve production build locally
293
269
  ```
@@ -313,11 +289,8 @@ AI-agent entrypoints: [AGENTS.md](./AGENTS.md) · [llms.txt](./llms.txt)
313
289
 
314
290
  ## Examples
315
291
 
316
- - [`examples/showcase`](./examples/showcase/) flagship CRM pressure app
317
- (auth, tables, filters, forms, nested routes, context services).
318
- - [`examples/tickets`](./examples/tickets/) — CRUD validation app.
319
- - [`examples/basic`](./examples/basic/) — minimal API tour.
320
- - [`examples/cloudflare`](./examples/cloudflare/) — edge prerender PoC.
292
+ The large examples are kept outside the framework package in `madojs-examples`
293
+ so the core repo stays focused on runtime, tooling, starter and tests.
321
294
 
322
295
  ## Known Limits
323
296
 
@@ -335,11 +308,13 @@ AI-agent entrypoints: [AGENTS.md](./AGENTS.md) · [llms.txt](./llms.txt)
335
308
  npm run typecheck
336
309
  npm run build
337
310
  npm test
338
- npm run test:browser
311
+ npm run size
312
+ npm run package:smoke
339
313
  ```
340
314
 
341
315
  Covers signals, computed, effects, html parser, keyed reconciliation, resources,
342
- mutations, forms, router isolation, component lifecycle and example smoke tests.
316
+ mutations, forms, router isolation, component lifecycle, release output and
317
+ package smoke tests.
343
318
 
344
319
  ## Contributing
345
320
 
package/TODO.md CHANGED
@@ -1,75 +1,79 @@
1
1
  # TODO
2
2
 
3
- > The v0.6 product-surface push is complete. The closed tracker is archived in
4
- > [`MADO_V1_PLAN.md`](./MADO_V1_PLAN.md). The items below are ideas for later
5
- > releases and are not part of any active contract.
6
- >
7
- > The active road to v1 (correctness → surface lockdown → proof) is tracked in
8
- > [`MADO_V1_TRACKER.md`](./MADO_V1_TRACKER.md); product-surface milestones live
9
- > in `ROADMAP.md`. Anything that the v1 tracker now owns has been moved out of
10
- > the "ideas" list below.
11
-
12
- Ideas that are not commitments. Roadmap milestones live in `ROADMAP.md`.
13
-
14
-
15
- ## DX
16
-
17
- - [ ] `npx mado create my-app` scaffold.
18
- - [ ] `mado page <name>` / `mado component <name>` wrappers around templates.
19
- - [ ] Split `scripts/cli.mjs` into small internal modules (`cli/init`,
20
- `cli/run`, `cli/dev`, `cli/static-server`) before it becomes hard to read.
21
- - [ ] Make `mado preview` and `mado bundle` work naturally inside generated
22
- apps, not only inside the framework repository.
3
+ Backlog, not a roadmap. Keep this file small and honest: ideas stay here only
4
+ while they are plausible next work. Promote concrete work to issues or release
5
+ notes when it becomes real.
6
+
7
+ ## Before Public Demo / Release
8
+
9
+ - [ ] Run the default starter as a real demo app and feed every friction point
10
+ back into docs, CLI generators, or starter structure.
11
+ - [ ] Add focused tests for every `mado new` generator template.
12
+ - [ ] Audit EN/RU/FR docs after each tooling/runtime change; no old `dist/`,
13
+ `tsc-only`, custom-bundler, or legacy example wording should remain.
14
+ - [ ] Keep `mado preview` boring and reliable inside generated apps.
15
+ - [ ] Add a short maintainer-only release checklist if manual npm publish stays
16
+ in use.
17
+
18
+ ## CLI / DX
19
+
20
+ - [ ] Decide whether `npx mado create my-app` is worth adding after package
21
+ naming and install friction are clear.
22
+ - [ ] Consider short aliases over `mado new` only after real usage shows they
23
+ save enough typing (`mado page`, `mado component`, etc.).
24
+ - [ ] Split preview/static-server internals only if `scripts/preview.mjs` grows.
23
25
  - [ ] Typed navigation inferred from route patterns.
24
- - [ ] Optional VS Code extension for `html`` / `css`` highlighting.
26
+ - [ ] Editor highlighting docs should prefer existing tooling first; build a
27
+ Mado-specific VS Code extension only if current HTML/CSS template support is
28
+ not enough.
25
29
 
26
- ## Runtime
30
+ ## Runtime / App API
27
31
 
28
- - [ ] Optimistic mutation hook with rollback.
29
- - [ ] `<x-async>` helper for resource loading/error shells.
30
- - [ ] `liveResource()` over SSE / WebSocket.
32
+ - [ ] Mutation rollback helper on top of `resource().mutate()` and `mutation()`.
33
+ - [ ] Document loading/error shell patterns before adding an `<x-async>` API.
34
+ - [ ] `liveResource()` over SSE / WebSocket after a real app needs live data.
31
35
  - [ ] i18n helper once browser-native message formatting is realistic.
32
36
  - [ ] Accessibility helpers: focus trap, live region, click outside.
33
37
 
34
38
  ## Styling
35
39
 
36
40
  - [ ] Docs for `::part`, `::slotted()` and `:host-context()`.
37
- - [ ] Optional tiny utilities stylesheet.
41
+ - [ ] Document Vite CSS options, including `css.transformer: "lightningcss"`,
42
+ for apps that want Lightning CSS.
43
+ - [ ] Optional tiny utilities stylesheet only if the starter/demo repeats the
44
+ same small classes often enough to justify it.
45
+ - [ ] CSP-friendly style mode.
46
+
47
+ ## Bake / Smart Static
48
+
49
+ - [ ] Add bake regression coverage for layout groups, dynamic params, sitemap,
50
+ and hard-refresh deploy paths.
51
+ - [ ] Incremental bake cache after a real content-heavy app needs it.
52
+ - [ ] Webhook re-bake endpoint only after incremental bake has a concrete use.
53
+ - [ ] RSS / Atom feed generator for docs/blog/demo content.
38
54
 
39
55
  ## Operations
40
56
 
41
57
  - [ ] Benchmark against Lit / Solid / Preact.
42
- - [ ] `eslint-plugin-mado` rules for common mistakes.
43
- - [ ] CSP-friendly style mode.
44
- - [ ] PWA scaffold.
45
- - [ ] Schema validation hook for resources.
46
- - [ ] Timeout / retry options for resource fetchers.
47
58
  - [ ] Source-map notes and a minimal dev error overlay.
59
+ - [ ] `eslint-plugin-mado` rules only if docs/starter conventions are not enough
60
+ to prevent recurring mistakes.
61
+ - [ ] Timeout / retry options for resource fetchers after real API friction.
62
+ - [ ] Schema validation hook for resources after choosing a dependency-free
63
+ story or a clearly optional integration.
64
+ - [ ] PWA scaffold only if the public demo or a real app needs offline behavior.
48
65
 
49
-
50
- ## Bake / Smart Static
51
-
52
- - [ ] Webhook re-bake endpoint.
53
- - [ ] Incremental bake cache.
54
- - [ ] RSS / Atom feed generator.
55
- - [ ] Nested-route bake support.
56
-
57
- ## Community
66
+ ## Community / GitHub
58
67
 
59
68
  - [ ] Minimal landing site built with Mado.
60
- - [ ] Case study: real React page → Mado + bake.
61
69
  - [ ] Public live demo: CRUD starter and showcase hosted from Mado itself.
70
+ - [ ] Case study: real React page -> Mado + bake.
62
71
  - [ ] Convert contribution-ready TODO items into GitHub issues with labels
63
72
  (`good first issue`, `help wanted`, `docs`, `cli`, `ci`) after the first
64
73
  public feedback round.
65
-
66
- ## Release / GitHub
67
-
68
74
  - [ ] Configure npm Trusted Publishing for GitHub Actions after verifying the
69
75
  first manual publishes.
70
76
  - [ ] Decide the release flow: continue manual npm publish for patch releases or
71
77
  publish from signed `v*` tags through `.github/workflows/release.yml`.
72
- - [ ] Improve generated release notes: include PR links/authors when releases
73
- start going through pull requests.
74
- - [ ] Add a short maintainer-only release checklist outside public docs if the
75
- manual flow stays in use.
78
+ - [ ] Improve generated release notes with PR links/authors when releases start
79
+ going through pull requests.
@@ -16,7 +16,8 @@
16
16
  * styles will be scoped via @scope (or a tag-prefix fallback).
17
17
  */
18
18
  import { type Signal, type Disposer } from "./signal.js";
19
- import { html, type TemplateResult } from "./html.js";
19
+ import { html } from "./html/template.js";
20
+ import type { TemplateResult } from "./html/template-types.js";
20
21
  import { type CSSResult } from "./css.js";
21
22
  export interface ComponentContext {
22
23
  host: HTMLElement;
@@ -16,7 +16,7 @@
16
16
  * styles will be scoped via @scope (or a tag-prefix fallback).
17
17
  */
18
18
  import { signal, effect } from "./signal.js";
19
- import { html, render } from "./html.js";
19
+ import { html, render } from "./html/template.js";
20
20
  import { adopt, scopeStyles } from "./css.js";
21
21
  import { createLifecycle, runInLifecycle, } from "./lifecycle.js";
22
22
  import { warnOnce } from "./diagnostics.js";
@@ -49,6 +49,7 @@ export function component(tagName, setup, options = {}) {
49
49
  // re-inserted in the same tick (a keyed move via insertBefore).
50
50
  #teardownQueued = false;
51
51
  #attrSignals = new Map();
52
+ #attrDefaults = new Map();
52
53
  constructor() {
53
54
  super();
54
55
  this.#root = useShadow ? this.attachShadow({ mode: "open" }) : this;
@@ -85,6 +86,7 @@ export function component(tagName, setup, options = {}) {
85
86
  attr(name, defaultValue = "") {
86
87
  let s = host.#attrSignals.get(name);
87
88
  if (!s) {
89
+ host.#attrDefaults.set(name, defaultValue);
88
90
  s = signal(host.getAttribute(name) ?? defaultValue);
89
91
  host.#attrSignals.set(name, s);
90
92
  }
@@ -99,8 +101,9 @@ export function component(tagName, setup, options = {}) {
99
101
  const obs = new MutationObserver((mutations) => {
100
102
  for (const m of mutations) {
101
103
  const s = this.#attrSignals.get(m.attributeName);
104
+ const fallback = this.#attrDefaults.get(m.attributeName) ?? "";
102
105
  if (s)
103
- s.set(this.getAttribute(m.attributeName) ?? "");
106
+ s.set(this.getAttribute(m.attributeName) ?? fallback);
104
107
  }
105
108
  });
106
109
  obs.observe(this, { attributes: true, attributeFilter: attrNames });
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAkB,MAAM,UAAU,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,cAAc,GAEf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmC5C,MAAM,UAAU,SAAS,CACvB,OAAe,EACf,KAAc,EACd,UAA4B,EAAE;IAE9B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,QAAQ,CACN,yBAAyB,OAAO,EAAE,EAClC,cAAc,OAAO,yDAAyD,CAC/E,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,IACE,CAAC,YAAY;YACb,YAAY,CAAC,KAAK,KAAK,KAAK;YAC5B,CAAC,oBAAoB,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EACpD,CAAC;YACD,QAAQ,CACN,uBAAuB,OAAO,EAAE,EAChC,cAAc,OAAO,oFAAoF,CAC1G,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,wBAAwB;IAClC,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC;IAE3C,sDAAsD;IACtD,qEAAqE;IACrE,MAAM,WAAW,GAAgB,eAAe,CAC9C,OAAO,CAAC,MAAM,EACd,OAAO,EACP,SAAS,CACV,CAAC;IAEF,MAAM,WAAY,SAAQ,WAAW;QACnC,KAAK,CAAuB;QAC5B,SAAS,GAAkC,IAAI,CAAC;QAChD,cAAc,GAAoB,IAAI,CAAC;QACvC,UAAU,GAA2B,IAAI,CAAC;QAC1C,UAAU,GAAG,KAAK,CAAC;QACnB,2DAA2D;QAC3D,oEAAoE;QACpE,gEAAgE;QAChE,eAAe,GAAG,KAAK,CAAC;QACxB,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;QACjD,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE1C;YACE,KAAK,EAAE,CAAC;YACR,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,CAAC;QAED,iBAAiB;YACf,0DAA0D;YAC1D,uEAAuE;YACvE,yEAAyE;YACzE,kCAAkC;YAClC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,CAAC,UAAU;gBAAE,OAAO;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YAEvB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,SAAS,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,KAAmB,EAAE,GAAG,WAAW,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,mBAAmB,CAAC,WAAW,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,sDAAsD;YACtD,sDAAsD;YACtD,sDAAsD;YACtD,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAE5B,MAAM,IAAI,GAAG,IAAI,CAAC;YAElB,MAAM,GAAG,GAAqB;gBAC5B,IAAI,EAAE,IAAI;gBACV,kEAAkE;gBAClE,sDAAsD;gBACtD,0CAA0C;gBAC1C,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAY,EAAE,YAAY,GAAG,EAAE;oBAClC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC,CAAC,EAAE,CAAC;wBACP,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;wBAC3C,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC;wBACpD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjC,CAAC;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC;aACF,CAAC;YAEF,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAE7D,iEAAiE;YACjE,6BAA6B;YAC7B,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;oBAC7C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,aAAc,CAAC,CAAC;wBAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAc,CAAC,IAAI,EAAE,CAAC;wBAChE,IAAI,CAAC;4BAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,aAAc,CAAC,IAAI,QAAQ,CAAC,CAAC;oBAChE,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpE,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,EAAE;gBAChC,MAAM,CAAC,IAAI,CAAC,SAAU,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,oBAAoB;YAClB,wEAAwE;YACxE,0EAA0E;YAC1E,yEAAyE;YACzE,0EAA0E;YAC1E,4DAA4D;YAC5D,IAAI,IAAI,CAAC,eAAe;gBAAE,OAAO;YACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC,IAAI,CAAC,eAAe;oBAAE,OAAO,CAAC,+BAA+B;gBAClE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,IAAI,CAAC,WAAW;oBAAE,OAAO,CAAC,+BAA+B;gBAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,mDAAmD;QACnD,SAAS;YACP,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;KAEF;IAED,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5C,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,gCAAgC;AAEhC,SAAS,eAAe,CACtB,KAA6B,EAC7B,OAAe,EACf,SAAkB;IAElB,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACnB,IAAI,KAAgB,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;YAC5B,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,+BAA+B;QAC/B,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,OAAO,EAAa,CAAC;AACjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAGvB,CAAC;AAEJ,SAAS,oBAAoB,CAC3B,CAAmB,EACnB,CAAmB;IAEnB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAmB;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,yBAAyB;AACzB,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -18,7 +18,7 @@
18
18
  * Template usage:
19
19
  * html`<ul>${() => each(items(), t => t.id, t => html`<li>${t.text}</li>`)}</ul>`
20
20
  */
21
- import { type TemplateResult } from "./html.js";
21
+ import type { TemplateResult } from "./html/template-types.js";
22
22
  export type EachKey = string | number;
23
23
  /**
24
24
  * Marker recognised by the html binder.
package/dist/src/each.js CHANGED
@@ -18,7 +18,7 @@
18
18
  * Template usage:
19
19
  * html`<ul>${() => each(items(), t => t.id, t => html`<li>${t.text}</li>`)}</ul>`
20
20
  */
21
- import { html } from "./html.js";
21
+ import { html } from "./html/template.js";
22
22
  export const isEachResult = (v) => typeof v === "object" &&
23
23
  v !== null &&
24
24
  v._madoEach === true;
@@ -1 +1 @@
1
- {"version":3,"file":"each.js","sourceRoot":"","sources":["../../src/each.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,WAAW,CAAC;AAetD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAU,EAAmB,EAAE,CAC1D,OAAO,CAAC,KAAK,QAAQ;IACrB,CAAC,KAAK,IAAI;IACT,CAAgB,CAAC,SAAS,KAAK,IAAI,CAAC;AAEvC,MAAM,UAAU,IAAI,CAClB,KAAmB,EACnB,KAA0C,EAC1C,MAAkD;IAElD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAClB,KAAmB,EACnB,KAA0C,EAC1C,MAAkD;IAElD,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"each.js","sourceRoot":"","sources":["../../src/each.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAgB1C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAU,EAAmB,EAAE,CAC1D,OAAO,CAAC,KAAK,QAAQ;IACrB,CAAC,KAAK,IAAI;IACT,CAAgB,CAAC,SAAS,KAAK,IAAI,CAAC;AAEvC,MAAM,UAAU,IAAI,CAClB,KAAmB,EACnB,KAA0C,EAC1C,MAAkD;IAElD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAClB,KAAmB,EACnB,KAA0C,EAC1C,MAAkD;IAElD,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7C,CAAC"}
@@ -411,7 +411,7 @@ function applySingleAttrValue(el, name, value) {
411
411
  function applyAttrDirective(el, name, directive) {
412
412
  if (directive._madoDirective === "ref") {
413
413
  if (name !== "ref") {
414
- throw new Error("[mado] ref() directive must be used as ref=${ref(...)}.");
414
+ throw new Error(`[mado] ref() directive must be used as ref=\${ref(...)}.`);
415
415
  }
416
416
  el.removeAttribute(name);
417
417
  const dispose = directive.callback(el);
@@ -423,13 +423,13 @@ function applyAttrDirective(el, name, directive) {
423
423
  }
424
424
  if (directive._madoDirective === "classMap") {
425
425
  if (name !== "class") {
426
- throw new Error("[mado] classMap() directive must be used as class=${classMap(...)}.");
426
+ throw new Error(`[mado] classMap() directive must be used as class=\${classMap(...)}.`);
427
427
  }
428
428
  return applyClassMap(el, directive.value);
429
429
  }
430
430
  if (directive._madoDirective === "styleMap") {
431
431
  if (name !== "style") {
432
- throw new Error("[mado] styleMap() directive must be used as style=${styleMap(...)}.");
432
+ throw new Error(`[mado] styleMap() directive must be used as style=\${styleMap(...)}.`);
433
433
  }
434
434
  return applyStyleMap(el, directive.value);
435
435
  }