56 Commits

Author SHA1 Message Date
ff6f40fdb4 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 4m45s
2025-07-27 14:09:49 +04:00
7760305c08 fix
Some checks failed
Deploy Nuxt App / deploy (push) Failing after 16m30s
2025-07-27 13:03:18 +04:00
c88be2ff6f fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 3m53s
2025-07-27 09:42:46 +04:00
b4a936eac9 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 4m6s
2025-07-27 09:23:51 +04:00
4907ed064b fix
Some checks failed
Deploy Nuxt App / deploy (push) Failing after 1m48s
2025-07-27 09:13:31 +04:00
093e71b449 update
Some checks failed
Deploy Nuxt App / deploy (push) Failing after 44s
2025-07-27 09:11:25 +04:00
42a6225e99 new file: download/Otryvok_1.pdf
Some checks failed
Deploy Nuxt App / deploy (push) Failing after 50s
new file:   download/Otryvok_2.pdf
	modified:   nuxt.config.ts
	modified:   package.json
	modified:   pages/books/[slug].vue
	modified:   pages/books/_data/1.json
	modified:   pages/books/_data/2.json
2025-07-27 08:55:28 +04:00
1fd718a0a0 fix size fontstyle in question page
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 3m17s
2025-06-25 13:39:28 +04:00
925947ddd5 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 3m32s
2025-06-25 11:55:42 +04:00
1b211c3148 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 4m25s
2025-06-22 09:25:44 +04:00
925b6197f2 add. Closes #8
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 3m59s
2025-06-22 08:53:02 +04:00
5c97679188 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 3m40s
2025-06-21 10:06:45 +04:00
6eb987ffdb fix DockerFile
Some checks failed
Deploy Nuxt App / deploy (push) Has been cancelled
2025-06-21 06:06:07 +00:00
f2f7798e83 :wqMerge branch 'production' of https://gitea.miduway.space/levis/ebook into production 2025-06-21 05:41:27 +00:00
e396883830 add pages
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 2m40s
2025-06-21 09:40:31 +04:00
a783918241 :Merge branch 'production' of https://gitea.miduway.space/levis/ebook into production 2025-06-20 13:57:16 +00:00
f8a632b6df fix
Some checks failed
Deploy Nuxt App / deploy (push) Failing after 13m20s
2025-06-20 17:56:43 +04:00
d92fc4cf6e fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 2m27s
2025-06-20 16:53:15 +04:00
8529e66e33 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m53s
2025-06-20 16:11:27 +04:00
6c8a6e7c35 Merge branch 'production' of https://gitea.miduway.space/levis/ebook into production 2025-06-20 10:45:02 +00:00
117e579f2e fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m50s
2025-06-20 14:42:10 +04:00
8ba72bc8a4 fix
Some checks failed
Deploy Nuxt App / deploy (push) Has been cancelled
2025-06-20 14:41:42 +04:00
1823cd87b6 Merge branch 'production' of https://gitea.miduway.space/levis/ebook into production 2025-06-20 08:25:01 +00:00
94d008ca7d add html-validator + fix html ceo code
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m31s
2025-06-20 12:21:00 +04:00
9950665146 Merge branch 'production' of https://gitea.miduway.space/levis/ebook into production 2025-06-19 18:35:02 +00:00
cbabdf8ccb fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m52s
2025-06-19 22:30:52 +04:00
b73a9f5b3f Обновить README.md
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m47s
2025-06-19 18:17:46 +00:00
2909160b17 Обновить .gitea/workflows/deploy.yml
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m47s
2025-06-19 18:08:01 +00:00
2ef59fee78 Обновить README.md
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 2m26s
2025-06-19 18:01:41 +00:00
84cf03bd61 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m47s
2025-06-19 21:40:30 +04:00
3cd6a975f9 Merge branch 'production' of https://gitea.miduway.space/levis/ebook into production
Some checks failed
Deploy Nuxt App / deploy (push) Has been cancelled
2025-06-19 21:39:01 +04:00
15a7ffe120 fix
Some checks failed
Deploy Nuxt App / deploy (push) Has been cancelled
2025-06-19 17:37:47 +00:00
b54de4ace0 update deploy.yml
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m46s
2025-06-19 17:25:32 +00:00
7a283ababc remove .nuxt and .data
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m44s
2025-06-19 21:17:07 +04:00
eacb8a70d0 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m41s
2025-06-19 21:14:28 +04:00
bc3d085c02 fix
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m45s
2025-06-19 21:11:08 +04:00
4112bca029 Merge branch 'production' of https://gitea.miduway.space/levis/ebook into production
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 1m53s
2025-06-19 21:07:57 +04:00
76aa42dc25 fix DockerFile
All checks were successful
Deploy Nuxt App / deploy (push) Successful in 2m39s
2025-06-19 16:59:26 +00:00
551f68a78a fix DockerFile 2025-06-19 16:08:21 +00:00
46a59c7b91 fix 2025-06-18 10:04:01 +04:00
4cdb90eaf7 fix
All checks were successful
Deploy Application / deploy (push) Successful in 8s
2025-06-18 08:41:39 +04:00
4934e8be67 fix
All checks were successful
Deploy Application / deploy (push) Successful in 7s
2025-06-18 08:40:17 +04:00
886f21e0a2 fix
All checks were successful
Deploy Application / deploy (push) Successful in 7s
2025-06-18 08:35:55 +04:00
495638c922 fix
All checks were successful
Deploy Application / deploy (push) Successful in 7s
2025-06-18 08:33:33 +04:00
453376c024 Update config
All checks were successful
Deploy Application / deploy (push) Successful in 8s
2025-06-18 07:50:52 +04:00
4e35841df3 fix deploy
All checks were successful
Deploy Application / deploy (push) Successful in 8s
2025-06-17 17:52:41 +04:00
09edacf376 Merge pull request 'migrate on nuxt3' (#7) from migration-to-nuxt into production
Reviewed-on: #7
2025-06-17 13:49:35 +00:00
727fa976bd migrate on nuxt3 2025-06-17 17:46:03 +04:00
7634a3d616 fix
All checks were successful
Deploy Application / deploy (push) Successful in 6s
2025-06-17 11:27:13 +04:00
a30c08c50c del clg
All checks were successful
Deploy Application / deploy (push) Successful in 5s
2025-06-15 19:23:58 +04:00
0d91acc0cf fix sitemap
All checks were successful
Deploy Application / deploy (push) Successful in 6s
2025-06-15 19:21:23 +04:00
b65eabb723 fix sitemap
All checks were successful
Deploy Application / deploy (push) Successful in 5s
2025-06-15 19:19:20 +04:00
102ab3991b change font-size 20px -> 15px
All checks were successful
Deploy Application / deploy (push) Successful in 5s
feat privacy page
feat titles-page
2025-06-15 19:15:32 +04:00
e4176ba9c9 fix ceo
Some checks failed
Deploy Application / deploy (push) Failing after 30s
2025-06-14 20:39:58 +04:00
9fc338edd1 add suspense
All checks were successful
Deploy Application / deploy (push) Successful in 6s
2025-06-14 20:30:41 +04:00
886da93809 fix books img
All checks were successful
Deploy Application / deploy (push) Successful in 5s
2025-06-14 19:37:05 +04:00
126 changed files with 2278 additions and 6507 deletions

18
.env Normal file
View File

@ -0,0 +1,18 @@
DB_USER=
DB_HOST=
DB_NAME=
DB_PASSWORD=
DB_PORT=
YOOKASSA_SHOP_ID=
YOOKASSA_SECRET_KEY=
APP_URL=
# SMTP Configuration for Yandex
SMTP_USER=levishub@yandex.com
SMTP_PASS=avhpihoudpyvibtx
DEFAULT_TO_EMAIL=miduway@yandex.ru
SMTP_HOST=smtp.yandex.ru
SMTP_PORT=465

20
.env.example Normal file
View File

@ -0,0 +1,20 @@
DB_USER=
DB_HOST=
DB_NAME=
DB_PASSWORD=
DB_PORT=
YOOKASSA_SHOP_ID=
YOOKASSA_SECRET_KEY=
APP_URL=
# SMTP Configuration for Yandex
SMTP_USER=levishub@yandex.ru
SMTP_PASS=avhpihoudpyvibtx
DEFAULT_TO_EMAIL=miduway@yandex.ru
SMTP_HOST=smtp.yandex.ru
SMTP_PORT=465

View File

@ -1,4 +1,4 @@
name: Deploy Application name: Deploy Nuxt App
on: [push] on: [push]
jobs: jobs:
@ -8,27 +8,37 @@ jobs:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
token: 0406afe7de6547e850dd62c84976c6def23a5193 token: ${{ secrets.TOKEN }}
- name: Install curl - name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '22'
- name: Install dependencies and build
run: | run: |
if command -v apt-get &> /dev/null; then npm install
apt-get update && apt-get install -y curl npm run build
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: Upload config files to server - name: Prepare deployment files
run: |
tar -czf deploy.tar.gz dist Dockerfile docker-compose.yml
- name: Upload files via Gitea API
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: ${{ secrets.TOKEN }}
run: | run: |
for file in docker-compose.yml Dockerfile; do for file in Dockerfile docker-compose.yml; do
echo "Uploading $file"
curl -X PUT \ curl -X PUT \
-H "Authorization: token $GITEA_TOKEN" \ -H "Authorization: token $TOKEN" \
-H "Content-Type: text/plain" \
-T "$file" \ -T "$file" \
"$GITEA_API/$file" "$GITEA_API/$file?branch=main"
done done
curl -X PUT \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/gzip" \
-T "deploy.tar.gz" \
"$GITEA_API/deploy.tar.gz?branch=main"

11
.gitignore vendored
View File

@ -11,7 +11,15 @@ node_modules
dist dist
dist-ssr dist-ssr
*.local *.local
.nuxt
.output
.data
.nuxt
.nitro
.cache
dist
.history
# Editor directories and files # Editor directories and files
.vscode/* .vscode/*
!.vscode/extensions.json !.vscode/extensions.json
@ -22,6 +30,5 @@ dist-ssr
*.njsproj *.njsproj
*.sln *.sln
*.sw? *.sw?
package-lock.json
frontend.env frontend.env

13
.htmlvalidate.json Normal file
View File

@ -0,0 +1,13 @@
{
"root": true,
"extends": ["html-validate:recommended", "html-validate:standard"],
"rules": {
"heading-level": "error",
"require-img-alt": "error",
"element-permitted-content": "error",
"require-meta-title": "error",
"require-meta-description": "error",
"no-duplicate-id": "error",
"prefer-native-element": "error"
}
}

View File

@ -1,2 +0,0 @@
npm run lint
npm run format

View File

@ -1,3 +0,0 @@
{
"recommendations": ["Vue.volar"]
}

View File

@ -1,13 +1,7 @@
FROM node:20 as builder FROM node:22-slim
WORKDIR /usr/src/app
WORKDIR /app
COPY package*.json ./ COPY package*.json ./
RUN npm install RUN npm install
COPY . . COPY . .
RUN npm run build RUN npm run build
CMD ["node", "dist/server/index.mjs"]
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY ebook.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

View File

@ -1,27 +1,76 @@
# Проект сайт vino Galante # Nuxt Minimal Starter
## Описание проекта Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
Интернет сайт Vino Galente создан для продажи книг за авторством... ## Setup
### Установка, для разработки Make sure to install dependencies:
Копируем env ```bash
# npm
``` npm install
cp frontend.env frontend.env.example
# pnpm
pnpm install
# yarn
yarn install
# bun
bun install
``` ```
Устанавливаем зависимости ## Development Server
``` Start the development server on `http://localhost:3000`:
yarn
```bash
# npm
npm run dev
# pnpm
pnpm dev
# yarn
yarn dev
# bun
bun run dev
``` ```
Запуск dev ## Production
``` Build the application for production:
vite
```bash
# npm
npm run build
# pnpm
pnpm build
# yarn
yarn build
# bun
bun run build
``` ```
Разворачивание, docker Locally preview production build:
```bash
# npm
npm run preview
# pnpm
pnpm preview
# yarn
yarn preview
# bun
bun run preview
```
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.

15
app.vue Normal file
View File

@ -0,0 +1,15 @@
<template>
<NuxtLayout>
<!-- <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" />
<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"
/> -->
<NuxtPage />
</NuxtLayout>
</template>

View File

@ -1,6 +1,8 @@
@import 'tailwindcss'; @tailwind base;
@tailwind components;
@tailwind utilities;
@theme { :root {
--color-primary: rgba(255, 255, 255, 1); --color-primary: rgba(255, 255, 255, 1);
--color-secondary: rgba(229, 30, 125, 1); --color-secondary: rgba(229, 30, 125, 1);
--color-three: rgba(245, 75, 126, 1); --color-three: rgba(245, 75, 126, 1);
@ -20,30 +22,27 @@
--color-bg-disabled: oklch(92.8% 0.006 264.531); --color-bg-disabled: oklch(92.8% 0.006 264.531);
} }
/* Кастомные классы шрифтов */
.lato-thin { .lato-thin {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 100; font-weight: 100;
font-style: normal; font-style: normal;
} }
.lato-light { .lato-light {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 300; font-weight: 300;
font-style: normal; font-style: normal;
} }
.lato-regular { .lato-regular {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 400; font-weight: 400;
font-style: normal; font-style: normal;
} }
.lato-bold { .lato-bold {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 700; font-weight: 700;
font-style: normal; font-style: normal;
} }
.lato-black { .lato-black {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 900; font-weight: 900;
@ -55,25 +54,21 @@
font-weight: 100; font-weight: 100;
font-style: italic; font-style: italic;
} }
.lato-light-italic { .lato-light-italic {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 300; font-weight: 300;
font-style: italic; font-style: italic;
} }
.lato-regular-italic { .lato-regular-italic {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 400; font-weight: 400;
font-style: italic; font-style: italic;
} }
.lato-bold-italic { .lato-bold-italic {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 700; font-weight: 700;
font-style: italic; font-style: italic;
} }
.lato-black-italic { .lato-black-italic {
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
font-weight: 900; font-weight: 900;

3
assets/icon/arrow.svg Normal file
View File

@ -0,0 +1,3 @@
<svg width="14" height="20" viewBox="0 0 14 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.9401 11.1109L2.9533 20L0.457031 17.7781L9.19574 10L0.457031 2.22187L2.9533 0L12.9401 8.88906C13.2711 9.18373 13.457 9.58334 13.457 10C13.457 10.4167 13.2711 10.8163 12.9401 11.1109Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 354 B

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

View File

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 206 KiB

View File

Before

Width:  |  Height:  |  Size: 251 KiB

After

Width:  |  Height:  |  Size: 251 KiB

View File

Before

Width:  |  Height:  |  Size: 409 KiB

After

Width:  |  Height:  |  Size: 409 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Before

Width:  |  Height:  |  Size: 613 KiB

After

Width:  |  Height:  |  Size: 613 KiB

View File

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 496 B

After

Width:  |  Height:  |  Size: 496 B

71
components/EmailForm.vue Normal file
View File

@ -0,0 +1,71 @@
<template>
<div class="max-w-md mx-auto p-6 rounded-lg shadow-md text-gray-900">
<h2 class="text-2xl font-bold mb-6 text-primary text-center">Заполните контактные данные</h2>
<form @submit.prevent="onSubmit" class="space-y-4">
<div>
<label for="to" class="block text-sm font-medium text-primary mb-2"> Ваш e-mail: </label>
<input
id="to"
v-model="to"
type="email"
required
placeholder="email@example.com"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent text-gray-900"
/>
</div>
<UiButton type="submit" :disabled="isLoading" class="w-[400px]">
<span v-if="isLoading">Перехожу...</span>
<span v-else>Перейти к оплате</span>
</UiButton>
</form>
<div v-if="status" class="mt-4 p-3 rounded-md" :class="statusClass">
{{ status }}
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
const to = ref('')
const status = ref('')
const isLoading = ref(false)
const statusClass = computed(() => {
if (status.value.includes('Ошибка')) {
return 'bg-red-100 text-red-700 border border-red-200'
}
if (status.value.includes('Успех')) {
return 'bg-green-100 text-green-700 border border-green-200'
}
return 'bg-blue-100 text-blue-700 border-blue-200'
})
async function onSubmit() {
if (!to.value) {
status.value = 'Пожалуйста, введите ваш e-mail'
return
}
isLoading.value = true
status.value = ''
try {
await $fetch('/api/send-order', {
method: 'POST',
body: { to: to.value },
})
status.value = 'Успех! Письмо с подтверждением отправлено на вашу почту.'
to.value = ''
} catch (error) {
console.error('Ошибка отправки письма:', error)
status.value = `Ошибка отправки: ${error?.data?.message || error.message || 'Неизвестная ошибка'}`
} finally {
isLoading.value = false
}
}
</script>

View File

@ -0,0 +1,17 @@
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",
],
};

View File

@ -1,6 +1,9 @@
<template> <template>
<component <component
:is="tag" :is="tag"
:type="tag === 'button' ? 'button' : ''"
:to="path"
:href="path"
class="px-14 py-4 rounded-[20px] text-[30px] cursor-pointer shadow-[0px_16px_50px_-16px_rgba(229,30,125,1)]" class="px-14 py-4 rounded-[20px] text-[30px] cursor-pointer shadow-[0px_16px_50px_-16px_rgba(229,30,125,1)]"
:class="[baseStyle, size]" :class="[baseStyle, size]"
data-ui="ui-button" data-ui="ui-button"
@ -11,7 +14,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { toRefs, computed } from 'vue' import { toRefs, computed } from 'vue'
import { colorVariants } from './UiButton.params.ts' import { colorVariants } from './UiButton.params.js'
const props = defineProps({ const props = defineProps({
tag: { tag: {
@ -29,6 +32,10 @@ const props = defineProps({
type: String, type: String,
default: 'font-bold', default: 'font-bold',
}, },
path: {
type: String,
default: '',
},
}) })
const { tag, variants, size } = toRefs(props) const { tag, variants, size } = toRefs(props)

View File

@ -2,7 +2,7 @@
<UiParagraph <UiParagraph
class="cursor-pointer" class="cursor-pointer"
as="span" as="span"
size="300" size="250"
v-for="({ path, name, target }, index) in navContent" v-for="({ path, name, target }, index) in navContent"
:key="index" :key="index"
data-ui="ui-nav" data-ui="ui-nav"

28
config/head.ts Normal file
View File

@ -0,0 +1,28 @@
export default {
meta: [
{ charset: "utf-8" },
{
name: "viewport",
content:
"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no",
},
],
link: [
{
rel: "preconnect",
href: "https://fonts.googleapis.com",
},
{
rel: "preconnect",
href: "https://fonts.gstatic.com",
},
{
rel: "stylesheet",
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",
href: "https://fonts.googleapis.com/css2?family=Russo+One&display=swap",
},
],
};

11
config/index.ts Normal file
View File

@ -0,0 +1,11 @@
import modules from "./modules";
import sitemap from "./sitemap";
export default {
modules,
sitemap,
typescript: {
strict: true,
typeCheck: true,
},
};

13
config/modules.ts Normal file
View File

@ -0,0 +1,13 @@
export default [
'@nuxt/eslint',
'@nuxt/icon',
'@nuxt/image',
'@nuxt/content',
// '@nuxt/fonts',
'@pinia/nuxt',
'@nuxtjs/tailwindcss',
'@pinia/nuxt',
'@nuxtjs/html-validator',
// '@nuxtjs/robots',
// '@nuxtjs/sitemap',
]

12
config/sitemap.ts Normal file
View File

@ -0,0 +1,12 @@
// ./sitemap.config.ts
export default {
siteUrl: 'https://ebook.miduway.space',
// Примеры маршрутов, можно заменить на API-запрос
urls: [
{ loc: '/books/1' },
{ loc: '/books/1/title-1' },
{ loc: '/books/2/title-2' },
{ loc: '/books/2' },
],
}

10
content.config.ts Normal file
View File

@ -0,0 +1,10 @@
import { defineContentConfig, defineCollection } from '@nuxt/content'
export default defineContentConfig({
collections: {
books: defineCollection({
type: 'page',
source: '/books/*.md',
}),
},
})

69
content/books/1.md Normal file
View File

@ -0,0 +1,69 @@
<div style="color: #f54b7e; font-weight: bold; font-size: 1.5em;">Глава 1. Перезагрузка</div>
### Введение
&ensp;&ensp;Название первой главы - “Перезагрузка”. Как ты думаешь, почему? Потому что всё начинается с твоей головы и только с твоей головы. Суть этой главы - выработать в тебе правильное отношение к мужчинам. Правильное значит такое, которое тебе позволит нами управлять, хотя и неявно. Если ты хочешь иметь успех у мужчин, тебе просто необходимо правильно к нам относиться. Тебе нужна правильная система взглядов. Ты должна знать, по каким законам функционирует система “мужчина”. В противном случае ты обречена на провал, независимо от внешних данных, финансовой ситуации и всего остального.<br/>
Пример. С чего начинается обучение водительскому мастерству? Правильно, с теории. На курсах вождения тебе объясняют, по каким правилам и законам движутся автомобили. Зная эти правила, ты можешь безопасно передвигаться в мегаполисе. Т.е. используя машину, ты добираешься из пункта “А” в пункт “Б”. Т.е. ты достигаешь своей цели быть в пункте “Б”, приехать на работу, например.<br/>
&ensp;&ensp;То же самое и в соблазнении. Все те убеждения соблазнительницы, с которыми ты ознакомишься в этой главе, такие же правила безопасности дорожного движения. Если твои нынешние убеждения относительно парней сильно разнятся с истинными, то ты просто не можешь иметь настоящий успех у мужчин. Мне очень повезло в жизни - не знаю почему, но я встретился с одной очень хорошей правильной девушкой. Девушка очень красивая, но с парнями на тот момент у нее был явный недобор. Все, что ей мешало иметь колоссальный успех у парней - неправильное отношение к мужчинам. Например, она считала, что мужчина первым должен проявлять активность, а девушка при этом вообще ничего не должна делать. Прошло полгода, теперь она проводит в день по три свидания, ей дарят золото, за ней ухаживают очень классные парни, такие, от которых у обычной девушки текут слюнки. Ей уже поступило несколько предложений о замужестве.
Что же позволило ей так возвыситься над обычными девушками? Ответ ты найдешь в этой главе.
### <span style="color: #f54b7e;">Убеждения соблазнительницы</span>
_"Мы формируем свои убеждения в детстве,_<br/>
_а потом движемся по жизни, воссоздавая_<br/>
_ситуации, которые подошли бы нашим убеждениям."_ <br/>
уиза Хей_
&ensp;&ensp;Ты наверно думаешь, что успешная соблазнительница - это такая очень красивая девушка, понимающая все тонкости в моде и умеющая соблазнительно кокетничать? У нее обязательно должны быть длинные красивые ноги и осиная талия? Вся такая Мэрилин Монро? Тогда я не завидую твоей способности общаться с мужчинами. Сейчас я разобью эти глупые убеждения, созданные рекламой и всей этой телевизионной шелухой. Но мне надо, чтобы ты сама думала, сама использовала свой самый главный актив - свой мозг. Поэтому ответь на вопрос - какова была личная жизнь Мэрилин Монро? Ответила? Спасибо. Теперь ответь на следующий вопрос - какова личная жизнь типичной очень красивой девушки? Ответила? Спасибо. А теперь правильные ответы.<br/>
&ensp;&ensp;Мэрилин Монро, эта актриса, певица и, самое главное, секс-символ Америки 50 ÷ 60 годов прошлого столетия, была 3 раза замужем и умерла в очень молодом возрасте (всего 36 лет) от передозировки снотворного. Мдаа.<br/>
Первый муж - Джим Дагерти, то ли моряк, то ли еще не пойми кто. Мэрилин было всего 16 лет, когда они поженились. Совсем ребенок еще. Характеризовала брак как ошибку молодости. Второй брак. Какой-то Джо Ди Маджо, звезда бейсбола. Брак просуществовал всего 9 месяцев. Мужик был необычайно ревнив и ревновал Мэрилин даже к публике. Ему было сложно терпеть ее популярность. Если брак даже и год не продержался, значит это был изначально один большой косяк, а не брак. Ладно, кратко о последнем браке. Третий муж - Артур Миллер. Драматург. Вроде более-менее брак. Продержался 4.5 года. Ходят слухи о четвертом браке и о том, что на Мэрилин залезал президент США Кеннеди. И вроде как причина смерти Мэрилин - убийство, т.к. она начала заявлять свои права на президента, и тот, чтобы устранить проблему, устранил любовницу.
Из этой истории, так напоминающей кальку современной жизни, делаем следующие выводы:
1. Сама по себе красота, даже если это дьявольски привлекательная красота, ничего не дает.
2. Так, желаемая всеми популярность абсолютно не гарантирует счастья в личной жизни.<br/><br/>
Пока остановимся на этих двух выводах.<br/>
&ensp;&ensp;Еще в недавнем прошлом моей слабостью были модели. Они такие красивые, утонченные, у них длинные изящные пальцы - не девушки, а сплошное загляденье. И главное, они недоступны для обычных парней. Сколько раз я видел, как мужики сворачивали головы, провожая взглядом мою очередную спутницу. Конечно! В школу моделей берут всех, в модели - единицы. Самое интересное - наблюдать за реакцией парней. Вначале они бросают взгляд на девушку, примерно через секунду на меня. Если я делаю морду кирпичом - убирают взгляд, если нет - снова смотрят на девушку. Их можно понять, ведь по-настоящему красивая девушка - это истинное произведение искусства. Сам Бог ваяет настоящих моделей. И, естественно, у меня было много моделей и не только из моего города. И как ты думаешь, что я тебе скажу о них? Многие из них несчастны в личной жизни. Это просто парадоксально! Как могут быть несчастны такие красавицы?!<br/>
&ensp;&ensp;Вначале я удивлялся, потом привык. Да ты хотя бы посмотри на мисс Вселенная Оксану Федорову. Полнейшая неразбериха в личной жизни. Она же мисс Вселенная! Представляешь?! Официально она самая красивая девушка планеты Земля в 2002-м году.<br/>
&ensp;&ensp;Она могла выбрать любого. А красавица Дениз Ричардс? В 2002-м в возрасте 31 года вышла замуж за актера Чарли Шина. Как можно было выходить замуж за такого дегенерата? Чарли Шин известен своими многочисленными скандалами в личной и общественной жизни, он наркоман. В 2011 году Шин был уволен компаниями CBS и Warner Bros. Television. Мдаа. С 2011 года этот актер живет с Бри Олсон. Бри Олсон -порноактриса. Кто такая порноактриса? Порноактриса это всего лишь помойное ведро, она отсосет у любого, на кого укажет режиссер. Надо иметь весьма убогий разум, чтобы жить со шлюхой. И вот Дениз, живое воплощение женской красоты, выбрала для себя такого недочеловека. Прожив четыре года, они разошлись. Дениз осталась с двумя детьми.<br/>
&ensp;&ensp;Во истину покажите мне красивую, нет, очень красивую девушку, и я покажу вам трагедию. К чему это я все? А к тому, что главное в тебе - это твои мозги. Главное в тебе - это твои установки и ценности, которыми ты руководствуешься в жизни, твои глубинные убеждения. И если ты будешь женственной, нежной девушкой и, самое главное, умной, ты стопроцентно найдешь себе достойного человека. В этом просто нет никаких сомнений.<br/>
&ensp;&ensp;Теперь посмотрим на жен успешных людей. На женщин, у которых в личной жизни все тип-топ. Кого же взять на рассмотрение? А давай-ка возьмем царицу нашей страны - Светлану Владимировну Медведеву (фотографии смотри в интернете). Это жена действующего президента нашей страны Дмитрия Анатольевича Медведева. Родилась 15-го марта 1965 года в Кронштадте, детство провела в деревне Коваши. По одним данным вышла замуж в 24 года, по другим в 28. Ну что тут сказать? Смотри фотографии и делай выводы сама. В жизни сплошь и рядом девушки с самой заурядной внешностью удачно выходят замуж. Почему? Читай дальше.
_&ensp;&ensp;Задание. Найди информацию, например, биографии о пяти женщинах, успешных в личной жизни и о пяти женщинах, несчастных в личной жизни. Проанализируй их и сделай хотя бы по 5 выводов о том, что же объединяет женщин успешных и что объединяет женщин не успешных. Таким образом, в сумме ты получишь 10 выводов. Обращай внимание не только на убеждения или установки, но и на то, какое воспитание получили девочки в детстве, в каких семьях росли, какова судьба их матерей и т.д. После 10 общих выводов в тебе должна родиться одна главная мысль, один общий вывод. Сделай это, потом читай дальше._
<br/>
&ensp;&ensp;Я верю в тебя и поэтому знаю, что общий вывод, который ты сделаешь сама для себя, будет таким: 99% успеха в соблазнении зависит от твоих ценностей, доминантных мыслей, убеждений, отношения к жизни, к мужчинам, т.е. всего того, что находится в твоей голове. И почти не зависит от природных внешних данных, места рождения, текущей финансовой ситуации и т.п. Сейчас я приведу убеждения успешной соблазнительницы, которые ты должна выучить как Отче наш и которые ты обязана проверить на практике. Все до единого! Вот этот ключ, открывающей тебе дорогу в долину любых отношений, которые ты только захочешь иметь. Они позволят тебе играть с мужчинами как кошка с мышкой и брать от них то, о чем обычная девушка не может и мечтать. Вот они:
1. Всё всегда хорошо
2. Другие девушки не помеха для меня
3. Парней много, я одна
4. Использовать мужчин естественно и приятно
5. Отшивать мужчин - это естественно
6. Ты имеешь ровно то, что заслужила
7. Ты достойна гораздо большего
8. Все мечты достижимы
9. Проявлять активность девушке естественно
10. Мужчины до замужества - тренажеры
11. Мужчина должен относиться уважительно
12. Среди мужчин есть идиоты
13. Желание секса от мужчины - это нормально
14. Мужчины общаются, когда им что-то нужно
15. Пока не было секса - ты не проиграла
16. Удовольствие от общения = всё по плану
17. Ты ничего не должна мужчине
18. Соблазнение - интересная игра
19. Ахиллесовы пяты мужчин: эго и секс
20. Мужчины - хорошие создания
21. Мужчины не примитивны
22. Мужчинам нужно не только секс
23. Смысл жизни - развитие
24. Запасной аэродром - это нормально
25. Сексом мужчину не удержать
26. Общение должно приносить радость
27. Мужчины любят высокоранговых женщин
28. Мир - отражение тебя самой
&ensp;&ensp;А теперь остановимся подробнее на каждом из этих убеждений. Надо сказать, что ты можешь высечь все эти убеждения на камне и использовать этот камень у себя вместо спальной подушки. Ты должна на собственном опыте убедиться в правоте этих убеждений. Эти убеждения - не что-то волшебное. Они просто сама суть жизнь, реальное положение вещей. Всё перечисленное - факты. Зная настоящие правила игры, ты получаешь шанс выиграть в этой игре. Только так, а руководствуясь ложными убеждениями ты всегда будешь оставаться в дурах.<br/>
&ensp;&ensp;Если ты хочешь достичь определенной цели - тебе нужны истинные знания. Только истинные знания позволят достичь цели. Все неистинные знания (ложь) забирают твое время, силы и уводят от нужного результата. Если бы ты могла жить вечно и при этом сохранить свою привлекательность, тебе не понадобилась бы эта книга. Просто экспериментируя и набивая себе шишки, исследовав все ложные тропы, ты нашла бы одну истинную и достигла бы нужного тебе результата. Но в жизни не так. У успешных спортсменов - выдающиеся тренера. У успешных бизнесменов - выдающиеся наставники. Человек даже писать и читать без учителя не научится. И в соблазнении у тебя есть учителя, только это слабые и некомпетентные учителя, поэтому учась у них, ты останешься такой же некомпетентной. Кто твои учителя? Правильно, это те люди, с которыми ты общаешься на темы соблазнения, т.е. твои подруги. Возможно, мама. Это уже лучше. Потому что она-то уж точно желает тебе добра, а насчет подруг - большой вопрос. В общем, послушай человека, достигшего определенных успехов в этом вопросе, т.е. меня. Даже если ты просто прочитаешь эту книгу, тебе станет гораздо легче. А уж если ты и задания будешь выполнять, а потом изучишь и вторую мою книгу… Истинно тебе говорю - ты будешь смеяться над своим текущим уровнем в общении с парнями.<br/>
&ensp;&ensp;Ты что-нибудь знаешь про метод тотальной бомбежки? Есть такой метод. Сделай себе шпаргалку с этими убеждениями, заглядывай в нее каждые полчаса и размышляй над тем убеждением, которое первым бросится тебе в глаза. Думай и думай - задавай себе вопросы - “А почему так? Какая мне польза от этого убеждения? Какие истории из моей жизни или жизни моих подруг подтверждают правильность этих убеждений?” Твой мозг должен вскипеть от такой работы. Думай и думай над этими убеждениями. Выучи их наизусть так, чтобы они от зубов твоих отлетали. После этого ты должна “вылизать”, “обсосать” каждое из этих убеждений, обсмаковать, понять в тончайших деталях, а это уже делается только на практике и только с помощью практики. Обязательно проверь их на практике, впитай в себя, а не то грош цена всем твоим стараниям.<br/>
&ensp;&ensp;Многие из этих убеждений очень глубокие, глубже и мощнее наших океанов, и для того, чтобы они стали частью тебя, тебе потребуется много практики и несколько лет жизни. Но это стоит того. Всё, что ты тратишь на улучшение - это только время и старания. Больше ничего. И это ничтожная цена за то, кем ты станешь. После всего пары лет упорной работы ты настолько изменишься в лучшую сторону, что будешь смотреть на себя теперешнюю как на слепого котенка. Тебе будет смешно. Ты будешь смотреть на своих сверстниц и ощущать огромнейшую разницу между тобой и ними. Тебе захочется им помочь, ты будешь смотреть на них, как на слепых котят, которые бьются головой об ножку стула и не могут ее обойти. Ты также будешь насквозь видеть мужчин, ты будешь чувствовать, на каком этапе игра, все будет под твоим контролем. Ты выйдешь на недостижимый для миллионов девушек уровень. У тебя откроются глаза. Ты ни за что не захочешь возвращаться в свое текущее состояние. Но для этого тебе надо начать действовать, да, черт подери, тупо начать действовать! Первый этап работы - перепрошивка мозга.<br/>
&ensp;&ensp;Итак, убеждения.

37
content/books/2.md Normal file
View File

@ -0,0 +1,37 @@
<div style="color: #f54b7e; font-weight: bold; font-size: 1.5em;">Глава 2. Ближний бой</div>
### <span style="color: #f54b7e;">Введение</span>
&ensp;&ensp;Эта глава — самая важная глава в моей второй книге. Умение калибровать, несомненно, тоже важно. Но калибровать — природный дар девушек, вы очень быстро этому и обучаетесь, и изначально почти умеете. Именно поэтому во второй книге я сделал акцент не на калибровке, а именно на умении так влюбить в себя парня, что он будет помнить тебя даже перед лицом смерти. Техники влюбления… здесь я рассказываю далеко не очевидные вещи. Но они очень важны, очень. Крутую соблазнительницу от неопытной девушки отличают действия. Если они обе одинаково красивы, одинаково стильны, одинаково умны и приветливы, то всё, что их отличает, это действия. Соблазнительница просто действует по-другому, она делает другие вещи. Вот и всё. И я еще раз повторяю, ты не сможешь сама догадаться до тех фишек, которые проворачивает соблазнительница. Те фишки, о которых ты узнаешь из моей книги, я смог синтезировать, только на основе моего опыта и природной склонности к анализу. Физико-математический лицей и 4 года аспирантуры сделали свое дело. У меня есть природная склонность анализировать, я люблю думать. Мне нравится сам процесс мышления. Чтобы начать думать в правильном русле, нужны правильные знания, правильный опыт. На приобретение этого пресловутого опыта в лучшем случае может уйти год. У меня ушло больше, не было наставника. Приходилось до многих вещей доходить самому[1] .
Но видимо у тебя хорошая карма, если в своих руках ты держишь эту книгу. Поэтому я не буду тебе рассказывать всякую чушь, которую пишут авторы-женщины в своих псевдо-учебниках по скрытому управлению мужчинами, соблазнению и т.д. Я пишу самую суть правды. Хотя, может это и не так уж плохо, что в теме соблазнения мужчин, все авторы — сплошные лохушки, пишущие о ширине твоего каблука, который должен быть на первом свидании. Что тебе идет, то и носи. Вот и вся правда про одежду. На фоне авторов, ничего не смыслящих в соблазнении, я выгляжу круче. Я удовлетворяю свой эгоизм, свою самовлюбленность и прочие черные стороны своей личности. Мой уровень, то качество материала, который я выдаю, становятся еще выше и качественнее на фоне псевдоспециалистов. Обычные авторы, которые пишут про соблазнение — это псевдоспециалисты. Спасибо вам, авторы-лохи, вы позволяете ощутить мне свою исключительность. А любому мужчине это очень приятно.
### <span style="color: #f54b7e;">Техника влюбления</span>
_Здесь даются реальные знания._<br/>
арвард_
&ensp;&ensp;Механизм мужской и женской влюбленностей<br/>
Механизмы мужской и женской влюбленностей несколько разнятся. Т.е. мужчины и женщины, парни и девушки влюбляются по-разному. У девушек крышу сразу не сносит, а у парней крышу сносит именно сразу. В этом и заключается принципиальное различие в механизмах. Безусловно, эта разница — классика, поэтому на этот счет есть вариации. Однако, по своей сути, так оно и есть. На первых порах отношений девушка способна трезво оценивать парня. Она еще не влюбилась, она оценивает, присматривается, приценивается к парню. Он ей нравится, но она может трезво мыслить. Видишь эти два графика ниже по тексту[2]? Теперь ты понимаешь различие в механизмах.
Когда отношения с девушкой только начинаются, когда еще не было секса, парень испытывает некое подобие эйфории и одновременной зависимости от девушки. Я опять же говорю о классическом случае. Парень пытается быть максимально хорошим для нее. Она ему нравится, он запал на нее. Все его мысли — о ней. Девушка же влюбляется с задержкой по времени, когда парень пройдет ее фильтры. Когда у нее “щелкнет” в голове, тогда она и влюбляется.
<div style="display:flex; flex-direction: column; justify-content: center; align-items: center;">
![Рисунок 5 — Различия между мужской и женской схемами влюбления](image2.png)
Рисунок 5 — Различия между мужской и женской схемами влюбления<br/>
_Иллюстрация создана автором книги_
</div>
&ensp;&ensp;Смотри, как выгодно для тебя устроила природа. Ты еще ничего не сделала в плане развития отношений, но уже имеешь бонус. Красота!! Спасибо матери-природе. Такой механизм — следствие заботы о выживании рода, вида. Вид должен выжить. Поэтому тебе дается время на фильтрацию самцов, чтобы ты могла выбрать лучшего и получить его семя. Самый живучий самец, самец, обошедший своих сородичей, самый жизнеспобный, способен дать тебе лучшее семя среди своих представителей. Так ты сможешь родить наиболее жизнеспособного ребенка, самого живучего. Забеременев же от слабого самца, ты родишь слабое потомство. Именно из-за такого механизма выживания вида парень сразу испытывает влечение к девушке, но после первого секса сразу же остывает к ней. Его задача выполнена, он оплодотворил самку. Его следующая задача — найти новую самку и оплодотворить ее. Поэтому он также быстро “западает” на следующую, трахает ее, остывает к ней и ищет новую. Парень выполняет задачу продолжения рода: совокупляется с максимальным количеством девушек.
Но для нас с тобой сейчас самое важное — работать в зоне t — фильтрации. Как раз в период, который тебе подарила мать-природа, ты должна работать над отношениями. Тебе дали бонус в виде времени, не просри его. Те фишки, которые я тебе даю, имеют максимальную эффективность как раз в период фильтрации самцов. Как только вы переспите, период фильтрации закончится. И эффективность любых манипулятивных фишек, даже от Вино Галанте, упадет в разы. Это же так просто!! Ты пропустила парня через свои фильтры. Мать-природа позаботилась о том, чтобы сразу после этого ему захотелось другую самку. Как только ему захотелось другую, тебе становится архисложно влиять на парня. Природа, природа, против нее не поспоришь.
Сколько времени длится период фильтрации самцов? Запомни, в соблазнении отсутствует время как таковое, в соблазнении присутствует качество. Поэтому период фильтрации может длиться один час, а может год или два. Здесь все зависит от твоего уровня. Но период фильтрации заканчивается первым сексом. Потому что ты уже отфильтровала парня. Раз ты его отфильтровала, как же может продолжаться фильтрация? Правильно, никак. А начинается период первой коммуникацией, считай, что словом “Привет”. Видишь, никаких времен, только условия.
### <span style="color: #f54b7e;">Главный секрет влюбления</span>
&ensp;&ensp;Для того, чтобы парень влюбился в тебя, необходимо и достаточно выполнения всего четырех условий. На самом деле, когда ты работаешь по влюблению в себя парня, ты действуешь согласно всего четырем правилам. Все эти четыре правила или условия являются необходимыми и достаточными. Необходимые, значит, требуется выполнение всех четырех условий, чтобы в тебя влюбились. Достаточные, значит, требуется выполнение только этих четырех условий и никаких больше.
Для влюбления парня **необходимы и достаточны 4 условия**:
- **Подстройка ментальная** — совпадение мышления.
- **Подстройка по ценностям** — общие принципы жизни.
- **Поведение** — действия, которые цепляют.
- **Достаточное качество девушки** — внешность, интеллект, харизма.
&ensp;&ensp;Выбей этот секрет влюбления на огромном камне и используй этот камень вместо подушки. Только что я рассказал тебе главный секрет влюбления в себя мужчины. Или девушки, здесь нет никакой разницы, кстати. Есть всего четыре вещи: ментальная подстройка, подстройка по ценностям, твое качество и твое поведение. Всё, больше ничего нет. Больше ничего не требуется, чтобы влюбить в себя абсолютно любого парня. Самое сложное, над чем приходится работать обычной девушке — ее качество. Если же ты родилась с внешностью Адрианы Лимы или Миранды Керр, да еще и с головой на плечах. Тогда тебе крупно повезло, работать придется не так уж и много. Ты — девушка высокого качества. Четвертый пункт удовлетворен.

BIN
content/books/image2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -1,10 +1,7 @@
import { globalIgnores } from "eslint/config"; import { globalIgnores } from 'eslint/config'
import { import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
defineConfigWithVueTs, import pluginVue from 'eslint-plugin-vue'
vueTsConfigs, import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'
} from "@vue/eslint-config-typescript";
import pluginVue from "eslint-plugin-vue";
import skipFormatting from "@vue/eslint-config-prettier/skip-formatting";
// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: // To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
// import { configureVueProject } from '@vue/eslint-config-typescript' // import { configureVueProject } from '@vue/eslint-config-typescript'
@ -13,18 +10,19 @@ import skipFormatting from "@vue/eslint-config-prettier/skip-formatting";
export default defineConfigWithVueTs( export default defineConfigWithVueTs(
{ {
name: "app/files-to-lint", name: 'app/files-to-lint',
files: ["**/*.{ts,mts,tsx,vue}"], files: ['**/*.{ts,mts,tsx,vue}'],
}, },
globalIgnores([ globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**', './src/generated/**']),
"**/dist/**",
"**/dist-ssr/**",
"**/coverage/**",
"./src/generated/**",
]),
pluginVue.configs["flat/essential"], pluginVue.configs['flat/essential'],
vueTsConfigs.recommended, vueTsConfigs.recommended,
skipFormatting skipFormatting,
); {
rules: {
'vue/multi-word-component-names': 'off',
'vue/component-name-in-template-casing': ['error', 'PascalCase'],
},
},
)

View File

@ -1,2 +0,0 @@
VITE_MODE=DEVELOP
VITE_API_BASE_PATH=http://localhost:5173/

View File

@ -1,21 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<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>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@ -1,12 +1,12 @@
<template> <template>
<footer class="mx-auto container max-2xl:pl-4"> <footer class="mx-auto container max-2xl:pl-4">
<div class="relative z-50 max-w-[1280px] mx-auto"> <div class="relative z-50 max-w-[1280px] mx-auto">
<div class="flex space-x-5 xl:space-x-[51px] mb-5"> <div class="flex justify-between mb-5">
<UiNav :nav-content="footerNavigation" /> <UiNav :nav-content="footerNavigation" />
</div> </div>
<div class="xl:max-w-[1225px] pb-7 flex justify-between"> <div class="pb-7 flex justify-between">
<div> <div>
<UiParagraph as="span" size="300" <UiParagraph as="span" size="250"
>По всем вопросам:<br /> >По всем вопросам:<br />
<a href="mailto:vinogalante@yandex.ru" target="_blank"> <a href="mailto:vinogalante@yandex.ru" target="_blank">
vinogalante@yandex.ru vinogalante@yandex.ru
@ -25,7 +25,7 @@
<script setup lang="ts"> <script setup lang="ts">
import UiParagraph from '@/components/Typography/UiParagraph.vue' import UiParagraph from '@/components/Typography/UiParagraph.vue'
import UiNav from '@/components/UiNav/UiNav.vue' import UiNav from '@/components/UiNav/UiNav.vue'
import { footerNavigation, refLitres } from '@/layout/UiFooter/_data' import { footerNavigation, refLitres } from '@/layouts/UiFooter/_data'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()

View File

@ -0,0 +1,3 @@
export { default as footerNavigation } from '@/layouts/UiFooter/_data/footer-navigation.data'
export { default as refLitres } from '@/layouts/UiFooter/_data/ref-litres.data'

View File

@ -13,7 +13,7 @@ const headerNavigation = [
}, },
{ {
name: 'Купить', name: 'Купить',
path: '/buy', path: '/cart',
}, },
{ {
name: 'Отзывы', name: 'Отзывы',

View File

@ -0,0 +1 @@
export { default as headerNavigation } from '@/layouts/UiHeader/_data/header-navigation.data'

View File

@ -1,27 +1,29 @@
<template> <template>
<div <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="min-h-svh overflow-x-hidden lato-regular relative overflow-visible before:content-[''] before:absolute before:bottom-0 before:h-full before:w-full before:bg-[url(/assets/img/png/footer-flowers-2.png)] before:bg-no-repeat before:bg-bottom before:bg-contain before:z-40"
:class=" :class="
route.path === '/' route.path === '/books/1' || route.path === '/books/2'
? 'bg-black-50' ? 'bg-[linear-gradient(135deg,rgba(17,17,30,1)_10%,rgba(183,32,76,1)_170%)]'
: 'bg-[linear-gradient(135deg,rgba(17,17,30,1)_10%,rgba(183,32,76,1)_170%)]' : 'bg-black-50'
" "
> >
<div <div
v-if="route.path === '/'" 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" class="relative z-10 after:content-[''] after:absolute after:top-0 after:right-0 after:w-[820px] after:h-[535px] after:bg-[url(/assets/img/webp/gradient.webp)] after:bg-no-repeat after:bg-[right_top] after:bg-contain"
/> />
<div <div
v-if="route.path === '/'" 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" class="relative z-20 after:content-[''] after:absolute after:top-0 after:right-0 after:w-[1120px] after:h-[1800px] after:bg-[url(/assets/img/webp/group-flowers.webp)] after:bg-no-repeat after:bg-[right_top] after:bg-cover"
/> />
<div <div
v-if="route.path === '/'" 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" class="relative z-40 before:content-[''] before:absolute before:top-0 before:left-0 before:w-[1120px] before:h-[1000px] before:bg-[url(/assets/img/webp/hero-flowers.webp)] before:bg-no-repeat before:bg-left before:bg-contain"
/> />
<UiHeader class="relative z-50" /> <UiHeader class="relative z-50" />
<UiMain class="!min-h-[1200px] text-primary relative"> <UiMain class="!min-h-[1200px] text-primary relative">
<Suspense>
<slot /> <slot />
</Suspense>
</UiMain> </UiMain>
<UiFooter /> <UiFooter />
</div> </div>

53
nuxt.config.ts Normal file
View File

@ -0,0 +1,53 @@
import config from './config'
import { fileURLToPath, URL } from 'node:url'
import head from './config/head'
// import sitemap from "./config/sitemap";
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2025-05-15',
devtools: { enabled: true },
devServer: {
host: 'localhost',
port: 4002,
},
nitro: {
output: {
dir: './dist',
},
},
alias: {
'@': fileURLToPath(new URL('./', import.meta.url)),
},
css: ['@/assets/css/tailwind.css'],
...config,
htmlValidator: {
usePrettier: true,
logLevel: 'error',
failOnError: false,
},
app: {
head: {
title: 'Vino Galante',
htmlAttrs: {
lang: 'ru',
},
...head,
},
},
runtimeConfig: {
smtpHost: process.env.SMTP_HOST,
smtpPort: process.env.SMTP_PORT,
smtpUser: process.env.SMTP_USER,
smtpPass: process.env.SMTP_PASS,
},
modules: [...config.modules],
})

5918
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,43 +1,56 @@
{ {
"name": "e-book", "name": "e-book",
"private": true, "private": true,
"version": "0.0.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "build": "nuxt build",
"build": "vue-tsc -b && vite build", "dev": "nuxt dev",
"preview": "vite preview", "generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare",
"prepare": "husky", "prepare": "husky",
"lint": "node_modules/.bin/eslint . --fix", "lint": "node_modules/.bin/eslint . --fix",
"format": "node_modules/.bin/prettier --write ./src/" "format": "node_modules/.bin/prettier --write ./"
}, },
"dependencies": { "dependencies": {
"@tailwindcss/vite": "^4.1.8", "@a2seven/yoo-checkout": "^1.1.4",
"@vueuse/head": "^2.0.0", "@nuxt/content": "^3.6.0",
"pinia": "^3.0.3", "@nuxt/fonts": "^0.11.4",
"@nuxt/icon": "^1.13.0",
"@nuxt/image": "^1.10.0",
"@nuxtjs/html-validator": "^2.1.0",
"@nuxtjs/robots": "^5.2.10",
"@nuxtjs/sitemap": "^7.4.0",
"@pinia/nuxt": "^0.5.5",
"@tailwindcss/postcss": "^4.1.10",
"better-sqlite3": "^12",
"crypto-js": "^4.2.0",
"date-fns": "^4.1.0",
"husky": "^9.1.7",
"nodemailer": "^7.0.3",
"nuxt": "^3.17.5",
"nuxt-schema-org": "^5.0.5",
"pg": "^8.16.2",
"postgres": "^3.4.7",
"swiper": "^11.2.8", "swiper": "^11.2.8",
"tailwindcss": "^4.1.8", "vue": "^3.5.16"
"vue": "^3.5.13",
"vue-router": "4"
}, },
"devDependencies": { "devDependencies": {
"@tsconfig/node22": "^22.0.1", "@nuxt/eslint": "^1.4.1",
"@types/node": "^22.14.0", "@nuxt/test-utils": "^3.11.3",
"@vitejs/plugin-vue": "^5.2.3", "@nuxtjs/tailwindcss": "^6.11.4",
"@types/node": "^22.0.0",
"@types/nodemailer": "^6.4.17",
"@types/pg": "^8.15.4",
"@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",
"@vue/tsconfig": "^0.7.0", "autoprefixer": "^10.4.18",
"eslint": "^9.22.0", "eslint": "^9.29.0",
"eslint-plugin-vue": "~10.0.0", "eslint-plugin-vue": "^10.0.0",
"husky": "^9.1.7", "postcss": "^8.5.6",
"jiti": "^2.4.2",
"npm-run-all2": "^7.0.2",
"playwright": "^1.52.0",
"prettier": "3.5.3", "prettier": "3.5.3",
"tailwindcss": "^3.4.17",
"typescript": "~5.8.3", "typescript": "~5.8.3",
"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"
} }

249
pages/books/[slug].vue Normal file
View File

@ -0,0 +1,249 @@
<template>
<template v-if="book">
<div class="relative z-50 min-h-screen text-white mb-[208px]">
<template v-if="!route.params.chapter && !route.params.titlesSlug">
<!--верхний блок-->
<section
class="flex min-h-[600px] flex-row relative z-40 before:content-[''] before:absolute before:top-[-140px] before:bg-top before:left-0 before:w-[1280px] before:h-[1000px] before:bg-[url(/assets/img/webp/vino-galante.webp)] before:bg-no-repeat before:bg-contain mt-40"
>
<!--левый блок контента-->
<section class="relative top-[-30px] min-w-[570px]">
<div class="flex flex-col items-center h-[600px]">
<img :src="book.img" :alt="book.buttonText" />
</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-12 gap-24 relative z-50">
<!--левый-->
<div class="flex flex-col items-center min-h-[310px]">
<div class="flex flex-row">
<UiParagraph class="[&]:text-6xl">{{ book.price }}&nbsp;</UiParagraph>
<img src="/img/svg/books/ruble.svg" alt="ruble" />
</div>
<div class="flex items-center flex-col gap-3">
<UiButton
@click="handleSelect"
:id="book.id"
variants="primary"
class="max-w-[440px] !font-normal !px-2 !py-4 mt-16"
>
{{ book.buttonText }}
</UiButton>
<UiParagraph size="200">
{{ book.buttonFormat }}
</UiParagraph>
</div>
</div>
<!--правый-->
<div class="min-h-[310px] pt-6">
<!--о книге-->
<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="24" height="24" />
<UiParagraph size="250" as="span">
{{ book.pages }}
</UiParagraph>
</li>
<li class="flex flex-row mr-14 gap-3 items-center shrink-0">
<img
src="/img/svg/books/book-illustrations.svg"
alt="иллюстраций"
width="24"
height="24"
/>
<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="24" height="24" />
<UiParagraph size="250" as="span">
{{ book.format }}
</UiParagraph>
</li>
</ul>
</div>
<!--навигация по книге-->
<div class="mt-28">
<ul class="flex flex-row mr-32 items-baseline justify-between lg:whitespace-nowrap">
<li class="flex flex-row items-center">
<NuxtLink
:to="`/books/${route.params.slug}/chapters/${route.params.slug}/`"
class="flex flex-col gap-8 items-center cursor-pointer"
>
<img
src="/img/svg/books/bi_book.svg"
alt="Читай отрывок"
width="62"
height="53"
/>
<UiParagraph size="250" as="span"> Читай отрывок </UiParagraph>
</NuxtLink>
</li>
<li class="flex flex-row items-center">
<a
download
:href="book.download"
class="flex flex-col items-center gap-8 cursor-pointer"
>
<img
src="/img/svg/books/download.svg"
alt="Скачай отрывок"
width="62"
height="53"
/>
<UiParagraph size="250" as="span"> Скачай отрывок </UiParagraph>
</a>
</li>
<li class="flex flex-row items-center">
<NuxtLink
:to="`/books/${route.params.slug}/${book.hrefTitles}`"
class="flex flex-col items-center gap-8 cursor-pointer"
>
<img src="/img/svg/books/down2.svg" alt="Содержание" width="62" height="53" />
<UiParagraph size="250" as="span"> Содержание </UiParagraph>
</NuxtLink>
</li>
</ul>
</div>
</div>
</section>
<!--нижний блок-->
<section class="ml-20 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-32 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>
<NuxtPage />
</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, useRouter } from '#app'
import UiHeading from '@/components/Typography/UiHeading.vue'
import UiParagraph from '@/components/Typography/UiParagraph.vue'
import UiButton from '@/components/UiButton/UiButton.vue'
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
download: string
}
const route = useRoute()
const router = useRouter()
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
}
}
const handleSelect = () => {
router.push('/cart/')
}
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>

View File

@ -0,0 +1,175 @@
<template>
<div v-if="content" class="relative z-50 min-h-screen text-white mb-[208px] ml-4">
<section class="flex flex-col relative z-40 mt-40 ml-18 mr-18">
<div v-html="renderedContent" class="prose prose-invert max-w-none"></div>
</section>
</div>
<div v-else class="text-white text-center py-20">Глава не найдена.</div>
</template>
<script setup lang="ts">
// Получаем параметры из URL
const route = useRoute()
const bookSlug = route.params.slug as string
const chapterSlug = route.params.chapter as string
// Загружаем контент из markdown файла
const { data: content } = await useAsyncData(`book-${bookSlug}-${chapterSlug}`, () => {
return $fetch(`/api/content/books/${chapterSlug}`)
})
// Конвертируем markdown в HTML (простая реализация)
const renderedContent = computed(() => {
if (!content.value?.content) return ''
let html = content.value.content
// Заменяем заголовки
html = html.replace(
/^### (.*$)/gim,
'<h3 style="color: #f54b7e; font-weight: bold; margin-top: 1.5rem; margin-bottom: 0.5rem;">$1</h3>',
)
html = html.replace(
/^## (.*$)/gim,
'<h2 style="color: #f54b7e; font-weight: bold; margin-top: 2rem; margin-bottom: 1rem;">$1</h2>',
)
html = html.replace(
/^# (.*$)/gim,
'<h1 style="color: #f54b7e; font-weight: bold; font-size: 1.5em; margin-bottom: 1rem;">$1</h1>',
)
// Заменяем параграфы
html = html.replace(
/^&ensp;&ensp;(.*$)/gim,
'<p style="margin-bottom: 1rem; line-height: 1.6;">$1</p>',
)
// Заменяем жирный текст (двойные звездочки)
html = html.replace(/\*\*(.*?)\*\*/g, '<strong style=" font-weight: bold;">$1</strong>')
// Заменяем курсив (звездочки)
html = html.replace(/\*(.*?)\*/g, '<em style="font-style: italic;">$1</em>')
// Заменяем курсив (подчеркивания)
html = html.replace(/\_(.*?)\_/g, '<em style="font-style: italic;">$1</em>')
// Заменяем изображения - исправляем пути
html = html.replace(
/!\[([^\]]*)\]\(([^)]+)\)/g,
'<img src="/img/books/$2" alt="$1" style="max-width: 100%; height: auto; margin: 1rem 0; display: block;" />',
)
// Заменяем списки
html = html.replace(/^- (.*$)/gim, '<li style="margin-bottom: 0.5rem;">$1</li>')
html = html.replace(/(<li.*<\/li>)/s, '<ul style="margin-bottom: 1rem;">$1</ul>')
// Заменяем <br/> теги на HTML <br>
html = html.replace(/<br\/>/g, '<br>')
// Заменяем переносы строк
html = html.replace(/\n/g, '<br>')
return html
})
// Устанавливаем мета-теги
useHead({
title: `Глава ${chapterSlug} | Книга ${bookSlug} | Vino Galante`,
meta: [
{
name: 'description',
content: `Читайте главу ${chapterSlug} из книги ${bookSlug} автора Vino Galante`,
},
],
link: [
{
rel: 'canonical',
href: `https://ebook.miduway.space/books/${bookSlug}/chapters/${chapterSlug}`,
},
],
})
// Обработка ошибок, если файл не найден
if (!content.value) {
throw createError({
statusCode: 404,
statusMessage: 'Глава не найдена',
})
}
</script>
<style>
/* Дополнительные стили для контента */
.prose {
color: white;
max-width: none;
}
.prose h1 {
color: #f54b7e;
font-weight: bold;
font-size: 1.5em;
margin-bottom: 1rem;
}
.prose h2 {
color: #f54b7e;
font-weight: bold;
margin-top: 2rem;
margin-bottom: 1rem;
}
.prose h3 {
color: #f54b7e;
font-weight: bold;
margin-top: 1.5rem;
margin-bottom: 0.5rem;
}
.prose p {
margin-bottom: 1rem;
line-height: 1.6;
}
.prose ul {
margin-bottom: 1rem;
}
.prose li {
margin-bottom: 0.5rem;
}
.prose strong {
font-weight: bold;
}
.prose em {
font-style: italic;
}
.prose blockquote {
border-left: 4px solid #f54b7e;
padding-left: 1rem;
margin: 1rem 0;
font-style: italic;
}
.prose img {
max-width: 100%;
height: auto;
margin: 1rem 0;
display: block;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
}
/* Стили для подписей к изображениям */
.prose img + br + em {
display: block;
text-align: center;
font-style: italic;
color: #f54b7e;
margin-top: 0.5rem;
margin-bottom: 1rem;
}
</style>

View File

@ -0,0 +1,160 @@
<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 !text-[24px]"
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-[#E20C66] !text-[24px] [&]:font-normal">
{{ section.title }}
</UiHeading>
<!-- Subsections -->
<div v-if="section.subsections" class="ml-10 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="[&]:text-[#FFFFFF] !text-[22px] [&]:font-normal"
>
{{ subsection.title.text }}
</UiHeading>
</div>
<!-- Regular subsection -->
<UiHeading
v-else
tag="H3"
size="300"
class="[&]:text-[#FFFFFF] ml-1 !text-[22px] [&]:font-normal"
>
{{ subsection.title }}
</UiHeading>
<!-- Items list -->
<ul v-if="subsection.items" class="ml-10 flex flex-col gap-2 list-decimal">
<li v-for="(item, itemIndex) in subsection.items" :key="itemIndex">
<UiParagraph size="300" class="[&]:text-[#CDCDCD] [&]:font-normal"
>&nbsp;{{ 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"
class="[&]:text-[#CDCDCD] [&]:font-normal ml-4 [&]:text-[20px]"
>
{{ nestedSub.text }}
</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'
interface SubsectionTitle {
text: string
img?: string
}
interface Subsection {
title: string | SubsectionTitle
items?: string[]
subsections?: Array<{
title?: string
text?: 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) => {
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>

View File

@ -0,0 +1,201 @@
{
"id": "title-1",
"title": "Оглавление",
"titleMeta": "Оглавление - Книга I",
"sections": [
{
"subsections": [
{
"title": "Благодарности"
}
]
},
{
"subsections": [
{
"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"
},
"subsections": [
{
"text": "Техника безопасности при работе в полях"
},
{
"text": "Восстановление сил"
},
{
"text": "Главный принцип развития"
},
{
"text": "Техники выхода в аптайм"
},
{
"text": "Действия"
},
{
"text": "Результат"
}
]
},
{
"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": [
{
"text": "Определение и классификация"
},
{
"text": "Псевдопассивная. Этап первый"
},
{
"text": "Псевдопассивная. Этап второй"
},
{
"text": "Активный тип стратегии"
},
{
"text": "Третий этап. Степени кокетства"
}
]
}
]
},
{
"title": "Глава 3. Затравка",
"subsections": [
{
"title": "Введение"
},
{
"title": {
"text": "Теория женской привлекательности",
"img": "/img/svg/books/1/titles-1/icon-park-outline_women.svg"
},
"subsections": [
{
"title": "Введение"
},
{
"text": "Физическое здоровье"
},
{
"text": "Ментальный посыл. Стильность"
},
{
"text": "Ментальный посыл. Внутреннее ощущение мира"
}
]
},
{
"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": "В следующей книге"
}
]
}
]
}

View File

@ -0,0 +1,169 @@
{
"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": [
{
"text": "Экскурс в историю"
},
{
"text": "Правила формирования запасного аэродрома"
},
{
"text": "Подробнее о пятом пункте или как не врать"
},
{
"text": "Следствия наличия запасного аэродрома"
}
]
},
{
"title": {
"text": "Свидания",
"img": "/img/svg/books/2/titles-2/mdi_heart-outline (1).svg"
},
"subsections": [
{
"text": "Одежда"
},
{
"text": "Правильные места для свиданий"
},
{
"text": "Самое важное в свиданиях"
}
]
}
]
},
{
"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": [
{
"text": "Введение"
},
{
"text": "Оральные ласки"
},
{
"text": "Минет"
}
]
},
{
"title": {
"text": "СМС-переписка",
"img": "/img/svg/books/2/titles-2/Vector (6).svg"
},
"subsections": [
{
"text": "Российские школы соблазнения"
},
{
"text": "Как найти соблазнителя"
},
{
"text": "История рождения одного термина"
}
]
},
{
"title": {
"text": "Секс и девичья невинность",
"img": "/img/svg/books/2/titles-2/Vector (7).svg"
},
"subsections": [
{
"text": "Как парни воспринимают секс"
},
{
"text": "Девичья невинность"
},
{
"text": "Прожим девственницы. Метод Галанте."
},
{
"text": "Прожим девственницы. Классический метод."
},
{
"text": "Прожим девственницы. Метод пикапера."
},
{
"text": "Вместо эпилога"
}
]
},
{
"title": "Что делать, если попался «сложный красавчик»"
},
{
"title": {
"text": "Словарь",
"img": "/img/svg/books/2/titles-2/Vector (8).svg"
}
}
]
}
]
}

View File

@ -34,5 +34,7 @@
"svg": "/img/svg/books/1/stash_target.svg" "svg": "/img/svg/books/1/stash_target.svg"
} }
], ],
"href": "https://www.litres.ru/58125553/" "href": "https://www.litres.ru/58125553/",
"hrefTitles": "title-1",
"download": "/files/Otryvok_1.pdf"
} }

