@madojs/mado 0.11.1 → 0.12.0

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 +102 -25
  2. package/CHANGELOG.md +158 -1
  3. package/README.md +135 -172
  4. package/dist/src/component.d.ts +3 -2
  5. package/dist/src/component.js +98 -6
  6. package/dist/src/component.js.map +1 -1
  7. package/dist/src/css.js +34 -5
  8. package/dist/src/css.js.map +1 -1
  9. package/dist/src/head.d.ts +6 -6
  10. package/dist/src/head.js +6 -6
  11. package/dist/src/html/parser.d.ts +1 -1
  12. package/dist/src/html/parser.js +1 -1
  13. package/dist/src/html/template.js +24 -10
  14. package/dist/src/html/template.js.map +1 -1
  15. package/dist/src/index.d.ts +8 -4
  16. package/dist/src/index.js +13 -3
  17. package/dist/src/index.js.map +1 -1
  18. package/dist/src/page.d.ts +62 -28
  19. package/dist/src/page.js +5 -0
  20. package/dist/src/page.js.map +1 -1
  21. package/dist/src/resource.js +2 -1
  22. package/dist/src/resource.js.map +1 -1
  23. package/dist/src/router/base.d.ts +65 -0
  24. package/dist/src/router/base.js +168 -0
  25. package/dist/src/router/base.js.map +1 -0
  26. package/dist/src/router/manifest.js +75 -31
  27. package/dist/src/router/manifest.js.map +1 -1
  28. package/dist/src/router/match.d.ts +16 -2
  29. package/dist/src/router/match.js +41 -1
  30. package/dist/src/router/match.js.map +1 -1
  31. package/dist/src/router/navigation.js +58 -9
  32. package/dist/src/router/navigation.js.map +1 -1
  33. package/dist/src/static-runtime.d.ts +81 -0
  34. package/dist/src/static-runtime.js +209 -0
  35. package/dist/src/static-runtime.js.map +1 -0
  36. package/dist/src/vite/index.d.ts +31 -3
  37. package/dist/src/vite/index.js +49 -18
  38. package/dist/src/vite/index.js.map +1 -1
  39. package/docs/README.md +5 -8
  40. package/docs/architecture/adr/0001-browser-static-snapshots.md +132 -0
  41. package/docs/en/00-the-mado-way.md +1 -1
  42. package/docs/en/01-quickstart.md +183 -0
  43. package/docs/en/10-pages-and-components.md +271 -0
  44. package/docs/en/11-templates-and-signals.md +211 -0
  45. package/docs/en/12-routing.md +229 -0
  46. package/docs/en/13-data.md +225 -0
  47. package/docs/en/14-forms.md +244 -0
  48. package/docs/en/15-static-snapshots.md +181 -0
  49. package/docs/en/{10-app-architecture.md → 16-app-architecture.md} +53 -2
  50. package/docs/en/{13-deployment.md → 20-deployment.md} +59 -10
  51. package/docs/en/{14-testing.md → 22-testing.md} +6 -5
  52. package/docs/en/23-cookbook.md +292 -0
  53. package/docs/en/{18-api-freeze-map.md → 30-api-freeze-map.md} +12 -3
  54. package/docs/en/{20-v1-stability.md → 32-v1-stability.md} +3 -3
  55. package/docs/en/40-llm-guide.md +776 -0
  56. package/docs/en/{06-for-backenders.md → 41-for-backenders.md} +15 -16
  57. package/docs/en/{05-why-mado.md → 42-why-mado.md} +1 -1
  58. package/docs/en/README.md +97 -27
  59. package/docs/recipes/nginx/Containerfile +26 -0
  60. package/docs/recipes/nginx/nginx.conf +42 -0
  61. package/llms.txt +246 -211
  62. package/package.json +17 -10
  63. package/scripts/bake.mjs +4 -569
  64. package/scripts/cli/generate.mjs +55 -5
  65. package/scripts/cli/help.mjs +11 -5
  66. package/scripts/cli/index.mjs +20 -4
  67. package/scripts/cli/init.mjs +7 -2
  68. package/scripts/cli/release.mjs +20 -68
  69. package/scripts/docs-lint.mjs +170 -0
  70. package/scripts/package-smoke.mjs +67 -9
  71. package/scripts/preview.mjs +95 -6
  72. package/scripts/size-budget.mjs +5 -1
  73. package/scripts/static/browser.mjs +654 -0
  74. package/scripts/static/discover.mjs +281 -0
  75. package/scripts/static/output.mjs +141 -0
  76. package/scripts/static/serialize.mjs +212 -0
  77. package/scripts/static/server.mjs +167 -0
  78. package/scripts/static.mjs +191 -0
  79. package/starters/default/README.md +57 -55
  80. package/starters/default/package.json +3 -9
  81. package/starters/default/src/app.routes.ts +20 -33
  82. package/starters/default/src/components/feature-card.component.ts +40 -0
  83. package/starters/default/src/components/live-counter.component.ts +57 -0
  84. package/starters/default/src/content/guides.ts +55 -0
  85. package/starters/default/src/main.ts +9 -13
  86. package/starters/default/src/pages/app.page.ts +41 -0
  87. package/starters/default/src/pages/guide.page.ts +40 -0
  88. package/starters/default/src/pages/home.page.ts +49 -0
  89. package/starters/default/src/pages/not-found.page.ts +18 -0
  90. package/starters/default/src/styles/document.css +39 -0
  91. package/starters/default/src/styles/reset.css +37 -0
  92. package/starters/default/src/styles/tokens.css +30 -0
  93. package/starters/default/src/styles.d.ts +3 -1
  94. package/starters/default/src/vite-env.d.ts +1 -1
  95. package/starters/default/vite.config.ts +14 -1
  96. package/starters/modular/README.md +142 -0
  97. package/starters/modular/index.html +13 -0
  98. package/starters/modular/package.json +30 -0
  99. package/starters/modular/src/app.routes.ts +39 -0
  100. package/starters/{default → modular}/src/layouts/app-shell.layout.ts +8 -5
  101. package/starters/{default → modular}/src/layouts/auth-shell.layout.ts +3 -3
  102. package/starters/modular/src/main.ts +16 -0
  103. package/starters/{default → modular}/src/modules/billing/pages/invoices-list.page.ts +3 -3
  104. package/starters/{default → modular}/src/modules/home/home.page.ts +5 -7
  105. package/starters/modular/src/modules/home/not-found.page.ts +14 -0
  106. package/starters/modular/src/styles.d.ts +1 -0
  107. package/starters/modular/src/vite-env.d.ts +1 -0
  108. package/starters/modular/tsconfig.json +24 -0
  109. package/starters/modular/vite.config.ts +131 -0
  110. package/TODO.md +0 -79
  111. package/docs/en/01-routing.md +0 -152
  112. package/docs/en/02-project-layout.md +0 -124
  113. package/docs/en/03-static-bake.md +0 -249
  114. package/docs/en/04-ide-setup.md +0 -162
  115. package/docs/en/07-llm-pitfalls.md +0 -724
  116. package/docs/en/08-llm-zero-history-test.md +0 -56
  117. package/docs/en/09-shadow-vs-light-dom.md +0 -174
  118. package/docs/en/11-layouts.md +0 -113
  119. package/docs/en/12-auth-and-api.md +0 -124
  120. package/docs/en/16-bake-cookbook.md +0 -100
  121. package/docs/en/17-shadow-dom-forms.md +0 -192
  122. package/docs/fr/00-the-mado-way.md +0 -85
  123. package/docs/fr/01-routing.md +0 -120
  124. package/docs/fr/02-project-layout.md +0 -84
  125. package/docs/fr/03-static-bake.md +0 -289
  126. package/docs/fr/04-ide-setup.md +0 -162
  127. package/docs/fr/05-why-mado.md +0 -193
  128. package/docs/fr/06-for-backenders.md +0 -438
  129. package/docs/fr/07-llm-pitfalls.md +0 -625
  130. package/docs/fr/08-llm-zero-history-test.md +0 -38
  131. package/docs/fr/09-shadow-vs-light-dom.md +0 -65
  132. package/docs/fr/10-app-architecture.md +0 -138
  133. package/docs/fr/11-layouts.md +0 -47
  134. package/docs/fr/12-auth-and-api.md +0 -76
  135. package/docs/fr/13-deployment.md +0 -57
  136. package/docs/fr/14-testing.md +0 -41
  137. package/docs/fr/15-error-handling.md +0 -50
  138. package/docs/fr/16-bake-cookbook.md +0 -88
  139. package/docs/fr/17-shadow-dom-forms.md +0 -196
  140. package/docs/fr/18-api-freeze-map.md +0 -63
  141. package/docs/fr/19-reactivity-ordering.md +0 -97
  142. package/docs/fr/20-v1-stability.md +0 -88
  143. package/docs/fr/README.md +0 -27
  144. package/docs/ru/00-the-mado-way.md +0 -84
  145. package/docs/ru/01-routing.md +0 -119
  146. package/docs/ru/02-project-layout.md +0 -84
  147. package/docs/ru/03-static-bake.md +0 -250
  148. package/docs/ru/04-ide-setup.md +0 -144
  149. package/docs/ru/05-why-mado.md +0 -193
  150. package/docs/ru/06-for-backenders.md +0 -428
  151. package/docs/ru/07-llm-pitfalls.md +0 -624
  152. package/docs/ru/08-llm-zero-history-test.md +0 -57
  153. package/docs/ru/09-shadow-vs-light-dom.md +0 -63
  154. package/docs/ru/10-app-architecture.md +0 -152
  155. package/docs/ru/11-layouts.md +0 -47
  156. package/docs/ru/12-auth-and-api.md +0 -75
  157. package/docs/ru/13-deployment.md +0 -66
  158. package/docs/ru/14-testing.md +0 -50
  159. package/docs/ru/15-error-handling.md +0 -56
  160. package/docs/ru/16-bake-cookbook.md +0 -95
  161. package/docs/ru/17-shadow-dom-forms.md +0 -193
  162. package/docs/ru/18-api-freeze-map.md +0 -64
  163. package/docs/ru/19-reactivity-ordering.md +0 -95
  164. package/docs/ru/20-v1-stability.md +0 -82
  165. package/docs/ru/README.md +0 -25
  166. package/docs/uk/00-the-mado-way.md +0 -82
  167. package/docs/uk/01-routing.md +0 -76
  168. package/docs/uk/02-project-layout.md +0 -73
  169. package/docs/uk/03-static-bake.md +0 -48
  170. package/docs/uk/04-ide-setup.md +0 -26
  171. package/docs/uk/05-why-mado.md +0 -34
  172. package/docs/uk/06-for-backenders.md +0 -55
  173. package/docs/uk/07-llm-pitfalls.md +0 -145
  174. package/docs/uk/08-llm-zero-history-test.md +0 -34
  175. package/docs/uk/09-shadow-vs-light-dom.md +0 -58
  176. package/docs/uk/10-app-architecture.md +0 -97
  177. package/docs/uk/11-layouts.md +0 -47
  178. package/docs/uk/12-auth-and-api.md +0 -70
  179. package/docs/uk/13-deployment.md +0 -40
  180. package/docs/uk/14-testing.md +0 -34
  181. package/docs/uk/15-error-handling.md +0 -32
  182. package/docs/uk/16-bake-cookbook.md +0 -36
  183. package/docs/uk/17-shadow-dom-forms.md +0 -193
  184. package/docs/uk/18-api-freeze-map.md +0 -61
  185. package/docs/uk/19-reactivity-ordering.md +0 -95
  186. package/docs/uk/20-v1-stability.md +0 -83
  187. package/docs/uk/README.md +0 -27
  188. package/starters/default/src/modules/home/not-found.page.ts +0 -11
  189. /package/docs/en/{15-error-handling.md → 21-error-handling.md} +0 -0
  190. /package/docs/en/{19-reactivity-ordering.md → 31-reactivity-ordering.md} +0 -0
  191. /package/starters/{default → modular}/.editorconfig +0 -0
  192. /package/starters/{default → modular}/eslint.config.mjs +0 -0
  193. /package/starters/{default → modular}/public/favicon.svg +0 -0
  194. /package/starters/{default → modular}/src/modules/auth/_contracts/auth-api.types.ts +0 -0
  195. /package/starters/{default → modular}/src/modules/auth/auth.connector.ts +0 -0
  196. /package/starters/{default → modular}/src/modules/auth/auth.guard.ts +0 -0
  197. /package/starters/{default → modular}/src/modules/auth/auth.public.ts +0 -0
  198. /package/starters/{default → modular}/src/modules/auth/auth.routes.ts +0 -0
  199. /package/starters/{default → modular}/src/modules/auth/auth.service.ts +0 -0
  200. /package/starters/{default → modular}/src/modules/auth/auth.types.ts +0 -0
  201. /package/starters/{default → modular}/src/modules/auth/login.page.ts +0 -0
  202. /package/starters/{default → modular}/src/modules/billing/_contracts/stripe.types.ts +0 -0
  203. /package/starters/{default → modular}/src/modules/billing/api/stripe.connector.ts +0 -0
  204. /package/starters/{default → modular}/src/modules/billing/billing.public.ts +0 -0
  205. /package/starters/{default → modular}/src/modules/billing/billing.routes.ts +0 -0
  206. /package/starters/{default → modular}/src/modules/billing/billing.types.ts +0 -0
  207. /package/starters/{default → modular}/src/modules/billing/components/invoice-status-badge.component.ts +0 -0
  208. /package/starters/{default → modular}/src/modules/billing/data/invoices.resource.ts +0 -0
  209. /package/starters/{default → modular}/src/modules/billing/pages/invoice-detail.page.ts +0 -0
  210. /package/starters/{default → modular}/src/shared/http/http-client.ts +0 -0
  211. /package/starters/{default → modular}/src/shared/http/http-error.ts +0 -0
  212. /package/starters/{default → modular}/src/shared/http/interceptors.ts +0 -0
  213. /package/starters/{default → modular}/src/shared/lib/format-date.ts +0 -0
  214. /package/starters/{default → modular}/src/shared/styles/content.css +0 -0
  215. /package/starters/{default → modular}/src/shared/styles/reset.css +0 -0
  216. /package/starters/{default → modular}/src/shared/styles/shell.css +0 -0
  217. /package/starters/{default → modular}/src/shared/styles/tokens.css +0 -0
  218. /package/starters/{default → modular}/src/shared/ui/x-button.component.ts +0 -0
  219. /package/starters/{default → modular}/src/shared/ui/x-spinner.component.ts +0 -0
