diff --git a/client-src/views/draw/components/colors/colors.module.css b/client-src/views/draw/components/colors/colors.module.css index 4e5cd5c..1679d32 100644 --- a/client-src/views/draw/components/colors/colors.module.css +++ b/client-src/views/draw/components/colors/colors.module.css @@ -9,6 +9,7 @@ flex-grow: 2; border: none; height: 24px; + min-width: 40px; width: 100%; padding: none; } diff --git a/client-src/views/draw/components/controls/controls.module.css b/client-src/views/draw/components/controls/controls.module.css index f185b09..09c7486 100644 --- a/client-src/views/draw/components/controls/controls.module.css +++ b/client-src/views/draw/components/controls/controls.module.css @@ -1,22 +1,3 @@ -.container { - position: fixed; - width: min(100%, 320px); - top: 48px; - left: 0px; - padding: 12px; - background-color: rgba(255, 255, 255, 0.95); - border-bottom-right-radius: 16px; - box-shadow: 0px 0px 8px -4px rgba(0, 0, 0, 0.16), - 0px 0px 36px 0px rgba(0, 0, 0, 0.08); - z-index: 100; - transform: translate(-100%, 0px); -} - -.open { - transform: translate(0%, 0px); - transition: transform 0.2s; -} - .inputs { display: grid; grid-template-columns: 96px 1fr auto; diff --git a/client-src/views/draw/components/controls/controls.tsx b/client-src/views/draw/components/controls/controls.tsx index 025ab95..d9a4553 100644 --- a/client-src/views/draw/components/controls/controls.tsx +++ b/client-src/views/draw/components/controls/controls.tsx @@ -9,12 +9,10 @@ import { useControls, COLORS } from "./use-controls"; export function Controls() { const { - isPanelOpen, handleSizeChangeStart, handleSizeChange, handleStrokeWidthChangeStart, handleStrokeWidthChange, - handleIsFilledChange, handleStyleChangeComplete, handleStrokeColorChange, handleFillColorChange, @@ -23,7 +21,7 @@ export function Controls() { return (
{ - app.setNextStyleForAllShapes({ isFilled: !!v }); - }, - [], - ); - const handleStyleChangeComplete = React.useCallback(() => { app.finishStyleUpdate(); }, []); @@ -58,12 +47,10 @@ export function useControls() { }, []); return { - isPanelOpen: appState.isPanelOpen, handleSizeChangeStart, handleSizeChange, handleStrokeWidthChangeStart, handleStrokeWidthChange, - handleIsFilledChange, handleStyleChangeComplete, handleStrokeColorChange, handleFillColorChange, diff --git a/client-src/views/draw/components/slider/slider.tsx b/client-src/views/draw/components/slider/slider.tsx index 1c2121e..517693f 100644 --- a/client-src/views/draw/components/slider/slider.tsx +++ b/client-src/views/draw/components/slider/slider.tsx @@ -13,12 +13,10 @@ interface SliderProps extends SliderOwnProps { value: number[] onPointerDown: () => void onPointerUp: () => void - onDoubleClick: () => void label?: string } export function Slider({ - onDoubleClick, onPointerUp, onPointerDown, onValueChange, @@ -38,7 +36,7 @@ export function Slider({ return ( <> - + {props.name} -
+
+
+
- +
); } diff --git a/client-src/vite-env.d.ts b/client-src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/client-src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..2d27278 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["client-src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..722fe8e --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "types": ["node"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts", "server-src"] +} diff --git a/tsconfig.shared.json b/tsconfig.shared.json new file mode 100644 index 0000000..07a31a3 --- /dev/null +++ b/tsconfig.shared.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["shared-src"] +} -- 2.51.2 From b626c117cebba5ab58a82ec23691694f1271a700 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 14 Nov 2025 12:08:23 -0800 Subject: [PATCH 2/2] chore: setup prettier and eslint and such --- client-src/routes/draw.tsx | 4 +- client-src/style.css | 1 - .../components/checkbox/checkbox.module.css | 2 +- .../draw/components/checkbox/checkbox.tsx | 12 +- .../views/draw/components/checkbox/index.ts | 2 +- .../views/draw/components/colors/colors.tsx | 20 +- .../views/draw/components/colors/index.ts | 2 +- .../components/controls/controls.module.css | 2 +- .../draw/components/controls/controls.tsx | 6 +- .../views/draw/components/controls/index.ts | 2 +- .../views/draw/components/editor/editor.tsx | 2 +- .../views/draw/components/editor/index.ts | 2 +- .../views/draw/components/slider/index.ts | 2 +- .../draw/components/slider/slider.module.css | 2 +- .../views/draw/components/slider/slider.tsx | 26 +- client-src/views/draw/draw-page.tsx | 9 +- client-src/views/draw/hooks/index.ts | 2 +- .../views/draw/hooks/useKeyboardShortcuts.ts | 36 +- client-src/views/draw/state/corners.json | 2578 +++-------------- client-src/views/draw/state/easings.ts | 14 +- client-src/views/draw/state/excalidraw.json | 205 +- client-src/views/draw/state/flash.json | 947 +----- client-src/views/draw/state/index.ts | 2 +- client-src/views/draw/state/sample.json | 2522 +++------------- client-src/views/draw/state/shapes/draw.tsx | 172 +- client-src/views/draw/state/shapes/index.ts | 2 +- client-src/views/draw/state/state.ts | 538 ++-- client-src/views/draw/state/types.ts | 104 +- client-src/views/draw/state/utils.ts | 49 +- eslint.config.js | 30 + package.json | 13 +- pnpm-lock.yaml | 197 +- prettierignore | 1 + tsconfig.app.json | 1 - tsconfig.node.json | 1 - tsconfig.shared.json | 1 - vite.config.ts | 2 +- 37 files changed, 1611 insertions(+), 5902 deletions(-) create mode 100644 eslint.config.js create mode 100644 prettierignore diff --git a/client-src/routes/draw.tsx b/client-src/routes/draw.tsx index 38bbd39..dff346e 100644 --- a/client-src/routes/draw.tsx +++ b/client-src/routes/draw.tsx @@ -6,7 +6,5 @@ export const Route = createFileRoute("/draw")({ }); function Index() { - return ( - - ); + return ; } diff --git a/client-src/style.css b/client-src/style.css index eeb1fc5..a3138a1 100644 --- a/client-src/style.css +++ b/client-src/style.css @@ -8,4 +8,3 @@ @theme { --font-awexbmp: "Awexbmp", sans-serif; } - diff --git a/client-src/views/draw/components/checkbox/checkbox.module.css b/client-src/views/draw/components/checkbox/checkbox.module.css index 7f9d778..8ee7842 100644 --- a/client-src/views/draw/components/checkbox/checkbox.module.css +++ b/client-src/views/draw/components/checkbox/checkbox.module.css @@ -27,7 +27,7 @@ } .root::after { - content: ''; + content: ""; position: absolute; left: 0px; top: 0px; diff --git a/client-src/views/draw/components/checkbox/checkbox.tsx b/client-src/views/draw/components/checkbox/checkbox.tsx index 1dc58d1..9c4603d 100644 --- a/client-src/views/draw/components/checkbox/checkbox.tsx +++ b/client-src/views/draw/components/checkbox/checkbox.tsx @@ -1,14 +1,14 @@ -import * as React from 'react' -import * as Label from '@radix-ui/react-label' +import * as React from "react"; +import * as Label from "@radix-ui/react-label"; import { Root, Indicator, CheckboxProps as CheckboxOwnProps, -} from '@radix-ui/react-checkbox' -import styles from './checkbox.module.css' +} from "@radix-ui/react-checkbox"; +import styles from "./checkbox.module.css"; interface CheckboxProps extends CheckboxOwnProps { - name: string + name: string; } export function Checkbox(props: CheckboxProps) { @@ -22,5 +22,5 @@ export function Checkbox(props: CheckboxProps) {
- ) + ); } diff --git a/client-src/views/draw/components/checkbox/index.ts b/client-src/views/draw/components/checkbox/index.ts index 31d7689..057f167 100644 --- a/client-src/views/draw/components/checkbox/index.ts +++ b/client-src/views/draw/components/checkbox/index.ts @@ -1 +1 @@ -export * from './checkbox' +export * from "./checkbox"; diff --git a/client-src/views/draw/components/colors/colors.tsx b/client-src/views/draw/components/colors/colors.tsx index 52de704..fd41178 100644 --- a/client-src/views/draw/components/colors/colors.tsx +++ b/client-src/views/draw/components/colors/colors.tsx @@ -1,12 +1,12 @@ -import * as React from 'react' -import * as Label from '@radix-ui/react-label' -import styles from './colors.module.css' +import * as React from "react"; +import * as Label from "@radix-ui/react-label"; +import styles from "./colors.module.css"; interface ColorsProps { - name: string - colors: string[] - color: string - onChange: (color: string) => void + name: string; + colors: string[]; + color: string; + onChange: (color: string) => void; } export function Colors(props: ColorsProps) { @@ -20,7 +20,7 @@ export function Colors(props: ColorsProps) { key={color} className={ color === props.color - ? [styles.color, styles.selected].join(' ') + ? [styles.color, styles.selected].join(" ") : styles.color } style={{ @@ -28,9 +28,9 @@ export function Colors(props: ColorsProps) { }} onClick={() => props.onChange(color)} /> - ) + ); })}
- ) + ); } diff --git a/client-src/views/draw/components/colors/index.ts b/client-src/views/draw/components/colors/index.ts index 67b2602..bbdc171 100644 --- a/client-src/views/draw/components/colors/index.ts +++ b/client-src/views/draw/components/colors/index.ts @@ -1 +1 @@ -export * from './colors' +export * from "./colors"; diff --git a/client-src/views/draw/components/controls/controls.module.css b/client-src/views/draw/components/controls/controls.module.css index 09c7486..9977bf7 100644 --- a/client-src/views/draw/components/controls/controls.module.css +++ b/client-src/views/draw/components/controls/controls.module.css @@ -27,7 +27,7 @@ hr { .rowButton { cursor: pointer; flex-grow: 2; - font-family: 'Recursive', sans-serif; + font-family: "Recursive", sans-serif; border: none; background-color: transparent; border: 2px solid transparent; diff --git a/client-src/views/draw/components/controls/controls.tsx b/client-src/views/draw/components/controls/controls.tsx index d9a4553..f661aa7 100644 --- a/client-src/views/draw/components/controls/controls.tsx +++ b/client-src/views/draw/components/controls/controls.tsx @@ -20,9 +20,7 @@ export function Controls() { } = useControls(); return ( -
+
)}
-
+
diff --git a/client-src/views/draw/components/controls/index.ts b/client-src/views/draw/components/controls/index.ts index 1122a7f..06fd433 100644 --- a/client-src/views/draw/components/controls/index.ts +++ b/client-src/views/draw/components/controls/index.ts @@ -1 +1 @@ -export * from './controls' +export * from "./controls"; diff --git a/client-src/views/draw/components/editor/editor.tsx b/client-src/views/draw/components/editor/editor.tsx index 9f80a40..85bc113 100644 --- a/client-src/views/draw/components/editor/editor.tsx +++ b/client-src/views/draw/components/editor/editor.tsx @@ -26,7 +26,7 @@ export function Editor(): JSX.Element { void - onPointerUp: () => void - label?: string + value: number[]; + onPointerDown: () => void; + onPointerUp: () => void; + label?: string; } export function Slider({ @@ -29,10 +29,10 @@ export function Slider({ }: SliderProps) { const handleValueChange = React.useCallback( (e: React.ChangeEvent) => { - onValueChange?.([+e.currentTarget.value]) + onValueChange?.([+e.currentTarget.value]); }, - [onValueChange] - ) + [onValueChange], + ); return ( <> @@ -61,7 +61,7 @@ export function Slider({ ))} {label ? ( - {label} + {label} ) : ( )} - ) + ); } diff --git a/client-src/views/draw/draw-page.tsx b/client-src/views/draw/draw-page.tsx index d078111..4031475 100644 --- a/client-src/views/draw/draw-page.tsx +++ b/client-src/views/draw/draw-page.tsx @@ -7,8 +7,13 @@ export function DrawPage() { useKeyboardShortcuts(); return ( -
-
+
+
+ +
diff --git a/client-src/views/draw/hooks/index.ts b/client-src/views/draw/hooks/index.ts index d9e91a3..ef52385 100644 --- a/client-src/views/draw/hooks/index.ts +++ b/client-src/views/draw/hooks/index.ts @@ -1 +1 @@ -export * from './useKeyboardShortcuts' +export * from "./useKeyboardShortcuts"; diff --git a/client-src/views/draw/hooks/useKeyboardShortcuts.ts b/client-src/views/draw/hooks/useKeyboardShortcuts.ts index c80a962..a57c528 100644 --- a/client-src/views/draw/hooks/useKeyboardShortcuts.ts +++ b/client-src/views/draw/hooks/useKeyboardShortcuts.ts @@ -1,25 +1,25 @@ -import * as React from 'react' -import { useHotkeys } from 'react-hotkeys-hook' -import { app } from '../state' +import * as React from "react"; +import { useHotkeys } from "react-hotkeys-hook"; +import { app } from "../state"; export function useKeyboardShortcuts() { - useHotkeys('command+z,ctrl+z', () => { - app.undo() - }) + useHotkeys("command+z,ctrl+z", () => { + app.undo(); + }); - useHotkeys('command+shift+z,ctrl+shift+z', () => { - app.redo() - }) + useHotkeys("command+shift+z,ctrl+shift+z", () => { + app.redo(); + }); - useHotkeys('command+c,ctrl+c', () => { - app.copySvg() - }) + useHotkeys("command+c,ctrl+c", () => { + app.copySvg(); + }); - useHotkeys('command+shift+c,ctrl+shift+c', () => { - app.copyStyles() - }) + useHotkeys("command+shift+c,ctrl+shift+c", () => { + app.copyStyles(); + }); - useHotkeys('e,backspace', () => { - app.resetDoc() - }) + useHotkeys("e,backspace", () => { + app.resetDoc(); + }); } diff --git a/client-src/views/draw/state/corners.json b/client-src/views/draw/state/corners.json index dc53092..f17514a 100644 --- a/client-src/views/draw/state/corners.json +++ b/client-src/views/draw/state/corners.json @@ -1,2212 +1,372 @@ { "corners": [ - [ - 8.49, - 272.75, - 0.5, - 0 - ], - [ - 9.49, - 273.75, - 0.5, - 10 - ], - [ - 7.91, - 273.33, - 0.5, - 18 - ], - [ - 7.91, - 272.65, - 0.5, - 207 - ], - [ - 11.13, - 268.13, - 0.5, - 213 - ], - [ - 15.34, - 263.21, - 0.5, - 215 - ], - [ - 23.12, - 255.43, - 0.5, - 221 - ], - [ - 34.42, - 244.13, - 0.5, - 230 - ], - [ - 46.74, - 233.86, - 0.5, - 237 - ], - [ - 59.72, - 220.88, - 0.5, - 245 - ], - [ - 77.91, - 205.1, - 0.5, - 254 - ], - [ - 95.34, - 187.67, - 0.5, - 262 - ], - [ - 112.77, - 171.48, - 0.5, - 270 - ], - [ - 131.45, - 155.3, - 0.5, - 279 - ], - [ - 137.09, - 148.03, - 0.5, - 287 - ], - [ - 150.72, - 133.26, - 0.5, - 296 - ], - [ - 154.29, - 130.29, - 0.5, - 302 - ], - [ - 162.55, - 121.1, - 0.5, - 312 - ], - [ - 167.47, - 116.18, - 0.5, - 319 - ], - [ - 170.44, - 112.61, - 0.5, - 329 - ], - [ - 172.6, - 109.9, - 0.5, - 334 - ], - [ - 173.74, - 109.14, - 0.5, - 346 - ], - [ - 174.07, - 108.49, - 0.5, - 351 - ], - [ - 174.34, - 108.21, - 0.5, - 364 - ], - [ - 174.62, - 107.93, - 0.5, - 367 - ], - [ - 174.62, - 108.16, - 0.5, - 410 - ], - [ - 173.74, - 109.9, - 0.5, - 416 - ], - [ - 171.83, - 111.81, - 0.5, - 429 - ], - [ - 167.29, - 118.62, - 0.5, - 432 - ], - [ - 160.38, - 126.38, - 0.5, - 446 - ], - [ - 150.65, - 137.08, - 0.5, - 448 - ], - [ - 131.07, - 162.25, - 0.5, - 463 - ], - [ - 123.29, - 173.92, - 0.5, - 465 - ], - [ - 93.7, - 215.69, - 0.5, - 479 - ], - [ - 85.04, - 230.83, - 0.5, - 483 - ], - [ - 65.29, - 262.74, - 0.5, - 496 - ], - [ - 58.86, - 273.76, - 0.5, - 498 - ], - [ - 54.12, - 281.65, - 0.5, - 512 - ], - [ - 45.9, - 295, - 0.5, - 514 - ], - [ - 40.8, - 304.34, - 0.5, - 522 - ], - [ - 38.2, - 309.53, - 0.5, - 530 - ], - [ - 36.12, - 315.79, - 0.5, - 538 - ], - [ - 36.12, - 316.06, - 0.5, - 546 - ], - [ - 40.28, - 314.87, - 0.5, - 555 - ], - [ - 58.47, - 295.37, - 0.5, - 563 - ], - [ - 101.64, - 248.28, - 0.5, - 570 - ], - [ - 144.02, - 195.81, - 0.5, - 579 - ], - [ - 166.81, - 166.94, - 0.5, - 587 - ], - [ - 211.2, - 116.49, - 0.5, - 595 - ], - [ - 255.4, - 66.25, - 0.5, - 603 - ], - [ - 271.59, - 48.81, - 0.5, - 611 - ], - [ - 282.88, - 37.52, - 0.5, - 619 - ], - [ - 289.79, - 29.74, - 0.5, - 628 - ], - [ - 304.56, - 16.11, - 0.5, - 635 - ], - [ - 312.82, - 6.92, - 0.5, - 645 - ], - [ - 321.46, - 0, - 0.5, - 652 - ], - [ - 322.6, - 0, - 0.5, - 662 - ], - [ - 322.6, - 3.25, - 0.5, - 668 - ], - [ - 307.66, - 21.92, - 0.5, - 679 - ], - [ - 284.87, - 50.79, - 0.5, - 684 - ], - [ - 252.54, - 92.09, - 0.5, - 695 - ], - [ - 179.28, - 181.05, - 0.5, - 701 - ], - [ - 158.77, - 208.87, - 0.5, - 710 - ], - [ - 140.45, - 234.24, - 0.5, - 717 - ], - [ - 108.98, - 280.51, - 0.5, - 729 - ], - [ - 100.33, - 295.65, - 0.5, - 733 - ], - [ - 95.14, - 305.16, - 0.5, - 746 - ], - [ - 84.42, - 324.21, - 0.5, - 749 - ], - [ - 77.61, - 336.85, - 0.5, - 762 - ], - [ - 74.84, - 343.08, - 0.5, - 766 - ], - [ - 72.73, - 349.4, - 0.5, - 777 - ], - [ - 72.73, - 350.05, - 0.5, - 782 - ], - [ - 75.16, - 350.05, - 0.5, - 797 - ], - [ - 88.78, - 345.18, - 0.5, - 799 - ], - [ - 107.39, - 330.29, - 0.5, - 811 - ], - [ - 129.94, - 307.74, - 0.5, - 815 - ], - [ - 159.27, - 276.77, - 0.5, - 829 - ], - [ - 191.28, - 243.07, - 0.5, - 831 - ], - [ - 203.77, - 228.3, - 0.5, - 845 - ], - [ - 212.04, - 219.12, - 0.5, - 847 - ], - [ - 217.33, - 213.06, - 0.5, - 859 - ], - [ - 227.06, - 203.33, - 0.5, - 863 - ], - [ - 238.35, - 192.03, - 0.5, - 872 - ], - [ - 240.79, - 191.05, - 0.5, - 880 - ], - [ - 240.79, - 195.15, - 0.5, - 888 - ], - [ - 214.69, - 236.91, - 0.5, - 896 - ], - [ - 182.27, - 288.38, - 0.5, - 904 - ], - [ - 135.2, - 357.87, - 0.5, - 913 - ], - [ - 82.17, - 439.82, - 0.5, - 920 - ], - [ - 60.98, - 477.3, - 0.5, - 929 - ], - [ - 44.87, - 508.05, - 0.5, - 937 - ], - [ - 34.65, - 525.08, - 0.5, - 945 - ], - [ - 29.13, - 536.1, - 0.5, - 953 - ], - [ - 17.93, - 557.27, - 0.5, - 962 - ], - [ - 0, - 596.38, - 0.5, - 969 - ], - [ - 11.810000000000002, - 584.56, - 0.5, - 986 - ], - [ - 85.44, - 480.93, - 0.5, - 995 - ], - [ - 160.3, - 372.8, - 0.5, - 1002 - ], - [ - 204.01, - 307.23, - 0.5, - 1012 - ], - [ - 288.06000000000006, - 188.39000000000004, - 0.5, - 1018 - ], - [ - 318.59000000000003, - 145.29000000000002, - 0.5, - 1028 - ], - [ - 341.38, - 116.42, - 0.5, - 1034 - ], - [ - 353.87, - 100.51, - 0.5, - 1045 - ], - [ - 359.78, - 92.05999999999999, - 0.5, - 1051 - ], - [ - 393.1, - 47.64, - 0.5, - 1062 - ], - [ - 404.99, - 34.66000000000001, - 0.5, - 1067 - ], - [ - 404.99, - 35.790000000000006, - 0.5, - 1079 - ], - [ - 390.09000000000003, - 60.17, - 0.5, - 1083 - ], - [ - 344.19000000000005, - 125.74, - 0.5, - 1096 - ], - [ - 299.47, - 185.37, - 0.5, - 1099 - ], - [ - 251.21000000000004, - 258.89000000000004, - 0.5, - 1112 - ], - [ - 229.16999999999996, - 291.95, - 0.5, - 1115 - ], - [ - 210.85000000000002, - 317.32, - 0.5, - 1128 - ], - [ - 198.94, - 336.37, - 0.5, - 1132 - ], - [ - 190.72000000000003, - 349.72, - 0.5, - 1146 - ], - [ - 175.82, - 374.1, - 0.5, - 1148 - ], - [ - 167.60000000000002, - 387.45, - 0.5, - 1160 - ], - [ - 157.81, - 409.47999999999996, - 0.5, - 1164 - ], - [ - 163.88, - 406.16, - 0.5, - 1181 - ], - [ - 203.31, - 362.98, - 0.5, - 1196 - ], - [ - 226.73000000000002, - 338.08000000000004, - 0.5, - 1198 - ], - [ - 271.13, - 287.63, - 0.5, - 1206 - ], - [ - 318.82000000000005, - 233.72000000000003, - 0.5, - 1213 - ], - [ - 337.78, - 212.04000000000002, - 0.5, - 1226 - ], - [ - 351.40999999999997, - 197.27000000000004, - 0.5, - 1229 - ], - [ - 359.33000000000004, - 188.47000000000003, - 0.5, - 1238 - ], - [ - 375.51, - 171.03000000000003, - 0.5, - 1246 - ], - [ - 385.02, - 160.58000000000004, - 0.5, - 1255 - ], - [ - 399.78, - 146.94, - 0.5, - 1263 - ], - [ - 397.96000000000004, - 155.42000000000002, - 0.5, - 1278 - ], - [ - 379.25, - 184.21000000000004, - 0.5, - 1287 - ], - [ - 356.44000000000005, - 221.69, - 0.5, - 1295 - ], - [ - 326.82000000000005, - 269.81, - 0.5, - 1303 - ], - [ - 294.4, - 319.38, - 0.5, - 1312 - ], - [ - 280.99, - 338.88, - 0.5, - 1320 - ], - [ - 272.78, - 352.24, - 0.5, - 1328 - ], - [ - 267.90999999999997, - 360.34000000000003, - 0.5, - 1336 - ], - [ - 257.69000000000005, - 377.37, - 0.5, - 1345 - ], - [ - 252.82000000000005, - 385.47, - 0.5, - 1352 - ], - [ - 246.98000000000002, - 398.12000000000006, - 0.5, - 1362 - ], - [ - 254.24, - 393.28000000000003, - 0.5, - 1379 - ], - [ - 274.54999999999995, - 372.96000000000004, - 0.5, - 1384 - ], - [ - 302.73, - 344.78000000000003, - 0.5, - 1395 - ], - [ - 316.36, - 330.01, - 0.5, - 1401 - ], - [ - 342.19000000000005, - 302.66, - 0.5, - 1412 - ], - [ - 351.90999999999997, - 291.96000000000004, - 0.5, - 1417 - ], - [ - 370.11, - 272.46000000000004, - 0.5, - 1427 - ], - [ - 374.32000000000005, - 267.54, - 0.5, - 1433 - ], - [ - 382.53, - 258.40000000000003, - 0.5, - 1446 - ], - [ - 386.74, - 253.49, - 0.5, - 1450 - ], - [ - 392.74, - 248.99, - 0.5, - 1463 - ], - [ - 390.21000000000004, - 258.45, - 0.5, - 1479 - ], - [ - 376.66999999999996, - 284.19, - 0.5, - 1482 - ], - [ - 357.77, - 320.40000000000003, - 0.5, - 1496 - ], - [ - 338.34000000000003, - 359.25, - 0.5, - 1498 - ], - [ - 328.81000000000006, - 379.48, - 0.5, - 1512 - ], - [ - 322, - 392.13, - 0.5, - 1514 - ], - [ - 318.87, - 400.72999999999996, - 0.5, - 1529 - ], - [ - 311.68000000000006, - 415.11000000000007, - 0.5, - 1532 - ], - [ - 307.16999999999996, - 425.92, - 0.5, - 1546 - ], - [ - 304.58000000000004, - 436.3, - 0.5, - 1548 - ], - [ - 304.58000000000004, - 437.44, - 0.5, - 1555 - ], - [ - 309.77, - 436.13000000000005, - 0.5, - 1563 - ], - [ - 325.24, - 420.66, - 0.5, - 1572 - ], - [ - 346.38, - 396.7, - 0.5, - 1580 - ], - [ - 358.87, - 380.79, - 0.5, - 1588 - ], - [ - 380.84000000000003, - 354.43, - 0.5, - 1596 - ], - [ - 391.11, - 342.1, - 0.5, - 1604 - ], - [ - 396.78, - 334.81, - 0.5, - 1612 - ], - [ - 409.16999999999996, - 320.15000000000003, - 0.5, - 1621 - ], - [ - 416.09000000000003, - 311.51, - 0.5, - 1629 - ], - [ - 419.97, - 307.63, - 0.5, - 1637 - ], - [ - 426.02, - 302.33000000000004, - 0.5, - 1645 - ], - [ - 426.02, - 307.29, - 0.5, - 1662 - ], - [ - 421.41999999999996, - 319.23, - 0.5, - 1669 - ], - [ - 414.23, - 333.61, - 0.5, - 1679 - ], - [ - 411.20000000000005, - 341.17, - 0.5, - 1686 - ], - [ - 405.03999999999996, - 355.55, - 0.5, - 1696 - ], - [ - 403.85, - 359.71000000000004, - 0.5, - 1702 - ], - [ - 400.82000000000005, - 367.28000000000003, - 0.5, - 1710 - ], - [ - 398.89, - 372.42, - 0.5, - 1719 - ], - [ - 397.90999999999997, - 374.86, - 0.5, - 1728 - ], - [ - 397.90999999999997, - 378.11, - 0.5, - 1734 - ], - [ - 397.90999999999997, - 378.38, - 0.5, - 1745 - ], - [ - 399.65, - 378.38, - 0.5, - 1751 - ], - [ - 403.21000000000004, - 375.40000000000003, - 0.5, - 1763 - ], - [ - 409.24, - 370.13, - 0.5, - 1767 - ], - [ - 417.02, - 362.35, - 0.5, - 1778 - ], - [ - 424.78999999999996, - 355.43, - 0.5, - 1784 - ], - [ - 427.77, - 352.45, - 0.5, - 1795 - ], - [ - 432.65999999999997, - 347.55, - 0.5, - 1799 - ], - [ - 436.23, - 344.58000000000004, - 0.5, - 1812 - ], - [ - 438.39, - 341.87, - 0.5, - 1816 - ], - [ - 440.33000000000004, - 340.42, - 0.5, - 1828 - ], - [ - 440.98, - 340.09000000000003, - 0.5, - 1832 - ], - [ - 441.63, - 340.09000000000003, - 0.5, - 1843 - ], - [ - 441.9, - 340.09000000000003, - 0.5, - 1848 - ], - [ - 441.9, - 345.28000000000003, - 0.5, - 1862 - ], - [ - 441.9, - 354.19, - 0.5, - 1865 - ], - [ - 438.02, - 367.78000000000003, - 0.5, - 1878 - ], - [ - 433.90999999999997, - 383.19, - 0.5, - 1881 - ], - [ - 431.68000000000006, - 390.6, - 0.5, - 1895 - ], - [ - 428.76, - 404.21999999999997, - 0.5, - 1898 - ], - [ - 427.46000000000004, - 409.40000000000003, - 0.5, - 1912 - ], - [ - 426.65, - 418.31, - 0.5, - 1914 - ], - [ - 426.01, - 423.41, - 0.5, - 1926 - ], - [ - 426.01, - 430.96999999999997, - 0.5, - 1930 - ], - [ - 426.01, - 432.11000000000007, - 0.5, - 1937 - ], - [ - 427.13, - 432.11000000000007, - 0.5, - 1946 - ], - [ - 433.45000000000005, - 432.11000000000007, - 0.5, - 1955 - ], - [ - 441.56000000000006, - 428.06, - 0.5, - 1963 - ], - [ - 452.23, - 419.32, - 0.5, - 1971 - ], - [ - 465.21000000000004, - 407.42, - 0.5, - 1979 - ], - [ - 478.84000000000003, - 392.65000000000003, - 0.5, - 1987 - ], - [ - 494.31000000000006, - 377.17, - 0.5, - 1995 - ], - [ - 500.78999999999996, - 370.69, - 0.5, - 2003 - ], - [ - 513.77, - 358.79, - 0.5, - 2012 - ], - [ - 516.74, - 355.22, - 0.5, - 2019 - ], - [ - 524.52, - 348.3, - 0.5, - 2029 - ], - [ - 529.4300000000001, - 344.09000000000003, - 0.5, - 2036 - ], - [ - 532.11, - 341.94, - 0.5, - 2045 - ], - [ - 533.84, - 341.07, - 0.5, - 2052 - ], - [ - 534.49, - 341.07, - 0.5, - 2062 - ], - [ - 534.77, - 341.07, - 0.5, - 2069 - ], - [ - 534.77, - 348.63, - 0.5, - 2079 - ], - [ - 532.01, - 360.57, - 0.5, - 2084 - ], - [ - 526.91, - 375.87, - 0.5, - 2096 - ], - [ - 520.09, - 394.05, - 0.5, - 2101 - ], - [ - 517.87, - 401.45, - 0.5, - 2114 - ], - [ - 513.76, - 416.84999999999997, - 0.5, - 2118 - ], - [ - 512.57, - 421.02000000000004, - 0.5, - 2129 - ], - [ - 511.04999999999995, - 428.58, - 0.5, - 2133 - ], - [ - 509.76, - 433.72999999999996, - 0.5, - 2145 - ], - [ - 509.76, - 441.3, - 0.5, - 2150 - ], - [ - 509.76, - 441.95, - 0.5, - 2163 - ], - [ - 511.5, - 441.95, - 0.5, - 2166 - ], - [ - 517.74, - 441.95, - 0.5, - 2179 - ], - [ - 529.42, - 434.16, - 0.5, - 2182 - ], - [ - 541.74, - 423.89000000000004, - 0.5, - 2196 - ], - [ - 557.64, - 412.53000000000003, - 0.5, - 2198 - ], - [ - 563.69, - 407.22999999999996, - 0.5, - 2212 - ], - [ - 576.02, - 396.96, - 0.5, - 2215 - ], - [ - 579.58, - 394.58000000000004, - 0.5, - 2229 - ], - [ - 586.88, - 388.90000000000003, - 0.5, - 2232 - ], - [ - 591.42, - 385.65000000000003, - 0.5, - 2244 - ], - [ - 594.63, - 384.05, - 0.5, - 2248 - ], - [ - 597.87, - 383.5, - 0.5, - 2262 - ], - [ - 598.53, - 383.5, - 0.5, - 2265 - ], - [ - 598.53, - 387.65000000000003, - 0.5, - 2276 - ], - [ - 598.53, - 399.58, - 0.5, - 2280 - ], - [ - 595.35, - 416.49000000000007, - 0.5, - 2288 - ], - [ - 592.76, - 426.87000000000006, - 0.5, - 2296 - ], - [ - 588.65, - 442.27000000000004, - 0.5, - 2304 - ], - [ - 587.24, - 448.59, - 0.5, - 2313 - ], - [ - 584.65, - 458.96, - 0.5, - 2321 - ], - [ - 583.13, - 466.53000000000003, - 0.5, - 2329 - ], - [ - 583.13, - 476.90000000000003, - 0.5, - 2337 - ], - [ - 583.13, - 478.04, - 0.5, - 2346 - ], - [ - 584.28, - 478.42, - 0.5, - 2353 - ], - [ - 590.6, - 478.42, - 0.5, - 2361 - ], - [ - 602.75, - 469.3, - 0.5, - 2370 - ], - [ - 617.51, - 455.67, - 0.5, - 2378 - ], - [ - 634.94, - 438.22999999999996, - 0.5, - 2386 - ], - [ - 654.44, - 420.03000000000003, - 0.5, - 2395 - ], - [ - 662.22, - 413.12000000000006, - 0.5, - 2402 - ], - [ - 668.27, - 408.58, - 0.5, - 2412 - ], - [ - 676.91, - 401.66, - 0.5, - 2419 - ], - [ - 682.96, - 396.36000000000007, - 0.5, - 2426 - ], - [ - 692.47, - 392.04, - 0.5, - 2435 - ], - [ - 694.2, - 392.04, - 0.5, - 2445 - ], - [ - 695.94, - 392.04, - 0.5, - 2451 - ], - [ - 696.67, - 399.45, - 0.5, - 2462 - ], - [ - 696.67, - 409.82, - 0.5, - 2467 - ], - [ - 696.67, - 416.14000000000004, - 0.5, - 2479 - ], - [ - 695.8100000000001, - 426.51000000000005, - 0.5, - 2483 - ], - [ - 693.23, - 436.8, - 0.5, - 2495 - ], - [ - 692.63, - 440.96, - 0.5, - 2500 - ], - [ - 691.9300000000001, - 447.28000000000003, - 0.5, - 2511 - ], - [ - 691.9300000000001, - 452.46999999999997, - 0.5, - 2516 - ], - [ - 691.9300000000001, - 457.65000000000003, - 0.5, - 2529 - ], - [ - 691.9300000000001, - 458.8, - 0.5, - 2532 - ], - [ - 695.15, - 459.33, - 0.5, - 2545 - ], - [ - 702.72, - 459.33, - 0.5, - 2548 - ], - [ - 711.63, - 458.52000000000004, - 0.5, - 2561 - ], - [ - 724.98, - 450.3, - 0.5, - 2565 - ], - [ - 740.1200000000001, - 441.65000000000003, - 0.5, - 2576 - ], - [ - 746.0799999999999, - 436.43, - 0.5, - 2581 - ], - [ - 759.4300000000001, - 427.19, - 0.5, - 2595 - ], - [ - 769.53, - 419.83, - 0.5, - 2598 - ], - [ - 772.23, - 417.67, - 0.5, - 2611 - ], - [ - 777.8499999999999, - 414.15000000000003, - 0.5, - 2614 - ], - [ - 781.4200000000001, - 411.17, - 0.5, - 2622 - ], - [ - 783.8499999999999, - 410.2, - 0.5, - 2630 - ], - [ - 786.28, - 409.71, - 0.5, - 2638 - ], - [ - 786.55, - 409.71, - 0.5, - 2646 - ], - [ - 787.03, - 412.09999999999997, - 0.5, - 2655 - ], - [ - 787.6200000000001, - 416.27000000000004, - 0.5, - 2662 - ], - [ - 788.3199999999999, - 422.59, - 0.5, - 2671 - ], - [ - 789.02, - 428.91, - 0.5, - 2679 - ], - [ - 789.51, - 431.34999999999997, - 0.5, - 2687 - ], - [ - 792.0999999999999, - 441.71999999999997, - 0.5, - 2695 - ], - [ - 793.8399999999999, - 445.8, - 0.5, - 2704 - ], - [ - 795.3, - 447.74000000000007, - 0.5, - 2712 - ], - [ - 799.0799999999999, - 454.55, - 0.5, - 2720 - ], - [ - 801.03, - 456.01000000000005, - 0.5, - 2728 - ], - [ - 805.95, - 460.21999999999997, - 0.5, - 2738 - ], - [ - 809.1700000000001, - 461.83, - 0.5, - 2745 - ], - [ - 812.74, - 464.21, - 0.5, - 2752 - ], - [ - 815.98, - 465.29, - 0.5, - 2762 - ], - [ - 820.1500000000001, - 466.47999999999996, - 0.5, - 2768 - ], - [ - 824.3, - 467.07, - 0.5, - 2778 - ], - [ - 828.46, - 467.66, - 0.5, - 2785 - ], - [ - 832.6300000000001, - 467.66, - 0.5, - 2795 - ], - [ - 837.81, - 467.66, - 0.5, - 2801 - ], - [ - 843.8700000000001, - 463.12000000000006, - 0.5, - 2812 - ], - [ - 849.9200000000001, - 458.58, - 0.5, - 2817 - ], - [ - 862.8900000000001, - 446.69, - 0.5, - 2828 - ], - [ - 866.1300000000001, - 442.14000000000004, - 0.5, - 2834 - ], - [ - 872.8700000000001, - 433.71, - 0.5, - 2845 - ], - [ - 879.79, - 425.93, - 0.5, - 2850 - ], - [ - 892.8800000000001, - 408.07, - 0.5, - 2862 - ], - [ - 895.8499999999999, - 404.50000000000006, - 0.5, - 2866 - ], - [ - 898.02, - 401.8, - 0.5, - 2878 - ], - [ - 903.31, - 395.74, - 0.5, - 2882 - ], - [ - 906.28, - 392.17, - 0.5, - 2896 - ], - [ - 908.44, - 389.47, - 0.5, - 2899 - ], - [ - 909.74, - 388.17, - 0.5, - 2912 - ], - [ - 910.3900000000001, - 387.51, - 0.5, - 2916 - ], - [ - 911.04, - 387.18, - 0.5, - 2929 - ], - [ - 911.04, - 387.94, - 0.5, - 2964 - ], - [ - 911.04, - 391.19, - 0.5, - 2977 - ], - [ - 911.04, - 395.35, - 0.5, - 2980 - ], - [ - 908.1300000000001, - 408.92, - 0.5, - 2988 - ], - [ - 907.69, - 410.65000000000003, - 0.5, - 2996 - ], - [ - 904.79, - 424.21, - 0.5, - 3005 - ], - [ - 904.3, - 426.65000000000003, - 0.5, - 3012 - ], - [ - 904.3, - 427.3, - 0.5, - 3022 - ], - [ - 904.3, - 430.55, - 0.5, - 3029 - ], - [ - 904.3, - 433.8, - 0.5, - 3037 - ], - [ - 906.03, - 434.22999999999996, - 0.5, - 3045 - ], - [ - 906.03, - 433.75000000000006, - 0.5, - 3094 - ], - [ - 912.45, - 422.74000000000007, - 0.5, - 3102 - ], - [ - 921.7, - 409.38000000000005, - 0.5, - 3111 - ], - [ - 929.48, - 397.71, - 0.5, - 3119 - ], - [ - 935.6400000000001, - 383.32, - 0.5, - 3130 - ], - [ - 940.5, - 369.7, - 0.5, - 3135 - ], - [ - 944.1700000000001, - 357.76, - 0.5, - 3145 - ], - [ - 945.8700000000001, - 347.57, - 0.5, - 3151 - ], - [ - 946.73, - 337.2, - 0.5, - 3162 - ], - [ - 947.9200000000001, - 315.77000000000004, - 0.5, - 3167 - ], - [ - 948.5699999999999, - 310.58000000000004, - 0.5, - 3179 - ], - [ - 949.3800000000001, - 301.66, - 0.5, - 3183 - ], - [ - 949.3800000000001, - 292.75, - 0.5, - 3196 - ], - [ - 949.3800000000001, - 289.5, - 0.5, - 3200 - ], - [ - 949.3800000000001, - 283.17, - 0.5, - 3212 - ], - [ - 949.3800000000001, - 279.01, - 0.5, - 3216 - ], - [ - 949.3800000000001, - 268.63, - 0.5, - 3229 - ], - [ - 949.3800000000001, - 266.89000000000004, - 0.5, - 3232 - ], - [ - 949.8599999999999, - 264.45, - 0.5, - 3246 - ], - [ - 949.8599999999999, - 262.71000000000004, - 0.5, - 3249 - ], - [ - 949.8599999999999, - 260.27000000000004, - 0.5, - 3261 - ], - [ - 949.8599999999999, - 259.99, - 0.5, - 3264 - ], - [ - 949.8599999999999, - 259.44, - 0.5, - 3281 - ], - [ - 949.8599999999999, - 259.17, - 0.5, - 3295 - ], - [ - 949.8599999999999, - 258.89000000000004, - 0.5, - 3299 - ], - [ - 949.8599999999999, - 259.12, - 0.5, - 3347 - ], - [ - 949.8599999999999, - 259.38, - 0.5, - 3355 - ], - [ - 949.8599999999999, - 259.66, - 0.5, - 3363 - ] + [8.49, 272.75, 0.5, 0], + [9.49, 273.75, 0.5, 10], + [7.91, 273.33, 0.5, 18], + [7.91, 272.65, 0.5, 207], + [11.13, 268.13, 0.5, 213], + [15.34, 263.21, 0.5, 215], + [23.12, 255.43, 0.5, 221], + [34.42, 244.13, 0.5, 230], + [46.74, 233.86, 0.5, 237], + [59.72, 220.88, 0.5, 245], + [77.91, 205.1, 0.5, 254], + [95.34, 187.67, 0.5, 262], + [112.77, 171.48, 0.5, 270], + [131.45, 155.3, 0.5, 279], + [137.09, 148.03, 0.5, 287], + [150.72, 133.26, 0.5, 296], + [154.29, 130.29, 0.5, 302], + [162.55, 121.1, 0.5, 312], + [167.47, 116.18, 0.5, 319], + [170.44, 112.61, 0.5, 329], + [172.6, 109.9, 0.5, 334], + [173.74, 109.14, 0.5, 346], + [174.07, 108.49, 0.5, 351], + [174.34, 108.21, 0.5, 364], + [174.62, 107.93, 0.5, 367], + [174.62, 108.16, 0.5, 410], + [173.74, 109.9, 0.5, 416], + [171.83, 111.81, 0.5, 429], + [167.29, 118.62, 0.5, 432], + [160.38, 126.38, 0.5, 446], + [150.65, 137.08, 0.5, 448], + [131.07, 162.25, 0.5, 463], + [123.29, 173.92, 0.5, 465], + [93.7, 215.69, 0.5, 479], + [85.04, 230.83, 0.5, 483], + [65.29, 262.74, 0.5, 496], + [58.86, 273.76, 0.5, 498], + [54.12, 281.65, 0.5, 512], + [45.9, 295, 0.5, 514], + [40.8, 304.34, 0.5, 522], + [38.2, 309.53, 0.5, 530], + [36.12, 315.79, 0.5, 538], + [36.12, 316.06, 0.5, 546], + [40.28, 314.87, 0.5, 555], + [58.47, 295.37, 0.5, 563], + [101.64, 248.28, 0.5, 570], + [144.02, 195.81, 0.5, 579], + [166.81, 166.94, 0.5, 587], + [211.2, 116.49, 0.5, 595], + [255.4, 66.25, 0.5, 603], + [271.59, 48.81, 0.5, 611], + [282.88, 37.52, 0.5, 619], + [289.79, 29.74, 0.5, 628], + [304.56, 16.11, 0.5, 635], + [312.82, 6.92, 0.5, 645], + [321.46, 0, 0.5, 652], + [322.6, 0, 0.5, 662], + [322.6, 3.25, 0.5, 668], + [307.66, 21.92, 0.5, 679], + [284.87, 50.79, 0.5, 684], + [252.54, 92.09, 0.5, 695], + [179.28, 181.05, 0.5, 701], + [158.77, 208.87, 0.5, 710], + [140.45, 234.24, 0.5, 717], + [108.98, 280.51, 0.5, 729], + [100.33, 295.65, 0.5, 733], + [95.14, 305.16, 0.5, 746], + [84.42, 324.21, 0.5, 749], + [77.61, 336.85, 0.5, 762], + [74.84, 343.08, 0.5, 766], + [72.73, 349.4, 0.5, 777], + [72.73, 350.05, 0.5, 782], + [75.16, 350.05, 0.5, 797], + [88.78, 345.18, 0.5, 799], + [107.39, 330.29, 0.5, 811], + [129.94, 307.74, 0.5, 815], + [159.27, 276.77, 0.5, 829], + [191.28, 243.07, 0.5, 831], + [203.77, 228.3, 0.5, 845], + [212.04, 219.12, 0.5, 847], + [217.33, 213.06, 0.5, 859], + [227.06, 203.33, 0.5, 863], + [238.35, 192.03, 0.5, 872], + [240.79, 191.05, 0.5, 880], + [240.79, 195.15, 0.5, 888], + [214.69, 236.91, 0.5, 896], + [182.27, 288.38, 0.5, 904], + [135.2, 357.87, 0.5, 913], + [82.17, 439.82, 0.5, 920], + [60.98, 477.3, 0.5, 929], + [44.87, 508.05, 0.5, 937], + [34.65, 525.08, 0.5, 945], + [29.13, 536.1, 0.5, 953], + [17.93, 557.27, 0.5, 962], + [0, 596.38, 0.5, 969], + [11.810000000000002, 584.56, 0.5, 986], + [85.44, 480.93, 0.5, 995], + [160.3, 372.8, 0.5, 1002], + [204.01, 307.23, 0.5, 1012], + [288.06000000000006, 188.39000000000004, 0.5, 1018], + [318.59000000000003, 145.29000000000002, 0.5, 1028], + [341.38, 116.42, 0.5, 1034], + [353.87, 100.51, 0.5, 1045], + [359.78, 92.05999999999999, 0.5, 1051], + [393.1, 47.64, 0.5, 1062], + [404.99, 34.66000000000001, 0.5, 1067], + [404.99, 35.790000000000006, 0.5, 1079], + [390.09000000000003, 60.17, 0.5, 1083], + [344.19000000000005, 125.74, 0.5, 1096], + [299.47, 185.37, 0.5, 1099], + [251.21000000000004, 258.89000000000004, 0.5, 1112], + [229.16999999999996, 291.95, 0.5, 1115], + [210.85000000000002, 317.32, 0.5, 1128], + [198.94, 336.37, 0.5, 1132], + [190.72000000000003, 349.72, 0.5, 1146], + [175.82, 374.1, 0.5, 1148], + [167.60000000000002, 387.45, 0.5, 1160], + [157.81, 409.47999999999996, 0.5, 1164], + [163.88, 406.16, 0.5, 1181], + [203.31, 362.98, 0.5, 1196], + [226.73000000000002, 338.08000000000004, 0.5, 1198], + [271.13, 287.63, 0.5, 1206], + [318.82000000000005, 233.72000000000003, 0.5, 1213], + [337.78, 212.04000000000002, 0.5, 1226], + [351.40999999999997, 197.27000000000004, 0.5, 1229], + [359.33000000000004, 188.47000000000003, 0.5, 1238], + [375.51, 171.03000000000003, 0.5, 1246], + [385.02, 160.58000000000004, 0.5, 1255], + [399.78, 146.94, 0.5, 1263], + [397.96000000000004, 155.42000000000002, 0.5, 1278], + [379.25, 184.21000000000004, 0.5, 1287], + [356.44000000000005, 221.69, 0.5, 1295], + [326.82000000000005, 269.81, 0.5, 1303], + [294.4, 319.38, 0.5, 1312], + [280.99, 338.88, 0.5, 1320], + [272.78, 352.24, 0.5, 1328], + [267.90999999999997, 360.34000000000003, 0.5, 1336], + [257.69000000000005, 377.37, 0.5, 1345], + [252.82000000000005, 385.47, 0.5, 1352], + [246.98000000000002, 398.12000000000006, 0.5, 1362], + [254.24, 393.28000000000003, 0.5, 1379], + [274.54999999999995, 372.96000000000004, 0.5, 1384], + [302.73, 344.78000000000003, 0.5, 1395], + [316.36, 330.01, 0.5, 1401], + [342.19000000000005, 302.66, 0.5, 1412], + [351.90999999999997, 291.96000000000004, 0.5, 1417], + [370.11, 272.46000000000004, 0.5, 1427], + [374.32000000000005, 267.54, 0.5, 1433], + [382.53, 258.40000000000003, 0.5, 1446], + [386.74, 253.49, 0.5, 1450], + [392.74, 248.99, 0.5, 1463], + [390.21000000000004, 258.45, 0.5, 1479], + [376.66999999999996, 284.19, 0.5, 1482], + [357.77, 320.40000000000003, 0.5, 1496], + [338.34000000000003, 359.25, 0.5, 1498], + [328.81000000000006, 379.48, 0.5, 1512], + [322, 392.13, 0.5, 1514], + [318.87, 400.72999999999996, 0.5, 1529], + [311.68000000000006, 415.11000000000007, 0.5, 1532], + [307.16999999999996, 425.92, 0.5, 1546], + [304.58000000000004, 436.3, 0.5, 1548], + [304.58000000000004, 437.44, 0.5, 1555], + [309.77, 436.13000000000005, 0.5, 1563], + [325.24, 420.66, 0.5, 1572], + [346.38, 396.7, 0.5, 1580], + [358.87, 380.79, 0.5, 1588], + [380.84000000000003, 354.43, 0.5, 1596], + [391.11, 342.1, 0.5, 1604], + [396.78, 334.81, 0.5, 1612], + [409.16999999999996, 320.15000000000003, 0.5, 1621], + [416.09000000000003, 311.51, 0.5, 1629], + [419.97, 307.63, 0.5, 1637], + [426.02, 302.33000000000004, 0.5, 1645], + [426.02, 307.29, 0.5, 1662], + [421.41999999999996, 319.23, 0.5, 1669], + [414.23, 333.61, 0.5, 1679], + [411.20000000000005, 341.17, 0.5, 1686], + [405.03999999999996, 355.55, 0.5, 1696], + [403.85, 359.71000000000004, 0.5, 1702], + [400.82000000000005, 367.28000000000003, 0.5, 1710], + [398.89, 372.42, 0.5, 1719], + [397.90999999999997, 374.86, 0.5, 1728], + [397.90999999999997, 378.11, 0.5, 1734], + [397.90999999999997, 378.38, 0.5, 1745], + [399.65, 378.38, 0.5, 1751], + [403.21000000000004, 375.40000000000003, 0.5, 1763], + [409.24, 370.13, 0.5, 1767], + [417.02, 362.35, 0.5, 1778], + [424.78999999999996, 355.43, 0.5, 1784], + [427.77, 352.45, 0.5, 1795], + [432.65999999999997, 347.55, 0.5, 1799], + [436.23, 344.58000000000004, 0.5, 1812], + [438.39, 341.87, 0.5, 1816], + [440.33000000000004, 340.42, 0.5, 1828], + [440.98, 340.09000000000003, 0.5, 1832], + [441.63, 340.09000000000003, 0.5, 1843], + [441.9, 340.09000000000003, 0.5, 1848], + [441.9, 345.28000000000003, 0.5, 1862], + [441.9, 354.19, 0.5, 1865], + [438.02, 367.78000000000003, 0.5, 1878], + [433.90999999999997, 383.19, 0.5, 1881], + [431.68000000000006, 390.6, 0.5, 1895], + [428.76, 404.21999999999997, 0.5, 1898], + [427.46000000000004, 409.40000000000003, 0.5, 1912], + [426.65, 418.31, 0.5, 1914], + [426.01, 423.41, 0.5, 1926], + [426.01, 430.96999999999997, 0.5, 1930], + [426.01, 432.11000000000007, 0.5, 1937], + [427.13, 432.11000000000007, 0.5, 1946], + [433.45000000000005, 432.11000000000007, 0.5, 1955], + [441.56000000000006, 428.06, 0.5, 1963], + [452.23, 419.32, 0.5, 1971], + [465.21000000000004, 407.42, 0.5, 1979], + [478.84000000000003, 392.65000000000003, 0.5, 1987], + [494.31000000000006, 377.17, 0.5, 1995], + [500.78999999999996, 370.69, 0.5, 2003], + [513.77, 358.79, 0.5, 2012], + [516.74, 355.22, 0.5, 2019], + [524.52, 348.3, 0.5, 2029], + [529.4300000000001, 344.09000000000003, 0.5, 2036], + [532.11, 341.94, 0.5, 2045], + [533.84, 341.07, 0.5, 2052], + [534.49, 341.07, 0.5, 2062], + [534.77, 341.07, 0.5, 2069], + [534.77, 348.63, 0.5, 2079], + [532.01, 360.57, 0.5, 2084], + [526.91, 375.87, 0.5, 2096], + [520.09, 394.05, 0.5, 2101], + [517.87, 401.45, 0.5, 2114], + [513.76, 416.84999999999997, 0.5, 2118], + [512.57, 421.02000000000004, 0.5, 2129], + [511.04999999999995, 428.58, 0.5, 2133], + [509.76, 433.72999999999996, 0.5, 2145], + [509.76, 441.3, 0.5, 2150], + [509.76, 441.95, 0.5, 2163], + [511.5, 441.95, 0.5, 2166], + [517.74, 441.95, 0.5, 2179], + [529.42, 434.16, 0.5, 2182], + [541.74, 423.89000000000004, 0.5, 2196], + [557.64, 412.53000000000003, 0.5, 2198], + [563.69, 407.22999999999996, 0.5, 2212], + [576.02, 396.96, 0.5, 2215], + [579.58, 394.58000000000004, 0.5, 2229], + [586.88, 388.90000000000003, 0.5, 2232], + [591.42, 385.65000000000003, 0.5, 2244], + [594.63, 384.05, 0.5, 2248], + [597.87, 383.5, 0.5, 2262], + [598.53, 383.5, 0.5, 2265], + [598.53, 387.65000000000003, 0.5, 2276], + [598.53, 399.58, 0.5, 2280], + [595.35, 416.49000000000007, 0.5, 2288], + [592.76, 426.87000000000006, 0.5, 2296], + [588.65, 442.27000000000004, 0.5, 2304], + [587.24, 448.59, 0.5, 2313], + [584.65, 458.96, 0.5, 2321], + [583.13, 466.53000000000003, 0.5, 2329], + [583.13, 476.90000000000003, 0.5, 2337], + [583.13, 478.04, 0.5, 2346], + [584.28, 478.42, 0.5, 2353], + [590.6, 478.42, 0.5, 2361], + [602.75, 469.3, 0.5, 2370], + [617.51, 455.67, 0.5, 2378], + [634.94, 438.22999999999996, 0.5, 2386], + [654.44, 420.03000000000003, 0.5, 2395], + [662.22, 413.12000000000006, 0.5, 2402], + [668.27, 408.58, 0.5, 2412], + [676.91, 401.66, 0.5, 2419], + [682.96, 396.36000000000007, 0.5, 2426], + [692.47, 392.04, 0.5, 2435], + [694.2, 392.04, 0.5, 2445], + [695.94, 392.04, 0.5, 2451], + [696.67, 399.45, 0.5, 2462], + [696.67, 409.82, 0.5, 2467], + [696.67, 416.14000000000004, 0.5, 2479], + [695.8100000000001, 426.51000000000005, 0.5, 2483], + [693.23, 436.8, 0.5, 2495], + [692.63, 440.96, 0.5, 2500], + [691.9300000000001, 447.28000000000003, 0.5, 2511], + [691.9300000000001, 452.46999999999997, 0.5, 2516], + [691.9300000000001, 457.65000000000003, 0.5, 2529], + [691.9300000000001, 458.8, 0.5, 2532], + [695.15, 459.33, 0.5, 2545], + [702.72, 459.33, 0.5, 2548], + [711.63, 458.52000000000004, 0.5, 2561], + [724.98, 450.3, 0.5, 2565], + [740.1200000000001, 441.65000000000003, 0.5, 2576], + [746.0799999999999, 436.43, 0.5, 2581], + [759.4300000000001, 427.19, 0.5, 2595], + [769.53, 419.83, 0.5, 2598], + [772.23, 417.67, 0.5, 2611], + [777.8499999999999, 414.15000000000003, 0.5, 2614], + [781.4200000000001, 411.17, 0.5, 2622], + [783.8499999999999, 410.2, 0.5, 2630], + [786.28, 409.71, 0.5, 2638], + [786.55, 409.71, 0.5, 2646], + [787.03, 412.09999999999997, 0.5, 2655], + [787.6200000000001, 416.27000000000004, 0.5, 2662], + [788.3199999999999, 422.59, 0.5, 2671], + [789.02, 428.91, 0.5, 2679], + [789.51, 431.34999999999997, 0.5, 2687], + [792.0999999999999, 441.71999999999997, 0.5, 2695], + [793.8399999999999, 445.8, 0.5, 2704], + [795.3, 447.74000000000007, 0.5, 2712], + [799.0799999999999, 454.55, 0.5, 2720], + [801.03, 456.01000000000005, 0.5, 2728], + [805.95, 460.21999999999997, 0.5, 2738], + [809.1700000000001, 461.83, 0.5, 2745], + [812.74, 464.21, 0.5, 2752], + [815.98, 465.29, 0.5, 2762], + [820.1500000000001, 466.47999999999996, 0.5, 2768], + [824.3, 467.07, 0.5, 2778], + [828.46, 467.66, 0.5, 2785], + [832.6300000000001, 467.66, 0.5, 2795], + [837.81, 467.66, 0.5, 2801], + [843.8700000000001, 463.12000000000006, 0.5, 2812], + [849.9200000000001, 458.58, 0.5, 2817], + [862.8900000000001, 446.69, 0.5, 2828], + [866.1300000000001, 442.14000000000004, 0.5, 2834], + [872.8700000000001, 433.71, 0.5, 2845], + [879.79, 425.93, 0.5, 2850], + [892.8800000000001, 408.07, 0.5, 2862], + [895.8499999999999, 404.50000000000006, 0.5, 2866], + [898.02, 401.8, 0.5, 2878], + [903.31, 395.74, 0.5, 2882], + [906.28, 392.17, 0.5, 2896], + [908.44, 389.47, 0.5, 2899], + [909.74, 388.17, 0.5, 2912], + [910.3900000000001, 387.51, 0.5, 2916], + [911.04, 387.18, 0.5, 2929], + [911.04, 387.94, 0.5, 2964], + [911.04, 391.19, 0.5, 2977], + [911.04, 395.35, 0.5, 2980], + [908.1300000000001, 408.92, 0.5, 2988], + [907.69, 410.65000000000003, 0.5, 2996], + [904.79, 424.21, 0.5, 3005], + [904.3, 426.65000000000003, 0.5, 3012], + [904.3, 427.3, 0.5, 3022], + [904.3, 430.55, 0.5, 3029], + [904.3, 433.8, 0.5, 3037], + [906.03, 434.22999999999996, 0.5, 3045], + [906.03, 433.75000000000006, 0.5, 3094], + [912.45, 422.74000000000007, 0.5, 3102], + [921.7, 409.38000000000005, 0.5, 3111], + [929.48, 397.71, 0.5, 3119], + [935.6400000000001, 383.32, 0.5, 3130], + [940.5, 369.7, 0.5, 3135], + [944.1700000000001, 357.76, 0.5, 3145], + [945.8700000000001, 347.57, 0.5, 3151], + [946.73, 337.2, 0.5, 3162], + [947.9200000000001, 315.77000000000004, 0.5, 3167], + [948.5699999999999, 310.58000000000004, 0.5, 3179], + [949.3800000000001, 301.66, 0.5, 3183], + [949.3800000000001, 292.75, 0.5, 3196], + [949.3800000000001, 289.5, 0.5, 3200], + [949.3800000000001, 283.17, 0.5, 3212], + [949.3800000000001, 279.01, 0.5, 3216], + [949.3800000000001, 268.63, 0.5, 3229], + [949.3800000000001, 266.89000000000004, 0.5, 3232], + [949.8599999999999, 264.45, 0.5, 3246], + [949.8599999999999, 262.71000000000004, 0.5, 3249], + [949.8599999999999, 260.27000000000004, 0.5, 3261], + [949.8599999999999, 259.99, 0.5, 3264], + [949.8599999999999, 259.44, 0.5, 3281], + [949.8599999999999, 259.17, 0.5, 3295], + [949.8599999999999, 258.89000000000004, 0.5, 3299], + [949.8599999999999, 259.12, 0.5, 3347], + [949.8599999999999, 259.38, 0.5, 3355], + [949.8599999999999, 259.66, 0.5, 3363] ] -} \ No newline at end of file +} diff --git a/client-src/views/draw/state/easings.ts b/client-src/views/draw/state/easings.ts index 8f63c70..4f026eb 100644 --- a/client-src/views/draw/state/easings.ts +++ b/client-src/views/draw/state/easings.ts @@ -1,4 +1,4 @@ -import type { Easing } from './types' +import type { Easing } from "./types"; export const EASINGS: Record number> = { linear: (t) => t, @@ -26,11 +26,11 @@ export const EASINGS: Record number> = { t <= 0 ? 0 : t >= 1 - ? 1 - : t < 0.5 - ? Math.pow(2, 20 * t - 10) / 2 - : (2 - Math.pow(2, -20 * t + 10)) / 2, -} + ? 1 + : t < 0.5 + ? Math.pow(2, 20 * t - 10) / 2 + : (2 - Math.pow(2, -20 * t + 10)) / 2, +}; export const EASING_STRINGS: Record = { linear: `(t) => t`, @@ -59,4 +59,4 @@ export const EASING_STRINGS: Record = { : t < 0.5 ? Math.pow(2, 20 * t - 10) / 2 : (2 - Math.pow(2, -20 * t + 10)) / 2`, -} +}; diff --git a/client-src/views/draw/state/excalidraw.json b/client-src/views/draw/state/excalidraw.json index 0543556..0525dfd 100644 --- a/client-src/views/draw/state/excalidraw.json +++ b/client-src/views/draw/state/excalidraw.json @@ -24,9 +24,7 @@ "seed": 114976664, "groupIds": [], "strokeSharpness": "sharp", - "boundElementIds": [ - "-EHziqjGHk4B1NuZHwn03" - ] + "boundElementIds": ["-EHziqjGHk4B1NuZHwn03"] }, { "type": "rectangle", @@ -49,9 +47,7 @@ "seed": 1283029736, "groupIds": [], "strokeSharpness": "sharp", - "boundElementIds": [ - "dwe3nNsrVJUtqhWKpk2nX" - ] + "boundElementIds": ["dwe3nNsrVJUtqhWKpk2nX"] }, { "type": "freedraw", @@ -76,21 +72,12 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - -302, - -70 - ] + [0, 0], + [-302, -70] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0.07999999821186066 - ] + "pressures": [0, 0.07999999821186066] }, { "type": "freedraw", @@ -115,31 +102,14 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - 6.363636363636374, - -7.272727272727252 - ], - [ - 9.090909090909122, - -12.727272727272748 - ], - [ - -57.27272727272725, - 196.36363636363637 - ] + [0, 0], + [6.363636363636374, -7.272727272727252], + [9.090909090909122, -12.727272727272748], + [-57.27272727272725, 196.36363636363637] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0, - 0, - 0 - ] + "pressures": [0, 0, 0, 0] }, { "type": "freedraw", @@ -164,21 +134,12 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - -102.63157894736838, - 211.40350877192986 - ] + [0, 0], + [-102.63157894736838, 211.40350877192986] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0 - ] + "pressures": [0, 0] }, { "type": "freedraw", @@ -203,21 +164,12 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - -168.98734177215186, - -70.8860759493673 - ] + [0, 0], + [-168.98734177215186, -70.8860759493673] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0.07999999821186066 - ] + "pressures": [0, 0.07999999821186066] }, { "type": "freedraw", @@ -242,21 +194,12 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - -178.48101265822777, - -73.41772151898749 - ] + [0, 0], + [-178.48101265822777, -73.41772151898749] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0.07999999821186066 - ] + "pressures": [0, 0.07999999821186066] }, { "type": "freedraw", @@ -281,21 +224,12 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - -156.96202531645565, - -48.7341772151899 - ] + [0, 0], + [-156.96202531645565, -48.7341772151899] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0.07999999821186066 - ] + "pressures": [0, 0.07999999821186066] }, { "type": "freedraw", @@ -320,36 +254,15 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - 5.696202531645554, - -5.6962025316456675 - ], - [ - 6.962025316455652, - -5.6962025316456675 - ], - [ - 7.5949367088607005, - -5.6962025316456675 - ], - [ - -134.17721518987338, - -84.17721518987355 - ] + [0, 0], + [5.696202531645554, -5.6962025316456675], + [6.962025316455652, -5.6962025316456675], + [7.5949367088607005, -5.6962025316456675], + [-134.17721518987338, -84.17721518987355] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0, - 0, - 0, - 0.07999999821186066 - ] + "pressures": [0, 0, 0, 0, 0.07999999821186066] }, { "type": "freedraw", @@ -374,21 +287,12 @@ "strokeSharpness": "round", "boundElementIds": [], "points": [ - [ - 0, - 0 - ], - [ - 73.29192546583846, - -152.17391304347825 - ] + [0, 0], + [73.29192546583846, -152.17391304347825] ], "lastCommittedPoint": null, "simulatePressure": false, - "pressures": [ - 0, - 0 - ] + "pressures": [0, 0] }, { "type": "arrow", @@ -422,14 +326,8 @@ "startArrowhead": null, "endArrowhead": "arrow", "points": [ - [ - 0, - 0 - ], - [ - 144.28571428571433, - -70 - ] + [0, 0], + [144.28571428571433, -70] ] }, { @@ -464,14 +362,8 @@ "startArrowhead": null, "endArrowhead": "arrow", "points": [ - [ - 0, - 0 - ], - [ - 370.8053915248326, - -30.658310758948005 - ] + [0, 0], + [370.8053915248326, -30.658310758948005] ] }, { @@ -587,14 +479,8 @@ "startArrowhead": null, "endArrowhead": "arrow", "points": [ - [ - 0, - 0 - ], - [ - -385.71428571428567, - 15.324638305051167 - ] + [0, 0], + [-385.71428571428567, 15.324638305051167] ] }, { @@ -629,14 +515,8 @@ "startArrowhead": null, "endArrowhead": "arrow", "points": [ - [ - 0, - 0 - ], - [ - -112.85714285714278, - 136.36251141618027 - ] + [0, 0], + [-112.85714285714278, 136.36251141618027] ] }, { @@ -660,10 +540,7 @@ "seed": 783218152, "groupIds": [], "strokeSharpness": "sharp", - "boundElementIds": [ - "JdK63HbC67f4clxAgYQB8", - "Z0n4R_iIfG53FrM11qr_B" - ], + "boundElementIds": ["JdK63HbC67f4clxAgYQB8", "Z0n4R_iIfG53FrM11qr_B"], "fontSize": 28, "fontFamily": 1, "text": "you can select them\nby clicking on these ends", @@ -676,4 +553,4 @@ "gridSize": null, "viewBackgroundColor": "#ffffff" } -} \ No newline at end of file +} diff --git a/client-src/views/draw/state/flash.json b/client-src/views/draw/state/flash.json index 36336e8..e16b322 100644 --- a/client-src/views/draw/state/flash.json +++ b/client-src/views/draw/state/flash.json @@ -1,812 +1,137 @@ [ - [ - 0, - 49.93, - 0.5, - 0 - ], - [ - 1, - 50.93, - 0.5, - 0 - ], - [ - 0, - 49.71, - 0.5, - 239 - ], - [ - 0, - 49.05, - 0.5, - 244 - ], - [ - 0, - 48.39, - 0.5, - 246 - ], - [ - 0, - 47.25, - 0.5, - 258 - ], - [ - 0, - 46.59, - 0.5, - 263 - ], - [ - 0, - 45.45, - 0.5, - 271 - ], - [ - 0, - 44.79, - 0.5, - 279 - ], - [ - 0, - 43.66, - 0.5, - 287 - ], - [ - 0.75, - 42.52, - 0.5, - 295 - ], - [ - 1.62, - 40.78, - 0.5, - 303 - ], - [ - 2.48, - 39.05, - 0.5, - 312 - ], - [ - 3.46, - 36.61, - 0.5, - 320 - ], - [ - 4.92, - 34.65, - 0.5, - 328 - ], - [ - 5.89, - 32.21, - 0.5, - 336 - ], - [ - 6.86, - 29.77, - 0.5, - 344 - ], - [ - 8.32, - 27.33, - 0.5, - 352 - ], - [ - 9.19, - 25.59, - 0.5, - 360 - ], - [ - 9.57, - 24.45, - 0.5, - 368 - ], - [ - 10.33, - 23.3, - 0.5, - 377 - ], - [ - 10.7, - 22.16, - 0.5, - 384 - ], - [ - 11.03, - 21.51, - 0.5, - 393 - ], - [ - 11.3, - 21.23, - 0.5, - 401 - ], - [ - 11.63, - 20.57, - 0.5, - 409 - ], - [ - 11.9, - 20.3, - 0.5, - 417 - ], - [ - 12.22, - 19.64, - 0.5, - 426 - ], - [ - 12.98, - 18.5, - 0.5, - 433 - ], - [ - 13.74, - 17.35, - 0.5, - 443 - ], - [ - 14.61, - 15.61, - 0.5, - 450 - ], - [ - 15.36, - 14.47, - 0.5, - 460 - ], - [ - 16.66, - 13.16, - 0.5, - 466 - ], - [ - 18.12, - 11.22, - 0.5, - 476 - ], - [ - 18.88, - 10.07, - 0.5, - 483 - ], - [ - 20.18, - 8.77, - 0.5, - 493 - ], - [ - 20.83, - 8.11, - 0.5, - 499 - ], - [ - 22.13, - 6.81, - 0.5, - 509 - ], - [ - 22.79, - 6.15, - 0.5, - 515 - ], - [ - 23.93, - 5.39, - 0.5, - 526 - ], - [ - 25.07, - 4.63, - 0.5, - 531 - ], - [ - 26.21, - 3.87, - 0.5, - 542 - ], - [ - 26.86, - 3.21, - 0.5, - 547 - ], - [ - 27.98, - 2.46, - 0.5, - 559 - ], - [ - 29.12, - 1.7, - 0.5, - 563 - ], - [ - 29.77, - 1.37, - 0.5, - 579 - ], - [ - 30.43, - 1.04, - 0.5, - 581 - ], - [ - 31.08, - 0.71, - 0.5, - 591 - ], - [ - 31.35, - 0.71, - 0.5, - 596 - ], - [ - 32, - 0.39, - 0.5, - 608 - ], - [ - 33.14, - 0.39, - 0.5, - 612 - ], - [ - 34.28, - 0.39, - 0.5, - 620 - ], - [ - 35.42, - 0, - 0.5, - 629 - ], - [ - 37.160000000000025, - 0, - 0.5, - 637 - ], - [ - 38.30000000000001, - 0, - 0.5, - 645 - ], - [ - 40.00999999999999, - 0, - 0.5, - 654 - ], - [ - 41.75, - 0, - 0.5, - 661 - ], - [ - 42.889999999999986, - 0, - 0.5, - 670 - ], - [ - 44.620000000000005, - 0, - 0.5, - 678 - ], - [ - 45.26999999999998, - 0, - 0.5, - 686 - ], - [ - 46.410000000000025, - 0, - 0.5, - 694 - ], - [ - 46.68000000000001, - 0, - 0.5, - 702 - ], - [ - 47.34000000000003, - 0, - 0.5, - 710 - ], - [ - 47.610000000000014, - 0, - 0.5, - 719 - ], - [ - 47.879999999999995, - 0, - 0.5, - 726 - ], - [ - 48.53000000000003, - 0, - 0.5, - 735 - ], - [ - 48.81, - 0, - 0.5, - 743 - ], - [ - 49.079999999999984, - 0, - 0.5, - 750 - ], - [ - 49.35000000000002, - 0, - 0.5, - 759 - ], - [ - 49.629999999999995, - 0, - 0.5, - 768 - ], - [ - 49.900000000000034, - 0, - 0.5, - 776 - ], - [ - 50.170000000000016, - 0, - 0.5, - 784 - ], - [ - 50.44999999999999, - 0.2799999999999727, - 0.5, - 793 - ], - [ - 50.44999999999999, - 0.5500000000000114, - 0.5, - 800 - ], - [ - 50.72000000000003, - 0.5500000000000114, - 0.5, - 810 - ], - [ - 50.72000000000003, - 0.8199999999999932, - 0.5, - 816 - ], - [ - 50.99000000000001, - 1.089999999999975, - 0.5, - 827 - ], - [ - 51.24000000000001, - 1.339999999999975, - 0.5, - 843 - ], - [ - 51.24000000000001, - 1.6100000000000136, - 0.5, - 848 - ], - [ - 51.50999999999999, - 1.8899999999999864, - 0.5, - 860 - ], - [ - 51.79000000000002, - 2.159999999999968, - 0.5, - 864 - ], - [ - 51.79000000000002, - 2.430000000000007, - 0.5, - 876 - ], - [ - 51.79000000000002, - 3.089999999999975, - 0.5, - 881 - ], - [ - 52.06, - 3.3600000000000136, - 0.5, - 893 - ], - [ - 52.06, - 3.6299999999999955, - 0.5, - 897 - ], - [ - 52.06, - 4.279999999999973, - 0.5, - 909 - ], - [ - 52.329999999999984, - 4.560000000000002, - 0.5, - 913 - ], - [ - 52.329999999999984, - 4.829999999999984, - 0.5, - 926 - ], - [ - 52.329999999999984, - 5.110000000000014, - 0.5, - 929 - ], - [ - 52.329999999999984, - 5.3799999999999955, - 0.5, - 942 - ], - [ - 52.329999999999984, - 5.649999999999977, - 0.5, - 946 - ], - [ - 52.329999999999984, - 5.930000000000007, - 0.5, - 959 - ], - [ - 52.329999999999984, - 6.199999999999989, - 0.5, - 962 - ], - [ - 52.329999999999984, - 6.46999999999997, - 0.5, - 975 - ], - [ - 52.329999999999984, - 6.75, - 0.5, - 979 - ], - [ - 52.329999999999984, - 7.399999999999977, - 0.5, - 987 - ], - [ - 52.329999999999984, - 8.050000000000011, - 0.5, - 995 - ], - [ - 52.329999999999984, - 8.699999999999989, - 0.5, - 1003 - ], - [ - 52.329999999999984, - 10.430000000000007, - 0.5, - 1011 - ], - [ - 52.329999999999984, - 11.569999999999993, - 0.5, - 1019 - ], - [ - 52.329999999999984, - 13.300000000000011, - 0.5, - 1027 - ], - [ - 52.329999999999984, - 15.04000000000002, - 0.5, - 1035 - ], - [ - 52.329999999999984, - 16.769999999999982, - 0.5, - 1044 - ], - [ - 52.329999999999984, - 17.909999999999968, - 0.5, - 1052 - ], - [ - 51.94999999999999, - 19.05000000000001, - 0.5, - 1060 - ], - [ - 51.94999999999999, - 20.19999999999999, - 0.5, - 1068 - ], - [ - 51.56999999999999, - 21.339999999999975, - 0.5, - 1077 - ], - [ - 51.24000000000001, - 21.99000000000001, - 0.5, - 1084 - ], - [ - 51.24000000000001, - 22.639999999999986, - 0.5, - 1096 - ], - [ - 51.24000000000001, - 22.909999999999968, - 0.5, - 1101 - ], - [ - 50.910000000000025, - 23.569999999999993, - 0.5, - 1109 - ], - [ - 50.910000000000025, - 23.839999999999975, - 0.5, - 1117 - ], - [ - 50.910000000000025, - 24.110000000000014, - 0.5, - 1126 - ], - [ - 50.629999999999995, - 24.389999999999986, - 0.5, - 1133 - ], - [ - 50.629999999999995, - 25.04000000000002, - 0.5, - 1142 - ], - [ - 50.360000000000014, - 25.310000000000002, - 0.5, - 1149 - ], - [ - 50.360000000000014, - 25.95999999999998, - 0.5, - 1160 - ], - [ - 50.03000000000003, - 26.620000000000005, - 0.5, - 1166 - ], - [ - 49.69999999999999, - 27.269999999999982, - 0.5, - 1176 - ], - [ - 49.370000000000005, - 27.920000000000016, - 0.5, - 1182 - ], - [ - 49.370000000000005, - 28.19999999999999, - 0.5, - 1193 - ], - [ - 48.99000000000001, - 29.339999999999975, - 0.5, - 1198 - ], - [ - 48.660000000000025, - 29.99000000000001, - 0.5, - 1209 - ], - [ - 48.660000000000025, - 30.639999999999986, - 0.5, - 1214 - ], - [ - 48.329999999999984, - 31.29000000000002, - 0.5, - 1226 - ], - [ - 48.329999999999984, - 31.94999999999999, - 0.5, - 1231 - ], - [ - 48, - 32.599999999999966, - 0.5, - 1243 - ], - [ - 48, - 32.870000000000005, - 0.5, - 1246 - ], - [ - 47.68000000000001, - 33.51999999999998, - 0.5, - 1260 - ], - [ - 47.68000000000001, - 33.80000000000001, - 0.5, - 1263 - ], - [ - 47.68000000000001, - 34.06999999999999, - 0.5, - 1276 - ], - [ - 47.68000000000001, - 34.30000000000001, - 0.5, - 1297 - ], - [ - 47.68000000000001, - 34.52999999999997, - 0.5, - 1355 - ], - [ - 47.400000000000034, - 34.52999999999997, - 0.5, - 1361 - ], - [ - 47.400000000000034, - 34.75999999999999, - 0.5, - 1437 - ], - [ - 47.170000000000016, - 34.75999999999999, - 0.5, - 1493 - ] -] \ No newline at end of file + [0, 49.93, 0.5, 0], + [1, 50.93, 0.5, 0], + [0, 49.71, 0.5, 239], + [0, 49.05, 0.5, 244], + [0, 48.39, 0.5, 246], + [0, 47.25, 0.5, 258], + [0, 46.59, 0.5, 263], + [0, 45.45, 0.5, 271], + [0, 44.79, 0.5, 279], + [0, 43.66, 0.5, 287], + [0.75, 42.52, 0.5, 295], + [1.62, 40.78, 0.5, 303], + [2.48, 39.05, 0.5, 312], + [3.46, 36.61, 0.5, 320], + [4.92, 34.65, 0.5, 328], + [5.89, 32.21, 0.5, 336], + [6.86, 29.77, 0.5, 344], + [8.32, 27.33, 0.5, 352], + [9.19, 25.59, 0.5, 360], + [9.57, 24.45, 0.5, 368], + [10.33, 23.3, 0.5, 377], + [10.7, 22.16, 0.5, 384], + [11.03, 21.51, 0.5, 393], + [11.3, 21.23, 0.5, 401], + [11.63, 20.57, 0.5, 409], + [11.9, 20.3, 0.5, 417], + [12.22, 19.64, 0.5, 426], + [12.98, 18.5, 0.5, 433], + [13.74, 17.35, 0.5, 443], + [14.61, 15.61, 0.5, 450], + [15.36, 14.47, 0.5, 460], + [16.66, 13.16, 0.5, 466], + [18.12, 11.22, 0.5, 476], + [18.88, 10.07, 0.5, 483], + [20.18, 8.77, 0.5, 493], + [20.83, 8.11, 0.5, 499], + [22.13, 6.81, 0.5, 509], + [22.79, 6.15, 0.5, 515], + [23.93, 5.39, 0.5, 526], + [25.07, 4.63, 0.5, 531], + [26.21, 3.87, 0.5, 542], + [26.86, 3.21, 0.5, 547], + [27.98, 2.46, 0.5, 559], + [29.12, 1.7, 0.5, 563], + [29.77, 1.37, 0.5, 579], + [30.43, 1.04, 0.5, 581], + [31.08, 0.71, 0.5, 591], + [31.35, 0.71, 0.5, 596], + [32, 0.39, 0.5, 608], + [33.14, 0.39, 0.5, 612], + [34.28, 0.39, 0.5, 620], + [35.42, 0, 0.5, 629], + [37.160000000000025, 0, 0.5, 637], + [38.30000000000001, 0, 0.5, 645], + [40.00999999999999, 0, 0.5, 654], + [41.75, 0, 0.5, 661], + [42.889999999999986, 0, 0.5, 670], + [44.620000000000005, 0, 0.5, 678], + [45.26999999999998, 0, 0.5, 686], + [46.410000000000025, 0, 0.5, 694], + [46.68000000000001, 0, 0.5, 702], + [47.34000000000003, 0, 0.5, 710], + [47.610000000000014, 0, 0.5, 719], + [47.879999999999995, 0, 0.5, 726], + [48.53000000000003, 0, 0.5, 735], + [48.81, 0, 0.5, 743], + [49.079999999999984, 0, 0.5, 750], + [49.35000000000002, 0, 0.5, 759], + [49.629999999999995, 0, 0.5, 768], + [49.900000000000034, 0, 0.5, 776], + [50.170000000000016, 0, 0.5, 784], + [50.44999999999999, 0.2799999999999727, 0.5, 793], + [50.44999999999999, 0.5500000000000114, 0.5, 800], + [50.72000000000003, 0.5500000000000114, 0.5, 810], + [50.72000000000003, 0.8199999999999932, 0.5, 816], + [50.99000000000001, 1.089999999999975, 0.5, 827], + [51.24000000000001, 1.339999999999975, 0.5, 843], + [51.24000000000001, 1.6100000000000136, 0.5, 848], + [51.50999999999999, 1.8899999999999864, 0.5, 860], + [51.79000000000002, 2.159999999999968, 0.5, 864], + [51.79000000000002, 2.430000000000007, 0.5, 876], + [51.79000000000002, 3.089999999999975, 0.5, 881], + [52.06, 3.3600000000000136, 0.5, 893], + [52.06, 3.6299999999999955, 0.5, 897], + [52.06, 4.279999999999973, 0.5, 909], + [52.329999999999984, 4.560000000000002, 0.5, 913], + [52.329999999999984, 4.829999999999984, 0.5, 926], + [52.329999999999984, 5.110000000000014, 0.5, 929], + [52.329999999999984, 5.3799999999999955, 0.5, 942], + [52.329999999999984, 5.649999999999977, 0.5, 946], + [52.329999999999984, 5.930000000000007, 0.5, 959], + [52.329999999999984, 6.199999999999989, 0.5, 962], + [52.329999999999984, 6.46999999999997, 0.5, 975], + [52.329999999999984, 6.75, 0.5, 979], + [52.329999999999984, 7.399999999999977, 0.5, 987], + [52.329999999999984, 8.050000000000011, 0.5, 995], + [52.329999999999984, 8.699999999999989, 0.5, 1003], + [52.329999999999984, 10.430000000000007, 0.5, 1011], + [52.329999999999984, 11.569999999999993, 0.5, 1019], + [52.329999999999984, 13.300000000000011, 0.5, 1027], + [52.329999999999984, 15.04000000000002, 0.5, 1035], + [52.329999999999984, 16.769999999999982, 0.5, 1044], + [52.329999999999984, 17.909999999999968, 0.5, 1052], + [51.94999999999999, 19.05000000000001, 0.5, 1060], + [51.94999999999999, 20.19999999999999, 0.5, 1068], + [51.56999999999999, 21.339999999999975, 0.5, 1077], + [51.24000000000001, 21.99000000000001, 0.5, 1084], + [51.24000000000001, 22.639999999999986, 0.5, 1096], + [51.24000000000001, 22.909999999999968, 0.5, 1101], + [50.910000000000025, 23.569999999999993, 0.5, 1109], + [50.910000000000025, 23.839999999999975, 0.5, 1117], + [50.910000000000025, 24.110000000000014, 0.5, 1126], + [50.629999999999995, 24.389999999999986, 0.5, 1133], + [50.629999999999995, 25.04000000000002, 0.5, 1142], + [50.360000000000014, 25.310000000000002, 0.5, 1149], + [50.360000000000014, 25.95999999999998, 0.5, 1160], + [50.03000000000003, 26.620000000000005, 0.5, 1166], + [49.69999999999999, 27.269999999999982, 0.5, 1176], + [49.370000000000005, 27.920000000000016, 0.5, 1182], + [49.370000000000005, 28.19999999999999, 0.5, 1193], + [48.99000000000001, 29.339999999999975, 0.5, 1198], + [48.660000000000025, 29.99000000000001, 0.5, 1209], + [48.660000000000025, 30.639999999999986, 0.5, 1214], + [48.329999999999984, 31.29000000000002, 0.5, 1226], + [48.329999999999984, 31.94999999999999, 0.5, 1231], + [48, 32.599999999999966, 0.5, 1243], + [48, 32.870000000000005, 0.5, 1246], + [47.68000000000001, 33.51999999999998, 0.5, 1260], + [47.68000000000001, 33.80000000000001, 0.5, 1263], + [47.68000000000001, 34.06999999999999, 0.5, 1276], + [47.68000000000001, 34.30000000000001, 0.5, 1297], + [47.68000000000001, 34.52999999999997, 0.5, 1355], + [47.400000000000034, 34.52999999999997, 0.5, 1361], + [47.400000000000034, 34.75999999999999, 0.5, 1437], + [47.170000000000016, 34.75999999999999, 0.5, 1493] +] diff --git a/client-src/views/draw/state/index.ts b/client-src/views/draw/state/index.ts index 255e080..be6f715 100644 --- a/client-src/views/draw/state/index.ts +++ b/client-src/views/draw/state/index.ts @@ -1 +1 @@ -export * from './state' +export * from "./state"; diff --git a/client-src/views/draw/state/sample.json b/client-src/views/draw/state/sample.json index 9981fe4..b35a6b4 100644 --- a/client-src/views/draw/state/sample.json +++ b/client-src/views/draw/state/sample.json @@ -1,2162 +1,362 @@ [ - [ - 23.96, - 77.14, - 0.5, - 0 - ], - [ - 23.96, - 77.14, - 0.5, - 0 - ], - [ - 24.64, - 77.14, - 0.5, - 177 - ], - [ - 27.03, - 77.14, - 0.5, - 181 - ], - [ - 28.77, - 77.14, - 0.5, - 187 - ], - [ - 29.91, - 77.14, - 0.5, - 195 - ], - [ - 35.09, - 77.14, - 0.5, - 210 - ], - [ - 35.75, - 77.14, - 0.5, - 211 - ], - [ - 40.93, - 77.14, - 0.5, - 219 - ], - [ - 45.1, - 77.14, - 0.5, - 228 - ], - [ - 47.53, - 77.14, - 0.5, - 239 - ], - [ - 51.7, - 77.14, - 0.5, - 244 - ], - [ - 55.86, - 76.54, - 0.5, - 254 - ], - [ - 61.05, - 74.59, - 0.5, - 260 - ], - [ - 65.21, - 72.81, - 0.5, - 270 - ], - [ - 67.16, - 71.34, - 0.5, - 276 - ], - [ - 71.28, - 70.16, - 0.5, - 287 - ], - [ - 74.85, - 67.78, - 0.5, - 293 - ], - [ - 79.39, - 64.53, - 0.5, - 303 - ], - [ - 82.96, - 62.15, - 0.5, - 309 - ], - [ - 87.87, - 57.94, - 0.5, - 319 - ], - [ - 89.33, - 55.98, - 0.5, - 326 - ], - [ - 92.3, - 53.01, - 0.5, - 336 - ], - [ - 95.78, - 47.43, - 0.5, - 342 - ], - [ - 98.16, - 43.86, - 0.5, - 353 - ], - [ - 99.03, - 42.12, - 0.5, - 358 - ], - [ - 100.81, - 37.95, - 0.5, - 370 - ], - [ - 101.89, - 34.72, - 0.5, - 374 - ], - [ - 102.97, - 31.47, - 0.5, - 386 - ], - [ - 103.51, - 28.22, - 0.5, - 390 - ], - [ - 104.04, - 25.03, - 0.5, - 403 - ], - [ - 104.04, - 22.59, - 0.5, - 406 - ], - [ - 104.04, - 20.15, - 0.5, - 420 - ], - [ - 104.04, - 17.71, - 0.5, - 422 - ], - [ - 104.04, - 14.51, - 0.5, - 435 - ], - [ - 102.59, - 12.57, - 0.5, - 440 - ], - [ - 101.61, - 10.13, - 0.5, - 448 - ], - [ - 100.15, - 7.69, - 0.5, - 456 - ], - [ - 98.71, - 5.77, - 0.5, - 467 - ], - [ - 97.4, - 4.46, - 0.5, - 472 - ], - [ - 96.64, - 3.32, - 0.5, - 480 - ], - [ - 95.5, - 2.56, - 0.5, - 488 - ], - [ - 94.74, - 1.42, - 0.5, - 496 - ], - [ - 93.6, - 1.04, - 0.5, - 505 - ], - [ - 92.94, - 0.71, - 0.5, - 513 - ], - [ - 91.8, - 0.33, - 0.5, - 521 - ], - [ - 91.14, - 0, - 0.5, - 529 - ], - [ - 90.49, - 0, - 0.5, - 537 - ], - [ - 89.34, - 0, - 0.5, - 545 - ], - [ - 88.69, - 0, - 0.5, - 553 - ], - [ - 87.55, - 0, - 0.5, - 562 - ], - [ - 86.89, - 0, - 0.5, - 570 - ], - [ - 85.75, - 0, - 0.5, - 578 - ], - [ - 84.44, - 1.3, - 0.5, - 586 - ], - [ - 82.98, - 3.25, - 0.5, - 594 - ], - [ - 82.11, - 4.99, - 0.5, - 603 - ], - [ - 80.64, - 7.42, - 0.5, - 610 - ], - [ - 79.18, - 9.37, - 0.5, - 619 - ], - [ - 77.71, - 11.81, - 0.5, - 626 - ], - [ - 76.25, - 14.25, - 0.5, - 636 - ], - [ - 74.78, - 16.69, - 0.5, - 642 - ], - [ - 72.86, - 18.61, - 0.5, - 653 - ], - [ - 71.77, - 21.86, - 0.5, - 659 - ], - [ - 70.3, - 24.29, - 0.5, - 670 - ], - [ - 68.52, - 28.46, - 0.5, - 674 - ], - [ - 67.33, - 32.62, - 0.5, - 686 - ], - [ - 66.68, - 37.81, - 0.5, - 691 - ], - [ - 66.02, - 43, - 0.5, - 703 - ], - [ - 65.37, - 48.19, - 0.5, - 707 - ], - [ - 65.37, - 54.51, - 0.5, - 720 - ], - [ - 65.37, - 60.83, - 0.5, - 723 - ], - [ - 65.37, - 67.15, - 0.5, - 736 - ], - [ - 65.37, - 73.47, - 0.5, - 740 - ], - [ - 65.37, - 80.86, - 0.5, - 753 - ], - [ - 65.37, - 89.77, - 0.5, - 756 - ], - [ - 65.37, - 98.69, - 0.5, - 764 - ], - [ - 64.56, - 107.6, - 0.5, - 772 - ], - [ - 64.56, - 117.94, - 0.5, - 783 - ], - [ - 63.69, - 128.26, - 0.5, - 789 - ], - [ - 63.69, - 149.68, - 0.5, - 796 - ], - [ - 62.67, - 165.09, - 0.5, - 805 - ], - [ - 61.91, - 172.65, - 0.5, - 812 - ], - [ - 60.93, - 186.27, - 0.5, - 821 - ], - [ - 60.01, - 198.2, - 0.5, - 829 - ], - [ - 59.09, - 210.14, - 0.5, - 837 - ], - [ - 57.36, - 220.51, - 0.5, - 845 - ], - [ - 56.6, - 228.08, - 0.5, - 853 - ], - [ - 54.33, - 235.64, - 0.5, - 861 - ], - [ - 52.95, - 241.86, - 0.5, - 870 - ], - [ - 50.35, - 247.04, - 0.5, - 878 - ], - [ - 47.75, - 252.23, - 0.5, - 886 - ], - [ - 44.78, - 255.8, - 0.5, - 894 - ], - [ - 40.93, - 259.64, - 0.5, - 903 - ], - [ - 38.98, - 261.1, - 0.5, - 911 - ], - [ - 36.27, - 263.26, - 0.5, - 919 - ], - [ - 33.06, - 264.87, - 0.5, - 927 - ], - [ - 30.62, - 265.84, - 0.5, - 936 - ], - [ - 25.43, - 266.49, - 0.5, - 943 - ], - [ - 22.18, - 266.49, - 0.5, - 954 - ], - [ - 18.93, - 266.49, - 0.5, - 959 - ], - [ - 16.22, - 264.32, - 0.5, - 970 - ], - [ - 12.97, - 259.78, - 0.5, - 975 - ], - [ - 9.73, - 255.24, - 0.5, - 987 - ], - [ - 8.27, - 252.8, - 0.5, - 992 - ], - [ - 5.67, - 248.26, - 0.5, - 1003 - ], - [ - 3.88, - 244.1, - 0.5, - 1009 - ], - [ - 2.1, - 239.93, - 0.5, - 1020 - ], - [ - 0.58, - 232.36, - 0.5, - 1024 - ], - [ - 0, - 228.28, - 0.5, - 1037 - ], - [ - 0, - 224.11, - 0.5, - 1040 - ], - [ - 0, - 218.92000000000002, - 0.5, - 1054 - ], - [ - 0, - 214.76, - 0.5, - 1057 - ], - [ - 1.1800000000000068, - 210.58999999999997, - 0.5, - 1070 - ], - [ - 2.9600000000000364, - 206.42000000000002, - 0.5, - 1073 - ], - [ - 6.210000000000036, - 201.88, - 0.5, - 1085 - ], - [ - 9.180000000000007, - 198.31, - 0.5, - 1089 - ], - [ - 13.069999999999993, - 194.41000000000003, - 0.5, - 1103 - ], - [ - 18.689999999999998, - 190.89999999999998, - 0.5, - 1105 - ], - [ - 24.30000000000001, - 187.38, - 0.5, - 1113 - ], - [ - 30.620000000000005, - 184.57, - 0.5, - 1122 - ], - [ - 36.94, - 181.76, - 0.5, - 1130 - ], - [ - 43.75, - 177.97000000000003, - 0.5, - 1138 - ], - [ - 51.31, - 174.94, - 0.5, - 1146 - ], - [ - 58.120000000000005, - 171.16000000000003, - 0.5, - 1155 - ], - [ - 66.22000000000003, - 166.29000000000002, - 0.5, - 1163 - ], - [ - 73.02000000000004, - 161.76, - 0.5, - 1171 - ], - [ - 80.26999999999998, - 156.11, - 0.5, - 1179 - ], - [ - 87.57000000000005, - 150.44, - 0.5, - 1187 - ], - [ - 94.00999999999999, - 143.99, - 0.5, - 1195 - ], - [ - 100.49000000000001, - 137.51, - 0.5, - 1203 - ], - [ - 104.96000000000004, - 131.54000000000002, - 0.5, - 1212 - ], - [ - 109.5, - 125.49000000000001, - 0.5, - 1220 - ], - [ - 114.02999999999997, - 118.68, - 0.5, - 1228 - ], - [ - 116.62, - 113.49000000000001, - 0.5, - 1237 - ], - [ - 119.43000000000006, - 107.16, - 0.5, - 1244 - ], - [ - 121.53999999999996, - 100.84, - 0.5, - 1253 - ], - [ - 123.63, - 94.56, - 0.5, - 1261 - ], - [ - 124.11000000000001, - 92.11000000000001, - 0.5, - 1270 - ], - [ - 124.71000000000004, - 87.94999999999999, - 0.5, - 1277 - ], - [ - 125.25, - 84.69999999999999, - 0.5, - 1286 - ], - [ - 125.72000000000003, - 82.28999999999999, - 0.5, - 1293 - ], - [ - 126.15999999999997, - 80.56, - 0.5, - 1303 - ], - [ - 126.15999999999997, - 79.9, - 0.5, - 1309 - ], - [ - 126.15999999999997, - 79.25, - 0.5, - 1320 - ], - [ - 126.15999999999997, - 78.97, - 0.5, - 1325 - ], - [ - 126.15999999999997, - 78.69, - 0.5, - 1336 - ], - [ - 126.15999999999997, - 78.44, - 0.5, - 1353 - ], - [ - 126.15999999999997, - 79.42000000000002, - 0.5, - 1423 - ], - [ - 126.15999999999997, - 82.67000000000002, - 0.5, - 1431 - ], - [ - 126.15999999999997, - 86.83000000000001, - 0.5, - 1439 - ], - [ - 126.15999999999997, - 90.99000000000001, - 0.5, - 1448 - ], - [ - 125.5, - 96.18, - 0.5, - 1455 - ], - [ - 124.86000000000001, - 101.34, - 0.5, - 1463 - ], - [ - 124.14999999999998, - 107.66, - 0.5, - 1472 - ], - [ - 123.48000000000002, - 113.72, - 0.5, - 1480 - ], - [ - 123.48000000000002, - 120.03999999999999, - 0.5, - 1488 - ], - [ - 122.65999999999997, - 128.95, - 0.5, - 1496 - ], - [ - 122.65999999999997, - 136.51999999999998, - 0.5, - 1504 - ], - [ - 122.65999999999997, - 144.07999999999998, - 0.5, - 1512 - ], - [ - 121.90999999999997, - 151.64, - 0.5, - 1521 - ], - [ - 121.90999999999997, - 159.2, - 0.5, - 1529 - ], - [ - 121.90999999999997, - 168.11, - 0.5, - 1537 - ], - [ - 121.90999999999997, - 177.01999999999998, - 0.5, - 1545 - ], - [ - 121.90999999999997, - 184.58999999999997, - 0.5, - 1553 - ], - [ - 121.90999999999997, - 187.82999999999998, - 0.5, - 1561 - ], - [ - 121.90999999999997, - 193.01999999999998, - 0.5, - 1570 - ], - [ - 121.90999999999997, - 196.26999999999998, - 0.5, - 1578 - ], - [ - 121.90999999999997, - 198.7, - 0.5, - 1586 - ], - [ - 121.90999999999997, - 200.44, - 0.5, - 1594 - ], - [ - 121.90999999999997, - 202.17000000000002, - 0.5, - 1605 - ], - [ - 121.90999999999997, - 202.82999999999998, - 0.5, - 1610 - ], - [ - 122.56000000000006, - 203.48000000000002, - 0.5, - 1621 - ], - [ - 123.70000000000005, - 203.86, - 0.5, - 1626 - ], - [ - 125.43000000000006, - 204.29000000000002, - 0.5, - 1638 - ], - [ - 128.68000000000006, - 204.29000000000002, - 0.5, - 1643 - ], - [ - 131.93000000000006, - 204.29000000000002, - 0.5, - 1654 - ], - [ - 136.08000000000004, - 204.29000000000002, - 0.5, - 1659 - ], - [ - 140.25, - 202.51, - 0.5, - 1670 - ], - [ - 144.77999999999997, - 199.91000000000003, - 0.5, - 1676 - ], - [ - 149.32000000000005, - 196.66000000000003, - 0.5, - 1687 - ], - [ - 155.37, - 192.12, - 0.5, - 1691 - ], - [ - 160.28999999999996, - 187.2, - 0.5, - 1703 - ], - [ - 165.18000000000006, - 182.31, - 0.5, - 1707 - ], - [ - 170.10000000000002, - 177.39, - 0.5, - 1720 - ], - [ - 174.62, - 171.36, - 0.5, - 1724 - ], - [ - 179.14999999999998, - 164.55, - 0.5, - 1736 - ], - [ - 183.69000000000005, - 158.49, - 0.5, - 1739 - ], - [ - 187.46000000000004, - 151.69, - 0.5, - 1753 - ], - [ - 188.93000000000006, - 149.25, - 0.5, - 1756 - ], - [ - 190.86, - 144.07, - 0.5, - 1769 - ], - [ - 192.81000000000006, - 138.88, - 0.5, - 1772 - ], - [ - 193.35000000000002, - 135.63, - 0.5, - 1785 - ], - [ - 194.10000000000002, - 128.06, - 0.5, - 1789 - ], - [ - 194.10000000000002, - 124.81, - 0.5, - 1796 - ], - [ - 194.10000000000002, - 123.67000000000002, - 0.5, - 1805 - ], - [ - 193.45000000000005, - 118.47999999999999, - 0.5, - 1813 - ], - [ - 191.98000000000002, - 116.52000000000001, - 0.5, - 1821 - ], - [ - 190.51999999999998, - 114.57, - 0.5, - 1829 - ], - [ - 188.57000000000005, - 112.62, - 0.5, - 1838 - ], - [ - 187.26999999999998, - 111.32, - 0.5, - 1846 - ], - [ - 185.96000000000004, - 110.02000000000001, - 0.5, - 1854 - ], - [ - 185.31000000000006, - 109.36000000000001, - 0.5, - 1861 - ], - [ - 184.64999999999998, - 109.03, - 0.5, - 1870 - ], - [ - 184, - 108.69999999999999, - 0.5, - 1878 - ], - [ - 183.72000000000003, - 108.69999999999999, - 0.5, - 1886 - ], - [ - 183.06000000000006, - 108.69999999999999, - 0.5, - 1894 - ], - [ - 182.40999999999997, - 108.69999999999999, - 0.5, - 1903 - ], - [ - 180.67000000000007, - 108.69999999999999, - 0.5, - 1911 - ], - [ - 179.36, - 110.00999999999999, - 0.5, - 1921 - ], - [ - 177.45000000000005, - 111.92000000000002, - 0.5, - 1927 - ], - [ - 175.98000000000002, - 113.86000000000001, - 0.5, - 1937 - ], - [ - 174.02999999999997, - 115.81, - 0.5, - 1944 - ], - [ - 172.57000000000005, - 118.25, - 0.5, - 1954 - ], - [ - 171.11, - 120.67000000000002, - 0.5, - 1960 - ], - [ - 168.51, - 126.36000000000001, - 0.5, - 1977 - ], - [ - 167.21000000000004, - 131.54000000000002, - 0.5, - 1987 - ], - [ - 166.61, - 135.68, - 0.5, - 1992 - ], - [ - 166.61, - 138.92000000000002, - 0.5, - 2004 - ], - [ - 166.61, - 143.04000000000002, - 0.5, - 2009 - ], - [ - 166.61, - 148.23000000000002, - 0.5, - 2021 - ], - [ - 166.61, - 149.95999999999998, - 0.5, - 2024 - ], - [ - 167.28999999999996, - 156.11, - 0.5, - 2037 - ], - [ - 168.26999999999998, - 158.54000000000002, - 0.5, - 2040 - ], - [ - 171.96000000000004, - 165.19, - 0.5, - 2054 - ], - [ - 174.34000000000003, - 168.76, - 0.5, - 2057 - ], - [ - 175.20000000000005, - 170.49, - 0.5, - 2070 - ], - [ - 179.74, - 176.54000000000002, - 0.5, - 2073 - ], - [ - 181.03999999999996, - 177.83999999999997, - 0.5, - 2087 - ], - [ - 184.01, - 180.81, - 0.5, - 2089 - ], - [ - 186.71000000000004, - 182.98000000000002, - 0.5, - 2103 - ], - [ - 190.88, - 184.76, - 0.5, - 2106 - ], - [ - 194.12, - 185.3, - 0.5, - 2114 - ], - [ - 197.37, - 185.3, - 0.5, - 2122 - ], - [ - 200.58000000000004, - 185.3, - 0.5, - 2130 - ], - [ - 204.74, - 185.3, - 0.5, - 2138 - ], - [ - 208.31000000000006, - 182.92000000000002, - 0.5, - 2147 - ], - [ - 211.87, - 179.94, - 0.5, - 2155 - ], - [ - 214.85000000000002, - 176.37, - 0.5, - 2163 - ], - [ - 219.06000000000006, - 171.45, - 0.5, - 2171 - ], - [ - 222.57000000000005, - 165.82999999999998, - 0.5, - 2179 - ], - [ - 225.15999999999997, - 160.64, - 0.5, - 2187 - ], - [ - 228.19000000000005, - 153.07, - 0.5, - 2195 - ], - [ - 231, - 146.75, - 0.5, - 2204 - ], - [ - 232.05000000000007, - 143.56, - 0.5, - 2212 - ], - [ - 233.35000000000002, - 138.37, - 0.5, - 2220 - ], - [ - 234.64999999999998, - 133.18, - 0.5, - 2228 - ], - [ - 235.24, - 129.01, - 0.5, - 2237 - ], - [ - 235.73000000000002, - 126.57, - 0.5, - 2245 - ], - [ - 236.21000000000004, - 124.13, - 0.5, - 2254 - ], - [ - 236.21000000000004, - 122.39000000000001, - 0.5, - 2261 - ], - [ - 236.21000000000004, - 121.25, - 0.5, - 2271 - ], - [ - 236.21000000000004, - 120.1, - 0.5, - 2277 - ], - [ - 236.21000000000004, - 119.44999999999999, - 0.5, - 2287 - ], - [ - 236.21000000000004, - 119.17000000000002, - 0.5, - 2294 - ], - [ - 236.21000000000004, - 118.89000000000001, - 0.5, - 2305 - ], - [ - 236.21000000000004, - 118.64000000000001, - 0.5, - 2321 - ], - [ - 236.21000000000004, - 118.87, - 0.5, - 2367 - ], - [ - 236.21000000000004, - 120.58000000000001, - 0.5, - 2375 - ], - [ - 236.21000000000004, - 123.82999999999998, - 0.5, - 2383 - ], - [ - 236.21000000000004, - 127.99000000000001, - 0.5, - 2390 - ], - [ - 236.21000000000004, - 133.18, - 0.5, - 2404 - ], - [ - 236.21000000000004, - 139.45, - 0.5, - 2407 - ], - [ - 236.86, - 144.64, - 0.5, - 2420 - ], - [ - 237.39999999999998, - 147.89, - 0.5, - 2423 - ], - [ - 237.98000000000002, - 152.01, - 0.5, - 2436 - ], - [ - 239.76999999999998, - 156.17000000000002, - 0.5, - 2439 - ], - [ - 240.85000000000002, - 159.42000000000002, - 0.5, - 2453 - ], - [ - 242.47000000000003, - 162.66000000000003, - 0.5, - 2455 - ], - [ - 244.42000000000007, - 164.61, - 0.5, - 2468 - ], - [ - 245.88, - 166.56, - 0.5, - 2472 - ], - [ - 247.83000000000004, - 168.01999999999998, - 0.5, - 2480 - ], - [ - 249.56000000000006, - 168.89, - 0.5, - 2488 - ], - [ - 252, - 169.37, - 0.5, - 2496 - ], - [ - 253.73000000000002, - 169.81, - 0.5, - 2504 - ], - [ - 256.1700000000001, - 169.81, - 0.5, - 2512 - ], - [ - 259.4200000000001, - 169.81, - 0.5, - 2521 - ], - [ - 261.15, - 169.81, - 0.5, - 2529 - ], - [ - 263.1, - 167.85000000000002, - 0.5, - 2537 - ], - [ - 265.48, - 164.28000000000003, - 0.5, - 2545 - ], - [ - 267.26, - 160.11, - 0.5, - 2553 - ], - [ - 268.64, - 153.88, - 0.5, - 2562 - ], - [ - 270.05000000000007, - 147.56, - 0.5, - 2570 - ], - [ - 270.73, - 141.38, - 0.5, - 2578 - ], - [ - 271.27, - 138.13, - 0.5, - 2586 - ], - [ - 271.27, - 131.81, - 0.5, - 2594 - ], - [ - 271.27, - 127.67000000000002, - 0.5, - 2603 - ], - [ - 271.27, - 124.42000000000002, - 0.5, - 2610 - ], - [ - 271.27, - 121.97, - 0.5, - 2620 - ], - [ - 271.27, - 120.24000000000001, - 0.5, - 2626 - ], - [ - 271.27, - 119.1, - 0.5, - 2637 - ], - [ - 271.27, - 118.82, - 0.5, - 2642 - ], - [ - 271.27, - 118.53999999999999, - 0.5, - 2652 - ], - [ - 271.27, - 118.25999999999999, - 0.5, - 2659 - ], - [ - 271.49, - 118.25999999999999, - 0.5, - 2742 - ], - [ - 272.46000000000004, - 120.69999999999999, - 0.5, - 2750 - ], - [ - 273.93000000000006, - 122.65, - 0.5, - 2757 - ], - [ - 276.30000000000007, - 126.20999999999998, - 0.5, - 2772 - ], - [ - 278.89, - 130.75, - 0.5, - 2775 - ], - [ - 281.44000000000005, - 135.2, - 0.5, - 2790 - ], - [ - 284.03, - 139.74, - 0.5, - 2792 - ], - [ - 287.53999999999996, - 145.36, - 0.5, - 2797 - ], - [ - 291.05000000000007, - 150.98000000000002, - 0.5, - 2805 - ], - [ - 293.65, - 155.51999999999998, - 0.5, - 2814 - ], - [ - 296.24, - 160.7, - 0.5, - 2822 - ], - [ - 299.05000000000007, - 167.01999999999998, - 0.5, - 2829 - ], - [ - 301.86, - 173.35000000000002, - 0.5, - 2838 - ], - [ - 304.12, - 180.91000000000003, - 0.5, - 2846 - ], - [ - 306.55000000000007, - 189.82, - 0.5, - 2854 - ], - [ - 308.1700000000001, - 198.73000000000002, - 0.5, - 2862 - ], - [ - 309.78999999999996, - 207.64, - 0.5, - 2870 - ], - [ - 311.40999999999997, - 216.55, - 0.5, - 2878 - ], - [ - 312.15999999999997, - 224.11, - 0.5, - 2887 - ], - [ - 312.97, - 233.01999999999998, - 0.5, - 2895 - ], - [ - 313.78, - 241.93, - 0.5, - 2903 - ], - [ - 313.78, - 248.25, - 0.5, - 2911 - ], - [ - 313.78, - 251.5, - 0.5, - 2920 - ], - [ - 313.78, - 260.39, - 0.5, - 2928 - ], - [ - 313.28999999999996, - 262.83, - 0.5, - 2935 - ], - [ - 310.81000000000006, - 267.78000000000003, - 0.5, - 2945 - ], - [ - 306.27, - 271.02, - 0.5, - 2953 - ], - [ - 302.69000000000005, - 273.4, - 0.5, - 2960 - ], - [ - 296.37, - 274.8, - 0.5, - 2970 - ], - [ - 291.18000000000006, - 275.45, - 0.5, - 2977 - ], - [ - 284.86, - 275.45, - 0.5, - 2987 - ], - [ - 282.43000000000006, - 275.45, - 0.5, - 2994 - ], - [ - 278.26, - 275.45, - 0.5, - 3003 - ], - [ - 275.82000000000005, - 274.47, - 0.5, - 3009 - ], - [ - 271.27, - 271.23, - 0.5, - 3021 - ], - [ - 269.81000000000006, - 268.79, - 0.5, - 3026 - ], - [ - 268.62, - 264.62, - 0.5, - 3038 - ], - [ - 268.62, - 261.37, - 0.5, - 3041 - ], - [ - 268.62, - 257.2, - 0.5, - 3053 - ], - [ - 268.62, - 252.01, - 0.5, - 3058 - ], - [ - 269.32000000000005, - 245.69, - 0.5, - 3070 - ], - [ - 275.15, - 233.04000000000002, - 0.5, - 3073 - ], - [ - 280.65999999999997, - 222.01, - 0.5, - 3087 - ], - [ - 287.85, - 207.63, - 0.5, - 3090 - ], - [ - 295.03, - 193.25, - 0.5, - 3103 - ], - [ - 303.49, - 178.45, - 0.5, - 3107 - ], - [ - 307.53999999999996, - 170.33999999999997, - 0.5, - 3120 - ], - [ - 315.76, - 156.99, - 0.5, - 3123 - ], - [ - 324.40999999999997, - 141.83999999999997, - 0.5, - 3135 - ], - [ - 332.62, - 128.49, - 0.5, - 3139 - ], - [ - 338.05000000000007, - 117.61000000000001, - 0.5, - 3147 - ], - [ - 341.28999999999996, - 108.69999999999999, - 0.5, - 3155 - ], - [ - 344.53, - 99.78999999999999, - 0.5, - 3163 - ], - [ - 345.23, - 93.46000000000001, - 0.5, - 3172 - ], - [ - 345.98, - 85.9, - 0.5, - 3179 - ], - [ - 345.98, - 79.57, - 0.5, - 3188 - ], - [ - 345.98, - 74.38, - 0.5, - 3196 - ], - [ - 342.47, - 68.75999999999999, - 0.5, - 3204 - ], - [ - 341, - 66.81, - 0.5, - 3212 - ], - [ - 338.03, - 63.83000000000001, - 0.5, - 3220 - ], - [ - 335.90999999999997, - 61.19, - 0.5, - 3229 - ], - [ - 334.61, - 59.879999999999995, - 0.5, - 3236 - ], - [ - 333.30000000000007, - 58.58000000000001, - 0.5, - 3245 - ], - [ - 332.64, - 58.25, - 0.5, - 3253 - ], - [ - 331.99, - 57.59, - 0.5, - 3262 - ], - [ - 331.71000000000004, - 57.59, - 0.5, - 3269 - ], - [ - 331.43000000000006, - 57.31, - 0.5, - 3277 - ] -] \ No newline at end of file + [23.96, 77.14, 0.5, 0], + [23.96, 77.14, 0.5, 0], + [24.64, 77.14, 0.5, 177], + [27.03, 77.14, 0.5, 181], + [28.77, 77.14, 0.5, 187], + [29.91, 77.14, 0.5, 195], + [35.09, 77.14, 0.5, 210], + [35.75, 77.14, 0.5, 211], + [40.93, 77.14, 0.5, 219], + [45.1, 77.14, 0.5, 228], + [47.53, 77.14, 0.5, 239], + [51.7, 77.14, 0.5, 244], + [55.86, 76.54, 0.5, 254], + [61.05, 74.59, 0.5, 260], + [65.21, 72.81, 0.5, 270], + [67.16, 71.34, 0.5, 276], + [71.28, 70.16, 0.5, 287], + [74.85, 67.78, 0.5, 293], + [79.39, 64.53, 0.5, 303], + [82.96, 62.15, 0.5, 309], + [87.87, 57.94, 0.5, 319], + [89.33, 55.98, 0.5, 326], + [92.3, 53.01, 0.5, 336], + [95.78, 47.43, 0.5, 342], + [98.16, 43.86, 0.5, 353], + [99.03, 42.12, 0.5, 358], + [100.81, 37.95, 0.5, 370], + [101.89, 34.72, 0.5, 374], + [102.97, 31.47, 0.5, 386], + [103.51, 28.22, 0.5, 390], + [104.04, 25.03, 0.5, 403], + [104.04, 22.59, 0.5, 406], + [104.04, 20.15, 0.5, 420], + [104.04, 17.71, 0.5, 422], + [104.04, 14.51, 0.5, 435], + [102.59, 12.57, 0.5, 440], + [101.61, 10.13, 0.5, 448], + [100.15, 7.69, 0.5, 456], + [98.71, 5.77, 0.5, 467], + [97.4, 4.46, 0.5, 472], + [96.64, 3.32, 0.5, 480], + [95.5, 2.56, 0.5, 488], + [94.74, 1.42, 0.5, 496], + [93.6, 1.04, 0.5, 505], + [92.94, 0.71, 0.5, 513], + [91.8, 0.33, 0.5, 521], + [91.14, 0, 0.5, 529], + [90.49, 0, 0.5, 537], + [89.34, 0, 0.5, 545], + [88.69, 0, 0.5, 553], + [87.55, 0, 0.5, 562], + [86.89, 0, 0.5, 570], + [85.75, 0, 0.5, 578], + [84.44, 1.3, 0.5, 586], + [82.98, 3.25, 0.5, 594], + [82.11, 4.99, 0.5, 603], + [80.64, 7.42, 0.5, 610], + [79.18, 9.37, 0.5, 619], + [77.71, 11.81, 0.5, 626], + [76.25, 14.25, 0.5, 636], + [74.78, 16.69, 0.5, 642], + [72.86, 18.61, 0.5, 653], + [71.77, 21.86, 0.5, 659], + [70.3, 24.29, 0.5, 670], + [68.52, 28.46, 0.5, 674], + [67.33, 32.62, 0.5, 686], + [66.68, 37.81, 0.5, 691], + [66.02, 43, 0.5, 703], + [65.37, 48.19, 0.5, 707], + [65.37, 54.51, 0.5, 720], + [65.37, 60.83, 0.5, 723], + [65.37, 67.15, 0.5, 736], + [65.37, 73.47, 0.5, 740], + [65.37, 80.86, 0.5, 753], + [65.37, 89.77, 0.5, 756], + [65.37, 98.69, 0.5, 764], + [64.56, 107.6, 0.5, 772], + [64.56, 117.94, 0.5, 783], + [63.69, 128.26, 0.5, 789], + [63.69, 149.68, 0.5, 796], + [62.67, 165.09, 0.5, 805], + [61.91, 172.65, 0.5, 812], + [60.93, 186.27, 0.5, 821], + [60.01, 198.2, 0.5, 829], + [59.09, 210.14, 0.5, 837], + [57.36, 220.51, 0.5, 845], + [56.6, 228.08, 0.5, 853], + [54.33, 235.64, 0.5, 861], + [52.95, 241.86, 0.5, 870], + [50.35, 247.04, 0.5, 878], + [47.75, 252.23, 0.5, 886], + [44.78, 255.8, 0.5, 894], + [40.93, 259.64, 0.5, 903], + [38.98, 261.1, 0.5, 911], + [36.27, 263.26, 0.5, 919], + [33.06, 264.87, 0.5, 927], + [30.62, 265.84, 0.5, 936], + [25.43, 266.49, 0.5, 943], + [22.18, 266.49, 0.5, 954], + [18.93, 266.49, 0.5, 959], + [16.22, 264.32, 0.5, 970], + [12.97, 259.78, 0.5, 975], + [9.73, 255.24, 0.5, 987], + [8.27, 252.8, 0.5, 992], + [5.67, 248.26, 0.5, 1003], + [3.88, 244.1, 0.5, 1009], + [2.1, 239.93, 0.5, 1020], + [0.58, 232.36, 0.5, 1024], + [0, 228.28, 0.5, 1037], + [0, 224.11, 0.5, 1040], + [0, 218.92000000000002, 0.5, 1054], + [0, 214.76, 0.5, 1057], + [1.1800000000000068, 210.58999999999997, 0.5, 1070], + [2.9600000000000364, 206.42000000000002, 0.5, 1073], + [6.210000000000036, 201.88, 0.5, 1085], + [9.180000000000007, 198.31, 0.5, 1089], + [13.069999999999993, 194.41000000000003, 0.5, 1103], + [18.689999999999998, 190.89999999999998, 0.5, 1105], + [24.30000000000001, 187.38, 0.5, 1113], + [30.620000000000005, 184.57, 0.5, 1122], + [36.94, 181.76, 0.5, 1130], + [43.75, 177.97000000000003, 0.5, 1138], + [51.31, 174.94, 0.5, 1146], + [58.120000000000005, 171.16000000000003, 0.5, 1155], + [66.22000000000003, 166.29000000000002, 0.5, 1163], + [73.02000000000004, 161.76, 0.5, 1171], + [80.26999999999998, 156.11, 0.5, 1179], + [87.57000000000005, 150.44, 0.5, 1187], + [94.00999999999999, 143.99, 0.5, 1195], + [100.49000000000001, 137.51, 0.5, 1203], + [104.96000000000004, 131.54000000000002, 0.5, 1212], + [109.5, 125.49000000000001, 0.5, 1220], + [114.02999999999997, 118.68, 0.5, 1228], + [116.62, 113.49000000000001, 0.5, 1237], + [119.43000000000006, 107.16, 0.5, 1244], + [121.53999999999996, 100.84, 0.5, 1253], + [123.63, 94.56, 0.5, 1261], + [124.11000000000001, 92.11000000000001, 0.5, 1270], + [124.71000000000004, 87.94999999999999, 0.5, 1277], + [125.25, 84.69999999999999, 0.5, 1286], + [125.72000000000003, 82.28999999999999, 0.5, 1293], + [126.15999999999997, 80.56, 0.5, 1303], + [126.15999999999997, 79.9, 0.5, 1309], + [126.15999999999997, 79.25, 0.5, 1320], + [126.15999999999997, 78.97, 0.5, 1325], + [126.15999999999997, 78.69, 0.5, 1336], + [126.15999999999997, 78.44, 0.5, 1353], + [126.15999999999997, 79.42000000000002, 0.5, 1423], + [126.15999999999997, 82.67000000000002, 0.5, 1431], + [126.15999999999997, 86.83000000000001, 0.5, 1439], + [126.15999999999997, 90.99000000000001, 0.5, 1448], + [125.5, 96.18, 0.5, 1455], + [124.86000000000001, 101.34, 0.5, 1463], + [124.14999999999998, 107.66, 0.5, 1472], + [123.48000000000002, 113.72, 0.5, 1480], + [123.48000000000002, 120.03999999999999, 0.5, 1488], + [122.65999999999997, 128.95, 0.5, 1496], + [122.65999999999997, 136.51999999999998, 0.5, 1504], + [122.65999999999997, 144.07999999999998, 0.5, 1512], + [121.90999999999997, 151.64, 0.5, 1521], + [121.90999999999997, 159.2, 0.5, 1529], + [121.90999999999997, 168.11, 0.5, 1537], + [121.90999999999997, 177.01999999999998, 0.5, 1545], + [121.90999999999997, 184.58999999999997, 0.5, 1553], + [121.90999999999997, 187.82999999999998, 0.5, 1561], + [121.90999999999997, 193.01999999999998, 0.5, 1570], + [121.90999999999997, 196.26999999999998, 0.5, 1578], + [121.90999999999997, 198.7, 0.5, 1586], + [121.90999999999997, 200.44, 0.5, 1594], + [121.90999999999997, 202.17000000000002, 0.5, 1605], + [121.90999999999997, 202.82999999999998, 0.5, 1610], + [122.56000000000006, 203.48000000000002, 0.5, 1621], + [123.70000000000005, 203.86, 0.5, 1626], + [125.43000000000006, 204.29000000000002, 0.5, 1638], + [128.68000000000006, 204.29000000000002, 0.5, 1643], + [131.93000000000006, 204.29000000000002, 0.5, 1654], + [136.08000000000004, 204.29000000000002, 0.5, 1659], + [140.25, 202.51, 0.5, 1670], + [144.77999999999997, 199.91000000000003, 0.5, 1676], + [149.32000000000005, 196.66000000000003, 0.5, 1687], + [155.37, 192.12, 0.5, 1691], + [160.28999999999996, 187.2, 0.5, 1703], + [165.18000000000006, 182.31, 0.5, 1707], + [170.10000000000002, 177.39, 0.5, 1720], + [174.62, 171.36, 0.5, 1724], + [179.14999999999998, 164.55, 0.5, 1736], + [183.69000000000005, 158.49, 0.5, 1739], + [187.46000000000004, 151.69, 0.5, 1753], + [188.93000000000006, 149.25, 0.5, 1756], + [190.86, 144.07, 0.5, 1769], + [192.81000000000006, 138.88, 0.5, 1772], + [193.35000000000002, 135.63, 0.5, 1785], + [194.10000000000002, 128.06, 0.5, 1789], + [194.10000000000002, 124.81, 0.5, 1796], + [194.10000000000002, 123.67000000000002, 0.5, 1805], + [193.45000000000005, 118.47999999999999, 0.5, 1813], + [191.98000000000002, 116.52000000000001, 0.5, 1821], + [190.51999999999998, 114.57, 0.5, 1829], + [188.57000000000005, 112.62, 0.5, 1838], + [187.26999999999998, 111.32, 0.5, 1846], + [185.96000000000004, 110.02000000000001, 0.5, 1854], + [185.31000000000006, 109.36000000000001, 0.5, 1861], + [184.64999999999998, 109.03, 0.5, 1870], + [184, 108.69999999999999, 0.5, 1878], + [183.72000000000003, 108.69999999999999, 0.5, 1886], + [183.06000000000006, 108.69999999999999, 0.5, 1894], + [182.40999999999997, 108.69999999999999, 0.5, 1903], + [180.67000000000007, 108.69999999999999, 0.5, 1911], + [179.36, 110.00999999999999, 0.5, 1921], + [177.45000000000005, 111.92000000000002, 0.5, 1927], + [175.98000000000002, 113.86000000000001, 0.5, 1937], + [174.02999999999997, 115.81, 0.5, 1944], + [172.57000000000005, 118.25, 0.5, 1954], + [171.11, 120.67000000000002, 0.5, 1960], + [168.51, 126.36000000000001, 0.5, 1977], + [167.21000000000004, 131.54000000000002, 0.5, 1987], + [166.61, 135.68, 0.5, 1992], + [166.61, 138.92000000000002, 0.5, 2004], + [166.61, 143.04000000000002, 0.5, 2009], + [166.61, 148.23000000000002, 0.5, 2021], + [166.61, 149.95999999999998, 0.5, 2024], + [167.28999999999996, 156.11, 0.5, 2037], + [168.26999999999998, 158.54000000000002, 0.5, 2040], + [171.96000000000004, 165.19, 0.5, 2054], + [174.34000000000003, 168.76, 0.5, 2057], + [175.20000000000005, 170.49, 0.5, 2070], + [179.74, 176.54000000000002, 0.5, 2073], + [181.03999999999996, 177.83999999999997, 0.5, 2087], + [184.01, 180.81, 0.5, 2089], + [186.71000000000004, 182.98000000000002, 0.5, 2103], + [190.88, 184.76, 0.5, 2106], + [194.12, 185.3, 0.5, 2114], + [197.37, 185.3, 0.5, 2122], + [200.58000000000004, 185.3, 0.5, 2130], + [204.74, 185.3, 0.5, 2138], + [208.31000000000006, 182.92000000000002, 0.5, 2147], + [211.87, 179.94, 0.5, 2155], + [214.85000000000002, 176.37, 0.5, 2163], + [219.06000000000006, 171.45, 0.5, 2171], + [222.57000000000005, 165.82999999999998, 0.5, 2179], + [225.15999999999997, 160.64, 0.5, 2187], + [228.19000000000005, 153.07, 0.5, 2195], + [231, 146.75, 0.5, 2204], + [232.05000000000007, 143.56, 0.5, 2212], + [233.35000000000002, 138.37, 0.5, 2220], + [234.64999999999998, 133.18, 0.5, 2228], + [235.24, 129.01, 0.5, 2237], + [235.73000000000002, 126.57, 0.5, 2245], + [236.21000000000004, 124.13, 0.5, 2254], + [236.21000000000004, 122.39000000000001, 0.5, 2261], + [236.21000000000004, 121.25, 0.5, 2271], + [236.21000000000004, 120.1, 0.5, 2277], + [236.21000000000004, 119.44999999999999, 0.5, 2287], + [236.21000000000004, 119.17000000000002, 0.5, 2294], + [236.21000000000004, 118.89000000000001, 0.5, 2305], + [236.21000000000004, 118.64000000000001, 0.5, 2321], + [236.21000000000004, 118.87, 0.5, 2367], + [236.21000000000004, 120.58000000000001, 0.5, 2375], + [236.21000000000004, 123.82999999999998, 0.5, 2383], + [236.21000000000004, 127.99000000000001, 0.5, 2390], + [236.21000000000004, 133.18, 0.5, 2404], + [236.21000000000004, 139.45, 0.5, 2407], + [236.86, 144.64, 0.5, 2420], + [237.39999999999998, 147.89, 0.5, 2423], + [237.98000000000002, 152.01, 0.5, 2436], + [239.76999999999998, 156.17000000000002, 0.5, 2439], + [240.85000000000002, 159.42000000000002, 0.5, 2453], + [242.47000000000003, 162.66000000000003, 0.5, 2455], + [244.42000000000007, 164.61, 0.5, 2468], + [245.88, 166.56, 0.5, 2472], + [247.83000000000004, 168.01999999999998, 0.5, 2480], + [249.56000000000006, 168.89, 0.5, 2488], + [252, 169.37, 0.5, 2496], + [253.73000000000002, 169.81, 0.5, 2504], + [256.1700000000001, 169.81, 0.5, 2512], + [259.4200000000001, 169.81, 0.5, 2521], + [261.15, 169.81, 0.5, 2529], + [263.1, 167.85000000000002, 0.5, 2537], + [265.48, 164.28000000000003, 0.5, 2545], + [267.26, 160.11, 0.5, 2553], + [268.64, 153.88, 0.5, 2562], + [270.05000000000007, 147.56, 0.5, 2570], + [270.73, 141.38, 0.5, 2578], + [271.27, 138.13, 0.5, 2586], + [271.27, 131.81, 0.5, 2594], + [271.27, 127.67000000000002, 0.5, 2603], + [271.27, 124.42000000000002, 0.5, 2610], + [271.27, 121.97, 0.5, 2620], + [271.27, 120.24000000000001, 0.5, 2626], + [271.27, 119.1, 0.5, 2637], + [271.27, 118.82, 0.5, 2642], + [271.27, 118.53999999999999, 0.5, 2652], + [271.27, 118.25999999999999, 0.5, 2659], + [271.49, 118.25999999999999, 0.5, 2742], + [272.46000000000004, 120.69999999999999, 0.5, 2750], + [273.93000000000006, 122.65, 0.5, 2757], + [276.30000000000007, 126.20999999999998, 0.5, 2772], + [278.89, 130.75, 0.5, 2775], + [281.44000000000005, 135.2, 0.5, 2790], + [284.03, 139.74, 0.5, 2792], + [287.53999999999996, 145.36, 0.5, 2797], + [291.05000000000007, 150.98000000000002, 0.5, 2805], + [293.65, 155.51999999999998, 0.5, 2814], + [296.24, 160.7, 0.5, 2822], + [299.05000000000007, 167.01999999999998, 0.5, 2829], + [301.86, 173.35000000000002, 0.5, 2838], + [304.12, 180.91000000000003, 0.5, 2846], + [306.55000000000007, 189.82, 0.5, 2854], + [308.1700000000001, 198.73000000000002, 0.5, 2862], + [309.78999999999996, 207.64, 0.5, 2870], + [311.40999999999997, 216.55, 0.5, 2878], + [312.15999999999997, 224.11, 0.5, 2887], + [312.97, 233.01999999999998, 0.5, 2895], + [313.78, 241.93, 0.5, 2903], + [313.78, 248.25, 0.5, 2911], + [313.78, 251.5, 0.5, 2920], + [313.78, 260.39, 0.5, 2928], + [313.28999999999996, 262.83, 0.5, 2935], + [310.81000000000006, 267.78000000000003, 0.5, 2945], + [306.27, 271.02, 0.5, 2953], + [302.69000000000005, 273.4, 0.5, 2960], + [296.37, 274.8, 0.5, 2970], + [291.18000000000006, 275.45, 0.5, 2977], + [284.86, 275.45, 0.5, 2987], + [282.43000000000006, 275.45, 0.5, 2994], + [278.26, 275.45, 0.5, 3003], + [275.82000000000005, 274.47, 0.5, 3009], + [271.27, 271.23, 0.5, 3021], + [269.81000000000006, 268.79, 0.5, 3026], + [268.62, 264.62, 0.5, 3038], + [268.62, 261.37, 0.5, 3041], + [268.62, 257.2, 0.5, 3053], + [268.62, 252.01, 0.5, 3058], + [269.32000000000005, 245.69, 0.5, 3070], + [275.15, 233.04000000000002, 0.5, 3073], + [280.65999999999997, 222.01, 0.5, 3087], + [287.85, 207.63, 0.5, 3090], + [295.03, 193.25, 0.5, 3103], + [303.49, 178.45, 0.5, 3107], + [307.53999999999996, 170.33999999999997, 0.5, 3120], + [315.76, 156.99, 0.5, 3123], + [324.40999999999997, 141.83999999999997, 0.5, 3135], + [332.62, 128.49, 0.5, 3139], + [338.05000000000007, 117.61000000000001, 0.5, 3147], + [341.28999999999996, 108.69999999999999, 0.5, 3155], + [344.53, 99.78999999999999, 0.5, 3163], + [345.23, 93.46000000000001, 0.5, 3172], + [345.98, 85.9, 0.5, 3179], + [345.98, 79.57, 0.5, 3188], + [345.98, 74.38, 0.5, 3196], + [342.47, 68.75999999999999, 0.5, 3204], + [341, 66.81, 0.5, 3212], + [338.03, 63.83000000000001, 0.5, 3220], + [335.90999999999997, 61.19, 0.5, 3229], + [334.61, 59.879999999999995, 0.5, 3236], + [333.30000000000007, 58.58000000000001, 0.5, 3245], + [332.64, 58.25, 0.5, 3253], + [331.99, 57.59, 0.5, 3262], + [331.71000000000004, 57.59, 0.5, 3269], + [331.43000000000006, 57.31, 0.5, 3277] +] diff --git a/client-src/views/draw/state/shapes/draw.tsx b/client-src/views/draw/state/shapes/draw.tsx index 5f0c2f8..0f51aae 100644 --- a/client-src/views/draw/state/shapes/draw.tsx +++ b/client-src/views/draw/state/shapes/draw.tsx @@ -1,39 +1,39 @@ -import * as React from 'react' +import * as React from "react"; import { TLBounds, Utils, TLTransformInfo, TLShapeUtil, SVGContainer, -} from '@tldraw/core' +} from "@tldraw/core"; import { intersectBoundsBounds, intersectBoundsPolyline, -} from '@tldraw/intersect' -import { Vec } from '@tldraw/vec' -import { getStroke } from 'perfect-freehand' -import type { DrawShape } from '../types' -import { EASINGS } from '../easings' +} from "@tldraw/intersect"; +import { Vec } from "@tldraw/vec"; +import { getStroke } from "perfect-freehand"; +import type { DrawShape } from "../types"; +import { EASINGS } from "../easings"; -type T = DrawShape -type E = SVGSVGElement +type T = DrawShape; +type E = SVGSVGElement; export class DrawUtil extends TLShapeUtil { - type = 'draw' as const + type = "draw" as const; - pointsBoundsCache = new WeakMap([]) + pointsBoundsCache = new WeakMap([]); - rotatedCache = new WeakMap([]) + rotatedCache = new WeakMap([]); - strokeCache = new WeakMap([]) + strokeCache = new WeakMap([]); getShape = (props: Partial): T => { return Utils.deepMerge( { - id: 'id', - type: 'draw', - name: 'Draw', - parentId: 'page', + id: "id", + type: "draw", + name: "Draw", + parentId: "page", childIndex: 1, point: [0, 0], points: [[0, 0, 0.5]], @@ -45,21 +45,21 @@ export class DrawUtil extends TLShapeUtil { thinning: 0.75, streamline: 0.5, smoothing: 0.5, - easing: 'linear', + easing: "linear", taperStart: 0, taperEnd: 0, capStart: true, capEnd: true, - easingStart: 'linear', - easingEnd: 'linear', + easingStart: "linear", + easingEnd: "linear", isFilled: true, - stroke: 'black', - fill: 'black', + stroke: "black", + fill: "black", }, }, - props - ) - } + props, + ); + }; Component = TLShapeUtil.Component(({ shape, events }, ref) => { const { @@ -81,9 +81,9 @@ export class DrawUtil extends TLShapeUtil { isFilled, }, isDone, - } = shape + } = shape; - const simulatePressure = shape.points[2]?.[2] === 0.5 + const simulatePressure = shape.points[2]?.[2] === 0.5; const outlinePoints = Utils.getFromCache(this.strokeCache, shape, () => getStroke(shape.points, { @@ -104,18 +104,18 @@ export class DrawUtil extends TLShapeUtil { }, simulatePressure, last: isDone, - }) - ) + }), + ); - const drawPathData = getSvgPathFromStroke(outlinePoints) + const drawPathData = getSvgPathFromStroke(outlinePoints); return ( {strokeWidth ? ( { ) : null} { 0 ? 'transparent' : 'black'} + fill={isFilled ? fill : "transparent"} + stroke={isFilled || strokeWidth > 0 ? "transparent" : "black"} strokeWidth={isFilled || strokeWidth > 0 ? 0 : 1} strokeLinejoin="round" strokeLinecap="round" @@ -136,33 +136,33 @@ export class DrawUtil extends TLShapeUtil { /> } - ) - }) + ); + }); Indicator = TLShapeUtil.Indicator(() => { - return - }) + return ; + }); create = (props: { id: string } & Partial) => { - this.refMap.set(props.id, React.createRef()) - return this.getShape(props) - } + this.refMap.set(props.id, React.createRef()); + return this.getShape(props); + }; getBounds = (shape: DrawShape): TLBounds => { const bounds = Utils.translateBounds( Utils.getFromCache(this.pointsBoundsCache, shape.points, () => - Utils.getBoundsFromPoints(shape.points) + Utils.getBoundsFromPoints(shape.points), ), - shape.point - ) + shape.point, + ); - return bounds - } + return bounds; + }; hitTestBounds = (shape: DrawShape, brushBounds: TLBounds): boolean => { // Test axis-aligned shape if (!shape.rotation) { - const bounds = this.getBounds(shape) + const bounds = this.getBounds(shape); return ( Utils.boundsContain(brushBounds, bounds) || @@ -170,38 +170,38 @@ export class DrawUtil extends TLShapeUtil { intersectBoundsBounds(bounds, brushBounds).length > 0) && intersectBoundsPolyline( Utils.translateBounds(brushBounds, Vec.neg(shape.point)), - shape.points + shape.points, ).length > 0) - ) + ); } // Test rotated shape - const rBounds = this.getRotatedBounds(shape) + const rBounds = this.getRotatedBounds(shape); const rotatedBounds = Utils.getFromCache(this.rotatedCache, shape, () => { - const c = Utils.getBoundsCenter(Utils.getBoundsFromPoints(shape.points)) - return shape.points.map((pt) => Vec.rotWith(pt, c, shape.rotation || 0)) - }) + const c = Utils.getBoundsCenter(Utils.getBoundsFromPoints(shape.points)); + return shape.points.map((pt) => Vec.rotWith(pt, c, shape.rotation || 0)); + }); return ( Utils.boundsContain(brushBounds, rBounds) || intersectBoundsPolyline( Utils.translateBounds(brushBounds, Vec.neg(shape.point)), - rotatedBounds + rotatedBounds, ).length > 0 - ) - } + ); + }; transform = ( shape: DrawShape, bounds: TLBounds, - { initialShape, scaleX, scaleY }: TLTransformInfo + { initialShape, scaleX, scaleY }: TLTransformInfo, ): Partial => { const initialShapeBounds = Utils.getFromCache( this.boundsCache, initialShape, - () => Utils.getBoundsFromPoints(initialShape.points) - ) + () => Utils.getBoundsFromPoints(initialShape.points), + ); const points = initialShape.points.map(([x, y, r]) => { return [ @@ -214,24 +214,24 @@ export class DrawUtil extends TLShapeUtil { ? 1 - y / initialShapeBounds.height : y / initialShapeBounds.height), r, - ] - }) + ]; + }); - const newBounds = Utils.getBoundsFromPoints(shape.points) + const newBounds = Utils.getBoundsFromPoints(shape.points); const point = Vec.sub( [bounds.minX, bounds.minY], - [newBounds.minX, newBounds.minY] - ) + [newBounds.minX, newBounds.minY], + ); return { points, point, - } - } + }; + }; } -const average = (a: number, b: number) => (a + b) / 2 +const average = (a: number, b: number) => (a + b) / 2; /** * Turn an array of points into a path of quadradic curves. @@ -241,46 +241,46 @@ const average = (a: number, b: number) => (a + b) / 2 */ export function getSvgPathFromStroke( points: number[][], - closed = true + closed = true, ): string { - const len = points.length + const len = points.length; if (len < 4) { - return `` + return ``; } - let a = points[0] - let b = points[1] - const c = points[2] + let a = points[0]; + let b = points[1]; + const c = points[2]; let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed( - 2 + 2, )},${b[1].toFixed(2)} ${average(b[0], c[0]).toFixed(2)},${average( b[1], - c[1] - ).toFixed(2)} T` + c[1], + ).toFixed(2)} T`; for (let i = 2, max = len - 1; i < max; i++) { - a = points[i] - b = points[i + 1] + a = points[i]; + b = points[i + 1]; result += `${average(a[0], b[0]).toFixed(2)},${average(a[1], b[1]).toFixed( - 2 - )} ` + 2, + )} `; } if (closed) { - result += 'Z' + result += "Z"; } - return result + return result; } export function dot([x, y]: number[]) { - return `M ${x - 0.5},${y} a .5,.5 0 1,0 1,0 a .5,.5 0 1,0 -1,0` + return `M ${x - 0.5},${y} a .5,.5 0 1,0 1,0 a .5,.5 0 1,0 -1,0`; } export function dots(points: number[][]) { - return points.map(dot).join(' ') + return points.map(dot).join(" "); } -export const draw = new DrawUtil() +export const draw = new DrawUtil(); diff --git a/client-src/views/draw/state/shapes/index.ts b/client-src/views/draw/state/shapes/index.ts index edf5956..1528a45 100644 --- a/client-src/views/draw/state/shapes/index.ts +++ b/client-src/views/draw/state/shapes/index.ts @@ -1 +1 @@ -export * from './draw' +export * from "./draw"; diff --git a/client-src/views/draw/state/state.ts b/client-src/views/draw/state/state.ts index f9a7535..e4fe829 100644 --- a/client-src/views/draw/state/state.ts +++ b/client-src/views/draw/state/state.ts @@ -1,120 +1,120 @@ -import * as React from 'react' -import type { Doc, DrawShape, DrawStyles, State } from './types' +import * as React from "react"; +import type { Doc, DrawShape, DrawStyles, State } from "./types"; import { TLPinchEventHandler, TLPointerEventHandler, TLShapeUtilsMap, TLWheelEventHandler, Utils, -} from '@tldraw/core' -import { Vec } from '@tldraw/vec' -import { StateManager } from 'rko' -import { draw, DrawUtil } from './shapes' -import sample from './sample.json' -import type { StateSelector } from 'zustand' -import { copyTextToClipboard, pointInPolygon } from './utils' +} from "@tldraw/core"; +import { Vec } from "@tldraw/vec"; +import { StateManager } from "rko"; +import { draw, DrawUtil } from "./shapes"; +import sample from "./sample.json"; +import type { StateSelector } from "zustand"; +import { copyTextToClipboard, pointInPolygon } from "./utils"; export const shapeUtils: TLShapeUtilsMap = { draw: new DrawUtil(), -} +}; export const initialDoc: Doc = { page: { - id: 'page', + id: "page", shapes: {}, bindings: {}, }, pageState: { - id: 'page', + id: "page", selectedIds: [], camera: { point: [0, 0], zoom: 1, }, }, -} +}; export const defaultStyle: DrawStyles = { size: 16, strokeWidth: 0, isFilled: true, - fill: '#000000', - stroke: '#000000', -} + fill: "#000000", + stroke: "#000000", +}; export const initialState: State = { appState: { - status: 'idle', - tool: 'drawing', + status: "idle", + tool: "drawing", editingId: undefined, style: defaultStyle, isPanelOpen: true, }, ...initialDoc, -} +}; -export const context = React.createContext({} as AppState) +export const context = React.createContext({} as AppState); export class AppState extends StateManager { - shapeUtils = shapeUtils + shapeUtils = shapeUtils; - log = false + log = false; currentStroke = { startTime: 0, - } + }; onReady = () => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - window['app'] = this + window["app"] = this; if (Object.values(this.state.page.shapes).length === 0) { - this.addShape({ id: 'sample', points: sample }) - this.centerShape('sample') + this.addShape({ id: "sample", points: sample }); + this.centerShape("sample"); } - } + }; cleanup = (state: State) => { for (const id in state.page.shapes) { if (!state.page.shapes[id]) { - delete state.page.shapes[id] + delete state.page.shapes[id]; } } - return state - } + return state; + }; onPointerDown: TLPointerEventHandler = (info) => { - const { state } = this + const { state } = this; switch (state.appState.tool) { - case 'drawing': { - this.createDrawingShape(info.point) - break + case "drawing": { + this.createDrawingShape(info.point); + break; } - case 'erasing': { - this.setSnapshot() + case "erasing": { + this.setSnapshot(); this.patchState({ appState: { - status: 'erasing', + status: "erasing", }, - }) - this.erase(info.point) - break + }); + this.erase(info.point); + break; } } - } + }; onPointerMove: TLPointerEventHandler = (info, event) => { - if (event.buttons > 1) return + if (event.buttons > 1) return; - const { status, tool } = this.state.appState + const { status, tool } = this.state.appState; switch (tool) { - case 'drawing': { - if (status === 'drawing') { - const nextShape = this.updateDrawingShape(info.point, info.pressure) + case "drawing": { + if (status === "drawing") { + const nextShape = this.updateDrawingShape(info.point, info.pressure); if (nextShape) { this.patchState({ page: { @@ -122,50 +122,50 @@ export class AppState extends StateManager { [nextShape.id]: nextShape, }, }, - }) + }); } } - break + break; } - case 'erasing': { - if (status === 'erasing') { - this.erase(info.point) + case "erasing": { + if (status === "erasing") { + this.erase(info.point); } - break + break; } } - } + }; onPointerUp: TLPointerEventHandler = () => { - const { state } = this + const { state } = this; switch (state.appState.tool) { - case 'drawing': { - this.completeDrawingShape() - break + case "drawing": { + this.completeDrawingShape(); + break; } - case 'erasing': { + case "erasing": { this.setState({ before: this.snapshot, after: { appState: { - status: 'idle', + status: "idle", }, page: { shapes: this.state.page.shapes, }, }, - }) - break + }); + break; } } - } + }; pinchZoom = (point: number[], delta: number[], zoom: number): this => { - const { camera } = this.state.pageState - const nextPoint = Vec.sub(camera.point, Vec.div(delta, camera.zoom)) - const nextZoom = zoom - const p0 = Vec.sub(Vec.div(point, camera.zoom), nextPoint) - const p1 = Vec.sub(Vec.div(point, nextZoom), nextPoint) + const { camera } = this.state.pageState; + const nextPoint = Vec.sub(camera.point, Vec.div(delta, camera.zoom)); + const nextZoom = zoom; + const p0 = Vec.sub(Vec.div(point, camera.zoom), nextPoint); + const p1 = Vec.sub(Vec.div(point, nextZoom), nextPoint); return this.patchState({ pageState: { @@ -174,37 +174,37 @@ export class AppState extends StateManager { zoom: nextZoom, }, }, - }) - } + }); + }; onPinchEnd: TLPinchEventHandler = () => { this.patchState({ - appState: { status: 'idle' }, - }) - } + appState: { status: "idle" }, + }); + }; onPinch: TLPinchEventHandler = (info, e) => { - if (this.state.appState.status !== 'pinching') return - this.pinchZoom(info.point, info.delta, info.delta[2]) - this.onPointerMove?.(info, e as unknown as React.PointerEvent) - } + if (this.state.appState.status !== "pinching") return; + this.pinchZoom(info.point, info.delta, info.delta[2]); + this.onPointerMove?.(info, e as unknown as React.PointerEvent); + }; onPan: TLWheelEventHandler = (info) => { - const { state } = this - if (state.appState.status === 'pinching') return this + const { state } = this; + if (state.appState.status === "pinching") return this; - const { camera } = state.pageState - const delta = Vec.div(info.delta, camera.zoom) - const prev = camera.point - const next = Vec.sub(prev, delta) + const { camera } = state.pageState; + const delta = Vec.div(info.delta, camera.zoom); + const prev = camera.point; + const next = Vec.sub(prev, delta); - if (Vec.isEqual(next, prev)) return this + if (Vec.isEqual(next, prev)) return this; - const point = Vec.round(next) + const point = Vec.round(next); - if (state.appState.editingId && state.appState.status === 'drawing') { - const shape = state.page.shapes[state.appState.editingId] - const nextShape = this.updateDrawingShape(info.point, info.pressure) + if (state.appState.editingId && state.appState.status === "drawing") { + const shape = state.page.shapes[state.appState.editingId]; + const nextShape = this.updateDrawingShape(info.point, info.pressure); this.patchState({ pageState: { @@ -217,7 +217,7 @@ export class AppState extends StateManager { [shape.id]: nextShape, }, }, - }) + }); if (nextShape) { this.patchState({ @@ -226,7 +226,7 @@ export class AppState extends StateManager { [nextShape.id]: nextShape, }, }, - }) + }); } } @@ -236,26 +236,26 @@ export class AppState extends StateManager { point, }, }, - }) - } + }); + }; /* --------------------- Methods -------------------- */ togglePanelOpen = () => { - const { state } = this + const { state } = this; this.patchState({ appState: { isPanelOpen: !state.appState.isPanelOpen, }, - }) - } + }); + }; createDrawingShape = (point: number[]) => { - const { state } = this + const { state } = this; - const camera = state.pageState.camera + const camera = state.pageState.camera; - const pt = Vec.sub(Vec.div(point, camera.zoom), camera.point) + const pt = Vec.sub(Vec.div(point, camera.zoom), camera.point); const shape = draw.create({ id: Utils.uniqueId(), @@ -263,13 +263,13 @@ export class AppState extends StateManager { style: state.appState.style, points: [[0, 0, 0.5, 0]], isDone: false, - }) + }); - this.currentStroke.startTime = Date.now() + this.currentStroke.startTime = Date.now(); return this.patchState({ appState: { - status: 'drawing', + status: "drawing", editingId: shape.id, }, page: { @@ -277,33 +277,33 @@ export class AppState extends StateManager { [shape.id]: shape, }, }, - }) - } + }); + }; updateDrawingShape = (point: number[], pressure: number) => { - const { state, currentStroke } = this - if (state.appState.status !== 'drawing') return - if (!state.appState.editingId) return + const { state, currentStroke } = this; + if (state.appState.status !== "drawing") return; + if (!state.appState.editingId) return; - const shape = state.page.shapes[state.appState.editingId] + const shape = state.page.shapes[state.appState.editingId]; - const camera = state.pageState.camera + const camera = state.pageState.camera; const newPoint = [ ...Vec.sub( Vec.round(Vec.sub(Vec.div(point, camera.zoom), camera.point)), - shape.point + shape.point, ), pressure, Date.now() - currentStroke.startTime, - ] + ]; - let shapePoint = shape.point + let shapePoint = shape.point; - let shapePoints = [...shape.points, newPoint] + let shapePoints = [...shape.points, newPoint]; // Does the new point create a negative offset? - const offset = [Math.min(newPoint[0], 0), Math.min(newPoint[1], 0)] + const offset = [Math.min(newPoint[0], 0), Math.min(newPoint[1], 0)]; if (offset[0] < 0 || offset[1] < 0) { // If so, then we need to move the shape to cancel the offset @@ -311,38 +311,38 @@ export class AppState extends StateManager { ...Vec.round(Vec.add(shapePoint, offset)), shapePoint[2], shapePoint[3], - ] + ]; // And we need to move the shape points to cancel the offset shapePoints = shapePoints.map((pt) => - Vec.round(Vec.sub(pt, offset)).concat(pt[2], pt[3]) - ) + Vec.round(Vec.sub(pt, offset)).concat(pt[2], pt[3]), + ); } return { id: shape.id, point: shapePoint, points: shapePoints, - } - } + }; + }; completeDrawingShape = () => { - const { state } = this - const { shapes } = state.page - if (!state.appState.editingId) return this // Don't erase while drawing + const { state } = this; + const { shapes } = state.page; + if (!state.appState.editingId) return this; // Don't erase while drawing - let shape = shapes[state.appState.editingId] + let shape = shapes[state.appState.editingId]; - shape.isDone = true + shape.isDone = true; shape = { ...shape, - } + }; return this.setState({ before: { appState: { - status: 'idle', + status: "idle", editingId: undefined, }, page: { @@ -353,7 +353,7 @@ export class AppState extends StateManager { }, after: { appState: { - status: 'idle', + status: "idle", editingId: undefined, }, page: { @@ -362,12 +362,12 @@ export class AppState extends StateManager { }, }, }, - }) - } + }); + }; centerShape = (id: string) => { - const shape = this.state.page.shapes[id] - const bounds = shapeUtils.draw.getBounds(this.state.page.shapes[id]) + const shape = this.state.page.shapes[id]; + const bounds = shapeUtils.draw.getBounds(this.state.page.shapes[id]); this.patchState({ pageState: { camera: { @@ -378,20 +378,20 @@ export class AppState extends StateManager { zoom: 1, }, }, - }) - } + }); + }; replayShape = (points: number[][]) => { - this.eraseAll() + this.eraseAll(); const newShape = draw.create({ id: Utils.uniqueId(), - parentId: 'page', + parentId: "page", childIndex: 1, point: [0, 0], points: [], style: this.state.appState.style, - }) + }); this.patchState({ page: { @@ -399,9 +399,9 @@ export class AppState extends StateManager { [newShape.id]: newShape, }, }, - }) + }); - this.centerShape(newShape.id) + this.centerShape(newShape.id); points .map((pt, i) => [...Vec.sub(pt, newShape.point), pt[2], pt[3] || i * 10]) @@ -415,29 +415,29 @@ export class AppState extends StateManager { }, }, }, - }) - }, pt[3] * 20) - }) - } + }); + }, pt[3] * 20); + }); + }; addShape = (shape: Partial) => { const newShape = draw.create({ id: Utils.uniqueId(), - parentId: 'page', + parentId: "page", childIndex: 1, point: [0, 0], points: [], style: this.state.appState.style, ...shape, - }) + }); - const bounds = Utils.getBoundsFromPoints(newShape.points) + const bounds = Utils.getBoundsFromPoints(newShape.points); - const topLeft = [bounds.minX, bounds.minY] + const topLeft = [bounds.minX, bounds.minY]; newShape.points = newShape.points.map((pt, i) => - Vec.sub(pt, topLeft).concat(pt[2] || 0.5, pt[3] || i * 10) - ) + Vec.sub(pt, topLeft).concat(pt[2] || 0.5, pt[3] || i * 10), + ); this.patchState({ page: { @@ -445,55 +445,55 @@ export class AppState extends StateManager { [newShape.id]: newShape, }, }, - }) + }); - this.persist() + this.persist(); - return newShape - } + return newShape; + }; erase = (point: number[]) => { - const { state } = this - const camera = state.pageState.camera - const pt = Vec.sub(Vec.div(point, camera.zoom), camera.point) - const { getBounds } = shapeUtils.draw + const { state } = this; + const camera = state.pageState.camera; + const pt = Vec.sub(Vec.div(point, camera.zoom), camera.point); + const { getBounds } = shapeUtils.draw; return this.patchState({ page: { shapes: { ...Object.fromEntries( Object.entries(state.page.shapes).map(([id, shape]) => { - const bounds = getBounds(shape) + const bounds = getBounds(shape); if (Vec.dist(pt, shape.point) < 10) { - return [id, undefined] + return [id, undefined]; } if (Utils.pointInBounds(pt, bounds)) { - const points = draw.strokeCache.get(shape) + const points = draw.strokeCache.get(shape); if ( (points && pointInPolygon(Vec.sub(pt, shape.point), points)) || Vec.dist(pt, shape.point) < 10 ) { - return [id, undefined] + return [id, undefined]; } } - return [id, shape] - }) + return [id, shape]; + }), ), }, }, - }) - } + }); + }; eraseAll = () => { - const { state } = this - const { shapes } = state.page + const { state } = this; + const { shapes } = state.page; - if (state.appState.editingId) return this // Don't erase while drawing + if (state.appState.editingId) return this; // Don't erase while drawing return this.setState({ before: { @@ -506,15 +506,15 @@ export class AppState extends StateManager { shapes: {}, }, }, - }) - } + }); + }; startStyleUpdate = () => { - return this.setSnapshot() - } + return this.setSnapshot(); + }; patchStyleForAllShapes = (style: Partial) => { - const { shapes } = this.state.page + const { shapes } = this.state.page; return this.patchState({ appState: { @@ -523,24 +523,24 @@ export class AppState extends StateManager { page: { shapes: { ...Object.fromEntries( - Object.keys(shapes).map((id) => [id, { style }]) + Object.keys(shapes).map((id) => [id, { style }]), ), }, }, - }) - } + }); + }; patchStyle = (style: Partial) => { return this.patchState({ appState: { style, }, - }) - } + }); + }; finishStyleUpdate = () => { - const { state, snapshot } = this - const { shapes } = state.page + const { state, snapshot } = this; + const { shapes } = state.page; return this.setState({ before: snapshot, @@ -551,16 +551,16 @@ export class AppState extends StateManager { page: { shapes: { ...Object.fromEntries( - Object.entries(shapes).map(([id, { style }]) => [id, { style }]) + Object.entries(shapes).map(([id, { style }]) => [id, { style }]), ), }, }, }, - }) - } + }); + }; setNextStyleForAllShapes = (style: Partial) => { - const { shapes } = this.state.page + const { shapes } = this.state.page; return this.setState({ before: { @@ -569,7 +569,7 @@ export class AppState extends StateManager { Object.keys(style).map((key) => [ key, this.state.appState.style[key as keyof DrawStyles], - ]) + ]), ), }, page: { @@ -582,10 +582,10 @@ export class AppState extends StateManager { Object.keys(style).map((key) => [ key, shape.style[key as keyof DrawStyles], - ]) + ]), ), }, - ]) + ]), ), }, }, @@ -597,19 +597,19 @@ export class AppState extends StateManager { page: { shapes: { ...Object.fromEntries( - Object.keys(shapes).map((id) => [id, { style }]) + Object.keys(shapes).map((id) => [id, { style }]), ), }, }, }, - }) - } + }); + }; resetStyle = (prop: keyof DrawStyles) => { - const { shapes } = this.state.page - const { state } = this + const { shapes } = this.state.page; + const { state } = this; - const initialStyle = initialState.appState.style[prop] + const initialStyle = initialState.appState.style[prop]; return this.setState({ before: { @@ -622,7 +622,7 @@ export class AppState extends StateManager { { style: { [prop]: shape.style[prop] }, }, - ]) + ]), ), }, }, @@ -634,17 +634,17 @@ export class AppState extends StateManager { page: { shapes: { ...Object.fromEntries( - Object.keys(shapes).map((id) => [id, { [prop]: initialStyle }]) + Object.keys(shapes).map((id) => [id, { [prop]: initialStyle }]), ), }, }, }, - }) - } + }); + }; zoomToContent = (): this => { - const shapes = Object.values(this.state.page.shapes) - const pageState = this.state.pageState + const shapes = Object.values(this.state.page.shapes); + const pageState = this.state.pageState; if (shapes.length === 0) { this.patchState({ @@ -654,29 +654,29 @@ export class AppState extends StateManager { point: [0, 0], }, }, - }) + }); } const bounds = Utils.getCommonBounds( - Object.values(shapes).map(shapeUtils.draw.getBounds) - ) + Object.values(shapes).map(shapeUtils.draw.getBounds), + ); - const { zoom } = pageState.camera - const mx = (window.innerWidth - bounds.width * zoom) / 2 / zoom - const my = (window.innerHeight - bounds.height * zoom) / 2 / zoom - const point = Vec.round(Vec.add([-bounds.minX, -bounds.minY], [mx, my])) + const { zoom } = pageState.camera; + const mx = (window.innerWidth - bounds.width * zoom) / 2 / zoom; + const my = (window.innerHeight - bounds.height * zoom) / 2 / zoom; + const point = Vec.round(Vec.add([-bounds.minX, -bounds.minY], [mx, my])); return this.patchState({ pageState: { camera: { point } }, - }) - } + }); + }; resetStyles = () => { - const { shapes } = this.state.page - const { state } = this + const { shapes } = this.state.page; + const { state } = this; - const currentAppState = state.appState - const initialAppState = initialState.appState + const currentAppState = state.appState; + const initialAppState = initialState.appState; return this.setState({ before: { @@ -689,7 +689,7 @@ export class AppState extends StateManager { { style: currentAppState.style, }, - ]) + ]), ), }, }, @@ -702,7 +702,7 @@ export class AppState extends StateManager { Object.keys(shapes).map((id) => [ id, { style: initialAppState.style }, - ]) + ]), ), }, }, @@ -712,92 +712,84 @@ export class AppState extends StateManager { }, }, }, - }) - } - - copyStyles = () => { - const { state } = this - const { style } = state.appState - copyTextToClipboard(`{ - size: ${style.size}, -}`) - } + }); + }; copySvg = () => { - const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg') + const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); - const shapes = Object.values(this.state.page.shapes) + const shapes = Object.values(this.state.page.shapes); - const bounds = Utils.getCommonBounds(shapes.map(draw.getBounds)) + const bounds = Utils.getCommonBounds(shapes.map(draw.getBounds)); - const padding = 40 + const padding = 40; shapes.forEach((shape) => { - const fillElm = document.getElementById('path_' + shape.id) + const fillElm = document.getElementById("path_" + shape.id); - if (!fillElm) return + if (!fillElm) return; - const fillClone = fillElm.cloneNode(false) as SVGPathElement + const fillClone = fillElm.cloneNode(false) as SVGPathElement; - const strokeElm = document.getElementById('path_stroke_' + shape.id) + const strokeElm = document.getElementById("path_stroke_" + shape.id); if (strokeElm) { // Create a new group - const g = document.createElementNS('http://www.w3.org/2000/svg', 'g') + const g = document.createElementNS("http://www.w3.org/2000/svg", "g"); // Translate the group to the shape's point g.setAttribute( - 'transform', - `translate(${shape.point[0]}, ${shape.point[1]})` - ) + "transform", + `translate(${shape.point[0]}, ${shape.point[1]})`, + ); // Clone the stroke element - const strokeClone = strokeElm.cloneNode(false) as SVGPathElement + const strokeClone = strokeElm.cloneNode(false) as SVGPathElement; // Append both the stroke element and the fill element to the group - g.appendChild(strokeClone) - g.appendChild(fillClone) + g.appendChild(strokeClone); + g.appendChild(fillClone); // Append the group to the SVG - svg.appendChild(g) + svg.appendChild(g); } else { // Translate the fill clone and append it to the SVG fillClone.setAttribute( - 'transform', - `translate(${shape.point[0]}, ${shape.point[1]})` - ) + "transform", + `translate(${shape.point[0]}, ${shape.point[1]})`, + ); - svg.appendChild(fillClone) + svg.appendChild(fillClone); } - }) + }); // Resize the element to the bounding box svg.setAttribute( - 'viewBox', + "viewBox", [ bounds.minX - padding, bounds.minY - padding, bounds.width + padding * 2, bounds.height + padding * 2, - ].join(' ') - ) + ].join(" "), + ); - svg.setAttribute('width', String(bounds.width)) + svg.setAttribute("width", String(bounds.width)); - svg.setAttribute('height', String(bounds.height)) + svg.setAttribute("height", String(bounds.height)); - const s = new XMLSerializer() + const s = new XMLSerializer(); const svgString = s .serializeToString(svg) - .replaceAll(' ', '') - .replaceAll(/((\s|")[0-9]*\.[0-9]{2})([0-9]*)(\b|"|\))/g, '$1') + .replaceAll(" ", "") + .replaceAll(/((\s|")[0-9]*\.[0-9]{2})([0-9]*)(\b|"|\))/g, "$1"); - return svgString - } + return svgString; + }; resetDoc = () => { - const { shapes } = this.state.page + const { shapes } = this.state.page; return this.setState({ before: { @@ -809,7 +801,7 @@ export class AppState extends StateManager { page: { shapes: { ...Object.fromEntries( - Object.keys(shapes).map((key) => [key, undefined]) + Object.keys(shapes).map((key) => [key, undefined]), ), }, }, @@ -820,46 +812,46 @@ export class AppState extends StateManager { }, }, }, - }) - } + }); + }; onPinchStart: TLPinchEventHandler = () => { - if (this.state.appState.status !== 'idle') return + if (this.state.appState.status !== "idle") return; this.patchState({ - appState: { status: 'pinching' }, - }) - } + appState: { status: "pinching" }, + }); + }; selectDrawingTool = () => { this.patchState({ appState: { - tool: 'drawing', + tool: "drawing", }, - }) - } + }); + }; selectErasingTool = () => { this.patchState({ appState: { - tool: 'erasing', + tool: "erasing", }, - }) - } + }); + }; } export const app = new AppState( initialState, - 'perfect-freehand', + "perfect-freehand", 1, - (p, n) => n -) + (p, n) => n, +); -export function useAppState(): State -export function useAppState(selector: StateSelector): K +export function useAppState(): State; +export function useAppState(selector: StateSelector): K; export function useAppState(selector?: StateSelector) { if (selector) { - return app.useStore(selector) + return app.useStore(selector); } - return app.useStore() + return app.useStore(); } diff --git a/client-src/views/draw/state/types.ts b/client-src/views/draw/state/types.ts index 80e5391..63679f3 100644 --- a/client-src/views/draw/state/types.ts +++ b/client-src/views/draw/state/types.ts @@ -1,75 +1,75 @@ -import type { TLBinding, TLPage, TLPageState, TLShape } from '@tldraw/core' +import type { TLBinding, TLPage, TLPageState, TLShape } from "@tldraw/core"; export type Entries = { - [K in keyof T]: [K, T[K]] -}[keyof T][] + [K in keyof T]: [K, T[K]]; +}[keyof T][]; -export type Patch = Partial<{ [P in keyof T]: Patch }> +export type Patch = Partial<{ [P in keyof T]: Patch }>; export type Command = { - id: string - before: Patch - after: Patch -} + id: string; + before: Patch; + after: Patch; +}; export interface DrawStyles { - size: number - fill: string - stroke: string - strokeWidth: number - isFilled: boolean + size: number; + fill: string; + stroke: string; + strokeWidth: number; + isFilled: boolean; } export interface DrawShape extends TLShape { - type: 'draw' - points: number[][] - style: DrawStyles - isDone: boolean + type: "draw"; + points: number[][]; + style: DrawStyles; + isDone: boolean; } export interface Doc { - page: TLPage - pageState: TLPageState + page: TLPage; + pageState: TLPageState; } export interface State extends Doc { appState: { - status: 'idle' | 'pinching' | 'drawing' | 'erasing' - tool: 'drawing' | 'erasing' - editingId?: string - style: DrawStyles - isPanelOpen: boolean - } + status: "idle" | "pinching" | "drawing" | "erasing"; + tool: "drawing" | "erasing"; + editingId?: string; + style: DrawStyles; + isPanelOpen: boolean; + }; } export interface Data extends State { - createShape: (point: number[]) => void - updateShape: (point: number[], pressure: number) => void - completeShape: (point: number[], pressure: number) => void - updateStyle: (style: Partial) => void - load: (doc: Doc) => void - resetDoc: () => void - undo: () => void - redo: () => void + createShape: (point: number[]) => void; + updateShape: (point: number[], pressure: number) => void; + completeShape: (point: number[], pressure: number) => void; + updateStyle: (style: Partial) => void; + load: (doc: Doc) => void; + resetDoc: () => void; + undo: () => void; + redo: () => void; } export type Easing = - | 'linear' - | 'easeInQuad' - | 'easeOutQuad' - | 'easeInOutQuad' - | 'easeInCubic' - | 'easeOutCubic' - | 'easeInOutCubic' - | 'easeInQuart' - | 'easeOutQuart' - | 'easeInOutQuart' - | 'easeInQuint' - | 'easeOutQuint' - | 'easeInOutQuint' - | 'easeInSine' - | 'easeOutSine' - | 'easeInOutSine' - | 'easeInExpo' - | 'easeOutExpo' - | 'easeInOutExpo' + | "linear" + | "easeInQuad" + | "easeOutQuad" + | "easeInOutQuad" + | "easeInCubic" + | "easeOutCubic" + | "easeInOutCubic" + | "easeInQuart" + | "easeOutQuart" + | "easeInOutQuart" + | "easeInQuint" + | "easeOutQuint" + | "easeInOutQuint" + | "easeInSine" + | "easeOutSine" + | "easeInOutSine" + | "easeInExpo" + | "easeOutExpo" + | "easeInOutExpo"; diff --git a/client-src/views/draw/state/utils.ts b/client-src/views/draw/state/utils.ts index a127f83..7e753eb 100644 --- a/client-src/views/draw/state/utils.ts +++ b/client-src/views/draw/state/utils.ts @@ -1,55 +1,20 @@ function cross(x: number[], y: number[], z: number[]): number { - return (y[0] - x[0]) * (z[1] - x[1]) - (z[0] - x[0]) * (y[1] - x[1]) + return (y[0] - x[0]) * (z[1] - x[1]) - (z[0] - x[0]) * (y[1] - x[1]); } export function pointInPolygon(p: number[], points: number[][]): boolean { - let wn = 0 // winding number + let wn = 0; // winding number points.forEach((a, i) => { - const b = points[(i + 1) % points.length] + const b = points[(i + 1) % points.length]; if (a[1] <= p[1]) { if (b[1] > p[1] && cross(a, b, p) > 0) { - wn += 1 + wn += 1; } } else if (b[1] <= p[1] && cross(a, b, p) < 0) { - wn -= 1 + wn -= 1; } - }) + }); - return wn !== 0 -} - -export function copyTextToClipboard(string: string) { - try { - navigator.clipboard.writeText(string) - } catch (e) { - const textarea = document.createElement('textarea') - textarea.setAttribute('position', 'fixed') - textarea.setAttribute('top', '0') - textarea.setAttribute('readonly', 'true') - textarea.setAttribute('contenteditable', 'true') - textarea.style.position = 'fixed' - textarea.value = string - document.body.appendChild(textarea) - textarea.focus() - textarea.select() - - try { - const range = document.createRange() - range.selectNodeContents(textarea) - - const sel = window.getSelection() - if (!sel) return - - sel.removeAllRanges() - sel.addRange(range) - - textarea.setSelectionRange(0, textarea.value.length) - } catch (err) { - console.warn('Could not copy to clipboard') - null // Could not copy to clipboard - } finally { - document.body.removeChild(textarea) - } - } + return wn !== 0; } diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..fa60cc9 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,30 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; +import pluginQuery from "@tanstack/eslint-plugin-query"; +import { globalIgnores } from "eslint/config"; + +export default tseslint.config([ + globalIgnores(["dist"]), + { + files: ["**/*.{ts,tsx}"], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs["recommended-latest"], + reactRefresh.configs.vite, + pluginQuery.configs["flat/recommended"], + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, + { + rules: { + "@typescript-eslint/no-unused-vars": "off", + }, + }, +]); diff --git a/package.json b/package.json index 505b9a3..68ba0f3 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,11 @@ "private": true, "type": "module", "scripts": { - "start": "vite dev" + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint .", + "preview": "vite preview", + "format": "prettier --write ." }, "dependencies": { "@modulz/radix-icons": "^4.0.0", @@ -32,17 +36,24 @@ }, "devDependencies": { "@cloudflare/vite-plugin": "^1.14.2", + "@eslint/js": "^9.39.1", "@tanstack/devtools-vite": "^0.3.11", "@tanstack/eslint-plugin-query": "^5.91.2", "@tanstack/react-devtools": "^0.8.1", "@tanstack/react-query-devtools": "^5.90.2", "@tanstack/react-router-devtools": "^1.134.15", "@tanstack/router-plugin": "^1.134.15", + "@types/node": "^24.10.1", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.1.1", + "eslint": "^9.30.1", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.5.0", "prettier": "^3.6.2", "typescript": "^4.3.5", + "typescript-eslint": "^8.35.1", "vite": "^7.2.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ededf56..80fe406 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 0.1.4(react@19.2.0) '@tailwindcss/vite': specifier: ^4.1.17 - version: 4.1.17(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + version: 4.1.17(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) '@tanstack/react-query': specifier: ^5.90.9 version: 5.90.9(react@19.2.0) @@ -77,10 +77,13 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.14.2 - version: 1.14.2(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))(workerd@1.20251109.0)(wrangler@4.48.0(@cloudflare/workers-types@4.20251113.0)) + version: 1.14.2(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))(workerd@1.20251109.0)(wrangler@4.48.0(@cloudflare/workers-types@4.20251113.0)) + '@eslint/js': + specifier: ^9.39.1 + version: 9.39.1 '@tanstack/devtools-vite': specifier: ^0.3.11 - version: 0.3.11(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + version: 0.3.11(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) '@tanstack/eslint-plugin-query': specifier: ^5.91.2 version: 5.91.2(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) @@ -92,10 +95,13 @@ importers: version: 5.90.2(@tanstack/react-query@5.90.9(react@19.2.0))(react@19.2.0) '@tanstack/react-router-devtools': specifier: ^1.134.15 - version: 1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.2)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6) + version: 1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.2)(@types/node@24.10.1)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6) '@tanstack/router-plugin': specifier: ^1.134.15 - version: 1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + version: 1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + '@types/node': + specifier: ^24.10.1 + version: 24.10.1 '@types/react': specifier: ^19.1.13 version: 19.2.4 @@ -104,16 +110,31 @@ importers: version: 19.2.3(@types/react@19.2.4) '@vitejs/plugin-react': specifier: ^5.1.1 - version: 5.1.1(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + version: 5.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)) + eslint: + specifier: ^9.30.1 + version: 9.39.1(jiti@2.6.1) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.24(eslint@9.39.1(jiti@2.6.1)) + globals: + specifier: ^16.5.0 + version: 16.5.0 prettier: specifier: ^3.6.2 version: 3.6.2 typescript: specifier: ^4.3.5 version: 4.9.5 + typescript-eslint: + specifier: ^8.35.1 + version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) vite: specifier: ^7.2.2 - version: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) packages: @@ -1342,6 +1363,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@24.10.1': + resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -1350,6 +1374,21 @@ packages: '@types/react@19.2.4': resolution: {integrity: sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==} + '@typescript-eslint/eslint-plugin@8.46.4': + resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.4 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.46.4': + resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.46.4': resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1366,6 +1405,13 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.4': + resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.46.4': resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1579,6 +1625,17 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.24: + resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} + peerDependencies: + eslint: '>=8.40' + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1708,6 +1765,10 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + goober@2.1.18: resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} peerDependencies: @@ -1716,6 +1777,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1741,6 +1805,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2188,11 +2256,21 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typescript-eslint@8.46.4: + resolution: {integrity: sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.14.0: resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} engines: {node: '>=20.18.1'} @@ -2563,7 +2641,7 @@ snapshots: optionalDependencies: workerd: 1.20251109.0 - '@cloudflare/vite-plugin@1.14.2(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))(workerd@1.20251109.0)(wrangler@4.48.0(@cloudflare/workers-types@4.20251113.0))': + '@cloudflare/vite-plugin@1.14.2(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))(workerd@1.20251109.0)(wrangler@4.48.0(@cloudflare/workers-types@4.20251113.0))': dependencies: '@cloudflare/unenv-preset': 2.7.10(unenv@2.0.0-rc.24)(workerd@1.20251109.0) '@remix-run/node-fetch-server': 0.8.1 @@ -2572,7 +2650,7 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.15 unenv: 2.0.0-rc.24 - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) wrangler: 4.48.0(@cloudflare/workers-types@4.20251113.0) ws: 8.18.0 transitivePeerDependencies: @@ -3238,12 +3316,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 - '@tailwindcss/vite@4.1.17(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': + '@tailwindcss/vite@4.1.17(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': dependencies: '@tailwindcss/node': 4.1.17 '@tailwindcss/oxide': 4.1.17 tailwindcss: 4.1.17 - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) '@tanstack/devtools-client@0.0.4': dependencies: @@ -3266,7 +3344,7 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.3.11(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': + '@tanstack/devtools-vite@0.3.11(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -3278,7 +3356,7 @@ snapshots: chalk: 5.6.2 launch-editor: 2.12.0 picomatch: 4.0.3 - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) transitivePeerDependencies: - bufferutil - supports-color @@ -3338,13 +3416,13 @@ snapshots: '@tanstack/query-core': 5.90.9 react: 19.2.0 - '@tanstack/react-router-devtools@1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.2)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6)': + '@tanstack/react-router-devtools@1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.2)(@types/node@24.10.1)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6)': dependencies: '@tanstack/react-router': 1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.136.2(@tanstack/router-core@1.136.2)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6) + '@tanstack/router-devtools-core': 1.136.2(@tanstack/router-core@1.136.2)(@types/node@24.10.1)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) optionalDependencies: '@tanstack/router-core': 1.136.2 transitivePeerDependencies: @@ -3390,14 +3468,14 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.136.2(@tanstack/router-core@1.136.2)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6)': + '@tanstack/router-devtools-core@1.136.2(@tanstack/router-core@1.136.2)(@types/node@24.10.1)(csstype@3.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6)': dependencies: '@tanstack/router-core': 1.136.2 clsx: 2.1.1 goober: 2.1.18(csstype@3.2.0) solid-js: 1.9.10 tiny-invariant: 1.3.3 - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) optionalDependencies: csstype: 3.2.0 transitivePeerDependencies: @@ -3426,7 +3504,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': + '@tanstack/router-plugin@1.136.2(@tanstack/react-router@1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -3444,7 +3522,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.136.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) transitivePeerDependencies: - supports-color @@ -3510,6 +3588,10 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/node@24.10.1': + dependencies: + undici-types: 7.16.0 + '@types/react-dom@19.2.3(@types/react@19.2.4)': dependencies: '@types/react': 19.2.4 @@ -3518,6 +3600,35 @@ snapshots: dependencies: csstype: 3.2.0 + '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5))(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.46.4 + eslint: 9.39.1(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.46.4 + debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.46.4(typescript@4.9.5)': dependencies: '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@4.9.5) @@ -3536,6 +3647,18 @@ snapshots: dependencies: typescript: 4.9.5 + '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5)': + dependencies: + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@4.9.5) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.46.4': {} '@typescript-eslint/typescript-estree@8.46.4(typescript@4.9.5)': @@ -3577,7 +3700,7 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.0 - '@vitejs/plugin-react@5.1.1(vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': + '@vitejs/plugin-react@5.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -3585,7 +3708,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.47 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6) transitivePeerDependencies: - supports-color @@ -3798,6 +3921,14 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)): + dependencies: + eslint: 9.39.1(jiti@2.6.1) + + eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@2.6.1)): + dependencies: + eslint: 9.39.1(jiti@2.6.1) + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -3937,12 +4068,16 @@ snapshots: globals@14.0.0: {} + globals@16.5.0: {} + goober@2.1.18(csstype@3.2.0): dependencies: csstype: 3.2.0 graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + has-flag@4.0.0: {} hono-party@0.0.17(@cloudflare/workers-types@4.20251113.0)(hono@4.10.6)(partyserver@0.0.75(@cloudflare/workers-types@4.20251113.0)): @@ -3961,6 +4096,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -4370,8 +4507,21 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typescript-eslint@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5): + dependencies: + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5))(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.46.4(typescript@4.9.5) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@4.9.5) + eslint: 9.39.1(jiti@2.6.1) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + typescript@4.9.5: {} + undici-types@7.16.0: {} + undici@7.14.0: {} unenv@2.0.0-rc.24: @@ -4399,7 +4549,7 @@ snapshots: dependencies: react: 19.2.0 - vite@7.2.2(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6): + vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -4408,6 +4558,7 @@ snapshots: rollup: 4.53.2 tinyglobby: 0.2.15 optionalDependencies: + '@types/node': 24.10.1 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 diff --git a/prettierignore b/prettierignore new file mode 100644 index 0000000..bd5535a --- /dev/null +++ b/prettierignore @@ -0,0 +1 @@ +pnpm-lock.yaml diff --git a/tsconfig.app.json b/tsconfig.app.json index 2d27278..1cd5451 100644 --- a/tsconfig.app.json +++ b/tsconfig.app.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "target": "ES2022", "useDefineForClassFields": true, "lib": ["ES2022", "DOM", "DOM.Iterable"], diff --git a/tsconfig.node.json b/tsconfig.node.json index 722fe8e..21744e1 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", "target": "ES2023", "lib": ["ES2023"], "types": ["node"], diff --git a/tsconfig.shared.json b/tsconfig.shared.json index 07a31a3..0d33ef0 100644 --- a/tsconfig.shared.json +++ b/tsconfig.shared.json @@ -1,6 +1,5 @@ { "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", "target": "ES2023", "lib": ["ES2023"], "module": "ESNext", diff --git a/vite.config.ts b/vite.config.ts index 5c4516f..7c41827 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -16,6 +16,6 @@ export default defineConfig({ autoCodeSplitting: true, }), react(), - tailwindcss() + tailwindcss(), ], });