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,88 @@
1
+ import { __publicField } from './chunk-V6TY7KAL.js';
2
+
3
+ // src/facts/dev-tips.ts
4
+ var TIPS = [
5
+ {
6
+ id: "1",
7
+ text: "Ctrl+Shift+P opens command palette in VS Code",
8
+ category: "vscode"
9
+ },
10
+ { id: "2", text: "Use git reflog to find lost commits", category: "git" },
11
+ {
12
+ id: "3",
13
+ text: "Console.table() displays data in a table format",
14
+ category: "js"
15
+ },
16
+ { id: "4", text: "Alt+Click to use multiple cursors", category: "vscode" }
17
+ ];
18
+ var SimpleFactsRenderer = class {
19
+ constructor(container, facts, config) {
20
+ __publicField(this, "container");
21
+ __publicField(this, "facts");
22
+ __publicField(this, "currentIndex", 0);
23
+ __publicField(this, "timer");
24
+ __publicField(this, "config");
25
+ this.container = container;
26
+ this.facts = facts;
27
+ this.config = config || {};
28
+ this.container.style.display = "flex";
29
+ this.container.style.flexDirection = "column";
30
+ this.container.style.alignItems = "center";
31
+ this.container.style.justifyContent = "center";
32
+ this.container.style.padding = "20px";
33
+ this.container.style.textAlign = "center";
34
+ this.showCurrent();
35
+ this.startRotation();
36
+ }
37
+ showCurrent() {
38
+ const fact = this.facts[this.currentIndex];
39
+ this.container.innerHTML = `
40
+ <div style="font-weight: bold; margin-bottom: 8px;">Tip #${this.currentIndex + 1}</div>
41
+ <div style="font-size: 1.1em;">${fact.text}</div>
42
+ ${fact.category ? `<div style="font-size: 0.8em; color: #888; margin-top: 5px;">${fact.category}</div>` : ""}
43
+ `;
44
+ const timerBar = document.createElement("div");
45
+ timerBar.style.width = "0%";
46
+ timerBar.style.height = "2px";
47
+ timerBar.style.background = "#22c55e";
48
+ timerBar.style.marginTop = "10px";
49
+ timerBar.style.transition = `width ${this.config.rotationInterval || 4e3}ms linear`;
50
+ void this.container.offsetWidth;
51
+ this.container.appendChild(timerBar);
52
+ requestAnimationFrame(() => {
53
+ timerBar.style.width = "100%";
54
+ });
55
+ }
56
+ startRotation() {
57
+ if (this.timer) clearInterval(this.timer);
58
+ const interval = this.config.rotationInterval || 4e3;
59
+ this.timer = setInterval(() => this.next(), interval);
60
+ }
61
+ next() {
62
+ this.currentIndex = (this.currentIndex + 1) % this.facts.length;
63
+ this.showCurrent();
64
+ }
65
+ previous() {
66
+ this.currentIndex = (this.currentIndex - 1 + this.facts.length) % this.facts.length;
67
+ this.showCurrent();
68
+ }
69
+ favorite(id) {
70
+ console.log("Fav:", id);
71
+ }
72
+ destroy() {
73
+ if (this.timer) clearInterval(this.timer);
74
+ this.container.innerHTML = "";
75
+ }
76
+ };
77
+ var DevTipsFacts = {
78
+ id: "dev-tips",
79
+ name: "Developer Tips",
80
+ category: "coding",
81
+ facts: TIPS,
82
+ renderMini: (c, cfg) => new SimpleFactsRenderer(c, TIPS, cfg),
83
+ renderFull: (c, cfg) => new SimpleFactsRenderer(c, TIPS, cfg)
84
+ };
85
+
86
+ export { DevTipsFacts };
87
+ //# sourceMappingURL=chunk-R5V2UBE7.js.map
88
+ //# sourceMappingURL=chunk-R5V2UBE7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/facts/dev-tips.ts"],"names":[],"mappings":"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","file":"chunk-R5V2UBE7.js","sourcesContent":["import { FactsPlugin, FactsInstance, Fact, FactsConfig } from \"../core/types\";\n\nconst TIPS: Fact[] = [\n {\n id: \"1\",\n text: \"Ctrl+Shift+P opens command palette in VS Code\",\n category: \"vscode\",\n },\n { id: \"2\", text: \"Use git reflog to find lost commits\", category: \"git\" },\n {\n id: \"3\",\n text: \"Console.table() displays data in a table format\",\n category: \"js\",\n },\n { id: \"4\", text: \"Alt+Click to use multiple cursors\", category: \"vscode\" },\n];\n\nclass SimpleFactsRenderer implements FactsInstance {\n private container: HTMLElement;\n private facts: Fact[];\n private currentIndex = 0;\n private timer: any;\n private config: FactsConfig;\n\n constructor(container: HTMLElement, facts: Fact[], config?: FactsConfig) {\n this.container = container;\n this.facts = facts;\n this.config = config || {};\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.padding = \"20px\";\n this.container.style.textAlign = \"center\";\n\n this.showCurrent();\n this.startRotation();\n }\n\n private showCurrent() {\n const fact = this.facts[this.currentIndex];\n this.container.innerHTML = `\n <div style=\"font-weight: bold; margin-bottom: 8px;\">Tip #${\n this.currentIndex + 1\n }</div>\n <div style=\"font-size: 1.1em;\">${fact.text}</div>\n ${\n fact.category\n ? `<div style=\"font-size: 0.8em; color: #888; margin-top: 5px;\">${fact.category}</div>`\n : \"\"\n }\n `;\n\n // Add timer bar\n const timerBar = document.createElement(\"div\");\n timerBar.style.width = \"0%\";\n timerBar.style.height = \"2px\";\n timerBar.style.background = \"#22c55e\"; // Green progress\n timerBar.style.marginTop = \"10px\";\n timerBar.style.transition = `width ${\n this.config.rotationInterval || 4000\n }ms linear`;\n\n // Reset animation\n // Force reflow\n void this.container.offsetWidth;\n\n this.container.appendChild(timerBar);\n\n // Trigger animation\n requestAnimationFrame(() => {\n timerBar.style.width = \"100%\";\n });\n }\n\n private startRotation() {\n if (this.timer) clearInterval(this.timer);\n const interval = this.config.rotationInterval || 4000;\n this.timer = setInterval(() => this.next(), interval);\n }\n\n next() {\n this.currentIndex = (this.currentIndex + 1) % this.facts.length;\n this.showCurrent();\n }\n\n previous() {\n this.currentIndex =\n (this.currentIndex - 1 + this.facts.length) % this.facts.length;\n this.showCurrent();\n }\n\n favorite(id: string) {\n console.log(\"Fav:\", id);\n }\n\n destroy() {\n if (this.timer) clearInterval(this.timer);\n this.container.innerHTML = \"\";\n }\n}\n\nexport const DevTipsFacts: FactsPlugin = {\n id: \"dev-tips\",\n name: \"Developer Tips\",\n category: \"coding\",\n facts: TIPS,\n renderMini: (c, cfg) => new SimpleFactsRenderer(c, TIPS, cfg),\n renderFull: (c, cfg) => new SimpleFactsRenderer(c, TIPS, cfg),\n};\n"]}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ var chunk4DE2IREA_cjs = require('./chunk-4DE2IREA.cjs');
4
+
5
+ // src/core/portal.ts
6
+ var PortalSystem = class {
7
+ constructor() {
8
+ chunk4DE2IREA_cjs.__publicField(this, "overlay", null);
9
+ }
10
+ open(contentRenderer, onClose) {
11
+ if (this.overlay) return;
12
+ this.overlay = document.createElement("div");
13
+ this.overlay.style.position = "fixed";
14
+ this.overlay.style.top = "0";
15
+ this.overlay.style.left = "0";
16
+ this.overlay.style.width = "100vw";
17
+ this.overlay.style.height = "100vh";
18
+ this.overlay.style.backgroundColor = "rgba(0,0,0,0.85)";
19
+ this.overlay.style.zIndex = "9999";
20
+ this.overlay.style.display = "flex";
21
+ this.overlay.style.justifyContent = "center";
22
+ this.overlay.style.alignItems = "center";
23
+ this.overlay.style.color = "white";
24
+ const contentContainer = document.createElement("div");
25
+ contentContainer.style.width = "80%";
26
+ contentContainer.style.height = "80%";
27
+ contentContainer.style.position = "relative";
28
+ const closeBtn = document.createElement("button");
29
+ closeBtn.innerText = "\xD7";
30
+ closeBtn.style.position = "absolute";
31
+ closeBtn.style.top = "-40px";
32
+ closeBtn.style.right = "0";
33
+ closeBtn.style.fontSize = "30px";
34
+ closeBtn.style.background = "transparent";
35
+ closeBtn.style.border = "none";
36
+ closeBtn.style.color = "white";
37
+ closeBtn.style.cursor = "pointer";
38
+ closeBtn.onclick = () => {
39
+ this.close();
40
+ onClose();
41
+ };
42
+ this.overlay.appendChild(closeBtn);
43
+ this.overlay.appendChild(contentContainer);
44
+ document.body.appendChild(this.overlay);
45
+ contentRenderer(contentContainer);
46
+ }
47
+ close() {
48
+ if (this.overlay) {
49
+ document.body.removeChild(this.overlay);
50
+ this.overlay = null;
51
+ }
52
+ }
53
+ };
54
+
55
+ exports.PortalSystem = PortalSystem;
56
+ //# sourceMappingURL=chunk-SSP4S4NY.cjs.map
57
+ //# sourceMappingURL=chunk-SSP4S4NY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/portal.ts"],"names":["__publicField"],"mappings":";;;;;AAIO,IAAM,eAAN,MAAmB;AAAA,EAGxB,WAAA,GAAc;AAFd,IAAAA,+BAAA,CAAA,IAAA,EAAQ,SAAA,EAA8B,IAAA,CAAA;AAAA,EAEvB;AAAA,EAEf,IAAA,CAAK,iBAAmD,OAAA,EAAqB;AAC3E,IAAA,IAAI,KAAK,OAAA,EAAS;AAElB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,QAAA,GAAW,OAAA;AAC9B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAA,GAAM,GAAA;AACzB,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,GAAO,GAAA;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAA,GAAQ,OAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAA,GAAS,OAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,eAAA,GAAkB,kBAAA;AACrC,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,OAAA,GAAU,MAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,cAAA,GAAiB,QAAA;AACpC,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,UAAA,GAAa,QAAA;AAChC,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAA,GAAQ,OAAA;AAE3B,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACrD,IAAA,gBAAA,CAAiB,MAAM,KAAA,GAAQ,KAAA;AAC/B,IAAA,gBAAA,CAAiB,MAAM,MAAA,GAAS,KAAA;AAChC,IAAA,gBAAA,CAAiB,MAAM,QAAA,GAAW,UAAA;AAGlC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,SAAA,GAAY,MAAA;AACrB,IAAA,QAAA,CAAS,MAAM,QAAA,GAAW,UAAA;AAC1B,IAAA,QAAA,CAAS,MAAM,GAAA,GAAM,OAAA;AACrB,IAAA,QAAA,CAAS,MAAM,KAAA,GAAQ,GAAA;AACvB,IAAA,QAAA,CAAS,MAAM,QAAA,GAAW,MAAA;AAC1B,IAAA,QAAA,CAAS,MAAM,UAAA,GAAa,aAAA;AAC5B,IAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AACxB,IAAA,QAAA,CAAS,MAAM,KAAA,GAAQ,OAAA;AACvB,IAAA,QAAA,CAAS,MAAM,MAAA,GAAS,SAAA;AAExB,IAAA,QAAA,CAAS,UAAU,MAAM;AACvB,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,QAAQ,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,gBAAgB,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AAGtC,IAAA,eAAA,CAAgB,gBAAgB,CAAA;AAAA,EAClC;AAAA,EAEA,KAAA,GAAQ;AACN,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AACtC,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AACF","file":"chunk-SSP4S4NY.cjs","sourcesContent":["// Minimal Portal helper logic\n// In a framework-agnostic way, this would manage creating a fixed overlay\n// and transferring the state/rendering to it.\n\nexport class PortalSystem {\n private overlay: HTMLElement | null = null;\n\n constructor() {}\n\n open(contentRenderer: (container: HTMLElement) => void, onClose: () => void) {\n if (this.overlay) return;\n\n this.overlay = document.createElement(\"div\");\n this.overlay.style.position = \"fixed\";\n this.overlay.style.top = \"0\";\n this.overlay.style.left = \"0\";\n this.overlay.style.width = \"100vw\";\n this.overlay.style.height = \"100vh\";\n this.overlay.style.backgroundColor = \"rgba(0,0,0,0.85)\";\n this.overlay.style.zIndex = \"9999\";\n this.overlay.style.display = \"flex\";\n this.overlay.style.justifyContent = \"center\";\n this.overlay.style.alignItems = \"center\";\n this.overlay.style.color = \"white\";\n\n const contentContainer = document.createElement(\"div\");\n contentContainer.style.width = \"80%\";\n contentContainer.style.height = \"80%\";\n contentContainer.style.position = \"relative\";\n\n // Close button\n const closeBtn = document.createElement(\"button\");\n closeBtn.innerText = \"×\";\n closeBtn.style.position = \"absolute\";\n closeBtn.style.top = \"-40px\";\n closeBtn.style.right = \"0\";\n closeBtn.style.fontSize = \"30px\";\n closeBtn.style.background = \"transparent\";\n closeBtn.style.border = \"none\";\n closeBtn.style.color = \"white\";\n closeBtn.style.cursor = \"pointer\";\n\n closeBtn.onclick = () => {\n this.close();\n onClose();\n };\n\n this.overlay.appendChild(closeBtn);\n this.overlay.appendChild(contentContainer);\n document.body.appendChild(this.overlay);\n\n // Render content\n contentRenderer(contentContainer);\n }\n\n close() {\n if (this.overlay) {\n document.body.removeChild(this.overlay);\n this.overlay = null;\n }\n }\n}\n"]}
@@ -0,0 +1,251 @@
1
+ import { createLoadingInteraction } from './chunk-3RJ542WD.js';
2
+ import { useRef, useEffect, useState } from 'react';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+
5
+ function useLoadingInteraction(ref, config) {
6
+ const engineRef = useRef(null);
7
+ useEffect(() => {
8
+ if (!ref.current || !config.isLoading) {
9
+ if (engineRef.current) {
10
+ engineRef.current.destroy();
11
+ engineRef.current = null;
12
+ }
13
+ return;
14
+ }
15
+ if (!engineRef.current) {
16
+ engineRef.current = createLoadingInteraction(ref.current, config);
17
+ }
18
+ return () => {
19
+ if (engineRef.current) {
20
+ engineRef.current.destroy();
21
+ engineRef.current = null;
22
+ }
23
+ };
24
+ }, [config.isLoading, config.mode, ref]);
25
+ return engineRef.current;
26
+ }
27
+ var icons = {
28
+ game: /* @__PURE__ */ jsxs(
29
+ "svg",
30
+ {
31
+ width: "18",
32
+ height: "18",
33
+ viewBox: "0 0 24 24",
34
+ fill: "none",
35
+ stroke: "currentColor",
36
+ strokeWidth: "2",
37
+ strokeLinecap: "round",
38
+ strokeLinejoin: "round",
39
+ children: [
40
+ /* @__PURE__ */ jsx("rect", { x: "2", y: "6", width: "20", height: "12", rx: "2" }),
41
+ /* @__PURE__ */ jsx("path", { d: "M6 12h4m-2-2v4" }),
42
+ /* @__PURE__ */ jsx("line", { x1: "15", y1: "11", x2: "15", y2: "11" }),
43
+ /* @__PURE__ */ jsx("line", { x1: "18", y1: "13", x2: "18", y2: "13" })
44
+ ]
45
+ }
46
+ ),
47
+ facts: /* @__PURE__ */ jsxs(
48
+ "svg",
49
+ {
50
+ width: "18",
51
+ height: "18",
52
+ viewBox: "0 0 24 24",
53
+ fill: "none",
54
+ stroke: "currentColor",
55
+ strokeWidth: "2",
56
+ strokeLinecap: "round",
57
+ strokeLinejoin: "round",
58
+ children: [
59
+ /* @__PURE__ */ jsx("path", { d: "M12 2a6 6 0 0 1 6 6c0 2.97-1 3.5-2 4.5V15h-8v-2.5c-1-1-2-1.53-2-4.5a6 6 0 0 1 6-6z" }),
60
+ /* @__PURE__ */ jsx("path", { d: "M8.5 18h7" }),
61
+ /* @__PURE__ */ jsx("path", { d: "M10 21h4" })
62
+ ]
63
+ }
64
+ ),
65
+ doodle: /* @__PURE__ */ jsxs(
66
+ "svg",
67
+ {
68
+ width: "18",
69
+ height: "18",
70
+ viewBox: "0 0 24 24",
71
+ fill: "none",
72
+ stroke: "currentColor",
73
+ strokeWidth: "2",
74
+ strokeLinecap: "round",
75
+ strokeLinejoin: "round",
76
+ children: [
77
+ /* @__PURE__ */ jsx("path", { d: "M12 19l7-7 3 3-7 7-3-3z" }),
78
+ /* @__PURE__ */ jsx("path", { d: "M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z" }),
79
+ /* @__PURE__ */ jsx("path", { d: "M2 2l7.586 7.586" }),
80
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "2" })
81
+ ]
82
+ }
83
+ ),
84
+ none: /* @__PURE__ */ jsx("span", { style: { fontSize: 16 }, children: "\u2715" })
85
+ };
86
+ var tooltips = {
87
+ game: "Play a Game",
88
+ facts: "Learn Facts",
89
+ doodle: "Draw Something",
90
+ none: "Disable"
91
+ };
92
+ var ModeSwitcher = ({
93
+ modes,
94
+ activeMode,
95
+ onModeChange
96
+ }) => {
97
+ const [hovered, setHovered] = useState(null);
98
+ return /* @__PURE__ */ jsx(
99
+ "div",
100
+ {
101
+ style: {
102
+ display: "flex",
103
+ flexDirection: "column",
104
+ gap: "8px",
105
+ padding: "4px"
106
+ },
107
+ children: modes.map((mode) => /* @__PURE__ */ jsxs(
108
+ "div",
109
+ {
110
+ style: {
111
+ position: "relative",
112
+ display: "flex",
113
+ alignItems: "center",
114
+ justifyContent: "flex-end"
115
+ },
116
+ children: [
117
+ hovered === mode && /* @__PURE__ */ jsx(
118
+ "div",
119
+ {
120
+ style: {
121
+ position: "absolute",
122
+ right: "100%",
123
+ marginRight: "8px",
124
+ background: "rgba(0,0,0,0.8)",
125
+ color: "#fff",
126
+ padding: "4px 8px",
127
+ borderRadius: "4px",
128
+ fontSize: "12px",
129
+ whiteSpace: "nowrap",
130
+ pointerEvents: "none",
131
+ opacity: 0,
132
+ animation: "fadeIn 0.2s forwards"
133
+ },
134
+ children: tooltips[mode] || mode
135
+ }
136
+ ),
137
+ /* @__PURE__ */ jsx(
138
+ "button",
139
+ {
140
+ onClick: (e) => {
141
+ e.preventDefault();
142
+ onModeChange(mode);
143
+ },
144
+ onMouseEnter: () => setHovered(mode),
145
+ onMouseLeave: () => setHovered(null),
146
+ style: {
147
+ width: "36px",
148
+ height: "36px",
149
+ borderRadius: "50%",
150
+ border: "none",
151
+ background: activeMode === mode ? "#333" : "rgba(255,255,255,0.9)",
152
+ color: activeMode === mode ? "#fff" : "#555",
153
+ cursor: "pointer",
154
+ display: "flex",
155
+ alignItems: "center",
156
+ justifyContent: "center",
157
+ boxShadow: "0 2px 5px rgba(0,0,0,0.1)",
158
+ transition: "all 0.2s ease",
159
+ transform: activeMode === mode ? "scale(1.1)" : "scale(1)"
160
+ },
161
+ "aria-label": mode,
162
+ children: icons[mode] || mode[0].toUpperCase()
163
+ }
164
+ ),
165
+ /* @__PURE__ */ jsx("style", { children: `
166
+ @keyframes fadeIn {
167
+ from { opacity: 0; transform: translateX(5px); }
168
+ to { opacity: 1; transform: translateX(0); }
169
+ }
170
+ ` })
171
+ ]
172
+ },
173
+ mode
174
+ ))
175
+ }
176
+ );
177
+ };
178
+ var LoadingInteraction = (props) => {
179
+ const {
180
+ isLoading,
181
+ children,
182
+ availableModes = ["game", "facts", "doodle"],
183
+ showModeSwitcher = true,
184
+ width = "100%",
185
+ height = "300px",
186
+ ...config
187
+ } = props;
188
+ const containerRef = useRef(null);
189
+ const [currentMode, setCurrentMode] = useState(
190
+ props.mode || availableModes[0] || "none"
191
+ );
192
+ useEffect(() => {
193
+ if (props.mode) setCurrentMode(props.mode);
194
+ }, [props.mode]);
195
+ const activeConfig = {
196
+ ...config,
197
+ isLoading,
198
+ mode: currentMode,
199
+ availableModes,
200
+ style: props.style,
201
+ transitionDuration: props.transitionDuration
202
+ };
203
+ useLoadingInteraction(containerRef, activeConfig);
204
+ if (!isLoading) {
205
+ return /* @__PURE__ */ jsx(Fragment, { children });
206
+ }
207
+ return /* @__PURE__ */ jsxs("div", { style: { position: "relative", width, height }, children: [
208
+ showModeSwitcher && availableModes.length > 1 && /* @__PURE__ */ jsx(
209
+ "div",
210
+ {
211
+ style: {
212
+ position: "absolute",
213
+ bottom: 12,
214
+ right: 12,
215
+ width: "auto",
216
+ zIndex: 20,
217
+ pointerEvents: "none"
218
+ // Allow clicks to pass through transparent areas
219
+ },
220
+ children: /* @__PURE__ */ jsx("div", { style: { pointerEvents: "auto" }, children: /* @__PURE__ */ jsx(
221
+ ModeSwitcher,
222
+ {
223
+ modes: availableModes,
224
+ activeMode: currentMode,
225
+ onModeChange: setCurrentMode
226
+ }
227
+ ) })
228
+ }
229
+ ),
230
+ /* @__PURE__ */ jsx(
231
+ "div",
232
+ {
233
+ ref: containerRef,
234
+ style: {
235
+ width: "100%",
236
+ height: "100%",
237
+ background: "#f5f5f5",
238
+ display: "flex",
239
+ alignItems: "center",
240
+ justifyContent: "center",
241
+ borderRadius: "8px",
242
+ overflow: "hidden"
243
+ }
244
+ }
245
+ )
246
+ ] });
247
+ };
248
+
249
+ export { LoadingInteraction, ModeSwitcher, useLoadingInteraction };
250
+ //# sourceMappingURL=chunk-SUJCEDVR.js.map
251
+ //# sourceMappingURL=chunk-SUJCEDVR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/hooks.ts","../src/react/ModeSwitcher.tsx","../src/react/LoadingInteraction.tsx"],"names":["useRef","useState","useEffect","jsx","jsxs"],"mappings":"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","file":"chunk-SUJCEDVR.js","sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { createLoadingInteraction, LoadingEngine } from \"../core/engine\";\nimport { InteractionConfig } from \"../core/types\";\n\nexport function useLoadingInteraction(\n ref: React.RefObject<HTMLElement>,\n config: InteractionConfig\n) {\n const engineRef = useRef<LoadingEngine | null>(null);\n\n useEffect(() => {\n if (!ref.current || !config.isLoading) {\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n }\n return;\n }\n\n if (!engineRef.current) {\n engineRef.current = createLoadingInteraction(ref.current, config);\n }\n\n return () => {\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n }\n };\n }, [config.isLoading, config.mode, ref]);\n\n return engineRef.current;\n}\n","import React, { useState } from \"react\";\nimport { InteractionMode } from \"../core/types\";\n\ninterface ModeSwitcherProps {\n modes: InteractionMode[];\n activeMode: InteractionMode;\n onModeChange: (mode: InteractionMode) => void;\n}\n\nconst icons: Record<string, React.ReactNode> = {\n game: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\" />\n <path d=\"M6 12h4m-2-2v4\" />\n <line x1=\"15\" y1=\"11\" x2=\"15\" y2=\"11\" />\n <line x1=\"18\" y1=\"13\" x2=\"18\" y2=\"13\" />\n </svg>\n ),\n facts: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a6 6 0 0 1 6 6c0 2.97-1 3.5-2 4.5V15h-8v-2.5c-1-1-2-1.53-2-4.5a6 6 0 0 1 6-6z\" />\n <path d=\"M8.5 18h7\" />\n <path d=\"M10 21h4\" />\n </svg>\n ),\n doodle: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19l7-7 3 3-7 7-3-3z\" />\n <path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\" />\n <path d=\"M2 2l7.586 7.586\" />\n <circle cx=\"11\" cy=\"11\" r=\"2\" />\n </svg>\n ),\n none: <span style={{ fontSize: 16 }}>✕</span>,\n};\n\nconst tooltips: Record<string, string> = {\n game: \"Play a Game\",\n facts: \"Learn Facts\",\n doodle: \"Draw Something\",\n none: \"Disable\",\n};\n\nexport const ModeSwitcher: React.FC<ModeSwitcherProps> = ({\n modes,\n activeMode,\n onModeChange,\n}) => {\n const [hovered, setHovered] = useState<InteractionMode | null>(null);\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n padding: \"4px\",\n }}\n >\n {modes.map((mode) => (\n <div\n key={mode}\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n }}\n >\n {/* Tooltip (Left side) */}\n {hovered === mode && (\n <div\n style={{\n position: \"absolute\",\n right: \"100%\",\n marginRight: \"8px\",\n background: \"rgba(0,0,0,0.8)\",\n color: \"#fff\",\n padding: \"4px 8px\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n opacity: 0,\n animation: \"fadeIn 0.2s forwards\",\n }}\n >\n {tooltips[mode] || mode}\n </div>\n )}\n\n {/* Icon Button */}\n <button\n onClick={(e) => {\n e.preventDefault();\n onModeChange(mode);\n }}\n onMouseEnter={() => setHovered(mode)}\n onMouseLeave={() => setHovered(null)}\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\n border: \"none\",\n background:\n activeMode === mode ? \"#333\" : \"rgba(255,255,255,0.9)\",\n color: activeMode === mode ? \"#fff\" : \"#555\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 2px 5px rgba(0,0,0,0.1)\",\n transition: \"all 0.2s ease\",\n transform: activeMode === mode ? \"scale(1.1)\" : \"scale(1)\",\n }}\n aria-label={mode}\n >\n {icons[mode] || mode[0].toUpperCase()}\n </button>\n\n <style>{`\n @keyframes fadeIn {\n from { opacity: 0; transform: translateX(5px); }\n to { opacity: 1; transform: translateX(0); }\n }\n `}</style>\n </div>\n ))}\n </div>\n );\n};\n","import React, { useRef, useState, useEffect } from \"react\";\nimport { InteractionConfig, InteractionMode } from \"../core/types\";\nimport { useLoadingInteraction } from \"./hooks\";\nimport { ModeSwitcher } from \"./ModeSwitcher\";\n\nexport interface LoadingInteractionProps\n extends Omit<InteractionConfig, \"isLoading\"> {\n isLoading: boolean;\n children?: React.ReactNode;\n width?: string | number;\n height?: string | number;\n style?: Partial<CSSStyleDeclaration>;\n transitionDuration?: number;\n}\n\nexport const LoadingInteraction: React.FC<LoadingInteractionProps> = (\n props\n) => {\n const {\n isLoading,\n children,\n availableModes = [\"game\", \"facts\", \"doodle\"],\n showModeSwitcher = true,\n width = \"100%\",\n height = \"300px\",\n ...config\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentMode, setCurrentMode] = useState<InteractionMode>(\n props.mode || availableModes[0] || \"none\"\n );\n\n // Sync mode prop if changed externally\n useEffect(() => {\n if (props.mode) setCurrentMode(props.mode);\n }, [props.mode]);\n\n const activeConfig = {\n ...config,\n isLoading,\n mode: currentMode,\n availableModes,\n style: props.style,\n transitionDuration: props.transitionDuration,\n };\n\n useLoadingInteraction(containerRef, activeConfig);\n\n if (!isLoading) {\n return <>{children}</>;\n }\n\n return (\n <div style={{ position: \"relative\", width, height }}>\n {showModeSwitcher && availableModes.length > 1 && (\n <div\n style={{\n position: \"absolute\",\n bottom: 12,\n right: 12,\n width: \"auto\",\n zIndex: 20,\n pointerEvents: \"none\", // Allow clicks to pass through transparent areas\n }}\n >\n {/* Re-enable pointer events for the switcher items */}\n <div style={{ pointerEvents: \"auto\" }}>\n <ModeSwitcher\n modes={availableModes}\n activeMode={currentMode}\n onModeChange={setCurrentMode}\n />\n </div>\n </div>\n )}\n <div\n ref={containerRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n background: \"#f5f5f5\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n }}\n />\n </div>\n );\n};\n"]}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ var chunk4DE2IREA_cjs = require('./chunk-4DE2IREA.cjs');
4
+
5
+ // src/facts/tech-stats.ts
6
+ var STATS = [
7
+ { id: "1", text: "JavaScript is used by 98% of websites", category: "stats" },
8
+ {
9
+ id: "2",
10
+ text: "There are over 1.3 million npm packages",
11
+ category: "stats"
12
+ }
13
+ ];
14
+ var StatsRenderer = class {
15
+ constructor(container, facts) {
16
+ chunk4DE2IREA_cjs.__publicField(this, "container");
17
+ this.container = container;
18
+ this.container.innerText = facts[0].text;
19
+ }
20
+ next() {
21
+ }
22
+ previous() {
23
+ }
24
+ favorite() {
25
+ }
26
+ destroy() {
27
+ this.container.innerHTML = "";
28
+ }
29
+ };
30
+ var TechStats = {
31
+ id: "tech-stats",
32
+ name: "Tech Stats",
33
+ category: "stats",
34
+ facts: STATS,
35
+ renderMini: (c) => new StatsRenderer(c, STATS),
36
+ renderFull: (c) => new StatsRenderer(c, STATS)
37
+ };
38
+
39
+ exports.TechStats = TechStats;
40
+ //# sourceMappingURL=chunk-V4RO47V6.cjs.map
41
+ //# sourceMappingURL=chunk-V4RO47V6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/facts/tech-stats.ts"],"names":["__publicField"],"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,IAAAA,+BAAA,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-V4RO47V6.cjs","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"]}