generator-white-label 9.0.0 → 10.0.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 (98) hide show
  1. package/CLI.md +13 -17
  2. package/EXISTING_APPLICATIONS.md +155 -0
  3. package/PACKAGE_MANAGERS.md +6 -4
  4. package/README.md +135 -153
  5. package/app/404.ts +28 -0
  6. package/app/README.md +19 -7
  7. package/{scaffold/no-jsx/app → app}/assets/script/index.ts +1 -0
  8. package/{scaffold/no-jsx/app → app}/assets/script/tasks/TaskView.ts +1 -1
  9. package/app/assets/view/CodeBlock.ts +15 -0
  10. package/app/assets/view/examples/tasks/TaskExample.ts +50 -0
  11. package/app/assets/view/examples/tasks/task-state.ts +1 -1
  12. package/app/assets/view/layout/SiteFooter.ts +11 -0
  13. package/app/assets/view/layout/SiteHeader.ts +17 -0
  14. package/app/assets/view/page-data.ts +2 -2
  15. package/app/assets/view/sections/GettingStartedSection.ts +26 -0
  16. package/app/assets/view/sections/HeroSection.ts +15 -0
  17. package/app/assets/view/sections/LiveExampleSection.ts +24 -0
  18. package/app/assets/view/sections/PackageDocsSection.ts +69 -0
  19. package/app/assets/view/sections/{SourceGuideSection.tsx → SourceGuideSection.ts} +11 -16
  20. package/app/index.ts +50 -0
  21. package/cli/index.ts +4 -41
  22. package/dist/app/404.d.ts +1 -1
  23. package/dist/app/404.js +18 -2
  24. package/dist/app/404.js.map +1 -1
  25. package/dist/app/assets/script/index.d.ts +1 -6
  26. package/dist/app/assets/script/index.js +1 -6
  27. package/dist/app/assets/script/index.js.map +1 -1
  28. package/dist/app/assets/script/tasks/TaskView.d.ts +1 -6
  29. package/dist/app/assets/script/tasks/TaskView.js +2 -8
  30. package/dist/app/assets/script/tasks/TaskView.js.map +1 -1
  31. package/dist/app/assets/view/CodeBlock.d.ts +3 -3
  32. package/dist/app/assets/view/CodeBlock.js +4 -2
  33. package/dist/app/assets/view/CodeBlock.js.map +1 -1
  34. package/dist/app/assets/view/examples/tasks/TaskExample.d.ts +2 -8
  35. package/dist/app/assets/view/examples/tasks/TaskExample.js +41 -9
  36. package/dist/app/assets/view/examples/tasks/TaskExample.js.map +1 -1
  37. package/dist/app/assets/view/examples/tasks/task-state.d.ts +1 -1
  38. package/dist/app/assets/view/examples/tasks/task-state.js.map +1 -1
  39. package/dist/app/assets/view/layout/SiteFooter.d.ts +2 -2
  40. package/dist/app/assets/view/layout/SiteFooter.js +8 -3
  41. package/dist/app/assets/view/layout/SiteFooter.js.map +1 -1
  42. package/dist/app/assets/view/layout/SiteHeader.d.ts +2 -8
  43. package/dist/app/assets/view/layout/SiteHeader.js +14 -9
  44. package/dist/app/assets/view/layout/SiteHeader.js.map +1 -1
  45. package/dist/app/assets/view/page-data.d.ts +2 -2
  46. package/dist/app/assets/view/page-data.js.map +1 -1
  47. package/dist/app/assets/view/sections/GettingStartedSection.d.ts +1 -1
  48. package/dist/app/assets/view/sections/GettingStartedSection.js +21 -6
  49. package/dist/app/assets/view/sections/GettingStartedSection.js.map +1 -1
  50. package/dist/app/assets/view/sections/HeroSection.d.ts +2 -8
  51. package/dist/app/assets/view/sections/HeroSection.js +12 -9
  52. package/dist/app/assets/view/sections/HeroSection.js.map +1 -1
  53. package/dist/app/assets/view/sections/LiveExampleSection.d.ts +2 -6
  54. package/dist/app/assets/view/sections/LiveExampleSection.js +17 -7
  55. package/dist/app/assets/view/sections/LiveExampleSection.js.map +1 -1
  56. package/dist/app/assets/view/sections/PackageDocsSection.d.ts +1 -1
  57. package/dist/app/assets/view/sections/PackageDocsSection.js +57 -20
  58. package/dist/app/assets/view/sections/PackageDocsSection.js.map +1 -1
  59. package/dist/app/assets/view/sections/SourceGuideSection.d.ts +2 -7
  60. package/dist/app/assets/view/sections/SourceGuideSection.js +20 -8
  61. package/dist/app/assets/view/sections/SourceGuideSection.js.map +1 -1
  62. package/dist/app/index.d.ts +2 -8
  63. package/dist/app/index.js +36 -11
  64. package/dist/app/index.js.map +1 -1
  65. package/dist/cli/index.d.ts +0 -3
  66. package/dist/cli/index.js +4 -36
  67. package/dist/cli/index.js.map +1 -1
  68. package/dist/scaffold/index.d.ts +2 -13
  69. package/dist/scaffold/index.js +17 -53
  70. package/dist/scaffold/index.js.map +1 -1
  71. package/dist/scripts/build.js +97 -28
  72. package/dist/scripts/build.js.map +1 -1
  73. package/dist/server/handler.js +2 -9
  74. package/dist/server/handler.js.map +1 -1
  75. package/package.json +22 -22
  76. package/pnpm-workspace.yaml +0 -1
  77. package/scaffold/AGENTS.md +13 -8
  78. package/scaffold/index.ts +17 -57
  79. package/scripts/build.ts +90 -30
  80. package/server/handler.ts +2 -10
  81. package/tsconfig.site.json +1 -4
  82. package/app/404.tsx +0 -28
  83. package/app/assets/script/index.tsx +0 -13
  84. package/app/assets/script/tasks/TaskView.tsx +0 -24
  85. package/app/assets/view/CodeBlock.tsx +0 -17
  86. package/app/assets/view/examples/tasks/TaskExample.tsx +0 -63
  87. package/app/assets/view/layout/SiteFooter.tsx +0 -11
  88. package/app/assets/view/layout/SiteHeader.tsx +0 -23
  89. package/app/assets/view/sections/GettingStartedSection.tsx +0 -27
  90. package/app/assets/view/sections/HeroSection.tsx +0 -21
  91. package/app/assets/view/sections/LiveExampleSection.tsx +0 -29
  92. package/app/assets/view/sections/PackageDocsSection.tsx +0 -69
  93. package/app/index.tsx +0 -54
  94. package/scaffold/no-jsx/README.md +0 -73
  95. package/scaffold/no-jsx/app/404.ts +0 -10
  96. package/scaffold/no-jsx/app/assets/view/examples/tasks/TaskExample.ts +0 -39
  97. package/scaffold/no-jsx/app/index.ts +0 -58
  98. package/tsconfig.site.no-jsx.json +0 -24