View File

@ -34,5 +34,7 @@
"svg": "/img/svg/books/1/stash_target.svg" "svg": "/img/svg/books/1/stash_target.svg"
} }
], ],
"href": "https://www.litres.ru/vino-galante/kak-vlubit-v-sebya-lubogo-tonkaya-igra/" "href": "https://www.litres.ru/vino-galante/kak-vlubit-v-sebya-lubogo-tonkaya-igra/",
"hrefTitles": "title-2",
"download": "/files/Otryvok_2.pdf"
} }

View File

@ -0,0 +1,21 @@
{
"items": [
{
"id": 1,
"name": "Как влюбить в себя любого \n Книга I. \n Откровения бывшего Казановы",
"src": "/img/books/book1.png",
"buy": "добавить Книгу I",
"price": 520,
"message": "💡 Купи обе книги и получи \n скидку 10% - 936 за комплект"
},
{
"id": 2,
"name": "Как влюбить в себя любого \n Книга II. \n Тонкая игра",
"src": "/img/books/book2.png",
"buy": "добавить Книгу II",
"price": 520,
"message": "💡 Купи обе книги и получи \n скидку 10% - 936 за комплект"
}
],
"message": "💡 Купи обе книги и получи скидку 10% - 936 за комплект"
}

113
pages/cart/index.vue Normal file
View File

