feat:themes, tactilea codec

This commit is contained in:
lenn
2026-04-03 16:40:48 +08:00
parent 7688986ad7
commit 80ccc6e70d
42 changed files with 881 additions and 551 deletions

View File

@@ -2,7 +2,7 @@
Date : 2026-04-01 16:39:17
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 47 files, 8908 codes, 94 comments, 1250 blanks, all 10252 lines

View File

@@ -2,7 +2,7 @@
Date : 2026-04-01 16:39:17
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines

View File

@@ -2,7 +2,7 @@
Date : 2026-04-01 16:39:17
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines

View File

@@ -1,5 +1,5 @@
Date : 2026-04-01 16:39:17
Directory : e:\Workspace\joyson-serial
Directory : e:\Workspace\JE-Skin
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
Languages

View File

@@ -1,49 +1,49 @@
"filename", "language", "JavaScript", "JSON", "Markdown", "JSON with Comments", "XML", "TypeScript", "Svelte", "Rust", "PostCSS", "HTML", "comment", "blank", "total"
"e:\Workspace\joyson-serial\.idea\modules.xml", "XML", 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8
"e:\Workspace\joyson-serial\.idea\tauri-demo.iml", "XML", 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11
"e:\Workspace\joyson-serial\README.md", "Markdown", 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 20, 54
"e:\Workspace\joyson-serial\flowus_tools.json", "JSON", 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2
"e:\Workspace\joyson-serial\frontend_prompt.md", "Markdown", 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255
"e:\Workspace\joyson-serial\package-lock.json", "JSON", 0, 1957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1958
"e:\Workspace\joyson-serial\package.json", "JSON", 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32
"e:\Workspace\joyson-serial\src-tauri\build.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 4
"e:\Workspace\joyson-serial\src-tauri\capabilities\default.json", "JSON", 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16
"e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 3
"e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 44, 290
"e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 6, 33
"e:\Workspace\joyson-serial\src-tauri\src\lib.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 2, 24
"e:\Workspace\joyson-serial\src-tauri\src\log.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 2, 36
"e:\Workspace\joyson-serial\src-tauri\src\main.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 1, 2, 11
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 7
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 5
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 17, 84
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 7, 40, 260
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 6, 53
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 3, 9, 58
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 7, 29
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 377, 0, 0, 57, 67, 501
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 4, 11, 65
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 8, 81
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 6, 32
"e:\Workspace\joyson-serial\src-tauri\tauri.conf.json", "JSON", 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37
"e:\Workspace\joyson-serial\src\app.html", "HTML", 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 1, 14
"e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 691, 0, 0, 0, 0, 96, 787
"e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 63, 461
"e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 861, 0, 0, 0, 0, 110, 971
"e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 558, 0, 0, 0, 0, 97, 655
"e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 71, 453
"e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0, 88, 585
"e:\Workspace\joyson-serial\src\lib\config\color-map.ts", "TypeScript", 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 3, 58
"e:\Workspace\joyson-serial\src\lib\styles\theme.css", "PostCSS", 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 1, 7, 51
"e:\Workspace\joyson-serial\src\lib\types\hud.ts", "TypeScript", 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 20, 146
"e:\Workspace\joyson-serial\src\routes\+layout.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 5, 18
"e:\Workspace\joyson-serial\src\routes\+layout.ts", "TypeScript", 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 6
"e:\Workspace\joyson-serial\src\routes\+page.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 1286, 0, 0, 0, 0, 176, 1462
"e:\Workspace\joyson-serial\static\svelte.svg", "XML", 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\joyson-serial\static\tauri.svg", "XML", 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 1, 7
"e:\Workspace\joyson-serial\static\vite.svg", "XML", 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\joyson-serial\svelte.config.js", "JavaScript", 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 19
"e:\Workspace\joyson-serial\tauri-event.md", "Markdown", 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, 0, 181, 555
"e:\Workspace\joyson-serial\tsconfig.json", "JSON with Comments", 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 5, 1, 20
"e:\Workspace\joyson-serial\vite.config.js", "JavaScript", 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 33
"e:\Workspace\JE-Skin\.idea\modules.xml", "XML", 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8
"e:\Workspace\JE-Skin\.idea\tauri-demo.iml", "XML", 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 11
"e:\Workspace\JE-Skin\README.md", "Markdown", 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 20, 54
"e:\Workspace\JE-Skin\flowus_tools.json", "JSON", 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2
"e:\Workspace\JE-Skin\frontend_prompt.md", "Markdown", 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255
"e:\Workspace\JE-Skin\package-lock.json", "JSON", 0, 1957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1958
"e:\Workspace\JE-Skin\package.json", "JSON", 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32
"e:\Workspace\JE-Skin\src-tauri\build.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 4
"e:\Workspace\JE-Skin\src-tauri\capabilities\default.json", "JSON", 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16
"e:\Workspace\JE-Skin\src-tauri\src\commands\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 3
"e:\Workspace\JE-Skin\src-tauri\src\commands\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 44, 290
"e:\Workspace\JE-Skin\src-tauri\src\commands\window.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 6, 33
"e:\Workspace\JE-Skin\src-tauri\src\lib.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 2, 24
"e:\Workspace\JE-Skin\src-tauri\src\log.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 2, 36
"e:\Workspace\JE-Skin\src-tauri\src\main.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 1, 2, 11
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codec.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 1, 7
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 5
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 17, 84
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 7, 40, 260
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 6, 53
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 3, 9, 58
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 7, 29
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\model.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 377, 0, 0, 57, 67, 501
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\record.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 4, 11, 65
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 8, 81
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs", "Rust", 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 6, 32
"e:\Workspace\JE-Skin\src-tauri\tauri.conf.json", "JSON", 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37
"e:\Workspace\JE-Skin\src\app.html", "HTML", 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 1, 14
"e:\Workspace\JE-Skin\src\lib\components\CenterStage.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 691, 0, 0, 0, 0, 96, 787
"e:\Workspace\JE-Skin\src\lib\components\ConfigPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 63, 461
"e:\Workspace\JE-Skin\src\lib\components\HudPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 861, 0, 0, 0, 0, 110, 971
"e:\Workspace\JE-Skin\src\lib\components\PressureMatrixViewer.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 558, 0, 0, 0, 0, 97, 655
"e:\Workspace\JE-Skin\src\lib\components\SignalChart.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 71, 453
"e:\Workspace\JE-Skin\src\lib\components\SummaryCurve.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0, 88, 585
"e:\Workspace\JE-Skin\src\lib\config\color-map.ts", "TypeScript", 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 3, 58
"e:\Workspace\JE-Skin\src\lib\styles\theme.css", "PostCSS", 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 1, 7, 51
"e:\Workspace\JE-Skin\src\lib\types\hud.ts", "TypeScript", 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 20, 146
"e:\Workspace\JE-Skin\src\routes\+layout.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 5, 18
"e:\Workspace\JE-Skin\src\routes\+layout.ts", "TypeScript", 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 6
"e:\Workspace\JE-Skin\src\routes\+page.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 1286, 0, 0, 0, 0, 176, 1462
"e:\Workspace\JE-Skin\static\svelte.svg", "XML", 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\JE-Skin\static\tauri.svg", "XML", 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 1, 7
"e:\Workspace\JE-Skin\static\vite.svg", "XML", 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\JE-Skin\svelte.config.js", "JavaScript", 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 19
"e:\Workspace\JE-Skin\tauri-event.md", "Markdown", 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, 0, 181, 555
"e:\Workspace\JE-Skin\tsconfig.json", "JSON with Comments", 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 5, 1, 20
"e:\Workspace\JE-Skin\vite.config.js", "JavaScript", 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 33
"Total", "-", 33, 2040, 597, 14, 27, 182, 4686, 1273, 43, 13, 94, 1250, 10252
1 filename language JavaScript JSON Markdown JSON with Comments XML TypeScript Svelte Rust PostCSS HTML comment blank total
2 e:\Workspace\joyson-serial\.idea\modules.xml e:\Workspace\JE-Skin\.idea\modules.xml XML 0 0 0 0 8 0 0 0 0 0 0 0 8
3 e:\Workspace\joyson-serial\.idea\tauri-demo.iml e:\Workspace\JE-Skin\.idea\tauri-demo.iml XML 0 0 0 0 11 0 0 0 0 0 0 0 11
4 e:\Workspace\joyson-serial\README.md e:\Workspace\JE-Skin\README.md Markdown 0 0 34 0 0 0 0 0 0 0 0 20 54
5 e:\Workspace\joyson-serial\flowus_tools.json e:\Workspace\JE-Skin\flowus_tools.json JSON 0 1 0 0 0 0 0 0 0 0 0 1 2
6 e:\Workspace\joyson-serial\frontend_prompt.md e:\Workspace\JE-Skin\frontend_prompt.md Markdown 0 0 189 0 0 0 0 0 0 0 0 66 255
7 e:\Workspace\joyson-serial\package-lock.json e:\Workspace\JE-Skin\package-lock.json JSON 0 1957 0 0 0 0 0 0 0 0 0 1 1958
8 e:\Workspace\joyson-serial\package.json e:\Workspace\JE-Skin\package.json JSON 0 31 0 0 0 0 0 0 0 0 0 1 32
9 e:\Workspace\joyson-serial\src-tauri\build.rs e:\Workspace\JE-Skin\src-tauri\build.rs Rust 0 0 0 0 0 0 0 3 0 0 0 1 4
10 e:\Workspace\joyson-serial\src-tauri\capabilities\default.json e:\Workspace\JE-Skin\src-tauri\capabilities\default.json JSON 0 15 0 0 0 0 0 0 0 0 0 1 16
11 e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs e:\Workspace\JE-Skin\src-tauri\src\commands\mod.rs Rust 0 0 0 0 0 0 0 2 0 0 0 1 3
12 e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs e:\Workspace\JE-Skin\src-tauri\src\commands\serial.rs Rust 0 0 0 0 0 0 0 246 0 0 0 44 290
13 e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs e:\Workspace\JE-Skin\src-tauri\src\commands\window.rs Rust 0 0 0 0 0 0 0 27 0 0 0 6 33
14 e:\Workspace\joyson-serial\src-tauri\src\lib.rs e:\Workspace\JE-Skin\src-tauri\src\lib.rs Rust 0 0 0 0 0 0 0 22 0 0 0 2 24
15 e:\Workspace\joyson-serial\src-tauri\src\log.rs e:\Workspace\JE-Skin\src-tauri\src\log.rs Rust 0 0 0 0 0 0 0 34 0 0 0 2 36
16 e:\Workspace\joyson-serial\src-tauri\src\main.rs e:\Workspace\JE-Skin\src-tauri\src\main.rs Rust 0 0 0 0 0 0 0 8 0 0 1 2 11
17 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codec.rs Rust 0 0 0 0 0 0 0 6 0 0 0 1 7
18 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\mod.rs Rust 0 0 0 0 0 0 0 4 0 0 0 1 5
19 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs Rust 0 0 0 0 0 0 0 67 0 0 0 17 84
20 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs Rust 0 0 0 0 0 0 0 213 0 0 7 40 260
21 e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs Rust 0 0 0 0 0 0 0 47 0 0 0 6 53
22 e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs Rust 0 0 0 0 0 0 0 46 0 0 3 9 58
23 e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\mod.rs Rust 0 0 0 0 0 0 0 22 0 0 0 7 29
24 e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\model.rs Rust 0 0 0 0 0 0 0 377 0 0 57 67 501
25 e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\record.rs Rust 0 0 0 0 0 0 0 50 0 0 4 11 65
26 e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs Rust 0 0 0 0 0 0 0 73 0 0 0 8 81
27 e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs Rust 0 0 0 0 0 0 0 26 0 0 0 6 32
28 e:\Workspace\joyson-serial\src-tauri\tauri.conf.json e:\Workspace\JE-Skin\src-tauri\tauri.conf.json JSON 0 36 0 0 0 0 0 0 0 0 0 1 37
29 e:\Workspace\joyson-serial\src\app.html e:\Workspace\JE-Skin\src\app.html HTML 0 0 0 0 0 0 0 0 0 13 0 1 14
30 e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte e:\Workspace\JE-Skin\src\lib\components\CenterStage.svelte Svelte 0 0 0 0 0 0 691 0 0 0 0 96 787
31 e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte e:\Workspace\JE-Skin\src\lib\components\ConfigPanel.svelte Svelte 0 0 0 0 0 0 398 0 0 0 0 63 461
32 e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte e:\Workspace\JE-Skin\src\lib\components\HudPanel.svelte Svelte 0 0 0 0 0 0 861 0 0 0 0 110 971
33 e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte e:\Workspace\JE-Skin\src\lib\components\PressureMatrixViewer.svelte Svelte 0 0 0 0 0 0 558 0 0 0 0 97 655
34 e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte e:\Workspace\JE-Skin\src\lib\components\SignalChart.svelte Svelte 0 0 0 0 0 0 382 0 0 0 0 71 453
35 e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte e:\Workspace\JE-Skin\src\lib\components\SummaryCurve.svelte Svelte 0 0 0 0 0 0 497 0 0 0 0 88 585
36 e:\Workspace\joyson-serial\src\lib\config\color-map.ts e:\Workspace\JE-Skin\src\lib\config\color-map.ts TypeScript 0 0 0 0 0 55 0 0 0 0 0 3 58
37 e:\Workspace\joyson-serial\src\lib\styles\theme.css e:\Workspace\JE-Skin\src\lib\styles\theme.css PostCSS 0 0 0 0 0 0 0 0 43 0 1 7 51
38 e:\Workspace\joyson-serial\src\lib\types\hud.ts e:\Workspace\JE-Skin\src\lib\types\hud.ts TypeScript 0 0 0 0 0 126 0 0 0 0 0 20 146
39 e:\Workspace\joyson-serial\src\routes\+layout.svelte e:\Workspace\JE-Skin\src\routes\+layout.svelte Svelte 0 0 0 0 0 0 13 0 0 0 0 5 18
40 e:\Workspace\joyson-serial\src\routes\+layout.ts e:\Workspace\JE-Skin\src\routes\+layout.ts TypeScript 0 0 0 0 0 1 0 0 0 0 4 1 6
41 e:\Workspace\joyson-serial\src\routes\+page.svelte e:\Workspace\JE-Skin\src\routes\+page.svelte Svelte 0 0 0 0 0 0 1286 0 0 0 0 176 1462
42 e:\Workspace\joyson-serial\static\svelte.svg e:\Workspace\JE-Skin\static\svelte.svg XML 0 0 0 0 1 0 0 0 0 0 0 0 1
43 e:\Workspace\joyson-serial\static\tauri.svg e:\Workspace\JE-Skin\static\tauri.svg XML 0 0 0 0 6 0 0 0 0 0 0 1 7
44 e:\Workspace\joyson-serial\static\vite.svg e:\Workspace\JE-Skin\static\vite.svg XML 0 0 0 0 1 0 0 0 0 0 0 0 1
45 e:\Workspace\joyson-serial\svelte.config.js e:\Workspace\JE-Skin\svelte.config.js JavaScript 11 0 0 0 0 0 0 0 0 0 5 3 19
46 e:\Workspace\joyson-serial\tauri-event.md e:\Workspace\JE-Skin\tauri-event.md Markdown 0 0 374 0 0 0 0 0 0 0 0 181 555
47 e:\Workspace\joyson-serial\tsconfig.json e:\Workspace\JE-Skin\tsconfig.json JSON with Comments 0 0 0 14 0 0 0 0 0 0 5 1 20
48 e:\Workspace\joyson-serial\vite.config.js e:\Workspace\JE-Skin\vite.config.js JavaScript 22 0 0 0 0 0 0 0 0 0 7 4 33
49 Total - 33 2040 597 14 27 182 4686 1273 43 13 94 1250 10252

File diff suppressed because one or more lines are too long

View File

@@ -2,7 +2,7 @@
Date : 2026-04-01 16:39:17
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 47 files, 8908 codes, 94 comments, 1250 blanks, all 10252 lines

View File

