@ethlete/cli 3.0.0-next.22 → 3.0.0-next.24

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 (154) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/design/contrast.ts +49 -0
  3. package/design/define-call.ts +5 -8
  4. package/design/define-part.ts +63 -1
  5. package/design/morph.ts +67 -0
  6. package/design/motion-runtime.ts +200 -0
  7. package/design/web/env.d.ts +6 -2
  8. package/design/web/frame.ts +39 -1
  9. package/package.json +2 -1
  10. package/playwright/failure-reporter.d.ts +2 -0
  11. package/playwright/failure-reporter.js +1 -0
  12. package/src/lib/design/changed-parts.d.ts +4 -4
  13. package/src/lib/design/changed-parts.js +10 -6
  14. package/src/lib/design/changed-parts.js.map +1 -1
  15. package/src/lib/design/check.js +1 -1
  16. package/src/lib/design/check.js.map +1 -1
  17. package/src/lib/design/contact-sheet.d.ts +39 -8
  18. package/src/lib/design/contact-sheet.js +131 -21
  19. package/src/lib/design/contact-sheet.js.map +1 -1
  20. package/src/lib/design/design-command.js +22 -2
  21. package/src/lib/design/design-command.js.map +1 -1
  22. package/src/lib/design/generated-stylesheets.d.ts +15 -0
  23. package/src/lib/design/generated-stylesheets.js +52 -0
  24. package/src/lib/design/generated-stylesheets.js.map +1 -0
  25. package/src/lib/design/inbox-command.d.ts +1 -0
  26. package/src/lib/design/inbox-command.js +15 -0
  27. package/src/lib/design/inbox-command.js.map +1 -1
  28. package/src/lib/design/merge-compare.d.ts +10 -0
  29. package/src/lib/design/merge-compare.js +17 -4
  30. package/src/lib/design/merge-compare.js.map +1 -1
  31. package/src/lib/design/paths.d.ts +11 -0
  32. package/src/lib/design/paths.js.map +1 -1
  33. package/src/lib/design/render.d.ts +3 -1
  34. package/src/lib/design/render.js +17 -1
  35. package/src/lib/design/render.js.map +1 -1
  36. package/src/lib/design/serve.js +317 -254
  37. package/src/lib/design/serve.js.map +1 -1
  38. package/src/lib/design/shot-command.d.ts +25 -0
  39. package/src/lib/design/shot-command.js +162 -62
  40. package/src/lib/design/shot-command.js.map +1 -1
  41. package/src/lib/design/shot.d.ts +14 -4
  42. package/src/lib/design/shot.js +71 -50
  43. package/src/lib/design/shot.js.map +1 -1
  44. package/src/lib/design/sketch-command.d.ts +7 -1
  45. package/src/lib/design/sketch-command.js +108 -31
  46. package/src/lib/design/sketch-command.js.map +1 -1
  47. package/src/lib/design/sketch-stylesheets.d.ts +7 -0
  48. package/src/lib/design/sketch-stylesheets.js +63 -0
  49. package/src/lib/design/sketch-stylesheets.js.map +1 -0
  50. package/src/lib/design/studio-api.d.ts +20 -7
  51. package/src/lib/design/studio-api.js +99 -28
  52. package/src/lib/design/studio-api.js.map +1 -1
  53. package/src/lib/design/system/check-system.js +8 -0
  54. package/src/lib/design/system/check-system.js.map +1 -1
  55. package/src/lib/design/system/comments/comment.d.ts +18 -1
  56. package/src/lib/design/system/comments/comment.js +35 -1
  57. package/src/lib/design/system/comments/comment.js.map +1 -1
  58. package/src/lib/design/system/comments/complete.js +4 -2
  59. package/src/lib/design/system/comments/complete.js.map +1 -1
  60. package/src/lib/design/system/complete-command.d.ts +9 -0
  61. package/src/lib/design/system/complete-command.js +64 -0
  62. package/src/lib/design/system/complete-command.js.map +1 -0
  63. package/src/lib/design/system/complete.d.ts +73 -0
  64. package/src/lib/design/system/complete.js +655 -0
  65. package/src/lib/design/system/complete.js.map +1 -0
  66. package/src/lib/design/system/contrast-check.d.ts +26 -0
  67. package/src/lib/design/system/contrast-check.js +153 -0
  68. package/src/lib/design/system/contrast-check.js.map +1 -0
  69. package/src/lib/design/system/imports.d.ts +28 -3
  70. package/src/lib/design/system/imports.js +84 -7
  71. package/src/lib/design/system/imports.js.map +1 -1
  72. package/src/lib/design/system/list-system.d.ts +11 -0
  73. package/src/lib/design/system/list-system.js +17 -1
  74. package/src/lib/design/system/list-system.js.map +1 -1
  75. package/src/lib/design/system/product-stylesheets.d.ts +3 -0
  76. package/src/lib/design/system/product-stylesheets.js +40 -0
  77. package/src/lib/design/system/product-stylesheets.js.map +1 -0
  78. package/src/lib/design/system/render-check.js +11 -3
  79. package/src/lib/design/system/render-check.js.map +1 -1
  80. package/src/lib/design/system/rules/canonical-class.d.ts +9 -0
  81. package/src/lib/design/system/rules/canonical-class.js +132 -0
  82. package/src/lib/design/system/rules/canonical-class.js.map +1 -0
  83. package/src/lib/design/system/rules/inline-svg.d.ts +7 -0
  84. package/src/lib/design/system/rules/inline-svg.js +28 -0
  85. package/src/lib/design/system/rules/inline-svg.js.map +1 -0
  86. package/src/lib/design/system/rules/motion.d.ts +4 -0
  87. package/src/lib/design/system/rules/motion.js +46 -2
  88. package/src/lib/design/system/rules/motion.js.map +1 -1
  89. package/src/lib/design/system/rules/utility-css.d.ts +11 -0
  90. package/src/lib/design/system/rules/utility-css.js +290 -0
  91. package/src/lib/design/system/rules/utility-css.js.map +1 -0
  92. package/src/lib/design/system/sketch/baseline.d.ts +3 -2
  93. package/src/lib/design/system/sketch/baseline.js +10 -4
  94. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  95. package/src/lib/design/system/sketch/merge-preview.d.ts +4 -2
  96. package/src/lib/design/system/sketch/merge-preview.js +20 -3
  97. package/src/lib/design/system/sketch/merge-preview.js.map +1 -1
  98. package/src/lib/design/system/sketch/merge-shared.d.ts +42 -6
  99. package/src/lib/design/system/sketch/merge-shared.js +122 -24
  100. package/src/lib/design/system/sketch/merge-shared.js.map +1 -1
  101. package/src/lib/design/system/sketch/merge.d.ts +3 -3
  102. package/src/lib/design/system/sketch/merge.js +57 -29
  103. package/src/lib/design/system/sketch/merge.js.map +1 -1
  104. package/src/lib/design/system/sketch/merged-parts.d.ts +7 -0
  105. package/src/lib/design/system/sketch/merged-parts.js +13 -1
  106. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  107. package/src/lib/design/system/sketch/no-visible-change.d.ts +4 -3
  108. package/src/lib/design/system/sketch/no-visible-change.js +50 -19
  109. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -1
  110. package/src/lib/design/system/sketch/overlay.js +7 -2
  111. package/src/lib/design/system/sketch/overlay.js.map +1 -1
  112. package/src/lib/design/system/sketch/part-definition.d.ts +12 -0
  113. package/src/lib/design/system/sketch/part-definition.js +40 -1
  114. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  115. package/src/lib/design/system/sketch/sketch.d.ts +63 -12
  116. package/src/lib/design/system/sketch/sketch.js +165 -36
  117. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  118. package/src/lib/design/system/sketch/unchanged-states.d.ts +11 -5
  119. package/src/lib/design/system/sketch/unchanged-states.js +39 -25
  120. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  121. package/src/lib/design/system/system-modules.d.ts +5 -1
  122. package/src/lib/design/system/system-modules.js +26 -8
  123. package/src/lib/design/system/system-modules.js.map +1 -1
  124. package/src/lib/design/system/system-tsconfig.js +2 -1
  125. package/src/lib/design/system/system-tsconfig.js.map +1 -1
  126. package/src/lib/design/thumb.d.ts +6 -2
  127. package/src/lib/design/thumb.js +36 -15
  128. package/src/lib/design/thumb.js.map +1 -1
  129. package/src/lib/design/typecheck.d.ts +2 -0
  130. package/src/lib/design/typecheck.js +19 -2
  131. package/src/lib/design/typecheck.js.map +1 -1
  132. package/src/lib/design/variant-diff.d.ts +24 -6
  133. package/src/lib/design/variant-diff.js +26 -10
  134. package/src/lib/design/variant-diff.js.map +1 -1
  135. package/src/lib/design/warm-pages.d.ts +20 -0
  136. package/src/lib/design/warm-pages.js +78 -0
  137. package/src/lib/design/warm-pages.js.map +1 -0
  138. package/src/lib/playwright/failure-reporter.d.ts +35 -0
  139. package/src/lib/playwright/failure-reporter.js +66 -0
  140. package/src/lib/playwright/failure-reporter.js.map +1 -0
  141. package/src/lib/update/commits.d.ts +9 -0
  142. package/src/lib/update/commits.js +15 -1
  143. package/src/lib/update/commits.js.map +1 -1
  144. package/src/lib/update/migration-manifest.d.ts +6 -0
  145. package/src/lib/update/migration-manifest.js +7 -0
  146. package/src/lib/update/migration-manifest.js.map +1 -1
  147. package/src/lib/update/migrations-command.js +1 -0
  148. package/src/lib/update/migrations-command.js.map +1 -1
  149. package/src/lib/update/run-migrations.d.ts +22 -0
  150. package/src/lib/update/run-migrations.js +60 -1
  151. package/src/lib/update/run-migrations.js.map +1 -1
  152. package/src/lib/update/update-command.d.ts +10 -0
  153. package/src/lib/update/update-command.js +28 -2
  154. package/src/lib/update/update-command.js.map +1 -1
