details page in progress

This commit is contained in:
2025-12-11 21:58:56 +10:00
parent 39d023d50b
commit 38e70189b8
8 changed files with 169 additions and 198 deletions

View File

@@ -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 <i>regular segfaults with CDC</i>"
],
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 <i>see</i> 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 <a href=\"https://github.com/OkunElya/ArucoNGP-MapCreator\" target=\"_blank\">ArucoNGP-MapCreator</a>.<br>The idea was to create a relative map of Aruco markers just from photos of pairs (or more) of them.<br>It can also estimate the camera's position in the world relative to a specific marker, using only images containing any marker.<br>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' }
];

View File

@@ -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

View File

@@ -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'
};

View File

@@ -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

View File

@@ -1 +1,2 @@
import './styles/main.styl'
import './styles/main.styl'
import './styles/details.styl'

View File

@@ -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()

View File

@@ -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}`)

107
src/styles/details.styl Normal file
View File

@@ -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