This commit is contained in:
Сюткина Дарья Александровна (4047910) 2023-12-22 01:22:13 +04:00
commit 3feb760b42
72 changed files with 13783 additions and 0 deletions

7
.eslintrc.json Normal file
View File

@ -0,0 +1,7 @@
{
"extends": [
"next/core-web-vitals",
"molindo/typescript",
"molindo/react"
]
}

36
.gitignore vendored Normal file
View File

@ -0,0 +1,36 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
.yarn/install-state.gz
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

8
.idea/bbuddy-ui.iml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

6
.idea/misc.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="JSX" />
</component>
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/bbuddy-ui.iml" filepath="$PROJECT_DIR$/.idea/bbuddy-ui.iml" />
</modules>
</component>
</project>

40
README.md Normal file
View File

@ -0,0 +1,40 @@
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
Node local version 20.10.0
Npm local version 10.2.3

35
messages/de.json Normal file
View File

@ -0,0 +1,35 @@
{
"Header": {
"registration": "Registration",
"enter": "Enter",
"menu": {
"faq": "Start grow with BB",
"experts": "Become BB Expert",
"news": "Blog&News"
}
},
"Main": {
"title": "Bbuddy - Main",
"description": "Bbuddy desc"
},
"Account": {
"menu": {
"sessions": "Upcoming Sessions",
"notifications": "Notification",
"support": "Help & Support",
"information": "Legal Information",
"settings": "Profile Settings",
"messages": "Messages",
"work-with-us": "Work With Us"
}
},
"Footer": {
"email": "info@bbuddy.expert",
"phone": "WA/TG +3579975276",
"address": "Romanou 2, office 401, 1070, Nicosia, Cyprus",
"menu": {
"faq": "FAQ",
"privacy-policy": "Privacy Policy"
}
}
}

35
messages/en.json Normal file
View File

@ -0,0 +1,35 @@
{
"Header": {
"registration": "Registration",
"enter": "Enter",
"menu": {
"faq": "Start grow with BB",
"experts": "Become BB Expert",
"news": "Blog&News"
}
},
"Main": {
"title": "Bbuddy - Main",
"description": "Bbuddy desc"
},
"Account": {
"menu": {
"sessions": "Upcoming Sessions",
"notifications": "Notification",
"support": "Help & Support",
"information": "Legal Information",
"settings": "Profile Settings",
"messages": "Messages",
"work-with-us": "Work With Us"
}
},
"Footer": {
"email": "info@bbuddy.expert",
"phone": "WA/TG +3579975276",
"address": "Romanou 2, office 401, 1070, Nicosia, Cyprus",
"menu": {
"faq": "FAQ",
"privacy-policy": "Privacy Policy"
}
}
}

35
messages/es.json Normal file
View File

@ -0,0 +1,35 @@
{
"Header": {
"registration": "Registration",
"enter": "Enter",
"menu": {
"faq": "Start grow with BB",
"experts": "Become BB Expert",
"news": "Blog&News"
}
},
"Main": {
"title": "Bbuddy - Main",
"description": "Bbuddy desc"
},
"Account": {
"menu": {
"sessions": "Upcoming Sessions",
"notifications": "Notification",
"support": "Help & Support",
"information": "Legal Information",
"settings": "Profile Settings",
"messages": "Messages",
"work-with-us": "Work With Us"
}
},
"Footer": {
"email": "info@bbuddy.expert",
"phone": "WA/TG +3579975276",
"address": "Romanou 2, office 401, 1070, Nicosia, Cyprus",
"menu": {
"faq": "FAQ",
"privacy-policy": "Privacy Policy"
}
}
}

35
messages/fr.json Normal file
View File

@ -0,0 +1,35 @@
{
"Header": {
"registration": "Registration",
"enter": "Enter",
"menu": {
"faq": "Start grow with BB",
"experts": "Become BB Expert",
"news": "Blog&News"
}
},
"Main": {
"title": "Bbuddy - Main",
"description": "Bbuddy desc"
},
"Account": {
"menu": {
"sessions": "Upcoming Sessions",
"notifications": "Notification",
"support": "Help & Support",
"information": "Legal Information",
"settings": "Profile Settings",
"messages": "Messages",
"work-with-us": "Work With Us"
}
},
"Footer": {
"email": "info@bbuddy.expert",
"phone": "WA/TG +3579975276",
"address": "Romanou 2, office 401, 1070, Nicosia, Cyprus",
"menu": {
"faq": "FAQ",
"privacy-policy": "Privacy Policy"
}
}
}

35
messages/it.json Normal file
View File

@ -0,0 +1,35 @@
{
"Header": {
"registration": "Registration",
"enter": "Enter",
"menu": {
"faq": "Start grow with BB",
"experts": "Become BB Expert",
"news": "Blog&News"
}
},
"Main": {
"title": "Bbuddy - Main",
"description": "Bbuddy desc"
},
"Account": {
"menu": {
"sessions": "Upcoming Sessions",
"notifications": "Notification",
"support": "Help & Support",
"information": "Legal Information",
"settings": "Profile Settings",
"messages": "Messages",
"work-with-us": "Work With Us"
}
},
"Footer": {
"email": "info@bbuddy.expert",
"phone": "WA/TG +3579975276",
"address": "Romanou 2, office 401, 1070, Nicosia, Cyprus",
"menu": {
"faq": "FAQ",
"privacy-policy": "Privacy Policy"
}
}
}

35
messages/ru.json Normal file
View File

@ -0,0 +1,35 @@
{
"Header": {
"registration": "Регистрация",
"enter": "Вход",
"menu": {
"faq": "Начни вместе с BB",
"experts": "Стань BB экспертом",
"news": "Блог&Новости"
}
},
"Main": {
"title": "Bbuddy - Главная",
"description": "Bbuddy описание"
},
"Account": {
"menu": {
"sessions": "Мои сессии",
"notifications": "Оповещения",
"support": "Помощь и поддержка",
"information": "Актуальная информация",
"settings": "Настройки профиля",
"messages": "Сообщения",
"work-with-us": "Работать с нами"
}
},
"Footer": {
"email": "info@bbuddy.expert",
"phone": "WA/TG +3579975276",
"address": "Romanou 2, office 401, 1070, Nicosia, Кипр",
"menu": {
"faq": "Помощь",
"privacy-policy": "Политика конфиденциальности"
}
}
}

15
next.config.js Normal file
View File

@ -0,0 +1,15 @@
// @ts-check
const withNextIntl = require('next-intl/plugin')();
/** @type {import('next').NextConfig} */
const nextConfig = {
compiler: {
styledComponents: {
ssr: true,
displayName: true,
namespace: 'bbuddy'
}
}
};
module.exports = withNextIntl(nextConfig);

12269
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

31
package.json Normal file
View File

