@lemoncat7/dsh-partner 1.6.1 → 1.7.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.
Files changed (111) hide show
  1. package/README.md +10 -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 +407 -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/use-inbox.d.ts +9 -0
  87. package/lib/pendant/use-inbox.d.ts.map +1 -0
  88. package/lib/pendant/use-inbox.js +81 -0
  89. package/lib/pendant/use-inbox.js.map +1 -0
  90. package/lib/pendant/use-placement.d.ts +28 -0
  91. package/lib/pendant/use-placement.d.ts.map +1 -0
  92. package/lib/pendant/use-placement.js +108 -0
  93. package/lib/pendant/use-placement.js.map +1 -0
  94. package/lib/pendant/use-settings.d.ts +4 -0
  95. package/lib/pendant/use-settings.d.ts.map +1 -0
  96. package/lib/pendant/use-settings.js +44 -0
  97. package/lib/pendant/use-settings.js.map +1 -0
  98. package/lib/pendant/widget.d.ts +5 -0
  99. package/lib/pendant/widget.d.ts.map +1 -0
  100. package/lib/pendant/widget.js +92 -0
  101. package/lib/pendant/widget.js.map +1 -0
  102. package/lib/pendant-renderer.js +4124 -0
  103. package/lib/store.d.ts +2 -0
  104. package/lib/store.d.ts.map +1 -1
  105. package/lib/store.js +19 -0
  106. package/lib/store.js.map +1 -1
  107. package/lib/ui/task-board-panel.d.ts +4 -1
  108. package/lib/ui/task-board-panel.d.ts.map +1 -1
  109. package/lib/ui/task-board-panel.js +4 -2
  110. package/lib/ui/task-board-panel.js.map +1 -1
  111. 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":"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"}
