@tscircuit/curvy-trace-solver 0.0.2 → 0.0.4
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.
- package/dist/index.js +3 -163
- package/package.json +6 -1
- package/.claude/settings.local.json +0 -16
- package/biome.json +0 -96
- package/bunfig.toml +0 -5
- package/cosmos.config.json +0 -5
- package/cosmos.decorator.tsx +0 -21
- package/fixtures/basics/basics01-input.json +0 -15
- package/fixtures/basics/basics01.fixture.tsx +0 -11
- package/fixtures/problem-generator.fixture.tsx +0 -50
- package/index.html +0 -12
- package/lib/CurvyTraceSolver.ts +0 -775
- package/lib/geometry/getObstacleOuterSegments.ts +0 -25
- package/lib/geometry/index.ts +0 -8
- package/lib/index.ts +0 -2
- package/lib/problem-generator/countChordCrossings.ts +0 -119
- package/lib/problem-generator/createRng.ts +0 -13
- package/lib/problem-generator/generateRandomProblem.ts +0 -225
- package/lib/problem-generator/index.ts +0 -1
- package/lib/problem-generator/randomBoundaryPoint.ts +0 -30
- package/lib/problem-generator/wouldCrossAny.ts +0 -16
- package/lib/sampleTraceIntoSegments.ts +0 -62
- package/lib/scoreOutputCost.ts +0 -116
- package/lib/types.ts +0 -35
- package/lib/visualization-utils/index.ts +0 -14
- package/lib/visualization-utils/visualizeCurvyTraceProblem.ts +0 -66
- package/scripts/benchmarks/run-benchmark.ts +0 -85
- package/tests/__snapshots__/svg.snap.svg +0 -3
- package/tests/basics/__snapshots__/basics01.snap.svg +0 -44
- package/tests/basics/basics01.test.ts +0 -12
- package/tests/fixtures/preload.ts +0 -1
- package/tests/svg.test.ts +0 -12
- package/tsconfig.json +0 -35
package/dist/index.js
CHANGED
|
@@ -201,169 +201,9 @@ var require_deep_rename_keys = __commonJS({
|
|
|
201
201
|
}
|
|
202
202
|
});
|
|
203
203
|
|
|
204
|
-
// node_modules/
|
|
204
|
+
// node_modules/eventemitter3/index.js
|
|
205
205
|
var require_eventemitter3 = __commonJS({
|
|
206
|
-
"node_modules/
|
|
207
|
-
"use strict";
|
|
208
|
-
var has = Object.prototype.hasOwnProperty;
|
|
209
|
-
var prefix = "~";
|
|
210
|
-
function Events() {
|
|
211
|
-
}
|
|
212
|
-
if (Object.create) {
|
|
213
|
-
Events.prototype = /* @__PURE__ */ Object.create(null);
|
|
214
|
-
if (!new Events().__proto__) prefix = false;
|
|
215
|
-
}
|
|
216
|
-
function EE(fn, context, once) {
|
|
217
|
-
this.fn = fn;
|
|
218
|
-
this.context = context;
|
|
219
|
-
this.once = once || false;
|
|
220
|
-
}
|
|
221
|
-
function EventEmitter() {
|
|
222
|
-
this._events = new Events();
|
|
223
|
-
this._eventsCount = 0;
|
|
224
|
-
}
|
|
225
|
-
EventEmitter.prototype.eventNames = function eventNames() {
|
|
226
|
-
var names = [], events, name;
|
|
227
|
-
if (this._eventsCount === 0) return names;
|
|
228
|
-
for (name in events = this._events) {
|
|
229
|
-
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
|
230
|
-
}
|
|
231
|
-
if (Object.getOwnPropertySymbols) {
|
|
232
|
-
return names.concat(Object.getOwnPropertySymbols(events));
|
|
233
|
-
}
|
|
234
|
-
return names;
|
|
235
|
-
};
|
|
236
|
-
EventEmitter.prototype.listeners = function listeners(event, exists) {
|
|
237
|
-
var evt = prefix ? prefix + event : event, available = this._events[evt];
|
|
238
|
-
if (exists) return !!available;
|
|
239
|
-
if (!available) return [];
|
|
240
|
-
if (available.fn) return [available.fn];
|
|
241
|
-
for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {
|
|
242
|
-
ee[i] = available[i].fn;
|
|
243
|
-
}
|
|
244
|
-
return ee;
|
|
245
|
-
};
|
|
246
|
-
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
|
247
|
-
var evt = prefix ? prefix + event : event;
|
|
248
|
-
if (!this._events[evt]) return false;
|
|
249
|
-
var listeners = this._events[evt], len = arguments.length, args, i;
|
|
250
|
-
if (listeners.fn) {
|
|
251
|
-
if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
|
|
252
|
-
switch (len) {
|
|
253
|
-
case 1:
|
|
254
|
-
return listeners.fn.call(listeners.context), true;
|
|
255
|
-
case 2:
|
|
256
|
-
return listeners.fn.call(listeners.context, a1), true;
|
|
257
|
-
case 3:
|
|
258
|
-
return listeners.fn.call(listeners.context, a1, a2), true;
|
|
259
|
-
case 4:
|
|
260
|
-
return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
|
261
|
-
case 5:
|
|
262
|
-
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
|
263
|
-
case 6:
|
|
264
|
-
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
|
265
|
-
}
|
|
266
|
-
for (i = 1, args = new Array(len - 1); i < len; i++) {
|
|
267
|
-
args[i - 1] = arguments[i];
|
|
268
|
-
}
|
|
269
|
-
listeners.fn.apply(listeners.context, args);
|
|
270
|
-
} else {
|
|
271
|
-
var length = listeners.length, j;
|
|
272
|
-
for (i = 0; i < length; i++) {
|
|
273
|
-
if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
|
|
274
|
-
switch (len) {
|
|
275
|
-
case 1:
|
|
276
|
-
listeners[i].fn.call(listeners[i].context);
|
|
277
|
-
break;
|
|
278
|
-
case 2:
|
|
279
|
-
listeners[i].fn.call(listeners[i].context, a1);
|
|
280
|
-
break;
|
|
281
|
-
case 3:
|
|
282
|
-
listeners[i].fn.call(listeners[i].context, a1, a2);
|
|
283
|
-
break;
|
|
284
|
-
case 4:
|
|
285
|
-
listeners[i].fn.call(listeners[i].context, a1, a2, a3);
|
|
286
|
-
break;
|
|
287
|
-
default:
|
|
288
|
-
if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
|
|
289
|
-
args[j - 1] = arguments[j];
|
|
290
|
-
}
|
|
291
|
-
listeners[i].fn.apply(listeners[i].context, args);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
return true;
|
|
296
|
-
};
|
|
297
|
-
EventEmitter.prototype.on = function on(event, fn, context) {
|
|
298
|
-
var listener = new EE(fn, context || this), evt = prefix ? prefix + event : event;
|
|
299
|
-
if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;
|
|
300
|
-
else if (!this._events[evt].fn) this._events[evt].push(listener);
|
|
301
|
-
else this._events[evt] = [this._events[evt], listener];
|
|
302
|
-
return this;
|
|
303
|
-
};
|
|
304
|
-
EventEmitter.prototype.once = function once(event, fn, context) {
|
|
305
|
-
var listener = new EE(fn, context || this, true), evt = prefix ? prefix + event : event;
|
|
306
|
-
if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;
|
|
307
|
-
else if (!this._events[evt].fn) this._events[evt].push(listener);
|
|
308
|
-
else this._events[evt] = [this._events[evt], listener];
|
|
309
|
-
return this;
|
|
310
|
-
};
|
|
311
|
-
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
|
312
|
-
var evt = prefix ? prefix + event : event;
|
|
313
|
-
if (!this._events[evt]) return this;
|
|
314
|
-
if (!fn) {
|
|
315
|
-
if (--this._eventsCount === 0) this._events = new Events();
|
|
316
|
-
else delete this._events[evt];
|
|
317
|
-
return this;
|
|
318
|
-
}
|
|
319
|
-
var listeners = this._events[evt];
|
|
320
|
-
if (listeners.fn) {
|
|
321
|
-
if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
|
|
322
|
-
if (--this._eventsCount === 0) this._events = new Events();
|
|
323
|
-
else delete this._events[evt];
|
|
324
|
-
}
|
|
325
|
-
} else {
|
|
326
|
-
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
|
327
|
-
if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
|
|
328
|
-
events.push(listeners[i]);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
|
|
332
|
-
else if (--this._eventsCount === 0) this._events = new Events();
|
|
333
|
-
else delete this._events[evt];
|
|
334
|
-
}
|
|
335
|
-
return this;
|
|
336
|
-
};
|
|
337
|
-
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
|
338
|
-
var evt;
|
|
339
|
-
if (event) {
|
|
340
|
-
evt = prefix ? prefix + event : event;
|
|
341
|
-
if (this._events[evt]) {
|
|
342
|
-
if (--this._eventsCount === 0) this._events = new Events();
|
|
343
|
-
else delete this._events[evt];
|
|
344
|
-
}
|
|
345
|
-
} else {
|
|
346
|
-
this._events = new Events();
|
|
347
|
-
this._eventsCount = 0;
|
|
348
|
-
}
|
|
349
|
-
return this;
|
|
350
|
-
};
|
|
351
|
-
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
|
352
|
-
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
|
353
|
-
EventEmitter.prototype.setMaxListeners = function setMaxListeners() {
|
|
354
|
-
return this;
|
|
355
|
-
};
|
|
356
|
-
EventEmitter.prefixed = prefix;
|
|
357
|
-
EventEmitter.EventEmitter = EventEmitter;
|
|
358
|
-
if ("undefined" !== typeof module) {
|
|
359
|
-
module.exports = EventEmitter;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
// node_modules/xml-lexer/node_modules/eventemitter3/index.js
|
|
365
|
-
var require_eventemitter32 = __commonJS({
|
|
366
|
-
"node_modules/xml-lexer/node_modules/eventemitter3/index.js"(exports, module) {
|
|
206
|
+
"node_modules/eventemitter3/index.js"(exports, module) {
|
|
367
207
|
"use strict";
|
|
368
208
|
var has = Object.prototype.hasOwnProperty;
|
|
369
209
|
var prefix = "~";
|
|
@@ -533,7 +373,7 @@ var require_lexer = __commonJS({
|
|
|
533
373
|
}
|
|
534
374
|
return obj;
|
|
535
375
|
}
|
|
536
|
-
var EventEmitter =
|
|
376
|
+
var EventEmitter = require_eventemitter3();
|
|
537
377
|
var noop = function noop2() {
|
|
538
378
|
};
|
|
539
379
|
var State = {
|
package/package.json
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tscircuit/curvy-trace-solver",
|
|
3
3
|
"main": "dist/index.js",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"start": "cosmos",
|
|
8
|
+
"format": "biome format --write .",
|
|
9
|
+
"format:check": "biome format .",
|
|
8
10
|
"build": "tsup ./lib/index.ts --format esm --dts",
|
|
9
11
|
"build:site": "cosmos-export"
|
|
10
12
|
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
11
16
|
"devDependencies": {
|
|
12
17
|
"@biomejs/biome": "^2.3.11",
|
|
13
18
|
"@tscircuit/hypergraph": "^0.0.11",
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(npx tsc:*)",
|
|
5
|
-
"mcp__ide__getDiagnostics",
|
|
6
|
-
"Bash(xargs:*)",
|
|
7
|
-
"Bash(npx tsx:*)",
|
|
8
|
-
"Bash(npm run benchmark:*)",
|
|
9
|
-
"Bash(for i in 1 2 3)",
|
|
10
|
-
"Bash(do echo \"Run $i:\")",
|
|
11
|
-
"Bash(done)",
|
|
12
|
-
"Bash(UPDATE_SNAPSHOTS=1 bun test:*)",
|
|
13
|
-
"Bash(BUN_UPDATE_SNAPSHOTS=true bun test:*)"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
16
|
-
}
|
package/biome.json
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/2.0.0/schema.json",
|
|
3
|
-
"assist": { "actions": { "source": { "organizeImports": "on" } } },
|
|
4
|
-
"formatter": {
|
|
5
|
-
"enabled": true,
|
|
6
|
-
"indentStyle": "space"
|
|
7
|
-
},
|
|
8
|
-
"files": {
|
|
9
|
-
"includes": ["**", "!**/cosmos-export", "!**/dist", "!**/package.json"]
|
|
10
|
-
},
|
|
11
|
-
"javascript": {
|
|
12
|
-
"formatter": {
|
|
13
|
-
"jsxQuoteStyle": "double",
|
|
14
|
-
"quoteProperties": "asNeeded",
|
|
15
|
-
"trailingCommas": "all",
|
|
16
|
-
"semicolons": "asNeeded",
|
|
17
|
-
"arrowParentheses": "always",
|
|
18
|
-
"bracketSpacing": true,
|
|
19
|
-
"bracketSameLine": false
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"linter": {
|
|
23
|
-
"enabled": true,
|
|
24
|
-
"rules": {
|
|
25
|
-
"recommended": true,
|
|
26
|
-
"suspicious": {
|
|
27
|
-
"noExplicitAny": "off"
|
|
28
|
-
},
|
|
29
|
-
"complexity": {
|
|
30
|
-
"noForEach": "error",
|
|
31
|
-
"useLiteralKeys": "off"
|
|
32
|
-
},
|
|
33
|
-
"correctness": {
|
|
34
|
-
"useExhaustiveDependencies": "off"
|
|
35
|
-
},
|
|
36
|
-
"a11y": {
|
|
37
|
-
"noAccessKey": "off",
|
|
38
|
-
"noAriaHiddenOnFocusable": "off",
|
|
39
|
-
"noAriaUnsupportedElements": "off",
|
|
40
|
-
"noAutofocus": "off",
|
|
41
|
-
"noDistractingElements": "off",
|
|
42
|
-
"noHeaderScope": "off",
|
|
43
|
-
"noInteractiveElementToNoninteractiveRole": "off",
|
|
44
|
-
"noLabelWithoutControl": "off",
|
|
45
|
-
"noNoninteractiveElementToInteractiveRole": "off",
|
|
46
|
-
"noNoninteractiveTabindex": "off",
|
|
47
|
-
"noPositiveTabindex": "off",
|
|
48
|
-
"noRedundantAlt": "off",
|
|
49
|
-
"noRedundantRoles": "off",
|
|
50
|
-
"noStaticElementInteractions": "off",
|
|
51
|
-
"noSvgWithoutTitle": "off",
|
|
52
|
-
"useAltText": "off",
|
|
53
|
-
"useAnchorContent": "off",
|
|
54
|
-
"useAriaActivedescendantWithTabindex": "off",
|
|
55
|
-
"useAriaPropsForRole": "off",
|
|
56
|
-
"useAriaPropsSupportedByRole": "off",
|
|
57
|
-
"useButtonType": "off",
|
|
58
|
-
"useFocusableInteractive": "off",
|
|
59
|
-
"useHeadingContent": "off",
|
|
60
|
-
"useHtmlLang": "off",
|
|
61
|
-
"useIframeTitle": "off",
|
|
62
|
-
"useKeyWithClickEvents": "off",
|
|
63
|
-
"useKeyWithMouseEvents": "off",
|
|
64
|
-
"useMediaCaption": "off",
|
|
65
|
-
"useSemanticElements": "off",
|
|
66
|
-
"useValidAnchor": "off",
|
|
67
|
-
"useValidAriaProps": "off",
|
|
68
|
-
"useValidAriaRole": "off",
|
|
69
|
-
"useValidAriaValues": "off",
|
|
70
|
-
"useValidAutocomplete": "off",
|
|
71
|
-
"useValidLang": "off"
|
|
72
|
-
},
|
|
73
|
-
"style": {
|
|
74
|
-
"useSingleVarDeclarator": "error",
|
|
75
|
-
"noParameterAssign": "off",
|
|
76
|
-
"noUselessElse": "off",
|
|
77
|
-
"noNonNullAssertion": "off",
|
|
78
|
-
"useNumberNamespace": "off",
|
|
79
|
-
"noUnusedTemplateLiteral": "off",
|
|
80
|
-
"useFilenamingConvention": {
|
|
81
|
-
"level": "error",
|
|
82
|
-
"options": {
|
|
83
|
-
"strictCase": true,
|
|
84
|
-
"requireAscii": true,
|
|
85
|
-
"filenameCases": ["kebab-case", "export"]
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
"useAsConstAssertion": "error",
|
|
89
|
-
"useDefaultParameterLast": "error",
|
|
90
|
-
"useEnumInitializers": "error",
|
|
91
|
-
"useSelfClosingElements": "error",
|
|
92
|
-
"noInferrableTypes": "error"
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
package/bunfig.toml
DELETED
package/cosmos.config.json
DELETED
package/cosmos.decorator.tsx
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import React, { useEffect } from "react"
|
|
2
|
-
|
|
3
|
-
export const TailwindDecorator = ({
|
|
4
|
-
children,
|
|
5
|
-
}: {
|
|
6
|
-
children: React.ReactNode
|
|
7
|
-
}) => {
|
|
8
|
-
useEffect(() => {
|
|
9
|
-
const script = document.createElement("script")
|
|
10
|
-
script.src = "https://cdn.tailwindcss.com"
|
|
11
|
-
document.head.appendChild(script)
|
|
12
|
-
|
|
13
|
-
return () => {
|
|
14
|
-
document.head.removeChild(script)
|
|
15
|
-
}
|
|
16
|
-
}, [])
|
|
17
|
-
|
|
18
|
-
return <>{children}</>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export default TailwindDecorator
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"bounds": { "minX": 0, "minY": 0, "maxX": 100, "maxY": 100 },
|
|
3
|
-
"waypointPairs": [
|
|
4
|
-
{
|
|
5
|
-
"start": { "x": 0, "y": 10 },
|
|
6
|
-
"end": { "x": 100, "y": 80 }
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"start": { "x": 0, "y": 20 },
|
|
10
|
-
"end": { "x": 100, "y": 90 }
|
|
11
|
-
}
|
|
12
|
-
],
|
|
13
|
-
"obstacles": [],
|
|
14
|
-
"preferredSpacing": 25
|
|
15
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { GenericSolverDebugger } from "@tscircuit/solver-utils/react"
|
|
2
|
-
import type { CurvyTraceProblem } from "../../lib/types"
|
|
3
|
-
import { CurvyTraceSolver } from "../../lib/CurvyTraceSolver"
|
|
4
|
-
import problem from "./basics01-input.json"
|
|
5
|
-
export default () => {
|
|
6
|
-
return (
|
|
7
|
-
<GenericSolverDebugger
|
|
8
|
-
createSolver={() => new CurvyTraceSolver(problem as CurvyTraceProblem)}
|
|
9
|
-
/>
|
|
10
|
-
)
|
|
11
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { useState, useMemo } from "react"
|
|
2
|
-
import { GenericSolverDebugger } from "@tscircuit/solver-utils/react"
|
|
3
|
-
import { generateRandomProblem } from "../lib/problem-generator"
|
|
4
|
-
import { CurvyTraceSolver } from "../lib/CurvyTraceSolver"
|
|
5
|
-
import type { CurvyTraceProblem } from "../lib/types"
|
|
6
|
-
|
|
7
|
-
export default () => {
|
|
8
|
-
const [randomSeed, setRandomSeed] = useState(1)
|
|
9
|
-
const [numWaypointPairs, setNumWaypointPairs] = useState(5)
|
|
10
|
-
|
|
11
|
-
const problem = useMemo(() => {
|
|
12
|
-
return generateRandomProblem({
|
|
13
|
-
randomSeed,
|
|
14
|
-
numWaypointPairs,
|
|
15
|
-
numObstacles: 3,
|
|
16
|
-
minSpacing: 5,
|
|
17
|
-
})
|
|
18
|
-
}, [randomSeed, numWaypointPairs])
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<div style={{ padding: 16 }}>
|
|
22
|
-
<div style={{ marginBottom: 16, display: "flex", gap: 16 }}>
|
|
23
|
-
<label>
|
|
24
|
-
Random Seed:{" "}
|
|
25
|
-
<input
|
|
26
|
-
type="number"
|
|
27
|
-
value={randomSeed}
|
|
28
|
-
onChange={(e) => setRandomSeed(Number(e.target.value))}
|
|
29
|
-
style={{ width: 80 }}
|
|
30
|
-
/>
|
|
31
|
-
</label>
|
|
32
|
-
<label>
|
|
33
|
-
Waypoint Pairs:{" "}
|
|
34
|
-
<input
|
|
35
|
-
type="number"
|
|
36
|
-
value={numWaypointPairs}
|
|
37
|
-
onChange={(e) => setNumWaypointPairs(Number(e.target.value))}
|
|
38
|
-
style={{ width: 80 }}
|
|
39
|
-
min={1}
|
|
40
|
-
max={20}
|
|
41
|
-
/>
|
|
42
|
-
</label>
|
|
43
|
-
</div>
|
|
44
|
-
<GenericSolverDebugger
|
|
45
|
-
key={`${randomSeed}-${numWaypointPairs}`}
|
|
46
|
-
createSolver={() => new CurvyTraceSolver(problem as CurvyTraceProblem)}
|
|
47
|
-
/>
|
|
48
|
-
</div>
|
|
49
|
-
)
|
|
50
|
-
}
|
package/index.html
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>React Cosmos Vite Renderer</title>
|
|
7
|
-
</head>
|
|
8
|
-
<body>
|
|
9
|
-
<div id="root"></div>
|
|
10
|
-
<script type="module" src="/src/main.tsx"></script>
|
|
11
|
-
</body>
|
|
12
|
-
</html>
|