@ -0,0 +1,113 @@
<template>
<section class="relative z-50 ml-4">
<UiHeading tag="h1" size="300" class="font-bold mb-16"> Корзина </UiHeading>
<div class="-ml-6">
<div
v-for="({ name, src, price, message, buy, id }, index) in cartList.items"
:key="index"
class="flex items-start mb-24"
>
<div class="w-40 h-40 relative -top-5">
<img :src="`${src}`" alt="book" />
</div>
<UiParagraph size="300" class="whitespace-pre mb-10 mr-12 w-80">{{ name }}</UiParagraph>
<UiParagraph size="300" class="whitespace-pre mb-10 mr-20">{{ message }}</UiParagraph>
<UiButton
:id="id"
class="mb-10"
v-if="store.getQuantity(id) === 0"
@click="handleAddToCart(id)"
>{{ buy }}</UiButton
>
<template v-else>
<div class="flex items-center gap-8 mr-20">
<button
class="w-8 h-8 flex items-center justify-center rounded-full border border-white text-white text-2xl"
@click="handleRemove(id)"
aria-label="Уменьшить количество"
>
</button>
<span class="text-white text-2xl">{{ store.getQuantity(id) }}</span>
<button
class="w-8 h-8 flex items-center justify-center rounded-full border border-white text-white text-2xl"
@click="handleIncrement(id)"
aria-label="Увеличить количество"
>
+
</button>
</div>
<span class="text-white text-2xl font-bold mr-20 whitespace-nowrap">
{{ Number(price) * store.getQuantity(id) }}
</span>
<button
class="w-8 h-8 flex items-center justify-center rounded-full border border-white text-white text-xl"
@click="handleRemove(id)"
aria-label="Удалить товар"
>
×
</button>
</template>
</div>
<div class="flex items-center justify-end mt-8">
<UiParagraph is="span" size="300">Общая стоимость</UiParagraph>
<template v-if="isSpecialPrice">
<span class="text-white text-2xl font-bold ml-4 line-through select-none">
{{ regularTotalPrice }}
</span>
<span class="text-primary text-3xl font-bold ml-4">
{{ store.getTotalPrice(cartList.items) }}
</span>
</template>
<template v-else>
<span class="text-primary text-3xl font-bold ml-4">
{{ store.getTotalPrice(cartList.items) }}
</span>
</template>
</div>
</div>
<div class="mt-10 flex flex-col items-center justify-center">
<UiButton class="w-[660px]"> перейти к оформлению </UiButton>
<UiParagraph is="span" size="300" class="mb-10 mt-5"
>После оплаты книги сразу будут доступны для скачивания</UiParagraph
>
</div>
</section>
</template>
<script setup lang="ts">
import cartList from './_data/cart.json'
import UiHeading from '~/components/Typography/UiHeading.vue'
import UiParagraph from '~/components/Typography/UiParagraph.vue'
import { useSelectedBook } from '@/store/useSelectedBook'
import { computed } from 'vue'
const store = useSelectedBook()
function handleIncrement(id: number) {
store.increment(id)
}
function handleDecrement(id: number) {
store.decrement(id)
}
function handleRemove(id: number) {
store.reset(id)
}
function handleAddToCart(id: number) {
store.addToCart(id)
}
const selectedBooksCount = computed(() => store.cartQuantities.filter((i) => i.quantity > 0).length)
const isSpecialPrice = computed(() => selectedBooksCount.value === 2)
const regularTotalPrice = computed(() => {
// Сумма без скидки
return store.cartQuantities.reduce((sum, item) => {
const book = cartList.items.find((b: any) => b.id === item.id)
return sum + (book ? Number(book.price) * item.quantity : 0)
}, 0)
})
</script>