@@ -1,5 +1,5 @@
Date : 2026-04-01 16:39:17
Directory : e:\Workspace\joyson-serial
Directory : e:\Workspace\JE-Skin
Total : 47 files, 8908 codes, 94 comments, 1250 blanks, all 10252 lines
Languages
@@ -49,52 +49,52 @@ Files
+---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
| e:\Workspace\joyson-serial\.idea\modules.xml | XML | 8 | 0 | 0 | 8 |
| e:\Workspace\joyson-serial\.idea\tauri-demo.iml | XML | 11 | 0 | 0 | 11 |
| e:\Workspace\joyson-serial\README.md | Markdown | 34 | 0 | 20 | 54 |
| e:\Workspace\joyson-serial\flowus_tools.json | JSON | 1 | 0 | 1 | 2 |
| e:\Workspace\joyson-serial\frontend_prompt.md | Markdown | 189 | 0 | 66 | 255 |
| e:\Workspace\joyson-serial\package-lock.json | JSON | 1,957 | 0 | 1 | 1,958 |
| e:\Workspace\joyson-serial\package.json | JSON | 31 | 0 | 1 | 32 |
| e:\Workspace\joyson-serial\src-tauri\build.rs | Rust | 3 | 0 | 1 | 4 |
| e:\Workspace\joyson-serial\src-tauri\capabilities\default.json | JSON | 15 | 0 | 1 | 16 |
| e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs | Rust | 2 | 0 | 1 | 3 |
| e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs | Rust | 246 | 0 | 44 | 290 |
| e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs | Rust | 27 | 0 | 6 | 33 |
| e:\Workspace\joyson-serial\src-tauri\src\lib.rs | Rust | 22 | 0 | 2 | 24 |
| e:\Workspace\joyson-serial\src-tauri\src\log.rs | Rust | 34 | 0 | 2 | 36 |
| e:\Workspace\joyson-serial\src-tauri\src\main.rs | Rust | 8 | 1 | 2 | 11 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs | Rust | 6 | 0 | 1 | 7 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs | Rust | 4 | 0 | 1 | 5 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 67 | 0 | 17 | 84 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs | Rust | 213 | 7 | 40 | 260 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs | Rust | 47 | 0 | 6 | 53 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs | Rust | 46 | 3 | 9 | 58 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs | Rust | 22 | 0 | 7 | 29 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs | Rust | 377 | 57 | 67 | 501 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs | Rust | 50 | 4 | 11 | 65 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs | Rust | 73 | 0 | 8 | 81 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs | Rust | 26 | 0 | 6 | 32 |
| e:\Workspace\joyson-serial\src-tauri\tauri.conf.json | JSON | 36 | 0 | 1 | 37 |
| e:\Workspace\joyson-serial\src\app.html | HTML | 13 | 0 | 1 | 14 |
| e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte | Svelte | 691 | 0 | 96 | 787 |
| e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte | Svelte | 398 | 0 | 63 | 461 |
| e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte | Svelte | 861 | 0 | 110 | 971 |
| e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte | Svelte | 558 | 0 | 97 | 655 |
| e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte | Svelte | 382 | 0 | 71 | 453 |
| e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte | Svelte | 497 | 0 | 88 | 585 |
| e:\Workspace\joyson-serial\src\lib\config\color-map.ts | TypeScript | 55 | 0 | 3 | 58 |
| e:\Workspace\joyson-serial\src\lib\styles\theme.css | PostCSS | 43 | 1 | 7 | 51 |
| e:\Workspace\joyson-serial\src\lib\types\hud.ts | TypeScript | 126 | 0 | 20 | 146 |
| e:\Workspace\joyson-serial\src\routes\+layout.svelte | Svelte | 13 | 0 | 5 | 18 |
| e:\Workspace\joyson-serial\src\routes\+layout.ts | TypeScript | 1 | 4 | 1 | 6 |
| e:\Workspace\joyson-serial\src\routes\+page.svelte | Svelte | 1,286 | 0 | 176 | 1,462 |
| e:\Workspace\joyson-serial\static\svelte.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\joyson-serial\static\tauri.svg | XML | 6 | 0 | 1 | 7 |
| e:\Workspace\joyson-serial\static\vite.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\joyson-serial\svelte.config.js | JavaScript | 11 | 5 | 3 | 19 |
| e:\Workspace\joyson-serial\tauri-event.md | Markdown | 374 | 0 | 181 | 555 |
| e:\Workspace\joyson-serial\tsconfig.json | JSON with Comments | 14 | 5 | 1 | 20 |
| e:\Workspace\joyson-serial\vite.config.js | JavaScript | 22 | 7 | 4 | 33 |
| e:\Workspace\JE-Skin\.idea\modules.xml | XML | 8 | 0 | 0 | 8 |
| e:\Workspace\JE-Skin\.idea\tauri-demo.iml | XML | 11 | 0 | 0 | 11 |
| e:\Workspace\JE-Skin\README.md | Markdown | 34 | 0 | 20 | 54 |
| e:\Workspace\JE-Skin\flowus_tools.json | JSON | 1 | 0 | 1 | 2 |
| e:\Workspace\JE-Skin\frontend_prompt.md | Markdown | 189 | 0 | 66 | 255 |
| e:\Workspace\JE-Skin\package-lock.json | JSON | 1,957 | 0 | 1 | 1,958 |
| e:\Workspace\JE-Skin\package.json | JSON | 31 | 0 | 1 | 32 |
| e:\Workspace\JE-Skin\src-tauri\build.rs | Rust | 3 | 0 | 1 | 4 |
| e:\Workspace\JE-Skin\src-tauri\capabilities\default.json | JSON | 15 | 0 | 1 | 16 |
| e:\Workspace\JE-Skin\src-tauri\src\commands\mod.rs | Rust | 2 | 0 | 1 | 3 |
| e:\Workspace\JE-Skin\src-tauri\src\commands\serial.rs | Rust | 246 | 0 | 44 | 290 |
| e:\Workspace\JE-Skin\src-tauri\src\commands\window.rs | Rust | 27 | 0 | 6 | 33 |
| e:\Workspace\JE-Skin\src-tauri\src\lib.rs | Rust | 22 | 0 | 2 | 24 |
| e:\Workspace\JE-Skin\src-tauri\src\log.rs | Rust | 34 | 0 | 2 | 36 |
| e:\Workspace\JE-Skin\src-tauri\src\main.rs | Rust | 8 | 1 | 2 | 11 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codec.rs | Rust | 6 | 0 | 1 | 7 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\mod.rs | Rust | 4 | 0 | 1 | 5 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 67 | 0 | 17 | 84 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs | Rust | 213 | 7 | 40 | 260 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs | Rust | 47 | 0 | 6 | 53 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs | Rust | 46 | 3 | 9 | 58 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\mod.rs | Rust | 22 | 0 | 7 | 29 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\model.rs | Rust | 377 | 57 | 67 | 501 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\record.rs | Rust | 50 | 4 | 11 | 65 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs | Rust | 73 | 0 | 8 | 81 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs | Rust | 26 | 0 | 6 | 32 |
| e:\Workspace\JE-Skin\src-tauri\tauri.conf.json | JSON | 36 | 0 | 1 | 37 |
| e:\Workspace\JE-Skin\src\app.html | HTML | 13 | 0 | 1 | 14 |
| e:\Workspace\JE-Skin\src\lib\components\CenterStage.svelte | Svelte | 691 | 0 | 96 | 787 |
| e:\Workspace\JE-Skin\src\lib\components\ConfigPanel.svelte | Svelte | 398 | 0 | 63 | 461 |
| e:\Workspace\JE-Skin\src\lib\components\HudPanel.svelte | Svelte | 861 | 0 | 110 | 971 |
| e:\Workspace\JE-Skin\src\lib\components\PressureMatrixViewer.svelte | Svelte | 558 | 0 | 97 | 655 |
| e:\Workspace\JE-Skin\src\lib\components\SignalChart.svelte | Svelte | 382 | 0 | 71 | 453 |
| e:\Workspace\JE-Skin\src\lib\components\SummaryCurve.svelte | Svelte | 497 | 0 | 88 | 585 |
| e:\Workspace\JE-Skin\src\lib\config\color-map.ts | TypeScript | 55 | 0 | 3 | 58 |
| e:\Workspace\JE-Skin\src\lib\styles\theme.css | PostCSS | 43 | 1 | 7 | 51 |
| e:\Workspace\JE-Skin\src\lib\types\hud.ts | TypeScript | 126 | 0 | 20 | 146 |
| e:\Workspace\JE-Skin\src\routes\+layout.svelte | Svelte | 13 | 0 | 5 | 18 |
| e:\Workspace\JE-Skin\src\routes\+layout.ts | TypeScript | 1 | 4 | 1 | 6 |
| e:\Workspace\JE-Skin\src\routes\+page.svelte | Svelte | 1,286 | 0 | 176 | 1,462 |
| e:\Workspace\JE-Skin\static\svelte.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\JE-Skin\static\tauri.svg | XML | 6 | 0 | 1 | 7 |
| e:\Workspace\JE-Skin\static\vite.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\JE-Skin\svelte.config.js | JavaScript | 11 | 5 | 3 | 19 |
| e:\Workspace\JE-Skin\tauri-event.md | Markdown | 374 | 0 | 181 | 555 |
| e:\Workspace\JE-Skin\tsconfig.json | JSON with Comments | 14 | 5 | 1 | 20 |
| e:\Workspace\JE-Skin\vite.config.js | JavaScript | 22 | 7 | 4 | 33 |
| Total | | 8,908 | 94 | 1,250 | 10,252 |
+---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+

View File

@@ -2,7 +2,7 @@
Date : 2026-04-02 14:42:07
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 47 files, 9155 codes, 95 comments, 1279 blanks, all 10529 lines

View File

@@ -2,7 +2,7 @@
Date : 2026-04-02 14:42:07
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 6 files, 247 codes, 1 comments, 29 blanks, all 277 lines

View File

@@ -1,8 +1,8 @@
"filename", "language", "Rust", "comment", "blank", "total"
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 153, 0, 11, 164
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs", "Rust", 2, 1, -2, 1
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs", "Rust", 2, 0, 0, 2
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs", "Rust", 1, 0, -1, 0
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs", "Rust", 68, 0, 14, 82
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs", "Rust", 21, 0, 7, 28
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 153, 0, 11, 164
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs", "Rust", 2, 1, -2, 1
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs", "Rust", 2, 0, 0, 2
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs", "Rust", 1, 0, -1, 0
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs", "Rust", 68, 0, 14, 82
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs", "Rust", 21, 0, 7, 28
"Total", "-", 247, 1, 29, 277
1 filename language Rust comment blank total
2 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs Rust 153 0 11 164
3 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs Rust 2 1 -2 1
4 e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs Rust 2 0 0 2
5 e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs Rust 1 0 -1 0
6 e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs Rust 68 0 14 82
7 e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs Rust 21 0 7 28
8 Total - 247 1 29 277

View File

@@ -2,7 +2,7 @@
Date : 2026-04-02 14:42:07
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 6 files, 247 codes, 1 comments, 29 blanks, all 277 lines

View File

@@ -1,5 +1,5 @@
Date : 2026-04-02 14:42:07
Directory : e:\Workspace\joyson-serial
Directory : e:\Workspace\JE-Skin
Total : 6 files, 247 codes, 1 comments, 29 blanks, all 277 lines
Languages
@@ -25,11 +25,11 @@ Files
+--------------------------------------------------------------------------+----------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+--------------------------------------------------------------------------+----------+------------+------------+------------+------------+
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 153 | 0 | 11 | 164 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs | Rust | 2 | 1 | -2 | 1 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs | Rust | 2 | 0 | 0 | 2 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs | Rust | 1 | 0 | -1 | 0 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs | Rust | 68 | 0 | 14 | 82 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs | Rust | 21 | 0 | 7 | 28 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 153 | 0 | 11 | 164 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs | Rust | 2 | 1 | -2 | 1 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs | Rust | 2 | 0 | 0 | 2 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs | Rust | 1 | 0 | -1 | 0 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs | Rust | 68 | 0 | 14 | 82 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs | Rust | 21 | 0 | 7 | 28 |
| Total | | 247 | 1 | 29 | 277 |
+--------------------------------------------------------------------------+----------+------------+------------+------------+------------+

View File

@@ -1,49 +1,49 @@
"filename", "language", "Markdown", "JSON with Comments", "JSON", "XML", "JavaScript", "HTML", "Rust", "TypeScript", "Svelte", "PostCSS", "comment", "blank", "total"
"e:\Workspace\joyson-serial\.idea\modules.xml", "XML", 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8
"e:\Workspace\joyson-serial\.idea\tauri-demo.iml", "XML", 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11
"e:\Workspace\joyson-serial\README.md", "Markdown", 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 54
"e:\Workspace\joyson-serial\flowus_tools.json", "JSON", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2
"e:\Workspace\joyson-serial\frontend_prompt.md", "Markdown", 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255
"e:\Workspace\joyson-serial\package-lock.json", "JSON", 0, 0, 1957, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1958
"e:\Workspace\joyson-serial\package.json", "JSON", 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32
"e:\Workspace\joyson-serial\src-tauri\build.rs", "Rust", 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 4
"e:\Workspace\joyson-serial\src-tauri\capabilities\default.json", "JSON", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16
"e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 3
"e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 44, 290
"e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs", "Rust", 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 6, 33
"e:\Workspace\joyson-serial\src-tauri\src\lib.rs", "Rust", 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 2, 24
"e:\Workspace\joyson-serial\src-tauri\src\log.rs", "Rust", 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 2, 36
"e:\Workspace\joyson-serial\src-tauri\src\main.rs", "Rust", 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 1, 2, 11
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs", "Rust", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 7
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 5
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 28, 248
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs", "Rust", 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 8, 38, 261
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs", "Rust", 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 6, 55
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs", "Rust", 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 3, 8, 58
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 7, 29
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs", "Rust", 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 57, 67, 501
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs", "Rust", 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 4, 11, 65
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 22, 163
"e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs", "Rust", 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 13, 60
"e:\Workspace\joyson-serial\src-tauri\tauri.conf.json", "JSON", 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37
"e:\Workspace\joyson-serial\src\app.html", "HTML", 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 1, 14
"e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 691, 0, 0, 96, 787
"e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 63, 461
"e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 861, 0, 0, 110, 971
"e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 97, 655
"e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 382, 0, 0, 71, 453
"e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, 88, 585
"e:\Workspace\joyson-serial\src\lib\config\color-map.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 3, 58
"e:\Workspace\joyson-serial\src\lib\styles\theme.css", "PostCSS", 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 1, 7, 51
"e:\Workspace\joyson-serial\src\lib\types\hud.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 20, 146
"e:\Workspace\joyson-serial\src\routes\+layout.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 5, 18
"e:\Workspace\joyson-serial\src\routes\+layout.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 1, 6
"e:\Workspace\joyson-serial\src\routes\+page.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 1286, 0, 0, 176, 1462
"e:\Workspace\joyson-serial\static\svelte.svg", "XML", 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\joyson-serial\static\tauri.svg", "XML", 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 7
"e:\Workspace\joyson-serial\static\vite.svg", "XML", 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\joyson-serial\svelte.config.js", "JavaScript", 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 5, 3, 19
"e:\Workspace\joyson-serial\tauri-event.md", "Markdown", 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 555
"e:\Workspace\joyson-serial\tsconfig.json", "JSON with Comments", 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 20
"e:\Workspace\joyson-serial\vite.config.js", "JavaScript", 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 7, 4, 33
"e:\Workspace\JE-Skin\.idea\modules.xml", "XML", 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 8
"e:\Workspace\JE-Skin\.idea\tauri-demo.iml", "XML", 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 11
"e:\Workspace\JE-Skin\README.md", "Markdown", 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 54
"e:\Workspace\JE-Skin\flowus_tools.json", "JSON", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2
"e:\Workspace\JE-Skin\frontend_prompt.md", "Markdown", 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 255
"e:\Workspace\JE-Skin\package-lock.json", "JSON", 0, 0, 1957, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1958
"e:\Workspace\JE-Skin\package.json", "JSON", 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32
"e:\Workspace\JE-Skin\src-tauri\build.rs", "Rust", 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 4
"e:\Workspace\JE-Skin\src-tauri\capabilities\default.json", "JSON", 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16
"e:\Workspace\JE-Skin\src-tauri\src\commands\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 3
"e:\Workspace\JE-Skin\src-tauri\src\commands\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 44, 290
"e:\Workspace\JE-Skin\src-tauri\src\commands\window.rs", "Rust", 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 6, 33
"e:\Workspace\JE-Skin\src-tauri\src\lib.rs", "Rust", 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 2, 24
"e:\Workspace\JE-Skin\src-tauri\src\log.rs", "Rust", 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 2, 36
"e:\Workspace\JE-Skin\src-tauri\src\main.rs", "Rust", 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 1, 2, 11
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codec.rs", "Rust", 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 7
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 5
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs", "Rust", 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 28, 248
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs", "Rust", 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 8, 38, 261
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs", "Rust", 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 6, 55
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs", "Rust", 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 3, 8, 58
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\mod.rs", "Rust", 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 7, 29
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\model.rs", "Rust", 0, 0, 0, 0, 0, 0, 377, 0, 0, 0, 57, 67, 501
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\record.rs", "Rust", 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 4, 11, 65
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs", "Rust", 0, 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 22, 163
"e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs", "Rust", 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 13, 60
"e:\Workspace\JE-Skin\src-tauri\tauri.conf.json", "JSON", 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37
"e:\Workspace\JE-Skin\src\app.html", "HTML", 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 1, 14
"e:\Workspace\JE-Skin\src\lib\components\CenterStage.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 691, 0, 0, 96, 787
"e:\Workspace\JE-Skin\src\lib\components\ConfigPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 63, 461
"e:\Workspace\JE-Skin\src\lib\components\HudPanel.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 861, 0, 0, 110, 971
"e:\Workspace\JE-Skin\src\lib\components\PressureMatrixViewer.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 97, 655
"e:\Workspace\JE-Skin\src\lib\components\SignalChart.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 382, 0, 0, 71, 453
"e:\Workspace\JE-Skin\src\lib\components\SummaryCurve.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, 88, 585
"e:\Workspace\JE-Skin\src\lib\config\color-map.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 3, 58
"e:\Workspace\JE-Skin\src\lib\styles\theme.css", "PostCSS", 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 1, 7, 51
"e:\Workspace\JE-Skin\src\lib\types\hud.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 20, 146
"e:\Workspace\JE-Skin\src\routes\+layout.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 5, 18
"e:\Workspace\JE-Skin\src\routes\+layout.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 1, 6
"e:\Workspace\JE-Skin\src\routes\+page.svelte", "Svelte", 0, 0, 0, 0, 0, 0, 0, 0, 1286, 0, 0, 176, 1462
"e:\Workspace\JE-Skin\static\svelte.svg", "XML", 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\JE-Skin\static\tauri.svg", "XML", 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 7
"e:\Workspace\JE-Skin\static\vite.svg", "XML", 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
"e:\Workspace\JE-Skin\svelte.config.js", "JavaScript", 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 5, 3, 19
"e:\Workspace\JE-Skin\tauri-event.md", "Markdown", 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181, 555
"e:\Workspace\JE-Skin\tsconfig.json", "JSON with Comments", 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 20
"e:\Workspace\JE-Skin\vite.config.js", "JavaScript", 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 7, 4, 33
"Total", "-", 597, 14, 2040, 27, 33, 13, 1520, 182, 4686, 43, 95, 1279, 10529
1 filename language Markdown JSON with Comments JSON XML JavaScript HTML Rust TypeScript Svelte PostCSS comment blank total
2 e:\Workspace\joyson-serial\.idea\modules.xml e:\Workspace\JE-Skin\.idea\modules.xml XML 0 0 0 8 0 0 0 0 0 0 0 0 8
3 e:\Workspace\joyson-serial\.idea\tauri-demo.iml e:\Workspace\JE-Skin\.idea\tauri-demo.iml XML 0 0 0 11 0 0 0 0 0 0 0 0 11
4 e:\Workspace\joyson-serial\README.md e:\Workspace\JE-Skin\README.md Markdown 34 0 0 0 0 0 0 0 0 0 0 20 54
5 e:\Workspace\joyson-serial\flowus_tools.json e:\Workspace\JE-Skin\flowus_tools.json JSON 0 0 1 0 0 0 0 0 0 0 0 1 2
6 e:\Workspace\joyson-serial\frontend_prompt.md e:\Workspace\JE-Skin\frontend_prompt.md Markdown 189 0 0 0 0 0 0 0 0 0 0 66 255
7 e:\Workspace\joyson-serial\package-lock.json e:\Workspace\JE-Skin\package-lock.json JSON 0 0 1957 0 0 0 0 0 0 0 0 1 1958
8 e:\Workspace\joyson-serial\package.json e:\Workspace\JE-Skin\package.json JSON 0 0 31 0 0 0 0 0 0 0 0 1 32
9 e:\Workspace\joyson-serial\src-tauri\build.rs e:\Workspace\JE-Skin\src-tauri\build.rs Rust 0 0 0 0 0 0 3 0 0 0 0 1 4
10 e:\Workspace\joyson-serial\src-tauri\capabilities\default.json e:\Workspace\JE-Skin\src-tauri\capabilities\default.json JSON 0 0 15 0 0 0 0 0 0 0 0 1 16
11 e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs e:\Workspace\JE-Skin\src-tauri\src\commands\mod.rs Rust 0 0 0 0 0 0 2 0 0 0 0 1 3
12 e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs e:\Workspace\JE-Skin\src-tauri\src\commands\serial.rs Rust 0 0 0 0 0 0 246 0 0 0 0 44 290
13 e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs e:\Workspace\JE-Skin\src-tauri\src\commands\window.rs Rust 0 0 0 0 0 0 27 0 0 0 0 6 33
14 e:\Workspace\joyson-serial\src-tauri\src\lib.rs e:\Workspace\JE-Skin\src-tauri\src\lib.rs Rust 0 0 0 0 0 0 22 0 0 0 0 2 24
15 e:\Workspace\joyson-serial\src-tauri\src\log.rs e:\Workspace\JE-Skin\src-tauri\src\log.rs Rust 0 0 0 0 0 0 34 0 0 0 0 2 36
16 e:\Workspace\joyson-serial\src-tauri\src\main.rs e:\Workspace\JE-Skin\src-tauri\src\main.rs Rust 0 0 0 0 0 0 8 0 0 0 1 2 11
17 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codec.rs Rust 0 0 0 0 0 0 6 0 0 0 0 1 7
18 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\mod.rs Rust 0 0 0 0 0 0 4 0 0 0 0 1 5
19 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs Rust 0 0 0 0 0 0 220 0 0 0 0 28 248
20 e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs Rust 0 0 0 0 0 0 215 0 0 0 8 38 261
21 e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs Rust 0 0 0 0 0 0 49 0 0 0 0 6 55
22 e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs Rust 0 0 0 0 0 0 47 0 0 0 3 8 58
23 e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\mod.rs Rust 0 0 0 0 0 0 22 0 0 0 0 7 29
24 e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\model.rs Rust 0 0 0 0 0 0 377 0 0 0 57 67 501
25 e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\record.rs Rust 0 0 0 0 0 0 50 0 0 0 4 11 65
26 e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs Rust 0 0 0 0 0 0 141 0 0 0 0 22 163
27 e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs Rust 0 0 0 0 0 0 47 0 0 0 0 13 60
28 e:\Workspace\joyson-serial\src-tauri\tauri.conf.json e:\Workspace\JE-Skin\src-tauri\tauri.conf.json JSON 0 0 36 0 0 0 0 0 0 0 0 1 37
29 e:\Workspace\joyson-serial\src\app.html e:\Workspace\JE-Skin\src\app.html HTML 0 0 0 0 0 13 0 0 0 0 0 1 14
30 e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte e:\Workspace\JE-Skin\src\lib\components\CenterStage.svelte Svelte 0 0 0 0 0 0 0 0 691 0 0 96 787
31 e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte e:\Workspace\JE-Skin\src\lib\components\ConfigPanel.svelte Svelte 0 0 0 0 0 0 0 0 398 0 0 63 461
32 e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte e:\Workspace\JE-Skin\src\lib\components\HudPanel.svelte Svelte 0 0 0 0 0 0 0 0 861 0 0 110 971
33 e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte e:\Workspace\JE-Skin\src\lib\components\PressureMatrixViewer.svelte Svelte 0 0 0 0 0 0 0 0 558 0 0 97 655
34 e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte e:\Workspace\JE-Skin\src\lib\components\SignalChart.svelte Svelte 0 0 0 0 0 0 0 0 382 0 0 71 453
35 e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte e:\Workspace\JE-Skin\src\lib\components\SummaryCurve.svelte Svelte 0 0 0 0 0 0 0 0 497 0 0 88 585
36 e:\Workspace\joyson-serial\src\lib\config\color-map.ts e:\Workspace\JE-Skin\src\lib\config\color-map.ts TypeScript 0 0 0 0 0 0 0 55 0 0 0 3 58
37 e:\Workspace\joyson-serial\src\lib\styles\theme.css e:\Workspace\JE-Skin\src\lib\styles\theme.css PostCSS 0 0 0 0 0 0 0 0 0 43 1 7 51
38 e:\Workspace\joyson-serial\src\lib\types\hud.ts e:\Workspace\JE-Skin\src\lib\types\hud.ts TypeScript 0 0 0 0 0 0 0 126 0 0 0 20 146
39 e:\Workspace\joyson-serial\src\routes\+layout.svelte e:\Workspace\JE-Skin\src\routes\+layout.svelte Svelte 0 0 0 0 0 0 0 0 13 0 0 5 18
40 e:\Workspace\joyson-serial\src\routes\+layout.ts e:\Workspace\JE-Skin\src\routes\+layout.ts TypeScript 0 0 0 0 0 0 0 1 0 0 4 1 6
41 e:\Workspace\joyson-serial\src\routes\+page.svelte e:\Workspace\JE-Skin\src\routes\+page.svelte Svelte 0 0 0 0 0 0 0 0 1286 0 0 176 1462
42 e:\Workspace\joyson-serial\static\svelte.svg e:\Workspace\JE-Skin\static\svelte.svg XML 0 0 0 1 0 0 0 0 0 0 0 0 1
43 e:\Workspace\joyson-serial\static\tauri.svg e:\Workspace\JE-Skin\static\tauri.svg XML 0 0 0 6 0 0 0 0 0 0 0 1 7
44 e:\Workspace\joyson-serial\static\vite.svg e:\Workspace\JE-Skin\static\vite.svg XML 0 0 0 1 0 0 0 0 0 0 0 0 1
45 e:\Workspace\joyson-serial\svelte.config.js e:\Workspace\JE-Skin\svelte.config.js JavaScript 0 0 0 0 11 0 0 0 0 0 5 3 19
46 e:\Workspace\joyson-serial\tauri-event.md e:\Workspace\JE-Skin\tauri-event.md Markdown 374 0 0 0 0 0 0 0 0 0 0 181 555
47 e:\Workspace\joyson-serial\tsconfig.json e:\Workspace\JE-Skin\tsconfig.json JSON with Comments 0 14 0 0 0 0 0 0 0 0 5 1 20
48 e:\Workspace\joyson-serial\vite.config.js e:\Workspace\JE-Skin\vite.config.js JavaScript 0 0 0 0 22 0 0 0 0 0 7 4 33
49 Total - 597 14 2040 27 33 13 1520 182 4686 43 95 1279 10529

