diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/A11yScreenReaderDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/A11yScreenReaderDemo.vue new file mode 100644 index 0000000..e8a5da9 --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/A11yScreenReaderDemo.vue @@ -0,0 +1,246 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/AccessibilityDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/AccessibilityDemo.vue new file mode 100644 index 0000000..0a3b34b --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/AccessibilityDemo.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/I18nFormatDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/I18nFormatDemo.vue new file mode 100644 index 0000000..90eba5a --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/I18nFormatDemo.vue @@ -0,0 +1,303 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/InternationalizationDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/InternationalizationDemo.vue new file mode 100644 index 0000000..15a7afa --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/InternationalizationDemo.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/PollingDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/PollingDemo.vue new file mode 100644 index 0000000..7398d04 --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/PollingDemo.vue @@ -0,0 +1,249 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/SSEDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/SSEDemo.vue new file mode 100644 index 0000000..fe33417 --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/SSEDemo.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/browser-frontend/WebSocketDemo.vue b/docs/.vitepress/theme/components/appendix/browser-frontend/WebSocketDemo.vue new file mode 100644 index 0000000..679b08e --- /dev/null +++ b/docs/.vitepress/theme/components/appendix/browser-frontend/WebSocketDemo.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/docs/.vitepress/theme/components/appendix/canvas-intro/AnimationLoopDemo.vue b/docs/.vitepress/theme/components/appendix/canvas-intro/AnimationLoopDemo.vue index f2db1dd..cf573ea 100644 --- a/docs/.vitepress/theme/components/appendix/canvas-intro/AnimationLoopDemo.vue +++ b/docs/.vitepress/theme/components/appendix/canvas-intro/AnimationLoopDemo.vue @@ -90,41 +90,11 @@ /> -
-

Animation Loop Code / 动画循环代码

-
{{ animationCode }}
-
+ -
-

Animation Principles / 动画原理

- -
+ -
-

- 💡 - 提示: - 动画的本质是快速连续绘制静态画面。Canvas 每秒可以绘制 60 - 帧(60FPS),形成流畅的动画效果。 -

