-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathindex.html
More file actions
691 lines (658 loc) · 89 KB
/
Copy pathindex.html
File metadata and controls
691 lines (658 loc) · 89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
<!DOCTYPE html>
<html lang="en">
<head>
<!-- ⚠️ AUTO-GENERATED by scripts/build_gallery.py — do not edit by hand. -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Makeability Lab — p5.js Examples</title>
<meta name="description" content="Interactive gallery of 95 p5.js examples for teaching, learning, and experimenting by the Makeability Lab at the University of Washington.">
<style>
:root {
--color-bg: #fdfdfd;
--color-text: #1a1a2e;
--color-muted: #64748b;
--color-border: #e2e8f0;
--color-card-bg: #ffffff;
--color-card-hover: #f8fafc;
--color-accent: #4338ca;
--color-accent-light: #e0e7ff;
--color-accent-text: #ffffff;
--radius: 8px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.06);
--shadow-md: 0 4px 12px rgba(0,0,0,0.08);
--font-sans: "Segoe UI", system-ui, -apple-system, sans-serif;
--font-mono: "SF Mono", "Cascadia Code", "Fira Code", monospace;
--topbar-h: 56px;
--sidebar-w: 244px;
}
@media (prefers-color-scheme: dark) {
:root {
--color-bg: #0f172a;
--color-text: #e2e8f0;
--color-muted: #94a3b8;
--color-border: #1e293b;
--color-card-bg: #1e293b;
--color-card-hover: #273449;
--color-accent: #818cf8;
--color-accent-light: #312e81;
--color-accent-text: #ffffff;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
--shadow-md: 0 4px 12px rgba(0,0,0,0.4);
}
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: var(--font-sans);
background: var(--color-bg);
color: var(--color-text);
line-height: 1.6;
}
/* --- Skip link (a11y) --- */
.skip-link {
position: absolute;
left: -999px;
top: 0;
z-index: 100;
background: var(--color-accent);
color: var(--color-accent-text);
padding: 0.5rem 0.75rem;
border-radius: 0 0 var(--radius) 0;
}
.skip-link:focus { left: 0; }
/* --- Top bar --- */
.topbar {
position: sticky;
top: 0;
z-index: 30;
display: flex;
align-items: center;
gap: 0.75rem;
height: var(--topbar-h);
padding: 0 1rem;
background: var(--color-card-bg);
border-bottom: 1px solid var(--color-border);
}
.sidebar-toggle {
display: none; /* shown on narrow screens */
align-items: center;
justify-content: center;
background: none;
border: 1px solid var(--color-border);
border-radius: var(--radius);
color: var(--color-text);
font-size: 1.1rem;
line-height: 1;
padding: 0.3rem 0.55rem;
cursor: pointer;
}
.topbar-title { font-weight: 700; letter-spacing: -0.02em; font-size: 1.05rem; }
.topbar-title span { color: var(--color-accent); }
.topbar-links {
margin-left: auto;
display: flex;
gap: 1rem;
flex-wrap: wrap;
font-size: 0.82rem;
}
.topbar-links a { color: var(--color-accent); text-decoration: none; }
.topbar-links a:hover { text-decoration: underline; }
/* --- Two-pane layout --- */
.layout { display: flex; align-items: flex-start; }
.sidebar {
flex: 0 0 var(--sidebar-w);
width: var(--sidebar-w);
position: sticky;
top: var(--topbar-h);
height: calc(100vh - var(--topbar-h));
overflow-y: auto;
border-right: 1px solid var(--color-border);
background: var(--color-bg);
}
.sidebar-inner { padding: 1rem 0.85rem 2rem; }
.sidebar-meta {
font-size: 0.72rem;
color: var(--color-muted);
margin: 0.6rem 0.25rem 0.4rem;
}
.search-box {
width: 100%;
padding: 0.5rem 0.75rem;
border: 1px solid var(--color-border);
border-radius: var(--radius);
font-size: 0.9rem;
background: var(--color-card-bg);
color: var(--color-text);
outline: none;
}
.search-box:focus { border-color: var(--color-accent); }
.search-box::placeholder { color: var(--color-muted); }
/* --- Sidebar tree --- */
.tree, .tree ul { list-style: none; }
.tree { margin-top: 0.25rem; font-size: 0.86rem; }
.tree-cat { margin-bottom: 0.05rem; }
.tree-cat-row { display: flex; align-items: center; gap: 0.1rem; }
.tree-toggle {
flex: 0 0 1.25rem;
width: 1.25rem;
height: 1.5rem;
display: inline-flex;
align-items: center;
justify-content: center;
background: none;
border: none;
color: var(--color-muted);
font-size: 0.7rem;
cursor: pointer;
border-radius: 4px;
transition: transform 0.12s, background 0.12s;
}
.tree-toggle:hover { background: var(--color-accent-light); color: var(--color-accent); }
.tree-toggle--empty { cursor: default; }
.tree-cat.collapsed > .tree-cat-row .tree-toggle { transform: rotate(-90deg); }
.tree-cat.collapsed > .tree-subs { display: none; }
.tree-link, .tree-sublink {
flex: 1 1 auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.4rem;
padding: 0.28rem 0.5rem;
border-radius: var(--radius);
color: var(--color-text);
text-decoration: none;
transition: background 0.12s, color 0.12s;
}
.tree-link { font-weight: 600; }
.tree-link:hover, .tree-sublink:hover { background: var(--color-card-hover); }
.tree-link.active, .tree-sublink.active {
background: var(--color-accent-light);
color: var(--color-accent);
}
.tree-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tree-subs {
margin: 0.05rem 0 0.3rem 1.2rem;
padding-left: 0.4rem;
border-left: 1px solid var(--color-border);
}
.tree-sublink { font-size: 0.82rem; font-weight: 500; }
.tree-count {
flex: 0 0 auto;
font-size: 0.68rem;
font-weight: 600;
background: var(--color-accent-light);
color: var(--color-accent);
padding: 0.05rem 0.4rem;
border-radius: 999px;
}
.tree-hidden { display: none; } /* toggled by search */
/* --- Content pane & sections --- */
.content {
flex: 1 1 auto;
min-width: 0;
padding: 1.5rem 1.75rem 4rem;
}
.cat-section, .subsection { scroll-margin-top: calc(var(--topbar-h) + 1rem); }
.cat-section { margin-bottom: 2.5rem; }
.subsection { margin-top: 1.25rem; }
section h2 {
font-size: 1.25rem;
font-weight: 700;
border-bottom: 2px solid var(--color-border);
padding-bottom: 0.4rem;
margin-bottom: 1rem;
display: flex;
align-items: baseline;
gap: 0.5rem;
}
.section-count {
font-size: 0.75rem;
font-weight: 400;
color: var(--color-muted);
}
.subcategory {
font-size: 0.95rem;
font-weight: 600;
color: var(--color-muted);
margin: 0 0 0.6rem;
display: flex;
align-items: baseline;
gap: 0.5rem;
}
.sub-count { font-size: 0.72rem; font-weight: 400; color: var(--color-muted); }
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 0.85rem;
}
.card {
background: var(--color-card-bg);
border: 1px solid var(--color-border);
border-radius: var(--radius);
box-shadow: var(--shadow-sm);
overflow: hidden;
transition: box-shadow 0.15s, transform 0.15s;
display: flex;
flex-direction: column;
}
.card:hover {
box-shadow: var(--shadow-md);
transform: translateY(-2px);
}
.card-thumb img {
width: 100%;
aspect-ratio: 16/9;
object-fit: cover;
display: block;
border-bottom: 1px solid var(--color-border);
}
/* Animated previews ship with a static poster; show the poster only when the
user prefers reduced motion. The `.card-thumb img` qualifier matches the
specificity of the sizing rule above so these display toggles actually win. */
.card-thumb img.thumb-still { display: none; }
@media (prefers-reduced-motion: reduce) {
.card-thumb img.thumb-anim { display: none; }
.card-thumb img.thumb-still { display: block; }
}
/* Final fallback tier: a category emoji on a tinted panel. */
.card-thumb-empty {
aspect-ratio: 16/9;
display: flex;
align-items: center;
justify-content: center;
background: var(--color-accent-light);
border-bottom: 1px solid var(--color-border);
}
.thumb-emoji { font-size: 2.5rem; line-height: 1; }
.card-body {
padding: 0.85rem;
flex: 1;
display: flex;
flex-direction: column;
}
.card-name {
font-weight: 600;
font-size: 0.92rem;
line-height: 1.3;
}
.card-meta {
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--color-muted);
margin-top: 0.2rem;
}
.card-links {
margin-top: auto;
padding-top: 0.6rem;
display: flex;
gap: 0.5rem;
}
.btn {
display: inline-block;
padding: 0.3rem 0.7rem;
font-size: 0.78rem;
font-weight: 600;
border-radius: var(--radius);
text-decoration: none;
transition: background 0.15s;
}
.btn-primary {
background: var(--color-accent);
color: var(--color-accent-text);
}
.btn-primary:hover { filter: brightness(1.15); }
.btn-secondary {
background: var(--color-accent-light);
color: var(--color-accent);
}
.btn-secondary:hover { filter: brightness(0.95); }
/* --- Search filtering --- */
.card.hidden, .cat-section.hidden, .subsection.hidden { display: none; }
/* --- Mobile drawer backdrop --- */
.backdrop {
display: none;
position: fixed;
inset: var(--topbar-h) 0 0 0;
background: rgba(0, 0, 0, 0.4);
z-index: 35;
}
.backdrop.show { display: block; }
/* --- Footer --- */
.site-footer {
max-width: 1120px;
margin: 0 auto;
padding: 1.5rem 2rem;
border-top: 1px solid var(--color-border);
font-size: 0.8rem;
color: var(--color-muted);
}
.site-footer a { color: var(--color-accent); text-decoration: none; }
/* --- Responsive --- */
@media (max-width: 820px) {
.sidebar-toggle { display: inline-flex; }
.topbar-links { display: none; }
.sidebar {
position: fixed;
top: var(--topbar-h);
left: 0;
bottom: 0;
height: auto;
width: 260px;
z-index: 40;
transform: translateX(-100%);
transition: transform 0.2s ease;
box-shadow: var(--shadow-md);
}
.sidebar.open { transform: translateX(0); }
.content { padding: 1.25rem 1rem 3rem; }
.grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
}
@media (max-width: 460px) {
.grid { grid-template-columns: 1fr 1fr; }
}
@media (prefers-reduced-motion: reduce) {
.sidebar { transition: none; }
html { scroll-behavior: auto; }
}
</style>
</head>
<body>
<a class="skip-link" href="#content">Skip to content</a>
<header class="topbar">
<button class="sidebar-toggle" aria-label="Toggle category navigation" aria-expanded="false" aria-controls="sidebar">☰</button>
<div class="topbar-title">Makeability Lab — <span>p5.js Examples</span></div>
<nav class="topbar-links" aria-label="External links">
<a href="https://github.com/makeabilitylab/p5js">GitHub Repo</a>
<a href="https://makeabilitylab.github.io/physcomp/">Physical Computing Course</a>
<a href="https://github.com/makeabilitylab/js">Makeability Lab JS Library</a>
<a href="https://jonfroehlich.github.io/">Jon E. Froehlich</a>
</nav>
</header>
<div class="backdrop" id="backdrop"></div>
<div class="layout">
<aside class="sidebar" id="sidebar">
<div class="sidebar-inner">
<div role="search">
<input
class="search-box"
type="search"
id="search"
placeholder="Search examples…"
aria-label="Search examples"
>
</div>
<p class="sidebar-meta">95 examples · 12 categories</p>
<nav class="tree" aria-label="Categories">
<ul>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-animation" data-target="cat-animation"><span class="tree-label">Animation</span><span class="tree-count">2</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-art" data-target="cat-art"><span class="tree-label">Art</span><span class="tree-count">11</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-color" data-target="cat-color"><span class="tree-label">Color</span><span class="tree-count">4</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-dom" data-target="cat-dom"><span class="tree-label">DOM</span><span class="tree-count">2</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-drawing" data-target="cat-drawing"><span class="tree-label">Drawing</span><span class="tree-count">2</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-games" data-target="cat-games"><span class="tree-label">Games</span><span class="tree-count">14</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-interaction" data-target="cat-interaction"><span class="tree-label">Interaction</span><span class="tree-count">3</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-perlinnoise" data-target="cat-perlinnoise"><span class="tree-label">PerlinNoise</span><span class="tree-count">3</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-sound" data-target="cat-sound"><span class="tree-label">Sound</span><span class="tree-count">19</span></a></div></li>
<li class="tree-cat tree-cat--leaf"><div class="tree-cat-row"><span class="tree-toggle tree-toggle--empty" aria-hidden="true"></span><a class="tree-link" href="#cat-vectors" data-target="cat-vectors"><span class="tree-label">Vectors</span><span class="tree-count">9</span></a></div></li>
<li class="tree-cat"><div class="tree-cat-row"><button class="tree-toggle" aria-expanded="true" aria-label="Toggle WebSerial subcategories">▾</button><a class="tree-link" href="#cat-webserial" data-target="cat-webserial"><span class="tree-label">WebSerial</span><span class="tree-count">21</span></a></div><ul class="tree-subs">
<li><a class="tree-sublink" href="#cat-webserial--basic" data-target="cat-webserial--basic"><span class="tree-label">Basic</span><span class="tree-count">4</span></a></li>
<li><a class="tree-sublink" href="#cat-webserial--ml5js" data-target="cat-webserial--ml5js"><span class="tree-label">ml5.js</span><span class="tree-count">3</span></a></li>
<li><a class="tree-sublink" href="#cat-webserial--p5js" data-target="cat-webserial--p5js"><span class="tree-label">p5.js</span><span class="tree-count">14</span></a></li>
</ul></li>
<li class="tree-cat"><div class="tree-cat-row"><button class="tree-toggle" aria-expanded="true" aria-label="Toggle ml5js subcategories">▾</button><a class="tree-link" href="#cat-ml5js" data-target="cat-ml5js"><span class="tree-label">ml5js</span><span class="tree-count">5</span></a></div><ul class="tree-subs">
<li><a class="tree-sublink" href="#cat-ml5js--handpose" data-target="cat-ml5js--handpose"><span class="tree-label">HandPose</span><span class="tree-count">2</span></a></li>
<li><a class="tree-sublink" href="#cat-ml5js--posenet" data-target="cat-ml5js--posenet"><span class="tree-label">PoseNet</span><span class="tree-count">3</span></a></li>
</ul></li>
</ul>
</nav>
</div>
</aside>
<main class="content" id="content">
<section class="cat-section" id="cat-animation">
<h2>Animation<span class="section-count">2 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Animation/BallBounce1D.webp" alt="Ball Bounce 1D preview" loading="lazy"><img class="thumb-still" src="previews/Animation/BallBounce1D.poster.png" alt="Ball Bounce 1D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Ball Bounce 1D</div><div class="card-meta">BallBounce1D</div><div class="card-links"><a href="Animation/BallBounce1D/" class="btn btn-primary" aria-label="Run Ball Bounce 1D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Animation/BallBounce1D" class="btn btn-secondary" aria-label="View source for Ball Bounce 1D">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Animation/BallBounce2D.webp" alt="Ball Bounce 2D preview" loading="lazy"><img class="thumb-still" src="previews/Animation/BallBounce2D.poster.png" alt="Ball Bounce 2D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Ball Bounce 2D</div><div class="card-meta">BallBounce2D</div><div class="card-links"><a href="Animation/BallBounce2D/" class="btn btn-primary" aria-label="Run Ball Bounce 2D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Animation/BallBounce2D" class="btn btn-secondary" aria-label="View source for Ball Bounce 2D">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-art">
<h2>Art<span class="section-count">11 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/LandscapeGenerator1.webp" alt="Landscape Generator 1 preview" loading="lazy"><img class="thumb-still" src="previews/Art/LandscapeGenerator1.poster.png" alt="Landscape Generator 1 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Landscape Generator 1</div><div class="card-meta">LandscapeGenerator1</div><div class="card-links"><a href="Art/LandscapeGenerator1/" class="btn btn-primary" aria-label="Run Landscape Generator 1">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/LandscapeGenerator1" class="btn btn-secondary" aria-label="View source for Landscape Generator 1">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/LandscapeGenerator2.webp" alt="Landscape Generator 2 preview" loading="lazy"><img class="thumb-still" src="previews/Art/LandscapeGenerator2.poster.png" alt="Landscape Generator 2 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Landscape Generator 2</div><div class="card-meta">LandscapeGenerator2</div><div class="card-links"><a href="Art/LandscapeGenerator2/" class="btn btn-primary" aria-label="Run Landscape Generator 2">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/LandscapeGenerator2" class="btn btn-secondary" aria-label="View source for Landscape Generator 2">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/LandscapeGenerator2-Santa.webp" alt="Landscape Generator 2 – Santa preview" loading="lazy"><img class="thumb-still" src="previews/Art/LandscapeGenerator2-Santa.poster.png" alt="Landscape Generator 2 – Santa preview" loading="lazy"></div><div class="card-body"><div class="card-name">Landscape Generator 2 – Santa</div><div class="card-meta">LandscapeGenerator2-Santa</div><div class="card-links"><a href="Art/LandscapeGenerator2-Santa/" class="btn btn-primary" aria-label="Run Landscape Generator 2 – Santa">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/LandscapeGenerator2-Santa" class="btn btn-secondary" aria-label="View source for Landscape Generator 2 – Santa">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/LandscapeGenerator3.webp" alt="Landscape Generator 3 preview" loading="lazy"><img class="thumb-still" src="previews/Art/LandscapeGenerator3.poster.png" alt="Landscape Generator 3 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Landscape Generator 3</div><div class="card-meta">LandscapeGenerator3</div><div class="card-links"><a href="Art/LandscapeGenerator3/" class="btn btn-primary" aria-label="Run Landscape Generator 3">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/LandscapeGenerator3" class="btn btn-secondary" aria-label="View source for Landscape Generator 3">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/MakeabilityLabAnimation1-GridFade.webp" alt="Makeability Lab Animation 1 – Grid Fade preview" loading="lazy"><img class="thumb-still" src="previews/Art/MakeabilityLabAnimation1-GridFade.poster.png" alt="Makeability Lab Animation 1 – Grid Fade preview" loading="lazy"></div><div class="card-body"><div class="card-name">Makeability Lab Animation 1 – Grid Fade</div><div class="card-meta">MakeabilityLabAnimation1-GridFade</div><div class="card-links"><a href="Art/MakeabilityLabAnimation1-GridFade/" class="btn btn-primary" aria-label="Run Makeability Lab Animation 1 – Grid Fade">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/MakeabilityLabAnimation1-GridFade" class="btn btn-secondary" aria-label="View source for Makeability Lab Animation 1 – Grid Fade">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/MakeabilityLabAnimation2-ReverseExplosion.webp" alt="Makeability Lab Animation 2 – Reverse Explosion preview" loading="lazy"><img class="thumb-still" src="previews/Art/MakeabilityLabAnimation2-ReverseExplosion.poster.png" alt="Makeability Lab Animation 2 – Reverse Explosion preview" loading="lazy"></div><div class="card-body"><div class="card-name">Makeability Lab Animation 2 – Reverse Explosion</div><div class="card-meta">MakeabilityLabAnimation2-ReverseExplosion</div><div class="card-links"><a href="Art/MakeabilityLabAnimation2-ReverseExplosion/" class="btn btn-primary" aria-label="Run Makeability Lab Animation 2 – Reverse Explosion">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/MakeabilityLabAnimation2-ReverseExplosion" class="btn btn-secondary" aria-label="View source for Makeability Lab Animation 2 – Reverse Explosion">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/MakeabilityLabLogo.webp" alt="Makeability Lab Logo preview" loading="lazy"><img class="thumb-still" src="previews/Art/MakeabilityLabLogo.poster.png" alt="Makeability Lab Logo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Makeability Lab Logo</div><div class="card-meta">MakeabilityLabLogo</div><div class="card-links"><a href="Art/MakeabilityLabLogo/" class="btn btn-primary" aria-label="Run Makeability Lab Logo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/MakeabilityLabLogo" class="btn btn-secondary" aria-label="View source for Makeability Lab Logo">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/SantaToMakeabilityLab.webp" alt="Santa To Makeability Lab preview" loading="lazy"><img class="thumb-still" src="previews/Art/SantaToMakeabilityLab.poster.png" alt="Santa To Makeability Lab preview" loading="lazy"></div><div class="card-body"><div class="card-name">Santa To Makeability Lab</div><div class="card-meta">SantaToMakeabilityLab</div><div class="card-links"><a href="Art/SantaToMakeabilityLab/" class="btn btn-primary" aria-label="Run Santa To Makeability Lab">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/SantaToMakeabilityLab" class="btn btn-secondary" aria-label="View source for Santa To Makeability Lab">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/SimpleFlower.webp" alt="Simple Flower preview" loading="lazy"><img class="thumb-still" src="previews/Art/SimpleFlower.poster.png" alt="Simple Flower preview" loading="lazy"></div><div class="card-body"><div class="card-name">Simple Flower</div><div class="card-meta">SimpleFlower</div><div class="card-links"><a href="Art/SimpleFlower/" class="btn btn-primary" aria-label="Run Simple Flower">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/SimpleFlower" class="btn btn-secondary" aria-label="View source for Simple Flower">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/SineWavePlayground.webp" alt="Sine Wave Playground preview" loading="lazy"><img class="thumb-still" src="previews/Art/SineWavePlayground.poster.png" alt="Sine Wave Playground preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sine Wave Playground</div><div class="card-meta">SineWavePlayground</div><div class="card-links"><a href="Art/SineWavePlayground/" class="btn btn-primary" aria-label="Run Sine Wave Playground">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/SineWavePlayground" class="btn btn-secondary" aria-label="View source for Sine Wave Playground">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Art/TriangleSanta.webp" alt="Triangle Santa preview" loading="lazy"><img class="thumb-still" src="previews/Art/TriangleSanta.poster.png" alt="Triangle Santa preview" loading="lazy"></div><div class="card-body"><div class="card-name">Triangle Santa</div><div class="card-meta">TriangleSanta</div><div class="card-links"><a href="Art/TriangleSanta/" class="btn btn-primary" aria-label="Run Triangle Santa">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Art/TriangleSanta" class="btn btn-secondary" aria-label="View source for Triangle Santa">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-color">
<h2>Color<span class="section-count">4 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Color/ColorCube3D.webp" alt="Color Cube 3D preview" loading="lazy"><img class="thumb-still" src="previews/Color/ColorCube3D.poster.png" alt="Color Cube 3D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Color Cube 3D</div><div class="card-meta">ColorCube3D</div><div class="card-links"><a href="Color/ColorCube3D/" class="btn btn-primary" aria-label="Run Color Cube 3D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Color/ColorCube3D" class="btn btn-secondary" aria-label="View source for Color Cube 3D">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Color/ColorExplorer3D.webp" alt="Color Explorer 3D preview" loading="lazy"><img class="thumb-still" src="previews/Color/ColorExplorer3D.poster.png" alt="Color Explorer 3D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Color Explorer 3D</div><div class="card-meta">ColorExplorer3D</div><div class="card-links"><a href="Color/ColorExplorer3D/" class="btn btn-primary" aria-label="Run Color Explorer 3D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Color/ColorExplorer3D" class="btn btn-secondary" aria-label="View source for Color Explorer 3D">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Color/ColorPanel2D.webp" alt="Color Panel 2D preview" loading="lazy"><img class="thumb-still" src="previews/Color/ColorPanel2D.poster.png" alt="Color Panel 2D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Color Panel 2D</div><div class="card-meta">ColorPanel2D</div><div class="card-links"><a href="Color/ColorPanel2D/" class="btn btn-primary" aria-label="Run Color Panel 2D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Color/ColorPanel2D" class="btn btn-secondary" aria-label="View source for Color Panel 2D">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Color/CrossFadeRgb3D.webp" alt="Cross Fade Rgb 3D preview" loading="lazy"><img class="thumb-still" src="previews/Color/CrossFadeRgb3D.poster.png" alt="Cross Fade Rgb 3D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Cross Fade Rgb 3D</div><div class="card-meta">CrossFadeRgb3D</div><div class="card-links"><a href="Color/CrossFadeRgb3D/" class="btn btn-primary" aria-label="Run Cross Fade Rgb 3D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Color/CrossFadeRgb3D" class="btn btn-secondary" aria-label="View source for Cross Fade Rgb 3D">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-dom">
<h2>DOM<span class="section-count">2 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img src="previews/DOM/CollapsibleSidebar1-NoP5js.poster.png" alt="Collapsible Sidebar Example from W3.CSS preview" loading="lazy"></div><div class="card-body"><div class="card-name">Collapsible Sidebar Example from W3.CSS</div><div class="card-meta">CollapsibleSidebar1-NoP5js</div><div class="card-links"><a href="DOM/CollapsibleSidebar1-NoP5js/" class="btn btn-primary" aria-label="Run Collapsible Sidebar Example from W3.CSS">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/DOM/CollapsibleSidebar1-NoP5js" class="btn btn-secondary" aria-label="View source for Collapsible Sidebar Example from W3.CSS">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/DOM/CollapsibleSidebar2-WithP5js.webp" alt="Sketch preview" loading="lazy"><img class="thumb-still" src="previews/DOM/CollapsibleSidebar2-WithP5js.poster.png" alt="Sketch preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sketch</div><div class="card-meta">CollapsibleSidebar2-WithP5js</div><div class="card-links"><a href="DOM/CollapsibleSidebar2-WithP5js/" class="btn btn-primary" aria-label="Run Sketch">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/DOM/CollapsibleSidebar2-WithP5js" class="btn btn-secondary" aria-label="View source for Sketch">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-drawing">
<h2>Drawing<span class="section-count">2 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Drawing/AscentAndDescent.webp" alt="Ascent And Descent preview" loading="lazy"><img class="thumb-still" src="previews/Drawing/AscentAndDescent.poster.png" alt="Ascent And Descent preview" loading="lazy"></div><div class="card-body"><div class="card-name">Ascent And Descent</div><div class="card-meta">AscentAndDescent</div><div class="card-links"><a href="Drawing/AscentAndDescent/" class="btn btn-primary" aria-label="Run Ascent And Descent">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Drawing/AscentAndDescent" class="btn btn-secondary" aria-label="View source for Ascent And Descent">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Drawing/DrawingGrid.webp" alt="Drawing Grid preview" loading="lazy"><img class="thumb-still" src="previews/Drawing/DrawingGrid.poster.png" alt="Drawing Grid preview" loading="lazy"></div><div class="card-body"><div class="card-name">Drawing Grid</div><div class="card-meta">DrawingGrid</div><div class="card-links"><a href="Drawing/DrawingGrid/" class="btn btn-primary" aria-label="Run Drawing Grid">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Drawing/DrawingGrid" class="btn btn-secondary" aria-label="View source for Drawing Grid">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-games">
<h2>Games<span class="section-count">14 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/CookieMonster1.webp" alt="Cookie Monster 1 preview" loading="lazy"><img class="thumb-still" src="previews/Games/CookieMonster1.poster.png" alt="Cookie Monster 1 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Cookie Monster 1</div><div class="card-meta">CookieMonster1</div><div class="card-links"><a href="Games/CookieMonster1/" class="btn btn-primary" aria-label="Run Cookie Monster 1">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/CookieMonster1" class="btn btn-secondary" aria-label="View source for Cookie Monster 1">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/CookieMonster2.webp" alt="Cookie Monster 2 preview" loading="lazy"><img class="thumb-still" src="previews/Games/CookieMonster2.poster.png" alt="Cookie Monster 2 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Cookie Monster 2</div><div class="card-meta">CookieMonster2</div><div class="card-links"><a href="Games/CookieMonster2/" class="btn btn-primary" aria-label="Run Cookie Monster 2">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/CookieMonster2" class="btn btn-secondary" aria-label="View source for Cookie Monster 2">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/CookieMonster3.webp" alt="Cookie Monster 3 preview" loading="lazy"><img class="thumb-still" src="previews/Games/CookieMonster3.poster.png" alt="Cookie Monster 3 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Cookie Monster 3</div><div class="card-meta">CookieMonster3</div><div class="card-links"><a href="Games/CookieMonster3/" class="btn btn-primary" aria-label="Run Cookie Monster 3">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/CookieMonster3" class="btn btn-secondary" aria-label="View source for Cookie Monster 3">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/FFTGame.webp" alt="FFTGame preview" loading="lazy"><img class="thumb-still" src="previews/Games/FFTGame.poster.png" alt="FFTGame preview" loading="lazy"></div><div class="card-body"><div class="card-name">FFTGame</div><div class="card-meta">FFTGame</div><div class="card-links"><a href="Games/FFTGame/" class="btn btn-primary" aria-label="Run FFTGame">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/FFTGame" class="btn btn-secondary" aria-label="View source for FFTGame">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/FlappyArm.webp" alt="Flappy Arm preview" loading="lazy"><img class="thumb-still" src="previews/Games/FlappyArm.poster.png" alt="Flappy Arm preview" loading="lazy"></div><div class="card-body"><div class="card-name">Flappy Arm</div><div class="card-meta">FlappyArm</div><div class="card-links"><a href="Games/FlappyArm/" class="btn btn-primary" aria-label="Run Flappy Arm">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/FlappyArm" class="btn btn-secondary" aria-label="View source for Flappy Arm">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/FlappyBird.webp" alt="Flappy Bird preview" loading="lazy"><img class="thumb-still" src="previews/Games/FlappyBird.poster.png" alt="Flappy Bird preview" loading="lazy"></div><div class="card-body"><div class="card-name">Flappy Bird</div><div class="card-meta">FlappyBird</div><div class="card-links"><a href="Games/FlappyBird/" class="btn btn-primary" aria-label="Run Flappy Bird">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/FlappyBird" class="btn btn-secondary" aria-label="View source for Flappy Bird">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/FlappyBird2.webp" alt="Flappy Bird 2 preview" loading="lazy"><img class="thumb-still" src="previews/Games/FlappyBird2.poster.png" alt="Flappy Bird 2 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Flappy Bird 2</div><div class="card-meta">FlappyBird2</div><div class="card-links"><a href="Games/FlappyBird2/" class="btn btn-primary" aria-label="Run Flappy Bird 2">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/FlappyBird2" class="btn btn-secondary" aria-label="View source for Flappy Bird 2">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/Pong.webp" alt="Pong preview" loading="lazy"><img class="thumb-still" src="previews/Games/Pong.poster.png" alt="Pong preview" loading="lazy"></div><div class="card-body"><div class="card-name">Pong</div><div class="card-meta">Pong</div><div class="card-links"><a href="Games/Pong/" class="btn btn-primary" aria-label="Run Pong">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/Pong" class="btn btn-secondary" aria-label="View source for Pong">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/SideScroller-CheetahRacer.webp" alt="Side Scroller – Cheetah Racer preview" loading="lazy"><img class="thumb-still" src="previews/Games/SideScroller-CheetahRacer.poster.png" alt="Side Scroller – Cheetah Racer preview" loading="lazy"></div><div class="card-body"><div class="card-name">Side Scroller – Cheetah Racer</div><div class="card-meta">SideScroller-CheetahRacer</div><div class="card-links"><a href="Games/SideScroller-CheetahRacer/" class="btn btn-primary" aria-label="Run Side Scroller – Cheetah Racer">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/SideScroller-CheetahRacer" class="btn btn-secondary" aria-label="View source for Side Scroller – Cheetah Racer">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/SideScroller1-Basic.webp" alt="Side Scroller 1 – Basic preview" loading="lazy"><img class="thumb-still" src="previews/Games/SideScroller1-Basic.poster.png" alt="Side Scroller 1 – Basic preview" loading="lazy"></div><div class="card-body"><div class="card-name">Side Scroller 1 – Basic</div><div class="card-meta">SideScroller1-Basic</div><div class="card-links"><a href="Games/SideScroller1-Basic/" class="btn btn-primary" aria-label="Run Side Scroller 1 – Basic">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/SideScroller1-Basic" class="btn btn-secondary" aria-label="View source for Side Scroller 1 – Basic">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/Sidescroller2-WithMarioSpriteSheet.webp" alt="Sidescroller 2 – With Mario Sprite Sheet preview" loading="lazy"><img class="thumb-still" src="previews/Games/Sidescroller2-WithMarioSpriteSheet.poster.png" alt="Sidescroller 2 – With Mario Sprite Sheet preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sidescroller 2 – With Mario Sprite Sheet</div><div class="card-meta">Sidescroller2-WithMarioSpriteSheet</div><div class="card-links"><a href="Games/Sidescroller2-WithMarioSpriteSheet/" class="btn btn-primary" aria-label="Run Sidescroller 2 – With Mario Sprite Sheet">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/Sidescroller2-WithMarioSpriteSheet" class="btn btn-secondary" aria-label="View source for Sidescroller 2 – With Mario Sprite Sheet">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/SimpleKeyboardGame.webp" alt="Simple Keyboard Game preview" loading="lazy"><img class="thumb-still" src="previews/Games/SimpleKeyboardGame.poster.png" alt="Simple Keyboard Game preview" loading="lazy"></div><div class="card-body"><div class="card-name">Simple Keyboard Game</div><div class="card-meta">SimpleKeyboardGame</div><div class="card-links"><a href="Games/SimpleKeyboardGame/" class="btn btn-primary" aria-label="Run Simple Keyboard Game">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/SimpleKeyboardGame" class="btn btn-secondary" aria-label="View source for Simple Keyboard Game">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/Snake.webp" alt="Snake preview" loading="lazy"><img class="thumb-still" src="previews/Games/Snake.poster.png" alt="Snake preview" loading="lazy"></div><div class="card-body"><div class="card-name">Snake</div><div class="card-meta">Snake</div><div class="card-links"><a href="Games/Snake/" class="btn btn-primary" aria-label="Run Snake">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/Snake" class="btn btn-secondary" aria-label="View source for Snake">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Games/SnakeSpeech.webp" alt="Snake Speech preview" loading="lazy"><img class="thumb-still" src="previews/Games/SnakeSpeech.poster.png" alt="Snake Speech preview" loading="lazy"></div><div class="card-body"><div class="card-name">Snake Speech</div><div class="card-meta">SnakeSpeech</div><div class="card-links"><a href="Games/SnakeSpeech/" class="btn btn-primary" aria-label="Run Snake Speech">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Games/SnakeSpeech" class="btn btn-secondary" aria-label="View source for Snake Speech">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-interaction">
<h2>Interaction<span class="section-count">3 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Interaction/DrawingWithMouse1.webp" alt="Drawing With Mouse 1 preview" loading="lazy"><img class="thumb-still" src="previews/Interaction/DrawingWithMouse1.poster.png" alt="Drawing With Mouse 1 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Drawing With Mouse 1</div><div class="card-meta">DrawingWithMouse1</div><div class="card-links"><a href="Interaction/DrawingWithMouse1/" class="btn btn-primary" aria-label="Run Drawing With Mouse 1">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Interaction/DrawingWithMouse1" class="btn btn-secondary" aria-label="View source for Drawing With Mouse 1">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Interaction/DrawingWithMouse2.webp" alt="Drawing With Mouse 2 preview" loading="lazy"><img class="thumb-still" src="previews/Interaction/DrawingWithMouse2.poster.png" alt="Drawing With Mouse 2 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Drawing With Mouse 2</div><div class="card-meta">DrawingWithMouse2</div><div class="card-links"><a href="Interaction/DrawingWithMouse2/" class="btn btn-primary" aria-label="Run Drawing With Mouse 2">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Interaction/DrawingWithMouse2" class="btn btn-secondary" aria-label="View source for Drawing With Mouse 2">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Interaction/DrawingWithMouse3.webp" alt="Drawing With Mouse 3 preview" loading="lazy"><img class="thumb-still" src="previews/Interaction/DrawingWithMouse3.poster.png" alt="Drawing With Mouse 3 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Drawing With Mouse 3</div><div class="card-meta">DrawingWithMouse3</div><div class="card-links"><a href="Interaction/DrawingWithMouse3/" class="btn btn-primary" aria-label="Run Drawing With Mouse 3">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Interaction/DrawingWithMouse3" class="btn btn-secondary" aria-label="View source for Drawing With Mouse 3">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-perlinnoise">
<h2>PerlinNoise<span class="section-count">3 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/PerlinNoise/Noise2D.webp" alt="Noise 2D preview" loading="lazy"><img class="thumb-still" src="previews/PerlinNoise/Noise2D.poster.png" alt="Noise 2D preview" loading="lazy"></div><div class="card-body"><div class="card-name">Noise 2D</div><div class="card-meta">Noise2D</div><div class="card-links"><a href="PerlinNoise/Noise2D/" class="btn btn-primary" aria-label="Run Noise 2D">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/PerlinNoise/Noise2D" class="btn btn-secondary" aria-label="View source for Noise 2D">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/PerlinNoise/NoiseGraph.webp" alt="Noise Graph preview" loading="lazy"><img class="thumb-still" src="previews/PerlinNoise/NoiseGraph.poster.png" alt="Noise Graph preview" loading="lazy"></div><div class="card-body"><div class="card-name">Noise Graph</div><div class="card-meta">NoiseGraph</div><div class="card-links"><a href="PerlinNoise/NoiseGraph/" class="btn btn-primary" aria-label="Run Noise Graph">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/PerlinNoise/NoiseGraph" class="btn btn-secondary" aria-label="View source for Noise Graph">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/PerlinNoise/NoiseLoop.webp" alt="Noise Loop preview" loading="lazy"><img class="thumb-still" src="previews/PerlinNoise/NoiseLoop.poster.png" alt="Noise Loop preview" loading="lazy"></div><div class="card-body"><div class="card-name">Noise Loop</div><div class="card-meta">NoiseLoop</div><div class="card-links"><a href="PerlinNoise/NoiseLoop/" class="btn btn-primary" aria-label="Run Noise Loop">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/PerlinNoise/NoiseLoop" class="btn btn-secondary" aria-label="View source for Noise Loop">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-sound">
<h2>Sound<span class="section-count">19 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/FrequencyBarGraph1-Simple.webp" alt="Frequency Bar Graph 1 – Simple preview" loading="lazy"><img class="thumb-still" src="previews/Sound/FrequencyBarGraph1-Simple.poster.png" alt="Frequency Bar Graph 1 – Simple preview" loading="lazy"></div><div class="card-body"><div class="card-name">Frequency Bar Graph 1 – Simple</div><div class="card-meta">FrequencyBarGraph1-Simple</div><div class="card-links"><a href="Sound/FrequencyBarGraph1-Simple/" class="btn btn-primary" aria-label="Run Frequency Bar Graph 1 – Simple">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/FrequencyBarGraph1-Simple" class="btn btn-secondary" aria-label="View source for Frequency Bar Graph 1 – Simple">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/FrequencyBarGraph2-Axes.webp" alt="Frequency Bar Graph 2 – Axes preview" loading="lazy"><img class="thumb-still" src="previews/Sound/FrequencyBarGraph2-Axes.poster.png" alt="Frequency Bar Graph 2 – Axes preview" loading="lazy"></div><div class="card-body"><div class="card-name">Frequency Bar Graph 2 – Axes</div><div class="card-meta">FrequencyBarGraph2-Axes</div><div class="card-links"><a href="Sound/FrequencyBarGraph2-Axes/" class="btn btn-primary" aria-label="Run Frequency Bar Graph 2 – Axes">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/FrequencyBarGraph2-Axes" class="btn btn-secondary" aria-label="View source for Frequency Bar Graph 2 – Axes">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/FrequencyBarGraph3-WithClasses.webp" alt="Frequency Bar Graph 3 – With Classes preview" loading="lazy"><img class="thumb-still" src="previews/Sound/FrequencyBarGraph3-WithClasses.poster.png" alt="Frequency Bar Graph 3 – With Classes preview" loading="lazy"></div><div class="card-body"><div class="card-name">Frequency Bar Graph 3 – With Classes</div><div class="card-meta">FrequencyBarGraph3-WithClasses</div><div class="card-links"><a href="Sound/FrequencyBarGraph3-WithClasses/" class="btn btn-primary" aria-label="Run Frequency Bar Graph 3 – With Classes">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/FrequencyBarGraph3-WithClasses" class="btn btn-secondary" aria-label="View source for Frequency Bar Graph 3 – With Classes">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/FrequencyBubbles1-Simple.webp" alt="Frequency Bubbles 1 – Simple preview" loading="lazy"><img class="thumb-still" src="previews/Sound/FrequencyBubbles1-Simple.poster.png" alt="Frequency Bubbles 1 – Simple preview" loading="lazy"></div><div class="card-body"><div class="card-name">Frequency Bubbles 1 – Simple</div><div class="card-meta">FrequencyBubbles1-Simple</div><div class="card-links"><a href="Sound/FrequencyBubbles1-Simple/" class="btn btn-primary" aria-label="Run Frequency Bubbles 1 – Simple">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/FrequencyBubbles1-Simple" class="btn btn-secondary" aria-label="View source for Frequency Bubbles 1 – Simple">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/FrequencyBubbles2-Image.webp" alt="Frequency Bubbles 2 – Image preview" loading="lazy"><img class="thumb-still" src="previews/Sound/FrequencyBubbles2-Image.poster.png" alt="Frequency Bubbles 2 – Image preview" loading="lazy"></div><div class="card-body"><div class="card-name">Frequency Bubbles 2 – Image</div><div class="card-meta">FrequencyBubbles2-Image</div><div class="card-links"><a href="Sound/FrequencyBubbles2-Image/" class="btn btn-primary" aria-label="Run Frequency Bubbles 2 – Image">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/FrequencyBubbles2-Image" class="btn btn-secondary" aria-label="View source for Frequency Bubbles 2 – Image">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/FrequencySpectrum1-Simple.webp" alt="Frequency Spectrum 1 – Simple preview" loading="lazy"><img class="thumb-still" src="previews/Sound/FrequencySpectrum1-Simple.poster.png" alt="Frequency Spectrum 1 – Simple preview" loading="lazy"></div><div class="card-body"><div class="card-name">Frequency Spectrum 1 – Simple</div><div class="card-meta">FrequencySpectrum1-Simple</div><div class="card-links"><a href="Sound/FrequencySpectrum1-Simple/" class="btn btn-primary" aria-label="Run Frequency Spectrum 1 – Simple">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/FrequencySpectrum1-Simple" class="btn btn-secondary" aria-label="View source for Frequency Spectrum 1 – Simple">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/SoundLevel1-CircleSizeMeter.webp" alt="Sound Level 1 – Circle Size Meter preview" loading="lazy"><img class="thumb-still" src="previews/Sound/SoundLevel1-CircleSizeMeter.poster.png" alt="Sound Level 1 – Circle Size Meter preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Level 1 – Circle Size Meter</div><div class="card-meta">SoundLevel1-CircleSizeMeter</div><div class="card-links"><a href="Sound/SoundLevel1-CircleSizeMeter/" class="btn btn-primary" aria-label="Run Sound Level 1 – Circle Size Meter">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundLevel1-CircleSizeMeter" class="btn btn-secondary" aria-label="View source for Sound Level 1 – Circle Size Meter">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/SoundLevel2-CircleYLocationMeter.webp" alt="Sound Level 2 – Circle YLocation Meter preview" loading="lazy"><img class="thumb-still" src="previews/Sound/SoundLevel2-CircleYLocationMeter.poster.png" alt="Sound Level 2 – Circle YLocation Meter preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Level 2 – Circle YLocation Meter</div><div class="card-meta">SoundLevel2-CircleYLocationMeter</div><div class="card-links"><a href="Sound/SoundLevel2-CircleYLocationMeter/" class="btn btn-primary" aria-label="Run Sound Level 2 – Circle YLocation Meter">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundLevel2-CircleYLocationMeter" class="btn btn-secondary" aria-label="View source for Sound Level 2 – Circle YLocation Meter">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundLevelBubbles1-Simple.poster.png" alt="Sound Level Bubbles 1 – Simple preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Level Bubbles 1 – Simple</div><div class="card-meta">SoundLevelBubbles1-Simple</div><div class="card-links"><a href="Sound/SoundLevelBubbles1-Simple/" class="btn btn-primary" aria-label="Run Sound Level Bubbles 1 – Simple">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundLevelBubbles1-Simple" class="btn btn-secondary" aria-label="View source for Sound Level Bubbles 1 – Simple">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundLevelBubbles2-Image.poster.png" alt="Sound Level Bubbles 2 – Image preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Level Bubbles 2 – Image</div><div class="card-meta">SoundLevelBubbles2-Image</div><div class="card-links"><a href="Sound/SoundLevelBubbles2-Image/" class="btn btn-primary" aria-label="Run Sound Level Bubbles 2 – Image">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundLevelBubbles2-Image" class="btn btn-secondary" aria-label="View source for Sound Level Bubbles 2 – Image">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundLevelTimesSeries1-Simple.poster.png" alt="Sound Level Times Series 1 – Simple preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Level Times Series 1 – Simple</div><div class="card-meta">SoundLevelTimesSeries1-Simple</div><div class="card-links"><a href="Sound/SoundLevelTimesSeries1-Simple/" class="btn btn-primary" aria-label="Run Sound Level Times Series 1 – Simple">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundLevelTimesSeries1-Simple" class="btn btn-secondary" aria-label="View source for Sound Level Times Series 1 – Simple">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundLevelTimesSeries2-Axes.poster.png" alt="Sound Level Times Series 2 – Axes preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Level Times Series 2 – Axes</div><div class="card-meta">SoundLevelTimesSeries2-Axes</div><div class="card-links"><a href="Sound/SoundLevelTimesSeries2-Axes/" class="btn btn-primary" aria-label="Run Sound Level Times Series 2 – Axes">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundLevelTimesSeries2-Axes" class="btn btn-secondary" aria-label="View source for Sound Level Times Series 2 – Axes">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/SoundReactiveFlower1-SoundLevel.webp" alt="Sound Reactive Flower 1 – Sound Level preview" loading="lazy"><img class="thumb-still" src="previews/Sound/SoundReactiveFlower1-SoundLevel.poster.png" alt="Sound Reactive Flower 1 – Sound Level preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Reactive Flower 1 – Sound Level</div><div class="card-meta">SoundReactiveFlower1-SoundLevel</div><div class="card-links"><a href="Sound/SoundReactiveFlower1-SoundLevel/" class="btn btn-primary" aria-label="Run Sound Reactive Flower 1 – Sound Level">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundReactiveFlower1-SoundLevel" class="btn btn-secondary" aria-label="View source for Sound Reactive Flower 1 – Sound Level">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Sound/SoundReactiveFlower2-Frequency.webp" alt="Sound Reactive Flower 2 – Frequency preview" loading="lazy"><img class="thumb-still" src="previews/Sound/SoundReactiveFlower2-Frequency.poster.png" alt="Sound Reactive Flower 2 – Frequency preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Reactive Flower 2 – Frequency</div><div class="card-meta">SoundReactiveFlower2-Frequency</div><div class="card-links"><a href="Sound/SoundReactiveFlower2-Frequency/" class="btn btn-primary" aria-label="Run Sound Reactive Flower 2 – Frequency">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundReactiveFlower2-Frequency" class="btn btn-secondary" aria-label="View source for Sound Reactive Flower 2 – Frequency">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundVis1-WaveformAndSpectrogram.poster.png" alt="Sound Vis 1 – Waveform And Spectrogram preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Vis 1 – Waveform And Spectrogram</div><div class="card-meta">SoundVis1-WaveformAndSpectrogram</div><div class="card-links"><a href="Sound/SoundVis1-WaveformAndSpectrogram/" class="btn btn-primary" aria-label="Run Sound Vis 1 – Waveform And Spectrogram">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundVis1-WaveformAndSpectrogram" class="btn btn-secondary" aria-label="View source for Sound Vis 1 – Waveform And Spectrogram">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundVis2-NowWithAxisLabels.poster.png" alt="Sound Vis 2 – Now With Axis Labels preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Vis 2 – Now With Axis Labels</div><div class="card-meta">SoundVis2-NowWithAxisLabels</div><div class="card-links"><a href="Sound/SoundVis2-NowWithAxisLabels/" class="btn btn-primary" aria-label="Run Sound Vis 2 – Now With Axis Labels">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundVis2-NowWithAxisLabels" class="btn btn-secondary" aria-label="View source for Sound Vis 2 – Now With Axis Labels">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundVis3.poster.png" alt="Sound Vis 3 preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Vis 3</div><div class="card-meta">SoundVis3</div><div class="card-links"><a href="Sound/SoundVis3/" class="btn btn-primary" aria-label="Run Sound Vis 3">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundVis3" class="btn btn-secondary" aria-label="View source for Sound Vis 3">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/SoundVis4-ImprovedPerformance.poster.png" alt="Sound Vis 4 – Improved Performance preview" loading="lazy"></div><div class="card-body"><div class="card-name">Sound Vis 4 – Improved Performance</div><div class="card-meta">SoundVis4-ImprovedPerformance</div><div class="card-links"><a href="Sound/SoundVis4-ImprovedPerformance/" class="btn btn-primary" aria-label="Run Sound Vis 4 – Improved Performance">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/SoundVis4-ImprovedPerformance" class="btn btn-secondary" aria-label="View source for Sound Vis 4 – Improved Performance">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/Sound/WaveformVis1-Simple.poster.png" alt="Waveform Vis 1 – Simple preview" loading="lazy"></div><div class="card-body"><div class="card-name">Waveform Vis 1 – Simple</div><div class="card-meta">WaveformVis1-Simple</div><div class="card-links"><a href="Sound/WaveformVis1-Simple/" class="btn btn-primary" aria-label="Run Waveform Vis 1 – Simple">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Sound/WaveformVis1-Simple" class="btn btn-secondary" aria-label="View source for Waveform Vis 1 – Simple">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-vectors">
<h2>Vectors<span class="section-count">9 examples</span></h2>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/AngleExplorer.webp" alt="Angle Explorer preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/AngleExplorer.poster.png" alt="Angle Explorer preview" loading="lazy"></div><div class="card-body"><div class="card-name">Angle Explorer</div><div class="card-meta">AngleExplorer</div><div class="card-links"><a href="Vectors/AngleExplorer/" class="btn btn-primary" aria-label="Run Angle Explorer">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/AngleExplorer" class="btn btn-secondary" aria-label="View source for Angle Explorer">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/AnglePlayground.webp" alt="Angle Playground preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/AnglePlayground.poster.png" alt="Angle Playground preview" loading="lazy"></div><div class="card-body"><div class="card-name">Angle Playground</div><div class="card-meta">AnglePlayground</div><div class="card-links"><a href="Vectors/AnglePlayground/" class="btn btn-primary" aria-label="Run Angle Playground">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/AnglePlayground" class="btn btn-secondary" aria-label="View source for Angle Playground">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/BouncingBall.webp" alt="Bouncing Ball preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/BouncingBall.poster.png" alt="Bouncing Ball preview" loading="lazy"></div><div class="card-body"><div class="card-name">Bouncing Ball</div><div class="card-meta">BouncingBall</div><div class="card-links"><a href="Vectors/BouncingBall/" class="btn btn-primary" aria-label="Run Bouncing Ball">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/BouncingBall" class="btn btn-secondary" aria-label="View source for Bouncing Ball">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/BouncingBallWithAcceleration.webp" alt="Bouncing Ball With Acceleration preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/BouncingBallWithAcceleration.poster.png" alt="Bouncing Ball With Acceleration preview" loading="lazy"></div><div class="card-body"><div class="card-name">Bouncing Ball With Acceleration</div><div class="card-meta">BouncingBallWithAcceleration</div><div class="card-links"><a href="Vectors/BouncingBallWithAcceleration/" class="btn btn-primary" aria-label="Run Bouncing Ball With Acceleration">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/BouncingBallWithAcceleration" class="btn btn-secondary" aria-label="View source for Bouncing Ball With Acceleration">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/BouncingBallsAndLineSegments.webp" alt="Bouncing Balls And Line Segments preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/BouncingBallsAndLineSegments.poster.png" alt="Bouncing Balls And Line Segments preview" loading="lazy"></div><div class="card-body"><div class="card-name">Bouncing Balls And Line Segments</div><div class="card-meta">BouncingBallsAndLineSegments</div><div class="card-links"><a href="Vectors/BouncingBallsAndLineSegments/" class="btn btn-primary" aria-label="Run Bouncing Balls And Line Segments">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/BouncingBallsAndLineSegments" class="btn btn-secondary" aria-label="View source for Bouncing Balls And Line Segments">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/BouncingBallsAndLineSegmentsImproved.webp" alt="Bouncing Balls And Line Segments Improved preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/BouncingBallsAndLineSegmentsImproved.poster.png" alt="Bouncing Balls And Line Segments Improved preview" loading="lazy"></div><div class="card-body"><div class="card-name">Bouncing Balls And Line Segments Improved</div><div class="card-meta">BouncingBallsAndLineSegmentsImproved</div><div class="card-links"><a href="Vectors/BouncingBallsAndLineSegmentsImproved/" class="btn btn-primary" aria-label="Run Bouncing Balls And Line Segments Improved">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/BouncingBallsAndLineSegmentsImproved" class="btn btn-secondary" aria-label="View source for Bouncing Balls And Line Segments Improved">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/BouncingBallsAndRotatingRectangles.webp" alt="Bouncing Balls And Rotating Rectangles preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/BouncingBallsAndRotatingRectangles.poster.png" alt="Bouncing Balls And Rotating Rectangles preview" loading="lazy"></div><div class="card-body"><div class="card-name">Bouncing Balls And Rotating Rectangles</div><div class="card-meta">BouncingBallsAndRotatingRectangles</div><div class="card-links"><a href="Vectors/BouncingBallsAndRotatingRectangles/" class="btn btn-primary" aria-label="Run Bouncing Balls And Rotating Rectangles">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/BouncingBallsAndRotatingRectangles" class="btn btn-secondary" aria-label="View source for Bouncing Balls And Rotating Rectangles">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/DistancePointLine.webp" alt="Distance Point Line preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/DistancePointLine.poster.png" alt="Distance Point Line preview" loading="lazy"></div><div class="card-body"><div class="card-name">Distance Point Line</div><div class="card-meta">DistancePointLine</div><div class="card-links"><a href="Vectors/DistancePointLine/" class="btn btn-primary" aria-label="Run Distance Point Line">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/DistancePointLine" class="btn btn-secondary" aria-label="View source for Distance Point Line">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/Vectors/MagnitudePlayground.webp" alt="Magnitude Playground preview" loading="lazy"><img class="thumb-still" src="previews/Vectors/MagnitudePlayground.poster.png" alt="Magnitude Playground preview" loading="lazy"></div><div class="card-body"><div class="card-name">Magnitude Playground</div><div class="card-meta">MagnitudePlayground</div><div class="card-links"><a href="Vectors/MagnitudePlayground/" class="btn btn-primary" aria-label="Run Magnitude Playground">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/Vectors/MagnitudePlayground" class="btn btn-secondary" aria-label="View source for Magnitude Playground">Code</a></div></div></div>
</div>
</section>
<section class="cat-section" id="cat-webserial">
<h2>WebSerial<span class="section-count">21 examples</span></h2>
<div class="subsection" id="cat-webserial--basic">
<h3 class="subcategory">Basic<span class="sub-count">4</span></h3>
<div class="grid">
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/Basic/DisplayText.poster.png" alt="Display Text Demo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Display Text Demo</div><div class="card-meta">DisplayText</div><div class="card-links"><a href="WebSerial/Basic/DisplayText/" class="btn btn-primary" aria-label="Run Display Text Demo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/Basic/DisplayText" class="btn btn-secondary" aria-label="View source for Display Text Demo">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/Basic/SliderOut.poster.png" alt="Simple Web Serial I/O Demo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Simple Web Serial I/O Demo</div><div class="card-meta">SliderOut</div><div class="card-links"><a href="WebSerial/Basic/SliderOut/" class="btn btn-primary" aria-label="Run Simple Web Serial I/O Demo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/Basic/SliderOut" class="btn btn-secondary" aria-label="View source for Simple Web Serial I/O Demo">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/Basic/SliderOutSuperBasic.poster.png" alt="Web Serial Demo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Web Serial Demo</div><div class="card-meta">SliderOutSuperBasic</div><div class="card-links"><a href="WebSerial/Basic/SliderOutSuperBasic/" class="btn btn-primary" aria-label="Run Web Serial Demo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/Basic/SliderOutSuperBasic" class="btn btn-secondary" aria-label="View source for Web Serial Demo">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/Basic/SliderOutWithInstructions.poster.png" alt="Simple Web Serial I/O Demo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Simple Web Serial I/O Demo</div><div class="card-meta">SliderOutWithInstructions</div><div class="card-links"><a href="WebSerial/Basic/SliderOutWithInstructions/" class="btn btn-primary" aria-label="Run Simple Web Serial I/O Demo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/Basic/SliderOutWithInstructions" class="btn btn-secondary" aria-label="View source for Simple Web Serial I/O Demo">Code</a></div></div></div>
</div>
</div>
<div class="subsection" id="cat-webserial--ml5js">
<h3 class="subcategory">ml5.js<span class="sub-count">3</span></h3>
<div class="grid">
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/ml5js/HandWaveDetector.poster.png" alt="Hand Wave Detector preview" loading="lazy"></div><div class="card-body"><div class="card-name">Hand Wave Detector</div><div class="card-meta">HandWaveDetector</div><div class="card-links"><a href="WebSerial/ml5js/HandWaveDetector/" class="btn btn-primary" aria-label="Run Hand Wave Detector">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/ml5js/HandWaveDetector" class="btn btn-secondary" aria-label="View source for Hand Wave Detector">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/ml5js/HandWaver.poster.png" alt="Hand Waver preview" loading="lazy"></div><div class="card-body"><div class="card-name">Hand Waver</div><div class="card-meta">HandWaver</div><div class="card-links"><a href="WebSerial/ml5js/HandWaver/" class="btn btn-primary" aria-label="Run Hand Waver">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/ml5js/HandWaver" class="btn btn-secondary" aria-label="View source for Hand Waver">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/ml5js/NoseTracker.poster.png" alt="Nose Tracker preview" loading="lazy"></div><div class="card-body"><div class="card-name">Nose Tracker</div><div class="card-meta">NoseTracker</div><div class="card-links"><a href="WebSerial/ml5js/NoseTracker/" class="btn btn-primary" aria-label="Run Nose Tracker">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/ml5js/NoseTracker" class="btn btn-secondary" aria-label="View source for Nose Tracker">Code</a></div></div></div>
</div>
</div>
<div class="subsection" id="cat-webserial--p5js">
<h3 class="subcategory">p5.js<span class="sub-count">14</span></h3>
<div class="grid">
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/Basic-WithP5js.poster.png" alt="Basic – Withp 5.js preview" loading="lazy"></div><div class="card-body"><div class="card-name">Basic – Withp 5.js</div><div class="card-meta">Basic-WithP5js</div><div class="card-links"><a href="WebSerial/p5js/Basic-WithP5js/" class="btn btn-primary" aria-label="Run Basic – Withp 5.js">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/Basic-WithP5js" class="btn btn-secondary" aria-label="View source for Basic – Withp 5.js">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/BlankTemplate.poster.png" alt="Blank Template preview" loading="lazy"></div><div class="card-body"><div class="card-name">Blank Template</div><div class="card-meta">BlankTemplate</div><div class="card-links"><a href="WebSerial/p5js/BlankTemplate/" class="btn btn-primary" aria-label="Run Blank Template">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/BlankTemplate" class="btn btn-secondary" aria-label="View source for Blank Template">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/CircleSizeIn.poster.png" alt="Circle Size In preview" loading="lazy"></div><div class="card-body"><div class="card-name">Circle Size In</div><div class="card-meta">CircleSizeIn</div><div class="card-links"><a href="WebSerial/p5js/CircleSizeIn/" class="btn btn-primary" aria-label="Run Circle Size In">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/CircleSizeIn" class="btn btn-secondary" aria-label="View source for Circle Size In">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/CircleSizeInDemo.poster.png" alt="Circle Size In Demo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Circle Size In Demo</div><div class="card-meta">CircleSizeInDemo</div><div class="card-links"><a href="WebSerial/p5js/CircleSizeInDemo/" class="btn btn-primary" aria-label="Run Circle Size In Demo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/CircleSizeInDemo" class="btn btn-secondary" aria-label="View source for Circle Size In Demo">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/ColorIO.poster.png" alt="Color IO preview" loading="lazy"></div><div class="card-body"><div class="card-name">Color IO</div><div class="card-meta">ColorIO</div><div class="card-links"><a href="WebSerial/p5js/ColorIO/" class="btn btn-primary" aria-label="Run Color IO">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/ColorIO" class="btn btn-secondary" aria-label="View source for Color IO">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/ColorSerialOut.poster.png" alt="Color Serial Out preview" loading="lazy"></div><div class="card-body"><div class="card-name">Color Serial Out</div><div class="card-meta">ColorSerialOut</div><div class="card-links"><a href="WebSerial/p5js/ColorSerialOut/" class="btn btn-primary" aria-label="Run Color Serial Out">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/ColorSerialOut" class="btn btn-secondary" aria-label="View source for Color Serial Out">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/DisplayShapeBidirectional.poster.png" alt="Display Shape Bidirectional preview" loading="lazy"></div><div class="card-body"><div class="card-name">Display Shape Bidirectional</div><div class="card-meta">DisplayShapeBidirectional</div><div class="card-links"><a href="WebSerial/p5js/DisplayShapeBidirectional/" class="btn btn-primary" aria-label="Run Display Shape Bidirectional">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/DisplayShapeBidirectional" class="btn btn-secondary" aria-label="View source for Display Shape Bidirectional">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/DisplayShapeOut.poster.png" alt="Display Shape Out preview" loading="lazy"></div><div class="card-body"><div class="card-name">Display Shape Out</div><div class="card-meta">DisplayShapeOut</div><div class="card-links"><a href="WebSerial/p5js/DisplayShapeOut/" class="btn btn-primary" aria-label="Run Display Shape Out">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/DisplayShapeOut" class="btn btn-secondary" aria-label="View source for Display Shape Out">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/EtchASketchIn.poster.png" alt="Etch ASketch In preview" loading="lazy"></div><div class="card-body"><div class="card-name">Etch ASketch In</div><div class="card-meta">EtchASketchIn</div><div class="card-links"><a href="WebSerial/p5js/EtchASketchIn/" class="btn btn-primary" aria-label="Run Etch ASketch In">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/EtchASketchIn" class="btn btn-secondary" aria-label="View source for Etch ASketch In">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/GraphIn.poster.png" alt="Graph In preview" loading="lazy"></div><div class="card-body"><div class="card-name">Graph In</div><div class="card-meta">GraphIn</div><div class="card-links"><a href="WebSerial/p5js/GraphIn/" class="btn btn-primary" aria-label="Run Graph In">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/GraphIn" class="btn btn-secondary" aria-label="View source for Graph In">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/PaintIO.poster.png" alt="Paint IO preview" loading="lazy"></div><div class="card-body"><div class="card-name">Paint IO</div><div class="card-meta">PaintIO</div><div class="card-links"><a href="WebSerial/p5js/PaintIO/" class="btn btn-primary" aria-label="Run Paint IO">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/PaintIO" class="btn btn-secondary" aria-label="View source for Paint IO">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/SerialTemplate.poster.png" alt="Serial Template preview" loading="lazy"></div><div class="card-body"><div class="card-name">Serial Template</div><div class="card-meta">SerialTemplate</div><div class="card-links"><a href="WebSerial/p5js/SerialTemplate/" class="btn btn-primary" aria-label="Run Serial Template">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/SerialTemplate" class="btn btn-secondary" aria-label="View source for Serial Template">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/ShapeLocationIn.poster.png" alt="Shape Location In preview" loading="lazy"></div><div class="card-body"><div class="card-name">Shape Location In</div><div class="card-meta">ShapeLocationIn</div><div class="card-links"><a href="WebSerial/p5js/ShapeLocationIn/" class="btn btn-primary" aria-label="Run Shape Location In">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/ShapeLocationIn" class="btn btn-secondary" aria-label="View source for Shape Location In">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img src="previews/WebSerial/p5js/XMouseSerialOut.poster.png" alt="XMouse Serial Out preview" loading="lazy"></div><div class="card-body"><div class="card-name">XMouse Serial Out</div><div class="card-meta">XMouseSerialOut</div><div class="card-links"><a href="WebSerial/p5js/XMouseSerialOut/" class="btn btn-primary" aria-label="Run XMouse Serial Out">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/WebSerial/p5js/XMouseSerialOut" class="btn btn-secondary" aria-label="View source for XMouse Serial Out">Code</a></div></div></div>
</div>
</div>
</section>
<section class="cat-section" id="cat-ml5js">
<h2>ml5js<span class="section-count">5 examples</span></h2>
<div class="subsection" id="cat-ml5js--handpose">
<h3 class="subcategory">HandPose<span class="sub-count">2</span></h3>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/ml5js/HandPose/HandPoseDemo.webp" alt="Hand PoseDemo preview" loading="lazy"><img class="thumb-still" src="previews/ml5js/HandPose/HandPoseDemo.poster.png" alt="Hand PoseDemo preview" loading="lazy"></div><div class="card-body"><div class="card-name">Hand PoseDemo</div><div class="card-meta">HandPoseDemo</div><div class="card-links"><a href="ml5js/HandPose/HandPoseDemo/" class="btn btn-primary" aria-label="Run Hand PoseDemo">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/ml5js/HandPose/HandPoseDemo" class="btn btn-secondary" aria-label="View source for Hand PoseDemo">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/ml5js/HandPose/HandWaveDetector.webp" alt="Hand Wave Detector preview" loading="lazy"><img class="thumb-still" src="previews/ml5js/HandPose/HandWaveDetector.poster.png" alt="Hand Wave Detector preview" loading="lazy"></div><div class="card-body"><div class="card-name">Hand Wave Detector</div><div class="card-meta">HandWaveDetector</div><div class="card-links"><a href="ml5js/HandPose/HandWaveDetector/" class="btn btn-primary" aria-label="Run Hand Wave Detector">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/ml5js/HandPose/HandWaveDetector" class="btn btn-secondary" aria-label="View source for Hand Wave Detector">Code</a></div></div></div>
</div>
</div>
<div class="subsection" id="cat-ml5js--posenet">
<h3 class="subcategory">PoseNet<span class="sub-count">3</span></h3>
<div class="grid">
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/ml5js/PoseNet/ElmoGenerator.webp" alt="Elmo Generator preview" loading="lazy"><img class="thumb-still" src="previews/ml5js/PoseNet/ElmoGenerator.poster.png" alt="Elmo Generator preview" loading="lazy"></div><div class="card-body"><div class="card-name">Elmo Generator</div><div class="card-meta">ElmoGenerator</div><div class="card-links"><a href="ml5js/PoseNet/ElmoGenerator/" class="btn btn-primary" aria-label="Run Elmo Generator">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/ml5js/PoseNet/ElmoGenerator" class="btn btn-secondary" aria-label="View source for Elmo Generator">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/ml5js/PoseNet/ElmoGeneratorMultiperson.webp" alt="Elmo Generator Multiperson preview" loading="lazy"><img class="thumb-still" src="previews/ml5js/PoseNet/ElmoGeneratorMultiperson.poster.png" alt="Elmo Generator Multiperson preview" loading="lazy"></div><div class="card-body"><div class="card-name">Elmo Generator Multiperson</div><div class="card-meta">ElmoGeneratorMultiperson</div><div class="card-links"><a href="ml5js/PoseNet/ElmoGeneratorMultiperson/" class="btn btn-primary" aria-label="Run Elmo Generator Multiperson">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/ml5js/PoseNet/ElmoGeneratorMultiperson" class="btn btn-secondary" aria-label="View source for Elmo Generator Multiperson">Code</a></div></div></div>
<div class="card"><div class="card-thumb"><img class="thumb-anim" src="previews/ml5js/PoseNet/Skeleton.webp" alt="Skeleton preview" loading="lazy"><img class="thumb-still" src="previews/ml5js/PoseNet/Skeleton.poster.png" alt="Skeleton preview" loading="lazy"></div><div class="card-body"><div class="card-name">Skeleton</div><div class="card-meta">Skeleton</div><div class="card-links"><a href="ml5js/PoseNet/Skeleton/" class="btn btn-primary" aria-label="Run Skeleton">▶ Run</a><a href="https://github.com/makeabilitylab/p5js/tree/main/ml5js/PoseNet/Skeleton" class="btn btn-secondary" aria-label="View source for Skeleton">Code</a></div></div></div>
</div>
</div>
</section>
</main>
</div>
<footer class="site-footer">
Built with ❤️ by the <a href="https://makeabilitylab.cs.washington.edu/">Makeability Lab</a>
at the University of Washington.
Page auto-generated by
<a href="https://github.com/makeabilitylab/p5js/blob/main/scripts/build_gallery.py">build_gallery.py</a>.
</footer>
<script>
const $$ = (sel, root) => Array.from((root || document).querySelectorAll(sel));
const sidebar = document.getElementById('sidebar');
const backdrop = document.getElementById('backdrop');
const toggleBtn = document.querySelector('.sidebar-toggle');
const isNarrow = () => window.matchMedia('(max-width: 820px)').matches;
// --- Mobile drawer ---
function setDrawer(open) {
sidebar.classList.toggle('open', open);
backdrop.classList.toggle('show', open);
toggleBtn.setAttribute('aria-expanded', open ? 'true' : 'false');
}
toggleBtn.addEventListener('click', () => setDrawer(!sidebar.classList.contains('open')));
backdrop.addEventListener('click', () => setDrawer(false));
// --- Collapse / expand categories ---
$$('.tree-toggle').forEach(btn => {
if (btn.classList.contains('tree-toggle--empty')) return;
btn.addEventListener('click', () => {
const li = btn.closest('.tree-cat');
const collapsed = li.classList.toggle('collapsed');
btn.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
});
});
// --- Close the drawer after tapping a nav link on mobile ---
const treeLinks = $$('.tree-link, .tree-sublink');
treeLinks.forEach(a => a.addEventListener('click', () => { if (isNarrow()) setDrawer(false); }));
// --- Live search ---
const searchBox = document.getElementById('search');
const cards = $$('.card');
const sections = $$('.cat-section');
const subsections = $$('.subsection');
searchBox.addEventListener('input', () => {
const q = searchBox.value.toLowerCase().trim();
cards.forEach(c => c.classList.toggle('hidden', q && !c.textContent.toLowerCase().includes(q)));
subsections.forEach(s => s.classList.toggle('hidden', !s.querySelector('.card:not(.hidden)')));
sections.forEach(s => s.classList.toggle('hidden', !s.querySelector('.card:not(.hidden)')));
// Mirror the filtering in the sidebar tree.
treeLinks.forEach(a => {
const target = document.getElementById(a.dataset.target);
const hidden = target && target.classList.contains('hidden');
a.closest('li').classList.toggle('tree-hidden', !!hidden);
});
});
// --- Scroll-spy: highlight the tree entry for the section in view ---
const linkByTarget = {};
treeLinks.forEach(a => { linkByTarget[a.dataset.target] = a; });
const spyTargets = sections.concat(subsections);
if ('IntersectionObserver' in window && spyTargets.length) {
const observer = new IntersectionObserver(entries => {
entries.forEach(en => {
if (!en.isIntersecting) return;
const a = linkByTarget[en.target.id];
if (!a) return;
treeLinks.forEach(l => l.classList.remove('active'));
a.classList.add('active');
const li = a.closest('.tree-cat');
if (li) li.classList.remove('collapsed');
});
}, { rootMargin: '-70px 0px -72% 0px', threshold: 0 });
spyTargets.forEach(t => observer.observe(t));
}
</script>
</body>
</html>