File diff suppressed because one or more lines are too long

View File

@@ -2,7 +2,7 @@
Date : 2026-04-02 14:42:07
Directory e:\\Workspace\\joyson-serial
Directory e:\\Workspace\\JE-Skin
Total : 47 files, 9155 codes, 95 comments, 1279 blanks, all 10529 lines

View File

@@ -1,5 +1,5 @@
Date : 2026-04-02 14:42:07
Directory : e:\Workspace\joyson-serial
Directory : e:\Workspace\JE-Skin
Total : 47 files, 9155 codes, 95 comments, 1279 blanks, all 10529 lines
Languages
@@ -49,52 +49,52 @@ Files
+---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
| e:\Workspace\joyson-serial\.idea\modules.xml | XML | 8 | 0 | 0 | 8 |
| e:\Workspace\joyson-serial\.idea\tauri-demo.iml | XML | 11 | 0 | 0 | 11 |
| e:\Workspace\joyson-serial\README.md | Markdown | 34 | 0 | 20 | 54 |
| e:\Workspace\joyson-serial\flowus_tools.json | JSON | 1 | 0 | 1 | 2 |
| e:\Workspace\joyson-serial\frontend_prompt.md | Markdown | 189 | 0 | 66 | 255 |
| e:\Workspace\joyson-serial\package-lock.json | JSON | 1,957 | 0 | 1 | 1,958 |
| e:\Workspace\joyson-serial\package.json | JSON | 31 | 0 | 1 | 32 |
| e:\Workspace\joyson-serial\src-tauri\build.rs | Rust | 3 | 0 | 1 | 4 |
| e:\Workspace\joyson-serial\src-tauri\capabilities\default.json | JSON | 15 | 0 | 1 | 16 |
| e:\Workspace\joyson-serial\src-tauri\src\commands\mod.rs | Rust | 2 | 0 | 1 | 3 |
| e:\Workspace\joyson-serial\src-tauri\src\commands\serial.rs | Rust | 246 | 0 | 44 | 290 |
| e:\Workspace\joyson-serial\src-tauri\src\commands\window.rs | Rust | 27 | 0 | 6 | 33 |
| e:\Workspace\joyson-serial\src-tauri\src\lib.rs | Rust | 22 | 0 | 2 | 24 |
| e:\Workspace\joyson-serial\src-tauri\src\log.rs | Rust | 34 | 0 | 2 | 36 |
| e:\Workspace\joyson-serial\src-tauri\src\main.rs | Rust | 8 | 1 | 2 | 11 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codec.rs | Rust | 6 | 0 | 1 | 7 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\mod.rs | Rust | 4 | 0 | 1 | 5 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 220 | 0 | 28 | 248 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\codecs\test.rs | Rust | 215 | 8 | 38 | 261 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\error.rs | Rust | 49 | 0 | 6 | 55 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\frame.rs | Rust | 47 | 3 | 8 | 58 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\mod.rs | Rust | 22 | 0 | 7 | 29 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\model.rs | Rust | 377 | 57 | 67 | 501 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\record.rs | Rust | 50 | 4 | 11 | 65 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\serial.rs | Rust | 141 | 0 | 22 | 163 |
| e:\Workspace\joyson-serial\src-tauri\src\serial_core\utils.rs | Rust | 47 | 0 | 13 | 60 |
| e:\Workspace\joyson-serial\src-tauri\tauri.conf.json | JSON | 36 | 0 | 1 | 37 |
| e:\Workspace\joyson-serial\src\app.html | HTML | 13 | 0 | 1 | 14 |
| e:\Workspace\joyson-serial\src\lib\components\CenterStage.svelte | Svelte | 691 | 0 | 96 | 787 |
| e:\Workspace\joyson-serial\src\lib\components\ConfigPanel.svelte | Svelte | 398 | 0 | 63 | 461 |
| e:\Workspace\joyson-serial\src\lib\components\HudPanel.svelte | Svelte | 861 | 0 | 110 | 971 |
| e:\Workspace\joyson-serial\src\lib\components\PressureMatrixViewer.svelte | Svelte | 558 | 0 | 97 | 655 |
| e:\Workspace\joyson-serial\src\lib\components\SignalChart.svelte | Svelte | 382 | 0 | 71 | 453 |
| e:\Workspace\joyson-serial\src\lib\components\SummaryCurve.svelte | Svelte | 497 | 0 | 88 | 585 |
| e:\Workspace\joyson-serial\src\lib\config\color-map.ts | TypeScript | 55 | 0 | 3 | 58 |
| e:\Workspace\joyson-serial\src\lib\styles\theme.css | PostCSS | 43 | 1 | 7 | 51 |
| e:\Workspace\joyson-serial\src\lib\types\hud.ts | TypeScript | 126 | 0 | 20 | 146 |
| e:\Workspace\joyson-serial\src\routes\+layout.svelte | Svelte | 13 | 0 | 5 | 18 |
| e:\Workspace\joyson-serial\src\routes\+layout.ts | TypeScript | 1 | 4 | 1 | 6 |
| e:\Workspace\joyson-serial\src\routes\+page.svelte | Svelte | 1,286 | 0 | 176 | 1,462 |
| e:\Workspace\joyson-serial\static\svelte.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\joyson-serial\static\tauri.svg | XML | 6 | 0 | 1 | 7 |
| e:\Workspace\joyson-serial\static\vite.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\joyson-serial\svelte.config.js | JavaScript | 11 | 5 | 3 | 19 |
| e:\Workspace\joyson-serial\tauri-event.md | Markdown | 374 | 0 | 181 | 555 |
| e:\Workspace\joyson-serial\tsconfig.json | JSON with Comments | 14 | 5 | 1 | 20 |
| e:\Workspace\joyson-serial\vite.config.js | JavaScript | 22 | 7 | 4 | 33 |
| e:\Workspace\JE-Skin\.idea\modules.xml | XML | 8 | 0 | 0 | 8 |
| e:\Workspace\JE-Skin\.idea\tauri-demo.iml | XML | 11 | 0 | 0 | 11 |
| e:\Workspace\JE-Skin\README.md | Markdown | 34 | 0 | 20 | 54 |
| e:\Workspace\JE-Skin\flowus_tools.json | JSON | 1 | 0 | 1 | 2 |
| e:\Workspace\JE-Skin\frontend_prompt.md | Markdown | 189 | 0 | 66 | 255 |
| e:\Workspace\JE-Skin\package-lock.json | JSON | 1,957 | 0 | 1 | 1,958 |
| e:\Workspace\JE-Skin\package.json | JSON | 31 | 0 | 1 | 32 |
| e:\Workspace\JE-Skin\src-tauri\build.rs | Rust | 3 | 0 | 1 | 4 |
| e:\Workspace\JE-Skin\src-tauri\capabilities\default.json | JSON | 15 | 0 | 1 | 16 |
| e:\Workspace\JE-Skin\src-tauri\src\commands\mod.rs | Rust | 2 | 0 | 1 | 3 |
| e:\Workspace\JE-Skin\src-tauri\src\commands\serial.rs | Rust | 246 | 0 | 44 | 290 |
| e:\Workspace\JE-Skin\src-tauri\src\commands\window.rs | Rust | 27 | 0 | 6 | 33 |
| e:\Workspace\JE-Skin\src-tauri\src\lib.rs | Rust | 22 | 0 | 2 | 24 |
| e:\Workspace\JE-Skin\src-tauri\src\log.rs | Rust | 34 | 0 | 2 | 36 |
| e:\Workspace\JE-Skin\src-tauri\src\main.rs | Rust | 8 | 1 | 2 | 11 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codec.rs | Rust | 6 | 0 | 1 | 7 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\mod.rs | Rust | 4 | 0 | 1 | 5 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\tactile_a.rs | Rust | 220 | 0 | 28 | 248 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\codecs\test.rs | Rust | 215 | 8 | 38 | 261 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\error.rs | Rust | 49 | 0 | 6 | 55 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\frame.rs | Rust | 47 | 3 | 8 | 58 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\mod.rs | Rust | 22 | 0 | 7 | 29 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\model.rs | Rust | 377 | 57 | 67 | 501 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\record.rs | Rust | 50 | 4 | 11 | 65 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\serial.rs | Rust | 141 | 0 | 22 | 163 |
| e:\Workspace\JE-Skin\src-tauri\src\serial_core\utils.rs | Rust | 47 | 0 | 13 | 60 |
| e:\Workspace\JE-Skin\src-tauri\tauri.conf.json | JSON | 36 | 0 | 1 | 37 |
| e:\Workspace\JE-Skin\src\app.html | HTML | 13 | 0 | 1 | 14 |
| e:\Workspace\JE-Skin\src\lib\components\CenterStage.svelte | Svelte | 691 | 0 | 96 | 787 |
| e:\Workspace\JE-Skin\src\lib\components\ConfigPanel.svelte | Svelte | 398 | 0 | 63 | 461 |
| e:\Workspace\JE-Skin\src\lib\components\HudPanel.svelte | Svelte | 861 | 0 | 110 | 971 |
| e:\Workspace\JE-Skin\src\lib\components\PressureMatrixViewer.svelte | Svelte | 558 | 0 | 97 | 655 |
| e:\Workspace\JE-Skin\src\lib\components\SignalChart.svelte | Svelte | 382 | 0 | 71 | 453 |
| e:\Workspace\JE-Skin\src\lib\components\SummaryCurve.svelte | Svelte | 497 | 0 | 88 | 585 |
| e:\Workspace\JE-Skin\src\lib\config\color-map.ts | TypeScript | 55 | 0 | 3 | 58 |
| e:\Workspace\JE-Skin\src\lib\styles\theme.css | PostCSS | 43 | 1 | 7 | 51 |
| e:\Workspace\JE-Skin\src\lib\types\hud.ts | TypeScript | 126 | 0 | 20 | 146 |
| e:\Workspace\JE-Skin\src\routes\+layout.svelte | Svelte | 13 | 0 | 5 | 18 |
| e:\Workspace\JE-Skin\src\routes\+layout.ts | TypeScript | 1 | 4 | 1 | 6 |
| e:\Workspace\JE-Skin\src\routes\+page.svelte | Svelte | 1,286 | 0 | 176 | 1,462 |
| e:\Workspace\JE-Skin\static\svelte.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\JE-Skin\static\tauri.svg | XML | 6 | 0 | 1 | 7 |
| e:\Workspace\JE-Skin\static\vite.svg | XML | 1 | 0 | 0 | 1 |
| e:\Workspace\JE-Skin\svelte.config.js | JavaScript | 11 | 5 | 3 | 19 |
| e:\Workspace\JE-Skin\tauri-event.md | Markdown | 374 | 0 | 181 | 555 |
| e:\Workspace\JE-Skin\tsconfig.json | JSON with Comments | 14 | 5 | 1 | 20 |
| e:\Workspace\JE-Skin\vite.config.js | JavaScript | 22 | 7 | 4 | 33 |
| Total | | 9,155 | 95 | 1,279 | 10,529 |
+---------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+

4
package-lock.json generated
View File