@ -0,0 +1,31 @@
{
"name": "bbuddy-ui",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@ant-design/cssinjs": "^1.18.1",
"antd": "^5.12.1",
"next": "14.0.3",
"next-intl": "^3.3.1",
"react": "^18",
"react-dom": "^18",
"styled-components": "^6.1.1"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.0.1",
"eslint": "^8.55.0",
"eslint-config-molindo": "^7.0.0",
"eslint-config-next": "^14.0.3",
"postcss": "^8",
"typescript": "^5"
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
public/images/article.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

BIN
public/images/avatar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

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 d="M21.1406 17.5313C20.3962 16.7813 18.5934 15.6867 17.7187 15.2456C16.5797 14.6719 16.4859 14.625 15.5906 15.2902C14.9934 15.7341 14.5964 16.1306 13.8975 15.9816C13.1986 15.8325 11.6798 14.992 10.35 13.6664C9.02015 12.3408 8.13093 10.778 7.9814 10.0814C7.83187 9.38485 8.23499 8.9925 8.67468 8.39391C9.29437 7.55016 9.24749 7.40953 8.71781 6.27047C8.30484 5.38453 7.17843 3.59859 6.42562 2.85797C5.62031 2.0625 5.62031 2.20313 5.1014 2.41875C4.67895 2.5965 4.27366 2.81255 3.89062 3.06422C3.14062 3.5625 2.72437 3.97641 2.43327 4.59844C2.14218 5.22047 2.0114 6.67875 3.51468 9.40969C5.01796 12.1406 6.07265 13.537 8.25562 15.7139C10.4386 17.8908 12.1172 19.0613 14.5711 20.4375C17.6067 22.1377 18.7711 21.8063 19.395 21.5156C20.0189 21.225 20.4347 20.8125 20.9339 20.0625C21.1862 19.6801 21.4028 19.2753 21.5808 18.8531C21.7969 18.3361 21.9375 18.3361 21.1406 17.5313Z" stroke="#2C7873" stroke-width="2" stroke-miterlimit="10"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

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 d="M10 8L14 12L10 16" stroke="#FF8A00" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 197 B

View File

@ -0,0 +1,11 @@
<svg width="179" height="64" viewBox="0 0 179 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.6027 33.9003V14.8105C25.4167 14.5204 24.1872 14.3753 22.8999 14.3753C21.9164 14.3753 21.063 14.4334 20.2964 14.5494L20.3542 28.0689C23.4929 28.1994 25.5902 30.8395 25.5902 33.9003C25.5902 37.0335 23.3917 39.7461 20.1228 39.7461C16.7816 39.7461 14.583 37.0335 14.583 33.9003C14.583 33.5666 14.612 33.2475 14.6554 32.9429L14.5107 0.406158L0.798737 1.53762V33.9003C0.798737 38.8903 2.23068 43.0535 4.70405 46.2448L28.8591 43.6917C27.4127 40.9356 26.6027 37.6428 26.6027 33.9003Z" fill="#35E2CF"/>
<path d="M11.0683 51.3509C13.9322 52.7144 17.2878 53.4252 20.9762 53.4252C25.5758 53.4252 29.9729 51.9746 33.4298 49.204C33.343 49.146 33.2707 49.0734 33.1984 49.0009L11.0683 51.3509Z" fill="#35E2CF"/>
<path d="M33.4298 49.204C36.9012 51.9311 41.5008 53.4252 46.7802 53.4252C52.9419 53.4252 58.7565 50.8287 62.387 45.9257L33.7335 48.9574C33.6467 49.0444 33.531 49.117 33.4298 49.204Z" fill="#5AADCC"/>
<path d="M33.1984 49.0154C33.2706 49.0734 33.3573 49.146 33.4296 49.2185C33.5307 49.1315 33.6463 49.0444 33.7475 48.9719L33.1984 49.0154Z" fill="#5AADCC"/>
<path d="M48.7039 14.3608C47.7203 14.3608 46.867 14.4189 46.1004 14.5349L46.1582 28.0544C49.2969 28.185 51.3942 30.825 51.3942 33.8858C51.3942 37.019 49.1957 39.7316 45.9268 39.7316C42.5856 39.7316 40.387 37.019 40.387 33.8858C40.387 33.5521 40.416 33.233 40.4594 32.9139L40.387 16.7108V0.391663H40.3147L26.6027 1.52312V14.796V33.9003C26.6027 37.6573 27.3983 40.9356 28.8447 43.7063L38.4922 42.6908L65.3376 39.8622C65.8728 37.9474 66.1766 35.8441 66.1766 33.5521C66.191 23.9928 58.8722 14.3608 48.7039 14.3608Z" fill="#5AADCC"/>
<path d="M73.7847 27.7643V45.0263C73.7847 49.6972 75.6505 52.3372 80.091 52.3372C84.951 52.3372 88.0463 50.582 88.0463 40.1088V28.388L91.0404 27.7643V54.3971L88.0463 54.8177V50.5095H87.945C86.9181 52.8449 83.8083 55.0208 79.8307 55.0208C73.264 55.0208 70.7906 51.2928 70.7906 45.3889V28.388L73.7847 27.7643Z" fill="#5AADCC"/>
<path d="M118.392 17.5086L121.386 16.8848V54.4116L118.392 55.0353V50.0598H118.291C116.324 52.6564 112.346 55.0353 108.108 55.0353C100.558 55.0353 94.5696 49.4941 94.5696 41.2982C94.5696 33.6827 100.514 27.7788 108.007 27.7788C112.245 27.7788 115.76 30.0127 118.291 32.9138H118.392V17.5086ZM107.848 30.7815C101.7 30.7815 97.5637 36.1196 97.5637 41.2982C97.5637 47.3617 101.7 52.0326 107.949 52.0326C113.735 52.0326 118.392 47.1151 118.392 41.4578C118.392 34.7126 113.532 30.7815 107.848 30.7815Z" fill="#5AADCC"/>
<path d="M148.984 17.5086L151.978 16.8848V54.4116L148.984 55.0353V50.0598H148.882C146.915 52.6564 142.938 55.0353 138.7 55.0353C131.149 55.0353 125.161 49.4941 125.161 41.2982C125.161 33.6827 131.106 27.7788 138.598 27.7788C142.836 27.7788 146.351 30.0127 148.882 32.9138H148.984V17.5086ZM138.439 30.7815C132.292 30.7815 128.155 36.1196 128.155 41.2982C128.155 47.3617 132.292 52.0326 138.541 52.0326C144.326 52.0326 148.984 47.1151 148.984 41.4578C148.984 34.7126 144.124 30.7815 138.439 30.7815Z" fill="#5AADCC"/>
<path d="M152.802 28.388L155.753 27.7643L166.138 46.738L175.236 27.7643L178.23 28.388L160.917 63.9419L158.024 63.3182L164.431 49.9002L152.802 28.388Z" fill="#5AADCC"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2.25C8.27344 2.25 5.25 5.12766 5.25 8.67188C5.25 12.75 9.75 19.2127 11.4023 21.4448C11.4709 21.5391 11.5608 21.6157 11.6647 21.6686C11.7686 21.7215 11.8835 21.749 12 21.749C12.1165 21.749 12.2314 21.7215 12.3353 21.6686C12.4392 21.6157 12.5291 21.5391 12.5977 21.4448C14.25 19.2136 18.75 12.7533 18.75 8.67188C18.75 5.12766 15.7266 2.25 12 2.25Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 11.25C13.2426 11.25 14.25 10.2426 14.25 9C14.25 7.75736 13.2426 6.75 12 6.75C10.7574 6.75 9.75 7.75736 9.75 9C9.75 10.2426 10.7574 11.25 12 11.25Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 790 B

View File

@ -0,0 +1,3 @@
<svg width="32" height="33" viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.8069 13.0935L26.4613 8.4954C26.5324 8.37197 26.5518 8.2254 26.5153 8.08769C26.4788 7.94998 26.3892 7.83232 26.2663 7.7604C26.2055 7.72474 26.1383 7.70149 26.0685 7.69199C25.9987 7.6825 25.9277 7.68695 25.8596 7.70508C25.7915 7.72322 25.7277 7.75469 25.6719 7.79765C25.6161 7.84062 25.5693 7.89424 25.5344 7.9554L22.8469 12.6129C20.795 11.6754 18.4856 11.1535 16.0019 11.1535C13.5181 11.1535 11.2087 11.676 9.15687 12.6129L6.46938 7.9554C6.39777 7.83208 6.2801 7.74225 6.14226 7.70568C6.00442 7.66911 5.8577 7.68879 5.73438 7.7604C5.61105 7.83201 5.52122 7.94968 5.48465 8.08751C5.44808 8.22535 5.46777 8.37208 5.53937 8.4954L8.1875 13.0935C3.6125 15.571 0.511875 20.2041 0 25.6279H32C31.4881 20.2041 28.3875 15.571 23.8069 13.0935ZM8.65312 21.1342C8.38785 21.1342 8.12853 21.0555 7.90797 20.9081C7.6874 20.7607 7.51549 20.5513 7.41397 20.3062C7.31246 20.0611 7.28589 19.7914 7.33765 19.5312C7.3894 19.2711 7.51714 19.0321 7.70472 18.8445C7.8923 18.6569 8.13128 18.5292 8.39146 18.4774C8.65164 18.4257 8.92132 18.4522 9.1664 18.5537C9.41148 18.6553 9.62095 18.8272 9.76833 19.0477C9.91571 19.2683 9.99438 19.5276 9.99438 19.7929C9.99421 20.1486 9.85285 20.4896 9.60135 20.7411C9.34985 20.9926 9.0088 21.134 8.65312 21.1342ZM23.3406 21.1342C23.0756 21.133 22.8168 21.0534 22.597 20.9054C22.3772 20.7573 22.2061 20.5475 22.1055 20.3023C22.0048 20.0571 21.9791 19.7876 22.0315 19.5278C22.0838 19.268 22.212 19.0295 22.3998 18.8425C22.5876 18.6555 22.8266 18.5283 23.0866 18.477C23.3467 18.4257 23.6161 18.4526 23.8608 18.5543C24.1056 18.656 24.3147 18.8279 24.4618 19.0483C24.609 19.2688 24.6875 19.5279 24.6875 19.7929C24.6874 19.9693 24.6526 20.1439 24.5849 20.3068C24.5173 20.4697 24.4182 20.6177 24.2934 20.7422C24.1685 20.8668 24.0203 20.9655 23.8573 21.0328C23.6942 21.1 23.5195 21.1345 23.3431 21.1342H23.3406Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.8206 8.55371C19.3006 8.55371 18.2356 9.75621 16.4806 9.75621C14.6813 9.75621 13.3088 8.56246 11.125 8.56246C8.98752 8.56246 6.70815 9.86746 5.26065 12.0906C3.22815 15.2256 3.57315 21.13 6.86502 26.16C8.04252 27.9606 9.61502 29.98 11.6775 30.0018H11.715C13.5075 30.0018 14.04 28.8281 16.5069 28.8143H16.5444C18.9744 28.8143 19.4619 29.995 21.2469 29.995H21.2844C23.3469 29.9731 25.0038 27.7356 26.1813 25.9418C27.0288 24.6518 27.3438 24.0043 27.9938 22.545C23.2319 20.7375 22.4669 13.9868 27.1763 11.3987C25.7388 9.59871 23.7188 8.55621 21.8144 8.55621L21.8206 8.55371Z" fill="white"/>
<path d="M21.2656 2C19.7656 2.10187 18.0156 3.05687 16.9906 4.30375C16.0606 5.43375 15.2956 7.11 15.5956 8.73562H15.7156C17.3131 8.73562 18.9481 7.77375 19.9031 6.54125C20.8231 5.36812 21.5206 3.70562 21.2656 2Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 929 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="M22.5 12.0633C22.5 6.26486 17.7984 1.56329 12 1.56329C6.20156 1.56329 1.5 6.26486 1.5 12.0633C1.5 17.3039 5.33906 21.6478 10.3594 22.4363V15.0994H7.69266V12.0633H10.3594V9.75001C10.3594 7.11892 11.9273 5.66439 14.3255 5.66439C15.4744 5.66439 16.6763 5.8697 16.6763 5.8697V8.45392H15.3516C14.048 8.45392 13.6402 9.26298 13.6402 10.0945V12.0633H16.552L16.087 15.0994H13.6406V22.4372C18.6609 21.6492 22.5 17.3053 22.5 12.0633Z" fill="#2C7873"/>
</svg>

After

Width:  |  Height:  |  Size: 594 B

View File

@ -0,0 +1,18 @@
<svg width="166" height="60" viewBox="0 0 166 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4726_2104)">
<path d="M24.0913 31.7816V13.8849C22.9805 13.613 21.829 13.477 20.6233 13.477C19.7022 13.477 18.9029 13.5314 18.1849 13.6402L18.2391 26.3147C21.1788 26.4371 23.1431 28.9121 23.1431 31.7816C23.1431 34.719 21.0839 37.2621 18.0223 37.2621C14.893 37.2621 12.8339 34.719 12.8339 31.7816C12.8339 31.4688 12.861 31.1696 12.9016 30.884L12.7662 0.380859L-0.0762939 1.4416V31.7816C-0.0762939 36.4597 1.26485 40.3627 3.58136 43.3546L26.2047 40.9611C24.85 38.3772 24.0913 35.2902 24.0913 31.7816Z" fill="#35E2CF"/>
<path d="M9.54199 48.1416C12.2243 49.4199 15.3672 50.0863 18.8216 50.0863C23.1295 50.0863 27.2478 48.7263 30.4855 46.1289C30.4042 46.0745 30.3365 46.0065 30.2687 45.9385L9.54199 48.1416Z" fill="#35E2CF"/>
<path d="M30.4855 46.1289C33.7367 48.6855 38.0446 50.0862 42.9893 50.0862C48.7602 50.0862 54.2061 47.652 57.6063 43.0554L30.77 45.8977C30.6887 45.9793 30.5803 46.0473 30.4855 46.1289Z" fill="#5AADCC"/>
<path d="M30.2687 45.9519C30.3364 46.0063 30.4177 46.0743 30.4854 46.1423C30.5803 46.0607 30.6886 45.9791 30.7835 45.9111L30.2687 45.9519Z" fill="#5AADCC"/>
<path d="M44.791 13.4633C43.8698 13.4633 43.0705 13.5177 42.3525 13.6265L42.4067 26.301C45.3464 26.4234 47.3107 28.8985 47.3107 31.7679C47.3107 34.7054 45.2515 37.2484 42.19 37.2484C39.0606 37.2484 37.0015 34.7054 37.0015 31.7679C37.0015 31.4551 37.0286 31.1559 37.0692 30.8568L37.0015 15.6664V0.367188H36.9338L24.0913 1.42793V13.8713V31.7815C24.0913 35.3037 24.8364 38.3772 26.1911 40.9746L35.2268 40.0227L60.3699 37.3708C60.8711 35.5757 61.1556 33.6038 61.1556 31.4551C61.1691 22.4932 54.3144 13.4633 44.791 13.4633Z" fill="#5AADCC"/>
<path d="M68.2813 26.0291V42.2122C68.2813 46.5912 70.0288 49.0662 74.1877 49.0662C78.7395 49.0662 81.6385 47.4207 81.6385 37.602V26.6138L84.4427 26.0291V50.9973L81.6385 51.3917V47.3527H81.5437C80.5818 49.5422 77.6692 51.5821 73.9439 51.5821C67.7936 51.5821 65.4771 48.0871 65.4771 42.5522V26.6138L68.2813 26.0291Z" fill="#5AADCC"/>
<path d="M110.06 16.4144L112.864 15.8296V51.0109L110.06 51.5957V46.9311H109.965C108.123 49.3654 104.397 51.5957 100.428 51.5957C93.3566 51.5957 87.7482 46.4008 87.7482 38.7172C87.7482 31.5776 93.3159 26.0426 100.333 26.0426C104.302 26.0426 107.594 28.1369 109.965 30.8568H110.06V16.4144ZM100.184 28.8577C94.4268 28.8577 90.5524 33.8622 90.5524 38.7172C90.5524 44.4017 94.4268 48.7806 100.279 48.7806C105.698 48.7806 110.06 44.1705 110.06 38.8668C110.06 32.5431 105.508 28.8577 100.184 28.8577Z" fill="#5AADCC"/>
<path d="M138.712 16.4144L141.516 15.8296V51.0109L138.712 51.5957V46.9311H138.617C136.774 49.3654 133.049 51.5957 129.08 51.5957C122.008 51.5957 116.4 46.4008 116.4 38.7172C116.4 31.5776 121.968 26.0426 128.985 26.0426C132.954 26.0426 136.246 28.1369 138.617 30.8568H138.712V16.4144ZM128.836 28.8577C123.078 28.8577 119.204 33.8622 119.204 38.7172C119.204 44.4017 123.078 48.7806 128.931 48.7806C134.349 48.7806 138.712 44.1705 138.712 38.8668C138.712 32.5431 134.16 28.8577 128.836 28.8577Z" fill="#5AADCC"/>
<path d="M142.288 26.6138L145.051 26.0291L154.778 43.8169L163.299 26.0291L166.103 26.6138L149.888 59.9456L147.178 59.3609L153.18 46.7815L142.288 26.6138Z" fill="#5AADCC"/>
</g>
<defs>
<clipPath id="clip0_4726_2104">
<rect width="166" height="60" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.3748 3.24984C17.5342 3.25331 18.6451 3.71539 19.4648 4.53517C20.2846 5.35495 20.7467 6.46582 20.7502 7.62516V16.3748C20.7467 17.5342 20.2846 18.6451 19.4648 19.4648C18.6451 20.2846 17.5342 20.7467 16.3748 20.7502H7.62516C6.46582 20.7467 5.35495 20.2846 4.53517 19.4648C3.71539 18.6451 3.25331 17.5342 3.24984 16.3748V7.62516C3.25331 6.46582 3.71539 5.35495 4.53517 4.53517C5.35495 3.71539 6.46582 3.25331 7.62516 3.24984H16.3748ZM16.3748 1.5H7.62516C4.25625 1.5 1.5 4.25625 1.5 7.62516V16.3748C1.5 19.7437 4.25625 22.5 7.62516 22.5H16.3748C19.7437 22.5 22.5 19.7437 22.5 16.3748V7.62516C22.5 4.25625 19.7437 1.5 16.3748 1.5Z" fill="#2C7873"/>
<path d="M17.6873 7.62515C17.4278 7.62515 17.174 7.54818 16.9582 7.40396C16.7423 7.25974 16.5741 7.05475 16.4748 6.81492C16.3754 6.5751 16.3494 6.3112 16.4001 6.0566C16.4507 5.802 16.5757 5.56813 16.7593 5.38458C16.9428 5.20102 17.1767 5.07602 17.4313 5.02537C17.6859 4.97473 17.9498 5.00072 18.1896 5.10006C18.4294 5.1994 18.6344 5.36763 18.7786 5.58347C18.9229 5.79931 18.9998 6.05306 18.9998 6.31265C19.0002 6.48512 18.9665 6.65596 18.9007 6.81536C18.8349 6.97477 18.7382 7.11961 18.6163 7.24156C18.4943 7.36351 18.3495 7.46017 18.1901 7.526C18.0306 7.59183 17.8598 7.62552 17.6873 7.62515ZM12 8.49984C12.6923 8.49984 13.369 8.70512 13.9446 9.08972C14.5202 9.47433 14.9688 10.021 15.2337 10.6605C15.4986 11.3001 15.568 12.0039 15.4329 12.6828C15.2978 13.3618 14.9645 13.9855 14.475 14.475C13.9855 14.9645 13.3618 15.2978 12.6828 15.4329C12.0039 15.568 11.3001 15.4986 10.6606 15.2337C10.021 14.9688 9.47433 14.5202 9.08973 13.9446C8.70513 13.369 8.49985 12.6923 8.49985 12C8.50084 11.072 8.86992 10.1823 9.52611 9.52611C10.1823 8.86992 11.072 8.50083 12 8.49984ZM12 6.75C10.9617 6.75 9.94662 7.0579 9.08326 7.63478C8.2199 8.21166 7.54699 9.0316 7.14963 9.99091C6.75227 10.9502 6.64831 12.0058 6.85088 13.0242C7.05345 14.0426 7.55347 14.9781 8.28769 15.7123C9.02192 16.4465 9.95738 16.9465 10.9758 17.1491C11.9942 17.3517 13.0498 17.2477 14.0091 16.8504C14.9684 16.453 15.7883 15.7801 16.3652 14.9167C16.9421 14.0534 17.25 13.0383 17.25 12C17.25 10.6076 16.6969 9.27225 15.7123 8.28769C14.7277 7.30312 13.3924 6.75 12 6.75Z" fill="#2C7873"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

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 d="M20.8205 1.5H3.29437C2.33672 1.5 1.5 2.18906 1.5 3.13547V20.7005C1.5 21.652 2.33672 22.5 3.29437 22.5H20.8153C21.7781 22.5 22.5 21.6464 22.5 20.7005V3.13547C22.5056 2.18906 21.7781 1.5 20.8205 1.5ZM8.00953 19.0045H5.00109V9.65063H8.00953V19.0045ZM6.60938 8.22844H6.58781C5.625 8.22844 5.00156 7.51172 5.00156 6.61453C5.00156 5.70094 5.64141 5.00109 6.62578 5.00109C7.61016 5.00109 8.2125 5.69578 8.23406 6.61453C8.23359 7.51172 7.61016 8.22844 6.60938 8.22844ZM19.0045 19.0045H15.9961V13.89C15.9961 12.6647 15.5583 11.8275 14.4698 11.8275C13.6383 11.8275 13.1461 12.39 12.9272 12.938C12.8452 13.1348 12.8231 13.403 12.8231 13.6767V19.0045H9.81469V9.65063H12.8231V10.9523C13.2609 10.3289 13.9448 9.43172 15.5363 9.43172C17.5111 9.43172 19.005 10.7334 19.005 13.5398L19.0045 19.0045Z" fill="#2C7873"/>
</svg>

After

Width:  |  Height:  |  Size: 912 B

View File

@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19.875 4.5H4.125C3.08947 4.5 2.25 5.33947 2.25 6.375V17.625C2.25 18.6605 3.08947 19.5 4.125 19.5H19.875C20.9105 19.5 21.75 18.6605 21.75 17.625V6.375C21.75 5.33947 20.9105 4.5 19.875 4.5Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.25 7.5L12 12.75L18.75 7.5" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 507 B

BIN
public/images/main-top.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

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 d="M4.125 7.125H19.875M4.125 12H19.875M4.125 16.875H19.875" stroke="#66A5AD" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 251 B

View File

@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 12H6.75M17.25 6H21H17.25ZM3 6H14.25H3ZM17.25 18H21H17.25ZM3 18H14.25H3ZM9.75 12H21H9.75Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.75 7.5C16.5784 7.5 17.25 6.82843 17.25 6C17.25 5.17157 16.5784 4.5 15.75 4.5C14.9216 4.5 14.25 5.17157 14.25 6C14.25 6.82843 14.9216 7.5 15.75 7.5Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.25 13.5C9.07843 13.5 9.75 12.8284 9.75 12C9.75 11.1716 9.07843 10.5 8.25 10.5C7.42157 10.5 6.75 11.1716 6.75 12C6.75 12.8284 7.42157 13.5 8.25 13.5Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15.75 19.5C16.5784 19.5 17.25 18.8284 17.25 18C17.25 17.1716 16.5784 16.5 15.75 16.5C14.9216 16.5 14.25 17.1716 14.25 18C14.25 18.8284 14.9216 19.5 15.75 19.5Z" stroke="#2C7873" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
public/images/person.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/images/popular.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -0,0 +1,97 @@
import React from 'react';
export default function Directions() {
return (
<div className="main-popular">
<div className="b-inner">
<h2 className="title-h2">Popular Directions</h2>
<div className="main-popular__row">
<div className="main-popular__coll">
<div className="b-popular">
<div className="b-popular__image">
<img className="" src="/images/popular.png" alt=""/>
</div>
<div className="b-popular__inner">
<div className="b-popular__title">Work Life Balance</div>
<div className="b-popular__wrap-link">
<a className="b-popular__link" href="">23 experts</a> |
<a className="b-popular__link" href="">245 offers</a>
</div>
</div>
</div>
</div>
<div className="main-popular__coll">
<div className="b-popular">
<div className="b-popular__image">
<img className="" src="/images/popular.png" alt=""/>
</div>
<div className="b-popular__inner">
<div className="b-popular__title">Work Life Balance</div>
<div className="b-popular__wrap-link">
<a className="b-popular__link" href="">23 experts</a> |
<a className="b-popular__link" href="">245 offers</a>
</div>
</div>
</div>
</div>
<div className="main-popular__coll d-none d-md-block">
<div className="b-popular">
<div className="b-popular__image">
<img className="" src="/images/popular.png" alt=""/>
</div>
<div className="b-popular__inner">
<div className="b-popular__title">Work Life Balance</div>
<div className="b-popular__wrap-link">
<a className="b-popular__link" href="">23 experts</a> |
<a className="b-popular__link" href="">245 offers</a>
</div>
</div>
</div>
</div>
<div className="main-popular__coll d-none d-lg-block">
<div className="b-popular">
<div className="b-popular__image">
<img className="" src="/images/popular.png" alt=""/>
</div>
<div className="b-popular__inner">
<div className="b-popular__title">Work Life Balance</div>
<div className="b-popular__wrap-link">
<a className="b-popular__link" href="">23 experts</a> |
<a className="b-popular__link" href="">245 offers</a>
</div>
</div>
</div>
</div>
<div className="main-popular__coll d-none d-lg-block">
<div className="b-popular">
<div className="b-popular__image">
<img className="" src="/images/popular.png" alt=""/>
</div>
<div className="b-popular__inner">
<div className="b-popular__title">Work Life Balance</div>
<div className="b-popular__wrap-link">
<a className="b-popular__link" href="">23 experts</a> |
<a className="b-popular__link" href="">245 offers</a>
</div>
</div>
</div>
</div>
<div className="main-popular__coll d-none d-xl-block">
<div className="b-popular">
<div className="b-popular__image">
<img className="" src="/images/popular.png" alt=""/>
</div>
<div className="b-popular__inner">
<div className="b-popular__title">Work Life Balance</div>
<div className="b-popular__wrap-link">
<a className="b-popular__link" href="">23 experts</a> |
<a className="b-popular__link" href="">245 offers</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,266 @@
import React from 'react';
export default function Experts() {
return (
<div className="main-find">
<div className="b-inner">
<div className="main-find__top">
<h2 className="title-h2">Find a expert</h2>
<div className="open-filter">
<img src="/images/options-outline.svg" className="" alt=""/>
</div>
</div>
<div className="row">
<div className="col-xl-3 col-lg-4 d-none d-lg-block">
<div className="b-filter">
<h3 className="title-h3">Coaching</h3>
<div className="b-filter__inner">
<div className="b-filter__item">
<div className="b-filter__title">Work-life Balance</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
<div className="b-filter__item">
<div className="b-filter__title">Strategic Session</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
<div className="b-filter__item">
<div className="b-filter__title">Personal Growth</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
<div className="b-filter__item">
<div className="b-filter__title">Career Planning</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
<div className="b-filter__item">
<div className="b-filter__title">Executive Coaching</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
</div>
<h3 className="title-h3">Mentoring</h3>
<div className="b-filter__inner">
<div className="b-filter__item">
<div className="b-filter__title">Career Development</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
<div className="b-filter__item">
<div className="b-filter__title">Networking</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
</div>
<h3 className="title-h3">Business-consultation</h3>
<div className="b-filter__inner">
<div className="b-filter__item">
<div className="b-filter__title">Business Model Review</div>
<label className="base-switcher">
<input className="base-switcher__input" type="checkbox" />
<span className="base-switcher__line" />
<span className="base-switcher__circle" />
</label>
</div>
</div>
<h3 className="title-h3">Price from 45$ to 170$</h3>
<div className="b-filter__range">
<div />
</div>
<h3 className="title-h3">Duration from 45m to 120m</h3>
<div className="b-filter__range">
<div />
</div>
<button className="btn-apply">Apply</button>
</div>
</div>
<div className="col-xl-9 col-lg-8 ">
<div className="main-find__search">
<div className="main-find__search__input">
<input className="base-input" type="text" placeholder="Search expert by name or anothe text" />
</div>
<div className="main-find__search__sort">
<select name="" id="" aria-label="By top views">
<option selected>By top views</option>
</select>
</div>
<div className="main-find__search__language">
<select name="" id="" aria-label="All">
<option selected>All</option>
<option value="1">Fr</option>
</select>
</div>
<button className="btn-apply">Find</button>
</div>
<div className="search-result">
<div className="card-profile">
<div className="card-profile__header">
<div className="card-profile__header__portrait">
<img src="/images/person.png" className="" alt="" />
</div>
<div className="card-profile__header__inner">
<div className="card-profile__header__name">Matthew Weeks</div>
<div className="card-profile__header__price">
45$ <span>/ 45min</span>
</div>
</div>
</div>
<div className="card-profile__skills">
<div className="skills__list">
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__more">+6</div>
</div>
</div>
<div className="card-profile__title">Senior Software Engineer</div>
<div className="card-profile__subtitle">Auth0</div>
<div className="card-profile__desc">
I have worked across a variety of organizations, lead teams, and delivered quality
software for 8 years. In that time I've worked as an independent consultant, at
agencies as a team lead, and as a senior engineer at Auth0. I also host a podcast
https://anchor.fm/work-in-programming where I break down how …
</div>
<div className="card-profile__footer">
<a href="#">Details
<img className="" src="/images/chevron-forward.svg" alt="" />
</a>
</div>
</div>
<div className="card-profile">
<div className="card-profile__header">
<div className="card-profile__header__portrait">
<img src="/images/person.png" className="" alt="" />
</div>
<div className="card-profile__header__inner">
<div className="card-profile__header__name">Matthew Weeks</div>
<div className="card-profile__header__price">
45$ <span>/ 45min</span>
</div>
</div>
</div>
<div className="card-profile__skills">
<div className="skills__list">
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__more">+6</div>
</div>
</div>
<div className="card-profile__title">Senior Software Engineer</div>
<div className="card-profile__subtitle">Auth0</div>
<div className="card-profile__desc">
I have worked across a variety of organizations, lead teams, and delivered quality
software for 8 years. In that time I've worked as an independent consultant, at
agencies as a team lead, and as a senior engineer at Auth0. I also host a podcast
https://anchor.fm/work-in-programming where I break down how …
</div>
<div className="card-profile__footer">
<a href="#">Details
<img className="" src="/images/chevron-forward.svg" alt="" />
</a>
</div>
</div>
<div className="card-profile">
<div className="card-profile__header">
<div className="card-profile__header__portrait">
<img src="/images/person.png" className="" alt="" />
</div>
<div className="card-profile__header__inner">
<div className="card-profile__header__name">Matthew Weeks</div>
<div className="card-profile__header__price">
45$ <span>/ 45min</span>
</div>
</div>
</div>
<div className="card-profile__skills">
<div className="skills__list">
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__more">+6</div>
</div>
</div>
<div className="card-profile__title">Senior Software Engineer</div>
<div className="card-profile__subtitle">Auth0</div>
<div className="card-profile__desc">
I have worked across a variety of organizations, lead teams, and delivered quality
software for 8 years. In that time I've worked as an independent consultant, at
agencies as a team lead, and as a senior engineer at Auth0. I also host a podcast
https://anchor.fm/work-in-programming where I break down how …
</div>
<div className="card-profile__footer">
<a href="#">Details
<img className="" src="/images/chevron-forward.svg" alt="" />
</a>
</div>
</div>
<div className="card-profile">
<div className="card-profile__header">
<div className="card-profile__header__portrait">
<img src="/images/person.png" className="" alt="" />
</div>
<div className="card-profile__header__inner">
<div className="card-profile__header__name">Matthew Weeks</div>
<div className="card-profile__header__price">
45$ <span>/ 45min</span>
</div>
</div>
</div>
<div className="card-profile__skills">
<div className="skills__list">
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__item">Engineering & Data</div>
<div className="skills__list__more">+6</div>
</div>
</div>
<div className="card-profile__title">Senior Software Engineer</div>
<div className="card-profile__subtitle">Auth0</div>
<div className="card-profile__desc">
I have worked across a variety of organizations, lead teams, and delivered quality
software for 8 years. In that time I've worked as an independent consultant, at
agencies as a team lead, and as a senior engineer at Auth0. I also host a podcast
https://anchor.fm/work-in-programming where I break down how …
</div>
<div className="card-profile__footer">
<a href="#">Details
<img className="" src="/images/chevron-forward.svg" alt="" />
</a>
</div>
</div>
</div>
<ul className="pagination">
<li className="page-item"><a className="page-link" href="#">1</a></li>
<li className="page-item active" aria-current="page">
<a className="page-link" href="#">2</a>
</li>
<li className="page-item"><a className="page-link" href="#">3</a></li>
<li className="page-item"><a className="page-link" href="#">4</a></li>
</ul>
</div>
</div>
</div>
</div>
);
};

View File

@ -0,0 +1,67 @@
import React from 'react';
export default function News() {
return (
<div className="main-articles">
<div className="b-inner">
<h2 className="title-h2">Articles form Experts & News of Project</h2>
<div className="row">
<div className="col-lg-4 col-md-6 col-sm-6">
<div className="b-article">
<div className="b-article__image">
<img className="" src="/images/article.png" alt=""/>
</div>
<div className="b-article__inner">
<div className="b-article__title">News Headline</div>
<div className="b-article__text">
The program not only focuses on a financial perspective, but allows you to study
performance from many angles, such as human resources management, IT, operations
management, risks etc.
</div>
<a href="#" className="b-article__link">Read more
<img className="" src="/images/chevron-forward.svg" alt=""/>
</a>
</div>
</div>
</div>
<div className="col-lg-4 col-md-6 col-sm-6 d-none d-sm-block">
<div className="b-article">
<div className="b-article__image">
<img className="" src="/images/article.png" alt=""/>
</div>
<div className="b-article__inner">
<div className="b-article__title">News Headline</div>
<div className="b-article__text">
The program not only focuses on a financial perspective, but allows you to study
performance from many angles, such as human resources management, IT, operations
management, risks etc.
</div>
<a href="#" className="b-article__link">Read more
<img className="" src="/images/chevron-forward.svg" alt=""/>
</a>
</div>
</div>
</div>
<div className="col-lg-4 d-none d-lg-block">
<div className="b-article">
<div className="b-article__image">
<img className="" src="/images/article.png" alt=""/>
</div>
<div className="b-article__inner">
<div className="b-article__title">News Headline</div>
<div className="b-article__text">
The program not only focuses on a financial perspective, but allows you to study
performance from many angles, such as human resources management, IT, operations
management, risks etc.
</div>
<a href="#" className="b-article__link">Read more
<img className="" src="/images/chevron-forward.svg" alt=""/>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
);
};

View File

@ -0,0 +1,35 @@
import React, { ReactNode } from 'react';
import { getTranslations } from 'next-intl/server';
import { Header, Footer } from '../../../components/Page';
export async function generateMetadata({
params: { locale }
}: { params: { locale: string }}) {
const t = await getTranslations({ locale, namespace: 'Main' });
return {
title: t('title'),
description: t('description'),
};
}
export default function RootLayout({ children, news, directions, experts, params: { locale } }: {
children: ReactNode,
news: ReactNode,
directions: ReactNode,
experts: ReactNode,
params: { locale: string }
}) {
return (
<div className="b-wrapper">
<div className="b-content">
<Header locale={locale} />
{children}
{news}
{directions}
{experts}
</div>
<Footer />
</div>
);
};

View File

@ -0,0 +1,39 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - Main',
description: 'Bbuddy desc'
};
export default function Home() {
return (
<div className="main-top">
<div className="b-inner">
<h1 className="title-h1">
Mentorship, Career
Development & Coaching.
</h1>
<div className="main-top__wrap-text">
<p className="main-top__text">The ins-and-outs of building a career in tech, gaining experience </p>
<p className="main-top__text">from a mentor, and getting your feet wet with coaching.</p>
</div>
<div className="main-top__wrap-btn">
<a href="#" className="main-top__btn main-top__btn--apple">
<img className="" src="/images/logo-apple.svg" alt=""/>
<span className="line" />
AppStore
</a>
<a href="#" className="main-top__btn main-top__btn--android">
<img className="" src="/images/logo-android.svg" alt=""/>
<span className="line" />
GooglePlay
</a>
</div>
<div className="main-top__img">
<img className="" src="/images/main-top.png" alt=""/>
</div>
</div>
</div>
);
};

View File

@ -0,0 +1,15 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - Account - Information',
description: 'Bbuddy desc information'
};
export default function Information() {
return (
<div>
Страница Информации о пользователе
</div>
);
}

View File

@ -0,0 +1,15 @@
import React from 'react';
import { AccountMenu } from '../../../components/Account';
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<section>
<aside>
<AccountMenu />
<span>Log Out</span>
</aside>
<section>{children}</section>
</section>
)
}

