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,152 +1,152 @@
1
- /* App-pane chrome for kit components rendered inside .wm-win bodies.
2
- Bible tokens only — no hardcoded color, font, or radius. Focus = inset rail; no shadows, no gradients. */
3
-
4
- /* ── terminal-app ───────────────────────────────────────────────────── */
5
- .terminal-app {
6
- display: flex;
7
- flex-direction: column;
8
- height: 100%;
9
- background: var(--os-bg-1);
10
- color: var(--os-fg);
11
- font-family: var(--os-mono);
12
- }
13
- .terminal-app-head {
14
- display: flex;
15
- align-items: center;
16
- justify-content: space-between;
17
- padding: 4px 10px;
18
- background: var(--os-bg-2);
19
- font-family: var(--os-mono);
20
- font-size: 11px;
21
- color: var(--os-fg-2);
22
- text-transform: lowercase;
23
- flex: 0 0 auto;
24
- }
25
- .terminal-app-title { font-family: var(--os-mono); }
26
- .terminal-app-status { font-family: var(--os-mono); color: var(--os-fg-3); }
27
- .terminal-app-slot {
28
- flex: 1 1 auto;
29
- min-height: 0;
30
- overflow: hidden;
31
- background: var(--os-bg-0);
32
- }
33
-
34
- /* ── browser-app ────────────────────────────────────────────────────── */
35
- .browser-app {
36
- display: flex;
37
- flex-direction: column;
38
- height: 100%;
39
- background: var(--os-bg-1);
40
- color: var(--os-fg);
41
- font-family: var(--os-font);
42
- }
43
- .browser-app-bar {
44
- display: flex;
45
- align-items: center;
46
- gap: 6px;
47
- padding: 6px 8px;
48
- background: var(--os-bg-2);
49
- flex: 0 0 auto;
50
- }
51
- .browser-app-btn {
52
- height: 28px;
53
- min-width: 28px;
54
- padding: 0 8px;
55
- background: var(--os-bg-3);
56
- color: var(--os-fg);
57
- border: none;
58
- border-radius: var(--os-radius-sm);
59
- font: 12px var(--os-mono);
60
- cursor: pointer;
61
- outline: none;
62
- }
63
- .browser-app-btn:hover { background: var(--os-accent-soft); }
64
- .browser-app-url {
65
- flex: 1 1 auto;
66
- height: 28px;
67
- padding: 0 10px;
68
- background: var(--os-bg-0);
69
- color: var(--os-fg);
70
- border: none;
71
- border-radius: var(--os-radius-sm);
72
- font: 12px var(--os-mono);
73
- outline: none;
74
- }
75
- .browser-app-url:focus { box-shadow: inset 4px 0 0 var(--os-accent); }
76
- .browser-app-slot {
77
- flex: 1 1 auto;
78
- min-height: 0;
79
- overflow: hidden;
80
- background: var(--os-bg-0);
81
- display: flex;
82
- }
83
- .browser-app-slot > * { flex: 1 1 auto; min-width: 0; min-height: 0; }
84
- .browser-app-status {
85
- flex: 0 0 auto;
86
- padding: 2px 10px;
87
- background: var(--os-bg-2);
88
- font: 11px var(--os-mono);
89
- color: var(--os-fg-3);
90
- text-transform: lowercase;
91
- min-height: 18px;
92
- }
93
-
94
- /* ── validator-app ──────────────────────────────────────────────────── */
95
- .validator-app {
96
- display: flex;
97
- flex-direction: column;
98
- height: 100%;
99
- background: var(--os-bg-1);
100
- color: var(--os-fg);
101
- font-family: var(--os-font);
102
- }
103
- .validator-app-head {
104
- display: flex;
105
- align-items: center;
106
- gap: 10px;
107
- padding: 6px 10px;
108
- background: var(--os-bg-2);
109
- flex: 0 0 auto;
110
- }
111
- .validator-app-banner {
112
- padding: 2px 10px;
113
- border-radius: 999px;
114
- font: 11px var(--os-mono);
115
- text-transform: lowercase;
116
- background: var(--os-bg-3);
117
- color: var(--os-fg-2);
118
- }
119
- .validator-app-banner[data-state="pass"] { background: var(--os-accent-soft); color: var(--os-fg); }
120
- .validator-app-banner[data-state="fail"] { background: var(--os-red); color: var(--os-bg-0); }
121
- .validator-app-counts {
122
- font: 11px var(--os-mono);
123
- color: var(--os-fg-2);
124
- }
125
- .validator-app-rerun {
126
- margin-left: auto;
127
- height: 24px;
128
- padding: 0 10px;
129
- background: var(--os-bg-3);
130
- color: var(--os-fg);
131
- border: none;
132
- border-radius: var(--os-radius-sm);
133
- font: 11px var(--os-mono);
134
- text-transform: lowercase;
135
- cursor: pointer;
136
- outline: none;
137
- }
138
- .validator-app-rerun:hover { background: var(--os-accent-soft); }
139
- .validator-app-slot {
140
- flex: 1 1 auto;
141
- min-height: 0;
142
- overflow: hidden;
143
- display: flex;
144
- background: var(--os-bg-0);
145
- }
146
- .validator-app-slot > * { flex: 1 1 auto; min-width: 0; min-height: 0; }
147
- .validator-app-frame {
148
- width: 100%;
149
- height: 100%;
150
- border: none;
151
- background: var(--os-bg-0);
152
- }
1
+ /* App-pane chrome for kit components rendered inside .wm-win bodies.
2
+ Bible tokens only — no hardcoded color, font, or radius. Focus = inset rail; no shadows, no gradients. */
3
+
4
+ /* ── terminal-app ───────────────────────────────────────────────────── */
5
+ .terminal-app {
6
+ display: flex;
7
+ flex-direction: column;
8
+ height: 100%;
9
+ background: var(--os-bg-1);
10
+ color: var(--os-fg);
11
+ font-family: var(--os-mono);
12
+ }
13
+ .terminal-app-head {
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: space-between;
17
+ padding: 4px 10px;
18
+ background: var(--os-bg-2);
19
+ font-family: var(--os-mono);
20
+ font-size: 11px;
21
+ color: var(--os-fg-2);
22
+ text-transform: lowercase;
23
+ flex: 0 0 auto;
24
+ }
25
+ .terminal-app-title { font-family: var(--os-mono); }
26
+ .terminal-app-status { font-family: var(--os-mono); color: var(--os-fg-3); }
27
+ .terminal-app-slot {
28
+ flex: 1 1 auto;
29
+ min-height: 0;
30
+ overflow: hidden;
31
+ background: var(--os-bg-0);
32
+ }
33
+
34
+ /* ── browser-app ────────────────────────────────────────────────────── */
35
+ .browser-app {
36
+ display: flex;
37
+ flex-direction: column;
38
+ height: 100%;
39
+ background: var(--os-bg-1);
40
+ color: var(--os-fg);
41
+ font-family: var(--os-font);
42
+ }
43
+ .browser-app-bar {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 6px;
47
+ padding: 6px 8px;
48
+ background: var(--os-bg-2);
49
+ flex: 0 0 auto;
50
+ }
51
+ .browser-app-btn {
52
+ height: 28px;
53
+ min-width: 28px;
54
+ padding: 0 8px;
55
+ background: var(--os-bg-3);
56
+ color: var(--os-fg);
57
+ border: none;
58
+ border-radius: var(--os-radius-sm);
59
+ font: 12px var(--os-mono);
60
+ cursor: pointer;
61
+ outline: none;
62
+ }
63
+ .browser-app-btn:hover { background: var(--os-accent-soft); }
64
+ .browser-app-url {
65
+ flex: 1 1 auto;
66
+ height: 28px;
67
+ padding: 0 10px;
68
+ background: var(--os-bg-0);
69
+ color: var(--os-fg);
70
+ border: none;
71
+ border-radius: var(--os-radius-sm);
72
+ font: 12px var(--os-mono);
73
+ outline: none;
74
+ }
75
+ .browser-app-url:focus { box-shadow: inset 4px 0 0 var(--os-accent); }
76
+ .browser-app-slot {
77
+ flex: 1 1 auto;
78
+ min-height: 0;
79
+ overflow: hidden;
80
+ background: var(--os-bg-0);
81
+ display: flex;
82
+ }
83
+ .browser-app-slot > * { flex: 1 1 auto; min-width: 0; min-height: 0; }
84
+ .browser-app-status {
85
+ flex: 0 0 auto;
86
+ padding: 2px 10px;
87
+ background: var(--os-bg-2);
88
+ font: 11px var(--os-mono);
89
+ color: var(--os-fg-3);
90
+ text-transform: lowercase;
91
+ min-height: 18px;
92
+ }
93
+
94
+ /* ── validator-app ──────────────────────────────────────────────────── */
95
+ .validator-app {
96
+ display: flex;
97
+ flex-direction: column;
98
+ height: 100%;
99
+ background: var(--os-bg-1);
100
+ color: var(--os-fg);
101
+ font-family: var(--os-font);
102
+ }
103
+ .validator-app-head {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 10px;
107
+ padding: 6px 10px;
108
+ background: var(--os-bg-2);
109
+ flex: 0 0 auto;
110
+ }
111
+ .validator-app-banner {
112
+ padding: 2px 10px;
113
+ border-radius: 999px;
114
+ font: 11px var(--os-mono);
115
+ text-transform: lowercase;
116
+ background: var(--os-bg-3);
117
+ color: var(--os-fg-2);
118
+ }
119
+ .validator-app-banner[data-state="pass"] { background: var(--os-accent-soft); color: var(--os-fg); }
120
+ .validator-app-banner[data-state="fail"] { background: var(--os-red); color: var(--os-bg-0); }
121
+ .validator-app-counts {
122
+ font: 11px var(--os-mono);
123
+ color: var(--os-fg-2);
124
+ }
125
+ .validator-app-rerun {
126
+ margin-left: auto;
127
+ height: 24px;
128
+ padding: 0 10px;
129
+ background: var(--os-bg-3);
130
+ color: var(--os-fg);
131
+ border: none;
132
+ border-radius: var(--os-radius-sm);
133
+ font: 11px var(--os-mono);
134
+ text-transform: lowercase;
135
+ cursor: pointer;
136
+ outline: none;
137
+ }
138
+ .validator-app-rerun:hover { background: var(--os-accent-soft); }
139
+ .validator-app-slot {
140
+ flex: 1 1 auto;
141
+ min-height: 0;
142
+ overflow: hidden;
143
+ display: flex;
144
+ background: var(--os-bg-0);
145
+ }
146
+ .validator-app-slot > * { flex: 1 1 auto; min-width: 0; min-height: 0; }
147
+ .validator-app-frame {
148
+ width: 100%;
149
+ height: 100%;
150
+ border: none;
151
+ background: var(--os-bg-0);
152
+ }
@@ -1,58 +1,58 @@
1
- // Browser-pane paint surface — URL bar + iframe slot + status row. Consumer owns iframe.
2
- // renderBrowserPane({initialUrl, callbacks: {onNavigate, onReload, onBack, onForward}})
3
- // -> {node, slot, setUrl, setStatus, dispose}.
4
- // slot is the container the consumer should append its iframe to.
5
-
6
- export function renderBrowserPane(opts = {}) {
7
- const { initialUrl = 'about:blank', callbacks = {} } = opts;
8
- const node = document.createElement('div');
9
- node.className = 'app-pane browser-app';
10
- node.dataset.component = 'browser-app';
11
-
12
- const bar = document.createElement('div');
13
- bar.className = 'browser-app-bar';
14
-
15
- const mkBtn = (label, role) => {
16
- const b = document.createElement('button');
17
- b.type = 'button';
18
- b.className = 'browser-app-btn';
19
- b.dataset.role = role;
20
- b.textContent = label;
21
- return b;
22
- };
23
- const backBtn = mkBtn('<', 'back');
24
- const fwdBtn = mkBtn('>', 'forward');
25
- const reloadBtn = mkBtn('reload', 'reload');
26
-
27
- const urlInput = document.createElement('input');
28
- urlInput.type = 'text';
29
- urlInput.className = 'browser-app-url';
30
- urlInput.value = initialUrl;
31
- urlInput.spellcheck = false;
32
- urlInput.addEventListener('keydown', (e) => {
33
- if (e.key === 'Enter' && callbacks.onNavigate) callbacks.onNavigate(urlInput.value);
34
- });
35
- backBtn.addEventListener('click', () => callbacks.onBack && callbacks.onBack());
36
- fwdBtn.addEventListener('click', () => callbacks.onForward && callbacks.onForward());
37
- reloadBtn.addEventListener('click', () => callbacks.onReload && callbacks.onReload());
38
-
39
- bar.append(backBtn, fwdBtn, reloadBtn, urlInput);
40
-
41
- const slot = document.createElement('div');
42
- slot.className = 'browser-app-slot';
43
- slot.dataset.role = 'iframe-mount';
44
-
45
- const status = document.createElement('div');
46
- status.className = 'browser-app-status';
47
- status.textContent = '';
48
-
49
- node.append(bar, slot, status);
50
-
51
- return {
52
- node,
53
- get slot() { return slot; },
54
- setUrl(u) { urlInput.value = u; },
55
- setStatus(s) { status.textContent = s; },
56
- dispose() {},
57
- };
58
- }
1
+ // Browser-pane paint surface — URL bar + iframe slot + status row. Consumer owns iframe.
2
+ // renderBrowserPane({initialUrl, callbacks: {onNavigate, onReload, onBack, onForward}})
3
+ // -> {node, slot, setUrl, setStatus, dispose}.
4
+ // slot is the container the consumer should append its iframe to.
5
+
6
+ export function renderBrowserPane(opts = {}) {
7
+ const { initialUrl = 'about:blank', callbacks = {} } = opts;
8
+ const node = document.createElement('div');
9
+ node.className = 'app-pane browser-app';
10
+ node.dataset.component = 'browser-app';
11
+
12
+ const bar = document.createElement('div');
13
+ bar.className = 'browser-app-bar';
14
+
15
+ const mkBtn = (label, role) => {
16
+ const b = document.createElement('button');
17
+ b.type = 'button';
18
+ b.className = 'browser-app-btn';
19
+ b.dataset.role = role;
20
+ b.textContent = label;
21
+ return b;
22
+ };
23
+ const backBtn = mkBtn('<', 'back');
24
+ const fwdBtn = mkBtn('>', 'forward');
25
+ const reloadBtn = mkBtn('reload', 'reload');
26
+
27
+ const urlInput = document.createElement('input');
28
+ urlInput.type = 'text';
29
+ urlInput.className = 'browser-app-url';
30
+ urlInput.value = initialUrl;
31
+ urlInput.spellcheck = false;
32
+ urlInput.addEventListener('keydown', (e) => {
33
+ if (e.key === 'Enter' && callbacks.onNavigate) callbacks.onNavigate(urlInput.value);
34
+ });
35
+ backBtn.addEventListener('click', () => callbacks.onBack && callbacks.onBack());
36
+ fwdBtn.addEventListener('click', () => callbacks.onForward && callbacks.onForward());
37
+ reloadBtn.addEventListener('click', () => callbacks.onReload && callbacks.onReload());
38
+
39
+ bar.append(backBtn, fwdBtn, reloadBtn, urlInput);
40
+
41
+ const slot = document.createElement('div');
42
+ slot.className = 'browser-app-slot';
43
+ slot.dataset.role = 'iframe-mount';
44
+
45
+ const status = document.createElement('div');
46
+ status.className = 'browser-app-status';
47
+ status.textContent = '';
48
+
49
+ node.append(bar, slot, status);
50
+
51
+ return {
52
+ node,
53
+ get slot() { return slot; },
54
+ setUrl(u) { urlInput.value = u; },
55
+ setStatus(s) { status.textContent = s; },
56
+ dispose() {},
57
+ };
58
+ }
@@ -1,44 +1,44 @@
1
- // Files-app paint surface — bible classes, pure DOM. Consumer provides callbacks.
2
- // renderFilesApp({list, readFile}) -> {node, refresh, dispose}.
3
- // list() -> Promise<string[]>; readFile(path) -> Promise<string|Uint8Array>.
4
- // Header text comes from {label} (consumer assembles "<id> — N files").
5
-
6
- export function renderFilesApp(opts = {}) {
7
- const { list, readFile, label = '', pollMs = 2000 } = opts;
8
- const node = document.createElement('div');
9
- node.className = 'app-pane mono';
10
- node.dataset.component = 'files-app';
11
-
12
- let preview = null;
13
- async function refresh() {
14
- const items = await list();
15
- node.innerHTML = '';
16
- const head = document.createElement('div');
17
- head.className = 'head';
18
- head.textContent = (label ? label + ' — ' : '') + items.length + ' files';
19
- node.appendChild(head);
20
- for (const p of items) {
21
- const row = document.createElement('div');
22
- row.className = 'row';
23
- row.textContent = p;
24
- row.addEventListener('click', async () => {
25
- const body = await readFile(p);
26
- if (preview) preview.remove();
27
- preview = document.createElement('pre');
28
- preview.textContent = String(body);
29
- node.appendChild(preview);
30
- });
31
- node.appendChild(row);
32
- }
33
- }
34
-
35
- let timer = null;
36
- refresh().catch(() => {});
37
- if (pollMs > 0) timer = setInterval(() => refresh().catch(() => {}), pollMs);
38
-
39
- return {
40
- node,
41
- refresh,
42
- dispose() { if (timer) clearInterval(timer); },
43
- };
44
- }
1
+ // Files-app paint surface — bible classes, pure DOM. Consumer provides callbacks.
2
+ // renderFilesApp({list, readFile}) -> {node, refresh, dispose}.
3
+ // list() -> Promise<string[]>; readFile(path) -> Promise<string|Uint8Array>.
4
+ // Header text comes from {label} (consumer assembles "<id> — N files").
5
+
6
+ export function renderFilesApp(opts = {}) {
7
+ const { list, readFile, label = '', pollMs = 2000 } = opts;
8
+ const node = document.createElement('div');
9
+ node.className = 'app-pane mono';
10
+ node.dataset.component = 'files-app';
11
+
12
+ let preview = null;
13
+ async function refresh() {
14
+ const items = await list();
15
+ node.innerHTML = '';
16
+ const head = document.createElement('div');
17
+ head.className = 'head';
18
+ head.textContent = (label ? label + ' — ' : '') + items.length + ' files';
19
+ node.appendChild(head);
20
+ for (const p of items) {
21
+ const row = document.createElement('div');
22
+ row.className = 'row';
23
+ row.textContent = p;
24
+ row.addEventListener('click', async () => {
25
+ const body = await readFile(p);
26
+ if (preview) preview.remove();
27
+ preview = document.createElement('pre');
28
+ preview.textContent = String(body);
29
+ node.appendChild(preview);
30
+ });
31
+ node.appendChild(row);
32
+ }
33
+ }
34
+
35
+ let timer = null;
36
+ refresh().catch(() => {});
37
+ if (pollMs > 0) timer = setInterval(() => refresh().catch(() => {}), pollMs);
38
+
39
+ return {
40
+ node,
41
+ refresh,
42
+ dispose() { if (timer) clearInterval(timer); },
43
+ };
44
+ }
@@ -1,59 +1,59 @@
1
- import * as webjsx from '../../../../vendor/webjsx/index.js';
2
- const h = webjsx.createElement;
3
-
4
- export function pre(obj) {
5
- return h('pre', { class: 'fd-pre' }, typeof obj === 'string' ? obj : JSON.stringify(obj, null, 2));
6
- }
7
-
8
- export function form(opts) {
9
- const { fields = [], submit = 'submit', onSubmit } = opts;
10
- return h('form', { class: 'row-form', onsubmit: (ev) => { ev.preventDefault(); onSubmit && onSubmit(ev); } },
11
- ...fields.map(f => f.kind === 'textarea'
12
- ? h('textarea', { name: f.name, placeholder: f.placeholder || '', rows: f.rows || 4 })
13
- : h('input', { name: f.name, type: f.type || 'text', placeholder: f.placeholder || '', value: f.value || '', required: f.required ? 'true' : null })),
14
- h('button', { type: 'submit', class: 'btn-primary' }, submit));
15
- }
16
-
17
- export function getRecentPaths() {
18
- try { return JSON.parse(localStorage.getItem('fd_recent_cwds') || '[]'); } catch { return []; }
19
- }
20
-
21
- export function saveRecentPath(p) {
22
- if (!p) return;
23
- try {
24
- const prev = getRecentPaths().filter(x => x !== p);
25
- localStorage.setItem('fd_recent_cwds', JSON.stringify([p, ...prev].slice(0, 5)));
26
- } catch {}
27
- }
28
-
29
- export function skillLabel(s) {
30
- if (s.shortName) return s.shortName;
31
- const n = s.name || '';
32
- return n.replace(/^gm:/, '').replace(/^software-development$/, 'software dev').replace(/-/g, ' ');
33
- }
34
-
35
- export function renderChatMessages(container, messages) {
36
- if (!container) return;
37
- container.innerHTML = '';
38
- for (const m of messages) {
39
- if (m.role === 'tool') {
40
- const det = document.createElement('details');
41
- det.className = 'fd-chatlog-tool';
42
- const sum = document.createElement('summary');
43
- sum.className = 'fd-chatlog-tool-sum';
44
- sum.textContent = '⚒ ' + m.name + (m.argsSummary ? ' ' + m.argsSummary : '');
45
- det.appendChild(sum);
46
- const body = document.createElement('pre');
47
- body.className = 'fd-chatlog-tool-body';
48
- body.textContent = m.content || '';
49
- det.appendChild(body);
50
- container.appendChild(det);
51
- } else {
52
- const el = document.createElement('div');
53
- el.className = 'fd-chatlog-msg fd-chatlog-' + (m.role === 'assistant' ? 'assistant' : 'user');
54
- el.textContent = (m.role === 'assistant' ? '◈ ' : '▷ ') + (m.content || '');
55
- container.appendChild(el);
56
- }
57
- }
58
- container.scrollTop = container.scrollHeight;
59
- }
1
+ import * as webjsx from '../../../../vendor/webjsx/index.js';
2
+ const h = webjsx.createElement;
3
+
4
+ export function pre(obj) {
5
+ return h('pre', { class: 'fd-pre' }, typeof obj === 'string' ? obj : JSON.stringify(obj, null, 2));
6
+ }
7
+
8
+ export function form(opts) {
9
+ const { fields = [], submit = 'submit', onSubmit } = opts;
10
+ return h('form', { class: 'row-form', onsubmit: (ev) => { ev.preventDefault(); onSubmit && onSubmit(ev); } },
11
+ ...fields.map(f => f.kind === 'textarea'
12
+ ? h('textarea', { name: f.name, placeholder: f.placeholder || '', rows: f.rows || 4 })
13
+ : h('input', { name: f.name, type: f.type || 'text', placeholder: f.placeholder || '', value: f.value || '', required: f.required ? 'true' : null })),
14
+ h('button', { type: 'submit', class: 'btn-primary' }, submit));
15
+ }
16
+
17
+ export function getRecentPaths() {
18
+ try { return JSON.parse(localStorage.getItem('fd_recent_cwds') || '[]'); } catch { return []; }
19
+ }
20
+
21
+ export function saveRecentPath(p) {
22
+ if (!p) return;
23
+ try {
24
+ const prev = getRecentPaths().filter(x => x !== p);
25
+ localStorage.setItem('fd_recent_cwds', JSON.stringify([p, ...prev].slice(0, 5)));
26
+ } catch {}
27
+ }
28
+
29
+ export function skillLabel(s) {
30
+ if (s.shortName) return s.shortName;
31
+ const n = s.name || '';
32
+ return n.replace(/^gm:/, '').replace(/^software-development$/, 'software dev').replace(/-/g, ' ');
33
+ }
34
+
35
+ export function renderChatMessages(container, messages) {
36
+ if (!container) return;
37
+ container.innerHTML = '';
38
+ for (const m of messages) {
39
+ if (m.role === 'tool') {
40
+ const det = document.createElement('details');
41
+ det.className = 'fd-chatlog-tool';
42
+ const sum = document.createElement('summary');
43
+ sum.className = 'fd-chatlog-tool-sum';
44
+ sum.textContent = '⚒ ' + m.name + (m.argsSummary ? ' ' + m.argsSummary : '');
45
+ det.appendChild(sum);
46
+ const body = document.createElement('pre');
47
+ body.className = 'fd-chatlog-tool-body';
48
+ body.textContent = m.content || '';
49
+ det.appendChild(body);
50
+ container.appendChild(det);
51
+ } else {
52
+ const el = document.createElement('div');
53
+ el.className = 'fd-chatlog-msg fd-chatlog-' + (m.role === 'assistant' ? 'assistant' : 'user');
54
+ el.textContent = (m.role === 'assistant' ? '◈ ' : '▷ ') + (m.content || '');
55
+ container.appendChild(el);
56
+ }
57
+ }
58
+ container.scrollTop = container.scrollHeight;
59
+ }