@@ -1,11 +1,11 @@
{
"name": "joyson-serial",
"name": "JE-Skin",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "joyson-serial",
"name": "JE-Skin",
"version": "0.1.0",
"license": "MIT",
"dependencies": {

View File

@@ -1,5 +1,5 @@
{
"name": "joyson-serial",
"name": "JE-Skin",
"version": "0.1.0",
"description": "",
"type": "module",

44
src-tauri/Cargo.lock generated
View File

@@ -2,6 +2,28 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "JE-Skin"
version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"chrono",
"crc",
"csv",
"fern",
"humantime",
"log",
"serde",
"serde_json",
"tauri",
"tauri-build",
"tauri-plugin-opener",
"tokio",
"tokio-serial",
"tokio-util",
]
[[package]]
name = "adler2"
version = "2.0.1"
@@ -1941,28 +1963,6 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
[[package]]
name = "joyson-serial"
version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"chrono",
"crc",
"csv",
"fern",
"humantime",
"log",
"serde",
"serde_json",
"tauri",
"tauri-build",
"tauri-plugin-opener",
"tokio",
"tokio-serial",
"tokio-util",
]
[[package]]
name = "js-sys"
version = "0.3.91"

View File

@@ -1,5 +1,5 @@
[package]
name = "joyson-serial"
name = "JE-Skin"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]

View File

@@ -113,7 +113,7 @@ pub async fn serial_connect(
let task_app = app.clone();
let task_port_name = port_name.clone();
let port = tokio_serial::new(&port_name, 115200)
let port = tokio_serial::new(&port_name, 921600)
.open_native_async()
.map_err(|_| SerialError::OpenError)?;
let session_started_at = Instant::now();

View File

@@ -1,5 +1,5 @@
use fern::colors::{Color, ColoredLevelConfig};
use log::{debug, error, info, trace, warn};
use fern::{Dispatch, colors::{Color, ColoredLevelConfig}};
use log::{debug};
use std::time::SystemTime;
pub fn setup_logger() {
let colors_line = ColoredLevelConfig::new()
@@ -10,7 +10,13 @@ pub fn setup_logger() {
.trace(Color::BrightBlack);
let colors_level = colors_line.info(Color::Green);
fern::Dispatch::new()
let level = if cfg!(debug_assertions) {
log::LevelFilter::Debug
} else {
log::LevelFilter::Info
};
let console_config = fern::Dispatch::new()
.format(move |out, message, record| {
out.finish(
format_args!(
@@ -26,9 +32,31 @@ pub fn setup_logger() {
)
);
})
.level(log::LevelFilter::Info)
.chain(std::io::stdout())
.chain(fern::DateBased::new("program.log", "%Y-%m-%d"))
.level(level)
.chain(std::io::stdout());
// .chain(fern::DateBased::new("program.log", "%Y-%m-%d"))
// .apply()
// .unwrap();
let file_config = fern::Dispatch::new()
.format(move |out, message, record| {
out.finish(
format_args!(
"[{data} {level} {target}] {message}",
data = humantime::format_rfc3339_seconds(SystemTime::now()),
target = record.target(),
level = colors_level.color(record.level()),
message = message,
)
);
})
.level(level)
.chain(fern::DateBased::new("program.log", "%Y-%m-%d"));
Dispatch::new()
.level(log::LevelFilter::Debug)
.chain(console_config)
.chain(file_config)
.apply()
.unwrap();

View File

@@ -3,7 +3,7 @@ use crate::serial_core::frame::{
FrameHandler, TactileAFrameMetaData, TactileARepFrame, TactileAReqFrame,
};
use crate::serial_core::record::{write_csv, CsvExporter, CsvImporter, RecordedFrame, Recording};
use crate::serial_core::utils::{calc_crc8_itu, elapsed_millis, usize_to_u16_le_bytes};
use crate::serial_core::utils::{calc_crc8_itu, elapsed_millis};
use crate::serial_core::{
codec::Codec,
frame::{TactileAFrame, TactileAFrameStatusCode},
@@ -12,12 +12,14 @@ use async_trait::async_trait;
use csv::StringRecord;
use anyhow::anyhow;
use std::io::Read;
use log::debug;
const FRAME_BUFFER_MIN_LENGTH: usize = 15;
pub struct TactileACodec {
buffer: Vec<u8>,
frame_nb: u64,
expected_data_len: usize,
}
pub struct TactileACsvExporter {
@@ -64,6 +66,7 @@ impl TactileACodec {
Self {
buffer: Vec::new(),
frame_nb: 0,
expected_data_len: cols * rows * 2,
}
}
@@ -145,11 +148,33 @@ impl Codec<TactileAFrame> for TactileACodec {
]);
let except_data_len = u16::from_le_bytes([self.buffer[11], self.buffer[12]]) as usize;
let status = TactileAFrameStatusCode::from(self.buffer[13]);
if except_data_len != self.expected_data_len {
debug!(
"unexpected payload length: expected {}, got {}, buffer_len={}",
self.expected_data_len,
except_data_len,
self.buffer.len()
);
self.buffer.drain(0..1);
continue;
}
let frame_length = except_data_len + FRAME_BUFFER_MIN_LENGTH;
if self.buffer.len() < frame_length {
break;
}
let need_check_data = self.buffer[0..14 + except_data_len].to_vec();
let payload = self.buffer[14..14 + except_data_len].to_vec();
let crc8_itu_alg = crc::Crc::<u8>::new(&crc::CRC_8_I_432_1);
let checksum = crc8_itu_alg.checksum(&payload.as_slice());
let frame_length = except_data_len + FRAME_BUFFER_MIN_LENGTH;
let checksum = crc8_itu_alg.checksum(&need_check_data.as_slice());
if self.buffer[frame_length - 1] != checksum {
debug!(
"checksum mismatch: expected {:02X}, got {:02X}, frame_len={}",
checksum,
self.buffer[frame_length - 1],
frame_length
);
self.buffer.drain(0..1);
continue;
}
@@ -187,11 +212,13 @@ impl Codec<TactileAFrame> for TactileACodec {
TactileAFrame::Req(f) => {
let mut req_bytes: Vec<u8> = Vec::new();
req_bytes.extend_from_slice(f.meta.header.as_slice());
req_bytes.extend_from_slice(usize_to_u16_le_bytes(f.meta.payload_len).as_slice());
req_bytes.extend_from_slice((f.meta.payload_len as u16).to_le_bytes().as_slice());
req_bytes.push(f.meta.device_addr);
req_bytes.push(f.meta.extend_code);
req_bytes.push(f.meta.func_code);
req_bytes.extend_from_slice(f.meta.start_addr.to_le_bytes().as_slice());
req_bytes.extend_from_slice((f.meta.except_data_len as u16).to_le_bytes().as_slice());
let checksum = calc_crc8_itu(req_bytes.as_slice());
req_bytes.push(checksum);
Ok(req_bytes)
@@ -209,6 +236,7 @@ impl FrameHandler<TactileAFrame, i32> for TactileAHandler {
match frame {
TactileAFrame::Rep(rep) => {
let vals = TactileACodec::parse_data_frame(&rep.payload)?;
debug!("vals is {:?}", vals);
Ok(Some(vals))
}
_ => Ok(None),

View File

@@ -6,7 +6,6 @@ use anyhow::anyhow;
use async_trait::async_trait;
use csv::StringRecord;
use crate::serial_core::record::{write_csv, CsvExporter, CsvImporter, RecordedFrame, Recording};
use crc::{Crc, CRC_8_SMBUS};
use crate::serial_core::utils::{
elapsed_millis,
usize_to_u16_be_bytes

View File

@@ -12,7 +12,7 @@ use tokio_util::sync::CancellationToken;
use std::future::pending;
use std::sync::{Arc, Mutex};
use std::time::Instant;
use log::info;
use log::{info, debug};
use crate::serial_core::record::{FrameTiming, RecordedFrame};
pub enum PollMode<F> {
@@ -211,6 +211,7 @@ where
let mut prune_interval = time::interval(Duration::from_millis(450));
prune_interval.set_missed_tick_behavior(MissedTickBehavior::Delay);
loop {
tokio::select! {
_ = cancel.cancelled() => break,
@@ -239,6 +240,9 @@ where
read_result = port.read(&mut buffer) => {
let n = read_result?;
if n == 0 {
// Some serial drivers can resolve reads with 0 bytes repeatedly.
// Yield here so timer-driven poll requests are not starved by a busy loop.
tokio::task::yield_now().await;
continue;
}
@@ -261,7 +265,6 @@ where
let display_values = if let Some(vals) = decode_res.as_ref() {
let summary = vals.iter().copied().sum::<i32>();
info!("dot value summary: {}", summary);
chart_state.record_summary(summary as f32);
chart_state.record_pressure_matrix(vals.as_slice());
Some(vec![summary])

View File

@@ -1,5 +1,4 @@
use anyhow::Ok;
use crc::{Crc, CRC_8_I_432_1, CRC_8_SMBUS};
use std::time::Instant;
pub fn usize_to_u16_be_bytes(n: usize) -> [u8; 2] {

View File

@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

View File

@@ -1,6 +1,6 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "tauri-demo",
"productName": "JE-Skin",
"version": "0.1.0",
"identifier": "com.lenn.tauri-serial",
"build": {
@@ -12,7 +12,7 @@
"app": {
"windows": [
{
"title": "joyson-serial",
"title": "JE-Skin",
"width": 1366,
"height": 860,
"decorations": false

View File

@@ -39,7 +39,7 @@
export let matrixRows = 12;
export let matrixCols = 7;
export let rangeMin = 0;
export let rangeMax = 5000;
export let rangeMax = 16000;
export let colorMapPreset: PressureColorMapPreset = "emerald";
export let colorMapOptions: HudColorMapOption[] = [];
export let replaySectionLabel = "";
@@ -193,7 +193,7 @@
</div>
<div class="canvas-wrap">
{#key `${matrixRows}x${matrixCols}`}
{#key `${matrixRows}x${matrixCols}:${colorMapPreset}`}
<PressureMatrixViewer
{pressureMatrix}
{matrixRows}
@@ -351,12 +351,17 @@
min-height: 0;
overflow: hidden;
border-radius: 0.72rem;
border: 1px solid rgb(101 133 152 / 0.2);
border: 1px solid rgb(var(--hud-border-rgb) / 0.2);
background:
linear-gradient(170deg, rgb(8 12 16 / 0.86) 0%, rgb(0 0 0 / 0.96) 58%, rgb(6 10 14 / 0.9) 100%),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.04), transparent 48%);
linear-gradient(
170deg,
rgb(var(--hud-surface-rgb) / 0.86) 0%,
rgb(var(--hud-surface-deep-rgb) / 0.96) 58%,
rgb(var(--hud-surface-alt-rgb) / 0.9) 100%
),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-rgb) / 0.04), transparent 48%);
box-shadow:
inset 0 1px 0 rgb(175 216 240 / 0.08),
inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.08),
inset 0 -36px 72px rgb(0 0 0 / 0.4);
}
@@ -390,16 +395,16 @@
min-width: 0;
max-inline-size: min(22rem, 62%);
padding: 0.3rem 0.5rem 0.35rem;
border: 1px solid rgb(112 146 166 / 0.2);
border: 1px solid rgb(var(--hud-border-rgb) / 0.2);
border-radius: 0.45rem;
background: rgb(2 8 12 / 0.45);
background: rgb(var(--hud-surface-deep-rgb) / 0.45);
backdrop-filter: blur(2px);
}
.meta-label {
margin: 0;
font-size: 0.56rem;
color: rgb(148 171 189 / 0.8);
color: rgb(var(--hud-text-dim-rgb) / 0.8);
text-transform: uppercase;
letter-spacing: 0.1em;
}
@@ -407,7 +412,7 @@
h2 {
margin: 0.08rem 0 0;
font-size: clamp(0.75rem, 1.1vw, 0.92rem);
color: rgb(222 241 255 / 0.96);
color: rgb(var(--hud-text-main-rgb) / 0.96);
letter-spacing: 0.03em;
font-weight: 500;
line-height: 1.2;
@@ -416,30 +421,30 @@
.meta-hint {
margin: 0.09rem 0 0;
font-size: 0.62rem;
color: rgb(142 165 183 / 0.76);
color: rgb(var(--hud-text-dim-rgb) / 0.76);
line-height: 1.15;
}
.runtime-status {
margin: 0;
align-self: center;
border: 1px solid rgb(95 128 149 / 0.35);
border: 1px solid rgb(var(--hud-border-rgb) / 0.35);
border-radius: 999px;
padding: 0.3rem 0.66rem;
font-size: 0.66rem;
letter-spacing: 0.08em;
color: rgb(150 174 194 / 0.9);
color: rgb(var(--hud-text-dim-rgb) / 0.9);
text-transform: uppercase;
white-space: nowrap;
background: rgb(3 10 15 / 0.62);
background: rgb(var(--hud-surface-deep-rgb) / 0.62);
}
.runtime-status.is-ok {
color: rgb(204 248 184 / 0.94);
color: rgb(var(--hud-lime-rgb) / 0.94);
}
.runtime-status.is-warn {
color: rgb(255 205 188 / 0.92);
color: rgb(var(--hud-orange-rgb) / 0.92);
}
.canvas-wrap {
@@ -533,15 +538,15 @@
pointer-events: auto;
display: grid;
gap: 0.52rem;
border: 1px solid rgb(95 136 159 / 0.34);
border: 1px solid rgb(var(--hud-border-rgb) / 0.34);
border-radius: 0.66rem;
padding: 0.66rem 0.72rem;
background:
linear-gradient(180deg, rgb(8 14 19 / 0.86), rgb(4 8 12 / 0.8)),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.07), transparent 56%);
linear-gradient(180deg, rgb(var(--hud-surface-rgb) / 0.86), rgb(var(--hud-surface-deep-rgb) / 0.8)),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-rgb) / 0.07), transparent 56%);
box-shadow:
inset 0 1px 0 rgb(183 218 239 / 0.08),
0 0 18px rgb(62 232 255 / 0.1);
inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.08),
0 0 18px rgb(var(--hud-glow-rgb) / 0.1);
}
.replay-floating-panel.is-right {
@@ -582,24 +587,24 @@
font-size: 0.58rem;
letter-spacing: 0.11em;
text-transform: uppercase;
color: rgb(152 185 206 / 0.86);
color: rgb(var(--hud-text-dim-rgb) / 0.86);
}
.replay-panel-file {
font-size: 0.73rem;
letter-spacing: 0.03em;
color: rgb(221 241 255 / 0.94);
color: rgb(var(--hud-text-main-rgb) / 0.94);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.replay-panel-frame {
border: 1px solid rgb(133 255 68 / 0.36);
border: 1px solid rgb(var(--hud-lime-rgb) / 0.36);
border-radius: 999px;
padding: 0.16rem 0.52rem;
background: rgb(17 28 15 / 0.64);
color: rgb(204 255 178 / 0.94);
background: rgb(var(--hud-surface-alt-rgb) / 0.64);
color: rgb(var(--hud-lime-rgb) / 0.94);
font-size: 0.67rem;
letter-spacing: 0.07em;
white-space: nowrap;
@@ -608,10 +613,10 @@
.replay-close-btn {
inline-size: 1.82rem;
block-size: 1.82rem;
border: 1px solid rgb(255 98 76 / 0.44);
border: 1px solid rgb(var(--hud-orange-rgb) / 0.44);
border-radius: 0.32rem;
background: rgb(24 10 12 / 0.88);
color: rgb(255 210 203 / 0.96);
background: rgb(var(--hud-surface-deep-rgb) / 0.88);
color: rgb(var(--hud-orange-rgb) / 0.96);
font-size: 1rem;
line-height: 1;
display: grid;
@@ -624,9 +629,9 @@
}
.replay-close-btn:hover {
border-color: rgb(255 132 115 / 0.66);
color: rgb(255 234 228 / 0.98);
box-shadow: 0 0 12px rgb(255 91 63 / 0.2);
border-color: rgb(var(--hud-orange-rgb) / 0.66);
color: rgb(var(--hud-text-main-rgb) / 0.98);
box-shadow: 0 0 12px rgb(var(--hud-orange-rgb) / 0.2);
}
.replay-panel-controls {
@@ -643,11 +648,11 @@
.replay-action-btn {
min-block-size: 1.82rem;
border: 1px solid rgb(62 232 255 / 0.36);
border: 1px solid rgb(var(--hud-cyan-rgb) / 0.36);
border-radius: 999px;
padding: 0.2rem 0.66rem;
background: rgb(8 19 25 / 0.9);
color: rgb(225 246 255 / 0.96);
background: rgb(var(--hud-surface-alt-rgb) / 0.9);
color: rgb(var(--hud-text-main-rgb) / 0.96);
font-size: 0.7rem;
letter-spacing: 0.05em;
cursor: pointer;
@@ -657,19 +662,19 @@
}
.replay-action-btn:hover {
border-color: rgb(116 245 255 / 0.58);
box-shadow: 0 0 10px rgb(62 232 255 / 0.14);
border-color: rgb(var(--hud-cyan-rgb) / 0.58);
box-shadow: 0 0 10px rgb(var(--hud-cyan-rgb) / 0.14);
}
.replay-action-btn.is-stop {
border-color: rgb(255 91 63 / 0.44);
color: rgb(255 223 214 / 0.94);
background: rgb(27 12 10 / 0.86);
border-color: rgb(var(--hud-orange-rgb) / 0.44);
color: rgb(var(--hud-orange-rgb) / 0.94);
background: rgb(var(--hud-surface-deep-rgb) / 0.86);
}
.replay-action-btn.is-stop:hover {
border-color: rgb(255 124 101 / 0.64);
box-shadow: 0 0 10px rgb(255 91 63 / 0.18);
border-color: rgb(var(--hud-orange-rgb) / 0.64);
box-shadow: 0 0 10px rgb(var(--hud-orange-rgb) / 0.18);
}
.replay-speed-select,
@@ -678,15 +683,15 @@
align-items: center;
gap: 0.36rem;
min-block-size: 1.92rem;
border: 1px solid rgb(95 132 158 / 0.32);
border: 1px solid rgb(var(--hud-border-rgb) / 0.32);
border-radius: 999px;
padding: 0.16rem 0.2rem 0.16rem 0.48rem;
background: rgb(8 15 21 / 0.78);
background: rgb(var(--hud-surface-rgb) / 0.78);
}
.replay-speed-select span,
.replay-progress-slider span {
color: rgb(154 176 194 / 0.84);
color: rgb(var(--hud-text-dim-rgb) / 0.84);
font-size: 0.62rem;
letter-spacing: 0.08em;
text-transform: uppercase;
@@ -694,11 +699,11 @@
}
.replay-speed-select select {
border: 1px solid rgb(95 132 158 / 0.34);
border: 1px solid rgb(var(--hud-border-rgb) / 0.34);
border-radius: 999px;
padding: 0.22rem 0.48rem;
background: rgb(4 11 16 / 0.88);
color: rgb(216 235 248 / 0.96);
background: rgb(var(--hud-surface-deep-rgb) / 0.88);
color: rgb(var(--hud-text-main-rgb) / 0.96);
font-size: 0.72rem;
letter-spacing: 0.05em;
outline: none;
@@ -710,7 +715,7 @@
.replay-progress-slider input {
inline-size: 100%;
accent-color: rgb(133 255 68 / 0.92);
accent-color: rgb(var(--hud-lime-rgb) / 0.92);
}
.stage-bottom-overlay {

View File

@@ -16,7 +16,7 @@
export let matrixRows = 12;
export let matrixCols = 7;
export let rangeMin = 0;
export let rangeMax = 5000;
export let rangeMax = 16000;
export let colorMapPreset: PressureColorMapPreset = "emerald";
export let colorMapOptions: HudColorMapOption[] = [];
@@ -85,7 +85,7 @@
matrixRows = 12;
matrixCols = 7;
rangeMin = 0;
rangeMax = 5000;
rangeMax = 16000;
colorMapPreset = "emerald";
}
@@ -222,13 +222,13 @@
gap: 0.9rem;
inline-size: min(23rem, 100%);
padding: 0.92rem 0.96rem 1rem;
border: 1px solid rgb(88 132 116 / 0.3);
border: 1px solid rgb(var(--hud-border-rgb) / 0.3);
border-radius: 0.82rem;
background:
linear-gradient(180deg, rgb(6 18 14 / 0.92), rgb(4 10 9 / 0.88)),
radial-gradient(circle at 100% 0, rgb(97 146 255 / 0.07), transparent 38%);
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.92), rgb(var(--hud-surface-deep-rgb) / 0.88)),
radial-gradient(circle at 100% 0, rgb(var(--hud-info-rgb) / 0.07), transparent 38%);
box-shadow:
inset 0 1px 0 rgb(184 236 206 / 0.08),
inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.08),
0 18px 46px rgb(0 0 0 / 0.28);
backdrop-filter: blur(10px);
}
@@ -249,7 +249,7 @@
.field-label,
.live-note {
margin: 0;
color: rgb(157 206 181 / 0.8);
color: rgb(var(--hud-text-dim-rgb) / 0.8);
font-size: 0.58rem;
letter-spacing: 0.12em;
text-transform: uppercase;
@@ -257,7 +257,7 @@
h3 {
margin: 0.12rem 0 0;
color: rgb(237 248 241 / 0.98);
color: rgb(var(--hud-text-main-rgb) / 0.98);
font-size: 1rem;
line-height: 1.2;
font-weight: 600;
@@ -266,7 +266,7 @@
.config-hint,
.section-note {
margin: 0.14rem 0 0;
color: rgb(142 182 164 / 0.78);
color: rgb(var(--hud-text-dim-rgb) / 0.78);
font-size: 0.7rem;
line-height: 1.25;
}
@@ -275,9 +275,9 @@
position: relative;
inline-size: 2rem;
block-size: 2rem;
border: 1px solid rgb(82 122 106 / 0.32);
border: 1px solid rgb(var(--hud-border-rgb) / 0.32);
border-radius: 999px;
background: rgb(4 12 9 / 0.72);
background: rgb(var(--hud-surface-deep-rgb) / 0.72);
cursor: pointer;
flex: 0 0 auto;
}
@@ -288,7 +288,7 @@
left: 50%;
inline-size: 0.8rem;
block-size: 1px;
background: rgb(182 210 195 / 0.9);
background: rgb(var(--hud-text-main-rgb) / 0.9);
transform-origin: center;
}
@@ -304,9 +304,9 @@
display: grid;
gap: 0.62rem;
padding: 0.76rem 0.8rem;
border: 1px solid rgb(72 116 96 / 0.22);
border: 1px solid rgb(var(--hud-border-rgb) / 0.22);
border-radius: 0.72rem;
background: linear-gradient(180deg, rgb(7 15 12 / 0.76), rgb(5 10 8 / 0.64));
background: linear-gradient(180deg, rgb(var(--hud-surface-rgb) / 0.76), rgb(var(--hud-surface-deep-rgb) / 0.64));
}
.section-head {
@@ -331,11 +331,11 @@
.preset-btn,
.reset-btn,
.palette-btn {
border: 1px solid rgb(80 126 105 / 0.28);
border: 1px solid rgb(var(--hud-border-rgb) / 0.28);
border-radius: 999px;
padding: 0.38rem 0.72rem;
background: rgb(8 19 15 / 0.76);
color: rgb(191 219 206 / 0.92);
background: rgb(var(--hud-surface-rgb) / 0.76);
color: rgb(var(--hud-text-main-rgb) / 0.92);
font: inherit;
font-size: 0.72rem;
cursor: pointer;
@@ -347,10 +347,10 @@
}
.preset-btn.is-active {
border-color: rgb(98 201 149 / 0.48);
background: linear-gradient(180deg, rgb(18 54 37 / 0.96), rgb(10 32 23 / 0.92));
color: rgb(233 247 240 / 0.98);
box-shadow: inset 0 1px 0 rgb(198 246 222 / 0.14), 0 0 16px rgb(63 184 120 / 0.14);
border-color: rgb(var(--hud-lime-rgb) / 0.48);
background: linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.96), rgb(var(--hud-surface-rgb) / 0.92));
color: rgb(var(--hud-text-main-rgb) / 0.98);
box-shadow: inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.14), 0 0 16px rgb(var(--hud-glow-alt-rgb) / 0.14);
}
.palette-btn {
@@ -363,10 +363,10 @@
}
.palette-btn.is-active {
border-color: rgb(98 201 149 / 0.48);
background: linear-gradient(180deg, rgb(18 54 37 / 0.96), rgb(10 32 23 / 0.92));
color: rgb(233 247 240 / 0.98);
box-shadow: inset 0 1px 0 rgb(198 246 222 / 0.14), 0 0 16px rgb(63 184 120 / 0.14);
border-color: rgb(var(--hud-lime-rgb) / 0.48);
background: linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.96), rgb(var(--hud-surface-rgb) / 0.92));
color: rgb(var(--hud-text-main-rgb) / 0.98);
box-shadow: inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.14), 0 0 16px rgb(var(--hud-glow-alt-rgb) / 0.14);
}
.palette-preview {
@@ -405,26 +405,26 @@
display: grid;
gap: 0.38rem;
padding: 0.58rem 0.64rem 0.66rem;
border: 1px solid rgb(68 106 89 / 0.26);
border: 1px solid rgb(var(--hud-border-rgb) / 0.26);
border-radius: 0.58rem;
background: linear-gradient(180deg, rgb(6 14 11 / 0.86), rgb(3 8 6 / 0.82));
background: linear-gradient(180deg, rgb(var(--hud-surface-rgb) / 0.86), rgb(var(--hud-surface-deep-rgb) / 0.82));
}
.field-card input {
inline-size: 100%;
border: 1px solid rgb(82 131 109 / 0.28);
border: 1px solid rgb(var(--hud-border-rgb) / 0.28);
border-radius: 0.46rem;
padding: 0.55rem 0.62rem;
background: rgb(7 16 12 / 0.92);
color: rgb(238 246 241 / 0.98);
background: rgb(var(--hud-surface-rgb) / 0.92);
color: rgb(var(--hud-text-main-rgb) / 0.98);
font: inherit;
font-size: 0.86rem;
outline: none;
}
.field-card input:focus {
border-color: rgb(97 201 147 / 0.54);
box-shadow: 0 0 0 1px rgb(97 201 147 / 0.24);
border-color: rgb(var(--hud-lime-rgb) / 0.54);
box-shadow: 0 0 0 1px rgb(var(--hud-lime-rgb) / 0.24);
}
.config-foot {
@@ -435,11 +435,11 @@
}
.live-note {
color: rgb(142 182 164 / 0.8);
color: rgb(var(--hud-text-dim-rgb) / 0.8);
}
.reset-btn {
background: linear-gradient(180deg, rgb(10 21 17 / 0.88), rgb(6 12 10 / 0.84));
background: linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.88), rgb(var(--hud-surface-deep-rgb) / 0.84));
white-space: nowrap;
}

