1
0
mirror of https://github.com/kihashi/stardew_community_checklist.git synced 2025-10-19 08:03:17 +00:00

Search Form name filter working

This commit is contained in:
lachie-underhill 2023-06-03 14:12:35 +10:00
parent b7bf4c4eec
commit 135f014389
No known key found for this signature in database
GPG Key ID: 48057E0D2C37AC20
13 changed files with 336 additions and 393 deletions

View File

@ -18,7 +18,7 @@
"@fortawesome/vue-fontawesome": "^3.0.3",
"@mdi/js": "^7.2.96",
"bulma": "^0.9.4",
"lodash": "^4.17.19",
"lodash": "^4.17.21",
"mdi-vue": "^3.0.13",
"pinia": "^2.1.3",
"pinia-plugin-persistedstate": "^3.1.0",
@ -29,17 +29,18 @@
"devDependencies": {
"@rushstack/eslint-patch": "^1.2.0",
"@types/jsdom": "^21.1.1",
"@types/node": "^18.16.8",
"@types/lodash": "^4.14.195",
"@types/node": "^20.2.5",
"@vitejs/plugin-vue": "^4.2.3",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/eslint-config-prettier": "^7.1.0",
"@vue/eslint-config-typescript": "^11.0.3",
"@vue/tsconfig": "^0.4.0",
"autoprefixer": "^7.1.2",
"eslint": "^8.39.0",
"autoprefixer": "^10.4.14",
"eslint": "^8.42.0",
"eslint-plugin-vue": "^9.11.0",
"postcss-import": "^11.0.0",
"postcss-url": "^7.2.1",
"postcss-import": "^15.1.0",
"postcss-url": "^10.1.3",
"typescript": "^5.1.3",
"vite": "^4.3.5"
},

View File

@ -1,16 +1,32 @@
<script setup lang="ts">
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
import { computed } from 'vue'
const props = defineProps<{ modelValue: string[] | boolean; value?: string }>()
const emit = defineEmits(['update:modelValue'])
const isChecked = computed(() =>
Array.isArray(props.modelValue) ? props.modelValue.includes(props.value ?? '') : props.modelValue
)
function onUpdate() {
if (Array.isArray(props.modelValue) && props.value) {
const newValue = [...props.modelValue]
if (isChecked.value) {
newValue.splice(newValue.indexOf(props.value), 1)
} else {
newValue.push(props.value)
}
emit('update:modelValue', newValue)
} else {
emit('update:modelValue', !isChecked.value)
}
}
</script>
<template>
<button
class="button is-rounded"
:class="modelValue ? 'is-info' : ''"
@click="$emit('update:modelValue', !modelValue)"
>
<button class="button is-rounded" :class="isChecked ? 'is-info' : ''" @click="onUpdate">
<slot></slot>
</button>
</template>
<style></style>

View File

@ -1,33 +0,0 @@
<template>
<section class="container">
<div class="hero is-medium is-bold">
<div class="hero-body">
<h1 class="title">Stardew Community Checklist</h1>
<h2 class="subtitle">Track Your Progress on the Community Center!</h2>
</div>
</div>
<New :class="ShowModal ? 'is-active' : ''" v-on:dismiss-modal="ShowModal = false"></New>
</section>
</template>
<script>
import ItemCard from '@/components/item_card/ItemCard.vue'
import New from '@/components/New.vue'
export default {
components: { ItemCard, New },
name: 'welcome',
data: function () {
return {
ShowModal: false
}
},
created() {
if (localStorage.getItem('new_visit') === null) {
this.ShowModal = true
localStorage.setItem('new_visit', 1)
}
}
}
</script>
<style scoped></style>

View File

@ -1,3 +1,8 @@
<script setup lang="ts">
defineProps<{ modelValue: string }>()
defineEmits<{ (e: 'update:modelValue', value: string): void }>()
</script>
<template>
<div class="field is-horizontal">
<div class="field-label is-normal">
@ -9,26 +14,11 @@
<input
class="input"
placeholder="Item Name"
v-bind:value="value"
v-on:input="$emit('input', $event.target.value)"
:value="modelValue"
@input="$emit('update:modelValue', $event.target?.value)"
/>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'item-search',
props: {
value: {
default() {
return ''
}
}
}
}
</script>
<style></style>