@@ -23,6 +23,8 @@ const product_command_1 = require("./product-command");
23
23
  const render_1 = require("./render");
24
24
  const render_packages_1 = require("./render-packages");
25
25
  const part_marks_1 = require("./part-marks");
26
+ const generated_stylesheets_1 = require("./generated-stylesheets");
27
+ const sketch_stylesheets_1 = require("./sketch-stylesheets");
26
28
  const shot_1 = require("./shot");
27
29
  const changed_parts_1 = require("./changed-parts");
28
30
  const stamp_1 = require("./stamp");
@@ -32,6 +34,7 @@ const system_modules_1 = require("./system/system-modules");
32
34
  const kit_1 = require("./system/kit");
33
35
  const system_tsconfig_1 = require("./system/system-tsconfig");
34
36
  const sketch_1 = require("./system/sketch/sketch");
37
+ const unchanged_states_1 = require("./system/sketch/unchanged-states");
35
38
  const thumb_1 = require("./thumb");
36
39
  const paths_1 = require("./paths");
37
40
  const VIRTUAL = 'virtual:design-explore';
@@ -68,16 +71,31 @@ const workspaceAliases = (target) => {
68
71
  };
69
72
  // Sequential on purpose: Vite appends a sheet's <style> when its import settles, so parallel
70
73
  // imports let the head order, and with it the winning rule, change from load to load.
71
- const settingsLoaders = (options) => `{\n${Object.entries(options.settings)
72
- .map(([name, entry]) => {
74
+ const stylesLoaderOf = (options) => {
73
75
  var _a;
74
- return ` ${JSON.stringify(name)}: () => Promise.resolve()${((_a = entry.styles) !== null && _a !== void 0 ? _a : [])
76
+ return `() => Promise.resolve()${((_a = options.entry.styles) !== null && _a !== void 0 ? _a : [])
75
77
  .map((style) => (0, path_1.resolve)(options.target, style))
76
- .map((file) => (options.products ? (0, system_modules_1.productModuleIdOf)({ file, product: name }) : file))
78
+ .map((file) => options.product ? (0, system_modules_1.productModuleIdOf)({ file, product: options.product, sketch: options.sketch }) : file)
77
79
  .map((file) => `.then(() => import(${JSON.stringify((0, vite_paths_1.fsUrl)(file))}))`)
78
80
  .join('')},`;
79
- })
81
+ };
82
+ const settingsLoaders = (options) => `{\n${Object.entries(options.settings)
83
+ .map(([name, entry]) => ` ${JSON.stringify(name)}: ${stylesLoaderOf({ target: options.target, entry, product: options.products ? name : undefined })}`)
80
84
  .join('\n')}\n}`;
