create-atom.io 0.0.1 → 0.0.2
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/{create-atom-BV6WVRvY.js → create-atom-DOkiQlT8.js} +27 -11
- package/dist/create-atom-DOkiQlT8.js.map +1 -0
- package/dist/create-atom.d.ts +5 -2
- package/dist/create-atom.d.ts.map +1 -1
- package/dist/create-atom.js +1 -1
- package/dist/create-atom.x.js +8 -1
- package/dist/create-atom.x.js.map +1 -1
- package/package.json +1 -3
- package/src/create-atom.ts +28 -5
- package/src/create-atom.x.ts +7 -0
- package/templates/{base → preact-svg-editor}/eslint.config.ts +4 -3
- package/templates/preact-svg-editor/eslint.d.ts +31 -0
- package/templates/preact-svg-editor/node_modules/.bin/vite +21 -0
- package/templates/{base → preact-svg-editor}/package.json +1 -1
- package/templates/{base → preact-svg-editor}/src/BezierPlayground.tsx +157 -147
- package/templates/{base → preact-svg-editor}/src/index.tsx +6 -4
- package/templates/{base → preact-svg-editor}/vite.config.ts +2 -1
- package/templates/react-node-backend/.turbo/turbo-build.log +12 -0
- package/templates/react-node-backend/README.md +75 -0
- package/templates/react-node-backend/_gitignore +24 -0
- package/templates/react-node-backend/dist/assets/index-6PkP9syN.js +9 -0
- package/templates/react-node-backend/dist/assets/index-By2j7w9s.css +1 -0
- package/templates/react-node-backend/dist/index.html +14 -0
- package/templates/react-node-backend/dist/react.svg +1 -0
- package/templates/react-node-backend/dist/vite.svg +1 -0
- package/templates/react-node-backend/eslint.config.ts +176 -0
- package/templates/react-node-backend/index.html +13 -0
- package/templates/react-node-backend/node/authenticator.ts +47 -0
- package/templates/react-node-backend/node/server.ts +103 -0
- package/templates/react-node-backend/node_modules/.bin/conc +21 -0
- package/templates/react-node-backend/node_modules/.bin/concurrently +21 -0
- package/templates/react-node-backend/node_modules/.bin/eslint +21 -0
- package/templates/react-node-backend/node_modules/.bin/tsc +21 -0
- package/templates/react-node-backend/node_modules/.bin/tsserver +21 -0
- package/templates/react-node-backend/node_modules/.bin/vite +21 -0
- package/templates/react-node-backend/package.json +33 -0
- package/templates/react-node-backend/public/react.svg +1 -0
- package/templates/react-node-backend/public/vite.svg +1 -0
- package/templates/react-node-backend/src/App.tsx +69 -0
- package/templates/react-node-backend/src/index.css +145 -0
- package/templates/react-node-backend/src/main.tsx +12 -0
- package/templates/react-node-backend/tsconfig.app.json +28 -0
- package/templates/react-node-backend/tsconfig.json +7 -0
- package/templates/react-node-backend/tsconfig.node.json +26 -0
- package/templates/react-node-backend/vite.config.ts +13 -0
- package/dist/create-atom-BV6WVRvY.js.map +0 -1
- package/templates/base/node_modules/.bin/browserslist +0 -21
- package/templates/base/node_modules/.bin/eslint +0 -21
- package/templates/base/node_modules/.bin/jiti +0 -21
- package/templates/base/node_modules/.bin/sass +0 -21
- package/templates/base/node_modules/.bin/terser +0 -21
- package/templates/base/node_modules/.bin/tsc +0 -21
- package/templates/base/node_modules/.bin/tsserver +0 -21
- package/templates/base/node_modules/.bin/vite +0 -21
- package/templates/base/node_modules/.bin/yaml +0 -21
- package/templates/base/node_modules/.vite/deps/_metadata.json +0 -82
- package/templates/base/node_modules/.vite/deps/atom__io.js +0 -72
- package/templates/base/node_modules/.vite/deps/atom__io.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/atom__io_react.js +0 -170
- package/templates/base/node_modules/.vite/deps/atom__io_react.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/chunk-2PJG54YB.js +0 -364
- package/templates/base/node_modules/.vite/deps/chunk-2PJG54YB.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/chunk-6VZTUEOV.js +0 -3777
- package/templates/base/node_modules/.vite/deps/chunk-6VZTUEOV.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/chunk-IHAFLL3M.js +0 -204
- package/templates/base/node_modules/.vite/deps/chunk-IHAFLL3M.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/chunk-LZJKCPXG.js +0 -84
- package/templates/base/node_modules/.vite/deps/chunk-LZJKCPXG.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/chunk-PJQAIOAR.js +0 -311
- package/templates/base/node_modules/.vite/deps/chunk-PJQAIOAR.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/chunk-XRJUZPUF.js +0 -17
- package/templates/base/node_modules/.vite/deps/chunk-XRJUZPUF.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/package.json +0 -3
- package/templates/base/node_modules/.vite/deps/preact.js +0 -27
- package/templates/base/node_modules/.vite/deps/preact.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/preact_compat.js +0 -100
- package/templates/base/node_modules/.vite/deps/preact_compat.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/preact_debug.js +0 -240
- package/templates/base/node_modules/.vite/deps/preact_debug.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/preact_devtools.js +0 -7
- package/templates/base/node_modules/.vite/deps/preact_devtools.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/preact_hooks.js +0 -29
- package/templates/base/node_modules/.vite/deps/preact_hooks.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/preact_jsx-dev-runtime.js +0 -18
- package/templates/base/node_modules/.vite/deps/preact_jsx-dev-runtime.js.map +0 -7
- package/templates/base/node_modules/.vite/deps/preact_jsx-runtime.js +0 -18
- package/templates/base/node_modules/.vite/deps/preact_jsx-runtime.js.map +0 -7
- /package/templates/{base → preact-svg-editor}/_gitignore +0 -0
- /package/templates/{base → preact-svg-editor}/index.html +0 -0
- /package/templates/{base → preact-svg-editor}/public/preact.svg +0 -0
- /package/templates/{base → preact-svg-editor}/src/msg.md +0 -0
- /package/templates/{base → preact-svg-editor}/src/style.css +0 -0
- /package/templates/{base → preact-svg-editor}/tsconfig.json +0 -0
- /package/templates/{base → react-node-backend}/eslint.d.ts +0 -0
|
@@ -1,38 +1,40 @@
|
|
|
1
|
+
import type { Loadable, RegularAtomToken } from "atom.io"
|
|
1
2
|
import {
|
|
2
3
|
atom,
|
|
3
4
|
atomFamily,
|
|
4
5
|
getState,
|
|
5
|
-
Loadable,
|
|
6
6
|
resetState,
|
|
7
|
+
runTransaction,
|
|
7
8
|
selectorFamily,
|
|
8
9
|
setState,
|
|
10
|
+
transaction,
|
|
9
11
|
} from "atom.io"
|
|
10
|
-
import { type RegularAtomToken } from "atom.io"
|
|
11
12
|
import { useO } from "atom.io/react"
|
|
12
|
-
import { PointerEventHandler, TargetedPointerEvent } from "preact"
|
|
13
|
-
import {
|
|
13
|
+
import type { PointerEventHandler, TargetedPointerEvent, VNode } from "preact"
|
|
14
|
+
import type { MutableRef } from "preact/hooks"
|
|
15
|
+
import { useCallback, useEffect, useRef } from "preact/hooks"
|
|
14
16
|
|
|
15
17
|
type PointXY = { x: number; y: number }
|
|
16
18
|
type EdgeXY = { c?: PointXY; s: PointXY }
|
|
17
19
|
|
|
18
20
|
const pathKeysAtom = atom<string[]>({
|
|
19
|
-
key:
|
|
21
|
+
key: `pathKeys`,
|
|
20
22
|
default: [],
|
|
21
23
|
})
|
|
22
24
|
const subpathKeysAtoms = atomFamily<string[], string>({
|
|
23
|
-
key:
|
|
25
|
+
key: `subpathKeys`,
|
|
24
26
|
default: [],
|
|
25
27
|
})
|
|
26
28
|
const nodeAtoms = atomFamily<PointXY | null, string>({
|
|
27
|
-
key:
|
|
29
|
+
key: `nodeAtoms`,
|
|
28
30
|
default: null,
|
|
29
31
|
})
|
|
30
|
-
const edgeAtoms = atomFamily<
|
|
31
|
-
key:
|
|
32
|
+
const edgeAtoms = atomFamily<EdgeXY | boolean, string>({
|
|
33
|
+
key: `edgeAtoms`,
|
|
32
34
|
default: true,
|
|
33
35
|
})
|
|
34
36
|
const pathDrawSelectors = selectorFamily<string, string>({
|
|
35
|
-
key:
|
|
37
|
+
key: `pathDrawSelectors`,
|
|
36
38
|
get:
|
|
37
39
|
(pathKey) =>
|
|
38
40
|
({ get }) => {
|
|
@@ -43,7 +45,7 @@ const pathDrawSelectors = selectorFamily<string, string>({
|
|
|
43
45
|
const edge = get(edgeAtoms, subpathKey)
|
|
44
46
|
|
|
45
47
|
if (node === null) {
|
|
46
|
-
return
|
|
48
|
+
return `Z`
|
|
47
49
|
}
|
|
48
50
|
if (idx === 0) {
|
|
49
51
|
return `M ${node.x} ${node.y}`
|
|
@@ -59,7 +61,7 @@ const pathDrawSelectors = selectorFamily<string, string>({
|
|
|
59
61
|
}
|
|
60
62
|
return `S ${edge.s.x} ${edge.s.y} ${node.x} ${node.y}`
|
|
61
63
|
})
|
|
62
|
-
.join(
|
|
64
|
+
.join(` `)
|
|
63
65
|
},
|
|
64
66
|
})
|
|
65
67
|
|
|
@@ -89,8 +91,10 @@ function Bezier({
|
|
|
89
91
|
node?: PointXY
|
|
90
92
|
}) {
|
|
91
93
|
let node: PointXY | null
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
|
|
92
95
|
switch (typeof maybeNode) {
|
|
93
|
-
case
|
|
96
|
+
case `undefined`:
|
|
97
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
94
98
|
node = useO(nodeAtoms, prevSubpathKey)
|
|
95
99
|
break
|
|
96
100
|
default:
|
|
@@ -145,7 +149,7 @@ function Node({
|
|
|
145
149
|
const edge = useO(edgeAtoms, subpathKey)
|
|
146
150
|
return node === null ? null : (
|
|
147
151
|
<>
|
|
148
|
-
{typeof edge ===
|
|
152
|
+
{typeof edge === `boolean` ? (
|
|
149
153
|
<rect class="node" x={node.x - 3} y={node.y - 3} width={6} height={6} />
|
|
150
154
|
) : (
|
|
151
155
|
<>
|
|
@@ -182,17 +186,20 @@ function Node({
|
|
|
182
186
|
|
|
183
187
|
function RenderedPath({ pathKey }: { pathKey: string }) {
|
|
184
188
|
const draw = useO(pathDrawSelectors, pathKey)
|
|
185
|
-
return <path d={`${draw} Z`} class="path" style={{ pointerEvents:
|
|
189
|
+
return <path d={`${draw} Z`} class="path" style={{ pointerEvents: `none` }} />
|
|
186
190
|
}
|
|
187
191
|
|
|
188
192
|
function Path({ pathKey }: { pathKey: string }) {
|
|
189
193
|
const subpathKeys = useO(subpathKeysAtoms, pathKey)
|
|
190
|
-
console.log(console.log(`render path`, subpathKeys))
|
|
191
194
|
return (
|
|
192
195
|
<>
|
|
193
196
|
<RenderedPath pathKey={pathKey} />
|
|
194
197
|
{subpathKeys.toReversed().map((spk, idx, arr) => (
|
|
195
|
-
<Node
|
|
198
|
+
<Node
|
|
199
|
+
subpathKey={spk}
|
|
200
|
+
nextSubpathKey={arr[idx + 1] ?? arr[0]}
|
|
201
|
+
key={spk}
|
|
202
|
+
/>
|
|
196
203
|
))}
|
|
197
204
|
</>
|
|
198
205
|
)
|
|
@@ -203,18 +210,18 @@ function PathsDemo() {
|
|
|
203
210
|
return (
|
|
204
211
|
<>
|
|
205
212
|
{pathKeys.map((pathKey) => {
|
|
206
|
-
return <Path pathKey={pathKey} />
|
|
213
|
+
return <Path pathKey={pathKey} key={pathKey} />
|
|
207
214
|
})}
|
|
208
215
|
</>
|
|
209
216
|
)
|
|
210
217
|
}
|
|
211
218
|
|
|
212
219
|
const svgRefAtom = atom<SVGSVGElement | null>({
|
|
213
|
-
key:
|
|
220
|
+
key: `svgRef`,
|
|
214
221
|
default: null,
|
|
215
222
|
})
|
|
216
|
-
const currentlyDraggingAtom = atom<
|
|
217
|
-
key:
|
|
223
|
+
const currentlyDraggingAtom = atom<{ key: string; by?: `c` | `s` } | null>({
|
|
224
|
+
key: `currentlyDragging`,
|
|
218
225
|
default: null,
|
|
219
226
|
})
|
|
220
227
|
|
|
@@ -257,144 +264,147 @@ function onPointerMove(evt: TargetedPointerEvent<SVGSVGElement>): void {
|
|
|
257
264
|
const CODES = [`m`, `M`, `l`, `L`, `c`, `C`, `v`, `V`, `z`, `Z`] as const
|
|
258
265
|
|
|
259
266
|
const preactLogoAtom = atom<Loadable<string>>({
|
|
260
|
-
key:
|
|
261
|
-
default: () => fetch(
|
|
267
|
+
key: `preactLogo`,
|
|
268
|
+
default: () => fetch(`preact.svg`).then((res) => res.text()),
|
|
262
269
|
})
|
|
263
270
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
271
|
+
const resetTX = transaction<() => Promise<void>>({
|
|
272
|
+
key: `reset`,
|
|
273
|
+
do: async () => {
|
|
274
|
+
const logo = await getState(preactLogoAtom)
|
|
275
|
+
for (const pathKey of getState(pathKeysAtom)) {
|
|
276
|
+
resetState(subpathKeysAtoms, pathKey)
|
|
277
|
+
}
|
|
278
|
+
resetState(pathKeysAtom)
|
|
270
279
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
280
|
+
const shapes = logo
|
|
281
|
+
.split(`\n`)
|
|
282
|
+
.filter((line) => line.startsWith(`\t<path`))
|
|
283
|
+
.map((line) => {
|
|
284
|
+
const raw = line.split(`d="`)[1].slice(0, -9)
|
|
276
285
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
286
|
+
type Letter = (typeof CODES)[number]
|
|
287
|
+
let letter: Letter | undefined
|
|
288
|
+
let number = ``
|
|
289
|
+
let numbers: number[] = []
|
|
281
290
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
291
|
+
const instructions: { letter: Letter; numbers: number[] }[] = []
|
|
292
|
+
for (const c of raw) {
|
|
293
|
+
if (CODES.includes(c as Letter)) {
|
|
294
|
+
if (number) {
|
|
295
|
+
numbers.push(Number.parseFloat(number))
|
|
296
|
+
number = ``
|
|
297
|
+
}
|
|
298
|
+
if (letter) {
|
|
299
|
+
instructions.push({ letter, numbers })
|
|
300
|
+
}
|
|
301
|
+
letter = c as Letter
|
|
302
|
+
numbers = []
|
|
303
|
+
continue
|
|
304
|
+
}
|
|
305
|
+
if (c === ` `) {
|
|
287
306
|
numbers.push(Number.parseFloat(number))
|
|
288
307
|
number = ``
|
|
308
|
+
continue
|
|
289
309
|
}
|
|
290
|
-
if (
|
|
291
|
-
|
|
310
|
+
if (c === `-` && number) {
|
|
311
|
+
numbers.push(Number.parseFloat(number))
|
|
312
|
+
number = `-`
|
|
313
|
+
continue
|
|
292
314
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
continue
|
|
296
|
-
}
|
|
297
|
-
if (c === ` `) {
|
|
298
|
-
numbers.push(Number.parseFloat(number))
|
|
299
|
-
number = ``
|
|
300
|
-
continue
|
|
301
|
-
}
|
|
302
|
-
if (c === `-` && number) {
|
|
303
|
-
numbers.push(Number.parseFloat(number))
|
|
304
|
-
number = `-`
|
|
305
|
-
continue
|
|
315
|
+
|
|
316
|
+
number += c
|
|
306
317
|
}
|
|
307
318
|
|
|
308
|
-
|
|
309
|
-
|
|
319
|
+
let prev: PointXY = { x: 0, y: 0 }
|
|
320
|
+
const edgeNodes = instructions.map<{
|
|
321
|
+
node: PointXY | null
|
|
322
|
+
edge: boolean | { c?: PointXY; s: PointXY }
|
|
323
|
+
}>(({ letter: l, numbers: ns }) => {
|
|
324
|
+
let node: PointXY | null
|
|
325
|
+
let edge: boolean | { c?: PointXY; s: PointXY }
|
|
326
|
+
switch (l) {
|
|
327
|
+
case `m`:
|
|
328
|
+
node = { x: prev.x + ns[0], y: prev.y + ns[1] }
|
|
329
|
+
edge = false
|
|
330
|
+
break
|
|
331
|
+
case `M`:
|
|
332
|
+
node = { x: ns[0], y: ns[1] }
|
|
333
|
+
edge = false
|
|
334
|
+
break
|
|
335
|
+
case `l`:
|
|
336
|
+
node = { x: prev.x + ns[0], y: prev.y + ns[1] }
|
|
337
|
+
edge = true
|
|
338
|
+
break
|
|
339
|
+
case `L`:
|
|
340
|
+
node = { x: ns[0], y: ns[1] }
|
|
341
|
+
edge = true
|
|
342
|
+
break
|
|
343
|
+
case `c`:
|
|
344
|
+
node = { x: prev.x + ns[4], y: prev.y + ns[5] }
|
|
345
|
+
edge = {
|
|
346
|
+
c: { x: prev.x + ns[0], y: prev.y + ns[1] },
|
|
347
|
+
s: { x: prev.x + ns[2], y: prev.y + ns[3] },
|
|
348
|
+
}
|
|
349
|
+
break
|
|
350
|
+
case `C`:
|
|
351
|
+
node = { x: ns[4], y: ns[5] }
|
|
352
|
+
edge = {
|
|
353
|
+
c: { x: ns[0], y: ns[1] },
|
|
354
|
+
s: { x: ns[2], y: ns[3] },
|
|
355
|
+
}
|
|
356
|
+
break
|
|
357
|
+
case `v`:
|
|
358
|
+
node = { x: prev.x, y: prev.y + ns[0] }
|
|
359
|
+
edge = true
|
|
360
|
+
break
|
|
361
|
+
case `V`:
|
|
362
|
+
node = { x: prev.x, y: ns[0] }
|
|
363
|
+
edge = true
|
|
364
|
+
break
|
|
365
|
+
case `z`:
|
|
366
|
+
case `Z`:
|
|
367
|
+
node = null
|
|
368
|
+
edge = true
|
|
369
|
+
}
|
|
370
|
+
if (node) {
|
|
371
|
+
prev = node
|
|
372
|
+
}
|
|
310
373
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
node: null | PointXY
|
|
314
|
-
edge: boolean | { c?: PointXY; s: PointXY }
|
|
315
|
-
}>(({ letter, numbers }) => {
|
|
316
|
-
let node: null | PointXY
|
|
317
|
-
let edge: boolean | { c?: PointXY; s: PointXY }
|
|
318
|
-
switch (letter) {
|
|
319
|
-
case `m`:
|
|
320
|
-
node = { x: prev.x + numbers[0], y: prev.y + numbers[1] }
|
|
321
|
-
edge = false
|
|
322
|
-
break
|
|
323
|
-
case `M`:
|
|
324
|
-
node = { x: numbers[0], y: numbers[1] }
|
|
325
|
-
edge = false
|
|
326
|
-
break
|
|
327
|
-
case `l`:
|
|
328
|
-
node = { x: prev.x + numbers[0], y: prev.y + numbers[1] }
|
|
329
|
-
edge = true
|
|
330
|
-
break
|
|
331
|
-
case `L`:
|
|
332
|
-
node = { x: numbers[0], y: numbers[1] }
|
|
333
|
-
edge = true
|
|
334
|
-
break
|
|
335
|
-
case `c`:
|
|
336
|
-
node = { x: prev.x + numbers[4], y: prev.y + numbers[5] }
|
|
337
|
-
edge = {
|
|
338
|
-
c: { x: prev.x + numbers[0], y: prev.y + numbers[1] },
|
|
339
|
-
s: { x: prev.x + numbers[2], y: prev.y + numbers[3] },
|
|
340
|
-
}
|
|
341
|
-
break
|
|
342
|
-
case `C`:
|
|
343
|
-
node = { x: numbers[4], y: numbers[5] }
|
|
344
|
-
edge = {
|
|
345
|
-
c: { x: numbers[0], y: numbers[1] },
|
|
346
|
-
s: { x: numbers[2], y: numbers[3] },
|
|
347
|
-
}
|
|
348
|
-
break
|
|
349
|
-
case `v`:
|
|
350
|
-
node = { x: prev.x, y: prev.y + numbers[0] }
|
|
351
|
-
edge = true
|
|
352
|
-
break
|
|
353
|
-
case `V`:
|
|
354
|
-
node = { x: prev.x, y: numbers[0] }
|
|
355
|
-
edge = true
|
|
356
|
-
break
|
|
357
|
-
case `z`:
|
|
358
|
-
case `Z`:
|
|
359
|
-
node = null
|
|
360
|
-
edge = true
|
|
361
|
-
}
|
|
362
|
-
if (node) {
|
|
363
|
-
prev = node
|
|
364
|
-
}
|
|
374
|
+
return { node, edge }
|
|
375
|
+
})
|
|
365
376
|
|
|
366
|
-
return
|
|
377
|
+
return edgeNodes
|
|
367
378
|
})
|
|
368
379
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
+
let i = 0
|
|
381
|
+
let j = 0
|
|
382
|
+
for (const shape of shapes) {
|
|
383
|
+
const jj = j
|
|
384
|
+
for (const { node, edge } of shape) {
|
|
385
|
+
setState(edgeAtoms, `subpath${j}`, edge)
|
|
386
|
+
setState(nodeAtoms, `subpath${j}`, node)
|
|
387
|
+
j++
|
|
388
|
+
}
|
|
389
|
+
const numberOfNodes = j - jj
|
|
390
|
+
setState(
|
|
391
|
+
subpathKeysAtoms,
|
|
392
|
+
`path${i}`,
|
|
393
|
+
Array.from(
|
|
394
|
+
{ length: numberOfNodes },
|
|
395
|
+
(_, nodeNum) => `subpath${jj + nodeNum}`,
|
|
396
|
+
),
|
|
397
|
+
)
|
|
398
|
+
setState(pathKeysAtom, (prev) => [...prev, `path${i}`])
|
|
399
|
+
i++
|
|
380
400
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
`path${i}`,
|
|
385
|
-
Array.from(
|
|
386
|
-
{ length: numberOfNodes },
|
|
387
|
-
(_, nodeNum) => `subpath${jj + nodeNum}`,
|
|
388
|
-
),
|
|
389
|
-
)
|
|
390
|
-
setState(pathKeysAtom, (prev) => [...prev, `path${i}`])
|
|
391
|
-
i++
|
|
392
|
-
}
|
|
393
|
-
}
|
|
401
|
+
},
|
|
402
|
+
})
|
|
403
|
+
const reset = runTransaction(resetTX)
|
|
394
404
|
|
|
395
405
|
const WIDTH = 256
|
|
396
406
|
const HEIGHT = 296
|
|
397
|
-
export default function BezierPlayground() {
|
|
407
|
+
export default function BezierPlayground(): VNode {
|
|
398
408
|
const svgRef = useAtomicRef(svgRefAtom)
|
|
399
409
|
const onPointerUp: PointerEventHandler<SVGSVGElement> = useCallback((evt) => {
|
|
400
410
|
evt.currentTarget.releasePointerCapture(evt.pointerId)
|
|
@@ -406,13 +416,13 @@ export default function BezierPlayground() {
|
|
|
406
416
|
return (
|
|
407
417
|
<div
|
|
408
418
|
style={{
|
|
409
|
-
display:
|
|
410
|
-
flexFlow:
|
|
411
|
-
position:
|
|
412
|
-
overflow:
|
|
413
|
-
maxWidth:
|
|
414
|
-
width:
|
|
415
|
-
alignItems:
|
|
419
|
+
display: `flex`,
|
|
420
|
+
flexFlow: `column`,
|
|
421
|
+
position: `relative`,
|
|
422
|
+
overflow: `hidden`,
|
|
423
|
+
maxWidth: `1280px`,
|
|
424
|
+
width: `100vw`,
|
|
425
|
+
alignItems: `center`,
|
|
416
426
|
}}
|
|
417
427
|
>
|
|
418
428
|
<svg
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import "./style.css"
|
|
2
|
+
|
|
3
|
+
import type { VNode } from "preact"
|
|
1
4
|
import { render } from "preact"
|
|
2
5
|
|
|
3
|
-
import "./style.css"
|
|
4
6
|
import BezierPlayground from "./BezierPlayground.tsx"
|
|
5
7
|
|
|
6
|
-
export function App() {
|
|
8
|
+
export function App(): VNode {
|
|
7
9
|
return (
|
|
8
10
|
<>
|
|
9
11
|
<h1>Atom.io in Preact on Vite</h1>
|
|
@@ -38,11 +40,11 @@ type ResourceProps = {
|
|
|
38
40
|
}
|
|
39
41
|
function Resource(props: ResourceProps) {
|
|
40
42
|
return (
|
|
41
|
-
<a href={props.href} target="_blank" class="resource">
|
|
43
|
+
<a href={props.href} target="_blank" class="resource" rel="noreferrer">
|
|
42
44
|
<h2>{props.title}</h2>
|
|
43
45
|
<p>{props.description}</p>
|
|
44
46
|
</a>
|
|
45
47
|
)
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
render(<App />, document.getElementById(
|
|
50
|
+
render(<App />, document.getElementById(`app`)!)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
> react-node-backend@0.0.0 build /home/runner/work/wayforge/wayforge/packages/create-atom.io/templates/react-node-backend
|
|
3
|
+
> vite build
|
|
4
|
+
|
|
5
|
+
[36mrolldown-vite v7.1.12 [32mbuilding for production...[36m[39m
|
|
6
|
+
[2K
|
|
7
|
+
rendering chunks...
|
|
8
|
+
computing gzip size...
|
|
9
|
+
[2mdist/[22m[32mindex.html [39m[1m[2m 0.45 kB[22m[22m[2m │ gzip: 0.29 kB[22m
|
|
10
|
+
[2mdist/[22m[2massets/[22m[35mindex-By2j7w9s.css [39m[1m[2m 2.26 kB[22m[22m[2m │ gzip: 0.84 kB[22m
|
|
11
|
+
[2mdist/[22m[2massets/[22m[36mindex-6PkP9syN.js [39m[1m[2m231.07 kB[22m[22m[2m │ gzip: 71.33 kB[22m
|
|
12
|
+
[32m✓ built in 2.62s[39m
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# React + TypeScript + Vite
|
|
2
|
+
|
|
3
|
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
|
4
|
+
|
|
5
|
+
Currently, two official plugins are available:
|
|
6
|
+
|
|
7
|
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
|
|
8
|
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
9
|
+
|
|
10
|
+
## React Compiler
|
|
11
|
+
|
|
12
|
+
The React Compiler is enabled on this template. See [this documentation](https://react.dev/learn/react-compiler) for more information.
|
|
13
|
+
|
|
14
|
+
Note: This will impact Vite dev & build performances.
|
|
15
|
+
|
|
16
|
+
## Expanding the ESLint configuration
|
|
17
|
+
|
|
18
|
+
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
export default defineConfig([
|
|
22
|
+
globalIgnores(['dist']),
|
|
23
|
+
{
|
|
24
|
+
files: ['**/*.{ts,tsx}'],
|
|
25
|
+
extends: [
|
|
26
|
+
// Other configs...
|
|
27
|
+
|
|
28
|
+
// Remove tseslint.configs.recommended and replace with this
|
|
29
|
+
tseslint.configs.recommendedTypeChecked,
|
|
30
|
+
// Alternatively, use this for stricter rules
|
|
31
|
+
tseslint.configs.strictTypeChecked,
|
|
32
|
+
// Optionally, add this for stylistic rules
|
|
33
|
+
tseslint.configs.stylisticTypeChecked,
|
|
34
|
+
|
|
35
|
+
// Other configs...
|
|
36
|
+
],
|
|
37
|
+
languageOptions: {
|
|
38
|
+
parserOptions: {
|
|
39
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
40
|
+
tsconfigRootDir: import.meta.dirname,
|
|
41
|
+
},
|
|
42
|
+
// other options...
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
])
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
// eslint.config.js
|
|
52
|
+
import reactX from 'eslint-plugin-react-x'
|
|
53
|
+
import reactDom from 'eslint-plugin-react-dom'
|
|
54
|
+
|
|
55
|
+
export default defineConfig([
|
|
56
|
+
globalIgnores(['dist']),
|
|
57
|
+
{
|
|
58
|
+
files: ['**/*.{ts,tsx}'],
|
|
59
|
+
extends: [
|
|
60
|
+
// Other configs...
|
|
61
|
+
// Enable lint rules for React
|
|
62
|
+
reactX.configs['recommended-typescript'],
|
|
63
|
+
// Enable lint rules for React DOM
|
|
64
|
+
reactDom.configs.recommended,
|
|
65
|
+
],
|
|
66
|
+
languageOptions: {
|
|
67
|
+
parserOptions: {
|
|
68
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
69
|
+
tsconfigRootDir: import.meta.dirname,
|
|
70
|
+
},
|
|
71
|
+
// other options...
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
])
|
|
75
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Logs
|
|
2
|
+
logs
|
|
3
|
+
*.log
|
|
4
|
+
npm-debug.log*
|
|
5
|
+
yarn-debug.log*
|
|
6
|
+
yarn-error.log*
|
|
7
|
+
pnpm-debug.log*
|
|
8
|
+
lerna-debug.log*
|
|
9
|
+
|
|
10
|
+
node_modules
|
|
11
|
+
dist
|
|
12
|
+
dist-ssr
|
|
13
|
+
*.local
|
|
14
|
+
|
|
15
|
+
# Editor directories and files
|
|
16
|
+
.vscode/*
|
|
17
|
+
!.vscode/extensions.json
|
|
18
|
+
.idea
|
|
19
|
+
.DS_Store
|
|
20
|
+
*.suo
|
|
21
|
+
*.ntvs*
|
|
22
|
+
*.njsproj
|
|
23
|
+
*.sln
|
|
24
|
+
*.sw?
|