@@ -1 +1 @@
1
- {"version":3,"file":"task-state.js","sourceRoot":"","sources":["../../../../../../app/assets/view/examples/tasks/task-state.ts"],"names":[],"mappings":"AAcA,MAAM,cAAc,GAAoD;IACpE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;IAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;IACf,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ;CACnC,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,WAAW,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,YAAY,KAAK,CAAC,MAAM,UAAU,CAAC;AACpG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IAClC,OAAO;QACH,MAAM,EAAE,KAAK;QACb,KAAK,EAAE;YACH,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAC;YACvD,EAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAC;SACtE;KACJ,CAAC;AACN,CAAC","sourcesContent":["/** Shared state shape used by build-time JSX and the browser application. */\nexport type TaskFilter = 'all' | 'active' | 'completed';\n\nexport interface TaskItem {\n complete: boolean;\n id: number;\n title: string;\n}\n\nexport interface TaskState extends Record<PropertyKey, unknown> {\n filter: TaskFilter;\n tasks: TaskItem[];\n}\n\nconst taskPredicates: Record<TaskFilter, (task: TaskItem) => boolean> = {\n active: task => !task.complete,\n all: () => true,\n completed: task => task.complete\n};\n\n/** Return the tasks visible for the current filter. */\nexport function getVisibleTasks(state: TaskState): TaskItem[] {\n return state.tasks.filter(taskPredicates[state.filter]);\n}\n\n/** Describe the currently rendered task result for assistive technology. */\nexport function describeTaskStatus(state: TaskState): string {\n const visible = getVisibleTasks(state).length;\n return `Showing ${visible} ${visible === 1 ? 'task' : 'tasks'} for the ${state.filter} filter.`;\n}\n\n/**\n * Return fresh demo data for each application instance.\n *\n * A factory avoids sharing mutable state between tests, pages, or future\n * server-side renders while keeping the initial HTML deterministic.\n */\nexport function createInitialTaskState(): TaskState {\n return {\n filter: 'all',\n tasks: [\n {complete: true, id: 1, title: 'Read the architecture'},\n {complete: false, id: 2, title: 'Build something with White Label'}\n ]\n };\n}\n"]}
1
+ {"version":3,"file":"task-state.js","sourceRoot":"","sources":["../../../../../../app/assets/view/examples/tasks/task-state.ts"],"names":[],"mappings":"AAcA,MAAM,cAAc,GAAoD;IACpE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ;IAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;IACf,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ;CACnC,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,WAAW,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,YAAY,KAAK,CAAC,MAAM,UAAU,CAAC;AACpG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IAClC,OAAO;QACH,MAAM,EAAE,KAAK;QACb,KAAK,EAAE;YACH,EAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAC;YACvD,EAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAC;SACtE;KACJ,CAAC;AACN,CAAC","sourcesContent":["/** Shared state shape used by build-time tagged HTML and the browser application. */\nexport type TaskFilter = 'all' | 'active' | 'completed';\n\nexport interface TaskItem {\n complete: boolean;\n id: number;\n title: string;\n}\n\nexport interface TaskState extends Record<PropertyKey, unknown> {\n filter: TaskFilter;\n tasks: TaskItem[];\n}\n\nconst taskPredicates: Record<TaskFilter, (task: TaskItem) => boolean> = {\n active: task => !task.complete,\n all: () => true,\n completed: task => task.complete\n};\n\n/** Return the tasks visible for the current filter. */\nexport function getVisibleTasks(state: TaskState): TaskItem[] {\n return state.tasks.filter(taskPredicates[state.filter]);\n}\n\n/** Describe the currently rendered task result for assistive technology. */\nexport function describeTaskStatus(state: TaskState): string {\n const visible = getVisibleTasks(state).length;\n return `Showing ${visible} ${visible === 1 ? 'task' : 'tasks'} for the ${state.filter} filter.`;\n}\n\n/**\n * Return fresh demo data for each application instance.\n *\n * A factory avoids sharing mutable state between tests, pages, or future\n * server-side renders while keeping the initial HTML deterministic.\n */\nexport function createInitialTaskState(): TaskState {\n return {\n filter: 'all',\n tasks: [\n {complete: true, id: 1, title: 'Read the architecture'},\n {complete: false, id: 2, title: 'Build something with White Label'}\n ]\n };\n}\n"]}
@@ -1,2 +1,2 @@
1
- /** A small reusable footer keeps the page template focused on page structure. */
2
- export default function SiteFooter(): import("white-label-view/jsx-runtime").JSXMarkup;
1
+ /** Keep reusable static page chrome as a small tagged-template function. */
2
+ export default function SiteFooter(): import("white-label-view/html").HTMLMarkup;
@@ -1,6 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
2
- /** A small reusable footer keeps the page template focused on page structure. */
1
+ import { html } from 'white-label-view/html';
2
+ /** Keep reusable static page chrome as a small tagged-template function. */
3
3
  export default function SiteFooter() {
4
- return (_jsx("footer", { className: "site-footer", children: _jsxs("div", { className: "container site-footer__inner", children: [_jsx("p", { children: "White Label. Framework-independent TypeScript building blocks." }), _jsx("a", { href: "#top", children: "Back to top" })] }) }));
4
+ return html `<footer class="site-footer">
5
+ <div class="container site-footer__inner">
6
+ <p>White Label. Framework-independent TypeScript building blocks.</p>
7
+ <a href="#top">Back to top</a>
8
+ </div>
9
+ </footer>`;
5
10
  }
6
11
  //# sourceMappingURL=SiteFooter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SiteFooter.js","sourceRoot":"","sources":["../../../../../app/assets/view/layout/SiteFooter.tsx"],"names":[],"mappings":";AAAA,iFAAiF;AACjF,MAAM,CAAC,OAAO,UAAU,UAAU;IAC9B,OAAO,CACH,iBAAQ,SAAS,EAAC,aAAa,YAC3B,eAAK,SAAS,EAAC,8BAA8B,aACzC,yFAAqE,EACrE,YAAG,IAAI,EAAC,MAAM,4BAAgB,IAC5B,GACD,CACZ,CAAC;AACN,CAAC","sourcesContent":["/** A small reusable footer keeps the page template focused on page structure. */\nexport default function SiteFooter() {\n return (\n <footer className=\"site-footer\">\n <div className=\"container site-footer__inner\">\n <p>White Label. Framework-independent TypeScript building blocks.</p>\n <a href=\"#top\">Back to top</a>\n </div>\n </footer>\n );\n}\n"]}
1
+ {"version":3,"file":"SiteFooter.js","sourceRoot":"","sources":["../../../../../app/assets/view/layout/SiteFooter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAE3C,4EAA4E;AAC5E,MAAM,CAAC,OAAO,UAAU,UAAU;IAC9B,OAAO,IAAI,CAAA;;;;;kBAKG,CAAC;AACnB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\n\n/** Keep reusable static page chrome as a small tagged-template function. */\nexport default function SiteFooter() {\n return html`<footer class=\"site-footer\">\n <div class=\"container site-footer__inner\">\n <p>White Label. Framework-independent TypeScript building blocks.</p>\n <a href=\"#top\">Back to top</a>\n </div>\n </footer>`;\n}\n"]}
@@ -1,8 +1,2 @@
1
- /**
2
- * Static navigation is ordinary HTML first.
3
- *
4
- * White Label's router enhances only links that opt in with data-pushstate,
5
- * so global navigation stays conventional, crawlable, and usable without
6
- * client-side JavaScript.
7
- */
8
- export default function SiteHeader(): import("white-label-view/jsx-runtime").JSXMarkup;
1
+ /** Static navigation remains ordinary crawlable HTML; JavaScript enhances only opted-in links. */
2
+ export default function SiteHeader(): import("white-label-view/html").HTMLMarkup;
@@ -1,12 +1,17 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
2
- /**
3
- * Static navigation is ordinary HTML first.
4
- *
5
- * White Label's router enhances only links that opt in with data-pushstate,
6
- * so global navigation stays conventional, crawlable, and usable without
7
- * client-side JavaScript.
8
- */
1
+ import { html } from 'white-label-view/html';
2
+ /** Static navigation remains ordinary crawlable HTML; JavaScript enhances only opted-in links. */
9
3
  export default function SiteHeader() {
10
- return (_jsx("header", { className: "site-header", children: _jsxs("div", { className: "container site-header__inner", children: [_jsx("a", { className: "wordmark", href: "#top", children: "White Label" }), _jsxs("nav", { "aria-label": "Primary navigation", children: [_jsx("a", { href: "#example", children: "Example" }), _jsx("a", { href: "#packages", children: "Packages" }), _jsx("a", { href: "#source", children: "Source" }), _jsx("a", { href: "#start", children: "Get started" }), _jsx("a", { href: "https://github.com/bshack/white-label", children: "GitHub" })] })] }) }));
4
+ return html `<header class="site-header">
5
+ <div class="container site-header__inner">
6
+ <a class="wordmark" href="#top">White Label</a>
7
+ <nav aria-label="Primary navigation">
8
+ <a href="#example">Example</a>
9
+ <a href="#packages">Packages</a>
10
+ <a href="#source">Source</a>
11
+ <a href="#start">Get started</a>
12
+ <a href="https://github.com/bshack/white-label">GitHub</a>
13
+ </nav>
14
+ </div>
15
+ </header>`;
11
16
  }
12
17
  //# sourceMappingURL=SiteHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SiteHeader.js","sourceRoot":"","sources":["../../../../../app/assets/view/layout/SiteHeader.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU;IAC9B,OAAO,CACH,iBAAQ,SAAS,EAAC,aAAa,YAC3B,eAAK,SAAS,EAAC,8BAA8B,aACzC,YAAG,SAAS,EAAC,UAAU,EAAC,IAAI,EAAC,MAAM,4BAAgB,EACnD,6BAAgB,oBAAoB,aAChC,YAAG,IAAI,EAAC,UAAU,wBAAY,EAC9B,YAAG,IAAI,EAAC,WAAW,yBAAa,EAChC,YAAG,IAAI,EAAC,SAAS,uBAAW,EAC5B,YAAG,IAAI,EAAC,QAAQ,4BAAgB,EAChC,YAAG,IAAI,EAAC,uCAAuC,uBAAW,IACxD,IACJ,GACD,CACZ,CAAC;AACN,CAAC","sourcesContent":["/**\n * Static navigation is ordinary HTML first.\n *\n * White Label's router enhances only links that opt in with data-pushstate,\n * so global navigation stays conventional, crawlable, and usable without\n * client-side JavaScript.\n */\nexport default function SiteHeader() {\n return (\n <header className=\"site-header\">\n <div className=\"container site-header__inner\">\n <a className=\"wordmark\" href=\"#top\">White Label</a>\n <nav aria-label=\"Primary navigation\">\n <a href=\"#example\">Example</a>\n <a href=\"#packages\">Packages</a>\n <a href=\"#source\">Source</a>\n <a href=\"#start\">Get started</a>\n <a href=\"https://github.com/bshack/white-label\">GitHub</a>\n </nav>\n </div>\n </header>\n );\n}\n"]}
