Merge pull request #22 from Spythere/development

v1.7.0
This commit is contained in:
Spythere
2026-01-30 22:28:14 +01:00
committed by GitHub
36 changed files with 963 additions and 581 deletions
+23
View File
@@ -0,0 +1,23 @@
name: Build & Deploy to VPS
on:
push:
branches:
- main
env:
PROJECT_NAME: generator-td2
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build the app
run: yarn && yarn build
- name: Setup SSH key for connection with the server
run: |
mkdir -p ~/.ssh
echo "${{ secrets.VPS_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
- name: Send new files
run: rsync -avP -e "ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa -p 2022" ./dist/ ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:/var/www/$PROJECT_NAME --delete
+64 -2
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html> <!doctype html>
<html lang="pl"> <html lang="pl">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
@@ -24,9 +24,71 @@
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png" /> <meta name="msapplication-TileImage" content="/ms-icon-144x144.png" />
<meta name="theme-color" content="#ffffff" /> <meta name="theme-color" content="#ffffff" />
<!-- Preloads -->
<link
rel="preload"
href="/fonts/libre-franklin-500.woff2"
as="font"
type="font/woff2"
crossorigin
/>
<link
rel="preload"
href="/fonts/libre-franklin-700.woff2"
as="font"
type="font/woff2"
crossorigin
/>
<link
rel="preload"
href="/fonts/libre-franklin-800.woff2"
as="font"
type="font/woff2"
crossorigin
/>
<link
rel="preload"
href="/fonts/libre-franklin-regular.woff2"
as="font"
type="font/woff2"
crossorigin
/>
<link rel="preload" href="/favicon.ico" as="image" />
<title>GeneraTOR</title> <title>GeneraTOR</title>
<meta name="description" content="Generator rozkazów pisemnych online" /> <meta name="description" content="Generator rozkazów pisemnych dla symulatora Train Driver 2" />
<!-- Static OpenGraph meta -->
<meta property="og:url" content="https://generator-td2.web.app/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="GeneraTOR" />
<meta
property="og:description"
content="Generator rozkazów pisemnych dla symulatora Train Driver 2"
/>
<meta
property="og:image"
content="https://raw.githubusercontent.com/Spythere/api/refs/heads/main/thumbnails/generator-banner.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:site_name" content="GeneraTOR" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="GeneraTOR" />
<meta
name="twitter:description"
content="Generator rozkazów pisemnych dla symulatora Train Driver 2"
/>
<meta
name="twitter:image"
content="https://raw.githubusercontent.com/Spythere/api/refs/heads/main/thumbnails/generator-banner.png"
/>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
<script type="module" src="/src/main.ts"></script> <script type="module" src="/src/main.ts"></script>
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "genera-tor", "name": "genera-tor",
"version": "1.6.0", "version": "1.7.0",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -13,7 +13,7 @@
}, },
"dependencies": { "dependencies": {
"axios": "^1.6.2", "axios": "^1.6.2",
"lucide-vue-next": "^0.525.0", "lucide-vue-next": "^0.562.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"showdown": "^2.1.0", "showdown": "^2.1.0",
"vue": "^3.3.11", "vue": "^3.3.11",
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+31 -48
View File
@@ -1,47 +1,41 @@
<template> <template>
<div id="app_wrapper"> <div id="app_wrapper">
<UpdateCard />
<router-view />
<transition name="slide-anim"> <transition name="slide-anim">
<div v-if="needRefresh" class="update-prompt" @click="updateServiceWorker(true)"> <UpdateCard />
{{ $t('update.update-available-text') }}
<u>{{ $t('update.update-available-underline') }}</u>
</div>
</transition> </transition>
<footer> <transition name="slide-anim">
&copy; <a href="https://td2.info.pl/profile/?u=20777">Spythere</a> <UpdatePrompt />
{{ new Date().getUTCFullYear() }} | </transition>
<button class="g-button text" @click="store.updateCardOpen = true">v{{ appVersion }}</button>
</footer> <div class="app-body">
<Navbar />
<main>
<RouterView />
</main>
</div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { useRegisterSW } from 'virtual:pwa-register/vue';
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import packageInfo from '../package.json'; import UpdateCard from './components/Global/UpdateCard.vue';
import { useStore } from './store/store';
import orderStorageMixin from './mixins/orderStorageMixin'; import orderStorageMixin from './mixins/orderStorageMixin';
import StorageManager from './managers/storageManager'; import { useStore } from './store/store';
import packageInfo from '../package.json';
import axios from 'axios'; import axios from 'axios';
import UpdateCard from './components/UpdateCard.vue'; import StorageManager from './managers/storageManager';
import Navbar from './components/App/Navbar.vue';
import UpdatePrompt from './components/Global/UpdatePrompt.vue';
const STORAGE_VERSION_KEY = 'app_version'; const STORAGE_VERSION_KEY = 'app_version';
export default defineComponent({ export default defineComponent({
components: { UpdateCard }, components: { UpdateCard, UpdatePrompt, Navbar },
mixins: [orderStorageMixin], mixins: [orderStorageMixin],
setup() {
const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW({ immediate: true });
return { offlineReady, needRefresh, updateServiceWorker };
},
data() { data() {
return { appVersion: packageInfo.version, store: useStore() }; return { appVersion: packageInfo.version, store: useStore() };
}, },
@@ -53,6 +47,7 @@ export default defineComponent({
methods: { methods: {
init() { init() {
this.loadLang(); this.loadLang();
this.setupDarkMode();
this.loadSettings(); this.loadSettings();
this.checkAppVersion(); this.checkAppVersion();
this.handleQueries(); this.handleQueries();
@@ -60,7 +55,17 @@ export default defineComponent({
loadSettings() { loadSettings() {
document.title = `GeneraTOR ${this.appVersion}`; document.title = `GeneraTOR ${this.appVersion}`;
},
setupDarkMode() {
if (this.getOrderSetting('dark-mode') === null) {
const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
this.saveOrderSetting('dark-mode', prefersDarkMode);
}
this.store.orderDarkMode = this.getOrderSetting('dark-mode') === 'true'; this.store.orderDarkMode = this.getOrderSetting('dark-mode') === 'true';
document.documentElement.setAttribute('data-theme', this.store.orderDarkMode ? 'dark' : 'light');
}, },
handleQueries() { handleQueries() {
@@ -69,7 +74,7 @@ export default defineComponent({
const id = query.get('sceneryId'); const id = query.get('sceneryId');
if (id != null) { if (id != null) {
this.store.orderMode = 'OrderTrainPicker'; this.store.panelMode = 'OrderTrainPickerPanel';
} }
}, },
@@ -130,31 +135,9 @@ export default defineComponent({
#app { #app {
color: white; color: white;
min-height: 100vh; min-height: 100vh;
} }
.update-prompt {
position: fixed;
bottom: 0;
left: 0;
padding: 0.5em;
font-weight: bold;
text-align: center;
width: 100%;
background-color: colors.$accentCol;
cursor: pointer;
}
footer {
text-align: center;
padding: 0.5em 0;
}
@media screen and (max-width: 500px) { @media screen and (max-width: 500px) {
#app { #app {
font-size: calc(1vw + 0.65rem); font-size: calc(1vw + 0.65rem);
+85
View File
@@ -0,0 +1,85 @@
<template>
<nav class="app-navbar">
<div class="navbar-brand">
<img src="/favicon.ico" alt="generator logo" width="30" />
<div>
<b>
Genera<span class="text--accent">TOR</span>
<sup class="text--grayed">v{{ version }}</sup>
</b>
<b class="brand-author">&nbsp;by Spythere</b>
</div>
</div>
<div class="navbar-actions">
<button class="g-button action icon" @click="switchDarkMode">
<LucideMoon :size="20" v-if="store.orderDarkMode" />
<LucideSun :size="20" v-else />
</button>
<button class="g-button action icon" @click="switchLang">
<LucideGlobe :size="20" />
<span>{{ store.currentAppLocale == 'pl' ? 'POL' : 'ENG' }}</span>
</button>
</div>
</nav>
</template>
<script setup lang="ts">
import { LucideGlobe, LucideMoon, LucideSun } from 'lucide-vue-next';
import { version } from '../../../package.json';
import { useStore } from '../../store/store';
const store = useStore();
function switchDarkMode() {
store.orderDarkMode = !store.orderDarkMode;
window.localStorage.setItem('dark-mode', `${store.orderDarkMode}`);
document.documentElement.setAttribute('data-theme', store.orderDarkMode ? 'dark' : 'light');
}
function switchLang() {
store.changeLang(store.currentAppLocale == 'pl' ? 'en' : 'pl');
}
</script>
<style lang="scss" scoped>
.app-navbar {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 40px;
padding: 0.25em;
background-color: #1c1c1c;
}
.navbar-brand {
display: flex;
align-items: center;
gap: 0.5em;
sup {
font-size: 0.75em;
}
}
.brand-author {
font-size: 0.8em;
color: #aaa;
}
.navbar-actions {
display: flex;
align-items: center;
gap: 0.5em;
button {
padding: 0.5em;
gap: 0.25em;
border-radius: 0.5em;
}
}
</style>
@@ -29,18 +29,17 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
import orderHelperData from '../data/orderHelperData.json';
export default defineComponent({ export default defineComponent({
setup() { setup() {
return { store: useStore(), orderHelperData }; return { store: useStore() };
} }
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@use '../styles/colors'; @use '../../styles/colors';
.content { .content {
width: 100%; width: 100%;
@@ -23,7 +23,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, ref, watch } from 'vue'; import { computed, ref, watch } from 'vue';
import { Converter } from 'showdown'; import { Converter } from 'showdown';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
const converter = new Converter(); const converter = new Converter();
const store = useStore(); const store = useStore();
+34
View File
@@ -0,0 +1,34 @@
<template>
<div v-if="needRefresh" class="update-prompt" @click="updateServiceWorker(true)">
{{ $t('update.update-available-text') }}
<u>{{ $t('update.update-available-underline') }}</u>
</div>
</template>
<script setup lang="ts">
import { useRegisterSW } from 'virtual:pwa-register/vue';
const { needRefresh, updateServiceWorker } = useRegisterSW({ immediate: true });
</script>
<style lang="scss" scoped>
@use '../../styles/colors';
.update-prompt {
position: fixed;
bottom: 0;
left: 0;
padding: 0.5em;
z-index: 200;
font-weight: bold;
text-align: center;
width: 100%;
background-color: colors.$accentCol;
cursor: pointer;
}
</style>
@@ -1,4 +1,7 @@
<template> <template>
<div class="order-container">
<OrderSideBar />
<div class="order" :class="{ dark: store.orderDarkMode }"> <div class="order" :class="{ dark: store.orderDarkMode }">
<div class="order_content"> <div class="order_content">
<transition name="order-anim" mode="out-in"> <transition name="order-anim" mode="out-in">
@@ -9,20 +12,22 @@
<OrderFooter /> <OrderFooter />
</div> </div>
</div> </div>
</div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
import OrderNVue from './OrderN.vue'; import OrderN from './OrderN.vue';
import OrderSVue from './OrderS.vue'; import OrderS from './OrderS.vue';
import OrderO from './OrderO.vue';
import OrderFooter from './OrderFooter.vue'; import OrderFooter from './OrderFooter.vue';
import OrderOVue from './OrderO.vue'; import OrderSideBar from './OrderSideBar.vue';
const orderComponents = { orderN: OrderNVue, orderS: OrderSVue, orderO: OrderOVue }; const orderComponents = { orderN: OrderN, orderS: OrderS, orderO: OrderO };
export default defineComponent({ export default defineComponent({
components: { OrderNVue, OrderSVue, OrderFooter }, components: { OrderN, OrderO, OrderS, OrderFooter, OrderSideBar },
setup() { setup() {
const store = useStore(); const store = useStore();
@@ -39,22 +44,32 @@ export default defineComponent({
</script> </script>
<style lang="scss"> <style lang="scss">
@use '../styles/colors'; @use '../../styles/colors';
$darkModeTextCol: #eee; $darkModeTextCol: #eee;
.order-container {
display: flex;
align-items: start;
max-width: 800px;
@media screen and (max-width: 1150px) {
flex-direction: column;
}
}
.order { .order {
background-color: white; background-color: white;
color: black; color: black;
max-height: calc(100vh - 5em);
overflow: auto;
&.dark { &.dark {
background-color: colors.$bgColDarker; background-color: colors.$bgColDarker;
color: $darkModeTextCol; color: $darkModeTextCol;
} }
max-height: 95vh;
overflow: auto;
font-size: 15px; font-size: 15px;
h2 { h2 {
@@ -52,8 +52,8 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import orderFooterMixin from '../mixins/orderFooterMixin'; import orderFooterMixin from '../../mixins/orderFooterMixin';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
export default defineComponent({ export default defineComponent({
mixins: [orderFooterMixin], mixins: [orderFooterMixin],
@@ -334,8 +334,8 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, reactive } from 'vue'; import { defineComponent, reactive } from 'vue';
import { useStore } from '../store/store'; import { handleOrderPlaceholders } from '../../handlers/orderPlaceholderHandler';
import { handleOrderPlaceholders } from '../handlers/orderPlaceholderHandler'; import { useStore } from '../../store/store';
type TOrderRows = 1 | 2 | 3 | 4 | 5; type TOrderRows = 1 | 2 | 3 | 4 | 5;
@@ -77,7 +77,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, reactive } from 'vue'; import { defineComponent, reactive } from 'vue';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
export default defineComponent({ export default defineComponent({
name: 'OrderO', name: 'OrderO',
@@ -122,11 +122,10 @@ export default defineComponent({
if (this.order.orderList.some((row) => row.name)) { if (this.order.orderList.some((row) => row.name)) {
message += `\n--------\n<b>[ 1 ]</b>`; message += `\n--------\n<b>[ 1 ]</b>`;
message += '\n1) zmniejszyć prędkość jazdy i zachować ostrożność' message += '\n1) zmniejszyć prędkość jazdy i zachować ostrożność';
message += '\n2) jechać ostrożnie (j.o.)\n' message += '\n2) jechać ostrożnie (j.o.)\n';
} }
for (let i = 0; i < this.order.orderList.length; i++) { for (let i = 0; i < this.order.orderList.length; i++) {
const row = this.order.orderList[i]; const row = this.order.orderList[i];
if (!row.name) continue; if (!row.name) continue;
@@ -60,7 +60,9 @@
holder="nazwa sem." holder="nazwa sem."
:radio-checked="order.rows[0].radio1 == 'radio-1a-1'" :radio-checked="order.rows[0].radio1 == 'radio-1a-1'"
/> />
<span v-if="order.rows[0].optionSignal == 'drogowskazowego'"> (odnoszącego się do wyjazdu pociągu)</span> <span v-if="order.rows[0].optionSignal == 'drogowskazowego'">
(odnoszącego się do wyjazdu pociągu)</span
>
<br /> <br />
</label> </label>
<hr /> <hr />
@@ -284,8 +286,8 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, reactive } from 'vue'; import { defineComponent, reactive } from 'vue';
import { handleOrderPlaceholders } from '../handlers/orderPlaceholderHandler'; import { handleOrderPlaceholders } from '../../handlers/orderPlaceholderHandler';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
type TOrderRows = 1 | 2 | 3 | 4; type TOrderRows = 1 | 2 | 3 | 4;
@@ -23,7 +23,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
export default defineComponent({ export default defineComponent({
data() { data() {
@@ -61,11 +61,11 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@use '../styles/colors'; @use '../../styles/colors';
.sidebar_content { .sidebar_content {
display: grid; display: flex;
grid-template-rows: repeat(3, 1fr); flex-direction: column;
gap: 0.25em; gap: 0.25em;
font-size: 1.5em; font-size: 1.5em;
@@ -126,10 +126,9 @@ button.option-save {
} }
} }
@media screen and (max-width: 650px) { @media screen and (max-width: 1150px) {
.sidebar_content { .sidebar_content {
display: flex; flex-direction: row;
justify-content: space-between;
& > button { & > button {
height: 40px; height: 40px;
@@ -50,9 +50,9 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import orderStorageMixin from '../mixins/orderStorageMixin'; import orderStorageMixin from '../../mixins/orderStorageMixin';
import { useStore } from '../store/store'; import { useStore } from '../../store/store';
import { LocalStorageOrder } from '../types/orderTypes'; import { LocalStorageOrder } from '../../types/orderTypes';
export default defineComponent({ export default defineComponent({
name: 'OrderList', name: 'OrderList',
@@ -114,7 +114,7 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@use '../styles/colors'; @use '../../styles/colors';
.list { .list {
&-move, &-move,
@@ -8,36 +8,35 @@
</p> </p>
<div class="message_actions"> <div class="message_actions">
<button class="g-button action" @click="saveOrder"> <button class="g-button action icon" @click="saveOrder">
<LucideSave />
{{ $t('order-message.button-save') }} {{ $t('order-message.button-save') }}
</button> </button>
<button class="g-button action" @click="copyMessage">
<button class="g-button action icon" @click="copyMessage">
<LucideCopy />
{{ $t('order-message.button-copy') }} {{ $t('order-message.button-copy') }}
</button> </button>
<button <button
class="g-button action" class="g-button action icon"
:data-disabled="!store.chosenLocalOrderId" :data-disabled="!store.chosenLocalOrderId"
@click="updateOrder" @click="updateOrder"
> >
<LucidePencil />
{{ $t('order-message.button-update') }} {{ $t('order-message.button-update') }}
<span class="text--accent" <span class="text--accent" v-if="store.chosenLocalOrderId"
>{{ store.chosenLocalOrderId && `#${store.chosenLocalOrderId.split('-')[1]}` }} >#{{ store.chosenLocalOrderId.split('-')[1] }}
</span> </span>
</button> </button>
<button class="g-button action icon" @click="resetOrder">
<LucideRotateCcw />
{{ $t('order-message.button-reset') }}
</button>
</div> </div>
<div class="message_checkboxes"> <div class="message_checkboxes">
<label for="dark-mode" class="g-checkbox">
<input
type="checkbox"
name="dark-mode"
id="dark-mode"
v-model="store.orderDarkMode"
@change="onCheckboxChange"
/>
<span>{{ $t('order-options.dark-mode') }}</span>
</label>
<label for="copy-increment" class="g-checkbox"> <label for="copy-increment" class="g-checkbox">
<input <input
type="checkbox" type="checkbox"
@@ -80,23 +79,23 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useStore } from '../store/store'; import orderStorageMixin from '../../mixins/orderStorageMixin';
import orderValidationMixin from '../../mixins/orderValidationMixin';
import saveIcon from '../assets/icon-save.svg'; import { useStore } from '../../store/store';
import orderStorageMixin from '../mixins/orderStorageMixin'; import { currentFormattedHours, currentFormattedMinutes } from '../../utils/dateUtils';
import orderValidationMixin from '../mixins/orderValidationMixin'; import { LucideCopy, LucidePencil, LucideRotateCcw, LucideSave } from 'lucide-vue-next';
import { currentFormattedHours, currentFormattedMinutes } from '../utils/dateUtils'; import { setOrderToDefault } from '../../utils/orderUtils';
export default defineComponent({ export default defineComponent({
name: 'OrderMessage', name: 'OrderMessage',
components: { LucideCopy, LucidePencil, LucideRotateCcw, LucideSave },
mixins: [orderStorageMixin, orderValidationMixin], mixins: [orderStorageMixin, orderValidationMixin],
data() { data() {
return { return {
saveIcon,
actionMonit: '', actionMonit: '',
monitTimeout: undefined as number | undefined, monitTimeout: null as number | null,
incrementOnSave: true, incrementOnSave: true,
incrementOnCopy: true, incrementOnCopy: true,
@@ -111,9 +110,9 @@ export default defineComponent({
}, },
mounted() { mounted() {
this.incrementOnSave = this.getOrderSetting('save-increment') === 'true'; this.incrementOnSave = this.getOrderSetting('save-increment') !== 'false';
this.incrementOnCopy = this.getOrderSetting('copy-increment') === 'true'; this.incrementOnCopy = this.getOrderSetting('copy-increment') !== 'false';
this.updateDate = this.getOrderSetting('update-date') === 'true'; this.updateDate = this.getOrderSetting('update-date') !== 'false';
}, },
computed: { computed: {
@@ -143,25 +142,20 @@ export default defineComponent({
}, },
showActionMonit(text: string) { showActionMonit(text: string) {
if (this.monitTimeout) { if (this.monitTimeout != null) {
this.actionMonit = ''; this.actionMonit = '';
clearTimeout(this.monitTimeout); clearTimeout(this.monitTimeout);
setTimeout(() => { setTimeout(() => {
this.actionMonit = text; this.actionMonit = text;
}, 100);
this.monitTimeout = window.setTimeout(() => { } else {
this.actionMonit = ''; this.actionMonit = text;
}, 5000);
}, 300);
return;
} }
this.actionMonit = text;
this.monitTimeout = window.setTimeout(() => { this.monitTimeout = window.setTimeout(() => {
this.actionMonit = ''; this.actionMonit = '';
this.monitTimeout = null;
}, 5000); }, 5000);
}, },
@@ -248,15 +242,21 @@ export default defineComponent({
this.showActionMonit(this.$t('order-message.success-update-html')); this.showActionMonit(this.$t('order-message.success-update-html'));
break; break;
} }
},
resetOrder() {
setOrderToDefault(this.store[this.store.chosenOrderType]);
} }
} }
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@use '../styles/colors'; @use '../../styles/colors';
.order-message { .order-message {
overflow: auto;
h3 { h3 {
margin: 0; margin: 0;
margin-bottom: 1em; margin-bottom: 1em;
@@ -269,8 +269,7 @@ export default defineComponent({
} }
.message_body { .message_body {
height: 250px; height: 350px;
overflow: auto;
background-color: colors.$bgColLighter; background-color: colors.$bgColLighter;
color: white; color: white;
@@ -289,10 +288,13 @@ export default defineComponent({
} }
.message_actions { .message_actions {
display: flex; display: grid;
align-items: center; grid-template-columns: repeat(2, 1fr);
justify-content: center; gap: 0.5em;
margin-top: 1em;
button.icon {
gap: 0.5em;
}
button img { button img {
height: 2ch; height: 2ch;
@@ -111,16 +111,16 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { useStore } from '../store/store'; import http from '../../http';
import { useStore } from '../../store/store';
import { API } from '../../types/apiTypes';
import { ISceneryData } from '../../types/dataTypes';
import { import {
currentFormattedDate, currentFormattedDate,
currentFormattedHours, currentFormattedHours,
currentFormattedMinutes currentFormattedMinutes
} from '../utils/dateUtils'; } from '../../utils/dateUtils';
import http from '../http'; import { getRegionNameById } from '../../utils/sceneryUtils';
import { ISceneryData } from '../types/dataTypes';
import { API } from '../types/apiTypes';
import { getRegionNameById } from '../utils/sceneryUtils';
export default defineComponent({ export default defineComponent({
name: 'order-train-picker', name: 'order-train-picker',
@@ -144,7 +144,7 @@ export default defineComponent({
}, },
created() { created() {
this.fillCheckpointName = window.localStorage.getItem('fill-checkpoint') == 'true'; this.fillCheckpointName = window.localStorage.getItem('fill-checkpoint') !== 'false';
this.fetchSceneriesData(); this.fetchSceneriesData();
}, },
@@ -261,7 +261,7 @@ export default defineComponent({
sceneryAbbrev || this.store.orderFooter.stationName.slice(0, 2); sceneryAbbrev || this.store.orderFooter.stationName.slice(0, 2);
} }
this.store.orderMode = 'OrderMessage'; this.store.panelMode = 'OrderMessagePanel';
}, },
handleQueries() { handleQueries() {
@@ -283,7 +283,7 @@ export default defineComponent({
this.selectOption(); this.selectOption();
this.store.orderMode = 'OrderTrainPicker'; this.store.panelMode = 'OrderTrainPickerPanel';
} }
} }
} }
@@ -292,7 +292,7 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@use '../styles/colors'; @use '../../styles/colors';
.order-train-picker { .order-train-picker {
display: flex; display: flex;
-3
View File
@@ -1,3 +0,0 @@
{
"orderS": ["D"]
}
+7 -6
View File
@@ -4,9 +4,9 @@
"en": "ENG" "en": "ENG"
}, },
"navbar": { "navbar": {
"order-message": "ORDER MESSAGE", "OrderMessagePanel": "MESSAGE",
"order-list": "SAVED ORDERS", "OrderListPanel": "SAVED",
"order-train-picker": "TRAINS" "OrderTrainPickerPanel": "TRAINS"
}, },
"update": { "update": {
"update-available-text": "New GeneraTOR version is available!", "update-available-text": "New GeneraTOR version is available!",
@@ -20,9 +20,10 @@
"order-message": { "order-message": {
"title": "Message to display in the simulator's chatbox:", "title": "Message to display in the simulator's chatbox:",
"info": "Copy or save the content of the generated train order using buttons below:", "info": "Copy or save the content of the generated train order using buttons below:",
"button-save": "Save as new order", "button-save": "Save as new",
"button-copy": "Copy the order message", "button-copy": "Copy the message",
"button-update": "Update the order", "button-update": "Update",
"button-reset": "Reset",
"warning-outdated-clipboard": "Oops! Your browser may be a little bit depraceted since it's not supporting saving data to the clipboard! :/", "warning-outdated-clipboard": "Oops! Your browser may be a little bit depraceted since it's not supporting saving data to the clipboard! :/",
"warning-fill-inputs": "Fill all the empty fields before copying the order!", "warning-fill-inputs": "Fill all the empty fields before copying the order!",
"warning-add-rows": "Add at least one row before copying the order!", "warning-add-rows": "Add at least one row before copying the order!",
+7 -6
View File
@@ -13,16 +13,17 @@
"info-2": "Pełny changelog dostępny na <a href='https://github.com/Spythere/genera-tor' target='_blank'>GitHubie projektu</a>" "info-2": "Pełny changelog dostępny na <a href='https://github.com/Spythere/genera-tor' target='_blank'>GitHubie projektu</a>"
}, },
"navbar": { "navbar": {
"order-message": "TREŚĆ ROZKAZU", "OrderMessagePanel": "WIADOMOŚĆ",
"order-list": "ZAPISANE ROZ.", "OrderListPanel": "ZAPISANE",
"order-train-picker": "POCIĄGI" "OrderTrainPickerPanel": "POCIĄGI"
}, },
"order-message": { "order-message": {
"title": "Wiadomość do wyświetlenia na czacie symulatora:", "title": "Wiadomość do wyświetlenia na czacie symulatora:",
"info": "Po wygenerowaniu rozkazu skopiuj jego treść lub zapisz w pamięci przeglądarki za pomocą przycisków poniżej:", "info": "Po wygenerowaniu rozkazu skopiuj jego treść lub zapisz w pamięci przeglądarki za pomocą przycisków poniżej:",
"button-save": "Zapisz nowy rozkaz", "button-save": "Zapisz nowy",
"button-copy": "Kopiuj treść rozkazu", "button-copy": "Skopiuj treść",
"button-update": "Zaktualizuj rozkaz", "button-update": "Zaktualizuj",
"button-reset": "Zresetuj",
"warning-outdated-clipboard": "Ups! Twoja przeglądarka musi być dosyć przestarzała, ponieważ nie obsługuje zapisu do schowka! :/", "warning-outdated-clipboard": "Ups! Twoja przeglądarka musi być dosyć przestarzała, ponieważ nie obsługuje zapisu do schowka! :/",
"warning-fill-inputs": "Wypełnij puste rubryki rozkazu przed jego skopiowaniem!", "warning-fill-inputs": "Wypełnij puste rubryki rozkazu przed jego skopiowaniem!",
"warning-add-rows": "Dodaj co najmniej jedną działkę rozkazu przed jego skopiowaniem!", "warning-add-rows": "Dodaj co najmniej jedną działkę rozkazu przed jego skopiowaniem!",
+1 -1
View File
@@ -157,7 +157,7 @@ export default defineComponent({
this.store.chosenOrderType = localOrder.orderType; this.store.chosenOrderType = localOrder.orderType;
this.store.chosenLocalOrderId = localOrder.id; this.store.chosenLocalOrderId = localOrder.id;
this.store.orderMode = 'OrderMessage'; this.store.panelMode = 'OrderMessagePanel';
} }
} }
}); });
+12 -2
View File
@@ -1,10 +1,12 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { IOrderN, IOrderO, IOrderS, TOrder } from '../types/orderTypes'; import { IOrderN, IOrderO, IOrderS, TOrder, TPanel } from '../types/orderTypes';
import { import {
currentFormattedDate, currentFormattedDate,
currentFormattedHours, currentFormattedHours,
currentFormattedMinutes currentFormattedMinutes
} from '../utils/dateUtils'; } from '../utils/dateUtils';
import i18n from '../i18n';
import StorageManager from '../managers/storageManager';
export const useStore = defineStore('store', { export const useStore = defineStore('store', {
state: () => { state: () => {
@@ -24,7 +26,7 @@ export const useStore = defineStore('store', {
chosenOrderType: 'orderN' as TOrder, chosenOrderType: 'orderN' as TOrder,
chosenLocalOrderId: '', chosenLocalOrderId: '',
orderMode: 'OrderMessage', panelMode: 'OrderMessagePanel' as TPanel,
orderFooter: { orderFooter: {
stationName: '', stationName: '',
@@ -214,5 +216,13 @@ export const useStore = defineStore('store', {
] ]
} as IOrderS } as IOrderS
}; };
},
actions: {
changeLang(lang: string) {
i18n.global.locale.value = lang as typeof i18n.global.locale.value;
this.currentAppLocale = lang;
StorageManager.setStringValue('lang', lang);
}
} }
}); });
+18 -11
View File
@@ -1,24 +1,31 @@
@font-face { @font-face {
font-family: 'Libre Franklin';
src: url('/fonts/LibreFranklin-Bold.woff2') format('woff2');
font-weight: 800;
font-style: normal;
font-display: swap; font-display: swap;
font-family: 'Libre Franklin';
font-style: normal;
font-weight: 400;
src: url('/fonts/libre-franklin-regular.woff2') format('woff2');
} }
@font-face { @font-face {
font-display: swap;
font-family: 'Libre Franklin'; font-family: 'Libre Franklin';
src: url('/fonts/LibreFranklin-Regular.woff2') format('woff2'); font-style: normal;
font-weight: 500; font-weight: 500;
font-style: normal; src: url('/fonts/libre-franklin-500.woff2') format('woff2');
font-display: swap;
} }
@font-face { @font-face {
font-family: 'Libre Franklin';
src: url('/fonts/LibreFranklin-SemiBold.woff2') format('woff2');
font-weight: 700;
font-style: normal;
font-display: swap; font-display: swap;
font-family: 'Libre Franklin';
font-style: normal;
font-weight: 700;
src: url('/fonts/libre-franklin-700.woff2') format('woff2');
} }
@font-face {
font-display: swap;
font-family: 'Libre Franklin';
font-style: normal;
font-weight: 800;
src: url('/fonts/libre-franklin-800.woff2') format('woff2');
}
+2 -15
View File
@@ -1,21 +1,8 @@
@use 'fonts'; @use 'fonts';
@use 'colors'; @use 'colors';
// Global scrollbar style [data-theme='dark'] {
::-webkit-scrollbar { color-scheme: dark;
width: 15px;
}
::-webkit-scrollbar-track {
background: #333;
}
::-webkit-scrollbar-thumb {
background: #888;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
} }
body, body,
+1
View File
@@ -1,4 +1,5 @@
export type TOrder = 'orderO' | 'orderS' | 'orderN'; export type TOrder = 'orderO' | 'orderS' | 'orderN';
export type TPanel = 'OrderMessagePanel' | 'OrderListPanel' | 'OrderTrainPickerPanel';
export interface LocalStorageOrder { export interface LocalStorageOrder {
id: string; id: string;
+197
View File
@@ -0,0 +1,197 @@
import { IOrderN, IOrderO, IOrderS, TOrder } from '../types/orderTypes';
import { currentFormattedDate } from './dateUtils';
const orderDefaults = {
orderN: {
header: {
orderNo: '1',
trainNo: '',
date: ''
},
rows: [
{
enabled: false,
from: '',
to: '',
trackNo: '',
trackNo2: ''
},
{
enabled: false,
option1: 'sygnału "Nakaz Jazdy"',
option2: 'lewy',
option3: 'lewy',
signal1: '',
signal2: '',
signal3: '',
signalType: 'wyjazdowego',
checkbox: 'checkbox-2a',
direction1: '',
direction2: '',
trackNoFrom: '',
trackNoTo1: '',
trackNoTo2: ''
},
{
enabled: false,
option1: 'Jazda',
option2: 'pociąg',
direction: '',
toKilometer: '',
trackNo: '',
untilHour: '',
untilMin: ''
},
{
enabled: false,
trackNo: '',
optionStation: 'stację',
stationName: '',
checkbox: 'checkbox-4a',
side: 'lewej'
},
{
enabled: false,
trackNo: '',
direction: '',
stationType: 'stację',
stationName: '',
on: ''
},
{
enabled: false,
content: '',
twoWay: {
enabled: false,
from: '',
to: '',
trackNo: ''
}
}
]
},
orderS: {
header: {
orderNo: '1',
trainNo: '',
for: 'pociągu',
date: ''
},
rows: [
{
enabled: false,
option1: 'sygnału "nakaz jazdy"',
optionSignal: 'wyjazdowego',
radio1: 'radio-1a-1',
signal1: '',
trackNo: ''
},
{
enabled: false,
signalType: 'wyjazdowego',
signal1: '',
signal2: '',
signal3: '',
trackNo: ''
},
{
enabled: false,
from: '',
to: '',
trackNo: '',
trainNo: '',
arrivedTo: '',
hour: ''
},
{
enabled: false,
content: '',
w5: {
enabled: false,
maxHour: '',
borderType: 'wskaźnik przetaczania W5',
tmName: '',
maxKm: '',
returnWay: 'sygnał ręczny "Do mnie"',
trackNo: ''
}
}
]
},
orderO: {
header: {
orderNo: '1',
trainNo: '',
date: ''
},
orderList: [
{
name: '',
from: '',
to: '',
vmax: '',
jo: false,
reason: ''
},
{
name: '',
from: '',
to: '',
vmax: '',
jo: false,
reason: ''
},
{
name: '',
from: '',
to: '',
vmax: '',
jo: false,
reason: ''
},
{
name: '',
from: '',
to: '',
vmax: '',
jo: false,
reason: ''
},
{
name: '',
from: '',
to: '',
vmax: '',
jo: false,
reason: ''
}
],
other: ''
}
};
export function getOrderType(order: IOrderN | IOrderO | IOrderS): TOrder {
if ('rows' in order && 'for' in order.header) return 'orderS';
else if ('rows' in order) return 'orderN';
return 'orderO';
}
export function setOrderToDefault(order: IOrderN | IOrderO | IOrderS) {
const orderType = getOrderType(order);
const defaultOrderObjectCopy = JSON.parse(JSON.stringify(orderDefaults[orderType]));
Object.assign(order, defaultOrderObjectCopy);
// Update date in the header
order.header.date = currentFormattedDate();
}
+84 -111
View File
@@ -2,33 +2,45 @@
<!-- <OrderHelper v-if="store.helperModalOpen" /> --> <!-- <OrderHelper v-if="store.helperModalOpen" /> -->
<div class="home"> <div class="home">
<div class="home_container"> <div class="home-container">
<div class="order_container"> <Order />
<SideBar />
<OrderVue />
</div>
<div class="message_container"> <div class="panel-container">
<div class="message_nav"> <div class="panel-nav">
<button class="g-button icon" @click="switchLanguages"> <button
<LanguagesIcon :size="18" /> key="OrderMessagePanel"
<span style="margin-left: 0.25em">{{ $t('locale.' + store.currentAppLocale) }}</span> class="g-button"
:data-active="store.panelMode == 'OrderMessagePanel'"
@click="selectPanelMode('OrderMessagePanel')"
>
<MessageSquareTextIcon :size="20" />
{{ t(`navbar.OrderMessagePanel`) }}
</button> </button>
<button <button
v-for="(action, i) in navActions" key="OrderListPanel"
:key="action.mode" class="g-button"
class="g-button option" :data-active="store.panelMode == 'OrderListPanel'"
:data-active="store.orderMode == action.mode" @click="selectPanelMode('OrderListPanel')"
@click="selectOrderMode(action.mode)"
> >
{{ $t(`navbar.${action.value}`) }} <BookMarkedIcon :size="20" />
{{ t(`navbar.OrderListPanel`) }}
</button>
<button
key="OrderTrainPickerPanel"
class="g-button"
:data-active="store.panelMode == 'OrderTrainPickerPanel'"
@click="selectPanelMode('OrderTrainPickerPanel')"
>
<TrainFrontIcon :size="20" />
{{ t(`navbar.OrderTrainPickerPanel`) }}
</button> </button>
</div> </div>
<transition name="order-anim" mode="out-in"> <transition name="order-anim" mode="out-in">
<keep-alive> <keep-alive>
<Component :is="orderModeComponent" /> <Component :is="panelComponent" />
</keep-alive> </keep-alive>
</transition> </transition>
</div> </div>
@@ -36,74 +48,34 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'; import { computed } from 'vue';
import OrderVue from '../components/Order.vue'; import { useI18n } from 'vue-i18n';
import SideBar from '../components/SideBar.vue';
import OrderMessage from '../components/OrderMessage.vue';
import OrderList from '../components/OrderList.vue';
import { useStore } from '../store/store'; import { useStore } from '../store/store';
import OrderHelper from '../components/OrderHelper.vue'; import OrderMessagePanel from '../components/Panels/OrderMessagePanel.vue';
import OrderTrainPicker from '../components/OrderTrainPicker.vue'; import OrderListPanel from '../components/Panels/OrderListPanel.vue';
import { LanguagesIcon } from 'lucide-vue-next'; import OrderTrainPickerPanel from '../components/Panels/OrderTrainPickerPanel.vue';
import StorageManager from '../managers/storageManager'; import SideBar from '../components/App/SideBar.vue';
import Order from '../components/Orders/Order.vue';
import { BookMarkedIcon, MessageSquareTextIcon, TrainFrontIcon } from 'lucide-vue-next';
import { TPanel } from '../types/orderTypes';
export default defineComponent({ const store = useStore();
components: { OrderVue, SideBar, OrderHelper, LanguagesIcon }, const { t } = useI18n();
data() { function selectPanelMode(mode: TPanel) {
return { store.panelMode = mode;
navActions: [
{
mode: 'OrderMessage',
value: 'order-message'
},
{
mode: 'OrderList',
value: 'order-list'
},
{
mode: 'OrderTrainPicker',
value: 'order-train-picker'
} }
]
};
},
methods: { const panelComponent = computed(() => {
selectOrderMode(mode: string) { switch (store.panelMode) {
this.store.orderMode = mode; case 'OrderListPanel':
}, return OrderListPanel;
case 'OrderTrainPickerPanel':
switchLanguages() { return OrderTrainPickerPanel;
const lang = this.store.currentAppLocale == 'pl' ? 'en' : 'pl'; case 'OrderMessagePanel':
this.$i18n.locale = lang;
this.store.currentAppLocale = lang;
StorageManager.setStringValue('lang', lang);
}
},
setup() {
return {
store: useStore()
};
},
computed: {
orderModeComponent() {
switch (this.store.orderMode) {
case 'OrderMessage':
return OrderMessage;
case 'OrderList':
return OrderList;
case 'OrderTrainPicker':
return OrderTrainPicker;
default: default:
return OrderMessage; return OrderMessagePanel;
}
}
} }
}); });
</script> </script>
@@ -112,7 +84,6 @@ export default defineComponent({
@use '../styles/colors'; @use '../styles/colors';
.home { .home {
min-height: 100vh;
overflow-x: auto; overflow-x: auto;
display: flex; display: flex;
@@ -122,63 +93,61 @@ export default defineComponent({
width: 100%; width: 100%;
} }
.home_container { .home-container {
display: flex; display: grid;
flex-wrap: wrap; grid-template-columns: 600px 500px;
justify-content: center; justify-content: center;
gap: 2em 1em; gap: 2em 1em;
padding: 0.5em; padding: 1em;
width: 100%; width: 100%;
@media screen and (max-width: 650px) { @media screen and (max-width: 1150px) {
grid-template-columns: auto;
padding: 1em 0.5em; padding: 1em 0.5em;
} }
} }
.order_container { .panel-container {
width: 100%;
max-width: 600px;
display: flex;
align-items: start;
@media screen and (max-width: 650px) {
flex-direction: column;
}
}
.message_container {
padding: 2px;
width: 100%;
max-width: 500px;
display: grid; display: grid;
grid-template-rows: auto auto 1fr; grid-template-rows: auto auto 1fr;
color-scheme: dark;
height: 95vh; padding: 2px;
max-width: 800px;
height: calc(100vh - 5em);
overflow: auto; overflow: auto;
} }
.message_nav { .panel-nav {
display: flex; display: flex;
align-items: center;
justify-content: center; justify-content: center;
gap: 0.25em; align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
gap: 0.25em;
margin-bottom: 1.5em; margin-bottom: 1.5em;
} }
.message_nav > button { .panel-nav > button {
position: relative; position: relative;
display: flex;
justify-content: center;
align-items: center;
gap: 0.5em;
min-width: 8em;
padding: 0.25em 0.5em;
&:focus-visible {
outline: 1px solid white;
}
&::before { &::before {
position: absolute; position: absolute;
content: ''; content: '';
bottom: -3px; bottom: -3px;
left: 0; left: 50%;
transform: translateX(-50%);
width: 0; width: 0;
height: 3px; height: 3px;
@@ -187,6 +156,10 @@ export default defineComponent({
background-color: colors.$accentCol; background-color: colors.$accentCol;
} }
&[data-active='true'] {
color: colors.$accentCol;
}
&[data-active='true']::before { &[data-active='true']::before {
width: 100%; width: 100%;
} }
+1 -1
View File
@@ -23,7 +23,7 @@ export default defineConfig({
VitePWA({ VitePWA({
registerType: 'prompt', registerType: 'prompt',
workbox: { workbox: {
globPatterns: ['**/*.{js,css,html,png,svg,img}'], globPatterns: ['**/*.{js,css,html,png,svg,img,woff2,ico}'],
runtimeCaching: [ runtimeCaching: [
{ {
urlPattern: /^https:\/\/stacjownik.spythere.eu\/\/api\/getSceneries/i, urlPattern: /^https:\/\/stacjownik.spythere.eu\/\/api\/getSceneries/i,
+133 -128
View File
@@ -963,26 +963,26 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
"@intlify/core-base@11.1.7": "@intlify/core-base@11.2.8":
version "11.1.7" version "11.2.8"
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.1.7.tgz#497280e4774011cf0d42eaedb20e9cd4594c0a3f" resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-11.2.8.tgz#083551bdd79b415476f282ded84f5ddc5fad75c1"
integrity sha512-gYiGnQeJVp3kNBeXQ73m1uFOak0ry4av8pn+IkEWigyyPWEMGzB+xFeQdmGMFn49V+oox6294oGVff8bYOhtOw== integrity sha512-nBq6Y1tVkjIUsLsdOjDSJj4AsjvD0UG3zsg9Fyc+OivwlA/oMHSKooUy9tpKj0HqZ+NWFifweHavdljlBLTwdA==
dependencies: dependencies:
"@intlify/message-compiler" "11.1.7" "@intlify/message-compiler" "11.2.8"
"@intlify/shared" "11.1.7" "@intlify/shared" "11.2.8"
"@intlify/message-compiler@11.1.7": "@intlify/message-compiler@11.2.8":
version "11.1.7" version "11.2.8"
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.1.7.tgz#047ba659cfd34b0f630dddf73c3f9224bd3af7f8" resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-11.2.8.tgz#3d967c07a36a8d6060730c1d3a2d40e3caaf07b3"
integrity sha512-0ezkep1AT30NyuKj8QbRlmvMORCCRlOIIu9v8RNU8SwDjjTiFCZzczCORMns2mCH4HZ1nXgrfkKzYUbfjNRmng== integrity sha512-A5n33doOjmHsBtCN421386cG1tWp5rpOjOYPNsnpjIJbQ4POF0QY2ezhZR9kr0boKwaHjbOifvyQvHj2UTrDFQ==
dependencies: dependencies:
"@intlify/shared" "11.1.7" "@intlify/shared" "11.2.8"
source-map-js "^1.0.2" source-map-js "^1.0.2"
"@intlify/shared@11.1.7": "@intlify/shared@11.2.8":
version "11.1.7" version "11.2.8"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.1.7.tgz#54e60d52b73fb25019e2689d6531a54928b40194" resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-11.2.8.tgz#30815afda2acd859cefdbb97cf59e7f819f32611"
integrity sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ== integrity sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==
"@jridgewell/gen-mapping@^0.3.5": "@jridgewell/gen-mapping@^0.3.5":
version "0.3.8" version "0.3.8"
@@ -1045,94 +1045,94 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@parcel/watcher-android-arm64@2.5.1": "@parcel/watcher-android-arm64@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.4.tgz#88c67bde2c3efa997a0b1fea540080c6ade0322c"
integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== integrity sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==
"@parcel/watcher-darwin-arm64@2.5.1": "@parcel/watcher-darwin-arm64@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.4.tgz#d9dc037cff8a4ab7839a79c5287a6e6660f7ab27"
integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== integrity sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==
"@parcel/watcher-darwin-x64@2.5.1": "@parcel/watcher-darwin-x64@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.4.tgz#da0e13e16ee6d378242e2cfb469d72667624383a"
integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== integrity sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==
"@parcel/watcher-freebsd-x64@2.5.1": "@parcel/watcher-freebsd-x64@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.4.tgz#feb7cc9ec680bae3e91dddcdb4fe1c399ed52cc1"
integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== integrity sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==
"@parcel/watcher-linux-arm-glibc@2.5.1": "@parcel/watcher-linux-arm-glibc@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.4.tgz#fa4e9cf8228c8c433e2f035e8b16aa299d892a78"
integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== integrity sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==
"@parcel/watcher-linux-arm-musl@2.5.1": "@parcel/watcher-linux-arm-musl@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.4.tgz#9ee6792e2d8810af9871ee5bbc2aa04e0b079d62"
integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== integrity sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==
"@parcel/watcher-linux-arm64-glibc@2.5.1": "@parcel/watcher-linux-arm64-glibc@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.4.tgz#624c6d874d99afa79305720f96a0c233d4ad7fde"
integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== integrity sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==
"@parcel/watcher-linux-arm64-musl@2.5.1": "@parcel/watcher-linux-arm64-musl@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.4.tgz#5341e88b9e645d31c015ed40f384e60e49bd74d2"
integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== integrity sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==
"@parcel/watcher-linux-x64-glibc@2.5.1": "@parcel/watcher-linux-x64-glibc@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.4.tgz#be5bcc49d3f6d21cc81bb531970a05d3721e385c"
integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== integrity sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==
"@parcel/watcher-linux-x64-musl@2.5.1": "@parcel/watcher-linux-x64-musl@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.4.tgz#bffd3895b1f0cc8fd1436e409fd65d0a901281c0"
integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== integrity sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==
"@parcel/watcher-win32-arm64@2.5.1": "@parcel/watcher-win32-arm64@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.4.tgz#7fb8aedea5b34ba97a01e1555929d01f4eb72fe4"
integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== integrity sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==
"@parcel/watcher-win32-ia32@2.5.1": "@parcel/watcher-win32-ia32@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.4.tgz#f7f94ebdb21dedf37b12e030a82d4211798a1c26"
integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== integrity sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==
"@parcel/watcher-win32-x64@2.5.1": "@parcel/watcher-win32-x64@2.5.4":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.4.tgz#8d895c9723f7fffdf4b360fd1becf1b6bcb571df"
integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== integrity sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==
"@parcel/watcher@^2.4.1": "@parcel/watcher@^2.4.1":
version "2.5.1" version "2.5.4"
resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.4.tgz#a6575b0a018b4e263589c1e7bc2ceb73c1ee84de"
integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== integrity sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==
dependencies: dependencies:
detect-libc "^1.0.3" detect-libc "^2.0.3"
is-glob "^4.0.3" is-glob "^4.0.3"
micromatch "^4.0.5"
node-addon-api "^7.0.0" node-addon-api "^7.0.0"
picomatch "^4.0.3"
optionalDependencies: optionalDependencies:
"@parcel/watcher-android-arm64" "2.5.1" "@parcel/watcher-android-arm64" "2.5.4"
"@parcel/watcher-darwin-arm64" "2.5.1" "@parcel/watcher-darwin-arm64" "2.5.4"
"@parcel/watcher-darwin-x64" "2.5.1" "@parcel/watcher-darwin-x64" "2.5.4"
"@parcel/watcher-freebsd-x64" "2.5.1" "@parcel/watcher-freebsd-x64" "2.5.4"
"@parcel/watcher-linux-arm-glibc" "2.5.1" "@parcel/watcher-linux-arm-glibc" "2.5.4"
"@parcel/watcher-linux-arm-musl" "2.5.1" "@parcel/watcher-linux-arm-musl" "2.5.4"
"@parcel/watcher-linux-arm64-glibc" "2.5.1" "@parcel/watcher-linux-arm64-glibc" "2.5.4"
"@parcel/watcher-linux-arm64-musl" "2.5.1" "@parcel/watcher-linux-arm64-musl" "2.5.4"
"@parcel/watcher-linux-x64-glibc" "2.5.1" "@parcel/watcher-linux-x64-glibc" "2.5.4"
"@parcel/watcher-linux-x64-musl" "2.5.1" "@parcel/watcher-linux-x64-musl" "2.5.4"
"@parcel/watcher-win32-arm64" "2.5.1" "@parcel/watcher-win32-arm64" "2.5.4"
"@parcel/watcher-win32-ia32" "2.5.1" "@parcel/watcher-win32-ia32" "2.5.4"
"@parcel/watcher-win32-x64" "2.5.1" "@parcel/watcher-win32-x64" "2.5.4"
"@pkgr/utils@^2.4.2": "@pkgr/utils@^2.4.2":
version "2.4.2" version "2.4.2"
@@ -1321,9 +1321,9 @@
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
"@types/node@^22.13.10": "@types/node@^22.13.10":
version "22.15.34" version "22.19.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.34.tgz#3995a6461d2cfc51c81907da0065fc328f6a459e" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.7.tgz#434094ee1731ae76c16083008590a5835a8c39c1"
integrity sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw== integrity sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==
dependencies: dependencies:
undici-types "~6.21.0" undici-types "~6.21.0"
@@ -1693,12 +1693,12 @@ available-typed-arrays@^1.0.7:
possible-typed-array-names "^1.0.0" possible-typed-array-names "^1.0.0"
axios@^1.6.2: axios@^1.6.2:
version "1.10.0" version "1.13.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.10.0.tgz#af320aee8632eaf2a400b6a1979fa75856f38d54" resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687"
integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==
dependencies: dependencies:
follow-redirects "^1.15.6" follow-redirects "^1.15.6"
form-data "^4.0.0" form-data "^4.0.4"
proxy-from-env "^1.1.0" proxy-from-env "^1.1.0"
babel-plugin-polyfill-corejs2@^0.4.10: babel-plugin-polyfill-corejs2@^0.4.10:
@@ -2021,10 +2021,10 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
detect-libc@^1.0.3: detect-libc@^2.0.3:
version "1.0.3" version "2.1.2"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
dir-glob@^3.0.1: dir-glob@^3.0.1:
version "3.0.1" version "3.0.1"
@@ -2453,9 +2453,9 @@ flatted@^3.2.9:
integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
follow-redirects@^1.15.6: follow-redirects@^1.15.6:
version "1.15.9" version "1.15.11"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
for-each@^0.3.3, for-each@^0.3.5: for-each@^0.3.3, for-each@^0.3.5:
version "0.3.5" version "0.3.5"
@@ -2464,10 +2464,10 @@ for-each@^0.3.3, for-each@^0.3.5:
dependencies: dependencies:
is-callable "^1.2.7" is-callable "^1.2.7"
form-data@^4.0.0: form-data@^4.0.4:
version "4.0.3" version "4.0.5"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.3.tgz#608b1b3f3e28be0fccf5901fc85fb3641e5cf0ae" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053"
integrity sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA== integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
dependencies: dependencies:
asynckit "^0.4.0" asynckit "^0.4.0"
combined-stream "^1.0.8" combined-stream "^1.0.8"
@@ -2712,9 +2712,9 @@ ignore@^5.2.4:
integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==
immutable@^5.0.2: immutable@^5.0.2:
version "5.1.3" version "5.1.4"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.3.tgz#e6486694c8b76c37c063cca92399fa64098634d4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.4.tgz#e3f8c1fe7b567d56cf26698f31918c241dae8c1f"
integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg== integrity sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==
import-fresh@^3.2.1: import-fresh@^3.2.1:
version "3.3.1" version "3.3.1"
@@ -3122,10 +3122,10 @@ lru-cache@^5.1.1:
dependencies: dependencies:
yallist "^3.0.2" yallist "^3.0.2"
lucide-vue-next@^0.525.0: lucide-vue-next@^0.562.0:
version "0.525.0" version "0.562.0"
resolved "https://registry.yarnpkg.com/lucide-vue-next/-/lucide-vue-next-0.525.0.tgz#94bafb8dcb6b6344dbbd8a00d8230cf5478e444e" resolved "https://registry.yarnpkg.com/lucide-vue-next/-/lucide-vue-next-0.562.0.tgz#a4cc08c2d00b9664c768e5da76e6634212a02a23"
integrity sha512-Xf8+x8B2DrnGDV/rxylS+KBp2FIe6ljwDn2JsGTZZvXIfhmm/q+nv8RuGO1OyoMjOVkkz7CqtUqJfwtFPRbB2w== integrity sha512-LN0BLGKMFulv0lnfK29r14DcngRUhIqdcaL0zXTt2o0oS9odlrjCGaU3/X9hIihOjjN8l8e+Y9G/famcNYaI7Q==
magic-string@^0.25.0, magic-string@^0.25.7: magic-string@^0.25.0, magic-string@^0.25.7:
version "0.25.9" version "0.25.9"
@@ -3156,7 +3156,7 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: micromatch@^4.0.4, micromatch@^4.0.8:
version "4.0.8" version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -3403,6 +3403,11 @@ picomatch@^4.0.2:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
picomatch@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
pinia@^2.1.7: pinia@^2.1.7:
version "2.3.1" version "2.3.1"
resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.3.1.tgz#54c476675b72f5abcfafa24a7582531ea8c23d94" resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.3.1.tgz#54c476675b72f5abcfafa24a7582531ea8c23d94"
@@ -3446,9 +3451,9 @@ prettier-linter-helpers@^1.0.0:
fast-diff "^1.1.2" fast-diff "^1.1.2"
prettier@^3.0.3: prettier@^3.0.3:
version "3.6.2" version "3.8.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173"
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==
pretty-bytes@^5.3.0: pretty-bytes@^5.3.0:
version "5.6.0" version "5.6.0"
@@ -3675,9 +3680,9 @@ safe-regex-test@^1.1.0:
is-regex "^1.2.1" is-regex "^1.2.1"
sass@^1.69.5: sass@^1.69.5:
version "1.89.2" version "1.97.2"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.89.2.tgz#a771716aeae774e2b529f72c0ff2dfd46c9de10e" resolved "https://registry.yarnpkg.com/sass/-/sass-1.97.2.tgz#e515a319092fd2c3b015228e3094b40198bff0da"
integrity sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA== integrity sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==
dependencies: dependencies:
chokidar "^4.0.0" chokidar "^4.0.0"
immutable "^5.0.2" immutable "^5.0.2"
@@ -4066,9 +4071,9 @@ typed-array-length@^1.0.7:
reflect.getprototypeof "^1.0.6" reflect.getprototypeof "^1.0.6"
typescript@^5.3.3: typescript@^5.3.3:
version "5.8.2" version "5.9.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
unbox-primitive@^1.1.0: unbox-primitive@^1.1.0:
version "1.1.0" version "1.1.0"
@@ -4196,18 +4201,18 @@ vue-eslint-parser@^9.3.1, vue-eslint-parser@^9.4.3:
semver "^7.3.6" semver "^7.3.6"
vue-i18n@11: vue-i18n@11:
version "11.1.7" version "11.2.8"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-11.1.7.tgz#a26c0224d1311ac89b82ff6d0ee45f68b5099237" resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-11.2.8.tgz#f431b583134776dcf59e59250c5231e4eaed8404"
integrity sha512-CDrU7Cmyh1AxJjerQmipV9nVa//exVBdhTcWGlbfcDCN8bKp/uAe7Le6IoN4//5emIikbsSKe9Uofmf/xXkhOA== integrity sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==
dependencies: dependencies:
"@intlify/core-base" "11.1.7" "@intlify/core-base" "11.2.8"
"@intlify/shared" "11.1.7" "@intlify/shared" "11.2.8"
"@vue/devtools-api" "^6.5.0" "@vue/devtools-api" "^6.5.0"
vue-router@^4.2.5: vue-router@^4.2.5:
version "4.5.0" version "4.6.4"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.5.0.tgz#58fc5fe374e10b6018f910328f756c3dae081f14" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.6.4.tgz#a0a9cb9ef811a106d249e4bb9313d286718020d8"
integrity sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w== integrity sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==
dependencies: dependencies:
"@vue/devtools-api" "^6.6.4" "@vue/devtools-api" "^6.6.4"