Compare commits

..

57 Commits

Author SHA1 Message Date
2900820afb add checkbox and fix spaces in name fields
All checks were successful
Build Docker / deploy (push) Successful in 55s
Build Docker / build (push) Successful in 51s
2026-05-18 08:22:20 +03:00
adfcbd2aff fix textarea size
All checks were successful
Build Docker / deploy (push) Successful in 1m9s
Build Docker / build (push) Successful in 1m5s
2026-05-17 23:17:24 +03:00
f6e9b359ce fix adresses
All checks were successful
Build Docker / deploy (push) Successful in 45s
Build Docker / build (push) Successful in 55s
2026-05-17 19:21:48 +03:00
ca966f0bc6 fix permissions issue
All checks were successful
Build Docker / deploy (push) Successful in 49s
Build Docker / build (push) Successful in 57s
2026-05-17 19:14:42 +03:00
57c88ab44b logs docker
All checks were successful
Build Docker / deploy (push) Successful in 45s
Build Docker / build (push) Successful in 57s
2026-05-17 18:04:06 +03:00
f6c63d75f6 fix
All checks were successful
Build Docker / deploy (push) Successful in 48s
Build Docker / build (push) Successful in 58s
2026-05-17 17:40:46 +03:00
76c3dd4e2a remove music section caddyfile
All checks were successful
Build Docker / deploy (push) Successful in 43s
Build Docker / build (push) Successful in 34s
2026-05-17 17:35:53 +03:00
be23fcbec4 fix caddy file
All checks were successful
Build Docker / deploy (push) Successful in 45s
Build Docker / build (push) Successful in 1m21s
2026-05-17 17:31:36 +03:00
5df35d8970 proxy headers
All checks were successful
Build Docker / deploy (push) Successful in 44s
Build Docker / build (push) Successful in 2m8s
2026-05-17 17:26:25 +03:00
807beb1496 remove music from caddy conf
Some checks failed
Build Docker / deploy (push) Successful in 54s
Build Docker / build (push) Failing after 1s
2026-05-17 17:22:44 +03:00
bc9c467819 fix css
All checks were successful
Build Docker / deploy (push) Successful in 44s
Build Docker / build (push) Successful in 55s
2026-05-17 16:51:00 +03:00
df2a01942f Merge branch 'dev'
All checks were successful
Build Docker / deploy (push) Successful in 41s
Build Docker / build (push) Successful in 54s
2026-05-17 16:39:19 +03:00
c01a89d470 api fix 2026-05-17 16:38:28 +03:00
85f3c08df1 css fix 2026-05-17 16:37:19 +03:00
8e72e0411e fix_2 2026-05-16 22:40:06 +03:00
9cac082da1 fix downside of page ios 2026-05-16 18:54:50 +03:00
3298891683 fix 2026-05-16 16:05:36 +03:00
72cd5a690b test_1 2026-05-16 15:55:37 +03:00
fb9042c845 dMerge branch 'dev'
All checks were successful
Build Docker / deploy (push) Successful in 1m3s
Build Docker / build (push) Successful in 53s
2026-05-16 15:27:56 +03:00
f9b3d01967 Merge branch 'dev' of ssh://git.homyk.space:2222/MH.Dmitrii/wedding-site into dev 2026-05-16 15:26:31 +03:00
30b370dfd0 fix_final_2 2026-05-16 15:26:19 +03:00
600ec96c4c Merge jffbranch 'dev'
All checks were successful
Build Docker / deploy (push) Successful in 43s
Build Docker / build (push) Successful in 52s
2026-05-16 14:58:37 +03:00
0196ef7bf5 1 2026-05-16 14:58:26 +03:00
273c8c8a23 fix_final 2026-05-16 14:57:38 +03:00
12b0b6943e 1
All checks were successful
Build Docker / deploy (push) Successful in 46s
Build Docker / build (push) Successful in 2m0s
2026-05-16 14:50:08 +03:00
1a2e0014fb test login 2026-05-16 14:49:25 +03:00
8b9161d25e f
Some checks failed
Build Docker / deploy (push) Successful in 47s
Build Docker / build (push) Failing after 9s
2026-05-16 14:40:11 +03:00
85ab5747cd fix docker login
Some checks failed
Build Docker / deploy (push) Successful in 44s
Build Docker / build (push) Failing after 46s
2026-05-16 14:27:08 +03:00
631c510b51 fix docker login and 1->api.js
Some checks failed
Build Docker / deploy (push) Successful in 41s
Build Docker / build (push) Failing after 4s
2026-05-16 14:18:05 +03:00
b0d1ba180c merge Merge branch 'dev'
Some checks failed
Build Docker / deploy (push) Successful in 54s
Build Docker / build (push) Failing after 3s
2026-05-16 14:12:22 +03:00
6ae096d6c0 adaptive_fix_6 2026-05-14 01:56:14 +03:00
4f963f03c8 1
All checks were successful
Build Docker / deploy (push) Successful in 43s
Build Docker / build (push) Successful in 1m12s
2026-05-13 16:55:05 +03:00
2e20e7bf1b docker issue
All checks were successful
Build Docker / deploy (push) Successful in 45s
Build Docker / build (push) Successful in 40s
2026-05-13 16:41:39 +03:00
7f843ff04c docker compose install
Some checks failed
Build Docker / deploy (push) Failing after 42s
Build Docker / build (push) Has been skipped
2026-05-13 16:39:44 +03:00
ac06706cf9 change server
Some checks failed
Build Docker / deploy (push) Failing after 1m16s
Build Docker / build (push) Has been skipped
2026-05-13 16:35:51 +03:00
ccf727a1be force
All checks were successful
Build Docker / deploy (push) Successful in 53s
Build Docker / build (push) Successful in 1m20s
2026-05-11 17:52:19 +03:00
96564010f2 docker system prune
Some checks failed
Build Docker / build (push) Has been cancelled
Build Docker / deploy (push) Has been cancelled
2026-05-11 17:48:58 +03:00
0305063e16 merge gerge branch 'dev'
All checks were successful
Build Docker / deploy (push) Successful in 48s
Build Docker / build (push) Successful in 42s
2026-05-11 17:44:39 +03:00
945e137753 fix error logon page
Some checks failed
Build Docker / deploy (push) Has been cancelled
Build Docker / build (push) Has been cancelled
2026-05-11 17:44:08 +03:00
796b3158a8 mergeMerge branch 'dev'
All checks were successful
Build Docker / deploy (push) Successful in 1m7s
Build Docker / build (push) Successful in 46s
2026-05-11 17:36:19 +03:00
2a6d3fb1b6 Merge branch 'dev'
All checks were successful
Build Docker / deploy (push) Successful in 2m36s
Build Docker / build (push) Successful in 39s
2026-05-11 17:05:09 +03:00
283ffff080 location while error
All checks were successful
Build Docker / deploy (push) Successful in 43s
Build Docker / build (push) Successful in 1m8s
2026-05-10 18:27:40 +03:00
289194d5d8 fix food radio
Some checks failed
Build Docker / deploy (push) Failing after 1m1s
Build Docker / build (push) Has been skipped
2026-05-10 18:22:51 +03:00
95dadf4c90 error adjustments
All checks were successful
Build Docker / deploy (push) Successful in 50s
Build Docker / build (push) Successful in 43s
2026-05-10 18:16:07 +03:00
a6f82eadae fix params
All checks were successful
Build Docker / deploy (push) Successful in 51s
Build Docker / build (push) Successful in 42s
2026-05-10 18:07:50 +03:00
47a4a32fd8 deleted 1 img
All checks were successful
Build Docker / deploy (push) Successful in 47s
Build Docker / build (push) Successful in 36s
2026-05-10 18:00:39 +03:00
df971e2f89 types of food fix
Some checks failed
Build Docker / deploy (push) Failing after 1m4s
Build Docker / build (push) Has been skipped
2026-05-10 17:49:41 +03:00
16442dc106 json parse errors
All checks were successful
Build Docker / deploy (push) Successful in 53s
Build Docker / build (push) Successful in 59s
2026-05-10 17:42:37 +03:00
bff406e94f p tag removed
All checks were successful
Build Docker / deploy (push) Successful in 50s
Build Docker / build (push) Successful in 1m1s
2026-05-10 17:35:38 +03:00
1534181e71 error handling
All checks were successful
Build Docker / deploy (push) Successful in 1m5s
Build Docker / build (push) Successful in 50s
2026-05-10 17:24:32 +03:00
731e62e53c resolve names
All checks were successful
Build Docker / deploy (push) Successful in 1m30s
Build Docker / build (push) Successful in 53s
2026-05-10 12:25:05 +03:00
8b21cdef9c merge
Some checks failed
Build Docker / deploy (push) Has been cancelled
Build Docker / build (push) Has been cancelled
2026-05-10 12:24:00 +03:00
9e35fa4d7d fix current user endpoint
All checks were successful
Build Docker / deploy (push) Successful in 39s
Build Docker / build (push) Successful in 1m8s
2026-04-19 21:06:46 +03:00
d206d9421a fix id text area
All checks were successful
Build Docker / deploy (push) Successful in 40s
Build Docker / build (push) Successful in 1m3s
2026-04-19 20:59:19 +03:00
d35bcbe53a fix form
All checks were successful
Build Docker / deploy (push) Successful in 45s
Build Docker / build (push) Successful in 58s
2026-04-19 20:46:20 +03:00
e4690f6e2d fix class name
All checks were successful
Build Docker / deploy (push) Successful in 43s
Build Docker / build (push) Successful in 1m5s
2026-04-19 20:36:40 +03:00
472bf3c662 Merge pull request 'final' (#1) from dev into main
All checks were successful
Build Docker / deploy (push) Successful in 1m2s
Build Docker / build (push) Successful in 1m18s
Reviewed-on: #1
2026-04-19 17:27:42 +00:00
19 changed files with 313 additions and 159 deletions

View File

@@ -11,8 +11,8 @@ jobs:
- name: Setup SSH key - name: Setup SSH key
run: | run: |
echo "${{ secrets.SSH_PRIVATE_KEY }}" > /tmp/id_fin echo "${{ secrets.SSH_PRIVATE_KEY_RU }}" > /tmp/id_ru
chmod 600 /tmp/id_fin chmod 600 /tmp/id_ru
#ключ машины #ключ машины
- name: Create .env file - name: Create .env file
run: echo "${{ secrets.RUNNER_ENV }}" > .env run: echo "${{ secrets.RUNNER_ENV }}" > .env
@@ -28,7 +28,7 @@ jobs:
- name: Run Ansible playbook - name: Run Ansible playbook
run: ansible-playbook -i tmp-repo/ansible/inventory.ini tmp-repo/ansible/deploy.yml -e @tmp-repo/ansible/secrets.yml -e env_file="$(pwd)/.env" run: ansible-playbook -i tmp-repo/ansible/inventory.ini tmp-repo/ansible/deploy.yml -e @tmp-repo/ansible/secrets.yml -e env_file="$(pwd)/.env"
env: env:
ANSIBLE_PRIVATE_KEY_FILE: /tmp/id_fin ANSIBLE_PRIVATE_KEY_FILE: /tmp/id_ru
ANSIBLE_HOST_KEY_CHECKING: "False" ANSIBLE_HOST_KEY_CHECKING: "False"
build: build:
@@ -36,9 +36,13 @@ jobs:
needs: deploy needs: deploy
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u mh.dmitrii@homyk.space --password-stdin
- name: Create .env file - name: Create .env file
run: echo "${{ secrets.WEDDING_SITE_ENV }}" > .env run: echo "${{ secrets.WEDDING_SITE_ENV }}" > .env
- name: Check env - name: Check env
run: cat .env run: cat .env
#env для проекта #env для проекта

View File

@@ -16,6 +16,11 @@
args: args:
creates: /usr/bin/docker creates: /usr/bin/docker
- name: Install Docker Compose plugin
apt:
name: docker-compose-plugin
state: present
- name: Ensure /opt/infra exists - name: Ensure /opt/infra exists
file: file:
path: /opt/infra path: /opt/infra
@@ -38,4 +43,7 @@
creates: /opt/infra/node-docker.yaml creates: /opt/infra/node-docker.yaml
- name: Start node-docker - name: Start node-docker
shell: docker-compose -f /opt/infra/node-docker.yaml up -d shell: docker compose -f /opt/infra/node-docker.yaml up -d
- name: Docker system prune
shell: docker system prune -a -f

View File

@@ -1,2 +1,2 @@
[servers] [servers]
myserver ansible_host=38.244.136.102 ansible_user=root myserver ansible_host=81.19.135.168 ansible_user=root

View File

@@ -8,6 +8,7 @@ services:
volumes: volumes:
- caddy_data:/data - caddy_data:/data
- caddy_config:/config - caddy_config:/config
- /root/.docker/config.json:/root/.docker/config.json:ro
networks: networks:
- docker_wedding-site-network - docker_wedding-site-network
healthcheck: healthcheck:

View File

@@ -40,20 +40,3 @@ https://ru.homyk.space {
format json format json
} }
} }
https://music.homyk.space {
encode gzip
# --- API ---
handle {
reverse_proxy koel:80
}
log {
output file /data/logs/caddy1.log {
roll_size 5mb
roll_keep 5
roll_keep_for 72h
}
format json
}
}

