desktop-team-doc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +89 -0
  2. package/content/docs/README.md +227 -0
  3. package/content/docs/index.md +352 -0
  4. package/content/docs/instructions/coding-conventions/.clang-format +65 -0
  5. package/content/docs/instructions/coding-conventions/cpp.md +132 -0
  6. package/content/docs/instructions/coding-conventions/frontend.md +612 -0
  7. package/content/docs/instructions/coding-conventions/team-wide.md +176 -0
  8. package/content/docs/instructions/workflows/assets/jira-1.png +0 -0
  9. package/content/docs/instructions/workflows/assets/jira-comment.png +0 -0
  10. package/content/docs/instructions/workflows/assets/jira-release-note.png +0 -0
  11. package/content/docs/instructions/workflows/assets/jira-tag.png +0 -0
  12. package/content/docs/instructions/workflows/code-review.md +451 -0
  13. package/content/docs/instructions/workflows/git-branch-convention.md +246 -0
  14. package/content/docs/instructions/workflows/git-commit.md +95 -0
  15. package/content/docs/instructions/workflows/jira-process.md +173 -0
  16. package/content/docs/instructions/workflows/jira-ticket-guide.md +105 -0
  17. package/content/docs/instructions/workflows/pull-request-generation.md +319 -0
  18. package/content/docs/instructions/workflows/scrum-process.md +104 -0
  19. package/content/docs/instructions/workflows/survey-project-setup.md +76 -0
  20. package/content/docs/knowledge/architecture/README.md +11 -0
  21. package/content/docs/knowledge/architecture/audio-plugin-architecture.md +213 -0
  22. package/content/docs/knowledge/architecture/cross-platform-design.md +176 -0
  23. package/content/docs/knowledge/architecture/frontend-native-bridge.md +193 -0
  24. package/content/docs/knowledge/architecture/native-command.md +189 -0
  25. package/content/docs/knowledge/architecture/state-management-architecture.md +105 -0
  26. package/content/docs/knowledge/component-library/ControlComponent/README.md +281 -0
  27. package/content/docs/knowledge/component-library/ControlComponent/accessibility/accessibility-implementation.md +503 -0
  28. package/content/docs/knowledge/component-library/ControlComponent/common-mechanisms.md +278 -0
  29. package/content/docs/knowledge/component-library/ControlComponent/core/error-handling.md +451 -0
  30. package/content/docs/knowledge/component-library/ControlComponent/core/native-interface.md +515 -0
  31. package/content/docs/knowledge/component-library/ControlComponent/core/state-management.md +509 -0
  32. package/content/docs/knowledge/component-library/ControlComponent/creating-new-controls.md +654 -0
  33. package/content/docs/knowledge/component-library/ControlComponent/design/api-design-reference.md +1142 -0
  34. package/content/docs/knowledge/component-library/ControlComponent/design/design-principles.md +336 -0
  35. package/content/docs/knowledge/component-library/ControlComponent/design/styling-architecture.md +595 -0
  36. package/content/docs/knowledge/component-library/ControlComponent/design/visual-feedback.md +456 -0
  37. package/content/docs/knowledge/component-library/ControlComponent/development-environment.md +213 -0
  38. package/content/docs/knowledge/component-library/ControlComponent/interaction/gesture-algorithms.md +705 -0
  39. package/content/docs/knowledge/component-library/ControlComponent/interaction/touch-support.md +525 -0
  40. package/content/docs/knowledge/component-library/ControlComponent/interaction/value-processing-patterns.md +801 -0
  41. package/content/docs/knowledge/component-library/ControlComponent/interaction/velocity-damping-systems.md +741 -0
  42. package/content/docs/knowledge/component-library/ControlComponent/knob/architecture.md +490 -0
  43. package/content/docs/knowledge/component-library/ControlComponent/knob/how-to-use.md +304 -0
  44. package/content/docs/knowledge/component-library/ControlComponent/knob/index.md +105 -0
  45. package/content/docs/knowledge/component-library/ControlComponent/optimization/performance-benchmarks.md +535 -0
  46. package/content/docs/knowledge/component-library/ControlComponent/optimization/performance-optimization.md +1092 -0
  47. package/content/docs/knowledge/component-library/ControlComponent/quick-start.md +345 -0
  48. package/content/docs/knowledge/component-library/ControlComponent/slider/architecture.md +444 -0
  49. package/content/docs/knowledge/component-library/ControlComponent/slider/how-to-use.md +470 -0
  50. package/content/docs/knowledge/component-library/ControlComponent/slider/index.md +107 -0
  51. package/content/docs/knowledge/component-library/ControlComponent/testing-guide.md +950 -0
  52. package/content/docs/knowledge/component-library/ControlComponent/troubleshooting.md +657 -0
  53. package/content/docs/knowledge/component-library/frontend-develop/LICENSE.txt +176 -0
  54. package/content/docs/knowledge/component-library/frontend-develop/SKILL.md +124 -0
  55. package/content/docs/knowledge/component-library/frontend-develop/references/code-organization.md +620 -0
  56. package/content/docs/knowledge/component-library/frontend-develop/references/coding-standards.md +275 -0
  57. package/content/docs/knowledge/component-library/frontend-develop/references/component-reusability.md +559 -0
  58. package/content/docs/knowledge/component-library/frontend-develop/references/examples.md +554 -0
  59. package/content/docs/knowledge/component-library/frontend-develop/references/layout-separation.md +638 -0
  60. package/content/docs/knowledge/component-library/frontend-develop/references/performance-optimization.md +678 -0
  61. package/content/docs/knowledge/component-library/frontend-develop/references/state-management.md +331 -0
  62. package/content/docs/knowledge/component-library/frontend-develop/references/styling-guidelines.md +349 -0
  63. package/content/docs/knowledge/component-library/frontend-develop/references/type-safety.md +493 -0
  64. package/content/docs/knowledge/development/assets/cyberduck-aws-credentials.png +0 -0
  65. package/content/docs/knowledge/development/assets/postman-environment-setup.png +0 -0
  66. package/content/docs/knowledge/development/aws-storage.md +95 -0
  67. package/content/docs/knowledge/development/crm-system.md +22 -0
  68. package/content/docs/knowledge/development/glossary.md +246 -0
  69. package/content/docs/knowledge/development/pg-api-guide.md +71 -0
  70. package/content/docs/knowledge/development/staging-license-management.md +44 -0
  71. package/content/docs/knowledge/development/tech-stack.md +240 -0
  72. package/content/docs/knowledge/domain/popup-system.md +106 -0
  73. package/content/docs/knowledge/domain/sigpath.md +264 -0
  74. package/content/docs/knowledge/environment-setup/aax-signing-update.md +149 -0
  75. package/content/docs/knowledge/environment-setup/assets/aax-1.png +0 -0
  76. package/content/docs/knowledge/environment-setup/assets/aax-2.png +0 -0
  77. package/content/docs/knowledge/environment-setup/assets/aax-3.png +0 -0
  78. package/content/docs/knowledge/environment-setup/assets/aax-4.png +0 -0
  79. package/content/docs/knowledge/environment-setup/assets/aax-5.png +0 -0
  80. package/content/docs/knowledge/environment-setup/assets/aax-6.png +0 -0
  81. package/content/docs/knowledge/environment-setup/assets/aax-7.png +0 -0
  82. package/content/docs/knowledge/environment-setup/assets/buildmachine-1.png +0 -0
  83. package/content/docs/knowledge/environment-setup/assets/buildmachine-10.png +0 -0
  84. package/content/docs/knowledge/environment-setup/assets/buildmachine-11.png +0 -0
  85. package/content/docs/knowledge/environment-setup/assets/buildmachine-12.png +0 -0
  86. package/content/docs/knowledge/environment-setup/assets/buildmachine-13.png +0 -0
  87. package/content/docs/knowledge/environment-setup/assets/buildmachine-14.png +0 -0
  88. package/content/docs/knowledge/environment-setup/assets/buildmachine-2.png +0 -0
  89. package/content/docs/knowledge/environment-setup/assets/buildmachine-3.png +0 -0
  90. package/content/docs/knowledge/environment-setup/assets/buildmachine-4.png +0 -0
  91. package/content/docs/knowledge/environment-setup/assets/buildmachine-5.png +0 -0
  92. package/content/docs/knowledge/environment-setup/assets/buildmachine-6.png +0 -0
  93. package/content/docs/knowledge/environment-setup/assets/buildmachine-7.png +0 -0
  94. package/content/docs/knowledge/environment-setup/assets/buildmachine-8.png +0 -0
  95. package/content/docs/knowledge/environment-setup/assets/buildmachine-9.png +0 -0
  96. package/content/docs/knowledge/environment-setup/build-machine-setup.md +224 -0
  97. package/content/docs/knowledge/environment-setup/build-machine-troubleshooting.md +193 -0
  98. package/content/docs/knowledge/implementation-guides/adding-amp.md +190 -0
  99. package/content/docs/knowledge/implementation-guides/adding-fx.md +111 -0
  100. package/content/docs/knowledge/implementation-guides/cab-integration.md +194 -0
  101. package/content/docs/knowledge/implementation-guides/custom-pedal-integration.md +309 -0
  102. package/content/docs/knowledge/projects/BIAS_ONE_GUI/README.md +17 -0
  103. package/content/manifest.json +122 -0
  104. package/content/rules/cpp.mdc +135 -0
  105. package/content/rules/frontend.mdc +615 -0
  106. package/content/rules/index.mdc +256 -0
  107. package/content/rules/knowledge.mdc +46 -0
  108. package/content/rules/team-wide.mdc +179 -0
  109. package/content/rules/workflows.mdc +43 -0
  110. package/content/tools/agents/context-compressor.md +357 -0
  111. package/content/tools/agents/context-writer.md +328 -0
  112. package/content/tools/agents/release-notes-generator.md +389 -0
  113. package/content/tools/agents/srs-writer-agent.md +63 -0
  114. package/content/tools/mcp/README.md +25 -0
  115. package/content/tools/mcp/mcp-desktop-team.example.json +13 -0
  116. package/content/tools/skills/frontend-develop/LICENSE.txt +176 -0
  117. package/content/tools/skills/frontend-develop/SKILL.md +124 -0
  118. package/content/tools/skills/frontend-develop/references/code-organization.md +620 -0
  119. package/content/tools/skills/frontend-develop/references/coding-standards.md +275 -0
  120. package/content/tools/skills/frontend-develop/references/component-reusability.md +559 -0
  121. package/content/tools/skills/frontend-develop/references/examples.md +554 -0
  122. package/content/tools/skills/frontend-develop/references/layout-separation.md +638 -0
  123. package/content/tools/skills/frontend-develop/references/performance-optimization.md +678 -0
  124. package/content/tools/skills/frontend-develop/references/state-management.md +331 -0
  125. package/content/tools/skills/frontend-develop/references/styling-guidelines.md +349 -0
  126. package/content/tools/skills/frontend-develop/references/type-safety.md +493 -0
  127. package/content/tools/slash-commands/commit.md +17 -0
  128. package/content/tools/slash-commands/context-compress.md +149 -0
  129. package/content/tools/slash-commands/context-write.md +92 -0
  130. package/content/tools/slash-commands/jira.md +12 -0
  131. package/content/tools/slash-commands/pr-gen.md +12 -0
  132. package/content/tools/slash-commands/pr-review.md +12 -0
  133. package/dist/commands/detect.d.ts +1 -0
  134. package/dist/commands/detect.js +33 -0
  135. package/dist/commands/install.d.ts +1 -0
  136. package/dist/commands/install.js +100 -0
  137. package/dist/commands/uninstall.d.ts +1 -0
  138. package/dist/commands/uninstall.js +132 -0
  139. package/dist/index.d.ts +2 -0
  140. package/dist/index.js +53 -0
  141. package/dist/lib/detect-env.d.ts +3 -0
  142. package/dist/lib/detect-env.js +52 -0
  143. package/dist/lib/prompt-env.d.ts +3 -0
  144. package/dist/lib/prompt-env.js +16 -0
  145. package/dist/lib/resolve-doc-repo.d.ts +14 -0
  146. package/dist/lib/resolve-doc-repo.js +61 -0
  147. package/dist/lib/symlink.d.ts +7 -0
  148. package/dist/lib/symlink.js +60 -0
  149. package/dist/lib/sync-from-manifest.d.ts +8 -0
  150. package/dist/lib/sync-from-manifest.js +64 -0
  151. package/package.json +46 -0
