@mgks/docmd 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ name: Publish Package to NPM and GitHub Packages
2
2
 
3
3
  on:
4
4
  release:
5
- types: [created, published] # Triggers when a new GitHub Release is created or published
5
+ types: [created] # [created, published] Triggers when a new GitHub Release is created or published
6
6
  workflow_dispatch: # Allows manual triggering for testing
7
7
 
8
8
  jobs:
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  <p align="center">
13
13
  <a href="https://www.npmjs.com/package/@mgks/docmd"><img src="https://img.shields.io/npm/v/@mgks/docmd.svg" alt="npm version"></a>
14
- <a href="https://www.npmjs.com/package/@mgks/docmd"><img src="https://img.shields.io/npm/dm/@mgks/docmd.svg" alt="npm downloads"></a>
14
+ <a href="https://www.npmjs.com/package/@mgks/docmd"><img src="https://img.shields.io/npm/d18m/@mgks/docmd.svg" alt="npm downloads"></a>
15
15
  <a href="https://github.com/mgks/docmd/blob/main/LICENSE"><img src="https://img.shields.io/github/license/mgks/docmd.svg" alt="license"></a>
16
16
  </p>
17
17
 
@@ -24,6 +24,8 @@ Docmd (`docmd`) is a Node.js command-line tool dedicated to generating beautiful
24
24
  - 🚀 **Fast & Lightweight** - Static site generation with minimal JS
25
25
  - 🧩 **Custom Components** - Callouts, cards, steps, and more
26
26
  - 🔌 **Built-in Plugins** - SEO, Analytics, and Sitemap support
27
+ - 🎭 **No-Style Pages** - Create custom standalone pages with complete HTML control
28
+ - 🖌️ **Custom Styling** - Add custom CSS/JS and HTML directly in frontmatter
27
29
  - 💻 **Simple CLI** - Easy `init`, `dev`, and `build` commands
28
30
  - 🌐 **Deploy Anywhere** - Deploy the generated sites anywhere (GitHub Pages, Netlify, Vercel, etc.).
29
31
 
