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,117 +1,117 @@
1
- // Chrome: Topbar, Crumb, Side, Status, AppShell, plus primitives
2
- // (Brand, Chip, Btn, Glyph, Heading, Lede). Pure factories — props in,
3
- // webjsx vnode out. CSS in app-shell.css uses these class names.
4
-
5
- import * as webjsx from '../../vendor/webjsx/index.js';
6
- const h = webjsx.createElement;
7
-
8
- export function Brand({ name = '247420', leaf } = {}) {
9
- return h('span', { class: 'brand' }, name,
10
- leaf ? h('span', { class: 'slash' }, ' / ') : null,
11
- leaf || null);
12
- }
13
-
14
- export function Chip({ tone = '', children }) {
15
- return h('span', { class: 'chip' + (tone ? ' tone-' + tone : '') }, children);
16
- }
17
-
18
- export function Btn({ href = '#', primary, ghost, children, onClick }) {
19
- const cls = primary ? 'btn-primary' : (ghost ? 'btn-ghost' : 'btn');
20
- return h('a', { class: cls, href, onclick: onClick }, children);
21
- }
22
-
23
- export function Glyph({ children, color }) {
24
- return h('span', { class: 'glyph', style: color ? `color:${color}` : '' }, children);
25
- }
26
-
27
- export function Topbar({ brand = '247420', leaf = '', items = [], active = '', onNav, search } = {}) {
28
- return h('header', { class: 'app-topbar' },
29
- Brand({ name: brand, leaf }),
30
- search ? h('label', { class: 'app-search' },
31
- h('span', { class: 'icon' }, '⌕'),
32
- h('input', { type: 'search', placeholder: search, 'aria-label': 'search' })
33
- ) : h('span', {}),
34
- h('nav', {}, ...items.map(([label, href]) =>
35
- h('a', {
36
- key: label,
37
- href,
38
- class: active === String(label).replace(' ↗', '') ? 'active' : '',
39
- onclick: (e) => {
40
- if (!String(href).startsWith('http') && onNav) {
41
- e.preventDefault();
42
- onNav(String(label).replace(' ↗', ''));
43
- }
44
- }
45
- }, label)
46
- ))
47
- );
48
- }
49
-
50
- export function Crumb({ trail = [], leaf = '', right } = {}) {
51
- const parts = [];
52
- trail.forEach((t, i) => {
53
- parts.push(h('span', { key: 't' + i }, t));
54
- parts.push(h('span', { key: 's' + i, class: 'sep' }, '›'));
55
- });
56
- parts.push(h('span', { key: 'leaf', class: 'leaf' }, leaf));
57
- if (right) parts.push(h('span', { key: 'r', class: 'crumb-right' }, ...(Array.isArray(right) ? right : [right])));
58
- return h('div', { class: 'app-crumb' }, ...parts);
59
- }
60
-
61
- export function Side({ sections = [] } = {}) {
62
- return h('aside', { class: 'app-side' }, ...sections.flatMap(sec => [
63
- h('div', { class: 'group', key: sec.group }, sec.group),
64
- ...sec.items.map((item, i) => {
65
- const { glyph, label, href = '#', active, count, color, onClick } = item;
66
- return h('a', {
67
- key: sec.group + i,
68
- href,
69
- class: active ? 'active' : '',
70
- onclick: onClick
71
- },
72
- glyph != null ? Glyph({ children: glyph, color }) : h('span', { class: 'glyph' }),
73
- h('span', {}, label),
74
- count != null ? h('span', { class: 'count' }, String(count)) : null
75
- );
76
- })
77
- ]));
78
- }
79
-
80
- export function Status({ left = [], right = [] } = {}) {
81
- return h('footer', { class: 'app-status' },
82
- ...left.map((t, i) => h('span', { key: 'l' + i, class: 'item' }, t)),
83
- h('span', { class: 'spread' }),
84
- ...right.map((t, i) => h('span', { key: 'r' + i, class: 'item' }, t))
85
- );
86
- }
87
-
88
- export function AppShell({ topbar, crumb, side, main, status, narrow } = {}) {
89
- const hasSide = Boolean(side);
90
- const sideNode = hasSide ? side : h('aside', { class: 'app-side', 'aria-hidden': 'true' });
91
- return h('div', { class: 'app' },
92
- topbar || null,
93
- crumb || null,
94
- h('div', { class: 'app-body' + (hasSide ? '' : ' no-side') },
95
- h('div', { class: 'app-side-shell' }, sideNode),
96
- h('main', { class: 'app-main' + (narrow ? ' narrow' : '') }, ...(Array.isArray(main) ? main : [main]))
97
- ),
98
- status || null
99
- );
100
- }
101
-
102
- export function Heading({ level = 1, children, style = '' }) {
103
- return h('h' + level, { style }, children);
104
- }
105
-
106
- export function Lede({ children }) {
107
- return h('p', { class: 'lede' }, children);
108
- }
109
-
110
- export function Dot({ tone = 'live' }) {
111
- const cls = tone === 'live' ? 'ds-dot-live' : 'ds-dot-idle';
112
- return h('span', { class: cls }, tone === 'live' ? '●' : '○');
113
- }
114
-
115
- export function Rail({ tone = 'green' }) {
116
- return h('span', { class: 'ds-rail tone-' + tone, 'aria-hidden': 'true' });
117
- }
1
+ // Chrome: Topbar, Crumb, Side, Status, AppShell, plus primitives
2
+ // (Brand, Chip, Btn, Glyph, Heading, Lede). Pure factories — props in,
3
+ // webjsx vnode out. CSS in app-shell.css uses these class names.
4
+
5
+ import * as webjsx from '../../vendor/webjsx/index.js';
6
+ const h = webjsx.createElement;
7
+
8
+ export function Brand({ name = '247420', leaf } = {}) {
9
+ return h('span', { class: 'brand' }, name,
10
+ leaf ? h('span', { class: 'slash' }, ' / ') : null,
11
+ leaf || null);
12
+ }
13
+
14
+ export function Chip({ tone = '', children }) {
15
+ return h('span', { class: 'chip' + (tone ? ' tone-' + tone : '') }, children);
16
+ }
17
+
18
+ export function Btn({ href = '#', primary, ghost, children, onClick }) {
19
+ const cls = primary ? 'btn-primary' : (ghost ? 'btn-ghost' : 'btn');
20
+ return h('a', { class: cls, href, onclick: onClick }, children);
21
+ }
22
+
23
+ export function Glyph({ children, color }) {
24
+ return h('span', { class: 'glyph', style: color ? `color:${color}` : '' }, children);
25
+ }
26
+
27
+ export function Topbar({ brand = '247420', leaf = '', items = [], active = '', onNav, search } = {}) {
28
+ return h('header', { class: 'app-topbar' },
29
+ Brand({ name: brand, leaf }),
30
+ search ? h('label', { class: 'app-search' },
31
+ h('span', { class: 'icon' }, '⌕'),
32
+ h('input', { type: 'search', placeholder: search, 'aria-label': 'search' })
33
+ ) : h('span', {}),
34
+ h('nav', {}, ...items.map(([label, href]) =>
35
+ h('a', {
36
+ key: label,
37
+ href,
38
+ class: active === String(label).replace(' ↗', '') ? 'active' : '',
39
+ onclick: (e) => {
40
+ if (!String(href).startsWith('http') && onNav) {
41
+ e.preventDefault();
42
+ onNav(String(label).replace(' ↗', ''));
43
+ }
44
+ }
45
+ }, label)
46
+ ))
47
+ );
48
+ }
49
+
50
+ export function Crumb({ trail = [], leaf = '', right } = {}) {
51
+ const parts = [];
52
+ trail.forEach((t, i) => {
53
+ parts.push(h('span', { key: 't' + i }, t));
54
+ parts.push(h('span', { key: 's' + i, class: 'sep' }, '›'));
55
+ });
56
+ parts.push(h('span', { key: 'leaf', class: 'leaf' }, leaf));
57
+ if (right) parts.push(h('span', { key: 'r', class: 'crumb-right' }, ...(Array.isArray(right) ? right : [right])));
58
+ return h('div', { class: 'app-crumb' }, ...parts);
59
+ }
60
+
61
+ export function Side({ sections = [] } = {}) {
62
+ return h('aside', { class: 'app-side' }, ...sections.flatMap(sec => [
63
+ h('div', { class: 'group', key: sec.group }, sec.group),
64
+ ...sec.items.map((item, i) => {
65
+ const { glyph, label, href = '#', active, count, color, onClick } = item;
66
+ return h('a', {
67
+ key: sec.group + i,
68
+ href,
69
+ class: active ? 'active' : '',
70
+ onclick: onClick
71
+ },
72
+ glyph != null ? Glyph({ children: glyph, color }) : h('span', { class: 'glyph' }),
73
+ h('span', {}, label),
74
+ (count != null && count !== 0 && count !== '0') ? h('span', { class: 'count' }, String(count)) : null
75
+ );
76
+ })
77
+ ]));
78
+ }
79
+
80
+ export function Status({ left = [], right = [] } = {}) {
81
+ return h('footer', { class: 'app-status' },
82
+ ...left.map((t, i) => h('span', { key: 'l' + i, class: 'item' }, t)),
83
+ h('span', { class: 'spread' }),
84
+ ...right.map((t, i) => h('span', { key: 'r' + i, class: 'item' }, t))
85
+ );
86
+ }
87
+
88
+ export function AppShell({ topbar, crumb, side, main, status, narrow } = {}) {
89
+ const hasSide = Boolean(side);
90
+ const sideNode = hasSide ? side : h('aside', { class: 'app-side', 'aria-hidden': 'true' });
91
+ return h('div', { class: 'app' },
92
+ topbar || null,
93
+ crumb || null,
94
+ h('div', { class: 'app-body' + (hasSide ? '' : ' no-side') },
95
+ h('div', { class: 'app-side-shell' }, sideNode),
96
+ h('main', { class: 'app-main' + (narrow ? ' narrow' : '') }, ...(Array.isArray(main) ? main : [main]))
97
+ ),
98
+ status || null
99
+ );
100
+ }
101
+
102
+ export function Heading({ level = 1, children, style = '' }) {
103
+ return h('h' + level, { style }, children);
104
+ }
105
+
106
+ export function Lede({ children }) {
107
+ return h('p', { class: 'lede' }, children);
108
+ }
109
+
110
+ export function Dot({ tone = 'live' }) {
111
+ const cls = tone === 'live' ? 'ds-dot-live' : 'ds-dot-idle';
112
+ return h('span', { class: cls }, tone === 'live' ? '●' : '○');
113
+ }
114
+
115
+ export function Rail({ tone = 'green' }) {
116
+ return h('span', { class: 'ds-rail tone-' + tone, 'aria-hidden': 'true' });
117
+ }
@@ -1,70 +1,70 @@
1
- // ThemeToggle — segmented auto/paper/ink radio bound to src/theme.js.
2
- //
3
- // Usage:
4
- // import { ThemeToggle } from 'anentrypoint-design';
5
- // ThemeToggle() // segmented control
6
- // ThemeToggle({ compact: true }) // single cycling glyph button
7
- //
8
- // Reads current mode from the theme controller; clicks call applyTheme()
9
- // which persists, updates <html data-theme>, and notifies listeners.
10
-
11
- import * as webjsx from '../../vendor/webjsx/index.js';
12
- import { applyTheme, getTheme, resolvedTheme, onThemeChange } from '../theme.js';
13
-
14
- const h = webjsx.createElement;
15
-
16
- const MODES = [
17
- ['auto', '⌗', 'auto'],
18
- ['paper', '☀', 'light'],
19
- ['ink', '☾', 'dark'],
20
- ];
21
-
22
- // Track instances so an OS-theme change while in 'auto' re-renders the
23
- // glyph in the compact variant (the segmented variant doesn't need it).
24
- const refresh = new Set();
25
- let _bound = false;
26
- function bindOnce() {
27
- if (_bound) return;
28
- _bound = true;
29
- onThemeChange(() => { for (const cb of refresh) cb(); });
30
- }
31
-
32
- export function ThemeToggle({ compact = false, onChange } = {}) {
33
- bindOnce();
34
- const current = getTheme();
35
-
36
- if (compact) {
37
- const resolved = resolvedTheme();
38
- const glyph = current === 'auto' ? '⌗' : (resolved === 'ink' ? '☾' : '☀');
39
- const label = current === 'auto' ? `auto (${resolved})` : (current === 'ink' ? 'dark' : 'light');
40
- return h('button', {
41
- class: 'btn ds-theme-toggle',
42
- type: 'button',
43
- 'aria-label': 'theme: ' + label,
44
- title: 'theme: ' + label + ' — click to cycle',
45
- onclick: () => {
46
- const next = current === 'auto' ? 'paper' : (current === 'paper' ? 'ink' : 'auto');
47
- applyTheme(next);
48
- if (onChange) try { onChange(next); } catch {}
49
- }
50
- }, h('span', { class: 'glyph' }, glyph), ' ', label);
51
- }
52
-
53
- return h('div', {
54
- class: 'ds-theme-toggle ds-segmented',
55
- role: 'radiogroup',
56
- 'aria-label': 'theme'
57
- }, ...MODES.map(([mode, glyph, label]) =>
58
- h('button', {
59
- key: mode,
60
- type: 'button',
61
- role: 'radio',
62
- 'aria-checked': current === mode ? 'true' : 'false',
63
- class: 'ds-seg-btn' + (current === mode ? ' is-on' : ''),
64
- onclick: () => {
65
- applyTheme(mode);
66
- if (onChange) try { onChange(mode); } catch {}
67
- }
68
- }, h('span', { class: 'glyph' }, glyph), ' ', label)
69
- ));
70
- }
1
+ // ThemeToggle — segmented auto/paper/ink radio bound to src/theme.js.
2
+ //
3
+ // Usage:
4
+ // import { ThemeToggle } from 'anentrypoint-design';
5
+ // ThemeToggle() // segmented control
6
+ // ThemeToggle({ compact: true }) // single cycling glyph button
7
+ //
8
+ // Reads current mode from the theme controller; clicks call applyTheme()
9
+ // which persists, updates <html data-theme>, and notifies listeners.
10
+
11
+ import * as webjsx from '../../vendor/webjsx/index.js';
12
+ import { applyTheme, getTheme, resolvedTheme, onThemeChange } from '../theme.js';
13
+
14
+ const h = webjsx.createElement;
15
+
16
+ const MODES = [
17
+ ['auto', '⌗', 'auto'],
18
+ ['paper', '☀', 'light'],
19
+ ['ink', '☾', 'dark'],
20
+ ];
21
+
22
+ // Track instances so an OS-theme change while in 'auto' re-renders the
23
+ // glyph in the compact variant (the segmented variant doesn't need it).
24
+ const refresh = new Set();
25
+ let _bound = false;
26
+ function bindOnce() {
27
+ if (_bound) return;
28
+ _bound = true;
29
+ onThemeChange(() => { for (const cb of refresh) cb(); });
30
+ }
31
+
32
+ export function ThemeToggle({ compact = false, onChange } = {}) {
33
+ bindOnce();
34
+ const current = getTheme();
35
+
36
+ if (compact) {
37
+ const resolved = resolvedTheme();
38
+ const glyph = current === 'auto' ? '⌗' : (resolved === 'ink' ? '☾' : '☀');
39
+ const label = current === 'auto' ? `auto (${resolved})` : (current === 'ink' ? 'dark' : 'light');
40
+ return h('button', {
41
+ class: 'btn ds-theme-toggle',
42
+ type: 'button',
43
+ 'aria-label': 'theme: ' + label,
44
+ title: 'theme: ' + label + ' — click to cycle',
45
+ onclick: () => {
46
+ const next = current === 'auto' ? 'paper' : (current === 'paper' ? 'ink' : 'auto');
47
+ applyTheme(next);
48
+ if (onChange) try { onChange(next); } catch {}
49
+ }
50
+ }, h('span', { class: 'glyph' }, glyph), ' ', label);
51
+ }
52
+
53
+ return h('div', {
54
+ class: 'ds-theme-toggle ds-segmented',
55
+ role: 'radiogroup',
56
+ 'aria-label': 'theme'
57
+ }, ...MODES.map(([mode, glyph, label]) =>
58
+ h('button', {
59
+ key: mode,
60
+ type: 'button',
61
+ role: 'radio',
62
+ 'aria-checked': current === mode ? 'true' : 'false',
63
+ class: 'ds-seg-btn' + (current === mode ? ' is-on' : ''),
64
+ onclick: () => {
65
+ applyTheme(mode);
66
+ if (onChange) try { onChange(mode); } catch {}
67
+ }
68
+ }, h('span', { class: 'glyph' }, glyph), ' ', label)
69
+ ));
70
+ }
package/src/components.js CHANGED
@@ -1,57 +1,59 @@
1
- // Component barrel — matches upstream export surface 1:1.
2
-
3
- import * as webjsx from '../vendor/webjsx/index.js';
4
- export const h = webjsx.createElement;
5
-
6
- export {
7
- Brand, Chip, Btn, Glyph,
8
- Topbar, Crumb, Side, Status, AppShell,
9
- Heading, Lede, Dot, Rail
10
- } from './components/shell.js';
11
-
12
- export {
13
- Panel, Row, RowLink,
14
- Hero, Install, Receipt, Changelog,
15
- WorksList, WritingList, Manifesto, Section, PageHeader,
16
- Kpi, Table, SearchInput, TextField, EventList,
17
- HomeView, ProjectView, Form
18
- } from './components/content.js';
19
-
20
- export {
21
- fmtBytes, renderInline,
22
- ChatMessage, ChatComposer, Chat,
23
- AICAT_FACE, AICatPortrait, AICat
24
- } from './components/chat.js';
25
-
26
- export {
27
- fileGlyph, fmtFileSize,
28
- FileIcon, FileRow, FileGrid, FileToolbar,
29
- DropZone, UploadProgress, EmptyState, BreadcrumbPath
30
- } from './components/files.js';
31
-
32
- export {
33
- ConfirmDialog, PromptDialog,
34
- FilePreviewMedia, FilePreviewCode, FilePreviewText, FileViewer
35
- } from './components/files-modals.js';
36
-
37
- export {
38
- ServerIcon, ServerRail,
39
- ChannelItem, ChannelCategory,
40
- VoiceUser, UserPanel, ChannelSidebar,
41
- MemberItem, MemberList,
42
- ChatHeader, VoiceStrip, CommunityShell
43
- } from './components/community.js';
44
-
45
- export { ThemeToggle } from './components/theme-toggle.js';
46
-
47
- export {
48
- Toast, Banner, MobileHeader, DrawerOverlay, BootOverlay,
49
- ContextMenu, CommandPalette, EmojiPicker, ReplyBar
50
- } from './components/overlays.js';
51
-
52
- export {
53
- FREDDIE_PAGES,
54
- home, chat, voice, sessions, projects, agents, analytics,
55
- models, cron, skills, config, env, tools, batch, gateway, chains,
56
- skillLabel, getRecentPaths, saveRecentPath, renderChatMessages
57
- } from './components/freddie.js';
1
+ // Component barrel — matches upstream export surface 1:1.
2
+
3
+ import * as webjsx from '../vendor/webjsx/index.js';
4
+ export const h = webjsx.createElement;
5
+
6
+ export {
7
+ Brand, Chip, Btn, Glyph,
8
+ Topbar, Crumb, Side, Status, AppShell,
9
+ Heading, Lede, Dot, Rail
10
+ } from './components/shell.js';
11
+
12
+ export {
13
+ Panel, Row, RowLink,
14
+ Hero, Install, Receipt, Changelog,
15
+ WorksList, WritingList, Manifesto, Section, PageHeader,
16
+ Kpi, Table, SearchInput, TextField, EventList,
17
+ HomeView, ProjectView, Form
18
+ } from './components/content.js';
19
+
20
+ export {
21
+ fmtBytes, renderInline,
22
+ ChatMessage, ChatComposer, Chat,
23
+ AICAT_FACE, AICatPortrait, AICat
24
+ } from './components/chat.js';
25
+
26
+ export {
27
+ fileGlyph, fmtFileSize,
28
+ FileIcon, FileRow, FileGrid, FileToolbar,
29
+ DropZone, UploadProgress, EmptyState, BreadcrumbPath
30
+ } from './components/files.js';
31
+
32
+ export {
33
+ ConfirmDialog, PromptDialog,
34
+ FilePreviewMedia, FilePreviewCode, FilePreviewText, FileViewer
35
+ } from './components/files-modals.js';
36
+
37
+ export {
38
+ ServerIcon, ServerRail,
39
+ ChannelItem, ChannelCategory,
40
+ VoiceUser, UserPanel, ChannelSidebar,
41
+ MemberItem, MemberList,
42
+ ChatHeader, VoiceStrip, CommunityShell
43
+ } from './components/community.js';
44
+
45
+ export { ThemeToggle } from './components/theme-toggle.js';
46
+
47
+ export {
48
+ Toolbar, Tabs,
49
+ TreeView, TreeItem,
50
+ PropertyGrid, PropertyField,
51
+ Dock, IconButtonGroup
52
+ } from './components/editor-primitives.js';
53
+
54
+ export {
55
+ FREDDIE_PAGES,
56
+ home, chat, voice, sessions, projects, agents, analytics,
57
+ models, cron, skills, config, env, tools, batch, gateway, chains,
58
+ skillLabel, getRecentPaths, saveRecentPath, renderChatMessages
59
+ } from './components/freddie.js';
package/src/debug.js CHANGED
@@ -1,30 +1,30 @@
1
- // Lightweight client-side registry. Subsystems register a snapshot fn;
2
- // `window.__debug` exposes them all for live inspection.
3
-
4
- const _registry = new Map();
5
-
6
- export function register(name, snapshotFn) {
7
- if (typeof name !== 'string' || typeof snapshotFn !== 'function') return;
8
- _registry.set(name, snapshotFn);
9
- if (typeof window !== 'undefined') {
10
- if (!window.__debug) window.__debug = {};
11
- Object.defineProperty(window.__debug, name, {
12
- get() { try { return snapshotFn(); } catch (e) { return { error: String(e) }; } },
13
- configurable: true,
14
- enumerable: true,
15
- });
16
- }
17
- }
18
-
19
- export function unregister(name) {
20
- _registry.delete(name);
21
- if (typeof window !== 'undefined' && window.__debug) delete window.__debug[name];
22
- }
23
-
24
- export function snapshot() {
25
- const out = {};
26
- for (const [k, fn] of _registry) {
27
- try { out[k] = fn(); } catch (e) { out[k] = { error: String(e) }; }
28
- }
29
- return out;
30
- }
1
+ // Lightweight client-side registry. Subsystems register a snapshot fn;
2
+ // `window.__debug` exposes them all for live inspection.
3
+
4
+ const _registry = new Map();
5
+
6
+ export function register(name, snapshotFn) {
7
+ if (typeof name !== 'string' || typeof snapshotFn !== 'function') return;
8
+ _registry.set(name, snapshotFn);
9
+ if (typeof window !== 'undefined') {
10
+ if (!window.__debug) window.__debug = {};
11
+ Object.defineProperty(window.__debug, name, {
12
+ get() { try { return snapshotFn(); } catch (e) { return { error: String(e) }; } },
13
+ configurable: true,
14
+ enumerable: true,
15
+ });
16
+ }
17
+ }
18
+
19
+ export function unregister(name) {
20
+ _registry.delete(name);
21
+ if (typeof window !== 'undefined' && window.__debug) delete window.__debug[name];
22
+ }
23
+
24
+ export function snapshot() {
25
+ const out = {};
26
+ for (const [k, fn] of _registry) {
27
+ try { out[k] = fn(); } catch (e) { out[k] = { error: String(e) }; }
28
+ }
29
+ return out;
30
+ }
package/src/deck-stage.js CHANGED
@@ -1,21 +1,21 @@
1
- // deck-stage — lazy registration. Consumer calls registerDeckStage() in a
2
- // browser context; we side-effect import the upstream slides/deck-stage.js
3
- // (the starter-component web component that handles scaling + nav).
4
-
5
- let _registered = false;
6
- export async function registerDeckStage() {
7
- if (_registered) return (typeof customElements !== 'undefined') ? customElements.get('deck-stage') : null;
8
- if (typeof customElements === 'undefined' || typeof HTMLElement === 'undefined') return null;
9
- try {
10
- await import('../slides/deck-stage.js');
11
- } catch (err) {
12
- console.warn('[247420] deck-stage import failed:', err);
13
- return null;
14
- }
15
- _registered = true;
16
- return customElements.get('deck-stage');
17
- }
18
-
19
- export function getDeckStage() {
20
- return (typeof customElements !== 'undefined') ? customElements.get('deck-stage') : null;
21
- }
1
+ // deck-stage — lazy registration. Consumer calls registerDeckStage() in a
2
+ // browser context; we side-effect import the upstream slides/deck-stage.js
3
+ // (the starter-component web component that handles scaling + nav).
4
+
5
+ let _registered = false;
6
+ export async function registerDeckStage() {
7
+ if (_registered) return (typeof customElements !== 'undefined') ? customElements.get('deck-stage') : null;
8
+ if (typeof customElements === 'undefined' || typeof HTMLElement === 'undefined') return null;
9
+ try {
10
+ await import('../slides/deck-stage.js');
11
+ } catch (err) {
12
+ console.warn('[247420] deck-stage import failed:', err);
13
+ return null;
14
+ }
15
+ _registered = true;
16
+ return customElements.get('deck-stage');
17
+ }
18
+
19
+ export function getDeckStage() {
20
+ return (typeof customElements !== 'undefined') ? customElements.get('deck-stage') : null;
21
+ }