View File

@@ -377,8 +377,8 @@
display: grid;
place-items: center;
background:
radial-gradient(circle at 30% 12%, rgb(62 232 255 / 0.08), transparent 42%),
radial-gradient(circle at 84% 10%, rgb(133 255 68 / 0.07), transparent 40%),
radial-gradient(circle at 30% 12%, rgb(var(--hud-glow-rgb) / 0.08), transparent 42%),
radial-gradient(circle at 84% 10%, rgb(var(--hud-glow-alt-rgb) / 0.07), transparent 40%),
rgb(0 0 0 / 0.6);
backdrop-filter: blur(3px);
padding: clamp(0.65rem, 2.4vw, 1.25rem);
@@ -392,14 +392,19 @@
block-size: min(720px, 100%);
max-inline-size: calc(100% - 2 * clamp(0.65rem, 2.4vw, 1.25rem));
max-block-size: calc(100% - 2 * clamp(0.65rem, 2.4vw, 1.25rem));
border: 1px solid rgb(95 132 158 / 0.34);
border: 1px solid rgb(var(--hud-border-rgb) / 0.34);
border-radius: 0.72rem;
background:
linear-gradient(172deg, rgb(8 12 16 / 0.96) 0%, rgb(4 8 12 / 0.96) 52%, rgb(3 6 10 / 0.98) 100%),
radial-gradient(circle at 18% 0, rgb(62 232 255 / 0.06), transparent 42%),
radial-gradient(circle at 90% 0, rgb(133 255 68 / 0.05), transparent 38%);
linear-gradient(
172deg,
rgb(var(--hud-surface-rgb) / 0.96) 0%,
rgb(var(--hud-surface-deep-rgb) / 0.96) 52%,
rgb(var(--hud-surface-deep-rgb) / 0.98) 100%
),
radial-gradient(circle at 18% 0, rgb(var(--hud-glow-rgb) / 0.06), transparent 42%),
radial-gradient(circle at 90% 0, rgb(var(--hud-glow-alt-rgb) / 0.05), transparent 38%);
box-shadow:
inset 0 1px 0 rgb(192 221 240 / 0.08),
inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.08),
0 22px 50px rgb(0 0 0 / 0.52);
overflow: hidden;
transform: translate3d(var(--explorer-drag-x, 0), var(--explorer-drag-y, 0), 0);
@@ -411,8 +416,8 @@
justify-content: space-between;
gap: 0.65rem;
padding: 0.72rem 0.85rem 0.65rem;
border-bottom: 1px solid rgb(95 132 158 / 0.28);
background: linear-gradient(180deg, rgb(16 25 32 / 0.6), transparent);
border-bottom: 1px solid rgb(var(--hud-border-rgb) / 0.28);
background: linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.6), transparent);
cursor: grab;
user-select: none;
touch-action: none;
@@ -434,12 +439,12 @@
block-size: 0.5rem;
border-radius: 999px;
background: var(--hud-lime);
box-shadow: 0 0 0 2px rgb(133 255 68 / 0.14);
box-shadow: 0 0 0 2px rgb(var(--hud-lime-rgb) / 0.14);
}
.explorer-title {
margin: 0;
color: #ecf9ff;
color: rgb(var(--hud-text-main-rgb) / 0.98);
font-size: 0.92rem;
letter-spacing: 0.08em;
text-transform: uppercase;
@@ -448,10 +453,10 @@
.header-close-btn {
inline-size: 2rem;
block-size: 1.64rem;
border: 1px solid rgb(98 131 156 / 0.36);
border: 1px solid rgb(var(--hud-border-rgb) / 0.36);
border-radius: 0.36rem;
background: rgb(8 13 18 / 0.9);
color: rgb(174 219 244 / 0.9);
background: rgb(var(--hud-surface-rgb) / 0.9);
color: rgb(var(--hud-text-main-rgb) / 0.9);
font-size: 1rem;
line-height: 1;
cursor: pointer;
@@ -461,8 +466,8 @@
}
.header-close-btn:hover {
border-color: rgb(255 91 63 / 0.6);
color: rgb(255 208 198 / 0.96);
border-color: rgb(var(--hud-orange-rgb) / 0.6);
color: rgb(var(--hud-orange-rgb) / 0.96);
}
.explorer-toolbar {
@@ -470,17 +475,17 @@
grid-template-columns: auto minmax(0, 1fr);
gap: 0.58rem;
padding: 0.62rem 0.85rem;
border-bottom: 1px solid rgb(95 132 158 / 0.22);
background: linear-gradient(90deg, rgb(62 232 255 / 0.03), transparent 44%, rgb(133 255 68 / 0.02));
border-bottom: 1px solid rgb(var(--hud-border-rgb) / 0.22);
background: linear-gradient(90deg, rgb(var(--hud-glow-rgb) / 0.03), transparent 44%, rgb(var(--hud-glow-alt-rgb) / 0.02));
}
.tool-btn {
min-block-size: 1.95rem;
border: 1px solid rgb(95 132 158 / 0.36);
border: 1px solid rgb(var(--hud-border-rgb) / 0.36);
border-radius: 0.42rem;
padding: 0.25rem 0.65rem;
background: rgb(9 16 21 / 0.86);
color: rgb(213 233 245 / 0.94);
background: rgb(var(--hud-surface-alt-rgb) / 0.86);
color: rgb(var(--hud-text-main-rgb) / 0.94);
font-size: 0.72rem;
letter-spacing: 0.05em;
cursor: pointer;
@@ -491,8 +496,8 @@
}
.tool-btn:hover:not(:disabled) {
border-color: rgb(62 232 255 / 0.46);
box-shadow: inset 0 0 0 1px rgb(178 216 239 / 0.08);
border-color: rgb(var(--hud-cyan-rgb) / 0.46);
box-shadow: inset 0 0 0 1px rgb(var(--hud-border-strong-rgb) / 0.08);
}
.tool-btn:disabled {
@@ -506,14 +511,14 @@
grid-template-columns: auto 1fr;
align-items: center;
gap: 0.45rem;
border: 1px solid rgb(95 132 158 / 0.32);
border: 1px solid rgb(var(--hud-border-rgb) / 0.32);
border-radius: 0.42rem;
padding: 0.25rem 0.55rem;
background: rgb(8 14 18 / 0.76);
background: rgb(var(--hud-surface-rgb) / 0.76);
}
.path-label {
color: rgb(140 163 181 / 0.84);
color: rgb(var(--hud-text-dim-rgb) / 0.84);
font-size: 0.63rem;
letter-spacing: 0.08em;
text-transform: uppercase;
@@ -525,7 +530,7 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: rgb(225 243 255 / 0.97);
color: rgb(var(--hud-text-main-rgb) / 0.97);
font-size: 0.76rem;
letter-spacing: 0.03em;
}

View File

@@ -306,15 +306,25 @@
display: grid;
grid-template-rows: auto auto;
gap: clamp(0.5rem, 1.2vw, 0.85rem);
--panel-line: rgb(var(--hud-border-rgb) / 0.34);
--panel-line-soft: rgb(var(--hud-border-rgb) / 0.22);
--panel-line-strong: rgb(var(--hud-border-strong-rgb) / 0.42);
--panel-surface: rgb(var(--hud-surface-rgb) / 0.7);
--panel-surface-strong: rgb(var(--hud-surface-alt-rgb) / 0.84);
--panel-surface-deep: rgb(var(--hud-surface-deep-rgb) / 0.9);
--panel-text: rgb(var(--hud-text-main-rgb) / 0.96);
--panel-text-dim: rgb(var(--hud-text-dim-rgb) / 0.84);
--panel-glow: rgb(var(--hud-glow-rgb) / 0.12);
--panel-glow-alt: rgb(var(--hud-glow-alt-rgb) / 0.12);
}
.title-bar {
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid rgb(108 143 166 / 0.22);
border-bottom: 1px solid var(--panel-line-soft);
padding: 0.05rem 0.1rem 0.55rem 0.1rem;
background: linear-gradient(180deg, rgb(15 22 28 / 0.32), transparent);
background: linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.32), transparent);
}
.title-cluster {
@@ -328,15 +338,15 @@
inline-size: 0.52rem;
block-size: 0.52rem;
border-radius: 50%;
background: rgb(133 255 68 / 0.95);
box-shadow: 0 0 0 2px rgb(133 255 68 / 0.14);
background: rgb(var(--hud-lime-rgb) / 0.95);
box-shadow: 0 0 0 2px rgb(var(--hud-lime-rgb) / 0.14);
}
.app-name {
font-size: 1rem;
font-weight: 700;
letter-spacing: 0.07em;
color: #f0fbff;
color: rgb(var(--hud-text-main-rgb) / 0.98);
text-transform: uppercase;
}
@@ -359,10 +369,10 @@
justify-content: center;
inline-size: 1.8rem;
block-size: 1.52rem;
border: 1px solid rgb(82 120 146 / 0.36);
border: 1px solid var(--panel-line);
border-radius: 0.34rem;
color: rgb(179 245 255 / 0.92);
background: rgb(8 12 16 / 0.82);
color: rgb(var(--hud-cyan-rgb) / 0.92);
background: rgb(var(--hud-surface-rgb) / 0.82);
cursor: pointer;
transition:
background-color 200ms ease,
@@ -381,27 +391,27 @@
}
.window-btn:hover {
border-color: rgb(62 232 255 / 0.42);
background: rgb(14 20 26 / 0.9);
color: #f3fdff;
border-color: rgb(var(--hud-cyan-rgb) / 0.42);
background: rgb(var(--hud-surface-alt-rgb) / 0.9);
color: rgb(var(--hud-text-main-rgb) / 1);
}
.window-btn.is-maximized {
border-color: rgb(133 255 68 / 0.5);
color: rgb(211 255 190 / 0.92);
border-color: rgb(var(--hud-lime-rgb) / 0.5);
color: rgb(var(--hud-lime-rgb) / 0.92);
}
.window-btn.is-close:hover {
border-color: rgb(255 91 63 / 0.62);
background: rgb(27 11 10 / 0.9);
color: rgb(255 200 188 / 0.96);
border-color: rgb(var(--hud-orange-rgb) / 0.62);
background: rgb(var(--hud-surface-deep-rgb) / 0.92);
color: rgb(var(--hud-orange-rgb) / 0.96);
}
.control-bar {
display: grid;
gap: 0.45rem;
padding: 0 0.1rem;
background: linear-gradient(90deg, rgb(62 232 255 / 0.02), transparent 45%, rgb(133 255 68 / 0.015));
background: linear-gradient(90deg, rgb(var(--hud-glow-rgb) / 0.02), transparent 45%, rgb(var(--hud-glow-alt-rgb) / 0.015));
}
.control-main-row {
@@ -416,32 +426,32 @@
align-items: center;
gap: 0.42rem;
min-block-size: 2rem;
border: 1px solid rgb(95 132 158 / 0.3);
border: 1px solid var(--panel-line);
border-radius: 999px;
padding: 0.2rem 0.62rem 0.2rem 0.36rem;
background: rgb(10 16 20 / 0.68);
background: var(--panel-surface);
}
.state-dot {
inline-size: 0.55rem;
block-size: 0.55rem;
border-radius: 50%;
background: rgb(143 165 186 / 0.92);
box-shadow: 0 0 0 2px rgb(143 165 186 / 0.14);
background: rgb(var(--hud-text-dim-rgb) / 0.92);
box-shadow: 0 0 0 2px rgb(var(--hud-text-dim-rgb) / 0.14);
}
.state-dot.ok {
background: var(--hud-lime);
box-shadow: 0 0 0 2px rgb(133 255 68 / 0.16);
box-shadow: 0 0 0 2px rgb(var(--hud-lime-rgb) / 0.16);
}
.state-dot.warn {
background: var(--hud-orange);
box-shadow: 0 0 0 2px rgb(255 91 63 / 0.16);
box-shadow: 0 0 0 2px rgb(var(--hud-orange-rgb) / 0.16);
}
.state-label {
color: rgb(154 176 194 / 0.84);
color: var(--panel-text-dim);
font-size: 0.66rem;
letter-spacing: 0.08em;
text-transform: uppercase;
@@ -449,7 +459,7 @@
}
.state-value {
color: #ecf8ff;
color: var(--panel-text);
font-size: 0.92rem;
letter-spacing: 0.02em;
font-weight: 600;
@@ -461,10 +471,10 @@
align-items: center;
gap: 0.38rem;
min-block-size: 2rem;
border: 1px solid rgb(95 132 158 / 0.3);
border: 1px solid var(--panel-line);
border-radius: 999px;
padding: 0.18rem 0.2rem 0.18rem 0.56rem;
background: rgb(10 16 20 / 0.7);
background: var(--panel-surface);
min-inline-size: 0;
}
@@ -475,7 +485,7 @@
}
.serial-tag {
color: rgb(154 176 194 / 0.84);
color: var(--panel-text-dim);
font-size: 0.66rem;
letter-spacing: 0.08em;
text-transform: uppercase;
@@ -487,11 +497,11 @@
appearance: none;
inline-size: 100%;
min-inline-size: 7rem;
border: 1px solid rgb(95 132 158 / 0.32);
border: 1px solid var(--panel-line);
border-radius: 999px;
padding: 0.3rem 1.5rem 0.3rem 0.6rem;
background: rgb(4 11 16 / 0.84);
color: #d5ebfb;
background: rgb(var(--hud-surface-deep-rgb) / 0.84);
color: rgb(var(--hud-text-main-rgb) / 0.92);
font-size: 0.84rem;
letter-spacing: 0.06em;
text-transform: uppercase;
@@ -502,12 +512,12 @@
}
.serial-select-input:hover {
border-color: rgb(62 232 255 / 0.36);
border-color: rgb(var(--hud-cyan-rgb) / 0.36);
}
.serial-select-input:focus-visible {
border-color: rgb(62 232 255 / 0.5);
box-shadow: 0 0 0 2px rgb(62 232 255 / 0.14);
border-color: rgb(var(--hud-cyan-rgb) / 0.5);
box-shadow: 0 0 0 2px rgb(var(--hud-cyan-rgb) / 0.14);
}
.serial-select-caret {
@@ -516,8 +526,8 @@
inset-block-start: 50%;
inline-size: 0.42rem;
block-size: 0.42rem;
border-right: 1px solid rgb(153 189 214 / 0.82);
border-bottom: 1px solid rgb(153 189 214 / 0.82);
border-right: 1px solid rgb(var(--hud-text-main-rgb) / 0.82);
border-bottom: 1px solid rgb(var(--hud-text-main-rgb) / 0.82);
transform: translateY(-64%) rotate(45deg);
pointer-events: none;
}
@@ -527,13 +537,13 @@
align-items: center;
gap: 0.36rem;
min-block-size: 2rem;
border: 1px solid rgb(95 132 158 / 0.34);
border: 1px solid var(--panel-line);
border-radius: 999px;
padding: 0.24rem 0.64rem;
background:
linear-gradient(180deg, rgb(11 18 24 / 0.92), rgb(7 12 17 / 0.88)),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.1), transparent 58%);
color: rgb(214 236 248 / 0.96);
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.92), rgb(var(--hud-surface-rgb) / 0.88)),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-rgb) / 0.1), transparent 58%);
color: rgb(var(--hud-text-main-rgb) / 0.96);
font-size: 0.74rem;
letter-spacing: 0.05em;
cursor: pointer;
@@ -556,10 +566,10 @@
}
.refresh-btn:hover:not(:disabled) {
border-color: rgb(62 232 255 / 0.44);
border-color: rgb(var(--hud-cyan-rgb) / 0.44);
box-shadow:
inset 0 0 0 1px rgb(167 218 252 / 0.07),
0 0 10px rgb(62 232 255 / 0.1);
inset 0 0 0 1px rgb(var(--hud-border-strong-rgb) / 0.07),
0 0 10px rgb(var(--hud-glow-rgb) / 0.1);
}
.refresh-btn:disabled {
@@ -572,13 +582,13 @@
align-items: center;
gap: 0.42rem;
min-block-size: 2rem;
border: 1px solid rgb(133 255 68 / 0.4);
border: 1px solid rgb(var(--hud-lime-rgb) / 0.4);
border-radius: 999px;
padding: 0.24rem 0.76rem;
background:
linear-gradient(180deg, rgb(24 33 22 / 0.96), rgb(12 19 12 / 0.92)),
radial-gradient(circle at 50% 0, rgb(133 255 68 / 0.12), transparent 58%);
color: #f2ffe8;
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.96), rgb(var(--hud-surface-rgb) / 0.92)),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-alt-rgb) / 0.12), transparent 58%);
color: rgb(var(--hud-text-main-rgb) / 0.98);
font-size: 0.78rem;
letter-spacing: 0.05em;
cursor: pointer;
@@ -591,10 +601,10 @@
}
.connect-btn:hover:not(:disabled) {
border-color: rgb(170 255 121 / 0.62);
border-color: rgb(var(--hud-lime-rgb) / 0.62);
box-shadow:
inset 0 0 0 1px rgb(231 255 214 / 0.08),
0 0 12px rgb(133 255 68 / 0.14);
inset 0 0 0 1px rgb(var(--hud-text-main-rgb) / 0.08),
0 0 12px rgb(var(--hud-glow-alt-rgb) / 0.14);
}
.connect-btn:disabled {
@@ -603,19 +613,19 @@
}
.connect-btn.is-busy {
border-color: rgb(255 91 63 / 0.48);
border-color: rgb(var(--hud-orange-rgb) / 0.48);
background:
linear-gradient(180deg, rgb(38 18 15 / 0.96), rgb(23 10 10 / 0.92)),
radial-gradient(circle at 50% 0, rgb(255 91 63 / 0.12), transparent 58%);
color: rgb(255 223 217 / 0.96);
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.96), rgb(var(--hud-surface-deep-rgb) / 0.92)),
radial-gradient(circle at 50% 0, rgb(var(--hud-orange-rgb) / 0.12), transparent 58%);
color: rgb(var(--hud-orange-rgb) / 0.96);
}
.connect-btn.is-connected {
border-color: rgb(62 232 255 / 0.46);
border-color: rgb(var(--hud-cyan-rgb) / 0.46);
background:
linear-gradient(180deg, rgb(10 28 32 / 0.96), rgb(6 15 18 / 0.92)),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.14), transparent 58%);
color: rgb(227 251 255 / 0.98);
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.96), rgb(var(--hud-surface-rgb) / 0.92)),
radial-gradient(circle at 50% 0, rgb(var(--hud-cyan-rgb) / 0.14), transparent 58%);
color: rgb(var(--hud-text-main-rgb) / 0.98);
}
.connect-btn-indicator {

View File

@@ -26,7 +26,7 @@
export let matrixRows = 12;
export let matrixCols = 7;
export let rangeMin = 0;
export let rangeMax = 5000;
export let rangeMax = 16000;
export let colorMapPreset: PressureColorMapPreset = "emerald";
let viewerEl: HTMLDivElement | undefined;
@@ -34,7 +34,7 @@
let overlayEl: HTMLCanvasElement | undefined;
let stats: ViewerStats = { total: 0, max: 0, avg: 0 };
const RAW_DATA_MAX = 5000;
const DEFAULT_RANGE_MAX = 16000;
const BASE_MATRIX_SPAN = 24;
const MATRIX_SPAN_GROWTH = 0.6;
const MIN_MATRIX_SPAN = 24;
@@ -64,7 +64,6 @@
const MATRIX_ROTATION_Y = 0;
const labelVector = new THREE.Vector3();
const whiteColor = new THREE.Color("#ffffff");
$: resolvedColorPalette = pressureColorPalettes[colorMapPreset] ?? pressureColorPalettes.emerald;
$: surfaceBaseColor = new THREE.Color(resolvedColorPalette.surfaceBase);
$: surfaceLowColor = new THREE.Color(resolvedColorPalette.surfaceLow);
@@ -75,6 +74,38 @@
$: labelLowColor = new THREE.Color(resolvedColorPalette.labelLow);
$: labelMidColor = new THREE.Color(resolvedColorPalette.labelMid);
$: labelHighColor = new THREE.Color(resolvedColorPalette.labelHigh);
$: sceneClearColor = new THREE.Color(resolvedColorPalette.uiTheme.bg30);
$: sceneBoardColor = new THREE.Color(resolvedColorPalette.uiTheme.bg20);
$: sceneGridCenterColor = new THREE.Color(resolvedColorPalette.surfaceMid);
$: sceneGridLineColor = new THREE.Color(resolvedColorPalette.uiTheme.bg20);
$: sceneAmbientLightColor = rgbTripletToThreeColor(resolvedColorPalette.uiTheme.textMainRgb);
$: sceneKeyLightColor = rgbTripletToThreeColor(resolvedColorPalette.uiTheme.glowAltRgb);
$: sceneAccentLightColor = rgbTripletToThreeColor(resolvedColorPalette.uiTheme.glowRgb);
$: surfaceThemeAccentColor = rgbTripletToThreeColor(resolvedColorPalette.uiTheme.glowRgb);
$: labelThemeAccentColor = rgbTripletToThreeColor(resolvedColorPalette.uiTheme.glowRgb);
$: labelHighlightCss = colorToCss(surfaceHotColor);
$: viewerThemeStyle = [
`--matrix-bg-10: ${resolvedColorPalette.uiTheme.bg10}`,
`--matrix-bg-20: ${resolvedColorPalette.uiTheme.bg20}`,
`--matrix-bg-30: ${resolvedColorPalette.uiTheme.bg30}`,
`--matrix-text-main-rgb: ${resolvedColorPalette.uiTheme.textMainRgb}`,
`--matrix-text-dim-rgb: ${resolvedColorPalette.uiTheme.textDimRgb}`,
`--matrix-border-rgb: ${resolvedColorPalette.uiTheme.borderRgb}`,
`--matrix-border-strong-rgb: ${resolvedColorPalette.uiTheme.borderStrongRgb}`,
`--matrix-surface-rgb: ${resolvedColorPalette.uiTheme.surfaceRgb}`,
`--matrix-surface-alt-rgb: ${resolvedColorPalette.uiTheme.surfaceAltRgb}`,
`--matrix-surface-deep-rgb: ${resolvedColorPalette.uiTheme.surfaceDeepRgb}`,
`--matrix-glow-rgb: ${resolvedColorPalette.uiTheme.glowRgb}`,
`--matrix-glow-alt-rgb: ${resolvedColorPalette.uiTheme.glowAltRgb}`
].join("; ");
let rendererRef: THREE.WebGLRenderer | null = null;
let boardMaterialRef: THREE.MeshBasicMaterial | null = null;
let gridRef: THREE.GridHelper | null = null;
let gridMaterialRef: THREE.Material | THREE.Material[] | null = null;
let ambientLightRef: THREE.AmbientLight | null = null;
let dirLightRef: THREE.DirectionalLight | null = null;
let sideLightRef: THREE.DirectionalLight | null = null;
function sanitizeGridValue(value: number): number {
return clamp(Math.round(Number.isFinite(value) ? value : 12), 1, 128);
@@ -82,7 +113,7 @@
function sanitizeRangePair(minValue: number, maxValue: number): { min: number; max: number } {
const resolvedMin = Math.round(Number.isFinite(minValue) ? minValue : 0);
const resolvedMax = Math.max(Math.round(Number.isFinite(maxValue) ? maxValue : RAW_DATA_MAX), resolvedMin + 1);
const resolvedMax = Math.max(Math.round(Number.isFinite(maxValue) ? maxValue : DEFAULT_RANGE_MAX), resolvedMin + 1);
return { min: resolvedMin, max: resolvedMax };
}
@@ -107,6 +138,10 @@
return clamp((value - minValue) / Math.max(1, maxValue - minValue), 0, 1);
}
function rgbTripletToThreeColor(rgbTriplet: string): THREE.Color {
return new THREE.Color(`rgb(${rgbTriplet.replace(/\s+/g, ", ")})`);
}
function surfaceColorMap(valueNormalized: number, target: THREE.Color = new THREE.Color()): THREE.Color {
const value = clamp(valueNormalized, 0, 1);
let mapped: THREE.Color;
@@ -122,14 +157,15 @@
mapped = target.copy(surfaceMidColor).lerp(surfaceHighColor, t);
}
const baseAccentStrength = (1 - smoothstep(0.12, 0.52, value)) * 0.34;
const highlightStrength = smoothstep(0.82, 1, value) * 0.3;
return mapped.lerp(surfaceHotColor, highlightStrength);
return mapped.lerp(surfaceThemeAccentColor, baseAccentStrength).lerp(surfaceHotColor, highlightStrength);
}
function glowColorMap(valueNormalized: number, target: THREE.Color = new THREE.Color()): THREE.Color {
const value = clamp(valueNormalized, 0, 1);
const glowStrength = smoothstep(0.55, 1, value);
return surfaceColorMap(value, target).lerp(whiteColor, glowStrength * 0.42);
return surfaceColorMap(value, target).lerp(surfaceHotColor, glowStrength * 0.42);
}
function labelColorMap(valueNormalized: number, target: THREE.Color = new THREE.Color()): THREE.Color {
@@ -147,8 +183,9 @@
mapped = target.copy(labelMidColor).lerp(labelHighColor, t);
}
const baseAccentStrength = (1 - smoothstep(0.16, 0.58, value)) * 0.46;
const highlightStrength = smoothstep(0.8, 1, value) * 0.36;
return mapped.lerp(whiteColor, highlightStrength);
return mapped.lerp(labelThemeAccentColor, baseAccentStrength).lerp(surfaceHotColor, highlightStrength);
}
function shapeHeightValue(valueNormalized: number): number {
@@ -208,7 +245,8 @@
function copyExternalField(target: Float32Array, values: number[]): void {
for (let index = 0; index < target.length; index += 1) {
target[index] = clamp(values[index] ?? 0, 0, RAW_DATA_MAX);
const value = Number(values[index] ?? 0);
target[index] = Number.isFinite(value) ? value : 0;
}
}
@@ -217,7 +255,7 @@
return 0;
}
return Math.round(clamp(rawValue, 0, Math.max(maxValue, RAW_DATA_MAX)));
return Math.round(rawValue);
}
function colorToCss(color: THREE.Color): string {
@@ -228,6 +266,57 @@
const t = index / 32;
return colorToCss(labelColorMap(t, new THREE.Color()));
});
$: labelGlowPalette = Array.from({ length: 33 }, (_, index) => {
const t = index / 32;
return colorToCss(glowColorMap(t, new THREE.Color()));
});
function applyGridTheme(grid: THREE.GridHelper, divisions: number): void {
const colorAttribute = grid.geometry.getAttribute("color");
if (!(colorAttribute instanceof THREE.BufferAttribute)) {
return;
}
for (let division = 0; division <= divisions; division += 1) {
const lineColor = division === divisions / 2 ? sceneGridCenterColor : sceneGridLineColor;
const vertexBase = division * 4;
for (let vertexOffset = 0; vertexOffset < 4; vertexOffset += 1) {
colorAttribute.setXYZ(vertexBase + vertexOffset, lineColor.r, lineColor.g, lineColor.b);
}
}
colorAttribute.needsUpdate = true;
}
function applySceneTheme(): void {
if (!rendererRef || !boardMaterialRef || !gridRef || !gridMaterialRef) {
return;
}
rendererRef.setClearColor(sceneClearColor, 1);
boardMaterialRef.color.copy(sceneBoardColor);
boardMaterialRef.needsUpdate = true;
applyGridTheme(gridRef, matrixLayout.gridDivisions);
if (Array.isArray(gridMaterialRef)) {
for (const material of gridMaterialRef) {
material.transparent = true;
material.opacity = 0.034;
material.needsUpdate = true;
}
} else {
gridMaterialRef.transparent = true;
gridMaterialRef.opacity = 0.034;
gridMaterialRef.needsUpdate = true;
}
ambientLightRef?.color.copy(sceneAmbientLightColor);
dirLightRef?.color.copy(sceneKeyLightColor);
sideLightRef?.color.copy(sceneAccentLightColor);
}
$: applySceneTheme();
onMount(() => {
if (!viewerEl || !canvasEl || !overlayEl) {
@@ -251,8 +340,9 @@
alpha: true,
powerPreference: "high-performance"
});
rendererRef = renderer;
renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));
renderer.setClearColor(0x06080a, 1);
renderer.setClearColor(sceneClearColor, 1);
renderer.outputColorSpace = THREE.SRGBColorSpace;
const scene = new THREE.Scene();
@@ -277,11 +367,14 @@
controls.target.set(CAMERA_TARGET_X, CAMERA_TARGET_Y, CAMERA_TARGET_Z);
controls.enabled = false;
const ambientLight = new THREE.AmbientLight(0xffffff, 0.26);
const dirLight = new THREE.DirectionalLight(0xffffff, 0.34);
const ambientLight = new THREE.AmbientLight(sceneAmbientLightColor, 0.26);
const dirLight = new THREE.DirectionalLight(sceneKeyLightColor, 0.34);
dirLight.position.set(50, 100, 50);
const sideLight = new THREE.DirectionalLight(0x7cffba, 0.16);
const sideLight = new THREE.DirectionalLight(sceneAccentLightColor, 0.16);
sideLight.position.set(-50, 50, -50);
ambientLightRef = ambientLight;
dirLightRef = dirLight;
sideLightRef = sideLight;
scene.add(ambientLight, dirLight, sideLight);
const matrixGroup = new THREE.Group();
@@ -292,29 +385,33 @@
const board = new THREE.Mesh(
new THREE.PlaneGeometry(boardWidth + boardPadding * 2, boardDepth + boardPadding * 2),
new THREE.MeshBasicMaterial({
color: 0x05070a,
color: sceneBoardColor,
transparent: true,
opacity: 0.12,
toneMapped: false
})
);
boardMaterialRef = board.material;
board.rotation.x = -Math.PI / 2;
board.position.y = -0.04;
matrixGroup.add(board);
const grid = new THREE.GridHelper(gridSpan, gridDivisions, 0x1a2630, 0x0a1015);
const grid = new THREE.GridHelper(gridSpan, gridDivisions, sceneGridCenterColor, sceneGridLineColor);
gridRef = grid;
grid.position.y = 0;
const gridMaterial = grid.material;
gridMaterialRef = gridMaterial;
if (Array.isArray(gridMaterial)) {
for (const material of gridMaterial) {
material.transparent = true;
material.opacity = 0.028;
material.opacity = 0.034;
}
} else {
gridMaterial.transparent = true;
gridMaterial.opacity = 0.028;
gridMaterial.opacity = 0.034;
}
matrixGroup.add(grid);
applySceneTheme();
const cellX = new Float32Array(instanceCount);
const cellZ = new Float32Array(instanceCount);
@@ -377,14 +474,14 @@
overlayContext.font = `600 ${glyphSize.toFixed(1)}px "JetBrains Mono", "IBM Plex Mono", "Consolas", monospace`;
overlayContext.shadowBlur = glowBlur;
overlayContext.shadowColor = labelPalette[bucket];
overlayContext.shadowColor = labelGlowPalette[bucket];
overlayContext.fillStyle = labelPalette[bucket];
overlayContext.globalAlpha = displayValue === 0 ? 0.86 : 1;
overlayContext.fillText(displayText, screenX, screenY);
if (normalized >= 0.8) {
overlayContext.fillStyle = "rgb(255 245 220)";
overlayContext.fillStyle = labelHighlightCss;
overlayContext.globalAlpha = smoothstep(0.8, 1, normalized) * 0.34;
overlayContext.fillText(displayText, screenX, screenY);
}
@@ -493,11 +590,18 @@
gridMaterial.dispose();
}
renderer.dispose();
rendererRef = null;
boardMaterialRef = null;
gridRef = null;
gridMaterialRef = null;
ambientLightRef = null;
dirLightRef = null;
sideLightRef = null;
};
});
</script>
<div class="viewer-root" bind:this={viewerEl}>
<div class="viewer-root" bind:this={viewerEl} style={viewerThemeStyle}>
<canvas class="viewer-canvas" bind:this={canvasEl} aria-label="Pressure Matrix Viewer"></canvas>
<canvas class="viewer-overlay" bind:this={overlayEl} aria-hidden="true"></canvas>
@@ -532,9 +636,9 @@
inset: 0;
overflow: hidden;
background:
radial-gradient(circle at 50% 58%, rgb(72 127 255 / 0.065), transparent 32%),
radial-gradient(circle at 50% 12%, rgb(151 231 255 / 0.05), transparent 26%),
linear-gradient(180deg, rgb(10 13 17 / 0.82), rgb(5 7 10 / 0.96));
radial-gradient(circle at 50% 58%, rgb(var(--matrix-glow-rgb) / 0.11), transparent 32%),
radial-gradient(circle at 50% 12%, rgb(var(--matrix-glow-alt-rgb) / 0.09), transparent 26%),
linear-gradient(180deg, color-mix(in srgb, var(--matrix-bg-10) 84%, transparent), color-mix(in srgb, var(--matrix-bg-30) 96%, black 4%));
}
.viewer-canvas,
@@ -563,7 +667,14 @@
}
.viewer-noise {
background: repeating-linear-gradient(180deg, rgb(124 165 216 / 0.02) 0, rgb(124 165 216 / 0.02) 1px, transparent 1px, transparent 3px);
background:
repeating-linear-gradient(
180deg,
rgb(var(--matrix-glow-alt-rgb) / 0.025) 0,
rgb(var(--matrix-glow-alt-rgb) / 0.025) 1px,
transparent 1px,
transparent 3px
);
}
.viewer-controls {
@@ -580,17 +691,19 @@
display: grid;
gap: 0.58rem;
padding: 0.74rem 0.84rem 0.82rem;
border: 1px solid rgb(86 151 118 / 0.32);
border: 1px solid rgb(var(--matrix-border-rgb) / 0.32);
border-radius: 0.76rem;
background: linear-gradient(180deg, rgb(7 17 14 / 0.9), rgb(5 10 9 / 0.84));
box-shadow: inset 0 1px 0 rgb(171 224 197 / 0.08), 0 0 24px rgb(42 138 88 / 0.08);
background: linear-gradient(180deg, rgb(var(--matrix-surface-alt-rgb) / 0.92), rgb(var(--matrix-surface-deep-rgb) / 0.86));
box-shadow:
inset 0 1px 0 rgb(var(--matrix-border-strong-rgb) / 0.08),
0 0 24px rgb(var(--matrix-glow-rgb) / 0.08);
}
.stats-label,
.stats-key,
.stats-note {
margin: 0;
color: rgb(165 212 187 / 0.84);
color: rgb(var(--matrix-text-dim-rgb) / 0.84);
font-size: 0.58rem;
letter-spacing: 0.12em;
text-transform: uppercase;
@@ -607,9 +720,9 @@
gap: 0.24rem;
min-height: 4.2rem;
padding: 0.58rem 0.64rem;
border: 1px solid rgb(71 122 96 / 0.24);
border: 1px solid rgb(var(--matrix-border-rgb) / 0.24);
border-radius: 0.56rem;
background: linear-gradient(180deg, rgb(8 16 14 / 0.88), rgb(5 9 8 / 0.84));
background: linear-gradient(180deg, rgb(var(--matrix-surface-rgb) / 0.9), rgb(var(--matrix-surface-deep-rgb) / 0.86));
}
.stats-card-wide {
@@ -617,7 +730,7 @@
}
.stats-value {
color: rgb(240 246 255 / 0.98);
color: rgb(var(--matrix-text-main-rgb) / 0.98);
font-size: clamp(1.16rem, 1vw + 0.82rem, 1.56rem);
line-height: 1;
font-weight: 600;

View File

@@ -162,16 +162,16 @@
aspect-ratio: 1.44 / 1;
min-block-size: 11.8rem;
justify-self: start;
border: 1px solid rgb(130 174 202 / 0.42);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.42);
border-radius: 0.92rem;
padding: 0.56rem 0.62rem 0.58rem;
background:
linear-gradient(160deg, rgb(10 18 26 / 0.76) 0%, rgb(3 8 12 / 0.62) 48%, rgb(1 2 4 / 0.76) 100%),
radial-gradient(circle at 12% 0, rgb(62 232 255 / 0.1), transparent 40%);
linear-gradient(160deg, rgb(var(--hud-surface-alt-rgb) / 0.76) 0%, rgb(var(--hud-surface-rgb) / 0.62) 48%, rgb(var(--hud-surface-deep-rgb) / 0.76) 100%),
radial-gradient(circle at 12% 0, rgb(var(--hud-glow-rgb) / 0.1), transparent 40%);
box-shadow:
inset 0 0 0 1px rgb(165 224 255 / 0.08),
inset 0 0 0 1px rgb(var(--hud-border-strong-rgb) / 0.08),
inset 0 -24px 32px rgb(0 0 0 / 0.48),
0 0 14px rgb(62 232 255 / 0.14);
0 0 14px rgb(var(--hud-glow-rgb) / 0.14);
opacity: 1;
transform: translateX(0) scale(1) rotate(0);
transition:
@@ -215,7 +215,7 @@
.panel-code {
margin: 0;
font-size: 0.63rem;
color: rgb(153 188 211 / 0.88);
color: rgb(var(--hud-text-dim-rgb) / 0.88);
letter-spacing: 0.12em;
text-transform: uppercase;
}
@@ -223,7 +223,7 @@
.panel-title {
margin: 0.12rem 0 0;
font-size: 0.75rem;
color: rgb(225 243 255 / 0.96);
color: rgb(var(--hud-text-main-rgb) / 0.96);
letter-spacing: 0.05em;
}
@@ -236,25 +236,25 @@
}
.icon-chip {
border: 1px solid rgb(138 178 204 / 0.44);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.44);
border-radius: 999px;
padding: 0.08rem 0.36rem;
font-size: 0.58rem;
letter-spacing: 0.08em;
color: rgb(209 237 255 / 0.94);
background: rgb(5 13 20 / 0.66);
color: rgb(var(--hud-text-main-rgb) / 0.94);
background: rgb(var(--hud-surface-rgb) / 0.66);
}
.icon-chip.tone-cyan {
border-color: rgb(62 232 255 / 0.54);
border-color: rgb(var(--hud-cyan-rgb) / 0.54);
}
.icon-chip.tone-lime {
border-color: rgb(133 255 68 / 0.56);
border-color: rgb(var(--hud-lime-rgb) / 0.56);
}
.icon-chip.tone-orange {
border-color: rgb(255 91 63 / 0.58);
border-color: rgb(var(--hud-orange-rgb) / 0.58);
}
.icon-chip.tone-violet {
@@ -272,12 +272,12 @@
.chart-stage {
position: relative;
block-size: clamp(6.4rem, 9vw, 8.2rem);
border: 1px solid rgb(132 174 200 / 0.32);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.32);
border-radius: 0.62rem;
overflow: hidden;
background:
linear-gradient(180deg, rgb(8 17 26 / 0.68), rgb(1 6 10 / 0.78)),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.09), transparent 45%);
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.68), rgb(var(--hud-surface-deep-rgb) / 0.78)),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-rgb) / 0.09), transparent 45%);
}
svg {
@@ -287,7 +287,7 @@
}
.grid-line-group line {
stroke: rgb(138 184 210 / 0.16);
stroke: rgb(var(--hud-border-strong-rgb) / 0.16);
stroke-width: 0.45;
}
@@ -300,15 +300,15 @@
}
.series-line.tone-cyan {
stroke: rgb(62 232 255 / 0.95);
stroke: rgb(var(--hud-cyan-rgb) / 0.95);
}
.series-line.tone-lime {
stroke: rgb(133 255 68 / 0.94);
stroke: rgb(var(--hud-lime-rgb) / 0.94);
}
.series-line.tone-orange {
stroke: rgb(255 91 63 / 0.94);
stroke: rgb(var(--hud-orange-rgb) / 0.94);
}
.series-line.tone-violet {
@@ -329,12 +329,12 @@
background:
repeating-linear-gradient(
180deg,
rgb(146 191 214 / 0.04) 0,
rgb(146 191 214 / 0.04) 1px,
rgb(var(--hud-border-strong-rgb) / 0.04) 0,
rgb(var(--hud-border-strong-rgb) / 0.04) 1px,
transparent 1px,
transparent 3px
),
linear-gradient(180deg, transparent 0%, rgb(62 232 255 / 0.06) 50%, transparent 100%);
linear-gradient(180deg, transparent 0%, rgb(var(--hud-glow-rgb) / 0.06) 50%, transparent 100%);
background-size: 100% 100%, 100% 100%;
mix-blend-mode: screen;
pointer-events: none;
@@ -353,7 +353,7 @@
display: inline-flex;
align-items: center;
gap: 0.3rem;
color: rgb(173 206 227 / 0.9);
color: rgb(var(--hud-text-main-rgb) / 0.9);
font-size: 0.62rem;
letter-spacing: 0.04em;
}
@@ -365,19 +365,19 @@
}
.dot.tone-cyan {
background: rgb(62 232 255);
background: rgb(var(--hud-cyan-rgb));
}
.dot.tone-lime {
background: rgb(133 255 68);
background: rgb(var(--hud-lime-rgb));
}
.dot.tone-orange {
background: rgb(255 91 63);
background: rgb(var(--hud-orange-rgb));
}
.metric-label {
color: rgb(144 172 191 / 0.82);
color: rgb(var(--hud-text-dim-rgb) / 0.82);
text-transform: uppercase;
letter-spacing: 0.08em;
}

