@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.
Files changed (115) hide show
  1. package/README.md +16 -1
  2. package/docs/THIRD_PARTY_LICENSES.md +231 -0
  3. package/docs/architecture.md +23 -0
  4. package/lib/api/features/pendant-api.d.ts +4 -0
  5. package/lib/api/features/pendant-api.d.ts.map +1 -0
  6. package/lib/api/features/pendant-api.js +37 -0
  7. package/lib/api/features/pendant-api.js.map +1 -0
  8. package/lib/api.d.ts +2 -0
  9. package/lib/api.d.ts.map +1 -1
  10. package/lib/api.js +3 -0
  11. package/lib/api.js.map +1 -1
  12. package/lib/client-controller.d.ts +6 -1
  13. package/lib/client-controller.d.ts.map +1 -1
  14. package/lib/client-controller.js +4 -1
  15. package/lib/client-controller.js.map +1 -1
  16. package/lib/client.d.ts.map +1 -1
  17. package/lib/client.js +2364 -1442
  18. package/lib/client.js.map +4 -4
  19. package/lib/index.d.ts.map +1 -1
  20. package/lib/index.js +8 -2
  21. package/lib/index.js.map +1 -1
  22. package/lib/notifications/domain.d.ts +18 -0
  23. package/lib/notifications/domain.d.ts.map +1 -0
  24. package/lib/notifications/domain.js +2 -0
  25. package/lib/notifications/domain.js.map +1 -0
  26. package/lib/notifications/service.d.ts +15 -0
  27. package/lib/notifications/service.d.ts.map +1 -0
  28. package/lib/notifications/service.js +65 -0
  29. package/lib/notifications/service.js.map +1 -0
  30. package/lib/notifications/store.d.ts +14 -0
  31. package/lib/notifications/store.d.ts.map +1 -0
  32. package/lib/notifications/store.js +56 -0
  33. package/lib/notifications/store.js.map +1 -0
  34. package/lib/pendant/card-image.d.ts +6 -0
  35. package/lib/pendant/card-image.d.ts.map +1 -0
  36. package/lib/pendant/card-image.js +43 -0
  37. package/lib/pendant/card-image.js.map +1 -0
  38. package/lib/pendant/frame-loop.d.ts +18 -0
  39. package/lib/pendant/frame-loop.d.ts.map +1 -0
  40. package/lib/pendant/frame-loop.js +74 -0
  41. package/lib/pendant/frame-loop.js.map +1 -0
  42. package/lib/pendant/notice-motion.d.ts +12 -0
  43. package/lib/pendant/notice-motion.d.ts.map +1 -0
  44. package/lib/pendant/notice-motion.js +40 -0
  45. package/lib/pendant/notice-motion.js.map +1 -0
  46. package/lib/pendant/physics.d.ts +14 -0
  47. package/lib/pendant/physics.d.ts.map +1 -0
  48. package/lib/pendant/physics.js +29 -0
  49. package/lib/pendant/physics.js.map +1 -0
  50. package/lib/pendant/reader.d.ts +15 -0
  51. package/lib/pendant/reader.d.ts.map +1 -0
  52. package/lib/pendant/reader.js +37 -0
  53. package/lib/pendant/reader.js.map +1 -0
  54. package/lib/pendant/renderer.d.ts +24 -0
  55. package/lib/pendant/renderer.d.ts.map +1 -0
  56. package/lib/pendant/renderer.js +408 -0
  57. package/lib/pendant/renderer.js.map +1 -0
  58. package/lib/pendant/settings-panel.d.ts +2 -0
  59. package/lib/pendant/settings-panel.d.ts.map +1 -0
  60. package/lib/pendant/settings-panel.js +70 -0
  61. package/lib/pendant/settings-panel.js.map +1 -0
  62. package/lib/pendant/settings.d.ts +16 -0
  63. package/lib/pendant/settings.d.ts.map +1 -0
  64. package/lib/pendant/settings.js +18 -0
  65. package/lib/pendant/settings.js.map +1 -0
  66. package/lib/pendant/sheen.d.ts +11 -0
  67. package/lib/pendant/sheen.d.ts.map +1 -0
  68. package/lib/pendant/sheen.js +36 -0
  69. package/lib/pendant/sheen.js.map +1 -0
  70. package/lib/pendant/strap-geometry.d.ts +17 -0
  71. package/lib/pendant/strap-geometry.d.ts.map +1 -0
  72. package/lib/pendant/strap-geometry.js +69 -0
  73. package/lib/pendant/strap-geometry.js.map +1 -0
  74. package/lib/pendant/strap-preview.d.ts +5 -0
  75. package/lib/pendant/strap-preview.d.ts.map +1 -0
  76. package/lib/pendant/strap-preview.js +8 -0
  77. package/lib/pendant/strap-preview.js.map +1 -0
  78. package/lib/pendant/strap-style.d.ts +11 -0
  79. package/lib/pendant/strap-style.d.ts.map +1 -0
  80. package/lib/pendant/strap-style.js +13 -0
  81. package/lib/pendant/strap-style.js.map +1 -0
  82. package/lib/pendant/strap.d.ts +13 -0
  83. package/lib/pendant/strap.d.ts.map +1 -0
  84. package/lib/pendant/strap.js +73 -0
  85. package/lib/pendant/strap.js.map +1 -0
  86. package/lib/pendant/surface.d.ts +12 -0
  87. package/lib/pendant/surface.d.ts.map +1 -0
  88. package/lib/pendant/surface.js +15 -0
  89. package/lib/pendant/surface.js.map +1 -0
  90. package/lib/pendant/use-inbox.d.ts +9 -0
  91. package/lib/pendant/use-inbox.d.ts.map +1 -0
  92. package/lib/pendant/use-inbox.js +81 -0
  93. package/lib/pendant/use-inbox.js.map +1 -0
  94. package/lib/pendant/use-placement.d.ts +28 -0
  95. package/lib/pendant/use-placement.d.ts.map +1 -0
  96. package/lib/pendant/use-placement.js +108 -0
  97. package/lib/pendant/use-placement.js.map +1 -0
  98. package/lib/pendant/use-settings.d.ts +4 -0
  99. package/lib/pendant/use-settings.d.ts.map +1 -0
  100. package/lib/pendant/use-settings.js +44 -0
  101. package/lib/pendant/use-settings.js.map +1 -0
  102. package/lib/pendant/widget.d.ts +5 -0
  103. package/lib/pendant/widget.d.ts.map +1 -0
  104. package/lib/pendant/widget.js +92 -0
  105. package/lib/pendant/widget.js.map +1 -0
  106. package/lib/pendant-renderer.js +4124 -0
  107. package/lib/store.d.ts +2 -0
  108. package/lib/store.d.ts.map +1 -1
  109. package/lib/store.js +19 -0
  110. package/lib/store.js.map +1 -1
  111. package/lib/ui/task-board-panel.d.ts +4 -1
  112. package/lib/ui/task-board-panel.d.ts.map +1 -1
  113. package/lib/ui/task-board-panel.js +4 -2
  114. package/lib/ui/task-board-panel.js.map +1 -1
  115. package/package.json +9 -5