View File

@@ -4,6 +4,7 @@ services:
container_name: wedding-site container_name: wedding-site
volumes: volumes:
- /home/sevice/DB:/home/backend/server/backend/database/DB - /home/sevice/DB:/home/backend/server/backend/database/DB
- /root/.docker/config.json:/root/.docker/config.json:ro
expose: expose:
- "${PORT}" - "${PORT}"
networks: networks:
@@ -13,6 +14,11 @@ services:
interval: 5s interval: 5s
timeout: 30s timeout: 30s
retries: 1 retries: 1
logging:
driver: syslog
options:
syslog-address: "unixgram:///dev/log"
tag: wedding-site
networks: networks:
wedding-site-network: wedding-site-network:
driver: bridge driver: bridge

View File

@@ -5,6 +5,7 @@ services:
volumes: volumes:
- ./data/act_runner:/data - ./data/act_runner:/data
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/root/.docker/config.json:ro
environment: environment:
- GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL} - GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL}
- GITEA_RUNNER_REGISTRATION_TOKEN=${TOKEN} - GITEA_RUNNER_REGISTRATION_TOKEN=${TOKEN}

View File

@@ -1,7 +1,7 @@
#VENV=source ./.venv/bin/activate; VENV=source ./.venv/bin/activate;
#ALEMBIC=alembic -c ./server/backend/database/alembic/alembic.ini ALEMBIC=alembic -c ./server/backend/database/alembic/alembic.ini
VENV= .venv\Scripts\activate #Windows #VENV= .venv\Scripts\activate #Windows
ALEMBIC=alembic -c server\backend\database\alembic\alembic.ini #ALEMBIC=alembic -c server\backend\database\alembic\alembic.ini
.PHONY: run run_debug migrate_head migrate_down migrate_history migrate_current migrate_heads migrate_stamp migrate .PHONY: run run_debug migrate_head migrate_down migrate_history migrate_current migrate_heads migrate_stamp migrate
run: run:
$(VENV) python run.py --user_name admin $(VENV) python run.py --user_name admin

