feat: initial commit
18
.eslintrc.cjs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/* eslint-env node */
|
||||||
|
require("@rushstack/eslint-patch/modern-module-resolution");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
extends: [
|
||||||
|
"plugin:vue/vue3-essential",
|
||||||
|
"eslint:recommended",
|
||||||
|
"@vue/eslint-config-typescript",
|
||||||
|
"@vue/eslint-config-prettier/skip-formatting",
|
||||||
|
],
|
||||||
|
parserOptions: {
|
||||||
|
ecmaVersion: "latest",
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
"vue/multi-word-component-names": false,
|
||||||
|
},
|
||||||
|
};
|
30
.gitignore
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
.DS_Store
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
coverage
|
||||||
|
*.local
|
||||||
|
|
||||||
|
/cypress/videos/
|
||||||
|
/cypress/screenshots/
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
*.tsbuildinfo
|
8
.prettierrc.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/prettierrc",
|
||||||
|
"semi": true,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"singleQuote": false,
|
||||||
|
"printWidth": 80,
|
||||||
|
"trailingComma": "es5"
|
||||||
|
}
|
7
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"Vue.volar",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"esbenp.prettier-vscode"
|
||||||
|
]
|
||||||
|
}
|
18
cli
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
COMMAND=$1
|
||||||
|
|
||||||
|
case $COMMAND in
|
||||||
|
node | yarn | npx )
|
||||||
|
docker run -it --rm -v .:/app -w /app -u `id -u`:`id -g` --network host node:20-alpine $@
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Use: $0 <command>"
|
||||||
|
echo
|
||||||
|
echo "Available commands:"
|
||||||
|
echo
|
||||||
|
echo "node <args>"
|
||||||
|
echo "yarn <args>"
|
||||||
|
echo "npx <args>"
|
||||||
|
exit 1
|
||||||
|
esac
|
140
i18next-parser-config.ts
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
// i18next-parser.config.ts
|
||||||
|
|
||||||
|
import { supportedLanguages } from "./src/lang";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
contextSeparator: "_",
|
||||||
|
// Key separator used in your translation keys
|
||||||
|
|
||||||
|
createOldCatalogs: true,
|
||||||
|
// Save the \_old files
|
||||||
|
|
||||||
|
defaultNamespace: "translation",
|
||||||
|
// Default namespace used in your i18next config
|
||||||
|
|
||||||
|
defaultValue: "",
|
||||||
|
// Default value to give to keys with no value
|
||||||
|
// You may also specify a function accepting the locale, namespace, key, and value as arguments
|
||||||
|
|
||||||
|
indentation: 2,
|
||||||
|
// Indentation of the catalog files
|
||||||
|
|
||||||
|
keepRemoved: false,
|
||||||
|
// Keep keys from the catalog that are no longer in code
|
||||||
|
// You may either specify a boolean to keep or discard all removed keys.
|
||||||
|
// You may also specify an array of patterns: the keys from the catalog that are no long in the code but match one of the patterns will be kept.
|
||||||
|
// The patterns are applied to the full key including the namespace, the parent keys and the separators.
|
||||||
|
|
||||||
|
keySeparator: false,
|
||||||
|
// Key separator used in your translation keys
|
||||||
|
// If you want to use plain english keys, separators such as `.` and `:` will conflict. You might want to set `keySeparator: false` and `namespaceSeparator: false`. That way, `t('Status: Loading...')` will not think that there are a namespace and three separator dots for instance.
|
||||||
|
|
||||||
|
// see below for more details
|
||||||
|
lexers: {
|
||||||
|
hbs: ["HandlebarsLexer"],
|
||||||
|
handlebars: ["HandlebarsLexer"],
|
||||||
|
|
||||||
|
htm: ["HTMLLexer"],
|
||||||
|
html: ["HTMLLexer"],
|
||||||
|
|
||||||
|
mjs: ["JavascriptLexer"],
|
||||||
|
js: ["JavascriptLexer"], // if you're writing jsx inside .js files, change this to JsxLexer
|
||||||
|
ts: ["JavascriptLexer"],
|
||||||
|
jsx: ["JsxLexer"],
|
||||||
|
tsx: ["JsxLexer"],
|
||||||
|
vue: [
|
||||||
|
{
|
||||||
|
lexer: "JavascriptLexer",
|
||||||
|
functions: ["t", "$t"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
default: ["JavascriptLexer"],
|
||||||
|
},
|
||||||
|
|
||||||
|
lineEnding: "auto",
|
||||||
|
// Control the line ending. See options at https://github.com/ryanve/eol
|
||||||
|
|
||||||
|
locales: supportedLanguages,
|
||||||
|
// An array of the locales in your applications
|
||||||
|
|
||||||
|
namespaceSeparator: false,
|
||||||
|
// Namespace separator used in your translation keys
|
||||||
|
// If you want to use plain english keys, separators such as `.` and `:` will conflict. You might want to set `keySeparator: false` and `namespaceSeparator: false`. That way, `t('Status: Loading...')` will not think that there are a namespace and three separator dots for instance.
|
||||||
|
|
||||||
|
output: "src/lang/$LOCALE/$NAMESPACE.json",
|
||||||
|
// Supports $LOCALE and $NAMESPACE injection
|
||||||
|
// Supports JSON (.json) and YAML (.yml) file formats
|
||||||
|
// Where to write the locale files relative to process.cwd()
|
||||||
|
|
||||||
|
pluralSeparator: "_",
|
||||||
|
// Plural separator used in your translation keys
|
||||||
|
// If you want to use plain english keys, separators such as `_` might conflict. You might want to set `pluralSeparator` to a different string that does not occur in your keys.
|
||||||
|
// If you don't want to generate keys for plurals (for example, in case you are using ICU format), set `pluralSeparator: false`.
|
||||||
|
|
||||||
|
input: ["./src/**/*.{vue,ts}"],
|
||||||
|
// An array of globs that describe where to look for source files
|
||||||
|
// relative to the location of the configuration file
|
||||||
|
|
||||||
|
sort: false,
|
||||||
|
// Whether or not to sort the catalog. Can also be a [compareFunction](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#parameters)
|
||||||
|
|
||||||
|
verbose: false,
|
||||||
|
// Display info about the parsing including some stats
|
||||||
|
|
||||||
|
failOnWarnings: false,
|
||||||
|
// Exit with an exit code of 1 on warnings
|
||||||
|
|
||||||
|
failOnUpdate: false,
|
||||||
|
// Exit with an exit code of 1 when translations are updated (for CI purpose)
|
||||||
|
|
||||||
|
customValueTemplate: null,
|
||||||
|
// If you wish to customize the value output the value as an object, you can set your own format.
|
||||||
|
//
|
||||||
|
// - ${defaultValue} is the default value you set in your translation function.
|
||||||
|
// - ${filePaths} will be expanded to an array that contains the absolute
|
||||||
|
// file paths where the translations originated in, in case e.g., you need
|
||||||
|
// to provide translators with context
|
||||||
|
//
|
||||||
|
// Any other custom property will be automatically extracted from the 2nd
|
||||||
|
// argument of your `t()` function or tOptions in <Trans tOptions={...} />
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// For `t('my-key', {maxLength: 150, defaultValue: 'Hello'})` in
|
||||||
|
// /path/to/your/file.js,
|
||||||
|
//
|
||||||
|
// Using the following customValueTemplate:
|
||||||
|
//
|
||||||
|
// customValueTemplate: {
|
||||||
|
// message: "${defaultValue}",
|
||||||
|
// description: "${maxLength}",
|
||||||
|
// paths: "${filePaths}",
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Will result in the following item being extracted:
|
||||||
|
//
|
||||||
|
// "my-key": {
|
||||||
|
// "message": "Hello",
|
||||||
|
// "description": 150,
|
||||||
|
// "paths": ["/path/to/your/file.js"]
|
||||||
|
// }
|
||||||
|
|
||||||
|
resetDefaultValueLocale: null,
|
||||||
|
// The locale to compare with default values to determine whether a default value has been changed.
|
||||||
|
// If this is set and a default value differs from a translation in the specified locale, all entries
|
||||||
|
// for that key across locales are reset to the default value, and existing translations are moved to
|
||||||
|
// the `_old` file.
|
||||||
|
|
||||||
|
i18nextOptions: null,
|
||||||
|
// If you wish to customize options in internally used i18next instance, you can define an object with any
|
||||||
|
// configuration property supported by i18next (https://www.i18next.com/overview/configuration-options).
|
||||||
|
// { compatibilityJSON: 'v3' } can be used to generate v3 compatible plurals.
|
||||||
|
|
||||||
|
yamlOptions: null,
|
||||||
|
// If you wish to customize options for yaml output, you can define an object here.
|
||||||
|
// Configuration options are here (https://github.com/nodeca/js-yaml#dump-object---options-).
|
||||||
|
// Example:
|
||||||
|
// {
|
||||||
|
// lineWidth: -1,
|
||||||
|
// }
|
||||||
|
};
|
13
index.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" href="/favicon.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Arsea</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
49
package.json
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"name": "arsea",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite --port=8000",
|
||||||
|
"build": "run-p type-check \"build-only {@}\" --",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"build-only": "vite build",
|
||||||
|
"type-check": "vue-tsc --build --force",
|
||||||
|
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
|
||||||
|
"format": "prettier --write src/",
|
||||||
|
"translations": "i18next -c i18next-parser-config.ts"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"i18next": "^23.15.1",
|
||||||
|
"i18next-browser-languagedetector": "^8.0.0",
|
||||||
|
"i18next-parser": "^9.0.2",
|
||||||
|
"i18next-vue": "^5.0.0",
|
||||||
|
"pinia": "^2.1.7",
|
||||||
|
"vue": "^3.4.29",
|
||||||
|
"vue-router": "^4.3.3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@fontsource-variable/fira-code": "^5.1.0",
|
||||||
|
"@fontsource-variable/material-symbols-outlined": "^5.1.0",
|
||||||
|
"@fontsource-variable/open-sans": "^5.1.0",
|
||||||
|
"@rushstack/eslint-patch": "^1.8.0",
|
||||||
|
"@tsconfig/node20": "^20.1.4",
|
||||||
|
"@types/node": "^20.14.5",
|
||||||
|
"@vitejs/plugin-vue": "^5.0.5",
|
||||||
|
"@vue/eslint-config-prettier": "^9.0.0",
|
||||||
|
"@vue/eslint-config-typescript": "^13.0.0",
|
||||||
|
"@vue/tsconfig": "^0.5.1",
|
||||||
|
"autoprefixer": "^10.4.20",
|
||||||
|
"daisy-ui-kit": "^3.0.11",
|
||||||
|
"daisyui": "^4.12.12",
|
||||||
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-plugin-vue": "^9.23.0",
|
||||||
|
"npm-run-all2": "^6.2.0",
|
||||||
|
"postcss": "^8.4.47",
|
||||||
|
"prettier": "^3.2.5",
|
||||||
|
"tailwindcss": "^3.4.13",
|
||||||
|
"typescript": "~5.4.0",
|
||||||
|
"vite": "^5.3.1",
|
||||||
|
"vue-tsc": "^2.0.21"
|
||||||
|
}
|
||||||
|
}
|
6
postcss.config.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
BIN
public/favicon.ico
Normal file
After Width: | Height: | Size: 4.2 KiB |
13
src/App.vue
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { RouterView } from "vue-router";
|
||||||
|
import Header from "./components/layout/header/Header.vue";
|
||||||
|
import Footer from "./components/layout/Footer.vue";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Header />
|
||||||
|
|
||||||
|
<RouterView />
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</template>
|
4
src/assets/fonts.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// Supports weights 300-800
|
||||||
|
import "@fontsource-variable/open-sans";
|
||||||
|
// Supports weights 300-700
|
||||||
|
import "@fontsource-variable/fira-code";
|
9
src/assets/images/logo1.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="78mm" height="78mm" version="1.1" viewBox="0 0 78 78" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -22.863 -22.393)">
|
||||||
|
<path d="m337.74 218.43c-0.302 0.339-0.79 0.438-1.203 0.247-6.225-2.867-12.104-4.572-18.68-4.78-21.254-0.937-39.482 19.132-39.705 39.814-0.614 20.52 19.033 39.178 39.671 32.783 18.932-3.111 46.745-11.412 62.414 3.3 0.665 0.72-0.412 1.854-1.151 1.134-20.653-15.819-52.252 3.344-75.063 3.566-41.974-2.236-51.617-64.582-18.597-85.794 16.251-11.385 41.173-8.195 52.39 8.46 0.267 0.393 0.239 0.915-0.076 1.27z" fill="#222221"/>
|
||||||
|
<path d="m87.176 290.8c0-0.495 0.327-0.933 0.801-1.075 5.958-1.78 11.764-3.452 17.388-5.319 9.823-3.283 19.583-7.208 28.547-12.351 46.79-25.357 60.375-92.998 118.14-101.21 20.9-3.721 43.007 0.767 60.283 13.203 11.089 8.447 23.254 20.806 25.624 34.278-16.474-17.096-37.368-33.688-63.765-33.011-69.403 1.712-70.409 71.411-131.27 96.953-17.195 7.366-36.065 9.835-54.646 9.651-0.612-4e-3 -1.107-0.506-1.107-1.121z" fill="#222221"/>
|
||||||
|
<path d="m315.23 278.16c-9.573 3.935-21.46-1.92-27.07-10.288-6.263-8.883-6.553-21.122-1.844-30.761 5.08-10.998 18.601-19.605 30.493-15.778-4e-3 0.145-0.123 0.259-0.268 0.258-3.645-0.021-7.281 0.693-10.635 2.08-27.693 11.168-22.017 55.381 9.324 54.489z" fill="#222221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
12
src/assets/images/logo2.svg
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="85mm" height="85mm" version="1.1" viewBox="0 0 85 85" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -117.86 -19.401)" fill="#222221">
|
||||||
|
<path d="m483.74 235.13c-8.134 15.929-25.513 24.258-37.695 15.827-0.362-0.123-0.499-0.862-7e-3 -0.938 14.901-0.167 30.102-12.652 36.381-31.111-0.302 5.497 0.158 11.028 1.321 16.222z"/>
|
||||||
|
<path d="m600.69 222.3c0.043 2.362 0.243 4.727 0.601 7.083-28.379 55.519-108 68.261-118.69-1.388-0.411-4.318-0.365-8.611 0.152-12.963 0.1-1.892 2.832-17.291 4.826-12.862 0.483 7.286 1.733 14.409 4.063 20.871 23.007 59.555 89.559 22.473 114.83-26.372-4.009 7.832-5.933 16.657-5.781 25.631z"/>
|
||||||
|
<path d="m648.15 249.68c-0.617-0.166-1.228-0.344-1.839-0.536-3.048-0.946-5.966-2.237-8.727-3.818-0.922-0.757-1.83-1.573-2.709-2.436-2.529-2.472-4.836-5.382-6.794-8.416-0.243-0.382-0.496-0.758-0.734-1.141l-0.672-1.162-0.666-1.169-0.615-1.17c-0.424-0.78-0.786-1.567-1.149-2.348-0.372-0.787-0.705-1.568-1.032-2.349-2.587-6.271-3.89-12.337-4.345-17.906-0.42-5.564-0.056-10.729 1.448-15.201l0.503 0.214c0.183 2.615 0.435 5.262 0.777 7.926 0.317 2.665 0.713 5.355 1.234 8.069 1.042 5.427 2.536 10.997 4.825 16.499 2.224 5.491 5.34 10.971 9.362 15.574 1.998 2.305 4.195 4.364 6.477 6.139 1.519 1.197 3.079 2.27 4.656 3.231z"/>
|
||||||
|
<path d="m518.43 252.01c-0.575-0.192-1.149-0.398-1.711-0.624-2.652-1.026-5.159-2.383-7.517-4.012-1.608-1.84-3.1-3.839-4.43-5.901-0.248-0.383-0.496-0.758-0.733-1.148l-0.672-1.156-0.666-1.169-0.62-1.17c-0.418-0.779-0.781-1.566-1.144-2.347-0.372-0.787-0.705-1.568-1.037-2.349-2.581-6.277-3.884-12.336-4.339-17.906-0.419-5.57-0.056-10.729 1.447-15.2l0.503 0.207c0.183 2.622 0.435 5.262 0.772 7.933 0.316 2.665 0.717 5.354 1.239 8.068 1.042 5.427 2.536 10.99 4.824 16.499 2.224 5.483 5.34 10.963 9.36 15.573 1.481 1.705 3.072 3.283 4.724 4.702z"/>
|
||||||
|
<path d="m726.47 221.14c-10.065 31.325-36.126 50.286-61.612 54.098-21.085 3.258-44.758-5.761-56.595-26.106-0.68-1.182-1.324-2.384-1.957-3.586-0.565-1.243-1.14-2.479-1.654-3.729-5.57-13.397-5.472-31.19 1.818-45.141 0.648-1.185 1.284-2.362 2.019-3.484 0.414-0.816 1.164-1.323 1.959-1.022 0.444 0.182 0.696 0.578 0.703 0.991 4e-3 0.503 0.021 2.583 0.023 3.044 0.023 1.017 0.096 2.026 0.144 3.042 1.431 26.086 17.444 45.218 36.841 50.263 18.542 5.048 39.059-2.21 55.474-16.604 9.884-8.654 18.176-19.993 23.711-33.121-0.196 0.496-0.367 1.004-0.543 1.513-0.696 2.247-1.137 4.562-1.34 6.93-0.015 0.145-0.024 0.283-0.034 0.421-0.032 0.342-0.05 0.667-0.063 1.005-0.121 2.4-7e-3 4.836 0.297 7.162l0.189 1.322c0.132 0.76 0.271 1.513 0.445 2.263 0.056 0.249 0.111 0.491 0.175 0.739z"/>
|
||||||
|
<path d="m766.45 243.5c-19.831 15.339-46.152-12.082-40.304-39.739 1.625-6.256 2.371-7.085 2.873-0.146 2.841 23.568 19.543 39.212 37.431 39.885z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
15
src/assets/images/logo3.svg
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="80mm" height="80mm" version="1.1" viewBox="0 0 80 80" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -214.6 -20.418)">
|
||||||
|
<path d="m1070.4 179c-1.535 0.026-4.202-1.606-5.851-1.75-0.029-3e-3 -0.057-7e-3 -0.085-0.014-2.108-0.536-4.227-0.823-6.384-0.9-12.654-0.331-25.283 9.301-26.752 22.18-1.977 10.996 4.432 23.333 15.462 26.599 1.789 0.574 3.681 0.85 5.606 0.911 0.66-0.01 0.737 1.033 0.076 1.114-9.017 1.541-18.103-3.332-23.195-10.688-11.382-15.951-3.568-43.489 16.276-48.293 9.551-2.333 20.482 1.674 25.437 9.966 0.089 0.15 0.094 0.303 0.047 0.446-0.087 0.266-0.357 0.424-0.637 0.429z" fill="#222221"/>
|
||||||
|
<path d="m1112.3 247.31c-1.535 0.026-4.202-1.606-5.851-1.75-0.029-2e-3 -0.057-7e-3 -0.085-0.014-2.108-0.537-4.227-0.823-6.384-0.9-12.654-0.331-25.283 9.3-26.752 22.18-1.977 10.996 4.432 23.333 15.462 26.599 1.789 0.574 3.681 0.85 5.605 0.911 0.66-0.011 0.737 1.033 0.077 1.114-9.017 1.541-18.103-3.332-23.195-10.687-11.382-15.951-3.568-43.489 16.276-48.293 9.551-2.333 20.482 1.674 25.437 9.966 0.09 0.15 0.094 0.303 0.047 0.446-0.087 0.265-0.357 0.423-0.637 0.428z" fill="#222221"/>
|
||||||
|
<path d="m905.88 226.16c25.121-1.739 47.598-8.88 63.723-30.192 7.969-9.528 14.677-20.22 24.114-28.509 20.837-19.588 56.333-16.347 73.979 5.903 1.043 1.559 5.776 5.75 1.923 5.875-74.706-45.481-75.063 67.587-150.81 52.115-4.329-0.798-8.533-1.979-12.582-3.702-0.579-0.144-0.257-1.116-0.343-1.49z" fill="#222221"/>
|
||||||
|
<g fill="#222221">
|
||||||
|
<path d="m918.81 166.66c-1.594 0.811-5.221 0.463-7.022 1.155-0.032 0.012-0.063 0.021-0.096 0.028-2.482 0.514-4.847 1.297-7.146 2.317-13.423 6.115-21.732 22.652-16.694 36.891 3.545 12.527 16.557 22.176 29.778 19.964 2.167-0.312 4.289-0.989 6.336-1.908 0.686-0.348 1.299 0.705 0.649 1.127-8.657 6.219-20.662 5.754-29.752 0.65-20.066-10.895-25.945-43.729-7.614-58.893 8.812-7.321 22.308-8.705 31.732-2.551 0.17 0.111 0.253 0.27 0.277 0.444 0.044 0.325-0.157 0.628-0.448 0.776z"/>
|
||||||
|
<path d="m918.47 166.48c-2.098 0.986-6.621 0.903-8.966 1.778-0.041 0.015-0.082 0.028-0.124 0.038-3.181 0.741-6.247 1.758-9.255 3.021-17.587 7.545-29.939 25.745-25.234 40.455 3.021 13.012 18.283 22.224 35.169 18.836 2.762-0.502 5.509-1.387 8.19-2.523 0.903-0.423 1.553 0.646 0.687 1.145-11.604 7.28-26.653 7.733-37.502 3.033-23.992-9.978-27.619-44.351-2.818-61.884 11.926-8.462 29.062-10.993 40.211-5.206 0.201 0.105 0.288 0.266 0.297 0.449 0.017 0.341-0.272 0.678-0.655 0.858z"/>
|
||||||
|
<path d="m1110 241.54c-17.646-22.25-53.142-25.491-73.979-5.903-9.437 8.29-16.144 18.981-24.114 28.51-13.181 17.421-30.607 25.372-50.251 28.645-14.541 2.422-27.538-9.84-25.379-24.422 0.033-0.226 0.07-0.451 0.111-0.676 1.469-12.879 14.098-22.511 26.752-22.18 2.156 0.077 4.276 0.363 6.383 0.9 0.029 5e-3 0.057 0.01 0.086 0.014 1.649 0.144 4.316 1.776 5.85 1.75 0.28-5e-3 0.55-0.162 0.638-0.428 0.047-0.143 0.043-0.297-0.047-0.447-4.955-8.292-15.886-12.299-25.437-9.966-19.844 4.804-27.657 32.343-16.276 48.293 3.095 4.47 7.665 8.021 12.797 9.775 0.942 0.322 1.886 0.641 2.813 1.004 3.609 1.413 7.336 2.417 11.161 3.122 75.751 15.471 76.108-97.597 150.81-52.115 3.854-0.126-0.879-4.317-1.922-5.876z"/>
|
||||||
|
</g>
|
||||||
|
<path d="m811.09 295.51c25.121-1.739 47.599-8.881 63.723-30.192 7.969-9.528 14.677-20.22 24.114-28.51 20.837-19.588 56.333-16.347 73.979 5.903 1.043 1.559 5.776 5.749 1.923 5.875-74.706-45.481-75.063 67.587-150.81 52.115-4.329-0.797-8.533-1.979-12.582-3.701-0.58-0.144-0.257-1.116-0.343-1.49z" fill="#222221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.5 KiB |
13
src/assets/images/logo4.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="83mm" height="83mm" version="1.1" viewBox="0 0 83 83" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -21.734 -119.27)">
|
||||||
|
<g fill="#222221">
|
||||||
|
<path d="m83.02 655.01c-0.137-0.151-0.164-0.374-0.061-0.55 1.871-3.206 4.949-5.808 8.638-7.352 1.901-0.799 3.969-1.288 6.092-1.456 2.124-0.164 4.304 0.018 6.411 0.53 4.229 1.016 8.04 3.503 10.731 6.737 2.73 3.229 4.498 7.023 5.641 10.863 0.568 1.928 0.932 3.901 1.093 5.877 0.077 0.988 0.109 1.977 0.09 2.961-0.016 0.492-0.02 0.983-0.057 1.472-0.04 0.494-0.085 0.992-0.139 1.485-0.256 1.974-0.727 3.913-1.412 5.762-0.688 1.849-1.609 3.597-2.698 5.214-1.1 1.612-2.406 3.067-3.847 4.348-0.737 0.624-1.485 1.229-2.293 1.75-0.391 0.276-0.813 0.51-1.22 0.758-0.425 0.222-0.839 0.46-1.276 0.654-0.857 0.418-1.756 0.74-2.655 1.031-0.912 0.256-1.825 0.49-2.759 0.605-0.457 0.076-0.924 0.094-1.382 0.137-9e-3 1e-3 -0.018 1e-3 -0.027 2e-3 -0.463 7e-3 -0.921 0.043-1.381 0.016-0.778-3e-3 -1.55-0.096-2.31-0.217-0.243-0.038-0.413-0.262-0.389-0.507 0.023-0.234 0.218-0.412 0.453-0.419 1.597-0.05 3.167-0.28 4.647-0.771 0.809-0.239 1.583-0.578 2.338-0.928 0.743-0.385 1.471-0.785 2.148-1.266 1.366-0.935 2.584-2.058 3.647-3.293 1.046-1.254 1.946-2.616 2.647-4.066 1.428-2.89 2.121-6.069 2.126-9.202-3e-3 -0.393-0.014-0.783-0.025-1.176-0.015-0.399-0.06-0.795-0.091-1.191-0.073-0.791-0.195-1.574-0.338-2.348-0.289-1.547-0.736-3.052-1.327-4.481-1.166-2.871-3.073-5.352-5.28-7.24-1.095-0.958-2.245-1.799-3.435-2.532s-2.412-1.392-3.707-1.902c-2.573-1.048-5.454-1.559-8.536-1.382-0.769 0.046-1.553 0.118-2.342 0.25-0.791 0.124-1.595 0.285-2.4 0.5-1.532 0.379-3.061 0.94-4.672 1.583-0.181 0.072-0.389 0.026-0.52-0.119z"/>
|
||||||
|
<path d="m121.26 592.7c-0.416-0.098-0.719-0.463-0.732-0.891-0.205-7.299 0.969-14.651 3.002-21.696 0.755-2.463 1.606-4.904 2.571-7.295 1.947-4.826 4.418-9.516 7.254-13.917 0.981-1.46 1.955-2.943 3.015-4.363 1.265-1.809 2.773-3.491 4.165-5.213 41.194-47.378 118.68-40.349 152.64 11.934 3.018 4.646 5.649 9.538 7.833 14.628 11.55 26.946 9.83 59.404-7.308 83.278-0.504 0.671-0.999 1.341-1.516 1.995-0.844 1.13-1.805 2.189-2.741 3.24-0.288 0.323-0.759 0.41-1.143 0.211-0.557-0.209-0.887-0.796-0.612-1.359 8.122-16.562 10.761-35.528 7.782-53.669-0.141-0.76-0.5-2.698-0.637-3.432-0.163-0.72-0.604-2.659-0.773-3.403-0.2-0.746-0.71-2.649-0.906-3.369-0.218-0.705-0.811-2.602-1.038-3.33-15.781-48.156-69.706-72.713-116.57-53.938-1.261 0.463-3.02 1.284-4.277 1.81-1.405 0.649-2.782 1.359-4.176 2.035-21.725 11.331-38.294 32.181-44.477 56.108-0.157 0.612-0.794 0.847-1.36 0.636z"/>
|
||||||
|
<path d="m174.19 686.52c0.047-0.392 0.334-0.71 0.717-0.807 6.889-1.74 11.858-5.372 15.692-9.819 0.507-0.55 0.962-1.174 1.437-1.746 0.221-0.301 0.79-1.075 1.006-1.365 0.199-0.299 0.741-1.096 0.95-1.403 0.346-0.573 0.861-1.347 1.176-1.931l0.563-0.977c1.451-2.643 2.662-5.421 3.684-8.269 0.231-0.613 0.509-1.524 0.734-2.151 0.21-0.733 0.458-1.446 0.664-2.179 0.19-0.739 0.449-1.451 0.618-2.197 0.991-3.725 1.792-7.441 2.371-11.313 0.714-4.762 0.957-9.632 0.56-14.435-1.078-11.129-5.219-22.328-12.856-30.605-0.452-0.515-1.163-1.174-1.648-1.667-0.309-0.279-1.042-0.923-1.344-1.195-0.307-0.251-1.065-0.843-1.384-1.099-0.313-0.237-0.639-0.45-0.959-0.678-0.633-0.473-1.313-0.848-1.979-1.268-1.358-0.767-2.76-1.492-4.236-2.015-1.099-0.427-2.237-0.76-3.39-1.01-0.386-0.08-0.77-0.195-1.163-0.239l-1.178-0.18c-0.394-0.074-0.792-0.073-1.19-0.115-0.398-0.023-0.799-0.086-1.2-0.08l-1.208-0.02c-5.01 0.086-9.85 1.456-14.326 3.915-1.525 0.797-2.977 1.752-4.4 2.765-0.63 0.458-1.491 1.117-2.079 1.612-0.801 0.47-1.623 1.989-2.639 1.16-0.368-0.332-0.422-0.893-0.117-1.284 5.596-7.246 13.745-12.877 22.979-14.369l1.482-0.198c0.495-0.077 0.995-0.083 1.495-0.126 0.5-0.024 1.002-0.089 1.505-0.077l1.512 5e-3c0.507-0.012 1.007 0.05 1.513 0.08 1.517 0.101 3.031 0.309 4.518 0.64 2.001 0.396 3.939 1.041 5.842 1.777 1.409 0.589 2.79 1.244 4.129 1.978 0.462 0.274 1.527 0.888 1.969 1.161 0.402 0.265 1.484 0.988 1.898 1.266 0.711 0.54 1.743 1.268 2.411 1.84 9.323 7.639 15.426 18.525 18.777 29.962 1.116 3.805 2.001 7.674 2.636 11.591 3.018 16.561-0.173 33.383-11.822 46.131-0.737 0.767-1.437 1.546-2.231 2.259-0.389 0.362-0.769 0.727-1.166 1.077-0.432 0.356-1.413 1.19-1.841 1.523-0.624 0.458-1.303 0.974-1.933 1.412-0.906 0.578-1.77 1.18-2.722 1.683-5.492 3.129-11.991 4.749-18.23 3.789-1.77-0.278-3.475-0.772-5.062-1.455-0.39-0.168-0.628-0.568-0.577-0.989z"/>
|
||||||
|
</g>
|
||||||
|
<path d="m84.044 655.01c-0.826 0.678-1.969-0.323-1.407-1.231 2.513-4.095 5.893-7.862 9.745-10.933 5.561-4.38 12.203-7.358 19.222-8.555 0.694-0.127 1.788-0.267 2.509-0.348 0.837-0.06 1.651-0.086 2.484-0.125 17.953-0.659 30.883 8.261 41.755 21.396 11.129 13.376 20.17 26.534 37.435 31.427 4.748 1.462 9.712 2.23 14.701 2.663 24.4 2.074 50.376-6.999 67.627-24.705 6.293-6.597 11.131-14.483 13.599-23.365 0.294-1.038 1.823-0.864 1.858 0.214 0.124 3.934-0.299 7.946-1.236 11.869-0.849 3.692-2.179 7.271-3.787 10.705-0.336 0.682-0.666 1.374-1.03 2.044-13.469 24.945-41.906 40.056-69.875 41.505-2.744 0.125-5.457 0.111-8.201 0.033-6.377-0.249-12.769-1.119-18.957-2.901-14.387-3.946-26.404-13.301-35.291-25.03-7.727-9.697-13.129-20.643-22.596-27.983-0.924-0.724-1.899-1.354-2.89-1.977-15.156-8.838-32.362-5.743-45.665 5.297z" fill="#222221"/>
|
||||||
|
<path d="m395.5 687.68c0 0.376-0.221 0.72-0.566 0.871-13.702 5.889-28.6 7.943-43.651 6.39-23.077-2.283-44.724-14.519-61.01-30.798-6.031-5.964-11.658-12.568-16.727-19.276-13.624-17.767-21.81-34.225-34.935-49.9l-0.567-0.67c-1.092-1.258-2.261-2.532-3.423-3.664-2.146-2.202-4.488-4.225-6.928-5.987-4.329-3.123-9.127-5.396-14.336-6.965-0.579-0.167-1.15-0.359-1.749-0.509l-0.835-0.227c-0.346-0.102-0.728-0.333-1.063-0.414-0.226-0.071-0.49-0.168-0.717-0.255-0.949-0.153-1.957-0.291-2.913-0.388l-1.707-0.158c-0.574-0.041-1.149-0.058-1.735-0.095l-1.76-0.021c-0.59 0.013-1.191 5e-3 -1.794 0.026-0.598 0.039-1.21 0.048-1.818 0.105-17.733 1.294-33.731 11.13-48.273 21.881-0.302 0.219-0.705 0.243-1.029 0.058l-1.414-0.808c-0.45-0.257-0.613-0.829-0.362-1.282 11.256-20.64 30.185-38.466 53.866-43.016 2.338-0.454 4.742-0.787 7.117-1.001 1.114-0.054 2.257-0.2 3.366-0.145l1.343 0.031c1.257 0.051 2.634 0.129 3.882 0.228 78.11 7.117 67.689 117.34 160.05 131.67 6.203 0.995 12.486 1.536 18.774 1.741 0.512 0.016 0.918 0.432 0.918 0.944v1.638z" fill="#222221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.2 KiB |
9
src/assets/images/logo5.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="86mm" height="86mm" version="1.1" viewBox="0 0 86 86" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -117.54 -118.81)">
|
||||||
|
<path d="m549.35 646.73c33.11-12.297 70.56-13.382 102.17 4.694 0.752 0.43 1.069 1.466 0.728 2.343-0.188 0.482-0.549 0.848-0.992 1-33.064 11.319-70.41 12.472-102.09-4.69-0.414-0.225-0.723-0.647-0.845-1.152-0.224-0.927 0.227-1.898 1.028-2.195z" fill="#222221"/>
|
||||||
|
<path d="m767.73 609.27c-11.3 12.861-25.178 22.02-40.174 27.396-1.523 0.548-3.056 1.055-4.604 1.519-5.596 1.586-11.992 2.484-18.782 2.484-10.315 0-19.708-2.068-26.788-5.467-0.01-3e-3 -0.021-0.01-0.031-0.014-1.069-0.562-2.145-1.142-3.227-1.743-15.087-8.331-31.018-19.746-46.622-28.8-10.168-6.515-24.713-13.737-41.85-18.693-23.442-6.78-45.274-8.148-57.213-5.503-0.087-3e-3 -0.171-7e-3 -0.258-0.01 12.013-13.158 28.66-20.089 45.312-20.469 38.923-0.59 71.241 29.041 106.48 40.893 0.894 0.321 1.792 0.636 2.693 0.936 18.192 6.067 37.351 7.556 56.514 7.653 6.78 0.031 13.564-0.108 20.302-0.283 2.695-0.022 5.409-0.064 8.249 0.101z" fill="#222221"/>
|
||||||
|
<path d="m690.58 642.28-4.579-0.489-4.953-0.528c-1.764-0.241-3.594-0.542-5.467-0.908-1.844-0.36-3.633-0.761-5.334-1.191-0.339-0.087-0.674-0.175-1.006-0.266-0.224-0.059-0.444-0.119-0.66-0.178-0.22-0.06-0.437-0.119-0.65-0.178-3.535-0.971-6.41-1.837-6.459-1.837-25.856-7.891-52.731-17.518-79.425-14.741-29.387 2.284-56.637 19.816-87.253 16.159-18.524-2.033-36.076-12.254-48.994-27.372 56.256 18.419 77.239-15.827 124.14-18.632h12.299c22.628 0 49.326 21.154 74.151 36.042 11.094 6.654 21.814 12.054 31.63 13.756 0.858 0.15 1.71 0.272 2.556 0.363z" fill="#222221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
9
src/assets/images/logo6.svg
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="70mm" height="70mm" version="1.1" viewBox="0 0 70 70" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -222.27 -124.9)">
|
||||||
|
<path d="m875.49 651.26-0.441-3.58-0.334-3.594c-0.085-1.2-0.138-2.403-0.208-3.605-0.051-1.203-0.064-2.407-0.098-3.611-0.058-4.818 0.175-9.643 0.689-14.44 1.074-9.591 3.286-19.046 6.405-28.176 0.381-1.145 0.809-2.272 1.211-3.41 0.409-1.135 0.864-2.252 1.294-3.379 0.435-1.125 0.928-2.226 1.39-3.34 0.468-1.112 0.981-2.203 1.469-3.305 2.009-4.384 4.212-8.675 6.583-12.87 4.743-8.388 10.146-16.387 16.04-23.99 5.938-7.57 12.357-14.746 19.141-21.544 3.392-3.399 6.877-6.704 10.444-9.915 1.785-1.604 3.584-3.192 5.415-4.743 1.834-1.548 3.687-3.071 5.556-4.574 7.484-6.002 15.255-11.639 23.289-16.867 4.03-2.594 8.123-5.088 12.276-7.475 1.035-0.602 2.081-1.186 3.127-1.769 1.042-0.589 2.098-1.156 3.15-1.726 2.112-1.129 4.244-2.219 6.384-3.293l0.891 1.705c-3.365 3.813-6.767 7.348-10.123 10.851l-9.949 10.36-9.737 10.147-4.779 5.04-4.727 5.019c-6.249 6.701-12.349 13.377-18.235 20.121-5.884 6.746-11.557 13.554-16.952 20.487-5.39 6.937-10.512 13.988-15.286 21.229-4.778 7.241-9.188 14.675-13.214 22.396l-1.483 2.914c-0.476 0.978-0.982 1.954-1.44 2.945-0.463 0.988-0.961 1.974-1.409 2.975-0.433 1.004-0.93 1.999-1.364 3.011-1.788 4.039-3.457 8.178-5.009 12.441-1.55 4.263-2.996 8.65-4.311 13.193-1.315 4.545-2.485 9.234-3.746 14.145z" fill="#222221"/>
|
||||||
|
<path d="m1044.6 646.58v0.094c0 0.567-0.01 1.08-0.024 1.562v0.021c-0.049 2.111-0.186 4.252-0.406 6.384-0.055 0.592-0.128 1.22-0.222 1.979-0.156 1.195-0.32 2.312-0.503 3.404 0 9e-3 0 0.018-0.01 0.03-0.055 0.354-0.119 0.726-0.192 1.135-0.442 2.431-0.997 4.892-1.647 7.314-0.143 0.531-0.299 1.089-0.47 1.662-4.191 14.417-11.846 27.63-22.133 38.204-10.825 11.123-24.049 18.681-38.25 21.85-0.689 0.152-1.36 0.29-2.046 0.427-0.787 0.146-1.433 0.262-2.04 0.357-0.531 0.085-0.97 0.156-1.382 0.214-0.021 3e-3 -0.046 9e-3 -0.073 0.012-2.635 0.448-5.31 0.775-7.994 0.973-0.165 3e-3 -0.333 3e-3 -0.497 3e-3 -0.717 0-1.412-0.012-2.123-0.031-0.811-0.027-1.476-0.055-2.098-0.094-0.546-0.034-0.997-0.061-1.415-0.094-0.024-3e-3 -0.049-3e-3 -0.076-6e-3 -4.706-0.238-9.44-0.872-14.069-1.882-0.024-6e-3 -0.046-9e-3 -0.067-0.015-8.433-1.839-16.558-4.901-24.15-9.095-7.597-4.197-14.463-9.421-20.413-15.53-4.069-4.175-7.631-8.683-10.656-13.46-4.413-6.969-7.686-14.512-9.733-22.445 7.445 8.217 16.128 14.783 25.919 19.587 6.057 2.971 12.511 5.237 19.187 6.731 6.466 1.449 13.17 2.184 19.929 2.184 10.431 0 21.054-1.775 31.1-5.173 2.312-0.781 4.593-1.647 6.835-2.599 12.121-5.139 23.149-12.761 31.894-22.042 8.027-8.522 14.127-18.312 18.132-29.103 2.318-6.255 3.904-12.776 4.743-19.511 1.052 2.644 1.94 5.374 2.66 8.171 1.535 5.997 2.307 12.313 2.286 18.782z" fill="#222221"/>
|
||||||
|
<path d="m1009.7 728.43c-21.667 9.479-46.698 11.465-71.741 2.074 2.736 0.875 5.514 1.623 8.329 2.236 6e-3 3e-3 0.015 6e-3 0.024 6e-3 4.791 0.994 9.668 1.598 14.554 1.949 0.491 0.04 0.982 0.07 1.47 0.101 0.299 0.015 0.595 0.03 0.894 0.046 0.165 6e-3 0.326 0.015 0.491 0.021 0.082 3e-3 0.162 6e-3 0.244 9e-3 0.183 6e-3 0.363 0.012 0.543 0.018 0.741 0.021 1.473 0.033 2.208 0.033 32.113 0 60.594-20.49 75.453-47.537 0.293-0.528 0.58-1.055 0.857-1.589 1.217-2.321 2.333-4.682 3.346-7.079 0.159-0.381 0.317-0.763 0.467-1.144 0.457-1.116 0.881-2.236 1.29-3.364 0.238-0.659 0.467-1.32 0.686-1.983 0.708-2.126 1.33-4.27 1.867-6.426 0.137-0.54 0.265-1.083 0.387-1.623v-6e-3c0.082-0.36 0.161-0.72 0.238-1.083 0.155-0.72 0.299-1.443 0.433-2.169 0.067-0.363 0.131-0.726 0.192-1.089 0.037-0.211 0.073-0.424 0.107-0.638 0.027-0.149 0.049-0.299 0.073-0.451 0.037-0.216 0.067-0.436 0.101-0.656 0.021-0.143 0.043-0.29 0.064-0.436 0.01-0.07 0.021-0.141 0.031-0.211 0.037-0.244 0.07-0.491 0.101-0.738 0.01-0.049 0.012-0.094 0.018-0.143 0.046-0.366 0.091-0.729 0.134-1.095s0.082-0.729 0.119-1.095c0.036-0.366 0.07-0.732 0.104-1.098 0.031-0.366 0.061-0.732 0.085-1.098 0.028-0.366 0.052-0.732 0.073-1.098 0.01-0.131 0.015-0.262 0.021-0.396 0.012-0.235 0.024-0.467 0.034-0.702 0.058-1.333 0.082-2.666 0.07-3.998 0-0.235-0.01-0.467-0.01-0.698-0.01-0.467-0.021-0.933-0.04-1.4-0.018-0.467-0.039-0.93-0.067-1.397-0.012-0.232-0.027-0.467-0.043-0.698-0.018-0.266-0.037-0.528-0.055-0.79-0.024-0.281-0.046-0.561-0.073-0.839-0.01-0.125-0.021-0.253-0.034-0.378 0-0.031-0.01-0.058-0.01-0.085-0.043-0.467-0.091-0.93-0.146-1.394-0.027-0.235-0.055-0.467-0.082-0.698-0.028-0.232-0.06-0.464-0.092-0.696-0.033-0.231-0.064-0.463-0.097-0.694v-2e-3c-0.057-0.385-0.117-0.773-0.18-1.159-0.031-0.192-0.061-0.383-0.095-0.576-0.01-0.064-0.021-0.131-0.033-0.195-0.049-0.284-0.101-0.564-0.153-0.845-0.174-0.924-0.363-1.845-0.573-2.763-0.052-0.232-0.107-0.461-0.162-0.689-0.11-0.461-0.223-0.918-0.345-1.375-0.095-0.36-0.189-0.717-0.29-1.073-0.091-0.327-0.186-0.656-0.281-0.982-0.104-0.341-0.204-0.683-0.311-1.025s-0.214-0.68-0.326-1.022c-0.232-0.701-0.476-1.4-0.729-2.098-0.256-0.698-0.521-1.394-0.796-2.086-0.094-0.232-0.189-0.464-0.287-0.695-0.287-0.689-0.583-1.379-0.894-2.065s-0.634-1.373-0.973-2.056c-0.223-0.454-0.451-0.909-0.686-1.357-0.47-0.903-0.964-1.805-1.482-2.699-0.256-0.445-0.518-0.888-0.787-1.33-1.613-2.666-3.431-5.276-5.465-7.823 0.01 0.125 0.015 0.253 0.021 0.378-0.208-0.268-0.418-0.537-0.631-0.802v-3e-3c-10.034-13.414-24.177-25.08-40.321-35.389l-0.107-0.07c-0.393-0.253-0.79-0.506-1.177-0.772-0.15-0.092-0.296-0.192-0.442-0.293-22.481-15.341-29.92-44.721-18.254-68.673 1-2.05 2.135-4.056 3.416-6.015 4.923-7.521 11.389-13.426 18.712-17.559-11.026 21.942-5.856 48.62 12.34 64.879 0.01 0.012 0.021 0.018 0.034 0.024 0.897 0.76 1.809 1.516 2.714 2.272 0.01 3e-3 0.012 0.012 0.021 0.015 7.122 5.911 14.509 11.776 21.636 18.041 4.301 3.773 8.186 7.796 11.669 12.02 41.899 50.756 25.588 130.52-37.403 158.08z" fill="#222221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.7 KiB |
8
src/assets/images/logo7.svg
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="83mm" height="83mm" version="1.1" viewBox="0 0 83 83" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -18.861 -215.79)" fill="#222221">
|
||||||
|
<path d="m383.44 1005c-17.007 4.876-34.86 3.884-51.505-1.426-3.639-1.165-7.214-2.531-10.718-4.086-13.399-5.958-25.641-14.693-35.527-25.297-9.518 9.48-20.9 17.454-33.274 23.201-2.477-1.253-4.923-2.556-7.337-3.919-1.086-0.604-2.166-1.231-3.236-1.857-3.053-1.791-6.053-3.664-8.999-5.619 1.794-1.073 3.563-2.185 5.301-3.34 14.275-9.418 27.092-20.888 37.337-34.514l0.277-0.393 6.405-9.068c1.948-2.764 6.05-2.738 7.96 0.047 4.454 6.475 9.984 14.52 13.969 18.801 10.4 11.785 22.569 21.772 36.085 29.704 3.563 2.093 7.221 4.041 10.96 5.842 2.855 1.372 5.757 2.657 8.71 3.859l1.599 0.655 1.618 0.63c1.07 0.441 2.165 0.821 3.258 1.237 0.985 0.331 2.357 0.847 3.318 1.177 4.463 1.524 9.059 2.915 13.799 4.366z"/>
|
||||||
|
<path d="m268.93 1005c-14.19 4.067-28.967 4.048-43.138 0.851-2.817-0.637-5.61-1.396-8.365-2.278-3.638-1.164-7.214-2.529-10.717-4.085-0.453-0.202-0.913-0.41-1.366-0.619-12.867-5.934-24.613-14.435-34.161-24.68-10.644 10.607-23.621 19.321-37.706 25.152-3.521 1.458-7.11 2.732-10.748 3.809-16.217 4.807-33.419 5.72-49.899 1.335 11.06-2.945 21.986-6.693 32.323-11.519 3.644-1.703 7.214-3.534 10.693-5.518 2.652-1.507 5.255-3.105 7.79-4.789 14.276-9.419 27.093-20.89 37.339-34.516l0.276-0.392 6.406-9.07c1.947-2.762 6.05-2.738 7.961 0.049 4.452 6.473 9.982 14.52 13.969 18.801 10.399 11.783 22.567 21.771 36.083 29.702 0.827 0.484 1.66 0.968 2.499 1.433 2.768 1.562 5.591 3.025 8.463 4.409 2.854 1.372 5.757 2.658 8.709 3.858l1.598 0.655 1.617 0.631c0.361 0.147 0.722 0.288 1.084 0.422 0.723 0.275 1.452 0.539 2.174 0.814 0.986 0.331 2.358 0.845 3.319 1.176 4.465 1.528 9.058 2.918 13.797 4.369z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
10
src/assets/images/logo8.svg
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="80mm" height="80mm" version="1.1" viewBox="0 0 80 80" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -120.18 -218.25)" fill="inherit">
|
||||||
|
<path d="m462.1 991.44c-10.898-45.855 24.103-47.123 48.506-38.2 35.84 11.907 69.264 33.378 103.56 50.866 32.86 15.751 76.028 41.219 108.75 13.648l0.984 1.283c-65.971 91.633-269.76-141.21-260.42-27.786z"/>
|
||||||
|
<path d="m745.56 911.2c9.995 18.56 13.629 43.419 6.801 64.796-20.208 63.336-106.46 25.444-140.84 1.841-35.901-25.353-78.314-47.174-119.65-37.05-27.206 7.414-36.776 46.657-19.06 74.239l-1.82 1.872c-19.287-18.242-21.185-53.99-5.693-77.227 7.734-11.714 18.886-18.279 30.08-21.968 39.233-11.321 80.111 3.114 115.45 25.526 27.316 19.256 56.347 35.602 87.212 41.274 14.994 2.228 33.931 4.253 42.758-14.908 8.548-16.399 7.875-38.451 2.842-56.708z"/>
|
||||||
|
<path d="m567.39 1024c-23.424-7.831-77.446-52.293-95.856-45.024l-0.587-0.936c23.809-20.928 77.844 24.216 97.013 45.006z"/>
|
||||||
|
<path d="m670.64 952.53c23.69 9.745 79.834 19.812 62.239-34.988l0.833-0.53c15.288 17.12 9.172 45.901-9.786 52.703-18.434 6.932-38.883-0.726-53.552-16.026z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
10
src/assets/images/logo9.svg
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg width="79mm" height="79mm" version="1.1" viewBox="0 0 79 79" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -215.5 -218.63)">
|
||||||
|
<path d="m833.81 1024.3c-0.563-0.212-0.881-0.727-0.761-1.239 9.586-40.963 46.76-62.954 92.676-40.345 51.363 24.968 103.6 78.601 156.69 24.727 0.376-0.381 1.036-0.451 1.507-0.155 0.464 0.292 0.585 0.842 0.273 1.254-25.378 33.537-61.546 37.303-102.05 19.81-31.73-12.406-63.076-36.409-98.875-36.901-21.713 1.81-35.133 19.016-47.886 32.528-0.376 0.397-1.021 0.528-1.57 0.321z" fill="#222221"/>
|
||||||
|
<path d="m815.58 984.63c-0.736-0.372-1.079-1.279-0.782-2.078 27.954-75.078 86.417-62.89 148.14-46.596 25.341 6.099 51.503 8.859 77.259 7.027 25.632-1.739 48.67-14.93 69.616-30.033 0.714-0.515 1.663-0.475 2.333 0.099 0.667 0.572 0.905 1.539 0.569 2.372-18.586 46.11-68.644 68.876-114.18 57.049-40.197-8.77-78.691-31.889-120.06-32.625-27.027-0.304-48.062 20.754-60.848 44.116-0.41 0.75-1.298 1.045-2.041 0.669z" fill="#222221"/>
|
||||||
|
<path d="m833.81 1024.3c-0.563-0.212-0.881-0.727-0.761-1.239 9.586-40.963 46.76-62.954 92.676-40.345 51.363 24.968 103.6 78.601 156.69 24.727 0.376-0.381 1.036-0.451 1.507-0.155 0.464 0.292 0.585 0.842 0.273 1.254-25.378 33.537-61.546 37.303-102.05 19.81-31.73-12.406-63.076-36.409-98.876-36.901-21.714 1.81-35.133 19.016-47.886 32.528-0.375 0.398-1.02 0.528-1.569 0.321z" fill="#222221"/>
|
||||||
|
<path d="m1094.6 985.04c-10.734 16.969-24.763 26.827-40.431 31.645-8.481 2.611-17.44 3.743-26.614 3.723h-0.043c-6.46-0.013-13.03-0.597-19.613-1.639h-0.027c-29.531-5.817-49.489-25.682-80.463-40.829-34.674-16.955-74.421-11.972-95.985 9.075-2.114 1.818-4.161 3.736-6.142 5.717-1.214 1.211-3.139-0.173-2.528-1.812 16.862-45.408 61.361-48.666 102.11-33.808 55.949 18.306 111.86 63.969 168.28 26.365 0.972-0.647 2.094 0.561 1.457 1.566z" fill="#222221"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
1
src/assets/images/logos.source.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
https://www.freepik.com/free-vector/sea-wave-sticker-animated-water-clipart-black-logo-element-business-vector-set_20775638.htm
|
303
src/assets/images/logos.svg
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 27.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 1200 1200" style="enable-background:new 0 0 1200 1200;" xml:space="preserve">
|
||||||
|
<g id="Background">
|
||||||
|
<rect style="fill:#F7F6F5;" width="1200" height="1200"/>
|
||||||
|
</g>
|
||||||
|
<g id="Graphic_Elements">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M549.349,646.734c33.11-12.297,70.56-13.382,102.171,4.694c0.752,0.43,1.069,1.466,0.728,2.343
|
||||||
|
l0,0c-0.188,0.482-0.549,0.848-0.992,1c-33.064,11.319-70.41,12.472-102.09-4.69c-0.414-0.225-0.723-0.647-0.845-1.152l0,0
|
||||||
|
C548.097,648.002,548.548,647.031,549.349,646.734z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M767.733,609.267c-11.3,12.861-25.178,22.02-40.174,27.396c-1.523,0.548-3.056,1.055-4.604,1.519
|
||||||
|
c-5.596,1.586-11.992,2.484-18.782,2.484c-10.315,0-19.708-2.068-26.788-5.467c-0.01-0.003-0.021-0.01-0.031-0.014
|
||||||
|
c-1.069-0.562-2.145-1.142-3.227-1.743c-15.087-8.331-31.018-19.746-46.622-28.8c-10.168-6.515-24.713-13.737-41.85-18.693
|
||||||
|
c-23.442-6.78-45.274-8.148-57.213-5.503c-0.087-0.003-0.171-0.007-0.258-0.01c12.013-13.158,28.66-20.089,45.312-20.469
|
||||||
|
c38.923-0.59,71.241,29.041,106.479,40.893c0.894,0.321,1.792,0.636,2.693,0.936c18.192,6.067,37.351,7.556,56.514,7.653
|
||||||
|
c6.78,0.031,13.564-0.108,20.302-0.283C762.179,609.144,764.893,609.102,767.733,609.267z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M690.575,642.283l-4.579-0.489l-4.953-0.528c-1.764-0.241-3.594-0.542-5.467-0.908
|
||||||
|
c-1.844-0.36-3.633-0.761-5.334-1.191c-0.339-0.087-0.674-0.175-1.006-0.266c-0.224-0.059-0.444-0.119-0.66-0.178
|
||||||
|
c-0.22-0.06-0.437-0.119-0.65-0.178c-3.535-0.971-6.41-1.837-6.459-1.837c-25.856-7.891-52.731-17.518-79.425-14.741
|
||||||
|
c-29.387,2.284-56.637,19.816-87.253,16.159c-18.524-2.033-36.076-12.254-48.994-27.372
|
||||||
|
c56.256,18.419,77.239-15.827,124.144-18.632h12.299c22.628,0,49.326,21.154,74.151,36.042
|
||||||
|
c11.094,6.654,21.814,12.054,31.63,13.756C688.877,642.07,689.729,642.192,690.575,642.283z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M337.743,218.432c-0.302,0.339-0.79,0.438-1.203,0.247c-6.225-2.867-12.104-4.572-18.68-4.78
|
||||||
|
c-21.254-0.937-39.482,19.132-39.705,39.814c-0.614,20.52,19.033,39.178,39.671,32.783c18.932-3.111,46.745-11.412,62.414,3.3
|
||||||
|
c0.665,0.72-0.412,1.854-1.151,1.134c-20.653-15.819-52.252,3.344-75.063,3.566c-41.974-2.236-51.617-64.582-18.597-85.794
|
||||||
|
c16.251-11.385,41.173-8.195,52.39,8.46C338.086,217.555,338.058,218.077,337.743,218.432z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M87.176,290.797c0-0.495,0.327-0.933,0.801-1.075c5.958-1.78,11.764-3.452,17.388-5.319
|
||||||
|
c9.823-3.283,19.583-7.208,28.547-12.351c46.79-25.357,60.375-92.998,118.143-101.208c20.9-3.721,43.007,0.767,60.283,13.203
|
||||||
|
c11.089,8.447,23.254,20.806,25.624,34.278c-16.474-17.096-37.368-33.688-63.765-33.011
|
||||||
|
c-69.403,1.712-70.409,71.411-131.268,96.953c-17.195,7.366-36.065,9.835-54.646,9.651
|
||||||
|
C87.671,291.914,87.176,291.412,87.176,290.797z"/>
|
||||||
|
</g>
|
||||||
|
<path style="fill:#222221;" d="M315.233,278.155c-9.573,3.935-21.46-1.92-27.07-10.288c-6.263-8.883-6.553-21.122-1.844-30.761
|
||||||
|
c5.08-10.998,18.601-19.605,30.493-15.778c-0.004,0.145-0.123,0.259-0.268,0.258c-3.645-0.021-7.281,0.693-10.635,2.08
|
||||||
|
C278.216,234.834,283.892,279.047,315.233,278.155z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M483.736,235.13c-8.134,15.929-25.513,24.258-37.695,15.827c-0.362-0.123-0.499-0.862-0.007-0.938
|
||||||
|
c14.901-0.167,30.102-12.652,36.381-31.111C482.113,224.405,482.573,229.936,483.736,235.13z"/>
|
||||||
|
<path style="fill:#222221;" d="M600.689,222.304c0.043,2.362,0.243,4.727,0.601,7.083
|
||||||
|
c-28.379,55.519-107.998,68.261-118.689-1.388c-0.411-4.318-0.365-8.611,0.152-12.963c0.1-1.892,2.832-17.291,4.826-12.862
|
||||||
|
c0.483,7.286,1.733,14.409,4.063,20.871c23.007,59.555,89.559,22.473,114.828-26.372
|
||||||
|
C602.461,204.505,600.537,213.33,600.689,222.304z"/>
|
||||||
|
</g>
|
||||||
|
<path style="fill:#222221;" d="M648.147,249.678c-0.617-0.166-1.228-0.344-1.839-0.536c-3.048-0.946-5.966-2.237-8.727-3.818
|
||||||
|
c-0.922-0.757-1.83-1.573-2.709-2.436c-2.529-2.472-4.836-5.382-6.794-8.416c-0.243-0.382-0.496-0.758-0.734-1.141l-0.672-1.162
|
||||||
|
l-0.666-1.169l-0.615-1.17c-0.424-0.78-0.786-1.567-1.149-2.348c-0.372-0.787-0.705-1.568-1.032-2.349
|
||||||
|
c-2.587-6.271-3.89-12.337-4.345-17.906c-0.42-5.564-0.056-10.729,1.448-15.201l0.503,0.214c0.183,2.615,0.435,5.262,0.777,7.926
|
||||||
|
c0.317,2.665,0.713,5.355,1.234,8.069c1.042,5.427,2.536,10.997,4.825,16.499c2.224,5.491,5.34,10.971,9.362,15.574
|
||||||
|
c1.998,2.305,4.195,4.364,6.477,6.139C645.01,247.644,646.57,248.717,648.147,249.678z"/>
|
||||||
|
<path style="fill:#222221;" d="M518.433,252.013c-0.575-0.192-1.149-0.398-1.711-0.624c-2.652-1.026-5.159-2.383-7.517-4.012
|
||||||
|
c-1.608-1.84-3.1-3.839-4.43-5.901c-0.248-0.383-0.496-0.758-0.733-1.148l-0.672-1.156l-0.666-1.169l-0.62-1.17
|
||||||
|
c-0.418-0.779-0.781-1.566-1.144-2.347c-0.372-0.787-0.705-1.568-1.037-2.349c-2.581-6.277-3.884-12.336-4.339-17.906
|
||||||
|
c-0.419-5.57-0.056-10.729,1.447-15.2l0.503,0.207c0.183,2.622,0.435,5.262,0.772,7.933c0.316,2.665,0.717,5.354,1.239,8.068
|
||||||
|
c1.042,5.427,2.536,10.99,4.824,16.499c2.224,5.483,5.34,10.963,9.36,15.573C515.19,249.016,516.781,250.594,518.433,252.013z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M726.469,221.136c-10.065,31.325-36.126,50.286-61.612,54.098
|
||||||
|
c-21.085,3.258-44.758-5.761-56.595-26.106c-0.68-1.182-1.324-2.384-1.957-3.586c-0.565-1.243-1.14-2.479-1.654-3.729
|
||||||
|
c-5.57-13.397-5.472-31.19,1.818-45.141c0.648-1.185,1.284-2.362,2.019-3.484c0.414-0.816,1.164-1.323,1.959-1.022
|
||||||
|
c0.444,0.182,0.696,0.578,0.703,0.991c0.004,0.503,0.021,2.583,0.023,3.044c0.023,1.017,0.096,2.026,0.144,3.042
|
||||||
|
c1.431,26.086,17.444,45.218,36.841,50.263c18.542,5.048,39.059-2.21,55.474-16.604c9.884-8.654,18.176-19.993,23.711-33.121
|
||||||
|
c-0.196,0.496-0.367,1.004-0.543,1.513c-0.696,2.247-1.137,4.562-1.34,6.93c-0.015,0.145-0.024,0.283-0.034,0.421
|
||||||
|
c-0.032,0.342-0.05,0.667-0.063,1.005c-0.121,2.4-0.007,4.836,0.297,7.162l0.189,1.322c0.132,0.76,0.271,1.513,0.445,2.263
|
||||||
|
C726.35,220.646,726.405,220.888,726.469,221.136z"/>
|
||||||
|
<path style="fill:#222221;" d="M766.448,243.495c-19.831,15.339-46.152-12.082-40.304-39.739
|
||||||
|
c1.625-6.256,2.371-7.085,2.873-0.146C731.858,227.178,748.56,242.822,766.448,243.495z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M83.02,655.006c-0.137-0.151-0.164-0.374-0.061-0.55c1.871-3.206,4.949-5.808,8.638-7.352
|
||||||
|
c1.901-0.799,3.969-1.288,6.092-1.456c2.124-0.164,4.304,0.018,6.411,0.53c4.229,1.016,8.04,3.503,10.731,6.737
|
||||||
|
c2.73,3.229,4.498,7.023,5.641,10.863c0.568,1.928,0.932,3.901,1.093,5.877c0.077,0.988,0.109,1.977,0.09,2.961
|
||||||
|
c-0.016,0.492-0.02,0.983-0.057,1.472c-0.04,0.494-0.085,0.992-0.139,1.485c-0.256,1.974-0.727,3.913-1.412,5.762
|
||||||
|
c-0.688,1.849-1.609,3.597-2.698,5.214c-1.1,1.612-2.406,3.067-3.847,4.348c-0.737,0.624-1.485,1.229-2.293,1.75
|
||||||
|
c-0.391,0.276-0.813,0.51-1.22,0.758c-0.425,0.222-0.839,0.46-1.276,0.654c-0.857,0.418-1.756,0.74-2.655,1.031
|
||||||
|
c-0.912,0.256-1.825,0.49-2.759,0.605c-0.457,0.076-0.924,0.094-1.382,0.137c-0.009,0.001-0.018,0.001-0.027,0.002
|
||||||
|
c-0.463,0.007-0.921,0.043-1.381,0.016c-0.778-0.003-1.55-0.096-2.31-0.217c-0.243-0.038-0.413-0.262-0.389-0.507l0,0
|
||||||
|
c0.023-0.234,0.218-0.412,0.453-0.419c1.597-0.05,3.167-0.28,4.647-0.771c0.809-0.239,1.583-0.578,2.338-0.928
|
||||||
|
c0.743-0.385,1.471-0.785,2.148-1.266c1.366-0.935,2.584-2.058,3.647-3.293c1.046-1.254,1.946-2.616,2.647-4.066
|
||||||
|
c1.428-2.89,2.121-6.069,2.126-9.202c-0.003-0.393-0.014-0.783-0.025-1.176c-0.015-0.399-0.06-0.795-0.091-1.191
|
||||||
|
c-0.073-0.791-0.195-1.574-0.338-2.348c-0.289-1.547-0.736-3.052-1.327-4.481c-1.166-2.871-3.073-5.352-5.28-7.24
|
||||||
|
c-1.095-0.958-2.245-1.799-3.435-2.532c-1.19-0.733-2.412-1.392-3.707-1.902c-2.573-1.048-5.454-1.559-8.536-1.382
|
||||||
|
c-0.769,0.046-1.553,0.118-2.342,0.25c-0.791,0.124-1.595,0.285-2.4,0.5c-1.532,0.379-3.061,0.94-4.672,1.583
|
||||||
|
c-0.181,0.072-0.389,0.026-0.52-0.119L83.02,655.006z"/>
|
||||||
|
<path style="fill:#222221;" d="M121.255,592.698c-0.416-0.098-0.719-0.463-0.732-0.891c-0.205-7.299,0.969-14.651,3.002-21.696
|
||||||
|
c0.755-2.463,1.606-4.904,2.571-7.295c1.947-4.826,4.418-9.516,7.254-13.917c0.981-1.46,1.955-2.943,3.015-4.363
|
||||||
|
c1.265-1.809,2.773-3.491,4.165-5.213c41.194-47.378,118.685-40.349,152.642,11.934c3.018,4.646,5.649,9.538,7.833,14.628
|
||||||
|
c11.55,26.946,9.83,59.404-7.308,83.278c-0.504,0.671-0.999,1.341-1.516,1.995c-0.844,1.13-1.805,2.189-2.741,3.24
|
||||||
|
c-0.288,0.323-0.759,0.41-1.143,0.211c-0.557-0.209-0.887-0.796-0.612-1.359c8.122-16.562,10.761-35.528,7.782-53.669
|
||||||
|
c-0.141-0.76-0.5-2.698-0.637-3.432c-0.163-0.72-0.604-2.659-0.773-3.403c-0.2-0.746-0.71-2.649-0.906-3.369
|
||||||
|
c-0.218-0.705-0.811-2.602-1.038-3.33c-15.781-48.156-69.706-72.713-116.568-53.938c-1.261,0.463-3.02,1.284-4.277,1.81
|
||||||
|
c-1.405,0.649-2.782,1.359-4.176,2.035c-21.725,11.331-38.294,32.181-44.477,56.108
|
||||||
|
C122.458,592.674,121.821,592.909,121.255,592.698z"/>
|
||||||
|
<path style="fill:#222221;" d="M174.193,686.515c0.047-0.392,0.334-0.71,0.717-0.807c6.889-1.74,11.858-5.372,15.692-9.819
|
||||||
|
c0.507-0.55,0.962-1.174,1.437-1.746c0.221-0.301,0.79-1.075,1.006-1.365c0.199-0.299,0.741-1.096,0.95-1.403
|
||||||
|
c0.346-0.573,0.861-1.347,1.176-1.931l0.563-0.977c1.451-2.643,2.662-5.421,3.684-8.269c0.231-0.613,0.509-1.524,0.734-2.151
|
||||||
|
c0.21-0.733,0.458-1.446,0.664-2.179c0.19-0.739,0.449-1.451,0.618-2.197c0.991-3.725,1.792-7.441,2.371-11.313
|
||||||
|
c0.714-4.762,0.957-9.632,0.56-14.435c-1.078-11.129-5.219-22.328-12.856-30.605c-0.452-0.515-1.163-1.174-1.648-1.667
|
||||||
|
c-0.309-0.279-1.042-0.923-1.344-1.195c-0.307-0.251-1.065-0.843-1.384-1.099c-0.313-0.237-0.639-0.45-0.959-0.678
|
||||||
|
c-0.633-0.473-1.313-0.848-1.979-1.268c-1.358-0.767-2.76-1.492-4.236-2.015c-1.099-0.427-2.237-0.76-3.39-1.01
|
||||||
|
c-0.386-0.08-0.77-0.195-1.163-0.239l-1.178-0.18c-0.394-0.074-0.792-0.073-1.19-0.115c-0.398-0.023-0.799-0.086-1.2-0.08
|
||||||
|
l-1.208-0.02c-5.01,0.086-9.85,1.456-14.326,3.915c-1.525,0.797-2.977,1.752-4.4,2.765c-0.63,0.458-1.491,1.117-2.079,1.612
|
||||||
|
c-0.801,0.47-1.623,1.989-2.639,1.16c-0.368-0.332-0.422-0.893-0.117-1.284c5.596-7.246,13.745-12.877,22.979-14.369l1.482-0.198
|
||||||
|
c0.495-0.077,0.995-0.083,1.495-0.126c0.5-0.024,1.002-0.089,1.505-0.077l1.512,0.005c0.507-0.012,1.007,0.05,1.513,0.08
|
||||||
|
c1.517,0.101,3.031,0.309,4.518,0.64c2.001,0.396,3.939,1.041,5.842,1.777c1.409,0.589,2.79,1.244,4.129,1.978
|
||||||
|
c0.462,0.274,1.527,0.888,1.969,1.161c0.402,0.265,1.484,0.988,1.898,1.266c0.711,0.54,1.743,1.268,2.411,1.84
|
||||||
|
c9.323,7.639,15.426,18.525,18.777,29.962c1.116,3.805,2.001,7.674,2.636,11.591c3.018,16.561-0.173,33.383-11.822,46.131
|
||||||
|
c-0.737,0.767-1.437,1.546-2.231,2.259c-0.389,0.362-0.769,0.727-1.166,1.077c-0.432,0.356-1.413,1.19-1.841,1.523
|
||||||
|
c-0.624,0.458-1.303,0.974-1.933,1.412c-0.906,0.578-1.77,1.18-2.722,1.683c-5.492,3.129-11.991,4.749-18.23,3.789
|
||||||
|
c-1.77-0.278-3.475-0.772-5.062-1.455c-0.39-0.168-0.628-0.568-0.577-0.989L174.193,686.515z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M84.044,655.012c-0.826,0.678-1.969-0.323-1.407-1.231c2.513-4.095,5.893-7.862,9.745-10.933
|
||||||
|
c5.561-4.38,12.203-7.358,19.222-8.555c0.694-0.127,1.788-0.267,2.509-0.348c0.837-0.06,1.651-0.086,2.484-0.125
|
||||||
|
c17.953-0.659,30.883,8.261,41.755,21.396c11.129,13.376,20.17,26.534,37.435,31.427c4.748,1.462,9.712,2.23,14.701,2.663
|
||||||
|
c24.4,2.074,50.376-6.999,67.627-24.705c6.293-6.597,11.131-14.483,13.599-23.365c0.294-1.038,1.823-0.864,1.858,0.214
|
||||||
|
c0.124,3.934-0.299,7.946-1.236,11.869c-0.849,3.692-2.179,7.271-3.787,10.705c-0.336,0.682-0.666,1.374-1.03,2.044
|
||||||
|
c-13.469,24.945-41.906,40.056-69.875,41.505c-2.744,0.125-5.457,0.111-8.201,0.033c-6.377-0.249-12.769-1.119-18.957-2.901
|
||||||
|
c-14.387-3.946-26.404-13.301-35.291-25.03c-7.727-9.697-13.129-20.643-22.596-27.983c-0.924-0.724-1.899-1.354-2.89-1.977
|
||||||
|
C114.553,640.877,97.347,643.972,84.044,655.012z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M395.498,687.685c0,0.376-0.221,0.72-0.566,0.871c-13.702,5.889-28.6,7.943-43.651,6.39
|
||||||
|
c-23.077-2.283-44.724-14.519-61.01-30.798c-6.031-5.964-11.658-12.568-16.727-19.276c-13.624-17.767-21.81-34.225-34.935-49.9
|
||||||
|
l-0.567-0.67c-1.092-1.258-2.261-2.532-3.423-3.664c-2.146-2.202-4.488-4.225-6.928-5.987c-4.329-3.123-9.127-5.396-14.336-6.965
|
||||||
|
c-0.579-0.167-1.15-0.359-1.749-0.509l-0.835-0.227c-0.346-0.102-0.728-0.333-1.063-0.414c-0.226-0.071-0.49-0.168-0.717-0.255
|
||||||
|
c-0.949-0.153-1.957-0.291-2.913-0.388l-1.707-0.158c-0.574-0.041-1.149-0.058-1.735-0.095l-1.76-0.021
|
||||||
|
c-0.59,0.013-1.191,0.005-1.794,0.026c-0.598,0.039-1.21,0.048-1.818,0.105c-17.733,1.294-33.731,11.13-48.273,21.881
|
||||||
|
c-0.302,0.219-0.705,0.243-1.029,0.058l-1.414-0.808c-0.45-0.257-0.613-0.829-0.362-1.282
|
||||||
|
c11.256-20.64,30.185-38.466,53.866-43.016c2.338-0.454,4.742-0.787,7.117-1.001c1.114-0.054,2.257-0.2,3.366-0.145l1.343,0.031
|
||||||
|
c1.257,0.051,2.634,0.129,3.882,0.228c78.11,7.117,67.689,117.338,160.047,131.666c6.203,0.995,12.486,1.536,18.774,1.741
|
||||||
|
c0.512,0.016,0.918,0.432,0.918,0.944V687.685z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M875.491,651.26l-0.441-3.58l-0.334-3.594c-0.085-1.2-0.138-2.403-0.208-3.605
|
||||||
|
c-0.051-1.203-0.064-2.407-0.098-3.611c-0.058-4.818,0.175-9.643,0.689-14.44c1.074-9.591,3.286-19.046,6.405-28.176
|
||||||
|
c0.381-1.145,0.809-2.272,1.211-3.41c0.409-1.135,0.864-2.252,1.294-3.379c0.435-1.125,0.928-2.226,1.39-3.34
|
||||||
|
c0.468-1.112,0.981-2.203,1.469-3.305c2.009-4.384,4.212-8.675,6.583-12.87c4.743-8.388,10.146-16.387,16.04-23.99
|
||||||
|
c5.938-7.57,12.357-14.746,19.141-21.544c3.392-3.399,6.877-6.704,10.444-9.915c1.785-1.604,3.584-3.192,5.415-4.743
|
||||||
|
c1.834-1.548,3.687-3.071,5.556-4.574c7.484-6.002,15.255-11.639,23.289-16.867c4.03-2.594,8.123-5.088,12.276-7.475
|
||||||
|
c1.035-0.602,2.081-1.186,3.127-1.769c1.042-0.589,2.098-1.156,3.15-1.726c2.112-1.129,4.244-2.219,6.384-3.293l0.891,1.705
|
||||||
|
c-3.365,3.813-6.767,7.348-10.123,10.851l-9.949,10.36l-9.737,10.147l-4.779,5.04l-4.727,5.019
|
||||||
|
c-6.249,6.701-12.349,13.377-18.235,20.121c-5.884,6.746-11.557,13.554-16.952,20.487c-5.39,6.937-10.512,13.988-15.286,21.229
|
||||||
|
c-4.778,7.241-9.188,14.675-13.214,22.396l-1.483,2.914c-0.476,0.978-0.982,1.954-1.44,2.945
|
||||||
|
c-0.463,0.988-0.961,1.974-1.409,2.975c-0.433,1.004-0.93,1.999-1.364,3.011c-1.788,4.039-3.457,8.178-5.009,12.441
|
||||||
|
c-1.55,4.263-2.996,8.65-4.311,13.193c-1.315,4.545-2.485,9.234-3.746,14.145L875.491,651.26z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M1044.647,646.575v0.091l-0.003,0.003c0,0.567-0.009,1.08-0.024,1.562
|
||||||
|
c0.003,0.009,0.003,0.015,0.003,0.021c-0.049,2.111-0.186,4.252-0.406,6.384c-0.055,0.592-0.128,1.22-0.222,1.979
|
||||||
|
c-0.156,1.195-0.32,2.312-0.503,3.404c0,0.009-0.003,0.018-0.006,0.03c-0.055,0.354-0.119,0.726-0.192,1.135
|
||||||
|
c-0.442,2.431-0.997,4.892-1.647,7.314c-0.143,0.531-0.299,1.089-0.47,1.662c-4.191,14.417-11.846,27.63-22.133,38.204
|
||||||
|
c-10.825,11.123-24.049,18.681-38.25,21.85c-0.689,0.152-1.36,0.29-2.046,0.427c-0.787,0.146-1.433,0.262-2.04,0.357
|
||||||
|
c-0.531,0.085-0.97,0.156-1.382,0.214c-0.021,0.003-0.046,0.009-0.073,0.012c-2.635,0.448-5.31,0.775-7.994,0.973
|
||||||
|
c-0.165,0.003-0.333,0.003-0.497,0.003c-0.717,0-1.412-0.012-2.123-0.031c-0.811-0.027-1.476-0.055-2.098-0.094
|
||||||
|
c-0.546-0.034-0.997-0.061-1.415-0.094c-0.024-0.003-0.049-0.003-0.076-0.006c-4.706-0.238-9.44-0.872-14.069-1.882
|
||||||
|
c-0.024-0.006-0.046-0.009-0.067-0.015c-8.433-1.839-16.558-4.901-24.15-9.095c-7.597-4.197-14.463-9.421-20.413-15.53
|
||||||
|
c-4.069-4.175-7.631-8.683-10.656-13.46c-4.413-6.969-7.686-14.512-9.733-22.445c7.445,8.217,16.128,14.783,25.919,19.587
|
||||||
|
c6.057,2.971,12.511,5.237,19.187,6.731c6.466,1.449,13.17,2.184,19.929,2.184c10.431,0,21.054-1.775,31.1-5.173
|
||||||
|
c2.312-0.781,4.593-1.647,6.835-2.599c12.121-5.139,23.149-12.761,31.894-22.042c8.027-8.522,14.127-18.312,18.132-29.103
|
||||||
|
c2.318-6.255,3.904-12.776,4.743-19.511c1.052,2.644,1.94,5.374,2.66,8.171C1043.896,633.79,1044.668,640.106,1044.647,646.575z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M1009.743,728.427c-21.667,9.479-46.698,11.465-71.741,2.074c2.736,0.875,5.514,1.623,8.329,2.236
|
||||||
|
c0.006,0.003,0.015,0.006,0.024,0.006c4.791,0.994,9.668,1.598,14.554,1.949c0.491,0.04,0.982,0.07,1.47,0.101
|
||||||
|
c0.299,0.015,0.595,0.03,0.894,0.046c0.165,0.006,0.326,0.015,0.491,0.021c0.082,0.003,0.162,0.006,0.244,0.009
|
||||||
|
c0.183,0.006,0.363,0.012,0.543,0.018c0.741,0.021,1.473,0.033,2.208,0.033c32.113,0,60.594-20.49,75.453-47.537
|
||||||
|
c0.293-0.528,0.58-1.055,0.857-1.589c1.217-2.321,2.333-4.682,3.346-7.079c0.159-0.381,0.317-0.763,0.467-1.144
|
||||||
|
c0.457-1.116,0.881-2.236,1.29-3.364c0.238-0.659,0.467-1.32,0.686-1.983c0.708-2.126,1.33-4.27,1.867-6.426
|
||||||
|
c0.137-0.54,0.265-1.083,0.387-1.623c0-0.003,0.003-0.006,0.003-0.006c0.082-0.36,0.161-0.72,0.238-1.083
|
||||||
|
c0.155-0.72,0.299-1.443,0.433-2.169c0.067-0.363,0.131-0.726,0.192-1.089c0.037-0.211,0.073-0.424,0.107-0.638
|
||||||
|
c0.027-0.149,0.049-0.299,0.073-0.451c0.037-0.216,0.067-0.436,0.101-0.656c0.021-0.143,0.043-0.29,0.064-0.436
|
||||||
|
c0.009-0.07,0.021-0.141,0.031-0.211c0.037-0.244,0.07-0.491,0.101-0.738c0.006-0.049,0.012-0.094,0.018-0.143
|
||||||
|
c0.046-0.366,0.091-0.729,0.134-1.095c0.043-0.366,0.082-0.729,0.119-1.095c0.036-0.366,0.07-0.732,0.104-1.098
|
||||||
|
c0.031-0.366,0.061-0.732,0.085-1.098c0.028-0.366,0.052-0.732,0.073-1.098c0.006-0.131,0.015-0.262,0.021-0.396
|
||||||
|
c0.012-0.235,0.024-0.467,0.034-0.702c0.058-1.333,0.082-2.666,0.07-3.998c-0.003-0.235-0.006-0.467-0.009-0.698
|
||||||
|
c-0.009-0.467-0.021-0.933-0.04-1.4c-0.018-0.467-0.039-0.93-0.067-1.397c-0.012-0.232-0.027-0.467-0.043-0.698
|
||||||
|
c-0.018-0.266-0.037-0.528-0.055-0.79c-0.024-0.281-0.046-0.561-0.073-0.839c-0.009-0.125-0.021-0.253-0.034-0.378
|
||||||
|
c-0.003-0.031-0.006-0.058-0.009-0.085c-0.043-0.467-0.091-0.93-0.146-1.394c-0.027-0.235-0.055-0.467-0.082-0.698
|
||||||
|
c-0.028-0.232-0.06-0.464-0.092-0.696c-0.033-0.231-0.064-0.463-0.097-0.694c0-0.001,0-0.001,0-0.002
|
||||||
|
c-0.057-0.385-0.117-0.773-0.18-1.159c-0.031-0.192-0.061-0.383-0.095-0.576c-0.009-0.064-0.021-0.131-0.033-0.195
|
||||||
|
c-0.049-0.284-0.101-0.564-0.153-0.845c-0.174-0.924-0.363-1.845-0.573-2.763c-0.052-0.232-0.107-0.461-0.162-0.689
|
||||||
|
c-0.11-0.461-0.223-0.918-0.345-1.375c-0.095-0.36-0.189-0.717-0.29-1.073c-0.091-0.327-0.186-0.656-0.281-0.982
|
||||||
|
c-0.104-0.341-0.204-0.683-0.311-1.025c-0.107-0.342-0.214-0.68-0.326-1.022c-0.232-0.701-0.476-1.4-0.729-2.098
|
||||||
|
c-0.256-0.698-0.521-1.394-0.796-2.086c-0.094-0.232-0.189-0.464-0.287-0.695c-0.287-0.689-0.583-1.379-0.894-2.065
|
||||||
|
c-0.311-0.686-0.634-1.373-0.973-2.056c-0.223-0.454-0.451-0.909-0.686-1.357c-0.47-0.903-0.964-1.805-1.482-2.699
|
||||||
|
c-0.256-0.445-0.518-0.888-0.787-1.33c-1.613-2.666-3.431-5.276-5.465-7.823c0.006,0.125,0.015,0.253,0.021,0.378
|
||||||
|
c-0.208-0.268-0.418-0.537-0.631-0.802l-0.003-0.003c-10.034-13.414-24.177-25.08-40.321-35.389l-0.107-0.07
|
||||||
|
c-0.393-0.253-0.79-0.506-1.177-0.772c-0.15-0.092-0.296-0.192-0.442-0.293c-22.481-15.341-29.92-44.721-18.254-68.673
|
||||||
|
c1-2.05,2.135-4.056,3.416-6.015c4.923-7.521,11.389-13.426,18.712-17.559c-11.026,21.942-5.856,48.62,12.34,64.879
|
||||||
|
c0.009,0.012,0.021,0.018,0.034,0.024c0.897,0.76,1.809,1.516,2.714,2.272c0.006,0.003,0.012,0.012,0.021,0.015
|
||||||
|
c7.122,5.911,14.509,11.776,21.636,18.041c4.301,3.773,8.186,7.796,11.669,12.02
|
||||||
|
C1089.045,621.102,1072.734,700.871,1009.743,728.427z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M1070.436,178.998c-1.535,0.026-4.202-1.606-5.851-1.75c-0.029-0.003-0.057-0.007-0.085-0.014
|
||||||
|
c-2.108-0.536-4.227-0.823-6.384-0.9c-12.654-0.331-25.283,9.301-26.752,22.18c-1.977,10.996,4.432,23.333,15.462,26.599
|
||||||
|
c1.789,0.574,3.681,0.85,5.606,0.911c0.66-0.01,0.737,1.033,0.076,1.114c-9.017,1.541-18.103-3.332-23.195-10.688
|
||||||
|
c-11.382-15.951-3.568-43.489,16.276-48.293c9.551-2.333,20.482,1.674,25.437,9.966c0.089,0.15,0.094,0.303,0.047,0.446
|
||||||
|
C1070.986,178.835,1070.716,178.993,1070.436,178.998z"/>
|
||||||
|
<path style="fill:#222221;" d="M1112.314,247.306c-1.535,0.026-4.202-1.606-5.851-1.75c-0.029-0.002-0.057-0.007-0.085-0.014
|
||||||
|
c-2.108-0.537-4.227-0.823-6.384-0.9c-12.654-0.331-25.283,9.3-26.752,22.18c-1.977,10.996,4.432,23.333,15.462,26.599
|
||||||
|
c1.789,0.574,3.681,0.85,5.605,0.911c0.66-0.011,0.737,1.033,0.077,1.114c-9.017,1.541-18.103-3.332-23.195-10.687
|
||||||
|
c-11.382-15.951-3.568-43.489,16.276-48.293c9.551-2.333,20.482,1.674,25.437,9.966c0.09,0.15,0.094,0.303,0.047,0.446
|
||||||
|
C1112.864,247.143,1112.594,247.301,1112.314,247.306z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M905.878,226.164c25.121-1.739,47.598-8.88,63.723-30.192c7.969-9.528,14.677-20.22,24.114-28.509
|
||||||
|
c20.837-19.588,56.333-16.347,73.979,5.903c1.043,1.559,5.776,5.75,1.923,5.875c-74.706-45.481-75.063,67.587-150.814,52.115
|
||||||
|
c-4.329-0.798-8.533-1.979-12.582-3.702C905.642,227.51,905.964,226.538,905.878,226.164z"/>
|
||||||
|
</g>
|
||||||
|
<path style="fill:#222221;" d="M918.811,166.658c-1.594,0.811-5.221,0.463-7.022,1.155c-0.032,0.012-0.063,0.021-0.096,0.028
|
||||||
|
c-2.482,0.514-4.847,1.297-7.146,2.317c-13.423,6.115-21.732,22.652-16.694,36.891c3.545,12.527,16.557,22.176,29.778,19.964
|
||||||
|
c2.167-0.312,4.289-0.989,6.336-1.908c0.686-0.348,1.299,0.705,0.649,1.127c-8.657,6.219-20.662,5.754-29.752,0.65
|
||||||
|
c-20.066-10.895-25.945-43.729-7.614-58.893c8.812-7.321,22.308-8.705,31.732-2.551c0.17,0.111,0.253,0.27,0.277,0.444
|
||||||
|
C919.303,166.207,919.102,166.51,918.811,166.658z"/>
|
||||||
|
<path style="fill:#222221;" d="M918.466,166.477c-2.098,0.986-6.621,0.903-8.966,1.778c-0.041,0.015-0.082,0.028-0.124,0.038
|
||||||
|
c-3.181,0.741-6.247,1.758-9.255,3.021c-17.587,7.545-29.939,25.745-25.234,40.455c3.021,13.012,18.283,22.224,35.169,18.836
|
||||||
|
c2.762-0.502,5.509-1.387,8.19-2.523c0.903-0.423,1.553,0.646,0.687,1.145c-11.604,7.28-26.653,7.733-37.502,3.033
|
||||||
|
c-23.992-9.978-27.619-44.351-2.818-61.884c11.926-8.462,29.062-10.993,40.211-5.206c0.201,0.105,0.288,0.266,0.297,0.449
|
||||||
|
C919.138,165.96,918.849,166.297,918.466,166.477z"/>
|
||||||
|
<path style="fill:#222221;" d="M1110.02,241.544c-17.646-22.25-53.142-25.491-73.979-5.903
|
||||||
|
c-9.437,8.29-16.144,18.981-24.114,28.51c-13.181,17.421-30.607,25.372-50.251,28.645c-14.541,2.422-27.538-9.84-25.379-24.422
|
||||||
|
c0.033-0.226,0.07-0.451,0.111-0.676c1.469-12.879,14.098-22.511,26.752-22.18c2.156,0.077,4.276,0.363,6.383,0.9
|
||||||
|
c0.029,0.005,0.057,0.01,0.086,0.014c1.649,0.144,4.316,1.776,5.85,1.75c0.28-0.005,0.55-0.162,0.638-0.428
|
||||||
|
c0.047-0.143,0.043-0.297-0.047-0.447c-4.955-8.292-15.886-12.299-25.437-9.966c-19.844,4.804-27.657,32.343-16.276,48.293
|
||||||
|
c3.095,4.47,7.665,8.021,12.797,9.775c0.942,0.322,1.886,0.641,2.813,1.004c3.609,1.413,7.336,2.417,11.161,3.122
|
||||||
|
c75.751,15.471,76.108-97.597,150.814-52.115C1115.796,247.294,1111.063,243.103,1110.02,241.544z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M811.086,295.508c25.121-1.739,47.599-8.881,63.723-30.192c7.969-9.528,14.677-20.22,24.114-28.51
|
||||||
|
c20.837-19.588,56.333-16.347,73.979,5.903c1.043,1.559,5.776,5.749,1.923,5.875h0c-74.706-45.481-75.063,67.587-150.814,52.115
|
||||||
|
c-4.329-0.797-8.533-1.979-12.582-3.701C810.849,296.854,811.172,295.882,811.086,295.508z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M833.811,1024.33c-0.563-0.212-0.881-0.727-0.761-1.239c9.586-40.963,46.76-62.954,92.676-40.345
|
||||||
|
c51.363,24.968,103.599,78.601,156.69,24.727c0.376-0.381,1.036-0.451,1.507-0.155l0,0c0.464,0.292,0.585,0.842,0.273,1.254
|
||||||
|
c-25.378,33.537-61.546,37.303-102.054,19.81c-31.73-12.406-63.076-36.409-98.875-36.901
|
||||||
|
c-21.713,1.81-35.133,19.016-47.886,32.528C835.005,1024.406,834.36,1024.537,833.811,1024.33L833.811,1024.33z"/>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M815.577,984.63c-0.736-0.372-1.079-1.279-0.782-2.078c27.954-75.078,86.417-62.89,148.136-46.596
|
||||||
|
c25.341,6.099,51.503,8.859,77.259,7.027c25.632-1.739,48.67-14.93,69.616-30.033c0.714-0.515,1.663-0.475,2.333,0.099l0,0
|
||||||
|
c0.667,0.572,0.905,1.539,0.569,2.372c-18.586,46.11-68.644,68.876-114.178,57.049c-40.197-8.77-78.691-31.889-120.064-32.625
|
||||||
|
c-27.027-0.304-48.062,20.754-60.848,44.116C817.208,984.711,816.32,985.006,815.577,984.63L815.577,984.63z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M833.811,1024.33c-0.563-0.212-0.881-0.727-0.761-1.239c9.586-40.963,46.76-62.954,92.676-40.345
|
||||||
|
c51.363,24.968,103.598,78.601,156.69,24.727c0.376-0.381,1.036-0.451,1.507-0.155l0,0c0.464,0.292,0.585,0.842,0.273,1.254
|
||||||
|
c-25.378,33.537-61.546,37.303-102.054,19.81c-31.73-12.406-63.076-36.409-98.876-36.901
|
||||||
|
c-21.714,1.81-35.133,19.016-47.886,32.528C835.005,1024.407,834.36,1024.537,833.811,1024.33L833.811,1024.33z"/>
|
||||||
|
</g>
|
||||||
|
<path style="fill:#222221;" d="M1094.585,985.039c-10.734,16.969-24.763,26.827-40.431,31.645
|
||||||
|
c-8.481,2.611-17.44,3.743-26.614,3.723c-0.013-0.003-0.026-0.003-0.043,0c-6.46-0.013-13.03-0.597-19.613-1.639
|
||||||
|
c-0.01,0-0.017-0.003-0.027-0.003c-29.531-5.817-49.489-25.682-80.463-40.829c-34.674-16.955-74.421-11.972-95.985,9.075
|
||||||
|
c-2.114,1.818-4.161,3.736-6.142,5.717c-1.214,1.211-3.139-0.173-2.528-1.812c16.862-45.408,61.361-48.666,102.11-33.808
|
||||||
|
c55.949,18.306,111.859,63.969,168.279,26.365C1094.1,982.826,1095.222,984.034,1094.585,985.039z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M383.443,1005.026c-17.007,4.876-34.86,3.884-51.505-1.426c-3.639-1.165-7.214-2.531-10.718-4.086
|
||||||
|
c-13.399-5.958-25.641-14.693-35.527-25.297c-9.518,9.48-20.9,17.454-33.274,23.201c-2.477-1.253-4.923-2.556-7.337-3.919
|
||||||
|
c-1.086-0.604-2.166-1.231-3.236-1.857c-3.053-1.791-6.053-3.664-8.999-5.619c1.794-1.073,3.563-2.185,5.301-3.34
|
||||||
|
c14.275-9.418,27.092-20.888,37.337-34.514l0.277-0.393l6.405-9.068c1.948-2.764,6.05-2.738,7.96,0.047
|
||||||
|
c4.454,6.475,9.984,14.52,13.969,18.801c10.4,11.785,22.569,21.772,36.085,29.704c3.563,2.093,7.221,4.041,10.96,5.842
|
||||||
|
c2.855,1.372,5.757,2.657,8.71,3.859l1.599,0.655l1.618,0.63c1.07,0.441,2.165,0.821,3.258,1.237
|
||||||
|
c0.985,0.331,2.357,0.847,3.318,1.177C374.107,1002.184,378.703,1003.575,383.443,1005.026z"/>
|
||||||
|
<path style="fill:#222221;" d="M268.926,1005.026c-14.19,4.067-28.967,4.048-43.138,0.851c-2.817-0.637-5.61-1.396-8.365-2.278
|
||||||
|
c-3.638-1.164-7.214-2.529-10.717-4.085c-0.453-0.202-0.913-0.41-1.366-0.619c-12.867-5.934-24.613-14.435-34.161-24.68
|
||||||
|
c-10.644,10.607-23.621,19.321-37.706,25.152c-3.521,1.458-7.11,2.732-10.748,3.809c-16.217,4.807-33.419,5.72-49.899,1.335
|
||||||
|
c11.06-2.945,21.986-6.693,32.323-11.519c3.644-1.703,7.214-3.534,10.693-5.518c2.652-1.507,5.255-3.105,7.79-4.789
|
||||||
|
c14.276-9.419,27.093-20.89,37.339-34.516l0.276-0.392l6.406-9.07c1.947-2.762,6.05-2.738,7.961,0.049
|
||||||
|
c4.452,6.473,9.982,14.52,13.969,18.801c10.399,11.783,22.567,21.771,36.083,29.702c0.827,0.484,1.66,0.968,2.499,1.433
|
||||||
|
c2.768,1.562,5.591,3.025,8.463,4.409c2.854,1.372,5.757,2.658,8.709,3.858l1.598,0.655l1.617,0.631
|
||||||
|
c0.361,0.147,0.722,0.288,1.084,0.422c0.723,0.275,1.452,0.539,2.174,0.814c0.986,0.331,2.358,0.845,3.319,1.176
|
||||||
|
C259.594,1002.185,264.187,1003.575,268.926,1005.026z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path style="fill:#222221;" d="M462.101,991.436c-10.898-45.855,24.103-47.123,48.506-38.2
|
||||||
|
c35.84,11.907,69.264,33.378,103.563,50.866c32.86,15.751,76.028,41.219,108.748,13.648l0.984,1.283
|
||||||
|
c-65.971,91.633-269.756-141.213-260.418-27.786L462.101,991.436z"/>
|
||||||
|
<path style="fill:#222221;" d="M745.563,911.201c9.995,18.56,13.629,43.419,6.801,64.796
|
||||||
|
c-20.208,63.336-106.461,25.444-140.845,1.841c-35.901-25.353-78.314-47.174-119.65-37.05
|
||||||
|
c-27.206,7.414-36.776,46.657-19.06,74.239l-1.82,1.872c-19.287-18.242-21.185-53.99-5.693-77.227
|
||||||
|
c7.734-11.714,18.886-18.279,30.08-21.968c39.233-11.321,80.111,3.114,115.453,25.526c27.316,19.256,56.347,35.602,87.212,41.274
|
||||||
|
c14.994,2.228,33.931,4.253,42.758-14.908c8.548-16.399,7.875-38.451,2.842-56.708L745.563,911.201z"/>
|
||||||
|
<path style="fill:#222221;" d="M567.393,1023.988c-23.424-7.831-77.446-52.293-95.856-45.024l-0.587-0.936
|
||||||
|
c23.809-20.928,77.844,24.216,97.013,45.006L567.393,1023.988z"/>
|
||||||
|
<path style="fill:#222221;" d="M670.641,952.534c23.69,9.745,79.834,19.812,62.239-34.988l0.833-0.53
|
||||||
|
c15.288,17.12,9.172,45.901-9.786,52.703c-18.434,6.932-38.883-0.726-53.552-16.026L670.641,952.534z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 27 KiB |
1
src/assets/main.css
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@import "./tailwind.css";
|
3
src/assets/tailwind.css
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
280
src/components/DialogSearchResult.vue
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { ArtworksSearchResult } from "@/services/ArtworkSearch/ArtworkSearchResult";
|
||||||
|
import { Button, Flex, LoadingSpinner, Progress } from "daisy-ui-kit";
|
||||||
|
import { computed, onMounted, onUnmounted, ref, useTemplateRef } from "vue";
|
||||||
|
import MaterialSymbols from "./base/MaterialSymbols.vue";
|
||||||
|
import Skeleton from "./base/Skeleton.vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
searchResult: ArtworksSearchResult | null;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const emits = defineEmits<{
|
||||||
|
close: [value: void];
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const dialog = useTemplateRef<HTMLDialogElement>("dialog");
|
||||||
|
const imageBlob = ref<string | null>();
|
||||||
|
const previewPlaying = ref<boolean>(false);
|
||||||
|
const previewLoading = ref<boolean>(false);
|
||||||
|
const playingProgress = ref<number>(0);
|
||||||
|
|
||||||
|
let audio: HTMLAudioElement | null;
|
||||||
|
|
||||||
|
const dialogVisible = computed((): boolean => {
|
||||||
|
if (!props.searchResult) {
|
||||||
|
dialog.value?.close();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog.value?.showModal();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted((): void => {
|
||||||
|
loadArtwork(600);
|
||||||
|
});
|
||||||
|
|
||||||
|
onUnmounted((): void => {
|
||||||
|
stop();
|
||||||
|
});
|
||||||
|
|
||||||
|
async function loadArtwork(size: number): Promise<void> {
|
||||||
|
if (!props.searchResult?.hasArtwork) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
imageBlob.value = null;
|
||||||
|
|
||||||
|
const response = await fetch(props.searchResult.artworkUrl(size));
|
||||||
|
const blob = await response.blob();
|
||||||
|
imageBlob.value = URL.createObjectURL(blob);
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeModal(): void {
|
||||||
|
emits("close");
|
||||||
|
}
|
||||||
|
|
||||||
|
function play(): void {
|
||||||
|
const url = props.searchResult?.previewUrl;
|
||||||
|
|
||||||
|
if (!url) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audio) {
|
||||||
|
audio.play();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
previewLoading.value = true;
|
||||||
|
audio = new Audio(url);
|
||||||
|
audio.addEventListener("play", onPlayPause);
|
||||||
|
audio.addEventListener("pause", onPlayPause);
|
||||||
|
audio.autoplay = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function pause(): void {
|
||||||
|
if (!audio) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
audio.pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop(): void {
|
||||||
|
if (!audio) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
audio.pause();
|
||||||
|
audio.currentTime = 0;
|
||||||
|
playingProgress.value = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onPlayPause(): void {
|
||||||
|
if (!audio) {
|
||||||
|
previewPlaying.value = false;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (previewLoading.value) {
|
||||||
|
previewLoading.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
previewPlaying.value = !audio.paused;
|
||||||
|
|
||||||
|
if (previewPlaying.value) {
|
||||||
|
updatePlayingProgress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updatePlayingProgress(): void {
|
||||||
|
if (!audio) {
|
||||||
|
playingProgress.value = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
playingProgress.value = audio.currentTime / audio.duration;
|
||||||
|
|
||||||
|
if (previewPlaying.value) {
|
||||||
|
requestAnimationFrame(updatePlayingProgress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadArtwork(size: number): Promise<void> {
|
||||||
|
const searchResult = props.searchResult;
|
||||||
|
|
||||||
|
if (!searchResult?.hasArtwork) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const url: string =
|
||||||
|
size === 0 ? searchResult.originalArtwork : searchResult.artworkUrl(size);
|
||||||
|
|
||||||
|
imageBlob.value = null;
|
||||||
|
|
||||||
|
const response = await fetch(url);
|
||||||
|
const blob = await response.blob();
|
||||||
|
|
||||||
|
imageBlob.value = URL.createObjectURL(blob);
|
||||||
|
const contentType = response.headers.get("content-type");
|
||||||
|
|
||||||
|
const extension = contentType?.split("/", 2)[1];
|
||||||
|
|
||||||
|
const anchor = document.createElement("a");
|
||||||
|
anchor.href = URL.createObjectURL(blob);
|
||||||
|
anchor.download = searchResult.title + "." + extension;
|
||||||
|
|
||||||
|
anchor.click();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<dialog ref="dialog" @close="closeModal">
|
||||||
|
<div
|
||||||
|
v-if="dialogVisible && searchResult"
|
||||||
|
class="fixed top-0 bottom-0 left-0 right-0 w-full h-full bg-black bg-opacity-75 backdrop-blur-sm"
|
||||||
|
>
|
||||||
|
<Flex class="h-full">
|
||||||
|
<Flex
|
||||||
|
class="items-center justify-center w-2/3 h-full m-4"
|
||||||
|
@click="closeModal"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
v-if="imageBlob"
|
||||||
|
:src="imageBlob"
|
||||||
|
:download="searchResult.title"
|
||||||
|
class="max-w-[42rem] max-h-[42rem]"
|
||||||
|
@click.stop="null"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Skeleton v-else class="w-[42rem] h-[42rem]" @click.stop="null" />
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
<aside class="w-1/3 h-full text-white border-l border-black bg-primary">
|
||||||
|
<Flex class="items-center">
|
||||||
|
<h1 class="px-4 text-xl">{{ searchResult.title }}</h1>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
ghost
|
||||||
|
square
|
||||||
|
class="inline-block ml-auto"
|
||||||
|
@click="closeModal"
|
||||||
|
>
|
||||||
|
<MaterialSymbols name="close" />
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
<ul class="px-4">
|
||||||
|
<li class="mb-2"></li>
|
||||||
|
<li class="mb-2">
|
||||||
|
Type:
|
||||||
|
{{ searchResult.type }}
|
||||||
|
</li>
|
||||||
|
<li class="mb-2">
|
||||||
|
Artist Name:
|
||||||
|
{{ searchResult.artistName }}
|
||||||
|
</li>
|
||||||
|
<li v-if="searchResult.previewUrl !== null">
|
||||||
|
<Flex class="items-center gap-1">
|
||||||
|
<span>Preview:</span>
|
||||||
|
<LoadingSpinner v-if="previewLoading" />
|
||||||
|
<template v-else>
|
||||||
|
<Button
|
||||||
|
v-if="!previewPlaying"
|
||||||
|
ghost
|
||||||
|
sm
|
||||||
|
square
|
||||||
|
@click="play"
|
||||||
|
class="tooltip"
|
||||||
|
data-tip="Play"
|
||||||
|
>
|
||||||
|
<MaterialSymbols name="play_arrow" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
v-else
|
||||||
|
ghost
|
||||||
|
sm
|
||||||
|
square
|
||||||
|
@click="pause"
|
||||||
|
class="tooltip"
|
||||||
|
data-tip="Pause"
|
||||||
|
>
|
||||||
|
<MaterialSymbols name="pause" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
ghost
|
||||||
|
sm
|
||||||
|
square
|
||||||
|
@click="stop"
|
||||||
|
class="tooltip"
|
||||||
|
data-tip="Stop"
|
||||||
|
>
|
||||||
|
<MaterialSymbols name="stop" />
|
||||||
|
</Button>
|
||||||
|
</template>
|
||||||
|
</Flex>
|
||||||
|
<Progress neutral :value="playingProgress" :max="1" />
|
||||||
|
</li>
|
||||||
|
<li v-if="searchResult.hasArtwork">
|
||||||
|
<p>Artwork Download:</p>
|
||||||
|
|
||||||
|
<Flex class="gap-2">
|
||||||
|
<Button
|
||||||
|
outline
|
||||||
|
sm
|
||||||
|
class="tooltip"
|
||||||
|
data-tip="600x600px"
|
||||||
|
@click="downloadArtwork(600)"
|
||||||
|
>
|
||||||
|
Small
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
outline
|
||||||
|
sm
|
||||||
|
class="tooltip"
|
||||||
|
data-tip="3000x3000px"
|
||||||
|
@click="downloadArtwork(3000)"
|
||||||
|
>
|
||||||
|
Large
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
outline
|
||||||
|
sm
|
||||||
|
class="tooltip"
|
||||||
|
data-tip="Original, uncompressed image"
|
||||||
|
@click="downloadArtwork(0)"
|
||||||
|
>
|
||||||
|
Original
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</aside>
|
||||||
|
</Flex>
|
||||||
|
</div>
|
||||||
|
</dialog>
|
||||||
|
</template>
|
101
src/components/SearchResult.vue
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, onMounted, ref } from "vue";
|
||||||
|
import { ArtworksSearchResult } from "@/services/ArtworkSearch/ArtworkSearchResult";
|
||||||
|
import Skeleton from "./base/Skeleton.vue";
|
||||||
|
import MaterialSymbols from "./base/MaterialSymbols.vue";
|
||||||
|
import { useTranslation } from "i18next-vue";
|
||||||
|
|
||||||
|
const t = useTranslation().t;
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
result: {
|
||||||
|
type: ArtworksSearchResult,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const emits = defineEmits<{
|
||||||
|
"open": [value: void];
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const imageBlob = ref<string>();
|
||||||
|
|
||||||
|
onMounted((): void => {
|
||||||
|
loadArtwork();
|
||||||
|
});
|
||||||
|
|
||||||
|
async function loadArtwork(): Promise<void> {
|
||||||
|
if (!props.result.hasArtwork) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch(props.result.artworkUrl(256))
|
||||||
|
const blob = await response.blob();
|
||||||
|
imageBlob.value = URL.createObjectURL(blob);
|
||||||
|
}
|
||||||
|
|
||||||
|
const translations = computed(() => {
|
||||||
|
return {
|
||||||
|
noImageAvailable: t("No image available"),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="w-3/4 p-3 sm:w-2/4 md:w-4/12 lg:w-3/12 xl:w-2/12 2xl:w-60">
|
||||||
|
<p class="w-full mb-2 overflow-hidden text-center text-ellipsis text-nowrap">
|
||||||
|
{{ result.title }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="w-full m-auto pb-[100%] relative tooltip image-container"
|
||||||
|
:class="{ tooltip: result.hasArtwork }"
|
||||||
|
:["data-tip"]="result.title"
|
||||||
|
>
|
||||||
|
<template v-if="result.hasArtwork">
|
||||||
|
<div
|
||||||
|
v-if="imageBlob"
|
||||||
|
class="absolute top-0 bottom-0 left-0 right-0 w-full shadow-black"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
:src="imageBlob"
|
||||||
|
:alt="result.collectionName"
|
||||||
|
draggable="false"
|
||||||
|
class="block m-auto transition tooltip brightness-75 hover:brightness-100 cursor-zoom-in"
|
||||||
|
@click="emits('open')"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<Skeleton
|
||||||
|
v-else
|
||||||
|
class="absolute top-0 bottom-0 left-0 right-0"
|
||||||
|
@click="emits('open')"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<p
|
||||||
|
v-else
|
||||||
|
class="absolute w-full text-center -translate-x-1/2 -translate-y-1/2 cursor-default left-1/2 top-1/2 tooltip"
|
||||||
|
:["data-tip"]="translations.noImageAvailable"
|
||||||
|
>
|
||||||
|
<MaterialSymbols
|
||||||
|
name="no_photography"
|
||||||
|
:size="6"
|
||||||
|
class="cursor-help"
|
||||||
|
@click="emits('open')"
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
img:hover {
|
||||||
|
box-shadow: 0 0 0.5rem var(--tw-shadow-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fix tooltip parent overflow
|
||||||
|
*/
|
||||||
|
.image-container::before {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
3
src/components/base/Link.vue
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<template>
|
||||||
|
<a class="text-primary hover:underline"><slot /></a>
|
||||||
|
</template>
|
40
src/components/base/Loading.vue
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import LoadingRing from "daisy-ui-kit/components/LoadingRing.vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
color?: string;
|
||||||
|
neutral?: boolean;
|
||||||
|
primary?: boolean;
|
||||||
|
secondary?: boolean;
|
||||||
|
accent?: boolean;
|
||||||
|
info?: boolean;
|
||||||
|
success?: boolean;
|
||||||
|
warning?: boolean;
|
||||||
|
error?: boolean;
|
||||||
|
|
||||||
|
size?: "lg" | "md" | "sm" | "xs";
|
||||||
|
lg?: boolean;
|
||||||
|
md?: boolean;
|
||||||
|
sm?: boolean;
|
||||||
|
xs?: boolean;
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<LoadingRing
|
||||||
|
:color
|
||||||
|
:neutral
|
||||||
|
:primary
|
||||||
|
:secondary
|
||||||
|
:accent
|
||||||
|
:info
|
||||||
|
:success
|
||||||
|
:warning
|
||||||
|
:error
|
||||||
|
:size
|
||||||
|
:lg
|
||||||
|
:md
|
||||||
|
:sm
|
||||||
|
:xs
|
||||||
|
/>
|
||||||
|
</template>
|
213
src/components/base/Logo.vue
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
const liked = [1, 5, 8];
|
||||||
|
|
||||||
|
const logo = ref<number>(liked[1]);
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<svg
|
||||||
|
v-if="logo === 1"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 78 78"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -22.863 -22.393)">
|
||||||
|
<path
|
||||||
|
d="m337.74 218.43c-0.302 0.339-0.79 0.438-1.203 0.247-6.225-2.867-12.104-4.572-18.68-4.78-21.254-0.937-39.482 19.132-39.705 39.814-0.614 20.52 19.033 39.178 39.671 32.783 18.932-3.111 46.745-11.412 62.414 3.3 0.665 0.72-0.412 1.854-1.151 1.134-20.653-15.819-52.252 3.344-75.063 3.566-41.974-2.236-51.617-64.582-18.597-85.794 16.251-11.385 41.173-8.195 52.39 8.46 0.267 0.393 0.239 0.915-0.076 1.27z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m87.176 290.8c0-0.495 0.327-0.933 0.801-1.075 5.958-1.78 11.764-3.452 17.388-5.319 9.823-3.283 19.583-7.208 28.547-12.351 46.79-25.357 60.375-92.998 118.14-101.21 20.9-3.721 43.007 0.767 60.283 13.203 11.089 8.447 23.254 20.806 25.624 34.278-16.474-17.096-37.368-33.688-63.765-33.011-69.403 1.712-70.409 71.411-131.27 96.953-17.195 7.366-36.065 9.835-54.646 9.651-0.612-4e-3 -1.107-0.506-1.107-1.121z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m315.23 278.16c-9.573 3.935-21.46-1.92-27.07-10.288-6.263-8.883-6.553-21.122-1.844-30.761 5.08-10.998 18.601-19.605 30.493-15.778-4e-3 0.145-0.123 0.259-0.268 0.258-3.645-0.021-7.281 0.693-10.635 2.08-27.693 11.168-22.017 55.381 9.324 54.489z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 2"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 85 85"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -117.86 -19.401)">
|
||||||
|
<path
|
||||||
|
d="m483.74 235.13c-8.134 15.929-25.513 24.258-37.695 15.827-0.362-0.123-0.499-0.862-7e-3 -0.938 14.901-0.167 30.102-12.652 36.381-31.111-0.302 5.497 0.158 11.028 1.321 16.222z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m600.69 222.3c0.043 2.362 0.243 4.727 0.601 7.083-28.379 55.519-108 68.261-118.69-1.388-0.411-4.318-0.365-8.611 0.152-12.963 0.1-1.892 2.832-17.291 4.826-12.862 0.483 7.286 1.733 14.409 4.063 20.871 23.007 59.555 89.559 22.473 114.83-26.372-4.009 7.832-5.933 16.657-5.781 25.631z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m648.15 249.68c-0.617-0.166-1.228-0.344-1.839-0.536-3.048-0.946-5.966-2.237-8.727-3.818-0.922-0.757-1.83-1.573-2.709-2.436-2.529-2.472-4.836-5.382-6.794-8.416-0.243-0.382-0.496-0.758-0.734-1.141l-0.672-1.162-0.666-1.169-0.615-1.17c-0.424-0.78-0.786-1.567-1.149-2.348-0.372-0.787-0.705-1.568-1.032-2.349-2.587-6.271-3.89-12.337-4.345-17.906-0.42-5.564-0.056-10.729 1.448-15.201l0.503 0.214c0.183 2.615 0.435 5.262 0.777 7.926 0.317 2.665 0.713 5.355 1.234 8.069 1.042 5.427 2.536 10.997 4.825 16.499 2.224 5.491 5.34 10.971 9.362 15.574 1.998 2.305 4.195 4.364 6.477 6.139 1.519 1.197 3.079 2.27 4.656 3.231z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m518.43 252.01c-0.575-0.192-1.149-0.398-1.711-0.624-2.652-1.026-5.159-2.383-7.517-4.012-1.608-1.84-3.1-3.839-4.43-5.901-0.248-0.383-0.496-0.758-0.733-1.148l-0.672-1.156-0.666-1.169-0.62-1.17c-0.418-0.779-0.781-1.566-1.144-2.347-0.372-0.787-0.705-1.568-1.037-2.349-2.581-6.277-3.884-12.336-4.339-17.906-0.419-5.57-0.056-10.729 1.447-15.2l0.503 0.207c0.183 2.622 0.435 5.262 0.772 7.933 0.316 2.665 0.717 5.354 1.239 8.068 1.042 5.427 2.536 10.99 4.824 16.499 2.224 5.483 5.34 10.963 9.36 15.573 1.481 1.705 3.072 3.283 4.724 4.702z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m726.47 221.14c-10.065 31.325-36.126 50.286-61.612 54.098-21.085 3.258-44.758-5.761-56.595-26.106-0.68-1.182-1.324-2.384-1.957-3.586-0.565-1.243-1.14-2.479-1.654-3.729-5.57-13.397-5.472-31.19 1.818-45.141 0.648-1.185 1.284-2.362 2.019-3.484 0.414-0.816 1.164-1.323 1.959-1.022 0.444 0.182 0.696 0.578 0.703 0.991 4e-3 0.503 0.021 2.583 0.023 3.044 0.023 1.017 0.096 2.026 0.144 3.042 1.431 26.086 17.444 45.218 36.841 50.263 18.542 5.048 39.059-2.21 55.474-16.604 9.884-8.654 18.176-19.993 23.711-33.121-0.196 0.496-0.367 1.004-0.543 1.513-0.696 2.247-1.137 4.562-1.34 6.93-0.015 0.145-0.024 0.283-0.034 0.421-0.032 0.342-0.05 0.667-0.063 1.005-0.121 2.4-7e-3 4.836 0.297 7.162l0.189 1.322c0.132 0.76 0.271 1.513 0.445 2.263 0.056 0.249 0.111 0.491 0.175 0.739z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m766.45 243.5c-19.831 15.339-46.152-12.082-40.304-39.739 1.625-6.256 2.371-7.085 2.873-0.146 2.841 23.568 19.543 39.212 37.431 39.885z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 3"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 80 80"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -214.6 -20.418)">
|
||||||
|
<path
|
||||||
|
d="m1070.4 179c-1.535 0.026-4.202-1.606-5.851-1.75-0.029-3e-3 -0.057-7e-3 -0.085-0.014-2.108-0.536-4.227-0.823-6.384-0.9-12.654-0.331-25.283 9.301-26.752 22.18-1.977 10.996 4.432 23.333 15.462 26.599 1.789 0.574 3.681 0.85 5.606 0.911 0.66-0.01 0.737 1.033 0.076 1.114-9.017 1.541-18.103-3.332-23.195-10.688-11.382-15.951-3.568-43.489 16.276-48.293 9.551-2.333 20.482 1.674 25.437 9.966 0.089 0.15 0.094 0.303 0.047 0.446-0.087 0.266-0.357 0.424-0.637 0.429z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m1112.3 247.31c-1.535 0.026-4.202-1.606-5.851-1.75-0.029-2e-3 -0.057-7e-3 -0.085-0.014-2.108-0.537-4.227-0.823-6.384-0.9-12.654-0.331-25.283 9.3-26.752 22.18-1.977 10.996 4.432 23.333 15.462 26.599 1.789 0.574 3.681 0.85 5.605 0.911 0.66-0.011 0.737 1.033 0.077 1.114-9.017 1.541-18.103-3.332-23.195-10.687-11.382-15.951-3.568-43.489 16.276-48.293 9.551-2.333 20.482 1.674 25.437 9.966 0.09 0.15 0.094 0.303 0.047 0.446-0.087 0.265-0.357 0.423-0.637 0.428z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m905.88 226.16c25.121-1.739 47.598-8.88 63.723-30.192 7.969-9.528 14.677-20.22 24.114-28.509 20.837-19.588 56.333-16.347 73.979 5.903 1.043 1.559 5.776 5.75 1.923 5.875-74.706-45.481-75.063 67.587-150.81 52.115-4.329-0.798-8.533-1.979-12.582-3.702-0.579-0.144-0.257-1.116-0.343-1.49z"
|
||||||
|
/>
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d="m918.81 166.66c-1.594 0.811-5.221 0.463-7.022 1.155-0.032 0.012-0.063 0.021-0.096 0.028-2.482 0.514-4.847 1.297-7.146 2.317-13.423 6.115-21.732 22.652-16.694 36.891 3.545 12.527 16.557 22.176 29.778 19.964 2.167-0.312 4.289-0.989 6.336-1.908 0.686-0.348 1.299 0.705 0.649 1.127-8.657 6.219-20.662 5.754-29.752 0.65-20.066-10.895-25.945-43.729-7.614-58.893 8.812-7.321 22.308-8.705 31.732-2.551 0.17 0.111 0.253 0.27 0.277 0.444 0.044 0.325-0.157 0.628-0.448 0.776z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m918.47 166.48c-2.098 0.986-6.621 0.903-8.966 1.778-0.041 0.015-0.082 0.028-0.124 0.038-3.181 0.741-6.247 1.758-9.255 3.021-17.587 7.545-29.939 25.745-25.234 40.455 3.021 13.012 18.283 22.224 35.169 18.836 2.762-0.502 5.509-1.387 8.19-2.523 0.903-0.423 1.553 0.646 0.687 1.145-11.604 7.28-26.653 7.733-37.502 3.033-23.992-9.978-27.619-44.351-2.818-61.884 11.926-8.462 29.062-10.993 40.211-5.206 0.201 0.105 0.288 0.266 0.297 0.449 0.017 0.341-0.272 0.678-0.655 0.858z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m1110 241.54c-17.646-22.25-53.142-25.491-73.979-5.903-9.437 8.29-16.144 18.981-24.114 28.51-13.181 17.421-30.607 25.372-50.251 28.645-14.541 2.422-27.538-9.84-25.379-24.422 0.033-0.226 0.07-0.451 0.111-0.676 1.469-12.879 14.098-22.511 26.752-22.18 2.156 0.077 4.276 0.363 6.383 0.9 0.029 5e-3 0.057 0.01 0.086 0.014 1.649 0.144 4.316 1.776 5.85 1.75 0.28-5e-3 0.55-0.162 0.638-0.428 0.047-0.143 0.043-0.297-0.047-0.447-4.955-8.292-15.886-12.299-25.437-9.966-19.844 4.804-27.657 32.343-16.276 48.293 3.095 4.47 7.665 8.021 12.797 9.775 0.942 0.322 1.886 0.641 2.813 1.004 3.609 1.413 7.336 2.417 11.161 3.122 75.751 15.471 76.108-97.597 150.81-52.115 3.854-0.126-0.879-4.317-1.922-5.876z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d="m811.09 295.51c25.121-1.739 47.599-8.881 63.723-30.192 7.969-9.528 14.677-20.22 24.114-28.51 20.837-19.588 56.333-16.347 73.979 5.903 1.043 1.559 5.776 5.749 1.923 5.875-74.706-45.481-75.063 67.587-150.81 52.115-4.329-0.797-8.533-1.979-12.582-3.701-0.58-0.144-0.257-1.116-0.343-1.49z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 4"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 83 83"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -21.734 -119.27)">
|
||||||
|
<g>
|
||||||
|
<path
|
||||||
|
d="m83.02 655.01c-0.137-0.151-0.164-0.374-0.061-0.55 1.871-3.206 4.949-5.808 8.638-7.352 1.901-0.799 3.969-1.288 6.092-1.456 2.124-0.164 4.304 0.018 6.411 0.53 4.229 1.016 8.04 3.503 10.731 6.737 2.73 3.229 4.498 7.023 5.641 10.863 0.568 1.928 0.932 3.901 1.093 5.877 0.077 0.988 0.109 1.977 0.09 2.961-0.016 0.492-0.02 0.983-0.057 1.472-0.04 0.494-0.085 0.992-0.139 1.485-0.256 1.974-0.727 3.913-1.412 5.762-0.688 1.849-1.609 3.597-2.698 5.214-1.1 1.612-2.406 3.067-3.847 4.348-0.737 0.624-1.485 1.229-2.293 1.75-0.391 0.276-0.813 0.51-1.22 0.758-0.425 0.222-0.839 0.46-1.276 0.654-0.857 0.418-1.756 0.74-2.655 1.031-0.912 0.256-1.825 0.49-2.759 0.605-0.457 0.076-0.924 0.094-1.382 0.137-9e-3 1e-3 -0.018 1e-3 -0.027 2e-3 -0.463 7e-3 -0.921 0.043-1.381 0.016-0.778-3e-3 -1.55-0.096-2.31-0.217-0.243-0.038-0.413-0.262-0.389-0.507 0.023-0.234 0.218-0.412 0.453-0.419 1.597-0.05 3.167-0.28 4.647-0.771 0.809-0.239 1.583-0.578 2.338-0.928 0.743-0.385 1.471-0.785 2.148-1.266 1.366-0.935 2.584-2.058 3.647-3.293 1.046-1.254 1.946-2.616 2.647-4.066 1.428-2.89 2.121-6.069 2.126-9.202-3e-3 -0.393-0.014-0.783-0.025-1.176-0.015-0.399-0.06-0.795-0.091-1.191-0.073-0.791-0.195-1.574-0.338-2.348-0.289-1.547-0.736-3.052-1.327-4.481-1.166-2.871-3.073-5.352-5.28-7.24-1.095-0.958-2.245-1.799-3.435-2.532s-2.412-1.392-3.707-1.902c-2.573-1.048-5.454-1.559-8.536-1.382-0.769 0.046-1.553 0.118-2.342 0.25-0.791 0.124-1.595 0.285-2.4 0.5-1.532 0.379-3.061 0.94-4.672 1.583-0.181 0.072-0.389 0.026-0.52-0.119z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m121.26 592.7c-0.416-0.098-0.719-0.463-0.732-0.891-0.205-7.299 0.969-14.651 3.002-21.696 0.755-2.463 1.606-4.904 2.571-7.295 1.947-4.826 4.418-9.516 7.254-13.917 0.981-1.46 1.955-2.943 3.015-4.363 1.265-1.809 2.773-3.491 4.165-5.213 41.194-47.378 118.68-40.349 152.64 11.934 3.018 4.646 5.649 9.538 7.833 14.628 11.55 26.946 9.83 59.404-7.308 83.278-0.504 0.671-0.999 1.341-1.516 1.995-0.844 1.13-1.805 2.189-2.741 3.24-0.288 0.323-0.759 0.41-1.143 0.211-0.557-0.209-0.887-0.796-0.612-1.359 8.122-16.562 10.761-35.528 7.782-53.669-0.141-0.76-0.5-2.698-0.637-3.432-0.163-0.72-0.604-2.659-0.773-3.403-0.2-0.746-0.71-2.649-0.906-3.369-0.218-0.705-0.811-2.602-1.038-3.33-15.781-48.156-69.706-72.713-116.57-53.938-1.261 0.463-3.02 1.284-4.277 1.81-1.405 0.649-2.782 1.359-4.176 2.035-21.725 11.331-38.294 32.181-44.477 56.108-0.157 0.612-0.794 0.847-1.36 0.636z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m174.19 686.52c0.047-0.392 0.334-0.71 0.717-0.807 6.889-1.74 11.858-5.372 15.692-9.819 0.507-0.55 0.962-1.174 1.437-1.746 0.221-0.301 0.79-1.075 1.006-1.365 0.199-0.299 0.741-1.096 0.95-1.403 0.346-0.573 0.861-1.347 1.176-1.931l0.563-0.977c1.451-2.643 2.662-5.421 3.684-8.269 0.231-0.613 0.509-1.524 0.734-2.151 0.21-0.733 0.458-1.446 0.664-2.179 0.19-0.739 0.449-1.451 0.618-2.197 0.991-3.725 1.792-7.441 2.371-11.313 0.714-4.762 0.957-9.632 0.56-14.435-1.078-11.129-5.219-22.328-12.856-30.605-0.452-0.515-1.163-1.174-1.648-1.667-0.309-0.279-1.042-0.923-1.344-1.195-0.307-0.251-1.065-0.843-1.384-1.099-0.313-0.237-0.639-0.45-0.959-0.678-0.633-0.473-1.313-0.848-1.979-1.268-1.358-0.767-2.76-1.492-4.236-2.015-1.099-0.427-2.237-0.76-3.39-1.01-0.386-0.08-0.77-0.195-1.163-0.239l-1.178-0.18c-0.394-0.074-0.792-0.073-1.19-0.115-0.398-0.023-0.799-0.086-1.2-0.08l-1.208-0.02c-5.01 0.086-9.85 1.456-14.326 3.915-1.525 0.797-2.977 1.752-4.4 2.765-0.63 0.458-1.491 1.117-2.079 1.612-0.801 0.47-1.623 1.989-2.639 1.16-0.368-0.332-0.422-0.893-0.117-1.284 5.596-7.246 13.745-12.877 22.979-14.369l1.482-0.198c0.495-0.077 0.995-0.083 1.495-0.126 0.5-0.024 1.002-0.089 1.505-0.077l1.512 5e-3c0.507-0.012 1.007 0.05 1.513 0.08 1.517 0.101 3.031 0.309 4.518 0.64 2.001 0.396 3.939 1.041 5.842 1.777 1.409 0.589 2.79 1.244 4.129 1.978 0.462 0.274 1.527 0.888 1.969 1.161 0.402 0.265 1.484 0.988 1.898 1.266 0.711 0.54 1.743 1.268 2.411 1.84 9.323 7.639 15.426 18.525 18.777 29.962 1.116 3.805 2.001 7.674 2.636 11.591 3.018 16.561-0.173 33.383-11.822 46.131-0.737 0.767-1.437 1.546-2.231 2.259-0.389 0.362-0.769 0.727-1.166 1.077-0.432 0.356-1.413 1.19-1.841 1.523-0.624 0.458-1.303 0.974-1.933 1.412-0.906 0.578-1.77 1.18-2.722 1.683-5.492 3.129-11.991 4.749-18.23 3.789-1.77-0.278-3.475-0.772-5.062-1.455-0.39-0.168-0.628-0.568-0.577-0.989z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d="m84.044 655.01c-0.826 0.678-1.969-0.323-1.407-1.231 2.513-4.095 5.893-7.862 9.745-10.933 5.561-4.38 12.203-7.358 19.222-8.555 0.694-0.127 1.788-0.267 2.509-0.348 0.837-0.06 1.651-0.086 2.484-0.125 17.953-0.659 30.883 8.261 41.755 21.396 11.129 13.376 20.17 26.534 37.435 31.427 4.748 1.462 9.712 2.23 14.701 2.663 24.4 2.074 50.376-6.999 67.627-24.705 6.293-6.597 11.131-14.483 13.599-23.365 0.294-1.038 1.823-0.864 1.858 0.214 0.124 3.934-0.299 7.946-1.236 11.869-0.849 3.692-2.179 7.271-3.787 10.705-0.336 0.682-0.666 1.374-1.03 2.044-13.469 24.945-41.906 40.056-69.875 41.505-2.744 0.125-5.457 0.111-8.201 0.033-6.377-0.249-12.769-1.119-18.957-2.901-14.387-3.946-26.404-13.301-35.291-25.03-7.727-9.697-13.129-20.643-22.596-27.983-0.924-0.724-1.899-1.354-2.89-1.977-15.156-8.838-32.362-5.743-45.665 5.297z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m395.5 687.68c0 0.376-0.221 0.72-0.566 0.871-13.702 5.889-28.6 7.943-43.651 6.39-23.077-2.283-44.724-14.519-61.01-30.798-6.031-5.964-11.658-12.568-16.727-19.276-13.624-17.767-21.81-34.225-34.935-49.9l-0.567-0.67c-1.092-1.258-2.261-2.532-3.423-3.664-2.146-2.202-4.488-4.225-6.928-5.987-4.329-3.123-9.127-5.396-14.336-6.965-0.579-0.167-1.15-0.359-1.749-0.509l-0.835-0.227c-0.346-0.102-0.728-0.333-1.063-0.414-0.226-0.071-0.49-0.168-0.717-0.255-0.949-0.153-1.957-0.291-2.913-0.388l-1.707-0.158c-0.574-0.041-1.149-0.058-1.735-0.095l-1.76-0.021c-0.59 0.013-1.191 5e-3 -1.794 0.026-0.598 0.039-1.21 0.048-1.818 0.105-17.733 1.294-33.731 11.13-48.273 21.881-0.302 0.219-0.705 0.243-1.029 0.058l-1.414-0.808c-0.45-0.257-0.613-0.829-0.362-1.282 11.256-20.64 30.185-38.466 53.866-43.016 2.338-0.454 4.742-0.787 7.117-1.001 1.114-0.054 2.257-0.2 3.366-0.145l1.343 0.031c1.257 0.051 2.634 0.129 3.882 0.228 78.11 7.117 67.689 117.34 160.05 131.67 6.203 0.995 12.486 1.536 18.774 1.741 0.512 0.016 0.918 0.432 0.918 0.944v1.638z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 5"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 86 86"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -117.54 -118.81)">
|
||||||
|
<path
|
||||||
|
d="m549.35 646.73c33.11-12.297 70.56-13.382 102.17 4.694 0.752 0.43 1.069 1.466 0.728 2.343-0.188 0.482-0.549 0.848-0.992 1-33.064 11.319-70.41 12.472-102.09-4.69-0.414-0.225-0.723-0.647-0.845-1.152-0.224-0.927 0.227-1.898 1.028-2.195z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m767.73 609.27c-11.3 12.861-25.178 22.02-40.174 27.396-1.523 0.548-3.056 1.055-4.604 1.519-5.596 1.586-11.992 2.484-18.782 2.484-10.315 0-19.708-2.068-26.788-5.467-0.01-3e-3 -0.021-0.01-0.031-0.014-1.069-0.562-2.145-1.142-3.227-1.743-15.087-8.331-31.018-19.746-46.622-28.8-10.168-6.515-24.713-13.737-41.85-18.693-23.442-6.78-45.274-8.148-57.213-5.503-0.087-3e-3 -0.171-7e-3 -0.258-0.01 12.013-13.158 28.66-20.089 45.312-20.469 38.923-0.59 71.241 29.041 106.48 40.893 0.894 0.321 1.792 0.636 2.693 0.936 18.192 6.067 37.351 7.556 56.514 7.653 6.78 0.031 13.564-0.108 20.302-0.283 2.695-0.022 5.409-0.064 8.249 0.101z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m690.58 642.28-4.579-0.489-4.953-0.528c-1.764-0.241-3.594-0.542-5.467-0.908-1.844-0.36-3.633-0.761-5.334-1.191-0.339-0.087-0.674-0.175-1.006-0.266-0.224-0.059-0.444-0.119-0.66-0.178-0.22-0.06-0.437-0.119-0.65-0.178-3.535-0.971-6.41-1.837-6.459-1.837-25.856-7.891-52.731-17.518-79.425-14.741-29.387 2.284-56.637 19.816-87.253 16.159-18.524-2.033-36.076-12.254-48.994-27.372 56.256 18.419 77.239-15.827 124.14-18.632h12.299c22.628 0 49.326 21.154 74.151 36.042 11.094 6.654 21.814 12.054 31.63 13.756 0.858 0.15 1.71 0.272 2.556 0.363z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 6"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 70 70"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -222.27 -124.9)">
|
||||||
|
<path
|
||||||
|
d="m875.49 651.26-0.441-3.58-0.334-3.594c-0.085-1.2-0.138-2.403-0.208-3.605-0.051-1.203-0.064-2.407-0.098-3.611-0.058-4.818 0.175-9.643 0.689-14.44 1.074-9.591 3.286-19.046 6.405-28.176 0.381-1.145 0.809-2.272 1.211-3.41 0.409-1.135 0.864-2.252 1.294-3.379 0.435-1.125 0.928-2.226 1.39-3.34 0.468-1.112 0.981-2.203 1.469-3.305 2.009-4.384 4.212-8.675 6.583-12.87 4.743-8.388 10.146-16.387 16.04-23.99 5.938-7.57 12.357-14.746 19.141-21.544 3.392-3.399 6.877-6.704 10.444-9.915 1.785-1.604 3.584-3.192 5.415-4.743 1.834-1.548 3.687-3.071 5.556-4.574 7.484-6.002 15.255-11.639 23.289-16.867 4.03-2.594 8.123-5.088 12.276-7.475 1.035-0.602 2.081-1.186 3.127-1.769 1.042-0.589 2.098-1.156 3.15-1.726 2.112-1.129 4.244-2.219 6.384-3.293l0.891 1.705c-3.365 3.813-6.767 7.348-10.123 10.851l-9.949 10.36-9.737 10.147-4.779 5.04-4.727 5.019c-6.249 6.701-12.349 13.377-18.235 20.121-5.884 6.746-11.557 13.554-16.952 20.487-5.39 6.937-10.512 13.988-15.286 21.229-4.778 7.241-9.188 14.675-13.214 22.396l-1.483 2.914c-0.476 0.978-0.982 1.954-1.44 2.945-0.463 0.988-0.961 1.974-1.409 2.975-0.433 1.004-0.93 1.999-1.364 3.011-1.788 4.039-3.457 8.178-5.009 12.441-1.55 4.263-2.996 8.65-4.311 13.193-1.315 4.545-2.485 9.234-3.746 14.145z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m1044.6 646.58v0.094c0 0.567-0.01 1.08-0.024 1.562v0.021c-0.049 2.111-0.186 4.252-0.406 6.384-0.055 0.592-0.128 1.22-0.222 1.979-0.156 1.195-0.32 2.312-0.503 3.404 0 9e-3 0 0.018-0.01 0.03-0.055 0.354-0.119 0.726-0.192 1.135-0.442 2.431-0.997 4.892-1.647 7.314-0.143 0.531-0.299 1.089-0.47 1.662-4.191 14.417-11.846 27.63-22.133 38.204-10.825 11.123-24.049 18.681-38.25 21.85-0.689 0.152-1.36 0.29-2.046 0.427-0.787 0.146-1.433 0.262-2.04 0.357-0.531 0.085-0.97 0.156-1.382 0.214-0.021 3e-3 -0.046 9e-3 -0.073 0.012-2.635 0.448-5.31 0.775-7.994 0.973-0.165 3e-3 -0.333 3e-3 -0.497 3e-3 -0.717 0-1.412-0.012-2.123-0.031-0.811-0.027-1.476-0.055-2.098-0.094-0.546-0.034-0.997-0.061-1.415-0.094-0.024-3e-3 -0.049-3e-3 -0.076-6e-3 -4.706-0.238-9.44-0.872-14.069-1.882-0.024-6e-3 -0.046-9e-3 -0.067-0.015-8.433-1.839-16.558-4.901-24.15-9.095-7.597-4.197-14.463-9.421-20.413-15.53-4.069-4.175-7.631-8.683-10.656-13.46-4.413-6.969-7.686-14.512-9.733-22.445 7.445 8.217 16.128 14.783 25.919 19.587 6.057 2.971 12.511 5.237 19.187 6.731 6.466 1.449 13.17 2.184 19.929 2.184 10.431 0 21.054-1.775 31.1-5.173 2.312-0.781 4.593-1.647 6.835-2.599 12.121-5.139 23.149-12.761 31.894-22.042 8.027-8.522 14.127-18.312 18.132-29.103 2.318-6.255 3.904-12.776 4.743-19.511 1.052 2.644 1.94 5.374 2.66 8.171 1.535 5.997 2.307 12.313 2.286 18.782z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m1009.7 728.43c-21.667 9.479-46.698 11.465-71.741 2.074 2.736 0.875 5.514 1.623 8.329 2.236 6e-3 3e-3 0.015 6e-3 0.024 6e-3 4.791 0.994 9.668 1.598 14.554 1.949 0.491 0.04 0.982 0.07 1.47 0.101 0.299 0.015 0.595 0.03 0.894 0.046 0.165 6e-3 0.326 0.015 0.491 0.021 0.082 3e-3 0.162 6e-3 0.244 9e-3 0.183 6e-3 0.363 0.012 0.543 0.018 0.741 0.021 1.473 0.033 2.208 0.033 32.113 0 60.594-20.49 75.453-47.537 0.293-0.528 0.58-1.055 0.857-1.589 1.217-2.321 2.333-4.682 3.346-7.079 0.159-0.381 0.317-0.763 0.467-1.144 0.457-1.116 0.881-2.236 1.29-3.364 0.238-0.659 0.467-1.32 0.686-1.983 0.708-2.126 1.33-4.27 1.867-6.426 0.137-0.54 0.265-1.083 0.387-1.623v-6e-3c0.082-0.36 0.161-0.72 0.238-1.083 0.155-0.72 0.299-1.443 0.433-2.169 0.067-0.363 0.131-0.726 0.192-1.089 0.037-0.211 0.073-0.424 0.107-0.638 0.027-0.149 0.049-0.299 0.073-0.451 0.037-0.216 0.067-0.436 0.101-0.656 0.021-0.143 0.043-0.29 0.064-0.436 0.01-0.07 0.021-0.141 0.031-0.211 0.037-0.244 0.07-0.491 0.101-0.738 0.01-0.049 0.012-0.094 0.018-0.143 0.046-0.366 0.091-0.729 0.134-1.095s0.082-0.729 0.119-1.095c0.036-0.366 0.07-0.732 0.104-1.098 0.031-0.366 0.061-0.732 0.085-1.098 0.028-0.366 0.052-0.732 0.073-1.098 0.01-0.131 0.015-0.262 0.021-0.396 0.012-0.235 0.024-0.467 0.034-0.702 0.058-1.333 0.082-2.666 0.07-3.998 0-0.235-0.01-0.467-0.01-0.698-0.01-0.467-0.021-0.933-0.04-1.4-0.018-0.467-0.039-0.93-0.067-1.397-0.012-0.232-0.027-0.467-0.043-0.698-0.018-0.266-0.037-0.528-0.055-0.79-0.024-0.281-0.046-0.561-0.073-0.839-0.01-0.125-0.021-0.253-0.034-0.378 0-0.031-0.01-0.058-0.01-0.085-0.043-0.467-0.091-0.93-0.146-1.394-0.027-0.235-0.055-0.467-0.082-0.698-0.028-0.232-0.06-0.464-0.092-0.696-0.033-0.231-0.064-0.463-0.097-0.694v-2e-3c-0.057-0.385-0.117-0.773-0.18-1.159-0.031-0.192-0.061-0.383-0.095-0.576-0.01-0.064-0.021-0.131-0.033-0.195-0.049-0.284-0.101-0.564-0.153-0.845-0.174-0.924-0.363-1.845-0.573-2.763-0.052-0.232-0.107-0.461-0.162-0.689-0.11-0.461-0.223-0.918-0.345-1.375-0.095-0.36-0.189-0.717-0.29-1.073-0.091-0.327-0.186-0.656-0.281-0.982-0.104-0.341-0.204-0.683-0.311-1.025s-0.214-0.68-0.326-1.022c-0.232-0.701-0.476-1.4-0.729-2.098-0.256-0.698-0.521-1.394-0.796-2.086-0.094-0.232-0.189-0.464-0.287-0.695-0.287-0.689-0.583-1.379-0.894-2.065s-0.634-1.373-0.973-2.056c-0.223-0.454-0.451-0.909-0.686-1.357-0.47-0.903-0.964-1.805-1.482-2.699-0.256-0.445-0.518-0.888-0.787-1.33-1.613-2.666-3.431-5.276-5.465-7.823 0.01 0.125 0.015 0.253 0.021 0.378-0.208-0.268-0.418-0.537-0.631-0.802v-3e-3c-10.034-13.414-24.177-25.08-40.321-35.389l-0.107-0.07c-0.393-0.253-0.79-0.506-1.177-0.772-0.15-0.092-0.296-0.192-0.442-0.293-22.481-15.341-29.92-44.721-18.254-68.673 1-2.05 2.135-4.056 3.416-6.015 4.923-7.521 11.389-13.426 18.712-17.559-11.026 21.942-5.856 48.62 12.34 64.879 0.01 0.012 0.021 0.018 0.034 0.024 0.897 0.76 1.809 1.516 2.714 2.272 0.01 3e-3 0.012 0.012 0.021 0.015 7.122 5.911 14.509 11.776 21.636 18.041 4.301 3.773 8.186 7.796 11.669 12.02 41.899 50.756 25.588 130.52-37.403 158.08z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 7"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 83 83"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -18.861 -215.79)">
|
||||||
|
<path
|
||||||
|
d="m383.44 1005c-17.007 4.876-34.86 3.884-51.505-1.426-3.639-1.165-7.214-2.531-10.718-4.086-13.399-5.958-25.641-14.693-35.527-25.297-9.518 9.48-20.9 17.454-33.274 23.201-2.477-1.253-4.923-2.556-7.337-3.919-1.086-0.604-2.166-1.231-3.236-1.857-3.053-1.791-6.053-3.664-8.999-5.619 1.794-1.073 3.563-2.185 5.301-3.34 14.275-9.418 27.092-20.888 37.337-34.514l0.277-0.393 6.405-9.068c1.948-2.764 6.05-2.738 7.96 0.047 4.454 6.475 9.984 14.52 13.969 18.801 10.4 11.785 22.569 21.772 36.085 29.704 3.563 2.093 7.221 4.041 10.96 5.842 2.855 1.372 5.757 2.657 8.71 3.859l1.599 0.655 1.618 0.63c1.07 0.441 2.165 0.821 3.258 1.237 0.985 0.331 2.357 0.847 3.318 1.177 4.463 1.524 9.059 2.915 13.799 4.366z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m268.93 1005c-14.19 4.067-28.967 4.048-43.138 0.851-2.817-0.637-5.61-1.396-8.365-2.278-3.638-1.164-7.214-2.529-10.717-4.085-0.453-0.202-0.913-0.41-1.366-0.619-12.867-5.934-24.613-14.435-34.161-24.68-10.644 10.607-23.621 19.321-37.706 25.152-3.521 1.458-7.11 2.732-10.748 3.809-16.217 4.807-33.419 5.72-49.899 1.335 11.06-2.945 21.986-6.693 32.323-11.519 3.644-1.703 7.214-3.534 10.693-5.518 2.652-1.507 5.255-3.105 7.79-4.789 14.276-9.419 27.093-20.89 37.339-34.516l0.276-0.392 6.406-9.07c1.947-2.762 6.05-2.738 7.961 0.049 4.452 6.473 9.982 14.52 13.969 18.801 10.399 11.783 22.567 21.771 36.083 29.702 0.827 0.484 1.66 0.968 2.499 1.433 2.768 1.562 5.591 3.025 8.463 4.409 2.854 1.372 5.757 2.658 8.709 3.858l1.598 0.655 1.617 0.631c0.361 0.147 0.722 0.288 1.084 0.422 0.723 0.275 1.452 0.539 2.174 0.814 0.986 0.331 2.358 0.845 3.319 1.176 4.465 1.528 9.058 2.918 13.797 4.369z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else-if="logo === 8"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 80 80"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -120.18 -218.25)">
|
||||||
|
<path
|
||||||
|
d="m462.1 991.44c-10.898-45.855 24.103-47.123 48.506-38.2 35.84 11.907 69.264 33.378 103.56 50.866 32.86 15.751 76.028 41.219 108.75 13.648l0.984 1.283c-65.971 91.633-269.76-141.21-260.42-27.786z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m745.56 911.2c9.995 18.56 13.629 43.419 6.801 64.796-20.208 63.336-106.46 25.444-140.84 1.841-35.901-25.353-78.314-47.174-119.65-37.05-27.206 7.414-36.776 46.657-19.06 74.239l-1.82 1.872c-19.287-18.242-21.185-53.99-5.693-77.227 7.734-11.714 18.886-18.279 30.08-21.968 39.233-11.321 80.111 3.114 115.45 25.526 27.316 19.256 56.347 35.602 87.212 41.274 14.994 2.228 33.931 4.253 42.758-14.908 8.548-16.399 7.875-38.451 2.842-56.708z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m567.39 1024c-23.424-7.831-77.446-52.293-95.856-45.024l-0.587-0.936c23.809-20.928 77.844 24.216 97.013 45.006z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m670.64 952.53c23.69 9.745 79.834 19.812 62.239-34.988l0.833-0.53c15.288 17.12 9.172 45.901-9.786 52.703-18.434 6.932-38.883-0.726-53.552-16.026z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<svg
|
||||||
|
v-else
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 79 79"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<g transform="matrix(.26458 0 0 .26458 -215.5 -218.63)">
|
||||||
|
<path
|
||||||
|
d="m833.81 1024.3c-0.563-0.212-0.881-0.727-0.761-1.239 9.586-40.963 46.76-62.954 92.676-40.345 51.363 24.968 103.6 78.601 156.69 24.727 0.376-0.381 1.036-0.451 1.507-0.155 0.464 0.292 0.585 0.842 0.273 1.254-25.378 33.537-61.546 37.303-102.05 19.81-31.73-12.406-63.076-36.409-98.875-36.901-21.713 1.81-35.133 19.016-47.886 32.528-0.376 0.397-1.021 0.528-1.57 0.321z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m815.58 984.63c-0.736-0.372-1.079-1.279-0.782-2.078 27.954-75.078 86.417-62.89 148.14-46.596 25.341 6.099 51.503 8.859 77.259 7.027 25.632-1.739 48.67-14.93 69.616-30.033 0.714-0.515 1.663-0.475 2.333 0.099 0.667 0.572 0.905 1.539 0.569 2.372-18.586 46.11-68.644 68.876-114.18 57.049-40.197-8.77-78.691-31.889-120.06-32.625-27.027-0.304-48.062 20.754-60.848 44.116-0.41 0.75-1.298 1.045-2.041 0.669z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m833.81 1024.3c-0.563-0.212-0.881-0.727-0.761-1.239 9.586-40.963 46.76-62.954 92.676-40.345 51.363 24.968 103.6 78.601 156.69 24.727 0.376-0.381 1.036-0.451 1.507-0.155 0.464 0.292 0.585 0.842 0.273 1.254-25.378 33.537-61.546 37.303-102.05 19.81-31.73-12.406-63.076-36.409-98.876-36.901-21.714 1.81-35.133 19.016-47.886 32.528-0.375 0.398-1.02 0.528-1.569 0.321z"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="m1094.6 985.04c-10.734 16.969-24.763 26.827-40.431 31.645-8.481 2.611-17.44 3.743-26.614 3.723h-0.043c-6.46-0.013-13.03-0.597-19.613-1.639h-0.027c-29.531-5.817-49.489-25.682-80.463-40.829-34.674-16.955-74.421-11.972-95.985 9.075-2.114 1.818-4.161 3.736-6.142 5.717-1.214 1.211-3.139-0.173-2.528-1.812 16.862-45.408 61.361-48.666 102.11-33.808 55.949 18.306 111.86 63.969 168.28 26.365 0.972-0.647 2.094 0.561 1.457 1.566z"
|
||||||
|
/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
</template>
|
54
src/components/base/MaterialSymbols.vue
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
// Supports weights 100-700
|
||||||
|
// Available symbols https://fonts.google.com/icons?icon.set=Material+Symbols
|
||||||
|
import "@fontsource-variable/material-symbols-outlined";
|
||||||
|
import "@fontsource-variable/material-symbols-outlined/fill.css";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
type: Number,
|
||||||
|
/* Preferred icon size 24px */
|
||||||
|
default: 1.5,
|
||||||
|
},
|
||||||
|
filled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<span
|
||||||
|
class="material-symbols-outlined"
|
||||||
|
v-text="props.name"
|
||||||
|
:class="{
|
||||||
|
filled: props.filled,
|
||||||
|
}"
|
||||||
|
:style="{
|
||||||
|
'font-size': props.size + 'rem',
|
||||||
|
}"
|
||||||
|
></span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.material-symbols-outlined {
|
||||||
|
font-family: "Material Symbols Outlined Variable", sans-serif;
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
display: inline-block;
|
||||||
|
line-height: 1;
|
||||||
|
text-transform: none;
|
||||||
|
letter-spacing: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
white-space: nowrap;
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-symbols-outlined.filled {
|
||||||
|
font-variation-settings: "FILL" 1;
|
||||||
|
}
|
||||||
|
</style>
|
3
src/components/base/Skeleton.vue
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<template>
|
||||||
|
<div class="skeleton"></div>
|
||||||
|
</template>
|
76
src/components/forms/Search.vue
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed, onMounted, } from "vue";
|
||||||
|
import { Button, Label } from "daisy-ui-kit";
|
||||||
|
import { useTranslation } from "i18next-vue";
|
||||||
|
import MaterialSymbols from "@/components/base/MaterialSymbols.vue";
|
||||||
|
|
||||||
|
const t = useTranslation().t;
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
q: {
|
||||||
|
default: "",
|
||||||
|
type: String,
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
default: false,
|
||||||
|
type: Boolean,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
submit: [value: string],
|
||||||
|
"update:q": [value: string],
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const q = defineModel<string>("q", {
|
||||||
|
default: "",
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted((): void => {
|
||||||
|
q.value = props.q;
|
||||||
|
});
|
||||||
|
|
||||||
|
async function onSubmit(): Promise<void> {
|
||||||
|
const value = q.value;
|
||||||
|
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit("submit", value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const translations = computed(() => {
|
||||||
|
return {
|
||||||
|
search: t("Search"),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<form @submit.prevent.stop="onSubmit">
|
||||||
|
<Label class="flex items-center gap-2 p-0 input input-bordered">
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
name="q"
|
||||||
|
v-model.trim="q"
|
||||||
|
:placeholder="translations.search + '…'"
|
||||||
|
:disabled="disabled"
|
||||||
|
autofocus
|
||||||
|
class="pl-4 grow"
|
||||||
|
@input="emit('update:q', q)"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
type="submit"
|
||||||
|
:ghost="q.length === 0"
|
||||||
|
:primary="q.length !== 0"
|
||||||
|
:disabled="q.length === 0 || disabled"
|
||||||
|
class="tooltip tooltip-left"
|
||||||
|
:["data-tip"]="translations.search"
|
||||||
|
>
|
||||||
|
<MaterialSymbols name="search" class="cursor-pointer" />
|
||||||
|
</Button>
|
||||||
|
</Label>
|
||||||
|
</form>
|
||||||
|
</template>
|
427
src/components/forms/SearchFilters.vue
Normal file
@@ -0,0 +1,427 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { SearchAttributeConstraint } from "@/services/ArtworkSearch/enums/SearchAttributeConstraint";
|
||||||
|
import { SearchEntityConstraint } from "@/services/ArtworkSearch/enums/SearchEntityConstraint";
|
||||||
|
import { SearchMediaConstraint } from "@/services/ArtworkSearch/enums/SearchMediaConstraint";
|
||||||
|
import { Flex, Select } from "daisy-ui-kit";
|
||||||
|
import { useTranslation } from "i18next-vue";
|
||||||
|
import { computed, ref, type ComputedRef } from "vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
media?: SearchMediaConstraint;
|
||||||
|
entity?: SearchEntityConstraint | null;
|
||||||
|
attribute?: SearchAttributeConstraint | null;
|
||||||
|
disabled?: boolean;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
"update:media": [value: SearchMediaConstraint];
|
||||||
|
"update:entity": [value: SearchEntityConstraint | null];
|
||||||
|
"update:attribute": [value: SearchAttributeConstraint | null];
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const t = useTranslation().t;
|
||||||
|
|
||||||
|
const media = ref<SearchMediaConstraint>(
|
||||||
|
props.media ?? SearchMediaConstraint.all
|
||||||
|
);
|
||||||
|
const entity = ref<{ value: SearchEntityConstraint | null; label: string }>();
|
||||||
|
const attribute = ref<{
|
||||||
|
value: SearchAttributeConstraint | null;
|
||||||
|
label: string;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const mediaOptions: ComputedRef<Array<Record<string, any>>> = computed(() => {
|
||||||
|
const options: Array<{ value: SearchMediaConstraint; label: string }> = [];
|
||||||
|
|
||||||
|
const searchMediaOptions = Object.values(SearchMediaConstraint);
|
||||||
|
|
||||||
|
for (let i = 0, length = searchMediaOptions.length; i < length; i++) {
|
||||||
|
const searchMediaOption = searchMediaOptions[i];
|
||||||
|
|
||||||
|
options.push({
|
||||||
|
value: searchMediaOption,
|
||||||
|
label: t(`searchMediaConstraint.${searchMediaOption}`, {
|
||||||
|
ns: "artworkSearch",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
options.sort((a, b) => {
|
||||||
|
if (a.value === SearchMediaConstraint.all) {
|
||||||
|
return -1;
|
||||||
|
} else if (b.value === SearchMediaConstraint.all) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.label.localeCompare(b.label);
|
||||||
|
});
|
||||||
|
|
||||||
|
let index = options.findIndex((option) => option.value === props.media);
|
||||||
|
|
||||||
|
if (index < 0) {
|
||||||
|
index = 0;
|
||||||
|
emit("update:media", SearchMediaConstraint.all);
|
||||||
|
}
|
||||||
|
|
||||||
|
media.value = options[index].value;
|
||||||
|
|
||||||
|
return options;
|
||||||
|
});
|
||||||
|
|
||||||
|
const entityOptions: ComputedRef<
|
||||||
|
Array<{ value: SearchEntityConstraint | null; label: string }>
|
||||||
|
> = computed(() => {
|
||||||
|
const entityOptionValues: Array<SearchEntityConstraint> = [];
|
||||||
|
|
||||||
|
switch (media.value) {
|
||||||
|
case SearchMediaConstraint.movie:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[SearchEntityConstraint.movieArtist, SearchEntityConstraint.movie]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.podcast:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.podcastAuthor,
|
||||||
|
SearchEntityConstraint.podcast,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.music:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.musicArtist,
|
||||||
|
SearchEntityConstraint.musicTrack,
|
||||||
|
SearchEntityConstraint.album,
|
||||||
|
SearchEntityConstraint.musicVideo,
|
||||||
|
SearchEntityConstraint.mix,
|
||||||
|
SearchEntityConstraint.song,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.musicVideo:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.musicArtist,
|
||||||
|
SearchEntityConstraint.musicVideo,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.audioBook:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.audioBookAuthor,
|
||||||
|
SearchEntityConstraint.audioBook,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.shortFilm:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.shortFilmArtist,
|
||||||
|
SearchEntityConstraint.shortFilm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.tvShow:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[SearchEntityConstraint.tvEpisode, SearchEntityConstraint.tvSeason]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.software:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.software,
|
||||||
|
SearchEntityConstraint.iPadSoftware,
|
||||||
|
SearchEntityConstraint.macSoftware,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.ebook:
|
||||||
|
entityOptionValues.push(...[SearchEntityConstraint.ebook]);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.all:
|
||||||
|
entityOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchEntityConstraint.movie,
|
||||||
|
SearchEntityConstraint.album,
|
||||||
|
SearchEntityConstraint.allArtist,
|
||||||
|
SearchEntityConstraint.podcast,
|
||||||
|
SearchEntityConstraint.musicVideo,
|
||||||
|
SearchEntityConstraint.mix,
|
||||||
|
SearchEntityConstraint.audioBook,
|
||||||
|
SearchEntityConstraint.tvSeason,
|
||||||
|
SearchEntityConstraint.allTrack,
|
||||||
|
SearchEntityConstraint.allTrack,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const options: Array<{
|
||||||
|
value: SearchEntityConstraint | null;
|
||||||
|
label: string;
|
||||||
|
}> = entityOptionValues.map((value) => {
|
||||||
|
return {
|
||||||
|
value: value,
|
||||||
|
label: t(`searchEntityConstraint.${value}`, {
|
||||||
|
ns: "artworkSearch",
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
options.push({
|
||||||
|
value: null,
|
||||||
|
label: t(`searchEntityConstraint.all`, {
|
||||||
|
ns: "artworkSearch",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
options.sort((a, b) => {
|
||||||
|
if (a.value === null) {
|
||||||
|
return -1;
|
||||||
|
} else if (b.value === null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.label.localeCompare(b.label);
|
||||||
|
});
|
||||||
|
|
||||||
|
let index = options.findIndex((option) => option.value === props.entity);
|
||||||
|
|
||||||
|
if (index < 0) {
|
||||||
|
index = 0;
|
||||||
|
emit("update:entity", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
entity.value = options[index];
|
||||||
|
|
||||||
|
return options;
|
||||||
|
});
|
||||||
|
|
||||||
|
const attributeOptions: ComputedRef<
|
||||||
|
Array<{ value: SearchAttributeConstraint | null; label: string }>
|
||||||
|
> = computed(() => {
|
||||||
|
const mediaOptionValues: Array<SearchAttributeConstraint> = [];
|
||||||
|
|
||||||
|
switch (media.value) {
|
||||||
|
case SearchMediaConstraint.movie:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.actorTerm,
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.artistTerm,
|
||||||
|
SearchAttributeConstraint.shortFilmTerm,
|
||||||
|
SearchAttributeConstraint.producerTerm,
|
||||||
|
SearchAttributeConstraint.ratingTerm,
|
||||||
|
SearchAttributeConstraint.directorTerm,
|
||||||
|
SearchAttributeConstraint.releaseYearTerm,
|
||||||
|
SearchAttributeConstraint.featureFilmTerm,
|
||||||
|
SearchAttributeConstraint.movieArtistTerm,
|
||||||
|
SearchAttributeConstraint.movieTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.descriptionTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.podcast:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.titleTerm,
|
||||||
|
SearchAttributeConstraint.languageTerm,
|
||||||
|
SearchAttributeConstraint.authorTerm,
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.artistTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.keywordsTerm,
|
||||||
|
SearchAttributeConstraint.descriptionTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.music:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.mixTerm,
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.artistTerm,
|
||||||
|
SearchAttributeConstraint.composerTerm,
|
||||||
|
SearchAttributeConstraint.albumTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.songTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.musicVideo:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.artistTerm,
|
||||||
|
SearchAttributeConstraint.albumTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.songTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.audioBook:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.titleTerm,
|
||||||
|
SearchAttributeConstraint.authorTerm,
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.shortFilm:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.artistTerm,
|
||||||
|
SearchAttributeConstraint.shortFilmTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.descriptionTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.software:
|
||||||
|
mediaOptionValues.push(...[SearchAttributeConstraint.softwareDeveloper]);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.tvShow:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.tvEpisodeTerm,
|
||||||
|
SearchAttributeConstraint.showTerm,
|
||||||
|
SearchAttributeConstraint.tvSeasonTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.descriptionTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.ebook:
|
||||||
|
// API does not support setting search terms
|
||||||
|
break;
|
||||||
|
case SearchMediaConstraint.all:
|
||||||
|
mediaOptionValues.push(
|
||||||
|
...[
|
||||||
|
SearchAttributeConstraint.actorTerm,
|
||||||
|
SearchAttributeConstraint.languageTerm,
|
||||||
|
SearchAttributeConstraint.allArtistTerm,
|
||||||
|
SearchAttributeConstraint.tvEpisodeTerm,
|
||||||
|
SearchAttributeConstraint.shortFilmTerm,
|
||||||
|
SearchAttributeConstraint.directorTerm,
|
||||||
|
SearchAttributeConstraint.releaseYearTerm,
|
||||||
|
SearchAttributeConstraint.titleTerm,
|
||||||
|
SearchAttributeConstraint.featureFilmTerm,
|
||||||
|
SearchAttributeConstraint.ratingIndex,
|
||||||
|
SearchAttributeConstraint.keywordsTerm,
|
||||||
|
SearchAttributeConstraint.descriptionTerm,
|
||||||
|
SearchAttributeConstraint.authorTerm,
|
||||||
|
SearchAttributeConstraint.genreIndex,
|
||||||
|
SearchAttributeConstraint.mixTerm,
|
||||||
|
SearchAttributeConstraint.allTrackTerm,
|
||||||
|
SearchAttributeConstraint.artistTerm,
|
||||||
|
SearchAttributeConstraint.composerTerm,
|
||||||
|
SearchAttributeConstraint.tvSeasonTerm,
|
||||||
|
SearchAttributeConstraint.producerTerm,
|
||||||
|
SearchAttributeConstraint.ratingTerm,
|
||||||
|
SearchAttributeConstraint.songTerm,
|
||||||
|
SearchAttributeConstraint.movieArtistTerm,
|
||||||
|
SearchAttributeConstraint.showTerm,
|
||||||
|
SearchAttributeConstraint.movieTerm,
|
||||||
|
SearchAttributeConstraint.albumTerm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const options: Array<{
|
||||||
|
value: SearchAttributeConstraint | null;
|
||||||
|
label: string;
|
||||||
|
}> = mediaOptionValues.map((value) => {
|
||||||
|
return {
|
||||||
|
value: value,
|
||||||
|
label: t(`searchAttributeConstraint.${value}`, {
|
||||||
|
ns: "artworkSearch",
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
options.push({
|
||||||
|
value: null,
|
||||||
|
label: t(`searchAttributeConstraint.all`, {
|
||||||
|
ns: "artworkSearch",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
options.sort((a, b) => {
|
||||||
|
if (a.value === null) {
|
||||||
|
return -1;
|
||||||
|
} else if (b.value === null) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return a.label.localeCompare(b.label);
|
||||||
|
});
|
||||||
|
|
||||||
|
let index = options.findIndex((option) => option.value === props.attribute);
|
||||||
|
|
||||||
|
if (index < 0) {
|
||||||
|
index = 0;
|
||||||
|
emit("update:attribute", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
attribute.value = options[index];
|
||||||
|
|
||||||
|
return options;
|
||||||
|
});
|
||||||
|
|
||||||
|
const translations = computed(() => {
|
||||||
|
return {
|
||||||
|
mediaType: t("Media Type"),
|
||||||
|
resultType: t("Result Type"),
|
||||||
|
searchBy: t("Search By"),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Flex row wrap class="gap-4 p-2 mt-2">
|
||||||
|
<div>
|
||||||
|
{{ translations.mediaType }}:
|
||||||
|
<Select
|
||||||
|
sm
|
||||||
|
bordered
|
||||||
|
v-model="media"
|
||||||
|
:options="mediaOptions"
|
||||||
|
:disabled="props.disabled"
|
||||||
|
@update:model-value="emit('update:media', $event)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{{ translations.resultType }}:
|
||||||
|
<Select
|
||||||
|
sm
|
||||||
|
bordered
|
||||||
|
v-model="entity"
|
||||||
|
:options="entityOptions"
|
||||||
|
:disabled="props.disabled"
|
||||||
|
result-as-object
|
||||||
|
@update:model-value="emit('update:entity', $event.value)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
{{ translations.searchBy }}:
|
||||||
|
<Select
|
||||||
|
sm
|
||||||
|
bordered
|
||||||
|
v-model="attribute"
|
||||||
|
:options="attributeOptions"
|
||||||
|
:disabled="props.disabled"
|
||||||
|
result-as-object
|
||||||
|
@update:model-value="emit('update:attribute', $event.value)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</Flex>
|
||||||
|
</template>
|
35
src/components/layout/Footer.vue
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { useTranslation } from "i18next-vue";
|
||||||
|
import { computed, ref } from "vue";
|
||||||
|
import Link from "../base/Link.vue";
|
||||||
|
import MaterialSymbols from "../base/MaterialSymbols.vue";
|
||||||
|
|
||||||
|
const t = useTranslation().t;
|
||||||
|
|
||||||
|
const translations = computed(() => {
|
||||||
|
return {
|
||||||
|
createdBy: t("Created with {heart} by {alexbcberio}"),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<footer class="px-6 py-4 bg-base-300 min-h-7">
|
||||||
|
<p class="flex flex-wrap items-center justify-center gap-1">
|
||||||
|
<i18next :translation="translations.createdBy">
|
||||||
|
<template #heart>
|
||||||
|
<MaterialSymbols name="favorite" :size="1" filled />
|
||||||
|
</template>
|
||||||
|
<template #alexbcberio>
|
||||||
|
<Link
|
||||||
|
href="https://alexbcberio.com/"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
@alexbcberio
|
||||||
|
</Link>
|
||||||
|
</template>
|
||||||
|
</i18next>
|
||||||
|
</p>
|
||||||
|
</footer>
|
||||||
|
</template>
|
19
src/components/layout/header/Header.vue
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import HeaderLanguageSelector from "./HeaderLanguageSelector.vue";
|
||||||
|
import { Navbar } from "daisy-ui-kit";
|
||||||
|
import Logo from "@/components/base/Logo.vue";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<header>
|
||||||
|
<Navbar class="bg-base-300">
|
||||||
|
<div class="flex-1">
|
||||||
|
<router-link :to="{ name: 'home' }" class="flex items-center">
|
||||||
|
<Logo class="fill-primary h-11 w-11 ml-2" />
|
||||||
|
<a class="px-4 text-xl">Arsea</a>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<HeaderLanguageSelector />
|
||||||
|
</Navbar>
|
||||||
|
</header>
|
||||||
|
</template>
|
60
src/components/layout/header/HeaderLanguageSelector.vue
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import {
|
||||||
|
DropdownButton,
|
||||||
|
DropdownContent,
|
||||||
|
Dropdown,
|
||||||
|
Menu,
|
||||||
|
MenuItem,
|
||||||
|
Button,
|
||||||
|
} from "daisy-ui-kit";
|
||||||
|
import MaterialSymbols from "@/components/base/MaterialSymbols.vue";
|
||||||
|
import { supportedLanguages } from "@/lang";
|
||||||
|
import { useTranslation } from "i18next-vue";
|
||||||
|
|
||||||
|
const selectedLanguage = defineModel<string>("language", {
|
||||||
|
set(language: string) {
|
||||||
|
i18next.changeLanguage(language);
|
||||||
|
return language;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const i18next = useTranslation().i18next;
|
||||||
|
selectedLanguage.value = i18next.language;
|
||||||
|
|
||||||
|
const languages = supportedLanguages.map((language: string) => {
|
||||||
|
return {
|
||||||
|
name: i18next.t(language, {
|
||||||
|
ns: "languages",
|
||||||
|
}),
|
||||||
|
value: language,
|
||||||
|
selected: i18next.language === language,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="dropdown dropdown-end ghost">
|
||||||
|
<Dropdown placement="bottom-end">
|
||||||
|
<DropdownButton>
|
||||||
|
<Button square ghost class="m-1">
|
||||||
|
<MaterialSymbols name="language" />
|
||||||
|
</Button>
|
||||||
|
</DropdownButton>
|
||||||
|
|
||||||
|
<DropdownContent class="z-10">
|
||||||
|
<Menu class="bg-base-100 rounded-box z-[1] p-2 shadow">
|
||||||
|
<MenuItem
|
||||||
|
v-for="(language, index) of languages"
|
||||||
|
:key="index"
|
||||||
|
@click="selectedLanguage = language.value"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
:class="{ active: selectedLanguage === language.value }"
|
||||||
|
v-text="language.name"
|
||||||
|
></a>
|
||||||
|
</MenuItem>
|
||||||
|
</Menu>
|
||||||
|
</DropdownContent>
|
||||||
|
</Dropdown>
|
||||||
|
</div>
|
||||||
|
</template>
|
69
src/lang/en/artworkSearch.json
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"searchMediaConstraint": {
|
||||||
|
"movie": "Movie",
|
||||||
|
"podcast": "Poscast",
|
||||||
|
"music": "Music",
|
||||||
|
"musicVideo": "Music Video",
|
||||||
|
"audiobook": "Audiobook",
|
||||||
|
"shortFilm": "Short Film",
|
||||||
|
"tvShow": "TV Show",
|
||||||
|
"software": "Software",
|
||||||
|
"ebook": "E Book",
|
||||||
|
"all": "All"
|
||||||
|
},
|
||||||
|
"searchEntityConstraint": {
|
||||||
|
"movieArtist": "Movie Artist",
|
||||||
|
"movie": "Movie",
|
||||||
|
"podcastAuthor": "Podcast Author",
|
||||||
|
"podcast": "Podcast",
|
||||||
|
"musicArtist": "Music Artist",
|
||||||
|
"musicTrack": "Music Track",
|
||||||
|
"album": "Album",
|
||||||
|
"musicVideo": "Music Video",
|
||||||
|
"mix": "Mix",
|
||||||
|
"song": "Song",
|
||||||
|
"audiobookAuthor": "Audiobook Author",
|
||||||
|
"audiobook": "Audiobook",
|
||||||
|
"shortFilmArtist": "Short Film Artist",
|
||||||
|
"shortFilm": "Short Film",
|
||||||
|
"tvEpisode": "TV Episode",
|
||||||
|
"tvSeason": "TV Season",
|
||||||
|
"software": "Software",
|
||||||
|
"iPadSoftware": "iPad Software",
|
||||||
|
"macSoftware": "mac Software",
|
||||||
|
"ebook": "E Book",
|
||||||
|
"allArtist": "All Artists",
|
||||||
|
"allTrack": "All Tracks",
|
||||||
|
"all": "All"
|
||||||
|
},
|
||||||
|
"searchAttributeConstraint": {
|
||||||
|
"actorTerm": "Actor",
|
||||||
|
"genreIndex": "Genre",
|
||||||
|
"artistTerm": "Artist",
|
||||||
|
"shortFilmTerm": "Short Firm",
|
||||||
|
"producerTerm": "Producer",
|
||||||
|
"ratingTerm": "Rating",
|
||||||
|
"directorTerm": "Director",
|
||||||
|
"releaseYearTerm": "Release Year",
|
||||||
|
"featureFilmTerm": "Feature Film",
|
||||||
|
"movieArtistTerm": "Movie Artist",
|
||||||
|
"movieTerm": "Movie",
|
||||||
|
"ratingIndex": "Rating Index",
|
||||||
|
"descriptionTerm": "Description",
|
||||||
|
"titleTerm": "Title",
|
||||||
|
"languageTerm": "Language",
|
||||||
|
"authorTerm": "Author",
|
||||||
|
"keywordsTerm": "Keywords",
|
||||||
|
"mixTerm": "Mix",
|
||||||
|
"composerTerm": "Compose",
|
||||||
|
"softwareDeveloper": "Software Developer",
|
||||||
|
"tvEpisodeTerm": "TV Episode",
|
||||||
|
"showTerm": "Show",
|
||||||
|
"tvSeasonTerm": "TV Season",
|
||||||
|
"allArtistTerm": "All Artist",
|
||||||
|
"allTrackTerm": "All Track",
|
||||||
|
"albumTerm": "Album",
|
||||||
|
"songTerm": "Song",
|
||||||
|
"all": "All"
|
||||||
|
}
|
||||||
|
}
|
9
src/lang/en/index.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import artworkSearch from "./artworkSearch.json";
|
||||||
|
import languages from "./languages.json";
|
||||||
|
import translation from "./translation.json";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
languages,
|
||||||
|
translation,
|
||||||
|
artworkSearch,
|
||||||
|
};
|
4
src/lang/en/languages.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"en": "English",
|
||||||
|
"es": "Español"
|
||||||
|
}
|
9
src/lang/en/translation.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Search": "Search",
|
||||||
|
"Media Type": "Media Type",
|
||||||
|
"Result Type": "Result Type",
|
||||||
|
"Search By": "Search By",
|
||||||
|
"Created with {heart} by {alexbcberio}": "Created with {heart} by {alexbcberio}",
|
||||||
|
"Search more": "Search more",
|
||||||
|
"We couldn't find any results with the specified parameters.": "We couldn't find any results with the specified parameters."
|
||||||
|
}
|
69
src/lang/es/artworkSearch.json
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"searchMediaConstraint": {
|
||||||
|
"movie": "Película",
|
||||||
|
"podcast": "Podcast",
|
||||||
|
"music": "Música",
|
||||||
|
"musicVideo": "Vídeo Musical",
|
||||||
|
"audiobook": "Audiolibro",
|
||||||
|
"shortFilm": "Corto",
|
||||||
|
"tvShow": "Serie TV",
|
||||||
|
"software": "Software",
|
||||||
|
"ebook": "Libro Electrónico",
|
||||||
|
"all": "Todos"
|
||||||
|
},
|
||||||
|
"searchEntityConstraint": {
|
||||||
|
"movieArtist": "Artista de Cine",
|
||||||
|
"movie": "Película",
|
||||||
|
"podcastAuthor": "Autor de Podcast",
|
||||||
|
"podcast": "Podcast",
|
||||||
|
"musicArtist": "Artista de Música",
|
||||||
|
"musicTrack": "Pista de Música",
|
||||||
|
"album": "Album",
|
||||||
|
"musicVideo": "Vídeo Musical",
|
||||||
|
"mix": "Mix",
|
||||||
|
"song": "Canción",
|
||||||
|
"audiobookAuthor": "Autor de Audiolibro",
|
||||||
|
"audiobook": "Audiolibro",
|
||||||
|
"shortFilmArtist": "Artist de Cortometrajes",
|
||||||
|
"shortFilm": "Cortometraje",
|
||||||
|
"tvEpisode": "Episodio de TV",
|
||||||
|
"tvSeason": "Temporada de TV",
|
||||||
|
"software": "Software",
|
||||||
|
"iPadSoftware": "Software para iPad",
|
||||||
|
"macSoftware": "Software para mac",
|
||||||
|
"ebook": "Libro Electrónico",
|
||||||
|
"allArtist": "Todos los Artistas",
|
||||||
|
"allTrack": "Todas las Pistas",
|
||||||
|
"all": "Todos"
|
||||||
|
},
|
||||||
|
"searchAttributeConstraint": {
|
||||||
|
"actorTerm": "Actor",
|
||||||
|
"genreIndex": "Género",
|
||||||
|
"artistTerm": "Artista",
|
||||||
|
"shortFilmTerm": "Corto",
|
||||||
|
"producerTerm": "Productor",
|
||||||
|
"ratingTerm": "Valoración",
|
||||||
|
"directorTerm": "Director",
|
||||||
|
"releaseYearTerm": "Año de Publicación",
|
||||||
|
"featureFilmTerm": "Largometraje",
|
||||||
|
"movieArtistTerm": "Actor",
|
||||||
|
"movieTerm": "Película",
|
||||||
|
"ratingIndex": "Índice de Valoración",
|
||||||
|
"descriptionTerm": "Descripción",
|
||||||
|
"titleTerm": "Título",
|
||||||
|
"languageTerm": "Idioma",
|
||||||
|
"authorTerm": "Autor",
|
||||||
|
"keywordsTerm": "Palabras Clave",
|
||||||
|
"mixTerm": "Mix",
|
||||||
|
"composerTerm": "Compositor",
|
||||||
|
"softwareDeveloper": "Desarrollador de Software",
|
||||||
|
"tvEpisodeTerm": "Episodio TV",
|
||||||
|
"showTerm": "Serie",
|
||||||
|
"tvSeasonTerm": "Temporada TV",
|
||||||
|
"allArtistTerm": "Todos los Artistas",
|
||||||
|
"allTrackTerm": "Todas las Canciones",
|
||||||
|
"albumTerm": "Album",
|
||||||
|
"songTerm": "Canción",
|
||||||
|
"all": "Todos"
|
||||||
|
}
|
||||||
|
}
|
7
src/lang/es/index.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import artworkSearch from "./artworkSearch.json";
|
||||||
|
import translation from "./translation.json";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
translation,
|
||||||
|
artworkSearch,
|
||||||
|
};
|
9
src/lang/es/translation.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Search": "Buscar",
|
||||||
|
"Media Type": "Elemento",
|
||||||
|
"Result Type": "Resultado",
|
||||||
|
"Search By": "Buscar Por",
|
||||||
|
"Created with {heart} by {alexbcberio}": "Creado con {heart} por {alexbcberio}",
|
||||||
|
"Search more": "Buscar más",
|
||||||
|
"We couldn't find any results with the specified parameters.": "No hemos podido encontrar resultados con los parámetros establecidos."
|
||||||
|
}
|
21
src/lang/index.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import LanguageDetector from "i18next-browser-languagedetector";
|
||||||
|
import en from "./en";
|
||||||
|
import es from "./es";
|
||||||
|
import i18next from "i18next";
|
||||||
|
|
||||||
|
const supportedLanguages = ["en", "es"];
|
||||||
|
|
||||||
|
i18next.use(LanguageDetector).init({
|
||||||
|
supportedLngs: supportedLanguages,
|
||||||
|
detection: {
|
||||||
|
caches: ["localStorage"],
|
||||||
|
},
|
||||||
|
debug: true,
|
||||||
|
fallbackLng: supportedLanguages[0],
|
||||||
|
resources: {
|
||||||
|
en,
|
||||||
|
es,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export { i18next, supportedLanguages };
|
17
src/main.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import "./assets/main.css";
|
||||||
|
import "./assets/fonts";
|
||||||
|
|
||||||
|
import App from "./App.vue";
|
||||||
|
import I18NextVue from "i18next-vue";
|
||||||
|
import { createApp } from "vue";
|
||||||
|
import { createPinia } from "pinia";
|
||||||
|
import { i18next } from "./lang";
|
||||||
|
import router from "./router";
|
||||||
|
|
||||||
|
const app = createApp(App);
|
||||||
|
|
||||||
|
app.use(createPinia());
|
||||||
|
app.use(router);
|
||||||
|
app.use(I18NextVue, { i18next });
|
||||||
|
|
||||||
|
app.mount("#app");
|
33
src/router/index.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import {
|
||||||
|
createRouter,
|
||||||
|
createWebHashHistory,
|
||||||
|
type LocationQuery,
|
||||||
|
} from "vue-router";
|
||||||
|
|
||||||
|
import Home from "../views/ViewHome.vue";
|
||||||
|
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHashHistory("/artwork-search/"),
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: "/",
|
||||||
|
name: "home",
|
||||||
|
component: Home,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/search",
|
||||||
|
name: "search",
|
||||||
|
component: () => import("../views/ViewSearch.vue"),
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// path: "/about",
|
||||||
|
// name: "about",
|
||||||
|
// // route level code-splitting
|
||||||
|
// // this generates a separate chunk (About.[hash].js) for this route
|
||||||
|
// // which is lazy-loaded when the route is visited.
|
||||||
|
// component: () => import("../views/AboutView.vue"),
|
||||||
|
// },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
139
src/services/ArtworkSearch/ArtworkSearch.ts
Executable file
@@ -0,0 +1,139 @@
|
|||||||
|
import { ArtworkSearchResultCollection } from "./ArtworkSearchResultCollection";
|
||||||
|
import { ArtworksSearchResult } from "./ArtworkSearchResult";
|
||||||
|
import type { SearchConstraints } from "./interfaces/SearchConstraints";
|
||||||
|
import { SearchCountryConstraint } from "./enums/SearchCountryConstraint";
|
||||||
|
|
||||||
|
export class ArtworkSearch {
|
||||||
|
private static get API_BASE_URL(): string {
|
||||||
|
return "https://itunes.apple.com/search";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static get DEFAULT_CONSTRAINTS(): SearchConstraints {
|
||||||
|
return {
|
||||||
|
country: SearchCountryConstraint["United States of America"],
|
||||||
|
lang: "en_us",
|
||||||
|
version: "2",
|
||||||
|
offset: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static get MAX_LIMIT(): number {
|
||||||
|
const maxLimit = 200;
|
||||||
|
|
||||||
|
return maxLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static get MIN_LIMIT(): number {
|
||||||
|
const minLimit = 1;
|
||||||
|
|
||||||
|
return minLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static get MIN_OFFSET(): number {
|
||||||
|
const minOffset = 0;
|
||||||
|
|
||||||
|
return minOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _term: string;
|
||||||
|
private _searchConstraints: SearchConstraints;
|
||||||
|
private _searchResultCollection: ArtworkSearchResultCollection;
|
||||||
|
private _hasFoundResults: boolean;
|
||||||
|
|
||||||
|
constructor(term: string, searchConstraints: SearchConstraints) {
|
||||||
|
this._term = term;
|
||||||
|
|
||||||
|
this._searchConstraints = {
|
||||||
|
...ArtworkSearch.DEFAULT_CONSTRAINTS,
|
||||||
|
...searchConstraints,
|
||||||
|
};
|
||||||
|
|
||||||
|
this._searchResultCollection = new ArtworkSearchResultCollection();
|
||||||
|
this._hasFoundResults = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get hasFoundResults(): boolean {
|
||||||
|
return this._hasFoundResults;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async search(): Promise<Array<ArtworksSearchResult>> {
|
||||||
|
const url = this.getSearchUrl();
|
||||||
|
const res = await fetch(url);
|
||||||
|
// TODO: handle fetch errors and API rate-limit (http status 403)
|
||||||
|
if (!res.ok) {
|
||||||
|
throw new Error(`HTTP Error ${res.status} status ${res.statusText}`);
|
||||||
|
}
|
||||||
|
const resJson = await res.json();
|
||||||
|
|
||||||
|
const resultCount = resJson.resultCount;
|
||||||
|
const results = resJson.results;
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-magic-numbers
|
||||||
|
this._hasFoundResults = resultCount > 0;
|
||||||
|
this._searchConstraints.offset += resultCount;
|
||||||
|
|
||||||
|
return this._searchResultCollection.addResults(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
private getSearchUrl(): string {
|
||||||
|
const term = this._term;
|
||||||
|
|
||||||
|
let searchUrl = ArtworkSearch.API_BASE_URL;
|
||||||
|
|
||||||
|
searchUrl += `?term=${encodeURIComponent(term)}`;
|
||||||
|
searchUrl += `&${this.getSearchConstraints()}`;
|
||||||
|
|
||||||
|
return searchUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private getSearchConstraints(): string {
|
||||||
|
const searchConstraints = this._searchConstraints;
|
||||||
|
|
||||||
|
let searchConstraintParams = "";
|
||||||
|
|
||||||
|
for (const constraint in searchConstraints) {
|
||||||
|
// @ts-expect-error cannot statically verify type
|
||||||
|
if (typeof searchConstraints[constraint] !== "undefined") {
|
||||||
|
let value: string;
|
||||||
|
|
||||||
|
switch (constraint) {
|
||||||
|
case "limit":
|
||||||
|
value = Math.min(
|
||||||
|
ArtworkSearch.MAX_LIMIT,
|
||||||
|
// @ts-expect-error already checked if is not undefined
|
||||||
|
Math.max(ArtworkSearch.MIN_LIMIT, searchConstraints.limit)
|
||||||
|
).toString();
|
||||||
|
break;
|
||||||
|
case "explicit":
|
||||||
|
value = searchConstraints.explicit === true ? "Yes" : "No";
|
||||||
|
break;
|
||||||
|
case "offset":
|
||||||
|
value = Math.max(
|
||||||
|
ArtworkSearch.MIN_OFFSET,
|
||||||
|
// @ts-expect-error already checked if is not undefined
|
||||||
|
searchConstraints.offset
|
||||||
|
).toString();
|
||||||
|
break;
|
||||||
|
case "country":
|
||||||
|
case "media":
|
||||||
|
case "entity":
|
||||||
|
case "attribute":
|
||||||
|
case "lang":
|
||||||
|
case "version":
|
||||||
|
value = searchConstraints[constraint] ?? "";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
const entrySeparator = searchConstraintParams ? "&" : "";
|
||||||
|
|
||||||
|
searchConstraintParams += `${entrySeparator}${constraint}=${value}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return searchConstraintParams;
|
||||||
|
}
|
||||||
|
}
|
154
src/services/ArtworkSearch/ArtworkSearchResult.ts
Executable file
@@ -0,0 +1,154 @@
|
|||||||
|
import { SearchResultKind } from "./enums/SearchResultKind";
|
||||||
|
import { SearchResultType } from "./enums/SearchResultType";
|
||||||
|
|
||||||
|
// TODO: add getters for all fields
|
||||||
|
export class ArtworksSearchResult {
|
||||||
|
constructor(private readonly _raw: any) {}
|
||||||
|
|
||||||
|
// TODO: does not work for all result types (artistId may be undefined)
|
||||||
|
public get uuid(): string {
|
||||||
|
const raw = this._raw;
|
||||||
|
|
||||||
|
return `${raw.artistId ?? 0}-${raw.collectionId ?? 0}-${raw.trackId ?? 0}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get id(): Number {
|
||||||
|
switch (this.type) {
|
||||||
|
case SearchResultType.artist:
|
||||||
|
return this._raw.artistId;
|
||||||
|
case SearchResultType.collection:
|
||||||
|
return this._raw.collectionId;
|
||||||
|
case SearchResultType.track:
|
||||||
|
return this._raw.trackId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get type(): SearchResultType {
|
||||||
|
return this._raw.wrapperType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get explicit(): boolean {
|
||||||
|
switch (this.type) {
|
||||||
|
case SearchResultType.artist:
|
||||||
|
return false;
|
||||||
|
case SearchResultType.collection:
|
||||||
|
return this._raw.collectionExplicitness === "explicit";
|
||||||
|
case SearchResultType.track:
|
||||||
|
return this._raw.trackExplicitness === "explicit";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get kind(): SearchResultKind {
|
||||||
|
return this._raw.kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get trackName(): string {
|
||||||
|
return this._raw.trackName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get artistName(): string {
|
||||||
|
return this._raw.artistName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get collectionName(): string {
|
||||||
|
return this._raw.collectionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get censoredName(): string {
|
||||||
|
switch (this.type) {
|
||||||
|
case SearchResultType.artist:
|
||||||
|
return this.artistName;
|
||||||
|
case SearchResultType.collection:
|
||||||
|
return this._raw.collectionCensoredName;
|
||||||
|
case SearchResultType.track:
|
||||||
|
return this._raw.trackCensoredName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get hasArtwork(): boolean {
|
||||||
|
return typeof this._raw.artworkUrl100 === "string";
|
||||||
|
}
|
||||||
|
|
||||||
|
public artworkUrl(size?: number): string {
|
||||||
|
if (!this.hasArtwork) {
|
||||||
|
throw new Error("Search result has no artwork");
|
||||||
|
}
|
||||||
|
|
||||||
|
const artworkUrl100: string = this._raw.artworkUrl100;
|
||||||
|
|
||||||
|
if (typeof size === "undefined" || size <= 0) {
|
||||||
|
return artworkUrl100;
|
||||||
|
}
|
||||||
|
|
||||||
|
return artworkUrl100.replace("100x100", `${size}x${size}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @url https://github.com/bendodson/itunes-artwork-finder/issues/9
|
||||||
|
*/
|
||||||
|
public get originalArtwork(): string {
|
||||||
|
const artworkUrl: URL = new URL(this.artworkUrl());
|
||||||
|
|
||||||
|
const protocol: string = artworkUrl.protocol + "//";
|
||||||
|
|
||||||
|
let hostname: string = artworkUrl.hostname;
|
||||||
|
const hostnameRegEx: RegExp = /is(\d)-ssl/;
|
||||||
|
const hostnameExec = hostnameRegEx.exec(hostname);
|
||||||
|
|
||||||
|
if (Array.isArray(hostnameExec)) {
|
||||||
|
hostname = hostname.replace(hostnameExec[0], "a" + hostnameExec[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const pathname: string = artworkUrl.pathname
|
||||||
|
.replace("/image/thumb/", "/")
|
||||||
|
.replace(/\/\d+x\d+\w+\.\w+/, "");
|
||||||
|
|
||||||
|
return protocol + hostname + "/us/r1000/0/" + pathname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get viewUrl(): string {
|
||||||
|
switch (this.type) {
|
||||||
|
case SearchResultType.artist:
|
||||||
|
return this._raw.artistViewUrl;
|
||||||
|
case SearchResultType.collection:
|
||||||
|
return this._raw.collectionViewUrl;
|
||||||
|
case SearchResultType.track:
|
||||||
|
return this._raw.trackViewUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public get previewUrl(): string | null {
|
||||||
|
return this.type === SearchResultType.track ? this._raw.previewUrl : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get previewType(): "audio" | "video" {
|
||||||
|
if (
|
||||||
|
[SearchResultKind.featureMovie, SearchResultKind.musicVideo].includes(
|
||||||
|
this.kind
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return "video";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "audio";
|
||||||
|
}
|
||||||
|
|
||||||
|
public get trackDurationMs(): number {
|
||||||
|
return this.type === SearchResultType.track ? this._raw.trackTimeMillis : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get title(): string {
|
||||||
|
switch (this.type) {
|
||||||
|
case SearchResultType.artist:
|
||||||
|
return this.artistName;
|
||||||
|
case SearchResultType.collection:
|
||||||
|
return this.collectionName;
|
||||||
|
case SearchResultType.track:
|
||||||
|
return this.trackName;
|
||||||
|
default:
|
||||||
|
throw new Error(
|
||||||
|
"Cannot get title from unknown result type " + this.type
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
src/services/ArtworkSearch/ArtworkSearchResultCollection.ts
Executable file
@@ -0,0 +1,57 @@
|
|||||||
|
import { ArtworksSearchResult } from "./ArtworkSearchResult";
|
||||||
|
|
||||||
|
export class ArtworkSearchResultCollection {
|
||||||
|
private _results: Map<string, ArtworksSearchResult> = new Map();
|
||||||
|
|
||||||
|
public get isEmpty(): boolean {
|
||||||
|
const emptySize = 0;
|
||||||
|
|
||||||
|
return this._results.size === emptySize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get results(): Array<ArtworksSearchResult> {
|
||||||
|
const results = new Array<ArtworksSearchResult>();
|
||||||
|
|
||||||
|
if (this.isEmpty) {
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
const iterable = this._results.values();
|
||||||
|
let iterator = iterable.next();
|
||||||
|
|
||||||
|
do {
|
||||||
|
results.push(iterator.value);
|
||||||
|
iterator = iterable.next();
|
||||||
|
} while (!iterator.done);
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
public addResults(results: Array<any>): Array<ArtworksSearchResult> {
|
||||||
|
const addedResults: Array<ArtworksSearchResult> = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < results.length; i++) {
|
||||||
|
const resultModel = new ArtworksSearchResult(results[i]);
|
||||||
|
const added = this.addResult(resultModel);
|
||||||
|
|
||||||
|
if (added) {
|
||||||
|
addedResults.push(resultModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return addedResults;
|
||||||
|
}
|
||||||
|
|
||||||
|
private addResult(resultModel: ArtworksSearchResult): boolean {
|
||||||
|
const resultUuid: string = resultModel.uuid;
|
||||||
|
|
||||||
|
if (this._results.has(resultUuid)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._results.set(resultUuid, resultModel);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
29
src/services/ArtworkSearch/enums/SearchAttributeConstraint.ts
Executable file
@@ -0,0 +1,29 @@
|
|||||||
|
export enum SearchAttributeConstraint {
|
||||||
|
actorTerm = "actorTerm",
|
||||||
|
genreIndex = "genreIndex",
|
||||||
|
artistTerm = "artistTerm",
|
||||||
|
shortFilmTerm = "shortFilmTerm",
|
||||||
|
producerTerm = "producerTerm",
|
||||||
|
ratingTerm = "ratingTerm",
|
||||||
|
directorTerm = "directorTerm",
|
||||||
|
releaseYearTerm = "releaseYearTerm",
|
||||||
|
featureFilmTerm = "featureFilmTerm",
|
||||||
|
movieArtistTerm = "movieArtistTerm",
|
||||||
|
movieTerm = "movieTerm",
|
||||||
|
ratingIndex = "ratingIndex",
|
||||||
|
descriptionTerm = "descriptionTerm",
|
||||||
|
titleTerm = "titleTerm",
|
||||||
|
languageTerm = "languageTerm",
|
||||||
|
authorTerm = "authorTerm",
|
||||||
|
keywordsTerm = "keywordsTerm",
|
||||||
|
mixTerm = "mixTerm",
|
||||||
|
composerTerm = "composerTerm",
|
||||||
|
softwareDeveloper = "softwareDeveloper",
|
||||||
|
tvEpisodeTerm = "tvEpisodeTerm",
|
||||||
|
showTerm = "showTerm",
|
||||||
|
tvSeasonTerm = "tvSeasonTerm",
|
||||||
|
allArtistTerm = "allArtistTerm",
|
||||||
|
allTrackTerm = "allTrackTerm",
|
||||||
|
albumTerm = "albumTerm",
|
||||||
|
songTerm = "songTerm",
|
||||||
|
}
|
251
src/services/ArtworkSearch/enums/SearchCountryConstraint.ts
Executable file
@@ -0,0 +1,251 @@
|
|||||||
|
export enum SearchCountryConstraint {
|
||||||
|
"Andorra" = "AD",
|
||||||
|
"United Arab Emirates" = "AE",
|
||||||
|
"Afghanistan" = "AF",
|
||||||
|
"Antigua and Barbuda" = "AG",
|
||||||
|
"Anguilla" = "AI",
|
||||||
|
"Albania" = "AL",
|
||||||
|
"Armenia" = "AM",
|
||||||
|
"Angola" = "AO",
|
||||||
|
"Antarctica" = "AQ",
|
||||||
|
"Argentina" = "AR",
|
||||||
|
"American Samoa" = "AS",
|
||||||
|
"Austria" = "AT",
|
||||||
|
"Australia" = "AU",
|
||||||
|
"Aruba" = "AW",
|
||||||
|
"Åland Islands" = "AX",
|
||||||
|
"Azerbaijan" = "AZ",
|
||||||
|
"Bosnia and Herzegovina" = "BA",
|
||||||
|
"Barbados" = "BB",
|
||||||
|
"Bangladesh" = "BD",
|
||||||
|
"Belgium" = "BE",
|
||||||
|
"Burkina Faso" = "BF",
|
||||||
|
"Bulgaria" = "BG",
|
||||||
|
"Bahrain" = "BH",
|
||||||
|
"Burundi" = "BI",
|
||||||
|
"Benin" = "BJ",
|
||||||
|
"Saint Barthélemy" = "BL",
|
||||||
|
"Bermuda" = "BM",
|
||||||
|
"Brunei Darussalam" = "BN",
|
||||||
|
"Bolivia (Plurinational State of)" = "BO",
|
||||||
|
"Bonaire, Sint Eustatius and Saba" = "BQ",
|
||||||
|
"Brazil" = "BR",
|
||||||
|
"Bahamas" = "BS",
|
||||||
|
"Bhutan" = "BT",
|
||||||
|
"Bouvet Island" = "BV",
|
||||||
|
"Botswana" = "BW",
|
||||||
|
"Belarus" = "BY",
|
||||||
|
"Belize" = "BZ",
|
||||||
|
"Canada" = "CA",
|
||||||
|
"Cocos (Keeling) Islands" = "CC",
|
||||||
|
"Congo, Democratic Republic of the" = "CD",
|
||||||
|
"Central African Republic" = "CF",
|
||||||
|
"Congo" = "CG",
|
||||||
|
"Switzerland" = "CH",
|
||||||
|
"Côte d'Ivoire" = "CI",
|
||||||
|
"Cook Islands" = "CK",
|
||||||
|
"Chile" = "CL",
|
||||||
|
"Cameroon" = "CM",
|
||||||
|
"China" = "CN",
|
||||||
|
"Colombia" = "CO",
|
||||||
|
"Costa Rica" = "CR",
|
||||||
|
"Cuba" = "CU",
|
||||||
|
"Cabo Verde" = "CV",
|
||||||
|
"Curaçao" = "CW",
|
||||||
|
"Christmas Island" = "CX",
|
||||||
|
"Cyprus" = "CY",
|
||||||
|
"Czechia" = "CZ",
|
||||||
|
"Germany" = "DE",
|
||||||
|
"Djibouti" = "DJ",
|
||||||
|
"Denmark" = "DK",
|
||||||
|
"Dominica" = "DM",
|
||||||
|
"Dominican Republic" = "DO",
|
||||||
|
"Algeria" = "DZ",
|
||||||
|
"Ecuador" = "EC",
|
||||||
|
"Estonia" = "EE",
|
||||||
|
"Egypt" = "EG",
|
||||||
|
"Western Sahara" = "EH",
|
||||||
|
"Eritrea" = "ER",
|
||||||
|
"Spain" = "ES",
|
||||||
|
"Ethiopia" = "ET",
|
||||||
|
"Finland" = "FI",
|
||||||
|
"Fiji" = "FJ",
|
||||||
|
"Falkland Islands (Malvinas)" = "FK",
|
||||||
|
"Micronesia (Federated States of)" = "FM",
|
||||||
|
"Faroe Islands" = "FO",
|
||||||
|
"France" = "FR",
|
||||||
|
"Gabon" = "GA",
|
||||||
|
"United Kingdom of Great Britain and Northern Ireland" = "GB",
|
||||||
|
"Grenada" = "GD",
|
||||||
|
"Georgia" = "GE",
|
||||||
|
"French Guiana" = "GF",
|
||||||
|
"Guernsey" = "GG",
|
||||||
|
"Ghana" = "GH",
|
||||||
|
"Gibraltar" = "GI",
|
||||||
|
"Greenland" = "GL",
|
||||||
|
"Gambia" = "GM",
|
||||||
|
"Guinea" = "GN",
|
||||||
|
"Guadeloupe" = "GP",
|
||||||
|
"Equatorial Guinea" = "GQ",
|
||||||
|
"Greece" = "GR",
|
||||||
|
"South Georgia and the South Sandwich Islands" = "GS",
|
||||||
|
"Guatemala" = "GT",
|
||||||
|
"Guam" = "GU",
|
||||||
|
"Guinea-Bissau" = "GW",
|
||||||
|
"Guyana" = "GY",
|
||||||
|
"Hong Kong" = "HK",
|
||||||
|
"Heard Island and McDonald Islands" = "HM",
|
||||||
|
"Honduras" = "HN",
|
||||||
|
"Croatia" = "HR",
|
||||||
|
"Haiti" = "HT",
|
||||||
|
"Hungary" = "HU",
|
||||||
|
"Indonesia" = "ID",
|
||||||
|
"Ireland" = "IE",
|
||||||
|
"Israel" = "IL",
|
||||||
|
"Isle of Man" = "IM",
|
||||||
|
"India" = "IN",
|
||||||
|
"British Indian Ocean Territory" = "IO",
|
||||||
|
"Iraq" = "IQ",
|
||||||
|
"Iran (Islamic Republic of)" = "IR",
|
||||||
|
"Iceland" = "IS",
|
||||||
|
"Italy" = "IT",
|
||||||
|
"Jersey" = "JE",
|
||||||
|
"Jamaica" = "JM",
|
||||||
|
"Jordan" = "JO",
|
||||||
|
"Japan" = "JP",
|
||||||
|
"Kenya" = "KE",
|
||||||
|
"Kyrgyzstan" = "KG",
|
||||||
|
"Cambodia" = "KH",
|
||||||
|
"Kiribati" = "KI",
|
||||||
|
"Comoros" = "KM",
|
||||||
|
"Saint Kitts and Nevis" = "KN",
|
||||||
|
"Korea (Democratic People's Republic of)" = "KP",
|
||||||
|
"Korea, Republic of" = "KR",
|
||||||
|
"Kuwait" = "KW",
|
||||||
|
"Cayman Islands" = "KY",
|
||||||
|
"Kazakhstan" = "KZ",
|
||||||
|
"Lao People's Democratic Republic" = "LA",
|
||||||
|
"Lebanon" = "LB",
|
||||||
|
"Saint Lucia" = "LC",
|
||||||
|
"Liechtenstein" = "LI",
|
||||||
|
"Sri Lanka" = "LK",
|
||||||
|
"Liberia" = "LR",
|
||||||
|
"Lesotho" = "LS",
|
||||||
|
"Lithuania" = "LT",
|
||||||
|
"Luxembourg" = "LU",
|
||||||
|
"Latvia" = "LV",
|
||||||
|
"Libya" = "LY",
|
||||||
|
"Morocco" = "MA",
|
||||||
|
"Monaco" = "MC",
|
||||||
|
"Moldova, Republic of" = "MD",
|
||||||
|
"Montenegro" = "ME",
|
||||||
|
"Saint Martin (French part)" = "MF",
|
||||||
|
"Madagascar" = "MG",
|
||||||
|
"Marshall Islands" = "MH",
|
||||||
|
"North Macedonia" = "MK",
|
||||||
|
"Mali" = "ML",
|
||||||
|
"Myanmar" = "MM",
|
||||||
|
"Mongolia" = "MN",
|
||||||
|
"Macao" = "MO",
|
||||||
|
"Northern Mariana Islands" = "MP",
|
||||||
|
"Martinique" = "MQ",
|
||||||
|
"Mauritania" = "MR",
|
||||||
|
"Montserrat" = "MS",
|
||||||
|
"Malta" = "MT",
|
||||||
|
"Mauritius" = "MU",
|
||||||
|
"Maldives" = "MV",
|
||||||
|
"Malawi" = "MW",
|
||||||
|
"Mexico" = "MX",
|
||||||
|
"Malaysia" = "MY",
|
||||||
|
"Mozambique" = "MZ",
|
||||||
|
"Namibia" = "NA",
|
||||||
|
"New Caledonia" = "NC",
|
||||||
|
"Niger" = "NE",
|
||||||
|
"Norfolk Island" = "NF",
|
||||||
|
"Nigeria" = "NG",
|
||||||
|
"Nicaragua" = "NI",
|
||||||
|
"Netherlands" = "NL",
|
||||||
|
"Norway" = "NO",
|
||||||
|
"Nepal" = "NP",
|
||||||
|
"Nauru" = "NR",
|
||||||
|
"Niue" = "NU",
|
||||||
|
"New Zealand" = "NZ",
|
||||||
|
"Oman" = "OM",
|
||||||
|
"Panama" = "PA",
|
||||||
|
"Peru" = "PE",
|
||||||
|
"French Polynesia" = "PF",
|
||||||
|
"Papua New Guinea" = "PG",
|
||||||
|
"Philippines" = "PH",
|
||||||
|
"Pakistan" = "PK",
|
||||||
|
"Poland" = "PL",
|
||||||
|
"Saint Pierre and Miquelon" = "PM",
|
||||||
|
"Pitcairn" = "PN",
|
||||||
|
"Puerto Rico" = "PR",
|
||||||
|
"Palestine, State of" = "PS",
|
||||||
|
"Portugal" = "PT",
|
||||||
|
"Palau" = "PW",
|
||||||
|
"Paraguay" = "PY",
|
||||||
|
"Qatar" = "QA",
|
||||||
|
"Réunion" = "RE",
|
||||||
|
"Romania" = "RO",
|
||||||
|
"Serbia" = "RS",
|
||||||
|
"Russian Federation" = "RU",
|
||||||
|
"Rwanda" = "RW",
|
||||||
|
"Saudi Arabia" = "SA",
|
||||||
|
"Solomon Islands" = "SB",
|
||||||
|
"Seychelles" = "SC",
|
||||||
|
"Sudan" = "SD",
|
||||||
|
"Sweden" = "SE",
|
||||||
|
"Singapore" = "SG",
|
||||||
|
"Saint Helena, Ascension and Tristan da Cunha" = "SH",
|
||||||
|
"Slovenia" = "SI",
|
||||||
|
"Svalbard and Jan Mayen" = "SJ",
|
||||||
|
"Slovakia" = "SK",
|
||||||
|
"Sierra Leone" = "SL",
|
||||||
|
"San Marino" = "SM",
|
||||||
|
"Senegal" = "SN",
|
||||||
|
"Somalia" = "SO",
|
||||||
|
"Suriname" = "SR",
|
||||||
|
"South Sudan" = "SS",
|
||||||
|
"Sao Tome and Principe" = "ST",
|
||||||
|
"El Salvador" = "SV",
|
||||||
|
"Sint Maarten (Dutch part)" = "SX",
|
||||||
|
"Syrian Arab Republic" = "SY",
|
||||||
|
"Eswatini" = "SZ",
|
||||||
|
"Turks and Caicos Islands" = "TC",
|
||||||
|
"Chad" = "TD",
|
||||||
|
"French Southern Territories" = "TF",
|
||||||
|
"Togo" = "TG",
|
||||||
|
"Thailand" = "TH",
|
||||||
|
"Tajikistan" = "TJ",
|
||||||
|
"Tokelau" = "TK",
|
||||||
|
"Timor-Leste" = "TL",
|
||||||
|
"Turkmenistan" = "TM",
|
||||||
|
"Tunisia" = "TN",
|
||||||
|
"Tonga" = "TO",
|
||||||
|
"Turkey" = "TR",
|
||||||
|
"Trinidad and Tobago" = "TT",
|
||||||
|
"Tuvalu" = "TV",
|
||||||
|
"Taiwan, Province of China" = "TW",
|
||||||
|
"Tanzania, United Republic of" = "TZ",
|
||||||
|
"Ukraine" = "UA",
|
||||||
|
"Uganda" = "UG",
|
||||||
|
"United States Minor Outlying Islands" = "UM",
|
||||||
|
"United States of America" = "US",
|
||||||
|
"Uruguay" = "UY",
|
||||||
|
"Uzbekistan" = "UZ",
|
||||||
|
"Holy See" = "VA",
|
||||||
|
"Saint Vincent and the Grenadines" = "VC",
|
||||||
|
"Venezuela (Bolivarian Republic of)" = "VE",
|
||||||
|
"Virgin Islands (British)" = "VG",
|
||||||
|
"Virgin Islands (U.S.)" = "VI",
|
||||||
|
"Viet Nam" = "VN",
|
||||||
|
"Vanuatu" = "VU",
|
||||||
|
"Wallis and Futuna" = "WF",
|
||||||
|
"Samoa" = "WS",
|
||||||
|
"Yemen" = "YE",
|
||||||
|
"Mayotte" = "YT",
|
||||||
|
"South Africa" = "ZA",
|
||||||
|
"Zambia" = "ZM",
|
||||||
|
"Zimbabwe" = "ZW",
|
||||||
|
}
|
24
src/services/ArtworkSearch/enums/SearchEntityConstraint.ts
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
export enum SearchEntityConstraint {
|
||||||
|
movieArtist = "movieArtist",
|
||||||
|
movie = "movie",
|
||||||
|
podcastAuthor = "podcastAuthor",
|
||||||
|
podcast = "podcast",
|
||||||
|
musicArtist = "musicArtist",
|
||||||
|
musicTrack = "musicTrack",
|
||||||
|
album = "album",
|
||||||
|
musicVideo = "musicVideo",
|
||||||
|
mix = "mix",
|
||||||
|
song = "song",
|
||||||
|
audioBookAuthor = "audiobookAuthor",
|
||||||
|
audioBook = "audiobook",
|
||||||
|
shortFilmArtist = "shortFilmArtist",
|
||||||
|
shortFilm = "shortFilm",
|
||||||
|
tvEpisode = "tvEpisode",
|
||||||
|
tvSeason = "tvSeason",
|
||||||
|
software = "software",
|
||||||
|
iPadSoftware = "iPadSoftware",
|
||||||
|
macSoftware = "macSoftware",
|
||||||
|
ebook = "ebook",
|
||||||
|
allArtist = "allArtist",
|
||||||
|
allTrack = "allTrack",
|
||||||
|
}
|
12
src/services/ArtworkSearch/enums/SearchMediaConstraint.ts
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
export enum SearchMediaConstraint {
|
||||||
|
movie = "movie",
|
||||||
|
podcast = "podcast",
|
||||||
|
music = "music",
|
||||||
|
musicVideo = "musicVideo",
|
||||||
|
audioBook = "audiobook",
|
||||||
|
shortFilm = "shortFilm",
|
||||||
|
tvShow = "tvShow",
|
||||||
|
software = "software",
|
||||||
|
ebook = "ebook",
|
||||||
|
all = "all",
|
||||||
|
}
|
14
src/services/ArtworkSearch/enums/SearchResultKind.ts
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
export enum SearchResultKind {
|
||||||
|
book = "book",
|
||||||
|
album = "album",
|
||||||
|
coachedAudio = "coached-audio",
|
||||||
|
featureMovie = "feature-movie",
|
||||||
|
interactiveBooklet = "interactive-booklet",
|
||||||
|
musicVideo = "music-video",
|
||||||
|
pdfPodcast = "pdf-podcast",
|
||||||
|
podcastEpisode = "podcast-episode",
|
||||||
|
softwarePackage = "software-package",
|
||||||
|
song = "song",
|
||||||
|
tvEpisode = "tv-episode",
|
||||||
|
artist = "artist",
|
||||||
|
}
|
5
src/services/ArtworkSearch/enums/SearchResultType.ts
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
export enum SearchResultType {
|
||||||
|
track = "track",
|
||||||
|
collection = "collection",
|
||||||
|
artist = "artist",
|
||||||
|
}
|
16
src/services/ArtworkSearch/interfaces/SearchConstraints.ts
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
import { SearchAttributeConstraint } from "../enums/SearchAttributeConstraint";
|
||||||
|
import { SearchCountryConstraint } from "../enums/SearchCountryConstraint";
|
||||||
|
import { SearchEntityConstraint } from "../enums/SearchEntityConstraint";
|
||||||
|
import { SearchMediaConstraint } from "../enums/SearchMediaConstraint";
|
||||||
|
|
||||||
|
export interface SearchConstraints {
|
||||||
|
country: SearchCountryConstraint;
|
||||||
|
media?: SearchMediaConstraint;
|
||||||
|
entity?: SearchEntityConstraint;
|
||||||
|
attribute?: SearchAttributeConstraint;
|
||||||
|
limit?: number;
|
||||||
|
lang?: "en_us" | "ja_jp";
|
||||||
|
version?: "1" | "2";
|
||||||
|
explicit?: boolean;
|
||||||
|
offset?: number;
|
||||||
|
}
|
12
src/stores/counter.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { ref, computed } from "vue";
|
||||||
|
import { defineStore } from "pinia";
|
||||||
|
|
||||||
|
export const useCounterStore = defineStore("counter", () => {
|
||||||
|
const count = ref(0);
|
||||||
|
const doubleCount = computed(() => count.value * 2);
|
||||||
|
function increment() {
|
||||||
|
count.value++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return { count, doubleCount, increment };
|
||||||
|
});
|
21
src/views/ViewHome.vue
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import Search from "@/components/forms/Search.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
function search(q: string): void {
|
||||||
|
router.push({
|
||||||
|
name: "search",
|
||||||
|
query: {
|
||||||
|
q: q,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main class="px-4 py-6">
|
||||||
|
<Search @submit="search" />
|
||||||
|
</main>
|
||||||
|
</template>
|
226
src/views/ViewSearch.vue
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { onMounted, ref, type Ref } from "vue";
|
||||||
|
import { SearchCountryConstraint } from "@/services/ArtworkSearch/enums/SearchCountryConstraint";
|
||||||
|
import { ArtworkSearch } from "@/services/ArtworkSearch/ArtworkSearch";
|
||||||
|
import { ArtworksSearchResult } from "@/services/ArtworkSearch/ArtworkSearchResult";
|
||||||
|
import SearchResult from "@/components/SearchResult.vue";
|
||||||
|
import { Alert, Button, Flex } from "daisy-ui-kit";
|
||||||
|
import {
|
||||||
|
useRoute,
|
||||||
|
useRouter,
|
||||||
|
type LocationQuery,
|
||||||
|
type LocationQueryRaw,
|
||||||
|
} from "vue-router";
|
||||||
|
import Search from "@/components/forms/Search.vue";
|
||||||
|
import Loading from "@/components/base/Loading.vue";
|
||||||
|
import MaterialSymbols from "@/components/base/MaterialSymbols.vue";
|
||||||
|
import { SearchMediaConstraint } from "@/services/ArtworkSearch/enums/SearchMediaConstraint";
|
||||||
|
import type { SearchConstraints } from "@/services/ArtworkSearch/interfaces/SearchConstraints";
|
||||||
|
import SearchFilters from "@/components/forms/SearchFilters.vue";
|
||||||
|
import { SearchEntityConstraint } from "@/services/ArtworkSearch/enums/SearchEntityConstraint";
|
||||||
|
import { SearchAttributeConstraint } from "@/services/ArtworkSearch/enums/SearchAttributeConstraint";
|
||||||
|
import DialogSearchResult from "@/components/DialogSearchResult.vue";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const q = defineModel<string>("q", {
|
||||||
|
default: "",
|
||||||
|
});
|
||||||
|
const media = defineModel<SearchMediaConstraint>("media");
|
||||||
|
const entity = defineModel<SearchEntityConstraint | null>("entity");
|
||||||
|
const attribute = defineModel<SearchAttributeConstraint | null>("attribute");
|
||||||
|
|
||||||
|
const results: Ref<Array<ArtworksSearchResult>> = ref([]);
|
||||||
|
const searching = ref<boolean>(false);
|
||||||
|
const noMoreResults = ref<boolean>(false);
|
||||||
|
const error = ref<string>("");
|
||||||
|
|
||||||
|
const searchLimit: number = 20;
|
||||||
|
|
||||||
|
let artworkSearch: ArtworkSearch;
|
||||||
|
|
||||||
|
onMounted((): void => {
|
||||||
|
const query: LocationQuery = route.query;
|
||||||
|
const queryQ = query.q as string | null;
|
||||||
|
const queryMedia = query.media as SearchMediaConstraint | null;
|
||||||
|
const queryEntity = query.entity as SearchEntityConstraint | null;
|
||||||
|
const queryAttribute = query.attribute as SearchAttributeConstraint | null;
|
||||||
|
|
||||||
|
let search: boolean = false;
|
||||||
|
|
||||||
|
if (queryQ) {
|
||||||
|
q.value = queryQ;
|
||||||
|
search = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queryMedia) {
|
||||||
|
media.value = queryMedia;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queryEntity) {
|
||||||
|
entity.value = queryEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queryAttribute) {
|
||||||
|
attribute.value = queryAttribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search) {
|
||||||
|
performArtworkSearch();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
async function submit(): Promise<void> {
|
||||||
|
results.value.splice(0);
|
||||||
|
|
||||||
|
if (!q.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const query = {
|
||||||
|
q: q.value,
|
||||||
|
media: media.value,
|
||||||
|
entity: entity.value,
|
||||||
|
attribute: attribute.value,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!query.entity) {
|
||||||
|
delete query.entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!query.attribute) {
|
||||||
|
delete query.attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
router.replace({
|
||||||
|
query: query,
|
||||||
|
});
|
||||||
|
|
||||||
|
await performArtworkSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function performArtworkSearch(): Promise<void> {
|
||||||
|
const constrains: SearchConstraints = {
|
||||||
|
country: SearchCountryConstraint["United States of America"],
|
||||||
|
limit: searchLimit,
|
||||||
|
offset: results.value.length,
|
||||||
|
};
|
||||||
|
|
||||||
|
constrains.media = media.value;
|
||||||
|
|
||||||
|
if (entity.value !== null) {
|
||||||
|
constrains.entity = entity.value;
|
||||||
|
} else if (constrains.entity) {
|
||||||
|
delete constrains.entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attribute.value !== null) {
|
||||||
|
constrains.attribute = attribute.value;
|
||||||
|
} else if (constrains.attribute) {
|
||||||
|
delete constrains.attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
artworkSearch = new ArtworkSearch(q.value, constrains);
|
||||||
|
|
||||||
|
searching.value = true;
|
||||||
|
error.value = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
const queryResults = await artworkSearch.search();
|
||||||
|
searching.value = false;
|
||||||
|
noMoreResults.value =
|
||||||
|
!artworkSearch.hasFoundResults || queryResults.length < searchLimit;
|
||||||
|
results.value.push.apply(results.value, queryResults);
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) {
|
||||||
|
error.value = "Error " + e.message;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
error.value = "Unknown error";
|
||||||
|
} finally {
|
||||||
|
searching.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function searchMore(): Promise<void> {
|
||||||
|
await performArtworkSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedSearchResult: Ref<ArtworksSearchResult | null> = ref(null);
|
||||||
|
|
||||||
|
function openModal(result: ArtworksSearchResult): void {
|
||||||
|
selectedSearchResult.value = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeModal(): void {
|
||||||
|
selectedSearchResult.value = null;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main class="px-4 py-6">
|
||||||
|
<div>
|
||||||
|
<Alert error v-if="error" class="fixed z-10 top-4 right-4 max-w-[33%]">
|
||||||
|
<MaterialSymbols name="error" />
|
||||||
|
|
||||||
|
<p>{{ error }}</p>
|
||||||
|
|
||||||
|
<Button ghost circle sm>
|
||||||
|
<MaterialSymbols name="close" :size="1" @click="error = ''" />
|
||||||
|
</Button>
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
<Search v-model:q="q" :disabled="searching" @submit="submit" />
|
||||||
|
|
||||||
|
<SearchFilters
|
||||||
|
:disabled="searching"
|
||||||
|
v-model:media="media"
|
||||||
|
v-model:entity="entity"
|
||||||
|
v-model:attribute="attribute"
|
||||||
|
@update:media="submit"
|
||||||
|
@update:entity="submit"
|
||||||
|
@update:attribute="submit"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Loading
|
||||||
|
v-if="searching && results.length === 0"
|
||||||
|
lg
|
||||||
|
class="block mx-auto my-4"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div v-else-if="results.length" class="my-4">
|
||||||
|
<Flex row wrap class="justify-around">
|
||||||
|
<SearchResult
|
||||||
|
v-for="result in results"
|
||||||
|
:result="result as (typeof results)[0]"
|
||||||
|
:key="result.uuid"
|
||||||
|
@open="openModal(result as (typeof results)[0])"
|
||||||
|
/>
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
<div v-if="searching || !noMoreResults" class="mt-4 text-center">
|
||||||
|
<Loading v-if="searching" lg class="block mx-auto my-4" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
v-else-if="!noMoreResults"
|
||||||
|
@click="searchMore"
|
||||||
|
:disabled="searching"
|
||||||
|
>{{ $t("Search more") }}</Button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p v-else-if="!error" class="mt-4 text-center">
|
||||||
|
{{ $t("We couldn't find any results with the specified parameters.") }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<DialogSearchResult
|
||||||
|
v-if="selectedSearchResult"
|
||||||
|
:search-result="selectedSearchResult"
|
||||||
|
@close="closeModal"
|
||||||
|
/>
|
||||||
|
</main>
|
||||||
|
</template>
|
53
tailwind.config.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import daisyui from "daisyui";
|
||||||
|
import themes from "daisyui/src/theming/themes";
|
||||||
|
|
||||||
|
/** @type {import('tailwindcss').Config} */
|
||||||
|
export default {
|
||||||
|
content: [
|
||||||
|
"./index.html",
|
||||||
|
"./src/**/*.{vue,ts}",
|
||||||
|
"./node_modules/daisy-ui-kit/components/**/*.vue",
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
fontFamily: {
|
||||||
|
sans: ["Open Sans Variable", "sans-serif"],
|
||||||
|
mono: ["Fira Code Variable", "monospace"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [daisyui],
|
||||||
|
daisyui: {
|
||||||
|
themes: [
|
||||||
|
{
|
||||||
|
light: {
|
||||||
|
...themes["light"],
|
||||||
|
primary: "oklch(52% 0.0359 227.88)",
|
||||||
|
secondary: "oklch(41% 0.0967 6.54)",
|
||||||
|
accent: "oklch(25% 0 0)",
|
||||||
|
neutral: "oklch(60% 0 0)",
|
||||||
|
"base-100": "oklch(96% 0.0095 320.55)",
|
||||||
|
info: "oklch(75% 0.139 232.66)",
|
||||||
|
success: "oklch(75% 0.1821 151.71)",
|
||||||
|
warning: "oklch(75% 0.1644 84.43)",
|
||||||
|
error: "oklch(75% 0.1661 22.22)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dark: {
|
||||||
|
...themes["dark"],
|
||||||
|
primary: "oklch(52% 0.0359 227.88)",
|
||||||
|
secondary: "oklch(41% 0.0967 6.54)",
|
||||||
|
accent: "oklch(96% 0.0095 320.55)",
|
||||||
|
neutral: "oklch(40% 0.0095 320.55)",
|
||||||
|
"base-100": "oklch(20% 0 0)",
|
||||||
|
info: "oklch(75% 0.139 232.66)",
|
||||||
|
success: "oklch(75% 0.1821 151.71)",
|
||||||
|
warning: "oklch(75% 0.1644 84.43)",
|
||||||
|
error: "oklch(75% 0.1661 22.22)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
darkTheme: "dark",
|
||||||
|
},
|
||||||
|
};
|
4
theme-manager.config.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// add the names of the themes you want to use here
|
||||||
|
// warning: you need to specify them in tailwind.config.js as well
|
||||||
|
// DO NOT REMOVE: 'default', 'light', 'dark'
|
||||||
|
export default ["light", "dark"] as const;
|
14
tsconfig.app.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
|
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
||||||
|
"exclude": ["src/**/__tests__/*"],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.node.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.app.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
19
tsconfig.node.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"extends": "@tsconfig/node20/tsconfig.json",
|
||||||
|
"include": [
|
||||||
|
"vite.config.*",
|
||||||
|
"vitest.config.*",
|
||||||
|
"cypress.config.*",
|
||||||
|
"nightwatch.conf.*",
|
||||||
|
"playwright.config.*"
|
||||||
|
],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"types": ["node"]
|
||||||
|
}
|
||||||
|
}
|
16
vite.config.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import vue from '@vitejs/plugin-vue'
|
||||||
|
|
||||||
|
// https://vitejs.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [
|
||||||
|
vue(),
|
||||||
|
],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': fileURLToPath(new URL('./src', import.meta.url))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|