-
+ @@ -565,11 +535,12 @@ onUnmounted(() => { display: flex; justify-content: center; margin: 1.5rem 0; - padding: 1.5rem; + padding: 1rem; background: var(--vp-c-bg); border-radius: 12px; border: 2px solid var(--vp-c-divider); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05); + overflow-x: auto; } canvas { @@ -577,83 +548,7 @@ canvas { border-radius: 6px; background: #ffffff; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); -} - -.code-display { - margin-top: 1.5rem; - padding: 1.25rem; - background: #1e293b; - border-radius: 12px; - overflow-x: auto; - border: 2px solid #334155; -} - -.code-display h4 { - color: #f8fafc; - margin: 0 0 0.75rem 0; - font-size: 0.875rem; - font-weight: 600; -} - -.code-display pre { - margin: 0; -} - -.code-display code { - color: #e2e8f0; - font-family: var(--vp-font-family-mono); - font-size: 0.75rem; - line-height: 1.7; -} - -.explanation { - margin: 1.5rem 0; - padding: 1.25rem; - background: var(--vp-c-bg); - border-radius: 6px; - border: 1px solid var(--vp-c-divider); -} - -.explanation h4 { - margin: 0 0 0.75rem 0; - color: var(--vp-c-text-1); - font-size: 0.875rem; - font-weight: 600; -} - -.explanation ul { - margin: 0; - padding-left: 1.25rem; -} - -.explanation li { - margin-bottom: 0.5rem; - color: var(--vp-c-text-2); - font-size: 0.875rem; - line-height: 1.6; -} - -.info-box { - margin-top: 1.5rem; - padding: 1rem 1.25rem; - background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); - border-radius: 12px; - border-left: 4px solid #f59e0b; - box-shadow: 0 2px 8px rgba(245, 158, 11, 0.2); -} - -.info-box p { - margin: 0; - font-size: 0.875rem; - color: #92400e; - display: flex; - align-items: flex-start; - gap: 0.5rem; - line-height: 1.6; -} - -.info-box .icon { - font-size: 1.125rem; flex-shrink: 0; } + diff --git a/docs/.vitepress/theme/components/appendix/canvas-intro/CanvasBasicsDemo.vue b/docs/.vitepress/theme/components/appendix/canvas-intro/CanvasBasicsDemo.vue index 033c34e..df9a6e5 100644 --- a/docs/.vitepress/theme/components/appendix/canvas-intro/CanvasBasicsDemo.vue +++ b/docs/.vitepress/theme/components/appendix/canvas-intro/CanvasBasicsDemo.vue @@ -127,16 +127,10 @@ /> -
-

Code / 代码

-
{{ currentCode }}
-
+ -
- 💡 - 核心思想:Canvas 是一个位图画布,所有绘制都是像素操作。绘制后无法修改已有内容,只能覆盖或清除重绘。 -
+ @@ -433,75 +427,20 @@ onMounted(() => { display: flex; justify-content: center; margin: 1.5rem 0; - padding: 1.5rem; + padding: 1rem; background: var(--vp-c-bg); border-radius: 12px; border: 2px solid var(--vp-c-divider); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05); + overflow-x: auto; } canvas { border: 3px solid var(--vp-c-divider); border-radius: 6px; background: #ffffff; - max-width: 100%; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); -} - -.code-display { - margin-top: 1.5rem; - padding: 1.25rem; - background: #1e293b; - border-radius: 12px; - overflow-x: auto; - border: 2px solid #334155; -} - -.code-display h4 { - color: #f8fafc; - margin: 0 0 0.75rem 0; - font-size: 0.875rem; - font-weight: 600; -} - -.code-display pre { - margin: 0; -} - -.code-display code { - color: #e2e8f0; - font-family: var(--vp-font-family-mono); - font-size: 0.75rem; - line-height: 1.7; -} - -.info-box { - margin-top: 1.5rem; - background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); - padding: 1rem 1.25rem; - border-radius: 12px; - font-size: 0.875rem; - color: #92400e; - border-left: 4px solid #f59e0b; - display: flex; - gap: 0.5rem; - box-shadow: 0 2px 8px rgba(245, 158, 11, 0.2); -} - -.info-box p { - margin: 0; - display: flex; - align-items: flex-start; - gap: 0.625rem; - line-height: 1.6; -} - -.info-box .icon { - font-size: 1.125rem; flex-shrink: 0; } -.info-box strong { - color: #78350f; -} diff --git a/docs/.vitepress/theme/components/appendix/canvas-intro/CoordinateSystemDemo.vue b/docs/.vitepress/theme/components/appendix/canvas-intro/CoordinateSystemDemo.vue index 0bf09ba..7ed2d22 100644 --- a/docs/.vitepress/theme/components/appendix/canvas-intro/CoordinateSystemDemo.vue +++ b/docs/.vitepress/theme/components/appendix/canvas-intro/CoordinateSystemDemo.vue @@ -74,56 +74,11 @@ /> -
-

Canvas Coordinate System / Canvas 坐标系统

- -
+ -
-

Example Code / 示例代码

-
// 绘制坐标轴
-const canvas = document.getElementById('myCanvas')
-const ctx = canvas.getContext('2d')
+    
 
-// X 轴(红色)
-ctx.strokeStyle = '#e74c3c'
-ctx.lineWidth = 2
-ctx.beginPath()
-ctx.moveTo(0, 0)
-ctx.lineTo(canvas.width, 0)
-ctx.stroke()
-
-// Y 轴(蓝色)
-ctx.strokeStyle = '#3498db'
-ctx.beginPath()
-ctx.moveTo(0, 0)
-ctx.lineTo(0, canvas.height)
-ctx.stroke()
-
-// 绘制点
-ctx.fillStyle = '#2ecc71'
-ctx.beginPath()
-ctx.arc({{ Math.round(selectedPoint?.x || 100) }}, {{ Math.round(selectedPoint?.y || 100) }}, 5, 0, Math.PI * 2)
-ctx.fill()
-
- -
-

- 💡 - 提示: - Canvas 的 Y - 轴方向与传统数学坐标系相反,向下为正。这在处理图形定位时需要特别注意。 -

-
+ @@ -360,11 +315,12 @@ onMounted(() => { display: flex; justify-content: center; margin: 1.5rem 0; - padding: 1.5rem; + padding: 1rem; background: var(--vp-c-bg); border-radius: 12px; border: 2px solid var(--vp-c-divider); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05); + overflow-x: auto; } canvas { @@ -373,83 +329,7 @@ canvas { cursor: crosshair; background: #ffffff; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); -} - -.explanation { - margin: 1.5rem 0; - padding: 1.25rem; - background: var(--vp-c-bg); - border-radius: 6px; - border: 1px solid var(--vp-c-divider); -} - -.explanation h4 { - margin: 0 0 0.75rem 0; - color: var(--vp-c-text-1); - font-size: 0.875rem; - font-weight: 600; -} - -.explanation ul { - margin: 0; - padding-left: 1.25rem; -} - -.explanation li { - margin-bottom: 0.5rem; - color: var(--vp-c-text-2); - font-size: 0.875rem; - line-height: 1.6; -} - -.code-display { - margin-top: 1.5rem; - padding: 1.25rem; - background: #1e293b; - border-radius: 12px; - overflow-x: auto; - border: 2px solid #334155; -} - -.code-display h4 { - color: #f8fafc; - margin: 0 0 0.75rem 0; - font-size: 0.875rem; - font-weight: 600; -} - -.code-display pre { - margin: 0; -} - -.code-display code { - color: #e2e8f0; - font-family: var(--vp-font-family-mono); - font-size: 0.75rem; - line-height: 1.7; -} - -.info-box { - margin-top: 1.5rem; - padding: 1rem 1.25rem; - background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); - border-radius: 12px; - border-left: 4px solid #f59e0b; - box-shadow: 0 2px 8px rgba(245, 158, 11, 0.2); -} - -.info-box p { - margin: 0; - font-size: 0.875rem; - color: #92400e; - display: flex; - align-items: flex-start; - gap: 0.5rem; - line-height: 1.6; -} - -.info-box .icon { - font-size: 1.125rem; flex-shrink: 0; } + diff --git a/docs/.vitepress/theme/components/appendix/canvas-intro/EventHandlingDemo.vue b/docs/.vitepress/theme/components/appendix/canvas-intro/EventHandlingDemo.vue index 7c5bc45..a47ba31 100644 --- a/docs/.vitepress/theme/components/appendix/canvas-intro/EventHandlingDemo.vue +++ b/docs/.vitepress/theme/components/appendix/canvas-intro/EventHandlingDemo.vue @@ -87,32 +87,9 @@ /> -
-

Event Handling Code / 事件处理代码

-
{{ currentCode }}
-
+ -
-

Event Handling Tips / 事件处理要点

- -
+ @@ -647,11 +624,12 @@ onMounted(() => { display: flex; justify-content: center; margin: 1.5rem 0; - padding: 1.5rem; + padding: 1rem; background: var(--vp-c-bg); border-radius: 12px; border: 2px solid var(--vp-c-divider); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05); + overflow-x: auto; } canvas { @@ -661,63 +639,11 @@ canvas { outline: none; background: #ffffff; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + flex-shrink: 0; } canvas:focus { border-color: var(--vp-c-brand); } -.code-display { - margin-top: 1.5rem; - padding: 1.25rem; - background: #1e293b; - border-radius: 12px; - overflow-x: auto; - border: 2px solid #334155; -} - -.code-display h4 { - color: #f8fafc; - margin: 0 0 0.75rem 0; - font-size: 0.875rem; - font-weight: 600; -} - -.code-display pre { - margin: 0; -} - -.code-display code { - color: #e2e8f0; - font-family: var(--vp-font-family-mono); - font-size: 0.75rem; - line-height: 1.7; -} - -.explanation { - margin: 1.5rem 0; - padding: 1.25rem; - background: var(--vp-c-bg); - border-radius: 6px; - border: 1px solid var(--vp-c-divider); -} - -.explanation h4 { - margin: 0 0 0.75rem 0; - color: var(--vp-c-text-1); - font-size: 0.875rem; - font-weight: 600; -} - -.explanation ul { - margin: 0; - padding-left: 1.25rem; -} - -.explanation li { - margin-bottom: 0.5rem; - color: var(--vp-c-text-2); - font-size: 0.875rem; - line-height: 1.6; -} diff --git a/docs/.vitepress/theme/components/appendix/canvas-intro/ParticleSystemDemo.vue b/docs/.vitepress/theme/components/appendix/canvas-intro/ParticleSystemDemo.vue index f343392..2c02269 100644 --- a/docs/.vitepress/theme/components/appendix/canvas-intro/ParticleSystemDemo.vue +++ b/docs/.vitepress/theme/components/appendix/canvas-intro/ParticleSystemDemo.vue @@ -102,40 +102,11 @@ /> -
-

Particle System Code / 粒子系统代码

-
{{ particleCode }}
-
+ -
-

Particle System Tips / 粒子系统要点

- -
+ -
-

- 💡 - 提示: - 移动鼠标或点击画布来产生粒子!不同的效果有不同的交互方式。 -

-
+ @@ -513,11 +484,12 @@ onUnmounted(() => { display: flex; justify-content: center; margin: 1.5rem 0; - padding: 1.5rem; + padding: 1rem; background: var(--vp-c-bg); border-radius: 12px; border: 2px solid var(--vp-c-divider); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05); + overflow-x: auto; } canvas { @@ -526,83 +498,7 @@ canvas { cursor: crosshair; background: #ffffff; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); -} - -.code-display { - margin-top: 1.5rem; - padding: 1.25rem; - background: #1e293b; - border-radius: 12px; - overflow-x: auto; - border: 2px solid #334155; -} - -.code-display h4 { - color: #f8fafc; - margin: 0 0 0.75rem 0; - font-size: 0.875rem; - font-weight: 600; -} - -.code-display pre { - margin: 0; -} - -.code-display code { - color: #e2e8f0; - font-family: var(--vp-font-family-mono); - font-size: 0.75rem; - line-height: 1.7; -} - -.explanation { - margin: 1.5rem 0; - padding: 1.25rem; - background: var(--vp-c-bg); - border-radius: 6px; - border: 1px solid var(--vp-c-divider); -} - -.explanation h4 { - margin: 0 0 0.75rem 0; - color: var(--vp-c-text-1); - font-size: 0.875rem; - font-weight: 600; -} - -.explanation ul { - margin: 0; - padding-left: 1.25rem; -} - -.explanation li { - margin-bottom: 0.5rem; - color: var(--vp-c-text-2); - font-size: 0.875rem; - line-height: 1.6; -} - -.info-box { - margin-top: 1.5rem; - padding: 1rem 1.25rem; - background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%); - border-radius: 12px; - border-left: 4px solid #f59e0b; - box-shadow: 0 2px 8px rgba(245, 158, 11, 0.2); -} - -.info-box p { - margin: 0; - font-size: 0.875rem; - color: #92400e; - display: flex; - align-items: flex-start; - gap: 0.5rem; - line-height: 1.6; -} - -.info-box .icon { - font-size: 1.125rem; flex-shrink: 0; } + diff --git a/docs/.vitepress/theme/components/appendix/canvas-intro/PerformanceDemo.vue b/docs/.vitepress/theme/components/appendix/canvas-intro/PerformanceDemo.vue index 50539bd..0e57395 100644 --- a/docs/.vitepress/theme/components/appendix/canvas-intro/PerformanceDemo.vue +++ b/docs/.vitepress/theme/components/appendix/canvas-intro/PerformanceDemo.vue @@ -174,36 +174,9 @@ -
-

Optimization Code / 优化代码

-
{{ optimizationCode }}
-
+ -
-

Performance Tips / 性能优化要点

- -
+ @@ -755,11 +728,12 @@ onUnmounted(() => { display: flex; justify-content: center; margin: 1.5rem 0; - padding: 1.5rem; + padding: 1rem; background: var(--vp-c-bg); border-radius: 12px; border: 2px solid var(--vp-c-divider); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.05); + overflow-x: auto; } canvas { @@ -767,6 +741,7 @@ canvas { border-radius: 6px; background: #ffffff; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); + flex-shrink: 0; } .comparison { @@ -812,57 +787,4 @@ canvas { color: var(--vp-c-text-2); } -.code-display { - margin-top: 1.5rem; - padding: 1.25rem; - background: #1e293b; - border-radius: 12px; - overflow-x: auto; - border: 2px solid #334155; -} - -.code-display h4 { - color: #f8fafc; - margin: 0 0 0.75rem 0; - font-size: 0.875rem; - font-weight: 600; -} - -.code-display pre { - margin: 0; -} - -.code-display code { - color: #e2e8f0; - font-family: var(--vp-font-family-mono); - font-size: 0.75rem; - line-height: 1.7; -} - -.explanation { - margin: 1.5rem 0; - padding: 1.25rem; - background: var(--vp-c-bg); - border-radius: 6px; - border: 1px solid var(--vp-c-divider); -} - -.explanation h4 { - margin: 0 0 0.75rem 0; - color: var(--vp-c-text-1); - font-size: 0.875rem; - font-weight: 600; -} - -.explanation ul { - margin: 0; - padding-left: 1.25rem; -} - -.explanation li { - margin-bottom: 0.5rem; - color: var(--vp-c-text-2); - font-size: 0.875rem; - line-height: 1.6; -} diff --git a/docs/.vitepress/theme/components/appendix/data/ABTestingDemo.vue b/docs/.vitepress/theme/components/appendix/data/ABTestingDemo.vue index 54ba30d..ffe0c7b 100644 --- a/docs/.vitepress/theme/components/appendix/data/ABTestingDemo.vue +++ b/docs/.vitepress/theme/components/appendix/data/ABTestingDemo.vue @@ -1,18 +1,17 @@