19
pages/email.vue Normal file
View File

@ -0,0 +1,19 @@
<template>
<div class="relative z-50 text-black min-h-screen py-12">
<div class="container mx-auto px-4">
<div class="text-center mb-8">
<UiHeading tag="h1" size="500" class="font-bold text-primary mb-4"
>Контактные данные</UiHeading
>
</div>
<EmailForm />
</div>
</div>
</template>
<script setup>
import UiHeading from '~/components/Typography/UiHeading.vue'
// Страница использует компонент EmailForm
</script>

View File

@ -1,6 +1,6 @@
<template> <template>
<section class="feedback-section"> <section class="feedback-section">
<UiHeading tag="H2" size="300" class="text-three mb-4 pl-16 pr-24"> <UiHeading tag="h2" size="300" class="text-three mb-4 pl-16 pr-24">
Что говорят читатели Что говорят читатели
</UiHeading> </UiHeading>
@ -30,13 +30,13 @@
Это поможет другим и вдохновит на новые главы. <br /> Это поможет другим и вдохновит на новые главы. <br />
Спасибо! Спасибо!
</UiParagraph> </UiParagraph>
<UiButton @click="console.log(1)" class="mt-10" variants="secondary">Написать отзыв</UiButton> <UiButton class="mt-10" variants="secondary">Написать отзыв</UiButton>
</div> </div>
</section> </section>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted } from 'vue' // Добавляем onMounted import { onMounted } from 'vue'
import Swiper from 'swiper' import Swiper from 'swiper'
import { Pagination, Autoplay } from 'swiper/modules' import { Pagination, Autoplay } from 'swiper/modules'
import UiHeading from '@/components/Typography/UiHeading.vue' import UiHeading from '@/components/Typography/UiHeading.vue'
@ -86,7 +86,7 @@ onMounted(() => {
} }
.feedback-card { .feedback-card {
background-color: #1a1a1a; background-color: #171b27;
border-radius: 10px; border-radius: 10px;
padding: 20px; padding: 20px;
color: #fff; color: #fff;

View File

@ -1,9 +1,9 @@
<template> <template>
<section> <section>
<UiHeading tag="H2" size="300" class="text-three"> <UiHeading tag="h1" size="300" class="text-three">
Книги для тебя, если ты не знаешь... Книги для тебя, если ты не знаешь...
</UiHeading> </UiHeading>
<ul class="flex mt-20 flex-row items-center justify-between"> <ul class="flex mt-20 flex-row items-center justify-between gap-10">
<li <li
class="flex flex-col-reverse justify-end w-38 gap-4 h-64 items-center transition-transform transform hover:scale-110" 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" v-for="({ img, text }, index) in questions.data"

View File

@ -1,12 +1,14 @@
import UiParagraph from '@/components/Typography/UiParagraph.vue'; import UiParagraph from '@/components/Typography/UiParagraph.vue';
<template> <template>
<div <div
v-for="({ topContent, button, botContent }, index) in content.data" v-for="({ topContent, button, botContent, path }, index) in content.data"
:key="index" :key="index"
class="flex flex-col items-center max-w-96" class="flex flex-col items-center max-w-96"
> >
<UiParagraph size="300" class="mb-12 h-32">{{ topContent }} </UiParagraph> <UiParagraph size="300" class="mb-12 h-32">{{ topContent }} </UiParagraph>
<UiButton variants="primary" class="mb-3 w-full">{{ button }} </UiButton> <UiButton tag="RouterLink" :to="path" variants="primary" class="mb-3 w-full"
>{{ button }}
</UiButton>
<UiParagraph as="span" size="200"> {{ botContent }}</UiParagraph> <UiParagraph as="span" size="200"> {{ botContent }}</UiParagraph>
</div> </div>
</template> </template>
@ -23,12 +25,14 @@ const content = reactive({
'💡 Узнай, как думает мужчина, что его действительно цепляет, и что делает женщину незабываемой.', '💡 Узнай, как думает мужчина, что его действительно цепляет, и что делает женщину незабываемой.',
button: 'КУПИТЬ КНИГУ I', button: 'КУПИТЬ КНИГУ I',
botContent: 'PDF + EPUB сразу после оплаты', botContent: 'PDF + EPUB сразу после оплаты',
path: '/books/1',
}, },
{ {
topContent: topContent:
'💡 Продолжение для тех, кто готов перейти от флирта к глубокому контакту. Как строить притяжение, не теряя себя.', '💡 Продолжение для тех, кто готов перейти от флирта к глубокому контакту. Как строить притяжение, не теряя себя.',
button: 'КУПИТЬ КНИГУ II', button: 'КУПИТЬ КНИГУ II',
botContent: 'PDF + EPUB сразу после оплаты', botContent: 'PDF + EPUB сразу после оплаты',
path: '/books/2',
}, },
], ],
}) })