@@ -0,0 +1,362 @@
1
+ :root {
2
+ --primary-color: #047bf1;
3
+ --primary-hover: #026ed9;
4
+ --text-color: #333;
5
+ --text-light: #666;
6
+ --bg-color: #fff;
7
+ --bg-secondary: #f8f9fa;
8
+ --border-color: #eaeaea;
9
+ --shadow-color: rgba(0, 0, 0, 0.08);
10
+ --container-padding: 5rem;
11
+ }
12
+
13
+ @media (prefers-color-scheme: dark) {
14
+ :root {
15
+ --primary-color: #047bf1;
16
+ --primary-hover: #026ed9;
17
+ --text-color: #e0e0e0;
18
+ --text-light: #aaa;
19
+ --bg-color: #121212;
20
+ --bg-secondary: #1e1e1e;
21
+ --border-color: #333;
22
+ --shadow-color: rgba(0, 0, 0, 0.3);
23
+ }
24
+ }
25
+
26
+ [data-theme="light"] {
27
+ --primary-color: #047bf1;
28
+ --primary-hover: #026ed9;
29
+ --text-color: #333;
30
+ --text-light: #666;
31
+ --bg-color: #fff;
32
+ --bg-secondary: #f8f9fa;
33
+ --border-color: #eaeaea;
34
+ --shadow-color: rgba(0, 0, 0, 0.35);
35
+
36
+ }
37
+
38
+ [data-theme="dark"] {
39
+ --primary-color: #1955b6;
40
+ --primary-hover: #084dbd;
41
+ --text-color: #e0e0e0;
42
+ --text-light: #aaa;
43
+ --bg-color: #121212;
44
+ --bg-secondary: #1e1e1e;
45
+ --border-color: #333;
46
+ --shadow-color: rgba(0, 0, 0, 0.87);
47
+
48
+ }
49
+
50
+ * {
51
+ margin: 0;
52
+ padding: 0;
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ body {
57
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
58
+ line-height: 1.5;
59
+ color: var(--text-color);
60
+ background-color: var(--bg-color);
61
+ height: 100vh;
62
+ display: flex;
63
+ overflow: hidden;
64
+ }
65
+
66
+ .landing-container {
67
+ display: flex;
68
+ width: 100%;
69
+ height: 100%;
70
+ padding: 0 var(--container-padding);
71
+ max-width: 1600px;
72
+ margin: 0 auto;
73
+ }
74
+
75
+ .content-side {
76
+ flex: 1;
77
+ padding: 3rem 2rem 3rem 0;
78
+ display: flex;
79
+ flex-direction: column;
80
+ justify-content: center;
81
+
82
+ }
83
+
84
+ .preview-side {
85
+ flex: 1;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: flex-start;
89
+ position: relative;
90
+ overflow: visible;
91
+ }
92
+
93
+ .header-top {
94
+ position: absolute;
95
+ top: 2rem;
96
+ right: 3rem;
97
+ z-index: 100;
98
+
99
+ }
100
+
101
+ .theme-toggle {
102
+ background: var(--bg-secondary);
103
+ border: 1px solid var(--border-color);
104
+ color: var(--text-color);
105
+ width: 40px;
106
+ height: 40px;
107
+ border-radius: 50%;
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ cursor: pointer;
112
+ transition: all 0.2s ease;
113
+ }
114
+
115
+ .theme-toggle:hover {
116
+ background: var(--border-color);
117
+ }
118
+
119
+ .logo {
120
+ margin-bottom: 1.5rem;
121
+ display: flex;
122
+ align-items: center;
123
+ }
124
+
125
+ .logo svg {
126
+ height: 48px;
127
+ width: auto;
128
+ }
129
+
130
+ .logo-text {
131
+ font-family: 'PT Mono', monospace;
132
+ font-weight: 700;
133
+ font-size: 2em;
134
+ margin-left: .25em;
135
+
136
+ }
137
+
138
+ h1 {
139
+ font-size: 3rem;
140
+ font-weight: 700;
141
+ margin-bottom: 1rem;
142
+ letter-spacing: -0.02em;
143
+ }
144
+
145
+ .tagline {
146
+ font-size: 1.25rem;
147
+ color: var(--text-light);
148
+ margin-bottom: 2rem;
149
+ font-weight: 400;
150
+ }
151
+
152
+ .features {
153
+ display: grid;
154
+ grid-template-columns: repeat(2, 1fr);
155
+ gap: 1.5rem;
156
+ margin-bottom: 2rem;
157
+ }
158
+
159
+ .feature {
160
+ display: flex;
161
+ align-items: flex-start;
162
+ gap: 0.75rem;
163
+ }
164
+
165
+ .feature-icon {
166
+ background-color: var(--primary-color);
167
+ color: white;
168
+ width: 32px;
169
+ height: 32px;
170
+ border-radius: 6px;
171
+ display: flex;
172
+ align-items: center;
173
+ justify-content: center;
174
+ flex-shrink: 0;
175
+ }
176
+
177
+ .feature-text {
178
+ font-size: 0.9rem;
179
+ }
180
+
181
+ .feature-text strong {
182
+ display: block;
183
+ margin-bottom: 0.25rem;
184
+ }
185
+
186
+ .buttons {
187
+ display: flex;
188
+ gap: 1rem;
189
+ margin-bottom: 2rem;
190
+ }
191
+
192
+ .btn {
193
+ display: inline-flex;
194
+ align-items: center;
195
+ gap: 0.5rem;
196
+ padding: 0.75rem 1.5rem;
197
+ border-radius: 8px;
198
+ font-weight: 600;
199
+ font-size: 1rem;
200
+ text-decoration: none;
201
+ transition: all 0.2s ease;
202
+ }
203
+
204
+ .btn-primary {
205
+ background-color: var(--primary-color);
206
+ color: white;
207
+ border: none;
208
+ }
209
+
210
+ .btn-primary:hover {
211
+ background-color: var(--primary-hover);
212
+ }
213
+
214
+ .btn-secondary {
215
+ background-color: var(--bg-secondary);
216
+ color: var(--text-color);
217
+ border: 1px solid var(--border-color);
218
+ }
219
+
220
+ .btn-secondary:hover {
221
+ background-color: var(--border-color);
222
+ }
223
+
224
+ .social-links {
225
+ display: flex;
226
+ gap: 1rem;
227
+ padding: 0 .25em;
228
+
229
+ }
230
+
231
+ .social-link {
232
+ color: var(--text-light);
233
+ transition: color 0.2s ease;
234
+ }
235
+
236
+ .social-link:hover {
237
+ color: var(--primary-color);
238
+ }
239
+
240
+ .preview-stack {
241
+ position: relative;
242
+ width: 100%;
243
+ height: 400px;
244
+ transform: translateX(15%);
245
+ perspective: 1000px;
246
+
247
+ }
248
+
249
+ .preview-image {
250
+ position: absolute;
251
+ width: 100%;
252
+ max-width: 700px;
253
+ height: 400px;
254
+ border-radius: 20px;
255
+ box-shadow: 0 25px 50px -12px var(--shadow-color);
256
+ transition: all 0.3s ease;
257
+ overflow: hidden;
258
+
259
+ }
260
+
261
+ .preview-image img {
262
+ width: 100%;
263
+ height: 100%;
264
+ object-fit: cover;
265
+ object-position: left top;
266
+ border-radius: 8px;
267
+ pointer-events: none;
268
+ }
269
+
270
+ .preview-image.top {
271
+ z-index: 3;
272
+ transform: rotate(3deg) translateY(-10%) translateX(7%);
273
+
274
+ }
275
+
276
+ .preview-image.middle {
277
+ z-index: 2;
278
+ transform: rotate(-3deg) translateY(1%) translateX(-2%);
279
+
280
+ }
281
+
282
+ .preview-image.bottom {
283
+ z-index: 1;
284
+ transform: rotate(-8deg) translateY(10%) translateX(-10%);
285
+
286
+ }
287
+
288
+ body[data-theme="light"] .preview-image .light-img {
289
+ display: block;
290
+ }
291
+
292
+ body[data-theme="light"] .preview-image .dark-img {
293
+ display: none;
294
+ }
295
+
296
+ body[data-theme="dark"] .preview-image .light-img {
297
+ display: none;
298
+
299
+ }
300
+
301
+ body[data-theme="dark"] .preview-image .dark-img {
302
+ display: block;
303
+ }
304
+
305
+ @media (max-width: 1400px) {
306
+ :root {
307
+ --container-padding: 3rem;
308
+ }
309
+
310
+ .preview-stack {
311
+ transform: translateX(15%);
312
+ }
313
+ }
314
+
315
+ @media (max-width: 1200px) {
316
+ :root {
317
+ --container-padding: 2rem;
318
+ }
319
+
320
+ .preview-side {
321
+ display: none;
322
+ }
323
+
324
+ .content-side {
325
+ max-width: 100%;
326
+ padding: 3rem 0;
327
+ }
328
+
329
+ .header-top {
330
+ right: 2rem;
331
+ }
332
+ }
333
+
334
+ @media (max-width: 768px) {
335
+ :root {
336
+ --container-padding: 1.5rem;
337
+ }
338
+
339
+ .content-side {
340
+ padding: 2rem 0;
341
+ }
342
+
343
+ h1 {
344
+ font-size: 2.5rem;
345
+ }
346
+
347
+ .features {
348
+ grid-template-columns: 1fr;
349
+ }
350
+
351
+ .buttons {
352
+ flex-direction: column;
353
+ }
354
+
355
+ .header-top {
356
+ right: 1.5rem;
357
+ }
358
+ }
359
+ .social-links .lucide-heart-handshake {
360
+ color: rgb(205, 39, 39);
361
+
362
+ }
Binary file
Binary file
Binary file
package/bin/docmd.js CHANGED
@@ -30,7 +30,8 @@ program
30
30
  .command('build')
31
31
  .description('Build the static site from Markdown files and config.js')
32
32
  .option('-c, --config <path>', 'Path to config.js file', 'config.js')
33
- .option('-p, --preserve', 'Preserve existing asset files instead of updating them', false)
33
+ .option('-p, --preserve', 'Preserve existing asset files instead of updating them')
34
+ .option('--no-preserve', 'Force update all asset files, overwriting existing ones')
34
35
  .action(async (options) => {
35
36
  try {
36
37
  console.log('🚀 Starting build process...');
@@ -49,7 +50,8 @@ program
49
50
  .command('dev')
50
51
  .description('Start a live preview development server')
51
52
  .option('-c, --config <path>', 'Path to config.js file', 'config.js')
52
- .option('-p, --preserve', 'Preserve existing asset files instead of updating them', false)
53
+ .option('-p, --preserve', 'Preserve existing asset files instead of updating them')
54
+ .option('--no-preserve', 'Force update all asset files, overwriting existing ones')
53
55
  .action(async (options) => {
54
56
  try {
55
57
  await startDevServer(options.config, { preserve: options.preserve });
package/config.js CHANGED
@@ -31,7 +31,7 @@ module.exports = {
31
31
 
32
32
  // Custom JavaScript Files
33
33
  customJs: [ // Array of paths to custom JS files, loaded at end of body
34
- '/assets/js/docmd-image-lightbox.js', // Image lightbox functionality
34
+ // '/assets/js/docmd-image-lightbox.js', // Image lightbox functionality (commented out)
35
35
  ],
36
36
 
37
37
  // Plugins Configuration (Object format)
@@ -77,7 +77,8 @@ module.exports = {
77
77
  // Navigation Structure (Sidebar)
78
78
  // Icons are kebab-case names from Lucide Icons (https://lucide.dev/)
79
79
  navigation: [
80
- { title: 'Home', path: '/', icon: 'home' },
80
+ { title: 'Welcome', path: '/', icon: 'feather' },
81
+ { title: 'Overview', path: '/overview', icon: 'home' },
81
82
  {
82
83
  title: 'Getting Started',
83
84
  icon: 'rocket',
@@ -96,6 +97,8 @@ module.exports = {
96
97
  { title: 'Markdown Syntax', path: '/content/markdown-syntax', icon: 'code-2' },
97
98
  { title: 'Images', path: '/content/images', icon: 'image' },
98
99
  { title: 'Custom Containers', path: '/content/custom-containers', icon: 'box' },
100
+ { title: 'No-Style Pages', path: '/content/no-style-pages', icon: 'layout' },
101
+ { title: 'No-Style Example', path: '/content/no-style-example', icon: 'sparkles' },
99
102
  ],
100
103
  },
101
104
  { title: 'Configuration', path: '/configuration', icon: 'settings' },
@@ -0,0 +1,110 @@
1
+ ---
2
+ title: "No-Style Page Example"
3
+ description: "An example of a page using the no-style feature"
4
+ noStyle: true
5
+ components:
6
+ meta: true
7
+ favicon: true
8
+ css: true
9
+ theme: true
10
+ scripts: true
11
+ customHead: |
12
+ <style>
13
+ body {
14
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
15
+ margin: 0;
16
+ padding: 0;
17
+ line-height: 1.6;
18
+ }
19
+ .container {
20
+ max-width: 800px;
21
+ margin: 0 auto;
22
+ padding: 40px 20px;
23
+ }
24
+ .header {
25
+ text-align: center;
26
+ margin-bottom: 40px;
27
+ }
28
+ .header h1 {
29
+ font-size: 3rem;
30
+ margin-bottom: 10px;
31
+ color: #4a6cf7;
32
+ }
33
+ .header p {
34
+ font-size: 1.2rem;
35
+ color: #666;
36
+ }
37
+ .content {
38
+ background-color: #f8f9fa;
39
+ padding: 30px;
40
+ border-radius: 8px;
41
+ box-shadow: 0 2px 10px rgba(0,0,0,0.05);
42
+ }
43
+ .button {
44
+ display: inline-block;
45
+ padding: 12px 24px;
46
+ background-color: #4a6cf7;
47
+ color: white;
48
+ text-decoration: none;
49
+ border-radius: 4px;
50
+ font-weight: 600;
51
+ margin-top: 20px;
52
+ }
53
+ .button:hover {
54
+ background-color: #3a5ce4;
55
+ }
56
+ [data-theme="dark"] {
57
+ color-scheme: dark;
58
+ }
59
+ [data-theme="dark"] body {
60
+ background-color: #121212;
61
+ color: #e0e0e0;
62
+ }
63
+ [data-theme="dark"] .content {
64
+ background-color: #1e1e1e;
65
+ box-shadow: 0 2px 10px rgba(0,0,0,0.2);
66
+ }
67
+ [data-theme="dark"] .header p {
68
+ color: #aaa;
69
+ }
70
+ </style>
71
+ bodyClass: "no-style-example"
72
+ ---
73
+
74
+ <div class="container">
75
+ <div class="header">
76
+ <h1>No-Style Page Example</h1>
77
+ <p>This page demonstrates the no-style feature with a custom layout</p>
78
+ </div>
79
+
80
+ <div class="content">
81
+ <h2>What is this page?</h2>
82
+ <p>
83
+ This is an example page that uses the <code>noStyle: true</code> frontmatter option to create a completely custom page layout.
84
+ Unlike regular documentation pages, this page doesn't use the standard docmd layout with sidebar navigation and table of contents.
85
+ </p>
86
+
87
+ <h2>How does it work?</h2>
88
+ <p>
89
+ The <code>noStyle</code> option tells docmd to use a special template that only includes the components you explicitly request
90
+ via the <code>components</code> object in frontmatter. This gives you complete control over the page structure.
91
+ </p>
92
+
93
+ <h2>Features enabled on this page:</h2>
94
+ <ul>
95
+ <li><strong>meta</strong>: Meta tags, title, and description for SEO</li>
96
+ <li><strong>favicon</strong>: The site favicon</li>
97
+ <li><strong>css</strong>: Basic CSS for markdown content</li>
98
+ <li><strong>theme</strong>: Theme support for light/dark mode</li>
99
+ <li><strong>scripts</strong>: JavaScript for functionality</li>
100
+ </ul>
101
+
102
+ <h2>Custom styling</h2>
103
+ <p>
104
+ This page includes custom CSS in the <code>customHead</code> frontmatter field. This allows you to define page-specific styles
105
+ without affecting the rest of your site.
106
+ </p>
107
+
108
+ <a href="/content/no-style-pages" class="button">Get Back to No-Style Pages Documentation</a>
109
+ </div>
110
+ </div>