privateboard 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/themes.css CHANGED
@@ -315,6 +315,44 @@
315
315
  --magenta: #C5839E;
316
316
  }
317
317
 
318
+ /* ─── NINTENDO · 8-bit NES palette · Mario red on dark sky ───
319
+ Built from the classic NES title-screen vocabulary: deep
320
+ night-sky background, pure-white NES title text, Mario red
321
+ as the primary accent (the slot called `--lime*` in this
322
+ codebase), coin-block gold for amber, fire-flower red for
323
+ warnings, and sky-cloud cyan for the moderator accent. Every
324
+ swatch is high-saturation / high-contrast in the NES family —
325
+ no muted desaturated tones (those don't belong in 8-bit). */
326
+ :root[data-theme="nintendo"] {
327
+ --bg: #181820;
328
+ --panel: #22222C;
329
+ --panel-2: #2A2A38;
330
+ --panel-3: #34344A;
331
+ --hi: #44445A;
332
+
333
+ --line: #2C2C3A;
334
+ --line-bright: #44445A;
335
+ --line-strong: #5C5C72;
336
+
337
+ --text: #FCFCFC;
338
+ --text-soft: #C8C8D8;
339
+ --text-dim: #8E8EA0;
340
+ --text-faint: #5C5C70;
341
+
342
+ /* Primary accent · Mario red. Token names stay `--lime*` so every
343
+ callsite that already references the primary keeps working. */
344
+ --lime: #E60012;
345
+ --lime-deep: #A40009;
346
+ --lime-dim: #4F0007;
347
+
348
+ --amber: #FBC000; /* coin / question block */
349
+ --amber-dim: #6B4D00;
350
+ --red: #FC4438; /* fire flower */
351
+ --red-dim: #6E1A14;
352
+ --cyan: #5BC0EB; /* Mario sky / chair moderator */
353
+ --magenta: #FC74FC; /* princess pink / power-up */
354
+ }
355
+
318
356
  /* ─── REGENT · gold-on-warm-dark · the eastwood twin
319
357
  The same warm dark palette as the default eastwood, with the
320
358
  primary forest-green accent swapped for the warm gold used by
@@ -171,6 +171,63 @@
171
171
  osc.stop(t0 + dur);
172
172
  }
173
173
 
174
+ /** Chair gavel cue · fires before chair voice playback begins in
175
+ * voice mode. Two-strike wooden knock that reads as "court is in
176
+ * session — listen up." Designed by ear:
177
+ * · Layer 1 · low sine ~190 Hz, 1ms attack + 220ms decay,
178
+ * gives the bass "thunk" of wood on wood.
179
+ * · Layer 2 · filtered noise burst at ~3.2 kHz, 30ms total,
180
+ * provides the sharp percussive transient.
181
+ * · Two strikes 160ms apart so the ear hears a deliberate
182
+ * "knock-knock" pattern (single strike read as a glitch /
183
+ * typewriter chime in early prototyping). */
184
+ function gavel() {
185
+ if (!_enabled) return;
186
+ if (document.visibilityState !== "visible") return;
187
+ const ctx = ensureContext();
188
+ if (!ctx) return;
189
+ const t0 = ctx.currentTime;
190
+ const strikes = [0, 0.16];
191
+ for (const offset of strikes) {
192
+ const t = t0 + offset;
193
+ // Body resonance · low sine, fat envelope.
194
+ const body = ctx.createOscillator();
195
+ body.type = "sine";
196
+ body.frequency.setValueAtTime(220, t);
197
+ body.frequency.exponentialRampToValueAtTime(140, t + 0.18);
198
+ const bodyGain = ctx.createGain();
199
+ bodyGain.gain.setValueAtTime(0.0001, t);
200
+ bodyGain.gain.exponentialRampToValueAtTime(0.18, t + 0.005);
201
+ bodyGain.gain.exponentialRampToValueAtTime(0.0001, t + 0.22);
202
+ body.connect(bodyGain).connect(ctx.destination);
203
+ body.start(t);
204
+ body.stop(t + 0.25);
205
+ // Transient click · 30ms filtered noise burst.
206
+ const noiseBuf = ctx.createBuffer(
207
+ 1,
208
+ Math.max(1, Math.floor(ctx.sampleRate * 0.03)),
209
+ ctx.sampleRate,
210
+ );
211
+ const noiseData = noiseBuf.getChannelData(0);
212
+ for (let i = 0; i < noiseData.length; i++) {
213
+ noiseData[i] = (Math.random() * 2 - 1) * (1 - i / noiseData.length);
214
+ }
215
+ const noise = ctx.createBufferSource();
216
+ noise.buffer = noiseBuf;
217
+ const bp = ctx.createBiquadFilter();
218
+ bp.type = "bandpass";
219
+ bp.frequency.value = 3200;
220
+ bp.Q.value = 0.8;
221
+ const noiseGain = ctx.createGain();
222
+ noiseGain.gain.setValueAtTime(0.0001, t);
223
+ noiseGain.gain.exponentialRampToValueAtTime(0.10, t + 0.003);
224
+ noiseGain.gain.exponentialRampToValueAtTime(0.0001, t + 0.035);
225
+ noise.connect(bp).connect(noiseGain).connect(ctx.destination);
226
+ noise.start(t);
227
+ noise.stop(t + 0.05);
228
+ }
229
+ }
230
+
174
231
  function setEnabled(on) {
175
232
  _enabled = !!on;
176
233
  writeEnabled(_enabled);
@@ -183,5 +240,5 @@
183
240
 
184
241
  // Public surface · attached to window so app.js (and the
185
242
  // user-settings toggle) can reach it without an import.
186
- window.boardroomTypingSfx = { tick, speakerChange, setEnabled, isEnabled };
243
+ window.boardroomTypingSfx = { tick, speakerChange, gavel, setEnabled, isEnabled };
187
244
  })();
@@ -40,7 +40,9 @@
40
40
  { slug: "nebirhos", name: "Nebirhos", desc: "teal · warm orange highlights",
41
41
  swatches: ["#0A1414","#11201F","#5EB1A6","#357770","#DD9258","#D87060","#6FBEC2","#B8D4D0"] },
42
42
  { slug: "wedisagree", name: "We Disagree", desc: "argumentative orange · subtle green",
43
- swatches: ["#14110E","#1F1A14","#DD7B40","#A8521E","#E6B872","#E26060","#6FB28A","#D8CBBC"] }
43
+ swatches: ["#14110E","#1F1A14","#DD7B40","#A8521E","#E6B872","#E26060","#6FB28A","#D8CBBC"] },
44
+ { slug: "nintendo", name: "8-bit", desc: "NES palette · Mario red · coin gold · sky cyan",
45
+ swatches: ["#181820","#22222C","#E60012","#A40009","#FBC000","#FC4438","#5BC0EB","#FCFCFC"] }
44
46
  ];
45
47
 
46
48
  const PROVIDERS = [