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,19 +1,19 @@
1
- body { margin: 0; padding: 24px; font-family: var(--os-font); background: var(--os-bg-0); color: var(--os-fg); }
2
- h1 { margin: 0 0 8px 0; font-size: 22px; font-weight: 600; }
3
- h3 { margin: 18px 0 6px 0; color: var(--os-fg-2); font-size: 13px; font-weight: 600; }
4
- .sub { color: var(--os-fg-2); margin-bottom: 20px; }
5
- table { border-collapse: collapse; width: 100%; max-width: 760px; }
6
- td { padding: 6px 12px; border-bottom: 1px solid var(--os-bg-3); }
7
- td.k { width: 280px; color: var(--os-fg-2); }
8
- td.v { font-weight: 600; }
9
- td.v.pass { color: var(--os-accent); }
10
- td.v.fail { color: var(--os-red); }
11
- td.v.pending { color: var(--os-amber); }
12
- .all { margin-top: 16px; padding: 12px; background: var(--os-bg-1); max-width: 760px; border-radius: var(--os-radius-sm); }
13
- .all.green { color: var(--os-accent); }
14
- .all.red { color: var(--os-red); }
15
- .err { color: var(--os-red); white-space: pre-wrap; margin-top: 12px; }
16
- a { color: var(--os-accent); text-decoration: none; }
17
- a:hover { color: var(--os-accent-2); }
18
- iframe.osframe { position: absolute; left: -9999px; top: 0; width: 1280px; height: 900px; border: 0; }
19
- iframe.osframe-phone { position: absolute; left: -9999px; top: 0; width: 414px; height: 720px; border: 0; }
1
+ body { margin: 0; padding: 24px; font-family: var(--os-font); background: var(--os-bg-0); color: var(--os-fg); }
2
+ h1 { margin: 0 0 8px 0; font-size: 22px; font-weight: 600; }
3
+ h3 { margin: 18px 0 6px 0; color: var(--os-fg-2); font-size: 13px; font-weight: 600; }
4
+ .sub { color: var(--os-fg-2); margin-bottom: 20px; }
5
+ table { border-collapse: collapse; width: 100%; max-width: 760px; }
6
+ td { padding: 6px 12px; border-bottom: 1px solid var(--os-bg-3); }
7
+ td.k { width: 280px; color: var(--os-fg-2); }
8
+ td.v { font-weight: 600; }
9
+ td.v.pass { color: var(--os-accent); }
10
+ td.v.fail { color: var(--os-red); }
11
+ td.v.pending { color: var(--os-amber); }
12
+ .all { margin-top: 16px; padding: 12px; background: var(--os-bg-1); max-width: 760px; border-radius: var(--os-radius-sm); }
13
+ .all.green { color: var(--os-accent); }
14
+ .all.red { color: var(--os-red); }
15
+ .err { color: var(--os-red); white-space: pre-wrap; margin-top: 12px; }
16
+ a { color: var(--os-accent); text-decoration: none; }
17
+ a:hover { color: var(--os-accent-2); }
18
+ iframe.osframe { position: absolute; left: -9999px; top: 0; width: 1280px; height: 900px; border: 0; }
19
+ iframe.osframe-phone { position: absolute; left: -9999px; top: 0; width: 414px; height: 720px; border: 0; }
@@ -1,55 +1,55 @@
1
- // Validator-app paint surface — status banner + counts + iframe slot. Consumer mounts iframe.
2
- // renderValidator({src, results, callbacks: {onRerun}}) -> {node, slot, setResults, dispose}.
3
- // results shape: {allGreen, passed, total, ms} — banner updates colors + counts.
4
-
5
- export function renderValidator(opts = {}) {
6
- const { src = '', results = null, callbacks = {} } = opts;
7
- const node = document.createElement('div');
8
- node.className = 'app-pane validator-app';
9
- node.dataset.component = 'validator-app';
10
-
11
- const head = document.createElement('div');
12
- head.className = 'validator-app-head';
13
- const banner = document.createElement('span');
14
- banner.className = 'validator-app-banner';
15
- banner.dataset.state = 'pending';
16
- banner.textContent = 'pending';
17
- const counts = document.createElement('span');
18
- counts.className = 'validator-app-counts';
19
- counts.textContent = '0 / 0';
20
- const rerun = document.createElement('button');
21
- rerun.type = 'button';
22
- rerun.className = 'validator-app-rerun';
23
- rerun.textContent = 'rerun';
24
- rerun.addEventListener('click', () => callbacks.onRerun && callbacks.onRerun());
25
- head.append(banner, counts, rerun);
26
-
27
- const slot = document.createElement('div');
28
- slot.className = 'validator-app-slot';
29
- slot.dataset.role = 'validator-mount';
30
-
31
- if (src) {
32
- const f = document.createElement('iframe');
33
- f.className = 'validator-app-frame';
34
- f.src = src;
35
- slot.appendChild(f);
36
- }
37
-
38
- node.append(head, slot);
39
-
40
- function setResults(r) {
41
- if (!r) { banner.dataset.state = 'pending'; banner.textContent = 'pending'; counts.textContent = '0 / 0'; return; }
42
- const state = r.allGreen ? 'pass' : 'fail';
43
- banner.dataset.state = state;
44
- banner.textContent = state;
45
- counts.textContent = (r.passed ?? 0) + ' / ' + (r.total ?? 0) + (r.ms != null ? ' · ' + r.ms + 'ms' : '');
46
- }
47
- if (results) setResults(results);
48
-
49
- return {
50
- node,
51
- get slot() { return slot; },
52
- setResults,
53
- dispose() {},
54
- };
55
- }
1
+ // Validator-app paint surface — status banner + counts + iframe slot. Consumer mounts iframe.
2
+ // renderValidator({src, results, callbacks: {onRerun}}) -> {node, slot, setResults, dispose}.
3
+ // results shape: {allGreen, passed, total, ms} — banner updates colors + counts.
4
+
5
+ export function renderValidator(opts = {}) {
6
+ const { src = '', results = null, callbacks = {} } = opts;
7
+ const node = document.createElement('div');
8
+ node.className = 'app-pane validator-app';
9
+ node.dataset.component = 'validator-app';
10
+
11
+ const head = document.createElement('div');
12
+ head.className = 'validator-app-head';
13
+ const banner = document.createElement('span');
14
+ banner.className = 'validator-app-banner';
15
+ banner.dataset.state = 'pending';
16
+ banner.textContent = 'pending';
17
+ const counts = document.createElement('span');
18
+ counts.className = 'validator-app-counts';
19
+ counts.textContent = '0 / 0';
20
+ const rerun = document.createElement('button');
21
+ rerun.type = 'button';
22
+ rerun.className = 'validator-app-rerun';
23
+ rerun.textContent = 'rerun';
24
+ rerun.addEventListener('click', () => callbacks.onRerun && callbacks.onRerun());
25
+ head.append(banner, counts, rerun);
26
+
27
+ const slot = document.createElement('div');
28
+ slot.className = 'validator-app-slot';
29
+ slot.dataset.role = 'validator-mount';
30
+
31
+ if (src) {
32
+ const f = document.createElement('iframe');
33
+ f.className = 'validator-app-frame';
34
+ f.src = src;
35
+ slot.appendChild(f);
36
+ }
37
+
38
+ node.append(head, slot);
39
+
40
+ function setResults(r) {
41
+ if (!r) { banner.dataset.state = 'pending'; banner.textContent = 'pending'; counts.textContent = '0 / 0'; return; }
42
+ const state = r.allGreen ? 'pass' : 'fail';
43
+ banner.dataset.state = state;
44
+ banner.textContent = state;
45
+ counts.textContent = (r.passed ?? 0) + ' / ' + (r.total ?? 0) + (r.ms != null ? ' · ' + r.ms + 'ms' : '');
46
+ }
47
+ if (results) setResults(results);
48
+
49
+ return {
50
+ node,
51
+ get slot() { return slot; },
52
+ setResults,
53
+ dispose() {},
54
+ };
55
+ }
@@ -1,115 +1,115 @@
1
- /* ============================================================
2
- Window Manager visuals — paired with createWM() behavior
3
- Tokens: --os-* (defined by desktop/theme.css)
4
- Bible: tonal surfaces, no borders for chrome, inset rail for focus.
5
- ============================================================ */
6
-
7
- .wm-root {
8
- position: fixed;
9
- inset: 0;
10
- pointer-events: none;
11
- z-index: 9000;
12
- }
13
-
14
- .wm-win {
15
- position: absolute;
16
- min-width: 200px;
17
- min-height: 120px;
18
- background: var(--os-bg-1);
19
- color: var(--os-fg);
20
- border: none;
21
- border-radius: var(--r-3, 18px);
22
- display: flex;
23
- flex-direction: column;
24
- pointer-events: auto;
25
- overflow: hidden;
26
- }
27
- .wm-win.wm-focused { box-shadow: inset 4px 0 0 var(--os-accent); }
28
-
29
- .wm-bar {
30
- display: flex;
31
- align-items: center;
32
- padding: 6px 10px;
33
- background: var(--os-bg-2);
34
- cursor: move;
35
- user-select: none;
36
- gap: 8px;
37
- touch-action: none;
38
- border: none;
39
- }
40
- .wm-title {
41
- flex: 1;
42
- font: 12px var(--os-font);
43
- white-space: nowrap;
44
- overflow: hidden;
45
- text-overflow: ellipsis;
46
- text-transform: lowercase;
47
- }
48
-
49
- .wm-btns { display: flex; gap: 4px; }
50
- .wm-btn {
51
- width: 22px;
52
- height: 22px;
53
- border: none;
54
- background: var(--os-bg-3);
55
- color: var(--os-fg-2);
56
- cursor: pointer;
57
- padding: 0;
58
- font: 600 12px var(--os-mono);
59
- line-height: 1;
60
- display: inline-flex;
61
- align-items: center;
62
- justify-content: center;
63
- border-radius: var(--r-1, 6px);
64
- transition: background 100ms ease, color 100ms ease;
65
- }
66
- .wm-btn:hover { background: var(--panel-hover, var(--os-bg-2)); color: var(--os-fg); }
67
-
68
- .wm-body {
69
- flex: 1;
70
- overflow: auto;
71
- position: relative;
72
- background: var(--os-bg-1);
73
- }
74
-
75
- .wm-resize {
76
- position: absolute;
77
- right: 0;
78
- bottom: 0;
79
- width: 14px;
80
- height: 14px;
81
- cursor: nwse-resize;
82
- background: transparent;
83
- color: var(--os-fg-3);
84
- opacity: 0.4;
85
- font: 10px var(--os-mono);
86
- line-height: 1;
87
- display: flex;
88
- align-items: flex-end;
89
- justify-content: flex-end;
90
- touch-action: none;
91
- }
92
- .wm-resize::after { content: '\25E2'; }
93
-
94
- .wm-win.wm-min .wm-body,
95
- .wm-win.wm-min .wm-resize { display: none; }
96
-
97
- .wm-win.wm-max {
98
- left: 0 !important;
99
- top: 0 !important;
100
- width: 100% !important;
101
- height: 100% !important;
102
- border-radius: 0;
103
- }
104
-
105
- @media (max-width: 767px) {
106
- .wm-win {
107
- left: 0 !important;
108
- top: 0 !important;
109
- width: 100% !important;
110
- height: 100% !important;
111
- border-radius: 0;
112
- border: none;
113
- }
114
- .wm-resize { display: none; }
115
- }
1
+ /* ============================================================
2
+ Window Manager visuals — paired with createWM() behavior
3
+ Tokens: --os-* (defined by desktop/theme.css)
4
+ Bible: tonal surfaces, no borders for chrome, inset rail for focus.
5
+ ============================================================ */
6
+
7
+ .wm-root {
8
+ position: fixed;
9
+ inset: 0;
10
+ pointer-events: none;
11
+ z-index: 9000;
12
+ }
13
+
14
+ .wm-win {
15
+ position: absolute;
16
+ min-width: 200px;
17
+ min-height: 120px;
18
+ background: var(--os-bg-1);
19
+ color: var(--os-fg);
20
+ border: none;
21
+ border-radius: var(--r-3, 18px);
22
+ display: flex;
23
+ flex-direction: column;
24
+ pointer-events: auto;
25
+ overflow: hidden;
26
+ }
27
+ .wm-win.wm-focused { box-shadow: inset 4px 0 0 var(--os-accent); }
28
+
29
+ .wm-bar {
30
+ display: flex;
31
+ align-items: center;
32
+ padding: 6px 10px;
33
+ background: var(--os-bg-2);
34
+ cursor: move;
35
+ user-select: none;
36
+ gap: 8px;
37
+ touch-action: none;
38
+ border: none;
39
+ }
40
+ .wm-title {
41
+ flex: 1;
42
+ font: 12px var(--os-font);
43
+ white-space: nowrap;
44
+ overflow: hidden;
45
+ text-overflow: ellipsis;
46
+ text-transform: lowercase;
47
+ }
48
+
49
+ .wm-btns { display: flex; gap: 4px; }
50
+ .wm-btn {
51
+ width: 22px;
52
+ height: 22px;
53
+ border: none;
54
+ background: var(--os-bg-3);
55
+ color: var(--os-fg-2);
56
+ cursor: pointer;
57
+ padding: 0;
58
+ font: 600 12px var(--os-mono);
59
+ line-height: 1;
60
+ display: inline-flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ border-radius: var(--r-1, 6px);
64
+ transition: background 100ms ease, color 100ms ease;
65
+ }
66
+ .wm-btn:hover { background: var(--panel-hover, var(--os-bg-2)); color: var(--os-fg); }
67
+
68
+ .wm-body {
69
+ flex: 1;
70
+ overflow: auto;
71
+ position: relative;
72
+ background: var(--os-bg-1);
73
+ }
74
+
75
+ .wm-resize {
76
+ position: absolute;
77
+ right: 0;
78
+ bottom: 0;
79
+ width: 14px;
80
+ height: 14px;
81
+ cursor: nwse-resize;
82
+ background: transparent;
83
+ color: var(--os-fg-3);
84
+ opacity: 0.4;
85
+ font: 10px var(--os-mono);
86
+ line-height: 1;
87
+ display: flex;
88
+ align-items: flex-end;
89
+ justify-content: flex-end;
90
+ touch-action: none;
91
+ }
92
+ .wm-resize::after { content: '\25E2'; }
93
+
94
+ .wm-win.wm-min .wm-body,
95
+ .wm-win.wm-min .wm-resize { display: none; }
96
+
97
+ .wm-win.wm-max {
98
+ left: 0 !important;
99
+ top: 0 !important;
100
+ width: 100% !important;
101
+ height: 100% !important;
102
+ border-radius: 0;
103
+ }
104
+
105
+ @media (max-width: 767px) {
106
+ .wm-win {
107
+ left: 0 !important;
108
+ top: 0 !important;
109
+ width: 100% !important;
110
+ height: 100% !important;
111
+ border-radius: 0;
112
+ border: none;
113
+ }
114
+ .wm-resize { display: none; }
115
+ }
package/src/kits/os/wm.js CHANGED
@@ -1,111 +1,111 @@
1
- // Window manager paint surface — pure DOM rendering, no state machine.
2
- // Consumer (thebird) owns z-order, focus stack, alt-tab, drag/resize math.
3
- // renderWindow returns a handle whose setBounds is called from pointermove.
4
- //
5
- // Visuals are bible-aligned: mac-less chip buttons (-+x in mono),
6
- // inset 4px rail for focus, low-opacity \25E2 glyph for resize affordance,
7
- // pointer-events:none on .wm-bar with auto on title+close so phone @media
8
- // auto-maximize can suppress drag without a JS branch.
9
-
10
- export function renderWindow(opts = {}) {
11
- const {
12
- title = 'window',
13
- body = null,
14
- bounds = { x: 60, y: 60, w: 480, h: 320 },
15
- focused = false,
16
- maximized = false,
17
- minimized = false,
18
- instanceId = '',
19
- kind = 'div',
20
- callbacks = {},
21
- } = opts;
22
-
23
- const el = document.createElement('div');
24
- el.className = 'wm-win';
25
- el.dataset.kind = kind;
26
- if (instanceId) el.dataset.instanceId = instanceId;
27
- el.style.left = bounds.x + 'px';
28
- el.style.top = bounds.y + 'px';
29
- el.style.width = bounds.w + 'px';
30
- el.style.height = bounds.h + 'px';
31
-
32
- const bar = document.createElement('div');
33
- bar.className = 'wm-bar';
34
- const titleEl = document.createElement('span');
35
- titleEl.className = 'wm-title';
36
- titleEl.textContent = title;
37
- const btns = document.createElement('div');
38
- btns.className = 'wm-btns';
39
- const minBtn = mkBtn('-', 'minimize');
40
- const maxBtn = mkBtn('+', 'maximize');
41
- const closeBtn = mkBtn('x', 'close');
42
- btns.append(minBtn, maxBtn, closeBtn);
43
- bar.append(titleEl, btns);
44
-
45
- const bodyEl = document.createElement('div');
46
- bodyEl.className = 'wm-body';
47
- setBodyContent(bodyEl, body);
48
-
49
- const resize = document.createElement('div');
50
- resize.className = 'wm-resize';
51
-
52
- el.append(bar, bodyEl, resize);
53
-
54
- minBtn.addEventListener('click', e => { e.stopPropagation(); callbacks.onMinimize && callbacks.onMinimize(); });
55
- maxBtn.addEventListener('click', e => { e.stopPropagation(); callbacks.onMaximize && callbacks.onMaximize(); });
56
- closeBtn.addEventListener('click', e => { e.stopPropagation(); callbacks.onClose && callbacks.onClose(); });
57
-
58
- el.addEventListener('pointerdown', () => callbacks.onFocus && callbacks.onFocus());
59
-
60
- bar.addEventListener('pointerdown', e => {
61
- if (e.target.closest('.wm-btn')) return;
62
- callbacks.onFocus && callbacks.onFocus();
63
- if (callbacks.onDragStart) callbacks.onDragStart(e, { x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight });
64
- });
65
-
66
- resize.addEventListener('pointerdown', e => {
67
- callbacks.onFocus && callbacks.onFocus();
68
- if (callbacks.onResizeStart) callbacks.onResizeStart(e, { x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight });
69
- });
70
-
71
- applyFocused(el, focused);
72
- applyMaximized(el, maximized);
73
- applyMinimized(el, minimized);
74
-
75
- return {
76
- el,
77
- setTitle(t) { titleEl.textContent = t; },
78
- setBody(b) { setBodyContent(bodyEl, b); },
79
- setBounds(b) {
80
- if (typeof b.x === 'number') el.style.left = b.x + 'px';
81
- if (typeof b.y === 'number') el.style.top = b.y + 'px';
82
- if (typeof b.w === 'number') el.style.width = b.w + 'px';
83
- if (typeof b.h === 'number') el.style.height = b.h + 'px';
84
- },
85
- setFocused(v) { applyFocused(el, v); },
86
- setMaximized(v) { applyMaximized(el, v); },
87
- setMinimized(v) { applyMinimized(el, v); },
88
- setInstanceId(id) { if (id) el.dataset.instanceId = id; else delete el.dataset.instanceId; },
89
- setZIndex(z) { el.style.zIndex = String(z); },
90
- getBounds() { return { x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight }; },
91
- dispose() { el.remove(); },
92
- };
93
- }
94
-
95
- function mkBtn(label, ttl) {
96
- const b = document.createElement('button');
97
- b.className = 'wm-btn';
98
- b.textContent = label;
99
- b.title = ttl;
100
- return b;
101
- }
102
-
103
- function setBodyContent(host, body) {
104
- while (host.firstChild) host.removeChild(host.firstChild);
105
- if (body instanceof Node) host.appendChild(body);
106
- else if (typeof body === 'string') host.innerHTML = body;
107
- }
108
-
109
- function applyFocused(el, v) { el.classList.toggle('wm-focused', !!v); }
110
- function applyMaximized(el, v) { el.classList.toggle('wm-max', !!v); }
111
- function applyMinimized(el, v) { el.classList.toggle('wm-min', !!v); }
1
+ // Window manager paint surface — pure DOM rendering, no state machine.
2
+ // Consumer (thebird) owns z-order, focus stack, alt-tab, drag/resize math.
3
+ // renderWindow returns a handle whose setBounds is called from pointermove.
4
+ //
5
+ // Visuals are bible-aligned: mac-less chip buttons (-+x in mono),
6
+ // inset 4px rail for focus, low-opacity \25E2 glyph for resize affordance,
7
+ // pointer-events:none on .wm-bar with auto on title+close so phone @media
8
+ // auto-maximize can suppress drag without a JS branch.
9
+
10
+ export function renderWindow(opts = {}) {
11
+ const {
12
+ title = 'window',
13
+ body = null,
14
+ bounds = { x: 60, y: 60, w: 480, h: 320 },
15
+ focused = false,
16
+ maximized = false,
17
+ minimized = false,
18
+ instanceId = '',
19
+ kind = 'div',
20
+ callbacks = {},
21
+ } = opts;
22
+
23
+ const el = document.createElement('div');
24
+ el.className = 'wm-win';
25
+ el.dataset.kind = kind;
26
+ if (instanceId) el.dataset.instanceId = instanceId;
27
+ el.style.left = bounds.x + 'px';
28
+ el.style.top = bounds.y + 'px';
29
+ el.style.width = bounds.w + 'px';
30
+ el.style.height = bounds.h + 'px';
31
+
32
+ const bar = document.createElement('div');
33
+ bar.className = 'wm-bar';
34
+ const titleEl = document.createElement('span');
35
+ titleEl.className = 'wm-title';
36
+ titleEl.textContent = title;
37
+ const btns = document.createElement('div');
38
+ btns.className = 'wm-btns';
39
+ const minBtn = mkBtn('-', 'minimize');
40
+ const maxBtn = mkBtn('+', 'maximize');
41
+ const closeBtn = mkBtn('x', 'close');
42
+ btns.append(minBtn, maxBtn, closeBtn);
43
+ bar.append(titleEl, btns);
44
+
45
+ const bodyEl = document.createElement('div');
46
+ bodyEl.className = 'wm-body';
47
+ setBodyContent(bodyEl, body);
48
+
49
+ const resize = document.createElement('div');
50
+ resize.className = 'wm-resize';
51
+
52
+ el.append(bar, bodyEl, resize);
53
+
54
+ minBtn.addEventListener('click', e => { e.stopPropagation(); callbacks.onMinimize && callbacks.onMinimize(); });
55
+ maxBtn.addEventListener('click', e => { e.stopPropagation(); callbacks.onMaximize && callbacks.onMaximize(); });
56
+ closeBtn.addEventListener('click', e => { e.stopPropagation(); callbacks.onClose && callbacks.onClose(); });
57
+
58
+ el.addEventListener('pointerdown', () => callbacks.onFocus && callbacks.onFocus());
59
+
60
+ bar.addEventListener('pointerdown', e => {
61
+ if (e.target.closest('.wm-btn')) return;
62
+ callbacks.onFocus && callbacks.onFocus();
63
+ if (callbacks.onDragStart) callbacks.onDragStart(e, { x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight });
64
+ });
65
+
66
+ resize.addEventListener('pointerdown', e => {
67
+ callbacks.onFocus && callbacks.onFocus();
68
+ if (callbacks.onResizeStart) callbacks.onResizeStart(e, { x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight });
69
+ });
70
+
71
+ applyFocused(el, focused);
72
+ applyMaximized(el, maximized);
73
+ applyMinimized(el, minimized);
74
+
75
+ return {
76
+ el,
77
+ setTitle(t) { titleEl.textContent = t; },
78
+ setBody(b) { setBodyContent(bodyEl, b); },
79
+ setBounds(b) {
80
+ if (typeof b.x === 'number') el.style.left = b.x + 'px';
81
+ if (typeof b.y === 'number') el.style.top = b.y + 'px';
82
+ if (typeof b.w === 'number') el.style.width = b.w + 'px';
83
+ if (typeof b.h === 'number') el.style.height = b.h + 'px';
84
+ },
85
+ setFocused(v) { applyFocused(el, v); },
86
+ setMaximized(v) { applyMaximized(el, v); },
87
+ setMinimized(v) { applyMinimized(el, v); },
88
+ setInstanceId(id) { if (id) el.dataset.instanceId = id; else delete el.dataset.instanceId; },
89
+ setZIndex(z) { el.style.zIndex = String(z); },
90
+ getBounds() { return { x: el.offsetLeft, y: el.offsetTop, w: el.offsetWidth, h: el.offsetHeight }; },
91
+ dispose() { el.remove(); },
92
+ };
93
+ }
94
+
95
+ function mkBtn(label, ttl) {
96
+ const b = document.createElement('button');
97
+ b.className = 'wm-btn';
98
+ b.textContent = label;
99
+ b.title = ttl;
100
+ return b;
101
+ }
102
+
103
+ function setBodyContent(host, body) {
104
+ while (host.firstChild) host.removeChild(host.firstChild);
105
+ if (body instanceof Node) host.appendChild(body);
106
+ else if (typeof body === 'string') host.innerHTML = body;
107
+ }
108
+
109
+ function applyFocused(el, v) { el.classList.toggle('wm-focused', !!v); }
110
+ function applyMaximized(el, v) { el.classList.toggle('wm-max', !!v); }
111
+ function applyMinimized(el, v) { el.classList.toggle('wm-min', !!v); }