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