View File

@ -1,12 +1,7 @@
<template> <template>
<section> <section>
<div class="relative z-50"> <div class="relative z-50">
<img <img src="/assets/img/webp/hero-banner-content.webp" alt="Книги" />
src="/src/assets/img/webp/hero-banner-content.webp"
alt="Книги"
width="100%"
height="100%"
/>
</div> </div>
<div class="flex flex-row justify-between pl-16 pr-24"> <div class="flex flex-row justify-between pl-16 pr-24">
<BuyContent /> <BuyContent />
@ -14,5 +9,5 @@
</section> </section>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import BuyContent from './_ui/buyContent.vue' import BuyContent from "./_ui/buyContent.vue";
</script> </script>

View File

@ -0,0 +1,37 @@
<template>
<section class="flex flex-row">
<div
class="lg:w-5/12 pl-5 pr-5 shadow-md bg-[url('/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">
<NuxtImg src="/img/webp/meetingAlone.webp" alt="meeting" loading="lazy" />
</div>
</section>
</template>
<script setup lang="ts">
import UiHeading from "@/components/Typography/UiHeading.vue";
import UiParagraph from "@/components/Typography/UiParagraph.vue";
</script>

31
pages/index/index.vue Normal file
View File

@ -0,0 +1,31 @@
<template>
<div>
<section class="relative z-50">
<HeroBanner
class="pt-28 bg-[url('/assets/img/png/bg.png')] z-40 bg-no-repeat bg-[400px] rounded-[50px] relative after:absolute after:bg-[url('/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";
useHead({
title: "Vino Galante",
meta: [
{ name: "description", content: "Онлайн магазин книг автора Vino Galante" },
],
link: [
{
rel: "canonical",
href: `https://ebook.miduway.space/`,
},
],
});
</script>