View File

@ -1,133 +0,0 @@
<template>
<section class="section">
<search-form v-model="search"></search-form>
<section class="container">
<div class="columns is-multiline">
<item-table v-if="CompactView" :items="filtered_items" />
<div
v-else
class="column is-3-widescreen is-4-desktop is-12-mobile is-6-tablet is-flex"
v-for="item in filtered_items"
:key="item.id"
>
<item-card :item="item"></item-card>
</div>
</div>
</section>
</section>
</template>
<script>
import SearchForm from '@/components/search/SearchForm.vue'
import ItemCard from '@/components/item_card/ItemCard.vue'
import ItemTable from '@/components/item_table/ItemTable.vue'
import _ from 'lodash'
export default {
name: 'search',
components: {
SearchForm,
ItemCard,
ItemTable
},
data() {
return {
search: {
name_filter: '',
season_filter: {
selected_seasons: ['spring', 'summer', 'fall', 'winter'],
season_exclusive: false
},
skill_filter: {
selected_skills: ['farming', 'foraging', 'mining', 'fishing', 'combat'],
skill_exclusive: false
}
}
}
},
computed: {
filtered_items() {
var self = this
return _.orderBy(
self.$store.state.items
.filter((item) => !(this.$store.state.HideCompleted && this.isItemComplete(item)))
.filter(
(item) => item.name.toLowerCase().indexOf(self.search.name_filter.toLowerCase()) !== -1
)
.filter((item) =>
this.FilterSeasons(
item.seasons.map((ssn) => ssn.id),
this.search.season_filter
)
)
.filter((item) =>
this.FilterSkills(
item.skills.map((skl) => skl.id),
this.search.skill_filter
)
),
'name'
)
},
CompactView() {
return this.$store.state.CompactView
}
},
methods: {
FilterSeasons(itemSeasons, seasonFilter) {
if (seasonFilter.season_exclusive) {
if (itemSeasons.length !== seasonFilter.selected_seasons.length) {
return false
} else {
var a = itemSeasons
var b = seasonFilter.selected_seasons
a.sort()
b.sort()
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) {
return false
}
}
return true
}
} else {
for (var season of seasonFilter.selected_seasons) {
if (itemSeasons.indexOf(season) !== -1) {
return true
}
}
return false
}
},
FilterSkills(itemSkills, skillFilter) {
if (skillFilter.skill_exclusive) {
if (itemSkills.length !== skillFilter.selected_skills.length) {
return false
} else {
var a = itemSkills
var b = skillFilter.selected_skills
a.sort()
b.sort()
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) {
return false
}
}
return true
}
} else {
for (var season of skillFilter.selected_skills) {
if (itemSkills.indexOf(season) !== -1) {
return true
}
}
return false
}
},
isItemComplete: function (item) {
return item.bundles.every(this.$store.getters.IsBundleItemRedeemed)
}
}
}
</script>
<style></style>

View File