@@ -261,21 +261,20 @@ This is like `context.WithValue` / `ctx.Value` in Go, but reactive.
261
261
 
262
262
  ---
263
263
 
264
- ## SEO — not SSR, but `bake` (like `templ generate` in Go)
264
+ ## SEO — not SSR, but static snapshots (like `templ generate` in Go)
265
265
 
266
- If you're used to server-side rendering for SEO, in Mado this is solved differently: **prerender at build time**.
266
+ If you're used to server-side rendering for SEO, in Mado this is solved differently: **browser-rendered prerender at build time**.
267
267
 
268
268
  ```ts
269
269
  // src/modules/<module>/pages/product.ts
270
270
  export default page({
271
- bake: {
272
- paths: () => api.allProductSlugs(), // build-time fetch
273
- data: ({ slug }) => api.getProduct(slug),
274
- revalidate: 3600,
271
+ static: {
272
+ paths: () => api.allProductSlugs(), // build-time fetch
273
+ initialData: ({ slug }) => api.getProduct(slug),
275
274
  },
276
- head: ({ slug }, data) => ({
275
+ head: (_, data) => ({
277
276
  description: data.description,
278
- canonical: `/product/${slug}`,
277
+ canonical: `/product/${data.slug}`,
279
278
  og: { title: data.name, image: data.image },
280
279
  }),
281
280
  view: ({ params }) => html`<x-product data-slug=${params.slug} />`,
@@ -283,12 +282,12 @@ export default page({
283
282
  ```
