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.
Files changed (128) hide show
  1. package/README.md +62 -0
  2. package/dist/chunk-3RJ542WD.js +130 -0
  3. package/dist/chunk-3RJ542WD.js.map +1 -0
  4. package/dist/chunk-4DE2IREA.cjs +9 -0
  5. package/dist/chunk-4DE2IREA.cjs.map +1 -0
  6. package/dist/chunk-5AUPIR2C.cjs +90 -0
  7. package/dist/chunk-5AUPIR2C.cjs.map +1 -0
  8. package/dist/chunk-ARXVTVP4.js +55 -0
  9. package/dist/chunk-ARXVTVP4.js.map +1 -0
  10. package/dist/chunk-C5XPYOJI.js +137 -0
  11. package/dist/chunk-C5XPYOJI.js.map +1 -0
  12. package/dist/chunk-DEQZY4AM.js +58 -0
  13. package/dist/chunk-DEQZY4AM.js.map +1 -0
  14. package/dist/chunk-FH3QBC6T.cjs +139 -0
  15. package/dist/chunk-FH3QBC6T.cjs.map +1 -0
  16. package/dist/chunk-GEBKOXLQ.cjs +255 -0
  17. package/dist/chunk-GEBKOXLQ.cjs.map +1 -0
  18. package/dist/chunk-JG5ZMB2Y.cjs +142 -0
  19. package/dist/chunk-JG5ZMB2Y.cjs.map +1 -0
  20. package/dist/chunk-MAWVAR3Q.cjs +135 -0
  21. package/dist/chunk-MAWVAR3Q.cjs.map +1 -0
  22. package/dist/chunk-MMNQMDV3.js +39 -0
  23. package/dist/chunk-MMNQMDV3.js.map +1 -0
  24. package/dist/chunk-O6CAFCTV.js +140 -0
  25. package/dist/chunk-O6CAFCTV.js.map +1 -0
  26. package/dist/chunk-P6NO27XB.cjs +74 -0
  27. package/dist/chunk-P6NO27XB.cjs.map +1 -0
  28. package/dist/chunk-PKRYY3X6.cjs +60 -0
  29. package/dist/chunk-PKRYY3X6.cjs.map +1 -0
  30. package/dist/chunk-PUR7CO53.js +72 -0
  31. package/dist/chunk-PUR7CO53.js.map +1 -0
  32. package/dist/chunk-R5V2UBE7.js +88 -0
  33. package/dist/chunk-R5V2UBE7.js.map +1 -0
  34. package/dist/chunk-SSP4S4NY.cjs +57 -0
  35. package/dist/chunk-SSP4S4NY.cjs.map +1 -0
  36. package/dist/chunk-SUJCEDVR.js +251 -0
  37. package/dist/chunk-SUJCEDVR.js.map +1 -0
  38. package/dist/chunk-V4RO47V6.cjs +41 -0
  39. package/dist/chunk-V4RO47V6.cjs.map +1 -0
  40. package/dist/chunk-V5DABI44.cjs +172 -0
  41. package/dist/chunk-V5DABI44.cjs.map +1 -0
  42. package/dist/chunk-V6TY7KAL.js +7 -0
  43. package/dist/chunk-V6TY7KAL.js.map +1 -0
  44. package/dist/chunk-VKSLYTRF.js +170 -0
  45. package/dist/chunk-VKSLYTRF.js.map +1 -0
  46. package/dist/core/index.cjs +30 -0
  47. package/dist/core/index.cjs.map +1 -0
  48. package/dist/core/index.d.cts +23 -0
  49. package/dist/core/index.d.ts +23 -0
  50. package/dist/core/index.js +5 -0
  51. package/dist/core/index.js.map +1 -0
  52. package/dist/doodle/basic-canvas.cjs +13 -0
  53. package/dist/doodle/basic-canvas.cjs.map +1 -0
  54. package/dist/doodle/basic-canvas.d.cts +5 -0
  55. package/dist/doodle/basic-canvas.d.ts +5 -0
  56. package/dist/doodle/basic-canvas.js +4 -0
  57. package/dist/doodle/basic-canvas.js.map +1 -0
  58. package/dist/doodle/index.cjs +13 -0
  59. package/dist/doodle/index.cjs.map +1 -0
  60. package/dist/doodle/index.d.cts +2 -0
  61. package/dist/doodle/index.d.ts +2 -0
  62. package/dist/doodle/index.js +4 -0
  63. package/dist/doodle/index.js.map +1 -0
  64. package/dist/engine--hGQ4LNR.d.ts +16 -0
  65. package/dist/engine-DdHCpfbk.d.cts +16 -0
  66. package/dist/facts/dev-tips.cjs +13 -0
  67. package/dist/facts/dev-tips.cjs.map +1 -0
  68. package/dist/facts/dev-tips.d.cts +5 -0
  69. package/dist/facts/dev-tips.d.ts +5 -0
  70. package/dist/facts/dev-tips.js +4 -0
  71. package/dist/facts/dev-tips.js.map +1 -0
  72. package/dist/facts/index.cjs +23 -0
  73. package/dist/facts/index.cjs.map +1 -0
  74. package/dist/facts/index.d.cts +4 -0
  75. package/dist/facts/index.d.ts +4 -0
  76. package/dist/facts/index.js +6 -0
  77. package/dist/facts/index.js.map +1 -0
  78. package/dist/facts/programming-trivia.cjs +13 -0
  79. package/dist/facts/programming-trivia.cjs.map +1 -0
  80. package/dist/facts/programming-trivia.d.cts +5 -0
  81. package/dist/facts/programming-trivia.d.ts +5 -0
  82. package/dist/facts/programming-trivia.js +4 -0
  83. package/dist/facts/programming-trivia.js.map +1 -0
  84. package/dist/facts/tech-stats.cjs +13 -0
  85. package/dist/facts/tech-stats.cjs.map +1 -0
  86. package/dist/facts/tech-stats.d.cts +5 -0
  87. package/dist/facts/tech-stats.d.ts +5 -0
  88. package/dist/facts/tech-stats.js +4 -0
  89. package/dist/facts/tech-stats.js.map +1 -0
  90. package/dist/games/click-counter.cjs +13 -0
  91. package/dist/games/click-counter.cjs.map +1 -0
  92. package/dist/games/click-counter.d.cts +5 -0
  93. package/dist/games/click-counter.d.ts +5 -0
  94. package/dist/games/click-counter.js +4 -0
  95. package/dist/games/click-counter.js.map +1 -0
  96. package/dist/games/index.cjs +23 -0
  97. package/dist/games/index.cjs.map +1 -0
  98. package/dist/games/index.d.cts +4 -0
  99. package/dist/games/index.d.ts +4 -0
  100. package/dist/games/index.js +6 -0
  101. package/dist/games/index.js.map +1 -0
  102. package/dist/games/memory.cjs +13 -0
  103. package/dist/games/memory.cjs.map +1 -0
  104. package/dist/games/memory.d.cts +5 -0
  105. package/dist/games/memory.d.ts +5 -0
  106. package/dist/games/memory.js +4 -0
  107. package/dist/games/memory.js.map +1 -0
  108. package/dist/games/snake.cjs +13 -0
  109. package/dist/games/snake.cjs.map +1 -0
  110. package/dist/games/snake.d.cts +5 -0
  111. package/dist/games/snake.d.ts +5 -0
  112. package/dist/games/snake.js +4 -0
  113. package/dist/games/snake.js.map +1 -0
  114. package/dist/index.cjs +43 -0
  115. package/dist/index.cjs.map +1 -0
  116. package/dist/index.d.cts +5 -0
  117. package/dist/index.d.ts +5 -0
  118. package/dist/index.js +6 -0
  119. package/dist/index.js.map +1 -0
  120. package/dist/react/index.cjs +22 -0
  121. package/dist/react/index.cjs.map +1 -0
  122. package/dist/react/index.d.cts +24 -0
  123. package/dist/react/index.d.ts +24 -0
  124. package/dist/react/index.js +5 -0
  125. package/dist/react/index.js.map +1 -0
  126. package/dist/types-vBwPFyxq.d.cts +101 -0
  127. package/dist/types-vBwPFyxq.d.ts +101 -0
  128. 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"]}