|
| 1 | +<!DOCTYPE html> |
| 2 | +<html lang="en"> |
| 3 | +<head> |
| 4 | + <meta charset="UTF-8"> |
| 5 | + <title>blobSketch – Help & User Guide</title> |
| 6 | + <style> |
| 7 | + /* ---------- GLOBAL BOX-SIZING ---------- */ |
| 8 | + *, *::before, *::after { |
| 9 | + box-sizing: border-box; |
| 10 | + } |
| 11 | + |
| 12 | + /* ---------- GENERAL LAYOUT ---------- */ |
| 13 | + html, body { |
| 14 | + margin: 0; |
| 15 | + height: 100%; |
| 16 | + font-family: "Courier New", monospace; |
| 17 | + background: #efefef; |
| 18 | + color: #000; |
| 19 | + } |
| 20 | + body { |
| 21 | + display: flex; |
| 22 | + overflow: hidden; |
| 23 | + } |
| 24 | + aside { |
| 25 | + /* fix width and prevent shrinking below min-width */ |
| 26 | + flex: 0 0 230px; |
| 27 | + min-width: 200px; |
| 28 | + background: #d9d9d9; |
| 29 | + border-right: 2px solid #000; |
| 30 | + padding: 16px 14px 40px; |
| 31 | + overflow-y: auto; |
| 32 | + } |
| 33 | + main { |
| 34 | + flex: 1 1 auto; |
| 35 | + padding: 28px 36px 80px; |
| 36 | + overflow-y: auto; |
| 37 | + } |
| 38 | + |
| 39 | + /* ---------- TYPOGRAPHY ---------- */ |
| 40 | + h1 { |
| 41 | + margin: 0 0 18px; |
| 42 | + font-size: 22px; |
| 43 | + font-weight: bold; |
| 44 | + } |
| 45 | + h2 { |
| 46 | + background: #c0c0c0; |
| 47 | + border: 2px solid #000; |
| 48 | + padding: 4px 8px; |
| 49 | + margin: 26px 0 10px; |
| 50 | + font-size: 18px; |
| 51 | + } |
| 52 | + h3 { |
| 53 | + margin: 18px 0 6px; |
| 54 | + font-size: 16px; |
| 55 | + } |
| 56 | + p, li { |
| 57 | + font-size: 14px; |
| 58 | + line-height: 1.5; |
| 59 | + } |
| 60 | + kbd { |
| 61 | + display: inline-block; |
| 62 | + min-width: 20px; |
| 63 | + padding: 1px 4px; |
| 64 | + border: 1px solid #000; |
| 65 | + border-radius: 4px; |
| 66 | + background: #fff; |
| 67 | + font-size: 12px; |
| 68 | + text-align: center; |
| 69 | + } |
| 70 | + |
| 71 | + /* ---------- NAVIGATION ---------- */ |
| 72 | + nav ul { |
| 73 | + list-style: none; |
| 74 | + margin: 0; |
| 75 | + padding: 0; |
| 76 | + } |
| 77 | + nav li { |
| 78 | + margin-bottom: 6px; |
| 79 | + } |
| 80 | + nav a { |
| 81 | + display: block; |
| 82 | + color: #000; |
| 83 | + text-decoration: none; |
| 84 | + font-weight: bold; |
| 85 | + /* ensure long labels wrap rather than overflow */ |
| 86 | + word-wrap: break-word; |
| 87 | + word-break: break-word; |
| 88 | + hyphens: auto; |
| 89 | + } |
| 90 | + nav a:hover { |
| 91 | + text-decoration: underline; |
| 92 | + } |
| 93 | + nav a.active { |
| 94 | + background: #ff0; |
| 95 | + padding: 2px 4px; |
| 96 | + border: 1px solid #000; |
| 97 | + } |
| 98 | + nav ul ul { |
| 99 | + margin-top: 4px; |
| 100 | + margin-left: 12px; |
| 101 | + padding-left: 12px; |
| 102 | + border-left: 1px solid #000; |
| 103 | + } |
| 104 | + |
| 105 | + /* ---------- TABLE ---------- */ |
| 106 | + table { |
| 107 | + border-collapse: collapse; |
| 108 | + width: 100%; |
| 109 | + margin: 8px 0; |
| 110 | + } |
| 111 | + th, td { |
| 112 | + border: 1px solid #000; |
| 113 | + padding: 6px 8px; |
| 114 | + text-align: left; |
| 115 | + } |
| 116 | + th { |
| 117 | + background: #c0c0c0; |
| 118 | + } |
| 119 | + |
| 120 | + /* ---------- BACK LINK ---------- */ |
| 121 | + .back-link { |
| 122 | + display: block; |
| 123 | + margin-top: 28px; |
| 124 | + font-weight: bold; |
| 125 | + } |
| 126 | + |
| 127 | + /* ---------- RESPONSIVE Fallback ---------- */ |
| 128 | + @media (max-width: 600px) { |
| 129 | + body { |
| 130 | + flex-direction: column; |
| 131 | + overflow: auto; |
| 132 | + } |
| 133 | + aside { |
| 134 | + width: 100%; |
| 135 | + flex: 0 0 auto; |
| 136 | + border-right: none; |
| 137 | + border-bottom: 2px solid #000; |
| 138 | + } |
| 139 | + main { |
| 140 | + width: 100%; |
| 141 | + padding-top: 14px; |
| 142 | + } |
| 143 | + /* collapse nested borders on mobile */ |
| 144 | + nav ul ul { |
| 145 | + border-left: none; |
| 146 | + padding-left: 12px; |
| 147 | + } |
| 148 | + } |
| 149 | + </style> |
| 150 | +</head> |
| 151 | +<body> |
| 152 | + <aside> |
| 153 | + <h1>blobSketch Help</h1> |
| 154 | + <nav> |
| 155 | + <ul> |
| 156 | + <li><a href="#intro">Overview</a></li> |
| 157 | + <li><a href="#interface">Interface</a> |
| 158 | + <ul> |
| 159 | + <li><a href="#draw">Draw Tools</a></li> |
| 160 | + <li><a href="#edit">Edit Tools</a></li> |
| 161 | + <li><a href="#shape">Shape Settings</a></li> |
| 162 | + <li><a href="#sliders">Physics Sliders</a></li> |
| 163 | + <li><a href="#canvas">Canvas Controls</a></li> |
| 164 | + </ul> |
| 165 | + </li> |
| 166 | + <li><a href="#requirements">System Requirements</a></li> |
| 167 | + <li><a href="#file">File & Export</a></li> |
| 168 | + <li><a href="#troubleshooting">Troubleshooting</a></li> |
| 169 | + </ul> |
| 170 | + </nav> |
| 171 | + <a href="index.html" class="back-link">← Back to App</a> |
| 172 | + </aside> |
| 173 | + <main> |
| 174 | + <section id="intro"> |
| 175 | + <h2>Overview</h2> |
| 176 | + <p>blobSketch is a WebGL-based canvas for creating physics-driven blobs, lines, and repulsion circles. Draw shapes, tweak physics, then export to SVG or high-res JPG.</p> |
| 177 | + </section> |
| 178 | + |
| 179 | + <section id="interface"> |
| 180 | + <h2>Interface</h2> |
| 181 | + <ul> |
| 182 | + <li><strong>Toolbar (left)</strong> – icons for draw/edit modes and shape defaults.</li> |
| 183 | + <li><strong>Canvas (center)</strong> – 500×500 px drawing area with always-on grid.</li> |
| 184 | + <li><strong>Sliders (bottom)</strong> – real-time physics controls.</li> |
| 185 | + </ul> |
| 186 | + </section> |
| 187 | + |
| 188 | + <section id="draw"> |
| 189 | + <h2>Draw Tools</h2> |
| 190 | + <ul> |
| 191 | + <li><strong>Blob</strong> – closed shapes. Click-drag to draw; releases seal the shape.</li> |
| 192 | + <li><strong>Line</strong> – open polylines. Click-drag to draw</li> |
| 193 | + <li><strong>Circle</strong> – draw a repulsion circle. Drag sets radius; blobs avoid inside. Wrap blobs around circles to create controlled shapes.</li> |
| 194 | + </ul> |
| 195 | + <p>Active tool shows an "ON" badge on its icon.</p> |
| 196 | + </section> |
| 197 | + |
| 198 | + <section id="edit"> |
| 199 | + <h2>Edit Tools</h2> |
| 200 | + <ul> |
| 201 | + <li><strong>Drag</strong> – move blobs, lines or circles.</li> |
| 202 | + <li><strong>Freeze</strong> – lock physics inside closed shapes (dashed rendering).</li> |
| 203 | + <li><strong>Slice</strong> – click a chain segment to split the shape.</li> |
| 204 | + <li><strong>Pin</strong> – fix single points in place (red target ring). Click red target ring to release point.</li> |
| 205 | + <li><strong>Delete</strong> – erase the nearest circle, line segment or blob.</li> |
| 206 | + </ul> |
| 207 | + <p>Only one edit mode may be active at a time.</p> |
| 208 | + </section> |
| 209 | + |
| 210 | + <section id="shape"> |
| 211 | + <h2>Shape Settings</h2> |
| 212 | + <ul> |
| 213 | + <li><strong>Color</strong> – sets stroke/fill color.</li> |
| 214 | + <li><strong>Size</strong> – sets the base blob / line size</li> |
| 215 | + <li><strong>Variation</strong> – random size variation per drawn object</li> |
| 216 | + </ul> |
| 217 | + </section> |
| 218 | + |
| 219 | + <section id="sliders"> |
| 220 | + <h2>Physics Sliders</h2> |
| 221 | + <table> |
| 222 | + <thead><tr><th>Slider</th><th>Description</th></tr></thead> |
| 223 | + <tbody> |
| 224 | + <tr><td>Blob Size</td><td>Scales blob size.</td></tr> |
| 225 | + <tr><td>Excitability</td><td>Controls bounce/damping.</td></tr> |
| 226 | + <tr><td>Rigidity</td><td>Spring tension between points on blob/line.</td></tr> |
| 227 | + <tr><td>Turmoil</td><td>Repulsion strength to avoid overlaps.</td></tr> |
| 228 | + <tr><td>Animation Speed</td><td>Adjusts the global timestep.</td></tr> |
| 229 | + </tbody> |
| 230 | + </table> |
| 231 | + </section> |
| 232 | + |
| 233 | + <section id="canvas"> |
| 234 | + <h2>Canvas Controls</h2> |
| 235 | + <ul> |
| 236 | + <li><strong>Thickness (T icon)</strong> – toggles 1 px/5 px stroke.</li> |
| 237 | + <li><strong>Undo (⎌)</strong> – removes last element.</li> |
| 238 | + <li><strong>Repel ↔ </strong> – enables high repel mode, which adds more force to keep blobs from intersecting</li> |
| 239 | + <li><strong>Reset (⟳)</strong> – clears all after confirmation.</li> |
| 240 | + </ul> |
| 241 | + </section> |
| 242 | + <section id="shortcuts"> |
| 243 | + <h2>Keyboard</h2> |
| 244 | + <ul> |
| 245 | + <li><kbd>Space</kbd> – Freezes animation -> toggles Excitability to 0 and back.</li> |
| 246 | + </ul> |
| 247 | + </section> |
| 248 | + <section id="file"> |
| 249 | + <h2>File & Export</h2> |
| 250 | + <h3>File Menu</h3> |
| 251 | + <ul> |
| 252 | + <li>Save Blobs – saves shapes + settings to JSON.</li> |
| 253 | + <li>Load Blobs – import shapes + settings from JSON.</li> |
| 254 | + </ul> |
| 255 | + <h3>Export Menu</h3> |
| 256 | + <ul> |
| 257 | + <li>Lines → SVG/JPG – strokes only.</li> |
| 258 | + <li>Fill → SVG/JPG – fills closed shapes.</li> |
| 259 | + </ul> |
| 260 | + </section> |
| 261 | + <section id="requirements"> |
| 262 | + <h2>System Requirements</h2> |
| 263 | + <h3>Hardware</h3> |
| 264 | + <ul> |
| 265 | + <li><strong>Desktop / Laptop (recommended)</strong> – any CPU from 2013‑onward with an |
| 266 | + integrated or discrete GPU that supports OpenGL 2.1 / WebGL 1.0.</li> |
| 267 | + <li><strong>Tablets and Mobile Devices</strong> – Not Supported</li> |
| 268 | + </ul> |
| 269 | + |
| 270 | + <h3>Software</h3> |
| 271 | + <ul> |
| 272 | + <li><strong>Browsers</strong> – Chrome 49+, Firefox 44+, Edge 79+, Safari 11+ with WebGL enabled.</li> |
| 273 | + <li><strong>OS</strong> – Windows 7+, macOS 10.11+, Linux distros with Mesa 11+ drivers.</li> |
| 274 | + </ul> |
| 275 | + |
| 276 | + <h3>Performance Tips</h3> |
| 277 | + <ul> |
| 278 | + <li>Turn off <em>Thickness</em> or lower <em>Blob Size</em> on Intel HD 4000‑era GPUs.</li> |
| 279 | + <li>Press <kbd>Space</kbd> to mute physics when previewing static artwork.</li> |
| 280 | + <li>Laptop users: disable high‑DPI rendering by setting browser zoom to 100 % for extra FPS.</li> |
| 281 | + </ul> |
| 282 | + </section> |
| 283 | + <section id="troubleshooting"> |
| 284 | + <h2>Troubleshooting</h2> |
| 285 | + <ul> |
| 286 | + <li><strong>No drawing?</strong> Ensure WebGL is enabled in your browser.</li> |
| 287 | + <li><strong>Slow performance?</strong> Lower Blob Size or Animation Speed.</li> |
| 288 | + <li><strong>Mobile warning?</strong> App requires a desktop browser.</li> |
| 289 | + </ul> |
| 290 | + </section> |
| 291 | + </main> |
| 292 | + |
| 293 | + <script> |
| 294 | + const navLinks = document.querySelectorAll('aside nav a'); |
| 295 | + const sections = document.querySelectorAll('main section'); |
| 296 | + function updateNav(){ |
| 297 | + let id = 'intro'; |
| 298 | + sections.forEach(sec=>{ |
| 299 | + if(sec.getBoundingClientRect().top <= 60) id=sec.id; |
| 300 | + }); |
| 301 | + navLinks.forEach(a=>a.classList.toggle('active', a.getAttribute('href').slice(1)===id)); |
| 302 | + } |
| 303 | + document.addEventListener('scroll', updateNav, {passive:true}); |
| 304 | + </script> |
| 305 | +</body> |
| 306 | +</html> |
0 commit comments