+
+
+
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(),
],
});