284
283
 
285
284
  ```bash
286
- npm run bake # → out/product/iphone-15/index.html (+ sitemap)
285
+ npm run release # → out/product/iphone-15/index.html (+ sitemap)
287
286
  ```
288
287
 
289
288
  The crawler sees ready-made HTML with meta tags. The user sees the same thing + interactivity after JS loads.
290
289
 
291
- More details: [`03-static-bake.md`](./03-static-bake.md).
290
+ More details: [`15-static-snapshots.md`](./15-static-snapshots.md).
292
291
 
293
292
  ---
294
293
 
@@ -403,7 +402,8 @@ Module connectors build on this transport and map DTOs to domain types.
403
402
 
404
403
  - **Hooks and hook rules.** Not in Mado. Signals are ordinary functions.
405
404
  - **VDOM and reconciliation.** None. Signals update the DOM directly, surgically.
406
- - **Webpack/Vite configs.** No build. `tsc browser`.
405
+ - **Webpack/Babel configs.** Vite is the transport; the starter ships one
406
+ three-line `vite.config.ts` with `mado()`.
407
407
  - **`useEffect` dependency arrays.** `effect()` sees what you read on its own.
408
408
  - **State management libraries** (Redux/Zustand). Signals + context.
409
409
  - **CSS-in-JS transformations.** Shadow DOM + `css\`\`` + cssVars.
