From 325f8718af09ca42fd351b3c6a3061c69072be74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=8E?= Date: Sun, 16 Nov 2025 23:17:57 -0500 Subject: [PATCH 1/3] Initial commit: Add website files --- .editorconfig | 10 + .gitignore | 20 ++ .nojekyll | 0 .vscode/settings.json | 3 + 404.html | 42 +++++ Gemfile | 5 + LICENSE.txt | 19 ++ README.md | 88 +++++++++ _config.yml | 44 +++++ about.html | 83 +++++++++ business.html | 51 ++++++ css/main.css | 413 ++++++++++++++++++++++++++++++++++++++++++ css/normalize.css | 181 ++++++++++++++++++ favicon.ico | 1 + humans.txt | 15 ++ icon.png | 1 + img/profile.jpg | 1 + index.html | 50 +++++ js/main.js | 236 ++++++++++++++++++++++++ lessons.html | 51 ++++++ posts.html | 51 ++++++ projects.html | 51 ++++++ reading-list.html | 53 ++++++ robots.txt | 5 + site.webmanifest | 15 ++ 25 files changed, 1489 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .nojekyll create mode 100644 .vscode/settings.json create mode 100644 404.html create mode 100644 Gemfile create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 _config.yml create mode 100644 about.html create mode 100644 business.html create mode 100644 css/main.css create mode 100644 css/normalize.css create mode 100644 favicon.ico create mode 100644 humans.txt create mode 100644 icon.png create mode 100644 img/profile.jpg create mode 100644 index.html create mode 100644 js/main.js create mode 100644 lessons.html create mode 100644 posts.html create mode 100644 projects.html create mode 100644 reading-list.html create mode 100644 robots.txt create mode 100644 site.webmanifest diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0f09989 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95c1505 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Include your project-specific ignores in this file +# Read about how to use .gitignore: https://help.github.com/articles/ignoring-files +# Useful .gitignore templates: https://github.com/github/gitignore + +# Node +node_modules +dist +.cache + +# Jekyll +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor +Gemfile.lock + +# OS +.DS_Store +Thumbs.db diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5480842 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "kiroAgent.configureMCP": "Disabled" +} \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..8aca249 --- /dev/null +++ b/404.html @@ -0,0 +1,42 @@ + + + + + + Page Not Found - Nulledgeable + + + + + +
+
+

404

+

Sorry, the page you're looking for doesn't exist.