View File

@@ -1 +1 @@
test 2 test 2d

4
run.py
View File

@@ -26,7 +26,9 @@ def start(log_level: str):
port=settings.PORT, port=settings.PORT,
reload=False, reload=False,
log_level=log_level, log_level=log_level,
access_log=True access_log=True,
proxy_headers=True,
forwarded_allow_ips="*",
) )
parser = argparse.ArgumentParser(description="logging and admin creation") parser = argparse.ArgumentParser(description="logging and admin creation")

View File

@@ -8,9 +8,9 @@ security = HTTPBearer(auto_error=False)
async def get_current_user( async def get_current_user(
credentials: HTTPAuthorizationCredentials = Depends(security), credentials: HTTPAuthorizationCredentials = Depends(security),
token_cookie: str = Cookie(default=None) token: str = Cookie(default=None)
): ):
token = credentials.credentials if credentials else token_cookie token = credentials.credentials if credentials else token
if not token: if not token:
raise HTTPException(status_code=401, detail="Not authenticated") raise HTTPException(status_code=401, detail="Not authenticated")
user = decodeJWT(token) user = decodeJWT(token)
@@ -31,7 +31,8 @@ async def update_user(data: pydantic.UserUpdate, user=Depends(get_current_user))
if not user_check: if not user_check:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found") raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
if not user_check.admin: if not user_check.admin:
if data.code != user_check.code: print(data.code)
if data.code != user_check.code and data.code:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, status_code=status.HTTP_403_FORBIDDEN,
detail="Ordinary users cannot change their code" detail="Ordinary users cannot change their code"

