generated from Seekra/repository-template
Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
2aa6b3794c
|
|||
|
36bcf32a05
|
|||
|
eaa8968f64
|
|||
|
0a36bfe4a5
|
|||
|
085dc065bb
|
|||
|
a50531593b
|
|||
|
09da4c5577
|
|||
|
3b8c387c44
|
|||
|
d461da90f2
|
|||
|
295bfc19e6
|
|||
|
7a7f698b44
|
|||
|
2fd010ddfa
|
|||
|
f72a2bf2b1
|
|||
|
926010f128
|
|||
|
98c954e361
|
|||
|
325551d253
|
|||
|
a33bc047fa
|
|||
|
1421789e43
|
|||
|
27a22ce569
|
|||
| b28af20d11 | |||
|
c81de2dce3
|
|||
|
1b60984b5c
|
|||
|
733bc2b16a
|
|||
|
11800f6ef4
|
|||
|
b47ab0355e
|
|||
|
34a7cb3f2c
|
|||
|
da76d14d15
|
|||
|
547bc241da
|
|||
|
4ef6008976
|
|||
|
035aa1aa77
|
|||
|
462ae00506
|
|||
|
5d2064134b
|
@@ -1,55 +0,0 @@
|
|||||||
{
|
|
||||||
"contents": [
|
|
||||||
{
|
|
||||||
"name": "general",
|
|
||||||
"type": "section",
|
|
||||||
"i18n": "preferences.settings.sections.general.name",
|
|
||||||
"description": "preferences.settings.sections.general.description",
|
|
||||||
"content": [
|
|
||||||
{
|
|
||||||
"type": "bool",
|
|
||||||
"name": "darkMode",
|
|
||||||
"i18n": "preferences.darkMode",
|
|
||||||
"default": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "selection",
|
|
||||||
"name": "language",
|
|
||||||
"i18n": "preferences.settings.language",
|
|
||||||
"description": "preferences.settings.language.description",
|
|
||||||
"default": "en",
|
|
||||||
"allowMultiple": false,
|
|
||||||
"options": [
|
|
||||||
{
|
|
||||||
"name": "en",
|
|
||||||
"i18n": "preferences.locale.languages.en"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "de",
|
|
||||||
"i18n": "preferences.locale.languages.de"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "section",
|
|
||||||
"name": "exampleSection",
|
|
||||||
"description": "preferences.settings.sections.exampleSection.description",
|
|
||||||
"content": [
|
|
||||||
{
|
|
||||||
"type": "number",
|
|
||||||
"name": "aNumber",
|
|
||||||
"i18n": "preferences.settings.sections.exampleSection.content.aNumber",
|
|
||||||
"default": 42
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "exampleStandaloneConfiguration",
|
|
||||||
"type": "bool",
|
|
||||||
"i18n": "preferences.settings.exampleStandalone.name",
|
|
||||||
"default": false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,7 @@ const copyrightPeriod =
|
|||||||
<template>
|
<template>
|
||||||
<footer class="global-footer">
|
<footer class="global-footer">
|
||||||
<div class="footer-segment">
|
<div class="footer-segment">
|
||||||
<RouterLink to="settings">
|
<RouterLink to="settings" class="link">
|
||||||
{{ t('preferences.settings') }}
|
{{ t('preferences.settings') }}
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
</div>
|
</div>
|
||||||
@@ -56,6 +56,10 @@ const copyrightPeriod =
|
|||||||
border-top: 1px solid var(--border);
|
border-top: 1px solid var(--border);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.global-footer a {
|
||||||
|
color: var(--dark);
|
||||||
|
}
|
||||||
|
|
||||||
.copyright-note {
|
.copyright-note {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2026 Seekra
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2026 Seekra
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
```vue
|
||||||
|
<!--
|
||||||
|
Copyright 2026 Seekra
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
// 1. ALLE Sprachen importieren (Verhindert den ReferenceError)
|
||||||
|
import de from '@/legal/privacy/de.md?raw';
|
||||||
|
import en from '@/legal/privacy/en.md?raw';
|
||||||
|
import fr from '@/legal/privacy/fr.md?raw';
|
||||||
|
import es from '@/legal/privacy/es.md?raw';
|
||||||
|
import it from '@/legal/privacy/it.md?raw';
|
||||||
|
import pt from '@/legal/privacy/pt.md?raw';
|
||||||
|
|
||||||
|
const { locale } = useI18n();
|
||||||
|
|
||||||
|
const content = computed(() => {
|
||||||
|
const map = {
|
||||||
|
de,
|
||||||
|
en,
|
||||||
|
fr,
|
||||||
|
es,
|
||||||
|
it,
|
||||||
|
pt
|
||||||
|
};
|
||||||
|
|
||||||
|
// Falls eine Sprache mal nicht existiert, nutzen wir 'de' oder 'en' als Fallback
|
||||||
|
return map[locale.value] || de;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main class="privacy-policy-content main-content-padding">
|
||||||
|
<h1>{{ $t('legal.privacy.title') }}</h1>
|
||||||
|
|
||||||
|
<div class="markdown-body">{{ content }}</div>
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.privacy-policy-content {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding-top: 40px;
|
||||||
|
padding-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sorgt dafür, dass die Zeilenumbrüche aus den .md Dateien erhalten bleiben */
|
||||||
|
.markdown-body {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
font-family: inherit;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -15,9 +15,25 @@ limitations under the License.
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref, watch } from 'vue';
|
||||||
|
import { useRoute } from 'vue-router';
|
||||||
import ColorSchemeButton from '@/features/colorScheme/components/ColorSchemeButton.vue';
|
import ColorSchemeButton from '@/features/colorScheme/components/ColorSchemeButton.vue';
|
||||||
import LanguageSwitchButton from '@/features/i18n/components/LanguageSwitchButton.vue';
|
import LanguageSwitchButton from '@/features/i18n/components/LanguageSwitchButton.vue';
|
||||||
import logo from '@/assets/images/logo.svg';
|
import logo from '@/assets/images/logo.svg';
|
||||||
|
import Searchbar from '@/features/search/components/Searchbar.vue';
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
const searchQueryModel = defineModel();
|
||||||
|
|
||||||
|
watch(() => route.name, name => {
|
||||||
|
searchQueryModel.value = name === 'searchResults' ? route.query.q || '' : '';
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(() => route.query.q, q => {
|
||||||
|
if (route.name === 'searchResults') {
|
||||||
|
searchQueryModel.value = q || '';
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -25,6 +41,12 @@ import logo from '@/assets/images/logo.svg';
|
|||||||
<RouterLink to="/" class="link button link">
|
<RouterLink to="/" class="link button link">
|
||||||
<img :src="logo" alt="Seekra" class="nav-logo" />
|
<img :src="logo" alt="Seekra" class="nav-logo" />
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
|
<Searchbar
|
||||||
|
v-if="route.name === 'searchResults'"
|
||||||
|
class="search-bar"
|
||||||
|
v-model="searchQueryModel"
|
||||||
|
auto-submit
|
||||||
|
/>
|
||||||
<ul class="right-links">
|
<ul class="right-links">
|
||||||
<li>
|
<li>
|
||||||
<LanguageSwitchButton />
|
<LanguageSwitchButton />
|
||||||
@@ -41,7 +63,8 @@ import logo from '@/assets/images/logo.svg';
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 10px 40px;
|
padding: 18px 40px;
|
||||||
|
height: 42px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.global-nav .right-links {
|
.global-nav .right-links {
|
||||||
@@ -66,4 +89,7 @@ import logo from '@/assets/images/logo.svg';
|
|||||||
height: 24px;
|
height: 24px;
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
</style>
|
.search-bar {
|
||||||
|
width: 70%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -15,22 +15,13 @@ limitations under the License.
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import Searchbar from '@/features/search/components/Searchbar.vue';
|
|
||||||
|
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const props = defineProps(['searchQuery']);
|
|
||||||
|
|
||||||
const searchQueryModel = defineModel();
|
|
||||||
searchQueryModel.value = props.searchQuery;
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="main-content-padding">
|
<div class="main-content-padding">
|
||||||
<Searchbar class="search-bar" v-model="searchQueryModel" auto-submit />
|
|
||||||
|
|
||||||
<div class="search-results-error-message-container">
|
<div class="search-results-error-message-container">
|
||||||
<div class="search-results-error-message">
|
<div class="search-results-error-message">
|
||||||
<p>{{ t('search.error.searchNotAvailable') }}</p>
|
<p>{{ t('search.error.searchNotAvailable') }}</p>
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ const loading = ref(false);
|
|||||||
* The config is loaded once and shared across all consumers.
|
* The config is loaded once and shared across all consumers.
|
||||||
*/
|
*/
|
||||||
export function useSettingsConfig() {
|
export function useSettingsConfig() {
|
||||||
async function load(url = '/settings.json') {
|
async function load() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
error.value = null;
|
error.value = null;
|
||||||
try {
|
try {
|
||||||
config.value = await loadSettingsConfig(url);
|
config.value = await loadSettingsConfig();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error.value = e.message;
|
error.value = e.message;
|
||||||
config.value = null;
|
config.value = null;
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"contents": []
|
||||||
|
}
|
||||||
@@ -32,18 +32,6 @@ limitations under the License.
|
|||||||
* @property {string} [description]
|
* @property {string} [description]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {BaseSettingConfig & { default: boolean }} BoolSettingConfig
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {BaseSettingConfig & { default: number }} NumberSettingConfig
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {BaseSettingConfig & { default: string }} StringSettingConfig
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {BaseSettingConfig & {
|
* @typedef {BaseSettingConfig & {
|
||||||
* default: string | string[],
|
* default: string | string[],
|
||||||
@@ -68,4 +56,13 @@ limitations under the License.
|
|||||||
/**
|
/**
|
||||||
* @typedef {Object} SettingsConfig
|
* @typedef {Object} SettingsConfig
|
||||||
* @property {SettingConfigEntry[]} contents
|
* @property {SettingConfigEntry[]} contents
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @typedef {{ type: 'bool', name: string, i18n: string, description?: string, default: boolean }} BoolSettingConfig
|
||||||
|
* @typedef {{ type: 'number', name: string, i18n: string, description?: string, default: number }} NumberSettingConfig
|
||||||
|
* @typedef {{ type: 'string', name: string, i18n: string, description?: string, default: string }} StringSettingConfig
|
||||||
|
* @typedef {{ type: 'selection', name: string, i18n: string, description?: string, default: string | string[], allowMultiple?: boolean, options: SelectionOption[] }} SelectionSettingConfig
|
||||||
|
* @typedef {{ type: 'section', name: string, i18n?: string, description?: string, content: SettingConfigEntry[] }} SectionSettingConfig
|
||||||
|
* @typedef {BoolSettingConfig | NumberSettingConfig | StringSettingConfig | SelectionSettingConfig | SectionSettingConfig} SettingConfigEntry
|
||||||
|
* @typedef {{ contents: SettingConfigEntry[] }} SettingsConfig
|
||||||
*/
|
*/
|
||||||
@@ -17,21 +17,16 @@ limitations under the License.
|
|||||||
import { validateSettingsConfig } from './settingsValidator.js';
|
import { validateSettingsConfig } from './settingsValidator.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads and parses the settings configuration from a JSON file.
|
* Loads and parses the settings configuration via dynamic import.
|
||||||
* @param {string} [url='/settings.json']
|
|
||||||
* @returns {Promise<import('../types/settingsConfig').SettingsConfig>}
|
* @returns {Promise<import('../types/settingsConfig').SettingsConfig>}
|
||||||
*/
|
*/
|
||||||
export async function loadSettingsConfig(url = '/settings.json') {
|
export async function loadSettingsConfig() {
|
||||||
let raw;
|
let raw;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(url);
|
raw = (await import('../settings.json')).default;
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`HTTP ${response.status}`);
|
|
||||||
}
|
|
||||||
raw = await response.json();
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error(`[settings] Failed to load config from "${url}": ${e.message}`);
|
throw new Error(`[settings] Failed to load settings.json: ${e.message}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = validateSettingsConfig(raw);
|
const result = validateSettingsConfig(raw);
|
||||||
|
|||||||
@@ -57,24 +57,22 @@ function validateEntry(entry, path) {
|
|||||||
assertString(entry.name, `${path}.name`);
|
assertString(entry.name, `${path}.name`);
|
||||||
assertString(entry.i18n, `${path}.i18n`);
|
assertString(entry.i18n, `${path}.i18n`);
|
||||||
|
|
||||||
if (entry.default === undefined) {
|
if (entry.default !== undefined) {
|
||||||
throw new Error(`[settings] "${path}.default" is required`);
|
if (entry.type === 'bool' && typeof entry.default !== 'boolean') {
|
||||||
}
|
throw new Error(`[settings] "${path}.default" must be a boolean`);
|
||||||
|
}
|
||||||
if (entry.type === 'bool' && typeof entry.default !== 'boolean') {
|
if (entry.type === 'number' && typeof entry.default !== 'number') {
|
||||||
throw new Error(`[settings] "${path}.default" must be a boolean`);
|
throw new Error(`[settings] "${path}.default" must be a number`);
|
||||||
}
|
}
|
||||||
if (entry.type === 'number' && typeof entry.default !== 'number') {
|
if (entry.type === 'string' && typeof entry.default !== 'string') {
|
||||||
throw new Error(`[settings] "${path}.default" must be a number`);
|
throw new Error(`[settings] "${path}.default" must be a string`);
|
||||||
}
|
}
|
||||||
if (entry.type === 'string' && typeof entry.default !== 'string') {
|
if (entry.type === 'selection') {
|
||||||
throw new Error(`[settings] "${path}.default" must be a string`);
|
validateSelectionOptions(entry.options, path);
|
||||||
}
|
if (typeof entry.allowMultiple !== 'boolean') {
|
||||||
if (entry.type === 'selection') {
|
throw new Error(`[settings] "${path}.allowMultiple" must be a boolean`);
|
||||||
validateSelectionOptions(entry.options, path);
|
}
|
||||||
if (typeof entry.allowMultiple !== 'boolean') {
|
}
|
||||||
throw new Error(`[settings] "${path}.allowMultiple" must be a boolean`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Datenschutzerklärung
|
||||||
|
|
||||||
|
Hier steht deine Datenschutzerklärung auf Deutsch.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Privacy Policy
|
||||||
|
|
||||||
|
Here is your privacy policy in English.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Política de privacidad
|
||||||
|
|
||||||
|
Aquí tienes tu política de privacidad en español.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Politique de confidentialité
|
||||||
|
|
||||||
|
Voici ta politique de confidentialité en français.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Informativa sulla privacy
|
||||||
|
|
||||||
|
Qui trovi la tua informativa sulla privacy in italiano.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Política de Privacidade
|
||||||
|
|
||||||
|
Aqui está a tua Política de Privacidade em português.
|
||||||
+8
-2
@@ -37,5 +37,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slogan": "Gebaut zum Suchen."
|
"slogan": "Gebaut zum Suchen.",
|
||||||
}
|
|
||||||
|
"legal": {
|
||||||
|
"privacy": {
|
||||||
|
"title": "Datenschutzerklärung"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-2
@@ -37,5 +37,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slogan": "Built to search."
|
"slogan": "Built to search.",
|
||||||
}
|
|
||||||
|
"legal": {
|
||||||
|
"privacy": {
|
||||||
|
"title": "Privacy Policy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-2
@@ -37,5 +37,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slogan": "Hecho para buscar."
|
"slogan": "Hecho para buscar.",
|
||||||
}
|
|
||||||
|
"legal": {
|
||||||
|
"privacy": {
|
||||||
|
"title": "Política de Privacidad"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-2
@@ -37,5 +37,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slogan": "Conçu pour chercher."
|
"slogan": "Conçu pour chercher.",
|
||||||
}
|
|
||||||
|
"legal": {
|
||||||
|
"privacy": {
|
||||||
|
"title": "Politique de Confidentialité"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-2
@@ -37,5 +37,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slogan": "Costruito per cercare."
|
"slogan": "Costruito per cercare.",
|
||||||
}
|
|
||||||
|
"legal": {
|
||||||
|
"privacy": {
|
||||||
|
"title": "Politica di Privacy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-2
@@ -37,5 +37,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slogan": "Feito para pesquisar."
|
"slogan": "Feito para pesquisar.",
|
||||||
}
|
|
||||||
|
"legal": {
|
||||||
|
"privacy": {
|
||||||
|
"title": "Política de Privacidade"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+11
-1
@@ -21,6 +21,7 @@ import SearchView from '../views/SearchView.vue';
|
|||||||
import SearchResultsView from '@/features/search/views/SearchResultsView.vue';
|
import SearchResultsView from '@/features/search/views/SearchResultsView.vue';
|
||||||
import SettingsView from '@/features/settings/views/SettingsView.vue';
|
import SettingsView from '@/features/settings/views/SettingsView.vue';
|
||||||
import NotFound from '../views/NotFound.vue';
|
import NotFound from '../views/NotFound.vue';
|
||||||
|
import PrivacyPolicyView from '@/features/legal/views/PrivacyPolicyView.vue';
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
@@ -52,6 +53,15 @@ const routes = [
|
|||||||
name: 'notFound',
|
name: 'notFound',
|
||||||
component: NotFound
|
component: NotFound
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/privacy',
|
||||||
|
name: 'privacyPolicy',
|
||||||
|
component: PrivacyPolicyView,
|
||||||
|
meta: {
|
||||||
|
title: () => 'Privacy Policy'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
@@ -73,4 +83,4 @@ router.afterEach(to => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
Reference in New Issue
Block a user