From 0acfebb41204a8e29886fe258bb6494ac346ecde Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Sat, 19 Mar 2022 23:59:52 -0500 Subject: [PATCH 01/14] Implemented Particles feature --- package-lock.json | 742 +++++++++++++++++++++++++++ package.json | 2 + src/App.vue | 11 +- src/features/particles/Particles.vue | 54 ++ src/features/particles/particles.tsx | 43 ++ src/features/trees/tree.ts | 4 +- src/game/settings.ts | 5 + src/lib/tsParticles.d.ts | 1 + 8 files changed, 858 insertions(+), 4 deletions(-) create mode 100644 src/features/particles/Particles.vue create mode 100644 src/features/particles/particles.tsx create mode 100644 src/lib/tsParticles.d.ts diff --git a/package-lock.json b/package-lock.json index f35db6a..5912039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,8 @@ "core-js": "^3.6.5", "lodash.clonedeep": "^4.5.0", "nanoevents": "^6.0.2", + "particles.vue3": "^2.0.3", + "tsparticles": "^2.0.3", "vue": "^3.2.26", "vue-next-select": "^2.10.2", "vue-panzoom": "^1.1.6", @@ -9105,6 +9107,29 @@ "node": ">= 0.8" } }, + "node_modules/particles.vue3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/particles.vue3/-/particles.vue3-2.0.3.tgz", + "integrity": "sha512-FE2zbTCDpwP8Wzk2nDfVyuJkOtQHDHq2I+eqc7UYELc0IEKxtEaCJEjAfP0uAscP4Rl1hWW3MS63Fg7OqBmnvQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "dependencies": { + "core-js": "^3.20.1", + "tsparticles-engine": "^2.0.3", + "vue-class-component": "^8.0.0-rc.1" + }, + "peerDependencies": { + "vue": ">=3" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -11558,6 +11583,362 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "node_modules/tsparticles": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles/-/tsparticles-2.0.3.tgz", + "integrity": "sha512-aHWFfppS9VBd+zZVbV6wVqovo/xFQbKNzdy2fWNGAuomXRlz0nkU48jY1sarGz64SUGREIWgXvYgwIpwlKe17g==", + "dependencies": { + "tsparticles-engine": "^2.0.3", + "tsparticles-interaction-external-trail": "^2.0.3", + "tsparticles-plugin-absorbers": "^2.0.3", + "tsparticles-plugin-emitters": "^2.0.3", + "tsparticles-plugin-polygon-mask": "^2.0.3", + "tsparticles-slim": "^2.0.3", + "tsparticles-updater-roll": "^2.0.3", + "tsparticles-updater-tilt": "^2.0.3", + "tsparticles-updater-wobble": "^2.0.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + } + }, + "node_modules/tsparticles-engine": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-engine/-/tsparticles-engine-2.0.3.tgz", + "integrity": "sha512-n54t3Qcdnz/wc6op38Q/nVwfi7d/m/HdiDdJsJy4DWAJnnu4YZLGoor9h76nuvfIeY7niTQWMLMxWBViAKOOEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "hasInstallScript": true + }, + "node_modules/tsparticles-interaction-external-attract": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-attract/-/tsparticles-interaction-external-attract-2.0.3.tgz", + "integrity": "sha512-z0/+aM+AcKXd8AzE89SQA1jq7ZTnG+eF+x00aqNVBfiHvrch9+yLTudwk9Rmkiq5H1FStYk5kQZS0XS9lysf1g==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-bounce": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-bounce/-/tsparticles-interaction-external-bounce-2.0.3.tgz", + "integrity": "sha512-ERu3wiOnKAmNAh/lUEp1M7eYX3ai/hQU5+BmNQrKJDGqr1MjrKhJ1Ar7OtBLjBNaxuq7tIGBvngVn4+CjeoMXQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-bubble": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-bubble/-/tsparticles-interaction-external-bubble-2.0.3.tgz", + "integrity": "sha512-yOIy0QY9kDlvCwivQQkY3ezCHdDZ2WRYZNCdJARKxHG0lptZIT9hxqkONf1OYlQ+/dsHiT+4t1JIISYy9oYwEA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-connect": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-connect/-/tsparticles-interaction-external-connect-2.0.3.tgz", + "integrity": "sha512-M7tn4T4RbO4xNJ5Ki8EgLzC9+H+adaTbQfMOroJ9/l1zKVrQhPAGHeXOAQmdQb1QgaYB0HXk9MpIEJW393vdaQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-grab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-grab/-/tsparticles-interaction-external-grab-2.0.3.tgz", + "integrity": "sha512-QT/HbkzOxbY8OVj9skP1oAs9CLHH6pN8ofDmyPJ+n3dCuknIE5BPDAHjaaxE79EP+ZpauTbdGYDaAVQEjhRgXA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-pause": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-pause/-/tsparticles-interaction-external-pause-2.0.3.tgz", + "integrity": "sha512-zmcYEWTKN8XecPR6ra97TVwGim/KxivW/WaG33XtNcilYLO3Oc6oWiQ7aHWIlf70pVyxZbcflWlsx6cSiwfJ5w==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-push": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-push/-/tsparticles-interaction-external-push-2.0.3.tgz", + "integrity": "sha512-nGodslff8JfjRayAxhB9qWvu6glZwqSegfZHxlYwwY1UIQAZ4jJwmlb2JXgpdpitv56RP4D9/pPU8bvf+IiazQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-remove": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-remove/-/tsparticles-interaction-external-remove-2.0.3.tgz", + "integrity": "sha512-PqKIPUBNV6hlfIReCqCglH3pUcvu7FWH1rTgIrgCjgIRnI4vmcw+Wkd5y1Hx0YwqFCdXrRJJ91e0c5FinMrJVA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-repulse": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-repulse/-/tsparticles-interaction-external-repulse-2.0.3.tgz", + "integrity": "sha512-ukBNBWK6h4SmYvqzWCpoygcHUZEOc6DDpysMJlIgtIzHeaOnuM8vEahxQWl5yNsvwTiuCTtc6RZ2sL+sg2KHWQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-external-trail": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-trail/-/tsparticles-interaction-external-trail-2.0.3.tgz", + "integrity": "sha512-n9aTNQV20tnzZq1ySAku8arjcNgrwY7jxHYMg/cZhez5mU8I6xKNIf+VZVo9F/X9nuMgyIC795BV43mlky/gqQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-particles-attract": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-particles-attract/-/tsparticles-interaction-particles-attract-2.0.3.tgz", + "integrity": "sha512-rCSWDfwrHWt+/KO6Z4666S4R4gBpzyR0Hse1QwEiqNhwRdP2/QpwIpKU0pWnt/9HGzUvNYpAINH+bpIqWo2qcg==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-particles-collisions": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-particles-collisions/-/tsparticles-interaction-particles-collisions-2.0.3.tgz", + "integrity": "sha512-m/6VeYEHAUTvCWFYNNgURSK5dHnDBES8HextrkDCAxUjf/5wvJpwOVPELuGDNc5sWBD1T4hLrZVtIzbrYmxjwQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-interaction-particles-links": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-particles-links/-/tsparticles-interaction-particles-links-2.0.3.tgz", + "integrity": "sha512-Rdh+FsfBYbQqtBsd2EYcSdjYAoRbzy9/VYquEc/Bzv8DgMs3jJv2/1BtekSfCSVvUGxZW9YoA+5e8e9n9hi32Q==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-move-base": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-move-base/-/tsparticles-move-base-2.0.3.tgz", + "integrity": "sha512-ZJSe0AYKXerb1aSAwZFcojirSLmlbsN7+8w8oRmbM5h1aJRg7BOa4OastMuNjOT9fjxL1xDNik/e3nx8xyByXg==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-move-parallax": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-move-parallax/-/tsparticles-move-parallax-2.0.3.tgz", + "integrity": "sha512-rXj8PukEMizbhzWpM4/VvVFxnYs3oRIIEkQej1TmQeMsvg1wmi7qMV1YOGpmw/XjHBLDqwmYUtdn6p0FT6aXjQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-plugin-absorbers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-plugin-absorbers/-/tsparticles-plugin-absorbers-2.0.3.tgz", + "integrity": "sha512-kh3QOZg2J/wMTbUU8+YmUeNhaQ1BRbPdZQH4PCE4PwgNkIduaZsX3ORuA1CPeqJ0zpS1xMGKGsWDgOfPJjaWJA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-plugin-emitters": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-plugin-emitters/-/tsparticles-plugin-emitters-2.0.3.tgz", + "integrity": "sha512-2XV7je3VH0N3vZdbcUcau/W8r7/95I1ziGRj0RrouK1gvOFZEcqzWELrz1s/HV26aNlYeESMCxba1fHNh84tyA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-plugin-polygon-mask": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-plugin-polygon-mask/-/tsparticles-plugin-polygon-mask-2.0.3.tgz", + "integrity": "sha512-EPV4xKQIrq1/ashtGv/gg4wTonOw76rSt6twHsG5cdubV6LQnJIYZg2scObIUgXnlpG4WG0p3nZiYMADdMnmRw==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-circle": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-circle/-/tsparticles-shape-circle-2.0.3.tgz", + "integrity": "sha512-irlKC6pqqvlHS4LHLNzh+LgRpAsMMkc45Wnk3xc7EXSP1hjaudS2GMX2lO85MoDXeZcl+hrA1unUt45atDwF3g==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-image": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-image/-/tsparticles-shape-image-2.0.3.tgz", + "integrity": "sha512-Rf+7DDGUTEEKkIVAi+YRjbeigzJSkPZzedg+1AZxztF2HDT8sXNlgAePudvjoqyMDKyd1gDQW/16Yzkcx6hIow==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-line": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-line/-/tsparticles-shape-line-2.0.3.tgz", + "integrity": "sha512-s7f0izNUUZyOvt3tcCCIbDsu4Ed8etIqEDdigctBP7k0gwHZAmsV9fyYqOfTF4DK5oPCzc/7OJTISiPOqt9CNg==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-polygon": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-polygon/-/tsparticles-shape-polygon-2.0.3.tgz", + "integrity": "sha512-2rslG14FKYbkmJNjs5wHQQud+lkWeponH36B1KJHQt1oGJhNT1aad1lnZ3JQaG/WHvXlIrT16pLolZW9KArpqg==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-square": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-square/-/tsparticles-shape-square-2.0.3.tgz", + "integrity": "sha512-ra5fxTpLbsunJaxkc2AQzz9njwN7d/3jAZL8yuLwaSEiu8UyWp+8fMzHXuGY5hzp61BGGxtIQ4zfrF/9WK1/iQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-star": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-star/-/tsparticles-shape-star-2.0.3.tgz", + "integrity": "sha512-/m/fzmfjExRYaVFCHUu1rp1PgybL16si69kU7b1+5s774D+/Mbpk0XplAEWLiv+YX1ifRk7YUi5O5MLWZ9+7bw==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-shape-text": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-text/-/tsparticles-shape-text-2.0.3.tgz", + "integrity": "sha512-8g3yL3kAcW+XgH5nRNT4nsWGzbVoUoOGhG7yD6vnvHWJhcsGAdk6qn/1MxJ45yUll4Fl/p8ZJcg2jywDmujf3g==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-slim": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-slim/-/tsparticles-slim-2.0.3.tgz", + "integrity": "sha512-RQX+ZGdJEthYUOX5U6GLWw3xiOYo11HI0E+9b53hQh5H1VcUEHvX6ITVwRqMohD04VtkA4Hw33PdOnfjtM3G/g==", + "dependencies": { + "tsparticles-engine": "^2.0.3", + "tsparticles-interaction-external-attract": "^2.0.3", + "tsparticles-interaction-external-bounce": "^2.0.3", + "tsparticles-interaction-external-bubble": "^2.0.3", + "tsparticles-interaction-external-connect": "^2.0.3", + "tsparticles-interaction-external-grab": "^2.0.3", + "tsparticles-interaction-external-pause": "^2.0.3", + "tsparticles-interaction-external-push": "^2.0.3", + "tsparticles-interaction-external-remove": "^2.0.3", + "tsparticles-interaction-external-repulse": "^2.0.3", + "tsparticles-interaction-particles-attract": "^2.0.3", + "tsparticles-interaction-particles-collisions": "^2.0.3", + "tsparticles-interaction-particles-links": "^2.0.3", + "tsparticles-move-base": "^2.0.3", + "tsparticles-move-parallax": "^2.0.3", + "tsparticles-shape-circle": "^2.0.3", + "tsparticles-shape-image": "^2.0.3", + "tsparticles-shape-line": "^2.0.3", + "tsparticles-shape-polygon": "^2.0.3", + "tsparticles-shape-square": "^2.0.3", + "tsparticles-shape-star": "^2.0.3", + "tsparticles-shape-text": "^2.0.3", + "tsparticles-updater-angle": "^2.0.3", + "tsparticles-updater-color": "^2.0.3", + "tsparticles-updater-life": "^2.0.3", + "tsparticles-updater-opacity": "^2.0.3", + "tsparticles-updater-out-modes": "^2.0.3", + "tsparticles-updater-size": "^2.0.3", + "tsparticles-updater-stroke-color": "^2.0.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + } + }, + "node_modules/tsparticles-updater-angle": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-angle/-/tsparticles-updater-angle-2.0.3.tgz", + "integrity": "sha512-Fu39U7WLeUfeiUDQhwnobyOrNVrWsIdM08m2TBaVjqXBt4WWilO4Xs+5SbDyCWxQ0hFwUgNcHdnm80AX9608LQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-color/-/tsparticles-updater-color-2.0.3.tgz", + "integrity": "sha512-h2Ml4WIKqLlIZVngzP2WD+vsKDVWQyZelrXjW0a02zmsue1ZMexZhNwjCf2Vp+weaQLVGhzP+nKbzcYasKdydQ==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-life": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-life/-/tsparticles-updater-life-2.0.3.tgz", + "integrity": "sha512-ISw1LVBkz6CVUaVecA6s2LEe9JzyuE9aQRv2LDK3eV1Lz3QrdyPlMt1MjccHa1K/AUp+RVPhIWKKKe4UBqFJFA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-opacity": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-opacity/-/tsparticles-updater-opacity-2.0.3.tgz", + "integrity": "sha512-AFBhPKfD5mzhEQzfYUHZ79heWQ8UuskTKgylLceXr41mzGEr3AMtOuBcRkQUpYhKThhlDbrWecMPCYk6VQfhOw==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-out-modes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-out-modes/-/tsparticles-updater-out-modes-2.0.3.tgz", + "integrity": "sha512-6lYjRrp0XIvEQTcERQhqm7nfz4NMCXqmUWzBUr6R/F7lMKM75eMK6Q6hmSQDgkdyVzvY7j9enHjTBeZXxyCrqA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-roll": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-roll/-/tsparticles-updater-roll-2.0.3.tgz", + "integrity": "sha512-sm7TkU/0ErVUBDnRUCYjH1OonHs+P/C8gtiVrRhvowQTdpSl5a1x+UoSu6aHzPxZZVCBhDmkACNC0JuOa6uucw==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-size": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-size/-/tsparticles-updater-size-2.0.3.tgz", + "integrity": "sha512-dIkse7f9ZhOXFtPKyinzOQul75MRO29kzXMMU1vsOsLdNB6+8/LL44pvLRdrJA/6JUeuspMeMEtMvwtAyPeA+A==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-stroke-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-stroke-color/-/tsparticles-updater-stroke-color-2.0.3.tgz", + "integrity": "sha512-iQLiYpbPDbM+NqnLZPv7Th12Mq4CLSFLXr6zvZi09TLVgRl9sLur046AHyLP5IuetvwwaOxKkKEGAg7VlvR6lA==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-tilt": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-tilt/-/tsparticles-updater-tilt-2.0.3.tgz", + "integrity": "sha512-04L7qsP47X9Mt6esAvk4/avfHQQI94h+/NiKbZ7HNJjcKbCvQp9LaplQCFGvr9t1IxFT9aQAmRP2KInVAelw5g==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, + "node_modules/tsparticles-updater-wobble": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-wobble/-/tsparticles-updater-wobble-2.0.3.tgz", + "integrity": "sha512-oToq/HwaA6OHjO8j7u8oT3I8/pJhOCNldX3XoZAgiaA3E8E19g8iD/0tWIkP4D/4o+I7NkJLv0wTcd5DJyueGg==", + "dependencies": { + "tsparticles-engine": "^2.0.3" + } + }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -11760,6 +12141,14 @@ "@vue/shared": "3.2.26" } }, + "node_modules/vue-class-component": { + "version": "8.0.0-rc.1", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-8.0.0-rc.1.tgz", + "integrity": "sha512-w1nMzsT/UdbDAXKqhwTmSoyuJzUXKrxLE77PCFVuC6syr8acdFDAq116xgvZh9UCuV0h+rlCtxXolr3Hi3HyPQ==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-eslint-parser": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.0.1.tgz", @@ -19555,6 +19944,16 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, + "particles.vue3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/particles.vue3/-/particles.vue3-2.0.3.tgz", + "integrity": "sha512-FE2zbTCDpwP8Wzk2nDfVyuJkOtQHDHq2I+eqc7UYELc0IEKxtEaCJEjAfP0uAscP4Rl1hWW3MS63Fg7OqBmnvQ==", + "requires": { + "core-js": "^3.20.1", + "tsparticles-engine": "^2.0.3", + "vue-class-component": "^8.0.0-rc.1" + } + }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -21319,6 +21718,343 @@ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, + "tsparticles": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles/-/tsparticles-2.0.3.tgz", + "integrity": "sha512-aHWFfppS9VBd+zZVbV6wVqovo/xFQbKNzdy2fWNGAuomXRlz0nkU48jY1sarGz64SUGREIWgXvYgwIpwlKe17g==", + "requires": { + "tsparticles-engine": "^2.0.3", + "tsparticles-interaction-external-trail": "^2.0.3", + "tsparticles-plugin-absorbers": "^2.0.3", + "tsparticles-plugin-emitters": "^2.0.3", + "tsparticles-plugin-polygon-mask": "^2.0.3", + "tsparticles-slim": "^2.0.3", + "tsparticles-updater-roll": "^2.0.3", + "tsparticles-updater-tilt": "^2.0.3", + "tsparticles-updater-wobble": "^2.0.3" + } + }, + "tsparticles-engine": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-engine/-/tsparticles-engine-2.0.3.tgz", + "integrity": "sha512-n54t3Qcdnz/wc6op38Q/nVwfi7d/m/HdiDdJsJy4DWAJnnu4YZLGoor9h76nuvfIeY7niTQWMLMxWBViAKOOEA==" + }, + "tsparticles-interaction-external-attract": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-attract/-/tsparticles-interaction-external-attract-2.0.3.tgz", + "integrity": "sha512-z0/+aM+AcKXd8AzE89SQA1jq7ZTnG+eF+x00aqNVBfiHvrch9+yLTudwk9Rmkiq5H1FStYk5kQZS0XS9lysf1g==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-bounce": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-bounce/-/tsparticles-interaction-external-bounce-2.0.3.tgz", + "integrity": "sha512-ERu3wiOnKAmNAh/lUEp1M7eYX3ai/hQU5+BmNQrKJDGqr1MjrKhJ1Ar7OtBLjBNaxuq7tIGBvngVn4+CjeoMXQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-bubble": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-bubble/-/tsparticles-interaction-external-bubble-2.0.3.tgz", + "integrity": "sha512-yOIy0QY9kDlvCwivQQkY3ezCHdDZ2WRYZNCdJARKxHG0lptZIT9hxqkONf1OYlQ+/dsHiT+4t1JIISYy9oYwEA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-connect": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-connect/-/tsparticles-interaction-external-connect-2.0.3.tgz", + "integrity": "sha512-M7tn4T4RbO4xNJ5Ki8EgLzC9+H+adaTbQfMOroJ9/l1zKVrQhPAGHeXOAQmdQb1QgaYB0HXk9MpIEJW393vdaQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-grab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-grab/-/tsparticles-interaction-external-grab-2.0.3.tgz", + "integrity": "sha512-QT/HbkzOxbY8OVj9skP1oAs9CLHH6pN8ofDmyPJ+n3dCuknIE5BPDAHjaaxE79EP+ZpauTbdGYDaAVQEjhRgXA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-pause": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-pause/-/tsparticles-interaction-external-pause-2.0.3.tgz", + "integrity": "sha512-zmcYEWTKN8XecPR6ra97TVwGim/KxivW/WaG33XtNcilYLO3Oc6oWiQ7aHWIlf70pVyxZbcflWlsx6cSiwfJ5w==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-push": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-push/-/tsparticles-interaction-external-push-2.0.3.tgz", + "integrity": "sha512-nGodslff8JfjRayAxhB9qWvu6glZwqSegfZHxlYwwY1UIQAZ4jJwmlb2JXgpdpitv56RP4D9/pPU8bvf+IiazQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-remove": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-remove/-/tsparticles-interaction-external-remove-2.0.3.tgz", + "integrity": "sha512-PqKIPUBNV6hlfIReCqCglH3pUcvu7FWH1rTgIrgCjgIRnI4vmcw+Wkd5y1Hx0YwqFCdXrRJJ91e0c5FinMrJVA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-repulse": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-repulse/-/tsparticles-interaction-external-repulse-2.0.3.tgz", + "integrity": "sha512-ukBNBWK6h4SmYvqzWCpoygcHUZEOc6DDpysMJlIgtIzHeaOnuM8vEahxQWl5yNsvwTiuCTtc6RZ2sL+sg2KHWQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-external-trail": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-external-trail/-/tsparticles-interaction-external-trail-2.0.3.tgz", + "integrity": "sha512-n9aTNQV20tnzZq1ySAku8arjcNgrwY7jxHYMg/cZhez5mU8I6xKNIf+VZVo9F/X9nuMgyIC795BV43mlky/gqQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-particles-attract": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-particles-attract/-/tsparticles-interaction-particles-attract-2.0.3.tgz", + "integrity": "sha512-rCSWDfwrHWt+/KO6Z4666S4R4gBpzyR0Hse1QwEiqNhwRdP2/QpwIpKU0pWnt/9HGzUvNYpAINH+bpIqWo2qcg==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-particles-collisions": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-particles-collisions/-/tsparticles-interaction-particles-collisions-2.0.3.tgz", + "integrity": "sha512-m/6VeYEHAUTvCWFYNNgURSK5dHnDBES8HextrkDCAxUjf/5wvJpwOVPELuGDNc5sWBD1T4hLrZVtIzbrYmxjwQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-interaction-particles-links": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-interaction-particles-links/-/tsparticles-interaction-particles-links-2.0.3.tgz", + "integrity": "sha512-Rdh+FsfBYbQqtBsd2EYcSdjYAoRbzy9/VYquEc/Bzv8DgMs3jJv2/1BtekSfCSVvUGxZW9YoA+5e8e9n9hi32Q==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-move-base": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-move-base/-/tsparticles-move-base-2.0.3.tgz", + "integrity": "sha512-ZJSe0AYKXerb1aSAwZFcojirSLmlbsN7+8w8oRmbM5h1aJRg7BOa4OastMuNjOT9fjxL1xDNik/e3nx8xyByXg==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-move-parallax": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-move-parallax/-/tsparticles-move-parallax-2.0.3.tgz", + "integrity": "sha512-rXj8PukEMizbhzWpM4/VvVFxnYs3oRIIEkQej1TmQeMsvg1wmi7qMV1YOGpmw/XjHBLDqwmYUtdn6p0FT6aXjQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-plugin-absorbers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-plugin-absorbers/-/tsparticles-plugin-absorbers-2.0.3.tgz", + "integrity": "sha512-kh3QOZg2J/wMTbUU8+YmUeNhaQ1BRbPdZQH4PCE4PwgNkIduaZsX3ORuA1CPeqJ0zpS1xMGKGsWDgOfPJjaWJA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-plugin-emitters": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-plugin-emitters/-/tsparticles-plugin-emitters-2.0.3.tgz", + "integrity": "sha512-2XV7je3VH0N3vZdbcUcau/W8r7/95I1ziGRj0RrouK1gvOFZEcqzWELrz1s/HV26aNlYeESMCxba1fHNh84tyA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-plugin-polygon-mask": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-plugin-polygon-mask/-/tsparticles-plugin-polygon-mask-2.0.3.tgz", + "integrity": "sha512-EPV4xKQIrq1/ashtGv/gg4wTonOw76rSt6twHsG5cdubV6LQnJIYZg2scObIUgXnlpG4WG0p3nZiYMADdMnmRw==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-circle": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-circle/-/tsparticles-shape-circle-2.0.3.tgz", + "integrity": "sha512-irlKC6pqqvlHS4LHLNzh+LgRpAsMMkc45Wnk3xc7EXSP1hjaudS2GMX2lO85MoDXeZcl+hrA1unUt45atDwF3g==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-image": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-image/-/tsparticles-shape-image-2.0.3.tgz", + "integrity": "sha512-Rf+7DDGUTEEKkIVAi+YRjbeigzJSkPZzedg+1AZxztF2HDT8sXNlgAePudvjoqyMDKyd1gDQW/16Yzkcx6hIow==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-line": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-line/-/tsparticles-shape-line-2.0.3.tgz", + "integrity": "sha512-s7f0izNUUZyOvt3tcCCIbDsu4Ed8etIqEDdigctBP7k0gwHZAmsV9fyYqOfTF4DK5oPCzc/7OJTISiPOqt9CNg==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-polygon": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-polygon/-/tsparticles-shape-polygon-2.0.3.tgz", + "integrity": "sha512-2rslG14FKYbkmJNjs5wHQQud+lkWeponH36B1KJHQt1oGJhNT1aad1lnZ3JQaG/WHvXlIrT16pLolZW9KArpqg==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-square": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-square/-/tsparticles-shape-square-2.0.3.tgz", + "integrity": "sha512-ra5fxTpLbsunJaxkc2AQzz9njwN7d/3jAZL8yuLwaSEiu8UyWp+8fMzHXuGY5hzp61BGGxtIQ4zfrF/9WK1/iQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-star": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-star/-/tsparticles-shape-star-2.0.3.tgz", + "integrity": "sha512-/m/fzmfjExRYaVFCHUu1rp1PgybL16si69kU7b1+5s774D+/Mbpk0XplAEWLiv+YX1ifRk7YUi5O5MLWZ9+7bw==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-shape-text": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-shape-text/-/tsparticles-shape-text-2.0.3.tgz", + "integrity": "sha512-8g3yL3kAcW+XgH5nRNT4nsWGzbVoUoOGhG7yD6vnvHWJhcsGAdk6qn/1MxJ45yUll4Fl/p8ZJcg2jywDmujf3g==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-slim": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-slim/-/tsparticles-slim-2.0.3.tgz", + "integrity": "sha512-RQX+ZGdJEthYUOX5U6GLWw3xiOYo11HI0E+9b53hQh5H1VcUEHvX6ITVwRqMohD04VtkA4Hw33PdOnfjtM3G/g==", + "requires": { + "tsparticles-engine": "^2.0.3", + "tsparticles-interaction-external-attract": "^2.0.3", + "tsparticles-interaction-external-bounce": "^2.0.3", + "tsparticles-interaction-external-bubble": "^2.0.3", + "tsparticles-interaction-external-connect": "^2.0.3", + "tsparticles-interaction-external-grab": "^2.0.3", + "tsparticles-interaction-external-pause": "^2.0.3", + "tsparticles-interaction-external-push": "^2.0.3", + "tsparticles-interaction-external-remove": "^2.0.3", + "tsparticles-interaction-external-repulse": "^2.0.3", + "tsparticles-interaction-particles-attract": "^2.0.3", + "tsparticles-interaction-particles-collisions": "^2.0.3", + "tsparticles-interaction-particles-links": "^2.0.3", + "tsparticles-move-base": "^2.0.3", + "tsparticles-move-parallax": "^2.0.3", + "tsparticles-shape-circle": "^2.0.3", + "tsparticles-shape-image": "^2.0.3", + "tsparticles-shape-line": "^2.0.3", + "tsparticles-shape-polygon": "^2.0.3", + "tsparticles-shape-square": "^2.0.3", + "tsparticles-shape-star": "^2.0.3", + "tsparticles-shape-text": "^2.0.3", + "tsparticles-updater-angle": "^2.0.3", + "tsparticles-updater-color": "^2.0.3", + "tsparticles-updater-life": "^2.0.3", + "tsparticles-updater-opacity": "^2.0.3", + "tsparticles-updater-out-modes": "^2.0.3", + "tsparticles-updater-size": "^2.0.3", + "tsparticles-updater-stroke-color": "^2.0.3" + } + }, + "tsparticles-updater-angle": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-angle/-/tsparticles-updater-angle-2.0.3.tgz", + "integrity": "sha512-Fu39U7WLeUfeiUDQhwnobyOrNVrWsIdM08m2TBaVjqXBt4WWilO4Xs+5SbDyCWxQ0hFwUgNcHdnm80AX9608LQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-color/-/tsparticles-updater-color-2.0.3.tgz", + "integrity": "sha512-h2Ml4WIKqLlIZVngzP2WD+vsKDVWQyZelrXjW0a02zmsue1ZMexZhNwjCf2Vp+weaQLVGhzP+nKbzcYasKdydQ==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-life": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-life/-/tsparticles-updater-life-2.0.3.tgz", + "integrity": "sha512-ISw1LVBkz6CVUaVecA6s2LEe9JzyuE9aQRv2LDK3eV1Lz3QrdyPlMt1MjccHa1K/AUp+RVPhIWKKKe4UBqFJFA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-opacity": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-opacity/-/tsparticles-updater-opacity-2.0.3.tgz", + "integrity": "sha512-AFBhPKfD5mzhEQzfYUHZ79heWQ8UuskTKgylLceXr41mzGEr3AMtOuBcRkQUpYhKThhlDbrWecMPCYk6VQfhOw==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-out-modes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-out-modes/-/tsparticles-updater-out-modes-2.0.3.tgz", + "integrity": "sha512-6lYjRrp0XIvEQTcERQhqm7nfz4NMCXqmUWzBUr6R/F7lMKM75eMK6Q6hmSQDgkdyVzvY7j9enHjTBeZXxyCrqA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-roll": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-roll/-/tsparticles-updater-roll-2.0.3.tgz", + "integrity": "sha512-sm7TkU/0ErVUBDnRUCYjH1OonHs+P/C8gtiVrRhvowQTdpSl5a1x+UoSu6aHzPxZZVCBhDmkACNC0JuOa6uucw==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-size": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-size/-/tsparticles-updater-size-2.0.3.tgz", + "integrity": "sha512-dIkse7f9ZhOXFtPKyinzOQul75MRO29kzXMMU1vsOsLdNB6+8/LL44pvLRdrJA/6JUeuspMeMEtMvwtAyPeA+A==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-stroke-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-stroke-color/-/tsparticles-updater-stroke-color-2.0.3.tgz", + "integrity": "sha512-iQLiYpbPDbM+NqnLZPv7Th12Mq4CLSFLXr6zvZi09TLVgRl9sLur046AHyLP5IuetvwwaOxKkKEGAg7VlvR6lA==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-tilt": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-tilt/-/tsparticles-updater-tilt-2.0.3.tgz", + "integrity": "sha512-04L7qsP47X9Mt6esAvk4/avfHQQI94h+/NiKbZ7HNJjcKbCvQp9LaplQCFGvr9t1IxFT9aQAmRP2KInVAelw5g==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, + "tsparticles-updater-wobble": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsparticles-updater-wobble/-/tsparticles-updater-wobble-2.0.3.tgz", + "integrity": "sha512-oToq/HwaA6OHjO8j7u8oT3I8/pJhOCNldX3XoZAgiaA3E8E19g8iD/0tWIkP4D/4o+I7NkJLv0wTcd5DJyueGg==", + "requires": { + "tsparticles-engine": "^2.0.3" + } + }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -21474,6 +22210,12 @@ "@vue/shared": "3.2.26" } }, + "vue-class-component": { + "version": "8.0.0-rc.1", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-8.0.0-rc.1.tgz", + "integrity": "sha512-w1nMzsT/UdbDAXKqhwTmSoyuJzUXKrxLE77PCFVuC6syr8acdFDAq116xgvZh9UCuV0h+rlCtxXolr3Hi3HyPQ==", + "requires": {} + }, "vue-eslint-parser": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.0.1.tgz", diff --git a/package.json b/package.json index b6a5fe3..eac5254 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "core-js": "^3.6.5", "lodash.clonedeep": "^4.5.0", "nanoevents": "^6.0.2", + "particles.vue3": "^2.0.3", + "tsparticles": "^2.0.3", "vue": "^3.2.26", "vue-next-select": "^2.10.2", "vue-panzoom": "^1.1.6", diff --git a/src/App.vue b/src/App.vue index c01674a..dc2decb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,10 +6,13 @@ + - diff --git a/src/features/links/Link.vue b/src/features/links/Link.vue index 8371836..9159f87 100644 --- a/src/features/links/Link.vue +++ b/src/features/links/Link.vue @@ -13,32 +13,47 @@ - - diff --git a/src/features/links/Links.vue b/src/features/links/Links.vue index fa5ead1..cab8aae 100644 --- a/src/features/links/Links.vue +++ b/src/features/links/Links.vue @@ -4,34 +4,71 @@ v-for="(link, index) in validLinks" :key="index" :link="link" + :boundingRect="boundingRect" :startNode="nodes[link.startNode.id]!" :endNode="nodes[link.endNode.id]!" /> +
+ + diff --git a/src/game/layers.tsx b/src/game/layers.tsx index 6706912..5733ade 100644 --- a/src/game/layers.tsx +++ b/src/game/layers.tsx @@ -22,9 +22,8 @@ import { persistent, PersistentRef } from "./persistence"; import player from "./player"; export interface FeatureNode { - x?: number; - y?: number; rect?: DOMRect; + observer?: MutationObserver; element: HTMLElement; } From 8d0489c8e18f48b80b391cbf427867994e2238ba Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Tue, 22 Mar 2022 23:04:49 -0500 Subject: [PATCH 05/14] Default Challenge.canStart to true --- src/features/challenges/Challenge.vue | 8 ++++++-- src/features/challenges/challenge.tsx | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/features/challenges/Challenge.vue b/src/features/challenges/Challenge.vue index 7960607..f98aa0a 100644 --- a/src/features/challenges/Challenge.vue +++ b/src/features/challenges/Challenge.vue @@ -12,12 +12,16 @@ feature: true, challenge: true, done: unref(completed), - canStart: unref(canStart), + canStart: unref(canStart) && !unref(maxed), maxed: unref(maxed), ...unref(classes) }" > - diff --git a/src/features/challenges/challenge.tsx b/src/features/challenges/challenge.tsx index 9ecf8a9..9ec22e3 100644 --- a/src/features/challenges/challenge.tsx +++ b/src/features/challenges/challenge.tsx @@ -73,7 +73,7 @@ export type Challenge = Replace< T & BaseChallenge, { visibility: GetComputableTypeWithDefault; - canStart: GetComputableTypeWithDefault>; + canStart: GetComputableTypeWithDefault; canComplete: GetComputableTypeWithDefault>; completionLimit: GetComputableTypeWithDefault; mark: GetComputableTypeWithDefault>; @@ -209,6 +209,7 @@ export function createChallenge( } processComputable(challenge as T, "canStart"); + setDefault(challenge, "canStart", true); processComputable(challenge as T, "canComplete"); processComputable(challenge as T, "completionLimit"); setDefault(challenge, "completionLimit", 1); From 887002e95ba5cadb16bde7b972e6cf9929d2e652 Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Sat, 26 Mar 2022 22:35:31 -0500 Subject: [PATCH 06/14] Added support for non-fullscreen particles This also drastically improves positioning effects based on elements --- src/features/particles/Particles.vue | 99 +++++++++++++++++++--- src/features/particles/particles.tsx | 118 ++++++++++++++++++++------- 2 files changed, 176 insertions(+), 41 deletions(-) diff --git a/src/features/particles/Particles.vue b/src/features/particles/Particles.vue index 57feb7e..afe40be 100644 --- a/src/features/particles/Particles.vue +++ b/src/features/particles/Particles.vue @@ -1,11 +1,19 @@ +onMounted, + + diff --git a/src/features/particles/particles.tsx b/src/features/particles/particles.tsx index 010bb36..4f460a9 100644 --- a/src/features/particles/particles.tsx +++ b/src/features/particles/particles.tsx @@ -1,39 +1,101 @@ -import ParticlesComponent from "./Particles.vue"; +import ParticlesComponent from "features/particles/Particles.vue"; +import { Container } from "tsparticles-engine"; import { IEmitter } from "tsparticles-plugin-emitters/Options/Interfaces/IEmitter"; import { EmitterInstance } from "tsparticles-plugin-emitters/EmitterInstance"; import { EmitterContainer } from "tsparticles-plugin-emitters/EmitterContainer"; import { Ref, shallowRef } from "vue"; -import { registerGameComponent } from "game/settings"; -import { jsx } from "features/feature"; +import { Component, GatherProps, getUniqueID, Replace, setDefault } from "features/feature"; +import { createLazyProxy } from "util/proxies"; -registerGameComponent(jsx(() => )); +export const ParticlesType = Symbol("Particles"); -const containerRef: Ref = shallowRef(null); +export interface ParticlesOptions { + fullscreen?: boolean; + zIndex?: number; + onContainerResized?: (boundingRect: DOMRect) => void; +} -let emittersToAdd: { - resolve: (value: EmitterInstance | PromiseLike) => void; - options: IEmitter & { particles: Required["particles"] }; -}[] = []; +export interface BaseParticles { + id: string; + containerRef: Ref; + addEmitter: ( + options: IEmitter & { particles: Required["particles"] } + ) => Promise; + removeEmitter: (emitter: EmitterInstance) => void; + type: typeof ParticlesType; + [Component]: typeof ParticlesComponent; + [GatherProps]: () => Record; +} -export function addEmitter( - options: IEmitter & { particles: Required["particles"] } -): Promise { - if (containerRef.value) { - // TODO why does addEmitter require a position parameter - return Promise.resolve(containerRef.value.addEmitter(options)); +export type Particles = Replace< + T & BaseParticles, + { + fullscreen: undefined extends T["fullscreen"] ? true : T["fullscreen"]; + zIndex: undefined extends T["zIndex"] ? 1 : T["zIndex"]; } - return new Promise(resolve => { - emittersToAdd.push({ resolve, options }); +>; + +export type GenericParticles = Replace< + Particles, + { + fullscreen: boolean; + zIndex: number; + } +>; + +export function createParticles( + optionsFunc: () => T & ThisType> +): Particles { + return createLazyProxy(() => { + const particles: T & Partial = optionsFunc(); + particles.id = getUniqueID("particles-"); + particles.type = ParticlesType; + particles[Component] = ParticlesComponent; + + particles.containerRef = shallowRef(null); + particles.addEmitter = ( + options: IEmitter & { particles: Required["particles"] } + ): Promise => { + const genericParticles = particles as GenericParticles; + if (genericParticles.containerRef.value) { + // TODO why does addEmitter require a position parameter + return Promise.resolve(genericParticles.containerRef.value.addEmitter(options)); + } + return new Promise(resolve => { + emittersToAdd.push({ resolve, options }); + }); + }; + particles.removeEmitter = (emitter: EmitterInstance) => { + // TODO I can't find a proper way to remove an emitter without accessing private functions + emitter.emitters.removeEmitter(emitter); + }; + + let emittersToAdd: { + resolve: (value: EmitterInstance | PromiseLike) => void; + options: IEmitter & { particles: Required["particles"] }; + }[] = []; + + function onInit(container: EmitterContainer & Container) { + (particles as GenericParticles).containerRef.value = container; + emittersToAdd.forEach(({ resolve, options }) => resolve(container.addEmitter(options))); + emittersToAdd = []; + } + + setDefault(particles, "fullscreen", true); + setDefault(particles, "zIndex", 1); + particles.onContainerResized = particles.onContainerResized?.bind(particles); + + particles[GatherProps] = function (this: GenericParticles) { + const { id, fullscreen, zIndex, onContainerResized } = this; + return { + id, + fullscreen, + zIndex, + onContainerResized, + onInit + }; + }; + + return particles as unknown as Particles; }); } - -export function removeEmitter(emitter: EmitterInstance) { - // TODO I can't find a proper way to remove an emitter without accessing private functions - emitter.emitters.removeEmitter(emitter); -} - -function onInit(container: EmitterContainer) { - containerRef.value = container; - emittersToAdd.forEach(({ resolve, options }) => resolve(container.addEmitter(options))); - emittersToAdd = []; -} From 561dd35570a4cc9c06cb6f8b946bac14cb171b2a Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Sun, 27 Mar 2022 00:14:35 -0500 Subject: [PATCH 07/14] Added events to onClick --- src/features/clickables/Clickable.vue | 2 +- src/features/clickables/clickable.ts | 6 +++--- src/features/grids/GridCell.vue | 2 +- src/features/grids/grid.ts | 4 ++-- src/features/trees/TreeNode.vue | 2 +- src/features/trees/tree.ts | 2 +- src/util/vue.tsx | 10 ++++++---- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/features/clickables/Clickable.vue b/src/features/clickables/Clickable.vue index ed41d04..8054897 100644 --- a/src/features/clickables/Clickable.vue +++ b/src/features/clickables/Clickable.vue @@ -67,7 +67,7 @@ export default defineComponent({ }, style: processedPropType(Object, String, Array), classes: processedPropType>(Object), - onClick: Function as PropType, + onClick: Function as PropType<(e?: MouseEvent | TouchEvent) => void>, onHold: Function as PropType, canClick: { type: processedPropType(Boolean), diff --git a/src/features/clickables/clickable.ts b/src/features/clickables/clickable.ts index 6fa83c4..15ed030 100644 --- a/src/features/clickables/clickable.ts +++ b/src/features/clickables/clickable.ts @@ -37,7 +37,7 @@ export interface ClickableOptions { } >; small?: boolean; - onClick?: VoidFunction; + onClick?: (e?: MouseEvent | TouchEvent) => void; onHold?: VoidFunction; } @@ -88,9 +88,9 @@ export function createClickable( if (clickable.onClick) { const onClick = clickable.onClick.bind(clickable); - clickable.onClick = function () { + clickable.onClick = function (e) { if (unref(clickable.canClick)) { - onClick(); + onClick(e); } }; } diff --git a/src/features/grids/GridCell.vue b/src/features/grids/GridCell.vue index 0da4580..7c81556 100644 --- a/src/features/grids/GridCell.vue +++ b/src/features/grids/GridCell.vue @@ -40,7 +40,7 @@ export default defineComponent({ type: processedPropType(Number), required: true }, - onClick: Function as PropType, + onClick: Function as PropType<(e?: MouseEvent | TouchEvent) => void>, onHold: Function as PropType, display: { type: processedPropType(Object, String, Function), diff --git a/src/features/grids/grid.ts b/src/features/grids/grid.ts index 87f889a..12b0c30 100644 --- a/src/features/grids/grid.ts +++ b/src/features/grids/grid.ts @@ -185,7 +185,7 @@ export interface GridCell { classes?: Record; title?: CoercableComponent; display: CoercableComponent; - onClick?: VoidFunction; + onClick?: (e?: MouseEvent | TouchEvent) => void; onHold?: VoidFunction; } @@ -200,7 +200,7 @@ export interface GridOptions { getClasses?: CellComputable>; getTitle?: CellComputable; getDisplay: CellComputable; - onClick?: (id: string | number, state: State) => void; + onClick?: (id: string | number, state: State, e?: MouseEvent | TouchEvent) => void; onHold?: (id: string | number, state: State) => void; } diff --git a/src/features/trees/TreeNode.vue b/src/features/trees/TreeNode.vue index b6a2d0a..34332d4 100644 --- a/src/features/trees/TreeNode.vue +++ b/src/features/trees/TreeNode.vue @@ -72,7 +72,7 @@ export default defineComponent({ style: processedPropType(String, Object, Array), classes: processedPropType>(Object), tooltip: processedPropType(Object, String, Function), - onClick: Function as PropType, + onClick: Function as PropType<(e?: MouseEvent | TouchEvent) => void>, onHold: Function as PropType, color: processedPropType(String), glowColor: processedPropType(String), diff --git a/src/features/trees/tree.ts b/src/features/trees/tree.ts index e7ec97e..04b337f 100644 --- a/src/features/trees/tree.ts +++ b/src/features/trees/tree.ts @@ -40,7 +40,7 @@ export interface TreeNodeOptions { style?: Computable; mark?: Computable; reset?: GenericReset; - onClick?: VoidFunction; + onClick?: (e?: MouseEvent | TouchEvent) => void; onHold?: VoidFunction; } diff --git a/src/util/vue.tsx b/src/util/vue.tsx index 6aee73f..f11e63f 100644 --- a/src/util/vue.tsx +++ b/src/util/vue.tsx @@ -86,19 +86,21 @@ export function isCoercableComponent(component: unknown): component is Coercable } export function setupHoldToClick( - onClick?: Ref, + onClick?: Ref<((e?: MouseEvent | TouchEvent) => void) | undefined>, onHold?: Ref ): { - start: VoidFunction; + start: (e: MouseEvent | TouchEvent) => void; stop: VoidFunction; handleHolding: VoidFunction; } { const interval = ref(null); + const event = ref(undefined); - function start() { + function start(e: MouseEvent | TouchEvent) { if (!interval.value) { interval.value = setInterval(handleHolding, 250); } + event.value = e; } function stop() { if (interval.value) { @@ -110,7 +112,7 @@ export function setupHoldToClick( if (onHold && onHold.value) { onHold.value(); } else if (onClick && onClick.value) { - onClick.value(); + onClick.value(event.value); } } From c00a695edc85b2e9cf871dfe41899ecfb71cf5ba Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Sun, 27 Mar 2022 00:49:04 -0500 Subject: [PATCH 08/14] Removed unused updateMouse function --- src/App.vue | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/App.vue b/src/App.vue index dc2decb..27e5bc3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@