View File

@@ -10,7 +10,7 @@ NameStr = Annotated[
StringConstraints( StringConstraints(
min_length=2, min_length=2,
max_length=50, max_length=50,
pattern=r'^[A-Za-zА-ЯЁа-яё]+$' pattern=r'^[A-Za-zА-ЯЁа-яё ]+$'
) )
] ]
class UserAccess(BaseModel): class UserAccess(BaseModel):

View File

@@ -25,6 +25,7 @@ body, html {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
body{ background-color: #c68a5e;}
.bg { .bg {
position: fixed; position: fixed;
inset: 0; inset: 0;

View File

@@ -34,7 +34,7 @@ document.addEventListener('DOMContentLoaded', () => {
} }
} }
} catch (err) { } catch (err) {
showError(['Connection error: ' + err.message]); showError(['Connection error :(']);
} }
}); });
}); });
@@ -45,13 +45,13 @@ function showError(messages) {
errorElem = document.createElement('div'); errorElem = document.createElement('div');
errorElem.id = 'formError'; errorElem.id = 'formError';
errorElem.style.cssText = ` errorElem.style.cssText = `
color: red; color: red;
margin-top: 20px; font-size: medium;
margin-bottom: 20px; line-height: 100%;
font-size: 14px; transition: 3s;
font-weight: 100; text-decoration: underline;
line-height: 120%; font-weight: bold;
transition: 3s; font-family: Arial, sans-serif;
`; `;
document.getElementById('loginForm').insertAdjacentElement('afterend', errorElem); document.getElementById('loginForm').insertAdjacentElement('afterend', errorElem);
} }

View File

