generated from Seekra/repository-template
Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
414dc66388
|
||
|
|
8c1ee57242
|
||
|
|
551def1de5
|
||
|
|
a26610a749
|
||
|
|
a25d6b93ee
|
||
|
|
1c58993cc1
|
||
|
|
af9f6b7ab4
|
@@ -1,16 +0,0 @@
|
|||||||
# 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.
|
|
||||||
|
|
||||||
VITE_ASSETS_BUILD_ID=2026-08-04-76a067e
|
|
||||||
VITE_ASSETS_BASE_URL=https://assets.seekra.jcloud-services.ddns.net
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const getAssetsUrl = function getAssetsUrl () {
|
|
||||||
return new URL(
|
|
||||||
`${import.meta.env.VITE_ASSETS_BUILD_ID}/`,
|
|
||||||
import.meta.env.VITE_ASSETS_BASE_URL
|
|
||||||
).href;
|
|
||||||
};
|
|
||||||
@@ -557,30 +557,6 @@ describe('settingsValidator', () => {
|
|||||||
{ name: 'maybe', i18n: 'selectSomething.options.maybe' }
|
{ name: 'maybe', i18n: 'selectSomething.options.maybe' }
|
||||||
] }],
|
] }],
|
||||||
|
|
||||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['1', '2', '3'], allowMultiple: true, options: [
|
|
||||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
|
||||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
|
||||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
|
||||||
] }],
|
|
||||||
|
|
||||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['2', '3'], allowMultiple: true, options: [
|
|
||||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
|
||||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
|
||||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
|
||||||
] }],
|
|
||||||
|
|
||||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: ['2'], allowMultiple: true, options: [
|
|
||||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
|
||||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
|
||||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
|
||||||
] }],
|
|
||||||
|
|
||||||
[{ name: 'selectMultiple', type: 'selection', i18n: 'selectMultiple.title', default: [], allowMultiple: true, options: [
|
|
||||||
{ name: '1', i18n: 'selectMultiple.options.1' },
|
|
||||||
{ name: '2', i18n: 'selectMultiple.options.2' },
|
|
||||||
{ name: '3', i18n: 'selectMultiple.options.3' }
|
|
||||||
] }],
|
|
||||||
|
|
||||||
[{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [] }],
|
[{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [] }],
|
||||||
[{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [
|
[{ name: 'aSection', type: 'section', i18n: 'sections.aSection.title', content: [
|
||||||
{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }
|
{ name: 'enableFeature42', type: 'bool', i18n: 'feature.42.enable', default: true }
|
||||||
@@ -640,34 +616,6 @@ describe('settingsValidator', () => {
|
|||||||
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: true }],
|
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: true }],
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: [] }],
|
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'a', options: [] }],
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: ['a'], options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: ['a', 'b'], options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: 'a', options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: 'a', options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: ['c'], options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: [1], options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', allowMultiple: true, default: ['a', 1], options: [
|
|
||||||
{ name: 'a', i18n: 'a' },
|
|
||||||
{ name: 'b', i18n: 'b' }
|
|
||||||
] }],
|
|
||||||
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'c', options: [
|
[{ name: 'selectSomething', type: 'selection', i18n: 'selectSomething.title', default: 'c', options: [
|
||||||
{ name: 'a', i18n: 'a' },
|
{ name: 'a', i18n: 'a' },
|
||||||
{ name: 'b', i18n: 'b' }
|
{ name: 'b', i18n: 'b' }
|
||||||
|
|||||||
@@ -73,27 +73,12 @@ export const validateEntry = function validateEntry (entry, path) {
|
|||||||
throw new Error(`[settings] "${path}.default" must be a string`);
|
throw new Error(`[settings] "${path}.default" must be a string`);
|
||||||
}
|
}
|
||||||
if (entry.type === 'selection') {
|
if (entry.type === 'selection') {
|
||||||
if (entry.allowMultiple) {
|
|
||||||
if (!Array.isArray(entry.default)) {
|
|
||||||
throw new Error(`[settings] "${path}.default" must be an array`);
|
|
||||||
}
|
|
||||||
const allOptions = entry.options.map((option) => option.name);
|
|
||||||
entry.default.forEach((defaultValue, index) => {
|
|
||||||
if (typeof defaultValue !== 'string') {
|
|
||||||
throw new Error(`[settings] "${path}.default[${index}]" must be a string`);
|
|
||||||
}
|
|
||||||
if (!allOptions.includes(defaultValue)) {
|
|
||||||
throw new Error(`[settings] option "${path}.default[${index}]" does not exist`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (typeof entry.default !== 'string') {
|
if (typeof entry.default !== 'string') {
|
||||||
throw new Error(`[settings] "${path}.default" must be a string`);
|
throw new Error(`[settings] "${path}.default" must be a string`);
|
||||||
};
|
};
|
||||||
if (!entry.options.map((option) => option.name).includes(entry.default)) {
|
if (!entry.options.map((option) => option.name).includes(entry.default)) {
|
||||||
throw new Error(`[settings] option "${path}.default" does not exist`);
|
throw new Error(`[settings] option "${path}.default" does not exist`);
|
||||||
};
|
};
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-20
@@ -14,7 +14,6 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { getAssetsUrl } from './config/env';
|
|
||||||
import { createApp } from 'vue'
|
import { createApp } from 'vue'
|
||||||
import { createPinia } from 'pinia';
|
import { createPinia } from 'pinia';
|
||||||
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
|
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
|
||||||
@@ -26,29 +25,10 @@ import './styles/common.css'
|
|||||||
import './styles/variables/colors.css'
|
import './styles/variables/colors.css'
|
||||||
import './styles/variables/dimensions.css';
|
import './styles/variables/dimensions.css';
|
||||||
|
|
||||||
import rawFonts from './styles/fonts.json';
|
|
||||||
import './styles/common.css';
|
import './styles/common.css';
|
||||||
import './styles/variables/colors.css';
|
import './styles/variables/colors.css';
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const fonts = rawFonts.map((font) => new FontFace(
|
|
||||||
font.family ?? '',
|
|
||||||
Array.isArray(font.source)
|
|
||||||
? font.source.map(
|
|
||||||
(source) => `url('${source.url
|
|
||||||
? new URL(source.url, getAssetsUrl()).href
|
|
||||||
: ''
|
|
||||||
}') format('${source.format ?? ''}')`
|
|
||||||
).join(',')
|
|
||||||
: '',
|
|
||||||
{
|
|
||||||
weight: font.weight ?? undefined,
|
|
||||||
style: font.style ?? undefined
|
|
||||||
}
|
|
||||||
));
|
|
||||||
await Promise.all(fonts.map((font) => font.load()));
|
|
||||||
fonts.forEach((font) => document.fonts.add(font));
|
|
||||||
|
|
||||||
await loadLanguage(fallbackLocale);
|
await loadLanguage(fallbackLocale);
|
||||||
await loadLanguage(getCurrentLanguage());
|
await loadLanguage(getCurrentLanguage());
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ body {
|
|||||||
color: var(--dark);
|
color: var(--dark);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"family": "Inter",
|
|
||||||
"weight": "100 900",
|
|
||||||
"style": "normal",
|
|
||||||
"source": [
|
|
||||||
{
|
|
||||||
"url": "fonts/Inter/Inter-Variable.woff2",
|
|
||||||
"format": "woff2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "fonts/Inter/Inter-Variable.ttf",
|
|
||||||
"format": "truetype"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"family": "Inter",
|
|
||||||
"weight": "100 900",
|
|
||||||
"style": "italic",
|
|
||||||
"source": [
|
|
||||||
{
|
|
||||||
"url": "fonts/Inter/Inter-Italic-Variable.woff2",
|
|
||||||
"format": "woff2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "fonts/Inter/Inter-Italic-Variable.ttf",
|
|
||||||
"format": "truetype"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
Reference in New Issue
Block a user