104
pages/privacy/index.vue Normal file
View File

@ -0,0 +1,104 @@
<template>
<section class="relative z-50">
<UiHeading size="300" tag="H1" class="mb-5">
Политика конфиденциальности
</UiHeading>
<UiParagraph size="300" class="mb-5"
>Настоящая политика конфиденциальности описывает, как мы собираем,
используем и защищаем личную информацию, которую пользователи
предоставляют при использовании нашего сайта.</UiParagraph
>
<UiHeading size="300" tag="h2">1. Сбор информации</UiHeading>
<UiParagraph size="300"
>При оформлении заказа на сайте вы предоставляете персональные данные,
которые включают:</UiParagraph
>
<ul class="list-disc pl-5 mb-3">
<li><UiParagraph size="300">Адрес электронной почты</UiParagraph></li>
<li><UiParagraph size="300">Имя (по желанию)</UiParagraph></li>
</ul>
<UiHeading size="300" tag="h2">2. Использование информации</UiHeading>
<UiParagraph size="300" class="mb-3"
>Ваши личные данные используются исключительно для:</UiParagraph
>
<ul class="list-disc pl-5">
<li>
<UiParagraph size="300"
>Обработки и выполнения вашего заказа.</UiParagraph
>
</li>
<li>
<UiParagraph> Связи с вами по вопросам вашего заказа. </UiParagraph>
</li>
<li>
<UiParagraph size="300" class="mb-3">
Уведомления о важных обновлениях и новостях сайта (только если вы явно
согласились на рассылку).</UiParagraph
>
</li>
</ul>
<UiHeading size="300" tag="h2">3. Защита личных данных</UiHeading>
<UiParagraph size="300" class="mb-3">
Мы предпринимаем необходимые меры для защиты ваших личных данных от
несанкционированного доступа, изменения, разглашения или уничтожения.
Доступ к личным данным имеют только сотрудники, непосредственно
участвующие в обработке заказов.
</UiParagraph>
<UiHeading size="300" tag="h2"
>4. Передача информации третьим лицам</UiHeading
>
<UiParagraph size="300" class="mb-3">
Мы не передаём ваши личные данные третьим лицам, за исключением случаев,
предусмотренных законодательством Российской Федерации.
</UiParagraph>
<UiHeading size="300" tag="h2">5. Cookies (Куки-файлы)</UiHeading>
<UiParagraph size="300" class="mb-3">
Мы используем файлы cookie, чтобы улучшить ваш пользовательский опыт. Вы
можете отключить файлы cookie в настройках вашего браузера, однако это
может ограничить доступ к некоторым функциям сайта.
</UiParagraph>
<UiHeading size="300" tag="h2"
>6. Изменения в политике конфиденциальности</UiHeading
>
<UiParagraph size="300" class="mb-3">
Мы можем периодически обновлять настоящую политику конфиденциальности. Об
изменениях мы уведомим вас, разместив новую версию политики на данной
странице.
</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";
useHead({
title: "Поликита конфиденциальности | Vino Galante",
meta: [
{ name: "description", content: "Онлайн магазин книг автора Vino Galante" },
],
link: [
{
rel: "canonical",
href: `https://ebook.miduway.space/privacy`,
},
],
});
</script>