View File

@@ -313,15 +313,15 @@
grid-template-rows: auto auto auto;
gap: 0.4rem;
padding: 0.56rem 0.62rem 0.58rem;
border: 1px solid rgb(130 174 202 / 0.42);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.42);
border-radius: 0.92rem;
background:
linear-gradient(160deg, rgb(10 18 26 / 0.76) 0%, rgb(3 8 12 / 0.62) 48%, rgb(1 2 4 / 0.76) 100%),
radial-gradient(circle at 12% 0, rgb(62 232 255 / 0.1), transparent 40%);
linear-gradient(160deg, rgb(var(--hud-surface-alt-rgb) / 0.76) 0%, rgb(var(--hud-surface-rgb) / 0.62) 48%, rgb(var(--hud-surface-deep-rgb) / 0.76) 100%),
radial-gradient(circle at 12% 0, rgb(var(--hud-glow-rgb) / 0.1), transparent 40%);
box-shadow:
inset 0 0 0 1px rgb(165 224 255 / 0.08),
inset 0 0 0 1px rgb(var(--hud-border-strong-rgb) / 0.08),
inset 0 -24px 32px rgb(0 0 0 / 0.48),
0 0 14px rgb(62 232 255 / 0.14);
0 0 14px rgb(var(--hud-glow-rgb) / 0.14);
opacity: 1;
transform: translateX(0) scale(1) rotate(0);
transition:
@@ -360,7 +360,7 @@
.panel-code {
margin: 0;
font-size: 0.63rem;
color: rgb(153 188 211 / 0.88);
color: rgb(var(--hud-text-dim-rgb) / 0.88);
letter-spacing: 0.12em;
text-transform: uppercase;
}
@@ -368,7 +368,7 @@
.panel-title {
margin: 0.12rem 0 0;
font-size: 0.75rem;
color: rgb(225 243 255 / 0.96);
color: rgb(var(--hud-text-main-rgb) / 0.96);
letter-spacing: 0.05em;
}
@@ -381,36 +381,36 @@
}
.icon-chip {
border: 1px solid rgb(138 178 204 / 0.44);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.44);
border-radius: 999px;
padding: 0.08rem 0.36rem;
font-size: 0.58rem;
letter-spacing: 0.08em;
color: rgb(209 237 255 / 0.94);
background: rgb(5 13 20 / 0.66);
color: rgb(var(--hud-text-main-rgb) / 0.94);
background: rgb(var(--hud-surface-rgb) / 0.66);
}
.icon-chip.tone-cyan {
border-color: rgb(62 232 255 / 0.54);
border-color: rgb(var(--hud-cyan-rgb) / 0.54);
}
.icon-chip.tone-lime {
border-color: rgb(133 255 68 / 0.56);
border-color: rgb(var(--hud-lime-rgb) / 0.56);
}
.icon-chip.tone-orange {
border-color: rgb(255 91 63 / 0.58);
border-color: rgb(var(--hud-orange-rgb) / 0.58);
}
.chart-stage {
position: relative;
block-size: clamp(6.4rem, 9vw, 8.2rem);
overflow: hidden;
border: 1px solid rgb(132 174 200 / 0.32);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.32);
border-radius: 0.62rem;
background:
linear-gradient(180deg, rgb(8 17 26 / 0.68), rgb(1 6 10 / 0.78)),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.09), transparent 45%);
linear-gradient(180deg, rgb(var(--hud-surface-alt-rgb) / 0.68), rgb(var(--hud-surface-deep-rgb) / 0.78)),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-rgb) / 0.09), transparent 45%);
}
svg {
@@ -420,7 +420,7 @@
}
.grid-lines line {
stroke: rgb(138 184 210 / 0.16);
stroke: rgb(var(--hud-border-strong-rgb) / 0.16);
stroke-width: 0.45;
}
@@ -430,20 +430,20 @@
.summary-line {
fill: none;
stroke: rgb(62 232 255 / 0.96);
stroke: rgb(var(--hud-cyan-rgb) / 0.96);
stroke-width: 1.35;
stroke-linecap: round;
stroke-linejoin: round;
filter: drop-shadow(0 0 4px rgb(62 232 255 / 0.22));
filter: drop-shadow(0 0 4px rgb(var(--hud-cyan-rgb) / 0.22));
}
.summary-dot {
fill: rgb(133 255 68 / 0.98);
filter: drop-shadow(0 0 6px rgb(133 255 68 / 0.3));
fill: rgb(var(--hud-lime-rgb) / 0.98);
filter: drop-shadow(0 0 6px rgb(var(--hud-lime-rgb) / 0.3));
}
.axis-label {
fill: rgb(176 204 222 / 0.88);
fill: rgb(var(--hud-text-main-rgb) / 0.88);
font-size: 2.8px;
font-weight: 500;
letter-spacing: 0.02em;
@@ -453,11 +453,11 @@
}
.y-axis-label {
fill: rgb(162 198 220 / 0.84);
fill: rgb(var(--hud-text-dim-rgb) / 0.84);
}
.x-axis-label {
fill: rgb(162 198 220 / 0.9);
fill: rgb(var(--hud-text-dim-rgb) / 0.9);
}
.empty-state {
@@ -466,11 +466,11 @@
display: flex;
align-items: center;
justify-content: center;
color: rgb(155 186 204 / 0.76);
color: rgb(var(--hud-text-dim-rgb) / 0.76);
font-size: 0.66rem;
letter-spacing: 0.08em;
text-transform: uppercase;
background: linear-gradient(180deg, rgb(2 7 11 / 0.06), rgb(2 7 11 / 0.18));
background: linear-gradient(180deg, rgb(var(--hud-surface-deep-rgb) / 0.06), rgb(var(--hud-surface-deep-rgb) / 0.18));
}
.panel-foot {
@@ -486,13 +486,13 @@
display: inline-flex;
align-items: center;
gap: 0.28rem;
color: rgb(173 206 227 / 0.9);
color: rgb(var(--hud-text-main-rgb) / 0.9);
font-size: 0.62rem;
letter-spacing: 0.04em;
}
.metric-text {
color: rgb(146 173 191 / 0.82);
color: rgb(var(--hud-text-dim-rgb) / 0.82);
text-transform: uppercase;
}
@@ -503,15 +503,15 @@
}
.dot.tone-cyan {
background: rgb(62 232 255);
background: rgb(var(--hud-cyan-rgb));
}
.dot.tone-lime {
background: rgb(133 255 68);
background: rgb(var(--hud-lime-rgb));
}
.dot.tone-orange {
background: rgb(255 91 63);
background: rgb(var(--hud-orange-rgb));
}
.value {

View File

@@ -12,6 +12,25 @@ export interface PressureColorPalette {
labelHigh: string;
rangeStops: [string, string, string, string, string, string];
rangeGlow: [string, string, string];
uiTheme: {
bg00: string;
bg10: string;
bg20: string;
bg30: string;
textMainRgb: string;
textDimRgb: string;
borderRgb: string;
borderStrongRgb: string;
surfaceRgb: string;
surfaceAltRgb: string;
surfaceDeepRgb: string;
glowRgb: string;
glowAltRgb: string;
cyanRgb: string;
limeRgb: string;
orangeRgb: string;
infoRgb: string;
};
}
export const pressureColorPalettes: Record<PressureColorMapPreset, PressureColorPalette> = {
@@ -26,7 +45,26 @@ export const pressureColorPalettes: Record<PressureColorMapPreset, PressureColor
labelMid: "#98e6ff",
labelHigh: "#ffab78",
rangeStops: ["#13201a", "#285338", "#3f8a66", "#6dd3ad", "#98e6ff", "#ffab78"],
rangeGlow: ["#54df8e", "#98e6ff", "#ffab78"]
rangeGlow: ["#54df8e", "#98e6ff", "#ffab78"],
uiTheme: {
bg00: "#020403",
bg10: "#07100d",
bg20: "#0c1712",
bg30: "#040806",
textMainRgb: "240 251 255",
textDimRgb: "157 206 181",
borderRgb: "88 132 116",
borderStrongRgb: "120 190 156",
surfaceRgb: "8 18 14",
surfaceAltRgb: "12 26 20",
surfaceDeepRgb: "4 10 8",
glowRgb: "84 223 142",
glowAltRgb: "152 230 255",
cyanRgb: "152 230 255",
limeRgb: "84 223 142",
orangeRgb: "255 171 120",
infoRgb: "122 198 255"
}
},
arctic: {
surfaceBase: "#08141d",
@@ -39,7 +77,26 @@ export const pressureColorPalettes: Record<PressureColorMapPreset, PressureColor
labelMid: "#aef3ff",
labelHigh: "#ffffff",
rangeStops: ["#08141d", "#14354d", "#1f6690", "#58bee8", "#aef3ff", "#ffffff"],
rangeGlow: ["#5ea9ff", "#7fe5ff", "#ffffff"]
rangeGlow: ["#5ea9ff", "#7fe5ff", "#ffffff"],
uiTheme: {
bg00: "#02070c",
bg10: "#07131b",
bg20: "#0d1f2b",
bg30: "#040b12",
textMainRgb: "236 248 255",
textDimRgb: "147 187 212",
borderRgb: "86 129 160",
borderStrongRgb: "129 193 228",
surfaceRgb: "7 16 24",
surfaceAltRgb: "10 23 34",
surfaceDeepRgb: "4 9 15",
glowRgb: "109 200 255",
glowAltRgb: "174 243 255",
cyanRgb: "109 200 255",
limeRgb: "174 243 255",
orangeRgb: "255 194 138",
infoRgb: "94 169 255"
}
},
ember: {
surfaceBase: "#1b0c08",
@@ -52,6 +109,25 @@ export const pressureColorPalettes: Record<PressureColorMapPreset, PressureColor
labelMid: "#ffd06a",
labelHigh: "#fff4df",
rangeStops: ["#1b0c08", "#4a1f15", "#8f4124", "#d9772f", "#ffd06a", "#fff4df"],
rangeGlow: ["#ff7247", "#ffb14d", "#fff4df"]
rangeGlow: ["#ff7247", "#ffb14d", "#fff4df"],
uiTheme: {
bg00: "#0a0503",
bg10: "#140906",
bg20: "#22120c",
bg30: "#0c0504",
textMainRgb: "255 241 231",
textDimRgb: "202 156 128",
borderRgb: "144 101 77",
borderStrongRgb: "214 145 92",
surfaceRgb: "20 10 8",
surfaceAltRgb: "32 15 11",
surfaceDeepRgb: "13 7 6",
glowRgb: "255 138 78",
glowAltRgb: "255 208 106",
cyanRgb: "255 180 109",
limeRgb: "255 208 106",
orangeRgb: "255 108 84",
infoRgb: "255 160 96"
}
}
};