@@ -15,19 +15,19 @@ document.addEventListener("DOMContentLoaded", () => {
window.location.href = '/'; window.location.href = '/';
}); });
document.querySelector(".form-info").addEventListener("submit", async (e) => { document.querySelector(".form-connect").addEventListener("submit", async (e) => {
e.preventDefault(); e.preventDefault();
const guestData = { const guestData = {
name: document.getElementById('ffname').value || "", name: document.getElementById('ffname').value || "",
middlename: document.getElementById('fmname').value || "", middlename: document.getElementById('fmname').value || "",
surname: document.getElementById('flname').value || "", surname: document.getElementById('flname').value || "",
text_field: document.getElementById('text_field')?.value || "", text_field: document.getElementById('text_field')?.value || "Пожеланий Нет",
activated: true, activated: true,
types_of_food: document.querySelector('input[name="food"]:checked')?.value || "", type_of_food: document.querySelector('input[name="food"]:checked')?.value || "Мясо (Дефолт)",
types_of_alco: Array.from(document.querySelectorAll('input[name="drink"]:checked')) types_of_alco: Array.from(document.querySelectorAll('input[name="drink"]:checked'))
.map(el => el.value) .map(el => el.value)
.join(', ') .join(', ') || "Сок"
}; };
try { try {
@@ -49,7 +49,48 @@ document.addEventListener("DOMContentLoaded", () => {
} catch (err) { } catch (err) {
console.error(err); console.error(err);
alert('Ошибка: ' + err.message); window.location.href = '#answer';
showErrors(JSON.parse(err.message));
} }
}); });
}); });
const fieldMap = {
'name': 'ffname',
'middlename': 'fmname',
'surname': 'flname'
};
function showErrors(errors) {
let errorElements = document.querySelectorAll(".formError")
if (errorElements.length === 0) {
document.querySelectorAll('.label_style').forEach(el => {
const errorElem = document.createElement('div');
errorElem.className = 'formError';
errorElem.style.cssText = `
color: red;
font-size: medium;
line-height: 100%;
transition: 3s;
text-decoration: underline;
font-weight: bold;
font-family: Arial, sans-serif;
`;
el.after(errorElem);
});
}
errors.forEach(error => {
const fieldName = error.loc[1]; // 'name', 'middlename', 'surname'
const inputId = fieldMap[fieldName];
if (!inputId) return;
const input = document.getElementById(inputId);
if (!input) return;
const label = input.closest('.label_style');
if (label && label.nextElementSibling?.classList.contains('formError')) {
label.nextElementSibling.textContent = error.msg;
}
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View File

@@ -3,12 +3,14 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<link rel="icon" type="icon" sizes="32x32" href="images/free-icon-wedding-ring-4155044.ico">
<title>Wedding invitation</title> <title>Wedding invitation</title>
<link rel="stylesheet" href="reset.css"> <link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="style.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.css" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@12/swiper-bundle.min.css" />
<link rel="preload" href="fonts/yourfont.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="fonts/yourfont.woff2" as="font" type="font/woff2" crossorigin>
</head> </head>
<body> <body>
@@ -82,6 +84,10 @@
Наша история Наша история
</h2> </h2>
<h3 class="heading_date">22 августа 2026</h3> <h3 class="heading_date">22 августа 2026</h3>
<!-- КНОПКА -->
<button class="story_btn">
Открыть историю
</button>
<p class="heading_text"> <p class="heading_text">
Мы — та самая история, которая началась со странного сообщения и превратилась в нечто настоящее. Мы — та самая история, которая началась со странного сообщения и превратилась в нечто настоящее.
В нас есть легкость и смех, который когда-то стал началом всего, любовь к простым вещам вроде В нас есть легкость и смех, который когда-то стал началом всего, любовь к простым вещам вроде
@@ -352,7 +358,7 @@
Фотографии Фотографии
</h4> </h4>
<!-- Slider main container --> <!-- Slider main container -->
<div class="swiper"> <div class="swiper photos_slider">
<!-- Additional required wrapper --> <!-- Additional required wrapper -->
<div class="swiper-wrapper"> <div class="swiper-wrapper">
<!-- Slides --> <!-- Slides -->
@@ -407,6 +413,17 @@
<!-- If we need scrollbar --> <!-- If we need scrollbar -->
<div class="swiper-scrollbar"></div> <div class="swiper-scrollbar"></div>
</div> </div>
<!-- COLLAGE -->
<div class="photos_collage">
<img src="images/photos/1.webp" alt="">
<img src="images/photos/2.webp" alt="">
<img src="images/photos/3.webp" alt="">
<img src="images/photos/4.webp" alt="">
<img src="images/photos/5.webp" alt="">
<img src="images/photos/6.webp" alt="">
<img src="images/photos/8.webp" alt="">
<img src="images/photos/9.webp" alt="">
</div>
</section> </section>
<section class="to-do-list" id="to-do-list"> <section class="to-do-list" id="to-do-list">
<h4 class="do-list_title"> <h4 class="do-list_title">
@@ -576,21 +593,20 @@
<!-- Левая колонка --> <!-- Левая колонка -->
<div class="form_name"> <div class="form_name">
<label class="label_style">Имя
<input type="text" name="firstName" id="ffname" required>
</label>
<label class="label_style">Отчество
<input type="text" name="middleName" id="fmname" required>
</label>
<label class="label_style">Фамилия <label class="label_style">Фамилия
<input type="text" name="lastName" id="flname" required> <input type="text" name="lastName" id="flname" required>
</label> </label>
<label class="label_style">Имя
<input type="text" name="firstName" id="ffname" required>
</label>
<label class="label_style">Отчество
<input type="text" name="middleName" id="fmname" required>
</label>
<label class="label_1">Комментарий <label class="label_1">Комментарий
<textarea cols="1.5" rows="1" type="text" name="lastName" id="fename" <textarea cols="1.5" rows="1" type="text" name="lastName" id="text_field"
placeholder="Напишите здесь о ваших особых предпочтениях и аллергиях"></textarea> placeholder="Напишите здесь о ваших особых предпочтениях и аллергиях" style="resize: both; max-width: 300px; max-height: 300px; min-height: 150px; min-width: 150px;"></textarea>
</label> </label>
</div> </div>
@@ -605,7 +621,7 @@
</label> </label>
<label class="option"> <label class="option">
<input type="radio" name="food" id="rfish" value="fish"> <input type="radio" name="food" id="rfish" value="fish" required>
Рыба Рыба
</label> </label>
</div> </div>
@@ -623,6 +639,8 @@
Виски</label> Виски</label>
<label class="option"><input type="checkbox" name="drink" value="tequila" id="ctequila"> <label class="option"><input type="checkbox" name="drink" value="tequila" id="ctequila">
Текила</label> Текила</label>
<label class="option"><input type="checkbox" name="drink" value="sam" id="sam">
Самогон</label>
</div> </div>

View File

@@ -88,4 +88,19 @@ links.forEach(link => {
burger.classList.remove('active'); burger.classList.remove('active');
nav.classList.remove('active'); nav.classList.remove('active');
}); });
});
const btn = document.querySelector('.story_btn');
const text = document.querySelector('.heading_text');
btn.addEventListener('click', () => {
text.classList.toggle('active');
if (text.classList.contains('active')) {
btn.textContent = 'Скрыть историю';
} else {
btn.textContent = 'Открыть историю';
}
}); });