View File

@ -0,0 +1,24 @@
'use client'
import React, { useEffect } from 'react';
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string }
reset: () => void
}) {
useEffect(() => {
console.error(error);
}, [error])
return (
<div>
<h2>Something went wrong!</h2>
<button onClick={() => reset()}>
Try again
</button>
</div>
);
}

View File

@ -0,0 +1,13 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - Experts item',
description: 'Bbuddy desc experts'
};
export default function Expert({ params }: { params: { expertId: string | number } }) {
return (
<div>Current expert: {params.expertId}</div>
);
}

View File

@ -0,0 +1,15 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - Experts',
description: 'Bbuddy desc experts'
};
export default function Experts() {
return (
<div>
Страница экспертов
</div>
);
}

View File

@ -0,0 +1,15 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - FAQ',
description: 'Bbuddy desc faq'
};
export default function Faq() {
return (
<div>
Страница faq
</div>
);
}

View File

@ -0,0 +1,8 @@
html, body {
height: 100%;
}
body {
font-family: var(--font-comfortaa), -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
background-color: #ffffff;
}

View File

@ -0,0 +1,54 @@
import React, { ReactNode } from 'react';
import { unstable_setRequestLocale } from 'next-intl/server';
import type { Metadata } from 'next';
import { Comfortaa, Inter } from 'next/font/google';
import { notFound } from 'next/navigation';
import { ConfigProvider } from 'antd';
import StyledComponentsRegistry from '../../lib/AntdRegistry';
import { ALLOWED_LOCALES } from '../../constants/locale';
import './global.css'
type RootLayoutProps = {
children: ReactNode;
params: { locale: string };
};
export function generateStaticParams() {
return ALLOWED_LOCALES.map((locale) => ({ locale }));
}
export const metadata: Metadata = {
title: 'Bbuddy'
};
const comfortaa = Comfortaa({
weight: ['300', '400', '500', '600', '700'],
subsets: ['latin', 'cyrillic'],
variable: '--font-comfortaa',
display: 'swap',
});
const inter = Inter({
weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'],
subsets: ['latin', 'cyrillic'],
variable: '--font-inter',
display: 'swap',
});
export default function RootLayout({ children, params: { locale } }: RootLayoutProps) {
if (!ALLOWED_LOCALES.includes(locale as any)) notFound();
unstable_setRequestLocale(locale);
return (
<html lang={locale} className={`${comfortaa.variable} ${inter.variable}`}>
<body>
<StyledComponentsRegistry>
<ConfigProvider theme={{ cssVar: true, hashed: false }}>
{children}
</ConfigProvider>
</StyledComponentsRegistry>
</body>
</html>
);
}