View File

@ -0,0 +1,46 @@
[
{
"question": "1. Как купить книгу?",
"answer": "Чтобы купить книгу, просто перейдите на страницу соответствующей книги и нажмите кнопку «Купить». Вы будете перенаправлены в корзину, где можно подтвердить заказ и выбрать способ оплаты."
},
{
"question": "2. Какие способы оплаты доступны?",
"answer": "На сайте доступны самые удобные и безопасные способы оплаты: банковские карты (Visa, Mastercard, Мир), Система Быстрых Платежей (СБП) и сервис SberPay. Вы можете выбрать любой из них при оформлении заказа."
},
{
"question": "3. Можно ли скачать книгу сразу после покупки?",
"answer": "Да, после подтверждения покупки, ссылка на скачивание книги будет доступна сразу. Вы получите файл на указанный при заказе email, либо сможете скачать книгу непосредственно с сайта."
},
{
"question": "4. Что делать, если я не могу скачать книгу?",
"answer": "Если у вас возникли проблемы с скачиванием книги, пожалуйста, свяжитесь с нами через контактный email vinogalante@yandex.ru, и мы постараемся решить ваш вопрос как можно скорее."
},
{
"question": "5. Есть ли пробный отрывок книги?",
"answer": "Да, на каждой странице книги есть возможность ознакомиться с аннотацией и скачать отрывок или читать его прямо на сайте. Это поможет вам оценить стиль и содержание книги перед покупкой."
},
{
"question": "6. Как читать книгу на мобильном устройстве?",
"answer": "Книги можно читать на мобильных устройствах в любом формате (например, PDF). Просто скачайте файл и откройте его с помощью подходящего приложения, например, Adobe Reader для PDF."
},
{
"question": "7. Можно ли вернуть книгу, если она не понравилась?",
"answer": "К сожалению, электронные книги не подлежат возврату, поскольку они могут быть скачаны сразу после покупки. Мы рекомендуем ознакомиться с отрывком книги перед покупкой, чтобы убедиться, что она соответствует вашим ожиданиям."
},
{
"question": "8. Как связаться с автором?",
"answer": "Вы можете связаться со мной по электронной почте vinogalante@yandex.ru. Я всегда рад услышать отзывы о книгах и ответить на вопросы."
},
{
"question": "9. Как узнать, когда выйдет следующая книга?",
"answer": "На данный момент автор не планирует продолжать писать книги по данной теме. Сейчас автор сосредоточен на других проектах."
},
{
"question": "10. Есть ли скидки на книги?",
"answer": "Да, при оплате двух книг сразу предоставляется скидка 10%. Просто добавьте обе книги в корзину, и скидка будет автоматически применена при оформлении заказа."
},
{
"question": "11. Могу ли я получить книгу в другом формате?",
"answer": "На данный момент книги доступны в формате PDF, ePub. Если вам нужен другой формат, пожалуйста, свяжитесь с нами, и мы постараемся помочь."
}
]

