Compare commits

..

8 Commits

Author SHA1 Message Date
Hepatica
f4588561bf Compress background images to optimize file size
Reduced file size of 6 background images for better performance and faster loading times.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 01:13:59 +02:00
NikGob
34696e69c9 yep 2025-09-22 20:17:34 +03:00
Dmitri Shimanski
f96aa1a348 Update contacts.js 2025-09-13 22:56:17 +03:00
Dmitri Shimanski
fb715be932 Update docker.yml 2025-09-13 17:54:44 +03:00
Dmitri Shimanski
cb8d06f512 Update docker.yml 2025-09-13 17:54:15 +03:00
Dmitri Shimanski
9aa0e1d9af Delete .github/workflowsdocker.yaml 2025-09-13 17:53:35 +03:00
Dmitri Shimanski
769e551698 Create docker.yml 2025-09-13 17:53:23 +03:00
Dmitri Shimanski
b9608fdcd7 Create workflowsdocker.yaml 2025-09-13 17:52:50 +03:00
13 changed files with 74 additions and 4 deletions

41
.github/workflows/docker.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Docker CI/CD
# Apache 2.0 by Dmitrii yawaflua Shimanskii
on:
push:
branches: [ "master", "develop", "main" ]
paths-ignore:
- 'README.md'
- '*.md'
jobs:
compose:
name: Push Docker image to ghcr.io
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: |
ghcr.io/${{ github.repository }}
- name: Build and push API
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -24,7 +24,7 @@ function Footer() {
className="footer__logo font-inter-regular" className="footer__logo font-inter-regular"
onClick={() => handlePageChange("/")} onClick={() => handlePageChange("/")}
> >
OOO "ALMA-VID" Ткаченко НН
</Link> </Link>
<div className="footer-info font-inter-bold"> <div className="footer-info font-inter-bold">
<Link to="/objects" onClick={() => handlePageChange("/objects")}> <Link to="/objects" onClick={() => handlePageChange("/objects")}>

View File

@@ -6,6 +6,17 @@ function Object(props) {
const [needsExpansion, setNeedsExpansion] = useState(false); const [needsExpansion, setNeedsExpansion] = useState(false);
const contentRef = useRef(null); const contentRef = useRef(null);
const handleCardClick = (e) => {
// Don't redirect if user clicked on the expand button
if (e.target.closest('.item__expand-btn')) {
return;
}
if (props.cianUrl) {
window.open(props.cianUrl, '_blank');
}
};
useEffect(() => { useEffect(() => {
const checkExpansion = () => { const checkExpansion = () => {
if (!props.desc || !props.address || !contentRef.current) { if (!props.desc || !props.address || !contentRef.current) {
@@ -36,7 +47,11 @@ function Object(props) {
}; };
return ( return (
<div className={`item ${isExpanded ? "item--expanded" : ""}`}> <div
className={`item ${isExpanded ? "item--expanded" : ""} ${props.cianUrl ? "item--clickable" : ""}`}
onClick={handleCardClick}
style={{ cursor: props.cianUrl ? 'pointer' : 'default' }}
>
<img className="item__image" src={props.image} alt="квартира" /> <img className="item__image" src={props.image} alt="квартира" />
<div className="item__info font-inter-bold"> <div className="item__info font-inter-bold">
<div <div

View File

@@ -20,6 +20,16 @@
transition: height 0.6s cubic-bezier(0.4, 0, 0.2, 1), min-height 0.6s cubic-bezier(0.4, 0, 0.2, 1); transition: height 0.6s cubic-bezier(0.4, 0, 0.2, 1), min-height 0.6s cubic-bezier(0.4, 0, 0.2, 1);
} }
&--clickable {
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
}
@media (min-width: 1800px) { @media (min-width: 1800px) {
height: 480px; height: 480px;

View File

@@ -86,18 +86,21 @@ const SliderComponent = () => {
price="2 500 000 ₽" price="2 500 000 ₽"
desc="2-комн. кв., 47 м², 1/2 этаж" desc="2-комн. кв., 47 м², 1/2 этаж"
address="Челябинская область, Челябинск, Лазурная улица, 14А, район Металлургический, микрорайон Северо-Западный" address="Челябинская область, Челябинск, Лазурная улица, 14А, район Металлургический, микрорайон Северо-Западный"
cianUrl="https://cian.ru/sale/flat/310187199/"
/> />
<Object <Object
image={objectPicTwo} image={objectPicTwo}
price="4 200 000 ₽" price="4 200 000 ₽"
desc="3-комн. кв., 77 м², 4/4 этаж" desc="3-комн. кв., 77 м², 4/4 этаж"
address="Челябинская область, Челябинск, улица Ярослава Гашека, 20, район Ленинский, микрорайон Центральный" address="Челябинская область, Челябинск, улица Ярослава Гашека, 20, район Ленинский, микрорайон Центральный"
cianUrl="https://cian.ru/"
/> />
<Object <Object
image={objectPicThree} image={objectPicThree}
price="4 900 000 ₽" price="4 900 000 ₽"
desc="Квартира-студия, 27,6 м², 19/25 этаж" desc="Квартира-студия, 27,6 м², 19/25 этаж"
address="Свердловская область, Екатеринбург, улица Студенческая, 80, район Верх-Исетский, микрорайон Уралмаш" address="Свердловская область, Екатеринбург, улица Студенческая, 80, район Верх-Исетский, микрорайон Уралмаш"
cianUrl="https://cian.ru/"
/> />
</Slider> </Slider>
</div> </div>
@@ -114,6 +117,7 @@ const SliderComponent = () => {
price={object.price} price={object.price}
desc={object.title} desc={object.title}
address={object.address} address={object.address}
cianUrl={object.cianUrl}
/> />
))} ))}
</Slider> </Slider>

View File

@@ -52,7 +52,7 @@ export const CONTACTS = {
}; };
export const API_CONFIG = { export const API_CONFIG = {
baseURL: "https://almavid.ngr1.ru", baseURL: "https://api.almavid.ru",
endpoints: { endpoints: {
feedback: "/api/feedback/send", feedback: "/api/feedback/send",
rental: "/api/rental/send", rental: "/api/rental/send",

View File

@@ -37,7 +37,7 @@ function About() {
</div> </div>
</div> </div>
<div className="about__title font-inter-semibold"> <div className="about__title font-inter-semibold">
Об {CONTACTS.companyName} <span>{CONTACTS.companyNameShort}</span> Об {CONTACTS.companyName}
</div> </div>
</section> </section>
</div> </div>