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
@@ -1,107 +0,0 @@
1
- import * as webjsx from 'webjsx';
2
- import { Topbar, Crumb, Status, Side, AppShell, Panel, Heading, Lede, Chip, Row, RowLink } from 'ds/components.js';
3
- import { mountKit } from 'ds/bootstrap.js';
4
- const h = webjsx.createElement;
5
-
6
- const root = document.getElementById('root');
7
-
8
- const corpus = [
9
- { code: 'kit', title: 'aicat', sub: 'ai assistant with cat persona — ascii portrait + mood face', kind: 'kit', href: '../aicat/' },
10
- { code: 'kit', title: 'chat', sub: 'message thread + composer with pill bubbles', kind: 'kit', href: '../chat/' },
11
- { code: 'kit', title: 'dashboard', sub: 'kpis, tables, receipts, changelog, panels', kind: 'kit', href: '../dashboard/' },
12
- { code: 'kit', title: 'file_browser', sub: 'rails by file type, drop, preview', kind: 'kit', href: '../file_browser/' },
13
- { code: 'kit', title: 'homepage', sub: 'marquee + works grid editorial banner', kind: 'kit', href: '../homepage/' },
14
- { code: 'kit', title: 'settings', sub: 'sectioned forms, toggles, inputs, save bar', kind: 'kit', href: '../settings/' },
15
- { code: 'kit', title: 'signin', sub: 'auth panel, providers, magic link', kind: 'kit', href: '../signin/' },
16
- { code: 'kit', title: 'terminal', sub: 'cli prompt, command lines, log viewer', kind: 'kit', href: '../terminal/' },
17
- { code: 'pre', title: 'buttons', sub: 'primary · secondary · ghost — 6px radius', kind: 'preview', href: '../../preview/buttons.html' },
18
- { code: 'pre', title: 'colors-core', sub: 'paper, ink, panel-N tonal stack', kind: 'preview', href: '../../preview/colors-core.html' },
19
- { code: 'pre', title: 'dropzone', sub: 'tonal upload target', kind: 'preview', href: '../../preview/dropzone.html' },
20
- { code: 'pre', title: 'file-viewer', sub: 'modal preview · keyed head + body', kind: 'preview', href: '../../preview/file-viewer.html' },
21
- { code: 'pre', title: 'manifesto', sub: 'long-form prose with editorial caps', kind: 'preview', href: '../../preview/manifesto.html' },
22
- { code: 'pre', title: 'type-display', sub: 'display type ramp at the largest sizes', kind: 'preview', href: '../../preview/type-display.html' },
23
- { code: 'doc', title: 'README', sub: 'overview, manifesto, conventions', kind: 'doc', href: 'https://github.com/AnEntrypoint/design/blob/main/README.md' },
24
- { code: 'doc', title: 'SKILL', sub: 'authoring rules for the agent', kind: 'doc', href: 'https://github.com/AnEntrypoint/design/blob/main/SKILL.md' },
25
- { code: 'api', title: 'h / applyDiff', sub: 'webjsx createElement + diff', kind: 'api', href: 'https://github.com/AnEntrypoint/design/blob/main/src/index.js' },
26
- { code: 'api', title: 'mountKit', sub: 'ds shell + ui_kit bootstrap', kind: 'api', href: 'https://github.com/AnEntrypoint/design/blob/main/src/bootstrap.js' },
27
- { code: 'api', title: 'renderMarkdown',sub: 'marked v15 + dompurify lazy stack', kind: 'api', href: 'https://github.com/AnEntrypoint/design/blob/main/src/markdown.js' }
28
- ];
29
-
30
- const kinds = ['all', 'kit', 'preview', 'doc', 'api'];
31
-
32
- const state = { q: 'panel', kind: 'all' };
33
-
34
- function score(item, q) {
35
- const t = (item.title + ' ' + item.sub).toLowerCase();
36
- const tokens = q.toLowerCase().split(/\s+/).filter(Boolean);
37
- if (!tokens.length) return 1;
38
- let s = 0;
39
- for (const tok of tokens) {
40
- if (item.title.toLowerCase().includes(tok)) s += 3;
41
- if (t.includes(tok)) s += 1;
42
- }
43
- return s;
44
- }
45
-
46
- function results() {
47
- const filtered = corpus.filter((c) => state.kind === 'all' || c.kind === state.kind);
48
- return filtered.map((c) => ({ ...c, _s: score(c, state.q) }))
49
- .filter((c) => c._s > 0)
50
- .sort((a, b) => b._s - a._s);
51
- }
52
-
53
- function App() {
54
- const rows = results();
55
- return AppShell({
56
- topbar: Topbar({
57
- brand: '247420', leaf: 'search',
58
- items: [['index', '../../'], ['source ↗', 'https://github.com/AnEntrypoint/design']],
59
- search: h('input', {
60
- class: 'input', value: state.q, placeholder: 'search kits, previews, docs, api…',
61
- style: 'width:280px',
62
- oninput: (e) => { state.q = e.target.value; kit.render(); }
63
- })
64
- }),
65
- crumb: Crumb({ trail: ['247420', 'kits'], leaf: 'search', right: rows.length + ' result' + (rows.length === 1 ? '' : 's') }),
66
- side: Side({
67
- sections: [
68
- { group: 'kind', items: kinds.map((k) => ({
69
- glyph: state.kind === k ? '●' : '○', label: k,
70
- count: k === 'all' ? corpus.length : corpus.filter((c) => c.kind === k).length,
71
- href: '#' + k, active: state.kind === k, key: k,
72
- onClick: (e) => { e.preventDefault(); state.kind = k; kit.render(); }
73
- })) },
74
- { group: 'recent', items: [
75
- { glyph: '·', label: 'panel', key: 'q1', onClick: (e) => { e.preventDefault(); state.q = 'panel'; kit.render(); } },
76
- { glyph: '·', label: 'rail', key: 'q2', onClick: (e) => { e.preventDefault(); state.q = 'rail'; kit.render(); } },
77
- { glyph: '·', label: 'chat', key: 'q3', onClick: (e) => { e.preventDefault(); state.q = 'chat'; kit.render(); } },
78
- { glyph: '·', label: 'auth', key: 'q4', onClick: (e) => { e.preventDefault(); state.q = 'auth'; kit.render(); } }
79
- ] }
80
- ]
81
- }),
82
- main: [
83
- h('div', { class: 'ds-section', style: 'padding:8px' },
84
- Heading({ level: 1, children: 'search' }),
85
- Lede({ children: 'query bar in the topbar, faceted filters in the sidebar, ranked results in panel rows. same row primitive every other surface uses.' }),
86
- rows.length ? Panel({ title: 'results', count: rows.length, style: 'margin:8px 0', children:
87
- rows.map((r, i) => RowLink({ key: 'r' + r.code + i, code: r.code, title: r.title, sub: r.sub, meta: r.kind + ' ↗', href: r.href }))
88
- }) : Panel({ title: 'no results', style: 'margin:8px 0', children: h('div', { style: 'padding:24px;text-align:center;color:var(--panel-text-3)' },
89
- h('div', { style: 'font-size:32px' }, '◌'),
90
- h('p', { style: 'margin:6px 0' }, 'no matches for ', h('code', {}, '"' + state.q + '"')),
91
- h('p', { style: 'margin:0;font-size:13px' }, 'try a shorter query, or pick a different kind.')
92
- ) }),
93
- Panel({ title: 'about this kit', style: 'margin:8px 0', children: h('div', { class: 'ds-pattern-notes' },
94
- h('p', {}, '· query input lives in the ', Chip({ tone: 'accent', children: 'Topbar' }), ' search slot — same component the index uses.'),
95
- h('p', {}, '· filters are ', Chip({ tone: 'accent', children: 'Side' }), ' sections with active states; counts come from the corpus.'),
96
- h('p', {}, '· results reuse ', Chip({ tone: 'accent', children: 'RowLink' }), ' — never a bespoke result row.')
97
- ) })
98
- )
99
- ],
100
- status: Status({
101
- left: ['search', '• kind=' + state.kind, '• ' + rows.length + ' rows'],
102
- right: ['247420 / mmxxvi']
103
- })
104
- });
105
- }
106
-
107
- const kit = mountKit({ root, view: App, screen: '12 Search' });
@@ -1,26 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-theme="auto" class="ds-247420"><head>
3
- <meta charset="utf-8">
4
- <meta name="viewport" content="width=device-width, initial-scale=1">
5
- <meta name="theme-color" content="#247420" media="(prefers-color-scheme: light)">
6
- <meta name="theme-color" content="#3A9A34" media="(prefers-color-scheme: dark)">
7
- <meta name="color-scheme" content="light dark">
8
- <title>search / 247420</title>
9
- <meta name="description" content="search ui kit — query bar, faceted filters, ranked results.">
10
- <link rel="canonical" href="https://anentrypoint.github.io/design/ui_kits/search/">
11
- <link rel="icon" type="image/svg+xml" href="../../favicon.svg">
12
- <link rel="stylesheet" href="../../colors_and_type.css">
13
- <link rel="stylesheet" href="../../app-shell.css">
14
- <script type="importmap">
15
- { "imports": {
16
- "webjsx": "../../vendor/webjsx/index.js",
17
- "webjsx/": "../../vendor/webjsx/",
18
- "webjsx/jsx-runtime": "../../vendor/webjsx/jsx-runtime.js",
19
- "ds/": "../../src/"
20
- } }
21
- </script>
22
- </head>
23
- <body data-screen-label="12 Search">
24
- <div id="root"></div>
25
- <script type="module" src="./app.js"></script>
26
- </body></html>
@@ -1,133 +0,0 @@
1
- import * as webjsx from 'webjsx';
2
- import { Topbar, Crumb, Status, Side, AppShell, Panel, Heading, Lede, Chip, Btn, Row } from 'ds/components.js';
3
- import { mountKit } from 'ds/bootstrap.js';
4
- const h = webjsx.createElement;
5
-
6
- const root = document.getElementById('root');
7
-
8
- const state = {
9
- section: 'profile',
10
- name: 'lanmower',
11
- email: 'almagestfraternite@gmail.com',
12
- handle: '@247420',
13
- bio: 'creative department of the internet. always open. always a little high.',
14
- theme: 'auto',
15
- motion: true,
16
- notify: { mentions: true, releases: true, marketing: false },
17
- api_key: 'sk-247420-•••••••-c2a',
18
- dirty: false
19
- };
20
-
21
- const sections = [
22
- { id: 'profile', label: 'profile', glyph: '◆' },
23
- { id: 'theme', label: 'theme', glyph: '◐' },
24
- { id: 'notify', label: 'notifications',glyph: '◇' },
25
- { id: 'api', label: 'api keys', glyph: '⌘' },
26
- { id: 'danger', label: 'danger zone', glyph: '!' }
27
- ];
28
-
29
- function Field({ label, hint, children }) {
30
- return h('label', { class: 'ds-field', style: 'display:flex;flex-direction:column;gap:6px;margin:10px 0' },
31
- h('span', { style: 'font-family:var(--ff-mono);font-size:11px;letter-spacing:0.06em;text-transform:uppercase;color:var(--panel-text-3)' }, label),
32
- children,
33
- hint ? h('span', { style: 'font-size:12px;color:var(--panel-text-2)' }, hint) : null
34
- );
35
- }
36
-
37
- function Toggle({ on, onChange, label }) {
38
- return h('button', {
39
- class: on ? 'btn btn-primary' : 'btn',
40
- style: 'min-width:78px',
41
- onclick: () => { onChange(!on); state.dirty = true; kit.render(); }
42
- }, on ? '● on' : '○ off', label ? h('span', { style: 'margin-left:8px;color:inherit;opacity:0.7' }, label) : null);
43
- }
44
-
45
- function Profile() {
46
- return Panel({ title: 'profile', style: 'margin:8px 0', children: h('div', { style: 'padding:14px 18px' },
47
- Field({ label: 'name', hint: 'shown on commits and PRs.', children:
48
- h('input', { class: 'input', value: state.name, oninput: (e) => { state.name = e.target.value; state.dirty = true; } }) }),
49
- Field({ label: 'email', hint: 'used for git identity. never mailed.', children:
50
- h('input', { class: 'input', type: 'email', value: state.email, oninput: (e) => { state.email = e.target.value; state.dirty = true; } }) }),
51
- Field({ label: 'handle', children:
52
- h('input', { class: 'input', value: state.handle, oninput: (e) => { state.handle = e.target.value; state.dirty = true; } }) }),
53
- Field({ label: 'bio', hint: 'one sentence. plain text.', children:
54
- h('textarea', { class: 'input', rows: 3, oninput: (e) => { state.bio = e.target.value; state.dirty = true; } }, state.bio) })
55
- ) });
56
- }
57
-
58
- function Theme() {
59
- const opts = [['auto', '◐ auto'], ['light', '○ light'], ['dark', '● dark']];
60
- return Panel({ title: 'theme', style: 'margin:8px 0', children: h('div', { style: 'padding:14px 18px' },
61
- Field({ label: 'mode', children: h('div', { style: 'display:flex;gap:6px' },
62
- ...opts.map(([k, l]) => h('button', { key: k,
63
- class: state.theme === k ? 'btn btn-primary' : 'btn',
64
- onclick: () => { state.theme = k; state.dirty = true; kit.render(); } }, l))
65
- ) }),
66
- Field({ label: 'motion', hint: 'honour prefers-reduced-motion regardless.', children:
67
- Toggle({ on: state.motion, onChange: (v) => state.motion = v, label: state.motion ? 'animations on' : 'animations off' }) })
68
- ) });
69
- }
70
-
71
- function Notify() {
72
- return Panel({ title: 'notifications', style: 'margin:8px 0', children: [
73
- Row({ key: 'n1', code: '◆', title: 'mentions', sub: 'when someone @s you', meta: h('span', {}, Toggle({ on: state.notify.mentions, onChange: (v) => state.notify.mentions = v })) }),
74
- Row({ key: 'n2', code: '◇', title: 'releases', sub: 'on every tagged build', meta: h('span', {}, Toggle({ on: state.notify.releases, onChange: (v) => state.notify.releases = v })) }),
75
- Row({ key: 'n3', code: '◇', title: 'marketing', sub: 'occasional product updates', meta: h('span', {}, Toggle({ on: state.notify.marketing, onChange: (v) => state.notify.marketing = v })) })
76
- ] });
77
- }
78
-
79
- function ApiKeys() {
80
- return Panel({ title: 'api keys', count: 1, style: 'margin:8px 0', children: h('div', { style: 'padding:14px 18px' },
81
- Field({ label: 'production key', hint: 'rotate quarterly.', children:
82
- h('div', { style: 'display:flex;gap:8px' },
83
- h('input', { class: 'input', value: state.api_key, readonly: true, style: 'flex:1;font-family:var(--ff-mono)' }),
84
- h('button', { class: 'btn', onclick: () => { navigator.clipboard?.writeText(state.api_key); } }, 'copy'),
85
- h('button', { class: 'btn', onclick: () => { state.api_key = 'sk-247420-' + Math.random().toString(36).slice(2, 10) + '-' + Math.random().toString(36).slice(2, 5); state.dirty = true; kit.render(); } }, 'rotate')
86
- ) })
87
- ) });
88
- }
89
-
90
- function Danger() {
91
- return Panel({ title: 'danger zone', kind: 'danger', style: 'margin:8px 0', children: h('div', { style: 'padding:14px 18px;display:flex;flex-direction:column;gap:10px' },
92
- h('p', { style: 'margin:0;color:var(--panel-text-2)' }, 'these actions are permanent.'),
93
- h('div', { style: 'display:flex;gap:8px' },
94
- h('button', { class: 'btn', style: 'color:var(--mascot,#e0a200)' }, 'export account'),
95
- h('button', { class: 'btn', style: 'color:var(--warn)' }, 'delete account')
96
- )
97
- ) });
98
- }
99
-
100
- function App() {
101
- const view = { profile: Profile, theme: Theme, notify: Notify, api: ApiKeys, danger: Danger }[state.section]();
102
- return AppShell({
103
- topbar: Topbar({ brand: '247420', leaf: 'settings', items: [['index', '../../'], ['source ↗', 'https://github.com/AnEntrypoint/design']] }),
104
- crumb: Crumb({ trail: ['247420', 'kits'], leaf: 'settings · ' + state.section }),
105
- side: Side({
106
- sections: [
107
- { group: 'sections', items: sections.map((s) => ({
108
- glyph: s.glyph, label: s.label,
109
- href: '#' + s.id, active: state.section === s.id, key: s.id,
110
- onClick: (e) => { e.preventDefault(); state.section = s.id; kit.render(); }
111
- })) }
112
- ]
113
- }),
114
- main: [
115
- h('div', { class: 'ds-section', style: 'padding:8px' },
116
- Heading({ level: 1, children: 'settings' }),
117
- Lede({ children: 'every input primitive in one surface — fields, toggles, segmented buttons, danger panel, save bar.' }),
118
- view,
119
- state.dirty ? h('div', { style: 'position:sticky;bottom:8px;display:flex;justify-content:flex-end;gap:8px;padding:10px;background:var(--panel-2);border-radius:10px;margin:8px 0' },
120
- h('span', { style: 'flex:1;color:var(--panel-text-2)' }, 'unsaved changes'),
121
- h('button', { class: 'btn', onclick: () => { state.dirty = false; kit.render(); } }, 'discard'),
122
- h('button', { class: 'btn btn-primary', onclick: () => { state.dirty = false; kit.render(); } }, 'save')
123
- ) : null
124
- )
125
- ],
126
- status: Status({
127
- left: ['settings', '• ' + state.section, state.dirty ? '• dirty' : '• saved'],
128
- right: ['247420 / mmxxvi']
129
- })
130
- });
131
- }
132
-
133
- const kit = mountKit({ root, view: App, screen: '10 Settings' });
@@ -1,26 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-theme="auto" class="ds-247420"><head>
3
- <meta charset="utf-8">
4
- <meta name="viewport" content="width=device-width, initial-scale=1">
5
- <meta name="theme-color" content="#247420" media="(prefers-color-scheme: light)">
6
- <meta name="theme-color" content="#3A9A34" media="(prefers-color-scheme: dark)">
7
- <meta name="color-scheme" content="light dark">
8
- <title>settings / 247420</title>
9
- <meta name="description" content="settings ui kit — sectioned forms, toggles, inputs, save bar.">
10
- <link rel="canonical" href="https://anentrypoint.github.io/design/ui_kits/settings/">
11
- <link rel="icon" type="image/svg+xml" href="../../favicon.svg">
12
- <link rel="stylesheet" href="../../colors_and_type.css">
13
- <link rel="stylesheet" href="../../app-shell.css">
14
- <script type="importmap">
15
- { "imports": {
16
- "webjsx": "../../vendor/webjsx/index.js",
17
- "webjsx/": "../../vendor/webjsx/",
18
- "webjsx/jsx-runtime": "../../vendor/webjsx/jsx-runtime.js",
19
- "ds/": "../../src/"
20
- } }
21
- </script>
22
- </head>
23
- <body data-screen-label="10 Settings">
24
- <div id="root"></div>
25
- <script type="module" src="./app.js"></script>
26
- </body></html>
@@ -1,115 +0,0 @@
1
- import * as webjsx from 'webjsx';
2
- import { Topbar, Crumb, Status, AppShell, Panel, Heading, Lede, Chip } from 'ds/components.js';
3
- import { mountKit } from 'ds/bootstrap.js';
4
- const h = webjsx.createElement;
5
-
6
- const root = document.getElementById('root');
7
- const state = { mode: 'signin', email: '', password: '', remember: true, sent: false, error: '' };
8
-
9
- function setMode(m) { state.mode = m; state.sent = false; state.error = ''; kit.render(); }
10
-
11
- function submit(e) {
12
- e.preventDefault();
13
- if (!state.email.includes('@')) { state.error = 'enter a real email.'; kit.render(); return; }
14
- if (state.mode !== 'magic' && state.password.length < 6) { state.error = 'password must be at least 6 characters.'; kit.render(); return; }
15
- state.error = '';
16
- state.sent = true;
17
- kit.render();
18
- }
19
-
20
- function Provider({ glyph, label, onClick }) {
21
- return h('button', {
22
- class: 'btn',
23
- style: 'flex:1;display:flex;align-items:center;justify-content:center;gap:8px;padding:10px',
24
- onclick: onClick || ((e) => { e.preventDefault(); state.error = '(stub) provider not wired'; kit.render(); })
25
- },
26
- h('span', { style: 'font-family:var(--ff-mono);color:var(--panel-text-3)' }, glyph),
27
- h('span', {}, label)
28
- );
29
- }
30
-
31
- function Form() {
32
- if (state.sent) {
33
- return h('div', { style: 'padding:18px;display:flex;flex-direction:column;gap:10px;align-items:center;text-align:center' },
34
- h('div', { style: 'font-size:32px;color:var(--panel-accent)' }, '✓'),
35
- h('p', { style: 'margin:0;font-weight:600' }, state.mode === 'magic' ? 'check your email' : (state.mode === 'reset' ? 'reset link sent' : 'welcome back')),
36
- h('p', { style: 'margin:0;color:var(--panel-text-2)' }, state.mode === 'magic' ? 'we sent a sign-in link to ' + state.email : (state.mode === 'reset' ? 'follow the link to set a new password.' : 'redirecting…'))
37
- );
38
- }
39
- return h('form', { onsubmit: submit, style: 'padding:18px;display:flex;flex-direction:column;gap:10px' },
40
- h('label', { style: 'display:flex;flex-direction:column;gap:4px' },
41
- h('span', { style: 'font-family:var(--ff-mono);font-size:11px;letter-spacing:0.06em;text-transform:uppercase;color:var(--panel-text-3)' }, 'email'),
42
- h('input', { class: 'input', type: 'email', placeholder: 'you@247420.xyz', value: state.email, autocomplete: 'email', oninput: (e) => { state.email = e.target.value; } })
43
- ),
44
- state.mode !== 'magic' && state.mode !== 'reset' ? h('label', { style: 'display:flex;flex-direction:column;gap:4px' },
45
- h('span', { style: 'font-family:var(--ff-mono);font-size:11px;letter-spacing:0.06em;text-transform:uppercase;color:var(--panel-text-3)' }, 'password'),
46
- h('input', { class: 'input', type: 'password', placeholder: '••••••••', value: state.password, autocomplete: state.mode === 'signup' ? 'new-password' : 'current-password', oninput: (e) => { state.password = e.target.value; } })
47
- ) : null,
48
- state.mode === 'signin' ? h('div', { style: 'display:flex;align-items:center;justify-content:space-between' },
49
- h('label', { style: 'display:flex;align-items:center;gap:6px;cursor:pointer' },
50
- h('input', { type: 'checkbox', checked: state.remember, onchange: (e) => { state.remember = e.target.checked; } }),
51
- h('span', { style: 'color:var(--panel-text-2);font-size:13px' }, 'remember me')
52
- ),
53
- h('a', { href: '#reset', onclick: (e) => { e.preventDefault(); setMode('reset'); }, style: 'font-size:13px' }, 'forgot password?')
54
- ) : null,
55
- state.error ? h('div', { style: 'padding:8px 10px;background:var(--panel-1);border-radius:8px;color:#cc4242;font-size:13px' }, state.error) : null,
56
- h('button', { class: 'btn btn-primary', type: 'submit' },
57
- state.mode === 'signup' ? 'create account →' :
58
- state.mode === 'magic' ? 'send magic link →' :
59
- state.mode === 'reset' ? 'send reset link →' : 'sign in →'
60
- ),
61
- state.mode !== 'reset' ? h('div', { style: 'display:flex;align-items:center;gap:10px;margin:6px 0;color:var(--panel-text-3);font-size:12px' },
62
- h('div', { style: 'flex:1;height:1px;background:var(--panel-2)' }),
63
- h('span', {}, 'or'),
64
- h('div', { style: 'flex:1;height:1px;background:var(--panel-2)' })
65
- ) : null,
66
- state.mode !== 'reset' ? h('div', { style: 'display:flex;gap:8px' },
67
- Provider({ glyph: '◆', label: 'github' }),
68
- Provider({ glyph: '◇', label: 'google' }),
69
- Provider({ glyph: '✦', label: 'sso' })
70
- ) : null,
71
- state.mode !== 'reset' && state.mode !== 'magic' ? h('button', { class: 'btn', onclick: (e) => { e.preventDefault(); setMode('magic'); } }, 'use a magic link instead') : null
72
- );
73
- }
74
-
75
- function App() {
76
- const headings = {
77
- signin: ['sign in', 'welcome back. pick a provider or use email.'],
78
- signup: ['create', 'join the 247420 portfolio. one account, every kit.'],
79
- magic: ['magic link', 'we’ll email you a one-tap sign-in link. no password.'],
80
- reset: ['reset', 'enter your email to receive a reset link.']
81
- }[state.mode];
82
- return AppShell({
83
- narrow: true,
84
- topbar: Topbar({ brand: '247420', leaf: 'auth', items: [['index', '../../']] }),
85
- crumb: Crumb({ trail: ['247420', 'kits'], leaf: 'signin · ' + state.mode }),
86
- main: [
87
- h('div', { class: 'ds-section', style: 'padding:8px;display:flex;flex-direction:column;align-items:center' },
88
- h('div', { style: 'width:100%;max-width:440px;display:flex;flex-direction:column;gap:8px;margin:24px 0' },
89
- Heading({ level: 1, children: headings[0] }),
90
- Lede({ children: headings[1] }),
91
- Panel({ children: Form() }),
92
- h('div', { style: 'display:flex;justify-content:center;gap:14px;margin-top:8px;font-size:13px' },
93
- ['signin', 'signup', 'magic'].map((m) =>
94
- h('a', { key: m, href: '#' + m,
95
- onclick: (e) => { e.preventDefault(); setMode(m); },
96
- style: 'color:' + (state.mode === m ? 'var(--panel-text)' : 'var(--panel-text-3)') + ';text-decoration:' + (state.mode === m ? 'underline' : 'none')
97
- }, m === 'signin' ? 'sign in' : m === 'signup' ? 'create account' : 'magic link')
98
- )
99
- ),
100
- h('p', { style: 'text-align:center;font-size:12px;color:var(--panel-text-3);margin:6px 0' },
101
- 'by continuing you agree to the ',
102
- Chip({ tone: 'dim', children: 'terms' }), ' and ',
103
- Chip({ tone: 'dim', children: 'privacy notice' }), '.'
104
- )
105
- )
106
- )
107
- ],
108
- status: Status({
109
- left: ['auth', '• ' + state.mode, state.error ? '• error' : '• ok'],
110
- right: ['247420 / mmxxvi']
111
- })
112
- });
113
- }
114
-
115
- const kit = mountKit({ root, view: App, screen: '11 Sign in' });
@@ -1,26 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-theme="auto" class="ds-247420"><head>
3
- <meta charset="utf-8">
4
- <meta name="viewport" content="width=device-width, initial-scale=1">
5
- <meta name="theme-color" content="#247420" media="(prefers-color-scheme: light)">
6
- <meta name="theme-color" content="#3A9A34" media="(prefers-color-scheme: dark)">
7
- <meta name="color-scheme" content="light dark">
8
- <title>signin / 247420</title>
9
- <meta name="description" content="signin ui kit — authentication panel, providers, tone-on-tone form.">
10
- <link rel="canonical" href="https://anentrypoint.github.io/design/ui_kits/signin/">
11
- <link rel="icon" type="image/svg+xml" href="../../favicon.svg">
12
- <link rel="stylesheet" href="../../colors_and_type.css">
13
- <link rel="stylesheet" href="../../app-shell.css">
14
- <script type="importmap">
15
- { "imports": {
16
- "webjsx": "../../vendor/webjsx/index.js",
17
- "webjsx/": "../../vendor/webjsx/",
18
- "webjsx/jsx-runtime": "../../vendor/webjsx/jsx-runtime.js",
19
- "ds/": "../../src/"
20
- } }
21
- </script>
22
- </head>
23
- <body data-screen-label="11 Sign in">
24
- <div id="root"></div>
25
- <script type="module" src="./app.js"></script>
26
- </body></html>
@@ -1,174 +0,0 @@
1
- import * as webjsx from 'webjsx';
2
- import { Topbar, Crumb, Status, Side, AppShell, Heading, Lede, Chip, ThemeToggle } from 'ds/components.js';
3
- import { mountKit } from 'ds/bootstrap.js';
4
- const h = webjsx.createElement;
5
-
6
- const root = document.getElementById('root');
7
-
8
- const slides = [
9
- {
10
- kind: 'title',
11
- eyebrow: '247420 · mmxxvi',
12
- title: 'the deck',
13
- sub: 'a 16:9 slide template built from the SDK chrome.',
14
- accent: 'green'
15
- },
16
- {
17
- kind: 'lede',
18
- eyebrow: '01',
19
- title: 'one tool, one font, one rhythm.',
20
- body: 'space grotesk for prose, jetbrains mono for tokens. nothing else. the rhythm is 8pt all the way down.'
21
- },
22
- {
23
- kind: 'bullets',
24
- eyebrow: '02',
25
- title: 'three modes for theme',
26
- items: [
27
- ['auto', 'follow the OS — re-renders live when you flip dark mode'],
28
- ['paper', 'force light — for daylight, demos, projection screens'],
29
- ['ink', 'force dark — for night, low-light reads, oled']
30
- ]
31
- },
32
- {
33
- kind: 'quote',
34
- eyebrow: '03',
35
- body: '"the surface should never lie about what the program is doing."',
36
- cite: '— 247420 design principle'
37
- },
38
- {
39
- kind: 'split',
40
- eyebrow: '04',
41
- title: 'usable terminals are instant.',
42
- left: 'output appears the moment it exists. no reveal animation, no typewriter — the user is waiting on real work.',
43
- right: 'showcase terminals can play a loop. they are clearly labelled "demo" and pause on prefers-reduced-motion.'
44
- },
45
- {
46
- kind: 'title',
47
- eyebrow: 'fin',
48
- title: 'two-four-seven · four-twenty',
49
- sub: 'always open, always a little high.',
50
- accent: 'mascot'
51
- }
52
- ];
53
-
54
- const state = { i: 0 };
55
-
56
- function Slide(s) {
57
- const accentVar = s.accent ? `var(--${s.accent})` : 'var(--accent)';
58
- const eyebrow = h('div', {
59
- style: 'font-family:var(--ff-mono);font-size:11px;letter-spacing:0.1em;text-transform:uppercase;color:var(--fg-3);margin-bottom:24px'
60
- }, s.eyebrow || '');
61
-
62
- if (s.kind === 'title') {
63
- return h('div', { style: 'display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:24px' },
64
- eyebrow,
65
- h('div', { style: `font-size:var(--fs-hero);line-height:var(--lh-tight);color:${accentVar};letter-spacing:var(--tr-tight);font-weight:600` }, s.title),
66
- s.sub ? h('div', { class: 't-lede' }, s.sub) : null
67
- );
68
- }
69
- if (s.kind === 'lede') {
70
- return h('div', { style: 'display:flex;flex-direction:column;justify-content:center;gap:18px;max-width:38ch' },
71
- eyebrow,
72
- h('div', { style: 'font-size:var(--fs-h1);line-height:var(--lh-snug);color:var(--fg);font-weight:500' }, s.title),
73
- h('div', { class: 't-lede' }, s.body)
74
- );
75
- }
76
- if (s.kind === 'bullets') {
77
- return h('div', { style: 'display:flex;flex-direction:column;justify-content:center;gap:18px' },
78
- eyebrow,
79
- h('div', { style: 'font-size:var(--fs-h1);line-height:var(--lh-snug);color:var(--fg);font-weight:500;margin-bottom:12px' }, s.title),
80
- ...s.items.map(([k, v]) =>
81
- h('div', { style: 'display:flex;gap:18px;align-items:baseline;border-bottom:1px solid var(--rule);padding:12px 0' },
82
- h('span', { style: `flex:0 0 100px;font-family:var(--ff-mono);font-size:var(--fs-sm);color:${accentVar}` }, k),
83
- h('span', { style: 'color:var(--fg-2);font-size:var(--fs-lg)' }, v)
84
- )
85
- )
86
- );
87
- }
88
- if (s.kind === 'quote') {
89
- return h('div', { style: 'display:flex;flex-direction:column;justify-content:center;gap:18px;max-width:42ch' },
90
- eyebrow,
91
- h('div', { style: 'font-size:var(--fs-h2);line-height:var(--lh-snug);color:var(--fg);font-weight:400;font-style:italic' }, s.body),
92
- h('div', { style: 'font-family:var(--ff-mono);font-size:var(--fs-sm);color:var(--fg-3)' }, s.cite)
93
- );
94
- }
95
- if (s.kind === 'split') {
96
- return h('div', { style: 'display:flex;flex-direction:column;justify-content:center;gap:24px' },
97
- eyebrow,
98
- h('div', { style: 'font-size:var(--fs-h1);line-height:var(--lh-snug);color:var(--fg);font-weight:500' }, s.title),
99
- h('div', { style: 'display:grid;grid-template-columns:1fr 1fr;gap:32px;margin-top:12px' },
100
- h('div', { style: 'padding:18px;background:var(--bg-2);border-radius:14px;color:var(--fg-2);font-size:var(--fs-lg);line-height:var(--lh-base)' }, s.left),
101
- h('div', { style: `padding:18px;background:var(--bg-2);border-radius:14px;color:var(--fg-2);font-size:var(--fs-lg);line-height:var(--lh-base);border-left:3px solid ${accentVar}` }, s.right)
102
- )
103
- );
104
- }
105
- return null;
106
- }
107
-
108
- function Stage() {
109
- const s = slides[state.i];
110
- return h('div', {
111
- class: 'ds-deck-stage',
112
- style: 'aspect-ratio:16/9;width:100%;max-width:1100px;margin:24px auto;background:var(--bg-2);border-radius:18px;padding:64px;box-sizing:border-box;display:flex;'
113
- }, h('div', { style: 'flex:1;display:flex' }, Slide(s)));
114
- }
115
-
116
- function Controls() {
117
- return h('div', { style: 'display:flex;align-items:center;justify-content:center;gap:14px;padding:8px;font-family:var(--ff-mono);font-size:var(--fs-sm)' },
118
- h('button', {
119
- class: 'btn',
120
- onclick: () => { if (state.i > 0) { state.i--; kit.render(); } }
121
- }, '← prev'),
122
- h('span', { style: 'color:var(--fg-3)' }, (state.i + 1) + ' / ' + slides.length),
123
- h('button', {
124
- class: 'btn',
125
- onclick: () => { if (state.i < slides.length - 1) { state.i++; kit.render(); } }
126
- }, 'next →')
127
- );
128
- }
129
-
130
- function App() {
131
- return AppShell({
132
- topbar: Topbar({
133
- brand: '247420',
134
- leaf: 'slide deck',
135
- items: [['index', '../../'], ['system primer', '../system_primer/']]
136
- }),
137
- crumb: Crumb({ trail: ['247420', 'kits'], leaf: 'slide deck' }),
138
- side: Side({
139
- sections: [
140
- { group: 'slides', items: slides.map((s, i) => ({
141
- glyph: i === state.i ? '◆' : '◇',
142
- label: (i + 1) + ' · ' + (s.title || s.eyebrow || s.kind),
143
- key: 's' + i
144
- })) }
145
- ]
146
- }),
147
- main: [
148
- h('div', { class: 'ds-section', style: 'padding:8px' },
149
- h('div', { style: 'display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap' },
150
- h('div', {}, Heading({ level: 1, children: 'slide deck' })),
151
- ThemeToggle()
152
- ),
153
- Lede({ children: '16:9 stage, keyboard arrow keys for nav, six slide kinds: title / lede / bullets / quote / split / fin.' }),
154
- Stage(),
155
- Controls()
156
- )
157
- ],
158
- status: Status({
159
- left: ['slide deck', '• slide ' + (state.i + 1) + '/' + slides.length, '• ←/→ to nav'],
160
- right: ['247420 / mmxxvi']
161
- })
162
- });
163
- }
164
-
165
- const kit = mountKit({ root, view: App, screen: '17 Slide Deck' });
166
-
167
- window.addEventListener('keydown', (e) => {
168
- if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'PageDown') {
169
- if (state.i < slides.length - 1) { state.i++; kit.render(); e.preventDefault(); }
170
- } else if (e.key === 'ArrowLeft' || e.key === 'PageUp') {
171
- if (state.i > 0) { state.i--; kit.render(); e.preventDefault(); }
172
- } else if (e.key === 'Home') { state.i = 0; kit.render(); }
173
- else if (e.key === 'End') { state.i = slides.length - 1; kit.render(); }
174
- });
@@ -1,26 +0,0 @@
1
- <!doctype html>
2
- <html lang="en" data-theme="auto" class="ds-247420"><head>
3
- <meta charset="utf-8">
4
- <meta name="viewport" content="width=device-width, initial-scale=1">
5
- <meta name="theme-color" content="#247420" media="(prefers-color-scheme: light)">
6
- <meta name="theme-color" content="#3A9A34" media="(prefers-color-scheme: dark)">
7
- <meta name="color-scheme" content="light dark">
8
- <title>slide deck / 247420</title>
9
- <meta name="description" content="16:9 slide deck template — keyboard nav, slide counter, SDK chrome.">
10
- <link rel="canonical" href="https://anentrypoint.github.io/design/ui_kits/slide_deck/">
11
- <link rel="icon" type="image/svg+xml" href="../../favicon.svg">
12
- <link rel="stylesheet" href="../../colors_and_type.css">
13
- <link rel="stylesheet" href="../../app-shell.css">
14
- <script type="importmap">
15
- { "imports": {
16
- "webjsx": "../../vendor/webjsx/index.js",
17
- "webjsx/": "../../vendor/webjsx/",
18
- "webjsx/jsx-runtime": "../../vendor/webjsx/jsx-runtime.js",
19
- "ds/": "../../src/"
20
- } }
21
- </script>
22
- </head>
23
- <body data-screen-label="17 Slide Deck">
24
- <div id="root"></div>
25
- <script type="module" src="./app.js"></script>
26
- </body></html>