@@ -418,7 +418,7 @@ These are new concepts. Not scary, but they are additions to your React/Vue base
418
418
  1. **Custom Elements / Shadow DOM.** `<x-foo>` is not a div, it is a full-fledged element with its own DOM. Slots, scoped CSS. One evening of MDN reading.
419
419
  2. **`attribute` vs `property`.** Attribute is a string in HTML (`data-id="5"`), property is a JS property (`el.id = 5`). `?attr=${flag}` and `.prop=${value}` in templates refer to different things. Main rule: **numbers/objects/arrays — via `.prop`, flags — via `?attr`, strings — via `attr`**.
420
420
  3. **Signals.** If it's your first time — you'll get stuck for 10 minutes, then it's easier than hooks.
421
- 4. **`html\`\``-templates.** It's just a JS function with highlighting via [lit-plugin](./04-ide-setup.md). Not magic.
421
+ 4. **`html\`\``-templates.** It's just a JS function with highlighting via [lit-plugin](./01-quickstart.md#4-ide-setup). Not magic.
422
422
 
423
423
  Everything else — standard browser + TypeScript.
424
424
 
@@ -426,7 +426,6 @@ Everything else — standard browser + TypeScript.
426
426
 
427
427
  ## What's missing (honestly)
428
428
 
429
- - No hot reload, only full reload via SSE. Sufficient for most cases, but not like Vite.
430
429
  - No browser extension dev-tools. Use `localStorage.madoDebug = '1'` + console.
