Merge branch PronounsPage:main into main

This commit is contained in:
SigmundurMorkore 2025-05-31 02:14:57 +00:00
commit 9e961db51d
61 changed files with 548 additions and 431 deletions

View File

@ -56,6 +56,7 @@ useSeoMeta({
</script>
<template>
<NuxtRouteAnnouncer />
<NuxtPwaManifest />
<NuxtLoadingIndicator color="#C71585" error-color="#dc3545" />
<NuxtLayout>

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { getUrlForLocale } from '~/src/domain.ts';
import LocaleLink from '~/components/LocaleLink.vue';
interface Count {
name?: string;
@ -23,12 +23,6 @@ const props = withDefaults(
},
);
const config = useConfig();
const baseUrl = computed(() => {
return getUrlForLocale(props.locale ?? config.locale);
});
const visibleCounts = computed((): Count[] => {
return props.counts.filter(({ enabled }) => enabled !== false);
});
@ -46,7 +40,13 @@ const counterClass = (count: number, warning: number | undefined, danger: number
<template>
<div class="col-12 col-lg-3">
<component :is="link ? 'a' : 'div'" :href="baseUrl + link" class="card mb-3" style="min-height: 128px;">
<component
:is="link ? LocaleLink : 'div'"
:link
:locale="link ? locale : undefined"
class="card mb-3"
style="min-height: 128px;"
>
<div class="card-body text-center d-flex align-items-center">
<div class="w-100">
<h4>
@ -60,8 +60,9 @@ const counterClass = (count: number, warning: number | undefined, danger: number
class="list-inline-item"
>
<component
:is="sublink ? 'a' : 'span'"
:href="baseUrl + sublink"
:is="sublink ? LocaleLink : 'span'"
:link="sublink"
:locale="sublink ? locale : undefined"
:class="['badge', counterClass(count, warning, danger)]"
>
{{ count }} {{ name || '' }}

View File

@ -1,7 +1,7 @@
<script lang="ts" setup>
import { useStorage } from '@vueuse/core';
import { useLocalStorage } from '@vueuse/core';
const providerStorage = useStorage<string | undefined | null>('ads-provider', undefined);
const providerStorage = useLocalStorage<string | undefined | null>('ads-provider', undefined, { initOnMounted: true });
const PROVIDERS = {
'Geniee': 'geniee',

View File

@ -75,15 +75,15 @@ selectPronounForExample(false);
(<nuxt-link :to="`/${pronoun.canonicalName}`"><Spelling escape :text="pronoun.canonicalName" /></nuxt-link>)
</small>
</ExampleItem>
<Tooltip :text="tooltipText">
<button
v-if="hasDifferentExample"
type="button"
class="btn btn-sm btn-link px-1 py-0"
@click="selectDifferentExample()"
>
<Icon v="random" />
</button>
<Tooltip
v-if="hasDifferentExample"
:text="tooltipText"
tag="button"
type="button"
class="btn btn-sm btn-link px-1 py-0"
@click="selectDifferentExample()"
>
<Icon v="random" />
</Tooltip>
</li>
</template>

View File

@ -4,7 +4,7 @@ import type { Category } from '~/src/classes.ts';
const filter = defineModel<string>();
const filterCategory = defineModel<string>('category');
defineProps<{
const props = defineProps<{
categories?: Category[] | undefined;
submitButton?: boolean;
}>();
@ -17,10 +17,32 @@ const filterInput = useTemplateRef<HTMLInputElement>('filterInput');
const { $translator: translator } = useNuxtApp();
const allCategory: Category = { key: '', text: translator.translate('crud.all'), icon: 'clipboard-list' };
const categoriesWithAllCategory = computed(() => [allCategory, ...(props.categories ?? [])]);
defineExpose({
focus: () => filterInput.value?.focus(),
});
const categoryList = useTemplateRef('categoryList');
const categoryButtonKeydown = (event: KeyboardEvent) => {
if (filterCategory.value === undefined) {
return;
}
const activeIndex = categoriesWithAllCategory.value.map((category) => category.key).indexOf(filterCategory.value);
if (activeIndex === -1) {
return;
}
if ((event.key === 'ArrowUp' || event.key === 'ArrowLeft') &&
activeIndex > 0) {
filterCategory.value = categoriesWithAllCategory.value[activeIndex - 1].key;
(categoryList.value?.children[activeIndex - 1] as HTMLButtonElement | undefined)?.focus();
} else if ((event.key === 'ArrowDown' || event.key === 'ArrowRight') &&
activeIndex < categoriesWithAllCategory.value.length - 1) {
filterCategory.value = categoriesWithAllCategory.value[activeIndex + 1].key;
(categoryList.value?.children[activeIndex + 1] as HTMLButtonElement | undefined)?.focus();
}
};
</script>
<template>
@ -36,7 +58,12 @@ defineExpose({
class="form-control border-primary"
:placeholder="$t('crud.filterLong')"
>
<button v-if="filter" class="btn btn-outline-danger" @click="filter = ''; filterInput?.focus()">
<button
v-if="filter"
class="btn btn-outline-danger"
:title="$t('crud.resetFilter')"
@click="filter = ''; filterInput?.focus()"
>
<Icon v="times" />
</button>
<button
@ -50,17 +77,20 @@ defineExpose({
</div>
<div
v-if="categories && categories.length > 0"
ref="categoryList"
class="d-flex flex-wrap mt-1 border border-primary rounded overflow-hidden"
>
<button
v-for="category of [allCategory, ...categories]"
v-for="category of categoriesWithAllCategory"
:key="category.text"
:class="[
'btn btn-sm btn-wrapped',
filterCategory === category.key ? 'btn-primary' : 'btn-outline-primary',
'flex-grow-1 d-flex justify-content-center align-items-center gap-1 rounded-0',
]"
:tabindex="filterCategory === category.key ? 0 : -1"
@click="filterCategory = category.key"
@keydown="categoryButtonKeydown"
>
<Icon v-if="category.icon" :v="category.icon" />
<Spelling :text="category.text" />

View File

@ -1,12 +1,8 @@
<script setup lang="ts">
import { loadGrammarTableVariantsConverter } from '~/src/data.ts';
import type { Example, ExampleValues } from '~/src/language/examples.ts';
import {
type GrammarTableDefinition,
type Variant,
type SectionDefinition,
expandVariantsForSection,
} from '~/src/language/grammarTables.ts';
import { expandVariantsForSection } from '~/src/language/grammarTables.ts';
import type { GrammarTableDefinition, Variant, SectionDefinition } from '~/src/language/grammarTables.ts';
const props = defineProps<{
grammarTable: GrammarTableDefinition;

View File

@ -286,6 +286,7 @@ const dismissCensus = (): void => {
<template>
<div v-if="config.header" class="mb-lg-4">
<header @mouseleave="hoverItem = null">
<SkipLink />
<div class="d-none d-lg-flex justify-content-between align-items-center flex-row nav-custom btn-group mb-0">
<template v-for="link in links">
<PotentiallyExternalLink

View File

@ -11,7 +11,7 @@
:class="['icon', $attrs.class]"
@error="fallBack"
>
<span v-else :class="[`fa${iconSet}`, `fa-${icon}`, 'fa-fw', hover ? 'fa-hover' : '']" :style="style"></span>
<span v-else aria-hidden="true" :class="[`fa${iconSet}`, `fa-${icon}`, 'fa-fw', hover ? 'fa-hover' : '']" :style></span>
</template>
<script lang="ts">

View File

@ -1,22 +1,28 @@
<script setup lang="ts">
import { getUrlForLocale } from '~/src/domain.ts';
defineProps<{
const props = defineProps<{
link: string;
locale: string;
locale?: string;
}>();
const config = useConfig();
const isExternal = computed(() => !props.link.startsWith('/'));
const to = computed(() => {
if (isExternal.value) {
return props.link;
}
if (props.locale !== undefined && props.locale !== config.locale) {
return getUrlForLocale(props.locale) + props.link;
}
return props.link;
});
</script>
<template>
<nuxt-link v-if="locale === config.locale" :to="link" :class="$attrs.class">
<NuxtLink :to :no-rel="!isExternal" :target="isExternal ? '_blank' : undefined">
<slot></slot>
</nuxt-link>
<a v-else-if="locale === 'external'" :href="link" target="_blank" rel="noopener" :class="$attrs.class">
<slot></slot>
</a>
<a v-else :href="getUrlForLocale(locale) + link" :class="$attrs.class">
<slot></slot>
</a>
</NuxtLink>
</template>

View File

@ -1,5 +1,6 @@
<script setup lang="ts">
import opinions, { type Opinion } from '~/src/opinions.ts';
import opinions from '~/src/opinions.ts';
import type { Opinion } from '~/src/opinions.ts';
const props = withDefaults(defineProps<{
word: string;

View File

@ -11,7 +11,7 @@ defineProps<{
<AdPlaceholder :phkey="['aside-left', null]" class="d-none d-xxl-block" />
</slot>
</aside>
<main :class="[wide ? 'wide' : '']">
<main id="main" :class="[wide ? 'wide' : '']">
<slot></slot>
</main>
<aside v-if="!wide" class="aside-right">

View File

@ -20,7 +20,11 @@ defineProps<{
</p>
<SimplePronounList :pronouns="Array.isArray(pronouns) ? pronouns : Object.values(pronouns)" />
</li>
<nuxt-link :to="{ name: 'pronouns' }" class="list-group-item list-group-item-action text-center">
<nuxt-link
:to="{ name: 'pronouns' }"
class="list-group-item list-group-item-action text-center"
:title="$t('home.pronouns')"
>
<Icon v="ellipsis-h-alt" />
</nuxt-link>
</ul>

20
components/SkipLink.vue Normal file
View File

@ -0,0 +1,20 @@
<script setup lang="ts">
const router = useRouter();
router.afterEach(async (to, from) => {
if (to.path !== from.path) {
await nextTick();
// reset the focus to the start of the document
// so that the skip link is the first element in tab order after navigation
document.body.tabIndex = 0;
document.body.focus();
document.body.tabIndex = -1;
}
});
</script>
<template>
<a ref="link" href="#main" class="sr-only sr-only-focusable position-fixed top-0 z-1">
<T>home.skipToContent</T>
</a>
</template>

View File

@ -31,6 +31,16 @@ const addMarks = (t: string) => {
</template>, {{ source.year }}<template v-if="source.comment">
; <Spelling :text="source.comment" />
</template>
<ul v-if="changeSource !== undefined && !$isGranted('sources')" class="list-inline float-end">
<li class="list-inline-item">
<button type="button" class="btn btn-outline-secondary btn-sm btn-concise" @click="changeSource.edit(source)">
<Icon v="pen" />
<span class="btn-label">
<T>nouns.edit</T>
</span>
</button>
</li>
</ul>
</h3>
<ul v-if="changeSource !== undefined && $isGranted('sources')" class="list-inline">
<li v-if="!source.approved" class="list-inline-item">

View File

@ -55,7 +55,7 @@ defineExpose({
<template>
<section ref="section" class="table-responsive scroll-mt-7">
<div class="container">
<div class="container" role="table">
<nav v-if="pages > 1" class="d-flex justify-content-center p-2">
<ul class="pagination pagination-sm justify-content-center mb-0">
<li
@ -78,7 +78,7 @@ defineExpose({
<strong>{{ data.length }}</strong>
</div>
</div>
<div class="row-header p-2 d-grid gap-2 border-top">
<div class="row-header p-2 d-grid gap-2 border-top" role="row">
<slot name="header"></slot>
</div>
<template v-if="data.length">
@ -86,6 +86,7 @@ defineExpose({
v-for="el in dataPage"
:key="el.id"
:class="['row-content p-2 d-grid gap-2 border-top', marked?.(el) ? 'marked' : '']"
role="row"
>
<slot name="row" :el="el"></slot>
</div>

View File

@ -1,74 +1,81 @@
<script setup lang="ts">
import useHash from '~/composables/useHash.ts';
const props = defineProps<{
tabs: (string | undefined)[];
pills?: boolean;
showheaders?: boolean;
navclass?: string;
anchors?: boolean;
}>();
const { handleHash, setHash } = useHash();
const visibleTabs = computed(() => props.tabs.filter((x) => x !== undefined));
const activeTab = ref(visibleTabs.value[0]);
watch(activeTab, () => {
if (!props.anchors) {
return;
}
setHash('', activeTab.value);
});
onMounted(() => {
if (!props.anchors) {
return;
}
handleHash('', (hash) => {
if (!visibleTabs.value.includes(hash)) {
return;
}
activeTab.value = hash;
}, false);
});
const tablist = useTemplateRef('tablist');
const tabKeydown = (event: KeyboardEvent) => {
const activeIndex = visibleTabs.value.indexOf(activeTab.value);
if (activeIndex === -1) {
return;
}
if ((event.key === 'ArrowUp' || event.key === 'ArrowLeft') &&
activeIndex > 0) {
activeTab.value = visibleTabs.value[activeIndex - 1];
(tablist.value?.children[activeIndex - 1].firstElementChild as HTMLButtonElement | undefined)?.focus();
} else if ((event.key === 'ArrowDown' || event.key === 'ArrowRight') &&
activeIndex < visibleTabs.value.length - 1) {
activeTab.value = visibleTabs.value[activeIndex + 1];
(tablist.value?.children[activeIndex + 1].firstElementChild as HTMLButtonElement | undefined)?.focus();
}
};
</script>
<template>
<div>
<ul :class="['nav', pills ? 'nav-pills' : 'nav-tabs', navclass]">
<li v-for="tab in visibleTabs" class="nav-item">
<a
<ul ref="tablist" :class="['nav', pills ? 'nav-pills' : 'nav-tabs', navclass]" role="tablist">
<li v-for="tab in visibleTabs" :key="tab" class="nav-item" role="tab">
<button
type="button"
:tabindex="activeTab === tab ? 0 : -1"
:class="['nav-link', activeTab === tab ? 'active' : '']"
:aria-current="activeTab === tab ? 'page' : ''"
href="#"
@click.prevent="activeTab = tab"
:aria-selected="activeTab === tab"
@click="activeTab = tab"
@keydown="tabKeydown"
>
<slot :name="`${tab}-header`"></slot>
</a>
</button>
</li>
</ul>
<div class="card">
<div v-for="tab in visibleTabs" :class="['card-body', activeTab === tab ? 'd-block-force' : 'd-none']">
<div class="card" role="tabpanel">
<div class="card-body">
<h3 v-if="showheaders" class="h4 mb-3">
<slot :name="`${tab}-header`"></slot>
<slot :name="`${activeTab}-header`"></slot>
</h3>
<slot :name="tab"></slot>
<slot :name="activeTab"></slot>
</div>
</div>
</div>
</template>
<script>
import { defineComponent } from 'vue';
import useHash from '../composables/useHash.ts';
export default defineComponent({
props: {
tabs: { required: true },
active: {},
pills: { type: Boolean },
showheaders: { type: Boolean },
navclass: { default: 'nav-tabs' },
anchors: { type: Boolean },
},
setup() {
const { handleHash, setHash } = useHash();
return {
handleHash,
setHash,
};
},
data() {
return {
visibleTabs: this.tabs.filter((x) => x !== undefined),
activeTab: this.active || this.tabs[0],
};
},
watch: {
activeTab() {
if (!this.anchors) {
return;
}
this.setHash('', this.activeTab);
},
},
mounted() {
if (!this.anchors) {
return;
}
this.handleHash('', (hash) => {
if (!this.visibleTabs.includes(hash)) {
return;
}
this.activeTab = hash;
}, false);
},
});
</script>

View File

@ -72,6 +72,7 @@ const setSpelling = (spelling: string) => {
class="d-inline-block"
:end="end"
menu-class="locale-dropdown shadow"
:title="$t('links.languageVersions')"
>
<template #toggle>
<Icon v="language" />

View File

@ -119,7 +119,11 @@ const nounConventionGroup = computed(() => {
<li class="list-group-item">
<NounsConventionsIndexGroup :noun-convention-group />
</li>
<nuxt-link :to="{ name: 'nouns' }" class="list-group-item list-group-item-action text-center">
<nuxt-link
:to="{ name: 'nouns' }"
class="list-group-item list-group-item-action text-center"
:title="$t('nouns.conventions.header')"
>
<Icon v="ellipsis-h-alt" />
</nuxt-link>
</ul>

View File

@ -127,7 +127,12 @@ defineExpose({ loadNouns });
fixed
>
<template #header>
<div v-for="gender in availableGenders(config)" :key="gender" class="d-none d-md-block bold">
<div
v-for="gender in availableGenders(config)"
:key="gender"
class="d-none d-md-block bold"
role="columnheader"
>
<NounsGenderLabel :gender="gender" />
</div>
</template>

View File

@ -1,5 +1,6 @@
<script setup lang="ts">
import { type Gender, iconNamesByGender, longIdentifierByGender } from '~/src/nouns.ts';
import { iconNamesByGender, longIdentifierByGender } from '~/src/nouns.ts';
import type { Gender } from '~/src/nouns.ts';
const props = defineProps<{
gender: Gender;

View File

@ -32,6 +32,7 @@ const numerus = computed(() => {
v-for="plural in numerus"
:key="plural ? 'plural' : 'singular'"
:style="{ gridArea: `${gender}${plural ? 'Pl' : ''}` }"
role="cell"
>
<NounsItem :noun="noun" :gender="gender" :plural="plural" />

View File

@ -17,7 +17,7 @@ export default () => {
const filter: Ref<Filter> = ref({ text: '', category: '', moderation: undefined });
onBeforeRouteUpdate((to) => {
if (to.hash) {
if (to.hash && !document.querySelector(to.hash)) {
return { query: { filter: to.hash.substring(1).replace(/=$/, '') }, replace: true };
}
});

View File

@ -141,9 +141,10 @@ export default withNuxt(
})
.override('nuxt/import/rules', {
rules: {
'import/consistent-type-specifier-style': ['warn', 'prefer-top-level'],
'import/extensions': ['error', 'ignorePackages'],
'import/no-useless-path-segments': 'error',
'import/order': ['error', {
'import/no-useless-path-segments': 'warn',
'import/order': ['warn', {
'newlines-between': 'always',
'alphabetize': { order: 'asc', orderImportKind: 'desc' },
}],

View File

@ -93,7 +93,7 @@ const confirmAge = async (): Promise<void> => {
const provider = useStorage<string | null>('ads-provider', null);
if (provider.value === null) {
provider.value = Math.random() < 0.5 ? 'publift' : 'pushup';
provider.value = Math.random() < 0.8 ? 'publift' : 'pushup';
}
const adsEnabled = computed((): boolean => {

View File

@ -7,6 +7,7 @@ home:
header: 'Pronouns'
headerLong: 'List of pronouns'
welcome: 'Welcome to pronouns.page!'
skipToContent: 'Skip to content'
intro: >
We're creating a source of information about nonbinary and gender neutral language.
why: 'What''s the deal with pronouns?'
@ -213,6 +214,7 @@ nouns:
apply: 'Apply template'
overwrite: 'Are you sure you want to apply this template? This will replace previous inputs'
conventions:
header: 'Noun conventions'
intro: 'Use for me'
masculine: 'masculine'
masculineShort: 'masc.'
@ -497,7 +499,6 @@ contact:
header: 'Contact'
authors: 'Authors of the website'
groups:
all: ''
calendar: 'Queer Calendar Bot'
shop: 'Merch'
faq: >
@ -959,6 +960,7 @@ crud:
add: 'Add'
filter: 'Search…'
filterLong: 'Search…'
resetFilter: 'Reset filter'
search: 'Search…'
all: 'All'
author: 'Added by'

View File

@ -1,6 +1,6 @@
# التفكير خارج الإطار الثنائي
<small>2025-01-15 | [@auxiliaryfrfr](/@auxiliaryfrfr)</small>
<small>2025-01-15 | عضو الجماعية</small>
<div class="alert alert-warning">
<span class="fal fa-exclamation-triangle"></span>

View File

@ -400,7 +400,6 @@ contact:
header: 'التواصل'
authors: 'مؤلفو الموقع'
groups:
all: ''
calendar: 'روبوت اليومية المثلية'
shop: 'السِلَعْ والبضائع'
faq: 'قبل الكتابة، <strong>يجب مراجعة</strong> {/الأسئلة الشائعة=الأسئلة الشائعة} - فربما تكون الإجابة عن سؤال ما موجود بالفعل.'

View File

@ -1,7 +1,7 @@
<template>
<div>
<Separator icon="book-alt" />
<h3>Substantivkonventionen</h3>
<h3><T>nouns.conventions.header</T></h3>
<NounsConventionsIndex />
<Separator icon="book-open" />
<slot></slot>

View File

@ -7,6 +7,7 @@ home:
header: 'Pronomen'
headerLong: 'Liste von Pronomen'
welcome: 'Willkommen zu Pronomen.net!'
skipToContent: 'zum Inhalt springen'
intro: >
Wir sind eine Informationsquelle über nichtbinäre und geschlechtsneutrale Sprache.
why: 'Warum sind Pronomen wichtig?'
@ -233,6 +234,7 @@ nouns:
apply: 'Vorlage anwenden'
overwrite: 'Bist du sicher, dass du diese Vorlage anwenden möchtest? Sie ersetzt die vorherigen Eingaben'
conventions:
header: 'Substantivkonventionen'
intro: 'Verwende für mich'
masculine: 'Maskulin'
masculineShort: 'Mask.'
@ -609,7 +611,6 @@ contact:
header: 'Kontakt'
authors: 'Autor*innen der Website'
groups:
all: ''
calendar: 'Bot für den Queeren Kalender'
shop: 'Merch'
language: >
@ -1077,6 +1078,7 @@ crud:
add: 'Hinzufügen'
filter: 'Filter'
filterLong: 'Liste filtern...'
resetFilter: 'Filter zurücksetzen'
search: 'Suchen…'
all: 'Alle'
author: 'Hinzugefügt von'

View File

@ -1,6 +1,6 @@
# Thinking Outside The Binary even in the Arab world
<small>2025-01-15 | [@auxiliaryfrfr](/@auxiliaryfrfr)</small>
<small>2025-01-15 | Team member</small>
<ul class="list-inline">
<li class="list-inline-item">

View File

@ -6,7 +6,8 @@ style:
header: true
disableTranslationProposals: true
# even though English is our base locale, we can still use this interface to allow correcting typos
disableTranslationProposals: false
pronouns:
enabled: true

View File

@ -7,6 +7,7 @@ home:
header: 'Pronouns'
headerLong: 'List of pronouns'
welcome: 'Welcome to pronouns.page!'
skipToContent: 'Skip to content'
intro: >
We're creating a source of information about nonbinary and gender neutral language.
why: 'What''s the deal with pronouns?'
@ -667,7 +668,6 @@ contact:
header: 'Contact'
authors: 'Authors of the website'
groups:
all: ''
calendar: 'Queer Calendar Bot'
shop: 'Merch'
faq: >
@ -1175,6 +1175,7 @@ crud:
add: 'Add'
filter: 'Search…'
filterLong: 'Search…'
resetFilter: 'Reset filter'
search: 'Search…'
all: 'All'
author: 'Added by'

View File

@ -451,7 +451,6 @@ contact:
header: 'Kontakto'
authors: 'Aŭtoroj de la retejo'
groups:
all: ''
calendar: 'Roboto Kvira Kalendaro'
shop: 'Aĉeteblaĵoj'
team:
@ -889,6 +888,7 @@ search:
noResults: 'Mankas rezultoj por «%query%»'
english:
headerLonger: 'An overview of Esperanto nonbinary pronouns'
description: >
If you don't speak Esperanto, yet still are interested in how this language tries to cope with the omnipresent
binaries, we've prepared a short overview of those ideas in English.

View File

@ -533,7 +533,6 @@ contact:
design:
header: 'Pautas de diseño y activos'
groups:
all: ''
calendar: 'Bot Calendario Queer'
shop: 'Mercancía'
@ -807,6 +806,19 @@ profile:
mutua, este será marcado con [s:shield-check].
relationship: 'Relación (p. ej. "pareja", "mejor amigx")'
add: 'Añade gente a tu círculo'
blocks:
header: 'Cuentas bloqueadas'
action: 'Bloquear a esta persona'
confirm: >
Estás seguro/a/x de que quieres bloquear a @%username%? No serán capaces de ver sus tarjetas mutuamente o
añadirse a vuestros círculos. Esto puede ser reversible en la página de tu cuenta.
unblock:
action: 'Desbloquear a esta persona'
confirm: >
Estás seguro/a/x de que quieres desbloquear a @%username%? Podrán ser capaces de ver sus tarjetas
mutuamente o añadirse a vuestros círculos.
empty: 'Actualmente no tienes a ninguna cuenta bloqueada.'
instruction: 'Puedes bloquear a una persona visitando su perfil.'
backup:
header: 'Copia de seguridad de tarjetas'
headerShort: 'Copia'

View File

@ -392,7 +392,6 @@ contact:
header: 'Kontakt'
authors: 'Veebilehe autorid'
groups:
all: ''
calendar: 'Kväärikalendri bot'
shop: 'Fännikaup'
faq: >

View File

@ -12,25 +12,24 @@ home:
why: 'Hvat eru fornøvn og hvat brúka vit tey til?'
about:
- >
Fornøvn eru orðini vit brúka ístaðin fyri at brúka navnið hjá onkrum, hvørja ferð vit tosa við tey.
Flest fólk brúka {/hann=“hann/hansara”} ella {/hon=”hon/hennara”}, tí gitað vit automatiskt hvat fornavn onkur brúkar útfrá teirra útsjónd.
Men tað er faktiskt ikki so einfalt…
Fornøvn eru orðini vit brúka ístaðin fyri at brúka navnið hjá onkrum, hvørja ferð vit tosa við tey. Flest
fólk brúka {/hann=“hann/hansara”} ella {/hon=”hon/hennara”}, tí gitað vit automatiskt hvat fornavn onkur
brúkar útfrá teirra útsjónd. Men tað er faktiskt ikki so einfalt…
- >
Kyn er nokkso fløkt. Onkur fólk “síggja ikki út sum” teirra kyn.
Summi ynskja at vera kallað okkurt annað enn hvat man kanska fyrst hevði gitt.
Nøkur fólk passað ikki inn í kassarnar “maður” ella “kvinna” og vilja heldur brúka meira nevtralt mál.
Kyn er nokkso fløkt. Onkur fólk “síggja ikki út sum” teirra kyn. Summi ynskja at vera kallað okkurt annað enn
hvat man kanska fyrst hevði gitt. Nøkur fólk passað ikki inn í kassarnar “maður” ella “kvinna” og vilja
heldur brúka meira nevtralt mál.
- >
Hettar tólið loyvir tær at deila eina leinkju við tíni fornøvnum, og nakrar setningar sum dømi,
so tú kanst vísa onnur hvørji fornøvn tú brúkar.
Hettar tólið loyvir tær at deila eina leinkju við tíni fornøvnum, og nakrar setningar sum dømi, so tú kanst
vísa onnur hvørji fornøvn tú brúkar.
- >
Hví er tað týdningarmikið? Tí tað er einfald menniskjalig virðing.
Tú hevði ikki kallað Mariu fyri “Rebekka” bara tí tú dámar tað navnið betri.
Ella tí at “hon sær út sum ein Rebekka”.
Eisini sjálvt um hon <em>hevur</em> navnið “Rebekka” á hennara dópsváttan,
men hon absolutt hatar tað og vil heldur brúka “Maria”.
Tað er akkurát tað sama við fornøvnum -
um tú ikki vilt verða ófólkaligur ímóti onkrum, so kallar tú tey fyri tað tey ynskja.
Einasti munurin er at vanliga vita vit nøvnini hjá fólki, men ikki fornøvnini, tí tá vit fortelja um onnur okkum sjálvi, so byrja vit við okkara navn, men siga ikki okkara fornøvn. Lat okkum broyta tað!
Hví er tað týdningarmikið? Tí tað er einfald menniskjalig virðing. Tú hevði ikki kallað Mariu fyri “Rebekka”
bara tí tú dámar tað navnið betri. Ella tí at “hon sær út sum ein Rebekka”. Eisini sjálvt um hon
<em>hevur</em> navnið “Rebekka” á hennara dópsváttan, men hon absolutt hatar tað og vil heldur brúka “Maria”.
Tað er akkurát tað sama við fornøvnum - um tú ikki vilt verða ófólkaligur ímóti onkrum, so kallar tú tey fyri
tað tey ynskja. Einasti munurin er at vanliga vita vit nøvnini hjá fólki, men ikki fornøvnini, tí tá vit
fortelja onnur um okkum sjálvi, so byrja vit við okkara navn, men siga ikki okkara fornøvn. Lat okkum broyta
tað!
pronouns: 'Listi av ofta brúktum fornøvnum'
generator:
header: 'Generator'
@ -352,24 +351,25 @@ faq:
question: 'Hvussu kann eg vita hvussu eg skal umrøða onkran?'
answer:
- >
Tú kanst spyrja! Ja, tað kann virka eitt sindur píniligt, men jú meira vit gera tað jú minni píniligt er tað.
Um vit kunna spyrja onkran um teirra navn, hví so ikki eisini um teirra fornøvn?
Tú kanst spyrja! Ja, tað kann virka eitt sindur píniligt, men jú meira vit gera tað jú minni píniligt
er tað. Um vit kunna spyrja onkran um teirra navn, hví so ikki eisini um teirra fornøvn?
- >
(Bara ikki spyr um “ert tú ein drongur ella ein genta?”.
Hesin spurningurin sipar til at har eru bert tvey møgulig røtt svør,
og tá sipar eisini til eitt ússaligt forvitni um kynsgøgnini hjá fólki.
(Bara ikki spyr um “ert tú ein drongur ella ein genta?”. Hesin spurningurin sipar til at har eru bert
tvey møgulig røtt svør, og tað sipar eisini til eitt ússaligt forvitni um kynsgøgnini hjá fólki.
Ístaðin kundi tú spurt “hvat eru tíni fornøvn?” ella “hvussu vilt tú at eg umrøði teg?”)
- >
Tað er eisini týdningarmiki at gera tað normalt at fortelja fólk tíni fornøvn tá tú fortelur teimum títt navn.
“Hey, eg eiti Jákup, {/hann=hann/hansara}”. Tað er ikki torført - men fyri tvørkynd og ikki-biner fólk betýðir tað so nógv!
Tað er enn nemmari á netinum: bara koyr tíni fornøvn (ella eina leinkju til dømir frá okkara heimasíðu) á tín vanga.
Tað er eisini týdningarmiki at gera tað normalt at fortelja fólk tíni fornøvn tá tú fortelur teimum
títt navn. “Hey, eg eiti Jákup, {/hann=hann/hansara}”. Tað er ikki torført - men fyri tvørkynd og
ikki-biner fólk betýðir tað so nógv! Tað er enn nemmari á netinum: bara koyr tíni fornøvn (ella eina
leinkju til dømir frá okkara heimasíðu) á tín vanga.
- >
Minst eisini til at fleiri fólk kunnu brúka ymiskt nøvn og ymiskt fornøvn alt eftur støðuna.
Tey eru kanska ikki komin út millum øll vinfólk ella arbeiðsfelagir enn, men millum tætt vinfólk kenna tey seg trygg at liva teirra sannleika.
Hugsa teg um. Tú kundi tildømis spurt tey “hvørji fornøvn skal eg brúka frammanfyri stjóranum hjá tær”, o.s.fv..
Minst eisini til at fleiri fólk kunnu brúka ymiskt nøvn og ymiskt fornøvn alt eftur støðuna. Tey eru
kanska ikki komin út millum øll vinfólk ella arbeiðsfelagir enn, men millum tætt vinfólk kenna tey
seg trygg at liva teirra sannleika. Hugsa teg um. Tú kundi tildømis spurt tey “hvørji fornøvn skal eg
brúka frammanfyri stjóranum hjá tær”, o.s.fv..
- >
Summi fólk geva fleiri fornøvn, t.d. “{/hann&hon=hann/hon}” ella “{/tey&hann=tey/hann}”.
Tað merkjir at tey dáma øll tey fornøvnini sum tey nevnað. Vanliga er tað fyrsta tað tey dáma best.
Summi fólk geva fleiri fornøvn, t.d. “{/hann&hon=hann/hon}” ella “{/tey&hann=tey/hann}”. Tað merkjir
at tey dáma øll tey fornøvnini sum tey nevnað. Vanliga er tað fyrsta tað tey dáma best.
who-uses-it:
question: 'Brúkar nakar yvirhøvur tað?'
answer:
@ -393,22 +393,23 @@ faq:
question: 'Hví skal eg hava míni fornøvn á mínum vanga á sosialu miðlunum?'
answer:
- >
Um tú ert viðkynd (= ikki tvørkynd) og tú brúkar “{/hann=hann}” ella “{/hon=hon} sum samsvara við títt kyn,
so heldur tú kanska at tað er <em>sjálvsagd</em> hvat tíni fornøvn eru.
Og ja, tað passar kanska - so leingi sum títt navn er á tínum vanga (og er, eftir siðvenju, kallkyn ella kvennkyn)
ella um tú hevur eina mynd av tær sum tín vangamynd.
Fleiri fólk hava ikki tað - so tað er torført at gita hvussu tey vilja vera umrødd.
Um tú ert viðkynd (= ikki tvørkynd) og tú brúkar “{/hann=hann}” ella “{/hon=hon}" sum samsvara við
títt kyn, so heldur tú kanska at tað er <em>sjálvsagd</em> hvat tíni fornøvn eru. Og ja, tað passar
kanska - so leingi sum títt navn er á tínum vanga (og er, eftir siðvenju, kallkyn ella kvennkyn) ella
um tú hevur eina mynd av tær sum tín vangamynd. Fleiri fólk hava ikki tað - so tað er torført at gita
hvussu tey vilja vera umrødd.
- >
Men tað handlar faktist meira um okkurt annað: tíni fornøvn eru kanska “sjálvsøgd”, men har eru fleiri fólk hvar teirra fornøvn ikki eru tað.
Tey vilja vera umrødd rætt, líkamikið um tey “passað” sum teirra kyn ella ei,
líkamikið um tey hava gjørt kropsligt kynsskifti (ella um tey yvirhøvur vilja gera kropsligt kynsskifti).
Ikki-biner fólk plaga ikki at “síggja út sum ikki-biner”, vit skylda ongum androgyni.
Men tað handlar faktist meira um okkurt annað: tíni fornøvn eru kanska “sjálvsøgd”, men har eru
fleiri fólk hvar teirra fornøvn ikki eru tað. Tey vilja vera umrødd rætt, líkamikið um tey “passað”
sum teirra kyn ella ei, líkamikið um tey hava gjørt kropsligt kynsskifti (ella um tey yvirhøvur vilja
gera kropsligt kynsskifti). Ikki-biner fólk plaga ikki at “síggja út sum ikki-biner”, vit skylda
ongum androgyni.
- >
At deila okkara fornøvn hevur stóra týdning fyri tvørkynd, ikki-biner og fólk ið víkja frá kyn.
Tíanverri so avdúkar tað okkum.
Men um viðkynd fólk gera tað sama, hevði tað merkt so nógv fyri okkum.
Tað gerð okkum meira tilpass, trygg, og vælkomin.
{https://avris.it/blog/why-everyone-should-have-pronouns-in-their-bio=(fleiri grundgevingar her, á enskum).}
Tíanverri so avdúkar tað okkum. Men um viðkynd fólk gera tað sama, hevði tað merkt so nógv fyri
okkum. Tað gerð okkum meira tilpass, trygg, og vælkomin.
{https://avris.it/blog/why-everyone-should-have-pronouns-in-their-bio=(fleiri grundgevingar her, á
enskum).}
change:
question: 'Kann eg broyta míni fornøvn?'
answer:
@ -463,24 +464,28 @@ faq:
Sjálvt um tú ert ein persónur, sum loysir tær størstu avbjóðingarnar sum menniskjað hevur,
kanst tú nemt klára at ikki vera transfobisk meðan tú loysir tær avbjóðingarnar.
why-two-forms:
question: 'Hví eru fornøvn vanliga givin ið tveimum formum, sum "hann/hansara", ístaðin fyri "hann" ella allar formarnar?'
question: >
Hví eru fornøvn vanliga givin í tveimum formum, sum "hann/hansara", ístaðin fyri "hann" ella allar
formarnar?
answer:
- >
Á føroyskum eru har 4 formar av persónlig fornøvn, so um vit vilja verða presis mugu vit siga allar formarnar, til dømis: "tey/tey/teimum/teirra" ella "hon/hana/henni/hennara".
Tað er longu <em>nógv</em> at koyra í tín vanga ella at siga tá tú navnkennir teg, og summi mál hava nógv meira enn tað. (td. á pólskum {https://zaimki.pl/jak-dzia%C5%82aj%C4%85-zaimki=eru tað upp til 12 formar av persónlig fornøvn}, og eisini fleiri ymiskar endingar).
Men oftast er alt tað ikki neygut at forklára hvørjaferð, tí alt kann nemt verða "kroyst" til bara "hon" ella "hann" ella "tað" o.s.v..
Á føroyskum eru har 4 formar av persónlig fornøvn, so um vit vilja verða presis mugu vit siga allar
formarnar, til dømis: "tey/tey/teimum/teirra" ella "hon/hana/henni/hennara". Tað er longu
<em>nógv</em> at koyra í tín vanga ella at siga tá tú navnkennir teg, og summi mál hava nógv meira
enn tað. (td. á pólskum {https://zaimki.pl/jak-dzia%C5%82aj%C4%85-zaimki=eru tað upp til 12 formar av
persónlig fornøvn}, og eisini fleiri ymiskar endingar). Men oftast er alt tað ikki neygut at forklára
hvørjaferð, tí alt kann nemt verða "kroyst" til bara "hon" ella "hann" ella "tað" o.s.v..
- >
Tó, á hinari hondini, at minka tað til bert ein form kann gera at tað manglar kontekst.
Um ein persónurin bara sær "hinn" á vanganum hjá onkrum, og tey kenna ikki til nýfornavnið “{/hinn=hinn/hinnara}”, so kann tað verða torført at skilja hvat "hinn" skal merkja.
Tað er blivi heilt vanligt at "xxx/yyy" merkjir fornøvn -
so har er ein góður kjansur at tá onkur sær "hinn/hinnara" so skilja tey beinavegin at tað er fornøvnini hjá persóninum.
# - >
# Adding a second (or sometimes third) form also clears up some ambiguities,
# eg. between {/ze/hir=ze/hir} and {/ze/zir=ze/zir} or between {/e/em/eir=e/em/eir} and {/e/em/es=e/em/es}.
Tó, á hinari hondini, at minka tað til bert ein form kann gera at tað manglar kontekst. Um ein
persónurin bara sær "hinn" á vanganum hjá onkrum, og tey kenna ikki til nýfornavnið
“{/hinn=hinn/hinnara}”, so kann tað verða torført at skilja hvat "hinn" skal merkja. Tað er blivi
heilt vanligt at "xxx/yyy" merkjir fornøvn - so har er ein góður kjansur at tá onkur sær
"hinn/hinnara" so skilja tey beinavegin at tað er fornøvnini hjá persóninum.
- >
Í stuttum, so er standardin at hava tveir formar ein kompromis millum at hava tað stutt og samstundis at tá er klárt at talan er um fornøvn.
Siðvenjan hevur uppruna í enskum, men er blivin so væl umtókt at hon er endað í fleiri onnur mál, til dømis føroyskum (tó á portugiskiskum siga fólk vanligvís tríggjar formar).
Vit brúka enntá skrástrikuna (<code>( / )</code>) í {/logo=okkara búmerkið}.
Í stuttum, so er standardin at hava tveir formar ein kompromis millum at hava tað stutt og samstundis
at tá er klárt at talan er um fornøvn. Siðvenjan hevur uppruna í enskum, men er blivin so væl umtókt
at hon er endað í fleiri onnur mál, til dømis føroyskum (tó á portugiskiskum siga fólk vanligvís
tríggjar formar). Vit brúka enntá skrástrikuna (<code>( / )</code>) í {/logo=okkara búmerkið}.
flags:
question: 'Kunnu tit leggja hetta flaggið afturat? Kunnu tit taka hata flaggið av?'
answer:
@ -518,14 +523,14 @@ faq:
question: 'Er har ein pronouns.page app til telefonina?'
answer:
- >
At gera ein app ið riggar á øllum telefonum krevur nógv arbeiði,
og í hesari løtu hava vit valt at fokusera uppá onnur ting.
At gera ein app ið riggar á øllum telefonum krevur nógv arbeiði, og í hesari løtu hava vit valt at
fokusera uppá onnur ting.
- >
Men hendan heimasíðan er ein {https://web.dev/learn/pwa/progressive-web-apps/="Progressive Web App"},
sum vil siga at tú kanst taka heimasíðuna niður á tína telefon sum eina app
og tað kemur til at rigga <em>næstan<7em> akkurát líka sum ein vanlig app. 😉
sum vil siga at tú kanst taka heimasíðuna niður á tína telefon sum eina app og tað kemur til at rigga
<em>næstan</em> akkurát líka sum ein vanlig app. 😉
unlisted-cards:
question: 'Kan okkurt leita eftur mínum kortum?'
question: 'Kann okkurt leita eftur mínum kortum?'
answer:
- >
Vit útgeva ikki nakrar listar yvir brúkaranøvn sum onkur kann brúka at leita ígjøgnum ella opna ein eftir ein.
@ -547,15 +552,13 @@ faq:
so verður tað leinki markera við eitt íkon av einum skjøldri ([shield-check]).
Tað fer eisini at hava eitt <code>rel="me"</code> merki, so at tænastur so sum Mastodon kunnu vátta tað hinuvegin runt eisini.
mutiple-cards:
question: 'Kann eg hava fleiri kort á sama máli undir einum brúkara?'
answer:
- >
Tað er nokk tann mest efturspurda møguleikan vit hava fyngi! 😅
Vit eru heilst sikkurt opin til hugskoti, tað hevði hjálp systemir
ella fólk sum vilja hava ymiskt kort fyri mara almenna nýstlu ella fyri tætt vinfólk.
Tíanverri krevur hendan møguleikan <em>nógvar</em> broytingar í kotuna og eisini testing.
Vit fara at prøva at ráðfesta tað høgt, men vit hava eina rúgvu av annað arbeiði, so vit kunnu ikki siga nakað spesifikt dato.
Tað er nokk tann mest efturspurda møguleikan vit hava fyngi! 😅 Vit eru heilt sikkurt opin til
hugskoti, tað hevði hjálp systemir ella fólk sum vilja hava ymiskt kort fyri teirra almenna nýstlu
ella fyri tætt vinfólk. Tíanverri krevur hendan møguleikan <em>nógvar</em> broytingar í kotuna og
eisini testing. Vit fara at prøva at ráðfesta tað høgt, men vit hava eina rúgvu av annað arbeiði, so
vit kunnu ikki siga nakað spesifikt dato.
# customise-opinions:
# question: 'Can I customise the “legend/opinions” field even more?'
# answer:
@ -638,17 +641,16 @@ contact:
header: 'Samband'
authors: 'Umsitarar av heimasíðuni'
groups:
all: ''
calendar: 'Kvir Kalendara Bottur'
shop: 'Fylgivøra'
faq: >
Aðrenn tú skrivar til okkum, <strong>hygg eftir okkara</strong> {/oss=<strong>O.S.S.</strong>} - møguliga er svarið til tín spurning longu har.
technical: >
Sært tú <strong>ein feil</strong> ella hevur tú ein tekniskan spurning?
Vinarliga skriva títt brúkaranavn og <strong>so nógvar upplýsingar sum møguligt</strong> í tíni boð
(hvat sigur feilboðið? Ert tú á tínari telefon ella teldu? Hvønn kaga brúkar tú? Hvat skulu vit gera fyri at fáa sama feilin? Kanst tú viðhefta eina skíggjamynd ella skíggjaupptøku? o.s.fv.)
Prøva eisini at <strong>sløkkja fyri kagavíðkanir</strong> sum møguliga bróta síðuna
(t.d. Lýsingaforðarar kunnu koma til at fjerna okkurt sum ikki er ein lýsing) og hygg um tað hjálpur.
Sært tú <strong>ein feil</strong> ella hevur tú ein tekniskan spurning? Vinarliga skriva títt brúkaranavn og
<strong>so nógvar upplýsingar sum møguligt</strong> í tíni boð (hvat sigur feilboðið? Ert tú á tínari telefon
ella teldu? Hvønn kaga brúkar tú? Hvat skulu vit gera fyri at fáa sama feilin? Kanst tú viðhefta eina skíggjamynd
ella skíggjaupptøku? o.s.fv.) Prøva eisini at <strong>sløkkja fyri kagavíðkanir</strong> sum møguliga bróta
síðuna (t.d. lýsingaforðarar kunnu koma til at fjerna okkurt sum ikki er ein lýsing) og hygg um tað hjálpur.
hate: >
Vilt tú senda okkum kvirfobiskan hatursmail?
Gev bara upp, vit samskifta ikki við trøll.
@ -854,14 +856,11 @@ profile:
ipa: 'Framburður við IPA (altjóða ljóðstavraðið)'
pronouns: 'Fornøvn'
pronounsInfo: >
Tú kanst skriva eitt <strong>fornavn</strong> (t.d. “tey” ella “hon/hennara”)
ella eina <strong>leinku</strong> (t.d. “https://en.pronouns.page/e”)
ella tey fimm formarnar (t.d. “ze/zem/zir/zirs/zirself”).
Minst til at <strong>allar fimm formarnar</strong> eru kravdar í tí førinum,
annars kann funkan bert gita hvat tú meinar við.
Tú kanst eisini brúka {/fornøvn#generator=<strong>generatorin</strong>} og skriva setningar við formunum.
Um tíni fornøvn fylgja {/fornøvn#nameself=<strong>teysjálv mynstrinum</strong>},
kanst tú eisini brúka kolon styttingina (t.d. “:stjørna”).
Tú kanst skriva eitt <strong>fornavn</strong> (t.d. “tey” ella “hon/hennara”) ella eina <strong>leinku</strong>
(t.d. “https://fo.pronouns.page/hann”) ella tær fýra formarnar og fimm endingar (t.d.
"ze/zirs/zir/zira/ur/a/ur/ur”). Minst til at <strong>allar fýra formarnar og fimm endingar</strong> eru kravdar í
tí førinum, annars kann funkan bert gita hvat tú meinar við. Tú kanst eisini brúka
{/fornøvn#generator=<strong>generatorin</strong>} og skriva setningar við formunum.
pronounsNotFound: 'Ókent format. Vinarliga les vegleiðingarnar omanfyri.'
words: 'Orð'
wordsColumnHeader: 'Teigshøvd'
@ -909,7 +908,7 @@ profile:
Okkara leinkjur hava eisini eitt <code>rel=”me”</code> merkið, so at arðar heimasíður kunnu vátta títt kort eisini.
column: 'Súla'
opinions:
header: 'Frágreiðing/meiningar'
header: 'Frágreiðingar/meiningar'
description: 'Lýsing…'
colours:
_: '(Lit á stavsnið…)'
@ -973,13 +972,12 @@ profile:
circles:
header: 'Mín skari'
info: >
Í hesum feltinium kanst tú nevna <strong>tíni nærmastu</strong, saman við upplýsing
um hvørji (ikki-)kynja orð tú brúkar at umtalað tey (td. “Hjúnafelagi”, “kona”, “maður”).
Vit eru ikki ein sosialur miðil, hettar er <strong>ikki ein vinir/fylgjarar listi</strong>,
tí er longdin á hesum feltinum rættiliga avmarkað.
Hav í huga at fólkini sum tú nevnir her <strong>kunnu síggja tað</strong>
- og kunnu meldað teg til okkum fyri plágan, um tú velur at skriva neilig ting um tey.
Felagssambond í tínum skarað verða merkt við [s:shield-check].
Í hesum feltinium kanst tú nevna <strong>tíni nærmastu</strong>, saman við upplýsing um hvørji (ikki-)kynja
orð tú brúkar at umtalað tey (td. “Hjúnafelagi”, “kona”, “maður”). Vit eru ikki ein sosialur miðil, hettar er
<strong>ikki ein vinir/fylgjarar listi</strong>, tí er longdin á hesum feltinum rættiliga avmarkað. Hav í
huga at fólkini sum tú nevnir her <strong>kunnu síggja tað</strong> - og kunnu meldað teg til okkum fyri
plágan, um tú velur at skriva neilig ting um tey. Felagssambond í tínum skarað verða merkt við
[s:shield-check].
relationship: 'Samband (t.d. “maki”, “besti vinur”)'
mutual: 'Hettar er eitt felagssamband'
yourMentions:
@ -1044,11 +1042,11 @@ profile:
header: 'Kalendari'
info:
- >
Í hettar økið kanst tú stovnað tín egna kalendara, sum verður vístur á tínum kortið og kann koyrast í tín kalendara app.
Í hettar økið kanst tú stovnað tín egna kalendara, sum verður vístur á tínum kortið og kann koyrast í tín
kalendara app.
- >
Vel frá listanum av almenst hátíðarhildnar hendingar úr kvir-kalendaranum,
ella legg tínar egnu persónligu kvir-hendingar:
so sum ársdagin tú komst út, byrjaði HRT, broytti navn, o.s.fv.
Vel frá listanum av alment hátíðarhildnar hendingar úr kvir-kalendaranum, ella legg tínar egnu persónligu
kvir-hendingar: so sum ársdagin tú komst út, byrjaði HRT, broytti navn, o.s.fv.
customEvents:
header: 'Sergjørdar/persónligar hendingar'
disclaimer: 'Hettar er ein sergjørd hending stovnað av eigaranum av kortinum'
@ -1120,8 +1118,7 @@ search:
noResults: 'Eingin úrslit vóru funnin fyri: “%query%”'
footer:
license: >
{https://gitlab.com/PronounsPage/PronounsPage=Keldu kota} og innihald eru loyvi undir {/license=OQL}.
license: '{https://gitlab.com/PronounsPage/PronounsPage=Keldu kota} og innihald eru undir {/license=OQL} loyvinum.'
using: >
Brúkar {https://www.gradientmagic.com/=gradientmagic.com} og {https://fonts.google.com/noto/specimen/Noto+Color+Emoji=Noto Color Emoji}
links: 'Samband, sosialir miðlar'
@ -1360,7 +1357,7 @@ quotation:
localise:
shorter: 'Legg aftrat'
short: 'Legg aftrat málútgávur'
long: 'Vilt tú gera eina málútgáva? Feitt! Vinarliga hygg her'
long: 'Vilt tú gera eina málútgávu? Feitt! Vinarliga hygg eftir'
longLink: 'hesa vegleiðingina!'
images:

View File

@ -733,7 +733,6 @@ contact:
design:
header: 'Linee guida e risorse di progettazione'
groups:
all: ''
calendar: 'Bot del Calendario Queer'
shop: 'Merce'

View File

@ -361,7 +361,6 @@ contact:
header: '連絡先'
authors: 'ウェブサイトの作者'
groups:
all: ''
shop: 'グッズ'
language: '国際的なチームですから、各言語版の作者とあなたのメッセージを読む人とは、同じではないかもしれません。可能な限り、<strong>英語またはポーランド語</strong>でご連絡ください。'
team:

View File

@ -656,7 +656,6 @@ contact:
header: 'Kontakt'
authors: 'Forfatterne'
groups:
all: ''
calendar: 'Skeivekalender-botten'
shop: 'Butikk'
faq: >

View File

@ -652,7 +652,6 @@ contact:
header: 'Kontakt'
authors: 'Forfattarane'
groups:
all: ''
calendar: 'Skeivekalender-botten'
shop: 'Butikk'
faq: >

View File

@ -103,9 +103,6 @@ export default [
// marsze i eventy 2024
...await loadMiastaMaszerujace(2024),
// marsze i eventy 2025
...await loadMiastaMaszerujace(2025),
new Event('{https://www.facebook.com/events/977716850062577=Parada Równości w Warszawie} (kolektyw Praga Równości)', 'LGBTQ', 6, dayYear(8, 2024), EventLevel.Day),
// already included in miastamaszerujace
// new Event('{https://www.paradarownosci.pl/=Parada Równości w Warszawie} (Fundacja Wolontariat Równości)', 'LGBTQ', 6, dayYear(15, 2024), EventLevel.Day),
@ -113,6 +110,10 @@ export default [
new Event('{https://dzientrans.pl/=Drugi Ogólnopolski Dzień Widoczności Osób Transpłciowych}', 'Transgender', 4, dayYear(13, 2024), EventLevel.Day),
// marsze i eventy 2025
...await loadMiastaMaszerujace(2025),
new Event('{https://www.paradarownosci.pl/=Parada Równości w Warszawie}', 'LGBTQ', 6, dayYear(14, 2025), EventLevel.Day),
// --- dynamic date ---
// last Friday of October

View File

@ -27,6 +27,23 @@ const xDeclension = new NounDeclension({
W_pl: 'xx',
});
const xTkaDeclension = new NounDeclension({
M: 'txa',
D: 'txi',
C: 'txe',
B: 'txę',
N: 'txą',
Msc: 'txe',
W: 'tx',
M_pl: 'txx',
D_pl: 'txx',
C_pl: 'txx',
B_pl: 'txx',
N_pl: 'txx',
Msc_pl: 'txx',
W_pl: 'txx',
});
const { $translator: translator } = useNuxtApp();
const config = useConfig();
@ -45,7 +62,7 @@ const xNouns = [
mascPl: 'astronauci',
femPl: 'astronautki',
neutrPl: 'astronautxx',
declension: xDeclension,
declension: xTkaDeclension,
}),
new Noun(config, {
id: 'Europejczyk',

View File

@ -4,7 +4,8 @@ import { useNuxtApp } from 'nuxt/app';
import NounsNav from './NounsNav.vue';
import useConfig from '~/composables/useConfig.ts';
import { Noun, type Source, SourceLibrary } from '~/src/classes.ts';
import { Noun, SourceLibrary } from '~/src/classes.ts';
import type { Source } from '~/src/classes.ts';
const { $translator: translator } = useNuxtApp();
useSimpleHead({

View File

@ -1310,7 +1310,6 @@ contact:
header: 'Kontakt'
authors: '{/neutratywy#autor=Autorza} strony'
groups:
all: ''
polish: 'Polskojęzyczne'
calendar: 'Bot kalendarza'
shop: 'Mercz'

View File

@ -544,7 +544,6 @@ contact:
design:
header: 'Рекомендации по дизайну и другие ресурсы'
groups:
all: ''
calendar: 'Квир Календарь бот'
shop: 'Мерч'

View File

@ -80,7 +80,6 @@ contact:
header: 'o toki tawa mi'
authors: 'jan mama lipu'
groups:
all: ''
shop: 'o esun'
faq: >
sina wile e sona la, nanpa wan la o lukin e {/faq=lipu pi sona suli}. sona wile li lon ala la o toki tawa mi.

View File

@ -578,7 +578,6 @@ contact:
header: 'İletişim'
authors: 'Websitenin yazarları'
groups:
all: ''
calendar: 'Queer Takvim Botu'
shop: 'Mağaza'
faq: >

View File

@ -452,7 +452,6 @@ contact:
header: 'Liên hệ'
authors: 'Những tác giả của trang web này'
groups:
all: ''
calendar: 'Bot Lịch Đồng tính'
faq: >
Trước khi bạn gửi tin nhắn, hãy <strong>xem</strong> mục {/faq=<strong>Câu hỏi thường gặp</strong>} của chúng tôi có thể câu trả lời cho câu hỏi của bạn đã có sẵn ở đó rồi.

View File

@ -26,6 +26,7 @@
"@sentry/node": "^7.109.0",
"abort-controller": "^3.0.0",
"canvas": "^3.1.0",
"clipboard": "^2.0.11",
"feed": "^4.2.2",
"generic-diff": "^1.0.1",
"grant": "^5.4.22",
@ -63,7 +64,7 @@
"@nuxt/eslint": "^1.2.0",
"@nuxt/test-utils": "^3.17.2",
"@nuxtjs/plausible": "^1.2.0",
"@pinia/nuxt": "^0.9.0",
"@pinia/nuxt": "^0.11.0",
"@playwright/test": "^1.50.0",
"@rollup/plugin-yaml": "^4.1.2",
"@sentry/types": "^7.109.0",
@ -95,14 +96,13 @@
"bootstrap": "^5.3.1",
"chart.js": "4.4.8",
"eslint": "^9.22.0",
"eslint-formatter-gitlab": "^5.1.0",
"eslint-formatter-gitlab": "^6.0.0",
"eslint-plugin-json-schema-validator": "^5.1.3",
"eslint-plugin-jsonc": "^2.19.1",
"eslint-plugin-yml": "^1.17.0",
"execa": "^9.5.2",
"express": "^4.17.1",
"express-session": "^1.17.1",
"globals": "^13.24.0",
"h3-express": "https://github.com/pixunil/h3-express#built",
"html-validate": "^9.2.2",
"ioredis": "^5.6.0",
@ -111,7 +111,7 @@
"markdown-it-sub": "^2.0.0",
"markdown-it-sup": "^2.0.0",
"marked": "^0.7.0",
"nuxt": "^3.17.1",
"nuxt": "^3.17.2",
"path-to-regexp": "0.1.12",
"postcss-rtl": "^2.0.0",
"qr-code-styling": "1.6.0-rc.1",
@ -121,7 +121,7 @@
"typescript": "^5.8.3",
"vitest": "^3.1.2",
"vue-component-type-helpers": "^2.1.6",
"vue-tsc": "^2.2.8",
"vue-tsc": "^2.2.10",
"vuedraggable": "^4.1.0"
},
"packageManager": "pnpm@10.4.1+sha256.4b702887986995933d4300836b04d6d02a43bc72b52e4f7e93a4ca608b959197",

View File

@ -2,8 +2,10 @@
import { useDebounce, useLocalStorage } from '@vueuse/core';
import marked from 'marked';
import { extractMetadata, type Post } from '~/src/blog/metadata.ts';
import parseMarkdown, { type MarkdownInfo } from '~/src/parseMarkdown.ts';
import { extractMetadata } from '~/src/blog/metadata.ts';
import type { Post } from '~/src/blog/metadata.ts';
import parseMarkdown from '~/src/parseMarkdown.ts';
import type { MarkdownInfo } from '~/src/parseMarkdown.ts';
const content = useLocalStorage(
'admin/blog/editor',

View File

@ -223,7 +223,7 @@ const impersonate = async (email: string) => {
:locale
icon="book"
header="Dictionary"
:link="`/${config.nouns.route}`"
:link="`/${encodeURIComponent(config.nouns.route)}`"
:counts="[
{ count: stats.locales[locale].nouns.approved },
{ name: 'awaiting', count: stats.locales[locale].nouns.awaiting, warning: 1, danger: 16 },
@ -235,7 +235,7 @@ const impersonate = async (email: string) => {
:locale
icon="book-heart"
header="Inclusive"
:link="`/${config.inclusive.route}`"
:link="`/${encodeURIComponent(config.inclusive.route)}`"
:counts="[
{ count: stats.locales[locale].inclusive.approved },
{ name: 'awaiting', count: stats.locales[locale].inclusive.awaiting, warning: 1, danger: 16 },
@ -247,7 +247,7 @@ const impersonate = async (email: string) => {
:locale
icon="flag"
header="Terminology"
:link="`/${config.terminology.route}`"
:link="`/${encodeURIComponent(config.terminology.route)}`"
:counts="[
{ count: stats.locales[locale].terms.approved },
{ name: 'awaiting', count: stats.locales[locale].terms.awaiting, warning: 1, danger: 16 },
@ -259,7 +259,7 @@ const impersonate = async (email: string) => {
:locale
icon="books"
header="Sources"
:link="`/${config.sources.route}`"
:link="`/${encodeURIComponent(config.sources.route)}`"
:counts="[
{ count: stats.locales[locale].sources.approved },
{ name: 'awaiting', count: stats.locales[locale].sources.awaiting, warning: 1, danger: 16 },
@ -271,7 +271,7 @@ const impersonate = async (email: string) => {
:locale
icon="signature"
header="Names"
:link="`/${config.names.route}`"
:link="`/${encodeURIComponent(config.names.route)}`"
:counts="[
{ count: stats.locales[locale].names.approved },
{ name: 'awaiting', count: stats.locales[locale].names.awaiting, warning: 1, danger: 16 },
@ -284,7 +284,9 @@ const impersonate = async (email: string) => {
icon="pen-nib"
header="Blog"
>
<nuxt-link :to="{ name: 'admin-blog-editor' }" class="btn btn-sm btn-secondary text-white">Editor</nuxt-link>
<LocaleLink link="/admin/blog/editor" class="btn btn-sm btn-secondary text-white" :locale>
Editor
</LocaleLink>
</AdminDashboardCard>
<AdminDashboardCard
v-if="stats && $isGranted('translations', locale) && (stats.locales[locale].translations.missing > 0 || stats.locales[locale].translations.awaitingApproval > 0) || stats && $isGranted('code', locale) && stats.locales[locale].translations.awaitingMerge > 0"

View File

@ -12,8 +12,8 @@ import {
MONTHS as months,
AREAS as areas,
TRANSFER_METHODS as transferMethods,
type TimesheetData, type Timesheet,
} from '~/src/timesheets.ts';
import type { TimesheetData, Timesheet } from '~/src/timesheets.ts';
const { $translator: translator } = useNuxtApp();
const dialogue = useDialogue();

View File

@ -1,9 +1,11 @@
<script setup lang="ts">
import { DateTime, type DurationInput } from 'luxon';
import { DateTime } from 'luxon';
import type { DurationInput } from 'luxon';
import { useNuxtApp } from 'nuxt/app';
import useSimpleHead from '~/composables/useSimpleHead.ts';
import { min, max, MONTHS, PERIODS, type TimesheetData } from '~/src/timesheets.ts';
import { min, max, MONTHS, PERIODS } from '~/src/timesheets.ts';
import type { TimesheetData } from '~/src/timesheets.ts';
function* range(start: number, end: number) {
for (let i = start; i <= end; i++) {

View File

@ -12,7 +12,8 @@ import { getUrlForLocale } from '~/src/domain.ts';
import { buildFlags } from '~/src/flags.ts';
import { sleep } from '~/src/helpers.ts';
import opinions from '~/src/opinions.ts';
import { applyProfileVisibilityRules, type UserWithProfiles, type Profile } from '~/src/profile.ts';
import { applyProfileVisibilityRules } from '~/src/profile.ts';
import type { UserWithProfiles, Profile } from '~/src/profile.ts';
definePageMeta({
translatedPaths: (config) => {

328
pnpm-lock.yaml generated
View File

@ -38,6 +38,9 @@ importers:
canvas:
specifier: ^3.1.0
version: 3.1.0
clipboard:
specifier: ^2.0.11
version: 2.0.11
feed:
specifier: ^4.2.2
version: 4.2.2
@ -145,8 +148,8 @@ importers:
specifier: ^1.2.0
version: 1.2.0(magicast@0.3.5)
'@pinia/nuxt':
specifier: ^0.9.0
version: 0.9.0(magicast@0.3.5)(pinia@2.3.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)))
specifier: ^0.11.0
version: 0.11.0(magicast@0.3.5)(pinia@3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)))
'@playwright/test':
specifier: ^1.50.0
version: 1.50.0
@ -241,8 +244,8 @@ importers:
specifier: ^9.22.0
version: 9.22.0(jiti@2.4.2)
eslint-formatter-gitlab:
specifier: ^5.1.0
version: 5.1.0(eslint@9.22.0(jiti@2.4.2))
specifier: ^6.0.0
version: 6.0.0(eslint@9.22.0(jiti@2.4.2))
eslint-plugin-json-schema-validator:
specifier: ^5.1.3
version: 5.1.3(eslint@9.22.0(jiti@2.4.2))
@ -261,9 +264,6 @@ importers:
express-session:
specifier: ^1.17.1
version: 1.18.0
globals:
specifier: ^13.24.0
version: 13.24.0
h3-express:
specifier: https://github.com/pixunil/h3-express#built
version: https://codeload.github.com/pixunil/h3-express/tar.gz/0dd96342062c6190cc50101e7b48480587ca9582
@ -289,8 +289,8 @@ importers:
specifier: ^0.7.0
version: 0.7.0
nuxt:
specifier: ^3.17.1
version: 3.17.1(@parcel/watcher@2.5.1)(@types/node@22.13.14)(db0@0.3.2(sqlite3@5.1.7))(encoding@0.1.13)(eslint@9.22.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(sqlite3@5.1.7)(terser@5.33.0)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.8(typescript@5.8.3))(yaml@2.7.0)
specifier: ^3.17.2
version: 3.17.2(@parcel/watcher@2.5.1)(@types/node@22.13.14)(db0@0.3.2(sqlite3@5.1.7))(encoding@0.1.13)(eslint@9.22.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(sqlite3@5.1.7)(terser@5.33.0)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.7.0)
path-to-regexp:
specifier: 0.1.12
version: 0.1.12
@ -319,8 +319,8 @@ importers:
specifier: ^2.1.6
version: 2.1.6
vue-tsc:
specifier: ^2.2.8
version: 2.2.8(typescript@5.8.3)
specifier: ^2.2.10
version: 2.2.10(typescript@5.8.3)
vuedraggable:
specifier: ^4.1.0
version: 4.1.0(vue@3.5.13(typescript@5.8.3))
@ -529,8 +529,8 @@ packages:
resolution: {integrity: sha512-qA2diK3d/ztC8HUb7NwPKbJRV01NpzTzxFn+L5G3HzJBNeKbjLcprQ/9uG9gp2UEx2Go782FI1ddrMNa0qBICA==}
engines: {node: '>=16.0.0'}
'@babel/code-frame@7.26.2':
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
'@babel/compat-data@7.26.8':
@ -619,8 +619,8 @@ packages:
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
'@babel/helper-validator-identifier@7.27.1':
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-option@7.25.9':
@ -1802,12 +1802,12 @@ packages:
vite-plugin-eslint2:
optional: true
'@nuxt/kit@3.17.1':
resolution: {integrity: sha512-VG3NlK51jzNNZ9+VIVMwN2YgDddkCkdZRJv0KMs63Z81UQo1FfEwzapqUiV23SWkyyfNSD/1XGarYPOl30J39g==}
'@nuxt/kit@3.17.2':
resolution: {integrity: sha512-Mz2Ni8iUwty5LBs3LepUL43rI2xXbuAz3Cqq37L9frOD2QI2tQUtasYaSoKk6U7nvYzuW2z/2b3YOLkMNi/k2w==}
engines: {node: '>=18.12.0'}
'@nuxt/schema@3.17.1':
resolution: {integrity: sha512-FmPMyfexkZ0bp7rDz+012/ee9rEHPAZ3P8alOZrCV9j/xPcjuKspcLWGZz4kAoJA7nnx49kpRUcS2rpYcBRV+A==}
'@nuxt/schema@3.17.2':
resolution: {integrity: sha512-DzmvgqcfIoCkNKXrBU6wpGckIXSxHHU+7OTlE68qNq6y0lVYnUA0Akrn0I8j+n/vFdQTIpJXiRD4dAgcomsBAg==}
engines: {node: ^14.18.0 || >=16.10.0}
'@nuxt/telemetry@2.6.6':
@ -1851,8 +1851,8 @@ packages:
vitest:
optional: true
'@nuxt/vite-builder@3.17.1':
resolution: {integrity: sha512-gtayw5+6Wx94FLUyJ+TAR27iLd7PqXYy1c9Yefam+wVhllYr9bpWLmM1pOQisujdm24OYsAyQ1AiBBp4voM9pw==}
'@nuxt/vite-builder@3.17.2':
resolution: {integrity: sha512-TfKuh7MPjIhlObLNcoNTRk6/s3L6b6Z7hPuJcnrAeh/a9JGH6fmRsKztW5D5mFEN3H3K6viXche8q2ftQEk7CQ==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0}
peerDependencies:
vue: ^3.3.4
@ -1863,67 +1863,67 @@ packages:
'@one-ini/wasm@0.1.1':
resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
'@oxc-parser/binding-darwin-arm64@0.67.0':
resolution: {integrity: sha512-AWLaNH7emKLCpFzHjcYr0wqE8HRpK/5vDtIAUz0BEZKsYxM/Nd8UpgRg2ZlNlEiPDMgAhpRLBHqjf9Xiv/IMhw==}
'@oxc-parser/binding-darwin-arm64@0.68.1':
resolution: {integrity: sha512-Y5FBQyPCLsldAZYEd+oZcUboXwpcLf42Lakx3EYtiYDbuK9M3IqBXMGxdM07P4PfGQrKYn6/cC8xAqkVHnbWPw==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [darwin]
'@oxc-parser/binding-darwin-x64@0.67.0':
resolution: {integrity: sha512-1wYbIWpXZ8V9jUx309LyCyK5cVqbTC3qawZ293qfGSmRTsn0F7OenRK7ERbRx7HuvWw2zgWIbWieUpO487nloQ==}
'@oxc-parser/binding-darwin-x64@0.68.1':
resolution: {integrity: sha512-nkiXpEKl8UOhNPdOY5hA2PFq9vQc9xVs7NFu2vUD9eH/j5uYfv8GnNaKkd+v6iH93JwEBxuK5gfwxiiCEMZRyg==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [darwin]
'@oxc-parser/binding-linux-arm-gnueabihf@0.67.0':
resolution: {integrity: sha512-Dry9zRk/LOvPvb/GDNkgtQZ2cJKBIc6alQOwjvpji/OdJFjqawTPJoHB0F7nd6NfRYle0tVXCFYHtGUxv2WNxQ==}
'@oxc-parser/binding-linux-arm-gnueabihf@0.68.1':
resolution: {integrity: sha512-38ejU7GP9sOILA82xcF9laJfCiwZWKp96+jeLQMkebZCfQqaGtld/hbJ2yvZ2laLQS3ISRasDemZEJuk/yb6Uw==}
engines: {node: '>=14.0.0'}
cpu: [arm]
os: [linux]
'@oxc-parser/binding-linux-arm64-gnu@0.67.0':
resolution: {integrity: sha512-Bk+Fqe2J9OvIPs+FK/avTA1YL0tAQD3FgiHe0gq7HLaiuwjw8FAzi2KldyataNmIekfiSH6e+xrt2FugwDXFlw==}
'@oxc-parser/binding-linux-arm64-gnu@0.68.1':
resolution: {integrity: sha512-qJK9nzelQqMSLdZbWUpQ8rfSAiH5pgB7rR5OC3/DLbmvhnD+vvuet/67cNzYnGW4pcTzsWzcRTSkmH/b6VcDCA==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
'@oxc-parser/binding-linux-arm64-musl@0.67.0':
resolution: {integrity: sha512-zBMJOkxgcR7Fgmx6hFJQycgWCl9fhS/oW5n1Qix+cbKFe2HfgtOhI+pESEqHc642WX/93BJ1m4OMmZJl35VYgg==}
'@oxc-parser/binding-linux-arm64-musl@0.68.1':
resolution: {integrity: sha512-Fd/yP458VG5wit7uku9iEXzl+qfNTuYTVaxfo6EFsBokOf5Xs6Y4LFeKAjtZfb/eCCsc7UY75sAjDyOGnPnNWg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [linux]
'@oxc-parser/binding-linux-x64-gnu@0.67.0':
resolution: {integrity: sha512-/zHUMrL24fGMTEr1iHE63f8NYa2IvxfIeNo24H1ofxhtr0A2KmcgOCcEUIypFjMxD5EY5kpQ2t0Nf42o+d4LOA==}
'@oxc-parser/binding-linux-x64-gnu@0.68.1':
resolution: {integrity: sha512-VH7q2GXcFKiecD2eNloB4o8Ho6dUeB92O9bS/GV0+Q/yZdu/l0zWXetaszaCviPHCf8YBQzpOHxzsqgVu0RYqQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
'@oxc-parser/binding-linux-x64-musl@0.67.0':
resolution: {integrity: sha512-+JsqPXn2Op35lPEMbTyHonPHzTyvCpfaD522M5nziDt41DAOe3BMMcGgRfJXl6Dv/r8f4iZuHL3YSU8wF+elcQ==}
'@oxc-parser/binding-linux-x64-musl@0.68.1':
resolution: {integrity: sha512-35drWZMNp31JL0fjAK10pOfE20xVQXa7/o1NGqSGiZ2Huf4c0OK0TOggw+F7IEwPXpi5qOL6C+apY1zod8299A==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [linux]
'@oxc-parser/binding-wasm32-wasi@0.67.0':
resolution: {integrity: sha512-jAugJhwJvCSurHEoicL0Gp9k1XVEnrTpQ3l1YBro/jfJ5uKSpfMBPPpNZBW04gumD08RDk32nqcPbk+BezvTaw==}
'@oxc-parser/binding-wasm32-wasi@0.68.1':
resolution: {integrity: sha512-MkTZeTYEqZm18b1TaLSEuo0MxeAv8MNaKSjEz0GgldV3+lNowMbTLusW/QEgYczx/J9/9Y/oYj36Rja7qmfe1Q==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
'@oxc-parser/binding-win32-arm64-msvc@0.67.0':
resolution: {integrity: sha512-JZparqb773ahTQoC3/e6LazRqOLhlyzNhllK73xvz/wixkYueivHxJrdYtFy4ss2VDns4Dg0MZ/zRhkBJy1enA==}
'@oxc-parser/binding-win32-arm64-msvc@0.68.1':
resolution: {integrity: sha512-27Mrz18+4l7ZzM5FYSCSXDOR+CfZPkxkDz85jADpOTO1lUxH+wkTZiTBAOYuyoyRYbjQOTiZzkYljXtDgNeeLg==}
engines: {node: '>=14.0.0'}
cpu: [arm64]
os: [win32]
'@oxc-parser/binding-win32-x64-msvc@0.67.0':
resolution: {integrity: sha512-jP5BkhItHRg0J/JfTp1L8D57VMyFgKrXeqH8h8CS04WL1V/ZbBUSr6FnK8gfy7eeKQZg7K7ZeJRTEEcW6i3nwQ==}
'@oxc-parser/binding-win32-x64-msvc@0.68.1':
resolution: {integrity: sha512-TUsmnbG2ysQ5bUSfWdDliDMXqu7KwAxtIkAtO4mzHKgEu5avVbqk26BhSJsEC9JXqWSo13yTYBmMtC498K3GzQ==}
engines: {node: '>=14.0.0'}
cpu: [x64]
os: [win32]
'@oxc-project/types@0.67.0':
resolution: {integrity: sha512-AI7inoYvnVro7b8S2Z+Fxi295xQvNKLP1CM/xzx5il4R3aiGgnFt9qiXaRo9vIutataX8AjHcaPnOsjdcItU0w==}
'@oxc-project/types@0.68.1':
resolution: {integrity: sha512-Q/H52+HXPPxuIHwQnVkEM8GebLnNcokkI4zQQdbxLIZdfxMGhAm9+gEqsMku3t95trN/1titHUmCM9NxbKaE2g==}
'@parcel/watcher-android-arm64@2.5.1':
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
@ -2013,10 +2013,10 @@ packages:
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
engines: {node: '>= 10.0.0'}
'@pinia/nuxt@0.9.0':
resolution: {integrity: sha512-2yeRo7LeyCF68AbNeL3xu2h6uw0617RkcsYxmA8DJM0R0PMdz5wQHnc44KeENQxR/Mrq8T910XVT6buosqsjBQ==}
'@pinia/nuxt@0.11.0':
resolution: {integrity: sha512-QGFlUAkeVAhPCTXacrtNP4ti24sGEleVzmxcTALY9IkS6U5OUox7vmNL1pkqBeW39oSNq/UC5m40ofDEPHB1fg==}
peerDependencies:
pinia: ^2.3.0
pinia: ^3.0.2
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
@ -3009,19 +3009,22 @@ packages:
'@vue/devtools-api@6.6.4':
resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
'@vue/devtools-api@7.7.6':
resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==}
'@vue/devtools-core@7.7.2':
resolution: {integrity: sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==}
peerDependencies:
vue: ^3.0.0
'@vue/devtools-kit@7.7.2':
resolution: {integrity: sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==}
'@vue/devtools-kit@7.7.6':
resolution: {integrity: sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==}
'@vue/devtools-shared@7.7.2':
resolution: {integrity: sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==}
'@vue/devtools-shared@7.7.6':
resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==}
'@vue/language-core@2.2.8':
resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==}
'@vue/language-core@2.2.10':
resolution: {integrity: sha512-+yNoYx6XIKuAO8Mqh1vGytu8jkFEOH5C8iOv3i8Z/65A7x9iAOXA97Q+PqZ3nlm2lxf5rOJuIGI/wDtx/riNYw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@ -3374,9 +3377,6 @@ packages:
bindings@1.5.0:
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
birpc@0.2.19:
resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==}
birpc@2.3.0:
resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==}
@ -4337,10 +4337,10 @@ packages:
eslint-flat-config-utils@2.0.1:
resolution: {integrity: sha512-brf0eAgQ6JlKj3bKfOTuuI7VcCZvi8ZCD1MMTVoEvS/d38j8cByZViLFALH/36+eqB17ukmfmKq3bWzGvizejA==}
eslint-formatter-gitlab@5.1.0:
resolution: {integrity: sha512-IxhrjLYzDlbFgPWEnvZlWLwPjMeyymbyo0hDHWntZ3DSAP9AP9huj15KbU+BK3OqeO3OHhbFEh2TA6sR0KZhkA==}
eslint-formatter-gitlab@6.0.0:
resolution: {integrity: sha512-WPz1HYBwtdEBQQc3TCSY/qNOi/JthkPDL/P//GcgIRUlODqOW9wkiI2DLfmda5sO4kqZXuoUiEmtmr8NsqnWww==}
peerDependencies:
eslint: '>=5'
eslint: '>=9'
eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
@ -4890,10 +4890,6 @@ packages:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
globals@13.24.0:
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
engines: {node: '>=8'}
globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
@ -6223,8 +6219,8 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
nuxt@3.17.1:
resolution: {integrity: sha512-RFUamVkXw86Kn9l3jeHLNnctsNf5Dp5pQY2bal9uZFiq1Wc9VyMdzou70DbMUjDe1yAoUbD6qz65FOEq+abesQ==}
nuxt@3.17.2:
resolution: {integrity: sha512-zPEGeGlHoMCFf+Y9I7iEZKhdfsRq0Zf2qE8wEEcjP9T6omzm776h9KVzoj3+qPL1v0rGzSyCFslFtxk+Ey6neA==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0}
hasBin: true
peerDependencies:
@ -6311,8 +6307,8 @@ packages:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
engines: {node: '>= 0.4'}
oxc-parser@0.67.0:
resolution: {integrity: sha512-07arJoEJQopwEQ3gDu220l9J7i4XIyOWUGhfRalOX6gKEEYZIaqts5zJvFNtwNSjCc2yHMYscAdHNAB8nRazjA==}
oxc-parser@0.68.1:
resolution: {integrity: sha512-dHwz+xP9r1GTvqyywfws4j7EEP/OaeTpHEjTcvIjViB/R2IdUn52AnoUFNjpw8yRU52XVE76rOA4IEj7I0EjnA==}
engines: {node: '>=14.0.0'}
p-event@5.0.1:
@ -6507,8 +6503,8 @@ packages:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
pinia@2.3.1:
resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==}
pinia@3.0.2:
resolution: {integrity: sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==}
peerDependencies:
typescript: '>=4.4.4'
vue: ^2.7.0 || ^3.5.11
@ -7773,10 +7769,6 @@ packages:
resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==}
engines: {node: '>=10'}
type-fest@0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
type-fest@2.19.0:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'}
@ -7889,8 +7881,8 @@ packages:
resolution: {integrity: sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==}
engines: {node: '>=18.12.0'}
unimport@5.0.0:
resolution: {integrity: sha512-8jL3T+FKDg+qLFX55X9j92uFRqH5vWrNlf/eJb5IQlQB5q5wjooXQDXP1ulhJJQHbosBmlKhBo/ZVS5jHlcJGA==}
unimport@5.0.1:
resolution: {integrity: sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==}
engines: {node: '>=18.12.0'}
unique-filename@1.1.1:
@ -8114,8 +8106,8 @@ packages:
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
vite-plugin-checker@0.9.1:
resolution: {integrity: sha512-neH3CSNWdkZ+zi+WPt/0y5+IO2I0UAI0NX6MaXqU/KxN1Lz6np/7IooRB6VVAMBa4nigqm1GRF6qNa4+EL5jDQ==}
vite-plugin-checker@0.9.3:
resolution: {integrity: sha512-Tf7QBjeBtG7q11zG0lvoF38/2AVUzzhMNu+Wk+mcsJ00Rk/FpJ4rmUviVJpzWkagbU13cGXvKpt7CMiqtxVTbQ==}
engines: {node: '>=14.16'}
peerDependencies:
'@biomejs/biome': '>=1.7'
@ -8127,7 +8119,7 @@ packages:
vite: '>=2.0.0'
vls: '*'
vti: '*'
vue-tsc: ~2.2.2
vue-tsc: ~2.2.10
peerDependenciesMeta:
'@biomejs/biome':
optional: true
@ -8281,8 +8273,8 @@ packages:
peerDependencies:
vue: ^3.2.0
vue-tsc@2.2.8:
resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==}
vue-tsc@2.2.10:
resolution: {integrity: sha512-jWZ1xSaNbabEV3whpIDMbjVSVawjAyW+x1n3JeGQo7S0uv2n9F/JMgWW90tGWNFRKya4YwKMZgCtr0vRAM7DeQ==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
@ -9182,9 +9174,9 @@ snapshots:
'@smithy/types': 3.4.2
tslib: 2.7.0
'@babel/code-frame@7.26.2':
'@babel/code-frame@7.27.1':
dependencies:
'@babel/helper-validator-identifier': 7.25.9
'@babel/helper-validator-identifier': 7.27.1
js-tokens: 4.0.0
picocolors: 1.1.1
@ -9193,7 +9185,7 @@ snapshots:
'@babel/core@7.26.8':
dependencies:
'@ampproject/remapping': 2.3.0
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
'@babel/generator': 7.26.10
'@babel/helper-compilation-targets': 7.26.5
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8)
@ -9288,7 +9280,7 @@ snapshots:
dependencies:
'@babel/core': 7.26.8
'@babel/helper-module-imports': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@babel/helper-validator-identifier': 7.27.1
'@babel/traverse': 7.26.10
transitivePeerDependencies:
- supports-color
@ -9326,7 +9318,7 @@ snapshots:
'@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.25.9': {}
'@babel/helper-validator-identifier@7.27.1': {}
'@babel/helper-validator-option@7.25.9': {}
@ -9574,7 +9566,7 @@ snapshots:
'@babel/core': 7.26.8
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.8)
'@babel/helper-plugin-utils': 7.26.5
'@babel/helper-validator-identifier': 7.25.9
'@babel/helper-validator-identifier': 7.27.1
'@babel/traverse': 7.26.10
transitivePeerDependencies:
- supports-color
@ -9830,13 +9822,13 @@ snapshots:
'@babel/template@7.26.9':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
'@babel/parser': 7.26.10
'@babel/types': 7.26.10
'@babel/traverse@7.26.10':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
'@babel/generator': 7.26.10
'@babel/parser': 7.26.10
'@babel/template': 7.26.9
@ -9849,7 +9841,7 @@ snapshots:
'@babel/types@7.26.10':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@babel/helper-validator-identifier': 7.27.1
'@barbapapazes/plausible-tracker@0.5.6': {}
@ -10537,8 +10529,8 @@ snapshots:
'@nuxt/devtools-kit@2.4.0(magicast@0.3.5)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))':
dependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/schema': 3.17.1
'@nuxt/kit': 3.17.2(magicast@0.3.5)
'@nuxt/schema': 3.17.2
execa: 8.0.1
vite: 6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)
transitivePeerDependencies:
@ -10559,9 +10551,9 @@ snapshots:
dependencies:
'@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))
'@nuxt/devtools-wizard': 2.4.0
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
'@vue/devtools-core': 7.7.2(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))
'@vue/devtools-kit': 7.7.2
'@vue/devtools-kit': 7.7.6
birpc: 2.3.0
consola: 3.4.2
destr: 2.0.5
@ -10586,7 +10578,7 @@ snapshots:
structured-clone-es: 1.0.0
tinyglobby: 0.2.13
vite: 6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)
vite-plugin-inspect: 11.0.0(@nuxt/kit@3.17.1(magicast@0.3.5))(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))
vite-plugin-inspect: 11.0.0(@nuxt/kit@3.17.2(magicast@0.3.5))(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))
vite-plugin-vue-tracer: 0.1.3(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))
which: 5.0.0
ws: 8.18.1
@ -10639,7 +10631,7 @@ snapshots:
'@nuxt/devtools-kit': 2.4.0(magicast@0.3.5)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))
'@nuxt/eslint-config': 1.2.0(@vue/compiler-sfc@3.5.13)(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3)
'@nuxt/eslint-plugin': 1.2.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.3)
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
chokidar: 4.0.3
eslint: 9.22.0(jiti@2.4.2)
eslint-flat-config-utils: 2.0.1
@ -10659,7 +10651,7 @@ snapshots:
- utf-8-validate
- vite
'@nuxt/kit@3.17.1(magicast@0.3.5)':
'@nuxt/kit@3.17.2(magicast@0.3.5)':
dependencies:
c12: 3.0.3(magicast@0.3.5)
consola: 3.4.2
@ -10681,12 +10673,12 @@ snapshots:
tinyglobby: 0.2.13
ufo: 1.6.1
unctx: 2.4.1
unimport: 5.0.0
unimport: 5.0.1
untyped: 2.0.0
transitivePeerDependencies:
- magicast
'@nuxt/schema@3.17.1':
'@nuxt/schema@3.17.2':
dependencies:
'@vue/shared': 3.5.13
consola: 3.4.2
@ -10696,7 +10688,7 @@ snapshots:
'@nuxt/telemetry@2.6.6(magicast@0.3.5)':
dependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
citty: 0.1.6
consola: 3.4.2
destr: 2.0.5
@ -10713,8 +10705,8 @@ snapshots:
'@nuxt/test-utils@3.17.2(@playwright/test@1.50.0)(@types/node@22.13.14)(@vue/test-utils@2.4.6)(jiti@2.4.2)(jsdom@26.0.0(canvas@3.1.0))(magicast@0.3.5)(playwright-core@1.50.0)(sass@1.32.12)(terser@5.33.0)(typescript@5.8.3)(vitest@3.1.2(@types/node@22.13.14)(jiti@2.4.2)(jsdom@26.0.0(canvas@3.1.0))(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(yaml@2.7.0)':
dependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/schema': 3.17.1
'@nuxt/kit': 3.17.2(magicast@0.3.5)
'@nuxt/schema': 3.17.2
c12: 3.0.3(magicast@0.3.5)
consola: 3.4.2
defu: 6.1.4
@ -10760,9 +10752,9 @@ snapshots:
- typescript
- yaml
'@nuxt/vite-builder@3.17.1(@types/node@22.13.14)(eslint@9.22.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(terser@5.33.0)(typescript@5.8.3)(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0)':
'@nuxt/vite-builder@3.17.2(@types/node@22.13.14)(eslint@9.22.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(terser@5.33.0)(typescript@5.8.3)(vue-tsc@2.2.10(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0)':
dependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
'@rollup/plugin-replace': 6.0.2(rollup@4.40.1)
'@vitejs/plugin-vue': 5.2.3(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))
'@vitejs/plugin-vue-jsx': 4.1.2(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))
@ -10793,7 +10785,7 @@ snapshots:
unplugin: 2.3.2
vite: 6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)
vite-node: 3.1.2(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)
vite-plugin-checker: 0.9.1(eslint@9.22.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.8(typescript@5.8.3))
vite-plugin-checker: 0.9.3(eslint@9.22.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.10(typescript@5.8.3))
vue: 3.5.13(typescript@5.8.3)
vue-bundle-renderer: 2.1.1
transitivePeerDependencies:
@ -10824,7 +10816,7 @@ snapshots:
'@nuxtjs/plausible@1.2.0(magicast@0.3.5)':
dependencies:
'@barbapapazes/plausible-tracker': 0.5.6
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
defu: 6.1.4
ufo: 1.6.1
transitivePeerDependencies:
@ -10832,39 +10824,39 @@ snapshots:
'@one-ini/wasm@0.1.1': {}
'@oxc-parser/binding-darwin-arm64@0.67.0':
'@oxc-parser/binding-darwin-arm64@0.68.1':
optional: true
'@oxc-parser/binding-darwin-x64@0.67.0':
'@oxc-parser/binding-darwin-x64@0.68.1':
optional: true
'@oxc-parser/binding-linux-arm-gnueabihf@0.67.0':
'@oxc-parser/binding-linux-arm-gnueabihf@0.68.1':
optional: true
'@oxc-parser/binding-linux-arm64-gnu@0.67.0':
'@oxc-parser/binding-linux-arm64-gnu@0.68.1':
optional: true
'@oxc-parser/binding-linux-arm64-musl@0.67.0':
'@oxc-parser/binding-linux-arm64-musl@0.68.1':
optional: true
'@oxc-parser/binding-linux-x64-gnu@0.67.0':
'@oxc-parser/binding-linux-x64-gnu@0.68.1':
optional: true
'@oxc-parser/binding-linux-x64-musl@0.67.0':
'@oxc-parser/binding-linux-x64-musl@0.68.1':
optional: true
'@oxc-parser/binding-wasm32-wasi@0.67.0':
'@oxc-parser/binding-wasm32-wasi@0.68.1':
dependencies:
'@napi-rs/wasm-runtime': 0.2.9
optional: true
'@oxc-parser/binding-win32-arm64-msvc@0.67.0':
'@oxc-parser/binding-win32-arm64-msvc@0.68.1':
optional: true
'@oxc-parser/binding-win32-x64-msvc@0.67.0':
'@oxc-parser/binding-win32-x64-msvc@0.68.1':
optional: true
'@oxc-project/types@0.67.0': {}
'@oxc-project/types@0.68.1': {}
'@parcel/watcher-android-arm64@2.5.1':
optional: true
@ -10931,10 +10923,10 @@ snapshots:
'@parcel/watcher-win32-ia32': 2.5.1
'@parcel/watcher-win32-x64': 2.5.1
'@pinia/nuxt@0.9.0(magicast@0.3.5)(pinia@2.3.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)))':
'@pinia/nuxt@0.11.0(magicast@0.3.5)(pinia@3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)))':
dependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
pinia: 2.3.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))
'@nuxt/kit': 3.17.2(magicast@0.3.5)
pinia: 3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3))
transitivePeerDependencies:
- magicast
@ -12031,7 +12023,7 @@ snapshots:
'@vite-pwa/nuxt@0.10.6(magicast@0.3.5)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(workbox-build@7.3.0)(workbox-window@7.3.0)':
dependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
pathe: 1.1.2
ufo: 1.6.1
vite-plugin-pwa: 0.21.1(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(workbox-build@7.3.0)(workbox-window@7.3.0)
@ -12158,7 +12150,7 @@ snapshots:
'@vue/babel-plugin-resolve-type@1.4.0(@babel/core@7.26.8)':
dependencies:
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
'@babel/core': 7.26.8
'@babel/helper-module-imports': 7.25.9
'@babel/helper-plugin-utils': 7.26.5
@ -12204,10 +12196,14 @@ snapshots:
'@vue/devtools-api@6.6.4': {}
'@vue/devtools-api@7.7.6':
dependencies:
'@vue/devtools-kit': 7.7.6
'@vue/devtools-core@7.7.2(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))':
dependencies:
'@vue/devtools-kit': 7.7.2
'@vue/devtools-shared': 7.7.2
'@vue/devtools-kit': 7.7.6
'@vue/devtools-shared': 7.7.6
mitt: 3.0.1
nanoid: 5.1.3
pathe: 2.0.3
@ -12216,21 +12212,21 @@ snapshots:
transitivePeerDependencies:
- vite
'@vue/devtools-kit@7.7.2':
'@vue/devtools-kit@7.7.6':
dependencies:
'@vue/devtools-shared': 7.7.2
birpc: 0.2.19
'@vue/devtools-shared': 7.7.6
birpc: 2.3.0
hookable: 5.5.3
mitt: 3.0.1
perfect-debounce: 1.0.0
speakingurl: 14.0.1
superjson: 2.2.2
'@vue/devtools-shared@7.7.2':
'@vue/devtools-shared@7.7.6':
dependencies:
rfdc: 1.4.1
'@vue/language-core@2.2.8(typescript@5.8.3)':
'@vue/language-core@2.2.10(typescript@5.8.3)':
dependencies:
'@volar/language-core': 2.4.11
'@vue/compiler-dom': 3.5.13
@ -12625,8 +12621,6 @@ snapshots:
dependencies:
file-uri-to-path: 1.0.0
birpc@0.2.19: {}
birpc@2.3.0: {}
bl@4.1.0:
@ -13688,9 +13682,8 @@ snapshots:
dependencies:
pathe: 2.0.3
eslint-formatter-gitlab@5.1.0(eslint@9.22.0(jiti@2.4.2)):
eslint-formatter-gitlab@6.0.0(eslint@9.22.0(jiti@2.4.2)):
dependencies:
chalk: 4.1.2
eslint: 9.22.0(jiti@2.4.2)
yaml: 2.7.0
@ -13793,7 +13786,7 @@ snapshots:
eslint-plugin-unicorn@57.0.0(eslint@9.22.0(jiti@2.4.2)):
dependencies:
'@babel/helper-validator-identifier': 7.25.9
'@babel/helper-validator-identifier': 7.27.1
'@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@2.4.2))
ci-info: 4.2.0
clean-regexp: 1.0.0
@ -14440,10 +14433,6 @@ snapshots:
globals@11.12.0: {}
globals@13.24.0:
dependencies:
type-fest: 0.20.2
globals@14.0.0: {}
globals@15.15.0: {}
@ -15706,7 +15695,7 @@ snapshots:
uncrypto: 0.1.3
unctx: 2.4.1
unenv: 2.0.0-rc.15
unimport: 5.0.0
unimport: 5.0.1
unplugin-utils: 0.2.4
unstorage: 1.16.0(db0@0.3.2(sqlite3@5.1.7))(ioredis@5.6.1)
untyped: 2.0.0
@ -15862,15 +15851,15 @@ snapshots:
dependencies:
boolbase: 1.0.0
nuxt@3.17.1(@parcel/watcher@2.5.1)(@types/node@22.13.14)(db0@0.3.2(sqlite3@5.1.7))(encoding@0.1.13)(eslint@9.22.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(sqlite3@5.1.7)(terser@5.33.0)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.8(typescript@5.8.3))(yaml@2.7.0):
nuxt@3.17.2(@parcel/watcher@2.5.1)(@types/node@22.13.14)(db0@0.3.2(sqlite3@5.1.7))(encoding@0.1.13)(eslint@9.22.0(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(sqlite3@5.1.7)(terser@5.33.0)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.10(typescript@5.8.3))(yaml@2.7.0):
dependencies:
'@nuxt/cli': 3.25.0(magicast@0.3.5)
'@nuxt/devalue': 2.0.2
'@nuxt/devtools': 2.4.0(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.8.3))
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/schema': 3.17.1
'@nuxt/kit': 3.17.2(magicast@0.3.5)
'@nuxt/schema': 3.17.2
'@nuxt/telemetry': 2.6.6(magicast@0.3.5)
'@nuxt/vite-builder': 3.17.1(@types/node@22.13.14)(eslint@9.22.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(terser@5.33.0)(typescript@5.8.3)(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0)
'@nuxt/vite-builder': 3.17.2(@types/node@22.13.14)(eslint@9.22.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.1)(sass@1.32.12)(terser@5.33.0)(typescript@5.8.3)(vue-tsc@2.2.10(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3))(yaml@2.7.0)
'@unhead/vue': 2.0.8(vue@3.5.13(typescript@5.8.3))
'@vue/shared': 3.5.13
c12: 3.0.3(magicast@0.3.5)
@ -15903,7 +15892,7 @@ snapshots:
ofetch: 1.4.1
ohash: 2.0.11
on-change: 5.0.1
oxc-parser: 0.67.0
oxc-parser: 0.68.1
pathe: 2.0.3
perfect-debounce: 1.0.0
pkg-types: 2.1.0
@ -15917,7 +15906,7 @@ snapshots:
ultrahtml: 1.6.0
uncrypto: 0.1.3
unctx: 2.4.1
unimport: 5.0.0
unimport: 5.0.1
unplugin: 2.3.2
unplugin-vue-router: 0.12.0(vue-router@4.5.1(vue@3.5.13(typescript@5.8.3)))(vue@3.5.13(typescript@5.8.3))
unstorage: 1.16.0(db0@0.3.2(sqlite3@5.1.7))(ioredis@5.6.1)
@ -16067,20 +16056,20 @@ snapshots:
object-keys: 1.1.1
safe-push-apply: 1.0.0
oxc-parser@0.67.0:
oxc-parser@0.68.1:
dependencies:
'@oxc-project/types': 0.67.0
'@oxc-project/types': 0.68.1
optionalDependencies:
'@oxc-parser/binding-darwin-arm64': 0.67.0
'@oxc-parser/binding-darwin-x64': 0.67.0
'@oxc-parser/binding-linux-arm-gnueabihf': 0.67.0
'@oxc-parser/binding-linux-arm64-gnu': 0.67.0
'@oxc-parser/binding-linux-arm64-musl': 0.67.0
'@oxc-parser/binding-linux-x64-gnu': 0.67.0
'@oxc-parser/binding-linux-x64-musl': 0.67.0
'@oxc-parser/binding-wasm32-wasi': 0.67.0
'@oxc-parser/binding-win32-arm64-msvc': 0.67.0
'@oxc-parser/binding-win32-x64-msvc': 0.67.0
'@oxc-parser/binding-darwin-arm64': 0.68.1
'@oxc-parser/binding-darwin-x64': 0.68.1
'@oxc-parser/binding-linux-arm-gnueabihf': 0.68.1
'@oxc-parser/binding-linux-arm64-gnu': 0.68.1
'@oxc-parser/binding-linux-arm64-musl': 0.68.1
'@oxc-parser/binding-linux-x64-gnu': 0.68.1
'@oxc-parser/binding-linux-x64-musl': 0.68.1
'@oxc-parser/binding-wasm32-wasi': 0.68.1
'@oxc-parser/binding-win32-arm64-msvc': 0.68.1
'@oxc-parser/binding-win32-x64-msvc': 0.68.1
p-event@5.0.1:
dependencies:
@ -16190,14 +16179,14 @@ snapshots:
parse-json@5.2.0:
dependencies:
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
parse-json@8.1.0:
dependencies:
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
index-to-position: 0.1.2
type-fest: 4.27.0
@ -16275,15 +16264,12 @@ snapshots:
pify@2.3.0: {}
pinia@2.3.1(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)):
pinia@3.0.2(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)):
dependencies:
'@vue/devtools-api': 6.6.4
'@vue/devtools-api': 7.7.6
vue: 3.5.13(typescript@5.8.3)
vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.3))
optionalDependencies:
typescript: 5.8.3
transitivePeerDependencies:
- '@vue/composition-api'
pinkie-promise@2.0.1:
dependencies:
@ -17715,8 +17701,6 @@ snapshots:
type-fest@0.16.0: {}
type-fest@0.20.2: {}
type-fest@2.19.0: {}
type-fest@3.13.1: {}
@ -17848,7 +17832,7 @@ snapshots:
unplugin: 2.3.2
unplugin-utils: 0.2.4
unimport@5.0.0:
unimport@5.0.1:
dependencies:
acorn: 8.14.1
escape-string-regexp: 5.0.0
@ -18073,9 +18057,9 @@ snapshots:
- tsx
- yaml
vite-plugin-checker@0.9.1(eslint@9.22.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.8(typescript@5.8.3)):
vite-plugin-checker@0.9.3(eslint@9.22.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))(vue-tsc@2.2.10(typescript@5.8.3)):
dependencies:
'@babel/code-frame': 7.26.2
'@babel/code-frame': 7.27.1
chokidar: 4.0.3
npm-run-path: 6.0.0
picocolors: 1.1.1
@ -18089,9 +18073,9 @@ snapshots:
eslint: 9.22.0(jiti@2.4.2)
optionator: 0.9.4
typescript: 5.8.3
vue-tsc: 2.2.8(typescript@5.8.3)
vue-tsc: 2.2.10(typescript@5.8.3)
vite-plugin-inspect@11.0.0(@nuxt/kit@3.17.1(magicast@0.3.5))(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)):
vite-plugin-inspect@11.0.0(@nuxt/kit@3.17.2(magicast@0.3.5))(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)):
dependencies:
ansis: 3.17.0
debug: 4.4.0
@ -18104,7 +18088,7 @@ snapshots:
vite: 6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0)
vite-dev-rpc: 1.0.7(vite@6.3.4(@types/node@22.13.14)(jiti@2.4.2)(sass@1.32.12)(terser@5.33.0)(yaml@2.7.0))
optionalDependencies:
'@nuxt/kit': 3.17.1(magicast@0.3.5)
'@nuxt/kit': 3.17.2(magicast@0.3.5)
transitivePeerDependencies:
- supports-color
@ -18245,10 +18229,10 @@ snapshots:
'@vue/devtools-api': 6.6.4
vue: 3.5.13(typescript@5.8.3)
vue-tsc@2.2.8(typescript@5.8.3):
vue-tsc@2.2.10(typescript@5.8.3):
dependencies:
'@volar/typescript': 2.4.11
'@vue/language-core': 2.2.8(typescript@5.8.3)
'@vue/language-core': 2.2.10(typescript@5.8.3)
typescript: 5.8.3
vue@3.5.13(typescript@5.8.3):

View File

@ -22,7 +22,8 @@ import forbidden from '~/src/forbidden.ts';
import { clearLinkedText, buildImageUrl } from '~/src/helpers.ts';
import { genders, gendersWithNumerus } from '~/src/nouns.ts';
import parseMarkdown from '~/src/parseMarkdown.ts';
import { normaliseQuery, type SearchDocument, validateQuery } from '~/src/search.ts';
import { normaliseQuery, validateQuery } from '~/src/search.ts';
import type { SearchDocument } from '~/src/search.ts';
interface SearchKind {
kind: SearchDocument['kind'];

View File

@ -57,12 +57,19 @@ const publishers = {
}
}
const language = tweet.match(/^\[(.*)]/)[1];
try {
const tweetResponse = await client.post('statuses', {
status: tweet,
media_ids: mediaIds,
visibility: 'unlisted',
...previousId ? { in_reply_to_id: previousId } : {},
...previousId
? {
in_reply_to_id: previousId,
spoiler_text: language,
}
: {},
language: locale,
});
console.log(tweetResponse.data);

View File

@ -1,4 +1,5 @@
import { type Config, type ConfigWithEnabled, isEnabled } from '../locale/config.ts';
import { isEnabled } from '../locale/config.ts';
import type { Config, ConfigWithEnabled } from '../locale/config.ts';
import type { PronounData, PronounGroupData } from '../locale/data.ts';
import { Pronoun, PronounGroup } from './classes.ts';

View File

@ -1,5 +1,6 @@
import type { ExampleValues } from '~/src/language/examples.ts';
import { type MorphemeValue, toMorphemeValue } from '~/src/language/morphemes.ts';
import { toMorphemeValue } from '~/src/language/morphemes.ts';
import type { MorphemeValue } from '~/src/language/morphemes.ts';
export type GrammarTablesDefinition = (GrammarTableDefinition | string)[]
| { simple: (GrammarTableDefinition | string)[]; comprehensive: (GrammarTableDefinition | string)[] };

View File

@ -8,7 +8,8 @@ import { loadSuml, loadTsv } from '~/server/loader.ts';
import { normaliseKey } from '~/src/buildPronoun.ts';
import { Example } from '~/src/language/examples.ts';
import type { VariantsFromBaseConverter } from '~/src/language/grammarTables.ts';
import { availableGenders, gendersWithNumerus, type NounConventions } from '~/src/nouns.ts';
import { availableGenders, gendersWithNumerus } from '~/src/nouns.ts';
import type { NounConventions } from '~/src/nouns.ts';
function toHaveValidMorphemes(actual: string, morphemes: string[]): SyncExpectationResult {
const containedMorphemes = Example.parse(actual).parts

View File

@ -5,7 +5,8 @@ import { promisify } from 'util';
import { chromium } from '@playwright/test';
import type { Browser, Page } from '@playwright/test';
import { execa, type ResultPromise } from 'execa';
import { execa } from 'execa';
import type { ResultPromise } from 'execa';
import tkKill from 'tree-kill';
import { describe, it, beforeAll, afterAll, expect } from 'vitest';
import { createRouter, createMemoryHistory } from 'vue-router';