+ Go back home +
+
+ + diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..825d431 --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +source "https://rubygems.org" + +gem "github-pages", group: :jekyll_plugins +gem "jekyll-sitemap" +gem "jekyll-seo-tag" diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..2fcc62f --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2025 Nulledgeable + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..45ef56a --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +# Nulledgeable + +A software development blog featuring posts, lessons, business essays, and projects. + +🌐 **Live Site:** [https://nulledgeable.github.io](https://nulledgeable.github.io) + +## Features + +- Clean, DokuWiki-inspired design +- Purple and gold color scheme +- Responsive layout with hamburger side menu +- Separate sections for Posts, Reading List, About Me, Lessons, Business Essays, and Projects +- HTML5 Boilerplate structure +- GitHub Pages ready + +## Structure + +``` +. +├── css/ +│ ├── normalize.css # CSS reset +│ └── main.css # Main styles +├── js/ +│ └── main.js # Main JavaScript +├── img/ +│ └── profile.jpg # Profile image +├── index.html # Home page +├── posts.html # Blog posts +├── reading-list.html # Book recommendations +├── about.html # About page +├── lessons.html # Lessons learned +├── business.html # Business essays +├── projects.html # Project showcase +├── 404.html # Error page +├── _config.yml # Jekyll configuration +├── .nojekyll # Bypass Jekyll processing +├── favicon.ico # Favicon +├── icon.png # App icon +├── robots.txt # Robots file +├── humans.txt # Humans file +└── site.webmanifest # Web app manifest +``` + +## Deployment (GitHub Pages) + +This site is configured for GitHub Pages deployment: + +1. Push your changes to the `main` branch +2. Go to your repository Settings → Pages +3. Set Source to "Deploy from a branch" +4. Select `main` branch and `/ (root)` folder +5. Click Save + +Your site will be live at `https://nulledgeable.github.io` + +## Local Development + +Since this is a static HTML site, you can: + +1. Open `index.html` directly in your browser, or +2. Use a local server: + ```bash + # Python 3 + python -m http.server 8000 + + # Node.js (with http-server) + npx http-server + ``` +3. Visit `http://localhost:8000` + +## Customization + +1. Replace `img/profile.jpg` with your profile photo +2. Update social media links in `about.html` +3. Customize content in `js/main.js` +4. Replace `favicon.ico` and `icon.png` with your branding +5. Update colors in `css/main.css` (CSS variables at the top) + +## Browser Support + +- Chrome (latest) +- Firefox (latest) +- Safari (latest) +- Edge (latest) + +## License + +MIT diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..1201471 --- /dev/null +++ b/_config.yml @@ -0,0 +1,44 @@ +# Site settings +title: Nulledgeable +description: Software development blog featuring posts, lessons, business essays, and projects +url: "https://nulledgeable.github.io" +baseurl: "" + +# Build settings +markdown: kramdown +permalink: pretty + +# Exclude from processing +exclude: + - README.md + - LICENSE.txt + - .editorconfig + - .gitignore + - node_modules + - vendor + +# Include files +include: + - .htaccess + - _pages + +# Collections +collections: + pages: + output: true + permalink: /:name + +# Defaults +defaults: + - scope: + path: "" + values: + layout: default + +# Theme +theme: null + +# Plugins +plugins: + - jekyll-sitemap + - jekyll-seo-tag diff --git a/about.html b/about.html new file mode 100644 index 0000000..f0bfb6d --- /dev/null +++ b/about.html @@ -0,0 +1,83 @@ + + + + + + About Me - Nulledgeable + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

About Me

+
+ Profile Picture +
+

Software developer, writer, and lifelong learner. I write about code, business, and the lessons learned along the way.

+

With years of experience in full-stack development, I've worked on everything from small startups to enterprise applications. My passion lies in building products that solve real problems and sharing what I learn with the community.

+ +
+
+
+
+ +
+

Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

+
+
+ + + + diff --git a/business.html b/business.html new file mode 100644 index 0000000..4ec9e5b --- /dev/null +++ b/business.html @@ -0,0 +1,51 @@ + + + + + + Business Essays - Nulledgeable + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

Business Essays

+
+
+
+ +
+

Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

