From 03e7b2816742c2cb5103029d6aef1e9ad7c44751 Mon Sep 17 00:00:00 2001 From: OkunElya Date: Thu, 11 Dec 2025 21:58:56 +1000 Subject: [PATCH] details page in progress --- src/components/data.pug | 124 ---------------------------- src/components/details-template.pug | 24 ++++++ src/components/mixins.pug | 4 +- src/components/template.pug | 69 ---------------- src/index.js | 3 +- src/pages/index.pug | 2 +- src/pages/photography-details.pug | 34 ++++++++ src/styles/details.styl | 107 ++++++++++++++++++++++++ 8 files changed, 169 insertions(+), 198 deletions(-) delete mode 100644 src/components/data.pug create mode 100644 src/components/details-template.pug delete mode 100644 src/components/template.pug create mode 100644 src/pages/photography-details.pug create mode 100644 src/styles/details.styl diff --git a/src/components/data.pug b/src/components/data.pug deleted file mode 100644 index c6d874d..0000000 --- a/src/components/data.pug +++ /dev/null @@ -1,124 +0,0 @@ -- - - // Данные для меню навигации - var menuItems = { - Home: './index.html', - Embedded: './embeded_details.html', - OpenCV: './opencv_details.html', - Photography: './photography_details.html', - Table: './table.html', - Institute: './images/institute.png' - }; - - // Данные для боковых карточек - var smallCards = [ - { - header: 'Заголовок', - text: '3D printers are versatile tools used for creating prototypes, custom parts, and artistic designs. They work by layering materials.', - image: '../images/16x10/3d-printer.jpeg', - imageAlt: '3D Printer', - link: '#', - }, - { - header: 'BLHeli ESCs', - text: 'BLHeli ESCs are electronic speed controllers designed for drones, offering smooth and precise motor control.', - image: '../images/16x10/blheli-esc.jpeg', - imageAlt: 'BLHeli ESC', - link: '#', - }, - { - header: 'Raspberry Pi Nano', - text: 'Raspberry Pi Nano is a compact computer ideal for learning, prototyping, and IoT projects. It is highly energy-efficient.', - image: '../images/16x10/rpi-nano.jpeg', - imageAlt: 'Raspberry Pi Nano', - link: '#', - }, - { - header: 'Smart Thermostats', - text: 'Smart thermostats help regulate home temperatures efficiently, saving energy and enhancing comfort with automation.', - image: '../images/16x10/thermostat.jpeg', - imageAlt: 'Smart Thermostat', - link: '#', - } - ]; - - const pages = { - embedded: { - title: 'Embedded Details', - slug: 'embedded', - menuTitle: 'Embeded Details', - images: [ - { src: './images/esp32.png', alt: 'ESP32', height: 150 }, - { src: './images/arduino.png', alt: 'Arduino', height: 150 }, - { src: './images/stm32.png', alt: 'STM32', height: 150 } - ], - paragraphs: [ - "My programming path started with embeded systems, i love all the low level things that Mcu could do with just a little bit of code, sometimes build or flashing progress could take some time to get a hand of , but after that everething usualy goes smooth", - "The first MCU i tried was a ATmega328P, after some time i was surprised with the debug capabilities on the Stm32 and now i'm working with esp32-s3 , that's a good chip, has internal JTAG and all the shiny wireless interfaces but feels faulty for some reason regular segfaults with CDC" - ], - table: { - title: 'Microcontroller Comparison Table', - headers: ['Board/MCU', 'UART Count', 'Dynamic UART Assignment', 'ADC Channels', 'Debug Support', 'Flash Size', 'Wireless Connectivity'], - rows: [ - ['ESP32', '3', 'Yes (via IO MUX)', '18', 'JTAG, Serial', '4MB (typical)', 'Wi-Fi, Bluetooth'], - ['ESP32-S3', '3', 'Yes (via IO MUX)', '20', 'JTAG, Serial', '8MB (typical)', 'Wi-Fi, Bluetooth LE'], - ['ESP-01', '1', 'No', '1', 'Serial only', '512KB/1MB', 'Wi-Fi'], - ['Arduino Uno (ATmega328P)', '1', 'No', '6', 'Serial, DebugWire', '32KB', 'None'], - ['Blue Pill (STM32F103C8T6)', '3', 'Yes (remappable)', '10', 'SWD, Serial', '64KB/128KB', 'None'] - ] - }, - footer: "no rpi pico here , the build system has won over my temper" - }, - - opencv: { - title: 'OpenCV Details', - slug: 'opencv', - menuTitle: 'OpenCV Details', - images: [ - { src: './images/opencv.png', alt: 'OpenCV', height: 150 } - ], - paragraphs: [ - "as mentioned before i love when programs are able to see things", - "my experience with opencv started with simple hight level functions like detectCircle or findContours and etc...", - "Right now i'm crawling deeper into the library , and the idea of standartisation of parameters between different cameras is appealig to me", - "so i'm trying to understand how all that works from the math side", - "Additionally, I'm exploring Re-Identification (ReId) techniques, they are used for recognizing and tracking objects across different camera views or consecutive frames." - ], - content: { - type: 'text', - text: "One of many projects I've worked on is ArucoNGP-MapCreator.
The idea was to create a relative map of Aruco markers just from photos of pairs (or more) of them.
It can also estimate the camera's position in the world relative to a specific marker, using only images containing any marker.
It was also my first deep dive into linear algebra." - } - }, - - photography: { - title: 'Photography Details', - slug: 'photography', - menuTitle: 'Photography Details', - images: [], - paragraphs: [ - "Usually i capture landcape scenes with SLR camera, the main workhorse is Nikon D3100 with kit and 70-210mm" - ], - gallery: [ - [ - { src: 'images/photos/image0.png', alt: 'Photo 0', width: 200 }, - { src: 'images/photos/image1.png', alt: 'Photo 1', width: 200 }, - { src: 'images/photos/image2.png', alt: 'Photo 2', width: 200 } - ], - [ - { src: 'images/photos/image3.png', alt: 'Photo 3', width: 200 }, - { src: 'images/photos/image4.png', alt: 'Photo 4', width: 200 }, - { src: 'images/photos/image5.png', alt: 'Photo 5', width: 200 } - ] - ] - } - }; - -- - const menu = [ - { href: './index.html', title: 'Home' }, - { href: './embeded_details.html', title: 'Embeded Details' }, - { href: './opencv_details.html', title: 'OpenCV Details' }, - { href: './photography_details.html', title: 'Photography Details' }, - { href: './table.html', title: 'Table with filters (not working yet)' }, - { href: './images/institute.png', title: 'Institute' } - ]; diff --git a/src/components/details-template.pug b/src/components/details-template.pug new file mode 100644 index 0000000..b6504c7 --- /dev/null +++ b/src/components/details-template.pug @@ -0,0 +1,24 @@ +include mixins.pug + +html + head + meta(charset="UTF-8") + block title + title Details Page + body + block navbar + +navbarMixin("") + + .details-container + header.details-header + block header + h1 Default Header + + .details-content + .details-text + block text + p Default text content + + .details-gallery + block gallery + p No images available diff --git a/src/components/mixins.pug b/src/components/mixins.pug index 198b2ef..a410238 100644 --- a/src/components/mixins.pug +++ b/src/components/mixins.pug @@ -1,11 +1,9 @@ -include data.pug - - // Данные для меню навигации const navbarItems = { Home: './index.html', Embedded: './embeded_details.html', OpenCV: './opencv_details.html', - Photography: './photography_details.html', + Photography: './photography-details.html', Table: './table.html', Institute: './images/institute.png' }; diff --git a/src/components/template.pug b/src/components/template.pug deleted file mode 100644 index c13b71f..0000000 --- a/src/components/template.pug +++ /dev/null @@ -1,69 +0,0 @@ -include data.pug - -mixin detailsPage(pageData) - doctype html - html(lang="en") - head - meta(charset="UTF-8") - title= pageData.title - - body(bgcolor="#F0F8FF") - //- Menu - details - summary Menu - ul - each item in menu - li - if item.title === pageData.menuTitle - a(href=item.href) - h4= item.title - else - a(href=item.href)= item.title - - //- Page Title - h2(align="center")= pageData.title - hr(width="800" align="center") - - //- Header Images - if pageData.images && pageData.images.length > 0 - p(align="center") - each img in pageData.images - if img.height - img(src=img.src alt=img.alt height=img.height) - else if img.width - img(src=img.src alt=img.alt width=img.width) - else - img(src=img.src alt=img.alt) - - //- Paragraphs - if pageData.paragraphs - each para in pageData.paragraphs - p(align="justify")!= para - - //- Table (for embedded page) - if pageData.table - h3(align="center")= pageData.table.title - table(border="1" align="center" cellpadding="6" cellspacing="0") - tr - each header in pageData.table.headers - th= header - each row in pageData.table.rows - tr - each cell in row - td= cell - - //- Content (for opencv page) - if pageData.content - hr(width="500" align="center") - p!= pageData.content.text - - //- Gallery (for photography page) - if pageData.gallery - each row in pageData.gallery - p(align="center") - each img in row - img(src=img.src alt=img.alt width=img.width) - - //- Footer - if pageData.footer - p(align="right")= pageData.footer diff --git a/src/index.js b/src/index.js index d4dca98..9905d3e 100644 --- a/src/index.js +++ b/src/index.js @@ -1 +1,2 @@ -import './styles/main.styl' \ No newline at end of file +import './styles/main.styl' +import './styles/details.styl' \ No newline at end of file diff --git a/src/pages/index.pug b/src/pages/index.pug index 87cb33d..fc038eb 100644 --- a/src/pages/index.pug +++ b/src/pages/index.pug @@ -45,7 +45,7 @@ html(lang="en") img.info-block__image(src=infoBlockB.img alt=infoBlockB.imgAlt) .info-block__details p.info-block__description #{infoBlockB.description} - a.info-block__link(href="#") More info + a.info-block__link(href="./photography-details.html") More info .sidebar +infoCardsMinxin() diff --git a/src/pages/photography-details.pug b/src/pages/photography-details.pug new file mode 100644 index 0000000..78bfd54 --- /dev/null +++ b/src/pages/photography-details.pug @@ -0,0 +1,34 @@ +include ../components/mixins.pug +extends ../components/details-template.pug + +- + const photographyData = { + header: "Photography", + description: "temptext.", + images: [ + require('../images/photos/image0.png'), + require('../images/photos/image1.png'), + require('../images/photos/image2.png') + ], + details: "D3100 -> SLT A58." + } + +block title + title Photography Portfolio - Details + +block navbar + +navbarMixin("Photography") + +block header + h1.details-title #{photographyData.header} + p.details-description #{photographyData.description} + +block text + p.details-text-content #{photographyData.details} + .details-back-link + a.back-button(href="./index.html") ← Back to Home + +block gallery + each image, index in photographyData.images + .gallery-item + img.gallery-image(src=image alt=`Photography ${index + 1}`) \ No newline at end of file diff --git a/src/styles/details.styl b/src/styles/details.styl new file mode 100644 index 0000000..8f4283f --- /dev/null +++ b/src/styles/details.styl @@ -0,0 +1,107 @@ +// Details Template Styles +.details-container + max-width 1200px + margin 0 auto + padding 20px + +.details-header + margin-bottom 40px + text-align center + + .details-title + font-size 2.5rem + margin-bottom 20px + color #333 + + .details-description + font-size 1.2rem + color #666 + line-height 1.6 + max-width 800px + margin 0 auto + +.details-content + display flex + gap 40px + align-items flex-start + + .details-text + flex 1 + + .details-text-content + font-size 1.1rem + line-height 1.8 + color #444 + margin-bottom 30px + + .details-back-link + margin-top 30px + + .back-button + display inline-block + padding 12px 24px + background-color #007bff + color white + text-decoration none + border-radius 6px + transition background-color 0.3s ease + font-weight 500 + + &:hover + background-color #0056b3 + + .details-gallery + flex 0 0 300px + display flex + flex-direction column + gap 20px + + .gallery-item + overflow hidden + border-radius 8px + box-shadow 0 4px 12px rgba(0, 0, 0, 0.1) + transition transform 0.3s ease, box-shadow 0.3s ease + + &:hover + transform translateY(-5px) + box-shadow 0 8px 20px rgba(0, 0, 0, 0.15) + + .gallery-image + width 100% + height 200px + object-fit cover + display block + +// Responsive Design - Mobile (screens smaller than 700px) +@media screen and (max-width: 700px) + .details-container + padding 15px + + .details-header + margin-bottom 30px + + .details-title + font-size 2rem + + .details-description + font-size 1.1rem + + .details-content + flex-direction column + gap 30px + + .details-gallery + flex 1 + order -1 // Move gallery above text on mobile + + .gallery-item + .gallery-image + height 250px + + .details-text + .details-text-content + font-size 1rem + + .back-button + padding 10px 20px + font-size 0.95rem \ No newline at end of file