@@ -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;AAIpD,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,407 @@
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
+ let physicsReady;
11
+ /** React Bits-inspired Three + Rapier lanyard, with elastic/spherical joints.
12
+ * Separate ESM asset: the main client never imports the renderer/physics bundle.
13
+ * Only the moving card's HTML hit target receives input; the canvas is click-through.
14
+ */
15
+ export async function createLanyard(canvas, hit, options) {
16
+ physicsReady ??= RAPIER.init().catch(error => { physicsReady = undefined; throw error; });
17
+ await physicsReady;
18
+ options.signal.throwIfAborted();
19
+ const renderer = new THREE.WebGLRenderer({ canvas, alpha: true, antialias: true, powerPreference: 'low-power' });
20
+ renderer.setClearColor(0x000000, 0);
21
+ renderer.setPixelRatio(Math.min(devicePixelRatio, 1.5));
22
+ renderer.outputColorSpace = THREE.SRGBColorSpace;
23
+ renderer.toneMapping = THREE.ACESFilmicToneMapping;
24
+ renderer.toneMappingExposure = .95;
25
+ const scene = new THREE.Scene();
26
+ // Local, orthographic card view: position/depth never magnifies the badge.
27
+ // Move its small canvas in CSS; never allocate a viewport-sized GPU target.
28
+ const cardViewSize = 2.8;
29
+ const camera = new THREE.OrthographicCamera(-cardViewSize / 2, cardViewSize / 2, cardViewSize / 2, -cardViewSize / 2, .1, 50);
30
+ camera.position.set(0, 0, 10);
31
+ const pmrem = new THREE.PMREMGenerator(renderer);
32
+ const room = new RoomEnvironment();
33
+ const environment = pmrem.fromScene(room);
34
+ room.dispose();
35
+ pmrem.dispose();
36
+ scene.environment = environment.texture;
37
+ scene.add(new THREE.AmbientLight(0xffffff, 1.2));
38
+ const light = new THREE.DirectionalLight(0xffffff, 3);
39
+ light.position.set(-3, 4, 5);
40
+ scene.add(light);
41
+ const disposables = [environment];
42
+ const keep = (value) => { disposables.push(value); return value; };
43
+ const card = new THREE.Group();
44
+ const shape = roundedRectangle(1.42, 1.96, .14);
45
+ const edge = keep(new THREE.ExtrudeGeometry(shape, { depth: .04, bevelEnabled: true, bevelSegments: 2, steps: 1, bevelSize: .025, bevelThickness: .018, curveSegments: 6 }));
46
+ const edgeMaterial = keep(new THREE.MeshStandardMaterial({ color: 0x667578, metalness: .75, roughness: .28 }));
47
+ card.add(new THREE.Mesh(edge, edgeMaterial));
48
+ const face = keep(new THREE.ShapeGeometry(shape));
49
+ // ShapeGeometry UVs are world coordinates; map the card face to [0,1].
50
+ const positions = face.getAttribute('position'), uv = face.getAttribute('uv');
51
+ for (let i = 0; i < positions.count; i++)
52
+ uv.setXY(i, positions.getX(i) / 1.42 + .5, positions.getY(i) / 1.96 + .5);
53
+ const frontTexture = keep(badgeTexture(false)), backTexture = keep(badgeTexture(true));
54
+ const front = new THREE.Mesh(face, keep(new THREE.MeshPhysicalMaterial({ map: frontTexture, roughness: .64, metalness: .03, clearcoat: .3, clearcoatRoughness: .4, envMapIntensity: .45 })));
55
+ front.position.z = .063;
56
+ card.add(front);
57
+ const back = new THREE.Mesh(face, keep(new THREE.MeshStandardMaterial({ map: backTexture, roughness: .55 })));
58
+ back.rotation.y = Math.PI;
59
+ back.position.z = -.025;
60
+ card.add(back);
61
+ const sheen = keep(createBadgeSheen(card, face));
62
+ const metal = keep(new THREE.MeshStandardMaterial({ color: 0xc3ced0, metalness: .95, roughness: .24 }));
63
+ const ring = new THREE.Mesh(keep(new THREE.TorusGeometry(.115, .035, 6, 16)), metal);
64
+ ring.position.set(0, 1.04, .035);
65
+ card.add(ring);
66
+ const clip = new THREE.Mesh(keep(new THREE.BoxGeometry(.24, .16, .09)), metal);
67
+ clip.position.set(0, .94, .03);
68
+ card.add(clip);
69
+ scene.add(card);
70
+ const { world, beads, badge, bodies } = createLanyardPhysics();
71
+ const noticeMotion = createNoticeMotion(badge);
72
+ const strap = createLanyardStrap(canvas), euler = new THREE.Euler();
73
+ const movingBodies = [badge, ...beads];
74
+ let quietTime = 0, accumulator = 0, disposed = false, scale = 58, canvasSize = 0, messageKey = '';
75
+ let unread = 0, messageIdentity = '';
76
+ let artSource, artRevision = 0;
77
+ let home = canvas.parentElement.getBoundingClientRect();
78
+ let gesture;
79
+ const reduced = matchMedia('(prefers-reduced-motion: reduce)');
80
+ const toWorld = (x, y) => {
81
+ // Cached layout + linear mapping avoids a layout read / matrix inversion
82
+ // on every pointer event, including high-rate mouse and pen input.
83
+ return new THREE.Vector3((x - home.left - home.width / 2) / scale, 1.6 - (y - home.top - home.height / 2) / scale, 0);
84
+ };
85
+ const paint = () => {
86
+ const position = badge.translation();
87
+ card.quaternion.copy(badge.rotation());
88
+ canvas.dataset.facing = String(1 - 2 * (card.quaternion.x ** 2 + card.quaternion.y ** 2));
89
+ const x = home.width / 2 + position.x * scale, y = home.height / 2 + (1.6 - position.y) * scale;
90
+ canvas.style.transform = `translate3d(${home.left + x - canvasSize / 2}px, ${home.top + y - canvasSize / 2}px, 0)`;
91
+ strap.paint(bodies.map(body => body.translation()), home.left + home.width / 2, home.top + home.height / 2 + 1.6 * scale, scale);
92
+ renderer.render(scene, camera);
93
+ euler.setFromQuaternion(card.quaternion);
94
+ hit.style.transform = `translate(${x}px, ${y}px) translate(-50%, -50%) rotate(${-euler.z}rad)`;
95
+ };
96
+ const loop = createPendantFrameLoop((now, dt) => {
97
+ if (disposed || document.hidden)
98
+ return false;
99
+ accumulator += dt;
100
+ if (reduced.matches) {
101
+ noticeMotion.cancel();
102
+ sheen.clear();
103
+ }
104
+ while (accumulator >= LANYARD_STEP) {
105
+ if (noticeMotion.step(LANYARD_STEP, !!gesture))
106
+ sheen.start(now);
107
+ world.step();
108
+ accumulator -= LANYARD_STEP;
109
+ }
110
+ canvas.dataset.noticeMotion = noticeMotion.phase;
111
+ const shining = sheen.update(now, reduced.matches);
112
+ canvas.dataset.shining = String(shining);
113
+ paint();
114
+ const calm = movingBodies.every(body => {
115
+ const v = body.linvel(), a = body.angvel();
116
+ // A stretched kinematic endpoint leaves tiny constraint-solver jitter.
117
+ // Ignore it only while held; free recoil keeps the original thresholds.
118
+ return Math.hypot(v.x, v.y, v.z) < (gesture?.moved ? .06 : .015) && Math.hypot(a.x, a.y, a.z) < .025;
119
+ });
120
+ // A held card may sleep once the rope settles. Pointer movement/release
121
+ // wakes it again; spring positions and stored stretch remain untouched.
122
+ quietTime = calm ? quietTime + dt : 0;
123
+ const moving = quietTime < .8 && movingBodies.some(body => !body.isSleeping());
124
+ const active = moving || shining || (!gesture && noticeMotion.phase !== 'idle');
125
+ canvas.dataset.sleeping = String(!active);
126
+ if (!active) {
127
+ accumulator = 0;
128
+ movingBodies.forEach(body => body.sleep());
129
+ }
130
+ return active;
131
+ });
132
+ const wake = () => {
133
+ if (disposed || document.hidden)
134
+ return;
135
+ quietTime = 0;
136
+ loop.wake();
137
+ };
138
+ const end = (event) => {
139
+ if (!gesture || (event && event.pointerId !== gesture.id))
140
+ return;
141
+ const current = gesture;
142
+ gesture = undefined;
143
+ if (hit.hasPointerCapture(current.id))
144
+ hit.releasePointerCapture(current.id);
145
+ badge.setBodyType(RAPIER.RigidBodyType.Dynamic, true);
146
+ if (current.moved) {
147
+ // Throw velocity is time-based, not pixels per pointer event. A held
148
+ // stretch still recoils through the springs, without a made-up impulse.
149
+ const recent = event?.type === 'pointerup' && performance.now() - current.lastAt < 100;
150
+ badge.setLinvel(recent ? current.velocity : { x: 0, y: 0, z: 0 }, true);
151
+ badge.setAngvel(recent ? current.spin : { x: 0, y: 0, z: 0 }, true);
152
+ for (const body of beads)
153
+ body.wakeUp();
154
+ }
155
+ wake();
156
+ if (!current.moved && event?.type === 'pointerup')
157
+ options.onTap();
158
+ };
159
+ const down = (event) => {
160
+ if (!event.isPrimary || event.button !== 0 || gesture)
161
+ return;
162
+ noticeMotion.cancel();
163
+ sheen.clear();
164
+ event.preventDefault();
165
+ // Programmatic focus during pointerdown was triggering the host theme's
166
+ // keyboard focus rectangle. Keyboard navigation still receives its outline.
167
+ if (document.activeElement === hit)
168
+ hit.blur();
169
+ 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() };
170
+ hit.setPointerCapture(event.pointerId);
171
+ wake();
172
+ };
173
+ const move = (event) => {
174
+ if (!gesture || gesture.id !== event.pointerId)
175
+ return;
176
+ if (!gesture.moved && Math.hypot(event.clientX - gesture.x, event.clientY - gesture.y) < 6)
177
+ return;
178
+ if (!gesture.moved) {
179
+ gesture.moved = true;
180
+ badge.setBodyType(RAPIER.RigidBodyType.KinematicPositionBased, true);
181
+ }
182
+ const target = toWorld(event.clientX, event.clientY).sub(gesture.offset);
183
+ // Free translation plus a virtual grip twist: lateral dragging turns the
184
+ // badge over; its spherical attachment does not force a front-facing pose.
185
+ target.z = 0;
186
+ badge.setNextKinematicTranslation(target);
187
+ badge.setNextKinematicRotation(new THREE.Quaternion().setFromEuler(new THREE.Euler((event.clientY - gesture.y) * .003, (event.clientX - gesture.x) * .016, 0, 'YXZ')).multiply(gesture.rotation));
188
+ const now = performance.now(), dt = Math.max((now - gesture.lastAt) / 1000, 1 / 240);
189
+ gesture.velocity.copy(target).sub(gesture.target).divideScalar(dt).clampLength(0, 35);
190
+ gesture.spin.set((event.clientY - gesture.lastY) * .003 / dt, (event.clientX - gesture.lastX) * .016 / dt, 0).clampLength(0, 18);
191
+ gesture.target.copy(target);
192
+ gesture.lastX = event.clientX;
193
+ gesture.lastY = event.clientY;
194
+ gesture.lastAt = now;
195
+ for (const body of beads)
196
+ body.wakeUp();
197
+ wake();
198
+ };
199
+ const click = (event) => { if (event.detail === 0)
200
+ options.onTap(); };
201
+ const layout = () => {
202
+ home = canvas.parentElement.getBoundingClientRect();
203
+ if (home.width <= 0 || home.height <= 0)
204
+ return;
205
+ // Preserve the old resting size, without the old perspective projection.
206
+ scale = home.height / (20 * Math.tan(Math.PI / 12));
207
+ const nextSize = Math.ceil(scale * cardViewSize);
208
+ if (nextSize !== canvasSize) {
209
+ canvasSize = nextSize;
210
+ renderer.setSize(canvasSize, canvasSize, false);
211
+ canvas.style.width = `${canvasSize}px`;
212
+ canvas.style.height = `${canvasSize}px`;
213
+ }
214
+ hit.style.width = `${Math.max(44, scale * 1.45)}px`;
215
+ hit.style.height = `${Math.max(44, scale * 1.99)}px`;
216
+ strap.resize(scale);
217
+ };
218
+ const resize = () => { layout(); wake(); };
219
+ const hide = () => { end(); if (document.hidden) {
220
+ noticeMotion.cancel();
221
+ sheen.clear();
222
+ loop.stop();
223
+ accumulator = 0;
224
+ }
225
+ else
226
+ wake(); };
227
+ const blur = () => end();
228
+ const lost = (event) => { event.preventDefault(); options.onFailure(); };
229
+ const observer = new ResizeObserver(resize);
230
+ observer.observe(canvas.parentElement);
231
+ reduced.addEventListener('change', wake);
232
+ hit.addEventListener('pointerdown', down);
233
+ hit.addEventListener('pointermove', move);
234
+ hit.addEventListener('pointerup', end);
235
+ hit.addEventListener('pointercancel', end);
236
+ hit.addEventListener('lostpointercapture', end);
237
+ hit.addEventListener('click', click);
238
+ window.addEventListener('blur', blur);
239
+ window.addEventListener('resize', resize);
240
+ document.addEventListener('visibilitychange', hide);
241
+ canvas.addEventListener('webglcontextlost', lost);
242
+ canvas.dataset.ready = 'true';
243
+ resize();
244
+ return {
245
+ setAppearance(settings) {
246
+ if (disposed)
247
+ return;
248
+ loop.setFps(settings.fps);
249
+ canvas.dataset.fps = String(settings.fps);
250
+ strap.setAppearance(settings);
251
+ if (settings.image === artSource)
252
+ return;
253
+ artSource = settings.image;
254
+ const revision = ++artRevision, target = frontTexture.image;
255
+ const restore = () => { drawBadge(target, false); frontTexture.needsUpdate = true; canvas.dataset.art = 'default'; wake(); };
256
+ if (!settings.image) {
257
+ restore();
258
+ return;
259
+ }
260
+ void loadCardImage(settings.image).then(image => {
261
+ if (disposed || revision !== artRevision)
262
+ return;
263
+ target.getContext('2d').drawImage(image, 0, 0, target.width, target.height);
264
+ frontTexture.needsUpdate = true;
265
+ canvas.dataset.art = 'custom';
266
+ wake();
267
+ }).catch(() => { if (!disposed && revision === artRevision)
268
+ restore(); });
269
+ },
270
+ setMessage(message) {
271
+ if (disposed)
272
+ return;
273
+ const key = JSON.stringify(message ?? null);
274
+ if (key === messageKey)
275
+ return;
276
+ messageKey = key;
277
+ const identity = message?.id ?? '';
278
+ if (message?.count && (message.count > unread || (message.count >= unread && identity !== messageIdentity)) && !document.hidden && !reduced.matches) {
279
+ sheen.clear();
280
+ noticeMotion.request();
281
+ }
282
+ if (!message?.count) {
283
+ noticeMotion.cancel();
284
+ sheen.clear();
285
+ }
286
+ unread = message?.count ?? 0;
287
+ messageIdentity = identity;
288
+ drawBadge(backTexture.image, true, message);
289
+ backTexture.needsUpdate = true;
290
+ canvas.dataset.unread = String(message?.count ?? 0);
291
+ wake();
292
+ },
293
+ relayout() { if (!disposed)
294
+ resize(); },
295
+ destroy() {
296
+ if (disposed)
297
+ return;
298
+ end();
299
+ disposed = true;
300
+ loop.stop();
301
+ observer.disconnect();
302
+ reduced.removeEventListener('change', wake);
303
+ hit.removeEventListener('pointerdown', down);
304
+ hit.removeEventListener('pointermove', move);
305
+ hit.removeEventListener('pointerup', end);
306
+ hit.removeEventListener('pointercancel', end);
307
+ hit.removeEventListener('lostpointercapture', end);
308
+ hit.removeEventListener('click', click);
309
+ window.removeEventListener('blur', blur);
310
+ window.removeEventListener('resize', resize);
311
+ document.removeEventListener('visibilitychange', hide);
312
+ canvas.removeEventListener('webglcontextlost', lost);
313
+ strap.destroy();
314
+ for (const disposable of disposables)
315
+ disposable.dispose();
316
+ renderer.dispose();
317
+ renderer.forceContextLoss();
318
+ world.free();
319
+ },
320
+ };
321
+ }
322
+ function roundedRectangle(width, height, radius) {
323
+ const x = -width / 2, y = -height / 2, s = new THREE.Shape();
324
+ s.moveTo(x + radius, y);
325
+ s.lineTo(x + width - radius, y);
326
+ s.quadraticCurveTo(x + width, y, x + width, y + radius);
327
+ s.lineTo(x + width, y + height - radius);
328
+ s.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
329
+ s.lineTo(x + radius, y + height);
330
+ s.quadraticCurveTo(x, y + height, x, y + height - radius);
331
+ s.lineTo(x, y + radius);
332
+ s.quadraticCurveTo(x, y, x + radius, y);
333
+ return s;
334
+ }
335
+ function badgeTexture(back) {
336
+ const canvas = document.createElement('canvas');
337
+ canvas.width = 512;
338
+ canvas.height = 704;
339
+ drawBadge(canvas, back);
340
+ const texture = new THREE.CanvasTexture(canvas);
341
+ texture.colorSpace = THREE.SRGBColorSpace;
342
+ return texture;
343
+ }
344
+ function drawBadge(canvas, back, message) {
345
+ const c = canvas.getContext('2d');
346
+ c.textAlign = 'left';
347
+ c.fillStyle = back ? '#e7e9e6' : '#253235';
348
+ c.fillRect(0, 0, 512, 704);
349
+ if (back && message?.count) {
350
+ const ink = back ? '#253235' : '#f1f3ec', muted = back ? '#405953' : '#b6cbc2';
351
+ c.textAlign = 'center';
352
+ c.fillStyle = muted;
353
+ c.font = '600 56px sans-serif';
354
+ c.fillText('伙伴消息', 256, 104);
355
+ c.fillStyle = back ? '#d0dcd5' : '#405c51';
356
+ c.beginPath();
357
+ c.roundRect(164, 154, 184, 132, 34);
358
+ c.fill();
359
+ c.fillStyle = ink;
360
+ c.font = '600 90px sans-serif';
361
+ c.fillText(message.count > 99 ? '99+' : String(message.count), 256, 252);
362
+ c.font = '600 76px sans-serif';
363
+ const chars = Array.from(message.name), originalLength = chars.length;
364
+ while (chars.length && c.measureText(chars.join('') + (chars.length < originalLength ? '…' : '')).width > 430)
365
+ chars.pop();
366
+ c.fillText(chars.join('') + (chars.length < originalLength ? '…' : ''), 256, 411);
367
+ c.font = '500 74px sans-serif';
368
+ c.fillText(message.label, 256, 514);
369
+ c.fillStyle = muted;
370
+ c.font = '500 52px sans-serif';
371
+ c.fillText('点击查看', 256, 628);
372
+ return;
373
+ }
374
+ c.fillStyle = back ? '#536a65' : '#b6cbc2';
375
+ c.font = '500 28px sans-serif';
376
+ c.fillText('DSH / PARTNER', 49, 90);
377
+ c.beginPath();
378
+ c.arc(256, 305, 116, 0, Math.PI * 2);
379
+ c.fillStyle = back ? '#d5dcda' : '#334749';
380
+ c.fill();
381
+ // Original geometric companion emblem, not an external image request.
382
+ c.fillStyle = back ? '#526663' : '#bfd4c9';
383
+ c.beginPath();
384
+ c.moveTo(179, 338);
385
+ c.lineTo(183, 229);
386
+ c.lineTo(225, 264);
387
+ c.quadraticCurveTo(256, 248, 287, 264);
388
+ c.lineTo(329, 229);
389
+ c.lineTo(333, 338);
390
+ c.quadraticCurveTo(255, 392, 179, 338);
391
+ c.fill();
392
+ c.fillStyle = back ? '#dce4df' : '#263536';
393
+ c.beginPath();
394
+ c.ellipse(228, 314, 9, 19, -.15, 0, Math.PI * 2);
395
+ c.ellipse(284, 314, 9, 19, .15, 0, Math.PI * 2);
396
+ c.fill();
397
+ c.textAlign = 'center';
398
+ c.fillStyle = back ? '#253235' : '#f1f3ec';
399
+ c.font = '600 48px sans-serif';
400
+ c.fillText(back ? 'TAKE A BREAK' : 'WITH YOU', 256, 515);
401
+ c.fillStyle = back ? '#536663' : '#b6c5c1';
402
+ c.font = '24px sans-serif';
403
+ c.fillText(back ? 'A little pause. A little play.' : 'Always a little closer.', 256, 559);
404
+ c.fillStyle = back ? '#b3beb8' : '#6d8b80';
405
+ c.fillRect(213, 608, 86, 5);
406
+ }
407
+ //# 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,2 @@
1
+ export declare function PendantSettingsPanel(): JSX.Element;
2
+ //# sourceMappingURL=settings-panel.d.ts.map
@@ -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