anentrypoint-design 0.0.121 → 0.0.124

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 (202) hide show
  1. package/README.md +253 -253
  2. package/app-shell.css +931 -594
  3. package/colors_and_type.css +226 -226
  4. package/community.css +817 -1222
  5. package/dist/247420.css +2202 -2084
  6. package/dist/247420.js +13 -13
  7. package/package.json +80 -80
  8. package/src/bootstrap.js +25 -25
  9. package/src/components/chat.js +199 -199
  10. package/src/components/community.js +190 -208
  11. package/src/components/content.js +269 -269
  12. package/src/components/editor-primitives.js +100 -0
  13. package/src/components/files-modals.js +107 -107
  14. package/src/components/files.js +118 -118
  15. package/src/components/freddie/helpers.js +50 -50
  16. package/src/components/freddie.js +33 -33
  17. package/src/components/shell.js +117 -117
  18. package/src/components/theme-toggle.js +70 -70
  19. package/src/components.js +59 -57
  20. package/src/debug.js +30 -30
  21. package/src/deck-stage.js +21 -21
  22. package/src/highlight.js +65 -32
  23. package/src/index.js +86 -86
  24. package/src/kits/os/about-app.js +52 -52
  25. package/src/kits/os/app-panes.css +152 -152
  26. package/src/kits/os/browser-app.js +58 -58
  27. package/src/kits/os/files-app.js +44 -44
  28. package/src/kits/os/freddie/helpers.js +59 -59
  29. package/src/kits/os/freddie/pages-chat.js +143 -143
  30. package/src/kits/os/freddie/pages-core.js +101 -101
  31. package/src/kits/os/freddie/pages-os.js +51 -51
  32. package/src/kits/os/freddie/pages-tools.js +183 -183
  33. package/src/kits/os/freddie/routes.js +24 -24
  34. package/src/kits/os/freddie-dashboard.css +51 -51
  35. package/src/kits/os/freddie-dashboard.js +101 -101
  36. package/src/kits/os/icons.js +17 -17
  37. package/src/kits/os/index.js +17 -17
  38. package/src/kits/os/launcher.css +61 -61
  39. package/src/kits/os/launcher.js +79 -79
  40. package/src/kits/os/monitor-app.js +34 -34
  41. package/src/kits/os/shell.js +214 -214
  42. package/src/kits/os/terminal-app.js +45 -45
  43. package/src/kits/os/theme.css +450 -450
  44. package/src/kits/os/validate.css +19 -19
  45. package/src/kits/os/validator-app.js +55 -55
  46. package/src/kits/os/wm.css +115 -115
  47. package/src/kits/os/wm.js +111 -111
  48. package/src/markdown.js +39 -39
  49. package/src/motion.js +35 -35
  50. package/src/page-html.js +196 -196
  51. package/src/styles.js +25 -25
  52. package/src/theme.js +99 -99
  53. package/src/web-components/ds-chat.js +116 -116
  54. package/dist/.nojekyll +0 -0
  55. package/dist/app-shell.css +0 -594
  56. package/dist/colors_and_type.css +0 -197
  57. package/dist/favicon.svg +0 -1
  58. package/dist/index.html +0 -308
  59. package/dist/preview/buttons.html +0 -28
  60. package/dist/preview/colors-core.html +0 -45
  61. package/dist/preview/colors-lore.html +0 -28
  62. package/dist/preview/colors-semantic.html +0 -34
  63. package/dist/preview/dateline.html +0 -19
  64. package/dist/preview/dropzone.html +0 -30
  65. package/dist/preview/file-grid.html +0 -19
  66. package/dist/preview/file-row.html +0 -20
  67. package/dist/preview/file-toolbar.html +0 -40
  68. package/dist/preview/file-viewer.html +0 -31
  69. package/dist/preview/header.html +0 -24
  70. package/dist/preview/icons-unicode.html +0 -26
  71. package/dist/preview/index-row.html +0 -25
  72. package/dist/preview/inputs.html +0 -22
  73. package/dist/preview/manifesto.html +0 -52
  74. package/dist/preview/motion-default.js +0 -106
  75. package/dist/preview/rules.html +0 -16
  76. package/dist/preview/spacing.html +0 -18
  77. package/dist/preview/stamps-lore.html +0 -20
  78. package/dist/preview/stamps.html +0 -14
  79. package/dist/preview/theme-ink.html +0 -15
  80. package/dist/preview/type-display.html +0 -16
  81. package/dist/preview/type-mono.html +0 -15
  82. package/dist/preview/type-prose.html +0 -11
  83. package/dist/preview/type-scale.html +0 -20
  84. package/dist/preview/wordmarks.html +0 -28
  85. package/dist/robots.txt +0 -8
  86. package/dist/site/content/globals/navigation.yaml +0 -5
  87. package/dist/site/content/globals/site.yaml +0 -16
  88. package/dist/site/content/pages/freddie.yaml +0 -88
  89. package/dist/site/content/pages/home.yaml +0 -190
  90. package/dist/site/theme.mjs +0 -368
  91. package/dist/sitemap.xml +0 -31
  92. package/dist/slides/deck-stage-overlay.js +0 -63
  93. package/dist/slides/deck-stage-state.js +0 -81
  94. package/dist/slides/deck-stage-style.js +0 -117
  95. package/dist/slides/deck-stage.js +0 -159
  96. package/dist/slides/index.html +0 -276
  97. package/dist/src/bootstrap.js +0 -25
  98. package/dist/src/components/chat.js +0 -199
  99. package/dist/src/components/community.js +0 -167
  100. package/dist/src/components/content.js +0 -213
  101. package/dist/src/components/files-modals.js +0 -107
  102. package/dist/src/components/files.js +0 -118
  103. package/dist/src/components/freddie/helpers.js +0 -50
  104. package/dist/src/components/freddie.js +0 -33
  105. package/dist/src/components/shell.js +0 -117
  106. package/dist/src/components/theme-toggle.js +0 -70
  107. package/dist/src/components.js +0 -52
  108. package/dist/src/debug.js +0 -30
  109. package/dist/src/deck-stage.js +0 -21
  110. package/dist/src/highlight.js +0 -32
  111. package/dist/src/index.js +0 -86
  112. package/dist/src/kits/os/about-app.js +0 -52
  113. package/dist/src/kits/os/app-panes.css +0 -152
  114. package/dist/src/kits/os/browser-app.js +0 -58
  115. package/dist/src/kits/os/files-app.js +0 -44
  116. package/dist/src/kits/os/freddie/helpers.js +0 -59
  117. package/dist/src/kits/os/freddie/pages-chat.js +0 -143
  118. package/dist/src/kits/os/freddie/pages-core.js +0 -101
  119. package/dist/src/kits/os/freddie/pages-os.js +0 -51
  120. package/dist/src/kits/os/freddie/pages-tools.js +0 -183
  121. package/dist/src/kits/os/freddie/routes.js +0 -24
  122. package/dist/src/kits/os/freddie-dashboard.css +0 -51
  123. package/dist/src/kits/os/freddie-dashboard.js +0 -101
  124. package/dist/src/kits/os/icons.js +0 -17
  125. package/dist/src/kits/os/index.js +0 -5
  126. package/dist/src/kits/os/launcher.css +0 -61
  127. package/dist/src/kits/os/launcher.js +0 -79
  128. package/dist/src/kits/os/monitor-app.js +0 -34
  129. package/dist/src/kits/os/shell.js +0 -214
  130. package/dist/src/kits/os/terminal-app.js +0 -45
  131. package/dist/src/kits/os/theme.css +0 -412
  132. package/dist/src/kits/os/validate.css +0 -19
  133. package/dist/src/kits/os/validator-app.js +0 -55
  134. package/dist/src/kits/os/wm.css +0 -115
  135. package/dist/src/kits/os/wm.js +0 -111
  136. package/dist/src/markdown.js +0 -39
  137. package/dist/src/motion.js +0 -35
  138. package/dist/src/page-html.js +0 -196
  139. package/dist/src/styles.js +0 -25
  140. package/dist/src/theme.js +0 -99
  141. package/dist/src/web-components/ds-chat.js +0 -45
  142. package/dist/ui_kits/aicat/README.md +0 -7
  143. package/dist/ui_kits/aicat/app.js +0 -156
  144. package/dist/ui_kits/aicat/index.html +0 -26
  145. package/dist/ui_kits/aicat/sample-square.png +0 -0
  146. package/dist/ui_kits/aicat/sample-svg.svg +0 -1
  147. package/dist/ui_kits/aicat/sample.pdf +0 -32
  148. package/dist/ui_kits/blog/README.md +0 -3
  149. package/dist/ui_kits/blog/index.html +0 -90
  150. package/dist/ui_kits/chat/README.md +0 -5
  151. package/dist/ui_kits/chat/app.js +0 -110
  152. package/dist/ui_kits/chat/index.html +0 -26
  153. package/dist/ui_kits/chat/sample-square.png +0 -0
  154. package/dist/ui_kits/chat/sample-svg.svg +0 -1
  155. package/dist/ui_kits/chat/sample.pdf +0 -32
  156. package/dist/ui_kits/community/app.js +0 -134
  157. package/dist/ui_kits/community/index.html +0 -24
  158. package/dist/ui_kits/dashboard/app.js +0 -92
  159. package/dist/ui_kits/dashboard/index.html +0 -26
  160. package/dist/ui_kits/docs/README.md +0 -3
  161. package/dist/ui_kits/docs/index.html +0 -123
  162. package/dist/ui_kits/error_404/app.js +0 -56
  163. package/dist/ui_kits/error_404/index.html +0 -26
  164. package/dist/ui_kits/file_browser/README.md +0 -48
  165. package/dist/ui_kits/file_browser/app.js +0 -231
  166. package/dist/ui_kits/file_browser/index.html +0 -33
  167. package/dist/ui_kits/gallery/app.js +0 -121
  168. package/dist/ui_kits/gallery/index.html +0 -26
  169. package/dist/ui_kits/homepage/README.md +0 -7
  170. package/dist/ui_kits/homepage/app.js +0 -167
  171. package/dist/ui_kits/homepage/index.html +0 -46
  172. package/dist/ui_kits/project_page/README.md +0 -3
  173. package/dist/ui_kits/project_page/app.js +0 -154
  174. package/dist/ui_kits/project_page/index.html +0 -45
  175. package/dist/ui_kits/search/app.js +0 -107
  176. package/dist/ui_kits/search/index.html +0 -26
  177. package/dist/ui_kits/settings/app.js +0 -133
  178. package/dist/ui_kits/settings/index.html +0 -26
  179. package/dist/ui_kits/signin/app.js +0 -115
  180. package/dist/ui_kits/signin/index.html +0 -26
  181. package/dist/ui_kits/slide_deck/app.js +0 -174
  182. package/dist/ui_kits/slide_deck/index.html +0 -26
  183. package/dist/ui_kits/system_primer/app.js +0 -152
  184. package/dist/ui_kits/system_primer/index.html +0 -26
  185. package/dist/ui_kits/terminal/app.js +0 -150
  186. package/dist/ui_kits/terminal/index.html +0 -26
  187. package/dist/vendor/webjsx/applyDiff.js +0 -182
  188. package/dist/vendor/webjsx/attributes.js +0 -154
  189. package/dist/vendor/webjsx/constants.js +0 -4
  190. package/dist/vendor/webjsx/createDOMElement.js +0 -52
  191. package/dist/vendor/webjsx/createElement.js +0 -75
  192. package/dist/vendor/webjsx/elementTags.js +0 -115
  193. package/dist/vendor/webjsx/factory.js +0 -6
  194. package/dist/vendor/webjsx/index.js +0 -6
  195. package/dist/vendor/webjsx/jsx-dev-runtime.js +0 -2
  196. package/dist/vendor/webjsx/jsx-runtime.js +0 -30
  197. package/dist/vendor/webjsx/jsx.js +0 -2
  198. package/dist/vendor/webjsx/package.json +0 -39
  199. package/dist/vendor/webjsx/renderSuspension.js +0 -25
  200. package/dist/vendor/webjsx/types.js +0 -5
  201. package/dist/vendor/webjsx/utils.js +0 -84
  202. package/src/components/overlays.js +0 -151