43
pages/question/index.vue Normal file
View File

@ -0,0 +1,43 @@
<template>
<section class="relative z-50 ml-4">
<div v-for="({ question, answer }, index) in questions" :key="index" class="mb-16">
<button
type="button"
@click="toggleFAQ(index)"
class="flex gap-12 mb-5 items-baseline font-bold"
>
<UiParagraph as="span" size="500">
{{ question }}
</UiParagraph>
<img
src="/assets/icon/arrow.svg"
alt="question"
class="duration-500"
:class="activeIndex === index ? 'rotate-90' : 'rotate-0'"
/>
</button>
<Transition name="slide">
<div v-show="activeIndex === index">
<UiParagraph size="300">
{{ answer }}
</UiParagraph>
</div>
</Transition>
</div>
</section>
</template>
<script setup lang="ts">
import UiParagraph from '~/components/Typography/UiParagraph.vue'
import questions from './_data/question-answer.json'
const activeIndex = ref<null | number>(null)
const toggleFAQ = (index: number) => {
activeIndex.value = activeIndex.value === index ? null : index
}
useHead({
title: 'Вопрос - ответ | Vino Galante',
})
</script>

5
postcss.config.mjs Normal file
View File

@ -0,0 +1,5 @@
export default {
plugins: {
"@tailwindcss/postcss": {},
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
public/files/Otryvok_1.pdf Normal file

Binary file not shown.

BIN
public/files/Otryvok_2.pdf Normal file

Binary file not shown.

BIN
public/img/books/book1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

BIN
public/img/books/book2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

BIN
public/img/books/image2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View 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 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

View File

@ -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

View 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.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

View 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="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

View 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

View 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

View File

@ -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

View 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

View 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

View 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

View 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

View 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

View 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

View File

@ -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

View File

@ -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

View 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

View File

@ -0,0 +1,15 @@
<svg width="63" height="54" viewBox="0 0 63 54" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_984_377)">
<path d="M4.60144 9.38058C8.04021 8.15329 12.9711 6.8298 17.7659 6.41849C22.9338 5.97401 27.3168 6.62746 29.858 8.91288V41.2405C26.2249 39.4825 21.6205 39.2404 17.3735 39.6052C12.7884 40.0033 8.16455 41.1344 4.60144 42.2953V9.38058ZM33.7436 8.91288C36.2848 6.62746 40.6678 5.97401 45.8356 6.41849C50.6305 6.8298 55.5613 8.15329 59.0001 9.38058V42.2953C55.4331 41.1344 50.8131 40 46.2281 39.6086C41.9772 39.2404 37.3766 39.4792 33.7436 41.2405V8.91288ZM31.8008 5.9143C27.9734 3.10479 22.4248 2.68684 17.3735 3.11806C11.4906 3.62556 5.55342 5.34709 1.85431 6.78336C1.51489 6.91514 1.22707 7.12751 1.0252 7.39513C0.823323 7.66274 0.715924 7.9743 0.71582 8.2926V44.7798C0.71591 45.0573 0.797563 45.3303 0.953298 45.5739C1.10903 45.8175 1.33387 46.0238 1.60722 46.174C1.88057 46.3242 2.19369 46.4134 2.51791 46.4335C2.84212 46.4536 3.16705 46.4039 3.46295 46.289C6.89007 44.9622 12.4115 43.3667 17.762 42.9057C23.2369 42.4347 27.8258 43.1942 30.2854 45.8147C30.4674 46.0084 30.6981 46.1647 30.9604 46.2721C31.2227 46.3796 31.5099 46.4353 31.8008 46.4353C32.0917 46.4353 32.3789 46.3796 32.6412 46.2721C32.9034 46.1647 33.1341 46.0084 33.3162 45.8147C35.7758 43.1942 40.3647 42.4347 45.8356 42.9057C51.19 43.3667 56.7154 44.9622 60.1386 46.289C60.4345 46.4039 60.7594 46.4536 61.0836 46.4335C61.4079 46.4134 61.721 46.3242 61.9943 46.174C62.2677 46.0238 62.4925 45.8175 62.6483 45.5739C62.804 45.3303 62.8856 45.0573 62.8857 44.7798V8.2926C62.8856 7.9743 62.7782 7.66274 62.5764 7.39513C62.3745 7.12751 62.0867 6.91514 61.7472 6.78336C58.0481 5.34709 52.1109 3.62556 46.2281 3.11806C41.1768 2.68353 35.6281 3.10479 31.8008 5.9143Z" fill="white"/>
<path d="M4.60144 9.38058C8.04021 8.15329 12.9711 6.8298 17.7659 6.41849C22.9338 5.97401 27.3168 6.62746 29.858 8.91288V41.2405C26.2249 39.4825 21.6205 39.2404 17.3735 39.6052C12.7884 40.0033 8.16455 41.1344 4.60144 42.2953V9.38058ZM33.7436 8.91288C36.2848 6.62746 40.6678 5.97401 45.8356 6.41849C50.6305 6.8298 55.5613 8.15329 59.0001 9.38058V42.2953C55.4331 41.1344 50.8131 40 46.2281 39.6086C41.9772 39.2404 37.3766 39.4792 33.7436 41.2405V8.91288ZM31.8008 5.9143C27.9734 3.10479 22.4248 2.68684 17.3735 3.11806C11.4906 3.62556 5.55342 5.34709 1.85431 6.78336C1.51489 6.91514 1.22707 7.12751 1.0252 7.39513C0.823323 7.66274 0.715924 7.9743 0.71582 8.2926V44.7798C0.71591 45.0573 0.797563 45.3303 0.953298 45.5739C1.10903 45.8175 1.33387 46.0238 1.60722 46.174C1.88057 46.3242 2.19369 46.4134 2.51791 46.4335C2.84212 46.4536 3.16705 46.4039 3.46295 46.289C6.89007 44.9622 12.4115 43.3667 17.762 42.9057C23.2369 42.4347 27.8258 43.1942 30.2854 45.8147C30.4674 46.0084 30.6981 46.1647 30.9604 46.2721C31.2227 46.3796 31.5099 46.4353 31.8008 46.4353C32.0917 46.4353 32.3789 46.3796 32.6412 46.2721C32.9034 46.1647 33.1341 46.0084 33.3162 45.8147C35.7758 43.1942 40.3647 42.4347 45.8356 42.9057C51.19 43.3667 56.7154 44.9622 60.1386 46.289C60.4345 46.4039 60.7594 46.4536 61.0836 46.4335C61.4079 46.4134 61.721 46.3242 61.9943 46.174C62.2677 46.0238 62.4925 45.8175 62.6483 45.5739C62.804 45.3303 62.8856 45.0573 62.8857 44.7798V8.2926C62.8856 7.9743 62.7782 7.66274 62.5764 7.39513C62.3745 7.12751 62.0867 6.91514 61.7472 6.78336C58.0481 5.34709 52.1109 3.62556 46.2281 3.11806C41.1768 2.68353 35.6281 3.10479 31.8008 5.9143Z" fill="url(#paint0_radial_984_377)" fill-opacity="0.2"/>
</g>
<defs>
<radialGradient id="paint0_radial_984_377" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(31.8008 24.7048) rotate(41.336) scale(32.9053 273.844)">
<stop stop-color="#EE70A4"/>
<stop offset="1" stop-color="#FF33AD"/>
</radialGradient>
<clipPath id="clip0_984_377">
<rect width="62.1699" height="53.0723" fill="white" transform="translate(0.71582)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Some files were not shown because too many files have changed in this diff Show More