@burakboduroglu/penote 3.0.1
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.
- package/AGENTS.md +223 -0
- package/CHANGELOG.md +64 -0
- package/CONTRIBUTING.md +102 -0
- package/Java-Notes/jpa_hibernate.md +168 -0
- package/Java-Notes/lombok.md +41 -0
- package/Java-Notes/readme.md +15 -0
- package/Java-Notes/spring_boot_framework.md +227 -0
- package/Javascript-Notes/async_js.md +82 -0
- package/Javascript-Notes/closures_currying_compose.md +63 -0
- package/Javascript-Notes/javascirpt_array_methods.md +339 -0
- package/Javascript-Notes/readme.md +16 -0
- package/Javascript-Notes/regex_part_1.md +258 -0
- package/LICENSE +21 -0
- package/MongoDB-Notes/mongodb_basic_1.md +1 -0
- package/MongoDB-Notes/readme.md +13 -0
- package/Python-Notes/advanced_python_1.md +142 -0
- package/Python-Notes/advanced_python_2.md +155 -0
- package/Python-Notes/python_basic_1.md +132 -0
- package/Python-Notes/python_basic_2.md +137 -0
- package/Python-Notes/python_basic_3.md +139 -0
- package/Python-Notes/python_db_process.md +126 -0
- package/Python-Notes/readme.md +18 -0
- package/README.md +179 -0
- package/SQL-Notes/psql_on_terminal.md +26 -0
- package/SQL-Notes/readme.md +16 -0
- package/SQL-Notes/sql_advanced_1.md +92 -0
- package/SQL-Notes/sql_basic_1.md +114 -0
- package/SQL-Notes/sql_basic_2.md +92 -0
- package/assets/demo.png +0 -0
- package/assets/penote-logo.svg +34 -0
- package/library/cli.js +1253 -0
- package/library/index.html +475 -0
- package/package.json +57 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="tr">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>penote — Kitaplık</title>
|
|
7
|
+
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cdefs%3E%3ClinearGradient id='p' x1='72' y1='40' x2='440' y2='472' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%23A5B4FC'/%3E%3Cstop offset='0.45' stop-color='%236366F1'/%3E%3Cstop offset='1' stop-color='%233730A3'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='512' height='512' rx='139' fill='url(%23p)'/%3E%3Cg transform='translate(25.6,30) scale(0.9)' fill='none' stroke='%230B1026' stroke-width='44' stroke-linecap='round'%3E%3Cpath d='M108 144 V368'/%3E%3Cpath d='M108 144 A98 78 0 0 1 108 300'/%3E%3Cpath d='M280 300 V206'/%3E%3Cpath d='M280 206 A62 62 0 0 1 404 206 V300'/%3E%3C/g%3E%3Cpath d='M412 62 C412 95 419 102 452 102 C419 102 412 109 412 142 C412 109 405 102 372 102 C405 102 412 95 412 62 Z' fill='%23F8FAFF'/%3E%3C/svg%3E" />
|
|
8
|
+
<style>
|
|
9
|
+
:root {
|
|
10
|
+
--bg: #0f1117;
|
|
11
|
+
--surface: #1a1d27;
|
|
12
|
+
--surface2: #22263a;
|
|
13
|
+
--border: #2e3250;
|
|
14
|
+
--accent: #6c8ef5;
|
|
15
|
+
--accent2: #a78bfa;
|
|
16
|
+
--text: #e2e8f0;
|
|
17
|
+
--muted: #8892b0;
|
|
18
|
+
--tag-java: #f89820;
|
|
19
|
+
--tag-js: #f7df1e;
|
|
20
|
+
--tag-py: #3776ab;
|
|
21
|
+
--tag-sql: #336791;
|
|
22
|
+
--tag-mongo: #4db33d;
|
|
23
|
+
--radius: 10px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
27
|
+
|
|
28
|
+
body {
|
|
29
|
+
font-family: 'Segoe UI', system-ui, sans-serif;
|
|
30
|
+
background: var(--bg);
|
|
31
|
+
color: var(--text);
|
|
32
|
+
min-height: 100vh;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* ── Header ── */
|
|
36
|
+
header {
|
|
37
|
+
background: var(--surface);
|
|
38
|
+
border-bottom: 1px solid var(--border);
|
|
39
|
+
padding: 1.25rem 2rem;
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: space-between;
|
|
43
|
+
gap: 1rem;
|
|
44
|
+
flex-wrap: wrap;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.logo {
|
|
48
|
+
display: flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: 0.55rem;
|
|
51
|
+
font-size: 1.3rem;
|
|
52
|
+
font-weight: 700;
|
|
53
|
+
letter-spacing: -0.5px;
|
|
54
|
+
color: var(--text);
|
|
55
|
+
}
|
|
56
|
+
.logo span { color: var(--accent); }
|
|
57
|
+
.logo svg { display: block; }
|
|
58
|
+
|
|
59
|
+
.search-wrap {
|
|
60
|
+
flex: 1;
|
|
61
|
+
max-width: 420px;
|
|
62
|
+
position: relative;
|
|
63
|
+
}
|
|
64
|
+
.search-wrap input {
|
|
65
|
+
width: 100%;
|
|
66
|
+
background: var(--surface2);
|
|
67
|
+
border: 1px solid var(--border);
|
|
68
|
+
border-radius: var(--radius);
|
|
69
|
+
color: var(--text);
|
|
70
|
+
padding: 0.55rem 1rem 0.55rem 2.4rem;
|
|
71
|
+
font-size: 0.9rem;
|
|
72
|
+
outline: none;
|
|
73
|
+
transition: border-color 0.2s;
|
|
74
|
+
}
|
|
75
|
+
.search-wrap input:focus { border-color: var(--accent); }
|
|
76
|
+
.search-wrap svg {
|
|
77
|
+
position: absolute;
|
|
78
|
+
left: 0.75rem;
|
|
79
|
+
top: 50%;
|
|
80
|
+
transform: translateY(-50%);
|
|
81
|
+
color: var(--muted);
|
|
82
|
+
pointer-events: none;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* ── Layout ── */
|
|
86
|
+
.container {
|
|
87
|
+
max-width: 1100px;
|
|
88
|
+
margin: 0 auto;
|
|
89
|
+
padding: 2rem 1.5rem;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* ── Filter chips ── */
|
|
93
|
+
.filters {
|
|
94
|
+
display: flex;
|
|
95
|
+
gap: 0.5rem;
|
|
96
|
+
flex-wrap: wrap;
|
|
97
|
+
margin-bottom: 1.75rem;
|
|
98
|
+
}
|
|
99
|
+
.chip {
|
|
100
|
+
padding: 0.35rem 0.9rem;
|
|
101
|
+
border-radius: 999px;
|
|
102
|
+
border: 1px solid var(--border);
|
|
103
|
+
background: var(--surface);
|
|
104
|
+
color: var(--muted);
|
|
105
|
+
font-size: 0.8rem;
|
|
106
|
+
cursor: pointer;
|
|
107
|
+
transition: all 0.15s;
|
|
108
|
+
user-select: none;
|
|
109
|
+
}
|
|
110
|
+
.chip:hover { border-color: var(--accent); color: var(--text); }
|
|
111
|
+
.chip.active { background: var(--accent); border-color: var(--accent); color: #fff; }
|
|
112
|
+
|
|
113
|
+
/* ── Section heading ── */
|
|
114
|
+
.section-title {
|
|
115
|
+
font-size: 0.75rem;
|
|
116
|
+
font-weight: 600;
|
|
117
|
+
text-transform: uppercase;
|
|
118
|
+
letter-spacing: 1px;
|
|
119
|
+
color: var(--muted);
|
|
120
|
+
margin-bottom: 0.75rem;
|
|
121
|
+
margin-top: 2rem;
|
|
122
|
+
}
|
|
123
|
+
.section-title:first-of-type { margin-top: 0; }
|
|
124
|
+
|
|
125
|
+
/* ── Cards grid ── */
|
|
126
|
+
.grid {
|
|
127
|
+
display: grid;
|
|
128
|
+
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
129
|
+
gap: 1rem;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.card {
|
|
133
|
+
background: var(--surface);
|
|
134
|
+
border: 1px solid var(--border);
|
|
135
|
+
border-radius: var(--radius);
|
|
136
|
+
padding: 1.1rem 1.25rem;
|
|
137
|
+
display: flex;
|
|
138
|
+
flex-direction: column;
|
|
139
|
+
gap: 0.5rem;
|
|
140
|
+
transition: border-color 0.2s, transform 0.15s;
|
|
141
|
+
text-decoration: none;
|
|
142
|
+
color: inherit;
|
|
143
|
+
}
|
|
144
|
+
.card:hover {
|
|
145
|
+
border-color: var(--accent);
|
|
146
|
+
transform: translateY(-2px);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.card-top {
|
|
150
|
+
display: flex;
|
|
151
|
+
align-items: center;
|
|
152
|
+
gap: 0.6rem;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.tag {
|
|
156
|
+
font-size: 0.68rem;
|
|
157
|
+
font-weight: 700;
|
|
158
|
+
padding: 0.2rem 0.55rem;
|
|
159
|
+
border-radius: 4px;
|
|
160
|
+
text-transform: uppercase;
|
|
161
|
+
letter-spacing: 0.5px;
|
|
162
|
+
}
|
|
163
|
+
.tag-java { background: #f8982022; color: var(--tag-java); }
|
|
164
|
+
.tag-js { background: #f7df1e22; color: #c9b800; }
|
|
165
|
+
.tag-py { background: #3776ab22; color: #6baed6; }
|
|
166
|
+
.tag-sql { background: #33679122; color: #74b0d4; }
|
|
167
|
+
.tag-mongo { background: #4db33d22; color: #6fcf60; }
|
|
168
|
+
|
|
169
|
+
.card-title {
|
|
170
|
+
font-size: 0.95rem;
|
|
171
|
+
font-weight: 600;
|
|
172
|
+
color: var(--text);
|
|
173
|
+
line-height: 1.3;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.card-desc {
|
|
177
|
+
font-size: 0.82rem;
|
|
178
|
+
color: var(--muted);
|
|
179
|
+
line-height: 1.5;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.card-path {
|
|
183
|
+
font-size: 0.72rem;
|
|
184
|
+
color: var(--border);
|
|
185
|
+
font-family: monospace;
|
|
186
|
+
margin-top: auto;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* ── Empty state ── */
|
|
190
|
+
.empty {
|
|
191
|
+
text-align: center;
|
|
192
|
+
padding: 4rem 1rem;
|
|
193
|
+
color: var(--muted);
|
|
194
|
+
display: none;
|
|
195
|
+
}
|
|
196
|
+
.empty svg { margin-bottom: 1rem; opacity: 0.4; }
|
|
197
|
+
|
|
198
|
+
/* ── Footer ── */
|
|
199
|
+
footer {
|
|
200
|
+
text-align: center;
|
|
201
|
+
padding: 2rem;
|
|
202
|
+
color: var(--muted);
|
|
203
|
+
font-size: 0.8rem;
|
|
204
|
+
border-top: 1px solid var(--border);
|
|
205
|
+
margin-top: 3rem;
|
|
206
|
+
}
|
|
207
|
+
footer a { color: var(--accent); text-decoration: none; }
|
|
208
|
+
</style>
|
|
209
|
+
</head>
|
|
210
|
+
<body>
|
|
211
|
+
|
|
212
|
+
<header>
|
|
213
|
+
<div class="logo">
|
|
214
|
+
<!-- assets/penote-logo.svg -->
|
|
215
|
+
<svg width="26" height="26" viewBox="0 0 512 512" aria-hidden="true">
|
|
216
|
+
<defs>
|
|
217
|
+
<linearGradient id="penote-plate" x1="72" y1="40" x2="440" y2="472" gradientUnits="userSpaceOnUse">
|
|
218
|
+
<stop stop-color="#A5B4FC"/><stop offset="0.45" stop-color="#6366F1"/><stop offset="1" stop-color="#3730A3"/>
|
|
219
|
+
</linearGradient>
|
|
220
|
+
</defs>
|
|
221
|
+
<rect width="512" height="512" rx="139" fill="url(#penote-plate)"/>
|
|
222
|
+
<g transform="translate(25.6, 30) scale(0.9)"
|
|
223
|
+
fill="none" stroke="#0B1026" stroke-width="44" stroke-linecap="round">
|
|
224
|
+
<path d="M108 144 V368"/>
|
|
225
|
+
<path d="M108 144 A98 78 0 0 1 108 300"/>
|
|
226
|
+
<path d="M280 300 V206"/>
|
|
227
|
+
<path d="M280 206 A62 62 0 0 1 404 206 V300"/>
|
|
228
|
+
</g>
|
|
229
|
+
<path d="M412 62 C412 95 419 102 452 102 C419 102 412 109 412 142
|
|
230
|
+
C412 109 405 102 372 102 C405 102 412 95 412 62 Z" fill="#F8FAFF"/>
|
|
231
|
+
</svg>
|
|
232
|
+
<div>pe<span>note</span></div>
|
|
233
|
+
</div>
|
|
234
|
+
<div class="search-wrap">
|
|
235
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
236
|
+
<circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
|
|
237
|
+
</svg>
|
|
238
|
+
<input type="text" id="search" placeholder="Not ara…" autocomplete="off" />
|
|
239
|
+
</div>
|
|
240
|
+
</header>
|
|
241
|
+
|
|
242
|
+
<div class="container">
|
|
243
|
+
|
|
244
|
+
<div class="filters" id="filters">
|
|
245
|
+
<div class="chip active" data-filter="all">Tümü</div>
|
|
246
|
+
<div class="chip" data-filter="java">Java</div>
|
|
247
|
+
<div class="chip" data-filter="js">JavaScript</div>
|
|
248
|
+
<div class="chip" data-filter="py">Python</div>
|
|
249
|
+
<div class="chip" data-filter="sql">SQL</div>
|
|
250
|
+
<div class="chip" data-filter="mongo">MongoDB</div>
|
|
251
|
+
</div>
|
|
252
|
+
|
|
253
|
+
<div id="catalog"></div>
|
|
254
|
+
|
|
255
|
+
<div class="empty" id="empty">
|
|
256
|
+
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
257
|
+
<circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/>
|
|
258
|
+
</svg>
|
|
259
|
+
<p>Sonuç bulunamadı.</p>
|
|
260
|
+
</div>
|
|
261
|
+
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<footer>
|
|
265
|
+
Burak Boduroğlu · <a href="../README.md">README.md</a> · Mayıs 2026
|
|
266
|
+
</footer>
|
|
267
|
+
|
|
268
|
+
<script>
|
|
269
|
+
const NOTES = [
|
|
270
|
+
// ── Java ──
|
|
271
|
+
{
|
|
272
|
+
category: "java",
|
|
273
|
+
title: "Lombok",
|
|
274
|
+
desc: "Lombok anotasyonları ve kullanım örnekleri",
|
|
275
|
+
path: "../Java-Notes/lombok.md",
|
|
276
|
+
section: "Java"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
category: "java",
|
|
280
|
+
title: "JPA / Hibernate",
|
|
281
|
+
desc: "Hibernate anotasyonları ve ORM örnekleri",
|
|
282
|
+
path: "../Java-Notes/jpa_hibernate.md",
|
|
283
|
+
section: "Java"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
category: "java",
|
|
287
|
+
title: "Spring Boot",
|
|
288
|
+
desc: "Spring Boot anotasyonları ve uygulama örnekleri",
|
|
289
|
+
path: "../Java-Notes/spring_boot_framework.md",
|
|
290
|
+
section: "Java"
|
|
291
|
+
},
|
|
292
|
+
// ── JavaScript ──
|
|
293
|
+
{
|
|
294
|
+
category: "js",
|
|
295
|
+
title: "Dizi Metodları",
|
|
296
|
+
desc: "map, filter, reduce ve diğer JS dizi metodları",
|
|
297
|
+
path: "../Javascript-Notes/javascirpt_array_methods.md",
|
|
298
|
+
section: "JavaScript"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
category: "js",
|
|
302
|
+
title: "Closure, Currying, Compose",
|
|
303
|
+
desc: "Fonksiyonel JS kavramları",
|
|
304
|
+
path: "../Javascript-Notes/closures_currying_compose.md",
|
|
305
|
+
section: "JavaScript"
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
category: "js",
|
|
309
|
+
title: "Async JS",
|
|
310
|
+
desc: "Fetch API, Promise, async/await",
|
|
311
|
+
path: "../Javascript-Notes/async_js.md",
|
|
312
|
+
section: "JavaScript"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
category: "js",
|
|
316
|
+
title: "Regex (1)",
|
|
317
|
+
desc: "Düzenli ifadeler — temel kalıplar",
|
|
318
|
+
path: "../Javascript-Notes/regex_part_1.md",
|
|
319
|
+
section: "JavaScript"
|
|
320
|
+
},
|
|
321
|
+
// ── Python ──
|
|
322
|
+
{
|
|
323
|
+
category: "py",
|
|
324
|
+
title: "Python Temel 1",
|
|
325
|
+
desc: "Veri yapıları: list, dict, tuple, set",
|
|
326
|
+
path: "../Python-Notes/python_basic_1.md",
|
|
327
|
+
section: "Python"
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
category: "py",
|
|
331
|
+
title: "Python Temel 2",
|
|
332
|
+
desc: "Fonksiyonlar, döngüler, koşullar",
|
|
333
|
+
path: "../Python-Notes/python_basic_2.md",
|
|
334
|
+
section: "Python"
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
category: "py",
|
|
338
|
+
title: "Python Temel 3",
|
|
339
|
+
desc: "Hata yönetimi, dosya işlemleri",
|
|
340
|
+
path: "../Python-Notes/python_basic_3.md",
|
|
341
|
+
section: "Python"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
category: "py",
|
|
345
|
+
title: "Python İleri 1",
|
|
346
|
+
desc: "List / dict / set comprehension",
|
|
347
|
+
path: "../Python-Notes/advanced_python_1.md",
|
|
348
|
+
section: "Python"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
category: "py",
|
|
352
|
+
title: "Python İleri 2",
|
|
353
|
+
desc: "map, filter, reduce, lambda",
|
|
354
|
+
path: "../Python-Notes/advanced_python_2.md",
|
|
355
|
+
section: "Python"
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
category: "py",
|
|
359
|
+
title: "Python Veritabanı",
|
|
360
|
+
desc: "psycopg2, SQLite, veritabanı işlemleri",
|
|
361
|
+
path: "../Python-Notes/python_db_process.md",
|
|
362
|
+
section: "Python"
|
|
363
|
+
},
|
|
364
|
+
// ── SQL ──
|
|
365
|
+
{
|
|
366
|
+
category: "sql",
|
|
367
|
+
title: "SQL Temel 1",
|
|
368
|
+
desc: "SELECT, INSERT, UPDATE, DELETE",
|
|
369
|
+
path: "../SQL-Notes/sql_basic_1.md",
|
|
370
|
+
section: "SQL"
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
category: "sql",
|
|
374
|
+
title: "SQL Temel 2",
|
|
375
|
+
desc: "WHERE, AND, OR, LIKE, IN, BETWEEN",
|
|
376
|
+
path: "../SQL-Notes/sql_basic_2.md",
|
|
377
|
+
section: "SQL"
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
category: "sql",
|
|
381
|
+
title: "SQL İleri",
|
|
382
|
+
desc: "JOIN, GROUP BY, HAVING, subquery",
|
|
383
|
+
path: "../SQL-Notes/sql_advanced_1.md",
|
|
384
|
+
section: "SQL"
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
category: "sql",
|
|
388
|
+
title: "psql Terminal",
|
|
389
|
+
desc: "PostgreSQL komut satırı kullanımı",
|
|
390
|
+
path: "../SQL-Notes/psql_on_terminal.md",
|
|
391
|
+
section: "SQL"
|
|
392
|
+
},
|
|
393
|
+
// ── MongoDB ──
|
|
394
|
+
{
|
|
395
|
+
category: "mongo",
|
|
396
|
+
title: "MongoDB Temel 1",
|
|
397
|
+
desc: "CRUD işlemleri, sorgular, operatörler",
|
|
398
|
+
path: "../MongoDB-Notes/mongodb_basic_1.md",
|
|
399
|
+
section: "MongoDB"
|
|
400
|
+
},
|
|
401
|
+
];
|
|
402
|
+
|
|
403
|
+
const TAG_LABELS = { java: "Java", js: "JS", py: "Python", sql: "SQL", mongo: "Mongo" };
|
|
404
|
+
|
|
405
|
+
let activeFilter = "all";
|
|
406
|
+
let searchQuery = "";
|
|
407
|
+
|
|
408
|
+
function render() {
|
|
409
|
+
const catalog = document.getElementById("catalog");
|
|
410
|
+
const empty = document.getElementById("empty");
|
|
411
|
+
catalog.innerHTML = "";
|
|
412
|
+
|
|
413
|
+
const filtered = NOTES.filter(n => {
|
|
414
|
+
const matchCat = activeFilter === "all" || n.category === activeFilter;
|
|
415
|
+
const q = searchQuery.toLowerCase();
|
|
416
|
+
const matchQ = !q || n.title.toLowerCase().includes(q) || n.desc.toLowerCase().includes(q) || n.section.toLowerCase().includes(q);
|
|
417
|
+
return matchCat && matchQ;
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
if (filtered.length === 0) {
|
|
421
|
+
empty.style.display = "block";
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
empty.style.display = "none";
|
|
425
|
+
|
|
426
|
+
// Group by section
|
|
427
|
+
const sections = [...new Set(filtered.map(n => n.section))];
|
|
428
|
+
sections.forEach(sec => {
|
|
429
|
+
const h = document.createElement("div");
|
|
430
|
+
h.className = "section-title";
|
|
431
|
+
h.textContent = sec;
|
|
432
|
+
catalog.appendChild(h);
|
|
433
|
+
|
|
434
|
+
const grid = document.createElement("div");
|
|
435
|
+
grid.className = "grid";
|
|
436
|
+
|
|
437
|
+
filtered.filter(n => n.section === sec).forEach(note => {
|
|
438
|
+
const a = document.createElement("a");
|
|
439
|
+
a.className = "card";
|
|
440
|
+
a.href = note.path;
|
|
441
|
+
a.innerHTML = `
|
|
442
|
+
<div class="card-top">
|
|
443
|
+
<span class="tag tag-${note.category}">${TAG_LABELS[note.category]}</span>
|
|
444
|
+
<span class="card-title">${note.title}</span>
|
|
445
|
+
</div>
|
|
446
|
+
<div class="card-desc">${note.desc}</div>
|
|
447
|
+
<div class="card-path">${note.path.replace("../", "")}</div>
|
|
448
|
+
`;
|
|
449
|
+
grid.appendChild(a);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
catalog.appendChild(grid);
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Filter chips
|
|
457
|
+
document.getElementById("filters").addEventListener("click", e => {
|
|
458
|
+
const chip = e.target.closest(".chip");
|
|
459
|
+
if (!chip) return;
|
|
460
|
+
document.querySelectorAll(".chip").forEach(c => c.classList.remove("active"));
|
|
461
|
+
chip.classList.add("active");
|
|
462
|
+
activeFilter = chip.dataset.filter;
|
|
463
|
+
render();
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
// Search
|
|
467
|
+
document.getElementById("search").addEventListener("input", e => {
|
|
468
|
+
searchQuery = e.target.value;
|
|
469
|
+
render();
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
render();
|
|
473
|
+
</script>
|
|
474
|
+
</body>
|
|
475
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@burakboduroglu/penote",
|
|
3
|
+
"version": "3.0.1",
|
|
4
|
+
"description": "Agentic learning docs — programming notes with a zero-dependency CLI and Web UI.",
|
|
5
|
+
"main": "library/cli.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"penote": "library/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"Java-Notes",
|
|
11
|
+
"Javascript-Notes",
|
|
12
|
+
"MongoDB-Notes",
|
|
13
|
+
"Python-Notes",
|
|
14
|
+
"SQL-Notes",
|
|
15
|
+
"assets/penote-logo.svg",
|
|
16
|
+
"assets/demo.png",
|
|
17
|
+
"library",
|
|
18
|
+
"AGENTS.md",
|
|
19
|
+
"CHANGELOG.md",
|
|
20
|
+
"CONTRIBUTING.md",
|
|
21
|
+
"LICENSE",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"start": "bun library/cli.js",
|
|
26
|
+
"dev": "bun library/cli.js open --editor"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"notes",
|
|
33
|
+
"programming",
|
|
34
|
+
"cli",
|
|
35
|
+
"markdown",
|
|
36
|
+
"agentic",
|
|
37
|
+
"learning",
|
|
38
|
+
"java",
|
|
39
|
+
"javascript",
|
|
40
|
+
"python",
|
|
41
|
+
"sql",
|
|
42
|
+
"mongodb"
|
|
43
|
+
],
|
|
44
|
+
"author": "Burak Boduroğlu",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/burakboduroglu/penote.git"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/burakboduroglu/penote#readme",
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/burakboduroglu/penote/issues"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18.0.0"
|
|
56
|
+
}
|
|
57
|
+
}
|