View File

@@ -23,27 +23,32 @@
/* --------------------------------MAIN-------------------------------- */ /* --------------------------------MAIN-------------------------------- */
html, body {
height: 100vh;
}
body { body {
margin: 0; font-family: "MurreyC";
font-family: "MurreyC"; font-size: 16px;
font-size: 16px; font-weight: 400;
font-weight: 400; letter-spacing: 3px;
letter-spacing: 3px; background-color: #c68a5e;
} }
.bg { .bg {
position: fixed; position: fixed;
inset: 0; top: -100px;
left: 0;
background: url("images/ChatGPT\ Image\ 5\ янв.\ 2026\ г.\,\ 15_49_39.webp") center center / cover no-repeat; right: 0;
bottom: -100px;
z-index: -1; background: url("images/ChatGPT Image 5 янв. 2026 г., 15_49_39.webp") center center / cover no-repeat ;
z-index: -1;
transform: translateZ(0);
-webkit-transform: translateZ(0);
} }
.content { .content {
position: relative; position: relative;
min-height: 100vh; min-height: 100dvh;
} }
button { button {
background-color: #3a1f09; background-color: #3a1f09;
@@ -61,21 +66,19 @@ button:hover {
img { img {
max-width: 100%; max-width: 100%;
} }
.content {
}
/* -------------------------------HEADER------------------------------ */ /* -------------------------------HEADER------------------------------ */
.header { .header {
width: 100%; width: 100%;
background-color: #663c24; background-color: #663c24;
padding: 20px 180px; padding: 20px 180px;
margin-top: 40px; padding-top: calc(20px + env(safe-area-inset-top));
margin-bottom: 40px;
box-shadow: 0 2px 6px rgba(0,0,0,0.2); margin-bottom: 40px;
} box-shadow: 0 2px 6px rgba(0,0,0,0.2);
.nav {
} }
.menu { .menu {
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -95,12 +98,9 @@ img {
font-weight: 900; font-weight: 900;
transition: all .3s; transition: all .3s;
text-shadow: 1px 2px #322624; text-shadow: 1px 2px #322624;
}
.item:hover {
} }
.link { .link {
white-space: nowrap;
transition: all .3s; transition: all .3s;
} }
.link:hover { .link:hover {
@@ -166,6 +166,8 @@ img {
border-radius: 10px; border-radius: 10px;
margin-left: 40px; margin-left: 40px;
box-shadow: 0 2px 6px rgba(0,0,0,0.2); box-shadow: 0 2px 6px rgba(0,0,0,0.2);
} }
.burger { .burger {
@@ -173,27 +175,22 @@ img {
display: flex; display: flex;
} }
.nav { .nav {
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; /* ВАЖНО */ left: 0;
width: 100%; width: 100%;
height: 100vh; height: 100vh;
background: rgba(102, 60, 36, 0.97);
background: rgba(102, 60, 36, 0.97); backdrop-filter: blur(12px);
backdrop-filter: blur(12px); display: none;
justify-content: center;
display: flex; align-items: center;
justify-content: center; z-index: 1000;
align-items: center;
transform: translateY(-100%);
transition: 0.5s ease;
z-index: 1000;
} }
.nav.active { .nav.active {
transform: translateY(0); display: flex;
} }
.nav::before { .nav::before {
content: ""; content: "";
@@ -238,9 +235,9 @@ img {
.heading { .heading {
background: url("images/25.webp") 50% 100% / cover; background: url("images/25.webp") 50% 100% / cover;
margin: 0px 400px; margin: 0px 400px;
/* border: 10px solid rgb(184, 136, 48); */ padding-bottom: 40px; /* можно оставить */
/* border: 15px double rgb(184, 136, 48); */ padding-top: 60px;
height: 640px; /* ❌ height: 640px; УДАЛИТЬ */
box-shadow: 0 2px 6px rgba(0,0,0,0.2); box-shadow: 0 2px 6px rgba(0,0,0,0.2);
} }
.heading_content { .heading_content {
@@ -293,8 +290,6 @@ img {
.btn_link { .btn_link {
font-size: 30px; font-size: 30px;
} }
.asise {
}
.time{ .time{
padding-top: 15px; padding-top: 15px;
font-size: 110px; font-size: 110px;
@@ -302,6 +297,10 @@ img {
text-shadow: #000 2px 2px 6px; text-shadow: #000 2px 2px 6px;
} }
.story_btn {
display: none;
}
/* -----------------------------------PEOPLE-------------------------------------- */ /* -----------------------------------PEOPLE-------------------------------------- */
.people { .people {
@@ -361,8 +360,7 @@ h4 {
.newlywed_info { .newlywed_info {
font-size: 26px; font-size: 26px;
} }
.guest_list {
}
.guest_inner { .guest_inner {
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
@@ -378,9 +376,6 @@ h4 {
font-weight: 900; font-weight: 900;
font-style: italic; font-style: italic;
color: rgb(252, 220, 180); color: rgb(252, 220, 180);
}
.guest_item_list {
} }
.guest_name { .guest_name {
font-size: 36px; font-size: 36px;
@@ -436,17 +431,13 @@ h4 {
text-align: center; text-align: center;
border-radius: 33px; border-radius: 33px;
margin: 0 20px; margin: 0 20px;
}
.time_img_box {
} }
.time_img { .time_img {
width: 60px; width: 60px;
height: 60px; height: 60px;
margin-bottom: 10px; margin-bottom: 10px;
} }
.time_line {
}
.time_row_down { .time_row_down {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@@ -471,8 +462,6 @@ h4 {
margin-bottom: 60px; margin-bottom: 60px;
padding-top: 40px; padding-top: 40px;
} }
.transfer_title {
}
.transfer_inner { .transfer_inner {
margin-top: 60px; margin-top: 60px;
} }
@@ -495,6 +484,7 @@ h4 {
border: none; border: none;
} }
.map_adress { .map_adress {
line-height: 1.6;
font-size: 50px; font-size: 50px;
margin-top: 20px; margin-top: 20px;
font-weight: 900; font-weight: 900;
@@ -547,9 +537,6 @@ h4 {
font-size: 24px; font-size: 24px;
backdrop-filter: blur(5px); backdrop-filter: blur(5px);
}
.map_div {
} }
.map { .map {
width: 650px; width: 650px;
@@ -565,6 +552,9 @@ h4 {
.photos_title { .photos_title {
margin-bottom: 100px; margin-bottom: 100px;
} }
.photos_collage {
display: none;
}
.swiper_img { .swiper_img {
height: 500px; height: 500px;
border: 5px dotted #000; border: 5px dotted #000;
@@ -600,8 +590,7 @@ h4 {
padding-bottom: 100px; padding-bottom: 100px;
padding-top: 40px; padding-top: 40px;
} }
.do-list_title {
}
.to-do-list_wrapper { .to-do-list_wrapper {
width: 100%; width: 100%;
padding-top: 40px; padding-top: 40px;
@@ -826,8 +815,6 @@ textarea {
font-size: 36px; font-size: 36px;
margin-bottom: 25px; margin-bottom: 25px;
} }
.footer_copyright {
}
/* --------------------------------------------------------ADAPTIVE------------------------------------------------------ */ /* --------------------------------------------------------ADAPTIVE------------------------------------------------------ */
@@ -1304,7 +1291,7 @@ textarea {
margin-bottom: 20px; margin-bottom: 20px;
background: none; background: none;
box-shadow: none; box-shadow: none;
height: 450px; height: 550px;
} }
.heading_content { .heading_content {
padding: 0; padding: 0;
@@ -1369,6 +1356,7 @@ textarea {
@media (max-width: 720px) { @media (max-width: 720px) {
.heading { .heading {
margin: 40px 0; margin: 40px 0;
height: 550px;
} }
.newlywed { .newlywed {
width: 85%; width: 85%;
@@ -1422,9 +1410,6 @@ textarea {
} }
.items_up, .items_down { .items_up, .items_down {
flex-direction: column; flex-direction: column;
}
.heading {
height: 450px;
} }
.map > div { .map > div {
width: 400px; width: 400px;
@@ -1470,7 +1455,7 @@ textarea {
} }
.swiper_img { .swiper_img {
height: 250px; height: 250px;
max-width: 70%; max-width: 50%;
} }
.swiper-scrollbar { .swiper-scrollbar {
display: none; display: none;
@@ -1496,14 +1481,23 @@ textarea {
padding: 0px 20px; padding: 0px 20px;
} }
.heading { .heading {
height: 500px; height: 600px;
} }
.map_div {
display: none;
}
.map_adress { .map_adress {
margin-bottom: 10px; margin-bottom: 10px;
color: #502c01; text-decoration: underline;
}
.transfer_inner {
margin: 0;
padding: 0;
}
.transfer_map {
gap: 20px;
}
.transfer {
margin-bottom: 0;
} }
} }
@@ -1517,8 +1511,8 @@ textarea {
} }
.map > div { .map > div {
border-radius: 0px; border-radius: 0px;
width: auto; width: 300px;
height: 350px; height: 200px;
overflow: none; overflow: none;
} }
.form_name input[type="text"] { .form_name input[type="text"] {
@@ -1532,12 +1526,14 @@ textarea {
width: 100%; width: 100%;
text-align: start; text-align: start;
} }
.heading_text { .heading {
display: none; min-height: 225px;
} height: auto;
.heading { padding-bottom: 0px;
height: 200px; }
} .heading_cont {
overflow: hidden;
}
.img_newlywed { .img_newlywed {
display: none; display: none;
} }
@@ -1547,12 +1543,46 @@ textarea {
.header { .header {
width: 15%; width: 15%;
} }
.photos { .photos_slider {
display: none; display: none !important;
} }
.item_none {
display: none; .photos_collage {
} display: grid !important;
grid-template-columns: 1fr 1fr;
gap: 10px;
padding: 0 10px;
}
.photos_collage img {
width: 100%;
height: 180px;
object-fit: cover;
border-radius: 18px;
display: block;
}
.photos_collage img:nth-child(3) {
grid-column: span 2;
height: 240px;
}
.photos_collage img:nth-child(6) {
grid-column: span 2;
height: 240px;
}
.photos {
margin: 0 15px;
padding-bottom: 50px;
}
.photos_title {
margin-bottom: 40px;
}
.photos_collage {
padding-top: 40px;
}
.time_row_up, .time_row_down { .time_row_up, .time_row_down {
width: 100%; width: 100%;
} }
@@ -1579,13 +1609,56 @@ textarea {
align-items: start; align-items: start;
padding: 30px; padding: 30px;
} }
.story_btn {
display: inline-block;
margin-top: 20px;
padding: 12px 28px;
font-size: 22px;
cursor: pointer;
}
.heading_text {
max-height: 0;
overflow: hidden;
opacity: 0;
transition:
max-height 0.6s ease,
opacity 0.4s ease,
padding 0.4s ease;
padding-top: 0;
padding-bottom: 0;
}
.heading_text.active {
max-height: 1000px;
opacity: 1;
padding-top: 20px;
padding-bottom: 20px;
}
.time {
padding-top: 0px;
}
.story_btn {
background-color: #a8582a;
border: 1px solid #000;
}
.map_btn {
display: none;
}
.map_link {
height: 200px;
}
.map_preview {
height: 200px;
}
} }
@media (max-width: 420px) { @media (max-width: 420px) {
.map > div{
height: 300px;
}
.time { .time {
font-size: 60px; font-size: 60px;
@@ -1621,20 +1694,20 @@ textarea {
white-space: wrap; white-space: wrap;
margin-bottom: 10px; margin-bottom: 10px;
} }
.heading_text.active {
min-height: 450px;
}
} }
@media (max-width: 320px) { @media (max-width: 320px) {
.header { .header {
width: 23%; width: 23%;
} }
.heading { .heading_text {
height: 240px; padding: 0;
} }
.time { .time {
font-size: 35px; font-size: 35px;
font-weight: 900; font-weight: 900;
} }
.map > div {
height: 220px;
}
} }