@ -1,59 +1,45 @@
<template>
<div class="columns">
<div class="column">
<item-search
v-model.lazy="value.name_filter"
v-on:input="$emit('input', $event.target.value)"
/>
</div>
<div class="column">
<season-filter :value="value.season_filter" v-on:input="UpdateSeasons" />
</div>
<div class="column">
<skill-filter :value="value.skill_filter" v-on:input="UpdateSkills" />
</div>
</div>
</template>
<script>
<script setup lang="ts">
import ItemSearch from '@/components/search/ItemSearch.vue'
import SeasonFilter from '@/components/search/SeasonFilter.vue'
import SkillFilter from '@/components/search/SkillFilter.vue'
export default {
name: 'search-form',
props: {
value: {
default() {
return {
name_filter: '',
season_filter: {
selected_seasons: [],
season_exclusive: false
},
skill_filter: {
selected_skills: [],
skill_exclusive: false
}
}
}
}
},
methods: {
UpdateSeasons(val) {
this.value.season_filter = val
this.$emit('input', this.value)
},
UpdateSkills(val) {
this.value.skill_filter = val
this.$emit('input', this.value)
}
},
components: {
ItemSearch,
SeasonFilter,
SkillFilter
}
interface Filters {
nameFilter: string
seasonFilter: { selectedSeasons: string[]; seasonExclusive: boolean }
skillFilter: { selectedSkills: string[]; skillExclusive: boolean }
}
const props = defineProps<{
filters: Filters
}>()
const emit = defineEmits(['update:filters'])
function updateName(name: string) {
const obj = { ...props.filters, nameFilter: name }
console.log(obj, name)
emit('update:filters', { filters: { ...props.filters, nameFilter: name } })
}
function updateSeasons(seasonFilter: typeof props.filters.seasonFilter) {
console.log(seasonFilter)
emit('update:filters', { ...props.filters, seasonFilter })
}
function updateSkills(skillFilter: typeof props.filters.skillFilter) {
emit('update:filters', { ...props.filters, skillFilter })
}
</script>
<style></style>
<template>
<div class="columns">
<div class="column">
<ItemSearch v-model="filters.nameFilter" />
</div>
<!-- <div class="column">
<SeasonFilter :modelValue="filters.seasonFilter" @update:modelValue="updateSeasons" />
</div> -->
<!-- <div class="column">
<SkillFilter v-model="filters.skillFilter" />
</div> -->
</div>
</template>

View File

@ -1,3 +1,27 @@
<script setup lang="ts">
import SeasonIcon from '@/components/SeasonIcon.vue'
import ButtonCheck from '@/components/ButtonCheckbox.vue'
import { useGeneralStore } from '@/store'
interface ModelValue {
selectedSeasons: string[]
seasonExclusive: boolean
}
const props = defineProps<{ modelValue: ModelValue }>()
const emit = defineEmits<{ (e: 'update:modelValue', value: ModelValue): void }>()
const store = useGeneralStore()
function updateSeasons(val: string[]) {
emit('update:modelValue', { ...props.modelValue, selectedSeasons: val })
}
function updateExclusive(val: boolean) {
emit('update:modelValue', { ...props.modelValue, seasonExclusive: val })
}
</script>
<template>
<div class="field is-horizontal">
<div class="field-label is-normal">
@ -5,14 +29,14 @@
</div>
<div class="field-body">
<div class="field has-addons has-addons-centered">
<div class="control" v-for="season in seasons" :key="season.order">
<div class="control" v-for="season in store.seasons" :key="season.order">
<button-check
:value="season.id"
:checked="value.selected_seasons"
v-on:change="UpdateSeasons"
:model-value="modelValue.selectedSeasons"
@click="updateSeasons"
>
<span class="icon is-small">
<season-icon :season="season"></season-icon>
<season-icon :season="season.id"></season-icon>
</span>
</button-check>
</div>
@ -21,8 +45,8 @@
<div class="control is-expanded">
<button-check
class="is-fullwidth"
:checked="value.season_exclusive"
v-on:change="UpdateExclusive"
:model-value="modelValue.seasonExclusive"
@click="updateExclusive"
>
Exclusive
</button-check>
@ -31,42 +55,3 @@
</div>
</div>
</template>
<script>
import SeasonIcon from '@/components/SeasonIcon.vue'
import ButtonCheck from '@/components/ButtonCheckbox.vue'
export default {
name: 'season-filter',
components: {
SeasonIcon,
ButtonCheck
},
props: {
value: {
default() {
return {
selected_seasons: [],
season_exclusive: false
}
}
}
},
computed: {
seasons() {
return this.$store.state.seasons
}
},
methods: {
UpdateSeasons(val) {
this.value.selected_seasons = val
this.$emit('input', this.value)
},
UpdateExclusive(val) {
this.value.season_exclusive = val
this.$emit('input', this.value)
}
}
}
</script>
<style></style>

View File

@ -45,8 +45,8 @@ export default {
value: {
default() {
return {
selected_skills: [],
skill_exclusive: false
selectedSkills: [],
skillExclusive: false
}
}
}

View File

@ -1,9 +1,9 @@
import { createRouter, createWebHistory } from 'vue-router'
import Welcome from '@/components/Welcome.vue'
import Welcome from '@/views/WelcomeView.vue'
import Bundles from '@/views/BundlesView.vue'
import BundleItems from '@/components/bundles/BundleItems.vue'
import Search from '@/components/search/Search.vue'
import Search from '@/views/SearchView.vue'
import Settings from '@/views/SettingsView.vue'
import ChangeLog from '@/components/changelog/ChangeLog.vue'

View File

@ -85,6 +85,7 @@ export const useGeneralStore = defineStore('general', {
isBundleItemStored(state) {
return (bundleItemId: number): boolean => state.StoredBundleItemIds.includes(bundleItemId)
},
getNumberOfBundleItemsStoredInBundle(state) {
return (bundleId: number): number => {
// FIXME: Need to find a better way of handling undefined here instead of just assigning an arbitrary value
@ -110,6 +111,16 @@ export const useGeneralStore = defineStore('general', {
}, 0)
}
},
isItemComplete(state) {
return (itemId: number): boolean => {
const item = this.getItemById(itemId)
if (!item) return false
const bundleItems = this.getBundleItemsForItem(itemId)
return bundleItems.every((bundleItem) => state.StoredBundleItemIds.includes(bundleItem.id))
}
},
isBundleComplete() {
return (bundleId: number): boolean => {
return (

115
src/views/SearchView.vue Normal file
View File

@ -0,0 +1,115 @@
<script setup lang="ts">
import ItemCard from '@/components/item_card/ItemCard.vue'
import ItemTable from '@/components/item_table/ItemTable.vue'
import SearchForm from '@/components/search/SearchForm.vue'
import ItemSearch from '@/components/search/ItemSearch.vue'
import { useGeneralStore } from '@/store'
import _ from 'lodash'
import { computed, reactive } from 'vue'
const store = useGeneralStore()
const filters = reactive({
nameFilter: '',
seasonFilter: {
selectedSeasons: ['spring', 'summer', 'fall', 'winter'],
seasonExclusive: false
},
skillFilter: {
selectedSkills: ['farming', 'foraging', 'mining', 'fishing', 'combat'],
skillExclusive: false
}
})
function filterSeasons(itemSeasons: string[]) {
if (filters.seasonFilter.seasonExclusive) {
if (itemSeasons.length !== filters.seasonFilter.selectedSeasons.length) {
return false
} else {
var a = itemSeasons
var b = filters.seasonFilter.selectedSeasons
a.sort()
b.sort()
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) {
return false
}
}
return true
}
} else {
for (var season of filters.seasonFilter.selectedSeasons) {
if (itemSeasons.indexOf(season) !== -1) {
return true
}
}
return false
}
}
function filterSkills(itemSkills: string[]) {
if (filters.skillFilter.skillExclusive) {
if (itemSkills.length !== filters.skillFilter.selectedSkills.length) {
return false
} else {
var a = itemSkills
var b = filters.skillFilter.selectedSkills
a.sort()
b.sort()
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) {
return false
}
}
return true
}
} else {
for (var season of filters.skillFilter.selectedSkills) {
if (itemSkills.indexOf(season) !== -1) {
return true
}
}
return false
}
}
const filteredItems = computed(() => {
return _.orderBy(
store.items
.filter((item) => !(store.HideCompleted && store.isItemComplete(item.id)))
.filter((item) => item.name.toLowerCase().indexOf(filters.nameFilter.toLowerCase()) !== -1)
.filter((item) => filterSeasons(item.seasons))
.filter((item) => filterSkills(item.skills)),
'name'
)
})
</script>
<template>
<section class="section">
<SearchForm v-model:filters="filters"></SearchForm>
<!-- <div class="columns">
<div class="column">
<ItemSearch v-model="filters.nameFilter" />
</div>
<div class="column">
<season-filter :value="seasonFilter" v-on:input="updateSeasons" />
</div>
<div class="column">
<skill-filter :value="skillFilter" v-on:input="updateSkills" />
</div>
</div> -->
<section class="container">
<div class="columns is-multiline">
<item-table v-if="store.CompactView" :items="filteredItems" />
<div
v-else
class="column is-3-widescreen is-4-desktop is-12-mobile is-6-tablet is-flex"
v-for="item in filteredItems"
:key="item.id"
>
<item-card :item="item"></item-card>
</div>
</div>
</section>
</section>
</template>

27
src/views/WelcomeView.vue Normal file
View File

@ -0,0 +1,27 @@
<script setup lang="ts">
import New from '@/components/New.vue'
import { onMounted, ref } from 'vue'
const showModal = ref(false)
onMounted(() => {
if (localStorage.getItem('visited') === null) {
showModal.value = true
localStorage.setItem('visited', 'true')
}
})
</script>
<template>
<section class="container">
<div class="hero is-medium is-bold">
<div class="hero-body">
<h1 class="title">Stardew Community Checklist</h1>
<h2 class="subtitle">Track Your Progress on the Community Center!</h2>
</div>
</div>
<New :class="showModal ? 'is-active' : ''" v-on:dismiss-modal="showModal = false"></New>
</section>
</template>
<style scoped></style>

164
yarn.lock
View File

@ -412,10 +412,10 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@eslint/js@8.41.0":
version "8.41.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3"
integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==
"@eslint/js@8.42.0":
version "8.42.0"
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6"
integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==
"@fortawesome/fontawesome-common-types@6.4.0":
version "6.4.0"
@ -460,7 +460,7 @@
resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz#633e2998d11f7d4ed41f0d5ea461a22ec9b9d034"
integrity sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==
"@humanwhocodes/config-array@^0.11.8":
"@humanwhocodes/config-array@^0.11.10":
version "0.11.10"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2"
integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==
@ -561,16 +561,16 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
"@types/node@*":
"@types/lodash@^4.14.195":
version "4.14.195"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632"
integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==
"@types/node@*", "@types/node@^20.2.5":
version "20.2.5"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb"
integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==
"@types/node@^18.16.8":
version "18.16.16"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.16.tgz#3b64862856c7874ccf7439e6bab872d245c86d8e"
integrity sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==
"@types/semver@^7.3.12":
version "7.5.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a"
@ -872,16 +872,17 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
autoprefixer@^7.1.2:
version "7.2.6"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.6.tgz#256672f86f7c735da849c4f07d008abb056067dc"
autoprefixer@^10.4.14:
version "10.4.14"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d"
integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==
dependencies:
browserslist "^2.11.3"
caniuse-lite "^1.0.30000805"
browserslist "^4.21.5"
caniuse-lite "^1.0.30001464"
fraction.js "^4.2.0"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
postcss "^6.0.17"
postcss-value-parser "^3.2.3"
picocolors "^1.0.0"
postcss-value-parser "^4.2.0"
balanced-match@^1.0.0:
version "1.0.0"
@ -911,14 +912,7 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
browserslist@^2.11.3:
version "2.11.3"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
dependencies:
caniuse-lite "^1.0.30000792"
electron-to-chromium "^1.3.30"
browserslist@^4.21.3:
browserslist@^4.21.3, browserslist@^4.21.5:
version "4.21.7"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551"
integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==
@ -943,16 +937,12 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30000792, caniuse-lite@^1.0.30000805:
version "1.0.30000810"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000810.tgz#47585fffce0e9f3593a6feea4673b945424351d9"
caniuse-lite@^1.0.30001489:
caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489:
version "1.0.30001492"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz#4a06861788a52b4c81fd3344573b68cc87fe062b"
integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==
chalk@^2.0.0, chalk@^2.3.1:
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
dependencies:
@ -1063,10 +1053,6 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
electron-to-chromium@^1.3.30:
version "1.3.34"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz#d93498f40391bb0c16a603d8241b9951404157ed"
electron-to-chromium@^1.4.411:
version "1.4.417"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz#a0c7eb992e68287fa50c8da5a5238b01f20b9a82"
@ -1165,16 +1151,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
eslint@^8.39.0:
version "8.41.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c"
integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==
eslint@^8.42.0:
version "8.42.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291"
integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.4.0"
"@eslint/eslintrc" "^2.0.3"
"@eslint/js" "8.41.0"
"@humanwhocodes/config-array" "^0.11.8"
"@eslint/js" "8.42.0"
"@humanwhocodes/config-array" "^0.11.10"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
@ -1323,6 +1309,11 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
fraction.js@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@ -1527,10 +1518,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash@^4.17.19:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@ -1557,6 +1544,13 @@ magic-string@^0.30.0:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.13"
make-dir@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
mdi-vue@^3.0.13:
version "3.0.13"
resolved "https://registry.yarnpkg.com/mdi-vue/-/mdi-vue-3.0.13.tgz#d3ab6b4b121ed34bedf2fdc92d3e3465dfd0fd36"
@ -1577,9 +1571,10 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
mime@^1.4.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
mime@~2.5.2:
version "2.5.2"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
minimatch@^3.0.4:
version "3.0.4"
@ -1594,15 +1589,12 @@ minimatch@^3.0.5, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
mkdirp@^0.5.0:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
minimatch@~3.0.4:
version "3.0.8"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
dependencies:
minimist "0.0.8"
brace-expansion "^1.1.7"
ms@2.1.2:
version "2.1.2"
@ -1644,10 +1636,6 @@ nth-check@^2.0.1:
dependencies:
boolbase "^1.0.0"
num2fraction@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@ -1744,12 +1732,12 @@ pinia@^2.1.3:
"@vue/devtools-api" "^6.5.0"
vue-demi ">=0.14.5"
postcss-import@^11.0.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-11.1.0.tgz#55c9362c9192994ec68865d224419df1db2981f0"
postcss-import@^15.1.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70"
integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==
dependencies:
postcss "^6.0.1"
postcss-value-parser "^3.2.3"
postcss-value-parser "^4.0.0"
read-cache "^1.0.0"
resolve "^1.1.7"
@ -1761,27 +1749,20 @@ postcss-selector-parser@^6.0.9:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
postcss-url@^7.2.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-7.3.1.tgz#b43ae0f0dae4cd06c831fa3aeac2d7a5b73754ed"
postcss-url@^10.1.3:
version "10.1.3"
resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-10.1.3.tgz#54120cc910309e2475ec05c2cfa8f8a2deafdf1e"
integrity sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==
dependencies:
mime "^1.4.1"
minimatch "^3.0.4"
mkdirp "^0.5.0"
postcss "^6.0.1"
xxhashjs "^0.2.1"
make-dir "~3.1.0"
mime "~2.5.2"
minimatch "~3.0.4"
xxhashjs "~0.2.2"
postcss-value-parser@^3.2.3:
version "3.3.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
postcss@^6.0.1, postcss@^6.0.17:
version "6.0.19"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555"
dependencies:
chalk "^2.3.1"
source-map "^0.6.1"
supports-color "^5.2.0"
postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.1.10, postcss@^8.4.23:
version "8.4.24"
@ -1873,7 +1854,7 @@ sass@^1.62.1:
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
semver@^6.3.0:
semver@^6.0.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -1907,10 +1888,6 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@ -1923,7 +1900,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
supports-color@^5.2.0, supports-color@^5.3.0:
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
dependencies:
@ -2074,9 +2051,10 @@ xml-name-validator@^4.0.0:
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
xxhashjs@^0.2.1:
xxhashjs@~0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8"
integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==
dependencies:
cuint "^0.2.2"