package/src/highlight.js CHANGED
@@ -1,32 +1,65 @@
1
- // Syntax highlighting — lazy-loads Prism on first call. No-op safe.
2
-
3
- let _prism = null;
4
- let _ready = null;
5
-
6
- const PRISM_CORE = 'https://cdn.jsdelivr.net/npm/prismjs@1.30.0/components/prism-core.min.js';
7
-
8
- export async function ensurePrism() {
9
- if (_prism) return _prism;
10
- if (_ready) return _ready;
11
- _ready = (async () => {
12
- try {
13
- // Prism is UMD; fetch & exec on the global.
14
- const res = await fetch(PRISM_CORE);
15
- const code = await res.text();
16
- // eslint-disable-next-line no-new-func
17
- new Function('window', code)(window);
18
- _prism = window.Prism || null;
19
- return _prism;
20
- } catch (err) {
21
- console.warn('[247420] prism loader failed:', err);
22
- return null;
23
- }
24
- })();
25
- return _ready;
26
- }
27
-
28
- export async function highlightAllUnder(root) {
29
- const Prism = await ensurePrism();
30
- if (!Prism || !root) return;
31
- if (typeof Prism.highlightAllUnder === 'function') Prism.highlightAllUnder(root);
32
- }
1
+ // Syntax highlighting — lazy-loads Prism + common language grammars on first call. No-op safe.
2
+
3
+ let _prism = null;
4
+ let _ready = null;
5
+
6
+ const PRISM_BASE = 'https://cdn.jsdelivr.net/npm/prismjs@1.30.0/components/';
7
+ const PRISM_CORE = PRISM_BASE + 'prism-core.min.js';
8
+ const PRISM_LANGS = [
9
+ 'prism-markup.min.js',
10
+ 'prism-css.min.js',
11
+ 'prism-clike.min.js',
12
+ 'prism-javascript.min.js',
13
+ 'prism-typescript.min.js',
14
+ 'prism-json.min.js',
15
+ 'prism-bash.min.js',
16
+ 'prism-yaml.min.js',
17
+ 'prism-markdown.min.js',
18
+ 'prism-python.min.js',
19
+ 'prism-rust.min.js',
20
+ 'prism-go.min.js',
21
+ 'prism-jsx.min.js',
22
+ 'prism-tsx.min.js',
23
+ 'prism-diff.min.js',
24
+ 'prism-sql.min.js',
25
+ 'prism-toml.min.js',
26
+ ];
27
+
28
+ async function loadIntoGlobal(url) {
29
+ try {
30
+ const res = await fetch(url);
31
+ if (!res.ok) throw new Error('http ' + res.status);
32
+ const code = await res.text();
33
+ // eslint-disable-next-line no-new-func
34
+ new Function('window', code)(window);
35
+ } catch (err) {
36
+ console.warn('[247420] prism part failed:', url, err.message);
37
+ }
38
+ }
39
+
40
+ export async function ensurePrism() {
41
+ if (_prism) return _prism;
42
+ if (_ready) return _ready;
43
+ _ready = (async () => {
44
+ try {
45
+ await loadIntoGlobal(PRISM_CORE);
46
+ _prism = window.Prism || null;
47
+ if (_prism) {
48
+ for (const f of PRISM_LANGS) {
49
+ await loadIntoGlobal(PRISM_BASE + f);
50
+ }
51
+ }
52
+ return _prism;
53
+ } catch (err) {
54
+ console.warn('[247420] prism loader failed:', err);
55
+ return null;
56
+ }
57
+ })();
58
+ return _ready;
59
+ }
60
+
61
+ export async function highlightAllUnder(root) {
62
+ const Prism = await ensurePrism();
63
+ if (!Prism || !root) return;
64
+ if (typeof Prism.highlightAllUnder === 'function') Prism.highlightAllUnder(root);
65
+ }
package/src/index.js CHANGED
@@ -1,86 +1,86 @@
1
- // 247420 design system — main entry.
2
- // Drop-in replacement: same export surface as the published SDK.
3
- // import { mount, components as C, h, applyDiff, scope } from 'anentrypoint-design';
4
-
5
- import * as webjsx from '../vendor/webjsx/index.js';
6
- import { loadCss, scope } from './styles.js';
7
- import { registerDeckStage, getDeckStage } from './deck-stage.js';
8
- import * as components from './components.js';
9
- import * as motion from './motion.js';
10
- import * as debug from './debug.js';
11
- import { renderMarkdown, ensureReady as ensureMarkdownReady } from './markdown.js';
12
- import { ensurePrism, highlightAllUnder } from './highlight.js';
13
- import { renderPageHtml } from './page-html.js';
14
- import { mountKit } from './bootstrap.js';
15
- import * as theme from './theme.js';
16
- import { registerChatElement, DsChat } from './web-components/ds-chat.js';
17
-
18
- let _installed = false;
19
- export async function installStyles(target) {
20
- if (_installed && !target) return;
21
- if (typeof document === 'undefined') return;
22
- const css = await loadCss();
23
- const root = target || document.head;
24
- if (!target && document.querySelector('style[data-247420]')) { _installed = true; return; }
25
- const tag = document.createElement('style');
26
- tag.setAttribute('data-247420', '');
27
- tag.textContent = css;
28
- root.appendChild(tag);
29
- if (!target) {
30
- motion.installMotion();
31
- _installed = true;
32
- }
33
- }
34
-
35
- export function mount(rootEl, viewFn, { autoScope = true } = {}) {
36
- if (!rootEl) throw new Error('mount: rootEl required');
37
- if (typeof viewFn !== 'function') throw new Error('mount: viewFn required');
38
- if (autoScope && rootEl.classList && !rootEl.classList.contains(scope.slice(1))) {
39
- const cls = scope.slice(1);
40
- const inheritedFromAncestor = rootEl.closest && rootEl.closest('.' + cls);
41
- if (!inheritedFromAncestor) rootEl.classList.add(cls);
42
- }
43
- // Auto-inject styles (idempotent) so single-line consumers don't need
44
- // to remember installStyles() before mount.
45
- installStyles().catch(() => {});
46
- const render = () => {
47
- webjsx.applyDiff(rootEl, viewFn(render));
48
- requestAnimationFrame(() => motion.animateTree(rootEl));
49
- };
50
- render();
51
- return render;
52
- }
53
-
54
- // Side-effect: register <ds-chat> as soon as the SDK loads in a browser.
55
- if (typeof window !== 'undefined' && typeof customElements !== 'undefined') {
56
- registerChatElement();
57
- }
58
-
59
- export {
60
- webjsx, loadCss, scope,
61
- registerDeckStage, getDeckStage,
62
- components, motion, debug, mountKit,
63
- renderMarkdown, ensureMarkdownReady,
64
- ensurePrism, highlightAllUnder,
65
- registerChatElement, DsChat,
66
- renderPageHtml,
67
- theme
68
- };
69
- export { applyTheme, getTheme, resolvedTheme, onThemeChange, initTheme } from './theme.js';
70
- export const h = webjsx.createElement;
71
- export const applyDiff = webjsx.applyDiff;
72
-
73
- // Re-export freddie helpers so consumers can `import { FREDDIE_PAGES } from
74
- // 'anentrypoint-design'` directly.
75
- export {
76
- FREDDIE_PAGES,
77
- home, chat, voice, sessions, projects, agents, analytics,
78
- models, cron, skills, config, env, tools, batch, gateway, chains,
79
- skillLabel, getRecentPaths, saveRecentPath, renderChatMessages
80
- } from './components.js';
81
-
82
- export default {
83
- webjsx, loadCss, scope, installStyles, mount, h, applyDiff,
84
- registerDeckStage, getDeckStage, components, motion, debug, mountKit,
85
- renderMarkdown, ensurePrism, registerChatElement, renderPageHtml
86
- };
1
+ // 247420 design system — main entry.
2
+ // Drop-in replacement: same export surface as the published SDK.
3
+ // import { mount, components as C, h, applyDiff, scope } from 'anentrypoint-design';
4
+
5
+ import * as webjsx from '../vendor/webjsx/index.js';
6
+ import { loadCss, scope } from './styles.js';
7
+ import { registerDeckStage, getDeckStage } from './deck-stage.js';
8
+ import * as components from './components.js';
9
+ import * as motion from './motion.js';
10
+ import * as debug from './debug.js';
11
+ import { renderMarkdown, ensureReady as ensureMarkdownReady } from './markdown.js';
12
+ import { ensurePrism, highlightAllUnder } from './highlight.js';
13
+ import { renderPageHtml } from './page-html.js';
14
+ import { mountKit } from './bootstrap.js';
15
+ import * as theme from './theme.js';
16
+ import { registerChatElement, DsChat } from './web-components/ds-chat.js';
17
+
18
+ let _installed = false;
19
+ export async function installStyles(target) {
20
+ if (_installed && !target) return;
21
+ if (typeof document === 'undefined') return;
22
+ const css = await loadCss();
23
+ const root = target || document.head;
24
+ if (!target && document.querySelector('style[data-247420]')) { _installed = true; return; }
25
+ const tag = document.createElement('style');
26
+ tag.setAttribute('data-247420', '');
27
+ tag.textContent = css;
28
+ root.appendChild(tag);
29
+ if (!target) {
30
+ motion.installMotion();
31
+ _installed = true;
32
+ }
33
+ }
34
+
35
+ export function mount(rootEl, viewFn, { autoScope = true } = {}) {
36
+ if (!rootEl) throw new Error('mount: rootEl required');
37
+ if (typeof viewFn !== 'function') throw new Error('mount: viewFn required');
38
+ if (autoScope && rootEl.classList && !rootEl.classList.contains(scope.slice(1))) {
39
+ const cls = scope.slice(1);
40
+ const inheritedFromAncestor = rootEl.closest && rootEl.closest('.' + cls);
41
+ if (!inheritedFromAncestor) rootEl.classList.add(cls);
42
+ }
43
+ // Auto-inject styles (idempotent) so single-line consumers don't need
44
+ // to remember installStyles() before mount.
45
+ installStyles().catch(() => {});
46
+ const render = () => {
47
+ webjsx.applyDiff(rootEl, viewFn(render));
48
+ requestAnimationFrame(() => motion.animateTree(rootEl));
49
+ };
50
+ render();
51
+ return render;
52
+ }
53
+
54
+ // Side-effect: register <ds-chat> as soon as the SDK loads in a browser.
55
+ if (typeof window !== 'undefined' && typeof customElements !== 'undefined') {
56
+ registerChatElement();
57
+ }
58
+
59
+ export {
60
+ webjsx, loadCss, scope,
61
+ registerDeckStage, getDeckStage,
62
+ components, motion, debug, mountKit,
63
+ renderMarkdown, ensureMarkdownReady,
64
+ ensurePrism, highlightAllUnder,
65
+ registerChatElement, DsChat,
66
+ renderPageHtml,
67
+ theme
68
+ };
69
+ export { applyTheme, getTheme, resolvedTheme, onThemeChange, initTheme } from './theme.js';
70
+ export const h = webjsx.createElement;
71
+ export const applyDiff = webjsx.applyDiff;
72
+
73
+ // Re-export freddie helpers so consumers can `import { FREDDIE_PAGES } from
74
+ // 'anentrypoint-design'` directly.
75
+ export {
76
+ FREDDIE_PAGES,
77
+ home, chat, voice, sessions, projects, agents, analytics,
78
+ models, cron, skills, config, env, tools, batch, gateway, chains,
79
+ skillLabel, getRecentPaths, saveRecentPath, renderChatMessages
80
+ } from './components.js';
81
+
82
+ export default {
83
+ webjsx, loadCss, scope, installStyles, mount, h, applyDiff,
84
+ registerDeckStage, getDeckStage, components, motion, debug, mountKit,
85
+ renderMarkdown, ensurePrism, registerChatElement, renderPageHtml
86
+ };
@@ -1,52 +1,52 @@
1
- // About-app paint surface — static info card, bible classes.
2
- // renderAboutApp({brand, tagline, bullets, links}) -> {node, dispose}.
3
- // Consumer provides content; module owns layout + classes.
4
-
5
- export function renderAboutApp(opts = {}) {
6
- const {
7
- brand = 'thebird / web os',
8
- tagline = 'browser-native web OS. multi-instance, per-instance fs / worker / shell / browser. no server.',
9
- bullets = [
10
- 'POSIX terminal · IndexedDB filesystem',
11
- 'OffscreenCanvas worker per instance',
12
- 'CDP-shaped browser pane',
13
- 'libsql via sql.js · freddie host',
14
- 'responsive: phone / tablet / desktop',
15
- ],
16
- footer = 'open <code>validator</code> to run isolation harness · click apps menu for more.',
17
- links = [
18
- { href: 'https://github.com/AnEntrypoint/thebird', text: 'source' },
19
- { href: './validate.html', text: 'validate' },
20
- ],
21
- } = opts;
22
-
23
- const node = document.createElement('div');
24
- node.className = 'app-pane';
25
- node.dataset.component = 'about-app';
26
-
27
- const h2 = document.createElement('h2');
28
- h2.textContent = brand;
29
- const p = document.createElement('p');
30
- p.textContent = tagline;
31
- const ul = document.createElement('ul');
32
- for (const b of bullets) {
33
- const li = document.createElement('li');
34
- li.textContent = b;
35
- ul.appendChild(li);
36
- }
37
- const foot = document.createElement('p');
38
- foot.innerHTML = footer;
39
- const meta = document.createElement('p');
40
- meta.className = 'meta';
41
- links.forEach((l, i) => {
42
- const a = document.createElement('a');
43
- a.href = l.href;
44
- a.textContent = l.text;
45
- meta.appendChild(a);
46
- if (i < links.length - 1) meta.appendChild(document.createTextNode(' · '));
47
- });
48
-
49
- node.append(h2, p, ul, foot, meta);
50
-
51
- return { node, dispose() {} };
52
- }
1
+ // About-app paint surface — static info card, bible classes.
2
+ // renderAboutApp({brand, tagline, bullets, links}) -> {node, dispose}.
3
+ // Consumer provides content; module owns layout + classes.
4
+
5
+ export function renderAboutApp(opts = {}) {
6
+ const {
7
+ brand = 'thebird / web os',
8
+ tagline = 'browser-native web OS. multi-instance, per-instance fs / worker / shell / browser. no server.',
9
+ bullets = [
10
+ 'POSIX terminal · IndexedDB filesystem',
11
+ 'OffscreenCanvas worker per instance',
12
+ 'CDP-shaped browser pane',
13
+ 'libsql via sql.js · freddie host',
14
+ 'responsive: phone / tablet / desktop',
15
+ ],
16
+ footer = 'open <code>validator</code> to run isolation harness · click apps menu for more.',
17
+ links = [
18
+ { href: 'https://github.com/AnEntrypoint/thebird', text: 'source' },
19
+ { href: './validate.html', text: 'validate' },
20
+ ],
21
+ } = opts;
22
+
23
+ const node = document.createElement('div');
24
+ node.className = 'app-pane';
25
+ node.dataset.component = 'about-app';
26
+
27
+ const h2 = document.createElement('h2');
28
+ h2.textContent = brand;
29
+ const p = document.createElement('p');
30
+ p.textContent = tagline;
31
+ const ul = document.createElement('ul');
32
+ for (const b of bullets) {
33
+ const li = document.createElement('li');
34
+ li.textContent = b;
35
+ ul.appendChild(li);
36
+ }
37
+ const foot = document.createElement('p');
38
+ foot.innerHTML = footer;
39
+ const meta = document.createElement('p');
40
+ meta.className = 'meta';
41
+ links.forEach((l, i) => {
42
+ const a = document.createElement('a');
43
+ a.href = l.href;
44
+ a.textContent = l.text;
45
+ meta.appendChild(a);
46
+ if (i < links.length - 1) meta.appendChild(document.createTextNode(' · '));
47
+ });
48
+
49
+ node.append(h2, p, ul, foot, meta);
50
+
51
+ return { node, dispose() {} };
52
+ }