View File

@@ -8,6 +8,19 @@
--hud-cyan: #3ee8ff;
--hud-lime: #85ff44;
--hud-orange: #ff5b3f;
--hud-cyan-rgb: 62 232 255;
--hud-lime-rgb: 133 255 68;
--hud-orange-rgb: 255 91 63;
--hud-info-rgb: 122 198 255;
--hud-border-rgb: 95 132 158;
--hud-border-strong-rgb: 140 184 210;
--hud-surface-rgb: 8 14 19;
--hud-surface-alt-rgb: 12 20 26;
--hud-surface-deep-rgb: 4 10 14;
--hud-glow-rgb: 62 232 255;
--hud-glow-alt-rgb: 133 255 68;
--hud-text-main-rgb: 207 231 255;
--hud-text-dim-rgb: 134 162 184;
--hud-range-0: #13201a;
--hud-range-1: #285338;
--hud-range-2: #3f8a66;
@@ -20,8 +33,8 @@
/* Keep root surface close to the main board style to avoid visible drag-edge seams. */
background:
radial-gradient(circle at 18% 8%, rgb(62 232 255 / 0.05), transparent 38%),
radial-gradient(circle at 84% 14%, rgb(133 255 68 / 0.04), transparent 36%),
radial-gradient(circle at 18% 8%, rgb(var(--hud-glow-rgb) / 0.05), transparent 38%),
radial-gradient(circle at 84% 14%, rgb(var(--hud-glow-alt-rgb) / 0.04), transparent 36%),
linear-gradient(165deg, var(--hud-bg-20) 0%, var(--hud-bg-10) 48%, var(--hud-bg-30) 100%);
background-color: var(--hud-bg-00);
}