@@ -0,0 +1,444 @@
1
+ # Slider 元件架構分析
2
+
3
+ 本文件深入分析 Slider 控制元件的核心架構,包括狀態管理、視覺更新機制和互動處理流程。
4
+
5
+ ---
6
+
7
+ ## 核心架構
8
+
9
+ ### 1. 元件結構
10
+
11
+ ```typescript
12
+ interface SliderProps {
13
+ pid: number; // 參數 ID
14
+ label?: string; // 標籤文字
15
+ orientation?: 'horizontal' | 'vertical';
16
+ showValue?: boolean; // 顯示數值
17
+ showLabel?: boolean; // 顯示標籤
18
+ showMeter?: boolean; // 顯示音量表
19
+ meterValue?: number; // 音量表值
20
+ sensitivity?: number; // 拖曳靈敏度
21
+ preciseSensitivity?: number; // 精確模式靈敏度
22
+ stepped?: boolean; // 步進模式
23
+ steps?: string[] | number[]; // 步進選項
24
+ disabled?: boolean;
25
+ }
26
+
27
+ const Slider: React.FC<SliderProps> = (props) => {
28
+ // 1. 從 Native Interface 取得參數狀態
29
+ const {
30
+ value,
31
+ displayValue,
32
+ setValue,
33
+ beginGesture,
34
+ endGesture,
35
+ resetToDefault,
36
+ } = useParameter({ pid: props.pid });
37
+
38
+ // 2. 本地視覺狀態
39
+ const containerRef = useRef<HTMLDivElement>(null);
40
+ const trackRef = useRef<HTMLDivElement>(null);
41
+ const isDraggingRef = useRef(false);
42
+
43
+ // 3. 計算填充百分比
44
+ const fillPercentage = props.orientation === 'vertical'
45
+ ? `${value * 100}%`
46
+ : `${value * 100}%`;
47
+ };
48
+ ```
49
+
50
+ ### 2. 狀態層級
51
+
52
+ ```
53
+ ┌─────────────────────────────────────────────────────────────────┐
54
+ │ 元件狀態層級 │
55
+ ├─────────────────────────────────────────────────────────────────┤
56
+ │ │
57
+ │ 1. Native Interface 狀態 (透過 useParameter) │
58
+ │ - value: 0-1 正規化參數值 │
59
+ │ - displayValue: 格式化顯示值 │
60
+ │ │
61
+ │ 2. 本地 Ref 狀態 (不觸發渲染) │
62
+ │ - isDraggingRef: 拖曳狀態 │
63
+ │ - startValueRef: 拖曳開始時的值 │
64
+ │ - startPositionRef: 拖曳開始位置 │
65
+ │ │
66
+ │ 3. CSS 變數狀態 (視覺更新) │
67
+ │ - --value-normalized: 正規化值 │
68
+ │ - --fill-percentage: 填充百分比 │
69
+ │ │
70
+ └─────────────────────────────────────────────────────────────────┘
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 視覺結構
76
+
77
+ ### DOM 結構
78
+
79
+ ```html
80
+ <div class="slider slider--horizontal" data-dragging="false">
81
+ <!-- 軌道 -->
82
+ <div class="slider__track">
83
+ <!-- 填充區域 -->
84
+ <div class="slider__fill"></div>
85
+ <!-- 把手 -->
86
+ <div class="slider__thumb"></div>
87
+ </div>
88
+
89
+ <!-- 音量表 (可選) -->
90
+ <div class="slider__meter">
91
+ <div class="slider__meter-fill"></div>
92
+ </div>
93
+
94
+ <!-- 標籤 (可選) -->
95
+ <div class="slider__label">Volume</div>
96
+
97
+ <!-- 數值顯示 (可選) -->
98
+ <div class="slider__value">-6.0 dB</div>
99
+ </div>
100
+ ```
101
+
102
+ ### CSS 變數驅動
103
+
104
+ ```css
105
+ .slider {
106
+ --slider-track-length: 200px;
107
+ --slider-track-thickness: 4px;
108
+ --slider-thumb-size: 16px;
109
+ --value-normalized: 0;
110
+ }
111
+
112
+ .slider__fill {
113
+ /* 根據方向設定填充 */
114
+ width: calc(var(--value-normalized) * 100%);
115
+ }
116
+
117
+ .slider--vertical .slider__fill {
118
+ width: 100%;
119
+ height: calc(var(--value-normalized) * 100%);
120
+ }
121
+
122
+ .slider__thumb {
123
+ /* 把手位置跟隨數值 */
124
+ left: calc(var(--value-normalized) * 100%);
125
+ transform: translateX(-50%);
126
+ }
127
+
128
+ .slider--vertical .slider__thumb {
129
+ left: 50%;
130
+ bottom: calc(var(--value-normalized) * 100%);
131
+ transform: translate(-50%, 50%);
132
+ }
133
+ ```
134
+
135
+ ---
136
+
137
+ ## 互動機制
138
+
139
+ ### 1. 位置計算
140
+
141
+ ```typescript
142
+ interface PositionCalculator {
143
+ (e: PointerEvent, track: HTMLElement): number;
144
+ }
145
+
146
+ // 水平滑桿:X 軸位置
147
+ const calculateHorizontalPosition: PositionCalculator = (e, track) => {
148
+ const rect = track.getBoundingClientRect();
149
+ const relativeX = e.clientX - rect.left;
150
+ return Math.max(0, Math.min(1, relativeX / rect.width));
151
+ };
152
+
153
+ // 垂直滑桿:Y 軸位置(注意方向反轉)
154
+ const calculateVerticalPosition: PositionCalculator = (e, track) => {
155
+ const rect = track.getBoundingClientRect();
156
+ const relativeY = rect.bottom - e.clientY;
157
+ return Math.max(0, Math.min(1, relativeY / rect.height));
158
+ };
159
+
160
+ // 統一的位置計算器
161
+ const getPosition = (
162
+ e: PointerEvent,
163
+ track: HTMLElement,
164
+ orientation: 'horizontal' | 'vertical'
165
+ ): number => {
166
+ return orientation === 'horizontal'
167
+ ? calculateHorizontalPosition(e, track)
168
+ : calculateVerticalPosition(e, track);
169
+ };
170
+ ```
171
+
172
+ ### 2. 拖曳操作
173
+
174
+ ```typescript
175
+ const useSliderDrag = (
176
+ pid: number,
177
+ setValue: (value: number) => void,
178
+ options: SliderOptions
179
+ ) => {
180
+ const trackRef = useRef<HTMLDivElement>(null);
181
+ const stateRef = useRef({
182
+ isDragging: false,
183
+ startValue: 0,
184
+ });
185
+
186
+ const handlePointerDown = useCallback((e: PointerEvent) => {
187
+ const track = trackRef.current;
188
+ if (!track) return;
189
+
190
+ e.preventDefault();
191
+
192
+ // 1. 開始手勢
193
+ beginGesture();
194
+
195
+ // 2. 計算點擊位置的值
196
+ const clickValue = getPosition(e, track, options.orientation);
197
+
198
+ // 3. 根據模式決定行為
199
+ if (options.clickBehavior === 'jump') {
200
+ // 直接跳到點擊位置
201
+ setValue(clickValue);
202
+ stateRef.current.startValue = clickValue;
203
+ } else {
204
+ // 記錄當前值,等待拖曳
205
+ stateRef.current.startValue = value;
206
+ }
207
+
208
+ stateRef.current.isDragging = true;
209
+ (e.target as HTMLElement).setPointerCapture(e.pointerId);
210
+ }, [options, value, setValue, beginGesture]);
211
+
212
+ const handlePointerMove = useCallback((e: PointerEvent) => {
213
+ const track = trackRef.current;
214
+ if (!track || !stateRef.current.isDragging) return;
215
+
216
+ const newValue = getPosition(e, track, options.orientation);
217
+
218
+ // 精確模式處理
219
+ const isPrecise = e.ctrlKey || e.metaKey;
220
+ if (isPrecise) {
221
+ // 精確模式:相對於起始值的細微調整
222
+ const delta = (newValue - stateRef.current.startValue) * options.preciseFactor;
223
+ setValue(Math.max(0, Math.min(1, stateRef.current.startValue + delta)));
224
+ } else {
225
+ // 正常模式:直接使用位置
226
+ setValue(newValue);
227
+ }
228
+
229
+ updateVisual(newValue);
230
+ }, [options, setValue]);
231
+
232
+ const handlePointerUp = useCallback((e: PointerEvent) => {
233
+ if (!stateRef.current.isDragging) return;
234
+
235
+ stateRef.current.isDragging = false;
236
+ (e.target as HTMLElement).releasePointerCapture(e.pointerId);
237
+
238
+ endGesture();
239
+ }, [endGesture]);
240
+
241
+ return { trackRef };
242
+ };
243
+ ```
244
+
245
+ ### 3. 滾輪操作
246
+
247
+ ```typescript
248
+ const useSliderWheel = (
249
+ value: number,
250
+ setValue: (value: number) => void,
251
+ options: WheelOptions
252
+ ) => {
253
+ const handleWheel = useCallback((e: WheelEvent) => {
254
+ e.preventDefault();
255
+
256
+ // 1. 判斷精確模式
257
+ const isPrecise = e.ctrlKey || e.metaKey;
258
+ const sensitivity = isPrecise
259
+ ? options.preciseWheelSensitivity
260
+ : options.wheelSensitivity;
261
+
262
+ // 2. 計算差值
263
+ let delta = e.deltaY * sensitivity;
264
+
265
+ // 3. 處理平台差異
266
+ if (isMac) {
267
+ const isInverted = (e as any).webkitDirectionInvertedFromDevice;
268
+ if (!isInverted) delta = -delta;
269
+ }
270
+
271
+ // 4. 方向處理
272
+ if (options.orientation === 'vertical') {
273
+ delta = -delta; // 垂直滑桿向上應增加值
274
+ }
275
+
276
+ // 5. 計算新值
277
+ const newValue = Math.max(0, Math.min(1, value - delta));
278
+ setValue(newValue);
279
+ }, [value, setValue, options]);
280
+
281
+ return { onWheel: handleWheel };
282
+ };
283
+ ```
284
+
285
+ ---
286
+
287
+ ## 音量表系統
288
+
289
+ ### 音量表結構
290
+
291
+ ```typescript
292
+ interface MeterConfig {
293
+ enabled: boolean;
294
+ value: number; // 0-1,音量電平
295
+ peakValue?: number; // 峰值保持
296
+ peakHoldTime?: number; // 峰值保持時間 (ms)
297
+ warningThreshold: number; // 警告閾值 (如 0.8)
298
+ dangerThreshold: number; // 危險閾值 (如 0.95)
299
+ }
300
+ ```
301
+
302
+ ### 音量表渲染
303
+
304
+ ```typescript
305
+ const SliderMeter: React.FC<MeterProps> = ({
306
+ value,
307
+ peakValue,
308
+ warningThreshold = 0.8,
309
+ dangerThreshold = 0.95,
310
+ orientation,
311
+ }) => {
312
+ // 計算顏色區域
313
+ const getMeterColor = (level: number) => {
314
+ if (level >= dangerThreshold) return 'var(--meter-danger-color)';
315
+ if (level >= warningThreshold) return 'var(--meter-warning-color)';
316
+ return 'var(--meter-safe-color)';
317
+ };
318
+
319
+ return (
320
+ <div
321
+ className="slider__meter"
322
+ style={{
323
+ '--meter-value': value,
324
+ '--meter-peak': peakValue ?? value,
325
+ '--meter-color': getMeterColor(value),
326
+ } as React.CSSProperties}
327
+ >
328
+ <div className="slider__meter-fill" />
329
+ {peakValue && <div className="slider__meter-peak" />}
330
+ </div>
331
+ );
332
+ };
333
+ ```
334
+
335
+ ### CSS 樣式
336
+
337
+ ```css
338
+ .slider__meter {
339
+ position: absolute;
340
+ /* 根據方向定位 */
341
+ }
342
+
343
+ .slider__meter-fill {
344
+ background: linear-gradient(
345
+ to top,
346
+ var(--meter-safe-color) 0%,
347
+ var(--meter-safe-color) calc(var(--meter-warning-threshold) * 100%),
348
+ var(--meter-warning-color) calc(var(--meter-warning-threshold) * 100%),
349
+ var(--meter-warning-color) calc(var(--meter-danger-threshold) * 100%),
350
+ var(--meter-danger-color) calc(var(--meter-danger-threshold) * 100%),
351
+ var(--meter-danger-color) 100%
352
+ );
353
+ height: calc(var(--meter-value) * 100%);
354
+ }
355
+
356
+ .slider__meter-peak {
357
+ position: absolute;
358
+ width: 100%;
359
+ height: 2px;
360
+ bottom: calc(var(--meter-peak) * 100%);
361
+ background: var(--meter-danger-color);
362
+ }
363
+ ```
364
+
365
+ ---
366
+
367
+ ## 效能最佳化
368
+
369
+ ### 1. CSS 變數更新
370
+
371
+ ```typescript
372
+ const updateVisual = useCallback((value: number) => {
373
+ const container = containerRef.current;
374
+ if (!container) return;
375
+
376
+ // 直接更新 CSS 變數,繞過 React
377
+ container.style.setProperty('--value-normalized', String(value));
378
+ }, []);
379
+ ```
380
+
381
+ ### 2. 節流更新
382
+
383
+ ```typescript
384
+ // 視覺更新:每幀
385
+ // Native 更新:節流
386
+ const throttledSetValue = useThrottle(setValue, 16);
387
+
388
+ const handleMove = (newValue: number) => {
389
+ updateVisual(newValue); // 立即
390
+ throttledSetValue(newValue); // 節流
391
+ };
392
+ ```
393
+
394
+ ### 3. 拖曳狀態樣式
395
+
396
+ ```css
397
+ /* 拖曳時禁用過渡動畫 */
398
+ .slider[data-dragging="true"] .slider__fill,
399
+ .slider[data-dragging="true"] .slider__thumb {
400
+ transition: none;
401
+ }
402
+
403
+ /* 非拖曳時啟用過渡 */
404
+ .slider:not([data-dragging="true"]) .slider__fill,
405
+ .slider:not([data-dragging="true"]) .slider__thumb {
406
+ transition: all 100ms ease-out;
407
+ }
408
+ ```
409
+
410
+ ---
411
+
412
+ ## 常數配置
413
+
414
+ ```typescript
415
+ export const SLIDER_CONSTANTS = {
416
+ // 靈敏度
417
+ DEFAULT_SENSITIVITY: 1,
418
+ PRECISE_FACTOR: 0.1,
419
+ WHEEL_SENSITIVITY: 0.001,
420
+ PRECISE_WHEEL_SENSITIVITY: 0.0002,
421
+
422
+ // 軌道尺寸
423
+ DEFAULT_TRACK_LENGTH: 200,
424
+ DEFAULT_TRACK_THICKNESS: 4,
425
+ DEFAULT_THUMB_SIZE: 16,
426
+
427
+ // 音量表
428
+ METER_WARNING_THRESHOLD: 0.8,
429
+ METER_DANGER_THRESHOLD: 0.95,
430
+ PEAK_HOLD_TIME: 1500,
431
+
432
+ // 節流
433
+ UPDATE_THROTTLE_MS: 16,
434
+ };
435
+ ```
436
+
437
+ ---
438
+
439
+ ## 相關文件
440
+
441
+ - [手勢處理演算法](../interaction/gesture-algorithms.md) - 詳細手勢演算法
442
+ - [數值處理模式](../interaction/value-processing-patterns.md) - 數值轉換詳解
443
+ - [效能最佳化策略](../optimization/performance-optimization.md) - 更多優化技巧
444
+ - [API 設計參考](../design/api-design-reference.md) - 完整 Props 定義