markdown-notes-engine 1.0.0

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.
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Markdown Notes Engine - Frontend Styles
3
+ */
4
+
5
+ .notes-container {
6
+ display: flex;
7
+ height: 100vh;
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
9
+ background: #f5f5f5;
10
+ color: #333;
11
+ }
12
+
13
+ /* Sidebar */
14
+ .notes-sidebar {
15
+ width: 300px;
16
+ background: #2c3e50;
17
+ color: white;
18
+ display: flex;
19
+ flex-direction: column;
20
+ overflow: hidden;
21
+ border-right: 1px solid #34495e;
22
+ }
23
+
24
+ .notes-toolbar {
25
+ padding: 15px;
26
+ display: flex;
27
+ gap: 8px;
28
+ background: #34495e;
29
+ border-bottom: 1px solid #2c3e50;
30
+ }
31
+
32
+ .notes-search-input {
33
+ width: calc(100% - 30px);
34
+ margin: 15px;
35
+ padding: 10px;
36
+ border: none;
37
+ border-radius: 4px;
38
+ font-size: 14px;
39
+ background: #34495e;
40
+ color: white;
41
+ }
42
+
43
+ .notes-search-input::placeholder {
44
+ color: #95a5a6;
45
+ }
46
+
47
+ .notes-file-tree {
48
+ flex: 1;
49
+ overflow-y: auto;
50
+ padding: 10px;
51
+ }
52
+
53
+ .notes-tree-item {
54
+ padding: 8px 12px;
55
+ margin: 2px 0;
56
+ cursor: pointer;
57
+ border-radius: 4px;
58
+ transition: background 0.2s;
59
+ font-size: 14px;
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 5px;
63
+ }
64
+
65
+ .notes-tree-item:hover {
66
+ background: #34495e;
67
+ }
68
+
69
+ .notes-tree-item.active {
70
+ background: #3498db;
71
+ }
72
+
73
+ .notes-tree-toggle {
74
+ width: 12px;
75
+ display: inline-block;
76
+ text-align: center;
77
+ font-size: 10px;
78
+ }
79
+
80
+ .notes-tree-icon {
81
+ font-size: 14px;
82
+ }
83
+
84
+ .notes-tree-folder {
85
+ font-weight: 500;
86
+ }
87
+
88
+ .notes-tree-children {
89
+ margin-left: 0;
90
+ }
91
+
92
+ /* Main Content */
93
+ .notes-main {
94
+ flex: 1;
95
+ display: flex;
96
+ flex-direction: column;
97
+ overflow: hidden;
98
+ }
99
+
100
+ .notes-header {
101
+ display: flex;
102
+ gap: 10px;
103
+ padding: 15px;
104
+ background: white;
105
+ border-bottom: 1px solid #ddd;
106
+ align-items: center;
107
+ }
108
+
109
+ .notes-path-input {
110
+ flex: 1;
111
+ padding: 10px;
112
+ border: 1px solid #ddd;
113
+ border-radius: 4px;
114
+ font-size: 14px;
115
+ }
116
+
117
+ .notes-actions {
118
+ display: flex;
119
+ gap: 8px;
120
+ }
121
+
122
+ .notes-btn {
123
+ padding: 8px 16px;
124
+ border: none;
125
+ border-radius: 4px;
126
+ background: #3498db;
127
+ color: white;
128
+ cursor: pointer;
129
+ font-size: 14px;
130
+ transition: background 0.2s;
131
+ }
132
+
133
+ .notes-btn:hover {
134
+ background: #2980b9;
135
+ }
136
+
137
+ .notes-btn-danger {
138
+ background: #e74c3c;
139
+ }
140
+
141
+ .notes-btn-danger:hover {
142
+ background: #c0392b;
143
+ }
144
+
145
+ /* Editor and Preview */
146
+ .notes-content {
147
+ flex: 1;
148
+ display: flex;
149
+ overflow: hidden;
150
+ }
151
+
152
+ .notes-editor,
153
+ .notes-preview {
154
+ flex: 1;
155
+ overflow: hidden;
156
+ display: flex;
157
+ flex-direction: column;
158
+ }
159
+
160
+ .notes-editor-textarea {
161
+ flex: 1;
162
+ width: 100%;
163
+ padding: 20px;
164
+ border: none;
165
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
166
+ font-size: 14px;
167
+ line-height: 1.6;
168
+ resize: none;
169
+ outline: none;
170
+ overflow-y: auto;
171
+ }
172
+
173
+ .notes-preview {
174
+ border-left: 1px solid #ddd;
175
+ background: white;
176
+ }
177
+
178
+ .notes-preview-content {
179
+ flex: 1;
180
+ padding: 20px;
181
+ overflow-y: auto;
182
+ }
183
+
184
+ .notes-preview-content img {
185
+ max-width: 100%;
186
+ height: auto;
187
+ }
188
+
189
+ .notes-preview-content video {
190
+ max-width: 100%;
191
+ height: auto;
192
+ }
193
+
194
+ .notes-preview-content pre {
195
+ background: #f4f4f4;
196
+ padding: 15px;
197
+ border-radius: 4px;
198
+ overflow-x: auto;
199
+ }
200
+
201
+ .notes-preview-content code {
202
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
203
+ font-size: 13px;
204
+ }
205
+
206
+ .notes-preview-content h1 {
207
+ font-size: 2em;
208
+ margin: 0.67em 0;
209
+ border-bottom: 2px solid #eee;
210
+ padding-bottom: 0.3em;
211
+ }
212
+
213
+ .notes-preview-content h2 {
214
+ font-size: 1.5em;
215
+ margin: 0.75em 0;
216
+ border-bottom: 1px solid #eee;
217
+ padding-bottom: 0.3em;
218
+ }
219
+
220
+ .notes-preview-content h3 {
221
+ font-size: 1.17em;
222
+ margin: 0.83em 0;
223
+ }
224
+
225
+ .notes-preview-content p {
226
+ margin: 1em 0;
227
+ }
228
+
229
+ .notes-preview-content ul,
230
+ .notes-preview-content ol {
231
+ margin: 1em 0;
232
+ padding-left: 2em;
233
+ }
234
+
235
+ .notes-preview-content blockquote {
236
+ margin: 1em 0;
237
+ padding-left: 1em;
238
+ border-left: 4px solid #ddd;
239
+ color: #666;
240
+ }
241
+
242
+ .notes-preview-content a {
243
+ color: #3498db;
244
+ text-decoration: none;
245
+ }
246
+
247
+ .notes-preview-content a:hover {
248
+ text-decoration: underline;
249
+ }
250
+
251
+ .notes-preview-content .internal-link {
252
+ color: #3498db;
253
+ cursor: pointer;
254
+ text-decoration: none;
255
+ border-bottom: 1px dashed #3498db;
256
+ }
257
+
258
+ .notes-preview-content .internal-link:hover {
259
+ color: #2980b9;
260
+ border-bottom: 1px solid #2980b9;
261
+ text-decoration: none;
262
+ }
263
+
264
+ /* Dark Mode */
265
+ .notes-dark-mode {
266
+ background: #1e1e1e;
267
+ color: #d4d4d4;
268
+ }
269
+
270
+ .notes-dark-mode .notes-main {
271
+ background: #1e1e1e;
272
+ }
273
+
274
+ .notes-dark-mode .notes-header {
275
+ background: #2d2d30;
276
+ border-bottom-color: #3e3e42;
277
+ }
278
+
279
+ .notes-dark-mode .notes-path-input {
280
+ background: #3e3e42;
281
+ border-color: #3e3e42;
282
+ color: #d4d4d4;
283
+ }
284
+
285
+ .notes-dark-mode .notes-editor-textarea {
286
+ background: #1e1e1e;
287
+ color: #d4d4d4;
288
+ }
289
+
290
+ .notes-dark-mode .notes-preview {
291
+ background: #1e1e1e;
292
+ border-left-color: #3e3e42;
293
+ }
294
+
295
+ .notes-dark-mode .notes-preview-content {
296
+ color: #d4d4d4;
297
+ }
298
+
299
+ .notes-dark-mode .notes-preview-content pre {
300
+ background: #2d2d30;
301
+ }
302
+
303
+ .notes-dark-mode .notes-preview-content code {
304
+ background: #2d2d30;
305
+ color: #d4d4d4;
306
+ }
307
+
308
+ .notes-dark-mode .notes-preview-content h1,
309
+ .notes-dark-mode .notes-preview-content h2,
310
+ .notes-dark-mode .notes-preview-content h3,
311
+ .notes-dark-mode .notes-preview-content h4,
312
+ .notes-dark-mode .notes-preview-content h5,
313
+ .notes-dark-mode .notes-preview-content h6 {
314
+ color: #e8e8e8;
315
+ border-bottom-color: #3e3e42;
316
+ }
317
+
318
+ .notes-dark-mode .notes-preview-content p,
319
+ .notes-dark-mode .notes-preview-content li {
320
+ color: #d4d4d4;
321
+ }
322
+
323
+ .notes-dark-mode .notes-preview-content blockquote {
324
+ border-left-color: #3e3e42;
325
+ color: #a0a0a0;
326
+ }
327
+
328
+ .notes-dark-mode .notes-preview-content a {
329
+ color: #4db8ff;
330
+ }
331
+
332
+ .notes-dark-mode .notes-preview-content a:hover {
333
+ color: #80ccff;
334
+ }
335
+
336
+ .notes-dark-mode .notes-preview-content .internal-link {
337
+ color: #4db8ff;
338
+ border-bottom-color: #4db8ff;
339
+ }
340
+
341
+ .notes-dark-mode .notes-preview-content .internal-link:hover {
342
+ color: #80ccff;
343
+ border-bottom-color: #80ccff;
344
+ }
345
+
346
+ /* Responsive */
347
+ @media (max-width: 768px) {
348
+ .notes-sidebar {
349
+ position: fixed;
350
+ left: -300px;
351
+ top: 0;
352
+ z-index: 1000;
353
+ height: 100vh;
354
+ transition: left 0.3s;
355
+ box-shadow: 2px 0 8px rgba(0, 0, 0, 0.3);
356
+ }
357
+
358
+ .notes-sidebar.mobile-active {
359
+ left: 0;
360
+ }
361
+
362
+ .notes-header {
363
+ flex-wrap: wrap;
364
+ gap: 5px;
365
+ padding: 10px;
366
+ }
367
+
368
+ .notes-path-input {
369
+ font-size: 12px;
370
+ padding: 8px;
371
+ }
372
+
373
+ .notes-actions {
374
+ flex-wrap: wrap;
375
+ }
376
+
377
+ .notes-btn {
378
+ padding: 6px 10px;
379
+ font-size: 12px;
380
+ }
381
+
382
+ .notes-toolbar {
383
+ padding: 10px;
384
+ }
385
+
386
+ .notes-toolbar .notes-btn {
387
+ font-size: 11px;
388
+ padding: 6px 8px;
389
+ }
390
+
391
+ /* Hide button text on mobile, keep icons */
392
+ .notes-btn span.btn-text {
393
+ display: none;
394
+ }
395
+
396
+ /* Adjust editor/preview for mobile */
397
+ .notes-content {
398
+ flex-direction: column;
399
+ }
400
+
401
+ .notes-editor,
402
+ .notes-preview {
403
+ width: 100% !important;
404
+ }
405
+ }
406
+
407
+ @media (max-width: 480px) {
408
+ .notes-header {
409
+ padding: 8px;
410
+ }
411
+
412
+ .notes-path-input {
413
+ font-size: 11px;
414
+ padding: 6px;
415
+ }
416
+
417
+ .notes-btn {
418
+ padding: 5px 8px;
419
+ font-size: 11px;
420
+ }
421
+
422
+ .notes-editor-textarea {
423
+ padding: 10px;
424
+ font-size: 13px;
425
+ }
426
+
427
+ .notes-preview-content {
428
+ padding: 10px;
429
+ font-size: 14px;
430
+ }
431
+ }
package/lib/index.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Markdown Notes Engine
3
+ *
4
+ * A complete markdown note-taking solution with GitHub integration
5
+ * and media hosting (R2/S3).
6
+ *
7
+ * @module markdown-notes-engine
8
+ */
9
+
10
+ // Backend exports
11
+ const { createNotesRouter } = require('./backend/index');
12
+ const { GitHubClient } = require('./backend/github');
13
+ const { StorageClient } = require('./backend/storage');
14
+ const { MarkdownRenderer } = require('./backend/markdown');
15
+
16
+ // Frontend exports
17
+ const { NotesEditor } = require('./frontend/index');
18
+
19
+ module.exports = {
20
+ // Backend
21
+ createNotesRouter,
22
+ GitHubClient,
23
+ StorageClient,
24
+ MarkdownRenderer,
25
+
26
+ // Frontend
27
+ NotesEditor
28
+ };
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "markdown-notes-engine",
3
+ "version": "1.0.0",
4
+ "description": "A complete markdown note-taking engine with GitHub integration and media hosting (R2/S3)",
5
+ "main": "lib/index.js",
6
+ "scripts": {
7
+ "start": "node server.js",
8
+ "dev": "nodemon server.js",
9
+ "test": "echo \"Error: no test specified\" && exit 1"
10
+ },
11
+ "keywords": [
12
+ "markdown",
13
+ "notes",
14
+ "github",
15
+ "editor",
16
+ "r2",
17
+ "s3",
18
+ "cloudflare",
19
+ "note-taking"
20
+ ],
21
+ "author": "Cameron Thompson",
22
+ "license": "MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/cdthomp1/notes"
26
+ },
27
+ "files": [
28
+ "lib/**/*",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "dependencies": {
33
+ "@aws-sdk/client-s3": "^3.928.0",
34
+ "@octokit/rest": "^22.0.1",
35
+ "express": "^5.1.0",
36
+ "express-fileupload": "^1.5.2",
37
+ "highlight.js": "^11.11.1",
38
+ "marked": "^17.0.0",
39
+ "marked-highlight": "^2.2.3"
40
+ },
41
+ "devDependencies": {
42
+ "dotenv": "^17.2.3",
43
+ "nodemon": "^3.1.11"
44
+ },
45
+ "peerDependencies": {
46
+ "express": "^4.0.0 || ^5.0.0"
47
+ },
48
+ "engines": {
49
+ "node": ">=16.0.0"
50
+ }
51
+ }