1
+ {"version":3,"file":"SiteHeader.js","sourceRoot":"","sources":["../../../../../app/assets/view/layout/SiteHeader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAE3C,kGAAkG;AAClG,MAAM,CAAC,OAAO,UAAU,UAAU;IAC9B,OAAO,IAAI,CAAA;;;;;;;;;;;kBAWG,CAAC;AACnB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\n\n/** Static navigation remains ordinary crawlable HTML; JavaScript enhances only opted-in links. */\nexport default function SiteHeader() {\n return html`<header class=\"site-header\">\n <div class=\"container site-header__inner\">\n <a class=\"wordmark\" href=\"#top\">White Label</a>\n <nav aria-label=\"Primary navigation\">\n <a href=\"#example\">Example</a>\n <a href=\"#packages\">Packages</a>\n <a href=\"#source\">Source</a>\n <a href=\"#start\">Get started</a>\n <a href=\"https://github.com/bshack/white-label\">GitHub</a>\n </nav>\n </div>\n </header>`;\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Build-time data available to every page template.
3
3
  *
4
- * Keeping this contract separate from the page component makes the top-level
5
- * JSX read like application composition instead of deployment plumbing.
4
+ * Keeping this contract separate from the renderer keeps top-level tagged
5
+ * HTML focused on application composition instead of deployment plumbing.
6
6
  */
7
7
  export interface PageData {
8
8
  cdn: string;
@@ -1 +1 @@
1
- {"version":3,"file":"page-data.js","sourceRoot":"","sources":["../../../../app/assets/view/page-data.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Build-time data available to every page template.\n *\n * Keeping this contract separate from the page component makes the top-level\n * JSX read like application composition instead of deployment plumbing.\n */\nexport interface PageData {\n cdn: string;\n meta: {description: string};\n siteUrl: string;\n structuredData: unknown;\n title: string;\n version: string;\n}\n"]}
1
+ {"version":3,"file":"page-data.js","sourceRoot":"","sources":["../../../../app/assets/view/page-data.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Build-time data available to every page template.\n *\n * Keeping this contract separate from the renderer keeps top-level tagged\n * HTML focused on application composition instead of deployment plumbing.\n */\nexport interface PageData {\n cdn: string;\n meta: {description: string};\n siteUrl: string;\n structuredData: unknown;\n title: string;\n version: string;\n}\n"]}
@@ -1,2 +1,2 @@
1
1
  /** Keep the shortest path from generator install to a verified local build visible. */
2
- export default function GettingStartedSection(): import("white-label-view/jsx-runtime").JSXMarkup;
2
+ export default function GettingStartedSection(): import("white-label-view/html").HTMLMarkup;
@@ -1,11 +1,26 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
1
+ import { html } from 'white-label-view/html';
2
2
  import CodeBlock, { syntax } from '../CodeBlock.js';
3
3
  /** Keep the shortest path from generator install to a verified local build visible. */
4
4
  export default function GettingStartedSection() {
5
- return (_jsx("section", { className: "section", id: "start", "aria-labelledby": "start-title", children: _jsxs("div", { className: "container start-grid", children: [_jsxs("div", { className: "section-intro", children: [_jsx("p", { className: "eyebrow", children: "Get started" }), _jsx("h2", { id: "start-title", children: "Create a project with the generator." }), _jsx("p", { children: "The generated project is static-first, TypeScript-first, accessible by default, and ready for application-specific code." })] }), _jsxs("div", { children: [_jsx("p", { className: "code-label", children: "Create a project" }), _jsx(CodeBlock, { lines: [_jsxs(_Fragment, { children: [_jsx("span", { className: syntax.type, children: "npx" }), " generator-white-label"] })] }), _jsx("p", { className: "code-label", children: "Then develop" }), _jsx(CodeBlock, { lines: [
6
- _jsxs(_Fragment, { children: [_jsx("span", { className: syntax.type, children: "npm" }), " ci"] }),
7
- _jsxs(_Fragment, { children: [_jsx("span", { className: syntax.type, children: "npm" }), " test"] }),
8
- _jsxs(_Fragment, { children: [_jsx("span", { className: syntax.type, children: "npm" }), " run build -- --version=", _jsx("span", { className: syntax.value, children: "local" })] })
9
- ] }), _jsx("p", { children: _jsx("a", { href: "https://github.com/bshack/white-label#readme", children: "Read the complete generator documentation" }) })] })] }) }));
5
+ return html `<section class="section" id="start" aria-labelledby="start-title">
6
+ <div class="container start-grid">
7
+ <div class="section-intro">
8
+ <p class="eyebrow">Get started</p>
9
+ <h2 id="start-title">Create a project with the generator.</h2>
10
+ <p>The generated project is static-first, TypeScript-first, accessible by default, and ready for application-specific code.</p>
11
+ </div>
12
+ <div>
13
+ <p class="code-label">Create a project</p>
14
+ ${CodeBlock({ lines: [html `<span class="${syntax.type}">npx</span> generator-white-label`] })}
15
+ <p class="code-label">Then develop</p>
16
+ ${CodeBlock({ lines: [
17
+ html `<span class="${syntax.type}">npm</span> ci`,
18
+ html `<span class="${syntax.type}">npm</span> test`,
19
+ html `<span class="${syntax.type}">npm</span> run build -- --version=<span class="${syntax.value}">local</span>`
20
+ ] })}
21
+ <p><a href="https://github.com/bshack/white-label#readme">Read the complete generator documentation</a></p>
22
+ </div>
23
+ </div>
24
+ </section>`;
10
25
  }
11
26
  //# sourceMappingURL=GettingStartedSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GettingStartedSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/GettingStartedSection.tsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,EAAE,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAElD,uFAAuF;AACvF,MAAM,CAAC,OAAO,UAAU,qBAAqB;IACzC,OAAO,CACH,kBAAS,SAAS,EAAC,SAAS,EAAC,EAAE,EAAC,OAAO,qBAAiB,aAAa,YACjE,eAAK,SAAS,EAAC,sBAAsB,aACjC,eAAK,SAAS,EAAC,eAAe,aAC1B,YAAG,SAAS,EAAC,SAAS,4BAAgB,EACtC,aAAI,EAAE,EAAC,aAAa,qDAA0C,EAC9D,mJAA+H,IAC7H,EACN,0BACI,YAAG,SAAS,EAAC,YAAY,iCAAqB,EAC9C,KAAC,SAAS,IAAC,KAAK,EAAE,CAAC,8BAAE,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,oBAAY,8BAAyB,CAAC,GAAI,EAC3F,YAAG,SAAS,EAAC,YAAY,6BAAiB,EAC1C,KAAC,SAAS,IAAC,KAAK,EAAE;gCACd,8BAAE,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,oBAAY,WAAM;gCAChD,8BAAE,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,oBAAY,aAAQ;gCAClD,8BAAE,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,oBAAY,8BAAwB,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,sBAAc,IAAG;6BACnH,GAAI,EACL,sBAAG,YAAG,IAAI,EAAC,8CAA8C,0DAA8C,GAAI,IACzG,IACJ,GACA,CACb,CAAC;AACN,CAAC","sourcesContent":["import CodeBlock, {syntax} from '../CodeBlock.js';\n\n/** Keep the shortest path from generator install to a verified local build visible. */\nexport default function GettingStartedSection() {\n return (\n <section className=\"section\" id=\"start\" aria-labelledby=\"start-title\">\n <div className=\"container start-grid\">\n <div className=\"section-intro\">\n <p className=\"eyebrow\">Get started</p>\n <h2 id=\"start-title\">Create a project with the generator.</h2>\n <p>The generated project is static-first, TypeScript-first, accessible by default, and ready for application-specific code.</p>\n </div>\n <div>\n <p className=\"code-label\">Create a project</p>\n <CodeBlock lines={[<><span className={syntax.type}>npx</span> generator-white-label</>]} />\n <p className=\"code-label\">Then develop</p>\n <CodeBlock lines={[\n <><span className={syntax.type}>npm</span> ci</>,\n <><span className={syntax.type}>npm</span> test</>,\n <><span className={syntax.type}>npm</span> run build -- --version=<span className={syntax.value}>local</span></>\n ]} />\n <p><a href=\"https://github.com/bshack/white-label#readme\">Read the complete generator documentation</a></p>\n </div>\n </div>\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"GettingStartedSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/GettingStartedSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,SAAS,EAAE,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAElD,uFAAuF;AACvF,MAAM,CAAC,OAAO,UAAU,qBAAqB;IACzC,OAAO,IAAI,CAAA;;;;;;;;;sBASO,SAAS,CAAC,EAAC,KAAK,EAAE,CAAC,IAAI,CAAA,gBAAgB,MAAM,CAAC,IAAI,oCAAoC,CAAC,EAAC,CAAC;;sBAEzF,SAAS,CAAC,EAAC,KAAK,EAAE;YAChB,IAAI,CAAA,gBAAgB,MAAM,CAAC,IAAI,iBAAiB;YAChD,IAAI,CAAA,gBAAgB,MAAM,CAAC,IAAI,mBAAmB;YAClD,IAAI,CAAA,gBAAgB,MAAM,CAAC,IAAI,oDAAoD,MAAM,CAAC,KAAK,gBAAgB;SAClH,EAAC,CAAC;;;;mBAIJ,CAAC;AACpB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\nimport CodeBlock, {syntax} from '../CodeBlock.js';\n\n/** Keep the shortest path from generator install to a verified local build visible. */\nexport default function GettingStartedSection() {\n return html`<section class=\"section\" id=\"start\" aria-labelledby=\"start-title\">\n <div class=\"container start-grid\">\n <div class=\"section-intro\">\n <p class=\"eyebrow\">Get started</p>\n <h2 id=\"start-title\">Create a project with the generator.</h2>\n <p>The generated project is static-first, TypeScript-first, accessible by default, and ready for application-specific code.</p>\n </div>\n <div>\n <p class=\"code-label\">Create a project</p>\n ${CodeBlock({lines: [html`<span class=\"${syntax.type}\">npx</span> generator-white-label`]})}\n <p class=\"code-label\">Then develop</p>\n ${CodeBlock({lines: [\n html`<span class=\"${syntax.type}\">npm</span> ci`,\n html`<span class=\"${syntax.type}\">npm</span> test`,\n html`<span class=\"${syntax.type}\">npm</span> run build -- --version=<span class=\"${syntax.value}\">local</span>`\n ]})}\n <p><a href=\"https://github.com/bshack/white-label#readme\">Read the complete generator documentation</a></p>\n </div>\n </div>\n </section>`;\n}\n"]}
@@ -1,8 +1,2 @@
1
- /**
2
- * Marketing content can stay a plain JSX function.
3
- *
4
- * White Label does not require every piece of markup to become a stateful
5
- * View instance. Use View where lifecycle or observable state is useful;
6
- * keep static presentation simple.
7
- */
8
- export default function HeroSection(): import("white-label-view/jsx-runtime").JSXMarkup;
1
+ /** Static presentation stays a plain tagged-template function; View is only needed for lifecycle/state. */
2
+ export default function HeroSection(): import("white-label-view/html").HTMLMarkup;
@@ -1,12 +1,15 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
2
- /**
3
- * Marketing content can stay a plain JSX function.
4
- *
5
- * White Label does not require every piece of markup to become a stateful
6
- * View instance. Use View where lifecycle or observable state is useful;
7
- * keep static presentation simple.
8
- */
1
+ import { html } from 'white-label-view/html';
2
+ /** Static presentation stays a plain tagged-template function; View is only needed for lifecycle/state. */
9
3
  export default function HeroSection() {
10
- return (_jsx("section", { className: "hero", id: "top", "aria-labelledby": "hero-title", children: _jsxs("div", { className: "container hero__inner", children: [_jsxs("h1", { id: "hero-title", children: ["Small pieces.", _jsx("br", {}), "Complete applications."] }), _jsx("p", { className: "hero__lede", children: "Framework-independent TypeScript packages for state, rendering, coordination, routing, and project generation." }), _jsxs("div", { className: "hero__links", children: [_jsx("a", { className: "primary-link", href: "#example", children: "See the example" }), _jsx("a", { href: "#start", children: "Install the generator" })] })] }) }));
4
+ return html `<section class="hero" id="top" aria-labelledby="hero-title">
5
+ <div class="container hero__inner">
6
+ <h1 id="hero-title">Small pieces.<br>Complete applications.</h1>
7
+ <p class="hero__lede">Framework-independent TypeScript packages for state, rendering, coordination, routing, and project generation.</p>
8
+ <div class="hero__links">
9
+ <a class="primary-link" href="#example">See the example</a>
10
+ <a href="#start">Install the generator</a>
11
+ </div>
12
+ </div>
13
+ </section>`;
11
14
  }
12
15
  //# sourceMappingURL=HeroSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HeroSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/HeroSection.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW;IAC/B,OAAO,CACH,kBAAS,SAAS,EAAC,MAAM,EAAC,EAAE,EAAC,KAAK,qBAAiB,YAAY,YAC3D,eAAK,SAAS,EAAC,uBAAuB,aAClC,cAAI,EAAE,EAAC,YAAY,8BAAc,cAAM,8BAA2B,EAClE,YAAG,SAAS,EAAC,YAAY,+HAAmH,EAC5I,eAAK,SAAS,EAAC,aAAa,aACxB,YAAG,SAAS,EAAC,cAAc,EAAC,IAAI,EAAC,UAAU,gCAAoB,EAC/D,YAAG,IAAI,EAAC,QAAQ,sCAA0B,IACxC,IACJ,GACA,CACb,CAAC;AACN,CAAC","sourcesContent":["/**\n * Marketing content can stay a plain JSX function.\n *\n * White Label does not require every piece of markup to become a stateful\n * View instance. Use View where lifecycle or observable state is useful;\n * keep static presentation simple.\n */\nexport default function HeroSection() {\n return (\n <section className=\"hero\" id=\"top\" aria-labelledby=\"hero-title\">\n <div className=\"container hero__inner\">\n <h1 id=\"hero-title\">Small pieces.<br />Complete applications.</h1>\n <p className=\"hero__lede\">Framework-independent TypeScript packages for state, rendering, coordination, routing, and project generation.</p>\n <div className=\"hero__links\">\n <a className=\"primary-link\" href=\"#example\">See the example</a>\n <a href=\"#start\">Install the generator</a>\n </div>\n </div>\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"HeroSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/HeroSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAE3C,2GAA2G;AAC3G,MAAM,CAAC,OAAO,UAAU,WAAW;IAC/B,OAAO,IAAI,CAAA;;;;;;;;;mBASI,CAAC;AACpB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\n\n/** Static presentation stays a plain tagged-template function; View is only needed for lifecycle/state. */\nexport default function HeroSection() {\n return html`<section class=\"hero\" id=\"top\" aria-labelledby=\"hero-title\">\n <div class=\"container hero__inner\">\n <h1 id=\"hero-title\">Small pieces.<br>Complete applications.</h1>\n <p class=\"hero__lede\">Framework-independent TypeScript packages for state, rendering, coordination, routing, and project generation.</p>\n <div class=\"hero__links\">\n <a class=\"primary-link\" href=\"#example\">See the example</a>\n <a href=\"#start\">Install the generator</a>\n </div>\n </div>\n </section>`;\n}\n"]}
@@ -1,6 +1,2 @@
1
- /**
2
- * The initial task UI is rendered at build time with the same JSX used later
3
- * by white-label-view in the browser. JavaScript adds behavior; it does not
4
- * need to invent the initial document.
5
- */
6
- export default function LiveExampleSection(): import("white-label-view/jsx-runtime").JSXMarkup;
1
+ /** Render useful initial HTML with the same tagged template reused by Browser View. */
2
+ export default function LiveExampleSection(): import("white-label-view/html").HTMLMarkup;
@@ -1,13 +1,23 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
1
+ import { html } from 'white-label-view/html';
2
2
  import TaskExample from '../examples/tasks/TaskExample.js';
3
3
  import { createInitialTaskState, describeTaskStatus } from '../examples/tasks/task-state.js';
4
- /**
5
- * The initial task UI is rendered at build time with the same JSX used later
6
- * by white-label-view in the browser. JavaScript adds behavior; it does not
7
- * need to invent the initial document.
8
- */
4
+ /** Render useful initial HTML with the same tagged template reused by Browser View. */
9
5
  export default function LiveExampleSection() {
10
6
  const state = createInitialTaskState();
11
- return (_jsx("section", { className: "section", id: "example", "aria-labelledby": "example-title", children: _jsxs("div", { className: "container", children: [_jsxs("div", { className: "section-intro", children: [_jsx("p", { className: "eyebrow", children: "Live example" }), _jsx("h2", { id: "example-title", children: "Four packages. One small application." }), _jsx("p", { children: "Add a task, toggle its state, or change the filter. Router translates the URL into intent, Mediator coordinates actions, Model owns state, and View keeps the interface in sync." })] }), _jsxs("div", { className: "demo", "data-task-example": true, children: [_jsx(TaskExample, { state: state }), _jsx("p", { className: "visually-hidden", role: "status", "aria-live": "polite", "aria-atomic": "true", "data-task-status": true, children: describeTaskStatus(state) })] })] }) }));
7
+ return html `<section class="section" id="example" aria-labelledby="example-title">
8
+ <div class="container">
9
+ <div class="section-intro">
10
+ <p class="eyebrow">Live example</p>
11
+ <h2 id="example-title">Four packages. One small application.</h2>
12
+ <p>Add a task, toggle its state, or change the filter. Router translates the URL into intent, Mediator coordinates actions, Model owns state, and View keeps the interface in sync.</p>
13
+ </div>
14
+ <div class="demo" data-task-example>
15
+ ${TaskExample({ state })}
16
+ <p class="visually-hidden" role="status" aria-live="polite" aria-atomic="true" data-task-status>
17
+ ${describeTaskStatus(state)}
18
+ </p>
19
+ </div>
20
+ </div>
21
+ </section>`;
12
22
  }
13
23
  //# sourceMappingURL=LiveExampleSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveExampleSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/LiveExampleSection.tsx"],"names":[],"mappings":";AAAA,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAC,sBAAsB,EAAE,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AAE3F;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IAEvC,OAAO,CACH,kBAAS,SAAS,EAAC,SAAS,EAAC,EAAE,EAAC,SAAS,qBAAiB,eAAe,YACrE,eAAK,SAAS,EAAC,WAAW,aACtB,eAAK,SAAS,EAAC,eAAe,aAC1B,YAAG,SAAS,EAAC,SAAS,6BAAiB,EACvC,aAAI,EAAE,EAAC,eAAe,sDAA2C,EACjE,2MAAuL,IACrL,EACN,eAAK,SAAS,EAAC,MAAM,wCACjB,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI,EAC7B,YAAG,SAAS,EAAC,iBAAiB,EAAC,IAAI,EAAC,QAAQ,eAAW,QAAQ,iBAAa,MAAM,sCAC7E,kBAAkB,CAAC,KAAK,CAAC,GAC1B,IACF,IACJ,GACA,CACb,CAAC;AACN,CAAC","sourcesContent":["import TaskExample from '../examples/tasks/TaskExample.js';\nimport {createInitialTaskState, describeTaskStatus} from '../examples/tasks/task-state.js';\n\n/**\n * The initial task UI is rendered at build time with the same JSX used later\n * by white-label-view in the browser. JavaScript adds behavior; it does not\n * need to invent the initial document.\n */\nexport default function LiveExampleSection() {\n const state = createInitialTaskState();\n\n return (\n <section className=\"section\" id=\"example\" aria-labelledby=\"example-title\">\n <div className=\"container\">\n <div className=\"section-intro\">\n <p className=\"eyebrow\">Live example</p>\n <h2 id=\"example-title\">Four packages. One small application.</h2>\n <p>Add a task, toggle its state, or change the filter. Router translates the URL into intent, Mediator coordinates actions, Model owns state, and View keeps the interface in sync.</p>\n </div>\n <div className=\"demo\" data-task-example>\n <TaskExample state={state} />\n <p className=\"visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-task-status>\n {describeTaskStatus(state)}\n </p>\n </div>\n </div>\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"LiveExampleSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/LiveExampleSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAC,sBAAsB,EAAE,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AAE3F,uFAAuF;AACvF,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IAEvC,OAAO,IAAI,CAAA;;;;;;;;sBAQO,WAAW,CAAC,EAAC,KAAK,EAAC,CAAC;;0BAEhB,kBAAkB,CAAC,KAAK,CAAC;;;;mBAIhC,CAAC;AACpB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\nimport TaskExample from '../examples/tasks/TaskExample.js';\nimport {createInitialTaskState, describeTaskStatus} from '../examples/tasks/task-state.js';\n\n/** Render useful initial HTML with the same tagged template reused by Browser View. */\nexport default function LiveExampleSection() {\n const state = createInitialTaskState();\n\n return html`<section class=\"section\" id=\"example\" aria-labelledby=\"example-title\">\n <div class=\"container\">\n <div class=\"section-intro\">\n <p class=\"eyebrow\">Live example</p>\n <h2 id=\"example-title\">Four packages. One small application.</h2>\n <p>Add a task, toggle its state, or change the filter. Router translates the URL into intent, Mediator coordinates actions, Model owns state, and View keeps the interface in sync.</p>\n </div>\n <div class=\"demo\" data-task-example>\n ${TaskExample({state})}\n <p class=\"visually-hidden\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" data-task-status>\n ${describeTaskStatus(state)}\n </p>\n </div>\n </div>\n </section>`;\n}\n"]}
@@ -1,2 +1,2 @@
1
1
  /** Package documentation stays close to the example it describes. */
2
- export default function PackageDocsSection(): import("white-label-view/jsx-runtime").JSXMarkup;
2
+ export default function PackageDocsSection(): import("white-label-view/html").HTMLMarkup;
@@ -1,4 +1,4 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
1
+ import { html } from 'white-label-view/html';
2
2
  import CodeBlock, { syntax } from '../CodeBlock.js';
3
3
  const repositories = {
4
4
  mediator: 'https://github.com/bshack/white-label-mediator',
@@ -8,24 +8,61 @@ const repositories = {
8
8
  };
9
9
  /** Package documentation stays close to the example it describes. */
10
10
  export default function PackageDocsSection() {
11
- return (_jsx("section", { className: "section", id: "packages", "aria-labelledby": "packages-title", children: _jsxs("div", { className: "container", children: [_jsxs("div", { className: "section-intro", children: [_jsx("p", { className: "eyebrow", children: "Documentation" }), _jsx("h2", { id: "packages-title", children: "The core flow stays explicit." }), _jsx("p", { children: "Each package has one job, can be used independently, and stays easy to replace or test because application concerns are not hidden behind a framework." })] }), _jsx("div", { className: "architecture", children: _jsxs("ol", { children: [_jsxs("li", { children: [_jsx("strong", { children: "Router" }), _jsx("span", { children: "turns a URL into application intent" })] }), _jsxs("li", { children: [_jsx("strong", { children: "Mediator" }), _jsx("span", { children: "coordinates that intent between modules" })] }), _jsxs("li", { children: [_jsx("strong", { children: "Model" }), _jsx("span", { children: "stores and publishes application state" })] }), _jsxs("li", { children: [_jsx("strong", { children: "View" }), _jsx("span", { children: "renders the resulting interface" })] })] }) }), _jsxs("div", { className: "docs-grid", children: [_jsxs("article", { children: [_jsx("p", { className: "eyebrow", children: "Model" }), _jsx("h3", { children: "State is observable, not magical." }), _jsx(CodeBlock, { lines: [
12
- _jsxs(_Fragment, { children: [_jsx("span", { className: syntax.keyword, children: "const" }), " model = ", _jsx("span", { className: syntax.keyword, children: "new" }), " ", _jsx("span", { className: syntax.type, children: "Model" }), "(", '{', "count: 0", '}', ");"] }),
13
- _jsxs(_Fragment, { children: ["model.addEventListener(", _jsx("span", { className: syntax.value, children: "'change'" }), ", event => render(event.detail));"] }),
14
- _jsxs(_Fragment, { children: ["model.update(", '{', "count: 1", '}', ");"] })
15
- ] }), _jsx("p", { children: _jsx("a", { href: repositories.model, children: "Model documentation" }) })] }), _jsxs("article", { children: [_jsx("p", { className: "eyebrow", children: "View" }), _jsx("h3", { children: "JSX renders through White Label." }), _jsx(CodeBlock, { lines: [
16
- _jsxs(_Fragment, { children: [_jsx("span", { className: syntax.keyword, children: "const" }), " view = ", _jsx("span", { className: syntax.keyword, children: "new" }), " ", _jsx("span", { className: syntax.type, children: "View" }), "(", '{'] }),
17
- _jsx(_Fragment, { children: " model," }),
18
- _jsxs(_Fragment, { children: [" template: state => <p>", '{', "state.count", '}', "</p>"] }),
19
- _jsxs(_Fragment, { children: ['}', ").initialize();"] })
20
- ] }), _jsx("p", { children: _jsx("a", { href: repositories.view, children: "View documentation" }) })] }), _jsxs("article", { children: [_jsx("p", { className: "eyebrow", children: "Mediator" }), _jsx("h3", { children: "Modules communicate through events." }), _jsx(CodeBlock, { lines: [
21
- _jsxs(_Fragment, { children: ["mediator.addEventListener(", _jsx("span", { className: syntax.value, children: "'counter:increment'" }), ", increment);"] }),
22
- _jsxs(_Fragment, { children: ["mediator.dispatchEvent(", _jsx("span", { className: syntax.keyword, children: "new" }), " ", _jsx("span", { className: syntax.type, children: "CustomEvent" }), "(", _jsx("span", { className: syntax.value, children: "'counter:increment'" }), "));"] })
23
- ] }), _jsx("p", { children: _jsx("a", { href: repositories.mediator, children: "Mediator documentation" }) })] }), _jsxs("article", { children: [_jsx("p", { className: "eyebrow", children: "Router" }), _jsx("h3", { children: "Routes describe intent." }), _jsx(CodeBlock, { lines: [
24
- _jsxs(_Fragment, { children: ["router.routes = ", '{'] }),
25
- _jsxs(_Fragment, { children: [" ", _jsx("span", { className: syntax.value, children: "'/'" }), ": (_scope, location) => ", '{'] }),
26
- _jsxs(_Fragment, { children: [" mediator.dispatchEvent(", _jsx("span", { className: syntax.keyword, children: "new" }), " ", _jsx("span", { className: syntax.type, children: "CustomEvent" }), "(", _jsx("span", { className: syntax.value, children: "'filter:set'" }), ", ", '{', "detail: location.data.query.filter", '}', "));"] }),
27
- _jsxs(_Fragment, { children: [" ", '}'] }),
28
- _jsxs(_Fragment, { children: ['}', ";"] })
29
- ] }), _jsx("p", { children: _jsx("a", { href: repositories.router, children: "Router documentation" }) })] })] })] }) }));
11
+ return html `<section class="section" id="packages" aria-labelledby="packages-title">
12
+ <div class="container">
13
+ <div class="section-intro">
14
+ <p class="eyebrow">Documentation</p>
15
+ <h2 id="packages-title">The core flow stays explicit.</h2>
16
+ <p>Each package has one job, can be used independently, and stays easy to replace or test because application concerns are not hidden behind a framework.</p>
17
+ </div>
18
+ <div class="architecture"><ol>
19
+ <li><strong>Router</strong><span>turns a URL into application intent</span></li>
20
+ <li><strong>Mediator</strong><span>coordinates that intent between modules</span></li>
21
+ <li><strong>Model</strong><span>stores and publishes application state</span></li>
22
+ <li><strong>View</strong><span>renders the resulting interface</span></li>
23
+ </ol></div>
24
+ <div class="docs-grid">
25
+ <article>
26
+ <p class="eyebrow">Model</p><h3>State is observable, not magical.</h3>
27
+ ${CodeBlock({ lines: [
28
+ html `<span class="${syntax.keyword}">const</span> model = <span class="${syntax.keyword}">new</span> <span class="${syntax.type}">Model</span>({count: 0});`,
29
+ html `model.addEventListener(<span class="${syntax.value}">'change'</span>, event =&gt; render(event.detail));`,
30
+ html `model.update({count: 1});`
31
+ ] })}
32
+ <p><a href="${repositories.model}">Model documentation</a></p>
33
+ </article>
34
+ <article>
35
+ <p class="eyebrow">View</p><h3>Tagged HTML is the first-party template syntax.</h3>
36
+ ${CodeBlock({ lines: [
37
+ html `<span class="${syntax.keyword}">import</span> {html} from <span class="${syntax.value}">'white-label-view/html'</span>;`,
38
+ html `<span class="${syntax.keyword}">const</span> view = <span class="${syntax.keyword}">new</span> <span class="${syntax.type}">View</span>({`,
39
+ html ` model,`,
40
+ html ` template: state =&gt; html\`${'<p>'}\${state.count}${'</p>'}\``,
41
+ html `}).initialize();`
42
+ ] })}
43
+ <p><a href="${repositories.view}">View documentation</a></p>
44
+ </article>
45
+ <article>
46
+ <p class="eyebrow">Mediator</p><h3>Modules communicate through events.</h3>
47
+ ${CodeBlock({ lines: [
48
+ html `mediator.addEventListener(<span class="${syntax.value}">'counter:increment'</span>, increment);`,
49
+ html `mediator.dispatchEvent(<span class="${syntax.keyword}">new</span> <span class="${syntax.type}">CustomEvent</span>(<span class="${syntax.value}">'counter:increment'</span>));`
50
+ ] })}
51
+ <p><a href="${repositories.mediator}">Mediator documentation</a></p>
52
+ </article>
53
+ <article>
54
+ <p class="eyebrow">Router</p><h3>Routes describe intent.</h3>
55
+ ${CodeBlock({ lines: [
56
+ html `router.routes = {`,
57
+ html ` <span class="${syntax.value}">'/'</span>: (_scope, location) =&gt; {`,
58
+ html ` mediator.dispatchEvent(<span class="${syntax.keyword}">new</span> <span class="${syntax.type}">CustomEvent</span>(<span class="${syntax.value}">'filter:set'</span>, {detail: location.data.query.filter}));`,
59
+ html ` }`,
60
+ html `};`
61
+ ] })}
62
+ <p><a href="${repositories.router}">Router documentation</a></p>
63
+ </article>
64
+ </div>
65
+ </div>
66
+ </section>`;
30
67
  }
31
68
  //# sourceMappingURL=PackageDocsSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PackageDocsSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/PackageDocsSection.tsx"],"names":[],"mappings":";AAAA,OAAO,SAAS,EAAE,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAElD,MAAM,YAAY,GAAG;IACjB,QAAQ,EAAE,gDAAgD;IAC1D,KAAK,EAAE,6CAA6C;IACpD,MAAM,EAAE,8CAA8C;IACtD,IAAI,EAAE,4CAA4C;CACrD,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACtC,OAAO,CACH,kBAAS,SAAS,EAAC,SAAS,EAAC,EAAE,EAAC,UAAU,qBAAiB,gBAAgB,YACvE,eAAK,SAAS,EAAC,WAAW,aACtB,eAAK,SAAS,EAAC,eAAe,aAC1B,YAAG,SAAS,EAAC,SAAS,8BAAkB,EACxC,aAAI,EAAE,EAAC,gBAAgB,8CAAmC,EAC1D,iLAA6J,IAC3J,EACN,cAAK,SAAS,EAAC,cAAc,YAAC,yBAC1B,yBAAI,sCAAuB,EAAA,iEAAgD,IAAK,EAChF,yBAAI,wCAAyB,EAAA,qEAAoD,IAAK,EACtF,yBAAI,qCAAsB,EAAA,oEAAmD,IAAK,EAClF,yBAAI,oCAAqB,EAAA,6DAA4C,IAAK,IACzE,GAAM,EACX,eAAK,SAAS,EAAC,WAAW,aACtB,8BACI,YAAG,SAAS,EAAC,SAAS,sBAAU,EAAA,6DAA0C,EAC1E,KAAC,SAAS,IAAC,KAAK,EAAE;wCACd,8BAAE,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,sBAAc,eAAS,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,oBAAY,OAAC,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,sBAAc,OAAE,GAAG,cAAU,GAAG,UAAM;wCACtK,yDAAyB,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,yBAAiB,yCAAuC;wCAC9G,+CAAgB,GAAG,cAAU,GAAG,UAAM;qCACzC,GAAI,EACL,sBAAG,YAAG,IAAI,EAAE,YAAY,CAAC,KAAK,oCAAyB,GAAI,IACrD,EACV,8BACI,YAAG,SAAS,EAAC,SAAS,qBAAS,EAAA,4DAAyC,EACxE,KAAC,SAAS,IAAC,KAAK,EAAE;wCACd,8BAAE,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,sBAAc,cAAQ,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,oBAAY,OAAC,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,qBAAa,OAAE,GAAG,IAAI;wCACrJ,yCAAa;wCACb,0DAAoC,GAAG,iBAAa,GAAG,YAAc;wCACrE,8BAAG,GAAG,uBAAmB;qCAC5B,GAAI,EACL,sBAAG,YAAG,IAAI,EAAE,YAAY,CAAC,IAAI,mCAAwB,GAAI,IACnD,EACV,8BACI,YAAG,SAAS,EAAC,SAAS,yBAAa,EAAA,+DAA4C,EAC/E,KAAC,SAAS,IAAC,KAAK,EAAE;wCACd,4DAA4B,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,oCAA4B,qBAAgB;wCACrG,yDAAyB,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,oBAAY,OAAC,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,4BAAoB,OAAC,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,oCAA4B,WAAM;qCACxL,GAAI,EACL,sBAAG,YAAG,IAAI,EAAE,YAAY,CAAC,QAAQ,uCAA4B,GAAI,IAC3D,EACV,8BACI,YAAG,SAAS,EAAC,SAAS,uBAAW,EAAA,mDAAgC,EACjE,KAAC,SAAS,IAAC,KAAK,EAAE;wCACd,kDAAmB,GAAG,IAAI;wCAC1B,oCAAI,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,oBAAY,8BAA4B,GAAG,IAAI;wCAChF,6DAA6B,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,oBAAY,OAAC,eAAM,SAAS,EAAE,MAAM,CAAC,IAAI,4BAAoB,OAAC,eAAM,SAAS,EAAE,MAAM,CAAC,KAAK,6BAAqB,QAAG,GAAG,wCAAoC,GAAG,WAAO;wCAChO,oCAAK,GAAG,IAAI;wCACZ,8BAAG,GAAG,SAAK;qCACd,GAAI,EACL,sBAAG,YAAG,IAAI,EAAE,YAAY,CAAC,MAAM,qCAA0B,GAAI,IACvD,IACR,IACJ,GACA,CACb,CAAC;AACN,CAAC","sourcesContent":["import CodeBlock, {syntax} from '../CodeBlock.js';\n\nconst repositories = {\n mediator: 'https://github.com/bshack/white-label-mediator',\n model: 'https://github.com/bshack/white-label-model',\n router: 'https://github.com/bshack/white-label-router',\n view: 'https://github.com/bshack/white-label-view'\n};\n\n/** Package documentation stays close to the example it describes. */\nexport default function PackageDocsSection() {\n return (\n <section className=\"section\" id=\"packages\" aria-labelledby=\"packages-title\">\n <div className=\"container\">\n <div className=\"section-intro\">\n <p className=\"eyebrow\">Documentation</p>\n <h2 id=\"packages-title\">The core flow stays explicit.</h2>\n <p>Each package has one job, can be used independently, and stays easy to replace or test because application concerns are not hidden behind a framework.</p>\n </div>\n <div className=\"architecture\"><ol>\n <li><strong>Router</strong><span>turns a URL into application intent</span></li>\n <li><strong>Mediator</strong><span>coordinates that intent between modules</span></li>\n <li><strong>Model</strong><span>stores and publishes application state</span></li>\n <li><strong>View</strong><span>renders the resulting interface</span></li>\n </ol></div>\n <div className=\"docs-grid\">\n <article>\n <p className=\"eyebrow\">Model</p><h3>State is observable, not magical.</h3>\n <CodeBlock lines={[\n <><span className={syntax.keyword}>const</span> model = <span className={syntax.keyword}>new</span> <span className={syntax.type}>Model</span>({'{'}count: 0{'}'});</>,\n <>model.addEventListener(<span className={syntax.value}>'change'</span>, event =&gt; render(event.detail));</>,\n <>model.update({'{'}count: 1{'}'});</>\n ]} />\n <p><a href={repositories.model}>Model documentation</a></p>\n </article>\n <article>\n <p className=\"eyebrow\">View</p><h3>JSX renders through White Label.</h3>\n <CodeBlock lines={[\n <><span className={syntax.keyword}>const</span> view = <span className={syntax.keyword}>new</span> <span className={syntax.type}>View</span>({'{'}</>,\n <> model,</>,\n <> template: state =&gt; &lt;p&gt;{'{'}state.count{'}'}&lt;/p&gt;</>,\n <>{'}'}).initialize();</>\n ]} />\n <p><a href={repositories.view}>View documentation</a></p>\n </article>\n <article>\n <p className=\"eyebrow\">Mediator</p><h3>Modules communicate through events.</h3>\n <CodeBlock lines={[\n <>mediator.addEventListener(<span className={syntax.value}>'counter:increment'</span>, increment);</>,\n <>mediator.dispatchEvent(<span className={syntax.keyword}>new</span> <span className={syntax.type}>CustomEvent</span>(<span className={syntax.value}>'counter:increment'</span>));</>\n ]} />\n <p><a href={repositories.mediator}>Mediator documentation</a></p>\n </article>\n <article>\n <p className=\"eyebrow\">Router</p><h3>Routes describe intent.</h3>\n <CodeBlock lines={[\n <>router.routes = {'{'}</>,\n <> <span className={syntax.value}>'/'</span>: (_scope, location) =&gt; {'{'}</>,\n <> mediator.dispatchEvent(<span className={syntax.keyword}>new</span> <span className={syntax.type}>CustomEvent</span>(<span className={syntax.value}>'filter:set'</span>, {'{'}detail: location.data.query.filter{'}'}));</>,\n <> {'}'}</>,\n <>{'}'};</>\n ]} />\n <p><a href={repositories.router}>Router documentation</a></p>\n </article>\n </div>\n </div>\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"PackageDocsSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/PackageDocsSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAC3C,OAAO,SAAS,EAAE,EAAC,MAAM,EAAC,MAAM,iBAAiB,CAAC;AAElD,MAAM,YAAY,GAAG;IACjB,QAAQ,EAAE,gDAAgD;IAC1D,KAAK,EAAE,6CAA6C;IACpD,MAAM,EAAE,8CAA8C;IACtD,IAAI,EAAE,4CAA4C;CACrD,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACtC,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;0BAgBW,SAAS,CAAC,EAAC,KAAK,EAAE;YAChB,IAAI,CAAA,gBAAgB,MAAM,CAAC,OAAO,uCAAuC,MAAM,CAAC,OAAO,6BAA6B,MAAM,CAAC,IAAI,6BAA6B;YAC5J,IAAI,CAAA,uCAAuC,MAAM,CAAC,KAAK,uDAAuD;YAC9G,IAAI,CAAA,2BAA2B;SAClC,EAAC,CAAC;sCACW,YAAY,CAAC,KAAK;;;;0BAI9B,SAAS,CAAC,EAAC,KAAK,EAAE;YAChB,IAAI,CAAA,gBAAgB,MAAM,CAAC,OAAO,4CAA4C,MAAM,CAAC,KAAK,mCAAmC;YAC7H,IAAI,CAAA,gBAAgB,MAAM,CAAC,OAAO,sCAAsC,MAAM,CAAC,OAAO,6BAA6B,MAAM,CAAC,IAAI,iBAAiB;YAC/I,IAAI,CAAA,UAAU;YACd,IAAI,CAAA,iCAAiC,KAAK,kBAAkB,MAAM,IAAI;YACtE,IAAI,CAAA,kBAAkB;SACzB,EAAC,CAAC;sCACW,YAAY,CAAC,IAAI;;;;0BAI7B,SAAS,CAAC,EAAC,KAAK,EAAE;YAChB,IAAI,CAAA,0CAA0C,MAAM,CAAC,KAAK,2CAA2C;YACrG,IAAI,CAAA,uCAAuC,MAAM,CAAC,OAAO,6BAA6B,MAAM,CAAC,IAAI,qCAAqC,MAAM,CAAC,KAAK,iCAAiC;SACtL,EAAC,CAAC;sCACW,YAAY,CAAC,QAAQ;;;;0BAIjC,SAAS,CAAC,EAAC,KAAK,EAAE;YAChB,IAAI,CAAA,mBAAmB;YACvB,IAAI,CAAA,kBAAkB,MAAM,CAAC,KAAK,0CAA0C;YAC5E,IAAI,CAAA,2CAA2C,MAAM,CAAC,OAAO,6BAA6B,MAAM,CAAC,IAAI,qCAAqC,MAAM,CAAC,KAAK,gEAAgE;YACtN,IAAI,CAAA,KAAK;YACT,IAAI,CAAA,IAAI;SACX,EAAC,CAAC;sCACW,YAAY,CAAC,MAAM;;;;mBAItC,CAAC;AACpB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\nimport CodeBlock, {syntax} from '../CodeBlock.js';\n\nconst repositories = {\n mediator: 'https://github.com/bshack/white-label-mediator',\n model: 'https://github.com/bshack/white-label-model',\n router: 'https://github.com/bshack/white-label-router',\n view: 'https://github.com/bshack/white-label-view'\n};\n\n/** Package documentation stays close to the example it describes. */\nexport default function PackageDocsSection() {\n return html`<section class=\"section\" id=\"packages\" aria-labelledby=\"packages-title\">\n <div class=\"container\">\n <div class=\"section-intro\">\n <p class=\"eyebrow\">Documentation</p>\n <h2 id=\"packages-title\">The core flow stays explicit.</h2>\n <p>Each package has one job, can be used independently, and stays easy to replace or test because application concerns are not hidden behind a framework.</p>\n </div>\n <div class=\"architecture\"><ol>\n <li><strong>Router</strong><span>turns a URL into application intent</span></li>\n <li><strong>Mediator</strong><span>coordinates that intent between modules</span></li>\n <li><strong>Model</strong><span>stores and publishes application state</span></li>\n <li><strong>View</strong><span>renders the resulting interface</span></li>\n </ol></div>\n <div class=\"docs-grid\">\n <article>\n <p class=\"eyebrow\">Model</p><h3>State is observable, not magical.</h3>\n ${CodeBlock({lines: [\n html`<span class=\"${syntax.keyword}\">const</span> model = <span class=\"${syntax.keyword}\">new</span> <span class=\"${syntax.type}\">Model</span>({count: 0});`,\n html`model.addEventListener(<span class=\"${syntax.value}\">'change'</span>, event =&gt; render(event.detail));`,\n html`model.update({count: 1});`\n ]})}\n <p><a href=\"${repositories.model}\">Model documentation</a></p>\n </article>\n <article>\n <p class=\"eyebrow\">View</p><h3>Tagged HTML is the first-party template syntax.</h3>\n ${CodeBlock({lines: [\n html`<span class=\"${syntax.keyword}\">import</span> {html} from <span class=\"${syntax.value}\">'white-label-view/html'</span>;`,\n html`<span class=\"${syntax.keyword}\">const</span> view = <span class=\"${syntax.keyword}\">new</span> <span class=\"${syntax.type}\">View</span>({`,\n html` model,`,\n html` template: state =&gt; html\\`${'<p>'}\\${state.count}${'</p>'}\\``,\n html`}).initialize();`\n ]})}\n <p><a href=\"${repositories.view}\">View documentation</a></p>\n </article>\n <article>\n <p class=\"eyebrow\">Mediator</p><h3>Modules communicate through events.</h3>\n ${CodeBlock({lines: [\n html`mediator.addEventListener(<span class=\"${syntax.value}\">'counter:increment'</span>, increment);`,\n html`mediator.dispatchEvent(<span class=\"${syntax.keyword}\">new</span> <span class=\"${syntax.type}\">CustomEvent</span>(<span class=\"${syntax.value}\">'counter:increment'</span>));`\n ]})}\n <p><a href=\"${repositories.mediator}\">Mediator documentation</a></p>\n </article>\n <article>\n <p class=\"eyebrow\">Router</p><h3>Routes describe intent.</h3>\n ${CodeBlock({lines: [\n html`router.routes = {`,\n html` <span class=\"${syntax.value}\">'/'</span>: (_scope, location) =&gt; {`,\n html` mediator.dispatchEvent(<span class=\"${syntax.keyword}\">new</span> <span class=\"${syntax.type}\">CustomEvent</span>(<span class=\"${syntax.value}\">'filter:set'</span>, {detail: location.data.query.filter}));`,\n html` }`,\n html`};`\n ]})}\n <p><a href=\"${repositories.router}\">Router documentation</a></p>\n </article>\n </div>\n </div>\n </section>`;\n}\n"]}
@@ -1,7 +1,2 @@
1
- /**
2
- * Point learners at the implementation itself.
3
- *
4
- * The landing page is intentionally organized so each path answers a different
5
- * question: composition, rendering, state, coordination, routing, or testing.
6
- */
7
- export default function SourceGuideSection(): import("white-label-view/jsx-runtime").JSXMarkup;
1
+ /** Point learners at the implementation paths that demonstrate each responsibility. */
2
+ export default function SourceGuideSection(): import("white-label-view/html").HTMLMarkup;
@@ -1,11 +1,23 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "white-label-view/jsx-runtime";
2
- /**
3
- * Point learners at the implementation itself.
4
- *
5
- * The landing page is intentionally organized so each path answers a different
6
- * question: composition, rendering, state, coordination, routing, or testing.
7
- */
1
+ import { html } from 'white-label-view/html';
2
+ /** Point learners at the implementation paths that demonstrate each responsibility. */
8
3
  export default function SourceGuideSection() {
9
- return (_jsx("section", { className: "section", id: "source", "aria-labelledby": "source-title", children: _jsxs("div", { className: "container start-grid", children: [_jsxs("div", { className: "section-intro", children: [_jsx("p", { className: "eyebrow", children: "Read the source" }), _jsx("h2", { id: "source-title", children: "This site is part of the documentation." }), _jsx("p", { children: "The landing page is built with the same White Label packages it teaches. Start at the page composition, then follow the imports into the interactive example." })] }), _jsxs("div", { className: "source-paths", children: [_jsxs("dl", { children: [_jsxs("div", { children: [_jsx("dt", { children: "Page composition" }), _jsx("dd", { children: _jsx("code", { children: "app/index.tsx" }) })] }), _jsxs("div", { children: [_jsx("dt", { children: "Static JSX views" }), _jsx("dd", { children: _jsx("code", { children: "app/assets/view/" }) })] }), _jsxs("div", { children: [_jsx("dt", { children: "Task application" }), _jsx("dd", { children: _jsx("code", { children: "app/assets/script/tasks/" }) })] }), _jsxs("div", { children: [_jsx("dt", { children: "Integration tests" }), _jsx("dd", { children: _jsx("code", { children: "test/app.test.js" }) })] })] }), _jsx("p", { children: _jsx("a", { href: "https://github.com/bshack/white-label/tree/master/app", children: "Browse the application source" }) })] })] }) }));
4
+ return html `<section class="section" id="source" aria-labelledby="source-title">
5
+ <div class="container start-grid">
6
+ <div class="section-intro">
7
+ <p class="eyebrow">Read the source</p>
8
+ <h2 id="source-title">This site is part of the documentation.</h2>
9
+ <p>The landing page is built with the same White Label packages it teaches. Start at the page composition, then follow the imports into the interactive example.</p>
10
+ </div>
11
+ <div class="source-paths">
12
+ <dl>
13
+ <div><dt>Page composition</dt><dd><code>app/index.ts</code></dd></div>
14
+ <div><dt>Tagged HTML views</dt><dd><code>app/assets/view/</code></dd></div>
15
+ <div><dt>Task application</dt><dd><code>app/assets/script/tasks/</code></dd></div>
16
+ <div><dt>Integration tests</dt><dd><code>test/app.test.js</code></dd></div>
17
+ </dl>
18
+ <p><a href="https://github.com/bshack/white-label/tree/master/app">Browse the application source</a></p>
19
+ </div>
20
+ </div>
21
+ </section>`;
10
22
  }
11
23
  //# sourceMappingURL=SourceGuideSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SourceGuideSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/SourceGuideSection.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACtC,OAAO,CACH,kBAAS,SAAS,EAAC,SAAS,EAAC,EAAE,EAAC,QAAQ,qBAAiB,cAAc,YACnE,eAAK,SAAS,EAAC,sBAAsB,aACjC,eAAK,SAAS,EAAC,eAAe,aAC1B,YAAG,SAAS,EAAC,SAAS,gCAAoB,EAC1C,aAAI,EAAE,EAAC,cAAc,wDAA6C,EAClE,wLAAoK,IAClK,EACN,eAAK,SAAS,EAAC,cAAc,aACzB,yBACI,0BAAK,4CAAyB,EAAA,uBAAI,2CAA0B,GAAK,IAAM,EACvE,0BAAK,4CAAyB,EAAA,uBAAI,8CAA6B,GAAK,IAAM,EAC1E,0BAAK,4CAAyB,EAAA,uBAAI,sDAAqC,GAAK,IAAM,EAClF,0BAAK,6CAA0B,EAAA,uBAAI,8CAA6B,GAAK,IAAM,IAC1E,EACL,sBAAG,YAAG,IAAI,EAAC,uDAAuD,8CAAkC,GAAI,IACtG,IACJ,GACA,CACb,CAAC;AACN,CAAC","sourcesContent":["/**\n * Point learners at the implementation itself.\n *\n * The landing page is intentionally organized so each path answers a different\n * question: composition, rendering, state, coordination, routing, or testing.\n */\nexport default function SourceGuideSection() {\n return (\n <section className=\"section\" id=\"source\" aria-labelledby=\"source-title\">\n <div className=\"container start-grid\">\n <div className=\"section-intro\">\n <p className=\"eyebrow\">Read the source</p>\n <h2 id=\"source-title\">This site is part of the documentation.</h2>\n <p>The landing page is built with the same White Label packages it teaches. Start at the page composition, then follow the imports into the interactive example.</p>\n </div>\n <div className=\"source-paths\">\n <dl>\n <div><dt>Page composition</dt><dd><code>app/index.tsx</code></dd></div>\n <div><dt>Static JSX views</dt><dd><code>app/assets/view/</code></dd></div>\n <div><dt>Task application</dt><dd><code>app/assets/script/tasks/</code></dd></div>\n <div><dt>Integration tests</dt><dd><code>test/app.test.js</code></dd></div>\n </dl>\n <p><a href=\"https://github.com/bshack/white-label/tree/master/app\">Browse the application source</a></p>\n </div>\n </div>\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"SourceGuideSection.js","sourceRoot":"","sources":["../../../../../app/assets/view/sections/SourceGuideSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,uBAAuB,CAAC;AAE3C,uFAAuF;AACvF,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACtC,OAAO,IAAI,CAAA;;;;;;;;;;;;;;;;;mBAiBI,CAAC;AACpB,CAAC","sourcesContent":["import {html} from 'white-label-view/html';\n\n/** Point learners at the implementation paths that demonstrate each responsibility. */\nexport default function SourceGuideSection() {\n return html`<section class=\"section\" id=\"source\" aria-labelledby=\"source-title\">\n <div class=\"container start-grid\">\n <div class=\"section-intro\">\n <p class=\"eyebrow\">Read the source</p>\n <h2 id=\"source-title\">This site is part of the documentation.</h2>\n <p>The landing page is built with the same White Label packages it teaches. Start at the page composition, then follow the imports into the interactive example.</p>\n </div>\n <div class=\"source-paths\">\n <dl>\n <div><dt>Page composition</dt><dd><code>app/index.ts</code></dd></div>\n <div><dt>Tagged HTML views</dt><dd><code>app/assets/view/</code></dd></div>\n <div><dt>Task application</dt><dd><code>app/assets/script/tasks/</code></dd></div>\n <div><dt>Integration tests</dt><dd><code>test/app.test.js</code></dd></div>\n </dl>\n <p><a href=\"https://github.com/bshack/white-label/tree/master/app\">Browse the application source</a></p>\n </div>\n </div>\n </section>`;\n}\n"]}
@@ -1,8 +1,2 @@
1
- /**
2
- * The page template is intentionally thin.
3
- *
4
- * Developers learning White Label can start here to see the complete page at
5
- * a glance, then follow each import into a focused example. Build-time data is
6
- * kept at this boundary while individual views stay reusable and easy to read.
7
- */
8
- export default function IndexPage(data: Record<string, unknown>): import("white-label-view/jsx-runtime").JSXMarkup;
1
+ /** Compose the static page from small tagged-template functions. */
2
+ export default function IndexPage(data: Record<string, unknown>): import("white-label-view/html").HTMLMarkup;