diff --git a/README.md b/README.md index e81d2f6..a3a494e 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ To make DocForge truly user-friendly, include these instructions in the starter ## Extensibility Roadmap - **Plugins**: JS files in `plugins/` with hooks (e.g., add shortcodes, post-build tasks). -- **Themes**: Override CSS in `assets/custom.css`. +- **Themes**: Customize variables in `assets/theme.css` or override styles in `assets/custom.css`. A built-in dark-mode toggle stores preference in local storage. - **Future**: PDF export plugin, AI-assisted search suggestions. - **Community**: MIT license; GitHub for issues. diff --git a/assets/theme.css b/assets/theme.css new file mode 100644 index 0000000..b6ede2a --- /dev/null +++ b/assets/theme.css @@ -0,0 +1,51 @@ +:root { + --bg-color: #ffffff; + --text-color: #333333; + --sidebar-bg: #f3f3f3; + --sidebar-width: 240px; +} +[data-theme="dark"] { + --bg-color: #222222; + --text-color: #eeeeee; + --sidebar-bg: #333333; +} +body { + margin: 0; + background: var(--bg-color); + color: var(--text-color); + font-family: Arial, sans-serif; +} +.header { + display: flex; + align-items: center; + padding: 0.5rem 1rem; + background: var(--sidebar-bg); +} +.logo { text-decoration: none; color: var(--text-color); font-weight: bold; } +.sidebar-toggle, +.theme-toggle { background: none; border: none; font-size: 1.2rem; margin-right: 1rem; cursor: pointer; } +.container { display: flex; } +.sidebar { + width: var(--sidebar-width); + background: var(--sidebar-bg); + padding: 1rem; +} +.sidebar ul { list-style: none; padding: 0; } +.sidebar a { text-decoration: none; color: var(--text-color); } +main { + flex: 1; + padding: 1rem; +} +.breadcrumbs a { color: var(--text-color); text-decoration: none; } +@media (max-width: 768px) { + .sidebar { + position: fixed; + left: -100%; + top: 0; + height: 100%; + overflow-y: auto; + transition: left 0.3s ease; + z-index: 1000; + } + body.sidebar-open .sidebar { left: 0; } +} diff --git a/assets/theme.js b/assets/theme.js new file mode 100644 index 0000000..162bc88 --- /dev/null +++ b/assets/theme.js @@ -0,0 +1,33 @@ +document.addEventListener('DOMContentLoaded', () => { + const sidebarToggle = document.getElementById('sidebar-toggle'); + const themeToggle = document.getElementById('theme-toggle'); + const root = document.documentElement; + + function setTheme(theme) { + root.dataset.theme = theme; + localStorage.setItem('theme', theme); + } + const stored = localStorage.getItem('theme'); + if (stored) setTheme(stored); + + sidebarToggle?.addEventListener('click', () => { + document.body.classList.toggle('sidebar-open'); + }); + + themeToggle?.addEventListener('click', () => { + const next = root.dataset.theme === 'dark' ? 'light' : 'dark'; + setTheme(next); + }); + + // breadcrumbs + const bc = document.getElementById('breadcrumbs'); + if (bc) { + const parts = location.pathname.split('/').filter(Boolean); + let path = ''; + bc.innerHTML = 'Home'; + parts.forEach((p) => { + path += '/' + p; + bc.innerHTML += ' / ' + p.replace(/-/g, ' ') + ''; + }); + } +}); diff --git a/src/generator/index.js b/src/generator/index.js index 3af63e5..4b7554d 100644 --- a/src/generator/index.js +++ b/src/generator/index.js @@ -88,7 +88,11 @@ async function generate({ contentDir = 'content', outputDir = '_site', configPat const elev = new Eleventy(contentDir, outputDir); elev.setConfig({ - dir: { input: contentDir, output: outputDir }, + dir: { + input: contentDir, + output: outputDir, + includes: path.relative(contentDir, 'templates') + }, templateFormats: ['md', 'njk'], markdownTemplateEngine: 'njk', htmlTemplateEngine: 'njk', @@ -97,6 +101,8 @@ async function generate({ contentDir = 'content', outputDir = '_site', configPat elev.configFunction = function(eleventyConfig) { eleventyConfig.addGlobalData('navigation', nav); eleventyConfig.addGlobalData('config', config); + eleventyConfig.addGlobalData('layout', 'layout.njk'); + eleventyConfig.addPassthroughCopy({ 'assets': 'assets' }); }; await elev.write(); diff --git a/templates/layout.njk b/templates/layout.njk new file mode 100644 index 0000000..7f96dca --- /dev/null +++ b/templates/layout.njk @@ -0,0 +1,21 @@ + + +
+ + +