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

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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -2
  3. package/dist/app/card-previews.d.ts +14 -0
  4. package/dist/app/card-previews.d.ts.map +1 -0
  5. package/dist/app/card-previews.js +140 -0
  6. package/dist/app/card-previews.js.map +1 -0
  7. package/dist/app/copy.d.ts +48 -0
  8. package/dist/app/copy.d.ts.map +1 -0
  9. package/dist/app/copy.js +52 -0
  10. package/dist/app/copy.js.map +1 -0
  11. package/dist/app/define.d.ts +3 -0
  12. package/dist/app/define.d.ts.map +1 -0
  13. package/dist/app/define.js +10 -0
  14. package/dist/app/define.js.map +1 -0
  15. package/dist/app/details.d.ts +22 -0
  16. package/dist/app/details.d.ts.map +1 -0
  17. package/dist/app/details.js +17 -0
  18. package/dist/app/details.js.map +1 -0
  19. package/dist/app/index.d.ts +12 -0
  20. package/dist/app/index.d.ts.map +1 -0
  21. package/dist/app/index.js +9 -0
  22. package/dist/app/index.js.map +1 -0
  23. package/dist/app/routes.d.ts +26 -0
  24. package/dist/app/routes.d.ts.map +1 -0
  25. package/dist/app/routes.js +96 -0
  26. package/dist/app/routes.js.map +1 -0
  27. package/dist/app/search.d.ts +17 -0
  28. package/dist/app/search.d.ts.map +1 -0
  29. package/dist/app/search.js +52 -0
  30. package/dist/app/search.js.map +1 -0
  31. package/dist/app/shell.d.ts +29 -0
  32. package/dist/app/shell.d.ts.map +1 -0
  33. package/dist/app/shell.js +478 -0
  34. package/dist/app/shell.js.map +1 -0
  35. package/dist/app/styles.d.ts +2 -0
  36. package/dist/app/styles.d.ts.map +1 -0
  37. package/dist/app/styles.js +356 -0
  38. package/dist/app/styles.js.map +1 -0
  39. package/dist/app/theme-studio.d.ts +12 -0
  40. package/dist/app/theme-studio.d.ts.map +1 -0
  41. package/dist/app/theme-studio.js +14 -0
  42. package/dist/app/theme-studio.js.map +1 -0
  43. package/dist/app/views.d.ts +38 -0
  44. package/dist/app/views.d.ts.map +1 -0
  45. package/dist/app/views.js +252 -0
  46. package/dist/app/views.js.map +1 -0
  47. package/dist/config/index.d.ts +170 -0
  48. package/dist/config/index.d.ts.map +1 -0
  49. package/dist/config/index.js +148 -0
  50. package/dist/config/index.js.map +1 -0
  51. package/dist/conformance/button.d.ts +2 -0
  52. package/dist/conformance/button.d.ts.map +1 -0
  53. package/dist/conformance/button.js +233 -0
  54. package/dist/conformance/button.js.map +1 -0
  55. package/dist/conformance/index.d.ts +107 -0
  56. package/dist/conformance/index.d.ts.map +1 -0
  57. package/dist/conformance/index.js +60 -0
  58. package/dist/conformance/index.js.map +1 -0
  59. package/dist/data/build.d.ts +36 -0
  60. package/dist/data/build.d.ts.map +1 -0
  61. package/dist/data/build.js +260 -0
  62. package/dist/data/build.js.map +1 -0
  63. package/dist/data/import-map.d.ts +59 -0
  64. package/dist/data/import-map.d.ts.map +1 -0
  65. package/dist/data/import-map.js +195 -0
  66. package/dist/data/import-map.js.map +1 -0
  67. package/dist/data/index.d.ts +14 -0
  68. package/dist/data/index.d.ts.map +1 -0
  69. package/dist/data/index.js +10 -0
  70. package/dist/data/index.js.map +1 -0
  71. package/dist/data/theme-studio.d.ts +21 -0
  72. package/dist/data/theme-studio.d.ts.map +1 -0
  73. package/dist/data/theme-studio.js +112 -0
  74. package/dist/data/theme-studio.js.map +1 -0
  75. package/dist/data/types.d.ts +187 -0
  76. package/dist/data/types.d.ts.map +1 -0
  77. package/dist/data/types.js +4 -0
  78. package/dist/data/types.js.map +1 -0
  79. package/dist/examples/index.d.ts +101 -0
  80. package/dist/examples/index.d.ts.map +1 -0
  81. package/dist/examples/index.js +106 -0
  82. package/dist/examples/index.js.map +1 -0
  83. package/dist/frame/index.d.ts +9 -0
  84. package/dist/frame/index.d.ts.map +1 -0
  85. package/dist/frame/index.js +482 -0
  86. package/dist/frame/index.js.map +1 -0
  87. package/dist/internal/diagnostics.d.ts +17 -0
  88. package/dist/internal/diagnostics.d.ts.map +1 -0
  89. package/dist/internal/diagnostics.js +19 -0
  90. package/dist/internal/diagnostics.js.map +1 -0
  91. package/dist/node/bin.d.ts +3 -0
  92. package/dist/node/bin.d.ts.map +1 -0
  93. package/dist/node/bin.js +12 -0
  94. package/dist/node/bin.js.map +1 -0
  95. package/dist/node/cli.d.ts +17 -0
  96. package/dist/node/cli.d.ts.map +1 -0
  97. package/dist/node/cli.js +198 -0
  98. package/dist/node/cli.js.map +1 -0
  99. package/dist/node/config.d.ts +28 -0
  100. package/dist/node/config.d.ts.map +1 -0
  101. package/dist/node/config.js +80 -0
  102. package/dist/node/config.js.map +1 -0
  103. package/dist/node/example-modules.d.ts +8 -0
  104. package/dist/node/example-modules.d.ts.map +1 -0
  105. package/dist/node/example-modules.js +28 -0
  106. package/dist/node/example-modules.js.map +1 -0
  107. package/dist/node/generated.d.ts +19 -0
  108. package/dist/node/generated.d.ts.map +1 -0
  109. package/dist/node/generated.js +109 -0
  110. package/dist/node/generated.js.map +1 -0
  111. package/dist/node/html.d.ts +35 -0
  112. package/dist/node/html.d.ts.map +1 -0
  113. package/dist/node/html.js +51 -0
  114. package/dist/node/html.js.map +1 -0
  115. package/dist/node/index.d.ts +24 -0
  116. package/dist/node/index.d.ts.map +1 -0
  117. package/dist/node/index.js +15 -0
  118. package/dist/node/index.js.map +1 -0
  119. package/dist/node/inputs.d.ts +26 -0
  120. package/dist/node/inputs.d.ts.map +1 -0
  121. package/dist/node/inputs.js +282 -0
  122. package/dist/node/inputs.js.map +1 -0
  123. package/dist/node/packages.d.ts +35 -0
  124. package/dist/node/packages.d.ts.map +1 -0
  125. package/dist/node/packages.js +87 -0
  126. package/dist/node/packages.js.map +1 -0
  127. package/dist/node/preload.d.ts +10 -0
  128. package/dist/node/preload.d.ts.map +1 -0
  129. package/dist/node/preload.js +61 -0
  130. package/dist/node/preload.js.map +1 -0
  131. package/dist/node/server.d.ts +42 -0
  132. package/dist/node/server.d.ts.map +1 -0
  133. package/dist/node/server.js +410 -0
  134. package/dist/node/server.js.map +1 -0
  135. package/dist/node/static.d.ts +43 -0
  136. package/dist/node/static.d.ts.map +1 -0
  137. package/dist/node/static.js +157 -0
  138. package/dist/node/static.js.map +1 -0
  139. package/dist/node/workbench.d.ts +43 -0
  140. package/dist/node/workbench.d.ts.map +1 -0
  141. package/dist/node/workbench.js +204 -0
  142. package/dist/node/workbench.js.map +1 -0
  143. package/dist/pages/build.d.ts +22 -0
  144. package/dist/pages/build.d.ts.map +1 -0
  145. package/dist/pages/build.js +363 -0
  146. package/dist/pages/build.js.map +1 -0
  147. package/dist/pages/defaults.d.ts +16 -0
  148. package/dist/pages/defaults.d.ts.map +1 -0
  149. package/dist/pages/defaults.js +88 -0
  150. package/dist/pages/defaults.js.map +1 -0
  151. package/dist/pages/index.d.ts +14 -0
  152. package/dist/pages/index.d.ts.map +1 -0
  153. package/dist/pages/index.js +10 -0
  154. package/dist/pages/index.js.map +1 -0
  155. package/dist/pages/navigation.d.ts +48 -0
  156. package/dist/pages/navigation.d.ts.map +1 -0
  157. package/dist/pages/navigation.js +83 -0
  158. package/dist/pages/navigation.js.map +1 -0
  159. package/dist/pages/types.d.ts +148 -0
  160. package/dist/pages/types.d.ts.map +1 -0
  161. package/dist/pages/types.js +3 -0
  162. package/dist/pages/types.js.map +1 -0
  163. package/dist/panels/catalog-define.d.ts +3 -0
  164. package/dist/panels/catalog-define.d.ts.map +1 -0
  165. package/dist/panels/catalog-define.js +7 -0
  166. package/dist/panels/catalog-define.js.map +1 -0
  167. package/dist/panels/catalog-layout-styles.d.ts +2 -0
  168. package/dist/panels/catalog-layout-styles.d.ts.map +1 -0
  169. package/dist/panels/catalog-layout-styles.js +54 -0
  170. package/dist/panels/catalog-layout-styles.js.map +1 -0
  171. package/dist/panels/catalog-styles.d.ts +2 -0
  172. package/dist/panels/catalog-styles.d.ts.map +1 -0
  173. package/dist/panels/catalog-styles.js +106 -0
  174. package/dist/panels/catalog-styles.js.map +1 -0
  175. package/dist/panels/catalog.d.ts +37 -0
  176. package/dist/panels/catalog.d.ts.map +1 -0
  177. package/dist/panels/catalog.js +74 -0
  178. package/dist/panels/catalog.js.map +1 -0
  179. package/dist/panels/component-define.d.ts +3 -0
  180. package/dist/panels/component-define.d.ts.map +1 -0
  181. package/dist/panels/component-define.js +6 -0
  182. package/dist/panels/component-define.js.map +1 -0
  183. package/dist/panels/component-detail.d.ts +49 -0
  184. package/dist/panels/component-detail.d.ts.map +1 -0
  185. package/dist/panels/component-detail.js +1352 -0
  186. package/dist/panels/component-detail.js.map +1 -0
  187. package/dist/panels/component.d.ts +17 -0
  188. package/dist/panels/component.d.ts.map +1 -0
  189. package/dist/panels/component.js +10 -0
  190. package/dist/panels/component.js.map +1 -0
  191. package/dist/panels/example-styles.d.ts +2 -0
  192. package/dist/panels/example-styles.d.ts.map +1 -0
  193. package/dist/panels/example-styles.js +343 -0
  194. package/dist/panels/example-styles.js.map +1 -0
  195. package/dist/panels/foundation-define.d.ts +3 -0
  196. package/dist/panels/foundation-define.d.ts.map +1 -0
  197. package/dist/panels/foundation-define.js +6 -0
  198. package/dist/panels/foundation-define.js.map +1 -0
  199. package/dist/panels/foundation-detail.d.ts +23 -0
  200. package/dist/panels/foundation-detail.d.ts.map +1 -0
  201. package/dist/panels/foundation-detail.js +216 -0
  202. package/dist/panels/foundation-detail.js.map +1 -0
  203. package/dist/panels/foundation.d.ts +15 -0
  204. package/dist/panels/foundation.d.ts.map +1 -0
  205. package/dist/panels/foundation.js +9 -0
  206. package/dist/panels/foundation.js.map +1 -0
  207. package/dist/panels/model.d.ts +184 -0
  208. package/dist/panels/model.d.ts.map +1 -0
  209. package/dist/panels/model.js +488 -0
  210. package/dist/panels/model.js.map +1 -0
  211. package/dist/panels/styles.d.ts +3 -0
  212. package/dist/panels/styles.d.ts.map +1 -0
  213. package/dist/panels/styles.js +265 -0
  214. package/dist/panels/styles.js.map +1 -0
  215. package/dist/panels/theme-model.d.ts +69 -0
  216. package/dist/panels/theme-model.d.ts.map +1 -0
  217. package/dist/panels/theme-model.js +166 -0
  218. package/dist/panels/theme-model.js.map +1 -0
  219. package/dist/panels/theme-studio.d.ts +32 -0
  220. package/dist/panels/theme-studio.d.ts.map +1 -0
  221. package/dist/panels/theme-studio.js +375 -0
  222. package/dist/panels/theme-studio.js.map +1 -0
  223. package/dist/preview/frame.d.ts +44 -0
  224. package/dist/preview/frame.d.ts.map +1 -0
  225. package/dist/preview/frame.js +260 -0
  226. package/dist/preview/frame.js.map +1 -0
  227. package/dist/preview/index.d.ts +26 -0
  228. package/dist/preview/index.d.ts.map +1 -0
  229. package/dist/preview/index.js +58 -0
  230. package/dist/preview/index.js.map +1 -0
  231. package/dist/preview/theme-generation.d.ts +33 -0
  232. package/dist/preview/theme-generation.d.ts.map +1 -0
  233. package/dist/preview/theme-generation.js +48 -0
  234. package/dist/preview/theme-generation.js.map +1 -0
  235. package/dist/protocol/index.d.ts +222 -0
  236. package/dist/protocol/index.d.ts.map +1 -0
  237. package/dist/protocol/index.js +272 -0
  238. package/dist/protocol/index.js.map +1 -0
  239. package/dist/testing/index.d.ts +47 -0
  240. package/dist/testing/index.d.ts.map +1 -0
  241. package/dist/testing/index.js +145 -0
  242. package/dist/testing/index.js.map +1 -0
  243. package/package.json +118 -4