85
+ /** The stylesheets of each product as one sketch variant draws them, for each variant that draws a part stylesheet from a file of its own. */
86
+ const sketchStylesLoaders = (options) => {
87
+ var _a;
88
+ const { target, config, system } = options;
89
+ return `{\n${Object.entries((_a = config.products) !== null && _a !== void 0 ? _a : {})
90
+ .map(([product, entry]) => ` ${JSON.stringify(product)}: {\n${system
91
+ .sketchesOf(product)
92
+ .map(({ target: part, variants }) => ` ${JSON.stringify(part)}: {\n${variants
93
+ .filter((variant) => system.replacedStylesheetsOf({ product, sketch: { target: part, variant } }).size > 0)
94
+ .map((variant) => ` ${JSON.stringify(variant)}: ${stylesLoaderOf({ target, entry, product, sketch: { target: part, variant } })}`)
95
+ .join('\n')}\n },`)
96
+ .join('\n')}\n },`)
97
+ .join('\n')}\n}`;
98
+ };
81
99
  const themesOfSettings = (settings) => JSON.stringify(Object.fromEntries(Object.entries(settings).map(([name, entry]) => {
82
100
  var _a, _b, _c, _d;
83
101
  return [
@@ -90,8 +108,9 @@ const themesOfSettings = (settings) => JSON.stringify(Object.fromEntries(Object.
90
108
  * one it draws for: two projects define the same theme variables, so a frame that loaded both would
91
109
  * draw under whichever stylesheet came last.
92
110
  */
93
- const env = (target, config) => {
111
+ const env = (options) => {
94
112
  var _a, _b;
113
+ const { target, config, system } = options;
95
114
  const projects = (_a = config.projects) !== null && _a !== void 0 ? _a : {};
96
115
  const products = (_b = config.products) !== null && _b !== void 0 ? _b : {};
97
116
  return (`const envs = ${settingsLoaders({ target, settings: projects })};\n` +
@@ -99,7 +118,8 @@ const env = (target, config) => {
99
118
  `const themes = ${themesOfSettings(projects)};\n` +
100
119
  `export const themesOf = (project) => themes[project] ?? { surface: [], color: [] };\n` +
101
120
  `const productEnvs = ${settingsLoaders({ target, settings: products, products: true })};\n` +
102
- `export const loadProductEnv = (product) => (productEnvs[product] ?? (() => Promise.resolve()))();\n`);
121
+ `const sketchProductEnvs = ${sketchStylesLoaders({ target, config, system })};\n` +
122
+ `export const loadProductEnv = ({ product, sketch, variant }) => (sketchProductEnvs[product]?.[sketch]?.[variant] ?? productEnvs[product] ?? (() => Promise.resolve()))();\n`);
103
123
  };
104
124
  /** Each product's parts, keyed `<layer>/<name>`, each loaded as the product resolves it. */
105
125
  const partsRegistry = (options) => options.parts
@@ -164,9 +184,14 @@ const isCommentFile = (file) => file.endsWith('.json') && (0, path_1.basename)((
164
184
  const isNoteFile = (file) => file.endsWith('.json') && (0, path_1.basename)((0, path_1.dirname)(file)) === 'notes';
165
185
  const isFlowFile = (file) => file.endsWith('.json') && (0, path_1.basename)((0, path_1.dirname)(file)) === 'flows';
166
186
  const isDecisionFile = (file) => (0, path_1.basename)(file) === sketch_1.SKETCH_FILE || isCommentFile(file) || isNoteFile(file);
187
+ const isSketchFile = (designRoot, file) => {
188
+ const [product, folder, ...inside] = (0, path_1.relative)(designRoot, (0, path_1.resolve)(file)).split(path_1.sep);
189
+ return !!product && product !== '..' && folder === 'sketches' && inside.length > 0;
190
+ };
167
191
  /**
168
- * A server-sent event stream for Studio: `comments` when a comment file changed, `notes` when a note file changed,
169
- * `flows` when a flow file changed, and `parts` with the parts any change redraws and the revision it gave them.
192
+ * A server-sent event stream for Studio: `comments`, `notes`, `flows`, `calls` and `sketches` when a file of that
193
+ * kind changed, and `parts` with the parts a design system change redraws and the revision it gave them. A `parts`
194
+ * event with no parts still tells Studio the system changed.
170
195
  */
171
196
  const createDesignEvents = () => {
172
197
  const listeners = new Set();
@@ -203,256 +228,279 @@ const withAssetUrls = (system) => {
203
228
  const marks = (0, part_marks_1.partMarksTransform)(system);
204
229
  return (code, id) => { var _a; return (_a = system.withAssetUrls(code, id)) !== null && _a !== void 0 ? _a : marks(code, id); };
205
230
  };
206
- const designExplore = ({ target, config, system, }) => ({
207
- name: 'design-explore',
208
- enforce: 'pre',
209
- resolveId: (id, importer) => {
210
- var _a, _b, _c;
211
- if (id === VIRTUAL || id === `${VIRTUAL}/env` || id === `${VIRTUAL}/system`)
212
- return `\0${id}`;
213
- return ((_a = system.resolveId(id, importer)) !== null && _a !== void 0 ? _a : (0, render_packages_1.mappedSubpathOf)({ specifier: id, packages: (_c = (_b = config.render) === null || _b === void 0 ? void 0 : _b.packages) !== null && _c !== void 0 ? _c : {}, target }));
214
- },
215
- load: (id) => {
216
- if (id === `\0${VIRTUAL}`)
217
- return registry(target);
218
- if (id === `\0${VIRTUAL}/env`)
219
- return env(target, config);
220
- if (id === `\0${VIRTUAL}/system`)
221
- return systemRegistry(system);
222
- return null;
223
- },
224
- transform: withAssetUrls(system),
225
- transformIndexHtml: {
226
- order: 'pre',
227
- handler: (html, ctx) => {
228
- var _a, _b, _c, _d, _e, _f;
229
- if (!ctx.path.includes('frame'))
230
- return html;
231
- const asked = new URL((_a = ctx.originalUrl) !== null && _a !== void 0 ? _a : ctx.path, 'http://localhost');
232
- const product = asked.searchParams.get('product');
233
- const head = product
234
- ? (_c = (_b = config.products) === null || _b === void 0 ? void 0 : _b[product]) === null || _c === void 0 ? void 0 : _c.head
235
- : (_f = (_d = config.projects) === null || _d === void 0 ? void 0 : _d[projectOf((_e = asked.searchParams.get('call')) !== null && _e !== void 0 ? _e : '')]) === null || _f === void 0 ? void 0 : _f.head;
236
- if (!head)
237
- return html;
238
- return html.replace('<!--head-->', (0, fs_1.readFileSync)((0, path_1.resolve)(target, head), 'utf8'));
231
+ const designExplore = ({ target, config, system, stylesheetImports, }) => {
232
+ const renderer = (0, render_1.createRenderer)({ target, config });
233
+ return {
234
+ name: 'design-explore',
235
+ enforce: 'pre',
236
+ resolveId: (id, importer) => {
237
+ var _a, _b, _c;
238
+ if (id === VIRTUAL || id === `${VIRTUAL}/env` || id === `${VIRTUAL}/system`)
239
+ return `\0${id}`;
240
+ return ((_a = system.resolveId(id, importer)) !== null && _a !== void 0 ? _a : (0, render_packages_1.mappedSubpathOf)({ specifier: id, packages: (_c = (_b = config.render) === null || _b === void 0 ? void 0 : _b.packages) !== null && _c !== void 0 ? _c : {}, target }));
239
241
  },
240
- },
241
- /** The registries are built once per load, so a new call or part folder is invisible until it is invalidated. */
242
- configureServer: (vite) => {
243
- var _a, _b, _c;
244
- const callsRoot = (0, paths_1.callsRootOf)(target);
245
- const designRoot = (0, path_1.resolve)(target, paths_1.DESIGN_DIR);
246
- const stamp = (0, stamp_1.buildStampOf)();
247
- const base = () => {
248
- var _a;
249
- const address = (_a = vite.httpServer) === null || _a === void 0 ? void 0 : _a.address();
250
- return `http://localhost:${address && typeof address === 'object' ? address.port : (0, paths_1.portOf)(config)}`;
251
- };
252
- const thumbs = (0, thumb_1.createThumbnailer)({ target, base });
253
- const shots = (0, shot_1.createPartShooter)({
254
- target,
255
- base,
256
- system,
257
- statesOf: (_a) => __awaiter(void 0, [_a], void 0, function* ({ product, part, sketch }) {
258
- var _b, _c;
259
- const file = (_b = system.partOf({ product, part, sketch })) === null || _b === void 0 ? void 0 : _b.file;
260
- if (!file)
261
- return null;
262
- const module = (yield vite.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product, sketch })));
263
- const states = (_c = module.default) === null || _c === void 0 ? void 0 : _c.states;
264
- return states && typeof states === 'object' ? Object.keys(states) : [];
265
- }),
266
- });
267
- const baseDirs = [...new Set(system.products().flatMap((name) => { var _a, _b, _c; return (_c = (_b = (_a = system.productOf(name)) === null || _a === void 0 ? void 0 : _a.base) === null || _b === void 0 ? void 0 : _b.dir) !== null && _c !== void 0 ? _c : []; }))].filter((dir) => !isInside(designRoot, dir));
268
- const reload = (id) => {
269
- const module = vite.moduleGraph.getModuleById(`\0${id}`);
270
- if (module)
271
- vite.moduleGraph.invalidateModule(module);
272
- };
273
- const unresolveParts = () => {
274
- for (const module of vite.moduleGraph.idToModuleMap.values()) {
275
- if ((0, system_modules_1.productOfModuleId)(module.id))
276
- vite.moduleGraph.invalidateModule(module);
277
- }
278
- };
279
- const forgetCalls = (file) => {
280
- thumbs.forget((0, path_1.relative)(callsRoot, file));
281
- shots.forgetCalls((0, path_1.relative)(callsRoot, file));
282
- };
283
- const events = createDesignEvents();
284
- let revision = 0;
285
- const redraw = (change) => {
286
- if (!change.all && change.parts.length === 0 && !change.errored)
287
- return;
288
- revision += 1;
289
- if (change.all)
290
- shots.clear();
291
- else
292
- shots.forget(change);
293
- events.signal('parts', Object.assign({ revision }, change));
294
- };
295
- const hot = (_b = (_a = vite.environments) === null || _a === void 0 ? void 0 : _a['client']) === null || _b === void 0 ? void 0 : _b.hot;
296
- if (hot) {
297
- const send = hot.send.bind(hot);
298
- hot.send = (payload, data) => {
299
- // HMR is disabled: Studio must replace frames when Vite invalidates optimized dependency URLs.
300
- if (typeof payload === 'object' && payload.type === 'full-reload') {
301
- thumbs.clear();
302
- redraw(changed_parts_1.ALL_PARTS);
303
- }
304
- return typeof payload === 'string' ? send(payload, data) : send(payload);
242
+ load: (id) => {
243
+ if (id === `\0${VIRTUAL}`)
244
+ return registry(target);
245
+ if (id === `\0${VIRTUAL}/env`)
246
+ return env({ target, config, system });
247
+ if (id === `\0${VIRTUAL}/system`)
248
+ return systemRegistry(system);
249
+ return null;
250
+ },
251
+ transform: withAssetUrls(system),
252
+ transformIndexHtml: {
253
+ order: 'pre',
254
+ handler: (html, ctx) => {
255
+ var _a, _b, _c, _d, _e, _f;
256
+ if (!ctx.path.includes('frame'))
257
+ return html;
258
+ const asked = new URL((_a = ctx.originalUrl) !== null && _a !== void 0 ? _a : ctx.path, 'http://localhost');
259
+ const product = asked.searchParams.get('product');
260
+ const head = product
261
+ ? (_c = (_b = config.products) === null || _b === void 0 ? void 0 : _b[product]) === null || _c === void 0 ? void 0 : _c.head
262
+ : (_f = (_d = config.projects) === null || _d === void 0 ? void 0 : _d[projectOf((_e = asked.searchParams.get('call')) !== null && _e !== void 0 ? _e : '')]) === null || _f === void 0 ? void 0 : _f.head;
263
+ if (!head)
264
+ return html;
265
+ return html.replace('<!--head-->', (0, fs_1.readFileSync)((0, path_1.resolve)(target, head), 'utf8'));
266
+ },
267
+ },
268
+ /** The registries are built once per load, so a new call or part folder is invisible until it is invalidated. */
269
+ configureServer: (vite) => {
270
+ var _a, _b, _c;
271
+ const callsRoot = (0, paths_1.callsRootOf)(target);
272
+ const designRoot = (0, path_1.resolve)(target, paths_1.DESIGN_DIR);
273
+ const stamp = (0, stamp_1.buildStampOf)();
274
+ const base = () => {
275
+ var _a;
276
+ const address = (_a = vite.httpServer) === null || _a === void 0 ? void 0 : _a.address();
277
+ return `http://localhost:${address && typeof address === 'object' ? address.port : (0, paths_1.portOf)(config)}`;
305
278
  };
306
- }
307
- const configPath = (0, paths_1.configPathOf)(target);
308
- const reloadConfig = () => {
309
- let next;
310
- try {
311
- next = (0, paths_1.readConfig)(target);
312
- }
313
- catch (error) {
314
- console.error(`design-explore: ${configPath} is invalid, keeping the last good config (${error instanceof Error ? error.message : String(error)})`);
315
- return;
316
- }
317
- if (!next)
318
- return;
319
- for (const key of Object.keys(config))
320
- delete config[key];
321
- Object.assign(config, next);
322
- system.forget();
323
- reload(`${VIRTUAL}/env`);
324
- reload(`${VIRTUAL}/system`);
325
- redraw(changed_parts_1.ALL_PARTS);
326
- };
327
- const reloadFlows = () => {
328
- thumbs.clear();
329
- shots.clear();
330
- events.signal('flows');
331
- };
332
- const refresh = (file) => {
333
- if ((0, path_1.resolve)(file) === configPath)
334
- return reloadConfig();
335
- if (isCommentFile(file))
336
- return events.signal('comments');
337
- if (isNoteFile(file))
338
- return events.signal('notes');
339
- if (isFlowFile(file))
340
- return reloadFlows();
341
- forgetCalls(file);
342
- if ((0, vite_paths_1.isCallFile)({ callsRoot, file }))
343
- return reload(VIRTUAL);
344
- if (isDecisionFile(file))
345
- return;
346
- if (isInside(callsRoot, file) || ![designRoot, ...baseDirs].some((dir) => isInside(dir, file)))
347
- return;
348
- system.forget();
349
- unresolveParts();
350
- reload(`${VIRTUAL}/system`);
351
- redraw((0, changed_parts_1.addedPartsOf)({ designRoot, baseDirs, system, file: (0, path_1.resolve)(file) }));
352
- };
353
- const change = (file) => {
354
- var _a;
355
- if ((0, path_1.resolve)(file) === configPath)
356
- return reloadConfig();
357
- if (isCommentFile(file))
358
- return events.signal('comments');
359
- if (isNoteFile(file))
360
- return events.signal('notes');
361
- if (isFlowFile(file))
362
- return reloadFlows();
363
- forgetCalls(file);
364
- const dependents = (0, shot_1.dependentIdsOf)((_a = vite.moduleGraph.getModulesByFile(file)) !== null && _a !== void 0 ? _a : []);
365
- redraw((0, changed_parts_1.changedPartsOf)({ target, config, system, file, dependents }));
366
- };
367
- const answer = (handle) => (request, response) => {
368
- var _a;
369
- return void handle(new URL((_a = request.url) !== null && _a !== void 0 ? _a : '', 'http://localhost'), request).then((answered) => sendJson(response, answered), (error) => sendJson(response, {
370
- status: 500,
371
- body: { error: error instanceof Error ? error.message : String(error) },
372
- }));
373
- };
374
- vite.middlewares.use(stamp_1.STAMP_PATH, (_request, response) => {
375
- response.setHeader('content-type', 'application/json');
376
- response.end(JSON.stringify(stamp));
377
- });
378
- vite.middlewares.use(render_1.RENDER_PATH, (0, render_1.renderMiddleware)((0, render_1.createRenderer)({ target, config })));
379
- vite.middlewares.use(render_1.FORCE_PATH, render_1.forceMiddleware);
380
- vite.middlewares.use(thumb_1.THUMB_PATH, thumbs.middleware);
381
- vite.middlewares.use(shot_1.SHOT_PATH, shots.middleware);
382
- vite.middlewares.use(list_system_1.SYSTEM_PATH, answer((url) => __awaiter(void 0, void 0, void 0, function* () {
383
- var _a;
384
- const asked = url.searchParams.get('product');
385
- if (asked && !((_a = config.products) === null || _a === void 0 ? void 0 : _a[asked]))
386
- return { status: 404, body: { error: `no product "${asked}"` } };
387
- const products = yield (0, list_system_1.listSystem)({
279
+ const thumbs = (0, thumb_1.createThumbnailer)({ target, base });
280
+ const shots = (0, shot_1.createPartShooter)({
388
281
  target,
282
+ base,
389
283
  system,
390
- products: asked ? [asked] : system.products(),
391
- load: ({ file, product }) => vite.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product })),
284
+ statesOf: (_a) => __awaiter(void 0, [_a], void 0, function* ({ product, part, sketch }) {
285
+ var _b, _c;
286
+ const file = (_b = system.partOf({ product, part, sketch })) === null || _b === void 0 ? void 0 : _b.file;
287
+ if (!file)
288
+ return null;
289
+ const module = (yield vite.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product, sketch })));
290
+ const states = (_c = module.default) === null || _c === void 0 ? void 0 : _c.states;
291
+ return states && typeof states === 'object' ? Object.keys(states) : [];
292
+ }),
392
293
  });
393
- return { status: 200, body: products };
394
- })));
395
- vite.middlewares.use(product_command_1.PRODUCT_PATH, answer((_url, request) => __awaiter(void 0, void 0, void 0, function* () {
396
- const created = yield (0, product_command_1.newProductAnswer)({ target, request });
397
- if (created.status === 201)
398
- reloadConfig();
399
- return created;
400
- })));
401
- vite.middlewares.use(calls_1.CALLS_PATH, answer(() => __awaiter(void 0, void 0, void 0, function* () {
402
- return ({
403
- status: 200,
404
- body: yield (0, calls_1.listCalls)({ target, load: (file) => vite.ssrLoadModule(file) }),
294
+ const baseDirs = [
295
+ ...new Set(system.products().flatMap((name) => { var _a, _b, _c; return (_c = (_b = (_a = system.productOf(name)) === null || _a === void 0 ? void 0 : _a.base) === null || _b === void 0 ? void 0 : _b.dir) !== null && _c !== void 0 ? _c : []; })),
296
+ ].filter((dir) => !isInside(designRoot, dir));
297
+ const reload = (id) => {
298
+ const module = vite.moduleGraph.getModuleById(`\0${id}`);
299
+ if (module)
300
+ vite.moduleGraph.invalidateModule(module);
301
+ };
302
+ const unresolveParts = () => {
303
+ for (const module of vite.moduleGraph.idToModuleMap.values()) {
304
+ if ((0, system_modules_1.productOfModuleId)(module.id))
305
+ vite.moduleGraph.invalidateModule(module);
306
+ }
307
+ };
308
+ const forgetCalls = (file) => {
309
+ thumbs.forget((0, path_1.relative)(callsRoot, file));
310
+ shots.forgetCalls((0, path_1.relative)(callsRoot, file));
311
+ };
312
+ const events = createDesignEvents();
313
+ let revision = 0;
314
+ const redraw = (change, listed = false) => {
315
+ if (!change.all && change.parts.length === 0 && !change.errored) {
316
+ if (listed)
317
+ events.signal('parts', Object.assign({ revision }, change));
318
+ return;
319
+ }
320
+ revision += 1;
321
+ (0, unchanged_states_1.forgetUnchangedStates)();
322
+ if (change.all)
323
+ shots.clear();
324
+ else
325
+ shots.forget(change);
326
+ events.signal('parts', Object.assign({ revision }, change));
327
+ };
328
+ const hot = (_b = (_a = vite.environments) === null || _a === void 0 ? void 0 : _a['client']) === null || _b === void 0 ? void 0 : _b.hot;
329
+ if (hot) {
330
+ const send = hot.send.bind(hot);
331
+ hot.send = (payload, data) => {
332
+ // HMR is disabled: Studio must replace frames when Vite invalidates optimized dependency URLs.
333
+ if (typeof payload === 'object' && payload.type === 'full-reload') {
334
+ thumbs.clear();
335
+ redraw(changed_parts_1.ALL_PARTS);
336
+ }
337
+ return typeof payload === 'string' ? send(payload, data) : send(payload);
338
+ };
339
+ }
340
+ const configPath = (0, paths_1.configPathOf)(target);
341
+ const reloadConfig = () => {
342
+ let next;
343
+ try {
344
+ next = (0, paths_1.readConfig)(target);
345
+ }
346
+ catch (error) {
347
+ console.error(`design-explore: ${configPath} is invalid, keeping the last good config (${error instanceof Error ? error.message : String(error)})`);
348
+ return;
349
+ }
350
+ if (!next)
351
+ return;
352
+ for (const key of Object.keys(config))
353
+ delete config[key];
354
+ Object.assign(config, next);
355
+ system.forget();
356
+ reload(`${VIRTUAL}/env`);
357
+ reload(`${VIRTUAL}/system`);
358
+ redraw(changed_parts_1.ALL_PARTS);
359
+ };
360
+ const reloadFlows = () => {
361
+ thumbs.clear();
362
+ shots.clear();
363
+ events.signal('flows');
364
+ };
365
+ const signalLists = (file) => {
366
+ if (isInside(callsRoot, file))
367
+ events.signal('calls');
368
+ else if (isSketchFile(designRoot, file))
369
+ events.signal('sketches');
370
+ };
371
+ const isSystemFile = (file) => !isInside(callsRoot, file) &&
372
+ !isSketchFile(designRoot, file) &&
373
+ [designRoot, ...baseDirs].some((dir) => isInside(dir, file));
374
+ const refresh = (file) => {
375
+ if ((0, path_1.resolve)(file) === configPath)
376
+ return reloadConfig();
377
+ if (isCommentFile(file))
378
+ return events.signal('comments');
379
+ if (isNoteFile(file))
380
+ return events.signal('notes');
381
+ if (isFlowFile(file))
382
+ return reloadFlows();
383
+ forgetCalls(file);
384
+ signalLists(file);
385
+ if ((0, vite_paths_1.isCallFile)({ callsRoot, file }))
386
+ return reload(VIRTUAL);
387
+ if (isDecisionFile(file))
388
+ return;
389
+ if (isInside(callsRoot, file) || ![designRoot, ...baseDirs].some((dir) => isInside(dir, file)))
390
+ return;
391
+ system.forget();
392
+ unresolveParts();
393
+ reload(`${VIRTUAL}/env`);
394
+ reload(`${VIRTUAL}/system`);
395
+ redraw((0, changed_parts_1.addedPartsOf)({ designRoot, baseDirs, system, file: (0, path_1.resolve)(file) }));
396
+ };
397
+ const change = (file) => {
398
+ var _a;
399
+ if ((0, path_1.resolve)(file) === configPath)
400
+ return reloadConfig();
401
+ if (isCommentFile(file))
402
+ return events.signal('comments');
403
+ if (isNoteFile(file))
404
+ return events.signal('notes');
405
+ if (isFlowFile(file))
406
+ return reloadFlows();
407
+ forgetCalls(file);
408
+ signalLists(file);
409
+ const dependents = (0, shot_1.dependentIdsOf)((_a = vite.moduleGraph.getModulesByFile(file)) !== null && _a !== void 0 ? _a : [], stylesheetImports);
410
+ redraw((0, changed_parts_1.changedPartsOf)({ target, config, system, file, dependents }), isSystemFile(file));
411
+ };
412
+ const answer = (handle) => (request, response) => {
413
+ var _a;
414
+ return void handle(new URL((_a = request.url) !== null && _a !== void 0 ? _a : '', 'http://localhost'), request).then((answered) => sendJson(response, answered), (error) => sendJson(response, {
415
+ status: 500,
416
+ body: { error: error instanceof Error ? error.message : String(error) },
417
+ }));
418
+ };
419
+ vite.middlewares.use(stamp_1.STAMP_PATH, (_request, response) => {
420
+ response.setHeader('content-type', 'application/json');
421
+ response.end(JSON.stringify(stamp));
405
422
  });
406
- })));
407
- vite.middlewares.use(legacy_1.TRANSFER_PATH, answer((url, request) => __awaiter(void 0, void 0, void 0, function* () {
408
- var _a;
409
- if (request.method !== 'POST')
410
- return { status: 405, body: { error: 'POST only' } };
411
- const result = (0, legacy_1.markTransferred)({ target, slug: (_a = url.searchParams.get('call')) !== null && _a !== void 0 ? _a : '' });
412
- const status = result === 'missing' ? 404 : result === 'unreadable' ? 422 : 200;
413
- return { status, body: { result } };
414
- })));
415
- const studio = (path, handle) => vite.middlewares.use(path, answer((url, request) => __awaiter(void 0, void 0, void 0, function* () {
416
- return handle({
417
- target,
418
- url,
419
- request,
420
- load: ({ file, product, sketch }) => vite.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product, sketch })),
421
- pictureOf: shots.pictureOf,
422
- boxOf: shots.changedBoxOf,
423
+ vite.middlewares.use(render_1.RENDER_PATH, (0, render_1.renderMiddleware)(renderer));
424
+ vite.middlewares.use(render_1.FORCE_PATH, render_1.forceMiddleware);
425
+ vite.middlewares.use(thumb_1.THUMB_PATH, thumbs.middleware);
426
+ vite.middlewares.use(shot_1.SHOT_PATH, shots.middleware);
427
+ vite.middlewares.use(list_system_1.SYSTEM_PATH, answer((url) => __awaiter(void 0, void 0, void 0, function* () {
428
+ var _a;
429
+ const asked = url.searchParams.get('product');
430
+ if (asked && !((_a = config.products) === null || _a === void 0 ? void 0 : _a[asked]))
431
+ return { status: 404, body: { error: `no product "${asked}"` } };
432
+ const products = yield (0, list_system_1.listSystem)({
433
+ target,
434
+ system,
435
+ products: asked ? [asked] : system.products(),
436
+ load: ({ file, product }) => vite.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product })),
437
+ });
438
+ return { status: 200, body: products };
439
+ })));
440
+ vite.middlewares.use(product_command_1.PRODUCT_PATH, answer((_url, request) => __awaiter(void 0, void 0, void 0, function* () {
441
+ const created = yield (0, product_command_1.newProductAnswer)({ target, request });
442
+ if (created.status === 201)
443
+ reloadConfig();
444
+ return created;
445
+ })));
446
+ vite.middlewares.use(calls_1.CALLS_PATH, answer(() => __awaiter(void 0, void 0, void 0, function* () {
447
+ return ({
448
+ status: 200,
449
+ body: yield (0, calls_1.listCalls)({ target, load: (file) => vite.ssrLoadModule(file) }),
450
+ });
451
+ })));
452
+ vite.middlewares.use(legacy_1.TRANSFER_PATH, answer((url, request) => __awaiter(void 0, void 0, void 0, function* () {
453
+ var _a;
454
+ if (request.method !== 'POST')
455
+ return { status: 405, body: { error: 'POST only' } };
456
+ const result = (0, legacy_1.markTransferred)({ target, slug: (_a = url.searchParams.get('call')) !== null && _a !== void 0 ? _a : '' });
457
+ const status = result === 'missing' ? 404 : result === 'unreadable' ? 422 : 200;
458
+ return { status, body: { result } };
459
+ })));
460
+ const studio = (path, handle) => vite.middlewares.use(path, answer((url, request) => __awaiter(void 0, void 0, void 0, function* () {
461
+ return handle({
462
+ target,
463
+ url,
464
+ request,
465
+ load: ({ file, product, sketch }) => vite.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product, sketch })),
466
+ pictureOf: shots.pictureOf,
467
+ boxOf: shots.changedBoxesOf,
468
+ });
469
+ })));
470
+ studio(studio_api_1.SKETCHES_PATH, studio_api_1.sketchesAnswer);
471
+ studio(studio_api_1.SKETCH_PREVIEW_PATH, studio_api_1.sketchPreviewAnswer);
472
+ studio(studio_api_1.SKETCH_COMPARE_PATH, studio_api_1.sketchCompareAnswer);
473
+ studio(studio_api_1.SKETCH_DIFF_PATH, studio_api_1.sketchDiffAnswer);
474
+ studio(studio_api_1.SKETCH_CROP_PATH, studio_api_1.sketchCropAnswer);
475
+ studio(studio_api_1.SKETCH_DECISION_PATH, studio_api_1.sketchDecisionAnswer);
476
+ studio(studio_api_1.SKETCH_MERGE_PATH, studio_api_1.sketchMergeAnswer);
477
+ studio(studio_api_1.SKETCH_DISCARD_PATH, studio_api_1.sketchDiscardAnswer);
478
+ studio(studio_api_1.COMMENTS_PATH, studio_api_1.commentsAnswer);
479
+ studio(studio_api_1.COMMENT_PATH, studio_api_1.commentAnswer);
480
+ studio(studio_api_1.COMMENT_DONE_PATH, studio_api_1.commentDoneAnswer);
481
+ studio(studio_api_1.COMMENT_WITHDRAW_PATH, studio_api_1.commentWithdrawAnswer);
482
+ studio(studio_api_1.COMMENT_REPLY_PATH, studio_api_1.commentReplyAnswer);
483
+ studio(studio_api_1.FLOWS_PATH, studio_api_1.flowsAnswer);
484
+ studio(studio_api_1.NOTES_PATH, studio_api_1.notesAnswer);
485
+ studio(studio_api_1.NOTE_PATH, studio_api_1.noteAnswer);
486
+ studio(studio_api_1.NOTE_CHANGE_PATH, studio_api_1.noteChangeAnswer);
487
+ studio(studio_api_1.NOTE_DELETE_PATH, studio_api_1.noteDeleteAnswer);
488
+ studio(studio_api_1.FLOW_NOTE_PATH, studio_api_1.flowNoteAnswer);
489
+ studio(studio_api_1.FLOW_NOTE_CHANGE_PATH, studio_api_1.flowNoteChangeAnswer);
490
+ studio(studio_api_1.FLOW_NOTE_DELETE_PATH, studio_api_1.flowNoteDeleteAnswer);
491
+ vite.middlewares.use(studio_api_1.COMMENT_EVENTS_PATH, events.middleware);
492
+ (_c = vite.httpServer) === null || _c === void 0 ? void 0 : _c.on('close', () => {
493
+ events.close();
494
+ void Promise.all([thumbs.close(), shots.close()]);
423
495
  });
424
- })));
425
- studio(studio_api_1.SKETCHES_PATH, studio_api_1.sketchesAnswer);
426
- studio(studio_api_1.SKETCH_PREVIEW_PATH, studio_api_1.sketchPreviewAnswer);
427
- studio(studio_api_1.SKETCH_COMPARE_PATH, studio_api_1.sketchCompareAnswer);
428
- studio(studio_api_1.SKETCH_DIFF_PATH, studio_api_1.sketchDiffAnswer);
429
- studio(studio_api_1.SKETCH_DECISION_PATH, studio_api_1.sketchDecisionAnswer);
430
- studio(studio_api_1.SKETCH_MERGE_PATH, studio_api_1.sketchMergeAnswer);
431
- studio(studio_api_1.SKETCH_DISCARD_PATH, studio_api_1.sketchDiscardAnswer);
432
- studio(studio_api_1.COMMENTS_PATH, studio_api_1.commentsAnswer);
433
- studio(studio_api_1.COMMENT_PATH, studio_api_1.commentAnswer);
434
- studio(studio_api_1.COMMENT_DONE_PATH, studio_api_1.commentDoneAnswer);
435
- studio(studio_api_1.COMMENT_WITHDRAW_PATH, studio_api_1.commentWithdrawAnswer);
436
- studio(studio_api_1.COMMENT_REPLY_PATH, studio_api_1.commentReplyAnswer);
437
- studio(studio_api_1.FLOWS_PATH, studio_api_1.flowsAnswer);
438
- studio(studio_api_1.NOTES_PATH, studio_api_1.notesAnswer);
439
- studio(studio_api_1.NOTE_PATH, studio_api_1.noteAnswer);
440
- studio(studio_api_1.NOTE_CHANGE_PATH, studio_api_1.noteChangeAnswer);
441
- studio(studio_api_1.NOTE_DELETE_PATH, studio_api_1.noteDeleteAnswer);
442
- studio(studio_api_1.FLOW_NOTE_PATH, studio_api_1.flowNoteAnswer);
443
- studio(studio_api_1.FLOW_NOTE_CHANGE_PATH, studio_api_1.flowNoteChangeAnswer);
444
- studio(studio_api_1.FLOW_NOTE_DELETE_PATH, studio_api_1.flowNoteDeleteAnswer);
445
- vite.middlewares.use(studio_api_1.COMMENT_EVENTS_PATH, events.middleware);
446
- (_c = vite.httpServer) === null || _c === void 0 ? void 0 : _c.on('close', () => {
447
- events.close();
448
- void Promise.all([thumbs.close(), shots.close()]);
449
- });
450
- vite.watcher.add([designRoot, ...baseDirs]);
451
- vite.watcher.on('add', refresh);
452
- vite.watcher.on('unlink', refresh);
453
- vite.watcher.on('change', change);
454
- },
455
- });
496
+ vite.watcher.add([designRoot, ...baseDirs]);
497
+ vite.watcher.on('add', refresh);
498
+ vite.watcher.on('unlink', refresh);
499
+ vite.watcher.on('change', change);
500
+ },
501
+ closeBundle: () => renderer.close(),
502
+ };
503
+ };
456
504
  const freePortOf = () => new Promise((resolvePort, reject) => {
457
505
  const probe = (0, net_1.createServer)();
458
506
  probe.once('error', reject);
@@ -480,6 +528,7 @@ const createDesignServer = (options) => __awaiter(void 0, void 0, void 0, functi
480
528
  const { default: tailwind } = yield import('@tailwindcss/postcss');
481
529
  const here = (0, paths_1.assetRoot)();
482
530
  const system = (0, system_modules_1.createSystemModules)({ target, config, sketchesRoot });
531
+ const generatedStylesheetsOf = (0, generated_stylesheets_1.createGeneratedStylesheets)({ target, config, system });
483
532
  if (listen) {
484
533
  for (const name of system.products()) {
485
534
  const product = system.productOf(name);
@@ -488,10 +537,24 @@ const createDesignServer = (options) => __awaiter(void 0, void 0, void 0, functi
488
537
  }
489
538
  }
490
539
  const baseDirs = system.products().flatMap((name) => { var _a, _b, _c; return (_c = (_b = (_a = system.productOf(name)) === null || _a === void 0 ? void 0 : _a.base) === null || _b === void 0 ? void 0 : _b.dir) !== null && _c !== void 0 ? _c : []; });
540
+ const stylesheetImports = new Map();
491
541
  const server = yield createServer(Object.assign(Object.assign(Object.assign({ configFile: false, root: (0, path_1.resolve)(here, 'web'),
492
542
  // Every drawing is ruled under Tailwind 4, whatever the checkout installs. The tool brings its
493
543
  // own pipeline so no checkout's postcss config reaches a drawing.
494
- css: { postcss: { plugins: [tailwind(), (0, force_interactions_1.forceInteractionsPlugin)()] } }, cacheDir: (0, paths_1.viteCacheOf)(target, own ? 'vite-check' : 'vite'), resolve: {
544
+ css: {
545
+ postcss: {
546
+ plugins: [
547
+ (0, sketch_stylesheets_1.sketchStylesheetsPlugin)((id) => {
548
+ var _a;
549
+ const drawn = { product: (_a = (0, system_modules_1.productOfModuleId)(id)) !== null && _a !== void 0 ? _a : '', sketch: (0, system_modules_1.sketchOfModuleId)(id) };
550
+ return generatedStylesheetsOf(drawn).then((generated) => new Map([...system.replacedStylesheetsOf(drawn), ...generated]));
551
+ }),
552
+ tailwind(),
553
+ (0, force_interactions_1.forceInteractionsPlugin)(),
554
+ (0, shot_1.stylesheetImportsPlugin)(stylesheetImports),
555
+ ],
556
+ },
557
+ }, cacheDir: (0, paths_1.viteCacheOf)(target, own ? 'vite-check' : 'vite'), resolve: {
495
558
  alias: [
496
559
  { find: /^@design-explore$/, replacement: (0, path_1.resolve)(here, 'define-call.ts') },
497
560
  { find: new RegExp(`^${system_tsconfig_1.DESIGN_SYSTEM_SPECIFIER}$`), replacement: (0, path_1.resolve)(here, 'define-part.ts') },
@@ -501,7 +564,7 @@ const createDesignServer = (options) => __awaiter(void 0, void 0, void 0, functi
501
564
  },
502
565
  // A design mock ships as TS that imports CSS with `?inline`, which the dependency pre-bundler
503
566
  // can not load.
504
- optimizeDeps: { exclude: ['@ethlete/components', '@ethlete/core'] }, plugins: [designExplore({ target, config, system })] }, (listen ? {} : { appType: 'custom' })), (listen && !own ? {} : { logLevel: 'error' })), { server: Object.assign(Object.assign({
567
+ optimizeDeps: { exclude: ['@ethlete/components', '@ethlete/core'] }, plugins: [designExplore({ target, config, system, stylesheetImports })] }, (listen ? {} : { appType: 'custom' })), (listen && !own ? {} : { logLevel: 'error' })), { server: Object.assign(Object.assign({
505
568
  // Studio swaps a frame for a fresh one once it has painted; a Vite reload would blank every frame at once.
506
569
  hmr: false }, (listen
507
570
  ? Object.assign(Object.assign(Object.assign({ port: port !== null && port !== void 0 ? port : (0, paths_1.portOf)(config) }, (host ? { host } : {})), { strictPort: true }), (own ? { watch: null } : {})) : { middlewareMode: true, ws: false, watch: null })), {