@oddkin/workbench 0.0.0-stage → 1.0.0-beta.0

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -2
  3. package/dist/app/copy.d.ts +43 -0
  4. package/dist/app/copy.d.ts.map +1 -0
  5. package/dist/app/copy.js +47 -0
  6. package/dist/app/copy.js.map +1 -0
  7. package/dist/app/define.d.ts +3 -0
  8. package/dist/app/define.d.ts.map +1 -0
  9. package/dist/app/define.js +10 -0
  10. package/dist/app/define.js.map +1 -0
  11. package/dist/app/details.d.ts +22 -0
  12. package/dist/app/details.d.ts.map +1 -0
  13. package/dist/app/details.js +16 -0
  14. package/dist/app/details.js.map +1 -0
  15. package/dist/app/index.d.ts +12 -0
  16. package/dist/app/index.d.ts.map +1 -0
  17. package/dist/app/index.js +9 -0
  18. package/dist/app/index.js.map +1 -0
  19. package/dist/app/routes.d.ts +26 -0
  20. package/dist/app/routes.d.ts.map +1 -0
  21. package/dist/app/routes.js +94 -0
  22. package/dist/app/routes.js.map +1 -0
  23. package/dist/app/search.d.ts +17 -0
  24. package/dist/app/search.d.ts.map +1 -0
  25. package/dist/app/search.js +52 -0
  26. package/dist/app/search.js.map +1 -0
  27. package/dist/app/shell.d.ts +29 -0
  28. package/dist/app/shell.d.ts.map +1 -0
  29. package/dist/app/shell.js +435 -0
  30. package/dist/app/shell.js.map +1 -0
  31. package/dist/app/styles.d.ts +2 -0
  32. package/dist/app/styles.d.ts.map +1 -0
  33. package/dist/app/styles.js +373 -0
  34. package/dist/app/styles.js.map +1 -0
  35. package/dist/app/theme-studio.d.ts +12 -0
  36. package/dist/app/theme-studio.d.ts.map +1 -0
  37. package/dist/app/theme-studio.js +14 -0
  38. package/dist/app/theme-studio.js.map +1 -0
  39. package/dist/app/views.d.ts +34 -0
  40. package/dist/app/views.d.ts.map +1 -0
  41. package/dist/app/views.js +230 -0
  42. package/dist/app/views.js.map +1 -0
  43. package/dist/config/index.d.ts +170 -0
  44. package/dist/config/index.d.ts.map +1 -0
  45. package/dist/config/index.js +148 -0
  46. package/dist/config/index.js.map +1 -0
  47. package/dist/conformance/button.d.ts +2 -0
  48. package/dist/conformance/button.d.ts.map +1 -0
  49. package/dist/conformance/button.js +233 -0
  50. package/dist/conformance/button.js.map +1 -0
  51. package/dist/conformance/index.d.ts +107 -0
  52. package/dist/conformance/index.d.ts.map +1 -0
  53. package/dist/conformance/index.js +60 -0
  54. package/dist/conformance/index.js.map +1 -0
  55. package/dist/data/build.d.ts +36 -0
  56. package/dist/data/build.d.ts.map +1 -0
  57. package/dist/data/build.js +248 -0
  58. package/dist/data/build.js.map +1 -0
  59. package/dist/data/import-map.d.ts +53 -0
  60. package/dist/data/import-map.d.ts.map +1 -0
  61. package/dist/data/import-map.js +160 -0
  62. package/dist/data/import-map.js.map +1 -0
  63. package/dist/data/index.d.ts +14 -0
  64. package/dist/data/index.d.ts.map +1 -0
  65. package/dist/data/index.js +10 -0
  66. package/dist/data/index.js.map +1 -0
  67. package/dist/data/theme-studio.d.ts +21 -0
  68. package/dist/data/theme-studio.d.ts.map +1 -0
  69. package/dist/data/theme-studio.js +116 -0
  70. package/dist/data/theme-studio.js.map +1 -0
  71. package/dist/data/types.d.ts +169 -0
  72. package/dist/data/types.d.ts.map +1 -0
  73. package/dist/data/types.js +4 -0
  74. package/dist/data/types.js.map +1 -0
  75. package/dist/examples/index.d.ts +101 -0
  76. package/dist/examples/index.d.ts.map +1 -0
  77. package/dist/examples/index.js +106 -0
  78. package/dist/examples/index.js.map +1 -0
  79. package/dist/frame/index.d.ts +9 -0
  80. package/dist/frame/index.d.ts.map +1 -0
  81. package/dist/frame/index.js +468 -0
  82. package/dist/frame/index.js.map +1 -0
  83. package/dist/internal/diagnostics.d.ts +17 -0
  84. package/dist/internal/diagnostics.d.ts.map +1 -0
  85. package/dist/internal/diagnostics.js +19 -0
  86. package/dist/internal/diagnostics.js.map +1 -0
  87. package/dist/node/bin.d.ts +3 -0
  88. package/dist/node/bin.d.ts.map +1 -0
  89. package/dist/node/bin.js +12 -0
  90. package/dist/node/bin.js.map +1 -0
  91. package/dist/node/cli.d.ts +17 -0
  92. package/dist/node/cli.d.ts.map +1 -0
  93. package/dist/node/cli.js +198 -0
  94. package/dist/node/cli.js.map +1 -0
  95. package/dist/node/config.d.ts +28 -0
  96. package/dist/node/config.d.ts.map +1 -0
  97. package/dist/node/config.js +80 -0
  98. package/dist/node/config.js.map +1 -0
  99. package/dist/node/generated.d.ts +19 -0
  100. package/dist/node/generated.d.ts.map +1 -0
  101. package/dist/node/generated.js +109 -0
  102. package/dist/node/generated.js.map +1 -0
  103. package/dist/node/html.d.ts +35 -0
  104. package/dist/node/html.d.ts.map +1 -0
  105. package/dist/node/html.js +51 -0
  106. package/dist/node/html.js.map +1 -0
  107. package/dist/node/index.d.ts +24 -0
  108. package/dist/node/index.d.ts.map +1 -0
  109. package/dist/node/index.js +15 -0
  110. package/dist/node/index.js.map +1 -0
  111. package/dist/node/inputs.d.ts +24 -0
  112. package/dist/node/inputs.d.ts.map +1 -0
  113. package/dist/node/inputs.js +259 -0
  114. package/dist/node/inputs.js.map +1 -0
  115. package/dist/node/packages.d.ts +35 -0
  116. package/dist/node/packages.d.ts.map +1 -0
  117. package/dist/node/packages.js +87 -0
  118. package/dist/node/packages.js.map +1 -0
  119. package/dist/node/preload.d.ts +10 -0
  120. package/dist/node/preload.d.ts.map +1 -0
  121. package/dist/node/preload.js +61 -0
  122. package/dist/node/preload.js.map +1 -0
  123. package/dist/node/server.d.ts +42 -0
  124. package/dist/node/server.d.ts.map +1 -0
  125. package/dist/node/server.js +369 -0
  126. package/dist/node/server.js.map +1 -0
  127. package/dist/node/static.d.ts +33 -0
  128. package/dist/node/static.d.ts.map +1 -0
  129. package/dist/node/static.js +141 -0
  130. package/dist/node/static.js.map +1 -0
  131. package/dist/node/workbench.d.ts +43 -0
  132. package/dist/node/workbench.d.ts.map +1 -0
  133. package/dist/node/workbench.js +183 -0
  134. package/dist/node/workbench.js.map +1 -0
  135. package/dist/pages/build.d.ts +22 -0
  136. package/dist/pages/build.d.ts.map +1 -0
  137. package/dist/pages/build.js +363 -0
  138. package/dist/pages/build.js.map +1 -0
  139. package/dist/pages/defaults.d.ts +16 -0
  140. package/dist/pages/defaults.d.ts.map +1 -0
  141. package/dist/pages/defaults.js +88 -0
  142. package/dist/pages/defaults.js.map +1 -0
  143. package/dist/pages/index.d.ts +14 -0
  144. package/dist/pages/index.d.ts.map +1 -0
  145. package/dist/pages/index.js +10 -0
  146. package/dist/pages/index.js.map +1 -0
  147. package/dist/pages/navigation.d.ts +48 -0
  148. package/dist/pages/navigation.d.ts.map +1 -0
  149. package/dist/pages/navigation.js +83 -0
  150. package/dist/pages/navigation.js.map +1 -0
  151. package/dist/pages/types.d.ts +143 -0
  152. package/dist/pages/types.d.ts.map +1 -0
  153. package/dist/pages/types.js +3 -0
  154. package/dist/pages/types.js.map +1 -0
  155. package/dist/panels/catalog-define.d.ts +3 -0
  156. package/dist/panels/catalog-define.d.ts.map +1 -0
  157. package/dist/panels/catalog-define.js +7 -0
  158. package/dist/panels/catalog-define.js.map +1 -0
  159. package/dist/panels/catalog.d.ts +33 -0
  160. package/dist/panels/catalog.d.ts.map +1 -0
  161. package/dist/panels/catalog.js +54 -0
  162. package/dist/panels/catalog.js.map +1 -0
  163. package/dist/panels/component-define.d.ts +3 -0
  164. package/dist/panels/component-define.d.ts.map +1 -0
  165. package/dist/panels/component-define.js +6 -0
  166. package/dist/panels/component-define.js.map +1 -0
  167. package/dist/panels/component-detail.d.ts +46 -0
  168. package/dist/panels/component-detail.d.ts.map +1 -0
  169. package/dist/panels/component-detail.js +1120 -0
  170. package/dist/panels/component-detail.js.map +1 -0
  171. package/dist/panels/component.d.ts +17 -0
  172. package/dist/panels/component.d.ts.map +1 -0
  173. package/dist/panels/component.js +10 -0
  174. package/dist/panels/component.js.map +1 -0
  175. package/dist/panels/foundation-define.d.ts +3 -0
  176. package/dist/panels/foundation-define.d.ts.map +1 -0
  177. package/dist/panels/foundation-define.js +6 -0
  178. package/dist/panels/foundation-define.js.map +1 -0
  179. package/dist/panels/foundation-detail.d.ts +23 -0
  180. package/dist/panels/foundation-detail.d.ts.map +1 -0
  181. package/dist/panels/foundation-detail.js +216 -0
  182. package/dist/panels/foundation-detail.js.map +1 -0
  183. package/dist/panels/foundation.d.ts +15 -0
  184. package/dist/panels/foundation.d.ts.map +1 -0
  185. package/dist/panels/foundation.js +9 -0
  186. package/dist/panels/foundation.js.map +1 -0
  187. package/dist/panels/model.d.ts +173 -0
  188. package/dist/panels/model.d.ts.map +1 -0
  189. package/dist/panels/model.js +462 -0
  190. package/dist/panels/model.js.map +1 -0
  191. package/dist/panels/styles.d.ts +3 -0
  192. package/dist/panels/styles.d.ts.map +1 -0
  193. package/dist/panels/styles.js +316 -0
  194. package/dist/panels/styles.js.map +1 -0
  195. package/dist/panels/theme-model.d.ts +49 -0
  196. package/dist/panels/theme-model.d.ts.map +1 -0
  197. package/dist/panels/theme-model.js +146 -0
  198. package/dist/panels/theme-model.js.map +1 -0
  199. package/dist/panels/theme-studio.d.ts +32 -0
  200. package/dist/panels/theme-studio.d.ts.map +1 -0
  201. package/dist/panels/theme-studio.js +312 -0
  202. package/dist/panels/theme-studio.js.map +1 -0
  203. package/dist/preview/frame.d.ts +44 -0
  204. package/dist/preview/frame.d.ts.map +1 -0
  205. package/dist/preview/frame.js +250 -0
  206. package/dist/preview/frame.js.map +1 -0
  207. package/dist/preview/index.d.ts +26 -0
  208. package/dist/preview/index.d.ts.map +1 -0
  209. package/dist/preview/index.js +58 -0
  210. package/dist/preview/index.js.map +1 -0
  211. package/dist/preview/theme-generation.d.ts +33 -0
  212. package/dist/preview/theme-generation.d.ts.map +1 -0
  213. package/dist/preview/theme-generation.js +48 -0
  214. package/dist/preview/theme-generation.js.map +1 -0
  215. package/dist/protocol/index.d.ts +207 -0
  216. package/dist/protocol/index.d.ts.map +1 -0
  217. package/dist/protocol/index.js +261 -0
  218. package/dist/protocol/index.js.map +1 -0
  219. package/dist/testing/index.d.ts +47 -0
  220. package/dist/testing/index.d.ts.map +1 -0
  221. package/dist/testing/index.js +145 -0
  222. package/dist/testing/index.js.map +1 -0
  223. package/package.json +118 -4
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Theme Studio content (workbench.md §6, workbench-pages.md §8): one draft of the library's theme
3
+ * configuration, edited through a form and a JSON editor; generated in a Worker by the library's
4
+ * own generator; applied to light and dark specimen frames as a preview-owned stylesheet, so the
5
+ * real components update in place (no remount). An invalid draft keeps the last valid theme and
6
+ * lists the generator's diagnostics with their configuration paths.
7
+ */
8
+ import { OddkinElement, prop } from '@oddkin/core/element';
9
+ import { styleMap } from '@oddkin/core/helpers/style-map';
10
+ import { signal, untracked } from '@oddkin/core/reactive';
11
+ import { createScope } from '@oddkin/core/scope';
12
+ import { html, nothing, repeat } from '@oddkin/core/template';
13
+ import { createIsolatedPreview } from '../preview/frame.js';
14
+ import { createThemeGeneration, } from '../preview/theme-generation.js';
15
+ import { contentStyles, panelHostStyles } from './styles.js';
16
+ import { fieldValue, parseDraft, pathText, setPath, themeFields, } from './theme-model.js';
17
+ const MODES = ['light', 'dark'];
18
+ export class ThemeStudioElement extends OddkinElement.with({
19
+ page: prop.object({ description: 'The Theme Studio page data.' }),
20
+ frameUrl: prop.string({
21
+ default: '',
22
+ description: 'Same-origin URL of the generated preview frame document.',
23
+ }),
24
+ }) {
25
+ static styles = [panelHostStyles, contentStyles];
26
+ #draft = signal(undefined);
27
+ #json = signal('');
28
+ #jsonError = signal('');
29
+ #result = signal(undefined);
30
+ #status = signal({
31
+ text: '',
32
+ alert: false,
33
+ });
34
+ #hosts;
35
+ #previews = [];
36
+ #generation;
37
+ #studioScope;
38
+ #css;
39
+ #key;
40
+ constructor() {
41
+ super();
42
+ this.#hosts = [document.createElement('div'), document.createElement('div')];
43
+ }
44
+ /** The current draft (for tests and embedding); read-only snapshot. */
45
+ get draft() {
46
+ return this.#draft.peek();
47
+ }
48
+ /** Light and dark specimen frames, in that order. */
49
+ get previews() {
50
+ return this.#previews;
51
+ }
52
+ /** Generation counters: requests sent, superseded, and results applied. */
53
+ get generation() {
54
+ return this.#generation?.stats;
55
+ }
56
+ connected(scope) {
57
+ scope.effect(() => {
58
+ const page = this.page;
59
+ const frameUrl = this.frameUrl;
60
+ untracked(() => {
61
+ if (page === this.#key)
62
+ return;
63
+ this.#key = page;
64
+ this.#start(page, frameUrl);
65
+ });
66
+ });
67
+ scope.add(() => {
68
+ this.#key = undefined;
69
+ this.#stop();
70
+ });
71
+ }
72
+ #stop() {
73
+ this.#studioScope?.dispose();
74
+ this.#studioScope = undefined;
75
+ this.#previews = [];
76
+ this.#generation = undefined;
77
+ this.#css = undefined;
78
+ for (const host of this.#hosts)
79
+ host.replaceChildren();
80
+ }
81
+ #start(page, frameUrl) {
82
+ this.#stop();
83
+ const studio = page?.studio;
84
+ this.#draft.value = studio?.config;
85
+ this.#json.value = studio?.config ? JSON.stringify(studio.config, null, 2) : '';
86
+ this.#jsonError.value = '';
87
+ this.#result.value = undefined;
88
+ this.#status.value = { text: '', alert: false };
89
+ if (!page || !studio?.config || !studio.worker)
90
+ return;
91
+ const scope = createScope({ name: 'workbench-theme-studio' });
92
+ this.#studioScope = scope;
93
+ this.#generation = createThemeGeneration(studio.worker, scope, (result) => this.#apply(result), (message) => {
94
+ this.#status.value = { text: `Generation unavailable: ${message}`, alert: true };
95
+ });
96
+ if (frameUrl && studio.roles.length)
97
+ this.#specimens(scope, page, frameUrl);
98
+ this.#generation.request(studio.config);
99
+ }
100
+ #specimens(scope, page, frameUrl) {
101
+ const items = page.studio.roles.map((role) => ({
102
+ role: role.role,
103
+ label: role.label,
104
+ tag: role.tag,
105
+ registration: role.registration,
106
+ example: role.example,
107
+ properties: role.properties,
108
+ attributes: role.attributes,
109
+ slots: role.slots,
110
+ }));
111
+ MODES.forEach((mode, i) => {
112
+ const preview = createIsolatedPreview({
113
+ document: this.ownerDocument,
114
+ container: this.#hosts[i],
115
+ frameUrl,
116
+ title: `Theme specimen (${mode})`,
117
+ });
118
+ preview.iframe.style.blockSize = '40rem';
119
+ scope.add(() => preview.dispose(), 'specimen frame');
120
+ this.#previews.push(preview);
121
+ void preview.ready
122
+ .then(() => preview.request('specimen', { items, settings: { mode } }))
123
+ .then(() => (this.#css === undefined ? undefined : this.#theme(preview, this.#css)))
124
+ .catch((error) => {
125
+ if (!scope.disposed)
126
+ this.#status.value = {
127
+ text: `Specimen unavailable: ${error instanceof Error ? error.message : String(error)}`,
128
+ alert: true,
129
+ };
130
+ });
131
+ });
132
+ }
133
+ #theme(preview, css) {
134
+ return preview.request('theme', { cssText: css });
135
+ }
136
+ /** A valid result replaces the specimens' theme sheet; an invalid one keeps the last valid. */
137
+ #apply(result) {
138
+ this.#result.value = result;
139
+ if (!result.ok || result.css === undefined)
140
+ return;
141
+ this.#css = result.css;
142
+ for (const preview of this.#previews)
143
+ void this.#theme(preview, result.css).catch(() => {
144
+ // Not connected yet: the sheet is applied once its specimen has mounted.
145
+ });
146
+ }
147
+ #setDraft(draft, fromJson = false) {
148
+ this.#draft.value = draft;
149
+ if (!fromJson) {
150
+ this.#json.value = JSON.stringify(draft, null, 2);
151
+ this.#jsonError.value = '';
152
+ }
153
+ this.#generation?.request(draft);
154
+ }
155
+ #field(field) {
156
+ const id = `ts-${field.path.join('-')}`;
157
+ const swatch = field.kind === 'color' &&
158
+ typeof field.value === 'string' &&
159
+ globalThis.CSS?.supports('color', field.value)
160
+ ? html `<span
161
+ class="wb-swatch"
162
+ aria-hidden="true"
163
+ style=${styleMap({ background: field.value })}
164
+ ></span>`
165
+ : nothing;
166
+ return html `<div class="wb-field">
167
+ <label for=${id}>${field.label}</label>
168
+ <span class="wb-cell-controls"
169
+ >${swatch}<input
170
+ id=${id}
171
+ type=${field.kind === 'number' || field.kind === 'integer' ? 'number' : 'text'}
172
+ step=${field.kind === 'integer' ? '1' : 'any'}
173
+ .value=${field.value === undefined ? '' : String(field.value)}
174
+ placeholder="Not set (generated)"
175
+ data-path=${pathText(field.path)}
176
+ aria-describedby=${`${id}-origin`}
177
+ @change=${(event) => this.#setDraft(setPath(this.#draft.peek(), field.path, fieldValue(field, event.target.value)))}
178
+ /></span>
179
+ <span id=${`${id}-origin`} class="wb-muted">${field.origin}</span>
180
+ </div>`;
181
+ }
182
+ render() {
183
+ const studio = this.page?.studio;
184
+ if (!studio)
185
+ return html `<div class="wb-content"></div>`;
186
+ const draft = this.#draft.value;
187
+ const result = this.#result.value;
188
+ const status = this.#status.value;
189
+ const groups = draft === undefined ? [] : themeFields(draft);
190
+ const problems = result?.diagnostics ?? [];
191
+ return html `<div class="wb-content">
192
+ <section id="generate" aria-labelledby="generate-title">
193
+ <h2 id="generate-title">Generate</h2>
194
+ ${studio.source
195
+ ? html `<p class="wb-muted">
196
+ Draft of <code>${studio.source}</code>. Edits stay in this page until exported.
197
+ </p>`
198
+ : nothing}
199
+ ${repeat(groups, (group) => group.id, (group) => html `<fieldset class="wb-group" data-group=${group.id}>
200
+ <legend>${group.title}</legend>
201
+ ${group.note ? html `<p class="wb-muted">${group.note}</p>` : nothing}
202
+ ${repeat(group.fields, (field) => pathText(field.path), (field) => this.#field(field))}
203
+ ${group.rows?.length
204
+ ? html `<div class="wb-table-wrap">
205
+ <table>
206
+ <caption class="wb-visually-hidden">
207
+ ${group.title}, one column per mode
208
+ </caption>
209
+ <thead>
210
+ <tr>
211
+ <th scope="col">Token</th>
212
+ ${(group.modes ?? []).map((mode) => html `<th scope="col">${mode}</th>`)}
213
+ </tr>
214
+ </thead>
215
+ <tbody>
216
+ ${repeat(group.rows, (row) => row.token, (row) => html `<tr>
217
+ <th scope="row"><code>${row.token}</code></th>
218
+ ${row.cells.map((cell) => html `<td>
219
+ <input
220
+ aria-label=${cell.label}
221
+ .value=${cell.value === undefined ? '' : String(cell.value)}
222
+ data-path=${pathText(cell.path)}
223
+ @change=${(event) => this.#setDraft(setPath(this.#draft.peek(), cell.path, fieldValue(cell, event.target.value)))}
224
+ />
225
+ </td>`)}
226
+ </tr>`)}
227
+ </tbody>
228
+ </table>
229
+ </div>`
230
+ : nothing}
231
+ </fieldset>`)}
232
+ ${draft === undefined
233
+ ? nothing
234
+ : html `<div class="wb-field wb-json">
235
+ <label for="ts-json">Configuration (JSON)</label>
236
+ <textarea
237
+ id="ts-json"
238
+ class="wb-code"
239
+ rows="16"
240
+ spellcheck="false"
241
+ aria-describedby="ts-json-error"
242
+ .value=${this.#json.value}
243
+ @input=${(event) => {
244
+ const text = event.target.value;
245
+ this.#json.value = text;
246
+ const parsed = parseDraft(text);
247
+ this.#jsonError.value = parsed.ok ? '' : (parsed.message ?? '');
248
+ if (parsed.ok)
249
+ this.#setDraft(parsed.value, true);
250
+ }}
251
+ ></textarea>
252
+ <p id="ts-json-error" class="wb-error" ?hidden=${!this.#jsonError.value}>
253
+ ${this.#jsonError.value
254
+ ? `Not applied: ${this.#jsonError.value} The preview keeps the last valid draft.`
255
+ : ''}
256
+ </p>
257
+ </div>`}
258
+ </section>
259
+ <section id="live-preview" aria-labelledby="live-preview-title">
260
+ <h2 id="live-preview-title">Live preview</h2>
261
+ <p class="wb-status" role=${status.alert || (result && !result.ok) ? 'alert' : 'status'}>
262
+ ${status.text ||
263
+ (result
264
+ ? result.ok
265
+ ? `Generated in ${Math.round(result.ms)} ms.`
266
+ : 'This draft is invalid: the preview keeps the last valid theme.'
267
+ : '')}
268
+ </p>
269
+ ${problems.length
270
+ ? html `<ul class="wb-list" aria-label="Generator diagnostics">
271
+ ${problems.map((d) => html `<li data-severity=${d.severity ?? 'error'}>
272
+ <code>${d.path || '/'}</code> ${d.message ?? d.code ?? ''}
273
+ </li>`)}
274
+ </ul>`
275
+ : nothing}
276
+ <div class="wb-previews wb-pair">
277
+ ${MODES.map((mode, i) => html `<div class="wb-preview">
278
+ <p>${mode === 'light' ? 'Light' : 'Dark'}</p>
279
+ ${this.#hosts[i]}
280
+ </div>`)}
281
+ </div>
282
+ ${studio.roles.length
283
+ ? html `<p class="wb-muted">
284
+ Roles:
285
+ ${studio.roles.map((r) => `${r.label} (<${r.tag}>, ${r.source === 'config' ? 'configured' : 'claimed by its example'})`).join(' · ')}.
286
+ </p>`
287
+ : nothing}
288
+ </section>
289
+ <section id="method" aria-labelledby="method-title">
290
+ <h2 id="method-title">Method and limits</h2>
291
+ <p>
292
+ The draft is generated by the library's own theme generator in a Worker; the newest edit
293
+ wins and older results are discarded. Generated CSS replaces one stylesheet in each
294
+ specimen frame, so the components keep their state.
295
+ </p>
296
+ ${studio.missing.length
297
+ ? html `<ul class="wb-list" aria-label="Not available">
298
+ ${studio.missing.map((m) => html `<li class="wb-not-documented" data-missing=${m.item}>
299
+ ${m.item.startsWith('role:')
300
+ ? `No specimen for the ${m.item.slice(5)} role.`
301
+ : m.item === 'config'
302
+ ? 'No theme configuration to edit.'
303
+ : 'No theme generator.'}
304
+ Supplied by ${m.supply}.
305
+ </li>`)}
306
+ </ul>`
307
+ : nothing}
308
+ </section>
309
+ </div>`;
310
+ }
311
+ }
312
+ //# sourceMappingURL=theme-studio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-studio.js","sourceRoot":"","sources":["../../src/panels/theme-studio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type FrameIdentity, type FrameNotification, type FrameRequest, type FrameRequestPayload, type JsonValue } from '../protocol/index.js';
2
+ declare const protocolStats: {
3
+ liveFrames: number;
4
+ rejectedMessages: number;
5
+ staleMessages: number;
6
+ disposedMessages: number;
7
+ };
8
+ /** Counts protocol rejections and live host frames; resource ownership is also measured by `scopeStats()`. */
9
+ export declare function previewProtocolStats(): Readonly<typeof protocolStats>;
10
+ export interface IsolatedPreviewOptions {
11
+ readonly document: Document;
12
+ readonly container: Element;
13
+ /** Same-origin URL of the generated frame document. */
14
+ readonly frameUrl: string;
15
+ readonly title: string;
16
+ readonly generation?: number;
17
+ /** How long the handshake and each request may wait for the frame (default 10 000 ms). */
18
+ readonly timeoutMs?: number;
19
+ /**
20
+ * How long a `mount` or `specimen` request may wait (default 60 000 ms). Both import component
21
+ * module graphs, which a cold, unbundled load can take seconds to fetch; a failed import is
22
+ * reported by the frame, so this only bounds a fetch that never settles.
23
+ */
24
+ readonly mountTimeoutMs?: number;
25
+ readonly onMessage?: (message: FrameNotification) => void;
26
+ }
27
+ export interface IsolatedPreview {
28
+ readonly iframe: HTMLIFrameElement;
29
+ readonly identity: FrameIdentity;
30
+ readonly ready: Promise<void>;
31
+ request(kind: FrameRequest['kind'], payload?: FrameRequestPayload): Promise<JsonValue | undefined>;
32
+ setViewport(width: number, height: number): void;
33
+ /** Replace the frame document and advance its generation. */
34
+ reload(): Promise<void>;
35
+ dispose(): void;
36
+ }
37
+ export declare class PreviewFrameError extends Error {
38
+ readonly code: string;
39
+ constructor(code: string, message: string);
40
+ }
41
+ /** Create one same-origin, independently registered preview frame. */
42
+ export declare function createIsolatedPreview(options: IsolatedPreviewOptions): IsolatedPreview;
43
+ export {};
44
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/preview/frame.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAE9B,QAAA,MAAM,aAAa;IAAK,UAAU;IAAK,gBAAgB;IAAK,aAAa;IAAK,gBAAgB;CAAK,CAAC;AAOpG,8GAA8G;AAC9G,wBAAgB,oBAAoB,IAAI,QAAQ,CAAC,OAAO,aAAa,CAAC,CAErE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CACL,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAClC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,6DAA6D;IAC7D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,QAAQ,CAAC,IAAI,EAAE,MAAM;IADvB,YACW,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAuQtF"}
@@ -0,0 +1,250 @@
1
+ import { createScope } from '@oddkin/core/scope';
2
+ import { FRAME_PROTOCOL_VERSION, frameEnvelope, isCompatibleFrameMessage, isFrameMessage, isFrameReply, isFrameRequest, } from '../protocol/index.js';
3
+ const protocolStats = { liveFrames: 0, rejectedMessages: 0, staleMessages: 0, disposedMessages: 0 };
4
+ let nextFrameId = 0;
5
+ const isObjectPayload = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ /** Counts protocol rejections and live host frames; resource ownership is also measured by `scopeStats()`. */
7
+ export function previewProtocolStats() {
8
+ return { ...protocolStats };
9
+ }
10
+ export class PreviewFrameError extends Error {
11
+ code;
12
+ constructor(code, message) {
13
+ super(message);
14
+ this.code = code;
15
+ this.name = 'PreviewFrameError';
16
+ }
17
+ }
18
+ /** Create one same-origin, independently registered preview frame. */
19
+ export function createIsolatedPreview(options) {
20
+ const { document: doc, container } = options;
21
+ const win = doc.defaultView;
22
+ if (!win)
23
+ throw new Error('A preview frame needs a live owner document.');
24
+ const frameUrl = new URL(options.frameUrl, doc.baseURI);
25
+ if (frameUrl.origin !== win.location.origin)
26
+ throw new TypeError('Preview frames must use the Workbench origin.');
27
+ const frame = `preview-${++nextFrameId}`;
28
+ let generation = options.generation ?? 1;
29
+ if (!Number.isSafeInteger(generation) || generation < 1)
30
+ throw new TypeError('Preview generation must be a positive integer.');
31
+ const scope = createScope({
32
+ name: `preview-host:${frame}:${generation}`,
33
+ });
34
+ const iframe = doc.createElement('iframe');
35
+ iframe.title = options.title;
36
+ iframe.style.cssText = 'display:block;inline-size:100%;block-size:24rem;border:0;';
37
+ container.append(iframe);
38
+ protocolStats.liveFrames++;
39
+ scope.add(() => {
40
+ protocolStats.liveFrames--;
41
+ iframe.remove();
42
+ }, 'preview frame');
43
+ let port;
44
+ let generationScope;
45
+ let nextRequestId = 0;
46
+ let connected = false;
47
+ let ready;
48
+ let finishReady = () => { };
49
+ let cancelHandshake = () => { };
50
+ const pending = new Map();
51
+ const expectedOrigin = frameUrl.origin;
52
+ const identity = () => ({ frame, generation });
53
+ const rejectPending = (error) => {
54
+ for (const request of pending.values())
55
+ request.reject(error);
56
+ pending.clear();
57
+ };
58
+ scope.add(() => {
59
+ const error = new PreviewFrameError('frame.disposed', 'The preview frame was disposed.');
60
+ finishReady(error);
61
+ rejectPending(error);
62
+ generationScope?.dispose(error);
63
+ }, 'pending frame requests');
64
+ const fail = (error) => {
65
+ finishReady(error);
66
+ scope.dispose(error);
67
+ };
68
+ const startGeneration = () => {
69
+ const current = identity();
70
+ const currentScope = scope.child({
71
+ name: `preview-host:${current.frame}:${current.generation}`,
72
+ });
73
+ generationScope = currentScope;
74
+ connected = false;
75
+ ready = new Promise((resolve, reject) => {
76
+ let settled = false;
77
+ finishReady = (error) => {
78
+ if (settled)
79
+ return;
80
+ settled = true;
81
+ if (error)
82
+ reject(error);
83
+ else
84
+ resolve();
85
+ };
86
+ });
87
+ const url = new URL(frameUrl);
88
+ url.searchParams.set('frame', current.frame);
89
+ url.searchParams.set('generation', String(current.generation));
90
+ cancelHandshake = currentScope.timeout(() => fail(new PreviewFrameError('frame.handshake.timeout', `Frame did not connect within ${timeoutMs} ms.`)), timeoutMs);
91
+ currentScope.add(() => cancelHandshake(), 'handshake timeout');
92
+ iframe.src = url.href;
93
+ };
94
+ scope.listen(win, 'message', (event) => {
95
+ const currentScope = generationScope;
96
+ const currentIdentity = identity();
97
+ if (scope.disposed || !currentScope || currentScope.disposed) {
98
+ protocolStats.disposedMessages++;
99
+ return;
100
+ }
101
+ if (event.source !== iframe.contentWindow || event.origin !== expectedOrigin) {
102
+ protocolStats.rejectedMessages++;
103
+ return;
104
+ }
105
+ const message = event.data;
106
+ if (!isFrameMessage(message) || message.kind !== 'hello') {
107
+ protocolStats.rejectedMessages++;
108
+ return;
109
+ }
110
+ if (message.version !== FRAME_PROTOCOL_VERSION) {
111
+ fail(new PreviewFrameError('frame.version.incompatible', `Frame protocol ${message.version} is incompatible with host protocol ${FRAME_PROTOCOL_VERSION}.`));
112
+ return;
113
+ }
114
+ if (message.frame !== currentIdentity.frame ||
115
+ message.generation !== currentIdentity.generation) {
116
+ protocolStats.staleMessages++;
117
+ return;
118
+ }
119
+ if (connected) {
120
+ protocolStats.rejectedMessages++;
121
+ return;
122
+ }
123
+ const Channel = win.MessageChannel;
124
+ if (!Channel) {
125
+ fail(new PreviewFrameError('frame.channel.unavailable', 'MessageChannel is unavailable.'));
126
+ return;
127
+ }
128
+ const channel = new Channel();
129
+ port = channel.port1;
130
+ connected = true;
131
+ currentScope.add(() => channel.port1.close(), 'preview message port');
132
+ currentScope.listen(port, 'message', (portEvent) => {
133
+ if (scope.disposed || currentScope.disposed) {
134
+ protocolStats.disposedMessages++;
135
+ return;
136
+ }
137
+ const incoming = portEvent.data;
138
+ if (!isCompatibleFrameMessage(incoming) ||
139
+ incoming.frame !== currentIdentity.frame ||
140
+ incoming.generation !== currentIdentity.generation) {
141
+ protocolStats.staleMessages++;
142
+ return;
143
+ }
144
+ if (isFrameReply(incoming)) {
145
+ const request = pending.get(incoming.replyTo);
146
+ if (!request) {
147
+ protocolStats.rejectedMessages++;
148
+ return;
149
+ }
150
+ pending.delete(incoming.replyTo);
151
+ if (incoming.error)
152
+ request.reject(new PreviewFrameError(incoming.error.code, incoming.error.message));
153
+ else
154
+ request.resolve(incoming.payload);
155
+ }
156
+ else if (incoming.kind === 'event' ||
157
+ incoming.kind === 'error' ||
158
+ incoming.kind === 'state' ||
159
+ incoming.kind === 'size') {
160
+ if (incoming.kind === 'state' &&
161
+ isObjectPayload(incoming.payload) &&
162
+ incoming.payload['connected'] === true) {
163
+ finishReady();
164
+ cancelHandshake();
165
+ }
166
+ options.onMessage?.(incoming);
167
+ }
168
+ else
169
+ protocolStats.rejectedMessages++;
170
+ });
171
+ port.start();
172
+ const connect = frameEnvelope(currentIdentity, 'connect');
173
+ iframe.contentWindow?.postMessage(connect, expectedOrigin, [channel.port2]);
174
+ });
175
+ const timeoutMs = options.timeoutMs ?? 10_000;
176
+ const mountTimeoutMs = options.mountTimeoutMs ?? 60_000;
177
+ startGeneration();
178
+ return {
179
+ iframe,
180
+ get identity() {
181
+ return identity();
182
+ },
183
+ get ready() {
184
+ return ready;
185
+ },
186
+ async request(kind, payload) {
187
+ const requestIdentity = identity();
188
+ const requestReady = ready;
189
+ await requestReady;
190
+ if (identity().generation !== requestIdentity.generation)
191
+ throw new PreviewFrameError('frame.generation.superseded', 'The preview frame was replaced.');
192
+ if (scope.disposed || !port)
193
+ throw new PreviewFrameError('frame.disposed', 'The preview frame is not connected.');
194
+ const id = ++nextRequestId;
195
+ const limit = kind === 'mount' || kind === 'specimen' ? mountTimeoutMs : timeoutMs;
196
+ return new Promise((resolve, reject) => {
197
+ const releaseTimer = scope.timeout(() => {
198
+ pending.delete(id);
199
+ reject(new PreviewFrameError('frame.request.timeout', `Frame request ${id} timed out.`));
200
+ }, limit);
201
+ pending.set(id, {
202
+ resolve: (value) => {
203
+ releaseTimer();
204
+ resolve(value);
205
+ },
206
+ reject: (error) => {
207
+ releaseTimer();
208
+ reject(error);
209
+ },
210
+ });
211
+ const request = {
212
+ ...frameEnvelope(requestIdentity, kind),
213
+ id,
214
+ ...(payload === undefined ? {} : { payload }),
215
+ };
216
+ if (!isFrameRequest(request)) {
217
+ pending.delete(id);
218
+ releaseTimer();
219
+ reject(new TypeError(`Invalid ${kind} frame request payload.`));
220
+ return;
221
+ }
222
+ port?.postMessage(request);
223
+ });
224
+ },
225
+ setViewport(width, height) {
226
+ if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0)
227
+ throw new RangeError('Preview viewport dimensions must be positive finite numbers.');
228
+ iframe.style.inlineSize = `${width}px`;
229
+ iframe.style.blockSize = `${height}px`;
230
+ iframe.width = String(Math.round(width));
231
+ iframe.height = String(Math.round(height));
232
+ },
233
+ reload() {
234
+ if (scope.disposed)
235
+ return Promise.reject(new PreviewFrameError('frame.disposed', 'The preview frame is not connected.'));
236
+ const error = new PreviewFrameError('frame.generation.superseded', 'The preview frame was replaced by a new generation.');
237
+ finishReady(error);
238
+ rejectPending(error);
239
+ generationScope?.dispose(error);
240
+ port = undefined;
241
+ generation++;
242
+ startGeneration();
243
+ return ready;
244
+ },
245
+ dispose() {
246
+ scope.dispose();
247
+ },
248
+ };
249
+ }
250
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/preview/frame.ts"],"names":[],"mappings":"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"}