Compare commits
44 Commits
4ab1fed81c
...
develop
Author | SHA1 | Date | |
---|---|---|---|
98b9670661 | |||
0d91acc0cf | |||
b65eabb723 | |||
102ab3991b | |||
e4176ba9c9 | |||
9fc338edd1 | |||
886da93809 | |||
1353b0e65a | |||
615a89a1c6 | |||
2e3de70f56 | |||
991a8e0197 | |||
5a62633019 | |||
7a815b00b4 | |||
95167a6f8a | |||
f01c6ada17 | |||
79f4166946 | |||
ad7efc2223 | |||
6fe7509bdb | |||
1be8ebd16f | |||
8c2f2194d9 | |||
416c384f19 | |||
943d201a84 | |||
c768158ed0 | |||
ab316f2355 | |||
fbce353c1f | |||
002ebfe362 | |||
42235420b9 | |||
2cbdb66a4c | |||
5babc5db35 | |||
cd309dc250 | |||
05ecc605df | |||
fb85eb8e7b | |||
e9fb0e5708 | |||
bd97f42b46 | |||
d30bcc7d7d | |||
504e0d1b9c | |||
b3fc119fff | |||
17ca86c09c | |||
e2af4c4d8c | |||
a98fc9e5a2 | |||
9dba6ebd45 | |||
cecff2b795 | |||
f3528d64b8 | |||
f150cd1ba4 |
@ -10,54 +10,25 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
token: 0406afe7de6547e850dd62c84976c6def23a5193
|
token: 0406afe7de6547e850dd62c84976c6def23a5193
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Install curl
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
|
|
||||||
- name: Build Docker image
|
|
||||||
uses: docker/build-push-action@v4
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
push: false
|
|
||||||
load: true
|
|
||||||
tags: ebook:latest
|
|
||||||
|
|
||||||
- name: Save Docker image
|
|
||||||
run: |
|
run: |
|
||||||
docker save ebook:latest | gzip > ebook.tar.gz
|
if command -v apt-get &> /dev/null; then
|
||||||
|
apt-get update && apt-get install -y curl
|
||||||
|
elif command -v apk &> /dev/null; then
|
||||||
|
apk add --no-cache curl
|
||||||
|
elif command -v yum &> /dev/null; then
|
||||||
|
yum install -y curl
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Deploy via API
|
- name: Upload config files to server
|
||||||
env:
|
env:
|
||||||
GITEA_API: "https://gitea.miduway.space/api/v1/repos/levis/ebook/raw/main"
|
GITEA_API: 'https://gitea.miduway.space/api/v1/repos/levis/ebook/raw/main'
|
||||||
GITEA_TOKEN: "0406afe7de6547e850dd62c84976c6def23a5193"
|
GITEA_TOKEN: '0406afe7de6547e850dd62c84976c6def23a5193'
|
||||||
SERVER_API: "https://ebook.miduway.space/"
|
|
||||||
run: |
|
run: |
|
||||||
# Устанавливаем зависимости без sudo
|
for file in docker-compose.yml Dockerfile; do
|
||||||
apt-get update && apt-get install -y curl
|
|
||||||
|
|
||||||
# Загружаем конфигурационные файлы
|
|
||||||
for file in docker-compose.yml nginx.conf ebook.conf; do
|
|
||||||
echo "Uploading $file"
|
echo "Uploading $file"
|
||||||
curl -X PUT \
|
curl -X PUT \
|
||||||
-H "Authorization: token $GITEA_TOKEN" \
|
-H "Authorization: token $GITEA_TOKEN" \
|
||||||
-T "$file" \
|
-T "$file" \
|
||||||
"$GITEA_API/$file"
|
"$GITEA_API/$file"
|
||||||
done
|
done
|
||||||
|
|
||||||
# Загружаем Docker образ
|
|
||||||
echo "Uploading Docker image..."
|
|
||||||
curl -X PUT \
|
|
||||||
-H "Authorization: token $GITEA_TOKEN" \
|
|
||||||
-T "ebook.tar.gz" \
|
|
||||||
"$GITEA_API/ebook.tar.gz"
|
|
||||||
|
|
||||||
# Выполняем деплой на сервер с игнорированием SSL
|
|
||||||
echo "Deploying to server..."
|
|
||||||
curl -k -X POST \
|
|
||||||
-H "Authorization: token $GITEA_TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{
|
|
||||||
"action": "deploy",
|
|
||||||
"repository": "levis/ebook",
|
|
||||||
"branch": "main"
|
|
||||||
}' \
|
|
||||||
"$SERVER_API"
|
|
27
Dockerfile
@ -1,30 +1,13 @@
|
|||||||
# Build stage
|
FROM node:20 as builder
|
||||||
FROM node:20-alpine as build
|
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
# Copy package files
|
|
||||||
COPY package.json yarn.lock ./
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
RUN npm install
|
RUN npm install
|
||||||
|
|
||||||
# Copy source code
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# Build the application
|
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# Production stage
|
|
||||||
FROM nginx:alpine
|
FROM nginx:alpine
|
||||||
|
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||||
# Copy built assets from build stage
|
COPY ebook.conf /etc/nginx/conf.d/default.conf
|
||||||
COPY --from=build /app/dist /usr/share/nginx/html
|
|
||||||
|
|
||||||
# Copy nginx configuration
|
|
||||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
||||||
|
|
||||||
# Expose port 80
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
CMD ["nginx", "-g", "daemon off;"]
|
|
@ -15,29 +15,17 @@ curl -k -H "Authorization: token $GITEA_TOKEN" \
|
|||||||
"$GITEA_URL/api/v1/repos/levis/ebook/raw/main/docker-compose.yml"
|
"$GITEA_URL/api/v1/repos/levis/ebook/raw/main/docker-compose.yml"
|
||||||
|
|
||||||
curl -k -H "Authorization: token $GITEA_TOKEN" \
|
curl -k -H "Authorization: token $GITEA_TOKEN" \
|
||||||
-o nginx.conf \
|
-o Dockerfile \
|
||||||
"$GITEA_URL/api/v1/repos/levis/ebook/raw/main/nginx.conf"
|
"$GITEA_URL/api/v1/repos/levis/ebook/raw/main/Dockerfile"
|
||||||
|
|
||||||
curl -k -H "Authorization: token $GITEA_TOKEN" \
|
|
||||||
-o ebook.conf \
|
|
||||||
"$GITEA_URL/api/v1/repos/levis/ebook/raw/main/ebook.conf"
|
|
||||||
|
|
||||||
curl -k -H "Authorization: token $GITEA_TOKEN" \
|
|
||||||
-o ebook.tar.gz \
|
|
||||||
"$GITEA_URL/api/v1/repos/levis/ebook/raw/main/ebook.tar.gz"
|
|
||||||
|
|
||||||
# Загружаем Docker образ
|
|
||||||
echo "Loading Docker image..."
|
|
||||||
gunzip -c ebook.tar.gz | docker load
|
|
||||||
|
|
||||||
# Копируем файлы в директорию деплоя
|
# Копируем файлы в директорию деплоя
|
||||||
cp -f docker-compose.yml nginx.conf ebook.conf $DEPLOY_DIR/
|
cp -f docker-compose.yml Dockerfile $DEPLOY_DIR/
|
||||||
|
|
||||||
# Переходим в директорию деплоя
|
# Переходим в директорию деплоя
|
||||||
cd $DEPLOY_DIR
|
cd $DEPLOY_DIR
|
||||||
|
|
||||||
# Перезапускаем контейнеры
|
# Собираем и запускаем контейнеры
|
||||||
docker-compose pull
|
docker-compose build
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
docker system prune -f
|
docker system prune -f
|
||||||
|
|
||||||
|
@ -5,8 +5,8 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ports:
|
expose:
|
||||||
- "3000:80"
|
- "80"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
- NODE_ENV=production
|
||||||
|
@ -1,10 +1,17 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<link href="/src/style.css" rel="stylesheet" />
|
<link href="/src/style.css" rel="stylesheet" />
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Russo+One&display=swap" rel="stylesheet" />
|
||||||
<title>e-book</title>
|
<title>e-book</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
84
nginx.conf
@ -1,29 +1,85 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name localhost;
|
server_name ebook.miduway.space;
|
||||||
root /usr/share/nginx/html;
|
|
||||||
index index.html;
|
# Редирект всех HTTP-запросов на HTTPS
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
# Gzip compression
|
server {
|
||||||
gzip on;
|
listen 443 ssl;
|
||||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
server_name ebook.miduway.space;
|
||||||
|
|
||||||
# Security headers
|
# SSL-сертификаты
|
||||||
add_header X-Frame-Options "SAMEORIGIN";
|
ssl_certificate /etc/letsencrypt/live/ebook.miduway.space/fullchain.pem;
|
||||||
add_header X-XSS-Protection "1; mode=block";
|
ssl_certificate_key /etc/letsencrypt/live/ebook.miduway.space/privkey.pem;
|
||||||
add_header X-Content-Type-Options "nosniff";
|
|
||||||
|
# Настройки SSL
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_session_timeout 10m;
|
||||||
|
|
||||||
|
# Проксирование к Docker-контейнеру
|
||||||
location / {
|
location / {
|
||||||
|
proxy_pass http://localhost:80;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
# Настройки для Vue.js
|
||||||
try_files $uri $uri/ /index.html;
|
try_files $uri $uri/ /index.html;
|
||||||
|
add_header Cache-Control "no-cache, no-store, must-revalidate";
|
||||||
}
|
}
|
||||||
|
|
||||||
# Cache static assets
|
# Кэширование статических файлов Vue
|
||||||
location /assets/ {
|
location /js/ {
|
||||||
|
proxy_pass http://localhost:80;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
|
||||||
|
# Настройки кэширования для JS файлов
|
||||||
expires 1y;
|
expires 1y;
|
||||||
add_header Cache-Control "public, no-transform";
|
add_header Cache-Control "public, immutable";
|
||||||
}
|
}
|
||||||
|
|
||||||
# Error pages
|
location /css/ {
|
||||||
|
proxy_pass http://localhost:80;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
|
||||||
|
# Настройки кэширования для CSS файлов
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
location /img/ {
|
||||||
|
proxy_pass http://localhost:80;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
|
||||||
|
# Настройки кэширования для изображений
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Блокировка доступа к скрытым файлам
|
||||||
|
location ~ /\. {
|
||||||
|
deny all;
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Обработка ошибок для Vue.js
|
||||||
error_page 404 /index.html;
|
error_page 404 /index.html;
|
||||||
error_page 500 502 503 504 /50x.html;
|
error_page 500 502 503 504 /50x.html;
|
||||||
location = /50x.html {
|
location = /50x.html {
|
||||||
|
350
package-lock.json
generated
@ -9,12 +9,16 @@
|
|||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.1.8",
|
"@tailwindcss/vite": "^4.1.8",
|
||||||
|
"@vueuse/head": "^2.0.0",
|
||||||
"pinia": "^3.0.3",
|
"pinia": "^3.0.3",
|
||||||
|
"swiper": "^11.2.8",
|
||||||
"tailwindcss": "^4.1.8",
|
"tailwindcss": "^4.1.8",
|
||||||
"vue": "^3.5.13",
|
"vue": "^3.5.13",
|
||||||
"vue-router": "4"
|
"vue-router": "4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@tsconfig/node22": "^22.0.1",
|
||||||
|
"@types/node": "^22.14.0",
|
||||||
"@vitejs/plugin-vue": "^5.2.3",
|
"@vitejs/plugin-vue": "^5.2.3",
|
||||||
"@vue/eslint-config-prettier": "^10.2.0",
|
"@vue/eslint-config-prettier": "^10.2.0",
|
||||||
"@vue/eslint-config-typescript": "^14.5.0",
|
"@vue/eslint-config-typescript": "^14.5.0",
|
||||||
@ -22,6 +26,9 @@
|
|||||||
"eslint": "^9.22.0",
|
"eslint": "^9.22.0",
|
||||||
"eslint-plugin-vue": "~10.0.0",
|
"eslint-plugin-vue": "~10.0.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
|
"jiti": "^2.4.2",
|
||||||
|
"npm-run-all2": "^7.0.2",
|
||||||
|
"playwright": "^1.52.0",
|
||||||
"prettier": "3.5.3",
|
"prettier": "3.5.3",
|
||||||
"typescript": "~5.8.3",
|
"typescript": "~5.8.3",
|
||||||
"vite": "^6.3.5",
|
"vite": "^6.3.5",
|
||||||
@ -1929,6 +1936,13 @@
|
|||||||
"vite": "^5.2.0 || ^6"
|
"vite": "^5.2.0 || ^6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@tsconfig/node22": {
|
||||||
|
"version": "22.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.2.tgz",
|
||||||
|
"integrity": "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.8",
|
"version": "1.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
|
||||||
@ -1943,6 +1957,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/node": {
|
||||||
|
"version": "22.15.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.31.tgz",
|
||||||
|
"integrity": "sha512-jnVe5ULKl6tijxUhvQeNbQG/84fHfg+yMak02cT8QVhBx/F05rAVxCGBYYTh2EKz22D6JF5ktXuNwdx7b9iEGw==",
|
||||||
|
"devOptional": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"undici-types": "~6.21.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "8.34.0",
|
"version": "8.34.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz",
|
||||||
@ -2187,6 +2211,76 @@
|
|||||||
"url": "https://opencollective.com/eslint"
|
"url": "https://opencollective.com/eslint"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@unhead/dom": {
|
||||||
|
"version": "1.11.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.20.tgz",
|
||||||
|
"integrity": "sha512-jgfGYdOH+xHJF/j8gudjsYu3oIjFyXhCWcgKaw3vQnT616gSqyqnGQGOItL+BQtQZACKNISwIfx5PuOtztMKLA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@unhead/schema": "1.11.20",
|
||||||
|
"@unhead/shared": "1.11.20"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@unhead/schema": {
|
||||||
|
"version": "1.11.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.20.tgz",
|
||||||
|
"integrity": "sha512-0zWykKAaJdm+/Y7yi/Yds20PrUK7XabLe9c3IRcjnwYmSWY6z0Cr19VIs3ozCj8P+GhR+/TI2mwtGlueCEYouA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"hookable": "^5.5.3",
|
||||||
|
"zhead": "^2.2.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@unhead/shared": {
|
||||||
|
"version": "1.11.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.20.tgz",
|
||||||
|
"integrity": "sha512-1MOrBkGgkUXS+sOKz/DBh4U20DNoITlJwpmvSInxEUNhghSNb56S0RnaHRq0iHkhrO/cDgz2zvfdlRpoPLGI3w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@unhead/schema": "1.11.20",
|
||||||
|
"packrup": "^0.1.2"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@unhead/ssr": {
|
||||||
|
"version": "1.11.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.11.20.tgz",
|
||||||
|
"integrity": "sha512-j6ehzmdWGAvv0TEZyLE3WBnG1ULnsbKQcLqBDh3fvKS6b3xutcVZB7mjvrVE7ckSZt6WwOtG0ED3NJDS7IjzBA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@unhead/schema": "1.11.20",
|
||||||
|
"@unhead/shared": "1.11.20"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@unhead/vue": {
|
||||||
|
"version": "1.11.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.20.tgz",
|
||||||
|
"integrity": "sha512-sqQaLbwqY9TvLEGeq8Fd7+F2TIuV3nZ5ihVISHjWpAM3y7DwNWRU7NmT9+yYT+2/jw1Vjwdkv5/HvDnvCLrgmg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@unhead/schema": "1.11.20",
|
||||||
|
"@unhead/shared": "1.11.20",
|
||||||
|
"hookable": "^5.5.3",
|
||||||
|
"unhead": "1.11.20"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"vue": ">=2.7 || >=3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@vitejs/plugin-vue": {
|
"node_modules/@vitejs/plugin-vue": {
|
||||||
"version": "5.2.4",
|
"version": "5.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
|
||||||
@ -2549,6 +2643,21 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@vueuse/head": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@vueuse/head/-/head-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@unhead/dom": "^1.7.0",
|
||||||
|
"@unhead/schema": "^1.7.0",
|
||||||
|
"@unhead/ssr": "^1.7.0",
|
||||||
|
"@unhead/vue": "^1.7.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"vue": ">=2.7 || >=3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/acorn": {
|
"node_modules/acorn": {
|
||||||
"version": "8.15.0",
|
"version": "8.15.0",
|
||||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
|
||||||
@ -3873,6 +3982,16 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/json-parse-even-better-errors": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || >=20.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/json-schema-traverse": {
|
"node_modules/json-schema-traverse": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
|
||||||
@ -4228,6 +4347,15 @@
|
|||||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/memorystream": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
|
||||||
|
"integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/merge2": {
|
"node_modules/merge2": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||||
@ -4366,6 +4494,82 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/npm-normalize-package-bin": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || >=20.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/npm-run-all2": {
|
||||||
|
"version": "7.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.2.tgz",
|
||||||
|
"integrity": "sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"ansi-styles": "^6.2.1",
|
||||||
|
"cross-spawn": "^7.0.6",
|
||||||
|
"memorystream": "^0.3.1",
|
||||||
|
"minimatch": "^9.0.0",
|
||||||
|
"pidtree": "^0.6.0",
|
||||||
|
"read-package-json-fast": "^4.0.0",
|
||||||
|
"shell-quote": "^1.7.3",
|
||||||
|
"which": "^5.0.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"npm-run-all": "bin/npm-run-all/index.js",
|
||||||
|
"npm-run-all2": "bin/npm-run-all/index.js",
|
||||||
|
"run-p": "bin/run-p/index.js",
|
||||||
|
"run-s": "bin/run-s/index.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || >=20.5.0",
|
||||||
|
"npm": ">= 9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/npm-run-all2/node_modules/ansi-styles": {
|
||||||
|
"version": "6.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
|
||||||
|
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/npm-run-all2/node_modules/isexe": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/npm-run-all2/node_modules/which": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"isexe": "^3.1.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"node-which": "bin/which.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || >=20.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/npm-run-path": {
|
"node_modules/npm-run-path": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
|
||||||
@ -4478,6 +4682,15 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/packrup": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/packrup/-/packrup-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/parent-module": {
|
"node_modules/parent-module": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
|
||||||
@ -4563,6 +4776,19 @@
|
|||||||
"url": "https://github.com/sponsors/jonschlinkert"
|
"url": "https://github.com/sponsors/jonschlinkert"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/pidtree": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
|
||||||
|
"integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"pidtree": "bin/pidtree.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/pinia": {
|
"node_modules/pinia": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz",
|
||||||
@ -4584,6 +4810,53 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/playwright": {
|
||||||
|
"version": "1.53.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz",
|
||||||
|
"integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"playwright-core": "1.53.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"playwright": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"fsevents": "2.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/playwright-core": {
|
||||||
|
"version": "1.53.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz",
|
||||||
|
"integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bin": {
|
||||||
|
"playwright-core": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/playwright/node_modules/fsevents": {
|
||||||
|
"version": "2.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||||
|
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.5.5",
|
"version": "8.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz",
|
||||||
@ -4712,6 +4985,20 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/read-package-json-fast": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"json-parse-even-better-errors": "^4.0.0",
|
||||||
|
"npm-normalize-package-bin": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.17.0 || >=20.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/resolve-from": {
|
"node_modules/resolve-from": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||||
@ -4857,6 +5144,19 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/shell-quote": {
|
||||||
|
"version": "1.8.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
|
||||||
|
"integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/signal-exit": {
|
"node_modules/signal-exit": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
||||||
@ -4954,6 +5254,25 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/swiper": {
|
||||||
|
"version": "11.2.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.8.tgz",
|
||||||
|
"integrity": "sha512-S5FVf6zWynPWooi7pJ7lZhSUe2snTzqLuUzbd5h5PHUOhzgvW0bLKBd2wv0ixn6/5o9vwc/IkQT74CRcLJQzeg==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "patreon",
|
||||||
|
"url": "https://www.patreon.com/swiperjs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "open_collective",
|
||||||
|
"url": "http://opencollective.com/swiper"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/synckit": {
|
"node_modules/synckit": {
|
||||||
"version": "0.11.8",
|
"version": "0.11.8",
|
||||||
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz",
|
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz",
|
||||||
@ -5130,6 +5449,28 @@
|
|||||||
"typescript": ">=4.8.4 <5.9.0"
|
"typescript": ">=4.8.4 <5.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/undici-types": {
|
||||||
|
"version": "6.21.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
||||||
|
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
||||||
|
"devOptional": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/unhead": {
|
||||||
|
"version": "1.11.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.20.tgz",
|
||||||
|
"integrity": "sha512-3AsNQC0pjwlLqEYHLjtichGWankK8yqmocReITecmpB1H0aOabeESueyy+8X1gyJx4ftZVwo9hqQ4O3fPWffCA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@unhead/dom": "1.11.20",
|
||||||
|
"@unhead/schema": "1.11.20",
|
||||||
|
"@unhead/shared": "1.11.20",
|
||||||
|
"hookable": "^5.5.3"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/unicorn-magic": {
|
"node_modules/unicorn-magic": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
|
||||||
@ -5563,6 +5904,15 @@
|
|||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"node_modules/zhead": {
|
||||||
|
"version": "2.2.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz",
|
||||||
|
"integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==",
|
||||||
|
"license": "MIT",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/harlan-zw"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
package.json
@ -13,23 +13,30 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.1.8",
|
"@tailwindcss/vite": "^4.1.8",
|
||||||
|
"@vueuse/head": "^2.0.0",
|
||||||
"pinia": "^3.0.3",
|
"pinia": "^3.0.3",
|
||||||
|
"swiper": "^11.2.8",
|
||||||
"tailwindcss": "^4.1.8",
|
"tailwindcss": "^4.1.8",
|
||||||
"vue": "^3.5.13",
|
"vue": "^3.5.13",
|
||||||
"vue-router": "4"
|
"vue-router": "4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@tsconfig/node22": "^22.0.1",
|
||||||
|
"@types/node": "^22.14.0",
|
||||||
"@vitejs/plugin-vue": "^5.2.3",
|
"@vitejs/plugin-vue": "^5.2.3",
|
||||||
|
"@vue/eslint-config-prettier": "^10.2.0",
|
||||||
|
"@vue/eslint-config-typescript": "^14.5.0",
|
||||||
"@vue/tsconfig": "^0.7.0",
|
"@vue/tsconfig": "^0.7.0",
|
||||||
"eslint": "^9.22.0",
|
"eslint": "^9.22.0",
|
||||||
"eslint-plugin-vue": "~10.0.0",
|
"eslint-plugin-vue": "~10.0.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
|
"jiti": "^2.4.2",
|
||||||
|
"npm-run-all2": "^7.0.2",
|
||||||
|
"playwright": "^1.52.0",
|
||||||
"prettier": "3.5.3",
|
"prettier": "3.5.3",
|
||||||
"@vue/eslint-config-prettier": "^10.2.0",
|
|
||||||
"@vue/eslint-config-typescript": "^14.5.0",
|
|
||||||
"vite-plugin-vue-devtools": "^7.7.2",
|
|
||||||
"typescript": "~5.8.3",
|
"typescript": "~5.8.3",
|
||||||
"vite": "^6.3.5",
|
"vite": "^6.3.5",
|
||||||
|
"vite-plugin-vue-devtools": "^7.7.2",
|
||||||
"vue-tsc": "^2.2.8"
|
"vue-tsc": "^2.2.8"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
||||||
|
3
public/img/svg/books/1/f7_exclamationmark.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M25.0104 33.4059C26.1254 33.4059 26.9047 32.6698 26.9253 31.5332L27.1139 7.02002C27.1139 5.82058 26.1254 5 24.9888 5C23.8738 5 22.8853 5.82058 22.8853 7.02002L23.116 31.5332C23.1376 32.6698 23.9151 33.4059 25.0104 33.4059ZM24.9888 44.9999C25.3829 45.0025 25.7737 44.9272 26.1385 44.7782C26.5034 44.6293 26.8353 44.4096 27.1149 44.1319C27.3946 43.8543 27.6166 43.524 27.7682 43.1602C27.9198 42.7964 27.998 42.4062 27.9982 42.0121C27.9982 40.3503 26.6722 39.0243 24.9888 39.0243C24.5964 39.024 24.2077 39.1012 23.8451 39.2512C23.4825 39.4013 23.1531 39.6214 22.8756 39.8989C22.5981 40.1764 22.378 40.5058 22.2279 40.8684C22.0779 41.231 22.0007 41.6197 22.001 42.0121C22.0038 42.8037 22.3195 43.562 22.8792 44.1217C23.4389 44.6814 24.1973 44.9971 24.9888 44.9999Z" fill="#E51E7D"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 891 B |
3
public/img/svg/books/1/lucide_star.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M24.1466 8.36767C24.2254 8.20832 24.3473 8.07418 24.4983 7.98039C24.6494 7.88661 24.8237 7.83691 25.0015 7.83691C25.1793 7.83691 25.3535 7.88661 25.5046 7.98039C25.6557 8.07418 25.7775 8.20832 25.8564 8.36767L30.014 16.789C30.2875 17.3436 30.6917 17.8234 31.1918 18.1871C31.6919 18.5508 32.2728 18.7875 32.8847 18.8768L42.1826 20.2375C42.3588 20.263 42.5243 20.3373 42.6604 20.452C42.7966 20.5667 42.8979 20.7172 42.9529 20.8865C43.008 21.0558 43.0146 21.2371 42.972 21.41C42.9293 21.5828 42.8392 21.7403 42.7117 21.8645L35.9876 28.4123C35.5438 28.8442 35.2117 29.3776 35.0201 29.9665C34.8285 30.5553 34.7831 31.182 34.8879 31.7924L36.4753 41.0435C36.5064 41.2195 36.4874 41.4008 36.4204 41.5666C36.3535 41.7324 36.2412 41.8761 36.0966 41.9812C35.9519 42.0862 35.7806 42.1485 35.6022 42.161C35.4238 42.1734 35.2455 42.1354 35.0877 42.0514L26.7761 37.6814C26.2285 37.3935 25.6192 37.2431 25.0006 37.2431C24.3819 37.2431 23.7726 37.3935 23.225 37.6814L14.9153 42.0514C14.7575 42.1349 14.5794 42.1725 14.4013 42.1598C14.2232 42.1471 14.0523 42.0848 13.9079 41.9798C13.7635 41.8747 13.6515 41.7313 13.5846 41.5658C13.5177 41.4003 13.4985 41.2193 13.5294 41.0435L15.115 31.7942C15.2201 31.1835 15.1749 30.5565 14.9833 29.9673C14.7917 29.3781 14.4595 28.8444 14.0153 28.4123L7.29121 21.8663C7.16269 21.7422 7.07162 21.5845 7.02837 21.4111C6.98512 21.2378 6.99143 21.0557 7.04658 20.8858C7.10173 20.7158 7.2035 20.5648 7.3403 20.4498C7.47711 20.3349 7.64344 20.2607 7.82036 20.2357L17.1164 18.8768C17.7289 18.788 18.3107 18.5516 18.8114 18.1879C19.3122 17.8241 19.7169 17.3441 19.9908 16.789L24.1466 8.36767Z" stroke="#E51E7D" stroke-width="3.90819" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
3
public/img/svg/books/1/mdi_heart-outline.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M25.18 36.4754L25 36.6554L24.802 36.4754C16.252 28.7174 10.6 23.5874 10.6 18.3854C10.6 14.7854 13.3 12.0854 16.9 12.0854C19.672 12.0854 22.372 13.8854 23.326 16.3334H26.674C27.628 13.8854 30.328 12.0854 33.1 12.0854C36.7 12.0854 39.4 14.7854 39.4 18.3854C39.4 23.5874 33.748 28.7174 25.18 36.4754ZM33.1 8.48535C29.968 8.48535 26.962 9.94335 25 12.2294C23.038 9.94335 20.032 8.48535 16.9 8.48535C11.356 8.48535 7 12.8234 7 18.3854C7 25.1714 13.12 30.7334 22.39 39.1394L25 41.5154L27.61 39.1394C36.88 30.7334 43 25.1714 43 18.3854C43 12.8234 38.644 8.48535 33.1 8.48535Z" fill="#E51E7D"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 699 B |
3
public/img/svg/books/1/meteor-icons_message.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M39.625 29.875C39.625 30.737 39.2826 31.5636 38.6731 32.1731C38.0636 32.7826 37.237 33.125 36.375 33.125H16.875L10.375 39.625V13.625C10.375 12.763 10.7174 11.9364 11.3269 11.3269C11.9364 10.7174 12.763 10.375 13.625 10.375H36.375C37.237 10.375 38.0636 10.7174 38.6731 11.3269C39.2826 11.9364 39.625 12.763 39.625 13.625V29.875Z" stroke="#E51E7D" stroke-width="3.52857" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 530 B |
4
public/img/svg/books/1/stash_target.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M25 9.89927C22.5261 9.89819 20.0898 10.5048 17.9052 11.6657C15.7207 12.8267 13.8547 14.5065 12.4713 16.5574C11.088 18.6084 10.2296 20.9678 9.97157 23.4282C9.71356 25.8886 10.0638 28.3747 10.9916 30.668C11.0759 30.8595 11.1208 31.0659 11.1238 31.275C11.1267 31.4842 11.0877 31.6918 11.0089 31.8856C10.9302 32.0793 10.8133 32.2553 10.6653 32.4031C10.5172 32.5509 10.341 32.6674 10.1471 32.7458C9.9532 32.8242 9.74552 32.8629 9.53638 32.8595C9.32724 32.8562 9.1209 32.8109 8.9296 32.7263C8.7383 32.6417 8.56593 32.5196 8.4227 32.3671C8.27948 32.2147 8.16832 32.0351 8.09581 31.8389C6.51986 27.9412 6.33956 23.6187 7.58547 19.6034C8.83138 15.588 11.4269 12.1268 14.9324 9.80587C18.4379 7.48496 22.6378 6.44706 26.8209 6.86799C31.004 7.28892 34.9129 9.14279 37.8857 12.1156C40.8585 15.0884 42.7124 18.9974 43.1333 23.1804C43.5543 27.3635 42.5164 31.5635 40.1955 35.0689C37.8746 38.5744 34.4133 41.17 30.398 42.4159C26.3827 43.6618 22.0601 43.4815 18.1625 41.9055C17.7867 41.7443 17.4891 41.4423 17.3335 41.0641C17.1779 40.686 17.1767 40.2619 17.3302 39.883C17.4837 39.504 17.7796 39.2003 18.1545 39.037C18.5294 38.8737 18.9534 38.8639 19.3354 39.0097C21.4006 39.8433 23.6246 40.2098 25.8481 40.0831C28.0716 39.9564 30.2396 39.3396 32.1968 38.2767C34.1539 37.2139 35.8518 35.7314 37.1689 33.9355C38.4859 32.1395 39.3895 30.0745 39.8148 27.8884C40.2402 25.7023 40.1769 23.4492 39.6294 21.2904C39.082 19.1317 38.0639 17.1207 36.648 15.4015C35.2322 13.6823 33.4538 12.2975 31.44 11.3463C29.4263 10.3951 27.2271 9.90092 25 9.89927Z" fill="#E51E7D"/>
|
||||||
|
<path d="M13.021 25.002C13.021 27.7458 13.9439 30.2749 15.496 32.2958L14.5189 33.2728L14.4585 33.3353H12.021C11.1925 33.3361 10.3982 33.6658 9.81269 34.252L6.40227 37.6624C6.18403 37.8809 6.03544 38.1592 5.97526 38.4621C5.91509 38.7651 5.94603 39.079 6.06417 39.3644C6.18232 39.6497 6.38238 39.8936 6.63908 40.0653C6.89578 40.237 7.19761 40.3288 7.50644 40.3291H9.67311V42.4958C9.67338 42.8046 9.76516 43.1064 9.93687 43.3631C10.1086 43.6198 10.3525 43.8199 10.6378 43.938C10.9232 44.0562 11.2371 44.0871 11.5401 44.0269C11.843 43.9668 12.1213 43.8182 12.3398 43.5999L15.7502 40.1874C16.3359 39.6024 16.6656 38.809 16.6669 37.9812V35.5437L16.7294 35.4833L17.7064 34.5083C19.8515 36.1547 22.4906 37.027 25.1943 36.9831C27.8981 36.9393 30.5075 35.982 32.5981 34.2669C34.6887 32.5518 36.1375 30.1798 36.7089 27.5368C37.2803 24.8937 36.9406 22.1351 35.7451 19.7096C34.5496 17.2841 32.5687 15.3344 30.1245 14.1777C27.6803 13.021 24.9166 12.7253 22.283 13.3386C19.6494 13.952 17.3007 15.4384 15.6191 17.556C13.9375 19.6736 13.0218 22.2979 13.021 25.002ZM25.0002 16.1478C26.3897 16.1482 27.7595 16.4756 28.999 17.1036C30.2385 17.7315 31.3128 18.6423 32.1351 19.7624C32.9573 20.8825 33.5045 22.1803 33.7322 23.551C33.9599 24.9217 33.8618 26.3267 33.4458 27.6525C33.0299 28.9783 32.3078 30.1875 31.3379 31.1825C30.368 32.1774 29.1776 32.9302 27.8628 33.3798C26.5481 33.8294 25.146 33.9633 23.77 33.7707C22.3939 33.578 21.0825 33.0642 19.9419 32.2708L23.371 28.8395C24.2612 29.2172 25.2551 29.2735 26.1823 28.9987C27.1095 28.7239 27.9122 28.1352 28.4529 27.3335C28.9936 26.5317 29.2386 25.5668 29.1459 24.6043C29.0531 23.6417 28.6285 22.7413 27.9447 22.0575C27.2609 21.3737 26.3605 20.9491 25.3979 20.8563C24.4354 20.7636 23.4705 21.0086 22.6687 21.5493C21.867 22.09 21.2782 22.8927 21.0035 23.8199C20.7287 24.7471 20.785 25.7409 21.1627 26.6312L17.7294 30.0583C16.8056 28.7303 16.2632 27.1746 16.1613 25.5602C16.0593 23.9457 16.4016 22.3342 17.1509 20.9005C17.9003 19.4669 19.0281 18.2659 20.4118 17.428C21.7956 16.5902 23.3825 16.1474 25.0002 16.1478ZM14.4585 35.4187L14.5835 35.5416V37.9791C14.5829 38.2551 14.4728 38.5196 14.2773 38.7145L11.7564 41.2353V39.2874C11.7564 39.0112 11.6467 38.7462 11.4513 38.5509C11.256 38.3555 10.991 38.2458 10.7148 38.2458H8.76477L11.2856 35.7249C11.3823 35.6279 11.4973 35.5509 11.6238 35.4983C11.7504 35.4458 11.8861 35.4187 12.0231 35.4187H14.4585Z" fill="#E51E7D"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.0 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.91667 2.33301C9.67311 2.33286 9.43561 2.40894 9.23747 2.55059C9.03934 2.69223 8.8905 2.89234 8.81183 3.12284L8.6625 3.55801C8.34809 4.44754 8.0517 5.34333 7.7735 6.24484C7.39433 7.49201 7 8.98184 7 9.99801C7 10.1162 7.00311 10.2345 7.00933 10.3527C6.98881 10.5151 7.00273 10.6801 7.05017 10.8368C7.413 13.9075 9.723 16.7985 12.8333 17.3888V23.333H10.5C10.1906 23.333 9.89383 23.4559 9.67504 23.6747C9.45625 23.8935 9.33333 24.1903 9.33333 24.4997C9.33333 24.8091 9.45625 25.1058 9.67504 25.3246C9.89383 25.5434 10.1906 25.6663 10.5 25.6663H17.5C17.8094 25.6663 18.1062 25.5434 18.325 25.3246C18.5437 25.1058 18.6667 24.8091 18.6667 24.4997C18.6667 24.1903 18.5437 23.8935 18.325 23.6747C18.1062 23.4559 17.8094 23.333 17.5 23.333H15.1667V17.39C18.5593 16.746 21 13.3638 21 9.99918C21 8.99234 20.6173 7.51767 20.2417 6.27167C19.9159 5.20896 19.5631 4.15472 19.1835 3.11001L19.1812 3.10651C19.1002 2.88018 18.9512 2.68441 18.7547 2.54596C18.5582 2.4075 18.3237 2.33313 18.0833 2.33301H9.91667ZM9.39983 9.33301H18.6013C18.4987 8.70068 18.2828 7.85601 18.0075 6.94484C17.7749 6.17998 17.5255 5.4203 17.2597 4.66634H10.7473C10.5315 5.29168 10.2573 6.09317 10.0053 6.92384C9.72533 7.84317 9.50483 8.69601 9.39983 9.33301Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,7 @@
|
|||||||
|
<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.7941 11.288C11.7471 10.8792 10.5945 10.8274 9.51504 11.1406C8.4356 11.4538 7.48973 12.1145 6.82421 13.0203C6.15869 13.926 5.81075 15.0261 5.83437 16.1498C5.858 17.2735 6.25187 18.358 6.95486 19.235C7.65786 20.112 8.63066 20.7324 9.72231 21C10.814 21.2675 11.9634 21.1673 12.9923 20.7148C14.0211 20.2623 14.8718 19.4829 15.4124 18.4975C15.953 17.5121 16.1532 16.3758 15.982 15.2649C15.9674 15.1703 15.9717 15.0737 15.9944 14.9807C16.0172 14.8876 16.0581 14.8 16.1147 14.7228C16.1714 14.6456 16.2427 14.5803 16.3245 14.5306C16.4064 14.4809 16.4973 14.4479 16.5919 14.4333C16.6866 14.4188 16.7832 14.423 16.8762 14.4458C16.9692 14.4685 17.0569 14.5094 17.1341 14.566C17.2113 14.6227 17.2766 14.694 17.3263 14.7759C17.3759 14.8577 17.409 14.9486 17.4236 15.0433C17.6435 16.4714 17.3859 17.9323 16.6907 19.1991C15.9955 20.4659 14.9016 21.4679 13.5788 22.0495C12.256 22.6311 10.7782 22.7598 9.37475 22.4157C7.9713 22.0716 6.72066 21.2739 5.8169 20.1464C4.91314 19.0188 4.4068 17.6245 4.37645 16.1798C4.3461 14.7351 4.79343 13.3208 5.64904 12.1563C6.50465 10.9918 7.72068 10.1423 9.10845 9.73954C10.4962 9.33679 11.9781 9.40335 13.3242 9.92888C13.4146 9.96279 13.4974 10.0143 13.5677 10.0805C13.6381 10.1467 13.6946 10.2261 13.7339 10.3143C13.7733 10.4025 13.7948 10.4976 13.7971 10.5941C13.7994 10.6907 13.7825 10.7867 13.7474 10.8767C13.7123 10.9666 13.6597 11.0487 13.5926 11.1182C13.5255 11.1877 13.4453 11.2431 13.3566 11.2813C13.2679 11.3195 13.1725 11.3397 13.0759 11.3407C12.9794 11.3418 12.8836 11.3243 12.7941 11.288Z" fill="#E20C66"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.208 28.4375V22.6042C10.208 22.4108 10.2848 22.2253 10.4216 22.0886C10.5583 21.9518 10.7438 21.875 10.9372 21.875C11.1306 21.875 11.316 21.9518 11.4528 22.0886C11.5895 22.2253 11.6663 22.4108 11.6663 22.6042V28.4375C11.6663 28.6309 11.5895 28.8164 11.4528 28.9531C11.316 29.0898 11.1306 29.1667 10.9372 29.1667C10.7438 29.1667 10.5583 29.0898 10.4216 28.9531C10.2848 28.8164 10.208 28.6309 10.208 28.4375Z" fill="#E20C66"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.02051 24.792C8.02051 24.5986 8.09733 24.4131 8.23408 24.2764C8.37082 24.1397 8.55629 24.0628 8.74967 24.0628H13.1247C13.3181 24.0628 13.5035 24.1397 13.6403 24.2764C13.777 24.4131 13.8538 24.5986 13.8538 24.792C13.8538 24.9854 13.777 25.1709 13.6403 25.3076C13.5035 25.4443 13.3181 25.5212 13.1247 25.5212H8.74967C8.55629 25.5212 8.37082 25.4443 8.23408 25.3076C8.09733 25.1709 8.02051 24.9854 8.02051 24.792ZM21.074 11.1296C20.266 10.9015 19.4141 10.8762 18.5939 11.0561C17.7738 11.236 17.0107 11.6154 16.3722 12.1607C15.7338 12.7061 15.2397 13.4005 14.9338 14.1825C14.628 14.9644 14.5197 15.8098 14.6187 16.6436C14.6306 16.7389 14.6234 16.8356 14.5978 16.9282C14.5721 17.0208 14.5284 17.1074 14.4691 17.183C14.4099 17.2587 14.3363 17.3218 14.2525 17.3689C14.1688 17.416 14.0766 17.4461 13.9812 17.4574C13.8858 17.4688 13.7891 17.4612 13.6966 17.435C13.6042 17.4088 13.5178 17.3647 13.4425 17.305C13.3672 17.2454 13.3044 17.1715 13.2577 17.0875C13.2111 17.0035 13.1815 16.9111 13.1706 16.8156C13.0003 15.3807 13.3083 13.9296 14.0469 12.6876C14.7856 11.4456 15.9135 10.4821 17.2557 9.94663C18.5979 9.41118 20.0793 9.33372 21.47 9.72626C22.8607 10.1188 24.083 10.9594 24.9471 12.1176C25.8113 13.2758 26.269 14.6868 26.2492 16.1318C26.2295 17.5767 25.7333 18.9747 24.8378 20.1088C23.9423 21.2429 22.6975 22.0498 21.2966 22.4041C19.8957 22.7585 18.4169 22.6405 17.0899 22.0686C17.0019 22.0307 16.9223 21.9759 16.8555 21.9072C16.7888 21.8386 16.7362 21.7575 16.7008 21.6685C16.6293 21.4888 16.632 21.2881 16.7085 21.1104C16.785 20.9328 16.9289 20.7928 17.1086 20.7213C17.2883 20.6498 17.489 20.6526 17.6667 20.7291C18.3082 21.0055 18.9996 21.1473 19.6981 21.1457C20.3967 21.144 21.0874 20.9991 21.7277 20.7197C22.3679 20.4403 22.944 20.0325 23.4202 19.5215C23.8965 19.0105 24.2628 18.4072 24.4965 17.7489C24.7301 17.0906 24.8262 16.3914 24.7787 15.6944C24.7312 14.9975 24.5412 14.3178 24.2203 13.6973C23.8995 13.0768 23.4547 12.5287 22.9135 12.0871C22.3724 11.6454 21.7463 11.3195 21.074 11.1296Z" fill="#E20C66"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.9117 12.5476C23.775 12.4109 23.6982 12.2254 23.6982 12.0321C23.6982 11.8387 23.775 11.6533 23.9117 11.5166L29.3805 6.0478C29.4477 5.97816 29.5282 5.92261 29.6172 5.88439C29.7061 5.84618 29.8018 5.82606 29.8986 5.82522C29.9954 5.82438 30.0915 5.84283 30.1811 5.87949C30.2707 5.91616 30.3521 5.9703 30.4206 6.03876C30.489 6.10723 30.5432 6.18864 30.5798 6.27825C30.6165 6.36786 30.6349 6.46388 30.6341 6.5607C30.6333 6.65752 30.6131 6.7532 30.5749 6.84216C30.5367 6.93112 30.4812 7.01158 30.4115 7.07884L24.9428 12.5476C24.806 12.6843 24.6206 12.7611 24.4273 12.7611C24.2339 12.7611 24.0485 12.6843 23.9117 12.5476Z" fill="#E20C66"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.8402 10.9379C29.7444 10.9366 29.6498 10.9165 29.5618 10.8787C29.4738 10.841 29.3941 10.7862 29.3273 10.7176C29.2605 10.649 29.2078 10.5679 29.1723 10.479C29.1368 10.39 29.1192 10.295 29.1205 10.1992L29.1569 7.30151L26.2592 7.33797C26.0658 7.34048 25.8794 7.26607 25.7408 7.1311C25.6023 6.99614 25.5231 6.81167 25.5206 6.61828C25.5181 6.42489 25.5925 6.23843 25.7274 6.09991C25.8624 5.96138 26.0469 5.88215 26.2403 5.87964L30.6342 5.82422L30.5788 10.2182C30.5776 10.3139 30.5575 10.4085 30.5197 10.4965C30.4819 10.5845 30.4271 10.6642 30.3585 10.731C30.29 10.7978 30.2089 10.8505 30.1199 10.886C30.031 10.9215 29.9359 10.9391 29.8402 10.9379Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.2142 3.71542C9.35741 3.71542 6.51074 4.78701 7.50066 11.423C7.51621 11.5233 7.53469 11.6316 7.55608 11.7479C7.73691 12.746 8.01574 14.2913 6.24124 15.5653C7.44816 16.5558 9.16724 17.5457 11.2562 17.9744C11.1735 18.4482 11.0699 18.918 10.9458 19.3826C10.7761 20.0056 10.4202 20.4472 9.78441 20.6356C9.22441 20.8013 8.63758 20.9354 8.03674 21.0731C7.88196 21.1081 7.72641 21.1439 7.57008 21.1804C6.82049 21.3548 6.05633 21.5479 5.37908 21.8209C4.70008 22.0951 4.06891 22.4643 3.61274 23.015C3.14841 23.5768 2.89991 24.2849 2.91683 25.1704C2.92266 25.4458 3.15833 25.6663 3.44766 25.6663H24.5515C24.8408 25.6663 25.0765 25.4458 25.0823 25.1704C25.0992 24.2849 24.8513 23.5768 24.3864 23.015C23.9308 22.4643 23.2991 22.0945 22.6207 21.8209C21.9428 21.5473 21.1787 21.3543 20.4285 21.1798L19.963 21.0731C19.3616 20.9354 18.7747 20.8013 18.2147 20.6356C17.5789 20.4472 17.2231 20.0056 17.0533 19.3826C16.905 18.8294 16.787 18.2686 16.6998 17.7026C18.297 17.2219 19.9945 16.358 21.7579 14.9784L21.7497 14.9703C20.922 14.1781 19.3703 12.6929 19.2601 9.16726C19.2601 4.31276 16.1649 0.0462566 11.2142 3.71542Z" stroke="#E20C66" stroke-width="2" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M13.9995 24.4997L10.062 25.8122C9.92593 25.8511 9.79954 25.8802 9.68288 25.8997C9.56621 25.9191 9.44954 25.9288 9.33288 25.9288C8.71066 25.9288 8.16621 25.7099 7.69954 25.272C7.23288 24.8341 6.99954 24.2753 6.99954 23.5955V17.2372L3.96621 12.308C3.84954 12.1136 3.76204 11.9141 3.70371 11.7095C3.64538 11.505 3.61621 11.2961 3.61621 11.083C3.61621 10.8699 3.64538 10.6611 3.70371 10.4565C3.76204 10.252 3.84954 10.0525 3.96621 9.85801L7.93288 3.44134C8.14677 3.09134 8.42871 2.81912 8.77871 2.62467C9.12871 2.43023 9.50788 2.33301 9.91621 2.33301H18.0829C18.4912 2.33301 18.8704 2.43023 19.2204 2.62467C19.5704 2.81912 19.8523 3.09134 20.0662 3.44134L24.0329 9.85801C24.1495 10.0525 24.237 10.252 24.2954 10.4565C24.3537 10.6611 24.3829 10.8699 24.3829 11.083C24.3829 11.2961 24.3537 11.5053 24.2954 11.7107C24.237 11.916 24.1495 12.1151 24.0329 12.308L20.9995 17.2372V23.5955C20.9995 24.2761 20.7662 24.8353 20.2995 25.2732C19.8329 25.7111 19.2884 25.9296 18.6662 25.9288C18.5495 25.9288 18.4329 25.9191 18.3162 25.8997C18.1995 25.8802 18.0732 25.8511 17.937 25.8122L13.9995 24.4997ZM9.91621 17.4997H18.0829L22.0495 11.083L18.0829 4.66634H9.91621L5.94954 11.083L9.91621 17.4997ZM12.7745 12.5413L16.887 8.39967C17.1009 8.16634 17.3685 8.05434 17.6897 8.06367C18.0109 8.07301 18.2878 8.18501 18.5204 8.39967C18.7537 8.63301 18.8754 8.91029 18.8855 9.23151C18.8957 9.55273 18.7837 9.82962 18.5495 10.0622L13.5912 15.0205C13.3579 15.2538 13.0857 15.3705 12.7745 15.3705C12.4634 15.3705 12.1912 15.2538 11.9579 15.0205L9.47871 12.5413C9.24538 12.308 9.12871 12.0311 9.12871 11.7107C9.12871 11.3902 9.24538 11.113 9.47871 10.8788C9.71204 10.6447 9.98932 10.5281 10.3105 10.5288C10.6318 10.5296 10.9087 10.6463 11.1412 10.8788L12.7745 12.5413Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
3
public/img/svg/books/1/titles-1/ph_strategy-fill.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.813 20.5625C11.813 21.2547 11.6077 21.9314 11.2231 22.507C10.8385 23.0826 10.2919 23.5312 9.65238 23.7961C9.01284 24.061 8.3091 24.1303 7.63017 23.9952C6.95124 23.8602 6.3276 23.5269 5.83811 23.0374C5.34863 22.5479 5.01529 21.9242 4.88024 21.2453C4.74519 20.5664 4.8145 19.8626 5.07941 19.2231C5.34431 18.5836 5.79292 18.0369 6.36849 17.6524C6.94406 17.2678 7.62075 17.0625 8.31299 17.0625C9.24124 17.0625 10.1315 17.4312 10.7879 18.0876C11.4442 18.744 11.813 19.6342 11.813 20.5625ZM5.86955 12.8691L7.43799 11.2995L9.00642 12.8691C9.17061 13.0332 9.39329 13.1255 9.62549 13.1255C9.85768 13.1255 10.0804 13.0332 10.2445 12.8691C10.4087 12.7049 10.501 12.4822 10.501 12.25C10.501 12.0178 10.4087 11.7951 10.2445 11.6309L8.67502 10.0625L10.2445 8.49406C10.4087 8.32988 10.501 8.10719 10.501 7.875C10.501 7.64281 10.4087 7.42012 10.2445 7.25594C10.0804 7.09175 9.85768 6.99951 9.62549 6.99951C9.39329 6.99951 9.17061 7.09175 9.00642 7.25594L7.43799 8.82547L5.86955 7.25594C5.70536 7.09175 5.48268 6.99951 5.25049 6.99951C5.01829 6.99951 4.79561 7.09175 4.63142 7.25594C4.46724 7.42012 4.375 7.64281 4.375 7.875C4.375 8.10719 4.46724 8.32988 4.63142 8.49406L6.20096 10.0625L4.63142 11.6309C4.46724 11.7951 4.375 12.0178 4.375 12.25C4.375 12.4822 4.46724 12.7049 4.63142 12.8691C4.79561 13.0332 5.01829 13.1255 5.25049 13.1255C5.48268 13.1255 5.70536 13.0332 5.86955 12.8691ZM23.55 20.5625L25.1196 18.9941C25.2837 18.8299 25.376 18.6072 25.376 18.375C25.376 18.1428 25.2837 17.9201 25.1196 17.7559C24.9554 17.5918 24.7327 17.4995 24.5005 17.4995C24.2683 17.4995 24.0456 17.5918 23.8814 17.7559L22.313 19.3255L20.7446 17.7559C20.5804 17.5918 20.3577 17.4995 20.1255 17.4995C19.8933 17.4995 19.6706 17.5918 19.5064 17.7559C19.3422 17.9201 19.25 18.1428 19.25 18.375C19.25 18.6072 19.3422 18.8299 19.5064 18.9941L21.076 20.5625L19.5064 22.1309C19.3422 22.2951 19.25 22.5178 19.25 22.75C19.25 22.9822 19.3422 23.2049 19.5064 23.3691C19.6706 23.5332 19.8933 23.6255 20.1255 23.6255C20.3577 23.6255 20.5804 23.5332 20.7446 23.3691L22.313 21.7995L23.8814 23.3691C23.9627 23.4504 24.0592 23.5148 24.1655 23.5588C24.2717 23.6028 24.3855 23.6255 24.5005 23.6255C24.6155 23.6255 24.7293 23.6028 24.8355 23.5588C24.9417 23.5148 25.0383 23.4504 25.1196 23.3691C25.2008 23.2878 25.2653 23.1913 25.3093 23.085C25.3533 22.9788 25.376 22.865 25.376 22.75C25.376 22.635 25.3533 22.5212 25.3093 22.415C25.2653 22.3087 25.2008 22.2122 25.1196 22.1309L23.55 20.5625ZM18.1195 5.50594L17.8625 5.25H20.1255C20.3576 5.25 20.5801 5.15781 20.7442 4.99372C20.9083 4.82962 21.0005 4.60706 21.0005 4.375C21.0005 4.14294 20.9083 3.92038 20.7442 3.75628C20.5801 3.59219 20.3576 3.5 20.1255 3.5H15.7505C15.5184 3.5 15.2959 3.59219 15.1318 3.75628C14.9677 3.92038 14.8755 4.14294 14.8755 4.375V8.75C14.8755 8.98206 14.9677 9.20462 15.1318 9.36872C15.2959 9.53281 15.5184 9.625 15.7505 9.625C15.9826 9.625 16.2051 9.53281 16.3692 9.36872C16.5333 9.20462 16.6255 8.98206 16.6255 8.75V6.48703L16.8814 6.74406C18.8425 8.70516 18.8392 10.6159 18.4903 11.8737C17.9828 13.708 16.3728 15.3486 14.6622 15.7763C14.4551 15.8282 14.274 15.954 14.1533 16.1302C14.0325 16.3063 13.9803 16.5205 14.0065 16.7324C14.0328 16.9444 14.1356 17.1394 14.2956 17.2808C14.4557 17.4222 14.6619 17.5001 14.8755 17.5C14.9474 17.5 15.019 17.4912 15.0888 17.4737C17.4086 16.8941 19.502 14.7831 20.178 12.3408C20.8452 9.92906 20.1145 7.50203 18.1195 5.50594Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
3
public/img/svg/books/1/titles-1/si_error-line.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M14.0001 18.6667H14.0094M14.0001 9.33333V15.1667M3.76839 9.23183L9.22839 3.76833C9.40339 3.59333 9.63672 3.5 9.89339 3.5H18.1184C18.3634 3.5 18.6084 3.59333 18.7834 3.76833L24.2317 9.22017C24.4067 9.39517 24.5001 9.6285 24.5001 9.88517V18.1148C24.5001 18.3598 24.4067 18.6048 24.2317 18.7798L18.7834 24.2317C18.6084 24.4067 18.3751 24.5 18.1184 24.5H9.88172C9.75866 24.5013 9.63655 24.4783 9.52242 24.4322C9.40829 24.3862 9.3044 24.318 9.21672 24.2317L3.76839 18.7798C3.68203 18.6922 3.61386 18.5883 3.56781 18.4741C3.52175 18.36 3.49873 18.2379 3.50005 18.1148V9.88517C3.50005 9.64017 3.59339 9.39517 3.76839 9.22017V9.23183Z" stroke="#E20C66" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 848 B |
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_899_158)">
|
||||||
|
<path d="M20.5854 18.8475C21.2857 16.0344 21.1657 13.0796 20.2397 10.3326C19.3137 7.58551 17.6203 5.16109 15.3599 3.34603C17.4233 2.15856 19.7634 1.53641 22.1441 1.54236C23.0471 1.54236 23.9466 1.62986 24.8321 1.80603L25.2054 0.310361C24.1978 0.103323 23.1716 -0.00065638 22.1429 2.76604e-05C19.2578 -0.0054962 16.4317 0.816434 13.9996 2.36836C11.5678 0.816648 8.7421 -0.00527299 5.85742 2.76604e-05C4.82842 2.76604e-05 3.80292 0.103861 2.79492 0.310361L3.16709 1.80603C4.05326 1.63156 4.95424 1.54326 5.85742 1.54236C8.23839 1.53749 10.5788 2.1587 12.6439 3.34369C10.7968 4.82684 9.32244 6.72175 8.33886 8.87679C7.35528 11.0318 6.88977 13.3872 6.97957 15.7544C7.06937 18.1215 7.712 20.4348 8.85603 22.5092C10.0001 24.5835 11.6137 26.3613 13.5679 27.7002L14.0054 28L14.4406 27.7002C17.5019 25.599 19.6906 22.4502 20.5889 18.8475H20.5854ZM13.2296 25.4975C11.2176 23.7594 9.75753 21.4712 9.02895 18.9142C8.30036 16.3572 8.33506 13.643 9.12876 11.1055C9.9061 12.3994 10.8722 13.5701 11.9953 14.5787C12.3846 14.9295 12.6957 15.3584 12.9084 15.8374C13.1211 16.3164 13.2305 16.8348 13.2296 17.3589V25.4975ZM14.0008 14.231C12.9668 13.4642 12.0465 12.5549 11.2673 11.5302C10.768 10.8742 10.4977 10.0726 10.4977 9.24819C10.4977 8.42383 10.768 7.62221 11.2673 6.96619C12.0464 5.93377 12.9684 5.01733 14.0054 4.24436C15.0554 5.02719 15.9853 5.95703 16.7704 7.00469C17.2529 7.65008 17.5136 8.43424 17.5136 9.24003C17.5136 10.0458 17.2529 10.83 16.7704 11.4754C15.9829 12.5209 15.0503 13.4488 14.0008 14.231ZM14.7696 25.4975V17.3589C14.769 16.8346 14.8788 16.3161 15.0918 15.8371C15.3049 15.3581 15.6165 14.9293 16.0063 14.5787C17.1284 13.5699 18.0938 12.3993 18.8704 11.1055C19.6641 13.643 19.6988 16.3572 18.9702 18.9142C18.2416 21.4712 16.7816 23.7594 14.7696 25.4975Z" fill="#E20C66"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_899_158">
|
||||||
|
<rect width="28" height="28" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
3
public/img/svg/books/2/game-icons_heart-key.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.594 3.89004C17.1877 3.90567 15.8498 4.35977 14.6975 5.08145C12.0705 6.74551 10.5764 9.79532 11.6897 12.3832L12.3537 13.9359L10.801 13.2719C8.6975 12.3637 6.28734 13.184 4.56859 14.932C4.17504 15.3422 3.80883 15.7914 3.49828 16.2797C1.84105 18.9164 1.59887 22.5199 4.78246 25.7035C7.05394 27.9691 11.5237 28.4672 16.0159 28.3598C18.2717 28.3012 20.4983 28.1156 22.4514 27.9984C22.9397 27.9691 23.4084 27.9398 23.8577 27.9203L42.051 46.1137L44.5315 43.6332L44.5217 43.6234L47.7053 40.4496L45.2248 37.9691L42.0412 41.143L40.2444 39.3461L42.3147 37.2758L39.8342 34.7953L37.7639 36.8656L36.1037 35.2055L41.4846 29.8148L39.0041 27.3344L33.6233 32.725L26.3381 25.4398C26.3577 24.9906 26.387 24.5219 26.4162 24.0336C26.5334 22.0805 26.719 19.8539 26.7776 17.5981C26.8752 13.1156 26.387 8.63809 24.1213 6.36563C22.3342 4.57461 20.4006 3.87051 18.594 3.89004Z" fill="#E51E7D"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 984 B |
4
public/img/svg/books/2/icon-park-outline_turn-on.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M21.8752 44.7917C16.9523 42.951 12.8471 36.651 10.7919 32.9615C9.90435 31.3677 10.3721 29.4115 11.796 28.2719C12.5627 27.6588 13.5285 27.35 14.5086 27.4044C15.4887 27.4587 16.4144 27.8726 17.1085 28.5667L18.7502 30.2083V18.2292C18.7502 17.5385 19.0246 16.8761 19.5129 16.3877C20.0013 15.8994 20.6637 15.625 21.3544 15.625C22.045 15.625 22.7074 15.8994 23.1958 16.3877C23.6842 16.8761 23.9585 17.5385 23.9585 18.2292V24.4792C23.9585 23.7885 24.2329 23.1261 24.7213 22.6377C25.2096 22.1494 25.872 21.875 26.5627 21.875C27.2534 21.875 27.9157 22.1494 28.4041 22.6377C28.8925 23.1261 29.1669 23.7885 29.1669 24.4792V26.5625C29.1669 25.8718 29.4412 25.2095 29.9296 24.7211C30.418 24.2327 31.0804 23.9583 31.771 23.9583C32.4617 23.9583 33.1241 24.2327 33.6124 24.7211C34.1008 25.2095 34.3752 25.8718 34.3752 26.5625V28.6458C34.3752 27.9552 34.6496 27.2928 35.1379 26.8044C35.6263 26.316 36.2887 26.0417 36.9794 26.0417C37.67 26.0417 38.3324 26.316 38.8208 26.8044C39.3092 27.2928 39.5835 27.9552 39.5835 28.6458V36.8417C39.5835 37.9562 39.3075 39.0583 38.6648 39.9698C37.5991 41.4792 35.6835 43.7854 33.3335 44.7917C29.6877 46.3542 26.4273 46.4937 21.8752 44.7917Z" stroke="#E51E7D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M12.5 9.37533L15.625 12.5003M19.7917 4.16699L20.8333 10.417M28.125 8.33366L26.0417 11.4587" stroke="#E51E7D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
6
public/img/svg/books/2/icon-park_play-cycle.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4.16699 26.042C4.16699 19.1151 9.78808 13.542 16.667 13.542H45.8337" stroke="#E51E7D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M39.584 7.29199L45.834 13.542L39.584 19.792" stroke="#E51E7D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M45.8337 23.959C45.8337 30.8859 40.2126 36.459 33.3337 36.459H4.16699" stroke="#E51E7D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M10.417 42.709L4.16699 36.459L10.417 30.209" stroke="#E51E7D" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 702 B |
3
public/img/svg/books/2/iconoir_sparks.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16.667 31.2503C26.8232 31.2503 31.2503 26.9774 31.2503 16.667C31.2503 26.9774 35.6462 31.2503 45.8337 31.2503C35.6462 31.2503 31.2503 35.6462 31.2503 45.8337C31.2503 35.6462 26.8232 31.2503 16.667 31.2503ZM4.16699 13.542C10.6962 13.542 13.542 10.7962 13.542 4.16699C13.542 10.7962 16.3691 13.542 22.917 13.542C16.3691 13.542 13.542 16.3691 13.542 22.917C13.542 16.3691 10.6962 13.542 4.16699 13.542Z" stroke="#E51E7D" stroke-width="1.5" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 576 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M2.08301 17.6562C2.08301 14.3924 3.17676 11.6757 5.36426 9.50625C7.55176 7.33681 10.2775 6.25139 13.5413 6.25C15.3469 6.25 17.0656 6.63194 18.6976 7.39583C20.3295 8.15972 21.7358 9.23611 22.9163 10.625C24.0969 9.23611 25.5031 8.15972 27.1351 7.39583C28.767 6.63194 30.4858 6.25 32.2913 6.25C34.7566 6.25 36.8747 6.86667 38.6455 8.1C40.4163 9.33333 41.7531 10.9215 42.6559 12.8646C42.899 13.3854 42.9163 13.9153 42.708 14.4542C42.4997 14.9931 42.1351 15.3833 41.6143 15.625C41.0934 15.8667 40.5636 15.884 40.0247 15.6771C39.4858 15.4701 39.0955 15.1056 38.8538 14.5833C38.2288 13.1944 37.3087 12.1528 36.0934 11.4583C34.8781 10.7639 33.6108 10.4167 32.2913 10.4167C30.6941 10.4167 29.2358 10.8681 27.9163 11.7708C26.5969 12.6736 25.4511 13.7847 24.4788 15.1042C24.3052 15.3819 24.0795 15.5819 23.8018 15.7042C23.524 15.8264 23.2288 15.8861 22.9163 15.8833C22.6038 15.8806 22.3087 15.8111 22.0309 15.675C21.7531 15.5389 21.5275 15.3479 21.3538 15.1021C20.3816 13.7826 19.2358 12.6715 17.9163 11.7688C16.5969 10.866 15.1386 10.4153 13.5413 10.4167C11.5622 10.4167 9.85245 11.1028 8.41217 12.475C6.9719 13.8472 6.25106 15.5736 6.24967 17.6542C6.24967 18.8 6.49273 19.9632 6.97884 21.1438C7.46495 22.3243 8.33301 23.6875 9.58301 25.2333C10.833 26.7792 12.5344 28.5847 14.6872 30.65C16.84 32.7153 19.583 35.2069 22.9163 38.125L27.5518 34.0625C27.9684 33.6806 28.4545 33.5069 29.0101 33.5417C29.5656 33.5764 30.0344 33.7847 30.4163 34.1667C30.833 34.5833 31.033 35.0958 31.0163 35.7042C30.9997 36.3125 30.765 36.8069 30.3122 37.1875L25.6768 41.3021C25.2948 41.6493 24.8608 41.9097 24.3747 42.0833C23.8886 42.2569 23.4025 42.3438 22.9163 42.3438C22.4302 42.3438 21.9441 42.2569 21.458 42.0833C20.9719 41.9097 20.5379 41.6319 20.1559 41.25C18.5934 39.8611 16.7795 38.2812 14.7143 36.5104C12.649 34.7396 10.6781 32.8389 8.80176 30.8083C6.92537 28.7778 5.33717 26.6507 4.03717 24.4271C2.73717 22.2035 2.08579 19.9465 2.08301 17.6562ZM37.4997 29.1667H33.333C32.7427 29.1667 32.2483 28.9667 31.8497 28.5667C31.4511 28.1667 31.2511 27.6722 31.2497 27.0833C31.2483 26.4944 31.4483 26 31.8497 25.6C32.2511 25.2 32.7455 25 33.333 25H37.4997V20.8333C37.4997 20.2431 37.6997 19.7486 38.0997 19.35C38.4997 18.9514 38.9941 18.7514 39.583 18.75C40.1719 18.7486 40.667 18.9486 41.0684 19.35C41.4698 19.7514 41.6691 20.2458 41.6663 20.8333V25H45.833C46.4233 25 46.9184 25.2 47.3184 25.6C47.7184 26 47.9177 26.4944 47.9163 27.0833C47.915 27.6722 47.715 28.1674 47.3163 28.5688C46.9177 28.9701 46.4233 29.1694 45.833 29.1667H41.6663V33.3333C41.6663 33.9236 41.4663 34.4187 41.0663 34.8187C40.6663 35.2187 40.1719 35.4181 39.583 35.4167C38.9941 35.4153 38.4997 35.2153 38.0997 34.8167C37.6997 34.4181 37.4997 33.9236 37.4997 33.3333V29.1667Z" fill="#E51E7D"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
4
public/img/svg/books/2/titles-2/Group (1).svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5.83089 5.83042C5.99967 5.6617 6.22854 5.56692 6.46719 5.56692C6.70584 5.56692 6.93472 5.6617 7.10349 5.83042L9.04209 7.76812L10.9798 5.83042C11.0628 5.74446 11.1621 5.6759 11.2719 5.62873C11.3817 5.58156 11.4998 5.55674 11.6193 5.5557C11.7388 5.55466 11.8573 5.57743 11.9679 5.62268C12.0786 5.66794 12.179 5.73476 12.2635 5.81927C12.3481 5.90377 12.4149 6.00426 12.4601 6.11487C12.5054 6.22547 12.5282 6.34398 12.5271 6.46348C12.5261 6.58299 12.5013 6.70108 12.4541 6.81089C12.4069 6.92069 12.3384 7.02 12.2524 7.10302L10.3147 9.04162L12.2524 10.9793C12.4163 11.1491 12.507 11.3764 12.505 11.6124C12.5029 11.8484 12.4083 12.0741 12.2414 12.241C12.0746 12.4078 11.8488 12.5025 11.6129 12.5045C11.3769 12.5066 11.1495 12.4159 10.9798 12.2519L9.04209 10.3142L7.10349 12.2519C6.9331 12.4119 6.70714 12.4994 6.47342 12.4957C6.2397 12.4921 6.01657 12.3977 5.85123 12.2325C5.68588 12.0673 5.59131 11.8442 5.58752 11.6105C5.58372 11.3768 5.671 11.1507 5.83089 10.9802L7.76859 9.04252L5.83089 7.10392C5.66217 6.93515 5.56738 6.70627 5.56738 6.46762C5.56738 6.22898 5.66217 6.0001 5.83089 5.83132" fill="#E20C66"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M9 0C4.0293 0 0 4.0293 0 9C0 13.9707 4.0293 18 9 18C13.9707 18 18 13.9707 18 9C18 4.0293 13.9707 0 9 0ZM1.8 9C1.8 7.09044 2.55857 5.25909 3.90883 3.90883C5.25909 2.55857 7.09044 1.8 9 1.8C10.9096 1.8 12.7409 2.55857 14.0912 3.90883C15.4414 5.25909 16.2 7.09044 16.2 9C16.2 10.9096 15.4414 12.7409 14.0912 14.0912C12.7409 15.4414 10.9096 16.2 9 16.2C7.09044 16.2 5.25909 15.4414 3.90883 14.0912C2.55857 12.7409 1.8 10.9096 1.8 9Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
4
public/img/svg/books/2/titles-2/Group.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="20" height="22" viewBox="0 0 20 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M10 4.8095C11.0465 4.8095 11.895 3.9565 11.895 2.9045C11.895 1.8525 11.0465 1 10 1C8.9535 1 8.105 1.853 8.105 2.905C8.105 3.957 8.9535 4.8095 10 4.8095ZM2.895 19.095C3.941 19.095 4.7895 18.2425 4.7895 17.1905C4.7895 16.1385 3.941 15.2855 2.8945 15.2855C1.848 15.2855 1 16.139 1 17.191C1 18.243 1.8485 19.096 2.895 19.096V19.095ZM17.105 19.095C18.1515 19.095 19 18.2425 19 17.1905C19 16.1385 18.1515 15.2855 17.105 15.2855C16.0585 15.2855 15.21 16.1385 15.21 17.1905C15.21 18.2425 16.0585 19.0955 17.105 19.0955V19.095Z" stroke="#E20C66" stroke-width="2" stroke-linejoin="round"/>
|
||||||
|
<path d="M14.5715 4.15723C15.9231 4.96 17.0423 6.10099 17.8188 7.46783C18.5953 8.83467 19.0024 10.3802 19 11.9522C19 12.2412 18.9867 12.5264 18.96 12.8077M13.507 20.2877C12.3979 20.7589 11.2051 21.0012 10 21.0002C8.75601 21.0002 7.57101 20.7467 6.49301 20.2877M1.04001 12.8077C1.01312 12.5235 0.999777 12.2382 1.00001 11.9527C0.997583 10.3807 1.40468 8.83517 2.18121 7.46833C2.95774 6.10149 4.07692 4.9605 5.42851 4.15773" stroke="#E20C66" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
3
public/img/svg/books/2/titles-2/Vector (4).svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M15.5129 0C14.6294 0.0202771 13.6059 0.293052 12.9493 0.692317C12.061 1.24414 11.3996 2.09675 11.0954 3.18302C12.2976 3.66967 13.5914 4.76511 14.9384 6.59971C15.595 7.49769 15.9233 8.44395 15.9667 9.28883C15.8847 10.2206 15.7157 11.0703 15.0108 11.5048C17.0337 12.7504 19.2256 12.6249 20.7995 11.6786C21.9099 11.0124 22.7113 9.93094 22.9382 8.57913C23.1651 7.22733 22.8175 5.58102 21.5285 3.76478C19.6408 1.10607 17.4248 0.0255877 15.5129 0ZM9.70017 3.78457C9.08703 3.7783 8.6139 4.04576 8.23249 4.51889C7.17519 5.83207 7.11243 9.07641 9.36222 12.4125L8.6139 12.9194C7.78833 11.6979 7.23312 10.4717 6.91448 9.3178C6.18547 9.7861 5.73165 10.3654 5.72683 11.0462C5.71717 12.1035 6.2241 13.3056 7.04001 14.3098C7.86075 15.314 8.98081 16.1058 10.1009 16.4003C10.6657 16.55 11.1003 16.4244 11.5203 16.0961C11.723 15.9416 11.9113 15.734 12.09 15.4927C11.6217 15.3864 11.1485 15.2223 10.7623 14.9616L11.2403 14.2567C13.1183 15.3237 14.9915 14.556 16.8647 13.1753C15.8219 12.9677 14.7743 12.5042 13.799 11.7462C13.4997 11.7124 13.1907 11.6207 12.8769 11.471C11.9886 11.051 11.0182 10.1868 9.95604 8.74328L10.6851 8.20739C11.6893 9.57851 12.5824 10.3317 13.2631 10.6551C13.9439 10.9786 14.3446 10.9013 14.6246 10.6744C14.9046 10.4524 15.0977 9.97922 15.0639 9.33711C15.035 8.69018 14.7694 7.90323 14.2094 7.1356C12.8045 5.21893 11.501 4.23887 10.4871 3.9212C10.2216 3.8512 9.94156 3.78892 9.70017 3.78457ZM4.93505 13.2622L4.09018 13.576C4.68883 15.2175 6.59102 16.4775 8.58976 16.7624C7.32002 15.7678 5.52888 14.7009 4.93505 13.2622ZM3.18205 15.0195L2.33476 15.3285C2.99714 17.1341 5.22956 18.4859 7.44072 18.5728L7.47934 17.67C5.63027 17.5976 3.65325 16.3037 3.18205 15.0195ZM1.4276 16.772L0.580311 17.081C1.2427 18.8915 3.47511 20.2385 5.6882 20.3302L5.72683 19.4274C4.095 19.0653 2.00453 18.1818 1.4276 16.772ZM0 19.1377V20.4895C1.0211 21.4116 2.47622 22.0248 3.93568 22.0827L3.96948 21.1799C2.48105 20.895 0.811566 20.2336 0 19.1377ZM0 22.3434V23H2.33283C1.47926 22.8986 0.653694 22.6814 0 22.3434Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
3
public/img/svg/books/2/titles-2/Vector (6).svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M6 9C6.28333 9 6.521 8.904 6.713 8.712C6.905 8.52 7.00067 8.28267 7 8C6.99933 7.71733 6.90333 7.48 6.712 7.288C6.52067 7.096 6.28333 7 6 7C5.71667 7 5.47933 7.096 5.288 7.288C5.09667 7.48 5.00067 7.71733 5 8C4.99933 8.28267 5.09533 8.52033 5.288 8.713C5.48067 8.90567 5.718 9.00133 6 9ZM10 9C10.2833 9 10.521 8.904 10.713 8.712C10.905 8.52 11.0007 8.28267 11 8C10.9993 7.71733 10.9033 7.48 10.712 7.288C10.5207 7.096 10.2833 7 10 7C9.71667 7 9.47933 7.096 9.288 7.288C9.09667 7.48 9.00067 7.71733 9 8C8.99933 8.28267 9.09533 8.52033 9.288 8.713C9.48067 8.90567 9.718 9.00133 10 9ZM14 9C14.2833 9 14.521 8.904 14.713 8.712C14.905 8.52 15.0007 8.28267 15 8C14.9993 7.71733 14.9033 7.48 14.712 7.288C14.5207 7.096 14.2833 7 14 7C13.7167 7 13.4793 7.096 13.288 7.288C13.0967 7.48 13.0007 7.71733 13 8C12.9993 8.28267 13.0953 8.52033 13.288 8.713C13.4807 8.90567 13.718 9.00133 14 9ZM0 20V2C0 1.45 0.196 0.979333 0.588 0.588C0.98 0.196667 1.45067 0.000666667 2 0H18C18.55 0 19.021 0.196 19.413 0.588C19.805 0.98 20.0007 1.45067 20 2V14C20 14.55 19.8043 15.021 19.413 15.413C19.0217 15.805 18.5507 16.0007 18 16H4L0 20ZM3.15 14H18V2H2V15.125L3.15 14Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
3
public/img/svg/books/2/titles-2/Vector (7).svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="16" height="21" viewBox="0 0 16 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M14.6344 0H10.8844C10.586 0 10.2999 0.118526 10.0889 0.329505C9.87791 0.540483 9.75939 0.826631 9.75939 1.125C9.75939 1.42337 9.87791 1.70952 10.0889 1.9205C10.2999 2.13147 10.586 2.25 10.8844 2.25H11.9156L10.4494 3.71906C9.69859 3.09516 8.81454 2.65201 7.8654 2.42379C6.91626 2.19557 5.92739 2.18837 4.97503 2.40274C4.02267 2.61712 3.13226 3.04734 2.37246 3.66024C1.61265 4.27314 1.00375 5.05235 0.592706 5.93778C0.181658 6.82321 -0.020558 7.79122 0.00165012 8.76715C0.0238583 9.74309 0.269897 10.7009 0.720796 11.5667C1.17169 12.4325 1.81541 13.1832 2.6023 13.7609C3.3892 14.3386 4.29826 14.7279 5.25938 14.8988V16.125H3.38438C3.08602 16.125 2.79987 16.2435 2.58889 16.4545C2.37791 16.6655 2.25938 16.9516 2.25938 17.25C2.25938 17.5484 2.37791 17.8345 2.58889 18.0455C2.79987 18.2565 3.08602 18.375 3.38438 18.375H5.25938V19.875C5.25938 20.1734 5.37791 20.4595 5.58889 20.6705C5.79987 20.8815 6.08602 21 6.38439 21C6.68275 21 6.9689 20.8815 7.17988 20.6705C7.39086 20.4595 7.50939 20.1734 7.50939 19.875V18.375H9.38439C9.68275 18.375 9.9689 18.2565 10.1799 18.0455C10.3909 17.8345 10.5094 17.5484 10.5094 17.25C10.5094 16.9516 10.3909 16.6655 10.1799 16.4545C9.9689 16.2435 9.68275 16.125 9.38439 16.125H7.50939V14.8988C8.51622 14.7192 9.465 14.2997 10.2755 13.6759C11.0859 13.0521 11.7342 12.2423 12.1655 11.3149C12.5968 10.3876 12.7984 9.37001 12.7533 8.34828C12.7082 7.32654 12.4176 6.33071 11.9063 5.445L13.5094 3.84375V4.875C13.5094 5.17337 13.6279 5.45952 13.8389 5.6705C14.0499 5.88147 14.336 6 14.6344 6C14.9328 6 15.2189 5.88147 15.4299 5.6705C15.6409 5.45952 15.7594 5.17337 15.7594 4.875V1.125C15.7594 0.826631 15.6409 0.540483 15.4299 0.329505C15.2189 0.118526 14.9328 0 14.6344 0ZM6.38439 12.75C5.56854 12.75 4.77101 12.5081 4.09266 12.0548C3.4143 11.6016 2.88559 10.9573 2.57338 10.2036C2.26117 9.44982 2.17948 8.62042 2.33865 7.82025C2.49781 7.02008 2.89068 6.28508 3.46757 5.70818C4.04446 5.13129 4.77947 4.73843 5.57964 4.57926C6.37981 4.4201 7.20921 4.50179 7.96295 4.814C8.7167 5.12621 9.36094 5.65492 9.8142 6.33327C10.2675 7.01163 10.5094 7.80915 10.5094 8.625C10.5081 9.71864 10.0731 10.7671 9.29983 11.5404C8.52651 12.3138 7.47802 12.7488 6.38439 12.75Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
3
public/img/svg/books/2/titles-2/Vector (8).svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="18" height="20" viewBox="0 0 18 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M0 16.5V3C0 2.20435 0.316071 1.44129 0.87868 0.87868C1.44129 0.316071 2.20435 0 3 0H17C17.2652 0 17.5196 0.105357 17.7071 0.292893C17.8946 0.48043 18 0.734784 18 1V19C18 19.2652 17.8946 19.5196 17.7071 19.7071C17.5196 19.8946 17.2652 20 17 20H3.5C2.57174 20 1.6815 19.6313 1.02513 18.9749C0.368749 18.3185 0 17.4283 0 16.5ZM16 18V15H3.5C3.10218 15 2.72064 15.158 2.43934 15.4393C2.15804 15.7206 2 16.1022 2 16.5C2 16.8978 2.15804 17.2794 2.43934 17.5607C2.72064 17.842 3.10218 18 3.5 18H16ZM2 13.337C2.46884 13.1149 2.9812 12.9998 3.5 13H16V2H3C2.73478 2 2.48043 2.10536 2.29289 2.29289C2.10536 2.48043 2 2.73478 2 3V13.337Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 755 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="27" height="27" viewBox="0 0 27 27" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M13.6125 20.8687L13.5 20.9812L13.3763 20.8687C8.0325 16.02 4.5 12.8138 4.5 9.5625C4.5 7.3125 6.1875 5.625 8.4375 5.625C10.17 5.625 11.8575 6.75 12.4537 8.28H14.5463C15.1425 6.75 16.83 5.625 18.5625 5.625C20.8125 5.625 22.5 7.3125 22.5 9.5625C22.5 12.8138 18.9675 16.02 13.6125 20.8687ZM18.5625 3.375C16.605 3.375 14.7262 4.28625 13.5 5.715C12.2738 4.28625 10.395 3.375 8.4375 3.375C4.9725 3.375 2.25 6.08625 2.25 9.5625C2.25 13.8038 6.075 17.28 11.8688 22.5338L13.5 24.0188L15.1312 22.5338C20.925 17.28 24.75 13.8038 24.75 9.5625C24.75 6.08625 22.0275 3.375 18.5625 3.375Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 703 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.7097 2.83729C20.4427 2.98429 21.0157 3.55729 21.1627 4.29029C21.2674 4.8155 21.2523 5.35757 21.1185 5.87613C20.9846 6.39468 20.7355 6.87636 20.3897 7.28529L17.6387 10.5373L19.5827 17.6683C19.6407 17.8809 19.6415 18.1051 19.585 18.3181C19.5284 18.5312 19.4166 18.7254 19.2607 18.8813L17.9587 20.1833C17.8482 20.2938 17.7134 20.3771 17.5652 20.4267C17.417 20.4764 17.2592 20.4909 17.1044 20.4692C16.9496 20.4474 16.8019 20.3901 16.6731 20.3016C16.5442 20.2131 16.4376 20.096 16.3617 19.9593L13.4197 14.6633L10.5617 17.0443L10.7717 18.0973C10.8123 18.2992 10.8025 18.5079 10.743 18.7051C10.6835 18.9022 10.5762 19.0816 10.4307 19.2273L8.76672 20.8903C8.65352 21.0033 8.51509 21.0878 8.36283 21.1369C8.21056 21.186 8.04883 21.1982 7.89093 21.1725C7.73304 21.1468 7.5835 21.084 7.45463 20.9892C7.32577 20.8944 7.22126 20.7704 7.14972 20.6273L5.88972 18.1103L3.37372 16.8503C3.23064 16.7787 3.1066 16.6742 3.01181 16.5454C2.91703 16.4165 2.85421 16.267 2.82853 16.1091C2.80285 15.9512 2.81504 15.7894 2.8641 15.6372C2.91316 15.4849 2.99769 15.3465 3.11072 15.2333L4.77472 13.5693C4.92031 13.4239 5.09953 13.3168 5.29647 13.2573C5.49342 13.1978 5.702 13.1878 5.90372 13.2283L6.95672 13.4383L9.33772 10.5813L4.04172 7.63829C3.90505 7.56239 3.78787 7.45581 3.69939 7.32694C3.61092 7.19806 3.55356 7.0504 3.53185 6.89559C3.51014 6.74078 3.52465 6.58305 3.57426 6.4348C3.62386 6.28656 3.7072 6.15185 3.81772 6.04129L5.11972 4.73929C5.27557 4.58344 5.46985 4.47157 5.68288 4.41502C5.8959 4.35847 6.12009 4.35926 6.33272 4.41729L13.4627 6.36129L16.7157 3.61029C17.1246 3.26446 17.6063 3.01535 18.1249 2.88151C18.6434 2.74768 19.1855 2.73256 19.7107 2.83729H19.7097ZM19.2177 4.78229C19.0023 4.75371 18.7834 4.77044 18.5748 4.8314C18.3663 4.89236 18.1728 4.99621 18.0067 5.13629L14.3567 8.22529C14.2316 8.33102 14.0827 8.40475 13.9228 8.44012C13.7629 8.47548 13.5967 8.47142 13.4387 8.42829L6.22572 6.46029L6.15872 6.52629L11.3537 9.41229C11.4837 9.48448 11.5961 9.58447 11.6829 9.70512C11.7698 9.82576 11.8289 9.9641 11.8562 10.1102C11.8834 10.2564 11.878 10.4067 11.8404 10.5506C11.8028 10.6944 11.734 10.8281 11.6387 10.9423L8.11472 15.1703C7.99836 15.31 7.84645 15.4157 7.67502 15.4762C7.50359 15.5368 7.319 15.5499 7.14072 15.5143L5.90372 15.2673L5.49572 15.6753L7.05272 16.4543C7.26563 16.5607 7.43827 16.7334 7.54472 16.9463L8.32472 18.5033L8.73172 18.0953L8.48472 16.8583C8.44908 16.68 8.46223 16.4954 8.52278 16.324C8.58333 16.1526 8.68902 16.0006 8.82872 15.8843L13.0577 12.3603C13.1719 12.265 13.3056 12.1962 13.4494 12.1586C13.5933 12.121 13.7436 12.1156 13.8898 12.1428C14.0359 12.1701 14.1742 12.2292 14.2949 12.3161C14.4155 12.4029 14.5155 12.5153 14.5877 12.6453L17.4727 17.8403L17.5387 17.7733L15.5717 10.5603C15.5287 10.4022 15.5248 10.236 15.5604 10.0761C15.5959 9.91617 15.6698 9.76728 15.7757 9.64229L18.8637 5.99229C19.1487 5.65529 19.2757 5.21629 19.2177 4.78229Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
3
public/img/svg/books/2/titles-2/octicon_law-24.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11.6873 2.52051V4.12467H13.4977C13.8194 4.12467 14.1338 4.22184 14.3997 4.40242L15.9553 5.46026C15.9938 5.48592 16.0365 5.49906 16.0836 5.49967H19.8438C20.0261 5.49967 20.201 5.57211 20.3299 5.70104C20.4588 5.82997 20.5313 6.00484 20.5313 6.18717C20.5313 6.36951 20.4588 6.54438 20.3299 6.67331C20.201 6.80224 20.0261 6.87467 19.8438 6.87467H18.3973L21.4828 13.9147C21.5445 14.0554 21.5573 14.2128 21.5191 14.3617C21.4808 14.5106 21.3938 14.6424 21.2719 14.736C21.1803 14.8038 21.0855 14.8668 20.9878 14.9248C20.7557 15.0644 20.5137 15.1867 20.2636 15.2906C19.4345 15.6373 18.5443 15.8147 17.6456 15.8122C16.7471 15.8161 15.8571 15.639 15.0285 15.2915C14.7784 15.1873 14.5364 15.0647 14.3043 14.9248C14.2068 14.8689 14.1129 14.8071 14.0229 14.7397L14.0183 14.736C13.8964 14.6424 13.8094 14.5106 13.7712 14.3617C13.733 14.2128 13.7458 14.0554 13.8075 13.9147L16.8948 6.87467H16.0827C15.7609 6.87467 15.4465 6.77751 15.1807 6.59692L13.6251 5.53909C13.5872 5.51344 13.5425 5.49971 13.4968 5.49967H11.6873V18.7913H15.8003C15.9827 18.7913 16.1575 18.8638 16.2865 18.9927C16.4154 19.1216 16.4878 19.2965 16.4878 19.4788C16.4878 19.6612 16.4154 19.836 16.2865 19.965C16.1575 20.0939 15.9827 20.1663 15.8003 20.1663H6.19918C6.01684 20.1663 5.84197 20.0939 5.71304 19.965C5.58411 19.836 5.51168 19.6612 5.51168 19.4788C5.51168 19.2965 5.58411 19.1216 5.71304 18.9927C5.84197 18.8638 6.01684 18.7913 6.19918 18.7913H10.3123V5.49967H8.50184C8.45609 5.49971 8.4114 5.51344 8.37351 5.53909L6.81884 6.59692C6.55301 6.77751 6.23859 6.87467 5.91684 6.87467H5.10468L8.19201 13.9147C8.25177 14.0514 8.26539 14.2039 8.23083 14.3491C8.19627 14.4943 8.1154 14.6243 8.00043 14.7195C7.92709 14.7791 7.85376 14.835 7.71626 14.9239C7.48457 15.0743 7.24188 15.207 6.99026 15.3208C6.16256 15.6976 5.26334 15.8915 4.35393 15.8892C3.44451 15.8915 2.5453 15.6976 1.71759 15.3208C1.46597 15.207 1.22329 15.0743 0.991594 14.9239C0.894023 14.8609 0.799499 14.7933 0.708344 14.7213C0.59405 14.6253 0.513647 14.495 0.478989 14.3498C0.444331 14.2045 0.457251 14.052 0.515844 13.9147L3.60226 6.87467H2.15668C1.97434 6.87467 1.79947 6.80224 1.67054 6.67331C1.54161 6.54438 1.46918 6.36951 1.46918 6.18717C1.46918 6.00484 1.54161 5.82997 1.67054 5.70104C1.79947 5.57211 1.97434 5.49967 2.15668 5.49967H5.91684C5.96329 5.49967 6.00637 5.48654 6.04609 5.46026L7.59984 4.40242C7.86568 4.22092 8.18101 4.12467 8.50276 4.12467H10.3123V2.52051C10.3123 2.33817 10.3847 2.1633 10.5136 2.03437C10.6426 1.90544 10.8174 1.83301 10.9998 1.83301C11.1821 1.83301 11.357 1.90544 11.4859 2.03437C11.6148 2.1633 11.6873 2.33817 11.6873 2.52051ZM2.01001 13.9312C2.73127 14.3158 3.53655 14.5157 4.35393 14.5133C5.17131 14.5157 5.97658 14.3158 6.69784 13.9312L4.35393 8.58701L2.01001 13.9312ZM15.3108 13.9092C15.386 13.9458 15.47 13.9843 15.5629 14.0247C16.0488 14.2291 16.7592 14.4372 17.6456 14.4372C18.4537 14.4393 19.2518 14.2588 19.9803 13.9092L17.6456 8.58609L15.3108 13.9092Z" fill="#E20C66"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
4
public/img/svg/books/book-formats.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg width="24" height="33" viewBox="0 0 24 33" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M5.19223 17.578H4.30762V15.3809H5.19223C5.42685 15.3809 5.65185 15.4966 5.81775 15.7026C5.98365 15.9086 6.07685 16.1881 6.07685 16.4794C6.07685 16.7708 5.98365 17.0502 5.81775 17.2562C5.65185 17.4622 5.42685 17.578 5.19223 17.578ZM11.3845 21.9722V15.3809H12.2692C12.5038 15.3809 12.7288 15.4966 12.8947 15.7026C13.0606 15.9086 13.1538 16.1881 13.1538 16.4794V20.8737C13.1538 21.165 13.0606 21.4444 12.8947 21.6504C12.7288 21.8565 12.5038 21.9722 12.2692 21.9722H11.3845Z" fill="#C01F64"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.769531 3.29567C0.769531 2.42161 1.04913 1.58334 1.54682 0.965281C2.04452 0.347222 2.71953 0 3.42338 0L17.9435 0L23.7695 7.2351V29.6611C23.7695 30.5351 23.4899 31.3734 22.9922 31.9915C22.4945 32.6095 21.8195 32.9567 21.1157 32.9567H3.42338C2.71953 32.9567 2.04452 32.6095 1.54682 31.9915C1.04913 31.3734 0.769531 30.5351 0.769531 29.6611V3.29567ZM5.19261 13.1827H2.53876V24.1683H4.30799V19.774H5.19261C5.89645 19.774 6.57147 19.4268 7.06916 18.8088C7.56685 18.1907 7.84645 17.3524 7.84645 16.4784C7.84645 15.6043 7.56685 14.766 7.06916 14.148C6.57147 13.5299 5.89645 13.1827 5.19261 13.1827ZM12.2695 13.1827H9.61568V24.1683H12.2695C12.9734 24.1683 13.6484 23.8211 14.1461 23.203C14.6438 22.5849 14.9234 21.7467 14.9234 20.8726V16.4784C14.9234 15.6043 14.6438 14.766 14.1461 14.148C13.6484 13.5299 12.9734 13.1827 12.2695 13.1827ZM16.6926 24.1683V13.1827H22.0003V15.3798H18.4618V17.5769H20.2311V19.774H18.4618V24.1683H16.6926Z" fill="#C01F64"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
3
public/img/svg/books/book-illustrations.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="24" height="31" viewBox="0 0 24 31" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.862 1.01361C10.4118 0.54615 9.85883 0.301357 9.29362 0.319278H3.26314C2.93561 0.31897 2.61125 0.406925 2.30861 0.578112C2.00597 0.749299 1.73099 1.00036 1.49939 1.31693C1.26779 1.63351 1.08412 2.00939 0.958888 2.42307C0.833653 2.83675 0.769307 3.28013 0.769532 3.72783V27.23C0.770437 28.1336 1.03345 28.9999 1.50089 29.6389C1.96834 30.2778 2.60207 30.6373 3.26314 30.6386H21.2759C21.937 30.6373 22.5707 30.2778 23.0382 29.6389C23.5056 28.9999 23.7686 28.1336 23.7695 27.23V8.20711C23.7686 7.30348 23.5056 6.43722 23.0382 5.79826C22.5707 5.1593 21.937 4.79979 21.2759 4.79856H12.119L11.7735 2.91193C11.6367 2.15634 11.3151 1.48504 10.862 1.01361ZM17.161 16.801C16.4806 16.801 15.828 16.4315 15.3469 15.7739C14.8658 15.1162 14.5955 14.2243 14.5955 13.2942C14.5955 12.3642 14.8658 11.4722 15.3469 10.8146C15.828 10.1569 16.4806 9.78748 17.161 9.78748C17.8414 9.78748 18.4939 10.1569 18.975 10.8146C19.4561 11.4722 19.7264 12.3642 19.7264 13.2942C19.7264 14.2243 19.4561 15.1162 18.975 15.7739C18.4939 16.4315 17.8414 16.801 17.161 16.801ZM9.81013 15.9804L19.1586 27.7163H3.26314C3.16906 27.7151 3.0791 27.6634 3.01258 27.5725C2.94605 27.4816 2.90829 27.3586 2.9074 27.23V21.3925L8.52399 15.9804C8.7056 15.778 8.93274 15.6674 9.16706 15.6674C9.40139 15.6674 9.62853 15.778 9.81013 15.9804Z" fill="#C01F64"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
14
public/img/svg/books/book-pages.svg
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<svg width="31" height="28" viewBox="0 0 31 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M24.3585 3.16504H7.69186C6.1457 3.16504 3.8457 4.05678 3.8457 6.51325V22.1383C3.8457 24.5947 6.1457 25.4865 7.69186 25.4865H26.9226V23.2543H7.70724C7.11493 23.2409 6.40981 23.0378 6.40981 22.1383C6.40981 22.0255 6.42134 21.9251 6.44058 21.8336C6.58416 21.1907 7.18929 21.0333 7.70724 21.0222H26.9226V5.39718C26.9226 4.80518 26.6525 4.23743 26.1716 3.81882C25.6908 3.40021 25.0386 3.16504 24.3585 3.16504ZM24.3585 13.2097L21.7944 12.0936L19.2303 13.2097V5.39718H24.3585V13.2097Z" fill="url(#paint0_linear_868_364)"/>
|
||||||
|
<path d="M24.3585 3.16504H7.69186C6.1457 3.16504 3.8457 4.05678 3.8457 6.51325V22.1383C3.8457 24.5947 6.1457 25.4865 7.69186 25.4865H26.9226V23.2543H7.70724C7.11493 23.2409 6.40981 23.0378 6.40981 22.1383C6.40981 22.0255 6.42134 21.9251 6.44058 21.8336C6.58416 21.1907 7.18929 21.0333 7.70724 21.0222H26.9226V5.39718C26.9226 4.80518 26.6525 4.23743 26.1716 3.81882C25.6908 3.40021 25.0386 3.16504 24.3585 3.16504ZM24.3585 13.2097L21.7944 12.0936L19.2303 13.2097V5.39718H24.3585V13.2097Z" fill="url(#paint1_radial_868_364)" fill-opacity="0.2"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_868_364" x1="15.3842" y1="34.2754" x2="15.3842" y2="-25.1728" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#E20C66"/>
|
||||||
|
<stop offset="1" stop-color="#E20C66" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient id="paint1_radial_868_364" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(15.3842 14.3258) rotate(50.5894) scale(14.4454 118.907)">
|
||||||
|
<stop stop-color="#EE70A4"/>
|
||||||
|
<stop offset="1" stop-color="#FF33AD"/>
|
||||||
|
</radialGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
3
public/img/svg/books/download.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="46" height="46" viewBox="0 0 46 46" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M23.147 34.2992L11.6706 22.8262L13.9666 20.4913L21.5256 28.0503V0H24.7684V28.0503L32.3241 20.4946L34.6233 22.8262L23.147 34.2992ZM5.68765 45.3994C4.1938 45.3994 2.94747 44.9 1.94869 43.9012C0.949901 42.9024 0.449428 41.655 0.447266 40.159V32.3017H3.69008V40.159C3.69008 40.6584 3.89762 41.1167 4.3127 41.534C4.72778 41.9512 5.18501 42.1587 5.68441 42.1566H40.6095C41.1067 42.1566 41.564 41.949 41.9812 41.534C42.3985 41.1189 42.606 40.6606 42.6038 40.159V32.3017H45.8466V40.159C45.8466 41.6529 45.3473 42.8992 44.3485 43.898C43.3497 44.8968 42.1023 45.3972 40.6063 45.3994H5.68765Z" fill="white"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 710 B |
10
public/img/svg/books/read.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<svg width="63" height="45" viewBox="0 0 63 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4.60144 7.38058C8.04021 6.15329 12.9711 4.8298 17.7659 4.41849C22.9338 3.97401 27.3168 4.62746 29.858 6.91288V39.2405C26.2249 37.4825 21.6205 37.2404 17.3735 37.6052C12.7884 38.0033 8.16455 39.1344 4.60144 40.2953V7.38058ZM33.7436 6.91288C36.2848 4.62746 40.6678 3.97401 45.8356 4.41849C50.6305 4.8298 55.5613 6.15329 59.0001 7.38058V40.2953C55.4331 39.1344 50.8131 38 46.2281 37.6086C41.9772 37.2404 37.3766 37.4792 33.7436 39.2405V6.91288ZM31.8008 3.9143C27.9734 1.10479 22.4248 0.686844 17.3735 1.11806C11.4906 1.62556 5.55342 3.34709 1.85431 4.78336C1.51489 4.91514 1.22707 5.12751 1.0252 5.39513C0.823323 5.66274 0.715924 5.9743 0.71582 6.2926V42.7798C0.71591 43.0573 0.797563 43.3303 0.953298 43.5739C1.10903 43.8175 1.33387 44.0238 1.60722 44.174C1.88057 44.3242 2.19369 44.4134 2.51791 44.4335C2.84212 44.4536 3.16705 44.4039 3.46295 44.289C6.89007 42.9622 12.4115 41.3667 17.762 40.9057C23.2369 40.4347 27.8258 41.1942 30.2854 43.8147C30.4674 44.0084 30.6981 44.1647 30.9604 44.2721C31.2227 44.3796 31.5099 44.4353 31.8008 44.4353C32.0917 44.4353 32.3789 44.3796 32.6412 44.2721C32.9034 44.1647 33.1341 44.0084 33.3162 43.8147C35.7758 41.1942 40.3647 40.4347 45.8356 40.9057C51.19 41.3667 56.7154 42.9622 60.1386 44.289C60.4345 44.4039 60.7594 44.4536 61.0836 44.4335C61.4079 44.4134 61.721 44.3242 61.9943 44.174C62.2677 44.0238 62.4925 43.8175 62.6483 43.5739C62.804 43.3303 62.8856 43.0573 62.8857 42.7798V6.2926C62.8856 5.9743 62.7782 5.66274 62.5764 5.39513C62.3745 5.12751 62.0867 4.91514 61.7472 4.78336C58.0481 3.34709 52.1109 1.62556 46.2281 1.11806C41.1768 0.683527 35.6281 1.10479 31.8008 3.9143Z" fill="white"/>
|
||||||
|
<path d="M4.60144 7.38058C8.04021 6.15329 12.9711 4.8298 17.7659 4.41849C22.9338 3.97401 27.3168 4.62746 29.858 6.91288V39.2405C26.2249 37.4825 21.6205 37.2404 17.3735 37.6052C12.7884 38.0033 8.16455 39.1344 4.60144 40.2953V7.38058ZM33.7436 6.91288C36.2848 4.62746 40.6678 3.97401 45.8356 4.41849C50.6305 4.8298 55.5613 6.15329 59.0001 7.38058V40.2953C55.4331 39.1344 50.8131 38 46.2281 37.6086C41.9772 37.2404 37.3766 37.4792 33.7436 39.2405V6.91288ZM31.8008 3.9143C27.9734 1.10479 22.4248 0.686844 17.3735 1.11806C11.4906 1.62556 5.55342 3.34709 1.85431 4.78336C1.51489 4.91514 1.22707 5.12751 1.0252 5.39513C0.823323 5.66274 0.715924 5.9743 0.71582 6.2926V42.7798C0.71591 43.0573 0.797563 43.3303 0.953298 43.5739C1.10903 43.8175 1.33387 44.0238 1.60722 44.174C1.88057 44.3242 2.19369 44.4134 2.51791 44.4335C2.84212 44.4536 3.16705 44.4039 3.46295 44.289C6.89007 42.9622 12.4115 41.3667 17.762 40.9057C23.2369 40.4347 27.8258 41.1942 30.2854 43.8147C30.4674 44.0084 30.6981 44.1647 30.9604 44.2721C31.2227 44.3796 31.5099 44.4353 31.8008 44.4353C32.0917 44.4353 32.3789 44.3796 32.6412 44.2721C32.9034 44.1647 33.1341 44.0084 33.3162 43.8147C35.7758 41.1942 40.3647 40.4347 45.8356 40.9057C51.19 41.3667 56.7154 42.9622 60.1386 44.289C60.4345 44.4039 60.7594 44.4536 61.0836 44.4335C61.4079 44.4134 61.721 44.3242 61.9943 44.174C62.2677 44.0238 62.4925 43.8175 62.6483 43.5739C62.804 43.3303 62.8856 43.0573 62.8857 42.7798V6.2926C62.8856 5.9743 62.7782 5.66274 62.5764 5.39513C62.3745 5.12751 62.0867 4.91514 61.7472 4.78336C58.0481 3.34709 52.1109 1.62556 46.2281 1.11806C41.1768 0.683527 35.6281 1.10479 31.8008 3.9143Z" fill="url(#paint0_radial_984_378)" fill-opacity="0.2"/>
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="paint0_radial_984_378" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(31.8008 22.7048) rotate(41.336) scale(32.9053 273.844)">
|
||||||
|
<stop stop-color="#EE70A4"/>
|
||||||
|
<stop offset="1" stop-color="#FF33AD"/>
|
||||||
|
</radialGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
3
public/img/svg/books/ruble.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="29" height="42" viewBox="0 0 29 42" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M17.3499 26.5879C20.1816 26.5879 22.8973 25.1873 24.8996 22.6942C26.9019 20.2011 28.0268 16.8197 28.0268 13.294C28.0268 9.76818 26.9019 6.38681 24.8996 3.89371C22.8973 1.40061 20.1816 0 17.3499 0H7.34035C6.80941 0 6.30022 0.262614 5.92478 0.730071C5.54935 1.19753 5.33844 1.83153 5.33844 2.49262V21.6027H2.00191C1.47097 21.6027 0.961779 21.8653 0.586347 22.3328C0.210915 22.8002 0 23.4342 0 24.0953C0 24.7564 0.210915 25.3904 0.586347 25.8578C0.961779 26.3253 1.47097 26.5879 2.00191 26.5879H5.33844V29.9114H2.00191C1.47097 29.9114 0.961779 30.174 0.586347 30.6415C0.210915 31.1089 0 31.7429 0 32.404C0 33.0651 0.210915 33.6991 0.586347 34.1666C0.961779 34.634 1.47097 34.8966 2.00191 34.8966H5.33844V39.051C5.33844 39.7121 5.54935 40.3461 5.92478 40.8136C6.30022 41.281 6.80941 41.5436 7.34035 41.5436C7.87129 41.5436 8.38049 41.281 8.75592 40.8136C9.13135 40.3461 9.34227 39.7121 9.34227 39.051V34.8966H16.6826C17.2136 34.8966 17.7228 34.634 18.0982 34.1666C18.4736 33.6991 18.6845 33.0651 18.6845 32.404C18.6845 31.7429 18.4736 31.1089 18.0982 30.6415C17.7228 30.174 17.2136 29.9114 16.6826 29.9114H9.34227V26.5879H17.3499ZM9.34227 4.98523H17.3499C19.1197 4.98523 20.817 5.86062 22.0685 7.4188C23.3199 8.97699 24.023 11.0903 24.023 13.294C24.023 15.4976 23.3199 17.6109 22.0685 19.1691C20.817 20.7273 19.1197 21.6027 17.3499 21.6027H9.34227V4.98523Z" fill="white"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
4
public/img/svg/books/titles.svg
Normal file
After Width: | Height: | Size: 13 KiB |
21
public/img/svg/ellipse1.svg
Normal file
After Width: | Height: | Size: 383 KiB |
21
public/img/svg/ellipse2.svg
Normal file
After Width: | Height: | Size: 374 KiB |
21
public/img/svg/ellipse3.svg
Normal file
After Width: | Height: | Size: 390 KiB |
21
public/img/svg/ellipse4.svg
Normal file
After Width: | Height: | Size: 405 KiB |
21
public/img/svg/ellipse5.svg
Normal file
After Width: | Height: | Size: 410 KiB |
21
public/img/svg/ellipse6.svg
Normal file
After Width: | Height: | Size: 436 KiB |
BIN
public/img/webp/books/1.webp
Normal file
After Width: | Height: | Size: 247 KiB |
BIN
public/img/webp/books/2.webp
Normal file
After Width: | Height: | Size: 281 KiB |
BIN
public/img/webp/meetingAlone.webp
Normal file
After Width: | Height: | Size: 49 KiB |
@ -10,4 +10,29 @@
|
|||||||
<changefreq>daily</changefreq>
|
<changefreq>daily</changefreq>
|
||||||
<priority>0.9</priority>
|
<priority>0.9</priority>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ebook.miduway.space/privacy/</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.8</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ebook.miduway.space/books/1/</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ebook.miduway.space/books/2/</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.7</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ebook.miduway.space/books/1/title-1</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://ebook.miduway.space/books/2/title-2</loc>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
</urlset>
|
</urlset>
|
34
src/App.vue
@ -1,30 +1,10 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import HelloWorld from './components/HelloWorld.vue'
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<UiLayout>
|
||||||
<a href="https://vite.dev" target="_blank">
|
<RouterView />
|
||||||
<img src="/vite.svg" class="logo" alt="Vite logo" />
|
</UiLayout>
|
||||||
</a>
|
|
||||||
<a href="https://vuejs.org/" target="_blank">
|
|
||||||
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<HelloWorld msg="Vite + Vue" />
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<script setup lang="ts">
|
||||||
.logo {
|
import UiLayout from './layout/UiLayout.vue'
|
||||||
height: 6em;
|
import { RouterView } from 'vue-router'
|
||||||
padding: 1.5em;
|
</script>
|
||||||
will-change: filter;
|
|
||||||
transition: filter 300ms;
|
|
||||||
}
|
|
||||||
.logo:hover {
|
|
||||||
filter: drop-shadow(0 0 2em #646cffaa);
|
|
||||||
}
|
|
||||||
.logo.vue:hover {
|
|
||||||
filter: drop-shadow(0 0 2em #42b883aa);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
BIN
src/assets/img/png/bg.png
Normal file
After Width: | Height: | Size: 77 KiB |
BIN
src/assets/img/png/shadow.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
src/assets/img/webp/footer-flowers.webp
Normal file
After Width: | Height: | Size: 206 KiB |
BIN
src/assets/img/webp/gradient.webp
Normal file
After Width: | Height: | Size: 251 KiB |
BIN
src/assets/img/webp/group-flowers.webp
Normal file
After Width: | Height: | Size: 409 KiB |
BIN
src/assets/img/webp/header-flowers-1.webp
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
src/assets/img/webp/header-flowers-2.webp
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
src/assets/img/webp/header-flowers-3.webp
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
src/assets/img/webp/header-flowers-4.webp
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
src/assets/img/webp/hero-banner-content.webp
Normal file
After Width: | Height: | Size: 613 KiB |
BIN
src/assets/img/webp/hero-flowers.webp
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
src/assets/img/webp/vino-galante.webp
Normal file
After Width: | Height: | Size: 21 KiB |
@ -1,38 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { ref } from 'vue'
|
|
||||||
|
|
||||||
defineProps<{ msg: string }>()
|
|
||||||
|
|
||||||
const count = ref(0)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<h1>{{ msg }}</h1>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<button type="button" @click="count++">count is {{ count }}</button>
|
|
||||||
<p>
|
|
||||||
Edit
|
|
||||||
<code>components/HelloWorld.vue</code> to test HMR
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Check out
|
|
||||||
<a href="https://vuejs.org/guide/quick-start.html#local" target="_blank">create-vue</a>, the
|
|
||||||
official Vue + Vite starter
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Learn more about IDE Support for Vue in the
|
|
||||||
<a href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support" target="_blank"
|
|
||||||
>Vue Docs Scaling up Guide</a
|
|
||||||
>.
|
|
||||||
</p>
|
|
||||||
<p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.read-the-docs {
|
|
||||||
color: #888;
|
|
||||||
}
|
|
||||||
</style>
|
|
48
src/components/Typography/UiHeading.vue
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<template>
|
||||||
|
<component
|
||||||
|
:is="tag"
|
||||||
|
class="font-semibold"
|
||||||
|
:class="[
|
||||||
|
{
|
||||||
|
'text-3xl md:text-4xl lg:text-5xl 2xl:text-6xl': size === '600',
|
||||||
|
}, // H1
|
||||||
|
{
|
||||||
|
'text-3xl md:text-4xl 2xl:text-5xl': size === '500',
|
||||||
|
}, // H2
|
||||||
|
{
|
||||||
|
'text-2xl md:text-3xl 2xl:text-4xl': size === '400',
|
||||||
|
}, // H3
|
||||||
|
{
|
||||||
|
'text-xl lg:text-2xl 2xl:text-3xl': size === '300',
|
||||||
|
}, // H4
|
||||||
|
{
|
||||||
|
'text-lg md:text-xl': size === '200',
|
||||||
|
}, // H5
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</component>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { toRefs } from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
/**
|
||||||
|
* Tag name: h1 to h6
|
||||||
|
*/
|
||||||
|
tag: {
|
||||||
|
type: String,
|
||||||
|
default: 'h2',
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Heading size: '600' (largest) to '200' (smallest)
|
||||||
|
*/
|
||||||
|
size: {
|
||||||
|
type: String,
|
||||||
|
default: '500',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const { size, tag } = toRefs(props)
|
||||||
|
</script>
|
48
src/components/Typography/UiParagraph.vue
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<template>
|
||||||
|
<component
|
||||||
|
:is="as"
|
||||||
|
class="text-primary"
|
||||||
|
:class="[
|
||||||
|
{
|
||||||
|
'text-2xl lg:text-3xl 2xl:text-4xl': size === '600',
|
||||||
|
}, // 24px
|
||||||
|
{
|
||||||
|
'text-xl lg:text-2xl 2xl:text-3xl': size === '500',
|
||||||
|
}, // 20px
|
||||||
|
{
|
||||||
|
'text-lg lg:text-xl 2xl:text-2xl': size === '400',
|
||||||
|
}, // 18px
|
||||||
|
{
|
||||||
|
'text-lg lg:text-[20px]': size === '300',
|
||||||
|
}, // 16px
|
||||||
|
{
|
||||||
|
'text-[15px]': size === '250',
|
||||||
|
}, // 15px
|
||||||
|
{
|
||||||
|
'text-[13px]': size === '200',
|
||||||
|
}, // 14px
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</component>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { toRefs } from 'vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
as: {
|
||||||
|
type: String,
|
||||||
|
default: 'p',
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Tailwind text size from 600 to 200
|
||||||
|
*/
|
||||||
|
size: {
|
||||||
|
type: String,
|
||||||
|
default: '300',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const { size, as } = toRefs(props)
|
||||||
|
</script>
|
13
src/components/UiButton/UiButton.params.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export const colorVariants = {
|
||||||
|
primary: ['bg-accent-50', 'text-primary', 'hover:bg-accent-100', 'active:bg-accent-150'],
|
||||||
|
secondary: [
|
||||||
|
'bg-transparent',
|
||||||
|
'text-primary',
|
||||||
|
'hover:bg-accent-50',
|
||||||
|
'border-accent-50',
|
||||||
|
'border',
|
||||||
|
'hover:bg-accent-100',
|
||||||
|
'active:bg-accent-150',
|
||||||
|
'cursor-pointer',
|
||||||
|
],
|
||||||
|
}
|
45
src/components/UiButton/UiButton.vue
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
<component
|
||||||
|
:is="tag"
|
||||||
|
class="px-14 py-4 rounded-[20px] text-[30px] cursor-pointer shadow-[0px_16px_50px_-16px_rgba(229,30,125,1)]"
|
||||||
|
:class="[baseStyle, size]"
|
||||||
|
data-ui="ui-button"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</component>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { toRefs, computed } from 'vue'
|
||||||
|
import { colorVariants } from './UiButton.params.ts'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
tag: {
|
||||||
|
type: String,
|
||||||
|
default: 'button',
|
||||||
|
},
|
||||||
|
variants: {
|
||||||
|
type: String as () => 'primary' | 'secondary',
|
||||||
|
default: 'primary',
|
||||||
|
validator: (value) => {
|
||||||
|
return ['primary', 'secondary'].includes(value as string)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
type: String,
|
||||||
|
default: 'font-bold',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const { tag, variants, size } = toRefs(props)
|
||||||
|
|
||||||
|
const colorClasses: Record<'primary' | 'secondary', string[]> = {
|
||||||
|
primary: colorVariants.primary,
|
||||||
|
secondary: colorVariants.secondary,
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseStyle = computed(() => {
|
||||||
|
const variant = variants.value as 'primary' | 'secondary'
|
||||||
|
return colorClasses[variant]?.join(' ') || ''
|
||||||
|
})
|
||||||
|
</script>
|
31
src/components/UiNav/UiNav.vue
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<template>
|
||||||
|
<UiParagraph
|
||||||
|
class="cursor-pointer"
|
||||||
|
as="span"
|
||||||
|
size="250"
|
||||||
|
v-for="({ path, name, target }, index) in navContent"
|
||||||
|
:key="index"
|
||||||
|
data-ui="ui-nav"
|
||||||
|
>
|
||||||
|
<component
|
||||||
|
data-ui="ui-nav-btn"
|
||||||
|
:is="target ? 'a' : 'RouterLink'"
|
||||||
|
:to="path"
|
||||||
|
:href="path"
|
||||||
|
:target="target"
|
||||||
|
>{{ name }}</component
|
||||||
|
>
|
||||||
|
</UiParagraph>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiParagraph from '../Typography/UiParagraph.vue'
|
||||||
|
|
||||||
|
interface NavContent {
|
||||||
|
name: string
|
||||||
|
path: string
|
||||||
|
target?: string
|
||||||
|
}
|
||||||
|
const { navContent = undefined } = defineProps<{
|
||||||
|
navContent: NavContent[] | undefined
|
||||||
|
}>()
|
||||||
|
</script>
|
9
src/config/router/index.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
|
import routes from './routes'
|
||||||
|
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHistory(import.meta.env.VITE_URL),
|
||||||
|
routes,
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router
|
43
src/config/router/routes.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import type { Component } from 'vue'
|
||||||
|
|
||||||
|
interface ChlidrenRoute {
|
||||||
|
path: string
|
||||||
|
name: string
|
||||||
|
component: () => Promise<Component>
|
||||||
|
props?: boolean
|
||||||
|
}
|
||||||
|
interface Route {
|
||||||
|
path: string
|
||||||
|
name: string
|
||||||
|
component: () => Promise<Component>
|
||||||
|
props?: boolean
|
||||||
|
children?: ChlidrenRoute[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const routes: Route[] = [
|
||||||
|
{
|
||||||
|
path: '/',
|
||||||
|
name: 'home',
|
||||||
|
component: () => import('@/pages/mainPage/indexPage.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/books/:slug',
|
||||||
|
name: 'book-detail',
|
||||||
|
component: () => import('@/pages/books/_slug/indexBookPage.vue'),
|
||||||
|
props: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: ':titlesSlug',
|
||||||
|
name: 'book-titles',
|
||||||
|
component: () => import('@/pages/books/_slug/_titlesSlug/indexTitlesPage.vue'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/privacy',
|
||||||
|
name: 'privacy',
|
||||||
|
component: () => import('@/pages/privacy/privacyPage.vue'),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export default routes
|
32
src/layout/UiFooter/UiFooter.vue
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<template>
|
||||||
|
<footer class="mx-auto container max-2xl:pl-4">
|
||||||
|
<div class="relative z-50 max-w-[1280px] mx-auto">
|
||||||
|
<div class="flex justify-between mb-5">
|
||||||
|
<UiNav :nav-content="footerNavigation" />
|
||||||
|
</div>
|
||||||
|
<div class="pb-7 flex justify-between">
|
||||||
|
<div>
|
||||||
|
<UiParagraph as="span" size="250"
|
||||||
|
>По всем вопросам:<br />
|
||||||
|
<a href="mailto:vinogalante@yandex.ru" target="_blank">
|
||||||
|
vinogalante@yandex.ru
|
||||||
|
</a></UiParagraph
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col [&>[data-ui=ui-nav]]:text-secondary" v-if="route.path === '/'">
|
||||||
|
<UiNav :nav-content="refLitres" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import UiNav from '@/components/UiNav/UiNav.vue'
|
||||||
|
import { footerNavigation, refLitres } from '@/layout/UiFooter/_data'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
</script>
|
36
src/layout/UiFooter/_data/footer-navigation.data.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
const footerNavigation = [
|
||||||
|
{
|
||||||
|
name: 'Главная',
|
||||||
|
path: '/',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Книга I',
|
||||||
|
path: '/books/1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Книга II',
|
||||||
|
path: '/books/2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Отзывы',
|
||||||
|
path: '/feedback',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Корзина',
|
||||||
|
path: '/cart',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Оплата',
|
||||||
|
path: '/buy',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Вопрос-ответ',
|
||||||
|
path: '/question',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Политика конфидинциальности',
|
||||||
|
path: '/privacy',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export default footerNavigation
|
3
src/layout/UiFooter/_data/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export { default as footerNavigation } from '@/layout/UiFooter/_data/footer-navigation.data'
|
||||||
|
|
||||||
|
export { default as refLitres } from '@/layout/UiFooter/_data/ref-litres.data'
|
14
src/layout/UiFooter/_data/ref-litres.data.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const refLitres = [
|
||||||
|
{
|
||||||
|
name: 'Реферальная ссылка на ЛитРес - Книга I',
|
||||||
|
path: 'https://www.litres.ru/58125553/',
|
||||||
|
target: '_blank',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Реферальная ссылка на ЛитРес - Книга II',
|
||||||
|
path: 'https://www.litres.ru/vino-galante/kak-vlubit-v-sebya-lubogo-tonkaya-igra/',
|
||||||
|
target: '_blank',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export default refLitres
|
25
src/layout/UiHeader/UiHeader.vue
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<template>
|
||||||
|
<header class="py-4 container mx-auto max-2xl:pl-4">
|
||||||
|
<div class="flex flex-row-reverse justify-end gap-4 items-center max-w-[1280px] mx-auto">
|
||||||
|
<slot name="content" />
|
||||||
|
<div class="flex items-center gap-32">
|
||||||
|
<div class="russo-one-regular cursor-pointer !text-primary">
|
||||||
|
<UiParagraph as="span" class="[&]:text-5xl">
|
||||||
|
<RouterLink to="/"> Vino Galante </RouterLink>
|
||||||
|
</UiParagraph>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-wrap space-x-10">
|
||||||
|
<UiNav :nav-content="headerNavigation" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<slot name="right-icons" />
|
||||||
|
</header>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiNav from '@/components/UiNav/UiNav.vue'
|
||||||
|
import { RouterLink } from 'vue-router'
|
||||||
|
import { headerNavigation } from './_data'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
</script>
|
24
src/layout/UiHeader/_data/header-navigation.data.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
const headerNavigation = [
|
||||||
|
{
|
||||||
|
name: 'Главная',
|
||||||
|
path: '/',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Книга I',
|
||||||
|
path: '/books/1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Книга II',
|
||||||
|
path: '/books/2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Купить',
|
||||||
|
path: '/buy',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Отзывы',
|
||||||
|
path: '/feedback',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export default headerNavigation
|
1
src/layout/UiHeader/_data/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default as headerNavigation } from '@/layout/UiHeader/_data/header-navigation.data'
|
39
src/layout/UiLayout.vue
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="min-h-svh overflow-x-hidden lato-regular relative overflow-visible before:content-[''] before:absolute before:bottom-0 before:h-[520px] before:w-full before:bg-[url(/src/assets/img/webp/footer-flowers.webp)] before:bg-no-repeat before:bg-bottom before:bg-cover before:z-40"
|
||||||
|
:class="
|
||||||
|
route.path === '/books/1' || route.path === '/books/2'
|
||||||
|
? 'bg-[linear-gradient(135deg,rgba(17,17,30,1)_10%,rgba(183,32,76,1)_170%)]'
|
||||||
|
: 'bg-black-50'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="route.path === '/'"
|
||||||
|
class="relative z-10 after:content-[''] after:absolute after:top-0 after:right-0 after:w-[820px] after:h-[535px] after:bg-[url(/src/assets/img/webp/gradient.webp)] after:bg-no-repeat after:bg-[right_top] after:bg-contain"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
v-if="route.path === '/'"
|
||||||
|
class="relative z-20 after:content-[''] after:absolute after:top-0 after:right-0 after:w-[1120px] after:h-[1800px] after:bg-[url(/src/assets/img/webp/group-flowers.webp)] after:bg-no-repeat after:bg-[right_top] after:bg-cover"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
v-if="route.path === '/'"
|
||||||
|
class="relative z-40 before:content-[''] before:absolute before:top-0 before:left-0 before:w-[1120px] before:h-[1000px] before:bg-[url(/src/assets/img/webp/hero-flowers.webp)] before:bg-no-repeat before:bg-left before:bg-contain"
|
||||||
|
/>
|
||||||
|
<UiHeader class="relative z-50" />
|
||||||
|
<UiMain class="!min-h-[1200px] text-primary relative">
|
||||||
|
<Suspense>
|
||||||
|
<slot />
|
||||||
|
</Suspense>
|
||||||
|
</UiMain>
|
||||||
|
<UiFooter />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiFooter from './UiFooter/UiFooter.vue'
|
||||||
|
import UiHeader from './UiHeader/UiHeader.vue'
|
||||||
|
import UiMain from './UiMain/UiMain.vue'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
</script>
|
11
src/layout/UiMain/UiMain.vue
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<template>
|
||||||
|
<main class="mt-10 px-6 min-h-screen h-full">
|
||||||
|
<div class="max-w-[1280px] mx-auto">
|
||||||
|
<Suspense>
|
||||||
|
<slot />
|
||||||
|
</Suspense>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts"></script>
|
13
src/main.ts
@ -1,5 +1,16 @@
|
|||||||
import { createApp } from 'vue'
|
import { createApp } from 'vue'
|
||||||
|
import { createPinia } from 'pinia'
|
||||||
|
import { createHead } from '@vueuse/head'
|
||||||
|
|
||||||
import './style.css'
|
import './style.css'
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
|
import router from '@/config/router/index'
|
||||||
|
|
||||||
createApp(App).mount('#app')
|
const app = createApp(App)
|
||||||
|
const head = createHead()
|
||||||
|
|
||||||
|
app.use(head)
|
||||||
|
app.use(createPinia())
|
||||||
|
app.use(router)
|
||||||
|
|
||||||
|
app.mount('#app')
|
||||||
|
39
src/pages/books/_slug/_data/1.json
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"title": "Как влюбить в себя любого\nКнига I",
|
||||||
|
"metaTitle": "Как влюбить в себя любого - Книга I",
|
||||||
|
"subtitle": "ОТКРОВЕНИЯ БЫВШЕГО КАЗАНОВЫ",
|
||||||
|
"subdesc": "💡 Ты красивая, умная, но он не пишет? Эта книга покажет, как влюбить в себя любого — без игр и унижений",
|
||||||
|
"description": "Думаешь Vino Galante - правнук легендарного Джакомо Казановы? Да, такие слухи ходят. Но здесь дело не в итальянской крови. Просто Galante - очень «тонкий» соблазнитель. Зная все тонкости этого искусства, он филигранно работает «кончиками пальцев».\n\nА эту книгу (ты не поверишь!!) он написал специально для девушек. Однажды влюбившись, Vino перестал соблазнять. Так у тебя появилась возможность узнать основы тонкого искусства соблазнения из легендарного первоисточника.",
|
||||||
|
"img": "/img/webp/books/1.webp",
|
||||||
|
"price": "520 ",
|
||||||
|
"buttonText": "Хочу знать, как работает мужская психология",
|
||||||
|
"buttonFormat": "PDF + EPUB сразу после оплаты",
|
||||||
|
"pages": "210 страниц",
|
||||||
|
"illust": "11 иллюстраций",
|
||||||
|
"format": "PDF + EPUB",
|
||||||
|
"whoUKnows": [
|
||||||
|
{
|
||||||
|
"text": "Как устроено мужское влечение на самом деле",
|
||||||
|
"svg": "/img/svg/books/1/mdi_heart-outline.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Почему красивые девушки часто одиноки — и что с этим делать",
|
||||||
|
"svg": "/img/svg/books/1/f7_exclamationmark.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Как флиртовать тонко, не теряя себя",
|
||||||
|
"svg": "/img/svg/books/1/meteor-icons_message.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Что делает девушку запоминающейся",
|
||||||
|
"svg": "/img/svg/books/1/lucide_star.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Как не попадать в «запас» и быть единственной",
|
||||||
|
"svg": "/img/svg/books/1/stash_target.svg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"href": "https://www.litres.ru/58125553/",
|
||||||
|
"hrefTitles": "title-1"
|
||||||
|
}
|
39
src/pages/books/_slug/_data/2.json
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"title": "Как влюбить в себя любого\nКнига II",
|
||||||
|
"metaTitle": "Как влюбить в себя любого - Книга II",
|
||||||
|
"subtitle": "ТОНКАЯ ИГРА",
|
||||||
|
"subdesc": "💡 Если ты устала от “не готов к отношениям” — начни играть по своим правилам",
|
||||||
|
"description": "Ты бывала свидетелем такого, что у красивой девушки личная жизнь не складывается, а у, казалось бы, дурнушки и семья хорошая, и муж и любит, и обеспечивает? Да такое сплошь и рядом!\n\nХочешь узнать, как построить отношения с любым парнем в наш век, когда вокруг полно красавиц, а все мужчины/парни избалованы?\nОтветы ты найдешь в этой книге.",
|
||||||
|
"img": "/img/webp/books/2.webp",
|
||||||
|
"price": "520 ",
|
||||||
|
"buttonText": "Скачать сейчас — и начать менять игру",
|
||||||
|
"buttonFormat": "PDF + EPUB сразу после оплаты",
|
||||||
|
"pages": "210 страниц",
|
||||||
|
"illust": "11 иллюстраций",
|
||||||
|
"format": "PDF + EPUB",
|
||||||
|
"whoUKnows": [
|
||||||
|
{
|
||||||
|
"text": "Как выстроить притяжение с любым мужчиной",
|
||||||
|
"svg": "/img/svg/books/1/mdi_heart-outline.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Как включить его чувства, а не просто понравиться",
|
||||||
|
"svg": "/img/svg/books/1/f7_exclamationmark.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Какие фишки работают — и почему",
|
||||||
|
"svg": "/img/svg/books/1/meteor-icons_message.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Почему мужчины уходят от «идеальных» и возвращаются к «опасным»",
|
||||||
|
"svg": "/img/svg/books/1/lucide_star.svg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "Как говорить и вести себя, чтобы остаться в его сердце",
|
||||||
|
"svg": "/img/svg/books/1/stash_target.svg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"href": "https://www.litres.ru/vino-galante/kak-vlubit-v-sebya-lubogo-tonkaya-igra/",
|
||||||
|
"hrefTitles": "title-2"
|
||||||
|
}
|
187
src/pages/books/_slug/_titlesSlug/_data/title-1.json
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
{
|
||||||
|
"id": "title-1",
|
||||||
|
"title": "Оглавление",
|
||||||
|
"titleMeta": "Оглавление - Книга I",
|
||||||
|
"sections": [
|
||||||
|
{
|
||||||
|
"title": "Благодарности"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Введение",
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Работа с любым печатным материалом"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Глава 1. Перезагрузка",
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Убеждения соблазнительницы",
|
||||||
|
"img": "/img/svg/books/1/titles-1/flowbite_wine-glass-solid.svg"
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
"Всё всегда хорошо",
|
||||||
|
"Другие девушки не помеха для меня",
|
||||||
|
"Парней много, я одна",
|
||||||
|
"Использовать мужчин – это естественно и приятно",
|
||||||
|
"Отшивать мужчин – это естественно",
|
||||||
|
"Ты имеешь ровно то, что заслужила",
|
||||||
|
"Ты достойна гораздо больше того, что имеешь на данный момент",
|
||||||
|
"Все, о чем ты способна мечтать, ты способна иметь",
|
||||||
|
"Проявлять активность успешной девушке естественно",
|
||||||
|
"Все мужчины, с которыми ты общаешься до замужества – всего лишь твои тренажеры",
|
||||||
|
"Мужчина должен относиться к тебе уважительно",
|
||||||
|
"Среди мужчин встречается идиоты",
|
||||||
|
"Тебе выгодно, если мужчина хочет тебя",
|
||||||
|
"Мужчина общается с тобой только тогда, когда ему от тебя что-то нужно",
|
||||||
|
"Пока мужчина тебя не трахнул, ты не проиграла",
|
||||||
|
"Если ты получаешь удовольствие от общения с мужчиной – все идет по плану",
|
||||||
|
"Ты ничего не должна мужчине, даже если он подарил тебе дворец и яхту",
|
||||||
|
"Соблазнение – всего лишь очень интересная игра, в которой нет проигравших",
|
||||||
|
"У мужчин две ахиллесовых пяты – это и секс. Это в сто раз важнее секса",
|
||||||
|
"Мужчины – очень хорошие создания",
|
||||||
|
"Мужчины не примитивные",
|
||||||
|
"Мужчинам нужен далеко не только секс (Мужчине нужен от тебя только секс, если ты больше ничего ему дать не можешь)",
|
||||||
|
"Смысл жизни – развитие",
|
||||||
|
"Иметь запасной аэродром правильно и естественно для женщины",
|
||||||
|
"Сексом мужчину не удержать",
|
||||||
|
"Общение с мужчиной должно приносить радость",
|
||||||
|
"Мужчины стремятся не к хорошим, а к высокоранговым женщинам",
|
||||||
|
"Мир вокруг тебя – отражение тебя самой"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Секс на первом свидании",
|
||||||
|
"img": "/img/svg/books/1/titles-1/healthicons_sexual-reproductive-health.svg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Глава 2. Свобода",
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Поля-тараканы",
|
||||||
|
"img": "/img/svg/books/1/titles-1/simple-icons_cockroachlabs.svg"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Техника безопасности при работе в полях"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Восстановление сил"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Главный принцип развития"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Техники выхода в аптайм"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Действия"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Результат"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Калибровка",
|
||||||
|
"img": "/img/svg/books/1/titles-1/material-symbols_editor-choice-rounded.svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Азбука калибровки"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Как наблюдать, не вызывая подозрений"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Стратегия сближений",
|
||||||
|
"img": "/img/svg/books/1/titles-1/ph_strategy-fill.svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Определение и классификация"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Псевдопассивная. Этап первый"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Псевдопассивная. Этап второй"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Активный тип стратегии"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Третий этап. Степени кокетства"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Глава 3. Затравка",
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Теория женской привлекательности",
|
||||||
|
"img": "/img/svg/books/1/titles-1/icon-park-outline_women.svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Физическое здоровье"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Ментальный посыл. Стильность"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Ментальный посыл. Внутреннее ощущение мира"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Ошибки резидента",
|
||||||
|
"img": "/img/svg/books/1/titles-1/si_error-line.svg"
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
"Косак 1",
|
||||||
|
"Косак 2",
|
||||||
|
"Полукосак 3",
|
||||||
|
"Косак 4",
|
||||||
|
"МетаКосак 5 – опасный",
|
||||||
|
"МетаКосак 6 – опасный",
|
||||||
|
"Косак 7",
|
||||||
|
"МетаКосак 8 – крайне опасно",
|
||||||
|
"МетаКосак 9 – опасно",
|
||||||
|
"Косак 10",
|
||||||
|
"Косак 11"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "В следующей книге"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
170
src/pages/books/_slug/_titlesSlug/_data/title-2.json
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
{
|
||||||
|
"id": "title-1",
|
||||||
|
"title": "Оглавление",
|
||||||
|
"titleMeta": "Оглавление - Книга II",
|
||||||
|
"sections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Глава 1. Перед боем",
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Закон Вино Галанте или закон неотвратимости успеха",
|
||||||
|
"img": "/img/svg/books/2/titles-2/octicon_law-24.svg"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Запасной аэродром",
|
||||||
|
"img": "/img/svg/books/2/titles-2/mingcute_airplane-line.svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Экскурс в историю"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Правила формирования запасного аэродрома"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Подробнее о пятом пункте или как не врать"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Следствия наличия запасного аэродрома"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Свидания",
|
||||||
|
"img": "/img/svg/books/2/titles-2/mdi_heart-outline (1).svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Одежда"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Правильные места для свиданий"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Самое важное в свиданиях"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Глава 2. Ближний бой",
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Техника влюбления",
|
||||||
|
"img": "/img/svg/books/2/titles-2/Vector (4).svg"
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
"Механизм мужской и женской влюбленностей",
|
||||||
|
"Главный секрет влюбления",
|
||||||
|
"Ментальная подстройка",
|
||||||
|
"Подстройка по ценностям",
|
||||||
|
"Качество девушки",
|
||||||
|
"Поведение",
|
||||||
|
"Как правильно хвалить мужчину",
|
||||||
|
"Игра “Ближе-дальше”",
|
||||||
|
"Дикий крышечок “Полярный разрыв”",
|
||||||
|
"Полярный разрыв в действии или крышечок на грани фола",
|
||||||
|
"Фишка “Рассмеяться как зло”",
|
||||||
|
"Фишка “АХ”",
|
||||||
|
"Техника влюбления “Отмененная помощь”",
|
||||||
|
"Техника влюбления “Не тот поворот”",
|
||||||
|
"Техника влюбления “Неожиданный разрыв”",
|
||||||
|
"Техника влюбления “Обещанный звонок”",
|
||||||
|
"Техника влюбления “Парень – подружка”",
|
||||||
|
"Фишка “Бросок кобры”",
|
||||||
|
"Фишка “Мягкий язык”",
|
||||||
|
"Вызов ревности"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Типичные неэффективные фишки девушек",
|
||||||
|
"img": "/img/svg/books/2/titles-2/Group.svg"
|
||||||
|
},
|
||||||
|
"items": ["Я выхожу замуж", "Я скучаю по парню", "Желание казаться круче, чем ты есть"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Чего никогда нельзя делать",
|
||||||
|
"img": "/img/svg/books/2/titles-2/Group (1).svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Введение"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Оральные ласки"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Минет"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "СМС-переписка",
|
||||||
|
"img": "/img/svg/books/2/titles-2/Vector (6).svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Российские школы соблазнения"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Как найти соблазнителя"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "История рождения одного термина"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Секс и девичья невинность",
|
||||||
|
"img": "/img/svg/books/2/titles-2/Vector (7).svg"
|
||||||
|
},
|
||||||
|
"subsections": [
|
||||||
|
{
|
||||||
|
"title": "Как парни воспринимают секс"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Девичья невинность"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Прожим девственницы. Метод Галанте."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Прожим девственницы. Классический метод."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Прожим девственницы. Метод пикапера."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Вместо эпилога"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Что делать, если попался «сложный красавчик»"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"text": "Словарь",
|
||||||
|
"img": "/img/svg/books/2/titles-2/Vector (8).svg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
146
src/pages/books/_slug/_titlesSlug/indexTitlesPage.vue
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<template>
|
||||||
|
<div v-if="titles" class="relative z-50 min-h-screen text-white mb-[208px]">
|
||||||
|
<section class="flex flex-col relative z-40 mt-40 ml-18">
|
||||||
|
<UiHeading tag="H1" class="whitespace-pre-line [&]:font-normal mb-10 -ml-5" size="500">
|
||||||
|
{{ titles.title }}
|
||||||
|
</UiHeading>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-6">
|
||||||
|
<div v-for="(section, index) in titles.sections" :key="index" class="flex flex-col gap-4">
|
||||||
|
<!-- Main section title -->
|
||||||
|
<UiHeading tag="H2" size="300" class="text-three [&]:font-normal">
|
||||||
|
{{ section.title }}
|
||||||
|
</UiHeading>
|
||||||
|
|
||||||
|
<!-- Subsections -->
|
||||||
|
<div v-if="section.subsections" class="ml-6 flex flex-col gap-4">
|
||||||
|
<div
|
||||||
|
v-for="(subsection, subIndex) in section.subsections"
|
||||||
|
:key="subIndex"
|
||||||
|
class="flex flex-col gap-2"
|
||||||
|
>
|
||||||
|
<!-- Subsection with image -->
|
||||||
|
<div
|
||||||
|
v-if="typeof subsection.title === 'object'"
|
||||||
|
class="flex items-center gap-3 -ml-10"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
v-if="subsection.title.img"
|
||||||
|
:src="subsection.title.img"
|
||||||
|
:alt="subsection.title.text"
|
||||||
|
class="w-6 h-6"
|
||||||
|
/>
|
||||||
|
<UiHeading tag="H3" size="300" class="[&]:font-normal">
|
||||||
|
{{ subsection.title.text }}
|
||||||
|
</UiHeading>
|
||||||
|
</div>
|
||||||
|
<!-- Regular subsection -->
|
||||||
|
<UiHeading v-else tag="H3" size="300" class="[&]:text-gray-200 [&]:font-normal">
|
||||||
|
{{ subsection.title }}
|
||||||
|
</UiHeading>
|
||||||
|
|
||||||
|
<!-- Items list -->
|
||||||
|
<ul v-if="subsection.items" class="ml-6 flex flex-col gap-2 list-decimal">
|
||||||
|
<li v-for="(item, itemIndex) in subsection.items" :key="itemIndex">
|
||||||
|
<UiParagraph size="300" class="[&]:text-gray-200 [&]:font-normal"
|
||||||
|
> {{ item }}</UiParagraph
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Nested subsections -->
|
||||||
|
<div v-if="subsection.subsections" class="flex flex-col gap-2">
|
||||||
|
<div v-for="(nestedSub, nestedIndex) in subsection.subsections" :key="nestedIndex">
|
||||||
|
<UiHeading tag="H4" size="300" class="[&]:text-gray-200 [&]:font-normal">
|
||||||
|
{{ nestedSub.title }}
|
||||||
|
</UiHeading>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<div v-else class="text-white text-center py-20">Содержание не найдено.</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, computed, watch } from 'vue'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
import UiHeading from '@/components/Typography/UiHeading.vue'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import { useHead } from '@vueuse/head'
|
||||||
|
|
||||||
|
interface SubsectionTitle {
|
||||||
|
text: string
|
||||||
|
img?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Subsection {
|
||||||
|
title: string | SubsectionTitle
|
||||||
|
items?: string[]
|
||||||
|
subsections?: Array<{
|
||||||
|
title: string
|
||||||
|
}>
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Section {
|
||||||
|
title: string
|
||||||
|
subsections?: Subsection[]
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TitlesData {
|
||||||
|
title: string
|
||||||
|
titleMeta: string
|
||||||
|
sections: Section[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
const currentTitlesData = ref<TitlesData | null>(null)
|
||||||
|
|
||||||
|
const titles = computed(() => currentTitlesData.value)
|
||||||
|
|
||||||
|
const loadTitlesData = async (slug: string) => {
|
||||||
|
try {
|
||||||
|
const module = await import(`./_data/${slug}.json`)
|
||||||
|
currentTitlesData.value = module.default as TitlesData
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Ошибка при загрузке содержания с slug '${slug}':`, error)
|
||||||
|
currentTitlesData.value = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => route.params.titlesSlug,
|
||||||
|
async (newSlug) => {
|
||||||
|
console.log('Route params changed:', route.params)
|
||||||
|
console.log('New titlesSlug:', newSlug)
|
||||||
|
if (newSlug) {
|
||||||
|
await loadTitlesData(newSlug as string)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
|
|
||||||
|
watch(titles, (newTitles) => {
|
||||||
|
if (newTitles) {
|
||||||
|
useHead({
|
||||||
|
title: `${newTitles.titleMeta} | Vino Galante`,
|
||||||
|
meta: [
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Содержание книги Vino Galante',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `https://ebook.miduway.space/books/${route.params.slug}/${route.params.titlesSlug}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
239
src/pages/books/_slug/indexBookPage.vue
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
<template>
|
||||||
|
<template v-if="book">
|
||||||
|
<div class="relative z-50 min-h-screen text-white mb-[208px]">
|
||||||
|
<template v-if="!route.params.titlesSlug">
|
||||||
|
<!--верхний блок-->
|
||||||
|
<section
|
||||||
|
class="flex flex-row relative z-40 before:content-[''] before:absolute before:top-[-140px] before:bg-top before:left-0 before:w-[1200px] before:h-[1000px] before:bg-[url(/src/assets/img/webp/vino-galante.webp)] before:bg-no-repeat before:bg-contain mt-40"
|
||||||
|
>
|
||||||
|
<!--левый блок контента-->
|
||||||
|
<section class="relative top-[-20px] min-w-[570px]">
|
||||||
|
<div class="flex flex-col items-center">
|
||||||
|
<img :src="book.img" :alt="book.buttonText" width="100%" height="100%" />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<!--правый блок контента-->
|
||||||
|
<section>
|
||||||
|
<div class="w-11/12 h-full flex flex-col justify-start">
|
||||||
|
<div>
|
||||||
|
<UiHeading tag="H1" class="whitespace-pre-line [&]:font-bold" size="300">
|
||||||
|
{{ book.title }}
|
||||||
|
</UiHeading>
|
||||||
|
<UiParagraph class="mb-10" size="250">
|
||||||
|
{{ book.subtitle }}
|
||||||
|
</UiParagraph>
|
||||||
|
<UiParagraph size="250" class="mb-20">
|
||||||
|
{{ book.subdesc }}
|
||||||
|
</UiParagraph>
|
||||||
|
<UiParagraph size="250" class="whitespace-pre-line min-h-62">
|
||||||
|
{{ book.description }}
|
||||||
|
</UiParagraph>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<!--средний блок-->
|
||||||
|
<section class="flex flex-row items-center ml-18 justify-between">
|
||||||
|
<!--левый-->
|
||||||
|
<div class="flex flex-col items-center min-h-[310px]">
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<UiParagraph class="[&]:text-6xl">{{ book.price }} </UiParagraph>
|
||||||
|
<img src="/img/svg/books/ruble.svg" alt="ruble" />
|
||||||
|
</div>
|
||||||
|
<div class="mr-10 flex items-center flex-col gap-3">
|
||||||
|
<UiButton class="max-w-[380px] !font-normal !px-2 !py-4 mt-24">
|
||||||
|
{{ book.buttonText }}
|
||||||
|
</UiButton>
|
||||||
|
<UiParagraph size="200">
|
||||||
|
{{ book.buttonFormat }}
|
||||||
|
</UiParagraph>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!--правый-->
|
||||||
|
<div class="min-h-[310px]">
|
||||||
|
<!--о книге-->
|
||||||
|
<div>
|
||||||
|
<ul class="flex flex-row mr-14 items-center justify-between lg:whitespace-nowrap">
|
||||||
|
<li class="flex flex-row mr-14 gap-3 items-center">
|
||||||
|
<img
|
||||||
|
src="/img/svg/books/book-pages.svg"
|
||||||
|
alt="страниц"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
/>
|
||||||
|
<UiParagraph size="250" as="span">
|
||||||
|
{{ book.pages }}
|
||||||
|
</UiParagraph>
|
||||||
|
</li>
|
||||||
|
<li class="flex flex-row mr-14 gap-3 items-center">
|
||||||
|
<img
|
||||||
|
src="/img/svg/books/book-illustrations.svg"
|
||||||
|
alt="иллюстраций"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
/>
|
||||||
|
<UiParagraph size="250" as="span">
|
||||||
|
{{ book.illust }}
|
||||||
|
</UiParagraph>
|
||||||
|
</li>
|
||||||
|
<li class="flex flex-row mr-14 gap-3 items-center">
|
||||||
|
<img
|
||||||
|
src="/img/svg/books/book-formats.svg"
|
||||||
|
alt="формат"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
/>
|
||||||
|
<UiParagraph size="250" as="span">
|
||||||
|
{{ book.format }}
|
||||||
|
</UiParagraph>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--навигация по книге-->
|
||||||
|
<div class="mt-24">
|
||||||
|
<ul class="flex flex-row mr-32 items-end justify-between lg:whitespace-nowrap">
|
||||||
|
<li class="flex flex-row gap-3 items-center">
|
||||||
|
<RouterLink to="#" class="flex flex-col items-center gap-3 cursor-pointer">
|
||||||
|
<img src="/img/svg/books/read.svg" alt="Читай отрывок" width="50" height="50" />
|
||||||
|
<UiParagraph size="250" as="span"> Читай отрывок </UiParagraph>
|
||||||
|
</RouterLink>
|
||||||
|
</li>
|
||||||
|
<li class="flex flex-row gap-3 items-center">
|
||||||
|
<RouterLink to="#" class="flex flex-col items-center gap-3 cursor-pointer">
|
||||||
|
<img
|
||||||
|
src="/img/svg/books/download.svg"
|
||||||
|
alt="Скачай отрывок"
|
||||||
|
width="50"
|
||||||
|
height="50"
|
||||||
|
/>
|
||||||
|
<UiParagraph size="250" as="span"> Скачай отрывок </UiParagraph>
|
||||||
|
</RouterLink>
|
||||||
|
</li>
|
||||||
|
<li class="flex flex-row gap-3 items-center">
|
||||||
|
<RouterLink
|
||||||
|
:to="{
|
||||||
|
name: 'book-titles',
|
||||||
|
params: {
|
||||||
|
slug: route.params.slug,
|
||||||
|
titlesSlug: book.hrefTitles,
|
||||||
|
},
|
||||||
|
}"
|
||||||
|
class="flex flex-col items-center gap-3 cursor-pointer"
|
||||||
|
>
|
||||||
|
<img src="/img/svg/books/titles.svg" alt="Содержание" width="50" height="50" />
|
||||||
|
<UiParagraph size="250" as="span"> Содержание </UiParagraph>
|
||||||
|
</RouterLink>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<!--нижний блок-->
|
||||||
|
<section class="ml-18 mt-32">
|
||||||
|
<div>
|
||||||
|
<UiHeading tag="H2" size="300" class="text-three"> Что ты узнаешь </UiHeading>
|
||||||
|
<ul class="flex mt-20 flex-row items-center justify-between">
|
||||||
|
<li
|
||||||
|
class="flex flex-col-reverse justify-end w-38 gap-4 h-64 items-center transition-transform transform hover:scale-110"
|
||||||
|
v-for="({ svg, text }, index) in book.whoUKnows"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<UiParagraph class="text-center" size="250">
|
||||||
|
{{ text }}
|
||||||
|
</UiParagraph>
|
||||||
|
<img :src="`${svg}`" alt="Вопрос" width="45" height="45" />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="flex justify-center text-center mt-36">
|
||||||
|
<UiParagraph>
|
||||||
|
Или купи на ЛитРес - <br /><a class="text-three" :href="book.href" target="_blank"
|
||||||
|
>Реферальная ссылка для поддержки автора</a
|
||||||
|
>
|
||||||
|
</UiParagraph>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
<RouterView />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div v-else class="text-white text-center py-20">Книга не найдена.</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, computed, watch } from 'vue'
|
||||||
|
import { useRoute, RouterView } from 'vue-router'
|
||||||
|
import UiHeading from '@/components/Typography/UiHeading.vue'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import UiButton from '@/components/UiButton/UiButton.vue'
|
||||||
|
import { useHead } from '@vueuse/head'
|
||||||
|
|
||||||
|
interface BookDetail {
|
||||||
|
id: number
|
||||||
|
title: string
|
||||||
|
metaTitle: string
|
||||||
|
subtitle: string
|
||||||
|
subdesc: string
|
||||||
|
description: string
|
||||||
|
img: string
|
||||||
|
price: string
|
||||||
|
buttonText: string
|
||||||
|
buttonFormat: string
|
||||||
|
pages: string
|
||||||
|
illust: string
|
||||||
|
format: string
|
||||||
|
whoUKnows: Array<{
|
||||||
|
text: string
|
||||||
|
svg: string
|
||||||
|
}>
|
||||||
|
href: string
|
||||||
|
hrefTitles: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
const currentBookData = ref<BookDetail | null>(null)
|
||||||
|
|
||||||
|
const book = computed(() => currentBookData.value)
|
||||||
|
|
||||||
|
const loadBookData = async (slug: string) => {
|
||||||
|
try {
|
||||||
|
const module = await import(`./_data/${slug}.json`)
|
||||||
|
currentBookData.value = module.default as BookDetail
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Ошибка при загрузке книги с slug '${slug}':`, error)
|
||||||
|
currentBookData.value = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => route.params.slug,
|
||||||
|
async (newSlug) => {
|
||||||
|
if (newSlug) {
|
||||||
|
await loadBookData(newSlug as string)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
|
|
||||||
|
watch(book, (newBook) => {
|
||||||
|
if (newBook) {
|
||||||
|
useHead({
|
||||||
|
title: `${newBook.metaTitle} | Vino Galante`,
|
||||||
|
meta: [
|
||||||
|
{
|
||||||
|
name: 'description',
|
||||||
|
content: 'Онлайн магазин книг автора Vino Galante',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `https://ebook.miduway.space/books/${route.params.slug}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
@ -0,0 +1,16 @@
|
|||||||
|
const feedbackData = [
|
||||||
|
{
|
||||||
|
text: 'Классная книга! Понятная и увлекательная. По моему мнению, проблема только в том, что женщине самой (без поддержки), выполнить всё, что написано в книге чрезвычайно сложно.\nИдеи супер: \n – первый секс – козырный туз женщины и не надо отдавать его в начале :)\n – жизнь взяток не берет! Надо действовать.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Интересная книга, читаешь «не отрывая глаз», те рекомендации, которые я применяла – действительно рабочие!! Всем советую! По моему мнению видно, что автор действительно очень хорошо знает и понимаем женскую психологию.',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Книга содержит знания, которыми жалко делиться ;) нигде ничего подобного не встречала. Очень много авторских формул и примеров, автор - опытный соблазнитель :) кое-что уже успешно применяла на практике',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Книга для всех девушек, кто только начинают строить отношения. Это вакцина от девичьих ошибок, дает понимание, чего они хотят. Учит не наступать на их уловки. Благодаря ей я стала более уверена в себе.',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export default feedbackData
|
129
src/pages/mainPage/_ui/feedbackSection/feedbackSection.vue
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<template>
|
||||||
|
<section class="feedback-section">
|
||||||
|
<UiHeading tag="H2" size="300" class="text-three mb-4 pl-16 pr-24">
|
||||||
|
Что говорят читатели
|
||||||
|
</UiHeading>
|
||||||
|
|
||||||
|
<!-- Slider main container -->
|
||||||
|
|
||||||
|
<div class="swiper feedback-swiper relative">
|
||||||
|
<!-- If we need pagination -->
|
||||||
|
|
||||||
|
<!-- Additional required wrapper -->
|
||||||
|
<div class="swiper-wrapper">
|
||||||
|
<!-- Slides -->
|
||||||
|
<div
|
||||||
|
v-for="(feedback, index) in feedbackData"
|
||||||
|
:key="index"
|
||||||
|
class="swiper-slide feedback-slide !w-[356px] !h-[325px]"
|
||||||
|
>
|
||||||
|
<div class="feedback-card !w-full !h-full">
|
||||||
|
<UiParagraph size="250" class="card-text">{{ feedback.text }}</UiParagraph>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center flex-col">
|
||||||
|
<UiParagraph size="250" class="text-center mt-20">
|
||||||
|
Твое мнение важно!<br />
|
||||||
|
Если книга была полезной или вызвала эмоции, оставь отзыв.<br />
|
||||||
|
Это поможет другим и вдохновит на новые главы. <br />
|
||||||
|
Спасибо!
|
||||||
|
</UiParagraph>
|
||||||
|
<UiButton @click="console.log(1)" class="mt-10" variants="secondary">Написать отзыв</UiButton>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { onMounted } from 'vue' // Добавляем onMounted
|
||||||
|
import Swiper from 'swiper'
|
||||||
|
import { Pagination, Autoplay } from 'swiper/modules'
|
||||||
|
import UiHeading from '@/components/Typography/UiHeading.vue'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import feedbackData from './_data/feedback.data'
|
||||||
|
|
||||||
|
import 'swiper/css'
|
||||||
|
import 'swiper/css/pagination'
|
||||||
|
import UiButton from '@/components/UiButton/UiButton.vue'
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
new Swiper('.feedback-swiper', {
|
||||||
|
modules: [Pagination, Autoplay],
|
||||||
|
direction: 'horizontal',
|
||||||
|
loop: true,
|
||||||
|
autoplay: {
|
||||||
|
delay: 3000,
|
||||||
|
disableOnInteraction: false,
|
||||||
|
},
|
||||||
|
slidesPerView: 'auto',
|
||||||
|
spaceBetween: 72,
|
||||||
|
pagination: {
|
||||||
|
el: '.swiper-pagination',
|
||||||
|
clickable: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="css" scoped>
|
||||||
|
.feedback-section {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-swiper {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
padding-bottom: 40px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-slide {
|
||||||
|
width: 300px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feedback-card {
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 20px;
|
||||||
|
color: #fff;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-title {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-text {
|
||||||
|
white-space: pre-line;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
width: auto;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination-bullet {
|
||||||
|
background-color: #fff;
|
||||||
|
opacity: 0.4;
|
||||||
|
margin: 0 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swiper-pagination-bullet-active {
|
||||||
|
background-color: #fff;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
</style>
|
54
src/pages/mainPage/_ui/forYouSection/forYouSection.vue
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<template>
|
||||||
|
<section>
|
||||||
|
<UiHeading tag="H2" size="300" class="text-three">
|
||||||
|
Книги для тебя, если ты не знаешь...
|
||||||
|
</UiHeading>
|
||||||
|
<ul class="flex mt-20 flex-row items-center justify-between">
|
||||||
|
<li
|
||||||
|
class="flex flex-col-reverse justify-end w-38 gap-4 h-64 items-center transition-transform transform hover:scale-110"
|
||||||
|
v-for="({ img, text }, index) in questions.data"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<UiParagraph class="text-center" size="250">
|
||||||
|
{{ text }}
|
||||||
|
</UiParagraph>
|
||||||
|
<img :src="`${img}`" alt="Вопрос" width="101" height="101" />
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiHeading from '@/components/Typography/UiHeading.vue'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import { reactive } from 'vue'
|
||||||
|
|
||||||
|
const questions = reactive({
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
img: '/img/svg/ellipse1.svg',
|
||||||
|
text: 'Что делать, если у тебя ноги не "от ушей" и ты далеко не Мисс Мира?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: '/img/svg/ellipse2.svg',
|
||||||
|
text: 'Как начать легко общаться с противоположным полом и о чем надо помолчать?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: '/img/svg/ellipse3.svg',
|
||||||
|
text: 'Как относиться к сексу и на сколько важна девичья невинность?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: '/img/svg/ellipse4.svg',
|
||||||
|
text: 'Сколько нужно заниматься, чтобы обрести НОВУЮ себя?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: '/img/svg/ellipse5.svg',
|
||||||
|
text: 'Как выработать стратегию долгосрочных отношений?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
img: '/img/svg/ellipse6.svg',
|
||||||
|
text: 'Как добиться того, чтоб парень делал так, как ты хочешь, но думал, что он сам так решил?',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
</script>
|
35
src/pages/mainPage/_ui/heroBanner/_ui/buyContent.vue
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue';
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
v-for="({ topContent, button, botContent }, index) in content.data"
|
||||||
|
:key="index"
|
||||||
|
class="flex flex-col items-center max-w-96"
|
||||||
|
>
|
||||||
|
<UiParagraph size="300" class="mb-12 h-32">{{ topContent }} </UiParagraph>
|
||||||
|
<UiButton variants="primary" class="mb-3 w-full">{{ button }} </UiButton>
|
||||||
|
<UiParagraph as="span" size="200"> {{ botContent }}</UiParagraph>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import UiButton from '@/components/UiButton/UiButton.vue'
|
||||||
|
import { reactive } from 'vue'
|
||||||
|
|
||||||
|
const content = reactive({
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
topContent:
|
||||||
|
'💡 Узнай, как думает мужчина, что его действительно цепляет, и что делает женщину незабываемой.',
|
||||||
|
button: 'КУПИТЬ КНИГУ I',
|
||||||
|
botContent: 'PDF + EPUB сразу после оплаты',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
topContent:
|
||||||
|
'💡 Продолжение для тех, кто готов перейти от флирта к глубокому контакту. Как строить притяжение, не теряя себя.',
|
||||||
|
button: 'КУПИТЬ КНИГУ II',
|
||||||
|
botContent: 'PDF + EPUB сразу после оплаты',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
</script>
|
18
src/pages/mainPage/_ui/heroBanner/heroBanner.vue
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<template>
|
||||||
|
<section>
|
||||||
|
<div class="relative z-50">
|
||||||
|
<img
|
||||||
|
src="/src/assets/img/webp/hero-banner-content.webp"
|
||||||
|
alt="Книги"
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row justify-between pl-16 pr-24">
|
||||||
|
<BuyContent />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import BuyContent from './_ui/buyContent.vue'
|
||||||
|
</script>
|
@ -0,0 +1,32 @@
|
|||||||
|
<template>
|
||||||
|
<section class="flex flex-row">
|
||||||
|
<div class="lg:w-5/12 pl-5 pr-5 shadow-md bg-[url('/src/assets/img/png/shadow.png')]">
|
||||||
|
<UiHeading tag="H2" size="300" class="text-three mb-4 mt-5">
|
||||||
|
💔 Ты не одна.
|
||||||
|
<br />Я знаю, через что ты<br />
|
||||||
|
проходишь.
|
||||||
|
</UiHeading>
|
||||||
|
<UiParagraph size="250" class="xl:max-w-[392px] mb-5"
|
||||||
|
>Когда ты снова и снова отдаёшь сердце, а в ответ — тишина или игра, это ранит. Я знаю это
|
||||||
|
чувство. Я был по ту сторону: манипулировал, очаровывал, уходил.
|
||||||
|
|
||||||
|
<br /><br />Я — бывший Казанова. И однажды я понял: больше так нельзя.
|
||||||
|
|
||||||
|
<br /><br />Эти книги — не теория. Это ключ к пониманию, как устроена мужская психология,
|
||||||
|
чего на самом деле хочет мужчина, и как перестать теряться в отношениях.
|
||||||
|
|
||||||
|
<br /><br />Я написал их для тебя — чтобы ты могла быть счастливой, не прогибаясь, не
|
||||||
|
умоляя, не теряя себя. Если ты устала «играть», если хочешь любви по-настоящему — начни с
|
||||||
|
первой страницы. В этих книгах нет воды. Только правда.</UiParagraph
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="lg:w-7/12">
|
||||||
|
<img alt="meeting" width="100%" height="100%" src="/img/webp/meetingAlone.webp" />
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiHeading from '@/components/Typography/UiHeading.vue'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
</script>
|
31
src/pages/mainPage/indexPage.vue
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<section class="relative z-50">
|
||||||
|
<HeroBanner
|
||||||
|
class="pt-28 bg-[url('/src/assets/img/png/bg.png')] z-40 bg-no-repeat bg-[400px] rounded-[50px] relative after:absolute after:bg-[url('/src/assets/img/webp/header-flowers-4.webp')] after:top-0 after:w-[418px] after:right-0 after:h-[230px] after:z-20 after:content-[''] after:bg-contain after:bg-no-repeat after:bg-right"
|
||||||
|
/>
|
||||||
|
<ForYouSection class="mt-40 pl-16 pr-24" />
|
||||||
|
<YouNotAloneSection class="mt-40 pl-16 pr-24 mb-40" />
|
||||||
|
<FeedbackSection class="mt-40 mb-52" />
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import FeedbackSection from './_ui/feedbackSection/feedbackSection.vue'
|
||||||
|
import ForYouSection from './_ui/forYouSection/forYouSection.vue'
|
||||||
|
import HeroBanner from './_ui/heroBanner/heroBanner.vue'
|
||||||
|
import YouNotAloneSection from './_ui/youNotAloneSection/youNotAloneSection.vue'
|
||||||
|
|
||||||
|
import { useHead } from '@vueuse/head'
|
||||||
|
|
||||||
|
useHead({
|
||||||
|
title: 'Vino Galante',
|
||||||
|
meta: [{ name: 'description', content: 'Онлайн магазин книг автора Vino Galante' }],
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `https://ebook.miduway.space/`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
</script>
|
87
src/pages/privacy/privacyPage.vue
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<template>
|
||||||
|
<section>
|
||||||
|
<UiHeading size="300" tag="H1" class="mb-5"> Политика конфиденциальности </UiHeading>
|
||||||
|
<UiParagraph size="300"
|
||||||
|
>Настоящая политика конфиденциальности описывает, как мы собираем, используем и защищаем
|
||||||
|
личную информацию, которую пользователи предоставляют при использовании нашего
|
||||||
|
сайта.</UiParagraph
|
||||||
|
>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">1. Сбор информации</UiHeading>
|
||||||
|
<UiParagraph size="300"
|
||||||
|
>При оформлении заказа на сайте вы предоставляете персональные данные, которые
|
||||||
|
включают:</UiParagraph
|
||||||
|
>
|
||||||
|
<ul class="list-disc pl-5">
|
||||||
|
<li><UiParagraph size="300">Адрес электронной почты</UiParagraph></li>
|
||||||
|
<li><UiParagraph size="300">Имя (по желанию)</UiParagraph></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">2. Использование информации</UiHeading>
|
||||||
|
<UiParagraph size="300">Ваши личные данные используются исключительно для:</UiParagraph>
|
||||||
|
<ul class="list-disc pl-5">
|
||||||
|
<li><UiParagraph size="300">Обработки и выполнения вашего заказа.</UiParagraph></li>
|
||||||
|
<li><UiParagraph> Связи с вами по вопросам вашего заказа. </UiParagraph></li>
|
||||||
|
<li>
|
||||||
|
<UiParagraph size="300">
|
||||||
|
Уведомления о важных обновлениях и новостях сайта (только если вы явно согласились на
|
||||||
|
рассылку).</UiParagraph
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">3. Защита личных данных</UiHeading>
|
||||||
|
<UiParagraph size="300">
|
||||||
|
Мы предпринимаем необходимые меры для защиты ваших личных данных от несанкционированного
|
||||||
|
доступа, изменения, разглашения или уничтожения. Доступ к личным данным имеют только
|
||||||
|
сотрудники, непосредственно участвующие в обработке заказов.
|
||||||
|
</UiParagraph>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">4. Передача информации третьим лицам</UiHeading>
|
||||||
|
<UiParagraph size="300">
|
||||||
|
Мы не передаём ваши личные данные третьим лицам, за исключением случаев, предусмотренных
|
||||||
|
законодательством Российской Федерации.
|
||||||
|
</UiParagraph>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">5. Cookies (Куки-файлы)</UiHeading>
|
||||||
|
<UiParagraph size="300">
|
||||||
|
Мы используем файлы cookie, чтобы улучшить ваш пользовательский опыт. Вы можете отключить
|
||||||
|
файлы cookie в настройках вашего браузера, однако это может ограничить доступ к некоторым
|
||||||
|
функциям сайта.
|
||||||
|
</UiParagraph>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">6. Изменения в политике конфиденциальности</UiHeading>
|
||||||
|
<UiParagraph size="300">
|
||||||
|
Мы можем периодически обновлять настоящую политику конфиденциальности. Об изменениях мы
|
||||||
|
уведомим вас, разместив новую версию политики на данной странице.
|
||||||
|
</UiParagraph>
|
||||||
|
|
||||||
|
<UiHeading size="300" tag="H2">7. Ваше согласие</UiHeading>
|
||||||
|
<UiParagraph size="300"
|
||||||
|
>Используя наш сайт, вы соглашаетесь с условиями данной политики
|
||||||
|
конфиденциальности.</UiParagraph
|
||||||
|
>
|
||||||
|
<UiParagraph size="300">
|
||||||
|
Если у вас возникнут вопросы или пожелания относительно обработки ваших персональных данных,
|
||||||
|
пожалуйста, свяжитесь с нами по электронной почте:
|
||||||
|
<a href="mailto:vinogalante@yandex.ru">vinogalante@yandex.ru</a>.
|
||||||
|
</UiParagraph>
|
||||||
|
</section>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import UiHeading from '@/components/Typography/UiHeading.vue'
|
||||||
|
import UiParagraph from '@/components/Typography/UiParagraph.vue'
|
||||||
|
import { useHead } from '@vueuse/head'
|
||||||
|
|
||||||
|
useHead({
|
||||||
|
title: 'Поликита конфиденциальности | Vino Galante',
|
||||||
|
meta: [{ name: 'description', content: 'Онлайн магазин книг автора Vino Galante' }],
|
||||||
|
link: [
|
||||||
|
{
|
||||||
|
rel: 'canonical',
|
||||||
|
href: `https://ebook.miduway.space/privacy`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
</script>
|
@ -1,14 +1,16 @@
|
|||||||
@import 'tailwindcss';
|
@import 'tailwindcss';
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
--color-primary: #ffffff;
|
--color-primary: rgba(255, 255, 255, 1);
|
||||||
--color-secondary: #f54b7e;
|
--color-secondary: rgba(229, 30, 125, 1);
|
||||||
--color-three: #e20c66;
|
--color-three: rgba(245, 75, 126, 1);
|
||||||
|
|
||||||
--color-accent-50: #f54378;
|
--color-accent-50: #f54378;
|
||||||
--color-accent-100: #e51e7d;
|
--color-accent-100: #e51e7d;
|
||||||
--color-accent-150: #c4035f;
|
--color-accent-150: #c4035f;
|
||||||
|
|
||||||
|
--color-black-50: #0c1018;
|
||||||
|
|
||||||
/*system colors*/
|
/*system colors*/
|
||||||
--color-error: oklch(57.7% 0.245 27.325);
|
--color-error: oklch(57.7% 0.245 27.325);
|
||||||
--color-warning: oklch(76.9% 0.188 70.08);
|
--color-warning: oklch(76.9% 0.188 70.08);
|
||||||
@ -17,3 +19,69 @@
|
|||||||
--color-text-disabled: oklch(55.1% 0.027 264.364);
|
--color-text-disabled: oklch(55.1% 0.027 264.364);
|
||||||
--color-bg-disabled: oklch(92.8% 0.006 264.531);
|
--color-bg-disabled: oklch(92.8% 0.006 264.531);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lato-thin {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 100;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-light {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 300;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-regular {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-bold {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-black {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 900;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-thin-italic {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 100;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-light-italic {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 300;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-regular-italic {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-bold-italic {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lato-black-italic {
|
||||||
|
font-family: 'Lato', sans-serif;
|
||||||
|
font-weight: 900;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.russo-one-regular {
|
||||||
|
font-family: 'Russo One', sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
{
|
{
|
||||||
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
|
"include": ["./src/**/*", "./src/**/*.vue"],
|
||||||
|
"exclude": ["./src/**/__tests__/*"],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|
||||||
/* Linting */
|
"paths": {
|
||||||
"strict": true,
|
"@/*": ["./src/*"]
|
||||||
"noUnusedLocals": true,
|
}
|
||||||
"noUnusedParameters": true,
|
}
|
||||||
"erasableSyntaxOnly": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"noUncheckedSideEffectImports": true
|
|
||||||
},
|
|
||||||
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
"files": [],
|
"files": [],
|
||||||
"references": [
|
"references": [
|
||||||
{ "path": "./tsconfig.app.json" },
|
{
|
||||||
{ "path": "./tsconfig.node.json" }
|
"path": "./tsconfig.node.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.app.json"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,25 +1,19 @@
|
|||||||
{
|
{
|
||||||
|
"extends": "@tsconfig/node22/tsconfig.json",
|
||||||
|
"include": [
|
||||||
|
"vite.config.*",
|
||||||
|
"vitest.config.*",
|
||||||
|
"cypress.config.*",
|
||||||
|
"nightwatch.conf.*",
|
||||||
|
"playwright.config.*",
|
||||||
|
"eslint.config.*"
|
||||||
|
],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
||||||
"target": "ES2022",
|
|
||||||
"lib": ["ES2023"],
|
|
||||||
"module": "ESNext",
|
|
||||||
"skipLibCheck": true,
|
|
||||||
|
|
||||||
/* Bundler mode */
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"moduleDetection": "force",
|
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
|
||||||
/* Linting */
|
"module": "ESNext",
|
||||||
"strict": true,
|
"moduleResolution": "Bundler",
|
||||||
"noUnusedLocals": true,
|
"types": ["node"]
|
||||||
"noUnusedParameters": true,
|
}
|
||||||
"erasableSyntaxOnly": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"noUncheckedSideEffectImports": true
|
|
||||||
},
|
|
||||||
"include": ["vite.config.ts"]
|
|
||||||
}
|
}
|
||||||
|