View File

@ -0,0 +1,9 @@
import React from 'react';
export default function Loading() {
return (
<div>
...loading
</div>
);
}

View File

@ -0,0 +1,15 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - News',
description: 'Bbuddy desc news'
};
export default function News() {
return (
<div>
Страница новостей
</div>
);
}

View File

@ -0,0 +1,9 @@
import React from 'react';
export default function NotFound() {
return (
<div>
not found
</div>
);
}

View File

@ -0,0 +1,15 @@
import React from 'react';
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Bbuddy - Privacy Policy',
description: 'Bbuddy desc search'
};
export default function PrivacyPolicy() {
return (
<div>
Privacy policy
</div>
);
}

View File

@ -0,0 +1,5 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow: /account$
Disallow: /account/*
Disallow: /search

6
src/app/page.tsx Normal file
View File

@ -0,0 +1,6 @@
import { redirect } from 'next/navigation';
import { DEFAULT_LOCALE } from '../constants/locale';
export default function RootPage() {
redirect(`/${DEFAULT_LOCALE}`);
}

View File

@ -0,0 +1,21 @@
import React from 'react';
import { Link } from '../../navigation';
import { useTranslations } from 'next-intl';
const ROUTES = ['sessions', 'notifications', 'support', 'information', 'settings', 'messages', 'work-with-us'];
export const AccountMenu = () => {
const t = useTranslations('Account');
return (
<ul>
{ROUTES.map((item) => (
<li key={item}>
<Link href={`/account/${item}`}>
{t(`menu.${item}`)}
</Link>
</li>
))}
</ul>
)
};

View File

@ -0,0 +1 @@
export { AccountMenu } from './AccountMenu';

View File

@ -0,0 +1,60 @@
import React from 'react';
import { useTranslations } from 'next-intl';
import { Link } from '../../../navigation';
import { FOOTER_ROUTES } from '../../../constants/routes';
export const Footer = () => {
const t = useTranslations('Footer');
return (
<footer className="b-footer">
<div className="b-inner">
<div className="row">
<div className="col">
<a href="/" className="b-footer__logo">
<img className="" src="/images/footer-logo.svg" alt=""/>
</a>
</div>
<div className="col-md-auto">
<div className="b-footer__row">
<div className="b-footer__coll">
<div className="b-footer__coll__item">
<a href={`mailto:${t('email')}`} className="b-footer__link">
<img className="" src="/images/mail-outline.svg" alt=""/>
{t('email')}
</a>
<a href="#" className="b-footer__link">
<img className="" src="/images/call-outline.svg" alt=""/>
{t('phone')}
</a>
</div>
<span className="b-footer__text">
<img className="" src="/images/location-outline.svg" alt=""/>
{t('address')}
</span>
</div>
<div className="b-footer__coll-2">
<div className="b-footer__coll-2__item">
{FOOTER_ROUTES.map((item) => (
<Link key={item} href={`/${item}`} className="b-footer__link">{t(`menu.${item}`)}</Link>
))}
</div>
<div className="b-footer__social">
<a href="#" className="b-footer__link">
<img className="" src="/images/logo-facebook.svg" alt=""/>
</a>
<a href="#" className="b-footer__link">
<img className="" src="/images/logo-instagram.svg" alt=""/>
</a>
<a href="#" className="b-footer__link">
<img className="" src="/images/logo-linkedin.svg" alt=""/>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</footer>
);
}

View File

@ -0,0 +1,24 @@
import React, { FC } from 'react';
import { useTranslations } from 'next-intl';
type HeaderAuthLinksProps = {
separatorClass?: string;
};
export const HeaderAuthLinks: FC<HeaderAuthLinksProps> = ({ separatorClass = 'b-header__nav__list__line' }) => {
const t = useTranslations('Header');
return (
<>
<li>
<a href="#">{t('registration')}</a>
</li>
<li>
<span className={separatorClass}>|</span>
</li>
<li>
<a href="#">{t('enter')}</a>
</li>
</>
);
}

View File

@ -0,0 +1,13 @@
import React from 'react';
import { HeaderAuthLinks } from './HeaderAuthLinks';
export const HeaderMenu = ({ children }) => (
<div className="b-header__nav">
<nav>
<ul className="b-header__nav__list ">
{children}
<HeaderAuthLinks />
</ul>
</nav>
</div>
);

View File

@ -0,0 +1,43 @@
'use client'
import React, {FC, useState} from 'react';
import { HeaderAuthLinks } from './HeaderAuthLinks';
type HeaderMenuMobileProps = {
open: boolean;
};
export const HeaderMobileMenu: FC<HeaderMenuMobileProps> = ({ open, children }) => {
const [showMobileMenu, setShowMobileMenu] = useState<boolean>(false);
return (
<>
<div className="b-header__menu-open" onClick={() => setShowMobileMenu(!showMobileMenu)}>
<img
src="/images/menu-open.svg"
className="img-default"
alt=""
/>
</div>
{open ? (
<div className="menu-mobile">
<div className="menu-mobile__inner">
<div className="menu-mobile__header">
<div className="menu-mobile__header__avatar">
<img className="img-default" src="/images/avatar.png" alt=""/>
</div>
<ul className="menu-mobile__header__nav">
<HeaderAuthLinks separatorClass="menu-mobile__header__nav__line" />
</ul>
</div>
<div className="menu-mobile__body">
<ul className="menu-mobile__list">
{children}
</ul>
</div>
</div>
</div>
) : null}
</>
);
};

View File

@ -0,0 +1,35 @@
'use client';
import React, { useTransition } from 'react';
import { Button, Dropdown } from 'antd';
import type { MenuProps } from 'antd';
import { useRouter, usePathname } from '../../../navigation';
import { LOCALES } from '../../../constants/locale';
import { Locale } from '../../../types/locale';
export const LanguageSwitcher = ({ locale }: { locale: string }) => {
const router = useRouter();
const [isPending, startTransition] = useTransition();
const pathname = usePathname();
const onClick: MenuProps['onClick'] = (e) => {
startTransition(() => {
router.replace(pathname, { locale: e.key });
});
};
const menuProps = {
items: Object.entries(LOCALES).map(([ key, label ]) => ({ key, label })),
selectable: true,
defaultSelectedKeys: [locale],
onClick
};
return (
<Dropdown menu={menuProps} disabled={isPending}>
<Button>
{LOCALES[locale as Locale]}
</Button>
</Dropdown>
);
};

View File

@ -0,0 +1,44 @@
import React, { FC } from 'react';
import { useTranslations } from 'next-intl';
import { HeaderMenu } from './HeaderMenu';
import { LanguageSwitcher } from './LanguageSwitcher';
import { HeaderMobileMenu } from './HeaderMobileMenu';
import { HEAD_ROUTES } from '../../../constants/routes';
import { Link } from '../../../navigation';
type HeaderProps = {
locale: string;
};
export const Header: FC<HeaderProps> = ({ locale }) => {
const t = useTranslations('Header');
const routes = HEAD_ROUTES.map((item) => (
<li key={item}>
<Link href={`/${item}`}>{t(`menu.${item}`)}</Link>
</li>
));
return (
<>
<header className="b-header">
<div className="b-inner">
<div className="b-header__logo">
<img
src="/images/logo-header.svg"
className="img-default"
alt=""
/>
</div>
<HeaderMenu>
{routes}
</HeaderMenu>
<LanguageSwitcher locale={locale} />
</div>
</header>
<HeaderMobileMenu>
{routes}
</HeaderMobileMenu>
</>
);
};

View File

@ -0,0 +1,2 @@
export * from './Header';
export * from './Footer';

14
src/constants/locale.ts Normal file
View File

@ -0,0 +1,14 @@
import { Locale } from '../types/locale';
export const DEFAULT_LOCALE = Locale.en;
export const ALLOWED_LOCALES = [Locale.en, Locale.ru, Locale.de, Locale.it, Locale.es, Locale.fr] as const;
export const LOCALE_PREFIX = undefined;
export const LOCALES = {
[Locale.en]: 'English',
[Locale.ru]: 'Russian',
[Locale.de]: 'German',
[Locale.it]: 'Italian',
[Locale.es]: 'Spanish',
[Locale.fr]: 'French',
};

2
src/constants/routes.ts Normal file
View File

@ -0,0 +1,2 @@
export const HEAD_ROUTES = ['faq', 'experts', 'news'];
export const FOOTER_ROUTES = ['faq', 'privacy-policy'];

10
src/i18n.ts Normal file
View File

@ -0,0 +1,10 @@
import { getRequestConfig } from 'next-intl/server';
import { Locale } from './types/locale';
export default getRequestConfig(async ({ locale }) => ({
messages: (
await (locale === Locale.en
? import('../messages/en.json')
: import(`../messages/${locale}.json`))
).default
}));

22
src/lib/AntdRegistry.tsx Normal file
View File

@ -0,0 +1,22 @@
'use client';
import React from 'react';
import { createCache, extractStyle, StyleProvider } from '@ant-design/cssinjs';
import type Entity from '@ant-design/cssinjs/es/Cache';
import { useServerInsertedHTML } from 'next/navigation';
const StyledComponentsRegistry = ({ children }: React.PropsWithChildren) => {
const cache = React.useMemo<Entity>(() => createCache(), []);
const isServerInserted = React.useRef<boolean>(false);
useServerInsertedHTML(() => {
// avoid duplicate css insert
if (isServerInserted.current) {
return;
}
isServerInserted.current = true;
return <style id="antd" dangerouslySetInnerHTML={{ __html: extractStyle(cache, true) }} />;
});
return <StyleProvider cache={cache}>{children}</StyleProvider>;
};
export default StyledComponentsRegistry;

12
src/middleware.ts Normal file
View File

@ -0,0 +1,12 @@
import createMiddleware from 'next-intl/middleware';
import { ALLOWED_LOCALES, DEFAULT_LOCALE, LOCALE_PREFIX } from './constants/locale';
export default createMiddleware({
locales: ALLOWED_LOCALES,
localePrefix: LOCALE_PREFIX,
defaultLocale: DEFAULT_LOCALE
});
export const config = {
matcher: ['/', '/(en|ru|de|it|es|fr)/:path*']
};

11
src/navigation.ts Normal file
View File

@ -0,0 +1,11 @@
import { createLocalizedPathnamesNavigation } from 'next-intl/navigation';
import { ALLOWED_LOCALES, LOCALE_PREFIX } from './constants/locale';
export const { Link, redirect, usePathname, useRouter } =
createLocalizedPathnamesNavigation({
locales: ALLOWED_LOCALES,
pathnames: {
'/': '/'
},
localePrefix: LOCALE_PREFIX
});

8
src/types/locale.ts Normal file
View File

@ -0,0 +1,8 @@
export enum Locale {
'en' = 'en',
'ru' = 'ru',
'de' = 'de',
'it' = 'it',
'es' = 'es',
'fr' = 'fr'
}

26
tsconfig.json Normal file
View File

@ -0,0 +1,26 @@
{
"extends": "eslint-config-molindo/tsconfig.json",
"compilerOptions": {
"baseUrl": "src",
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
]
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}