View File

@@ -42,7 +42,7 @@
const copyByLocale: Record<LocaleCode, HudCopy> = {
"zh-CN": {
appName: "JOYSON HUD",
appName: "JE-Skin",
suiteName: "v0.1.0",
stageTitle: "WebGL2 主渲染区",
stageHint: "底图与三维操作将在此区域加载",
@@ -98,7 +98,7 @@
disconnectedLabel: "未连接"
},
"en-US": {
appName: "JOYSON HUD",
appName: "JE-Skin",
suiteName: "v0.1.0",
stageTitle: "WebGL2 Main Surface",
stageHint: "Map texture and 3D interactions will render here",
@@ -197,7 +197,7 @@
let connectionNotice = "";
let connectionNoticeTone: HudNoticeTone = "info";
let isExporting = false;
let deviceValue = "JY-Sense Unit";
let deviceValue = "JE-Skin-F";
let sampleRateValue = "100Hz";
let channelsValue = "84";
let webglStatusTone: StageStatusTone = "warn";
@@ -211,7 +211,7 @@
let matrixRows = 12;
let matrixCols = 7;
let rangeMin = 0;
let rangeMax = 5000;
let rangeMax = 16000;
let colorMapPreset: PressureColorMapPreset = "emerald";
let replayFrames: ReplayFrame[] = [];
let replayCurrentIndex = 0;
@@ -308,8 +308,49 @@
const palette = pressureColorPalettes[preset] ?? pressureColorPalettes.emerald;
const [range0, range1, range2, range3, range4, range5] = palette.rangeStops;
const [glow0, glow1, glow2] = palette.rangeGlow;
const {
bg00,
bg10,
bg20,
bg30,
textMainRgb,
textDimRgb,
borderRgb,
borderStrongRgb,
surfaceRgb,
surfaceAltRgb,
surfaceDeepRgb,
glowRgb,
glowAltRgb,
cyanRgb,
limeRgb,
orangeRgb,
infoRgb
} = palette.uiTheme;
return [
`--hud-bg-00: ${bg00}`,
`--hud-bg-10: ${bg10}`,
`--hud-bg-20: ${bg20}`,
`--hud-bg-30: ${bg30}`,
`--hud-text-main-rgb: ${textMainRgb}`,
`--hud-text-dim-rgb: ${textDimRgb}`,
`--hud-text-main: rgb(${textMainRgb})`,
`--hud-text-dim: rgb(${textDimRgb})`,
`--hud-border-rgb: ${borderRgb}`,
`--hud-border-strong-rgb: ${borderStrongRgb}`,
`--hud-surface-rgb: ${surfaceRgb}`,
`--hud-surface-alt-rgb: ${surfaceAltRgb}`,
`--hud-surface-deep-rgb: ${surfaceDeepRgb}`,
`--hud-glow-rgb: ${glowRgb}`,
`--hud-glow-alt-rgb: ${glowAltRgb}`,
`--hud-cyan-rgb: ${cyanRgb}`,
`--hud-lime-rgb: ${limeRgb}`,
`--hud-orange-rgb: ${orangeRgb}`,
`--hud-info-rgb: ${infoRgb}`,
`--hud-cyan: rgb(${cyanRgb})`,
`--hud-lime: rgb(${limeRgb})`,
`--hud-orange: rgb(${orangeRgb})`,
`--hud-range-0: ${range0}`,
`--hud-range-1: ${range1}`,
`--hud-range-2: ${range2}`,
@@ -615,11 +656,10 @@
function frameValuesToMatrix(values: number[]): number[] {
const totalCells = Math.max(matrixRows * matrixCols, 1);
const matrix = new Array<number>(totalCells).fill(0);
const maxRawValue = Math.max(rangeMax, 5000);
for (let index = 0; index < totalCells; index += 1) {
const value = Number(values[index] ?? 0);
matrix[index] = clamp(Number.isFinite(value) ? value : 0, 0, maxRawValue);
matrix[index] = Number.isFinite(value) ? value : 0;
}
return matrix;
@@ -1468,7 +1508,7 @@
});
</script>
<main class="hud-screen">
<main class="hud-screen" style={rangeScaleStyle}>
<div class="hud-background" aria-hidden="true">
<div class="hud-gradient"></div>
<div class="hud-vignette"></div>
@@ -1567,7 +1607,7 @@
on:replayclose={handleReplayClose}
on:configclose={() => (isConfigPanelOpen = false)}
>
<section class="range-scale" aria-label="Signal Range" style={rangeScaleStyle}>
<section class="range-scale" aria-label="Signal Range">
<p class="range-label">Range</p>
<div class="range-track">
{#each rangeTicks as tick}
@@ -1627,8 +1667,8 @@
position: absolute;
inset: 0;
background:
radial-gradient(circle at 14% 6%, rgb(62 232 255 / 0.07), transparent 36%),
radial-gradient(circle at 86% 14%, rgb(133 255 68 / 0.05), transparent 32%),
radial-gradient(circle at 14% 6%, rgb(var(--hud-glow-rgb) / 0.07), transparent 36%),
radial-gradient(circle at 86% 14%, rgb(var(--hud-glow-alt-rgb) / 0.05), transparent 32%),
linear-gradient(170deg, var(--hud-bg-20) 0%, var(--hud-bg-10) 56%, var(--hud-bg-30) 100%);
}
@@ -1655,14 +1695,19 @@
grid-template-rows: auto minmax(0, 1fr);
gap: clamp(0.5rem, 1.2vw, 0.95rem);
padding: clamp(0.65rem, 1.75vw, 1.3rem);
border: 1px solid rgb(111 150 173 / 0.2);
border: 1px solid rgb(var(--hud-border-rgb) / 0.2);
border-radius: 0.9rem;
background:
linear-gradient(176deg, rgb(8 10 12 / 0.9) 0%, rgb(0 0 0 / 0.94) 56%, rgb(6 8 10 / 0.9) 100%),
radial-gradient(circle at 18% 0%, rgb(62 232 255 / 0.05), transparent 40%),
radial-gradient(circle at 84% 8%, rgb(133 255 68 / 0.04), transparent 36%);
linear-gradient(
176deg,
rgb(var(--hud-surface-alt-rgb) / 0.9) 0%,
rgb(var(--hud-surface-deep-rgb) / 0.94) 56%,
rgb(var(--hud-surface-rgb) / 0.9) 100%
),
radial-gradient(circle at 18% 0%, rgb(var(--hud-glow-rgb) / 0.05), transparent 40%),
radial-gradient(circle at 84% 8%, rgb(var(--hud-glow-alt-rgb) / 0.04), transparent 36%);
box-shadow:
inset 0 1px 0 rgb(197 228 245 / 0.08),
inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.08),
inset 0 -28px 60px rgb(0 0 0 / 0.34);
overflow: hidden;
}
@@ -1672,21 +1717,21 @@
grid-template-columns: auto 1fr;
align-items: center;
gap: 0.75rem;
border: 1px solid rgb(103 135 154 / 0.24);
border: 1px solid rgb(var(--hud-border-rgb) / 0.24);
border-radius: 0.48rem;
padding: 0.34rem 0.52rem;
background:
linear-gradient(180deg, rgb(4 10 14 / 0.72), rgb(2 6 10 / 0.56)),
radial-gradient(circle at 50% 0, rgb(62 232 255 / 0.06), transparent 52%);
linear-gradient(180deg, rgb(var(--hud-surface-rgb) / 0.72), rgb(var(--hud-surface-deep-rgb) / 0.56)),
radial-gradient(circle at 50% 0, rgb(var(--hud-glow-rgb) / 0.06), transparent 52%);
box-shadow:
inset 0 1px 0 rgb(176 218 240 / 0.06),
0 0 12px rgb(62 232 255 / 0.08);
inset 0 1px 0 rgb(var(--hud-border-strong-rgb) / 0.06),
0 0 12px rgb(var(--hud-glow-rgb) / 0.08);
pointer-events: none;
}
.range-label {
margin: 0;
color: rgb(146 170 187 / 0.82);
color: rgb(var(--hud-text-dim-rgb) / 0.82);
font-size: 0.56rem;
letter-spacing: 0.1em;
text-transform: uppercase;
@@ -1699,9 +1744,9 @@
grid-template-columns: repeat(11, minmax(0, 1fr));
gap: 0.26rem;
padding: 0.28rem 0.36rem 0.16rem;
border: 1px solid rgb(131 181 200 / 0.14);
border: 1px solid rgb(var(--hud-border-strong-rgb) / 0.14);
border-radius: 999px;
background: rgb(6 13 16 / 0.34);
background: rgb(var(--hud-surface-rgb) / 0.34);
overflow: hidden;
}
@@ -1721,9 +1766,9 @@
color-mix(in srgb, var(--hud-range-4) 96%, black) 84%,
color-mix(in srgb, var(--hud-range-5) 94%, black) 100%
),
linear-gradient(180deg, rgb(255 255 255 / 0.06), transparent 42%);
linear-gradient(180deg, rgb(var(--hud-text-main-rgb) / 0.06), transparent 42%);
box-shadow:
inset 0 1px 0 rgb(255 255 255 / 0.1),
inset 0 1px 0 rgb(var(--hud-text-main-rgb) / 0.1),
inset 0 -10px 18px rgb(0 0 0 / 0.18);
opacity: 0.94;
}
@@ -1749,12 +1794,12 @@
position: relative;
z-index: 1;
padding-block-start: 0.36rem;
color: rgb(230 243 252 / 0.96);
color: rgb(var(--hud-text-main-rgb) / 0.96);
font-size: 0.56rem;
text-align: center;
text-shadow:
0 1px 0 rgb(0 0 0 / 0.46),
0 0 12px rgb(10 18 24 / 0.4);
0 0 12px rgb(var(--hud-surface-alt-rgb) / 0.4);
}
.range-tick::before {
@@ -1765,8 +1810,8 @@
inline-size: 1px;
block-size: 0.24rem;
transform: translateX(-50%);
background: rgb(234 247 255 / 0.74);
box-shadow: 0 0 8px rgb(62 232 255 / 0.22);
background: rgb(var(--hud-text-main-rgb) / 0.74);
box-shadow: 0 0 8px rgb(var(--hud-glow-rgb) / 0.22);
}
@media (max-width: 760px) {

View File

@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/