+
-
+
diff --git a/src/data/vehicleData.json b/src/data/vehicleData.json
index 9abfd74..4b65068 100644
--- a/src/data/vehicleData.json
+++ b/src/data/vehicleData.json
@@ -1342,7 +1342,7 @@
],
[
"304C_PLK_Rob",
- "304c",
+ "304C",
false,
false,
"140",
@@ -1446,7 +1446,7 @@
],
[
"Gor77_PKP_Bhp_01",
- "Bhp",
+ "Gor77",
false,
false,
"120",
@@ -1454,7 +1454,7 @@
],
[
"Gor77_PKP_Bhp_02",
- "Bhp",
+ "Gor77",
false,
false,
"120",
@@ -1462,7 +1462,7 @@
],
[
"Gor77_PKP_Bhp_03",
- "Bhp",
+ "Gor77",
false,
false,
"120",
@@ -1585,7 +1585,7 @@
],
[
"29R_PLPOL_Zaekk_01",
- "29R_PLPOL",
+ "29R",
true,
false,
"100",
diff --git a/src/main.ts b/src/main.ts
index 3def9cb..00c5b47 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,33 +1,10 @@
-import { createApp, Directive } from "vue";
-import App from "./App.vue";
-
-import { Store, isLocomotive, locoDataList, carDataList, totalLength, totalMass, maxAllowedSpeed, maxStockSpeed, isTrainPassenger, warnings } from "./store";
-
-const clickOutsideDirective: Directive = {
- beforeMount(el, binding) {
-
- el.clickOutsideEvent = (event: Event) => {
- if (!(el == event.target || el.contains(event.target))) {
- binding.value();
- }
- };
-
- document.addEventListener("click", el.clickOutsideEvent);
- },
-
-}
+import { createApp } from 'vue';
+import { createPinia } from 'pinia';
+import App from './App.vue';
+const pinia = createPinia();
createApp(App)
- .provide('Store', Store)
- .provide('isLocomotive', isLocomotive)
- .provide('locoDataList', locoDataList)
- .provide('carDataList', carDataList)
- .provide('totalMass', totalMass)
- .provide('totalLength', totalLength)
- .provide('maxStockSpeed', maxStockSpeed)
- .provide('maxAllowedSpeed', maxAllowedSpeed)
- .provide('isTrainPassenger', isTrainPassenger)
- .provide('warnings', warnings)
- .directive('click-outside', clickOutsideDirective)
- .mount("#app");
+ .use(pinia)
+ .mount('#app');
+
diff --git a/src/mixins/imageMixin.ts b/src/mixins/imageMixin.ts
new file mode 100644
index 0000000..303256b
--- /dev/null
+++ b/src/mixins/imageMixin.ts
@@ -0,0 +1,9 @@
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+ methods: {
+ getIconURL(name: string, ext = 'svg'): string {
+ return `/images/icon-${name}.${ext}`;
+ },
+ },
+});
diff --git a/src/mixins/stockMixin.ts b/src/mixins/stockMixin.ts
new file mode 100644
index 0000000..7795bd6
--- /dev/null
+++ b/src/mixins/stockMixin.ts
@@ -0,0 +1,65 @@
+import { defineComponent } from 'vue';
+import { useStore } from '../store';
+import { ICargo, ICarWagon, ILocomotive, IStock, Vehicle } from '../types';
+import { isLocomotive } from '../utils/vehicleUtils';
+
+export default defineComponent({
+ setup() {
+ return {
+ store: useStore(),
+ };
+ },
+
+ methods: {
+ getStockId() {
+ return `${Math.random().toString(36).slice(5)}`;
+ },
+
+ getStockObject(vehicle: Vehicle, cargo?: ICargo, count = 1): IStock {
+ const isLoco = isLocomotive(vehicle);
+
+ return {
+ id: this.getStockId(),
+ type: vehicle.type,
+ length: vehicle.length,
+ mass: vehicle.mass,
+ maxSpeed: vehicle.maxSpeed,
+ isLoco,
+ cargo: !isLoco && vehicle.loadable && cargo ? cargo : undefined,
+ count,
+ imgSrc: vehicle.imageSrc,
+ useType: isLoco ? vehicle.power : vehicle.useType,
+ supportersOnly: false,
+ };
+ },
+
+ addLocomotive(loco: ILocomotive) {
+ const previousStock =
+ this.store.stockList.length > 0 ? this.store.stockList[this.store.stockList.length - 1] : null;
+ if (previousStock && previousStock.type == loco.type) {
+ this.store.stockList[this.store.stockList.length - 1].count++;
+ return;
+ }
+
+ const stockObj = this.getStockObject(loco);
+
+ if (this.store.stockList.length > 0 && !this.store.stockList[0].isLoco) this.store.stockList.unshift(stockObj);
+ else this.store.stockList.push(stockObj);
+ },
+
+ addCarWagon(car: ICarWagon, cargo?: ICargo) {
+ const previousStock =
+ this.store.stockList.length > 0 ? this.store.stockList[this.store.stockList.length - 1] : null;
+
+ if (previousStock && previousStock.type == car.type && previousStock.cargo?.id == cargo?.id) {
+ this.store.stockList[this.store.stockList.length - 1].count++;
+
+ return;
+ }
+
+ const stockObj = this.getStockObject(car, cargo);
+
+ this.store.stockList.push(stockObj);
+ },
+ },
+});
diff --git a/src/mixins/warningsMixin.ts b/src/mixins/warningsMixin.ts
new file mode 100644
index 0000000..57cfc80
--- /dev/null
+++ b/src/mixins/warningsMixin.ts
@@ -0,0 +1,65 @@
+import { defineComponent } from 'vue';
+import { useStore } from '../store';
+
+export default defineComponent({
+ setup() {
+ const store = useStore();
+
+ return {
+ store,
+ };
+ },
+ computed: {
+ trainTooLong() {
+ return (
+ (this.store.totalLength > 350 && this.store.isTrainPassenger) ||
+ (this.store.totalLength > 650 && !this.store.isTrainPassenger)
+ );
+ },
+
+ trainTooHeavy() {
+ const totalMass = this.store.totalMass;
+ const isTrainPassenger = this.store.isTrainPassenger;
+ const stockList = this.store.stockList;
+
+ if (stockList.length == 0 || !stockList[0].isLoco) return false;
+
+ const activeLocomotiveType = stockList[0].type;
+
+ // Spalinowy SM
+ if (/^SM/.test(activeLocomotiveType) && totalMass > 2400) return true;
+
+ // Elektryczne EU07 / EP07 / EP08 / ET41
+
+ // Pasażerski elektr.
+ if (isTrainPassenger) {
+ if (/^(EU|EP)/.test(activeLocomotiveType) && totalMass > 650) return true;
+ if (/^ET/.test(activeLocomotiveType) && totalMass > 700) return true;
+
+ return false;
+ }
+
+ // Towarowy / inny elektr.
+ if (/^EU/.test(activeLocomotiveType) && totalMass > 2000) return true;
+ if (/^ET/.test(activeLocomotiveType) && totalMass > 4000) return true;
+
+ return false;
+ },
+
+ locoNotSuitable() {
+ return (
+ !this.store.isTrainPassenger &&
+ this.store.stockList.length > 1 &&
+ !this.store.stockList.every((stock) => stock.isLoco) &&
+ this.store.stockList.find((stock) => stock.isLoco && stock.type.startsWith('EP'))
+ );
+ },
+
+ tooManyLocomotives() {
+ return this.store.stockList.reduce((acc, stock) => {
+ if (stock.isLoco) acc += stock.count;
+ return acc;
+ }, 0) > 2;
+ },
+ },
+});
diff --git a/src/store.ts b/src/store.ts
index 2c544e7..db91b8a 100644
--- a/src/store.ts
+++ b/src/store.ts
@@ -1,311 +1,50 @@
-
-import { ICargo, ICarWagon, ILocomotive, IStock, IStore, IVehicleData } from "./types";
-import { reactive } from "@vue/reactivity";
-
-import vehicleDataJSON from "@/data/vehicleData.json";
-import vehiclePropsJSON from "@/data/vehicleProps.json";
-import { EVehicleUseType } from "./enums/EVehicleUseType";
-import { computed } from "vue";
-
-export const Store: IStore = reactive({
- chosenCar: null as ICarWagon | null,
- chosenLoco: null as ILocomotive | null,
- chosenCargo: null as ICargo | null,
-
- showSupporter: false,
- imageLoading: false,
-
- chosenLocoPower: "loco-e",
- chosenCarUseType: "car-passenger",
-
- stockList: [] as IStock[],
- cargoOptions: [] as any[][],
-
- swapVehicles: false,
-
- chosenStockListIndex: -1,
- chosenRealStockName: null,
-
- // locoOptions: [] as ILocomotive[],
- // carOptions: [] as ICarWagon[],
-
- vehiclePreviewSrc: ""
-})
-
-export function isLocomotive(vehicle: ILocomotive | ICarWagon): vehicle is ILocomotive {
- return (vehicle as ILocomotive).power !== undefined;
-}
-
-export const locoDataList = computed(() => Object.keys(vehicleDataJSON).reduce(
- (acc, vehicleTypeKey) => {
- if (!vehicleTypeKey.startsWith("loco")) return acc;
-
- const locoVehiclesData = (vehicleDataJSON as IVehicleData)[
- vehicleTypeKey
- ];
-
- locoVehiclesData.forEach((loco) => {
- if (Store.showSupporter && !loco[4]) return;
-
- const locoType = loco[0] as string;
-
- let length = 0,
- mass = 0;
-
- // Elektrowozy
- if (vehicleTypeKey.startsWith("loco-e")) {
- // 32m dla ET41, reszta 16
- length = locoType.startsWith("ET") ? 32 : 16;
-
- // 80t dla wszystkich EU06, EP08
- mass = 80;
-
- // 83t dla: EU07 o nr większych niż 300 & dla wszystkich EP07 oprócz nr 135,242,1002,1048
- const locoNumber = Number(locoType.split("-")[1]);
-
- if (
- (locoType.startsWith("EU") && locoNumber > 300) ||
- (locoType.startsWith("EP") &&
- ![242, 135, 1002, 1048].includes(locoNumber))
- ) {
- mass = 83;
- }
- }
-
- // Spalinowozy
- if (vehicleTypeKey.startsWith("loco-s")) {
- length = 14;
- mass = 74;
- }
-
- // EZT
- if (vehicleTypeKey.startsWith("loco-ezt")) {
- // EN57
- length = 65;
- mass = 126;
-
- // EN71
- if (locoType.startsWith("EN71")) {
- length = 86;
- mass = 182;
- }
-
- // 2xEN57
- if (locoType.startsWith("2EN57")) {
- length = 130;
- mass = 253;
- }
- }
-
- // SZT
- if (vehicleTypeKey.startsWith("loco-szt")) {
- length = 14;
- mass = 23;
- }
-
- acc.push({
- power: vehicleTypeKey,
- type: loco[0] as string,
- constructionType: loco[1] as string,
- cabinType: loco[2] as string,
- maxSpeed: Number(loco[3] as string),
- supportersOnly: loco[4] as boolean,
- imageSrc: loco[5] as string,
-
- length,
- mass,
- });
- });
-
- return acc;
- },
- [] as ILocomotive[]
-));
-
-export const carDataList = computed(() => Object.keys(vehicleDataJSON).reduce(
- (acc, vehicleTypeKey) => {
- if (!vehicleTypeKey.startsWith("car")) return acc;
-
- const carVehiclesData = (vehicleDataJSON as IVehicleData)[
- vehicleTypeKey
- ];
-
- carVehiclesData.forEach((car) => {
- if (Store.showSupporter && !car[3]) return;
+import { IStore } from './types';
+import { defineStore } from 'pinia';
+import { carDataList, chosenRealStock, isTrainPassenger, locoDataList, maxStockSpeed, totalLength, totalMass } from './utils/vehicleUtils';
- const carPropsData = vehiclePropsJSON.find((v) =>
- car[0].toString().includes(v.type)
- );
+export const useStore = defineStore({
+ id: 'store',
+ state: () =>
+ ({
+ chosenCar: null,
+ chosenLoco: null,
+ chosenCargo: null,
+ chosenVehicle: null,
- acc.push({
- useType: vehicleTypeKey,
- type: car[0] as string,
- constructionType: car[1] as string,
- loadable: car[2] as boolean,
- supportersOnly: car[3] as boolean,
- maxSpeed: Number(car[4] as string),
- imageSrc: car[5] as string,
- cargoList:
- carPropsData?.cargo.includes(";") ? carPropsData.cargo.split(";").map((cargo) => ({
- id: cargo.split(":")[0],
- totalMass: Number(cargo.split(":")[1]),
- })) : [],
- mass: carPropsData?.mass || 0,
- length: carPropsData?.length || 0,
- });
- });
+ showSupporter: false,
+ imageLoading: false,
- return acc;
- },
- [] as ICarWagon[]
-));
+ chosenLocoPower: 'loco-e',
+ chosenCarUseType: 'car-passenger',
+
+ stockList: [],
+ cargoOptions: [],
+
+ readyStockList: {},
+
+ swapVehicles: false,
+
+ chosenStockListIndex: -1,
+ chosenRealStockName: undefined,
+
+ vehiclePreviewSrc: '',
+
+ isRandomizerCardOpen: false,
+ isRealStockListCardOpen: false,
+ } as IStore),
-export const totalMass = computed(() => {
- return Store.stockList.reduce(
- (acc, stock) =>
- acc +
- (stock.cargo ? stock.cargo.totalMass : stock.mass) * stock.count,
- 0
- )
+ getters: {
+ locoDataList: (state) => locoDataList(state),
+ carDataList: (state) => carDataList(state),
+ totalMass: (state) => totalMass(state),
+ totalLength: (state) => totalLength(state),
+ maxStockSpeed: (state) => maxStockSpeed(state),
+ isTrainPassenger: (state) => isTrainPassenger(state),
+ chosenRealStock: (state) => chosenRealStock(state)
+ },
});
-export const totalLength = computed(() => {
- return Store.stockList.reduce(
- (acc, stock) => acc + stock.length * stock.count,
- 0
- )
-});
-export const maxStockSpeed = computed(() => {
- return Store.stockList.reduce(
- (acc, stock) =>
- stock.maxSpeed < acc || acc == 0 ? stock.maxSpeed : acc,
- 0
- )
-});
-
-export const isTrainPassenger = computed(() => {
- if (Store.stockList.length == 0) return false;
- if (Store.stockList.every(stock => stock.isLoco)) return false;
-
- return Store.stockList
- .filter((stock) => !stock.isLoco)
- .every((stock) => stock.useType === EVehicleUseType.CAR_PASSENGER);
-})
-
-export const maxAllowedSpeed = computed(() => {
- if (Store.stockList.length < 1) return -1;
- if (!Store.stockList[0].isLoco) return -1;
-
- const headingLoco = Store.stockList[0];
-
- if (headingLoco.type.startsWith("EU07")) {
- if (isTrainPassenger.value && totalMass.value <= 650) return 125;
- if (!isTrainPassenger.value && totalMass.value <= 2000) return 70;
-
- return -1;
- }
-
- if (headingLoco.type.startsWith("EP07")) {
- if (isTrainPassenger.value && totalMass.value <= 650) return 125;
- if (!isTrainPassenger.value) return -1;
-
- return -1;
- }
-
- if (headingLoco.type.startsWith("EP08")) {
- if (isTrainPassenger.value && totalMass.value <= 650) return 140;
- if (!isTrainPassenger.value) return -1;
-
- return -1;
- }
-
- if (headingLoco.type.startsWith("ET41")) {
- if (isTrainPassenger.value && totalMass.value <= 700) return 125;
- if (!isTrainPassenger.value && totalMass.value <= 4000) return 70;
-
- return -1;
- }
-
- if (headingLoco.type.startsWith("SM42")) {
- if (totalMass.value <= 95) return 90;
- if (totalMass.value <= 200) return 80;
- if (totalMass.value <= 300) return 70;
- if (totalMass.value <= 450) return 60;
- if (totalMass.value <= 750) return 50;
- if (totalMass.value <= 1130) return 40;
- if (totalMass.value <= 1720) return 30;
- if (totalMass.value <= 2400) return 20;
-
- return -1;
- }
-
- return Store.stockList.reduce(
- (acc, stock) =>
- stock.maxSpeed < acc || acc == 0 ? stock.maxSpeed : acc,
- 0
- );
-})
-
-export const warnings = {
- trainTooLong: computed(() => {
- if (isTrainPassenger.value && totalLength.value > 350) return true;
- if (!isTrainPassenger.value && totalLength.value > 650) return true;
-
- return false;
- }),
-
- locoNotSuitable: computed(() => {
- if (!isTrainPassenger.value
- && Store.stockList.length > 1
- && !Store.stockList.every(stock => stock.isLoco)
- && Store.stockList.find(stock => stock.isLoco && stock.type.startsWith("EP"))) return true;
-
- return false;
- }),
-
- trainTooHeavy: computed(() => {
- if (Store.stockList.length == 0 || !Store.stockList[0].isLoco) return false;
-
- const headingLoco = Store.stockList[0];
-
- if (isTrainPassenger.value && (headingLoco.type.startsWith("EU") || headingLoco.type.startsWith("EP")) && totalMass.value > 650) return true;
- if (isTrainPassenger.value && headingLoco.type.startsWith("ET") && totalMass.value > 700) return true;
-
- if (!isTrainPassenger.value && headingLoco.type.startsWith("EU") && totalMass.value > 2000) return true;
- if (!isTrainPassenger.value && headingLoco.type.startsWith("ET") && totalMass.value > 4000) return true;
-
- if (headingLoco.type.startsWith("SM") && totalMass.value > 2400) return true;
-
- return false;
- }),
-
- tooManyLocos: computed(() => {
- if (Store.stockList.reduce((acc, stock) => {
- if (!stock.isLoco) return acc;
-
- acc += stock.count;
-
- return acc;
- }, 0) > 2) return true;
-
- return false;
- })
-}
-
-
-// export const trainTooLong = computed(() => {
-// if (isTrainPassenger.value && totalLength.value > 350) return true;
-// if (!isTrainPassenger.value && totalLength.value > 650) return true;
-
-// return false;
-// })
-
-// export const locoNotSuitable = computed(() => {
-// if (!isTrainPassenger.value && Store.stockList.length > 1 && Store.stockList.find(stock => stock.isLoco && stock.type.startsWith("EP"))) return true;
-
-// return false;
-// })
\ No newline at end of file
diff --git a/src/styles/global.scss b/src/styles/global.scss
index 3358adb..6095254 100644
--- a/src/styles/global.scss
+++ b/src/styles/global.scss
@@ -1,169 +1,248 @@
-@import url("https://fonts.googleapis.com/css2?family=Lato:wght@400;700;900&display=swap");
+@import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700;900&display=swap');
-$bgColor: #2C3149;
+$breakpointMd: 960px;
+$breakpointSm: 550px;
+
+$bgColor: #2c3149;
$textColor: #fff;
-$accentColor: #FFD600;
+$secondaryColor: #222;
+$accentColor: #ffd600;
::-webkit-scrollbar {
- width: 0.5rem;
- height: 0.5rem;
+ width: 0.5rem;
+ height: 0.5rem;
- &-track {
- background: #222;
- border-radius: 0.5rem;
- }
+ &-track {
+ background: #222;
+ border-radius: 0.5rem;
+ }
- &-thumb {
- border-radius: 1rem;
- background: #777;
- }
+ &-thumb {
+ border-radius: 1rem;
+ background: #777;
+ }
}
body,
html {
- margin: 0;
- padding: 0;
+ margin: 0;
+ padding: 0;
- min-height: 100vh;
- font-family: "Lato", sans-serif;
+ font-family: 'Lato', sans-serif;
- background-color: $bgColor;
- width: 100vw;
- overflow-x: hidden;
+ background-color: $bgColor;
+ width: 100vw;
+ overflow-x: hidden;
}
*,
*::before,
*::after {
- box-sizing: border-box;
+ box-sizing: border-box;
}
a {
+ color: white;
+ text-decoration: none;
+
+ &:visited {
color: white;
- text-decoration: none;
+ }
- &:visited {
- color: white;
- }
-
- &:hover, &:focus {
- color: $accentColor;
- }
-}
-
-p {
- font-size: 1.2em;
- font-weight: bold;
+ &:hover,
+ &:focus {
color: $accentColor;
+ }
}
select,
option,
input,
button {
- font-family: "Lato", sans-serif;
- font-size: 1em;
-
+ font-family: 'Lato', sans-serif;
+ font-size: 1em;
}
button {
- border: none;
- outline: none;
- background: none;
+ border: none;
+ outline: none;
+ background: none;
- padding: 0;
- margin: 0;
+ padding: 0;
+ margin: 0;
- cursor: pointer;
+ cursor: pointer;
- font-size: 1em;
- color: white;
+ font-size: 1em;
+ color: white;
- &:hover {
- color: $accentColor;
- }
+ &:hover {
+ color: $accentColor;
+ }
}
button.btn {
- padding: 0.25em 1em;
+ padding: 0.4em 0.75em;
- border-radius: 0.25em;
- border: 2px solid white;
- outline: none;
+ outline: none;
+ background-color: #222;
+
+ transition: all 250ms;
+
+ &.btn--outline {
background: none;
+ font-weight: bold;
+ outline: 1px solid $accentColor;
+ }
+ &:focus-visible {
+ color: $accentColor;
+ outline: 1px solid white;
+ }
+
+ &[data-disabled='true'] {
+ user-select: none;
+ pointer-events: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+
+ opacity: 0.7;
+ }
+
+ &--text {
+ font-weight: bold;
transition: all 250ms;
+ background: none;
+ padding: 0;
- &:hover {
- color: $accentColor;
- border-color: $accentColor;
+ &:focus-visible {
+ outline: 1px solid white;
}
+ }
- &:focus {
- color: $accentColor;
- }
+ &--choice {
+ padding: 0.25em 0.3em;
+ background-color: #222;
- &--text {
- font-weight: bold;
- transition: all 250ms;
- border: none;
+ &:focus-visible {
+ outline: 1px solid white;
}
+ }
}
+select,
+input {
+ background: none;
+ border: 2px solid white;
+ outline: none;
+ padding: 0.25em 0.35em;
-button.btn-rect {
- width: 1.5em;
- height: 1.5em;
- font-size: 1.65em;
+ color: white;
+ font-size: 1em;
- line-height: 1em;
+ width: 18em;
- border-radius: 0.25em;
- border: 2px solid black;
- outline: none;
- background: white;
- color: black;
-
-
- transition: all 250ms;
-
- &:hover {
- color: white;
- background-color: black;
- }
-}
-
-select {
- background: none;
- border: 2px solid white;
- outline: none;
-
- padding: 0.25em 0.35em;
-
- color: white;
- font-size: 1em;
-
- width: 18em;
+ &:focus-visible {
+ border-color: $accentColor;
+ }
}
option {
- color: black;
- border: none;
+ color: black;
+ border: none;
}
ul {
- list-style: none;
- margin: 0;
- padding: 0;
+ list-style: none;
+ margin: 0;
+ padding: 0;
}
.text {
- &--accent {
- color: $accentColor;
- }
+ &--accent {
+ color: $accentColor;
+ }
- &--grayed {
- color: gray;
- }
-}
\ No newline at end of file
+ &--grayed {
+ color: gray;
+ }
+}
+
+.g-card {
+ position: fixed;
+ top: 0;
+ left: 0;
+
+ width: 100vw;
+ height: 100vh;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ z-index: 200;
+
+ &_bg {
+ position: fixed;
+ top: 0;
+ left: 0;
+
+ width: 100vw;
+ height: 100vh;
+
+ background-color: #000000aa;
+ z-index: 10;
+ }
+}
+
+.g-choice {
+ input {
+ display: none;
+ }
+
+ span {
+ padding: 0.25em 1em;
+ border-radius: 0.25em;
+ border: 2px solid white;
+ margin: 0.25em;
+ cursor: pointer;
+
+ transition: all 100ms ease;
+ }
+
+ span:focus {
+ color: $accentColor;
+ outline: none;
+ }
+
+ label > input:checked + span {
+ color: $accentColor;
+ border-color: $accentColor;
+ }
+}
+
+// Vue Transition anims
+.slide-top {
+ &-enter-from,
+ &-leave-to {
+ transform: translateY(-100%);
+ }
+
+ &-enter-active,
+ &-leave-active {
+ transition: transform 100ms ease-in-out;
+ }
+}
+
+.card-appear {
+ &-enter-from,
+ &-leave-to {
+ opacity: 0;
+ }
+
+ &-enter-active,
+ &-leave-active {
+ transition: all 100ms ease-in-out;
+ }
+}
diff --git a/src/types.ts b/src/types.ts
index 1a8f679..a6ee2f1 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,8 +1,12 @@
+export type Vehicle = ILocomotive | ICarWagon;
+
export interface IStore {
chosenCar: ICarWagon | null;
chosenLoco: ILocomotive | null;
chosenCargo: ICargo | null;
+ chosenVehicle: Vehicle | null;
+
showSupporter: boolean;
imageLoading: boolean;
@@ -10,13 +14,17 @@ export interface IStore {
chosenCarUseType: string;
stockList: IStock[];
+ readyStockList: IReadyStockList;
cargoOptions: any[][];
chosenStockListIndex: number;
- chosenRealStockName: string | null;
+ chosenRealStockName?: string;
swapVehicles: boolean;
vehiclePreviewSrc: string;
+
+ isRandomizerCardOpen: boolean;
+ isRealStockListCardOpen: boolean;
}
export interface IVehicleData {
@@ -39,7 +47,7 @@ export interface ILocomotive {
export interface ICarWagon {
//"203V_PKPC_Fll_01","203V",true,false,"100",img
type: string;
- useType: string;
+ useType: 'car-passenger' | 'car-cargo';
constructionType: string;
loadable: boolean;
supportersOnly: boolean;
@@ -57,6 +65,7 @@ export interface ICargo {
}
export interface IStock {
+ id: string;
useType: string;
type: string;
length: number;
@@ -67,4 +76,8 @@ export interface IStock {
supportersOnly: boolean;
count: number;
imgSrc: string;
+}
+
+export interface IReadyStockList {
+ [key: string]: { stockString: string; type: string; number: string; name: string };
}
\ No newline at end of file
diff --git a/src/utils/statsUtils.ts b/src/utils/statsUtils.ts
deleted file mode 100644
index b59e643..0000000
--- a/src/utils/statsUtils.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { EVehicleUseType } from "@/enums/EVehicleUseType";
-import { ICarWagon, ILocomotive, IStock } from "@/types";
-
-export const verifyTrainSpec = (stockList: IStock[], vehicleMass: number, vehicleUseType: string) => {
- const hasHeadLoco = stockList.length > 0
- && (stockList[0].useType == EVehicleUseType.LOCO_ELECTRICAL
- || stockList[0].useType == EVehicleUseType.LOCO_DIESEL);
-
- if (!hasHeadLoco) return;
-
- const headLoco = stockList[0];
- const carList = stockList.filter(stock => !stock.isLoco);
-
-
-
- const isTrainPassenger = carList.length != 0
- ? carList.every(stock => stock.useType == EVehicleUseType.CAR_PASSENGER)
- && vehicleUseType == EVehicleUseType.CAR_PASSENGER
- : false;
-
-
-}
\ No newline at end of file
diff --git a/src/utils/vehicleUtils.ts b/src/utils/vehicleUtils.ts
new file mode 100644
index 0000000..8ad50fa
--- /dev/null
+++ b/src/utils/vehicleUtils.ts
@@ -0,0 +1,275 @@
+import { computed } from 'vue';
+import { EVehicleUseType } from '../enums/EVehicleUseType';
+import { ICarWagon, ILocomotive, IStore, IVehicleData } from '../types';
+
+import vehicleDataJSON from '../data/vehicleData.json';
+import vehiclePropsJSON from '../data/vehicleProps.json';
+
+export function isLocomotive(vehicle: ILocomotive | ICarWagon): vehicle is ILocomotive {
+ return (vehicle as ILocomotive).power !== undefined;
+}
+
+export function locoDataList(state: IStore) {
+ return Object.keys(vehicleDataJSON).reduce((acc, vehicleTypeKey) => {
+ if (!vehicleTypeKey.startsWith('loco')) return acc;
+
+ const locoVehiclesData = (vehicleDataJSON as IVehicleData)[vehicleTypeKey];
+
+ locoVehiclesData.forEach((loco) => {
+ if (state.showSupporter && !loco[4]) return;
+
+ const locoType = loco[0] as string;
+
+ let length = 0,
+ mass = 0;
+
+ // Elektrowozy
+ if (vehicleTypeKey.startsWith('loco-e')) {
+ // 32m dla ET41, reszta 16
+ length = locoType.startsWith('ET') ? 32 : 16;
+
+ // 80t dla wszystkich EU06, EP08
+ mass = 80;
+
+ // 83t dla: EU07 o nr większych niż 300 & dla wszystkich EP07 oprócz nr 135,242,1002,1048
+ const locoNumber = Number(locoType.split('-')[1]);
+
+ if (
+ (locoType.startsWith('EU') && locoNumber > 300) ||
+ (locoType.startsWith('EP') && ![242, 135, 1002, 1048].includes(locoNumber))
+ ) {
+ mass = 83;
+ }
+ }
+
+ // Spalinowozy
+ if (vehicleTypeKey.startsWith('loco-s')) {
+ length = 14;
+ mass = 74;
+ }
+
+ // EZT
+ if (vehicleTypeKey.startsWith('loco-ezt')) {
+ // EN57
+ length = 65;
+ mass = 126;
+
+ // EN71
+ if (locoType.startsWith('EN71')) {
+ length = 86;
+ mass = 182;
+ }
+
+ // 2xEN57
+ if (locoType.startsWith('2EN57')) {
+ length = 130;
+ mass = 253;
+ }
+ }
+
+ // SZT
+ if (vehicleTypeKey.startsWith('loco-szt')) {
+ length = 14;
+ mass = 23;
+ }
+
+ acc.push({
+ power: vehicleTypeKey,
+ type: loco[0] as string,
+ constructionType: loco[1] as string,
+ cabinType: loco[2] as string,
+ maxSpeed: Number(loco[3] as string),
+ supportersOnly: loco[4] as boolean,
+ imageSrc: loco[5] as string,
+
+ length,
+ mass,
+ });
+ });
+
+ return acc;
+ }, [] as ILocomotive[]);
+}
+
+export function carDataList(state: IStore) {
+ return Object.keys(vehicleDataJSON).reduce((acc, vehicleTypeKey) => {
+ if (!vehicleTypeKey.startsWith('car')) return acc;
+
+ const carVehiclesData = (vehicleDataJSON as IVehicleData)[vehicleTypeKey];
+
+ carVehiclesData.forEach((car) => {
+ if (state.showSupporter && !car[3]) return;
+
+ const carPropsData = vehiclePropsJSON.find((v) => car[0].toString().includes(v.type));
+
+ acc.push({
+ useType: vehicleTypeKey as 'car-passenger' | 'car-cargo',
+ type: car[0] as string,
+ constructionType: car[1] as string,
+ loadable: car[2] as boolean,
+ supportersOnly: car[3] as boolean,
+ maxSpeed: Number(car[4] as string),
+ imageSrc: car[5] as string,
+ cargoList: carPropsData?.cargo.includes(';')
+ ? carPropsData.cargo.split(';').map((cargo) => ({
+ id: cargo.split(':')[0],
+ totalMass: Number(cargo.split(':')[1]),
+ }))
+ : [],
+ mass: carPropsData?.mass || 0,
+ length: carPropsData?.length || 0,
+ });
+ });
+
+ return acc;
+ }, [] as ICarWagon[]);
+}
+
+export function totalMass(state: IStore) {
+ return state.stockList.reduce(
+ (acc, stock) => acc + (stock.cargo ? stock.cargo.totalMass : stock.mass) * stock.count,
+ 0
+ );
+}
+
+export function totalLength(state: IStore) {
+ return state.stockList.reduce((acc, stock) => acc + stock.length * stock.count, 0);
+}
+
+export function maxStockSpeed(state: IStore) {
+ return state.stockList.reduce((acc, stock) => (stock.maxSpeed < acc || acc == 0 ? stock.maxSpeed : acc), 0);
+}
+
+export function isTrainPassenger(state: IStore) {
+ if (state.stockList.length == 0) return false;
+ if (state.stockList.every((stock) => stock.isLoco)) return false;
+
+ return state.stockList
+ .filter((stock) => !stock.isLoco)
+ .every((stock) => stock.useType === EVehicleUseType.CAR_PASSENGER);
+}
+
+export function chosenRealStock(state: IStore) {
+ const currentStockString = state.stockList
+ .reduce((acc, stock) => {
+ for (let i = 0; i < stock.count; i++) acc.push(stock.type);
+ return acc;
+ }, [] as string[])
+ .join(';');
+
+
+ const realStockObj = Object.values(state.readyStockList).find((readyStock) => readyStock.stockString == currentStockString);
+
+ state.chosenRealStockName = realStockObj ? `${realStockObj.type} ${realStockObj.number} ${realStockObj.name}` : undefined;
+
+ return realStockObj;
+}
+
+// export function maxAllowedSpeed(state: IStore) {
+// if (state.stockList.length < 1) return -1;
+// if (!state.stockList[0].isLoco) return -1;
+
+// const headingLoco = state.stockList[0];
+// const isPassenger = isTrainPassenger(state);
+
+// if (headingLoco.type.startsWith('EU07')) {
+// if (isPassenger && totalMass.value <= 650) return 125;
+// if (!isPassenger && totalMass.value <= 2000) return 70;
+
+// return -1;
+// }
+
+// if (headingLoco.type.startsWith('EP07')) {
+// if (isPassenger && totalMass.value <= 650) return 125;
+// if (!isPassenger) return -1;
+
+// return -1;
+// }
+
+// if (headingLoco.type.startsWith('EP08')) {
+// if (isPassenger && totalMass.value <= 650) return 140;
+// if (!isPassenger) return -1;
+
+// return -1;
+// }
+
+// if (headingLoco.type.startsWith('ET41')) {
+// if (isPassenger && totalMass.value <= 700) return 125;
+// if (!isPassenger && totalMass.value <= 4000) return 70;
+
+// return -1;
+// }
+
+// if (headingLoco.type.startsWith('SM42')) {
+// if (totalMass.value <= 95) return 90;
+// if (totalMass.value <= 200) return 80;
+// if (totalMass.value <= 300) return 70;
+// if (totalMass.value <= 450) return 60;
+// if (totalMass.value <= 750) return 50;
+// if (totalMass.value <= 1130) return 40;
+// if (totalMass.value <= 1720) return 30;
+// if (totalMass.value <= 2400) return 20;
+
+// return -1;
+// }
+
+// return Store.stockList.reduce((acc, stock) => (stock.maxSpeed < acc || acc == 0 ? stock.maxSpeed : acc), 0);
+// });
+
+// export const warnings = {
+// trainTooLong: computed(() => {
+// if (isTrainPassenger.value && totalLength.value > 350) return true;
+// if (!isTrainPassenger.value && totalLength.value > 650) return true;
+
+// return false;
+// }),
+
+// locoNotSuitable: computed(() => {
+// if (
+// !isTrainPassenger.value &&
+// Store.stockList.length > 1 &&
+// !Store.stockList.every((stock) => stock.isLoco) &&
+// Store.stockList.find((stock) => stock.isLoco && stock.type.startsWith('EP'))
+// )
+// return true;
+
+// return false;
+// }),
+
+// trainTooHeavy: computed(() => {
+// if (Store.stockList.length == 0 || !Store.stockList[0].isLoco) return false;
+
+// const headingLoco = Store.stockList[0];
+
+// if (
+// isTrainPassenger.value &&
+// (headingLoco.type.startsWith('EU') || headingLoco.type.startsWith('EP')) &&
+// totalMass.value > 650
+// )
+// return true;
+// if (isTrainPassenger.value && headingLoco.type.startsWith('ET') && totalMass.value > 700) return true;
+
+// if (!isTrainPassenger.value && headingLoco.type.startsWith('EU') && totalMass.value > 2000) return true;
+// if (!isTrainPassenger.value && headingLoco.type.startsWith('ET') && totalMass.value > 4000) return true;
+
+// if (headingLoco.type.startsWith('SM') && totalMass.value > 2400) return true;
+
+// return false;
+// }),
+
+// tooManyLocos: computed(() => {
+// if (
+// Store.stockList.reduce((acc, stock) => {
+// if (!stock.isLoco) return acc;
+
+// acc += stock.count;
+
+// return acc;
+// }, 0) > 2
+// )
+// return true;
+
+// return false;
+// }),
+// };
+
diff --git a/src/shims-vue.d.ts b/src/vite-env.d.ts
similarity index 79%
rename from src/shims-vue.d.ts
rename to src/vite-env.d.ts
index 3804a43..323c78a 100644
--- a/src/shims-vue.d.ts
+++ b/src/vite-env.d.ts
@@ -1,4 +1,5 @@
-/* eslint-disable */
+///
+
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
diff --git a/tsconfig.json b/tsconfig.json
index 03c4ce2..d4aefa2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,41 +1,18 @@
{
"compilerOptions": {
- "target": "esnext",
- "module": "esnext",
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
"strict": true,
"jsx": "preserve",
- "importHelpers": true,
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "experimentalDecorators": true,
- "skipLibCheck": true,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
"sourceMap": true,
- "baseUrl": ".",
- "types": [
- "webpack-env"
- ],
- "paths": {
- "@/*": [
- "src/*"
- ]
- },
- "lib": [
- "esnext",
- "dom",
- "dom.iterable",
- "scripthost"
- ]
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "lib": ["ESNext", "DOM"],
+ "skipLibCheck": true
},
- "include": [
- "src/**/*.ts",
- "src/**/*.tsx",
- "src/**/*.vue",
- "tests/**/*.ts",
- "tests/**/*.tsx"
- ],
- "exclude": [
- "node_modules"
- ]
+ "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
+ "references": [{ "path": "./tsconfig.node.json" }]
}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..9d31e2a
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..315212d
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [vue()]
+})
diff --git a/vue.config.js b/vue.config.js
deleted file mode 100644
index 9ed1f38..0000000
--- a/vue.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- lintOnSave: false,
-};
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..3fde1d5
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,528 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/parser@^7.16.4":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz"
+ integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==
+
+"@vitejs/plugin-vue@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz"
+ integrity sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==
+
+"@volar/code-gen@0.38.9":
+ version "0.38.9"
+ resolved "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.38.9.tgz"
+ integrity sha512-n6LClucfA+37rQeskvh9vDoZV1VvCVNy++MAPKj2dT4FT+Fbmty/SDQqnsEBtdEe6E3OQctFvA/IcKsx3Mns0A==
+ dependencies:
+ "@volar/source-map" "0.38.9"
+
+"@volar/source-map@0.38.9":
+ version "0.38.9"
+ resolved "https://registry.npmjs.org/@volar/source-map/-/source-map-0.38.9.tgz"
+ integrity sha512-ba0UFoHDYry+vwKdgkWJ6xlQT+8TFtZg1zj9tSjj4PykW1JZDuM0xplMotLun4h3YOoYfY9K1huY5gvxmrNLIw==
+
+"@volar/vue-code-gen@0.38.9":
+ version "0.38.9"
+ resolved "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.38.9.tgz"
+ integrity sha512-tzj7AoarFBKl7e41MR006ncrEmNPHALuk8aG4WdDIaG387X5//5KhWC5Ff3ZfB2InGSeNT+CVUd74M0gS20rjA==
+ dependencies:
+ "@volar/code-gen" "0.38.9"
+ "@volar/source-map" "0.38.9"
+ "@vue/compiler-core" "^3.2.37"
+ "@vue/compiler-dom" "^3.2.37"
+ "@vue/shared" "^3.2.37"
+
+"@volar/vue-typescript@0.38.9":
+ version "0.38.9"
+ resolved "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.38.9.tgz"
+ integrity sha512-iJMQGU91ADi98u8V1vXd2UBmELDAaeSP0ZJaFjwosClQdKlJQYc6MlxxKfXBZisHqfbhdtrGRyaryulnYtliZw==
+ dependencies:
+ "@volar/code-gen" "0.38.9"
+ "@volar/source-map" "0.38.9"
+ "@volar/vue-code-gen" "0.38.9"
+ "@vue/compiler-sfc" "^3.2.37"
+ "@vue/reactivity" "^3.2.37"
+
+"@vue/compiler-core@3.2.37", "@vue/compiler-core@^3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.37.tgz"
+ integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/shared" "3.2.37"
+ estree-walker "^2.0.2"
+ source-map "^0.6.1"
+
+"@vue/compiler-dom@3.2.37", "@vue/compiler-dom@^3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz"
+ integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==
+ dependencies:
+ "@vue/compiler-core" "3.2.37"
+ "@vue/shared" "3.2.37"
+
+"@vue/compiler-sfc@3.2.37", "@vue/compiler-sfc@^3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz"
+ integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/compiler-core" "3.2.37"
+ "@vue/compiler-dom" "3.2.37"
+ "@vue/compiler-ssr" "3.2.37"
+ "@vue/reactivity-transform" "3.2.37"
+ "@vue/shared" "3.2.37"
+ estree-walker "^2.0.2"
+ magic-string "^0.25.7"
+ postcss "^8.1.10"
+ source-map "^0.6.1"
+
+"@vue/compiler-ssr@3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz"
+ integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==
+ dependencies:
+ "@vue/compiler-dom" "3.2.37"
+ "@vue/shared" "3.2.37"
+
+"@vue/devtools-api@^6.2.1":
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz"
+ integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
+
+"@vue/reactivity-transform@3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz"
+ integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/compiler-core" "3.2.37"
+ "@vue/shared" "3.2.37"
+ estree-walker "^2.0.2"
+ magic-string "^0.25.7"
+
+"@vue/reactivity@3.2.37", "@vue/reactivity@^3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.37.tgz"
+ integrity sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==
+ dependencies:
+ "@vue/shared" "3.2.37"
+
+"@vue/runtime-core@3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.37.tgz"
+ integrity sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==
+ dependencies:
+ "@vue/reactivity" "3.2.37"
+ "@vue/shared" "3.2.37"
+
+"@vue/runtime-dom@3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz"
+ integrity sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==
+ dependencies:
+ "@vue/runtime-core" "3.2.37"
+ "@vue/shared" "3.2.37"
+ csstype "^2.6.8"
+
+"@vue/server-renderer@3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.37.tgz"
+ integrity sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==
+ dependencies:
+ "@vue/compiler-ssr" "3.2.37"
+ "@vue/shared" "3.2.37"
+
+"@vue/shared@3.2.37", "@vue/shared@^3.2.37":
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.37.tgz"
+ integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==
+
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+"chokidar@>=3.0.0 <4.0.0":
+ version "3.5.3"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+csstype@^2.6.8:
+ version "2.6.20"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz"
+ integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
+
+esbuild-android-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.50.tgz#a46fc80fa2007690e647680d837483a750a3097f"
+ integrity sha512-H7iUEm7gUJHzidsBlFPGF6FTExazcgXL/46xxLo6i6bMtPim6ZmXyTccS8yOMpy6HAC6dPZ/JCQqrkkin69n6Q==
+
+esbuild-android-arm64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.50.tgz#bdda7851fa7f5f770d6ff0ad593a8945d3a0fcdd"
+ integrity sha512-NFaoqEwa+OYfoYVpQWDMdKII7wZZkAjtJFo1WdnBeCYlYikvUhTnf2aPwPu5qEAw/ie1NYK0yn3cafwP+kP+OQ==
+
+esbuild-darwin-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.50.tgz#f0535435f9760766f30db14a991ee5ca94c022a4"
+ integrity sha512-gDQsCvGnZiJv9cfdO48QqxkRV8oKAXgR2CGp7TdIpccwFdJMHf8hyIJhMW/05b/HJjET/26Us27Jx91BFfEVSA==
+
+esbuild-darwin-arm64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.50.tgz#76a41a40e8947a15ae62970e9ed2853883c4b16c"
+ integrity sha512-36nNs5OjKIb/Q50Sgp8+rYW/PqirRiFN0NFc9hEvgPzNJxeJedktXwzfJSln4EcRFRh5Vz4IlqFRScp+aiBBzA==
+
+esbuild-freebsd-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.50.tgz#2ed6633c17ed42c20a1bd68e82c4bbc75ea4fb57"
+ integrity sha512-/1pHHCUem8e/R86/uR+4v5diI2CtBdiWKiqGuPa9b/0x3Nwdh5AOH7lj+8823C6uX1e0ufwkSLkS+aFZiBCWxA==
+
+esbuild-freebsd-arm64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.50.tgz#cb115f4cdafe9cdbe58875ba482fccc54d32aa43"
+ integrity sha512-iKwUVMQztnPZe5pUYHdMkRc9aSpvoV1mkuHlCoPtxZA3V+Kg/ptpzkcSY+fKd0kuom+l6Rc93k0UPVkP7xoqrw==
+
+esbuild-linux-32@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.50.tgz#fe2b724994dcf1d4e48dc4832ff008ad7d00bcfd"
+ integrity sha512-sWUwvf3uz7dFOpLzYuih+WQ7dRycrBWHCdoXJ4I4XdMxEHCECd8b7a9N9u7FzT6XR2gHPk9EzvchQUtiEMRwqw==
+
+esbuild-linux-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.50.tgz#7851ab5151df9501a2187bd4909c594ad232b623"
+ integrity sha512-u0PQxPhaeI629t4Y3EEcQ0wmWG+tC/LpP2K7yDFvwuPq0jSQ8SIN+ARNYfRjGW15O2we3XJvklbGV0wRuUCPig==
+
+esbuild-linux-arm64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.50.tgz#76a76afef484a0512f1fbbcc762edd705dee8892"
+ integrity sha512-ZyfoNgsTftD7Rp5S7La5auomKdNeB3Ck+kSKXC4pp96VnHyYGjHHXWIlcbH8i+efRn9brszo1/Thl1qn8RqmhQ==
+
+esbuild-linux-arm@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.50.tgz#6d7a8c0712091b0c3a668dd5d8b5c924adbaeb12"
+ integrity sha512-VALZq13bhmFJYFE/mLEb+9A0w5vo8z+YDVOWeaf9vOTrSC31RohRIwtxXBnVJ7YKLYfEMzcgFYf+OFln3Y0cWg==
+
+esbuild-linux-mips64le@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.50.tgz#43426909c1884c5dc6b40765673a08a7ec1d2064"
+ integrity sha512-ygo31Vxn/WrmjKCHkBoutOlFG5yM9J2UhzHb0oWD9O61dGg+Hzjz9hjf5cmM7FBhAzdpOdEWHIrVOg2YAi6rTw==
+
+esbuild-linux-ppc64le@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.50.tgz#c754ea3da1dd180c6e9b6b508dc18ce983d92b11"
+ integrity sha512-xWCKU5UaiTUT6Wz/O7GKP9KWdfbsb7vhfgQzRfX4ahh5NZV4ozZ4+SdzYG8WxetsLy84UzLX3Pi++xpVn1OkFQ==
+
+esbuild-linux-riscv64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.50.tgz#f3b2dd3c4c2b91bf191d3b98a9819c8aa6f5ad7f"
+ integrity sha512-0+dsneSEihZTopoO9B6Z6K4j3uI7EdxBP7YSF5rTwUgCID+wHD3vM1gGT0m+pjCW+NOacU9kH/WE9N686FHAJg==
+
+esbuild-linux-s390x@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.50.tgz#3dfbc4578b2a81995caabb79df2b628ea86a5390"
+ integrity sha512-tVjqcu8o0P9H4StwbIhL1sQYm5mWATlodKB6dpEZFkcyTI8kfIGWiWcrGmkNGH2i1kBUOsdlBafPxR3nzp3TDA==
+
+esbuild-netbsd-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.50.tgz#17dbf51eaa48d983e794b588d195415410ef8c85"
+ integrity sha512-0R/glfqAQ2q6MHDf7YJw/TulibugjizBxyPvZIcorH0Mb7vSimdHy0XF5uCba5CKt+r4wjax1mvO9lZ4jiAhEg==
+
+esbuild-openbsd-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.50.tgz#cf6b1a50c8cf67b0725aaa4bce9773976168c50e"
+ integrity sha512-7PAtmrR5mDOFubXIkuxYQ4bdNS6XCK8AIIHUiZxq1kL8cFIH5731jPcXQ4JNy/wbj1C9sZ8rzD8BIM80Tqk29w==
+
+esbuild-sunos-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.50.tgz#f705ae0dd914c3b45dc43319c4f532216c3d841f"
+ integrity sha512-gBxNY/wyptvD7PkHIYcq7se6SQEXcSC8Y7mE0FJB+CGgssEWf6vBPfTTZ2b6BWKnmaP6P6qb7s/KRIV5T2PxsQ==
+
+esbuild-windows-32@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.50.tgz#6364905a99c1e6c1e2fe7bfccebd958131b1cd6c"
+ integrity sha512-MOOe6J9cqe/iW1qbIVYSAqzJFh0p2LBLhVUIWdMVnNUNjvg2/4QNX4oT4IzgDeldU+Bym9/Tn6+DxvUHJXL5Zw==
+
+esbuild-windows-64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.50.tgz"
+ integrity sha512-r/qE5Ex3w1jjGv/JlpPoWB365ldkppUlnizhMxJgojp907ZF1PgLTuW207kgzZcSCXyquL9qJkMsY+MRtaZ5yQ==
+
+esbuild-windows-arm64@0.14.50:
+ version "0.14.50"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.50.tgz#e7ddde6a97194051a5a4ac05f4f5900e922a7ea5"
+ integrity sha512-EMS4lQnsIe12ZyAinOINx7eq2mjpDdhGZZWDwPZE/yUTN9cnc2Ze/xUTYIAyaJqrqQda3LnDpADKpvLvol6ENQ==
+
+esbuild@^0.14.47:
+ version "0.14.50"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.50.tgz"
+ integrity sha512-SbC3k35Ih2IC6trhbMYW7hYeGdjPKf9atTKwBUHqMCYFZZ9z8zhuvfnZihsnJypl74FjiAKjBRqFkBkAd0rS/w==
+ optionalDependencies:
+ esbuild-android-64 "0.14.50"
+ esbuild-android-arm64 "0.14.50"
+ esbuild-darwin-64 "0.14.50"
+ esbuild-darwin-arm64 "0.14.50"
+ esbuild-freebsd-64 "0.14.50"
+ esbuild-freebsd-arm64 "0.14.50"
+ esbuild-linux-32 "0.14.50"
+ esbuild-linux-64 "0.14.50"
+ esbuild-linux-arm "0.14.50"
+ esbuild-linux-arm64 "0.14.50"
+ esbuild-linux-mips64le "0.14.50"
+ esbuild-linux-ppc64le "0.14.50"
+ esbuild-linux-riscv64 "0.14.50"
+ esbuild-linux-s390x "0.14.50"
+ esbuild-netbsd-64 "0.14.50"
+ esbuild-openbsd-64 "0.14.50"
+ esbuild-sunos-64 "0.14.50"
+ esbuild-windows-32 "0.14.50"
+ esbuild-windows-64 "0.14.50"
+ esbuild-windows-arm64 "0.14.50"
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+immutable@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz"
+ integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-core-module@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+ dependencies:
+ has "^1.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+magic-string@^0.25.7:
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz"
+ integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pinia@^2.0.17:
+ version "2.0.17"
+ resolved "https://registry.npmjs.org/pinia/-/pinia-2.0.17.tgz"
+ integrity sha512-AtwLwEWQgIjofjgeFT+nxbnK5lT2QwQjaHNEDqpsi2AiCwf/NY78uWTeHUyEhiiJy8+sBmw0ujgQMoQbWiZDfA==
+ dependencies:
+ "@vue/devtools-api" "^6.2.1"
+ vue-demi "*"
+
+postcss@^8.1.10, postcss@^8.4.14:
+ version "8.4.14"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz"
+ integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+resolve@^1.22.1:
+ version "1.22.1"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^2.75.6:
+ version "2.77.0"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz"
+ integrity sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+sass@^1.26.5:
+ version "1.54.0"
+ resolved "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz"
+ integrity sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==
+ dependencies:
+ chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
+ source-map-js ">=0.6.2 <2.0.0"
+
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sourcemap-codec@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+typescript@^4.6.4:
+ version "4.7.4"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz"
+ integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
+
+vite@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/vite/-/vite-3.0.3.tgz"
+ integrity sha512-sDIpIcl3mv1NUaSzZwiXGEy1ZoWwwC2vkxUHY6yiDacR6zf//ZFuBJrozO62gedpE43pmxnLATNR5IYUdAEkMQ==
+ dependencies:
+ esbuild "^0.14.47"
+ postcss "^8.4.14"
+ resolve "^1.22.1"
+ rollup "^2.75.6"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+vue-demi@*:
+ version "0.13.5"
+ resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.5.tgz"
+ integrity sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==
+
+vue-tsc@^0.38.4:
+ version "0.38.9"
+ resolved "https://registry.npmjs.org/vue-tsc/-/vue-tsc-0.38.9.tgz"
+ integrity sha512-Yoy5phgvGqyF98Fb4mYqboR4Q149jrdcGv5kSmufXJUq++RZJ2iMVG0g6zl+v3t4ORVWkQmRpsV4x2szufZ0LQ==
+ dependencies:
+ "@volar/vue-typescript" "0.38.9"
+
+vue@^3.2.37:
+ version "3.2.37"
+ resolved "https://registry.npmjs.org/vue/-/vue-3.2.37.tgz"
+ integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==
+ dependencies:
+ "@vue/compiler-dom" "3.2.37"
+ "@vue/compiler-sfc" "3.2.37"
+ "@vue/runtime-dom" "3.2.37"
+ "@vue/server-renderer" "3.2.37"
+ "@vue/shared" "3.2.37"