+
+
+ + + + diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..868a2a4 --- /dev/null +++ b/css/main.css @@ -0,0 +1,413 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:root { + --purple-primary: #6b46c1; + --purple-dark: #553c9a; + --purple-light: #9f7aea; + --gold: #d4af37; + --gold-light: #f4d03f; + --gold-dark: #b8941f; + --text: #2d3748; + --text-light: #718096; + --bg: #faf9f7; + --bg-content: #ffffff; + --border: #d4af37; + --border-light: #e2d5a8; +} + +body { + font-family: Georgia, 'Times New Roman', serif; + line-height: 1.7; + color: var(--text); + background: var(--bg); +} + +.wiki-container { + max-width: 1100px; + margin: 0 auto; + background: var(--bg-content); + border-left: 1px solid var(--border-light); + border-right: 1px solid var(--border-light); + min-height: 100vh; +} + +/* Header - DokuWiki Style */ +.wiki-header { + background: linear-gradient(to bottom, var(--purple-primary), var(--purple-dark)); + border-bottom: 3px solid var(--gold); + padding: 1.5rem 2rem; +} + +.header-top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.site-title { + font-size: 2rem; + font-weight: bold; + color: var(--gold); + text-shadow: 2px 2px 4px rgba(0,0,0,0.3); +} + +.hamburger { + display: none; + flex-direction: column; + background: none; + border: none; + cursor: pointer; + padding: 0.5rem; + gap: 0.4rem; +} + +.hamburger span { + display: block; + width: 25px; + height: 3px; + background: var(--gold); + transition: all 0.3s; + border-radius: 2px; +} + +.hamburger.active span:nth-child(1) { + transform: rotate(45deg) translate(6px, 6px); +} + +.hamburger.active span:nth-child(2) { + opacity: 0; +} + +.hamburger.active span:nth-child(3) { + transform: rotate(-45deg) translate(6px, -6px); +} + +.wiki-nav { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.wiki-nav a { + background: rgba(255,255,255,0.1); + color: white; + text-decoration: none; + padding: 0.5rem 1rem; + border: 1px solid rgba(212,175,55,0.3); + border-radius: 3px; + font-size: 0.95rem; + transition: all 0.3s; +} + +.wiki-nav a:hover { + background: var(--gold); + color: var(--purple-dark); + border-color: var(--gold); +} + +/* Main Content */ +.wiki-content { + padding: 2rem; +} + +.content-section { + margin-bottom: 3rem; + padding-bottom: 2rem; + border-bottom: 2px solid var(--border-light); +} + +.section-heading { + color: var(--purple-primary); + font-size: 1.8rem; + margin-bottom: 1.5rem; + padding-bottom: 0.5rem; + border-bottom: 2px solid var(--gold); +} + +/* Recent Article - Featured */ +.recent-article { + background: linear-gradient(135deg, #f8f5ff 0%, #fffbf0 100%); + border: 2px solid var(--gold); + padding: 2rem; + margin-bottom: 3rem; + border-radius: 4px; +} + +.featured-post { + background: white; + padding: 1.5rem; + border-left: 4px solid var(--purple-primary); +} + +.featured-post h3 { + color: var(--purple-dark); + font-size: 1.6rem; + margin-bottom: 0.5rem; +} + +.featured-post .meta { + color: var(--text-light); + font-size: 0.9rem; + margin-bottom: 1rem; +} + +.featured-post .excerpt { + line-height: 1.8; + margin-bottom: 1rem; +} + +.featured-post .read-more { + display: inline-block; + background: var(--purple-primary); + color: white; + padding: 0.5rem 1.5rem; + text-decoration: none; + border-radius: 3px; + transition: background 0.3s; +} + +.featured-post .read-more:hover { + background: var(--purple-dark); +} + +/* Posts Grid - Wiki Style */ +.posts-grid, .lessons-grid, .business-grid, .projects-grid { + display: grid; + gap: 1rem; +} + +.post-item, .lesson-item, .business-item, .project-item { + background: white; + border: 1px solid var(--border-light); + padding: 1.2rem; + transition: all 0.3s; + cursor: pointer; +} + +.post-item:hover, .lesson-item:hover, .business-item:hover, .project-item:hover { + border-color: var(--gold); + box-shadow: 0 2px 8px rgba(107,70,193,0.1); + transform: translateX(4px); +} + +.post-item h3, .lesson-item h3, .business-item h3, .project-item h3 { + color: var(--purple-primary); + font-size: 1.3rem; + margin-bottom: 0.5rem; +} + +.post-item .meta, .lesson-item .meta, .business-item .meta, .project-item .meta { + font-size: 0.85rem; + color: var(--text-light); + margin-bottom: 0.5rem; +} + +.post-item .tag, .lesson-item .tag, .business-item .tag, .project-item .tag { + display: inline-block; + background: var(--gold-light); + color: var(--purple-dark); + padding: 0.2rem 0.6rem; + font-size: 0.8rem; + border-radius: 3px; + margin-right: 0.5rem; +} + +/* Reading List */ +.reading-list ul { + list-style: none; +} + +.reading-list li { + background: white; + border-left: 3px solid var(--purple-light); + padding: 1rem; + margin-bottom: 0.8rem; + transition: all 0.3s; +} + +.reading-list li:hover { + border-left-color: var(--gold); + background: #fafafa; +} + +.reading-list .book-title { + font-weight: bold; + color: var(--purple-dark); + font-size: 1.1rem; +} + +.reading-list .book-author { + color: var(--text-light); + font-style: italic; + font-size: 0.9rem; +} + +/* About Section */ +.about-section { + background: linear-gradient(to right, #f8f5ff, #fffbf0); + padding: 2rem; + border-radius: 4px; +} + +.about-content { + display: flex; + gap: 2rem; + align-items: flex-start; +} + +.profile-pic { + width: 200px; + height: 200px; + border-radius: 8px; + border: 4px solid var(--gold); + object-fit: cover; + box-shadow: 0 4px 12px rgba(0,0,0,0.15); +} + +.about-text { + flex: 1; +} + +.about-text p { + font-size: 1.1rem; + line-height: 1.8; + margin-bottom: 1.5rem; +} + +.social-links { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +.social-link { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: var(--purple-primary); + color: white; + padding: 0.6rem 1.2rem; + text-decoration: none; + border-radius: 4px; + transition: all 0.3s; + font-size: 0.95rem; +} + +.social-link:hover { + background: var(--gold); + color: var(--purple-dark); + transform: translateY(-2px); +} + +.social-link .icon { + width: 20px; + height: 20px; +} + +/* Footer */ +.wiki-footer { + background: var(--purple-dark); + color: var(--gold-light); + text-align: center; + padding: 1.5rem; + font-size: 0.9rem; + border-top: 3px solid var(--gold); +} + +/* Side Menu Overlay */ +.menu-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + z-index: 998; + opacity: 0; + transition: opacity 0.3s; +} + +.menu-overlay.active { + display: block; + opacity: 1; +} + +/* Responsive */ +@media (max-width: 768px) { + .wiki-header { + padding: 1rem; + } + + .header-top { + margin-bottom: 0; + } + + .site-title { + font-size: 1.5rem; + } + + .hamburger { + display: flex; + z-index: 1000; + } + + .wiki-nav { + position: fixed; + top: 0; + right: -280px; + width: 280px; + height: 100vh; + background: linear-gradient(to bottom, var(--purple-primary), var(--purple-dark)); + flex-direction: column; + gap: 0; + padding: 4rem 0 2rem 0; + transition: right 0.3s ease; + z-index: 999; + overflow-y: auto; + box-shadow: -2px 0 10px rgba(0, 0, 0, 0.3); + } + + .wiki-nav.active { + right: 0; + } + + .wiki-nav a { + background: transparent; + border: none; + border-radius: 0; + padding: 1rem 2rem; + font-size: 1.1rem; + text-align: left; + border-bottom: 2px solid transparent; + transition: all 0.3s; + } + + .wiki-nav a:hover { + background: rgba(212, 175, 55, 0.1); + border-bottom-color: var(--gold); + color: var(--gold); + } + + .wiki-content { + padding: 1rem; + } + + .about-content { + flex-direction: column; + } + + .profile-pic { + width: 150px; + height: 150px; + } + + .social-links { + flex-direction: column; + } +} diff --git a/css/normalize.css b/css/normalize.css new file mode 100644 index 0000000..3720070 --- /dev/null +++ b/css/normalize.css @@ -0,0 +1,181 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +html { + line-height: 1.15; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +main { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +img { + border-style: none; +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details { + display: block; +} + +summary { + display: list-item; +} + +template { + display: none; +} + +[hidden] { + display: none; +} diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..e0efc30 --- /dev/null +++ b/favicon.ico @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/humans.txt b/humans.txt new file mode 100644 index 0000000..fc42c0e --- /dev/null +++ b/humans.txt @@ -0,0 +1,15 @@ +# humanstxt.org/ +# The humans responsible & technology colophon + +# TEAM + + Developer -- Your Name + +# THANKS + + + +# TECHNOLOGY COLOPHON + + HTML5, CSS3, JavaScript + Normalize.css diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..442ee5a --- /dev/null +++ b/icon.png @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/profile.jpg b/img/profile.jpg new file mode 100644 index 0000000..cb0a1e2 --- /dev/null +++ b/img/profile.jpg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..e93e97a --- /dev/null +++ b/index.html @@ -0,0 +1,50 @@ + + + + + + Nulledgeable - Home + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

Most Recent Article

+
+
+
+ +
+

Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

+
+
+ + + + diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..0b495c1 --- /dev/null +++ b/js/main.js @@ -0,0 +1,236 @@ +// Data +const posts = [ + { + id: 1, + title: "Understanding JavaScript Closures", + excerpt: "Deep dive into one of JavaScript's most powerful features and how to use closures effectively in your code.", + tag: "JavaScript", + date: "Nov 16, 2025", + readTime: "5 min" + }, + { + id: 2, + title: "Building Scalable APIs with Node.js", + excerpt: "Best practices for designing and implementing RESTful APIs that can handle growth and maintain performance.", + tag: "Backend", + date: "Nov 10, 2025", + readTime: "8 min" + }, + { + id: 3, + title: "CSS Grid vs Flexbox: When to Use Each", + excerpt: "A practical guide to choosing the right layout system for your web projects with real-world examples.", + tag: "CSS", + date: "Nov 5, 2025", + readTime: "6 min" + }, + { + id: 4, + title: "Introduction to TypeScript", + excerpt: "Why TypeScript is becoming essential for modern JavaScript development and how to get started.", + tag: "TypeScript", + date: "Nov 2, 2025", + readTime: "7 min" + } +]; + +const lessons = [ + { title: "Debugging is a Superpower", excerpt: "Learning to debug effectively changed how I approach problems.", date: "Oct 28, 2025" }, + { title: "Write Code for Humans First", excerpt: "Clean code isn't about being clever, it's about being clear.", date: "Oct 20, 2025" }, + { title: "Test Early, Test Often", excerpt: "The cost of fixing bugs grows exponentially with time.", date: "Oct 15, 2025" } +]; + +const businessEssays = [ + { title: "Building Products Users Actually Want", excerpt: "Why talking to customers is more important than writing code.", date: "Nov 1, 2025" }, + { title: "The Myth of the 10x Developer", excerpt: "Great teams beat great individuals every time.", date: "Oct 18, 2025" }, + { title: "Pricing Your SaaS Product", excerpt: "Lessons learned from launching three products.", date: "Oct 5, 2025" } +]; + +const projects = [ + { title: "TaskFlow - Project Management Tool", tech: "React, Node.js, PostgreSQL", description: "A lightweight project management tool for small teams." }, + { title: "CodeSnippet Manager", tech: "Electron, SQLite", description: "Desktop app for organizing and searching code snippets." }, + { title: "API Monitor Dashboard", tech: "Vue.js, Express", description: "Real-time monitoring dashboard for REST APIs." } +]; + +const readingList = [ + { title: "The Pragmatic Programmer", author: "David Thomas & Andrew Hunt" }, + { title: "Clean Code", author: "Robert C. Martin" }, + { title: "Designing Data-Intensive Applications", author: "Martin Kleppmann" }, + { title: "The Lean Startup", author: "Eric Ries" }, + { title: "Zero to One", author: "Peter Thiel" } +]; + +// Render Recent Article +function renderRecentArticle() { + const container = document.getElementById('recentArticle'); + const recent = posts[0]; + + container.innerHTML = ` +

${recent.title}

+
+ ${recent.tag} + ${recent.date} • ${recent.readTime} read +
+

${recent.excerpt}

+ Read Full Article → + `; +} + +// Render Posts +function renderPosts() { + const container = document.getElementById('postsGrid'); + + posts.forEach(post => { + const div = document.createElement('div'); + div.className = 'post-item'; + div.innerHTML = ` +

${post.title}

+
+ ${post.tag} + ${post.date} • ${post.readTime} read +
+

${post.excerpt}

+ `; + div.onclick = () => alert(`Opening: ${post.title}`); + container.appendChild(div); + }); +} + +// Render Lessons +function renderLessons() { + const container = document.getElementById('lessonsGrid'); + + lessons.forEach(lesson => { + const div = document.createElement('div'); + div.className = 'lesson-item'; + div.innerHTML = ` +

${lesson.title}

+
${lesson.date}
+

${lesson.excerpt}

+ `; + div.onclick = () => alert(`Opening: ${lesson.title}`); + container.appendChild(div); + }); +} + +// Render Business Essays +function renderBusinessEssays() { + const container = document.getElementById('businessGrid'); + + businessEssays.forEach(essay => { + const div = document.createElement('div'); + div.className = 'business-item'; + div.innerHTML = ` +

${essay.title}

+
${essay.date}
+

${essay.excerpt}

+ `; + div.onclick = () => alert(`Opening: ${essay.title}`); + container.appendChild(div); + }); +} + +// Render Projects +function renderProjects() { + const container = document.getElementById('projectsGrid'); + + projects.forEach(project => { + const div = document.createElement('div'); + div.className = 'project-item'; + div.innerHTML = ` +

${project.title}

+
+ ${project.tech} +
+

${project.description}

+ `; + div.onclick = () => alert(`Opening: ${project.title}`); + container.appendChild(div); + }); +} + +// Render Reading List +function renderReadingList() { + const container = document.getElementById('readingList'); + + readingList.forEach(book => { + const li = document.createElement('li'); + li.innerHTML = ` +
${book.title}
+
by ${book.author}
+ `; + container.appendChild(li); + }); +} + +// Smooth scrolling +document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function (e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + }); +}); + +// Hamburger menu toggle +function initHamburger() { + const hamburger = document.getElementById('hamburger'); + const nav = document.getElementById('wikiNav'); + + if (hamburger && nav) { + // Create overlay + const overlay = document.createElement('div'); + overlay.className = 'menu-overlay'; + overlay.id = 'menuOverlay'; + document.body.appendChild(overlay); + + // Toggle menu + hamburger.addEventListener('click', () => { + hamburger.classList.toggle('active'); + nav.classList.toggle('active'); + overlay.classList.toggle('active'); + }); + + // Close menu when clicking overlay + overlay.addEventListener('click', () => { + hamburger.classList.remove('active'); + nav.classList.remove('active'); + overlay.classList.remove('active'); + }); + + // Close menu when clicking a link + nav.querySelectorAll('a').forEach(link => { + link.addEventListener('click', () => { + hamburger.classList.remove('active'); + nav.classList.remove('active'); + overlay.classList.remove('active'); + }); + }); + } +} + +// Initialize based on current page +document.addEventListener('DOMContentLoaded', () => { + const path = window.location.pathname; + const page = path.substring(path.lastIndexOf('/') + 1); + + // Initialize hamburger menu + initHamburger(); + + // Load page content + if (page === '' || page === 'index.html') { + renderRecentArticle(); + } else if (page === 'posts.html') { + renderPosts(); + } else if (page === 'reading-list.html') { + renderReadingList(); + } else if (page === 'lessons.html') { + renderLessons(); + } else if (page === 'business.html') { + renderBusinessEssays(); + } else if (page === 'projects.html') { + renderProjects(); + } +}); diff --git a/lessons.html b/lessons.html new file mode 100644 index 0000000..341fed6 --- /dev/null +++ b/lessons.html @@ -0,0 +1,51 @@ + + + + + + Lessons - Nulledgeable + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

Lessons

+
+
+
+ +
+

Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

+
+
+ + + + diff --git a/posts.html b/posts.html new file mode 100644 index 0000000..ce50a2e --- /dev/null +++ b/posts.html @@ -0,0 +1,51 @@ + + + + + + Posts - Nulledgeable + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

Posts

+
+
+
+ +
+

Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

+
+
+ + + + diff --git a/projects.html b/projects.html new file mode 100644 index 0000000..98a9d5e --- /dev/null +++ b/projects.html @@ -0,0 +1,51 @@ + + + + + + Projects - Nulledgeable + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

Projects

+
+
+
+ +
+

Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

+
+
+ + + + diff --git a/reading-list.html b/reading-list.html new file mode 100644 index 0000000..656550d --- /dev/null +++ b/reading-list.html @@ -0,0 +1,53 @@ + + + + + + Reading List - Nulledgeable + + + + + + + + + +
+
+
+
Nulledgeable
+ +
+ +
+ +
+
+

Reading List

+
+
    +
    +
    +
    + +
    +

    Last modified: November 16, 2025 | Built with HTML, CSS & JavaScript

    +
    +
    + + + + diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..d0e5f1b --- /dev/null +++ b/robots.txt @@ -0,0 +1,5 @@ +# www.robotstxt.org/ + +# Allow crawling of all content +User-agent: * +Disallow: diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..f9c9058 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,15 @@ +{ + "short_name": "Nulledgeable", + "name": "Nulledgeable - Software Development & Essays", + "icons": [ + { + "src": "icon.png", + "type": "image/png", + "sizes": "192x192" + } + ], + "start_url": "/", + "background_color": "#6b46c1", + "theme_color": "#d4af37", + "display": "standalone" +} From 738eedff7dedd28f70916ff6c9d6eb053e8594dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=8E?= Date: Sun, 16 Nov 2025 23:28:33 -0500 Subject: [PATCH 2/3] Basic Structure --- css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/main.css b/css/main.css index 868a2a4..6202883 100644 --- a/css/main.css +++ b/css/main.css @@ -64,6 +64,7 @@ body { cursor: pointer; padding: 0.5rem; gap: 0.4rem; + z-index: 1001; } .hamburger span { From 40162d585838d860a947a3d3d9c7f8c2648de0f5 Mon Sep 17 00:00:00 2001 From: Nulledgeable Date: Thu, 20 Nov 2025 17:06:05 -0500 Subject: [PATCH 3/3] base structure --- css/main.css | 83 +++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/css/main.css b/css/main.css index 6202883..ab486da 100644 --- a/css/main.css +++ b/css/main.css @@ -57,7 +57,7 @@ body { } .hamburger { - display: none; + display: flex; flex-direction: column; background: none; border: none; @@ -339,6 +339,45 @@ body { opacity: 1; } +/* Hamburger Menu - Always visible */ +.wiki-nav { + position: fixed; + top: 0; + right: -280px; + width: 280px; + height: 100vh; + background: linear-gradient(to bottom, var(--purple-primary), var(--purple-dark)); + flex-direction: column; + gap: 0; + padding: 4rem 0 2rem 0; + transition: right 0.3s ease; + z-index: 999; + overflow-y: auto; + box-shadow: -2px 0 10px rgba(0, 0, 0, 0.3); +} + +.wiki-nav.active { + right: 0; +} + +.wiki-nav a { + background: transparent; + border: none; + border-radius: 0; + padding: 1rem 2rem; + font-size: 1.1rem; + text-align: left; + border-bottom: 1px solid rgba(212, 175, 55, 0.2); + transition: all 0.3s; +} + +.wiki-nav a:hover { + background: rgba(212, 175, 55, 0.15); + border-left: 4px solid var(--gold); + color: var(--gold); + padding-left: 1.75rem; +} + /* Responsive */ @media (max-width: 768px) { .wiki-header { @@ -353,48 +392,6 @@ body { font-size: 1.5rem; } - .hamburger { - display: flex; - z-index: 1000; - } - - .wiki-nav { - position: fixed; - top: 0; - right: -280px; - width: 280px; - height: 100vh; - background: linear-gradient(to bottom, var(--purple-primary), var(--purple-dark)); - flex-direction: column; - gap: 0; - padding: 4rem 0 2rem 0; - transition: right 0.3s ease; - z-index: 999; - overflow-y: auto; - box-shadow: -2px 0 10px rgba(0, 0, 0, 0.3); - } - - .wiki-nav.active { - right: 0; - } - - .wiki-nav a { - background: transparent; - border: none; - border-radius: 0; - padding: 1rem 2rem; - font-size: 1.1rem; - text-align: left; - border-bottom: 2px solid transparent; - transition: all 0.3s; - } - - .wiki-nav a:hover { - background: rgba(212, 175, 55, 0.1); - border-bottom-color: var(--gold); - color: var(--gold); - } - .wiki-content { padding: 1rem; }