431
430
  - No StackBlitz starters (yet).
432
431
  - No AI assistant that knows Mado as well as React. When in doubt — read `src/`, it's not scary.
@@ -435,9 +434,9 @@ Everything else — standard browser + TypeScript.
435
434
 
436
435
  ## Further reading
437
436
 
438
- - **[`01-routing.md`](./01-routing.md)** — the router in detail.
439
- - **[`02-project-layout.md`](./02-project-layout.md)** — project structure.
440
- - **[`03-static-bake.md`](./03-static-bake.md)** — SEO without SSR.
437
+ - **[`12-routing.md`](./12-routing.md)** — the router in detail.
438
+ - **[`16-app-architecture.md`](./16-app-architecture.md)** — project structure.
439
+ - **[`15-static-snapshots.md`](./15-static-snapshots.md)** — SEO without SSR.
441
440
  - **External `madojs-examples` workspace** — full demos (landing + admin).
442
441
 
443
442
  If something is unclear — open an issue, or just open the source. It really is readable in an evening.
@@ -39,7 +39,7 @@ If your case does not fall into the last point — Mado is most likely not the b
39
39
  | Router | none, you need to find one (`@lit-labs/router`, etc) | included: `routes()` + layout groups + prefetch |
40
40
  | Data fetching | none, you need to assemble it | `resource()` + `mutation()` + glob invalidation |
