├── src
├── pages
│ ├── News
│ │ ├── news.css
│ │ └── news.tsx
│ ├── About
│ │ ├── About.css
│ │ └── About.tsx
│ ├── Login
│ │ ├── login.css
│ │ └── login.tsx
│ ├── Staff
│ │ ├── staff.css
│ │ └── staff.tsx
│ ├── Contacts
│ │ ├── contacts.css
│ │ └── contacts.tsx
│ ├── Education
│ │ ├── education.css
│ │ └── education.tsx
│ ├── Vacancies
│ │ ├── vacancies.css
│ │ └── vacancies.tsx
│ └── Main
│ │ ├── SliderPhoto
│ │ ├── SliderPhoto.css
│ │ └── SliderPhoto.tsx
│ │ ├── Teachgers_Slider
│ │ ├── Teachgers_Slider.css
│ │ └── Teachgers_Slider.tsx
│ │ ├── DirectorPhoto
│ │ ├── DirectorPhoto.tsx
│ │ └── DirectorPhoto.css
│ │ ├── Achievements
│ │ ├── Achievements.css
│ │ └── Achievements.tsx
│ │ └── Question
│ │ ├── Accordion.css
│ │ └── Accordion.tsx
├── vite-env.d.ts
├── Footer
│ ├── Footer_lower
│ │ ├── Footer_lower.css
│ │ └── Footer_lower.tsx
│ ├── Footer_top
│ │ ├── Footer_top.css
│ │ └── Footer_top.tsx
│ ├── favicon.png
│ ├── Footer.css
│ └── Footer.tsx
├── index.css
├── Header
│ ├── favicon.png
│ ├── Header.css
│ └── Header.tsx
├── App.css
├── App.tsx
├── main.tsx
├── Carousel
│ └── Carousel.tsx
└── assets
│ └── react.svg
├── tsconfig.node.tsbuildinfo
├── public
├── favicon.png
└── vite.svg
├── Styles
├── test_img.avif
└── Styles.css
├── images
└── Ellipse 15.png
├── postcss.config.js
├── tsconfig.json
├── tailwind.config.js
├── vite.config.ts
├── README.md
├── .gitignore
├── index.html
├── tsconfig.node.json
├── .github
└── workflows
│ └── main.yml
├── tsconfig.app.json
├── tsconfig.app.tsbuildinfo
├── package.json
└── Dockerfile
/src/pages/News/news.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/About/About.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Login/login.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Staff/staff.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Contacts/contacts.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Education/education.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Vacancies/vacancies.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Main/SliderPhoto/SliderPhoto.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Main/Teachgers_Slider/Teachgers_Slider.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/Footer/Footer_lower/Footer_lower.css:
--------------------------------------------------------------------------------
1 | .footer_lower{
2 |
3 | }
--------------------------------------------------------------------------------
/src/Footer/Footer_top/Footer_top.css:
--------------------------------------------------------------------------------
1 | .footer_top{
2 |
3 | }
--------------------------------------------------------------------------------
/tsconfig.node.tsbuildinfo:
--------------------------------------------------------------------------------
1 | {"root":["./vite.config.ts"],"version":"5.6.2"}
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/capybaracplusplus/govno-react-school-website/HEAD/public/favicon.png
--------------------------------------------------------------------------------
/Styles/test_img.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/capybaracplusplus/govno-react-school-website/HEAD/Styles/test_img.avif
--------------------------------------------------------------------------------
/images/Ellipse 15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/capybaracplusplus/govno-react-school-website/HEAD/images/Ellipse 15.png
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | }
6 | }
--------------------------------------------------------------------------------
/src/Footer/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/capybaracplusplus/govno-react-school-website/HEAD/src/Footer/favicon.png
--------------------------------------------------------------------------------
/src/Header/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/capybaracplusplus/govno-react-school-website/HEAD/src/Header/favicon.png
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 |
2 | .DirectorPhoto_Teachgers_Slider{
3 | display: flex;
4 | justify-content: center;
5 | align-items: center;
6 | }
7 |
8 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./src/**/*.{html,ts,tsx,jsx,js}"],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | }
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | base: './',
7 | plugins: [react()],
8 | })
9 |
--------------------------------------------------------------------------------
/src/pages/News/news.tsx:
--------------------------------------------------------------------------------
1 | //import React from 'react';
2 |
3 |
4 | function News() {
5 | return (
6 | <>
7 |
Заголовок
8 | НОВОСТИ!!!
9 | >
10 | )
11 | }
12 | export default News;
--------------------------------------------------------------------------------
/src/pages/Staff/staff.tsx:
--------------------------------------------------------------------------------
1 | //import React from 'react';
2 |
3 |
4 | function Staff() {
5 | return (
6 | <>
7 | Заголовок
8 | наши учителя
9 | >
10 | )
11 | }
12 | export default Staff;
--------------------------------------------------------------------------------
/src/pages/Login/login.tsx:
--------------------------------------------------------------------------------
1 | //import React from 'react';
2 |
3 |
4 | function Login() {
5 | return (
6 | <>
7 | Заголовок
8 | типа регистрация
9 | >
10 | )
11 | }
12 | export default Login;
--------------------------------------------------------------------------------
/src/pages/Contacts/contacts.tsx:
--------------------------------------------------------------------------------
1 | //import React from 'react';
2 |
3 |
4 | function Contacts() {
5 | return (
6 | <>
7 | Заголовок
8 | тут контакты
9 | >
10 | )
11 | }
12 | export default Contacts;
--------------------------------------------------------------------------------
/src/pages/About/About.tsx:
--------------------------------------------------------------------------------
1 | // import React from 'react';
2 |
3 |
4 | function About() {
5 | return (
6 | <>
7 | О нас
8 | Здесь будет информация о нашей школе.
9 | >
10 | )
11 | }
12 | export default About;
--------------------------------------------------------------------------------
/src/pages/Education/education.tsx:
--------------------------------------------------------------------------------
1 | //import React from 'react';
2 |
3 |
4 | function Education() {
5 | return (
6 | <>
7 | Заголовок
8 | инфа о обучении
9 | >
10 | )
11 | }
12 | export default Education;
--------------------------------------------------------------------------------
/src/pages/Main/Teachgers_Slider/Teachgers_Slider.tsx:
--------------------------------------------------------------------------------
1 | import './Teachgers_Slider.css'
2 |
3 | function Teachgers_Slider() {
4 | return (
5 | <>
6 | Teachgers_Slider
7 | >
8 | )
9 | }
10 |
11 | export default Teachgers_Slider;
--------------------------------------------------------------------------------
/src/pages/Vacancies/vacancies.tsx:
--------------------------------------------------------------------------------
1 | // import React from 'react';
2 |
3 |
4 | function Vacancies() {
5 | return (
6 | <>
7 | Заголовок
8 | Приходите к нам работать
9 | >
10 | )
11 | }
12 | export default Vacancies;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Running a Project Using Docker
2 | ```bash
3 | git clone https://github.com/capybaracplusplus/Govno-React-School-website.git
4 |
5 | cd Govno-React-School-website
6 |
7 | docker build -t school-website .
8 |
9 | docker run -d -p 3000:3000 school-website
10 | ```
11 |
--------------------------------------------------------------------------------
/src/Footer/Footer_lower/Footer_lower.tsx:
--------------------------------------------------------------------------------
1 | function Footer_lower() {
2 | return (
3 | <>
4 |
5 |
Контакты:
6 |
Дискорд Телега Вконтакте Одноклассники
7 |
8 | >
9 | )
10 | }
11 | export default Footer_lower;
--------------------------------------------------------------------------------
/src/Footer/Footer_top/Footer_top.tsx:
--------------------------------------------------------------------------------
1 | function Footer_top() {
2 | return (
3 | <>
4 |
5 |
Меню:
6 |
Главная О нас Обучение Педсостав Вакансии Новости Контакты
7 |
8 |
9 | >
10 | )
11 | }
12 | export default Footer_top;
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/src/pages/Main/DirectorPhoto/DirectorPhoto.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './DirectorPhoto.css';
3 |
4 | const DirectorPhoto: React.FC = () => {
5 | return (
6 |
7 |
8 | Фото директора
9 |
10 |
11 | );
12 | };
13 |
14 | export default DirectorPhoto;
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | School-website
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/pages/Main/DirectorPhoto/DirectorPhoto.css:
--------------------------------------------------------------------------------
1 | .director-photo {
2 | display: flex;
3 | justify-content: center;
4 | align-items: center;
5 | margin-left: 20px;
6 | }
7 |
8 | .photo-circle {
9 | width: 200px;
10 | height: 200px;
11 | border-radius: 50%;
12 | background: linear-gradient(90deg, #3A42B2 0%, #1F1E29 100%);
13 | display: flex;
14 | justify-content: center;
15 | align-items: center;
16 | color: white;
17 | font-size: 18px;
18 | font-family: Arial, sans-serif;
19 | text-align: center;
20 | }
21 |
--------------------------------------------------------------------------------
/src/pages/Main/SliderPhoto/SliderPhoto.tsx:
--------------------------------------------------------------------------------
1 | import './SliderPhoto.css'
2 | import Carousel from '../../../Carousel/Carousel';
3 |
4 | const images = [
5 | "https://avatars.mds.yandex.net/get-altay/4530524/2a00000179e64be106f8902aa9d99c6d4baf/L_height",
6 | "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRmdpijMxdX4EqRRprtXbrrcdbGjo4bJfMTbw&s",
7 | ]
8 |
9 | function SliderPhoto() {
10 | return (
11 | <>
12 |
13 | >
14 | )
15 | }
16 |
17 | export default SliderPhoto;
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2022",
4 | "lib": ["ES2023"],
5 | "module": "ESNext",
6 | "skipLibCheck": true,
7 |
8 | /* Bundler mode */
9 | "moduleResolution": "bundler",
10 | "allowImportingTsExtensions": true,
11 | "isolatedModules": true,
12 | "moduleDetection": "force",
13 | "noEmit": true,
14 |
15 | /* Linting */
16 | "strict": true,
17 | "noUnusedLocals": true,
18 | "noUnusedParameters": true,
19 | "noFallthroughCasesInSwitch": true
20 | },
21 | "include": ["vite.config.ts"]
22 | }
23 |
--------------------------------------------------------------------------------
/src/pages/Main/Achievements/Achievements.css:
--------------------------------------------------------------------------------
1 | .achievements {
2 | max-width: 465px;
3 | }
4 |
5 | .achievements-title {
6 | font-size: 24px;
7 | color: #b03030;
8 | font-family: 'Georgia', serif;
9 | margin-bottom: 20px;
10 | }
11 |
12 | .achievement-item {
13 | background: linear-gradient(90deg, #3A42B2 0%, #1F1E29 100%);
14 | color: white;
15 | padding: 15px;
16 | margin: 10px 0;
17 | border-radius: 10px;
18 | font-family: Arial, sans-serif;
19 | text-align: left;
20 | font-size: 16px;
21 | }
22 |
23 | @media screen {
24 |
25 | }
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on:
4 | push:
5 | branches: [ master ]
6 |
7 | jobs:
8 | build:
9 | runs-on: ubuntu-latest
10 |
11 | steps:
12 | - uses: actions/checkout@v4
13 | - uses: actions/setup-node@v4
14 |
15 | - name: Install
16 | run: |
17 | npm i
18 |
19 | - name: Build
20 | run: |
21 | npm run build
22 |
23 | - name: Deploy
24 | uses: crazy-max/ghaction-github-pages@v4
25 | with:
26 | target_branch: gh-pages
27 | build_dir: dist
28 | env:
29 | GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
--------------------------------------------------------------------------------
/src/Footer/Footer.css:
--------------------------------------------------------------------------------
1 | .footer_container{
2 | color:aquamarine;
3 | background: linear-gradient(92.14deg, rgba(31, 30, 41, 0.95) 7.09%, rgba(58, 66, 178, 0.95) 36.34%);
4 | height: 198px;
5 | display: flex;
6 | align-items: center;
7 | gap: 100px;
8 | }
9 |
10 | .top_lower_footer{
11 |
12 | }
13 |
14 | .logo_footer{
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true
22 | },
23 | "include": ["src"]
24 | }
25 |
--------------------------------------------------------------------------------
/src/pages/Main/Achievements/Achievements.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './Achievements.css';
3 |
4 | const Achievements: React.FC = () => {
5 | const items = ['Школа признана лучшей в городе', 'Ученик занял 1 место на олимпиаде', 'Сборная футбола школы заняла первое место на соревнованиях', 'я не знаю что писать'];
6 |
7 | return (
8 |
9 |
Достижения
10 | {items.map((item, index) => (
11 |
12 | {item}
13 |
14 | ))}
15 |
16 | );
17 | };
18 |
19 | export default Achievements;
20 |
--------------------------------------------------------------------------------
/Styles/Styles.css:
--------------------------------------------------------------------------------
1 | html,body{
2 | box-sizing: border-box;
3 | }
4 |
5 | *,*::after,*::before{
6 | box-sizing: inherit;
7 | }
8 |
9 | body{
10 | position: relative;
11 | min-height: 100vh;
12 |
13 | }
14 | body::after{
15 | background: white;
16 | background-size: cover;
17 | background-repeat: no-repeat;
18 | background-position: center;
19 | position: absolute;
20 | content: "";
21 | height: 100vh;
22 | width: 99vw;
23 | top: 0;
24 | left: 0;
25 | z-index: -999;
26 | }
27 |
28 | main{
29 | min-height: calc(100vh - 236px)
30 | }
31 |
32 | .container{
33 | width: 100%;
34 | max-width: 1000px;
35 | margin: 0 auto;
36 | padding: 0 10px;
37 | }
38 |
--------------------------------------------------------------------------------
/tsconfig.app.tsbuildinfo:
--------------------------------------------------------------------------------
1 | {"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/carousel/carousel.tsx","./src/footer/footer.tsx","./src/footer/footer_lower/footer_lower.tsx","./src/footer/footer_top/footer_top.tsx","./src/header/header.tsx","./src/pages/about/about.tsx","./src/pages/contacts/contacts.tsx","./src/pages/education/education.tsx","./src/pages/login/login.tsx","./src/pages/main/achievements/achievements.tsx","./src/pages/main/photoofdirector/photoofdirector.tsx","./src/pages/main/question/question.tsx","./src/pages/main/sliderphoto/sliderphoto.tsx","./src/pages/main/teachgers_slider/teachgers_slider.tsx","./src/pages/news/news.tsx","./src/pages/staff/staff.tsx","./src/pages/vacancies/vacancies.tsx"],"version":"5.6.2"}
--------------------------------------------------------------------------------
/src/Footer/Footer.tsx:
--------------------------------------------------------------------------------
1 | import "./Footer.css"
2 | import Footer_top from "./Footer_top/Footer_top"
3 | import Footer_lower from "./Footer_lower/Footer_lower"
4 | import faviconSrc from "./favicon.png"
5 |
6 | function Footer() {
7 | return (
8 | <>
9 |
10 |
11 |
12 |
13 |
14 |
15 |

16 |
Название школы
17 |
18 |
19 | >
20 |
21 | )
22 | }
23 |
24 | export default Footer;
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "test_bun",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc -b && vite build",
9 | "preview": "vite preview"
10 | },
11 | "homepage": "https://capybaracplusplus.github.io/Govno-React-School-website",
12 | "dependencies": {
13 | "@types/react-slick": "^0.23.13",
14 | "react": "^18.3.1",
15 | "react-dom": "^18.3.1",
16 | "react-router-dom": "^6.26.2",
17 | "react-slick": "^0.30.2"
18 | },
19 | "devDependencies": {
20 | "@types/react": "^18.3.3",
21 | "@types/react-dom": "^18.3.0",
22 | "@vitejs/plugin-react": "^4.3.1",
23 | "autoprefixer": "^10.4.20",
24 | "tailwindcss": "^3.4.10",
25 | "typescript": "^5.5.3",
26 | "vite": "^5.4.1"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/pages/Main/Question/Accordion.css:
--------------------------------------------------------------------------------
1 | .accordion {
2 | max-width: 685px;
3 | margin: 0 auto;
4 | font-family: Arial, sans-serif;
5 | }
6 |
7 | .accordion-item {
8 | background: linear-gradient(90deg, #3A42B2 0%, #1F1E29 100%);
9 | margin: 10px 0;
10 | border-radius: 5px;
11 | overflow: hidden;
12 | }
13 |
14 | .accordion-header {
15 | display: flex;
16 | justify-content: space-between;
17 | align-items: center;
18 | color: white;
19 | padding: 15px;
20 | cursor: pointer;
21 | font-size: 16px;
22 | }
23 |
24 | .accordion-content {
25 | background: linear-gradient(90deg, #3A42B2 0%, #1F1E29 100%);
26 | color: white;
27 | padding: 15px;
28 | font-size: 14px;
29 | line-height: 1.5;
30 | }
31 |
32 | .accordion-header h3 {
33 | margin: 0;
34 | }
35 |
36 | .accordion-header span {
37 | font-size: 20px;
38 | }
39 |
--------------------------------------------------------------------------------
/src/Header/Header.css:
--------------------------------------------------------------------------------
1 |
2 |
3 | .hearder_logo img {
4 | width: 100%;
5 | height: auto;
6 | }
7 |
8 | .hearder_icons {
9 | display: flex;
10 | align-items: center;
11 | gap: 15px;
12 | }
13 |
14 | .icon_h img {
15 | min-width: 40px;
16 | min-height: 40px;
17 | width: 40px;
18 | height: 40px;
19 | border-radius: 50%;
20 | transition: background-color 0.3s ease;
21 | }
22 |
23 | .icon_h:hover {
24 | background-color: #f0f0f0;
25 | border-radius: 50%;
26 | }
27 |
28 | .mybutton {
29 | color: black;
30 | font-family: Pacifico;
31 | cursor: pointer;
32 | text-decoration: none;
33 | position: relative;
34 | transition: all 0.3s ease;
35 | white-space: nowrap;
36 | }
37 |
38 | .mybutton::after {
39 | content: '';
40 | position: absolute;
41 | left: 0;
42 | bottom: -5px;
43 | width: 0;
44 | height: 2px;
45 | background-color: black;
46 | transition: width 0.3s ease;
47 | }
48 |
49 | .mybutton:hover::after {
50 | width: 100%;
51 | }
52 |
53 | .mybutton.active::after {
54 | width: 100%;
55 | height: 4px;
56 | background-color: darkred;
57 | }
58 |
59 |
60 | .mobileMenu{
61 | z-index: 999;
62 | }
63 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import './App.css';
2 | import { Routes, Route } from 'react-router-dom';
3 | import About from './pages/About/About';
4 | import Question from './pages/Main/Question/Accordion';
5 | import Teachgers_Slider from './pages/Main/Teachgers_Slider/Teachgers_Slider';
6 | import SliderPhoto from './pages/Main/SliderPhoto/SliderPhoto';
7 | import Achievements from './pages/Main/Achievements/Achievements';
8 | import DirectorPhoto from './pages/Main/DirectorPhoto/DirectorPhoto';
9 |
10 | function App() {
11 | return (
12 | <>
13 |
14 |
15 |
17 |
18 |
22 |
23 | >
24 | } />
25 | } />
26 |
27 |
28 | >
29 | );
30 | }
31 |
32 | export default App;
33 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # use the official Bun image
2 | # see all versions at https://hub.docker.com/r/oven/bun/tags
3 | FROM oven/bun:1 AS base
4 | WORKDIR /usr/src/app
5 |
6 | # install dependencies into temp directory
7 | # this will cache them and speed up future builds
8 | FROM base AS install
9 | RUN mkdir -p /temp/dev
10 | COPY package.json bun.lockb /temp/dev/
11 | RUN cd /temp/dev && bun install --frozen-lockfile
12 |
13 | # install with --production (exclude devDependencies)
14 | RUN mkdir -p /temp/prod
15 | COPY package.json bun.lockb /temp/prod/
16 | RUN cd /temp/prod && bun install --frozen-lockfile --production
17 |
18 | # copy node_modules from temp directory
19 | # then copy all (non-ignored) project files into the image
20 | FROM base AS prerelease
21 | COPY --from=install /temp/dev/node_modules node_modules
22 | COPY . .
23 |
24 | # build React app and output to dist directory
25 | ENV NODE_ENV=production
26 | RUN bun run build
27 |
28 | # copy production dependencies and built files into final image
29 | FROM base AS release
30 | COPY --from=install /temp/prod/node_modules node_modules
31 | COPY --from=prerelease /usr/src/app/dist ./dist
32 | COPY --from=prerelease /usr/src/app/package.json .
33 |
34 | # serve the app using a static server (like serve)
35 | RUN bun add serve
36 | EXPOSE 3000/tcp
37 | CMD ["bun", "run", "serve", "-s", "dist", "-l", "3000"]
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react';
2 | import { createRoot } from 'react-dom/client';
3 | import App from './App.tsx';
4 | import './index.css';
5 | import { HashRouter, Routes, Route } from 'react-router-dom';
6 | import About from './pages/About/About';
7 | import Header from './Header/Header.tsx';
8 | import Footer from './Footer/Footer.tsx';
9 | import Contacts from './pages/Contacts/contacts.tsx';
10 | import Education from './pages/Education/education.tsx';
11 | import Login from './pages/Login/login.tsx';
12 | import News from './pages/News/news.tsx';
13 | import Staff from './pages/Staff/staff.tsx';
14 | import Vacancies from './pages/Vacancies/vacancies.tsx';
15 |
16 |
17 | createRoot(document.getElementById('root')!).render(
18 |
19 |
20 |
21 |
22 | } />
23 | } />
24 | } />
25 | } />
26 | } />
27 | } />
28 | } />
29 | } />
30 |
31 |
32 |
33 |
34 | );
35 |
--------------------------------------------------------------------------------
/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/pages/Main/Question/Accordion.tsx:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import './Accordion.css';
3 |
4 | interface AccordionItemProps {
5 | question: string;
6 | answer: string;
7 | }
8 |
9 | const AccordionItem: React.FC = ({ question, answer }) => {
10 | const [isOpen, setIsOpen] = useState(false);
11 |
12 | const toggleAccordion = () => {
13 | setIsOpen(!isOpen);
14 | };
15 |
16 | return (
17 |
18 |
19 |
{question}
20 | {isOpen ? '▲' : '▼'}
21 |
22 | {isOpen &&
{answer}
}
23 |
24 | );
25 | };
26 |
27 | const Accordion: React.FC = () => {
28 | const faqs = [
29 | { question: 'Question 1', answer: 'Answer to question 1' },
30 | { question: 'Question 2', answer: 'Answer to question 2' },
31 | { question: 'Question 3', answer: 'Answer to question 3' },
32 | { question: 'Question 4', answer: 'Answer to question 4' },
33 | { question: 'Question 5', answer: 'Answer to question 5' },
34 | { question: 'Как к нам поступить', answer: 'Школа слишком крутая поступить смогут лишь единицы..' },
35 | ];
36 |
37 | return (
38 |
39 | {faqs.map((faq, index) => (
40 |
41 | ))}
42 |
43 | );
44 | };
45 |
46 | export default Accordion;
--------------------------------------------------------------------------------
/src/Carousel/Carousel.tsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react'
2 |
3 | type CarouselProps = {
4 | images: string[];
5 | }
6 |
7 | export default function Carousel({ images }: CarouselProps) {
8 | const [curIndex, setCurIndex] = useState(0)
9 |
10 | useEffect(() => {
11 | const handleKeyDown = (e: KeyboardEvent) => {
12 | if (e.key === 'ArrowLeft') prevSlide()
13 | if (e.key === 'ArrowRight') nextSlide()
14 | }
15 |
16 | window.addEventListener('keydown', handleKeyDown)
17 | return () => window.removeEventListener('keydown', handleKeyDown)
18 | }, [curIndex])
19 |
20 | const prevSlide = () => {
21 | setCurIndex((prevIndex) =>
22 | prevIndex === 0 ? images.length - 1 : prevIndex - 1
23 | )
24 | }
25 |
26 | const nextSlide = () => {
27 | setCurIndex((prevIndex) =>
28 | prevIndex === images.length - 1 ? 0 : prevIndex + 1
29 | )
30 | }
31 |
32 | if (images.length === 0) return No images available
33 |
34 | return (
35 |
36 |
37 |
42 | {images.map((image, index) => (
43 |

49 | ))}
50 |
51 |
52 |
53 | {images.length > 1 && (
54 | <>
55 |
61 |
67 | >
68 | )}
69 |
70 |
71 | {images.map((_, index) => (
72 |
78 | ))}
79 |
80 |
81 | )
82 | }
--------------------------------------------------------------------------------
/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/Header/Header.tsx:
--------------------------------------------------------------------------------
1 | import "./Header.css";
2 | import { useLocation } from 'react-router-dom';
3 | import { NavLink } from "react-router-dom"
4 | import faviconSrc from "./favicon.png"
5 | import { useState } from 'react';
6 |
7 | export interface ButtonProps {
8 | name: string;
9 | link: string;
10 | className: string;
11 | }
12 |
13 | export function Button(props: ButtonProps) {
14 | const location = useLocation();
15 | const isActive = location.pathname === props.link;
16 |
17 | return (
18 | <>
19 |
20 | {props.name}
21 |
22 | >
23 | )
24 | }
25 |
26 | Button.defaultProps = {
27 | className: ""
28 | };
29 |
30 | function Header() {
31 | const [isOpen, setIsOpen] = useState(false);
32 | const clickBtnMenu = () => {
33 | setIsOpen(!isOpen);
34 | }
35 | return (
36 |
37 |
75 |
76 | {isOpen && (
77 |
87 | )}
88 |
89 |
90 |
91 | );
92 | }
93 |
94 | export default Header;
95 |
96 |
--------------------------------------------------------------------------------