waitroom 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -0
- package/dist/chunk-3RJ542WD.js +130 -0
- package/dist/chunk-3RJ542WD.js.map +1 -0
- package/dist/chunk-4DE2IREA.cjs +9 -0
- package/dist/chunk-4DE2IREA.cjs.map +1 -0
- package/dist/chunk-5AUPIR2C.cjs +90 -0
- package/dist/chunk-5AUPIR2C.cjs.map +1 -0
- package/dist/chunk-ARXVTVP4.js +55 -0
- package/dist/chunk-ARXVTVP4.js.map +1 -0
- package/dist/chunk-C5XPYOJI.js +137 -0
- package/dist/chunk-C5XPYOJI.js.map +1 -0
- package/dist/chunk-DEQZY4AM.js +58 -0
- package/dist/chunk-DEQZY4AM.js.map +1 -0
- package/dist/chunk-FH3QBC6T.cjs +139 -0
- package/dist/chunk-FH3QBC6T.cjs.map +1 -0
- package/dist/chunk-GEBKOXLQ.cjs +255 -0
- package/dist/chunk-GEBKOXLQ.cjs.map +1 -0
- package/dist/chunk-JG5ZMB2Y.cjs +142 -0
- package/dist/chunk-JG5ZMB2Y.cjs.map +1 -0
- package/dist/chunk-MAWVAR3Q.cjs +135 -0
- package/dist/chunk-MAWVAR3Q.cjs.map +1 -0
- package/dist/chunk-MMNQMDV3.js +39 -0
- package/dist/chunk-MMNQMDV3.js.map +1 -0
- package/dist/chunk-O6CAFCTV.js +140 -0
- package/dist/chunk-O6CAFCTV.js.map +1 -0
- package/dist/chunk-P6NO27XB.cjs +74 -0
- package/dist/chunk-P6NO27XB.cjs.map +1 -0
- package/dist/chunk-PKRYY3X6.cjs +60 -0
- package/dist/chunk-PKRYY3X6.cjs.map +1 -0
- package/dist/chunk-PUR7CO53.js +72 -0
- package/dist/chunk-PUR7CO53.js.map +1 -0
- package/dist/chunk-R5V2UBE7.js +88 -0
- package/dist/chunk-R5V2UBE7.js.map +1 -0
- package/dist/chunk-SSP4S4NY.cjs +57 -0
- package/dist/chunk-SSP4S4NY.cjs.map +1 -0
- package/dist/chunk-SUJCEDVR.js +251 -0
- package/dist/chunk-SUJCEDVR.js.map +1 -0
- package/dist/chunk-V4RO47V6.cjs +41 -0
- package/dist/chunk-V4RO47V6.cjs.map +1 -0
- package/dist/chunk-V5DABI44.cjs +172 -0
- package/dist/chunk-V5DABI44.cjs.map +1 -0
- package/dist/chunk-V6TY7KAL.js +7 -0
- package/dist/chunk-V6TY7KAL.js.map +1 -0
- package/dist/chunk-VKSLYTRF.js +170 -0
- package/dist/chunk-VKSLYTRF.js.map +1 -0
- package/dist/core/index.cjs +30 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +23 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/doodle/basic-canvas.cjs +13 -0
- package/dist/doodle/basic-canvas.cjs.map +1 -0
- package/dist/doodle/basic-canvas.d.cts +5 -0
- package/dist/doodle/basic-canvas.d.ts +5 -0
- package/dist/doodle/basic-canvas.js +4 -0
- package/dist/doodle/basic-canvas.js.map +1 -0
- package/dist/doodle/index.cjs +13 -0
- package/dist/doodle/index.cjs.map +1 -0
- package/dist/doodle/index.d.cts +2 -0
- package/dist/doodle/index.d.ts +2 -0
- package/dist/doodle/index.js +4 -0
- package/dist/doodle/index.js.map +1 -0
- package/dist/engine--hGQ4LNR.d.ts +16 -0
- package/dist/engine-DdHCpfbk.d.cts +16 -0
- package/dist/facts/dev-tips.cjs +13 -0
- package/dist/facts/dev-tips.cjs.map +1 -0
- package/dist/facts/dev-tips.d.cts +5 -0
- package/dist/facts/dev-tips.d.ts +5 -0
- package/dist/facts/dev-tips.js +4 -0
- package/dist/facts/dev-tips.js.map +1 -0
- package/dist/facts/index.cjs +23 -0
- package/dist/facts/index.cjs.map +1 -0
- package/dist/facts/index.d.cts +4 -0
- package/dist/facts/index.d.ts +4 -0
- package/dist/facts/index.js +6 -0
- package/dist/facts/index.js.map +1 -0
- package/dist/facts/programming-trivia.cjs +13 -0
- package/dist/facts/programming-trivia.cjs.map +1 -0
- package/dist/facts/programming-trivia.d.cts +5 -0
- package/dist/facts/programming-trivia.d.ts +5 -0
- package/dist/facts/programming-trivia.js +4 -0
- package/dist/facts/programming-trivia.js.map +1 -0
- package/dist/facts/tech-stats.cjs +13 -0
- package/dist/facts/tech-stats.cjs.map +1 -0
- package/dist/facts/tech-stats.d.cts +5 -0
- package/dist/facts/tech-stats.d.ts +5 -0
- package/dist/facts/tech-stats.js +4 -0
- package/dist/facts/tech-stats.js.map +1 -0
- package/dist/games/click-counter.cjs +13 -0
- package/dist/games/click-counter.cjs.map +1 -0
- package/dist/games/click-counter.d.cts +5 -0
- package/dist/games/click-counter.d.ts +5 -0
- package/dist/games/click-counter.js +4 -0
- package/dist/games/click-counter.js.map +1 -0
- package/dist/games/index.cjs +23 -0
- package/dist/games/index.cjs.map +1 -0
- package/dist/games/index.d.cts +4 -0
- package/dist/games/index.d.ts +4 -0
- package/dist/games/index.js +6 -0
- package/dist/games/index.js.map +1 -0
- package/dist/games/memory.cjs +13 -0
- package/dist/games/memory.cjs.map +1 -0
- package/dist/games/memory.d.cts +5 -0
- package/dist/games/memory.d.ts +5 -0
- package/dist/games/memory.js +4 -0
- package/dist/games/memory.js.map +1 -0
- package/dist/games/snake.cjs +13 -0
- package/dist/games/snake.cjs.map +1 -0
- package/dist/games/snake.d.cts +5 -0
- package/dist/games/snake.d.ts +5 -0
- package/dist/games/snake.js +4 -0
- package/dist/games/snake.js.map +1 -0
- package/dist/index.cjs +43 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +22 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +24 -0
- package/dist/react/index.d.ts +24 -0
- package/dist/react/index.js +5 -0
- package/dist/react/index.js.map +1 -0
- package/dist/types-vBwPFyxq.d.cts +101 -0
- package/dist/types-vBwPFyxq.d.ts +101 -0
- package/package.json +64 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk4DE2IREA_cjs = require('./chunk-4DE2IREA.cjs');
|
|
4
|
+
|
|
5
|
+
// src/core/state.ts
|
|
6
|
+
var STORAGE_KEY_PREFIX = "waitroom_";
|
|
7
|
+
var _StateManager = class _StateManager {
|
|
8
|
+
constructor() {
|
|
9
|
+
}
|
|
10
|
+
static getInstance() {
|
|
11
|
+
if (!_StateManager.instance) {
|
|
12
|
+
_StateManager.instance = new _StateManager();
|
|
13
|
+
}
|
|
14
|
+
return _StateManager.instance;
|
|
15
|
+
}
|
|
16
|
+
// --- Game State ---
|
|
17
|
+
getGameState(gameId) {
|
|
18
|
+
try {
|
|
19
|
+
const data = localStorage.getItem(`${STORAGE_KEY_PREFIX}game_${gameId}`);
|
|
20
|
+
if (data) {
|
|
21
|
+
return JSON.parse(data);
|
|
22
|
+
}
|
|
23
|
+
} catch (e) {
|
|
24
|
+
console.warn("Failed to load game state", e);
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
saveGameState(gameId, state) {
|
|
29
|
+
try {
|
|
30
|
+
localStorage.setItem(
|
|
31
|
+
`${STORAGE_KEY_PREFIX}game_${gameId}`,
|
|
32
|
+
JSON.stringify(state)
|
|
33
|
+
);
|
|
34
|
+
} catch (e) {
|
|
35
|
+
console.warn("Failed to save game state", e);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// --- Mode Preference ---
|
|
39
|
+
getPreferredMode() {
|
|
40
|
+
try {
|
|
41
|
+
return localStorage.getItem(
|
|
42
|
+
`${STORAGE_KEY_PREFIX}mode`
|
|
43
|
+
);
|
|
44
|
+
} catch (e) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
savePreferredMode(mode) {
|
|
49
|
+
try {
|
|
50
|
+
localStorage.setItem(`${STORAGE_KEY_PREFIX}mode`, mode);
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.warn("Failed to save preferred mode", e);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
chunk4DE2IREA_cjs.__publicField(_StateManager, "instance");
|
|
57
|
+
var StateManager = _StateManager;
|
|
58
|
+
var stateManager = StateManager.getInstance();
|
|
59
|
+
|
|
60
|
+
// src/core/engine.ts
|
|
61
|
+
var LoadingEngine = class {
|
|
62
|
+
constructor(container, config) {
|
|
63
|
+
chunk4DE2IREA_cjs.__publicField(this, "config");
|
|
64
|
+
chunk4DE2IREA_cjs.__publicField(this, "container");
|
|
65
|
+
chunk4DE2IREA_cjs.__publicField(this, "currentInstance", null);
|
|
66
|
+
chunk4DE2IREA_cjs.__publicField(this, "activeMode", "none");
|
|
67
|
+
this.container = container;
|
|
68
|
+
this.config = config;
|
|
69
|
+
}
|
|
70
|
+
init() {
|
|
71
|
+
let startMode = this.config.mode || "none";
|
|
72
|
+
if (this.config.persistModePreference) {
|
|
73
|
+
const saved = stateManager.getPreferredMode();
|
|
74
|
+
if (saved && this.config.availableModes?.includes(saved)) {
|
|
75
|
+
startMode = saved;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.setMode(startMode);
|
|
79
|
+
}
|
|
80
|
+
setMode(mode) {
|
|
81
|
+
if (this.activeMode === mode) return;
|
|
82
|
+
if (this.currentInstance) {
|
|
83
|
+
this.currentInstance.destroy();
|
|
84
|
+
this.currentInstance = null;
|
|
85
|
+
}
|
|
86
|
+
this.activeMode = mode;
|
|
87
|
+
this.container.style.opacity = "0";
|
|
88
|
+
this.container.style.transition = `opacity ${this.config.transitionDuration || 300}ms ease-in-out`;
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
this.render();
|
|
91
|
+
this.container.style.opacity = "1";
|
|
92
|
+
}, (this.config.transitionDuration || 300) / 2);
|
|
93
|
+
if (this.config.persistModePreference && mode !== "none") {
|
|
94
|
+
stateManager.savePreferredMode(mode);
|
|
95
|
+
}
|
|
96
|
+
if (this.config.onModeChange) {
|
|
97
|
+
this.config.onModeChange(mode);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
render() {
|
|
101
|
+
this.container.innerHTML = "";
|
|
102
|
+
if (this.activeMode === "none") {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (this.activeMode === "game" && this.config.game) {
|
|
106
|
+
const gamePlugin = this.config.game;
|
|
107
|
+
const savedState = stateManager.getGameState(gamePlugin.id) || {};
|
|
108
|
+
this.currentInstance = gamePlugin.renderMini(this.container, savedState);
|
|
109
|
+
} else if (this.activeMode === "facts" && this.config.facts) {
|
|
110
|
+
const factsPlugin = this.config.facts;
|
|
111
|
+
this.currentInstance = factsPlugin.renderMini(this.container);
|
|
112
|
+
} else if (this.activeMode === "doodle" && this.config.doodle) {
|
|
113
|
+
const doodlePlugin = this.config.doodle;
|
|
114
|
+
this.currentInstance = doodlePlugin.renderMini(this.container);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
destroy() {
|
|
118
|
+
if (this.currentInstance) {
|
|
119
|
+
this.currentInstance.destroy();
|
|
120
|
+
}
|
|
121
|
+
this.container.innerHTML = "";
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
function createLoadingInteraction(container, config) {
|
|
125
|
+
const engine = new LoadingEngine(container, config);
|
|
126
|
+
engine.init();
|
|
127
|
+
return engine;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
exports.LoadingEngine = LoadingEngine;
|
|
131
|
+
exports.StateManager = StateManager;
|
|
132
|
+
exports.createLoadingInteraction = createLoadingInteraction;
|
|
133
|
+
exports.stateManager = stateManager;
|
|
134
|
+
//# sourceMappingURL=chunk-MAWVAR3Q.cjs.map
|
|
135
|
+
//# sourceMappingURL=chunk-MAWVAR3Q.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/state.ts","../src/core/engine.ts"],"names":["__publicField"],"mappings":"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","file":"chunk-MAWVAR3Q.cjs","sourcesContent":["import { GameState, InteractionMode } from \"./types\";\n\nconst STORAGE_KEY_PREFIX = \"waitroom_\";\n\nexport class StateManager {\n private static instance: StateManager;\n\n private constructor() {}\n\n static getInstance(): StateManager {\n if (!StateManager.instance) {\n StateManager.instance = new StateManager();\n }\n return StateManager.instance;\n }\n\n // --- Game State ---\n\n getGameState(gameId: string): Partial<GameState> | null {\n try {\n const data = localStorage.getItem(`${STORAGE_KEY_PREFIX}game_${gameId}`);\n if (data) {\n return JSON.parse(data);\n }\n } catch (e) {\n console.warn(\"Failed to load game state\", e);\n }\n return null;\n }\n\n saveGameState(gameId: string, state: Partial<GameState>): void {\n try {\n // Simple debounce could be added here if needed, but for now direct write\n localStorage.setItem(\n `${STORAGE_KEY_PREFIX}game_${gameId}`,\n JSON.stringify(state)\n );\n } catch (e) {\n console.warn(\"Failed to save game state\", e);\n }\n }\n\n // --- Mode Preference ---\n\n getPreferredMode(): InteractionMode | null {\n try {\n return localStorage.getItem(\n `${STORAGE_KEY_PREFIX}mode`\n ) as InteractionMode;\n } catch (e) {\n return null;\n }\n }\n\n savePreferredMode(mode: InteractionMode): void {\n try {\n localStorage.setItem(`${STORAGE_KEY_PREFIX}mode`, mode);\n } catch (e) {\n console.warn(\"Failed to save preferred mode\", e);\n }\n }\n}\n\nexport const stateManager = StateManager.getInstance();\n","import { InteractionConfig, InteractionMode } from \"./types\";\nimport { stateManager } from \"./state\";\n\nexport class LoadingEngine {\n private config: InteractionConfig;\n private container: HTMLElement;\n private currentInstance: any = null;\n private activeMode: InteractionMode = \"none\";\n\n constructor(container: HTMLElement, config: InteractionConfig) {\n this.container = container;\n this.config = config;\n }\n\n init() {\n // Determine start mode\n let startMode = this.config.mode || \"none\";\n\n if (this.config.persistModePreference) {\n const saved = stateManager.getPreferredMode();\n if (saved && this.config.availableModes?.includes(saved)) {\n startMode = saved;\n }\n }\n\n this.setMode(startMode);\n }\n\n setMode(mode: InteractionMode) {\n if (this.activeMode === mode) return;\n\n // Cleanup previous\n if (this.currentInstance) {\n this.currentInstance.destroy();\n this.currentInstance = null;\n }\n\n this.activeMode = mode;\n\n // Simple fade transition\n this.container.style.opacity = \"0\";\n this.container.style.transition = `opacity ${\n this.config.transitionDuration || 300\n }ms ease-in-out`;\n\n setTimeout(() => {\n this.render();\n this.container.style.opacity = \"1\";\n }, (this.config.transitionDuration || 300) / 2);\n\n // Persist preference\n if (this.config.persistModePreference && mode !== \"none\") {\n stateManager.savePreferredMode(mode);\n }\n\n if (this.config.onModeChange) {\n this.config.onModeChange(mode);\n }\n }\n\n private render() {\n this.container.innerHTML = \"\"; // Clear container\n\n if (this.activeMode === \"none\") {\n return;\n }\n\n // Normally we would have a plugin registry or pass plugins in config.\n // For this lightweight version we rely on config having the specific plugin instances.\n\n // Render based on mode\n if (this.activeMode === \"game\" && this.config.game) {\n const gamePlugin = this.config.game;\n // Load state\n const savedState = stateManager.getGameState(gamePlugin.id) || {};\n this.currentInstance = gamePlugin.renderMini(this.container, savedState);\n } else if (this.activeMode === \"facts\" && this.config.facts) {\n const factsPlugin = this.config.facts;\n this.currentInstance = factsPlugin.renderMini(this.container);\n } else if (this.activeMode === \"doodle\" && this.config.doodle) {\n const doodlePlugin = this.config.doodle;\n this.currentInstance = doodlePlugin.renderMini(this.container);\n }\n }\n\n destroy() {\n if (this.currentInstance) {\n this.currentInstance.destroy();\n }\n this.container.innerHTML = \"\";\n }\n}\n\nexport function createLoadingInteraction(\n container: HTMLElement,\n config: InteractionConfig\n) {\n const engine = new LoadingEngine(container, config);\n engine.init();\n return engine;\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { __publicField } from './chunk-V6TY7KAL.js';
|
|
2
|
+
|
|
3
|
+
// src/facts/tech-stats.ts
|
|
4
|
+
var STATS = [
|
|
5
|
+
{ id: "1", text: "JavaScript is used by 98% of websites", category: "stats" },
|
|
6
|
+
{
|
|
7
|
+
id: "2",
|
|
8
|
+
text: "There are over 1.3 million npm packages",
|
|
9
|
+
category: "stats"
|
|
10
|
+
}
|
|
11
|
+
];
|
|
12
|
+
var StatsRenderer = class {
|
|
13
|
+
constructor(container, facts) {
|
|
14
|
+
__publicField(this, "container");
|
|
15
|
+
this.container = container;
|
|
16
|
+
this.container.innerText = facts[0].text;
|
|
17
|
+
}
|
|
18
|
+
next() {
|
|
19
|
+
}
|
|
20
|
+
previous() {
|
|
21
|
+
}
|
|
22
|
+
favorite() {
|
|
23
|
+
}
|
|
24
|
+
destroy() {
|
|
25
|
+
this.container.innerHTML = "";
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var TechStats = {
|
|
29
|
+
id: "tech-stats",
|
|
30
|
+
name: "Tech Stats",
|
|
31
|
+
category: "stats",
|
|
32
|
+
facts: STATS,
|
|
33
|
+
renderMini: (c) => new StatsRenderer(c, STATS),
|
|
34
|
+
renderFull: (c) => new StatsRenderer(c, STATS)
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { TechStats };
|
|
38
|
+
//# sourceMappingURL=chunk-MMNQMDV3.js.map
|
|
39
|
+
//# sourceMappingURL=chunk-MMNQMDV3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/facts/tech-stats.ts"],"names":[],"mappings":";;;AAEA,IAAM,KAAA,GAAgB;AAAA,EACpB,EAAE,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,uCAAA,EAAyC,UAAU,OAAA,EAAQ;AAAA,EAC5E;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,yCAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,gBAAN,MAA6C;AAAA,EAE3C,WAAA,CAAY,WAAwB,KAAA,EAAe;AADnD,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AAEN,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,CAAU,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAAA,EACtC;AAAA,EAEA,IAAA,GAAO;AAAA,EAAC;AAAA,EACR,QAAA,GAAW;AAAA,EAAC;AAAA,EACZ,QAAA,GAAW;AAAA,EAAC;AAAA,EACZ,OAAA,GAAU;AACR,IAAA,IAAA,CAAK,UAAU,SAAA,GAAY,EAAA;AAAA,EAC7B;AACF,CAAA;AAEO,IAAM,SAAA,GAAyB;AAAA,EACpC,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,YAAY,CAAC,CAAA,KAAM,IAAI,aAAA,CAAc,GAAG,KAAK,CAAA;AAAA,EAC7C,YAAY,CAAC,CAAA,KAAM,IAAI,aAAA,CAAc,GAAG,KAAK;AAC/C","file":"chunk-MMNQMDV3.js","sourcesContent":["import { FactsPlugin, FactsInstance, Fact } from \"../core/types\";\n\nconst STATS: Fact[] = [\n { id: \"1\", text: \"JavaScript is used by 98% of websites\", category: \"stats\" },\n {\n id: \"2\",\n text: \"There are over 1.3 million npm packages\",\n category: \"stats\",\n },\n];\n\nclass StatsRenderer implements FactsInstance {\n private container: HTMLElement;\n constructor(container: HTMLElement, facts: Fact[]) {\n this.container = container;\n this.container.innerText = facts[0].text;\n }\n\n next() {}\n previous() {}\n favorite() {}\n destroy() {\n this.container.innerHTML = \"\";\n }\n}\n\nexport const TechStats: FactsPlugin = {\n id: \"tech-stats\",\n name: \"Tech Stats\",\n category: \"stats\",\n facts: STATS,\n renderMini: (c) => new StatsRenderer(c, STATS),\n renderFull: (c) => new StatsRenderer(c, STATS),\n};\n"]}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { __publicField } from './chunk-V6TY7KAL.js';
|
|
2
|
+
|
|
3
|
+
// src/doodle/basic-canvas.ts
|
|
4
|
+
var CanvasInstance = class {
|
|
5
|
+
constructor(container, config) {
|
|
6
|
+
__publicField(this, "container");
|
|
7
|
+
__publicField(this, "canvas");
|
|
8
|
+
__publicField(this, "ctx");
|
|
9
|
+
__publicField(this, "config");
|
|
10
|
+
__publicField(this, "isDrawing", false);
|
|
11
|
+
this.container = container;
|
|
12
|
+
this.config = config || {};
|
|
13
|
+
this.container.style.display = "flex";
|
|
14
|
+
this.container.style.flexDirection = "column";
|
|
15
|
+
this.container.style.alignItems = "center";
|
|
16
|
+
this.canvas = document.createElement("canvas");
|
|
17
|
+
this.canvas.style.border = "1px solid #ccc";
|
|
18
|
+
this.canvas.style.width = "90%";
|
|
19
|
+
this.canvas.style.flex = "1";
|
|
20
|
+
this.canvas.style.minHeight = "0";
|
|
21
|
+
this.canvas.style.background = "#fff";
|
|
22
|
+
this.container.appendChild(this.canvas);
|
|
23
|
+
this.ctx = this.canvas.getContext("2d");
|
|
24
|
+
const observer = new ResizeObserver(() => this.resize());
|
|
25
|
+
observer.observe(this.canvas);
|
|
26
|
+
setTimeout(() => this.resize(), 0);
|
|
27
|
+
this.setupEvents();
|
|
28
|
+
const clearBtn = document.createElement("button");
|
|
29
|
+
clearBtn.innerText = "Clear Canvas";
|
|
30
|
+
clearBtn.style.marginTop = "15px";
|
|
31
|
+
clearBtn.style.padding = "8px 16px";
|
|
32
|
+
clearBtn.style.cursor = "pointer";
|
|
33
|
+
clearBtn.style.border = "none";
|
|
34
|
+
clearBtn.style.borderRadius = "20px";
|
|
35
|
+
clearBtn.style.backgroundColor = "#e2e8f0";
|
|
36
|
+
clearBtn.style.color = "#475569";
|
|
37
|
+
clearBtn.style.fontWeight = "600";
|
|
38
|
+
clearBtn.style.fontSize = "0.9rem";
|
|
39
|
+
clearBtn.style.transition = "all 0.2s ease";
|
|
40
|
+
clearBtn.style.boxShadow = "0 2px 4px rgba(0,0,0,0.05)";
|
|
41
|
+
clearBtn.onclick = () => this.clear();
|
|
42
|
+
clearBtn.onmouseenter = () => {
|
|
43
|
+
clearBtn.style.backgroundColor = "#cbd5e1";
|
|
44
|
+
clearBtn.style.transform = "translateY(-1px)";
|
|
45
|
+
};
|
|
46
|
+
clearBtn.onmouseleave = () => {
|
|
47
|
+
clearBtn.style.backgroundColor = "#e2e8f0";
|
|
48
|
+
clearBtn.style.transform = "translateY(0)";
|
|
49
|
+
};
|
|
50
|
+
this.container.appendChild(clearBtn);
|
|
51
|
+
}
|
|
52
|
+
resize() {
|
|
53
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
54
|
+
if (this.canvas.width !== rect.width || this.canvas.height !== rect.height) {
|
|
55
|
+
const data = this.canvas.toDataURL();
|
|
56
|
+
this.canvas.width = rect.width;
|
|
57
|
+
this.canvas.height = rect.height;
|
|
58
|
+
this.ctx.lineCap = "round";
|
|
59
|
+
this.setBrushSize(this.config.defaultBrushSize || 3);
|
|
60
|
+
this.setBrushColor(this.config.defaultColor || "#000");
|
|
61
|
+
const img = new Image();
|
|
62
|
+
img.onload = () => this.ctx.drawImage(img, 0, 0);
|
|
63
|
+
img.src = data;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setupEvents() {
|
|
67
|
+
this.canvas.addEventListener("mousedown", this.start.bind(this));
|
|
68
|
+
this.canvas.addEventListener("mousemove", this.draw.bind(this));
|
|
69
|
+
this.canvas.addEventListener("mouseup", this.stop.bind(this));
|
|
70
|
+
this.canvas.addEventListener("mouseout", this.stop.bind(this));
|
|
71
|
+
this.canvas.addEventListener("touchstart", (e) => {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
const touch = e.touches[0];
|
|
74
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
75
|
+
this.start({
|
|
76
|
+
offsetX: touch.clientX - rect.left,
|
|
77
|
+
offsetY: touch.clientY - rect.top
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
this.canvas.addEventListener("touchmove", (e) => {
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
const touch = e.touches[0];
|
|
83
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
84
|
+
this.draw({
|
|
85
|
+
offsetX: touch.clientX - rect.left,
|
|
86
|
+
offsetY: touch.clientY - rect.top
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
this.canvas.addEventListener("touchend", this.stop.bind(this));
|
|
90
|
+
}
|
|
91
|
+
start(e) {
|
|
92
|
+
this.isDrawing = true;
|
|
93
|
+
this.ctx.beginPath();
|
|
94
|
+
this.ctx.moveTo(e.offsetX, e.offsetY);
|
|
95
|
+
}
|
|
96
|
+
draw(e) {
|
|
97
|
+
if (!this.isDrawing) return;
|
|
98
|
+
this.ctx.lineTo(e.offsetX, e.offsetY);
|
|
99
|
+
this.ctx.stroke();
|
|
100
|
+
}
|
|
101
|
+
stop() {
|
|
102
|
+
if (!this.isDrawing) return;
|
|
103
|
+
this.isDrawing = false;
|
|
104
|
+
this.ctx.closePath();
|
|
105
|
+
}
|
|
106
|
+
clear() {
|
|
107
|
+
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
108
|
+
}
|
|
109
|
+
undo() {
|
|
110
|
+
}
|
|
111
|
+
redo() {
|
|
112
|
+
}
|
|
113
|
+
async save() {
|
|
114
|
+
return this.canvas.toDataURL();
|
|
115
|
+
}
|
|
116
|
+
load(url) {
|
|
117
|
+
const img = new Image();
|
|
118
|
+
img.onload = () => this.ctx.drawImage(img, 0, 0);
|
|
119
|
+
img.src = url;
|
|
120
|
+
}
|
|
121
|
+
setBrushColor(color) {
|
|
122
|
+
this.ctx.strokeStyle = color;
|
|
123
|
+
}
|
|
124
|
+
setBrushSize(size) {
|
|
125
|
+
this.ctx.lineWidth = size;
|
|
126
|
+
}
|
|
127
|
+
destroy() {
|
|
128
|
+
this.container.innerHTML = "";
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
var BasicDoodle = {
|
|
132
|
+
id: "basic-doodle",
|
|
133
|
+
name: "Basic Doodle",
|
|
134
|
+
renderMini: (c, cfg) => new CanvasInstance(c, cfg),
|
|
135
|
+
renderFull: (c, cfg) => new CanvasInstance(c, cfg)
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export { BasicDoodle };
|
|
139
|
+
//# sourceMappingURL=chunk-O6CAFCTV.js.map
|
|
140
|
+
//# sourceMappingURL=chunk-O6CAFCTV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/doodle/basic-canvas.ts"],"names":[],"mappings":"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","file":"chunk-O6CAFCTV.js","sourcesContent":["import { DoodlePlugin, DoodleInstance, DoodleConfig } from \"../core/types\";\n\nclass CanvasInstance implements DoodleInstance {\n private container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private config: DoodleConfig;\n private isDrawing = false;\n\n constructor(container: HTMLElement, config?: DoodleConfig) {\n this.container = container;\n this.config = config || {};\n\n this.container.style.display = \"flex\";\n this.container.style.flexDirection = \"column\";\n this.container.style.alignItems = \"center\";\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.style.border = \"1px solid #ccc\";\n this.canvas.style.width = \"90%\";\n this.canvas.style.flex = \"1\"; // Fill available space\n this.canvas.style.minHeight = \"0\";\n this.canvas.style.background = \"#fff\";\n\n this.container.appendChild(this.canvas);\n\n this.ctx = this.canvas.getContext(\"2d\")!;\n\n // Resize observer\n const observer = new ResizeObserver(() => this.resize());\n observer.observe(this.canvas);\n\n // Wait for layout\n setTimeout(() => this.resize(), 0);\n\n this.setupEvents();\n\n // Clear Button\n const clearBtn = document.createElement(\"button\");\n clearBtn.innerText = \"Clear Canvas\";\n clearBtn.style.marginTop = \"15px\";\n clearBtn.style.padding = \"8px 16px\";\n clearBtn.style.cursor = \"pointer\";\n clearBtn.style.border = \"none\";\n clearBtn.style.borderRadius = \"20px\";\n clearBtn.style.backgroundColor = \"#e2e8f0\";\n clearBtn.style.color = \"#475569\";\n clearBtn.style.fontWeight = \"600\";\n clearBtn.style.fontSize = \"0.9rem\";\n clearBtn.style.transition = \"all 0.2s ease\";\n clearBtn.style.boxShadow = \"0 2px 4px rgba(0,0,0,0.05)\";\n\n clearBtn.onclick = () => this.clear();\n\n // Add hover effect\n clearBtn.onmouseenter = () => {\n clearBtn.style.backgroundColor = \"#cbd5e1\";\n clearBtn.style.transform = \"translateY(-1px)\";\n };\n clearBtn.onmouseleave = () => {\n clearBtn.style.backgroundColor = \"#e2e8f0\";\n clearBtn.style.transform = \"translateY(0)\";\n };\n\n this.container.appendChild(clearBtn);\n }\n\n private resize() {\n const rect = this.canvas.getBoundingClientRect();\n // Only resize if dimensions changed to avoid clearing\n if (\n this.canvas.width !== rect.width ||\n this.canvas.height !== rect.height\n ) {\n // Save content\n const data = this.canvas.toDataURL();\n\n this.canvas.width = rect.width;\n this.canvas.height = rect.height;\n\n // Restore styling\n this.ctx.lineCap = \"round\";\n this.setBrushSize(this.config.defaultBrushSize || 3);\n this.setBrushColor(this.config.defaultColor || \"#000\");\n\n // Restore content\n const img = new Image();\n img.onload = () => this.ctx.drawImage(img, 0, 0);\n img.src = data;\n }\n }\n\n private setupEvents() {\n this.canvas.addEventListener(\"mousedown\", this.start.bind(this));\n this.canvas.addEventListener(\"mousemove\", this.draw.bind(this));\n this.canvas.addEventListener(\"mouseup\", this.stop.bind(this));\n this.canvas.addEventListener(\"mouseout\", this.stop.bind(this));\n\n // Touch support\n this.canvas.addEventListener(\"touchstart\", (e) => {\n e.preventDefault();\n const touch = e.touches[0];\n const rect = this.canvas.getBoundingClientRect();\n this.start({\n offsetX: touch.clientX - rect.left,\n offsetY: touch.clientY - rect.top,\n } as any);\n });\n this.canvas.addEventListener(\"touchmove\", (e) => {\n e.preventDefault();\n const touch = e.touches[0];\n const rect = this.canvas.getBoundingClientRect();\n this.draw({\n offsetX: touch.clientX - rect.left,\n offsetY: touch.clientY - rect.top,\n } as any);\n });\n this.canvas.addEventListener(\"touchend\", this.stop.bind(this));\n }\n\n private start(e: MouseEvent) {\n this.isDrawing = true;\n this.ctx.beginPath();\n this.ctx.moveTo(e.offsetX, e.offsetY);\n }\n\n private draw(e: MouseEvent) {\n if (!this.isDrawing) return;\n this.ctx.lineTo(e.offsetX, e.offsetY);\n this.ctx.stroke();\n }\n\n private stop() {\n if (!this.isDrawing) return;\n this.isDrawing = false;\n this.ctx.closePath();\n }\n\n clear() {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n\n undo() {}\n redo() {}\n async save() {\n return this.canvas.toDataURL();\n }\n load(url: string) {\n const img = new Image();\n img.onload = () => this.ctx.drawImage(img, 0, 0);\n img.src = url;\n }\n\n setBrushColor(color: string) {\n this.ctx.strokeStyle = color;\n }\n setBrushSize(size: number) {\n this.ctx.lineWidth = size;\n }\n\n destroy() {\n this.container.innerHTML = \"\";\n }\n}\n\nexport const BasicDoodle: DoodlePlugin = {\n id: \"basic-doodle\",\n name: \"Basic Doodle\",\n renderMini: (c, cfg) => new CanvasInstance(c, cfg),\n renderFull: (c, cfg) => new CanvasInstance(c, cfg),\n};\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk4DE2IREA_cjs = require('./chunk-4DE2IREA.cjs');
|
|
4
|
+
|
|
5
|
+
// src/games/click-counter.ts
|
|
6
|
+
var ClickCounterInstance = class {
|
|
7
|
+
constructor(container, state) {
|
|
8
|
+
chunk4DE2IREA_cjs.__publicField(this, "container");
|
|
9
|
+
chunk4DE2IREA_cjs.__publicField(this, "state");
|
|
10
|
+
chunk4DE2IREA_cjs.__publicField(this, "button");
|
|
11
|
+
chunk4DE2IREA_cjs.__publicField(this, "scoreDisplay");
|
|
12
|
+
this.container = container;
|
|
13
|
+
this.state = state;
|
|
14
|
+
this.container.style.display = "flex";
|
|
15
|
+
this.container.style.flexDirection = "column";
|
|
16
|
+
this.container.style.alignItems = "center";
|
|
17
|
+
this.container.style.justifyContent = "center";
|
|
18
|
+
this.container.style.fontFamily = "sans-serif";
|
|
19
|
+
const title = document.createElement("h3");
|
|
20
|
+
title.innerText = "Click Counter";
|
|
21
|
+
title.style.margin = "0 0 5px 0";
|
|
22
|
+
this.container.appendChild(title);
|
|
23
|
+
const helper = document.createElement("div");
|
|
24
|
+
helper.innerText = "Click as fast as you can!";
|
|
25
|
+
helper.style.fontSize = "0.8em";
|
|
26
|
+
helper.style.color = "#888";
|
|
27
|
+
helper.style.marginBottom = "10px";
|
|
28
|
+
this.container.appendChild(helper);
|
|
29
|
+
this.scoreDisplay = document.createElement("div");
|
|
30
|
+
this.scoreDisplay.style.fontSize = "24px";
|
|
31
|
+
this.scoreDisplay.style.marginBottom = "10px";
|
|
32
|
+
this.updateScore();
|
|
33
|
+
this.container.appendChild(this.scoreDisplay);
|
|
34
|
+
this.button = document.createElement("button");
|
|
35
|
+
this.button.innerText = "Click Me!";
|
|
36
|
+
this.button.style.padding = "10px 20px";
|
|
37
|
+
this.button.style.fontSize = "16px";
|
|
38
|
+
this.button.style.cursor = "pointer";
|
|
39
|
+
this.button.onclick = () => this.increment();
|
|
40
|
+
this.container.appendChild(this.button);
|
|
41
|
+
}
|
|
42
|
+
increment() {
|
|
43
|
+
const currentScore = this.state.progress?.score || 0;
|
|
44
|
+
this.state.progress = {
|
|
45
|
+
...this.state.progress,
|
|
46
|
+
score: currentScore + 1
|
|
47
|
+
};
|
|
48
|
+
this.updateScore();
|
|
49
|
+
}
|
|
50
|
+
updateScore() {
|
|
51
|
+
this.scoreDisplay.innerText = `Clics: ${this.state.progress?.score || 0}`;
|
|
52
|
+
}
|
|
53
|
+
getState() {
|
|
54
|
+
return this.state;
|
|
55
|
+
}
|
|
56
|
+
setState(s) {
|
|
57
|
+
this.state = { ...this.state, ...s };
|
|
58
|
+
this.updateScore();
|
|
59
|
+
}
|
|
60
|
+
destroy() {
|
|
61
|
+
this.container.innerHTML = "";
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var ClickCounterGame = {
|
|
65
|
+
id: "click-counter",
|
|
66
|
+
name: "Click Counter",
|
|
67
|
+
description: "Click as fast as you can!",
|
|
68
|
+
renderMini: (c, s) => new ClickCounterInstance(c, s),
|
|
69
|
+
renderFull: (c, s) => new ClickCounterInstance(c, s)
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
exports.ClickCounterGame = ClickCounterGame;
|
|
73
|
+
//# sourceMappingURL=chunk-P6NO27XB.cjs.map
|
|
74
|
+
//# sourceMappingURL=chunk-P6NO27XB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/games/click-counter.ts"],"names":["__publicField"],"mappings":"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","file":"chunk-P6NO27XB.cjs","sourcesContent":["import { GamePlugin, GameInstance, GameState } from \"../core/types\";\n\nclass ClickCounterInstance implements GameInstance {\n private container: HTMLElement;\n private state: Partial<GameState>;\n private button: HTMLButtonElement;\n private scoreDisplay: HTMLElement;\n\n constructor(container: HTMLElement, state: Partial<GameState>) {\n this.container = container;\n this.state = state;\n\n this.container.style.display = \"flex\";\n this.container.style.flexDirection = \"column\";\n this.container.style.alignItems = \"center\";\n this.container.style.justifyContent = \"center\";\n this.container.style.fontFamily = \"sans-serif\"; // consistent font\n\n // Title\n const title = document.createElement(\"h3\");\n title.innerText = \"Click Counter\";\n title.style.margin = \"0 0 5px 0\";\n this.container.appendChild(title);\n\n // Helper\n const helper = document.createElement(\"div\");\n helper.innerText = \"Click as fast as you can!\";\n helper.style.fontSize = \"0.8em\";\n helper.style.color = \"#888\";\n helper.style.marginBottom = \"10px\";\n this.container.appendChild(helper);\n\n this.scoreDisplay = document.createElement(\"div\");\n this.scoreDisplay.style.fontSize = \"24px\";\n this.scoreDisplay.style.marginBottom = \"10px\";\n this.updateScore();\n this.container.appendChild(this.scoreDisplay);\n\n this.button = document.createElement(\"button\");\n this.button.innerText = \"Click Me!\";\n this.button.style.padding = \"10px 20px\";\n this.button.style.fontSize = \"16px\";\n this.button.style.cursor = \"pointer\";\n this.button.onclick = () => this.increment();\n this.container.appendChild(this.button);\n }\n\n private increment() {\n const currentScore = this.state.progress?.score || 0;\n this.state.progress = {\n ...this.state.progress,\n score: currentScore + 1,\n } as any;\n this.updateScore();\n }\n\n private updateScore() {\n this.scoreDisplay.innerText = `Clics: ${this.state.progress?.score || 0}`;\n }\n\n getState() {\n return this.state as GameState;\n }\n setState(s: Partial<GameState>) {\n this.state = { ...this.state, ...s };\n this.updateScore();\n }\n destroy() {\n this.container.innerHTML = \"\";\n }\n}\n\nexport const ClickCounterGame: GamePlugin = {\n id: \"click-counter\",\n name: \"Click Counter\",\n description: \"Click as fast as you can!\",\n renderMini: (c, s) => new ClickCounterInstance(c, s),\n renderFull: (c, s) => new ClickCounterInstance(c, s),\n};\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk4DE2IREA_cjs = require('./chunk-4DE2IREA.cjs');
|
|
4
|
+
|
|
5
|
+
// src/facts/programming-trivia.ts
|
|
6
|
+
var TRIVIA = [
|
|
7
|
+
{
|
|
8
|
+
id: "1",
|
|
9
|
+
text: "The first computer bug was an actual moth found in a relay",
|
|
10
|
+
category: "history"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "2",
|
|
14
|
+
text: "JavaScript was created in 10 days by Brendan Eich",
|
|
15
|
+
category: "history"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "3",
|
|
19
|
+
text: "Python is named after Monty Python, not the snake",
|
|
20
|
+
category: "history"
|
|
21
|
+
}
|
|
22
|
+
];
|
|
23
|
+
var TriviaRenderer = class {
|
|
24
|
+
constructor(container, facts) {
|
|
25
|
+
chunk4DE2IREA_cjs.__publicField(this, "container");
|
|
26
|
+
chunk4DE2IREA_cjs.__publicField(this, "facts");
|
|
27
|
+
chunk4DE2IREA_cjs.__publicField(this, "currentIndex", 0);
|
|
28
|
+
this.container = container;
|
|
29
|
+
this.facts = facts;
|
|
30
|
+
this.show();
|
|
31
|
+
}
|
|
32
|
+
show() {
|
|
33
|
+
this.container.innerText = this.facts[this.currentIndex].text;
|
|
34
|
+
this.container.style.textAlign = "center";
|
|
35
|
+
this.container.style.padding = "10px";
|
|
36
|
+
}
|
|
37
|
+
next() {
|
|
38
|
+
this.currentIndex = (this.currentIndex + 1) % this.facts.length;
|
|
39
|
+
this.show();
|
|
40
|
+
}
|
|
41
|
+
previous() {
|
|
42
|
+
}
|
|
43
|
+
favorite() {
|
|
44
|
+
}
|
|
45
|
+
destroy() {
|
|
46
|
+
this.container.innerHTML = "";
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var ProgrammingTrivia = {
|
|
50
|
+
id: "prog-trivia",
|
|
51
|
+
name: "Programming Trivia",
|
|
52
|
+
category: "trivia",
|
|
53
|
+
facts: TRIVIA,
|
|
54
|
+
renderMini: (c) => new TriviaRenderer(c, TRIVIA),
|
|
55
|
+
renderFull: (c) => new TriviaRenderer(c, TRIVIA)
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
exports.ProgrammingTrivia = ProgrammingTrivia;
|
|
59
|
+
//# sourceMappingURL=chunk-PKRYY3X6.cjs.map
|
|
60
|
+
//# sourceMappingURL=chunk-PKRYY3X6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/facts/programming-trivia.ts"],"names":["__publicField"],"mappings":";;;;;AAEA,IAAM,MAAA,GAAiB;AAAA,EACrB;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,4DAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,mDAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,mDAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAEd,CAAA;AAEA,IAAM,iBAAN,MAA8C;AAAA,EAK5C,WAAA,CAAY,WAAwB,KAAA,EAAe;AAJnD,IAAAA,+BAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AACR,IAAAA,+BAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAAA,+BAAA,CAAA,IAAA,EAAQ,cAAA,EAAe,CAAA,CAAA;AAGrB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,UAAU,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA;AACzD,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,SAAA,GAAY,QAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,OAAA,GAAU,MAAA;AAAA,EACjC;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAA,CAAK,YAAA,GAAA,CAAgB,IAAA,CAAK,YAAA,GAAe,CAAA,IAAK,KAAK,KAAA,CAAM,MAAA;AACzD,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,QAAA,GAAW;AAAA,EAAC;AAAA,EACZ,QAAA,GAAW;AAAA,EAAC;AAAA,EACZ,OAAA,GAAU;AACR,IAAA,IAAA,CAAK,UAAU,SAAA,GAAY,EAAA;AAAA,EAC7B;AACF,CAAA;AAEO,IAAM,iBAAA,GAAiC;AAAA,EAC5C,EAAA,EAAI,aAAA;AAAA,EACJ,IAAA,EAAM,oBAAA;AAAA,EACN,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,MAAA;AAAA,EACP,YAAY,CAAC,CAAA,KAAM,IAAI,cAAA,CAAe,GAAG,MAAM,CAAA;AAAA,EAC/C,YAAY,CAAC,CAAA,KAAM,IAAI,cAAA,CAAe,GAAG,MAAM;AACjD","file":"chunk-PKRYY3X6.cjs","sourcesContent":["import { FactsPlugin, FactsInstance, Fact } from \"../core/types\";\n\nconst TRIVIA: Fact[] = [\n {\n id: \"1\",\n text: \"The first computer bug was an actual moth found in a relay\",\n category: \"history\",\n },\n {\n id: \"2\",\n text: \"JavaScript was created in 10 days by Brendan Eich\",\n category: \"history\",\n },\n {\n id: \"3\",\n text: \"Python is named after Monty Python, not the snake\",\n category: \"history\",\n },\n];\n\nclass TriviaRenderer implements FactsInstance {\n private container: HTMLElement;\n private facts: Fact[];\n private currentIndex = 0;\n\n constructor(container: HTMLElement, facts: Fact[]) {\n this.container = container;\n this.facts = facts;\n this.show();\n }\n\n show() {\n this.container.innerText = this.facts[this.currentIndex].text;\n this.container.style.textAlign = \"center\";\n this.container.style.padding = \"10px\";\n }\n\n next() {\n this.currentIndex = (this.currentIndex + 1) % this.facts.length;\n this.show();\n }\n\n previous() {}\n favorite() {}\n destroy() {\n this.container.innerHTML = \"\";\n }\n}\n\nexport const ProgrammingTrivia: FactsPlugin = {\n id: \"prog-trivia\",\n name: \"Programming Trivia\",\n category: \"trivia\",\n facts: TRIVIA,\n renderMini: (c) => new TriviaRenderer(c, TRIVIA),\n renderFull: (c) => new TriviaRenderer(c, TRIVIA),\n};\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { __publicField } from './chunk-V6TY7KAL.js';
|
|
2
|
+
|
|
3
|
+
// src/games/click-counter.ts
|
|
4
|
+
var ClickCounterInstance = class {
|
|
5
|
+
constructor(container, state) {
|
|
6
|
+
__publicField(this, "container");
|
|
7
|
+
__publicField(this, "state");
|
|
8
|
+
__publicField(this, "button");
|
|
9
|
+
__publicField(this, "scoreDisplay");
|
|
10
|
+
this.container = container;
|
|
11
|
+
this.state = state;
|
|
12
|
+
this.container.style.display = "flex";
|
|
13
|
+
this.container.style.flexDirection = "column";
|
|
14
|
+
this.container.style.alignItems = "center";
|
|
15
|
+
this.container.style.justifyContent = "center";
|
|
16
|
+
this.container.style.fontFamily = "sans-serif";
|
|
17
|
+
const title = document.createElement("h3");
|
|
18
|
+
title.innerText = "Click Counter";
|
|
19
|
+
title.style.margin = "0 0 5px 0";
|
|
20
|
+
this.container.appendChild(title);
|
|
21
|
+
const helper = document.createElement("div");
|
|
22
|
+
helper.innerText = "Click as fast as you can!";
|
|
23
|
+
helper.style.fontSize = "0.8em";
|
|
24
|
+
helper.style.color = "#888";
|
|
25
|
+
helper.style.marginBottom = "10px";
|
|
26
|
+
this.container.appendChild(helper);
|
|
27
|
+
this.scoreDisplay = document.createElement("div");
|
|
28
|
+
this.scoreDisplay.style.fontSize = "24px";
|
|
29
|
+
this.scoreDisplay.style.marginBottom = "10px";
|
|
30
|
+
this.updateScore();
|
|
31
|
+
this.container.appendChild(this.scoreDisplay);
|
|
32
|
+
this.button = document.createElement("button");
|
|
33
|
+
this.button.innerText = "Click Me!";
|
|
34
|
+
this.button.style.padding = "10px 20px";
|
|
35
|
+
this.button.style.fontSize = "16px";
|
|
36
|
+
this.button.style.cursor = "pointer";
|
|
37
|
+
this.button.onclick = () => this.increment();
|
|
38
|
+
this.container.appendChild(this.button);
|
|
39
|
+
}
|
|
40
|
+
increment() {
|
|
41
|
+
const currentScore = this.state.progress?.score || 0;
|
|
42
|
+
this.state.progress = {
|
|
43
|
+
...this.state.progress,
|
|
44
|
+
score: currentScore + 1
|
|
45
|
+
};
|
|
46
|
+
this.updateScore();
|
|
47
|
+
}
|
|
48
|
+
updateScore() {
|
|
49
|
+
this.scoreDisplay.innerText = `Clics: ${this.state.progress?.score || 0}`;
|
|
50
|
+
}
|
|
51
|
+
getState() {
|
|
52
|
+
return this.state;
|
|
53
|
+
}
|
|
54
|
+
setState(s) {
|
|
55
|
+
this.state = { ...this.state, ...s };
|
|
56
|
+
this.updateScore();
|
|
57
|
+
}
|
|
58
|
+
destroy() {
|
|
59
|
+
this.container.innerHTML = "";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var ClickCounterGame = {
|
|
63
|
+
id: "click-counter",
|
|
64
|
+
name: "Click Counter",
|
|
65
|
+
description: "Click as fast as you can!",
|
|
66
|
+
renderMini: (c, s) => new ClickCounterInstance(c, s),
|
|
67
|
+
renderFull: (c, s) => new ClickCounterInstance(c, s)
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { ClickCounterGame };
|
|
71
|
+
//# sourceMappingURL=chunk-PUR7CO53.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-PUR7CO53.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/games/click-counter.ts"],"names":[],"mappings":"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","file":"chunk-PUR7CO53.js","sourcesContent":["import { GamePlugin, GameInstance, GameState } from \"../core/types\";\n\nclass ClickCounterInstance implements GameInstance {\n private container: HTMLElement;\n private state: Partial<GameState>;\n private button: HTMLButtonElement;\n private scoreDisplay: HTMLElement;\n\n constructor(container: HTMLElement, state: Partial<GameState>) {\n this.container = container;\n this.state = state;\n\n this.container.style.display = \"flex\";\n this.container.style.flexDirection = \"column\";\n this.container.style.alignItems = \"center\";\n this.container.style.justifyContent = \"center\";\n this.container.style.fontFamily = \"sans-serif\"; // consistent font\n\n // Title\n const title = document.createElement(\"h3\");\n title.innerText = \"Click Counter\";\n title.style.margin = \"0 0 5px 0\";\n this.container.appendChild(title);\n\n // Helper\n const helper = document.createElement(\"div\");\n helper.innerText = \"Click as fast as you can!\";\n helper.style.fontSize = \"0.8em\";\n helper.style.color = \"#888\";\n helper.style.marginBottom = \"10px\";\n this.container.appendChild(helper);\n\n this.scoreDisplay = document.createElement(\"div\");\n this.scoreDisplay.style.fontSize = \"24px\";\n this.scoreDisplay.style.marginBottom = \"10px\";\n this.updateScore();\n this.container.appendChild(this.scoreDisplay);\n\n this.button = document.createElement(\"button\");\n this.button.innerText = \"Click Me!\";\n this.button.style.padding = \"10px 20px\";\n this.button.style.fontSize = \"16px\";\n this.button.style.cursor = \"pointer\";\n this.button.onclick = () => this.increment();\n this.container.appendChild(this.button);\n }\n\n private increment() {\n const currentScore = this.state.progress?.score || 0;\n this.state.progress = {\n ...this.state.progress,\n score: currentScore + 1,\n } as any;\n this.updateScore();\n }\n\n private updateScore() {\n this.scoreDisplay.innerText = `Clics: ${this.state.progress?.score || 0}`;\n }\n\n getState() {\n return this.state as GameState;\n }\n setState(s: Partial<GameState>) {\n this.state = { ...this.state, ...s };\n this.updateScore();\n }\n destroy() {\n this.container.innerHTML = \"\";\n }\n}\n\nexport const ClickCounterGame: GamePlugin = {\n id: \"click-counter\",\n name: \"Click Counter\",\n description: \"Click as fast as you can!\",\n renderMini: (c, s) => new ClickCounterInstance(c, s),\n renderFull: (c, s) => new ClickCounterInstance(c, s),\n};\n"]}
|