@@ -0,0 +1,108 @@
1
+ import { useEffect, useRef } from 'react';
2
+ const KEY = 'dsh-partner:pendant-position:v1';
3
+ const clamp = (value, low, high) => Math.max(low, Math.min(value, Math.max(low, high)));
4
+ export function readerPlacement(anchor, viewport) {
5
+ const width = Math.min(360, viewport.width - 24), maxHeight = Math.min(480, viewport.height - 32), gap = 16;
6
+ const left = anchor.x - width - gap, right = anchor.x + anchor.width + gap;
7
+ if (left >= 12 || right + width <= viewport.width - 12) {
8
+ return { width, maxHeight, left: clamp(left >= 12 ? left : right, 12, viewport.width - width - 12), top: clamp(anchor.y - 12, 16, viewport.height - maxHeight - 16) };
9
+ }
10
+ // Narrow screens: reserve the card's actual footprint, choose the larger
11
+ // vertical space and scroll the message instead of covering the card.
12
+ const below = clamp(anchor.y + anchor.height + gap, 16, viewport.height - 16);
13
+ const above = clamp(anchor.y - gap, 16, viewport.height - 16);
14
+ const useBelow = viewport.height - below - 16 >= above - 16;
15
+ const available = useBelow ? viewport.height - below - 16 : above - 16;
16
+ const height = Math.max(0, Math.min(maxHeight, available));
17
+ return { width, maxHeight: height, left: clamp(anchor.x + anchor.width / 2 - width / 2, 12, viewport.width - width - 12), top: useBelow ? below : above - height };
18
+ }
19
+ /** Moving the hook changes placement, not the badge's elastic drag gesture.
20
+ * Persist only at gesture completion; movement has no React render loop.
21
+ */
22
+ export function usePendantPlacement(root, handle) {
23
+ const handlers = useRef({ down: (_) => { }, move: (_) => { }, end: (_) => { }, key: (_) => { } });
24
+ useEffect(() => {
25
+ const element = root.current;
26
+ if (!element)
27
+ return;
28
+ let saved, pending, frame = 0;
29
+ let drag;
30
+ try {
31
+ const value = JSON.parse(localStorage.getItem(KEY) ?? 'null');
32
+ if (value && Number.isFinite(value.x) && Number.isFinite(value.y))
33
+ saved = { x: clamp(value.x, 0, 1), y: clamp(value.y, 0, 1) };
34
+ }
35
+ catch { /* Storage restrictions must not disable the pendant. */ }
36
+ const limits = () => ({ x: Math.max(0, innerWidth - element.offsetWidth), y: Math.max(28, innerHeight - element.offsetHeight - 12) });
37
+ const place = (p) => {
38
+ const max = limits();
39
+ element.style.left = `${clamp(p.x, 0, max.x)}px`;
40
+ element.style.top = `${clamp(p.y, 28, max.y)}px`;
41
+ element.style.right = 'auto';
42
+ handle.current?.relayout();
43
+ };
44
+ const restore = () => {
45
+ const max = limits();
46
+ place(saved ? { x: saved.x * max.x, y: 28 + saved.y * (max.y - 28) } : { x: max.x - 8, y: 46 });
47
+ };
48
+ const flush = () => { cancelAnimationFrame(frame); frame = 0; if (pending) {
49
+ place(pending);
50
+ pending = undefined;
51
+ } };
52
+ const persist = () => {
53
+ const max = limits();
54
+ saved = { x: parseFloat(element.style.left) / (max.x || 1), y: (parseFloat(element.style.top) - 28) / (max.y - 28 || 1) };
55
+ try {
56
+ localStorage.setItem(KEY, JSON.stringify(saved));
57
+ }
58
+ catch { /* In-memory movement still works. */ }
59
+ };
60
+ const finish = () => {
61
+ if (!drag)
62
+ return;
63
+ const previous = drag;
64
+ drag = undefined;
65
+ flush();
66
+ persist();
67
+ if (previous.button.hasPointerCapture(previous.id))
68
+ previous.button.releasePointerCapture(previous.id);
69
+ };
70
+ handlers.current = {
71
+ down(event) {
72
+ if (!event.isPrimary || event.button !== 0 || drag)
73
+ return;
74
+ event.preventDefault();
75
+ const box = element.getBoundingClientRect();
76
+ drag = { id: event.pointerId, x: event.clientX, y: event.clientY, left: box.left, top: box.top, button: event.currentTarget };
77
+ event.currentTarget.setPointerCapture(event.pointerId);
78
+ },
79
+ move(event) {
80
+ if (!drag || event.pointerId !== drag.id)
81
+ return;
82
+ pending = { x: drag.left + event.clientX - drag.x, y: drag.top + event.clientY - drag.y };
83
+ if (!frame)
84
+ frame = requestAnimationFrame(flush);
85
+ },
86
+ end(event) { if (drag?.id === event.pointerId)
87
+ finish(); },
88
+ key(event) {
89
+ const step = event.shiftKey ? 32 : 12, delta = { ArrowLeft: [-step, 0], ArrowRight: [step, 0], ArrowUp: [0, -step], ArrowDown: [0, step] }[event.key];
90
+ if (!delta)
91
+ return;
92
+ event.preventDefault();
93
+ const box = element.getBoundingClientRect();
94
+ place({ x: box.left + delta[0], y: box.top + delta[1] });
95
+ persist();
96
+ },
97
+ };
98
+ const resize = () => { finish(); restore(); };
99
+ const observer = new ResizeObserver(resize);
100
+ observer.observe(element);
101
+ window.addEventListener('resize', resize);
102
+ window.addEventListener('blur', finish);
103
+ restore();
104
+ return () => { finish(); cancelAnimationFrame(frame); observer.disconnect(); window.removeEventListener('resize', resize); window.removeEventListener('blur', finish); };
105
+ }, [root, handle]);
106
+ return { onPointerDown: (e) => handlers.current.down(e), onPointerMove: (e) => handlers.current.move(e), onPointerUp: (e) => handlers.current.end(e), onPointerCancel: (e) => handlers.current.end(e), onLostPointerCapture: (e) => handlers.current.end(e), onKeyDown: (e) => handlers.current.key(e) };
107
+ }
108
+ //# sourceMappingURL=use-placement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-placement.js","sourceRoot":"","sources":["../../src/pendant/use-placement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type PendantSettings } from './settings.js';
2
+ export declare function usePendantSettings(): PendantSettings;
3
+ export declare function savePendantSettings(settings: PendantSettings): void;
4
+ //# sourceMappingURL=use-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-settings.d.ts","sourceRoot":"","sources":["../../src/pendant/use-settings.ts"],"names":[],"mappings":"AACA,OAAO,EAA4E,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAkB9H,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AACD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAKnE"}
@@ -0,0 +1,44 @@
1
+ import { useSyncExternalStore } from 'react';
2
+ import { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, PENDANT_SETTINGS_KEY } from './settings.js';
3
+ let current;
4
+ const listeners = new Set();
5
+ function load() {
6
+ try {
7
+ return normalizePendantSettings(JSON.parse(localStorage.getItem(PENDANT_SETTINGS_KEY) ?? 'null'));
8
+ }
9
+ catch {
10
+ return { ...DEFAULT_PENDANT_SETTINGS };
11
+ }
12
+ }
13
+ function changed() { for (const listener of listeners)
14
+ listener(); }
15
+ function storage(event) {
16
+ if (event.key !== null && event.key !== PENDANT_SETTINGS_KEY)
17
+ return;
18
+ current = load();
19
+ changed();
20
+ }
21
+ function subscribe(listener) {
22
+ if (!listeners.size) {
23
+ current = load();
24
+ window.addEventListener('storage', storage);
25
+ }
26
+ listeners.add(listener);
27
+ return () => { listeners.delete(listener); if (!listeners.size)
28
+ window.removeEventListener('storage', storage); };
29
+ }
30
+ export function usePendantSettings() {
31
+ return useSyncExternalStore(subscribe, () => current ??= load(), () => DEFAULT_PENDANT_SETTINGS);
32
+ }
33
+ export function savePendantSettings(settings) {
34
+ const next = normalizePendantSettings(settings);
35
+ try {
36
+ localStorage.setItem(PENDANT_SETTINGS_KEY, JSON.stringify(next));
37
+ }
38
+ catch {
39
+ throw new Error('无法保存卡片设置,请检查浏览器存储权限或剩余空间。原设置未更改。');
40
+ }
41
+ current = next;
42
+ changed();
43
+ }
44
+ //# sourceMappingURL=use-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-settings.js","sourceRoot":"","sources":["../../src/pendant/use-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,oBAAoB,EAAwB,MAAM,eAAe,CAAA;AAE9H,IAAI,OAAoC,CAAA;AACxC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AACvC,SAAS,IAAI;IACX,IAAI,CAAC;QAAC,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA;IAAC,CAAC;IACzG,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAA;IAAC,CAAC;AAClD,CAAC;AACD,SAAS,OAAO,KAAW,KAAK,MAAM,QAAQ,IAAI,SAAS;IAAE,QAAQ,EAAE,CAAA,CAAC,CAAC;AACzE,SAAS,OAAO,CAAC,KAAmB;IAClC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB;QAAE,OAAM;IACpE,OAAO,GAAG,IAAI,EAAE,CAAC;IAAC,OAAO,EAAE,CAAA;AAC7B,CAAC;AACD,SAAS,SAAS,CAAC,QAAoB;IACrC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAAC,CAAC;IACtF,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;QAAE,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA,CAAC,CAAC,CAAA;AAClH,CAAC;AACD,MAAM,UAAU,kBAAkB;IAChC,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,KAAK,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAA;AAClG,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,QAAyB;IAC3D,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IAC/C,IAAI,CAAC;QAAC,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAAC,CAAC;IACxE,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAAC,CAAC;IAC7D,OAAO,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PartnerController } from '../client-controller.js';
2
+ export declare function PartnerPendant({ controller }: {
3
+ controller: PartnerController;
4
+ }): JSX.Element | null;
5
+ //# sourceMappingURL=widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../../src/pendant/widget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAehE,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,iBAAiB,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAGpG"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { PARTNER_API } from '../client-api.js';
4
+ import { usePartnerInbox } from './use-inbox.js';
5
+ import { usePendantPlacement } from './use-placement.js';
6
+ import { PendantReader } from './reader.js';
7
+ import { usePendantSettings } from './use-settings.js';
8
+ function messageLabel(notice) {
9
+ if (notice.kind === 'reply')
10
+ return '有新回复';
11
+ if (notice.kind === 'task' && notice.title.startsWith('遇到阻塞 · '))
12
+ return '任务受阻';
13
+ if (notice.kind === 'schedule' && notice.title.startsWith('未完成 · '))
14
+ return '尚未完成';
15
+ return notice.kind === 'task' ? '任务完成' : '定时完成';
16
+ }
17
+ export function PartnerPendant({ controller }) {
18
+ const settings = usePendantSettings();
19
+ return settings.enabled ? _jsx(ActivePendant, { controller: controller, settings: settings }) : null;
20
+ }
21
+ function ActivePendant({ controller, settings }) {
22
+ const root = useRef(null), canvas = useRef(null), hit = useRef(null);
23
+ const handle = useRef(), toggle = useRef(() => { });
24
+ const [open, setOpen] = useState(false), [ready, setReady] = useState(false), [failed, setFailed] = useState(false);
25
+ const [selected, setSelected] = useState(), [navigationError, setNavigationError] = useState('');
26
+ const { inbox, incoming, error, read } = usePartnerInbox();
27
+ const latestUnread = inbox.items.find(item => item.readAt === undefined);
28
+ const badgeMessage = latestUnread ? { id: latestUnread.id, count: inbox.unread, name: latestUnread.companionName, label: messageLabel(latestUnread) } : undefined;
29
+ const messageRef = useRef(badgeMessage);
30
+ const settingsRef = useRef(settings);
31
+ settingsRef.current = settings;
32
+ messageRef.current = badgeMessage;
33
+ const placement = usePendantPlacement(root, handle);
34
+ const close = useCallback((keyboard = false) => {
35
+ setOpen(false);
36
+ if (keyboard)
37
+ requestAnimationFrame(() => hit.current?.focus({ preventScroll: true }));
38
+ }, []);
39
+ const inspect = (item) => { setSelected(item?.id); if (item && item.readAt === undefined)
40
+ void read([item.id]); };
41
+ toggle.current = () => {
42
+ if (open) {
43
+ close();
44
+ return;
45
+ }
46
+ setNavigationError('');
47
+ inspect(latestUnread);
48
+ setOpen(true);
49
+ };
50
+ useEffect(() => {
51
+ const abort = new AbortController();
52
+ const url = `${PARTNER_API}/pendant/renderer.js`;
53
+ void import(/* @vite-ignore */ url).then(async (module) => {
54
+ if (abort.signal.aborted || !canvas.current || !hit.current)
55
+ return;
56
+ const instance = await module.createLanyard(canvas.current, hit.current, {
57
+ signal: abort.signal, onTap: () => toggle.current(), onFailure: () => { handle.current?.destroy(); handle.current = undefined; setReady(false); setFailed(true); },
58
+ });
59
+ if (abort.signal.aborted) {
60
+ instance.destroy();
61
+ return;
62
+ }
63
+ handle.current = instance;
64
+ instance.setAppearance(settingsRef.current);
65
+ instance.setMessage(messageRef.current);
66
+ setReady(true);
67
+ }).catch(() => { if (!abort.signal.aborted) {
68
+ setFailed(true);
69
+ setReady(false);
70
+ } });
71
+ return () => { abort.abort(); handle.current?.destroy(); handle.current = undefined; };
72
+ }, []);
73
+ useEffect(() => { handle.current?.setMessage(badgeMessage); }, [inbox, ready]);
74
+ useEffect(() => { handle.current?.setAppearance(settings); }, [settings, ready]);
75
+ const visit = async (item) => {
76
+ setNavigationError('');
77
+ try {
78
+ if (item.routeId && item.sessionId)
79
+ await controller.openSession(item.routeId, item.sessionId);
80
+ else
81
+ controller.open(item.companionId, { page: item.kind === 'task' ? 'board' : item.kind === 'schedule' ? 'schedules' : 'home', ...(item.taskId ? { taskId: item.taskId } : {}) });
82
+ close();
83
+ }
84
+ catch (reason) {
85
+ setNavigationError(reason instanceof Error ? reason.message : '无法打开来源');
86
+ }
87
+ };
88
+ const label = `伙伴消息,${inbox.unread} 条未读${latestUnread ? `,${latestUnread.companionName}:${latestUnread.title}` : ''};点击查看,拖动卡牌玩耍`;
89
+ return _jsxs("aside", { ref: root, className: "dsh-partner-pendant", "aria-label": "\u4F19\u4F34\u6302\u9970", children: [_jsx("canvas", { ref: canvas, className: "dsh-partner-pendant-canvas", "aria-hidden": "true" }), _jsx("button", { ref: hit, type: "button", className: `dsh-partner-pendant-hit${ready ? ' is-rendered' : ''}`, "aria-label": label, "aria-expanded": open, "aria-controls": open ? 'dsh-partner-pendant-inbox' : undefined, onClick: () => { if (!ready)
90
+ toggle.current(); }, children: !ready && _jsxs("span", { className: "dsh-partner-pendant-fallback", children: ["\u4F19\u4F34", _jsx("small", { children: failed ? inbox.unread ? `${inbox.unread} 条消息` : '消息' : '加载挂饰…' })] }) }), _jsx("button", { type: "button", className: "dsh-partner-pendant-anchor", "aria-label": "\u79FB\u52A8\u6302\u9970\u4F4D\u7F6E", title: "\u62D6\u52A8\u6302\u70B9\u79FB\u52A8\u4F4D\u7F6E\uFF0C\u4E5F\u53EF\u7528\u65B9\u5411\u952E\u5FAE\u8C03", ...placement, children: _jsx("span", { "aria-hidden": "true" }) }), _jsx("span", { className: "dsh-partner-pendant-announcement", role: "status", "aria-live": "polite", "aria-atomic": "true", children: incoming ? `${incoming.companionName}:${incoming.title}` : '' }), open && _jsx(PendantReader, { inbox: inbox, selected: selected, error: error || navigationError, anchor: hit, onSelect: inspect, onClose: close, onVisit: item => { void visit(item); }, onReadAll: () => { void read(inbox.items.filter(item => item.readAt === undefined).map(item => item.id)); } })] });
91
+ }
92
+ //# sourceMappingURL=widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/pendant/widget.tsx"],"names":[],"mappings":"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"}