petdex-cc 0.1.0
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/LICENSE +21 -0
- package/README.md +247 -0
- package/README_CN.md +247 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +78 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/assets/tray-icon.png +0 -0
- package/dist/src/cli/config.d.ts +9 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +41 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/install.d.ts +2 -0
- package/dist/src/cli/install.d.ts.map +1 -0
- package/dist/src/cli/install.js +62 -0
- package/dist/src/cli/install.js.map +1 -0
- package/dist/src/cli/list.d.ts +2 -0
- package/dist/src/cli/list.d.ts.map +1 -0
- package/dist/src/cli/list.js +20 -0
- package/dist/src/cli/list.js.map +1 -0
- package/dist/src/cli/start.d.ts +3 -0
- package/dist/src/cli/start.d.ts.map +1 -0
- package/dist/src/cli/start.js +37 -0
- package/dist/src/cli/start.js.map +1 -0
- package/dist/src/cli/status.d.ts +2 -0
- package/dist/src/cli/status.d.ts.map +1 -0
- package/dist/src/cli/status.js +8 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/stop.d.ts +2 -0
- package/dist/src/cli/stop.d.ts.map +1 -0
- package/dist/src/cli/stop.js +39 -0
- package/dist/src/cli/stop.js.map +1 -0
- package/dist/src/cli/switch.d.ts +2 -0
- package/dist/src/cli/switch.d.ts.map +1 -0
- package/dist/src/cli/switch.js +34 -0
- package/dist/src/cli/switch.js.map +1 -0
- package/dist/src/cli/uninstall.d.ts +2 -0
- package/dist/src/cli/uninstall.d.ts.map +1 -0
- package/dist/src/cli/uninstall.js +18 -0
- package/dist/src/cli/uninstall.js.map +1 -0
- package/dist/src/hooks/register.d.ts +3 -0
- package/dist/src/hooks/register.d.ts.map +1 -0
- package/dist/src/hooks/register.js +113 -0
- package/dist/src/hooks/register.js.map +1 -0
- package/dist/src/hooks/write-scripts.d.ts +2 -0
- package/dist/src/hooks/write-scripts.d.ts.map +1 -0
- package/dist/src/hooks/write-scripts.js +39 -0
- package/dist/src/hooks/write-scripts.js.map +1 -0
- package/dist/src/main/ai-speech.d.ts +22 -0
- package/dist/src/main/ai-speech.d.ts.map +1 -0
- package/dist/src/main/ai-speech.js +131 -0
- package/dist/src/main/ai-speech.js.map +1 -0
- package/dist/src/main/event-mapper.d.ts +10 -0
- package/dist/src/main/event-mapper.d.ts.map +1 -0
- package/dist/src/main/event-mapper.js +92 -0
- package/dist/src/main/event-mapper.js.map +1 -0
- package/dist/src/main/index.d.ts +2 -0
- package/dist/src/main/index.d.ts.map +1 -0
- package/dist/src/main/index.js +175 -0
- package/dist/src/main/index.js.map +1 -0
- package/dist/src/main/server.d.ts +8 -0
- package/dist/src/main/server.d.ts.map +1 -0
- package/dist/src/main/server.js +81 -0
- package/dist/src/main/server.js.map +1 -0
- package/dist/src/main/storage.d.ts +15 -0
- package/dist/src/main/storage.d.ts.map +1 -0
- package/dist/src/main/storage.js +90 -0
- package/dist/src/main/storage.js.map +1 -0
- package/dist/src/main/tray.d.ts +3 -0
- package/dist/src/main/tray.d.ts.map +1 -0
- package/dist/src/main/tray.js +156 -0
- package/dist/src/main/tray.js.map +1 -0
- package/dist/src/petdex-api/client.d.ts +21 -0
- package/dist/src/petdex-api/client.d.ts.map +1 -0
- package/dist/src/petdex-api/client.js +23 -0
- package/dist/src/petdex-api/client.js.map +1 -0
- package/dist/src/petdex-api/download.d.ts +8 -0
- package/dist/src/petdex-api/download.d.ts.map +1 -0
- package/dist/src/petdex-api/download.js +45 -0
- package/dist/src/petdex-api/download.js.map +1 -0
- package/dist/src/renderer/bubble.d.ts +30 -0
- package/dist/src/renderer/bubble.d.ts.map +1 -0
- package/dist/src/renderer/bubble.js +69 -0
- package/dist/src/renderer/bubble.js.map +1 -0
- package/dist/src/renderer/click-through.d.ts +21 -0
- package/dist/src/renderer/click-through.d.ts.map +1 -0
- package/dist/src/renderer/click-through.js +29 -0
- package/dist/src/renderer/click-through.js.map +1 -0
- package/dist/src/renderer/context-menu.d.ts +24 -0
- package/dist/src/renderer/context-menu.d.ts.map +1 -0
- package/dist/src/renderer/context-menu.js +83 -0
- package/dist/src/renderer/context-menu.js.map +1 -0
- package/dist/src/renderer/drag.d.ts +3 -0
- package/dist/src/renderer/drag.d.ts.map +1 -0
- package/dist/src/renderer/drag.js +57 -0
- package/dist/src/renderer/drag.js.map +1 -0
- package/dist/src/renderer/index.html +264 -0
- package/dist/src/renderer/pet-sprite.d.ts +25 -0
- package/dist/src/renderer/pet-sprite.d.ts.map +1 -0
- package/dist/src/renderer/pet-sprite.js +59 -0
- package/dist/src/renderer/pet-sprite.js.map +1 -0
- package/dist/src/renderer/renderer.d.ts +2 -0
- package/dist/src/renderer/renderer.d.ts.map +1 -0
- package/dist/src/renderer/renderer.js +244 -0
- package/dist/src/renderer/renderer.js.map +1 -0
- package/dist/src/renderer/wander.d.ts +8 -0
- package/dist/src/renderer/wander.d.ts.map +1 -0
- package/dist/src/renderer/wander.js +137 -0
- package/dist/src/renderer/wander.js.map +1 -0
- package/dist/src/shared/events.d.ts +62 -0
- package/dist/src/shared/events.d.ts.map +1 -0
- package/dist/src/shared/events.js +2 -0
- package/dist/src/shared/events.js.map +1 -0
- package/dist/src/shared/levels.d.ts +18 -0
- package/dist/src/shared/levels.d.ts.map +1 -0
- package/dist/src/shared/levels.js +20 -0
- package/dist/src/shared/levels.js.map +1 -0
- package/dist/src/shared/pet-states.d.ts +72 -0
- package/dist/src/shared/pet-states.d.ts.map +1 -0
- package/dist/src/shared/pet-states.js +20 -0
- package/dist/src/shared/pet-states.js.map +1 -0
- package/package.json +48 -0
- package/src/assets/tray-icon.png +0 -0
- package/src/hooks/bridge.ps1 +11 -0
- package/src/hooks/bridge.sh +9 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context menu module.
|
|
3
|
+
*
|
|
4
|
+
* Builds the right-click context menu for the pet. Electron Menu is
|
|
5
|
+
* available via the preload bridge in the renderer process.
|
|
6
|
+
*/
|
|
7
|
+
import { Menu, app } from "electron";
|
|
8
|
+
/**
|
|
9
|
+
* Creates the pet context menu.
|
|
10
|
+
*
|
|
11
|
+
* Menu items:
|
|
12
|
+
* - "Show Pet" / "Hide Pet" toggle
|
|
13
|
+
* - Separator
|
|
14
|
+
* - "Switch Pet..."
|
|
15
|
+
* - "Settings..."
|
|
16
|
+
* - "About"
|
|
17
|
+
* - Separator
|
|
18
|
+
* - "Quit"
|
|
19
|
+
*
|
|
20
|
+
* @param win The BrowserWindow this menu controls.
|
|
21
|
+
* @returns An Electron Menu instance.
|
|
22
|
+
*/
|
|
23
|
+
export function createContextMenu(win) {
|
|
24
|
+
return Menu.buildFromTemplate([
|
|
25
|
+
{
|
|
26
|
+
label: win.isVisible() ? "Hide Pet" : "Show Pet",
|
|
27
|
+
click: () => {
|
|
28
|
+
if (win.isVisible()) {
|
|
29
|
+
win.hide();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
win.show();
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{ type: "separator" },
|
|
37
|
+
{
|
|
38
|
+
label: "Switch Pet...",
|
|
39
|
+
click: () => {
|
|
40
|
+
// Placeholder -- will be implemented in a future iteration.
|
|
41
|
+
const { dialog } = require("electron");
|
|
42
|
+
dialog.showMessageBox(win, {
|
|
43
|
+
type: "info",
|
|
44
|
+
title: "Switch Pet",
|
|
45
|
+
message: "Pet switching is not yet implemented.",
|
|
46
|
+
detail: "Use: npx petdex-cc install <pet-name> to switch pets.",
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
label: "Settings...",
|
|
52
|
+
click: () => {
|
|
53
|
+
const { dialog } = require("electron");
|
|
54
|
+
dialog.showMessageBox(win, {
|
|
55
|
+
type: "info",
|
|
56
|
+
title: "Settings",
|
|
57
|
+
message: "Settings are not yet implemented.",
|
|
58
|
+
detail: "Configuration will be available in a future version.",
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
label: "About",
|
|
64
|
+
click: () => {
|
|
65
|
+
const { dialog } = require("electron");
|
|
66
|
+
dialog.showMessageBox(win, {
|
|
67
|
+
type: "info",
|
|
68
|
+
title: "petdex-cc",
|
|
69
|
+
message: "petdex-cc v0.1.0",
|
|
70
|
+
detail: "Desktop pet companion for Claude Code.\nPets from https://petdex.crafter.run",
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{ type: "separator" },
|
|
75
|
+
{
|
|
76
|
+
label: "Quit",
|
|
77
|
+
click: () => {
|
|
78
|
+
app.quit();
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=context-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.js","sourceRoot":"","sources":["../../../src/renderer/context-menu.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAiB,MAAM,UAAU,CAAC;AAEpD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAkB;IAClD,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAC5B;YACE,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;YAChD,KAAK,EAAE,GAAG,EAAE;gBACV,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;oBACpB,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;SACF;QACD,EAAE,IAAI,EAAE,WAAW,EAAE;QACrB;YACE,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,GAAG,EAAE;gBACV,4DAA4D;gBAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAoB,CAAC;gBAC1D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE;oBACzB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,YAAY;oBACnB,OAAO,EAAE,uCAAuC;oBAChD,MAAM,EAAE,uDAAuD;iBAChE,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,GAAG,EAAE;gBACV,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAoB,CAAC;gBAC1D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE;oBACzB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,UAAU;oBACjB,OAAO,EAAE,mCAAmC;oBAC5C,MAAM,EAAE,sDAAsD;iBAC/D,CAAC,CAAC;YACL,CAAC;SACF;QACD;YACE,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,GAAG,EAAE;gBACV,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAoB,CAAC;gBAC1D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE;oBACzB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EACJ,8EAA8E;iBACjF,CAAC,CAAC;YACL,CAAC;SACF;QACD,EAAE,IAAI,EAAE,WAAW,EAAE;QACrB;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,GAAG,EAAE;gBACV,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag.d.ts","sourceRoot":"","sources":["../../../src/renderer/drag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA2C9C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAoBrE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { showBubble } from "./bubble.js";
|
|
2
|
+
import { setPetAction } from "./pet-sprite.js";
|
|
3
|
+
let dragging = false;
|
|
4
|
+
let startX = 0;
|
|
5
|
+
let startY = 0;
|
|
6
|
+
// Click easter egg
|
|
7
|
+
let clickCount = 0;
|
|
8
|
+
let clickTimer = null;
|
|
9
|
+
const CLICK_WINDOW_MS = 1500; // time window for counting clicks
|
|
10
|
+
const CLICK_MESSAGES = [
|
|
11
|
+
{ threshold: 2, text: "你戳我干嘛?" },
|
|
12
|
+
{ threshold: 4, text: "好痛!别戳了!" },
|
|
13
|
+
{ threshold: 6, text: "再点我就不理你了!", state: "failed" },
|
|
14
|
+
{ threshold: 9, text: "呜呜...你欺负人", state: "failed" },
|
|
15
|
+
{ threshold: 12, text: "我要报警了!再点一下试试!", state: "jumping" },
|
|
16
|
+
{ threshold: 15, text: "✨ 勇敢的冒险者,你解锁了隐藏成就!", state: "jumping" },
|
|
17
|
+
];
|
|
18
|
+
function handleClick() {
|
|
19
|
+
clickCount++;
|
|
20
|
+
if (clickTimer)
|
|
21
|
+
clearTimeout(clickTimer);
|
|
22
|
+
clickTimer = setTimeout(() => {
|
|
23
|
+
clickCount = 0;
|
|
24
|
+
}, CLICK_WINDOW_MS);
|
|
25
|
+
// Find the highest matching message
|
|
26
|
+
let matched = CLICK_MESSAGES[0];
|
|
27
|
+
for (const msg of CLICK_MESSAGES) {
|
|
28
|
+
if (clickCount >= msg.threshold)
|
|
29
|
+
matched = msg;
|
|
30
|
+
}
|
|
31
|
+
if (clickCount >= CLICK_MESSAGES[0].threshold) {
|
|
32
|
+
showBubble(matched.text, 4000);
|
|
33
|
+
if (matched.state)
|
|
34
|
+
setPetAction(matched.state);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function initDrag(petEl, win) {
|
|
38
|
+
petEl.addEventListener("mousedown", (e) => {
|
|
39
|
+
dragging = true;
|
|
40
|
+
startX = e.screenX;
|
|
41
|
+
startY = e.screenY;
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
handleClick();
|
|
44
|
+
});
|
|
45
|
+
document.addEventListener("mousemove", (e) => {
|
|
46
|
+
if (!dragging)
|
|
47
|
+
return;
|
|
48
|
+
const [wx, wy] = win.getPosition();
|
|
49
|
+
win.setPosition(wx + e.screenX - startX, wy + e.screenY - startY);
|
|
50
|
+
startX = e.screenX;
|
|
51
|
+
startY = e.screenY;
|
|
52
|
+
});
|
|
53
|
+
document.addEventListener("mouseup", () => {
|
|
54
|
+
dragging = false;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=drag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag.js","sourceRoot":"","sources":["../../../src/renderer/drag.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAI,MAAM,GAAG,CAAC,CAAC;AAEf,mBAAmB;AACnB,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAI,UAAU,GAAyC,IAAI,CAAC;AAE5D,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,kCAAkC;AAEhE,MAAM,cAAc,GAA0D;IAC5E,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;IACjC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpD,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpD,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1D,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;CAChE,CAAC;AAEF,SAAS,WAAW;IAClB,UAAU,EAAE,CAAC;IAEb,IAAI,UAAU;QAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;QAC3B,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC,EAAE,eAAe,CAAC,CAAC;IAEpB,oCAAoC;IACpC,IAAI,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,UAAU,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,IAAI,UAAU,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAC9C,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,OAAO,CAAC,KAAK;YAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAkB,EAAE,GAAkB;IAC7D,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;QACxC,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;QACnB,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,WAAW,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;QAC3C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;QAClE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;QACnB,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE;QACxC,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<!-- CSP removed for local Electron renderer -->
|
|
7
|
+
<title>petdex-cc</title>
|
|
8
|
+
<style>
|
|
9
|
+
* {
|
|
10
|
+
margin: 0;
|
|
11
|
+
padding: 0;
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
html, body {
|
|
16
|
+
width: 100%;
|
|
17
|
+
height: 100%;
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
background: transparent;
|
|
20
|
+
user-select: none;
|
|
21
|
+
-webkit-user-select: none;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
#pet-container {
|
|
25
|
+
position: absolute;
|
|
26
|
+
width: 300px;
|
|
27
|
+
height: 320px;
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: flex-end;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#bubble-container {
|
|
35
|
+
position: relative;
|
|
36
|
+
width: 100%;
|
|
37
|
+
display: flex;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
margin-bottom: 4px;
|
|
40
|
+
pointer-events: none;
|
|
41
|
+
z-index: 10;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#bubble {
|
|
45
|
+
position: absolute;
|
|
46
|
+
bottom: calc(100% + 10px);
|
|
47
|
+
max-width: 220px;
|
|
48
|
+
padding: 8px 12px;
|
|
49
|
+
border-radius: 12px;
|
|
50
|
+
background: rgba(255, 255, 255, 0.9);
|
|
51
|
+
font: 13px sans-serif;
|
|
52
|
+
color: #333;
|
|
53
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
54
|
+
opacity: 1;
|
|
55
|
+
transition: opacity 200ms ease-in, opacity 500ms ease-out;
|
|
56
|
+
pointer-events: none;
|
|
57
|
+
word-wrap: break-word;
|
|
58
|
+
line-height: 1.4;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#bubble.bubble-hidden {
|
|
62
|
+
opacity: 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#bubble::after {
|
|
66
|
+
content: '';
|
|
67
|
+
position: absolute;
|
|
68
|
+
bottom: -10px;
|
|
69
|
+
left: 50%;
|
|
70
|
+
transform: translateX(-50%);
|
|
71
|
+
width: 0;
|
|
72
|
+
height: 0;
|
|
73
|
+
border-left: 10px solid transparent;
|
|
74
|
+
border-right: 10px solid transparent;
|
|
75
|
+
border-top: 10px solid rgba(255, 255, 255, 0.9);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#pet-sprite {
|
|
79
|
+
width: 192px;
|
|
80
|
+
height: 208px;
|
|
81
|
+
position: relative;
|
|
82
|
+
background-repeat: no-repeat;
|
|
83
|
+
background-size: 1536px 1872px;
|
|
84
|
+
image-rendering: pixelated;
|
|
85
|
+
background-image: var(--sprite-url);
|
|
86
|
+
animation: pet-state var(--sprite-duration) steps(var(--sprite-frames)) infinite;
|
|
87
|
+
--sprite-url: none;
|
|
88
|
+
--sprite-row: 0;
|
|
89
|
+
--sprite-frames: 6;
|
|
90
|
+
--sprite-duration: 1100ms;
|
|
91
|
+
--sprite-y: calc(var(--sprite-row) * -208px);
|
|
92
|
+
--sprite-end-x: calc(var(--sprite-frames) * -192px);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@keyframes pet-state {
|
|
96
|
+
from {
|
|
97
|
+
background-position: 0 var(--sprite-y);
|
|
98
|
+
}
|
|
99
|
+
to {
|
|
100
|
+
background-position: var(--sprite-end-x) var(--sprite-y);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* ── Level badge ── */
|
|
105
|
+
#level-badge {
|
|
106
|
+
position: absolute;
|
|
107
|
+
top: 4px;
|
|
108
|
+
right: 4px;
|
|
109
|
+
padding: 2px 8px;
|
|
110
|
+
border-radius: 8px;
|
|
111
|
+
background: linear-gradient(145deg, rgba(255,255,255,0.14), rgba(255,255,255,0.04));
|
|
112
|
+
border: 1px solid rgba(255,255,255,0.2);
|
|
113
|
+
color: #fff;
|
|
114
|
+
font: 600 10px/1.4 'Cascadia Code', 'SF Mono', 'Fira Code', Consolas, monospace;
|
|
115
|
+
letter-spacing: 0.4px;
|
|
116
|
+
pointer-events: none;
|
|
117
|
+
z-index: 20;
|
|
118
|
+
white-space: nowrap;
|
|
119
|
+
display: none;
|
|
120
|
+
text-shadow: 0 0 8px var(--lv-color, #fff), 0 1px 2px rgba(0,0,0,0.5);
|
|
121
|
+
box-shadow: 0 0 8px -2px var(--lv-color, transparent),
|
|
122
|
+
0 2px 4px rgba(0,0,0,0.2),
|
|
123
|
+
inset 0 1px 0 rgba(255,255,255,0.1);
|
|
124
|
+
overflow: hidden;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#level-badge::after {
|
|
128
|
+
content: '';
|
|
129
|
+
position: absolute;
|
|
130
|
+
top: 0; left: -60%;
|
|
131
|
+
width: 40%; height: 100%;
|
|
132
|
+
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
|
|
133
|
+
transform: skewX(-25deg);
|
|
134
|
+
animation: badge-shine 5s ease-in-out infinite;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@keyframes badge-shine {
|
|
138
|
+
0%, 75%, 100% { left: -60%; }
|
|
139
|
+
90% { left: 140%; }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* ── Level effect layers ── */
|
|
143
|
+
#level-glow, #level-aura, #level-halo {
|
|
144
|
+
position: absolute;
|
|
145
|
+
top: -16px; left: -16px;
|
|
146
|
+
width: 224px; height: 240px;
|
|
147
|
+
pointer-events: none;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#level-particles {
|
|
151
|
+
position: absolute;
|
|
152
|
+
top: 0; left: 0;
|
|
153
|
+
width: 192px; height: 208px;
|
|
154
|
+
overflow: visible;
|
|
155
|
+
pointer-events: none;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* Glow — soft breathing radial */
|
|
159
|
+
#level-glow {
|
|
160
|
+
border-radius: 50%;
|
|
161
|
+
filter: blur(18px);
|
|
162
|
+
opacity: 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
#level-glow.active {
|
|
166
|
+
background: radial-gradient(circle, var(--lv-color, #4ade80) 0%, transparent 60%);
|
|
167
|
+
animation: glow-breathe 4s ease-in-out infinite;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
@keyframes glow-breathe {
|
|
171
|
+
0%, 100% { opacity: 0.1; transform: scale(0.9); }
|
|
172
|
+
50% { opacity: 0.3; transform: scale(1.08); }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/* Aura — rotating conic-gradient ring */
|
|
176
|
+
#level-aura {
|
|
177
|
+
border-radius: 50%;
|
|
178
|
+
opacity: 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
#level-aura.active {
|
|
182
|
+
background: conic-gradient(
|
|
183
|
+
from 0deg,
|
|
184
|
+
transparent 0%, var(--lv-color, #60a5fa) 6%, transparent 14%,
|
|
185
|
+
transparent 44%, var(--lv-color, #60a5fa) 50%, transparent 58%,
|
|
186
|
+
transparent 100%
|
|
187
|
+
);
|
|
188
|
+
-webkit-mask: radial-gradient(circle, transparent 58%, black 60%, black 78%, transparent 80%);
|
|
189
|
+
mask: radial-gradient(circle, transparent 58%, black 60%, black 78%, transparent 80%);
|
|
190
|
+
animation: aura-spin 10s linear infinite, aura-pulse 4s ease-in-out infinite;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
@keyframes aura-spin { to { transform: rotate(360deg); } }
|
|
194
|
+
@keyframes aura-pulse {
|
|
195
|
+
0%, 100% { opacity: 0.45; }
|
|
196
|
+
50% { opacity: 0.85; }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* Particles — floating light motes */
|
|
200
|
+
.level-particle {
|
|
201
|
+
position: absolute;
|
|
202
|
+
width: 3px; height: 3px;
|
|
203
|
+
border-radius: 50%;
|
|
204
|
+
background: var(--lv-color, #f59e0b);
|
|
205
|
+
box-shadow: 0 0 6px 1px var(--lv-color, #f59e0b);
|
|
206
|
+
opacity: 0;
|
|
207
|
+
pointer-events: none;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.level-particle.active {
|
|
211
|
+
animation: p-float var(--p-dur, 3s) ease-out infinite var(--p-del, 0s);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@keyframes p-float {
|
|
215
|
+
0% { opacity: 0; transform: translateY(0) scale(0.4); }
|
|
216
|
+
10% { opacity: 0.9; transform: translateY(-5px) scale(1); }
|
|
217
|
+
100% { opacity: 0; transform: translateY(var(--p-dy, -80px)) translateX(var(--p-dx, 0px)) scale(0.2); }
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* Halo — golden shimmer ring */
|
|
221
|
+
#level-halo {
|
|
222
|
+
border-radius: 50%;
|
|
223
|
+
border: 2px solid transparent;
|
|
224
|
+
opacity: 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
#level-halo.active {
|
|
228
|
+
border-color: #fbbf24;
|
|
229
|
+
animation: halo-glow 3s ease-in-out infinite;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
@keyframes halo-glow {
|
|
233
|
+
0%, 100% { opacity: 0.45; box-shadow: 0 0 10px #fbbf2444, inset 0 0 6px #fbbf2422; }
|
|
234
|
+
50% { opacity: 0.85; box-shadow: 0 0 24px #fbbf2488, inset 0 0 12px #fbbf2444, 0 0 40px #fbbf2422; }
|
|
235
|
+
}
|
|
236
|
+
</style>
|
|
237
|
+
</head>
|
|
238
|
+
<body>
|
|
239
|
+
<div id="pet-container">
|
|
240
|
+
<div id="bubble-container">
|
|
241
|
+
<div id="bubble" class="bubble-hidden"></div>
|
|
242
|
+
</div>
|
|
243
|
+
<div id="pet-sprite-wrapper" style="position: relative;">
|
|
244
|
+
<div id="pet-sprite"></div>
|
|
245
|
+
<div id="level-glow"></div>
|
|
246
|
+
<div id="level-aura"></div>
|
|
247
|
+
<div id="level-particles">
|
|
248
|
+
<div class="level-particle" style="left:18%;top:78%;--p-dur:3.2s;--p-del:0s;--p-dy:-85px;--p-dx:-8px"></div>
|
|
249
|
+
<div class="level-particle" style="left:38%;top:88%;--p-dur:2.7s;--p-del:.5s;--p-dy:-75px;--p-dx:6px"></div>
|
|
250
|
+
<div class="level-particle" style="left:58%;top:82%;--p-dur:3.4s;--p-del:.9s;--p-dy:-90px;--p-dx:-4px"></div>
|
|
251
|
+
<div class="level-particle" style="left:78%;top:72%;--p-dur:2.9s;--p-del:1.4s;--p-dy:-70px;--p-dx:10px"></div>
|
|
252
|
+
<div class="level-particle" style="left:12%;top:62%;--p-dur:3.1s;--p-del:1.8s;--p-dy:-80px;--p-dx:-12px"></div>
|
|
253
|
+
<div class="level-particle" style="left:48%;top:92%;--p-dur:3.5s;--p-del:2.2s;--p-dy:-95px;--p-dx:3px"></div>
|
|
254
|
+
<div class="level-particle" style="left:72%;top:68%;--p-dur:2.8s;--p-del:2.6s;--p-dy:-72px;--p-dx:8px"></div>
|
|
255
|
+
<div class="level-particle" style="left:28%;top:58%;--p-dur:3.3s;--p-del:3s;--p-dy:-65px;--p-dx:-6px"></div>
|
|
256
|
+
</div>
|
|
257
|
+
<div id="level-halo"></div>
|
|
258
|
+
<div id="level-badge"></div>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
<script src="./renderer.js"></script>
|
|
262
|
+
<!-- In dev, renderer.ts compiles to renderer.js via tsc -->
|
|
263
|
+
</body>
|
|
264
|
+
</html>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pet sprite renderer module.
|
|
3
|
+
*
|
|
4
|
+
* Manages the CSS custom properties that drive the sprite sheet animation
|
|
5
|
+
* on the #pet-sprite element. The states array is embedded inline because
|
|
6
|
+
* this runs in the Electron renderer context which may not have module
|
|
7
|
+
* resolution for the shared types package.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Sets the sprite sheet URL on the pet element via the --sprite-url CSS variable.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setSpriteImage(url: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Switches the pet animation to the state identified by `stateId`.
|
|
15
|
+
* Updates --sprite-row, --sprite-frames, and --sprite-duration.
|
|
16
|
+
*
|
|
17
|
+
* Restarts the animation by removing/re-adding the animation name so
|
|
18
|
+
* the browser replays it from frame 0.
|
|
19
|
+
*/
|
|
20
|
+
export declare function setPetAction(stateId: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the #pet-sprite HTMLElement, or null if not found.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPetElement(): HTMLElement | null;
|
|
25
|
+
//# sourceMappingURL=pet-sprite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pet-sprite.d.ts","sourceRoot":"","sources":["../../../src/renderer/pet-sprite.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAiBlD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,WAAW,GAAG,IAAI,CAElD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pet sprite renderer module.
|
|
3
|
+
*
|
|
4
|
+
* Manages the CSS custom properties that drive the sprite sheet animation
|
|
5
|
+
* on the #pet-sprite element. The states array is embedded inline because
|
|
6
|
+
* this runs in the Electron renderer context which may not have module
|
|
7
|
+
* resolution for the shared types package.
|
|
8
|
+
*/
|
|
9
|
+
const petStates = [
|
|
10
|
+
{ id: "idle", label: "Idle", row: 0, frames: 6, durationMs: 1100 },
|
|
11
|
+
{ id: "running-right", label: "Running Right", row: 1, frames: 8, durationMs: 1060 },
|
|
12
|
+
{ id: "running-left", label: "Running Left", row: 2, frames: 8, durationMs: 1060 },
|
|
13
|
+
{ id: "waving", label: "Waving", row: 3, frames: 4, durationMs: 700 },
|
|
14
|
+
{ id: "jumping", label: "Jumping", row: 4, frames: 5, durationMs: 840 },
|
|
15
|
+
{ id: "failed", label: "Failed", row: 5, frames: 8, durationMs: 1220 },
|
|
16
|
+
{ id: "waiting", label: "Waiting", row: 6, frames: 6, durationMs: 1010 },
|
|
17
|
+
{ id: "running", label: "Running", row: 7, frames: 6, durationMs: 820 },
|
|
18
|
+
{ id: "review", label: "Review", row: 8, frames: 6, durationMs: 1030 },
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Sets the sprite sheet URL on the pet element via the --sprite-url CSS variable.
|
|
22
|
+
*/
|
|
23
|
+
export function setSpriteImage(url) {
|
|
24
|
+
const el = getPetElement();
|
|
25
|
+
if (el) {
|
|
26
|
+
el.style.setProperty("--sprite-url", `url("${url}")`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Switches the pet animation to the state identified by `stateId`.
|
|
31
|
+
* Updates --sprite-row, --sprite-frames, and --sprite-duration.
|
|
32
|
+
*
|
|
33
|
+
* Restarts the animation by removing/re-adding the animation name so
|
|
34
|
+
* the browser replays it from frame 0.
|
|
35
|
+
*/
|
|
36
|
+
export function setPetAction(stateId) {
|
|
37
|
+
const el = getPetElement();
|
|
38
|
+
if (!el)
|
|
39
|
+
return;
|
|
40
|
+
const state = petStates.find((s) => s.id === stateId);
|
|
41
|
+
if (!state)
|
|
42
|
+
return;
|
|
43
|
+
el.style.setProperty("--sprite-row", String(state.row));
|
|
44
|
+
el.style.setProperty("--sprite-frames", String(state.frames));
|
|
45
|
+
el.style.setProperty("--sprite-duration", `${state.durationMs}ms`);
|
|
46
|
+
// Restart the animation so it picks up the new custom properties from frame 0.
|
|
47
|
+
const currentAnimation = el.style.animation;
|
|
48
|
+
el.style.animation = "none";
|
|
49
|
+
// Force reflow so the browser acknowledges the "none" value.
|
|
50
|
+
void el.offsetWidth;
|
|
51
|
+
el.style.animation = currentAnimation || "";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns the #pet-sprite HTMLElement, or null if not found.
|
|
55
|
+
*/
|
|
56
|
+
export function getPetElement() {
|
|
57
|
+
return document.getElementById("pet-sprite");
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=pet-sprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pet-sprite.js","sourceRoot":"","sources":["../../../src/renderer/pet-sprite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/renderer/renderer.ts"],"names":[],"mappings":""}
|