41
41
  | Forms | none | `useForm()` with HTML-like constraints |
42
- | SEO / static | complex (`@lit-labs/ssr`) | `bake` (linkedom) + edge-prerender |
42
+ | SEO / static | complex (`@lit-labs/ssr`) | `mado static` (real Chromium snapshot + DSD) |
43
43
  | Build | needs framework-specific build plugins | Vite transport + native runtime |
44
44
  | Code style | classes + decorators | functions + tagged templates |
45
45
  | Ecosystem | real (Shoelace, Material Web, etc.) | none |
package/docs/en/README.md CHANGED
@@ -1,27 +1,97 @@
1
- # Mado docs — English
2
-
3
- English documentation set.
4
-
5
- | Section | Source |
6
- | ----------------------- | ------------------------------------------------------------ |
7
- | The Mado way | [00-the-mado-way.md](./00-the-mado-way.md) |
8
- | Routing | [01-routing.md](./01-routing.md) |
9
- | Project layout | [02-project-layout.md](./02-project-layout.md) |
10
- | Static bake & SEO | [03-static-bake.md](./03-static-bake.md) |
11
- | IDE setup | [04-ide-setup.md](./04-ide-setup.md) |
12
- | Why Mado | [05-why-mado.md](./05-why-mado.md) |
13
- | For backenders | [06-for-backenders.md](./06-for-backenders.md) |
14
- | LLM pitfalls | [07-llm-pitfalls.md](./07-llm-pitfalls.md) |
15
- | LLM zero-history test | [08-llm-zero-history-test.md](./08-llm-zero-history-test.md) |
16
- | Shadow DOM vs Light DOM | [09-shadow-vs-light-dom.md](./09-shadow-vs-light-dom.md) |
17
- | App architecture | [10-app-architecture.md](./10-app-architecture.md) |
18
- | Layouts | [11-layouts.md](./11-layouts.md) |
19
- | Auth and API | [12-auth-and-api.md](./12-auth-and-api.md) |
20
- | Deployment | [13-deployment.md](./13-deployment.md) |
21
- | Testing | [14-testing.md](./14-testing.md) |
22
- | Error handling | [15-error-handling.md](./15-error-handling.md) |
23
- | Bake cookbook | [16-bake-cookbook.md](./16-bake-cookbook.md) |
24
- | Shadow DOM + Forms | [17-shadow-dom-forms.md](./17-shadow-dom-forms.md) |
25
- | API freeze map | [18-api-freeze-map.md](./18-api-freeze-map.md) |
26
- | Reactivity ordering | [19-reactivity-ordering.md](./19-reactivity-ordering.md) |
27
- | v1 stability | [20-v1-stability.md](./20-v1-stability.md) |
1
+ # Mado documentation
2
+
3
+ > Canonical project documentation. English-only since v0.12.
4
+
5
+ Read top-to-bottom for a complete mental model, or jump to the
6
+ section you need from the matrix below.
7
+
8
+ ## Reading paths
9
+
10
+ - **First time here?** Start with [00 — The Mado way](./00-the-mado-way.md)
11
+ and then [01 — Quickstart](./01-quickstart.md).
12
+ - **Already shipped one Mado app?** Skim
13
+ [10 Pages and components](./10-pages-and-components.md) and
14
+ [30 API freeze map](./30-api-freeze-map.md).
15
+ - **Coming from React / Vue / Next?**
16
+ [42 Why Mado](./42-why-mado.md) and
17
+ [40 LLM guide](./40-llm-guide.md) cover the mental shifts.
18
+ - **Backend developer?** [41 — For backenders](./41-for-backenders.md)
19
+ is the express lane.
20
+
21
+ ## Map
22
+
23
+ ### Start here
24
+
25
+ | Section | File |
26
+ | ----------------------------- | ------------------------------------------ |
27
+ | The Mado way (philosophy) | [00-the-mado-way.md](./00-the-mado-way.md) |
28
+ | Quickstart | [01-quickstart.md](./01-quickstart.md) |
29
+
30
+ ### Concepts (read once)
31
+
32
+ | Section | File |
33
+ | ---------------------------------- | ---------------------------------------------------------- |
34
+ | Pages and components | [10-pages-and-components.md](./10-pages-and-components.md) |
35
+ | Templates and signals | [11-templates-and-signals.md](./11-templates-and-signals.md) |
36
+ | Routing | [12-routing.md](./12-routing.md) |
37
+ | Data — `resource()` / `mutation()` | [13-data.md](./13-data.md) |
38
+ | Forms | [14-forms.md](./14-forms.md) |
39
+ | Static snapshots | [15-static-snapshots.md](./15-static-snapshots.md) |
40
+ | App architecture | [16-app-architecture.md](./16-app-architecture.md) |
41
+
42
+ ### Production
43
+
44
+ | Section | File |
45
+ | ------------------ | ---------------------------------------------- |
46
+ | Deployment | [20-deployment.md](./20-deployment.md) |
47
+ | Error handling | [21-error-handling.md](./21-error-handling.md) |
48
+ | Testing | [22-testing.md](./22-testing.md) |
49
+ | Cookbook | [23-cookbook.md](./23-cookbook.md) |
50
+
51
+ ### Reference
52
+
53
+ | Section | File |
54
+ | ---------------------- | ---------------------------------------------------------- |
55
+ | API freeze map | [30-api-freeze-map.md](./30-api-freeze-map.md) |
56
+ | Reactivity ordering | [31-reactivity-ordering.md](./31-reactivity-ordering.md) |
57
+ | v1 stability contract | [32-v1-stability.md](./32-v1-stability.md) |
58
+
59
+ ### Meta
60
+
61
+ | Section | File |
62
+ | ------------------------------------------------------ | ------------------------------------------ |
63
+ | LLM guide (pitfalls + zero-history test) | [40-llm-guide.md](./40-llm-guide.md) |
64
+ | For backenders | [41-for-backenders.md](./41-for-backenders.md) |
65
+ | Why Mado vs Lit / Solid / Svelte / htmx / React | [42-why-mado.md](./42-why-mado.md) |
66
+
67
+ ## Migrating from v0.11.x doc layout
68
+
69
+ The 0.12 release reorganised `docs/en/` into the groups above and
70
+ collapsed several overlapping files. Old → new map:
71
+
72
+ <!-- docs-lint:allow-legacy-mention -->
73
+
74
+ | Old (v0.11.x) | New (v0.12) |
75
+ | ----------------------------------- | ---------------------------------------------------------- |
76
+ | `01-routing.md` | `12-routing.md` |
77
+ | `02-project-layout.md` | merged into `16-app-architecture.md` |
78
+ | `03-static-bake.md` | `15-static-snapshots.md` |
79
+ | `04-ide-setup.md` | merged into `01-quickstart.md` |
80
+ | `05-why-mado.md` | `42-why-mado.md` |
81
+ | `06-for-backenders.md` | `41-for-backenders.md` |
82
+ | `07-llm-pitfalls.md` | merged into `40-llm-guide.md` |
83
+ | `08-llm-zero-history-test.md` | merged into `40-llm-guide.md` |
84
+ | `09-shadow-vs-light-dom.md` | replaced by `10-pages-and-components.md` |
85
+ | `10-app-architecture.md` | `16-app-architecture.md` |
86
+ | `11-layouts.md` | merged into `12-routing.md` |
87
+ | `12-auth-and-api.md` | merged into `13-data.md` |
88
+ | `13-deployment.md` | `20-deployment.md` |
89
+ | `14-testing.md` | `22-testing.md` |
90
+ | `15-error-handling.md` | `21-error-handling.md` |
91
+ | `16-bake-cookbook.md` | `23-cookbook.md` |
92
+ | `17-shadow-dom-forms.md` | merged into `14-forms.md` |
93
+ | `18-api-freeze-map.md` | `30-api-freeze-map.md` |
94
+ | `19-reactivity-ordering.md` | `31-reactivity-ordering.md` |
95
+ | `20-v1-stability.md` | `32-v1-stability.md` |
96
+
97
+ <!-- /docs-lint:allow-legacy-mention -->
@@ -0,0 +1,26 @@
1
+ # Optional generated-app container recipe.
2
+ #
3
+ # Usage from your app root after copying this directory to ./docker:
4
+ # docker build -f docker/Containerfile -t myapp .
5
+
6
+ FROM node:24-alpine AS builder
7
+ WORKDIR /app
8
+
9
+ COPY package.json package-lock.json* pnpm-lock.yaml* ./
10
+ RUN if [ -f pnpm-lock.yaml ]; then \
11
+ corepack enable && pnpm install --frozen-lockfile; \
12
+ elif [ -f package-lock.json ]; then \
13
+ npm ci; \
14
+ else \
15
+ npm install; \
16
+ fi
17
+
18
+ COPY . .
19
+ RUN npm run release
20
+
21
+ FROM nginx:alpine AS runtime
22
+ COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
23
+ COPY --from=builder /app/out /usr/share/nginx/html
24
+
25
+ EXPOSE 80
26
+ HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost/ >/dev/null || exit 1
@@ -0,0 +1,42 @@
1
+ # Static nginx config for a Mado app released with `mado release`.
2
+ #
3
+ # Serves:
4
+ # - Vite hashed assets from /assets/ with immutable caching;
5
+ # - precompressed .gz files written by `mado release`;
6
+ # - baked route HTML when present;
7
+ # - index.html as SPA fallback for client-only routes.
8
+
9
+ server {
10
+ listen 80;
11
+ server_name _;
12
+ root /usr/share/nginx/html;
13
+ index index.html;
14
+
15
+ gzip_static on;
16
+ # brotli_static on; # requires ngx_brotli module
17
+
18
+ gzip on;
19
+ gzip_types text/plain text/css application/javascript application/json image/svg+xml;
20
+ gzip_min_length 1024;
21
+ gzip_comp_level 6;
22
+
23
+ location ^~ /assets/ {
24
+ add_header Cache-Control "public, max-age=31536000, immutable";
25
+ try_files $uri =404;
26
+ }
27
+
28
+ location ~* \.html$ {
29
+ add_header Cache-Control "no-cache, must-revalidate";
30
+ try_files $uri =404;
31
+ }
32
+
33
+ location ~* \.(svg|png|jpe?g|gif|ico|webp|avif|woff2?)$ {
34
+ add_header Cache-Control "public, max-age=86400";
35
+ try_files $uri =404;
36
+ }
37
+
38
+ location / {
39
+ add_header Cache-Control "no-cache, must-revalidate";
40
+ try_files $uri $uri/ /index.html;
41
+ }
42
+ }