@lemoncat7/dsh-partner 1.6.1 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/docs/THIRD_PARTY_LICENSES.md +231 -0
- package/docs/architecture.md +23 -0
- package/lib/api/features/pendant-api.d.ts +4 -0
- package/lib/api/features/pendant-api.d.ts.map +1 -0
- package/lib/api/features/pendant-api.js +37 -0
- package/lib/api/features/pendant-api.js.map +1 -0
- package/lib/api.d.ts +2 -0
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +3 -0
- package/lib/api.js.map +1 -1
- package/lib/client-controller.d.ts +6 -1
- package/lib/client-controller.d.ts.map +1 -1
- package/lib/client-controller.js +4 -1
- package/lib/client-controller.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +2364 -1442
- package/lib/client.js.map +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -2
- package/lib/index.js.map +1 -1
- package/lib/notifications/domain.d.ts +18 -0
- package/lib/notifications/domain.d.ts.map +1 -0
- package/lib/notifications/domain.js +2 -0
- package/lib/notifications/domain.js.map +1 -0
- package/lib/notifications/service.d.ts +15 -0
- package/lib/notifications/service.d.ts.map +1 -0
- package/lib/notifications/service.js +65 -0
- package/lib/notifications/service.js.map +1 -0
- package/lib/notifications/store.d.ts +14 -0
- package/lib/notifications/store.d.ts.map +1 -0
- package/lib/notifications/store.js +56 -0
- package/lib/notifications/store.js.map +1 -0
- package/lib/pendant/card-image.d.ts +6 -0
- package/lib/pendant/card-image.d.ts.map +1 -0
- package/lib/pendant/card-image.js +43 -0
- package/lib/pendant/card-image.js.map +1 -0
- package/lib/pendant/frame-loop.d.ts +18 -0
- package/lib/pendant/frame-loop.d.ts.map +1 -0
- package/lib/pendant/frame-loop.js +74 -0
- package/lib/pendant/frame-loop.js.map +1 -0
- package/lib/pendant/notice-motion.d.ts +12 -0
- package/lib/pendant/notice-motion.d.ts.map +1 -0
- package/lib/pendant/notice-motion.js +40 -0
- package/lib/pendant/notice-motion.js.map +1 -0
- package/lib/pendant/physics.d.ts +14 -0
- package/lib/pendant/physics.d.ts.map +1 -0
- package/lib/pendant/physics.js +29 -0
- package/lib/pendant/physics.js.map +1 -0
- package/lib/pendant/reader.d.ts +15 -0
- package/lib/pendant/reader.d.ts.map +1 -0
- package/lib/pendant/reader.js +37 -0
- package/lib/pendant/reader.js.map +1 -0
- package/lib/pendant/renderer.d.ts +24 -0
- package/lib/pendant/renderer.d.ts.map +1 -0
- package/lib/pendant/renderer.js +408 -0
- package/lib/pendant/renderer.js.map +1 -0
- package/lib/pendant/settings-panel.d.ts +2 -0
- package/lib/pendant/settings-panel.d.ts.map +1 -0
- package/lib/pendant/settings-panel.js +70 -0
- package/lib/pendant/settings-panel.js.map +1 -0
- package/lib/pendant/settings.d.ts +16 -0
- package/lib/pendant/settings.d.ts.map +1 -0
- package/lib/pendant/settings.js +18 -0
- package/lib/pendant/settings.js.map +1 -0
- package/lib/pendant/sheen.d.ts +11 -0
- package/lib/pendant/sheen.d.ts.map +1 -0
- package/lib/pendant/sheen.js +36 -0
- package/lib/pendant/sheen.js.map +1 -0
- package/lib/pendant/strap-geometry.d.ts +17 -0
- package/lib/pendant/strap-geometry.d.ts.map +1 -0
- package/lib/pendant/strap-geometry.js +69 -0
- package/lib/pendant/strap-geometry.js.map +1 -0
- package/lib/pendant/strap-preview.d.ts +5 -0
- package/lib/pendant/strap-preview.d.ts.map +1 -0
- package/lib/pendant/strap-preview.js +8 -0
- package/lib/pendant/strap-preview.js.map +1 -0
- package/lib/pendant/strap-style.d.ts +11 -0
- package/lib/pendant/strap-style.d.ts.map +1 -0
- package/lib/pendant/strap-style.js +13 -0
- package/lib/pendant/strap-style.js.map +1 -0
- package/lib/pendant/strap.d.ts +13 -0
- package/lib/pendant/strap.d.ts.map +1 -0
- package/lib/pendant/strap.js +73 -0
- package/lib/pendant/strap.js.map +1 -0
- package/lib/pendant/surface.d.ts +12 -0
- package/lib/pendant/surface.d.ts.map +1 -0
- package/lib/pendant/surface.js +15 -0
- package/lib/pendant/surface.js.map +1 -0
- package/lib/pendant/use-inbox.d.ts +9 -0
- package/lib/pendant/use-inbox.d.ts.map +1 -0
- package/lib/pendant/use-inbox.js +81 -0
- package/lib/pendant/use-inbox.js.map +1 -0
- package/lib/pendant/use-placement.d.ts +28 -0
- package/lib/pendant/use-placement.d.ts.map +1 -0
- package/lib/pendant/use-placement.js +108 -0
- package/lib/pendant/use-placement.js.map +1 -0
- package/lib/pendant/use-settings.d.ts +4 -0
- package/lib/pendant/use-settings.d.ts.map +1 -0
- package/lib/pendant/use-settings.js +44 -0
- package/lib/pendant/use-settings.js.map +1 -0
- package/lib/pendant/widget.d.ts +5 -0
- package/lib/pendant/widget.d.ts.map +1 -0
- package/lib/pendant/widget.js +92 -0
- package/lib/pendant/widget.js.map +1 -0
- package/lib/pendant-renderer.js +4124 -0
- package/lib/store.d.ts +2 -0
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +19 -0
- package/lib/store.js.map +1 -1
- package/lib/ui/task-board-panel.d.ts +4 -1
- package/lib/ui/task-board-panel.d.ts.map +1 -1
- package/lib/ui/task-board-panel.js +4 -2
- package/lib/ui/task-board-panel.js.map +1 -1
- package/package.json +9 -5
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
import { IconCheckOutline14, IconChevronDownOutline14, IconCloseOutline16, IconLinkOutline16, IconNewChatOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
4
|
+
import { readerPlacement } from './use-placement.js';
|
|
5
|
+
export function PendantReader({ inbox, selected, error, anchor, onSelect, onClose, onVisit, onReadAll }) {
|
|
6
|
+
const panel = useRef(null), [visible, setVisible] = useState(8);
|
|
7
|
+
const measure = () => readerPlacement(anchor.current?.getBoundingClientRect() ?? { x: innerWidth / 2, y: 16, width: 0, height: 0 }, { width: innerWidth, height: innerHeight });
|
|
8
|
+
const [placement, setPlacement] = useState(measure);
|
|
9
|
+
const detail = inbox.items.find(item => item.id === selected);
|
|
10
|
+
useLayoutEffect(() => {
|
|
11
|
+
setPlacement(measure());
|
|
12
|
+
panel.current?.focus({ preventScroll: true });
|
|
13
|
+
let frame = 0;
|
|
14
|
+
const resize = () => { cancelAnimationFrame(frame); frame = requestAnimationFrame(() => setPlacement(measure())); };
|
|
15
|
+
window.addEventListener('resize', resize);
|
|
16
|
+
return () => { cancelAnimationFrame(frame); window.removeEventListener('resize', resize); };
|
|
17
|
+
}, [anchor]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const outside = (event) => {
|
|
20
|
+
// The card remains an operable toggle; do not close on pointerdown and
|
|
21
|
+
// accidentally reopen on its pointerup. Dragging it is still playable.
|
|
22
|
+
if (!panel.current?.contains(event.target) && !anchor.current?.contains(event.target))
|
|
23
|
+
onClose();
|
|
24
|
+
};
|
|
25
|
+
const escape = (event) => { if (event.key === 'Escape') {
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
event.stopPropagation();
|
|
28
|
+
onClose(true);
|
|
29
|
+
} };
|
|
30
|
+
document.addEventListener('pointerdown', outside);
|
|
31
|
+
document.addEventListener('keydown', escape);
|
|
32
|
+
return () => { document.removeEventListener('pointerdown', outside); document.removeEventListener('keydown', escape); };
|
|
33
|
+
}, [onClose, anchor]);
|
|
34
|
+
return _jsxs("section", { ref: panel, id: "dsh-partner-pendant-inbox", className: "dsh-partner-pendant-inbox", "aria-label": "\u4F19\u4F34\u6D88\u606F", tabIndex: -1, style: placement, children: [_jsxs("header", { children: [detail && _jsx("button", { type: "button", "aria-label": "\u8FD4\u56DE\u6D88\u606F\u5217\u8868", onClick: () => onSelect(), children: _jsx(IconChevronDownOutline14, { size: 16, className: "dsh-partner-pendant-back" }) }), !detail && _jsx("span", { className: "dsh-partner-pendant-reader-icon", "aria-hidden": "true", children: _jsx(IconNewChatOutline16, { size: 18 }) }), _jsxs("div", { className: "dsh-partner-pendant-reader-heading", children: [_jsx("strong", { children: detail ? detail.companionName : '伙伴消息' }), _jsx("small", { children: detail ? '来自伙伴的消息' : '回复与任务动态' })] }), !!inbox.unread && _jsx("span", { className: "dsh-partner-pendant-reader-count", "aria-label": `${inbox.unread} 条未读`, children: inbox.unread }), _jsx("button", { type: "button", "aria-label": "\u5173\u95ED\u4F19\u4F34\u6D88\u606F", onClick: event => onClose(event.detail === 0), children: _jsx(IconCloseOutline16, { size: 16 }) })] }), error && _jsx("p", { role: "alert", className: "dsh-partner-pendant-error", children: error }), detail ? _jsxs(_Fragment, { children: [_jsxs("article", { className: "dsh-partner-pendant-detail", children: [_jsxs("div", { className: "dsh-partner-pendant-reader-meta", children: [_jsx("span", { children: detail.kind === 'task' ? '任务动态' : detail.kind === 'schedule' ? '定时任务' : '会话回复' }), _jsx("time", { dateTime: new Date(detail.createdAt).toISOString(), children: new Date(detail.createdAt).toLocaleString([], { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })] }), _jsx("h3", { children: detail.title }), _jsx("p", { children: detail.summary })] }), _jsxs("footer", { children: [_jsxs("button", { type: "button", className: "dsh-partner-pendant-all-messages", onClick: () => onSelect(), children: ["\u5168\u90E8\u6D88\u606F", _jsx("span", { children: inbox.items.length })] }), _jsxs("button", { type: "button", className: "dsh-partner-pendant-source", onClick: () => onVisit(detail), children: [_jsx(IconLinkOutline16, { size: 15 }), detail.kind === 'task' ? '查看任务' : detail.kind === 'schedule' ? '查看定时任务' : '进入会话'] })] })] })
|
|
35
|
+
: _jsxs(_Fragment, { children: [_jsxs("div", { className: "dsh-partner-pendant-list", children: [inbox.items.length ? inbox.items.slice(0, visible).map(item => _jsxs("button", { type: "button", "data-unread": item.readAt === undefined, onClick: () => onSelect(item), children: [_jsxs("span", { children: [_jsx("strong", { children: item.companionName }), _jsx("time", { children: new Date(item.createdAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) })] }), _jsx("b", { children: item.title }), _jsx("small", { children: item.summary.replace(/\s+/g, ' ').slice(0, 100) })] }, item.id)) : _jsx("p", { className: "dsh-partner-pendant-empty", children: "\u6682\u65F6\u6CA1\u6709\u65B0\u6D88\u606F" }), inbox.items.length > visible && _jsx("button", { type: "button", onClick: () => setVisible(count => count + 8), children: "\u663E\u793A\u66F4\u591A\u6D88\u606F" })] }), _jsxs("footer", { children: [_jsxs("small", { children: ["\u6700\u8FD1 ", inbox.items.length, " \u6761"] }), _jsxs("button", { type: "button", disabled: !inbox.unread, onClick: onReadAll, children: [_jsx(IconCheckOutline14, { size: 14 }), "\u5168\u90E8\u5DF2\u8BFB"] })] })] })] });
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/pendant/reader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAEjK,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAMpD,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAS;IAC5G,MAAM,KAAK,GAAG,MAAM,CAAc,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC5E,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/K,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;IAC7D,eAAe,CAAC,GAAG,EAAE;QACnB,YAAY,CAAC,OAAO,EAAE,CAAC,CAAA;QACvB,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,MAAM,GAAG,GAAS,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;QACxH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACzC,OAAO,GAAG,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC,CAAA;IAC5F,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACZ,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC5C,uEAAuE;YACvE,uEAAuE;YACvE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;gBAAE,OAAO,EAAE,CAAA;QAClH,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAQ,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAAC,CAAC,CAAC,CAAC,CAAA;QACjJ,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC/F,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC,CAAA;IACxH,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IACrB,OAAO,mBAAS,GAAG,EAAE,KAAK,EAAE,EAAE,EAAC,2BAA2B,EAAC,SAAS,EAAC,2BAA2B,gBAAY,0BAAM,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,aAC/I,6BACG,MAAM,IAAI,iBAAQ,IAAI,EAAC,QAAQ,gBAAY,sCAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,YAAE,KAAC,wBAAwB,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,0BAA0B,GAAG,GAAS,EACnK,CAAC,MAAM,IAAI,eAAM,SAAS,EAAC,iCAAiC,iBAAa,MAAM,YAAC,KAAC,oBAAoB,IAAC,IAAI,EAAE,EAAE,GAAI,GAAO,EAC1H,eAAK,SAAS,EAAC,oCAAoC,aAAC,2BAAS,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,GAAU,EAAA,0BAAQ,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAS,IAAM,EACjK,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,eAAM,SAAS,EAAC,kCAAkC,gBAAa,GAAG,KAAK,CAAC,MAAM,MAAM,YAAG,KAAK,CAAC,MAAM,GAAQ,EAC9H,iBAAQ,IAAI,EAAC,QAAQ,gBAAY,sCAAQ,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,YAAE,KAAC,kBAAkB,IAAC,IAAI,EAAE,EAAE,GAAI,GAAS,IAC3H,EACR,KAAK,IAAI,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,2BAA2B,YAAE,KAAK,GAAK,EAC1E,MAAM,CAAC,CAAC,CAAC,8BAAE,mBAAS,SAAS,EAAC,4BAA4B,aAAC,eAAK,SAAS,EAAC,iCAAiC,aAAC,yBAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAQ,EAAA,eAAM,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,YAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAQ,IAAM,EAAA,uBAAK,MAAM,CAAC,KAAK,GAAM,EAAA,sBAAI,MAAM,CAAC,OAAO,GAAK,IAAU,EAAA,6BAAQ,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,kCAAkC,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,yCAAM,yBAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAQ,IAAS,EAAA,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,4BAA4B,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAE,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,EAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAU,IAAS,IAAG;gBACvzB,CAAC,CAAC,8BAAE,eAAK,SAAS,EAAC,0BAA0B,aAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAQ,IAAI,EAAC,QAAQ,iBAA4B,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAE,2BAAM,2BAAS,IAAI,CAAC,aAAa,GAAU,EAAA,yBAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,GAAQ,IAAO,EAAA,sBAAI,IAAI,CAAC,KAAK,GAAK,EAAA,0BAAQ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAS,KAA3T,IAAI,CAAC,EAAE,CAA6T,CAAC,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,2BAA2B,2DAAY,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,qDAAiB,IAAO,EAAA,6BAAQ,6CAAW,KAAK,CAAC,KAAK,CAAC,MAAM,eAAW,EAAA,kBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,aAAE,KAAC,kBAAkB,IAAC,IAAI,EAAE,EAAE,GAAI,gCAAa,IAAS,IAAG,IACxyB,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PendantSettings } from './settings.js';
|
|
2
|
+
export interface BadgeMessage {
|
|
3
|
+
id: string;
|
|
4
|
+
count: number;
|
|
5
|
+
name: string;
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
export interface LanyardHandle {
|
|
9
|
+
setMessage(message?: BadgeMessage): void;
|
|
10
|
+
setAppearance(settings: PendantSettings): void;
|
|
11
|
+
relayout(): void;
|
|
12
|
+
destroy(): void;
|
|
13
|
+
}
|
|
14
|
+
export interface LanyardOptions {
|
|
15
|
+
signal: AbortSignal;
|
|
16
|
+
onTap(): void;
|
|
17
|
+
onFailure(): void;
|
|
18
|
+
}
|
|
19
|
+
/** React Bits-inspired Three + Rapier lanyard, with elastic/spherical joints.
|
|
20
|
+
* Separate ESM asset: the main client never imports the renderer/physics bundle.
|
|
21
|
+
* Only the moving card's HTML hit target receives input; the canvas is click-through.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createLanyard(canvas: HTMLCanvasElement, hit: HTMLButtonElement, options: LanyardOptions): Promise<LanyardHandle>;
|
|
24
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/pendant/renderer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAKpD,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACxF,MAAM,WAAW,aAAa;IAAG,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,QAAQ,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE;AAC9J,MAAM,WAAW,cAAc;IAAG,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,IAAI,IAAI,CAAC;IAAC,SAAS,IAAI,IAAI,CAAA;CAAE;AAGzF;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6NtI"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import RAPIER from '@dimforge/rapier3d-compat';
|
|
3
|
+
import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';
|
|
4
|
+
import { createLanyardPhysics, LANYARD_STEP } from './physics.js';
|
|
5
|
+
import { createLanyardStrap } from './strap.js';
|
|
6
|
+
import { createBadgeSheen } from './sheen.js';
|
|
7
|
+
import { createNoticeMotion } from './notice-motion.js';
|
|
8
|
+
import { loadCardImage } from './card-image.js';
|
|
9
|
+
import { createPendantFrameLoop } from './frame-loop.js';
|
|
10
|
+
import { createBadgeFaceMaterial, BADGE_LIGHTING } from './surface.js';
|
|
11
|
+
let physicsReady;
|
|
12
|
+
/** React Bits-inspired Three + Rapier lanyard, with elastic/spherical joints.
|
|
13
|
+
* Separate ESM asset: the main client never imports the renderer/physics bundle.
|
|
14
|
+
* Only the moving card's HTML hit target receives input; the canvas is click-through.
|
|
15
|
+
*/
|
|
16
|
+
export async function createLanyard(canvas, hit, options) {
|
|
17
|
+
physicsReady ??= RAPIER.init().catch(error => { physicsReady = undefined; throw error; });
|
|
18
|
+
await physicsReady;
|
|
19
|
+
options.signal.throwIfAborted();
|
|
20
|
+
const renderer = new THREE.WebGLRenderer({ canvas, alpha: true, antialias: true, powerPreference: 'low-power' });
|
|
21
|
+
renderer.setClearColor(0x000000, 0);
|
|
22
|
+
renderer.setPixelRatio(Math.min(devicePixelRatio, 1.5));
|
|
23
|
+
renderer.outputColorSpace = THREE.SRGBColorSpace;
|
|
24
|
+
renderer.toneMapping = THREE.ACESFilmicToneMapping;
|
|
25
|
+
renderer.toneMappingExposure = .95;
|
|
26
|
+
const scene = new THREE.Scene();
|
|
27
|
+
// Local, orthographic card view: position/depth never magnifies the badge.
|
|
28
|
+
// Move its small canvas in CSS; never allocate a viewport-sized GPU target.
|
|
29
|
+
const cardViewSize = 2.8;
|
|
30
|
+
const camera = new THREE.OrthographicCamera(-cardViewSize / 2, cardViewSize / 2, cardViewSize / 2, -cardViewSize / 2, .1, 50);
|
|
31
|
+
camera.position.set(0, 0, 10);
|
|
32
|
+
const pmrem = new THREE.PMREMGenerator(renderer);
|
|
33
|
+
const room = new RoomEnvironment();
|
|
34
|
+
const environment = pmrem.fromScene(room);
|
|
35
|
+
room.dispose();
|
|
36
|
+
pmrem.dispose();
|
|
37
|
+
scene.environment = environment.texture;
|
|
38
|
+
scene.add(new THREE.AmbientLight(0xffffff, BADGE_LIGHTING.ambient));
|
|
39
|
+
const light = new THREE.DirectionalLight(0xffffff, BADGE_LIGHTING.key);
|
|
40
|
+
light.position.set(-3, 4, 5);
|
|
41
|
+
scene.add(light);
|
|
42
|
+
const disposables = [environment];
|
|
43
|
+
const keep = (value) => { disposables.push(value); return value; };
|
|
44
|
+
const card = new THREE.Group();
|
|
45
|
+
const shape = roundedRectangle(1.42, 1.96, .14);
|
|
46
|
+
const edge = keep(new THREE.ExtrudeGeometry(shape, { depth: .04, bevelEnabled: true, bevelSegments: 2, steps: 1, bevelSize: .025, bevelThickness: .018, curveSegments: 6 }));
|
|
47
|
+
const edgeMaterial = keep(new THREE.MeshStandardMaterial({ color: 0x667578, metalness: .75, roughness: .28 }));
|
|
48
|
+
card.add(new THREE.Mesh(edge, edgeMaterial));
|
|
49
|
+
const face = keep(new THREE.ShapeGeometry(shape));
|
|
50
|
+
// ShapeGeometry UVs are world coordinates; map the card face to [0,1].
|
|
51
|
+
const positions = face.getAttribute('position'), uv = face.getAttribute('uv');
|
|
52
|
+
for (let i = 0; i < positions.count; i++)
|
|
53
|
+
uv.setXY(i, positions.getX(i) / 1.42 + .5, positions.getY(i) / 1.96 + .5);
|
|
54
|
+
const frontTexture = keep(badgeTexture(false)), backTexture = keep(badgeTexture(true));
|
|
55
|
+
const front = new THREE.Mesh(face, keep(createBadgeFaceMaterial(frontTexture)));
|
|
56
|
+
front.position.z = .063;
|
|
57
|
+
card.add(front);
|
|
58
|
+
const back = new THREE.Mesh(face, keep(createBadgeFaceMaterial(backTexture)));
|
|
59
|
+
back.rotation.y = Math.PI;
|
|
60
|
+
back.position.z = -.025;
|
|
61
|
+
card.add(back);
|
|
62
|
+
const sheen = keep(createBadgeSheen(card, face));
|
|
63
|
+
const metal = keep(new THREE.MeshStandardMaterial({ color: 0xc3ced0, metalness: .95, roughness: .24 }));
|
|
64
|
+
const ring = new THREE.Mesh(keep(new THREE.TorusGeometry(.115, .035, 6, 16)), metal);
|
|
65
|
+
ring.position.set(0, 1.04, .035);
|
|
66
|
+
card.add(ring);
|
|
67
|
+
const clip = new THREE.Mesh(keep(new THREE.BoxGeometry(.24, .16, .09)), metal);
|
|
68
|
+
clip.position.set(0, .94, .03);
|
|
69
|
+
card.add(clip);
|
|
70
|
+
scene.add(card);
|
|
71
|
+
const { world, beads, badge, bodies } = createLanyardPhysics();
|
|
72
|
+
const noticeMotion = createNoticeMotion(badge);
|
|
73
|
+
const strap = createLanyardStrap(canvas), euler = new THREE.Euler();
|
|
74
|
+
const movingBodies = [badge, ...beads];
|
|
75
|
+
let quietTime = 0, accumulator = 0, disposed = false, scale = 58, canvasSize = 0, messageKey = '';
|
|
76
|
+
let unread = 0, messageIdentity = '';
|
|
77
|
+
let artSource, artRevision = 0;
|
|
78
|
+
let home = canvas.parentElement.getBoundingClientRect();
|
|
79
|
+
let gesture;
|
|
80
|
+
const reduced = matchMedia('(prefers-reduced-motion: reduce)');
|
|
81
|
+
const toWorld = (x, y) => {
|
|
82
|
+
// Cached layout + linear mapping avoids a layout read / matrix inversion
|
|
83
|
+
// on every pointer event, including high-rate mouse and pen input.
|
|
84
|
+
return new THREE.Vector3((x - home.left - home.width / 2) / scale, 1.6 - (y - home.top - home.height / 2) / scale, 0);
|
|
85
|
+
};
|
|
86
|
+
const paint = () => {
|
|
87
|
+
const position = badge.translation();
|
|
88
|
+
card.quaternion.copy(badge.rotation());
|
|
89
|
+
canvas.dataset.facing = String(1 - 2 * (card.quaternion.x ** 2 + card.quaternion.y ** 2));
|
|
90
|
+
const x = home.width / 2 + position.x * scale, y = home.height / 2 + (1.6 - position.y) * scale;
|
|
91
|
+
canvas.style.transform = `translate3d(${home.left + x - canvasSize / 2}px, ${home.top + y - canvasSize / 2}px, 0)`;
|
|
92
|
+
strap.paint(bodies.map(body => body.translation()), home.left + home.width / 2, home.top + home.height / 2 + 1.6 * scale, scale);
|
|
93
|
+
renderer.render(scene, camera);
|
|
94
|
+
euler.setFromQuaternion(card.quaternion);
|
|
95
|
+
hit.style.transform = `translate(${x}px, ${y}px) translate(-50%, -50%) rotate(${-euler.z}rad)`;
|
|
96
|
+
};
|
|
97
|
+
const loop = createPendantFrameLoop((now, dt) => {
|
|
98
|
+
if (disposed || document.hidden)
|
|
99
|
+
return false;
|
|
100
|
+
accumulator += dt;
|
|
101
|
+
if (reduced.matches) {
|
|
102
|
+
noticeMotion.cancel();
|
|
103
|
+
sheen.clear();
|
|
104
|
+
}
|
|
105
|
+
while (accumulator >= LANYARD_STEP) {
|
|
106
|
+
if (noticeMotion.step(LANYARD_STEP, !!gesture))
|
|
107
|
+
sheen.start(now);
|
|
108
|
+
world.step();
|
|
109
|
+
accumulator -= LANYARD_STEP;
|
|
110
|
+
}
|
|
111
|
+
canvas.dataset.noticeMotion = noticeMotion.phase;
|
|
112
|
+
const shining = sheen.update(now, reduced.matches);
|
|
113
|
+
canvas.dataset.shining = String(shining);
|
|
114
|
+
paint();
|
|
115
|
+
const calm = movingBodies.every(body => {
|
|
116
|
+
const v = body.linvel(), a = body.angvel();
|
|
117
|
+
// A stretched kinematic endpoint leaves tiny constraint-solver jitter.
|
|
118
|
+
// Ignore it only while held; free recoil keeps the original thresholds.
|
|
119
|
+
return Math.hypot(v.x, v.y, v.z) < (gesture?.moved ? .06 : .015) && Math.hypot(a.x, a.y, a.z) < .025;
|
|
120
|
+
});
|
|
121
|
+
// A held card may sleep once the rope settles. Pointer movement/release
|
|
122
|
+
// wakes it again; spring positions and stored stretch remain untouched.
|
|
123
|
+
quietTime = calm ? quietTime + dt : 0;
|
|
124
|
+
const moving = quietTime < .8 && movingBodies.some(body => !body.isSleeping());
|
|
125
|
+
const active = moving || shining || (!gesture && noticeMotion.phase !== 'idle');
|
|
126
|
+
canvas.dataset.sleeping = String(!active);
|
|
127
|
+
if (!active) {
|
|
128
|
+
accumulator = 0;
|
|
129
|
+
movingBodies.forEach(body => body.sleep());
|
|
130
|
+
}
|
|
131
|
+
return active;
|
|
132
|
+
});
|
|
133
|
+
const wake = () => {
|
|
134
|
+
if (disposed || document.hidden)
|
|
135
|
+
return;
|
|
136
|
+
quietTime = 0;
|
|
137
|
+
loop.wake();
|
|
138
|
+
};
|
|
139
|
+
const end = (event) => {
|
|
140
|
+
if (!gesture || (event && event.pointerId !== gesture.id))
|
|
141
|
+
return;
|
|
142
|
+
const current = gesture;
|
|
143
|
+
gesture = undefined;
|
|
144
|
+
if (hit.hasPointerCapture(current.id))
|
|
145
|
+
hit.releasePointerCapture(current.id);
|
|
146
|
+
badge.setBodyType(RAPIER.RigidBodyType.Dynamic, true);
|
|
147
|
+
if (current.moved) {
|
|
148
|
+
// Throw velocity is time-based, not pixels per pointer event. A held
|
|
149
|
+
// stretch still recoils through the springs, without a made-up impulse.
|
|
150
|
+
const recent = event?.type === 'pointerup' && performance.now() - current.lastAt < 100;
|
|
151
|
+
badge.setLinvel(recent ? current.velocity : { x: 0, y: 0, z: 0 }, true);
|
|
152
|
+
badge.setAngvel(recent ? current.spin : { x: 0, y: 0, z: 0 }, true);
|
|
153
|
+
for (const body of beads)
|
|
154
|
+
body.wakeUp();
|
|
155
|
+
}
|
|
156
|
+
wake();
|
|
157
|
+
if (!current.moved && event?.type === 'pointerup')
|
|
158
|
+
options.onTap();
|
|
159
|
+
};
|
|
160
|
+
const down = (event) => {
|
|
161
|
+
if (!event.isPrimary || event.button !== 0 || gesture)
|
|
162
|
+
return;
|
|
163
|
+
noticeMotion.cancel();
|
|
164
|
+
sheen.clear();
|
|
165
|
+
event.preventDefault();
|
|
166
|
+
// Programmatic focus during pointerdown was triggering the host theme's
|
|
167
|
+
// keyboard focus rectangle. Keyboard navigation still receives its outline.
|
|
168
|
+
if (document.activeElement === hit)
|
|
169
|
+
hit.blur();
|
|
170
|
+
gesture = { id: event.pointerId, x: event.clientX, y: event.clientY, lastX: event.clientX, lastY: event.clientY, lastAt: performance.now(), moved: false, offset: toWorld(event.clientX, event.clientY).sub(new THREE.Vector3().copy(badge.translation())), rotation: new THREE.Quaternion().copy(badge.rotation()), target: new THREE.Vector3().copy(badge.translation()), velocity: new THREE.Vector3(), spin: new THREE.Vector3() };
|
|
171
|
+
hit.setPointerCapture(event.pointerId);
|
|
172
|
+
wake();
|
|
173
|
+
};
|
|
174
|
+
const move = (event) => {
|
|
175
|
+
if (!gesture || gesture.id !== event.pointerId)
|
|
176
|
+
return;
|
|
177
|
+
if (!gesture.moved && Math.hypot(event.clientX - gesture.x, event.clientY - gesture.y) < 6)
|
|
178
|
+
return;
|
|
179
|
+
if (!gesture.moved) {
|
|
180
|
+
gesture.moved = true;
|
|
181
|
+
badge.setBodyType(RAPIER.RigidBodyType.KinematicPositionBased, true);
|
|
182
|
+
}
|
|
183
|
+
const target = toWorld(event.clientX, event.clientY).sub(gesture.offset);
|
|
184
|
+
// Free translation plus a virtual grip twist: lateral dragging turns the
|
|
185
|
+
// badge over; its spherical attachment does not force a front-facing pose.
|
|
186
|
+
target.z = 0;
|
|
187
|
+
badge.setNextKinematicTranslation(target);
|
|
188
|
+
badge.setNextKinematicRotation(new THREE.Quaternion().setFromEuler(new THREE.Euler((event.clientY - gesture.y) * .003, (event.clientX - gesture.x) * .016, 0, 'YXZ')).multiply(gesture.rotation));
|
|
189
|
+
const now = performance.now(), dt = Math.max((now - gesture.lastAt) / 1000, 1 / 240);
|
|
190
|
+
gesture.velocity.copy(target).sub(gesture.target).divideScalar(dt).clampLength(0, 35);
|
|
191
|
+
gesture.spin.set((event.clientY - gesture.lastY) * .003 / dt, (event.clientX - gesture.lastX) * .016 / dt, 0).clampLength(0, 18);
|
|
192
|
+
gesture.target.copy(target);
|
|
193
|
+
gesture.lastX = event.clientX;
|
|
194
|
+
gesture.lastY = event.clientY;
|
|
195
|
+
gesture.lastAt = now;
|
|
196
|
+
for (const body of beads)
|
|
197
|
+
body.wakeUp();
|
|
198
|
+
wake();
|
|
199
|
+
};
|
|
200
|
+
const click = (event) => { if (event.detail === 0)
|
|
201
|
+
options.onTap(); };
|
|
202
|
+
const layout = () => {
|
|
203
|
+
home = canvas.parentElement.getBoundingClientRect();
|
|
204
|
+
if (home.width <= 0 || home.height <= 0)
|
|
205
|
+
return;
|
|
206
|
+
// Preserve the old resting size, without the old perspective projection.
|
|
207
|
+
scale = home.height / (20 * Math.tan(Math.PI / 12));
|
|
208
|
+
const nextSize = Math.ceil(scale * cardViewSize);
|
|
209
|
+
if (nextSize !== canvasSize) {
|
|
210
|
+
canvasSize = nextSize;
|
|
211
|
+
renderer.setSize(canvasSize, canvasSize, false);
|
|
212
|
+
canvas.style.width = `${canvasSize}px`;
|
|
213
|
+
canvas.style.height = `${canvasSize}px`;
|
|
214
|
+
}
|
|
215
|
+
hit.style.width = `${Math.max(44, scale * 1.45)}px`;
|
|
216
|
+
hit.style.height = `${Math.max(44, scale * 1.99)}px`;
|
|
217
|
+
strap.resize(scale);
|
|
218
|
+
};
|
|
219
|
+
const resize = () => { layout(); wake(); };
|
|
220
|
+
const hide = () => { end(); if (document.hidden) {
|
|
221
|
+
noticeMotion.cancel();
|
|
222
|
+
sheen.clear();
|
|
223
|
+
loop.stop();
|
|
224
|
+
accumulator = 0;
|
|
225
|
+
}
|
|
226
|
+
else
|
|
227
|
+
wake(); };
|
|
228
|
+
const blur = () => end();
|
|
229
|
+
const lost = (event) => { event.preventDefault(); options.onFailure(); };
|
|
230
|
+
const observer = new ResizeObserver(resize);
|
|
231
|
+
observer.observe(canvas.parentElement);
|
|
232
|
+
reduced.addEventListener('change', wake);
|
|
233
|
+
hit.addEventListener('pointerdown', down);
|
|
234
|
+
hit.addEventListener('pointermove', move);
|
|
235
|
+
hit.addEventListener('pointerup', end);
|
|
236
|
+
hit.addEventListener('pointercancel', end);
|
|
237
|
+
hit.addEventListener('lostpointercapture', end);
|
|
238
|
+
hit.addEventListener('click', click);
|
|
239
|
+
window.addEventListener('blur', blur);
|
|
240
|
+
window.addEventListener('resize', resize);
|
|
241
|
+
document.addEventListener('visibilitychange', hide);
|
|
242
|
+
canvas.addEventListener('webglcontextlost', lost);
|
|
243
|
+
canvas.dataset.ready = 'true';
|
|
244
|
+
resize();
|
|
245
|
+
return {
|
|
246
|
+
setAppearance(settings) {
|
|
247
|
+
if (disposed)
|
|
248
|
+
return;
|
|
249
|
+
loop.setFps(settings.fps);
|
|
250
|
+
canvas.dataset.fps = String(settings.fps);
|
|
251
|
+
strap.setAppearance(settings);
|
|
252
|
+
if (settings.image === artSource)
|
|
253
|
+
return;
|
|
254
|
+
artSource = settings.image;
|
|
255
|
+
const revision = ++artRevision, target = frontTexture.image;
|
|
256
|
+
const restore = () => { drawBadge(target, false); frontTexture.needsUpdate = true; canvas.dataset.art = 'default'; wake(); };
|
|
257
|
+
if (!settings.image) {
|
|
258
|
+
restore();
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
void loadCardImage(settings.image).then(image => {
|
|
262
|
+
if (disposed || revision !== artRevision)
|
|
263
|
+
return;
|
|
264
|
+
target.getContext('2d').drawImage(image, 0, 0, target.width, target.height);
|
|
265
|
+
frontTexture.needsUpdate = true;
|
|
266
|
+
canvas.dataset.art = 'custom';
|
|
267
|
+
wake();
|
|
268
|
+
}).catch(() => { if (!disposed && revision === artRevision)
|
|
269
|
+
restore(); });
|
|
270
|
+
},
|
|
271
|
+
setMessage(message) {
|
|
272
|
+
if (disposed)
|
|
273
|
+
return;
|
|
274
|
+
const key = JSON.stringify(message ?? null);
|
|
275
|
+
if (key === messageKey)
|
|
276
|
+
return;
|
|
277
|
+
messageKey = key;
|
|
278
|
+
const identity = message?.id ?? '';
|
|
279
|
+
if (message?.count && (message.count > unread || (message.count >= unread && identity !== messageIdentity)) && !document.hidden && !reduced.matches) {
|
|
280
|
+
sheen.clear();
|
|
281
|
+
noticeMotion.request();
|
|
282
|
+
}
|
|
283
|
+
if (!message?.count) {
|
|
284
|
+
noticeMotion.cancel();
|
|
285
|
+
sheen.clear();
|
|
286
|
+
}
|
|
287
|
+
unread = message?.count ?? 0;
|
|
288
|
+
messageIdentity = identity;
|
|
289
|
+
drawBadge(backTexture.image, true, message);
|
|
290
|
+
backTexture.needsUpdate = true;
|
|
291
|
+
canvas.dataset.unread = String(message?.count ?? 0);
|
|
292
|
+
wake();
|
|
293
|
+
},
|
|
294
|
+
relayout() { if (!disposed)
|
|
295
|
+
resize(); },
|
|
296
|
+
destroy() {
|
|
297
|
+
if (disposed)
|
|
298
|
+
return;
|
|
299
|
+
end();
|
|
300
|
+
disposed = true;
|
|
301
|
+
loop.stop();
|
|
302
|
+
observer.disconnect();
|
|
303
|
+
reduced.removeEventListener('change', wake);
|
|
304
|
+
hit.removeEventListener('pointerdown', down);
|
|
305
|
+
hit.removeEventListener('pointermove', move);
|
|
306
|
+
hit.removeEventListener('pointerup', end);
|
|
307
|
+
hit.removeEventListener('pointercancel', end);
|
|
308
|
+
hit.removeEventListener('lostpointercapture', end);
|
|
309
|
+
hit.removeEventListener('click', click);
|
|
310
|
+
window.removeEventListener('blur', blur);
|
|
311
|
+
window.removeEventListener('resize', resize);
|
|
312
|
+
document.removeEventListener('visibilitychange', hide);
|
|
313
|
+
canvas.removeEventListener('webglcontextlost', lost);
|
|
314
|
+
strap.destroy();
|
|
315
|
+
for (const disposable of disposables)
|
|
316
|
+
disposable.dispose();
|
|
317
|
+
renderer.dispose();
|
|
318
|
+
renderer.forceContextLoss();
|
|
319
|
+
world.free();
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
function roundedRectangle(width, height, radius) {
|
|
324
|
+
const x = -width / 2, y = -height / 2, s = new THREE.Shape();
|
|
325
|
+
s.moveTo(x + radius, y);
|
|
326
|
+
s.lineTo(x + width - radius, y);
|
|
327
|
+
s.quadraticCurveTo(x + width, y, x + width, y + radius);
|
|
328
|
+
s.lineTo(x + width, y + height - radius);
|
|
329
|
+
s.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
|
|
330
|
+
s.lineTo(x + radius, y + height);
|
|
331
|
+
s.quadraticCurveTo(x, y + height, x, y + height - radius);
|
|
332
|
+
s.lineTo(x, y + radius);
|
|
333
|
+
s.quadraticCurveTo(x, y, x + radius, y);
|
|
334
|
+
return s;
|
|
335
|
+
}
|
|
336
|
+
function badgeTexture(back) {
|
|
337
|
+
const canvas = document.createElement('canvas');
|
|
338
|
+
canvas.width = 512;
|
|
339
|
+
canvas.height = 704;
|
|
340
|
+
drawBadge(canvas, back);
|
|
341
|
+
const texture = new THREE.CanvasTexture(canvas);
|
|
342
|
+
texture.colorSpace = THREE.SRGBColorSpace;
|
|
343
|
+
return texture;
|
|
344
|
+
}
|
|
345
|
+
function drawBadge(canvas, back, message) {
|
|
346
|
+
const c = canvas.getContext('2d');
|
|
347
|
+
c.textAlign = 'left';
|
|
348
|
+
c.fillStyle = back ? '#e7e9e6' : '#253235';
|
|
349
|
+
c.fillRect(0, 0, 512, 704);
|
|
350
|
+
if (back && message?.count) {
|
|
351
|
+
const ink = back ? '#253235' : '#f1f3ec', muted = back ? '#405953' : '#b6cbc2';
|
|
352
|
+
c.textAlign = 'center';
|
|
353
|
+
c.fillStyle = muted;
|
|
354
|
+
c.font = '600 56px sans-serif';
|
|
355
|
+
c.fillText('伙伴消息', 256, 104);
|
|
356
|
+
c.fillStyle = back ? '#d0dcd5' : '#405c51';
|
|
357
|
+
c.beginPath();
|
|
358
|
+
c.roundRect(164, 154, 184, 132, 34);
|
|
359
|
+
c.fill();
|
|
360
|
+
c.fillStyle = ink;
|
|
361
|
+
c.font = '600 90px sans-serif';
|
|
362
|
+
c.fillText(message.count > 99 ? '99+' : String(message.count), 256, 252);
|
|
363
|
+
c.font = '600 76px sans-serif';
|
|
364
|
+
const chars = Array.from(message.name), originalLength = chars.length;
|
|
365
|
+
while (chars.length && c.measureText(chars.join('') + (chars.length < originalLength ? '…' : '')).width > 430)
|
|
366
|
+
chars.pop();
|
|
367
|
+
c.fillText(chars.join('') + (chars.length < originalLength ? '…' : ''), 256, 411);
|
|
368
|
+
c.font = '500 74px sans-serif';
|
|
369
|
+
c.fillText(message.label, 256, 514);
|
|
370
|
+
c.fillStyle = muted;
|
|
371
|
+
c.font = '500 52px sans-serif';
|
|
372
|
+
c.fillText('点击查看', 256, 628);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
c.fillStyle = back ? '#536a65' : '#b6cbc2';
|
|
376
|
+
c.font = '500 28px sans-serif';
|
|
377
|
+
c.fillText('DSH / PARTNER', 49, 90);
|
|
378
|
+
c.beginPath();
|
|
379
|
+
c.arc(256, 305, 116, 0, Math.PI * 2);
|
|
380
|
+
c.fillStyle = back ? '#d5dcda' : '#334749';
|
|
381
|
+
c.fill();
|
|
382
|
+
// Original geometric companion emblem, not an external image request.
|
|
383
|
+
c.fillStyle = back ? '#526663' : '#bfd4c9';
|
|
384
|
+
c.beginPath();
|
|
385
|
+
c.moveTo(179, 338);
|
|
386
|
+
c.lineTo(183, 229);
|
|
387
|
+
c.lineTo(225, 264);
|
|
388
|
+
c.quadraticCurveTo(256, 248, 287, 264);
|
|
389
|
+
c.lineTo(329, 229);
|
|
390
|
+
c.lineTo(333, 338);
|
|
391
|
+
c.quadraticCurveTo(255, 392, 179, 338);
|
|
392
|
+
c.fill();
|
|
393
|
+
c.fillStyle = back ? '#dce4df' : '#263536';
|
|
394
|
+
c.beginPath();
|
|
395
|
+
c.ellipse(228, 314, 9, 19, -.15, 0, Math.PI * 2);
|
|
396
|
+
c.ellipse(284, 314, 9, 19, .15, 0, Math.PI * 2);
|
|
397
|
+
c.fill();
|
|
398
|
+
c.textAlign = 'center';
|
|
399
|
+
c.fillStyle = back ? '#253235' : '#f1f3ec';
|
|
400
|
+
c.font = '600 48px sans-serif';
|
|
401
|
+
c.fillText(back ? 'TAKE A BREAK' : 'WITH YOU', 256, 515);
|
|
402
|
+
c.fillStyle = back ? '#536663' : '#b6c5c1';
|
|
403
|
+
c.font = '24px sans-serif';
|
|
404
|
+
c.fillText(back ? 'A little pause. A little play.' : 'Always a little closer.', 256, 559);
|
|
405
|
+
c.fillStyle = back ? '#b3beb8' : '#6d8b80';
|
|
406
|
+
c.fillRect(213, 608, 86, 5);
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/pendant/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-panel.d.ts","sourceRoot":"","sources":["../../src/pendant/settings-panel.tsx"],"names":[],"mappings":"AAcA,wBAAgB,oBAAoB,IAAI,GAAG,CAAC,OAAO,CAsDlD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { IconAgentPresetOutline16, IconCheckOutline14, IconPlusOutline16, IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
4
|
+
import { WorkspaceBlock, WorkspaceHero, WorkspaceNotice, errorMessage } from '../ui/workspace-components.js';
|
|
5
|
+
import { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, samePendantSettings } from './settings.js';
|
|
6
|
+
import { savePendantSettings, usePendantSettings } from './use-settings.js';
|
|
7
|
+
import { prepareCardImage } from './card-image.js';
|
|
8
|
+
import { StrapPreview } from './strap-preview.js';
|
|
9
|
+
const MATERIALS = [
|
|
10
|
+
{ id: 'woven', name: '织带', detail: '细密织纹' }, { id: 'braided', name: '编织绳', detail: '圆润绳股' }, { id: 'leather', name: '皮革', detail: '平整缝线' },
|
|
11
|
+
];
|
|
12
|
+
const FRAME_RATES = [{ fps: 24, label: '省电' }, { fps: 30, label: '均衡' }, { fps: 60, label: '流畅' }];
|
|
13
|
+
const COLORS = ['#617e73', '#46515b', '#b7afa0', '#997365', '#647c98', '#807388'];
|
|
14
|
+
export function PendantSettingsPanel() {
|
|
15
|
+
const settings = usePendantSettings(), [draft, setDraft] = useState(() => ({ ...settings }));
|
|
16
|
+
const [error, setError] = useState(''), [saved, setSaved] = useState(false), [processing, setProcessing] = useState(false);
|
|
17
|
+
const file = useRef(null), epoch = useRef(0);
|
|
18
|
+
const previous = useRef(settings);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const before = previous.current;
|
|
21
|
+
previous.current = settings;
|
|
22
|
+
// Follow other tabs when clean; never discard a local edit or pending image.
|
|
23
|
+
setDraft(value => samePendantSettings(value, before) ? { ...settings } : value);
|
|
24
|
+
}, [settings]);
|
|
25
|
+
useEffect(() => () => { epoch.current++; }, []);
|
|
26
|
+
const update = (patch) => { setDraft(value => ({ ...value, ...patch })); setSaved(false); setError(''); };
|
|
27
|
+
const validColor = /^#[0-9a-f]{6}$/i.test(draft.color);
|
|
28
|
+
const previewColor = validColor ? draft.color : DEFAULT_PENDANT_SETTINGS.color;
|
|
29
|
+
const dirty = !samePendantSettings(draft, settings);
|
|
30
|
+
const upload = async (event) => {
|
|
31
|
+
const selected = event.currentTarget.files?.[0];
|
|
32
|
+
event.currentTarget.value = '';
|
|
33
|
+
if (!selected)
|
|
34
|
+
return;
|
|
35
|
+
const request = ++epoch.current;
|
|
36
|
+
setProcessing(true);
|
|
37
|
+
setError('');
|
|
38
|
+
setSaved(false);
|
|
39
|
+
try {
|
|
40
|
+
const image = await prepareCardImage(selected);
|
|
41
|
+
if (request === epoch.current)
|
|
42
|
+
update({ image });
|
|
43
|
+
}
|
|
44
|
+
catch (reason) {
|
|
45
|
+
if (request === epoch.current)
|
|
46
|
+
setError(errorMessage(reason));
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
if (request === epoch.current)
|
|
50
|
+
setProcessing(false);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const save = () => {
|
|
54
|
+
if (!validColor) {
|
|
55
|
+
setError('绳子颜色应为六位十六进制颜色,例如 #617e73。');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
savePendantSettings(draft);
|
|
60
|
+
setDraft(normalizePendantSettings(draft));
|
|
61
|
+
setSaved(true);
|
|
62
|
+
setError('');
|
|
63
|
+
}
|
|
64
|
+
catch (reason) {
|
|
65
|
+
setError(errorMessage(reason));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
return _jsxs("div", { className: "dsh-partner-feature-page dsh-partner-pendant-settings", children: [_jsx(WorkspaceHero, { eyebrow: "PERSONAL TOUCH", title: "\u5361\u7247\u8BBE\u7F6E", detail: "\u8BA9\u6302\u9970\u6709\u81EA\u5DF1\u7684\u6837\u5B50\u3002\u5916\u89C2\u4EC5\u4FDD\u5B58\u5728\u5F53\u524D\u6D4F\u89C8\u5668\uFF0C\u4E0D\u5F71\u54CD\u4F19\u4F34\u6267\u884C\u548C\u6E20\u9053\u901A\u77E5\u3002", actions: _jsxs("button", { type: "button", disabled: !dirty || processing, onClick: save, children: [_jsx(IconCheckOutline14, { size: 15 }), "\u4FDD\u5B58\u8BBE\u7F6E"] }) }), error && _jsx(WorkspaceNotice, { children: error }), saved && _jsx(WorkspaceNotice, { kind: "success", children: "\u5DF2\u4FDD\u5B58\uFF0C\u6302\u9970\u5DF2\u66F4\u65B0\u3002" }), _jsxs("div", { className: "dsh-partner-pendant-settings-layout", children: [_jsxs("div", { className: "dsh-partner-pendant-settings-fields", children: [_jsxs(WorkspaceBlock, { title: "\u4E3B\u754C\u9762\u6302\u9970", detail: "\u5173\u95ED\u540E\u505C\u6B62\u6302\u9970\u6E32\u67D3\u4E0E\u6D88\u606F\u8F6E\u8BE2\uFF0C\u968F\u65F6\u53EF\u4EE5\u91CD\u65B0\u5F00\u542F\u3002", actions: _jsx("button", { type: "button", className: "dsh-partner-feature-switch", "data-on": draft.enabled, role: "switch", "aria-label": "\u663E\u793A\u5361\u7247\u6302\u9970", "aria-checked": draft.enabled, onClick: () => update({ enabled: !draft.enabled }), children: _jsx("i", {}) }), children: [_jsx("p", { className: "dsh-partner-pendant-setting-hint", children: "\u6D88\u606F\u4FDD\u7559\u5728\u5361\u7247\u5185\u4FA7\uFF1B\u6B63\u9762\u5C55\u793A\u56FE\u6848\uFF0C\u65B0\u6D88\u606F\u5230\u8FBE\u65F6\u8F7B\u6446\u3001\u8F6C\u6B63\u5E76\u95EA\u5149\u3002" }), _jsxs("div", { className: "dsh-partner-pendant-fps-row", children: [_jsx("span", { children: "\u5E27\u7387\u4E0A\u9650" }), _jsx("div", { className: "dsh-partner-pendant-fps-options", role: "group", "aria-label": "\u6302\u9970\u5E27\u7387", children: FRAME_RATES.map(item => _jsxs("button", { type: "button", "aria-pressed": draft.fps === item.fps, onClick: () => update({ fps: item.fps }), children: [_jsxs("strong", { children: [item.fps, " FPS"] }), _jsx("small", { children: item.label })] }, item.fps)) }), _jsx("small", { children: "\u4EC5\u5F71\u54CD\u52A8\u753B\u7ED8\u5236\uFF0C\u5B9E\u9645\u5E27\u7387\u53D6\u51B3\u4E8E\u8BBE\u5907\uFF1B\u9759\u6B62\u65F6\u81EA\u52A8\u4F11\u7720\u3002" })] })] }), _jsxs(WorkspaceBlock, { title: "\u7EF3\u5B50\u5916\u89C2", detail: "\u6750\u8D28\u53EA\u6539\u53D8\u5916\u89C2\uFF0C\u4FDD\u7559\u5F53\u524D\u7684\u62C9\u4F38\u4E0E\u56DE\u5F39\u624B\u611F\u3002", children: [_jsx("div", { className: "dsh-partner-pendant-materials", role: "group", "aria-label": "\u7EF3\u5B50\u6750\u8D28", children: MATERIALS.map(item => _jsxs("button", { type: "button", "aria-pressed": draft.material === item.id, onClick: () => update({ material: item.id }), children: [_jsx(StrapPreview, { material: item.id, color: previewColor, swatch: true }), _jsx("strong", { children: item.name }), _jsx("small", { children: item.detail }), draft.material === item.id && _jsx(IconCheckOutline14, { size: 14 })] }, item.id)) }), _jsxs("div", { className: "dsh-partner-pendant-color-row", children: [_jsx("span", { children: "\u7EF3\u5B50\u989C\u8272" }), _jsx("div", { className: "dsh-partner-pendant-swatches", role: "group", "aria-label": "\u9884\u8BBE\u7EF3\u5B50\u989C\u8272", children: COLORS.map(color => _jsxs("button", { type: "button", "aria-label": `绳子颜色 ${color}`, "aria-pressed": draft.color.toLowerCase() === color, onClick: () => update({ color }), children: [_jsx("i", { style: { backgroundColor: color } }), draft.color.toLowerCase() === color && _jsx(IconCheckOutline14, { size: 12 })] }, color)) }), _jsxs("label", { className: "dsh-partner-pendant-hex", children: [_jsx("span", { className: "dsh-partner-pendant-sr", children: "\u81EA\u5B9A\u4E49\u7EF3\u5B50\u989C\u8272" }), _jsx("input", { "aria-label": "\u81EA\u5B9A\u4E49\u7EF3\u5B50\u989C\u8272", "aria-invalid": !validColor, value: draft.color, maxLength: 7, spellCheck: false, onChange: event => update({ color: event.target.value }) })] })] }), !validColor && _jsx("p", { className: "dsh-partner-pendant-color-error", children: "\u8BF7\u8F93\u5165 # \u5F00\u5934\u7684\u516D\u4F4D\u989C\u8272\u503C\u3002" })] }), _jsxs(WorkspaceBlock, { title: "\u6B63\u9762\u56FE\u6848", detail: "\u652F\u6301 PNG\u3001JPEG\u3001WebP\uFF0C\u6700\u5927 5 MB\u3002\u56FE\u7247\u5C45\u4E2D\u88C1\u5207\u4E3A\u7AD6\u5411\u5361\u9762\uFF0C\u53EA\u5728\u672C\u673A\u5904\u7406\u3002", children: [_jsx("input", { ref: file, type: "file", accept: "image/png,image/jpeg,image/webp", hidden: true, "aria-label": "\u4E0A\u4F20\u5361\u7247\u56FE\u7247", onChange: event => { void upload(event); } }), _jsxs("div", { className: "dsh-partner-pendant-image-actions", children: [_jsxs("button", { type: "button", disabled: processing, onClick: () => file.current?.click(), children: [_jsx(IconPlusOutline16, { size: 15 }), processing ? '正在处理…' : draft.image ? '更换图片' : '选择图片'] }), _jsxs("button", { type: "button", disabled: !draft.image || processing, onClick: () => update({ image: '' }), children: [_jsx(IconRefreshOutline16, { size: 15 }), "\u6062\u590D\u9ED8\u8BA4\u56FE\u6848"] })] }), _jsx("p", { className: "dsh-partner-pendant-setting-hint", children: "\u5EFA\u8BAE\u4F7F\u7528 8:11 \u7AD6\u56FE\uFF1B\u4FDD\u5B58\u540E\u5237\u65B0\u4ECD\u4F1A\u4FDD\u7559\uFF0C\u6D88\u606F\u4E0D\u4F1A\u8986\u76D6\u4F60\u7684\u56FE\u6848\u3002" })] }), _jsxs("div", { className: "dsh-partner-pendant-settings-footer", children: [_jsx("button", { type: "button", disabled: processing, onClick: () => update({ ...DEFAULT_PENDANT_SETTINGS }), children: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4" }), _jsx("small", { children: dirty ? '有未保存的更改' : '设置已同步到当前浏览器' })] })] }), _jsxs("aside", { className: "dsh-partner-pendant-preview", "aria-label": "\u5361\u7247\u5916\u89C2\u9884\u89C8", children: [_jsxs("header", { children: [_jsx("strong", { children: "\u5916\u89C2\u9884\u89C8" }), _jsx("small", { children: draft.enabled ? '保存后应用到主界面' : '挂饰将隐藏,设置仍会保留' })] }), _jsxs("div", { className: "dsh-partner-pendant-preview-stage", children: [_jsx(StrapPreview, { material: draft.material, color: previewColor }), _jsx("div", { className: "dsh-partner-pendant-preview-card", children: draft.image ? _jsx("img", { src: draft.image, alt: "\u81EA\u5B9A\u4E49\u5361\u7247\u6B63\u9762\u9884\u89C8" }) : _jsxs("span", { children: [_jsx(IconAgentPresetOutline16, { size: 38 }), _jsx("strong", { children: "WITH YOU" }), _jsx("small", { children: "\u9ED8\u8BA4\u4F19\u4F34\u56FE\u6848" })] }) })] }), _jsxs("p", { children: ["\u6B63\u9762 \u00B7 \u56FE\u6848", _jsx("br", {}), _jsx("small", { children: "\u5185\u4FA7 \u00B7 \u4F19\u4F34\u6D88\u606F" })] })] })] })] });
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=settings-panel.js.map
|