diff --git a/blog/index.html b/blog/index.html index c059bbc..799fdad 100644 --- a/blog/index.html +++ b/blog/index.html @@ -237,17 +237,17 @@

dangrubb.net/blog

-
-

Status

+

- dangrubb.net is fully functional and operating at 18% of potential. When Blog updates are posted, this score will increase to 19%. + <-- back to home

-

-
- Cannot Connect -
+ +
+

Loading blog posts...

+
+ - + diff --git a/blog/posts.json b/blog/posts.json new file mode 100644 index 0000000..84991bc --- /dev/null +++ b/blog/posts.json @@ -0,0 +1,11 @@ +[ + { + "id": "01", + "title": "Status", + "date": "2026-02-28", + "excerpt": "dangrubb.net is fully functional and operating at 18% of potential. When Blog updates are posted, this score will increase to 19%.", + "content": "

dangrubb.net is fully functional and operating at 18% of potential. When Blog updates are posted, this score will increase to 19%.

", + "image": "/blog/src/img/CannotConnect.JPEG", + "slug": "status" + } +] diff --git a/blog/script.js b/blog/script.js new file mode 100644 index 0000000..8fd4b6b --- /dev/null +++ b/blog/script.js @@ -0,0 +1,53 @@ +"use strict"; + +// Load and display blog posts from JSON +async function loadBlogPosts() { + try { + const response = await fetch('./posts.json'); + const posts = await response.json(); + + const blogsContainer = document.getElementById('blogsContainer'); + + if (posts.length === 0) { + blogsContainer.innerHTML = '

No blog posts yet.

'; + return; + } + + // Create HTML for each post + const postsHTML = posts.map(post => ` +
+

${post.title}

+
${new Date(post.date).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
+
+ ${post.content} +
+
+ ${post.title} +
+
+ `).join(''); + + blogsContainer.innerHTML = postsHTML; + } catch (error) { + console.error('Error loading blog posts:', error); + document.getElementById('blogsContainer').innerHTML = '

Error loading blog posts.

'; + } +} + +// Load blog posts when page is ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', loadBlogPosts); +} else { + loadBlogPosts(); +} + +// Handle hash-based navigation to specific posts +window.addEventListener('hashchange', () => { + const postId = window.location.hash.slice(1); + if (postId) { + const element = document.getElementById(postId); + if (element) { + element.scrollIntoView({ behavior: 'smooth' }); + } + } +}); diff --git a/blog/style.css b/blog/style.css index 4c84545..08bf0ae 100644 --- a/blog/style.css +++ b/blog/style.css @@ -219,4 +219,72 @@ a:focus-visible { .viewport-image { height: 40vh; /* 60% of the viewport height */ width: auto; /* Maintain aspect ratio */ +} + +/* Blog Posts Styling */ +.blogs-container { + margin: 40px auto 0; + max-width: 65em; + width: 100%; +} + +.blog-post { + margin: 40px auto; + padding: 20px; + border: 1px solid rgba(155, 169, 180, 0.2); + border-radius: 4px; + background: linear-gradient(135deg, rgba(13, 10, 20, 0.4), rgba(50, 30, 80, 0.2)); + scroll-margin-top: 100px; + display: flex; + flex-direction: column; + align-items: center; + max-width: 700px; +} + +.blog-post-title { + color: #ffff00; + font-weight: bold; + font-size: 1.8rem; + margin: 0 0 10px; + text-align: center; +} + +.blog-post-date { + color: #aa95bd; + font-size: 0.9rem; + text-align: center; + margin-bottom: 20px; +} + +.blog-post-content { + color: #9d9aa4; + font-size: 0.95rem; + line-height: 1.6; + text-align: center; +} + +.blog-post-content p { + margin: 0 0 15px; +} + +.blog-post-image { + display: flex; + justify-content: center; + align-items: center; + margin-top: 20px; +} + +.blog-post-image img { + max-width: 100%; + height: auto; + max-height: 60vh; + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); +} + +.no-posts, +.error { + text-align: center; + color: #9d9aa4; + padding: 40px 20px; } \ No newline at end of file diff --git a/index.html b/index.html index 7dd0444..2e45751 100644 --- a/index.html +++ b/index.html @@ -243,6 +243,12 @@ EXCLUSIVE: Leaked mixtape from Darnea's vault

+
+
+

Loading latest post...

+
+
+
diff --git a/script.js b/script.js index 59b84a2..dc80c30 100644 --- a/script.js +++ b/script.js @@ -126,4 +126,41 @@ uncomment the code below. //
CSS
//
${css.join("\n\n")}
// -// `; \ No newline at end of file +// `; + +// Load latest blog post preview +async function loadLatestBlogPost() { + try { + const response = await fetch('./blog/posts.json'); + const posts = await response.json(); + + if (posts.length === 0) { + document.getElementById('latestBlogPreview').innerHTML = '

No blog posts yet.

'; + return; + } + + // Get the latest post (first in the array) + const latestPost = posts[0]; + + // Create the preview HTML + const previewHTML = ` + ${latestPost.title} +
${new Date(latestPost.date).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}
+ ${latestPost.title} +

${latestPost.excerpt}

+ Read more → + `; + + document.getElementById('latestBlogPreview').innerHTML = previewHTML; + } catch (error) { + console.error('Error loading blog posts:', error); + document.getElementById('latestBlogPreview').innerHTML = '

Error loading blog posts.

'; + } +} + +// Load blog preview when page is ready +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', loadLatestBlogPost); +} else { + loadLatestBlogPost(); +} \ No newline at end of file diff --git a/style.css b/style.css index de180ac..a5bffd9 100644 --- a/style.css +++ b/style.css @@ -294,6 +294,74 @@ body { text-decoration: underline; } +/* Blog Preview Box */ +.blog-preview-container { + margin: 30px auto 0; + max-width: 33%; + width: 100%; + display: flex; + justify-content: center; +} + +.blog-preview { + border: 1px solid rgba(155, 169, 180, 0.3); + border-radius: 4px; + padding: 15px; + background: linear-gradient(135deg, rgba(13, 10, 20, 0.6), rgba(50, 30, 80, 0.3)); + overflow: hidden; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); +} + +.blog-preview img { + width: 100%; + height: auto; + max-height: 150px; + object-fit: cover; + border-radius: 3px; + margin-bottom: 10px; +} + +.blog-preview-title { + color: #ffff00; + font-weight: bold; + font-size: 0.95rem; + margin: 10px 0 5px; + text-decoration: none; + display: block; +} + +.blog-preview-title:hover { + text-decoration: underline; +} + +.blog-preview-date { + color: #aa95bd; + font-size: 0.8rem; + margin-bottom: 8px; +} + +.blog-preview-excerpt { + color: #9d9aa4; + font-size: 0.85rem; + line-height: 1.4; + margin: 8px 0 10px; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.blog-preview-link { + display: inline-block; + color: #6be1e9; + font-size: 0.8rem; + text-decoration: none; +} + +.blog-preview-link:hover { + text-decoration: underline; +} + /* Push the navigation to the bottom using flexbox spacer */ .bottom-nav { margin-top: auto;