@@ -0,0 +1,260 @@
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
+ const send = async (requestIdentity, requestReady, kind, payload) => {
179
+ await requestReady;
180
+ if (identity().generation !== requestIdentity.generation)
181
+ throw new PreviewFrameError('frame.generation.superseded', 'The preview frame was replaced.');
182
+ if (scope.disposed || !port)
183
+ throw new PreviewFrameError('frame.disposed', 'The preview frame is not connected.');
184
+ const id = ++nextRequestId;
185
+ const limit = kind === 'mount' || kind === 'specimen' ? mountTimeoutMs : timeoutMs;
186
+ return new Promise((resolve, reject) => {
187
+ const releaseTimer = scope.timeout(() => {
188
+ pending.delete(id);
189
+ reject(new PreviewFrameError('frame.request.timeout', `Frame request ${id} timed out.`));
190
+ }, limit);
191
+ pending.set(id, {
192
+ resolve: (value) => {
193
+ releaseTimer();
194
+ resolve(value);
195
+ },
196
+ reject: (error) => {
197
+ releaseTimer();
198
+ reject(error);
199
+ },
200
+ });
201
+ const request = {
202
+ ...frameEnvelope(requestIdentity, kind),
203
+ id,
204
+ ...(payload === undefined ? {} : { payload }),
205
+ };
206
+ if (!isFrameRequest(request)) {
207
+ pending.delete(id);
208
+ releaseTimer();
209
+ reject(new TypeError(`Invalid ${kind} frame request payload.`));
210
+ return;
211
+ }
212
+ port?.postMessage(request);
213
+ });
214
+ };
215
+ // One request at a time, in call order: each is sent when the one before it has settled, so a
216
+ // change made during a slow mount reaches the element that mount creates, and its timeout
217
+ // counts from when it is sent.
218
+ let queue = Promise.resolve();
219
+ return {
220
+ iframe,
221
+ get identity() {
222
+ return identity();
223
+ },
224
+ get ready() {
225
+ return ready;
226
+ },
227
+ request(kind, payload) {
228
+ const requestIdentity = identity();
229
+ const requestReady = ready;
230
+ const run = () => send(requestIdentity, requestReady, kind, payload);
231
+ const result = queue.then(run, run);
232
+ queue = result.catch(() => undefined);
233
+ return result;
234
+ },
235
+ setViewport(width, height) {
236
+ if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0)
237
+ throw new RangeError('Preview viewport dimensions must be positive finite numbers.');
238
+ iframe.style.inlineSize = `${width}px`;
239
+ iframe.style.blockSize = `${height}px`;
240
+ iframe.width = String(Math.round(width));
241
+ iframe.height = String(Math.round(height));
242
+ },
243
+ reload() {
244
+ if (scope.disposed)
245
+ return Promise.reject(new PreviewFrameError('frame.disposed', 'The preview frame is not connected.'));
246
+ const error = new PreviewFrameError('frame.generation.superseded', 'The preview frame was replaced by a new generation.');
247
+ finishReady(error);
248
+ rejectPending(error);
249
+ generationScope?.dispose(error);
250
+ port = undefined;
251
+ generation++;
252
+ startGeneration();
253
+ return ready;
254
+ },
255
+ dispose() {
256
+ scope.dispose();
257
+ },
258
+ };
259
+ }
260
+ //# 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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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `@oddkin/workbench/preview` — isolated preview frames and preview-owned stylesheets. Each
3
+ * frame has its own registry and module realm. `reload()` advances its generation for reset or
4
+ * registration replacement; frames execute trusted project code and are not a security sandbox.
5
+ * A shared component stylesheet is never mutated: inside one preview scope it is swapped for a
6
+ * copy, and edits replace the copy's rules without remounting elements (theming-and-styling.md §11).
7
+ */
8
+ import type { CSSResult } from '@oddkin/core/styles';
9
+ export interface PreviewStyles {
10
+ /** The preview-owned copy adopted in place of the shared sheet. */
11
+ readonly sheet: CSSStyleSheet;
12
+ /** Replace the copy's rules, e.g. with a recipe regenerated from edited conditions. */
13
+ update(cssText: string): void;
14
+ /** Swap the copy into roots added to the scope since the last call; returns how many. */
15
+ refresh(): number;
16
+ /** Put the shared sheet back everywhere the copy was adopted. */
17
+ restore(): void;
18
+ }
19
+ /**
20
+ * Within `scope`, adopt a preview-owned copy of `shared` wherever the shared sheet is adopted.
21
+ * Roots outside the scope, and the shared sheet itself, are left exactly as they were.
22
+ */
23
+ export declare function previewStyles(shared: CSSResult, scope: Element): PreviewStyles;
24
+ export { createIsolatedPreview, PreviewFrameError, previewProtocolStats } from './frame.js';
25
+ export type { IsolatedPreview, IsolatedPreviewOptions } from './frame.js';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,uFAAuF;IACvF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yFAAyF;IACzF,OAAO,IAAI,MAAM,CAAC;IAClB,iEAAiE;IACjE,OAAO,IAAI,IAAI,CAAC;CACjB;AAqBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAgC9E;AAED,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,58 @@
1
+ /** Open shadow roots under `scope`, nested ones included. */
2
+ function shadowRoots(scope) {
3
+ const roots = [];
4
+ const visit = (node) => {
5
+ for (const element of node.querySelectorAll('*')) {
6
+ if (element.shadowRoot) {
7
+ roots.push(element.shadowRoot);
8
+ visit(element.shadowRoot);
9
+ }
10
+ }
11
+ };
12
+ if (scope.shadowRoot) {
13
+ roots.push(scope.shadowRoot);
14
+ visit(scope.shadowRoot);
15
+ }
16
+ visit(scope);
17
+ return roots;
18
+ }
19
+ /**
20
+ * Within `scope`, adopt a preview-owned copy of `shared` wherever the shared sheet is adopted.
21
+ * Roots outside the scope, and the shared sheet itself, are left exactly as they were.
22
+ */
23
+ export function previewStyles(shared, scope) {
24
+ const doc = scope.ownerDocument;
25
+ const original = shared.sheetFor(doc);
26
+ if (!original)
27
+ throw new Error('previewStyles: constructable stylesheets are unavailable in this document.');
28
+ const view = doc.defaultView;
29
+ const sheet = new view.CSSStyleSheet();
30
+ sheet.replaceSync(shared.cssText);
31
+ const swapped = new Set();
32
+ const swap = (root, from, to) => {
33
+ root.adoptedStyleSheets = root.adoptedStyleSheets.map((s) => (s === from ? to : s));
34
+ };
35
+ const refresh = () => {
36
+ let count = 0;
37
+ for (const root of shadowRoots(scope))
38
+ if (!swapped.has(root) && root.adoptedStyleSheets.includes(original)) {
39
+ swap(root, original, sheet);
40
+ swapped.add(root);
41
+ count++;
42
+ }
43
+ return count;
44
+ };
45
+ refresh();
46
+ return {
47
+ sheet,
48
+ update: (cssText) => sheet.replaceSync(cssText),
49
+ refresh,
50
+ restore() {
51
+ for (const root of swapped)
52
+ swap(root, sheet, original);
53
+ swapped.clear();
54
+ },
55
+ };
56
+ }
57
+ export { createIsolatedPreview, PreviewFrameError, previewProtocolStats } from './frame.js';
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/preview/index.ts"],"names":[],"mappings":"AAoBA,6DAA6D;AAC7D,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAA0B,EAAE,EAAE;QAC3C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC/B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;IACb,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,KAAc;IAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ;QACX,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,GAAG,CAAC,WAAyC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;IACvC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAc,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,IAAgB,EAAE,IAAmB,EAAE,EAAiB,EAAE,EAAE;QACxE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,KAAK,EAAE,CAAC;YACV,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO,EAAE,CAAC;IACV,OAAO;QACL,KAAK;QACL,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;QAC/C,OAAO;QACP,OAAO;YACL,KAAK,MAAM,IAAI,IAAI,OAAO;gBAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Theme generation off the main thread (workbench.md §6.4, theming-and-styling.md §8): one
3
+ * module Worker running the library's own `@oddkin/tokens/generate`. Latest wins: while a run is
4
+ * in flight, newer drafts replace each other and only the newest is generated next; a result
5
+ * for a superseded draft is discarded, never applied.
6
+ */
7
+ import type { Scope } from '@oddkin/core/scope';
8
+ export interface GenerationDiagnostic {
9
+ readonly severity?: string;
10
+ readonly code?: string;
11
+ readonly path?: string;
12
+ readonly message?: string;
13
+ }
14
+ export interface GenerationResult {
15
+ readonly id: number;
16
+ readonly ok: boolean;
17
+ readonly css?: string;
18
+ readonly diagnostics: readonly GenerationDiagnostic[];
19
+ /** Generation time inside the Worker. */
20
+ readonly ms: number;
21
+ }
22
+ export interface ThemeGeneration {
23
+ /** Generate `draft`; supersedes every earlier request that has not produced a result. */
24
+ request(draft: unknown): void;
25
+ readonly stats: {
26
+ readonly sent: number;
27
+ readonly superseded: number;
28
+ readonly delivered: number;
29
+ };
30
+ }
31
+ /** The Worker lives as long as `scope`. */
32
+ export declare function createThemeGeneration(workerUrl: string, scope: Scope, onResult: (result: GenerationResult) => void, onError: (message: string) => void): ThemeGeneration;
33
+ //# sourceMappingURL=theme-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-generation.d.ts","sourceRoot":"","sources":["../../src/preview/theme-generation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACtD,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;CACH;AAED,2CAA2C;AAC3C,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,EAC5C,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACjC,eAAe,CAyCjB"}
@@ -0,0 +1,48 @@
1
+ /** The Worker lives as long as `scope`. */
2
+ export function createThemeGeneration(workerUrl, scope, onResult, onError) {
3
+ const worker = new Worker(workerUrl, { type: 'module', name: 'oddkin-theme-studio' });
4
+ scope.add(() => worker.terminate(), 'theme generation worker');
5
+ const stats = { sent: 0, superseded: 0, delivered: 0 };
6
+ let nextId = 0;
7
+ let inFlight;
8
+ let queued;
9
+ const send = (draft) => {
10
+ inFlight = ++nextId;
11
+ stats.sent++;
12
+ worker.postMessage({ id: inFlight, draft });
13
+ };
14
+ scope.listen(worker, 'message', (event) => {
15
+ if (event.data.id !== inFlight)
16
+ return;
17
+ inFlight = undefined;
18
+ if (queued) {
19
+ stats.superseded++;
20
+ const next = queued;
21
+ queued = undefined;
22
+ send(next.draft);
23
+ return;
24
+ }
25
+ stats.delivered++;
26
+ onResult(event.data);
27
+ });
28
+ scope.listen(worker, 'error', (event) => {
29
+ inFlight = undefined;
30
+ queued = undefined;
31
+ onError(event.message || 'The theme generator could not be loaded.');
32
+ });
33
+ return {
34
+ request(draft) {
35
+ if (scope.disposed)
36
+ return;
37
+ if (inFlight === undefined)
38
+ send(draft);
39
+ else {
40
+ if (queued)
41
+ stats.superseded++;
42
+ queued = { draft };
43
+ }
44
+ },
45
+ stats,
46
+ };
47
+ }
48
+ //# sourceMappingURL=theme-generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-generation.js","sourceRoot":"","sources":["../../src/preview/theme-generation.ts"],"names":[],"mappings":"AAkCA,2CAA2C;AAC3C,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,KAAY,EACZ,QAA4C,EAC5C,OAAkC;IAElC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACtF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,yBAAyB,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACvD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAA4B,CAAC;IACjC,IAAI,MAA+C,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,EAAE;QAC9B,QAAQ,GAAG,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,KAAqC,EAAE,EAAE;QACxE,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ;YAAE,OAAO;QACvC,QAAQ,GAAG,SAAS,CAAC;QACrB,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC;YACpB,MAAM,GAAG,SAAS,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE;QAClD,QAAQ,GAAG,SAAS,CAAC;QACrB,MAAM,GAAG,SAAS,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,0CAA0C,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO,CAAC,KAAK;YACX,IAAI,KAAK,CAAC,QAAQ;gBAAE,OAAO;YAC3B,IAAI,QAAQ,KAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBACnC,CAAC;gBACJ,IAAI,MAAM;oBAAE,KAAK,CAAC,UAAU,EAAE,CAAC;gBAC/B,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;QACD,KAAK;KACN,CAAC;AACJ,CAAC"}