dsh-splash-launcher 1.1.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/DSH-GUI.exe CHANGED
Binary file
package/README.en.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # DSH GUI
2
2
 
3
+ [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
4
+
3
5
  A one-click Windows launcher for the DeepSeek Harness (`dsh`) Web GUI with a borderless WPF startup animation (stroke-by-stroke "HARNESS" lettering inspired by SPlayer-Next). It starts `dsh web` in the background, preloads the real GUI behind the animation, and fades into it only when the GUI is actually ready. Closing the window stops the service it started.
4
6
 
5
7
  ## Quick start
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # DSH GUI
2
2
 
3
- > DeepSeek Harness(dsh)Web GUI 的 Windows 一键启动器:双击即弹出无边框启动动画,后台拉起 `dsh web`,GUI 真正加载完成后无缝淡入;关闭窗口自动停服务。
3
+ > DeepSeek Harness(dsh)Web GUI 的 Windows 一键启动器:双击即用浏览器 `--app` 窗口的 splash 动画作为唯一启动画布,后台拉起 `dsh web`,GUI 就绪后揭示;关闭窗口自动停服务。
4
4
 
5
5
  启动动画借鉴 [SPlayer-Next](https://github.com/SPlayer-Dev/SPlayer-Next) 的思路:SVG `stroke-dashoffset` “一笔一划”书写效果——鲸鱼 Logo 升起呼吸,`deepseek` 官方字标浮现,`HARNESS` 七个字母逐笔描边。
6
6
 
7
- ![license](https://img.shields.io/badge/license-MIT-blue) ![windows](https://img.shields.io/badge/platform-Windows%2010%2F11-blue)
7
+ ![license](https://img.shields.io/badge/license-MIT-blue) ![windows](https://img.shields.io/badge/platform-Windows%2010%2F11-blue) [![Awesome DSH Plugin](https://awesome-dsh-plugin.com/badge.svg)](https://awesome-dsh-plugin.com)
8
8
 
9
9
  ## 效果截图
10
10
 
11
- **启动动画(WPF 无边框,HARNESS 逐笔描边)**
11
+ **启动动画(浏览器 splash,HARNESS 逐笔描边)**
12
12
 
13
13
  ![启动动画](docs/screenshots/startup-animation.png)
14
14
 
@@ -20,13 +20,14 @@
20
20
 
21
21
  ## 功能特性
22
22
 
23
- - **点击即出动画**:WPF 原生动画窗口,不等待浏览器冷启动,双击后立刻播放;
23
+ - **点击即出动画**:以浏览器 splash 动画作为唯一启动画布,双击后立刻打开动画,无双层窗口互相抢层级;
24
24
  - **便携单文件**:`splash.html` 与 SVG/PNG 素材内嵌进 exe,`DSH-GUI.exe` 单独一个文件即可运行;同目录放置同名素材文件可覆盖内嵌版本(自定义动画,无需重编译);
25
25
  - **一笔一划描边**:`HARNESS` 七个字母按 CSS `cubic-bezier(0.25,0.1,0.25,1)` 缓动逐笔书写,笔尖连续、首帧空白;
26
26
  - **后台加载、就绪切换**:启动动画期间,真实 GUI 在浏览器后台(同源 iframe)完成加载,检测到官方启动页(`Loading plugins…`)消失后才淡出动画,不会出现“动画播完又加载”的断档;
27
- - **无 PowerShell**:启动器是单个 C#/WPF 程序,无脚本进程,规避“PowerShell 木马”类安全软件启发式误报;
27
+ - **无 PowerShell**:启动器是单个 C# 程序,无脚本进程,规避“PowerShell 木马”类安全软件启发式误报;
28
28
  - **开即启动、关即退出**:窗口关闭后自动结束本次启动的 `dsh web` 服务;端口已有服务时只开窗口、不接管生命周期;
29
29
  - **可配置**:工作目录与端口可通过环境变量或 `workspace.txt` 修改;
30
+ - **深浅色跟随**:启动动画跟随 dsh 设置里的“外观”选项(浅色/深色/跟随系统),浅色为接近白色的淡蓝,深色保留原深蓝黑;
30
31
  - **开源友好**:单文件 C# 源码 + `build.cmd`,使用 Windows 自带 `csc.exe` 编译,无需外部工具链。
31
32
 
32
33
  ## 快速开始
@@ -85,15 +86,15 @@ dsh plugin --profile web add dsh-splash-launcher
85
86
  双击 DSH-GUI.exe
86
87
  ├─ 端口已占用 ────────────────→ 直接打开 GUI 窗口(不显示动画、不接管服务)
87
88
  └─ 端口空闲
88
- ├─ 立即显示 WPF 无边框启动动画(≈0ms,不等浏览器)
89
- ├─ 解析 dsh 安装路径(npm root -g + node require.resolve)
90
- ├─ 将 splash 素材同步进 dsh-web-frontend/dist(同源 iframe 探测的前提)
89
+ ├─ 路径解析(缓存命中则 ~0ms;否则已知目录探测 + 并行解析,写入 resolved.cache)
90
+ ├─ 先打开浏览器 `--app` 窗口(file:// splash 动画,作为唯一启动画布,wait=token 模式)
91
+ ├─ 将 splash 素材同步进 dsh-web-frontend/dist(同源 splash.html 的前提)
91
92
  ├─ 后台启动 `node <dsh>/lib/bin.js web`(隐藏窗口)
92
93
  ├─ 轮询端口就绪(最多 90s)
93
- ├─ 以相同尺寸/位置在动画背后打开浏览器 `--app` 窗口
94
+ ├─ 就绪后把 token 写入 splash 同目录 token.js
95
+ ├─ 预热页轮询到 token → 原地自跳转到同源 splash(hold 态,单窗口、无跳窗闪烁)
94
96
  │ └─ splash.html(hold) 用隐藏 iframe 加载 `/`
95
97
  │ └─ 检测到官方启动卡片消失 → 揭示 iframe,并同步标题
96
- ├─ WPF 检测到浏览器标题包含 "DeepSeek Harness" → 淡出动画
97
98
  └─ 浏览器窗口关闭 → taskkill 结束本次 dsh web 进程树
98
99
  ```
99
100
 
@@ -101,7 +102,7 @@ dsh plugin --profile web add dsh-splash-launcher
101
102
 
102
103
  ```
103
104
  dsh-gui/
104
- ├─ DSH-GUI.cs # 启动器全部源码(C# 5 / WPF,单文件)
105
+ ├─ DSH-GUI.cs # 启动器全部源码(C# 5,单文件)
105
106
  ├─ build.cmd # 构建脚本(Windows 自带 csc.exe)
106
107
  ├─ splash.html # 浏览器侧启动页(hold 态 + 后台 iframe 预加载 + 就绪检测)
107
108
  ├─ deepseek-wordmark.svg # 官方 deepseek 字标(提取自 dsh 前端)
@@ -130,19 +131,18 @@ DSH-GUI.exe --selftest
130
131
 
131
132
  | 想调什么 | 位置 |
132
133
  |---|---|
133
- | 描边速度 | `SplashWindow.DrawSeconds`(默认 1.25s/字母) |
134
- | 字母间隔 | `SplashWindow.LetterGap`(默认 0.24s) |
135
- | 动画窗口尺寸 | `Program.WinW / WinH`(默认 1100×720) |
136
- | 最短动画时长 | `SplashWindow.MinShowSec` |
137
- | 就绪判定标题 | `SplashWindow.AppTitle`(按“包含”匹配) |
134
+ | 描边速度 | `splash.html` 的 `.splash-harness .letter` `animation` 时长(0.22s/字母) |
135
+ | 相邻字母起笔间隔 | `splash.html` 的 `.splash-harness path:nth-of-type(n)` `animation-delay` |
136
+ | 动画/浏览器窗口尺寸 | `Program.WinW / WinH`(默认 1100×720,`DSH-GUI.cs`) |
137
+ | 版式(鲸鱼描边) | `Program.SplashStyle` 改为 `"&logo=draw"`(`DSH-GUI.cs`) |
138
138
 
139
139
  ## 已知问题
140
140
 
141
141
  ### 1. 任务栏图标会先闪一下 Chrome/Edge 默认图标
142
- 浏览器 `--app` 窗口创建时,任务栏按钮先使用浏览器进程自带图标,页面 `favicon`(黑鲸)加载完成后才切换,因此会出现极短暂的一闪。这是浏览器自身的图标占位机制,没有命令行参数可预设;当前动画窗口会盖住这段过程,实际看到界面时已是黑鲸图标。彻底隐藏需要 Win32 控制窗口显隐,可能引起页面节流、拖慢启动,暂不实现。
142
+ 浏览器 `--app` 窗口创建时,任务栏按钮先使用浏览器进程自带图标,页面 `favicon`(黑鲸)加载完成后才切换,因此会出现极短暂的一闪。这是浏览器自身的图标占位机制,没有命令行参数可预设。启动器不设覆盖层,该一闪在浏览器冷启动阶段会短暂可见。彻底隐藏需要 Win32 控制窗口显隐,可能引起页面节流、拖慢启动,暂不实现。
143
143
 
144
144
  ### 2. 启动有一定等待时间
145
- 启动时长主要来自:`dsh web` 服务引导 + 浏览器冷启动 + 前端插件装载。动画会覆盖全部等待过程并持续到 GUI 就绪,属于“可见但不可压缩”的时间。首次运行、杀毒软件实时扫描、机械硬盘会进一步加长。可通过 WPF 描边速度(见上)让动画与等待时长更匹配。
145
+ 启动时长主要来自:`dsh web` 服务引导 + 浏览器冷启动 + 前端插件装载,动画会覆盖绝大多数等待过程并持续到 GUI 就绪,属于“可见但基本不可压缩”的时间。首次运行、杀毒软件实时扫描、机械硬盘会进一步加长。启动器自身的路径解析已缓存(`resolved.cache`)且最早预热浏览器,能显著缩短总时长;动画节奏可在 `splash.html` 的 CSS 里调节。
146
146
 
147
147
  ### 3. SmartScreen / 安全软件可能误报(未签名 exe)
148
148
  本程序会启动隐藏进程、结束后台进程、复制文件,这类“类管理工具”行为可能触发启发式防护(例如卡巴斯基 PDM:Trojan.Win32.Generic 对旧版 PowerShell 脚本的误报)。建议:
@@ -156,8 +156,8 @@ DSH-GUI.exe --selftest
156
156
  ### 5. 同源预加载依赖 dist 写入权限
157
157
  启动器需要把 `splash.html` 等素材复制到 npm 全局的 `dsh-web-frontend/dist` 目录。若该目录不可写,会自动退回“文件页动画 → 就绪后直接跳转 GUI”模式(素材内嵌于 exe,此模式下自动释放到 `%LocalAppData%\DSH-GUI\assets`),此时会短暂看到官方 HARNESS 加载页。
158
158
 
159
- ### 6. 就绪判定依赖标题
160
- WPF 以浏览器窗口标题包含 `DeepSeek Harness` 判定 GUI 就绪;若官方前端修改标题结构,可能需要同步更新 `SplashWindow.AppTitle`。
159
+ ### 6. 就绪判定依赖官方启动卡片
160
+ 浏览器 splash 以同源 iframe 里官方启动卡片(`_boot_*` class)消失判定 GUI 就绪;若官方前端改了启动卡片的 class 结构,可能需要同步更新 `splash.html` 里的 `appReady()` 判定。
161
161
 
162
162
  ## 许可证
163
163
 
package/cordis.patch.yml CHANGED
@@ -1,6 +1,6 @@
1
- # dsh-splash-launcher bundle patch: inserts the host plugin row into the
2
- # profile roster. Install with:
3
- # dsh plugin --profile web add dsh-splash-launcher
4
- - insert:
5
- - id: splash-launcher
6
- name: 'dsh-splash-launcher'
1
+ # dsh-splash-launcher bundle patch: inserts the host plugin row into the
2
+ # profile roster. Install with:
3
+ # dsh plugin --profile web add dsh-splash-launcher
4
+ - insert:
5
+ - id: splash-launcher
6
+ name: 'dsh-splash-launcher'
@@ -1,13 +1,13 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="26 0 97 24" width="97" height="24" fill="none">
2
- <g fill="#E7ECFF">
3
- <path d="M68.416 18.2447H67.0501V16.1272H68.416C69.2619 16.1272 70.1166 15.9163 70.6671 15.3304C71.2181 14.7444 71.426 13.8455 71.426 12.9471C71.426 12.0487 71.2268 11.1498 70.6671 10.5643C70.1083 9.97831 69.2619 9.76744 68.416 9.76744C67.5701 9.76744 66.7154 9.97831 66.1639 10.5643C65.6129 11.1503 65.4049 12.0487 65.4049 12.9471V21.6435H63.009V7.6582H65.4049V8.54883H65.8442C65.8918 8.49393 65.9394 8.44728 65.9875 8.40064C66.5871 7.85353 67.5049 7.6582 68.4072 7.6582C69.8212 7.6582 71.2341 8.00998 72.1607 8.98662C73.0868 9.96325 73.4143 11.4632 73.4143 12.9558C73.4143 14.4485 73.0785 15.9406 72.1607 16.925C71.2424 17.9094 69.8212 18.2457 68.416 18.2457V18.2447Z" />
4
- <path d="M31.9551 8.03497H33.3204V10.1525H31.9551C31.1087 10.1525 30.2545 10.3633 29.7035 10.9493C29.1525 11.5353 28.945 12.4342 28.945 13.3326C28.945 14.231 29.1447 15.1294 29.7035 15.7154C30.2623 16.3014 31.1087 16.5122 31.9551 16.5122C32.8015 16.5122 33.6562 16.3014 34.2072 15.7154C34.7582 15.1294 34.9657 14.231 34.9657 13.3326V4.62842H37.3611V18.6219H34.9657V17.7313H34.5264C34.4783 17.7857 34.4307 17.8329 34.3826 17.8795C33.7835 18.4261 32.8652 18.6219 31.9629 18.6219C30.5494 18.6219 29.136 18.2707 28.2099 17.294C27.2838 16.3174 26.9563 14.817 26.9563 13.3248C26.9563 11.8327 27.2916 10.34 28.2099 9.35561C29.136 8.37898 30.5494 8.03497 31.9551 8.03497Z" />
5
- <path d="M49.3786 13.1431V13.9948H42.9984V12.2996H47.2305C47.1348 11.6825 46.9113 11.1043 46.5119 10.682C45.9371 10.0727 45.0503 9.85409 44.1723 9.85409C43.2943 9.85409 42.4076 10.0727 41.8328 10.682C41.258 11.2913 41.05 12.2213 41.05 13.1435C41.05 14.0658 41.2575 15.003 41.8328 15.6046C42.4076 16.2061 43.2939 16.433 44.1723 16.433C45.0508 16.433 45.9371 16.2143 46.5119 15.6046C46.5916 15.5186 46.6635 15.4248 46.7354 15.331H49.0992C48.8918 16.0657 48.5643 16.7299 48.0691 17.2454C47.111 18.2531 45.6339 18.6205 44.1723 18.6205C42.7108 18.6205 41.2337 18.2609 40.2755 17.2454C39.3174 16.2299 38.9661 14.6828 38.9661 13.1435C38.9661 11.6043 39.3096 10.0494 40.2755 9.04168C41.242 8.03396 42.7108 7.66663 44.1723 7.66663C45.6339 7.66663 47.111 8.02618 48.0691 9.04168C49.0351 10.0572 49.3786 11.6043 49.3786 13.1435V13.1431Z" />
6
- <path d="M61.4045 13.1431V13.9948H55.0243V12.2996H59.2564C59.1602 11.6825 58.9372 11.1043 58.5378 10.682C57.963 10.0727 57.0762 9.85409 56.1982 9.85409C55.3202 9.85409 54.4335 10.0727 53.8587 10.682C53.2839 11.2913 53.0759 12.2213 53.0759 13.1435C53.0759 14.0658 53.2834 15.003 53.8587 15.6046C54.4335 16.2061 55.3202 16.433 56.1982 16.433C57.0762 16.433 57.963 16.2143 58.5378 15.6046C58.6179 15.5186 58.6894 15.4248 58.7608 15.331H61.1251C60.9171 16.0657 60.5897 16.7299 60.0945 17.2454C59.1364 18.2531 57.6593 18.6205 56.1982 18.6205C54.7372 18.6205 53.2596 18.2609 52.3014 17.2454C51.3432 16.2299 50.9919 14.6828 50.9919 13.1435C50.9919 11.6043 51.3355 10.0494 52.3014 9.04168C53.2678 8.03396 54.7367 7.66663 56.1982 7.66663C57.6598 7.66663 59.1364 8.02618 60.0945 9.04168C61.061 10.0572 61.4045 11.6043 61.4045 13.1435V13.1431Z" />
7
- <path d="M80.242 18.6214C81.7035 18.6214 83.1801 18.4105 84.1383 17.809C85.0965 17.2075 85.4482 16.2931 85.4482 15.3869C85.4482 14.4807 85.1042 13.5585 84.1383 12.9647C83.1801 12.371 81.703 12.1518 80.242 12.1518C79.6186 12.1518 79.0438 12.0658 78.6366 11.8394C78.2294 11.6047 78.0778 11.2534 78.0778 10.9017C78.0778 10.5499 78.2216 10.1908 78.6366 9.9639C79.0438 9.72921 79.6749 9.65147 80.2973 9.65147C80.9198 9.65147 81.5509 9.73747 81.9591 9.9639C82.3663 10.1986 82.5179 10.5499 82.5179 10.9017H84.9531C84.9531 9.99499 84.6421 9.07327 83.7719 8.47951C82.9017 7.88576 81.5679 7.66663 80.2424 7.66663C78.9169 7.66663 77.5837 7.8775 76.713 8.47951C75.8427 9.08104 75.5308 9.99499 75.5308 10.9017C75.5308 11.8083 75.8423 12.73 76.713 13.3238C77.5832 13.9176 78.9165 14.1367 80.2424 14.1367C80.929 14.1367 81.688 14.2227 82.1428 14.4491C82.5985 14.676 82.7579 15.0351 82.7579 15.3869C82.7579 15.7387 82.5985 16.0977 82.1428 16.3246C81.688 16.5511 80.9931 16.6371 80.3066 16.6371C79.62 16.6371 78.9169 16.5511 78.4694 16.3246C78.0224 16.0982 77.8543 15.7387 77.8543 15.3869H75.0435C75.0435 16.2935 75.3865 17.2153 76.3534 17.809C77.3194 18.4028 78.7809 18.6214 80.2424 18.6214H80.242Z" />
8
- <path d="M97.4733 13.1431V13.9948H91.0932V12.2996H95.3252C95.23 11.6825 95.006 11.1043 94.6071 10.682C94.0313 10.0727 93.1456 9.85409 92.2666 9.85409C91.3876 9.85409 90.5018 10.0727 89.927 10.682C89.3522 11.2913 89.1452 12.2213 89.1452 13.1435C89.1452 14.0658 89.3522 15.003 89.927 15.6046C90.5018 16.2061 91.3886 16.433 92.2666 16.433C93.1446 16.433 94.0313 16.2143 94.6071 15.6046C94.6863 15.5186 94.7587 15.4248 94.8301 15.331H97.1935C96.9855 16.0657 96.6585 16.7299 96.1639 17.2454C95.2057 18.2531 93.7281 18.6205 92.2666 18.6205C90.805 18.6205 89.3284 18.2609 88.3703 17.2454C87.4121 16.2299 87.0613 14.6828 87.0613 13.1435C87.0613 11.6043 87.4043 10.0494 88.3703 9.04168C89.3367 8.03396 90.806 7.66663 92.2666 7.66663C93.7272 7.66663 95.2057 8.02618 96.1639 9.04168C97.1298 10.0572 97.4729 11.6043 97.4729 13.1435L97.4733 13.1431Z" />
9
- <path d="M109.499 13.1431V13.9948H103.119V12.2996H107.351C107.256 11.6825 107.032 11.1043 106.632 10.682C106.057 10.0727 105.172 9.85409 104.293 9.85409C103.414 9.85409 102.528 10.0727 101.953 10.682C101.378 11.2913 101.17 12.2213 101.17 13.1435C101.17 14.0658 101.378 15.003 101.953 15.6046C102.528 16.2061 103.415 16.433 104.293 16.433C105.171 16.433 106.057 16.2143 106.632 15.6046C106.712 15.5186 106.784 15.4248 106.856 15.331H109.22C109.012 16.0657 108.685 16.7299 108.19 17.2454C107.231 18.2531 105.754 18.6205 104.293 18.6205C102.831 18.6205 101.355 18.2609 100.396 17.2454C99.4382 16.2299 99.0864 14.6828 99.0864 13.1435C99.0864 11.6043 99.4295 10.0494 100.396 9.04168C101.362 8.03396 102.832 7.66663 104.293 7.66663C105.754 7.66663 107.231 8.02618 108.19 9.04168C109.156 10.0572 109.499 11.6043 109.499 13.1435V13.1431Z" />
10
- <path d="M113.5 4.62817H111.104V18.6217H113.5V4.62817Z" />
11
- <path d="M117.589 12.8154L121.517 18.6208H118.554L114.625 12.8154L118.554 8.15088H121.517L117.589 12.8154Z" />
12
- </g>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="26 0 97 24" width="97" height="24" fill="none">
2
+ <g fill="#E7ECFF">
3
+ <path d="M68.416 18.2447H67.0501V16.1272H68.416C69.2619 16.1272 70.1166 15.9163 70.6671 15.3304C71.2181 14.7444 71.426 13.8455 71.426 12.9471C71.426 12.0487 71.2268 11.1498 70.6671 10.5643C70.1083 9.97831 69.2619 9.76744 68.416 9.76744C67.5701 9.76744 66.7154 9.97831 66.1639 10.5643C65.6129 11.1503 65.4049 12.0487 65.4049 12.9471V21.6435H63.009V7.6582H65.4049V8.54883H65.8442C65.8918 8.49393 65.9394 8.44728 65.9875 8.40064C66.5871 7.85353 67.5049 7.6582 68.4072 7.6582C69.8212 7.6582 71.2341 8.00998 72.1607 8.98662C73.0868 9.96325 73.4143 11.4632 73.4143 12.9558C73.4143 14.4485 73.0785 15.9406 72.1607 16.925C71.2424 17.9094 69.8212 18.2457 68.416 18.2457V18.2447Z" />
4
+ <path d="M31.9551 8.03497H33.3204V10.1525H31.9551C31.1087 10.1525 30.2545 10.3633 29.7035 10.9493C29.1525 11.5353 28.945 12.4342 28.945 13.3326C28.945 14.231 29.1447 15.1294 29.7035 15.7154C30.2623 16.3014 31.1087 16.5122 31.9551 16.5122C32.8015 16.5122 33.6562 16.3014 34.2072 15.7154C34.7582 15.1294 34.9657 14.231 34.9657 13.3326V4.62842H37.3611V18.6219H34.9657V17.7313H34.5264C34.4783 17.7857 34.4307 17.8329 34.3826 17.8795C33.7835 18.4261 32.8652 18.6219 31.9629 18.6219C30.5494 18.6219 29.136 18.2707 28.2099 17.294C27.2838 16.3174 26.9563 14.817 26.9563 13.3248C26.9563 11.8327 27.2916 10.34 28.2099 9.35561C29.136 8.37898 30.5494 8.03497 31.9551 8.03497Z" />
5
+ <path d="M49.3786 13.1431V13.9948H42.9984V12.2996H47.2305C47.1348 11.6825 46.9113 11.1043 46.5119 10.682C45.9371 10.0727 45.0503 9.85409 44.1723 9.85409C43.2943 9.85409 42.4076 10.0727 41.8328 10.682C41.258 11.2913 41.05 12.2213 41.05 13.1435C41.05 14.0658 41.2575 15.003 41.8328 15.6046C42.4076 16.2061 43.2939 16.433 44.1723 16.433C45.0508 16.433 45.9371 16.2143 46.5119 15.6046C46.5916 15.5186 46.6635 15.4248 46.7354 15.331H49.0992C48.8918 16.0657 48.5643 16.7299 48.0691 17.2454C47.111 18.2531 45.6339 18.6205 44.1723 18.6205C42.7108 18.6205 41.2337 18.2609 40.2755 17.2454C39.3174 16.2299 38.9661 14.6828 38.9661 13.1435C38.9661 11.6043 39.3096 10.0494 40.2755 9.04168C41.242 8.03396 42.7108 7.66663 44.1723 7.66663C45.6339 7.66663 47.111 8.02618 48.0691 9.04168C49.0351 10.0572 49.3786 11.6043 49.3786 13.1435V13.1431Z" />
6
+ <path d="M61.4045 13.1431V13.9948H55.0243V12.2996H59.2564C59.1602 11.6825 58.9372 11.1043 58.5378 10.682C57.963 10.0727 57.0762 9.85409 56.1982 9.85409C55.3202 9.85409 54.4335 10.0727 53.8587 10.682C53.2839 11.2913 53.0759 12.2213 53.0759 13.1435C53.0759 14.0658 53.2834 15.003 53.8587 15.6046C54.4335 16.2061 55.3202 16.433 56.1982 16.433C57.0762 16.433 57.963 16.2143 58.5378 15.6046C58.6179 15.5186 58.6894 15.4248 58.7608 15.331H61.1251C60.9171 16.0657 60.5897 16.7299 60.0945 17.2454C59.1364 18.2531 57.6593 18.6205 56.1982 18.6205C54.7372 18.6205 53.2596 18.2609 52.3014 17.2454C51.3432 16.2299 50.9919 14.6828 50.9919 13.1435C50.9919 11.6043 51.3355 10.0494 52.3014 9.04168C53.2678 8.03396 54.7367 7.66663 56.1982 7.66663C57.6598 7.66663 59.1364 8.02618 60.0945 9.04168C61.061 10.0572 61.4045 11.6043 61.4045 13.1435V13.1431Z" />
7
+ <path d="M80.242 18.6214C81.7035 18.6214 83.1801 18.4105 84.1383 17.809C85.0965 17.2075 85.4482 16.2931 85.4482 15.3869C85.4482 14.4807 85.1042 13.5585 84.1383 12.9647C83.1801 12.371 81.703 12.1518 80.242 12.1518C79.6186 12.1518 79.0438 12.0658 78.6366 11.8394C78.2294 11.6047 78.0778 11.2534 78.0778 10.9017C78.0778 10.5499 78.2216 10.1908 78.6366 9.9639C79.0438 9.72921 79.6749 9.65147 80.2973 9.65147C80.9198 9.65147 81.5509 9.73747 81.9591 9.9639C82.3663 10.1986 82.5179 10.5499 82.5179 10.9017H84.9531C84.9531 9.99499 84.6421 9.07327 83.7719 8.47951C82.9017 7.88576 81.5679 7.66663 80.2424 7.66663C78.9169 7.66663 77.5837 7.8775 76.713 8.47951C75.8427 9.08104 75.5308 9.99499 75.5308 10.9017C75.5308 11.8083 75.8423 12.73 76.713 13.3238C77.5832 13.9176 78.9165 14.1367 80.2424 14.1367C80.929 14.1367 81.688 14.2227 82.1428 14.4491C82.5985 14.676 82.7579 15.0351 82.7579 15.3869C82.7579 15.7387 82.5985 16.0977 82.1428 16.3246C81.688 16.5511 80.9931 16.6371 80.3066 16.6371C79.62 16.6371 78.9169 16.5511 78.4694 16.3246C78.0224 16.0982 77.8543 15.7387 77.8543 15.3869H75.0435C75.0435 16.2935 75.3865 17.2153 76.3534 17.809C77.3194 18.4028 78.7809 18.6214 80.2424 18.6214H80.242Z" />
8
+ <path d="M97.4733 13.1431V13.9948H91.0932V12.2996H95.3252C95.23 11.6825 95.006 11.1043 94.6071 10.682C94.0313 10.0727 93.1456 9.85409 92.2666 9.85409C91.3876 9.85409 90.5018 10.0727 89.927 10.682C89.3522 11.2913 89.1452 12.2213 89.1452 13.1435C89.1452 14.0658 89.3522 15.003 89.927 15.6046C90.5018 16.2061 91.3886 16.433 92.2666 16.433C93.1446 16.433 94.0313 16.2143 94.6071 15.6046C94.6863 15.5186 94.7587 15.4248 94.8301 15.331H97.1935C96.9855 16.0657 96.6585 16.7299 96.1639 17.2454C95.2057 18.2531 93.7281 18.6205 92.2666 18.6205C90.805 18.6205 89.3284 18.2609 88.3703 17.2454C87.4121 16.2299 87.0613 14.6828 87.0613 13.1435C87.0613 11.6043 87.4043 10.0494 88.3703 9.04168C89.3367 8.03396 90.806 7.66663 92.2666 7.66663C93.7272 7.66663 95.2057 8.02618 96.1639 9.04168C97.1298 10.0572 97.4729 11.6043 97.4729 13.1435L97.4733 13.1431Z" />
9
+ <path d="M109.499 13.1431V13.9948H103.119V12.2996H107.351C107.256 11.6825 107.032 11.1043 106.632 10.682C106.057 10.0727 105.172 9.85409 104.293 9.85409C103.414 9.85409 102.528 10.0727 101.953 10.682C101.378 11.2913 101.17 12.2213 101.17 13.1435C101.17 14.0658 101.378 15.003 101.953 15.6046C102.528 16.2061 103.415 16.433 104.293 16.433C105.171 16.433 106.057 16.2143 106.632 15.6046C106.712 15.5186 106.784 15.4248 106.856 15.331H109.22C109.012 16.0657 108.685 16.7299 108.19 17.2454C107.231 18.2531 105.754 18.6205 104.293 18.6205C102.831 18.6205 101.355 18.2609 100.396 17.2454C99.4382 16.2299 99.0864 14.6828 99.0864 13.1435C99.0864 11.6043 99.4295 10.0494 100.396 9.04168C101.362 8.03396 102.832 7.66663 104.293 7.66663C105.754 7.66663 107.231 8.02618 108.19 9.04168C109.156 10.0572 109.499 11.6043 109.499 13.1435V13.1431Z" />
10
+ <path d="M113.5 4.62817H111.104V18.6217H113.5V4.62817Z" />
11
+ <path d="M117.589 12.8154L121.517 18.6208H118.554L114.625 12.8154L118.554 8.15088H121.517L117.589 12.8154Z" />
12
+ </g>
13
13
  </svg>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-splash-launcher",
3
- "version": "1.1.0",
4
- "description": "DSH Windows one-click launcher with a stroke-by-stroke startup animation: ships a self-contained DSH-GUI.exe and registers the desktop_launch agent tool.",
3
+ "version": "1.4.0",
4
+ "description": "DSH Windows one-click launcher: opens the browser splash animation immediately, boots dsh web, and reveals the GUI when ready; also registers the desktop_launch agent tool.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "scripts": {
package/splash.html CHANGED
@@ -8,10 +8,53 @@
8
8
  <style>
9
9
  :root {
10
10
  --bg: #070b18;
11
+ --bg-2: #0a1024;
11
12
  --accent: #4d6bfe;
12
13
  --cyan: #22d3ee;
13
14
  --text: #e7ecff;
14
15
  --muted: #8b96bb;
16
+ --logo-filter: brightness(0) invert(1) drop-shadow(0 0 18px rgba(77, 107, 254, 0.55));
17
+ --harness-shadow: drop-shadow(0 0 12px rgba(77, 107, 254, 0.45));
18
+ --wordmark-filter: none;
19
+ }
20
+
21
+ /* 浅色:极淡蓝色系接近白色;跟随系统深浅色切换 */
22
+ @media (prefers-color-scheme: light) {
23
+ :root {
24
+ --bg: #f4f8ff;
25
+ --bg-2: #eaf2ff;
26
+ --accent: #4d6bfe;
27
+ --cyan: #0e9bb8;
28
+ --text: #1b2a5b;
29
+ --muted: #5a6a94;
30
+ --logo-filter: brightness(0) drop-shadow(0 0 18px rgba(77, 107, 254, 0.25));
31
+ --harness-shadow: drop-shadow(0 0 10px rgba(77, 107, 254, 0.22));
32
+ --wordmark-filter: brightness(0);
33
+ }
34
+ }
35
+
36
+ /* dsh 外观设置显式指定时,覆盖系统主题 */
37
+ html.force-dark {
38
+ --bg: #070b18;
39
+ --bg-2: #0a1024;
40
+ --accent: #4d6bfe;
41
+ --cyan: #22d3ee;
42
+ --text: #e7ecff;
43
+ --muted: #8b96bb;
44
+ --logo-filter: brightness(0) invert(1) drop-shadow(0 0 18px rgba(77, 107, 254, 0.55));
45
+ --harness-shadow: drop-shadow(0 0 12px rgba(77, 107, 254, 0.45));
46
+ --wordmark-filter: none;
47
+ }
48
+ html.force-light {
49
+ --bg: #f4f8ff;
50
+ --bg-2: #eaf2ff;
51
+ --accent: #4d6bfe;
52
+ --cyan: #0e9bb8;
53
+ --text: #1b2a5b;
54
+ --muted: #5a6a94;
55
+ --logo-filter: brightness(0) drop-shadow(0 0 18px rgba(77, 107, 254, 0.25));
56
+ --harness-shadow: drop-shadow(0 0 10px rgba(77, 107, 254, 0.22));
57
+ --wordmark-filter: brightness(0);
15
58
  }
16
59
 
17
60
  * { margin: 0; padding: 0; box-sizing: border-box; }
@@ -34,7 +77,7 @@
34
77
  width: 100%;
35
78
  height: 100%;
36
79
  border: 0;
37
- background: #070b18;
80
+ background: var(--bg);
38
81
  visibility: hidden;
39
82
  z-index: 1;
40
83
  }
@@ -64,7 +107,7 @@
64
107
  background:
65
108
  radial-gradient(1100px 750px at 78% -8%, rgba(77, 107, 254, 0.24), transparent 60%),
66
109
  radial-gradient(850px 650px at 10% 112%, rgba(34, 211, 238, 0.12), transparent 55%),
67
- linear-gradient(180deg, #070b18 0%, #0a1024 55%, #070b18 100%);
110
+ linear-gradient(180deg, var(--bg) 0%, var(--bg-2) 55%, var(--bg) 100%);
68
111
  }
69
112
  .bg::before {
70
113
  content: "";
@@ -109,17 +152,17 @@
109
152
  .splash-logo {
110
153
  width: 72px;
111
154
  height: 72px;
112
- filter: brightness(0) invert(1) drop-shadow(0 0 18px rgba(77, 107, 254, 0.55));
155
+ filter: var(--logo-filter);
113
156
  will-change: transform, opacity;
114
157
  animation:
115
- splash-rise 0.5s cubic-bezier(0.16, 1, 0.3, 1) both,
158
+ splash-rise 0.4s cubic-bezier(0.16, 1, 0.3, 1) both,
116
159
  splash-flicker 1.8s ease-in-out 0.5s infinite;
117
160
  }
118
161
  .splash-logo.draw {
119
162
  width: 96px;
120
163
  height: 96px;
121
164
  filter: none;
122
- animation: splash-rise 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
165
+ animation: splash-rise 0.4s cubic-bezier(0.16, 1, 0.3, 1) both;
123
166
  }
124
167
 
125
168
  .splash-brand {
@@ -134,33 +177,48 @@
134
177
  height: auto;
135
178
  display: block;
136
179
  margin-top: 4px;
180
+ filter: var(--wordmark-filter);
137
181
  will-change: transform, opacity;
138
- animation: splash-rise 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.1s both;
182
+ animation: splash-rise 0.4s cubic-bezier(0.16, 1, 0.3, 1) 0.08s both;
139
183
  }
140
184
 
141
185
  /* “HARNESS”七个字母:与 SPlayer-Next 的 Next 相同的描边动画,作为视觉重点 */
142
186
  .splash-harness {
143
187
  width: 310px;
144
188
  height: 62px;
145
- filter: drop-shadow(0 0 12px rgba(77, 107, 254, 0.45));
189
+ filter: var(--harness-shadow);
146
190
  }
147
191
  .splash-harness .letter {
148
- stroke-width: 10;
192
+ stroke-width: 6;
149
193
  fill: none;
150
194
  stroke-linecap: square;
151
195
  stroke-linejoin: round;
152
196
  stroke-dasharray: 400;
153
197
  stroke-dashoffset: 400;
154
198
  will-change: stroke-dashoffset;
155
- animation: splash-draw 1s ease forwards;
156
- }
157
- .splash-harness path:nth-of-type(1) { animation-delay: 0.20s; }
158
- .splash-harness path:nth-of-type(2) { animation-delay: 0.42s; }
159
- .splash-harness path:nth-of-type(3) { animation-delay: 0.64s; }
160
- .splash-harness path:nth-of-type(4) { animation-delay: 0.86s; }
161
- .splash-harness path:nth-of-type(5) { animation-delay: 1.08s; }
162
- .splash-harness path:nth-of-type(6) { animation-delay: 1.30s; }
163
- .splash-harness path:nth-of-type(7) { animation-delay: 1.52s; }
199
+ /* 每个字母 0.22s -> 1.25x 加快即 0.176s;前一个未写完下一个就开始,linear 线性速度,整体约 1.0s */
200
+ animation: splash-draw 0.176s linear forwards;
201
+ }
202
+ .splash-harness path:nth-of-type(1) { animation-delay: 0.16s; }
203
+ .splash-harness path:nth-of-type(2) { animation-delay: 0.27s; }
204
+ .splash-harness path:nth-of-type(3) { animation-delay: 0.38s; }
205
+ .splash-harness path:nth-of-type(4) { animation-delay: 0.50s; }
206
+ .splash-harness path:nth-of-type(5) { animation-delay: 0.61s; }
207
+ .splash-harness path:nth-of-type(6) { animation-delay: 0.72s; }
208
+ .splash-harness path:nth-of-type(7) { animation-delay: 0.83s; }
209
+
210
+ /* 浅色模式下换用更深的渐变,保证 HARNESS 在接近白色的背景上清晰可见 */
211
+ @media (prefers-color-scheme: light) {
212
+ .splash-harness .letter {
213
+ stroke: url(#harnessGradLight);
214
+ }
215
+ }
216
+ html.force-light .splash-harness .letter {
217
+ stroke: url(#harnessGradLight);
218
+ }
219
+ html.force-dark .splash-harness .letter {
220
+ stroke: url(#harnessGrad);
221
+ }
164
222
 
165
223
  .splash-footer {
166
224
  position: absolute;
@@ -172,7 +230,7 @@
172
230
  font-size: 12px;
173
231
  letter-spacing: 2px;
174
232
  color: var(--muted);
175
- animation: splash-rise-footer 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.36s both;
233
+ animation: splash-rise-footer 0.4s cubic-bezier(0.16, 1, 0.3, 1) 0.288s both;
176
234
  }
177
235
 
178
236
  /* hold 模式:直接呈现动画结束态(WPF 即时启动页 → 浏览器启动页无缝衔接) */
@@ -227,11 +285,16 @@
227
285
  <stop offset="0.5" stop-color="#4d6bfe" />
228
286
  <stop offset="1" stop-color="#22d3ee" />
229
287
  </linearGradient>
288
+ <linearGradient id="harnessGradLight" x1="0" y1="20" x2="700" y2="120" gradientUnits="userSpaceOnUse">
289
+ <stop offset="0" stop-color="#5b7cfa" />
290
+ <stop offset="0.5" stop-color="#4d6bfe" />
291
+ <stop offset="1" stop-color="#0e9bb8" />
292
+ </linearGradient>
230
293
  </defs>
231
294
  <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M15 20 L15 120 M85 20 L85 120 M15 70 L85 70" />
232
- <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M115 120 L150 20 L185 120 M132 72 L168 72" />
295
+ <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M115 120 L150 20 M150 20 L185 120 M132 72 L168 72" />
233
296
  <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M215 20 L215 120 M215 20 C242 16 285 19 285 45 C285 62 270 70 245 70 L215 70 M258 71 L285 120" />
234
- <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M315 120 L315 20 L385 120 L385 20" />
297
+ <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M315 20 L315 120 M315 20 L385 120 M385 120 L385 20" />
235
298
  <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M415 20 L415 120 M415 20 L485 20 M415 70 L465 70 M415 120 L485 120" />
236
299
  <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M585 20 L515 20 L515 70 L585 70 L585 120 L515 120" />
237
300
  <path class="letter" pathLength="400" stroke="url(#harnessGrad)" d="M685 20 L615 20 L615 70 L685 70 L685 120 L615 120" />
@@ -245,10 +308,21 @@
245
308
  <script>
246
309
  (function () {
247
310
  var qs = new URLSearchParams(location.search);
311
+ // dsh 外观设置:light/dark/system,由启动器读取 settings.yaml 后通过 theme 参数传入
312
+ var theme = qs.get('theme');
313
+ if (theme === 'light' || theme === 'dark') {
314
+ document.documentElement.classList.add('force-' + theme);
315
+ document.documentElement.style.colorScheme = theme;
316
+ }
248
317
  var target = qs.get('target') || 'http://127.0.0.1:3080';
249
318
  var timeoutSec = Math.max(15, parseInt(qs.get('timeout') || '90', 10) || 90);
250
319
  // 双击 splash.html 打开(无参数)= 动画循环预览
251
320
  var demo = qs.get('demo') === '1' || !qs.has('target');
321
+ // 预热窗口专用:只播放动画,不探测端口、不自行跳转,由启动器手动接管交接
322
+ var stay = qs.get('stay') === '1';
323
+ // wait=token:预热窗口轮询同目录 token.js(由启动器在服务就绪+拿到 token 后写入),
324
+ // 读到 token 即代表服务就绪,原地自跳转到带 token 的同源 splash——单窗口、无缝、无闪烁。
325
+ var waitToken = qs.get('wait') === 'token';
252
326
  // logo=draw:切换成鲸鱼本体一笔一划的旧版式
253
327
  var drawLogo = qs.get('logo') === 'draw';
254
328
  // 由 dsh 服务托管(同源):可后台 iframe 加载真实 GUI 并检测就绪
@@ -266,7 +340,7 @@
266
340
  }
267
341
 
268
342
  var startedAt = performance.now();
269
- var splashAnimMs = drawLogo ? 3000 : 2700;
343
+ var splashAnimMs = drawLogo ? 3000 : 1500;
270
344
  var leaving = false;
271
345
 
272
346
  if (demo) {
@@ -274,6 +348,46 @@
274
348
  return;
275
349
  }
276
350
 
351
+ if (stay) {
352
+ // 预热窗口只做动画展示,交给启动器 ClosePrewarmBrowser 关闭并打开正式窗口
353
+ return;
354
+ }
355
+
356
+ if (waitToken) {
357
+ // 单窗口自跳转:轮询同目录 token.js,拿到 token 后原地跳到带 token 的同源 splash。
358
+ // token 本身就是"服务已就绪"的信号(启动器只在 WaitPort+WaitLaunchToken 成功后写入)。
359
+ var base0 = target.replace(/\/+$/, '');
360
+ var navServed = function (token) {
361
+ if (leaving) return;
362
+ leaving = true;
363
+ var servedUrl = base0 + '/splash.html?hold=1&timeout=60'
364
+ + '&target=' + encodeURIComponent(target + '?token=' + encodeURIComponent(token))
365
+ + (drawLogo ? '&logo=draw' : '')
366
+ + (theme ? '&theme=' + encodeURIComponent(theme) : '');
367
+ location.replace(servedUrl);
368
+ };
369
+ var pollToken = function () {
370
+ if (leaving) return;
371
+ if (window.__DSH_TOKEN) { navServed(window.__DSH_TOKEN); return; }
372
+ if ((performance.now() - startedAt) > timeoutSec * 1000) {
373
+ // 兜底:极低概率 token 一直没来,直接进 target(无 token 可能 401,但已属异常兜底)
374
+ leaving = true; location.replace(target);
375
+ return;
376
+ }
377
+ var s = document.createElement('script');
378
+ s.src = 'token.js?v=' + Date.now();
379
+ s.onload = function () {
380
+ if (window.__DSH_TOKEN) { navServed(window.__DSH_TOKEN); }
381
+ else setTimeout(pollToken, 300);
382
+ };
383
+ s.onerror = function () { setTimeout(pollToken, 300); };
384
+ document.head.appendChild(s);
385
+ setTimeout(pollToken, 600);
386
+ };
387
+ pollToken();
388
+ return;
389
+ }
390
+
277
391
  var frame = document.getElementById('appFrame');
278
392
  frame.setAttribute('allow', 'clipboard-read; clipboard-write; fullscreen; autoplay');
279
393
 
@@ -339,8 +453,10 @@
339
453
  }
340
454
 
341
455
  if (served) {
342
- /* 同源模式:后台加载真实 GUI,真正就绪后再揭示 */
343
- frame.src = '/';
456
+ /* 同源模式:后台加载真实 GUI,真正就绪后再揭示。
457
+ alpha.3+ 的根路径需要 token 认证:target 携带 token 时首次加载完成换 cookie,
458
+ 服务端 303 回到干净根路径;无 target 参数时退回原来的 '/'。 */
459
+ frame.src = target;
344
460
  var minBeforeReveal = hold ? 250 : splashAnimMs;
345
461
  var revealDeadline = startedAt + timeoutSec * 1000;
346
462
  (function watch() {
@@ -361,7 +477,8 @@
361
477
  if (up && elapsed >= splashAnimMs) {
362
478
  if (handoff) {
363
479
  var base = target.replace(/\/+$/, '');
364
- fadeAndGo(base + '/splash.html?hold=1&timeout=60' + (drawLogo ? '&logo=draw' : ''));
480
+ // 把带 token 的 target 传给同源 splash,alpha.3+ 的根路径认证才能通过
481
+ fadeAndGo(base + '/splash.html?hold=1&timeout=60&target=' + encodeURIComponent(target) + (drawLogo ? '&logo=draw' : ''));
365
482
  } else {
366
483
  fadeAndGo(target);
367
484
  }
package/whale-anim.svg CHANGED
@@ -1,48 +1,48 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="200" height="200" fill="none">
2
- <defs>
3
- <linearGradient id="inkGrad" x1="4" y1="8" x2="46" y2="44" gradientUnits="userSpaceOnUse">
4
- <stop offset="0" stop-color="#a7c0ff"/>
5
- <stop offset="0.45" stop-color="#4d6bfe"/>
6
- <stop offset="0.75" stop-color="#7c5cff"/>
7
- <stop offset="1" stop-color="#22d3ee"/>
8
- </linearGradient>
9
- <linearGradient id="fillGrad" x1="14" y1="12" x2="34" y2="40" gradientUnits="userSpaceOnUse">
10
- <stop offset="0" stop-color="#ffffff"/>
11
- <stop offset="0.55" stop-color="#dbeafe"/>
12
- <stop offset="1" stop-color="#9db8ff"/>
13
- </linearGradient>
14
- <filter id="softGlow" x="-40%" y="-40%" width="180%" height="180%">
15
- <feGaussianBlur stdDeviation="1.6" result="b"/>
16
- <feMerge>
17
- <feMergeNode in="b"/>
18
- <feMergeNode in="SourceGraphic"/>
19
- </feMerge>
20
- </filter>
21
- </defs>
22
- <style>
23
- .ink {
24
- stroke-dasharray: 1000;
25
- stroke-dashoffset: 1000;
26
- animation: draw 2.35s cubic-bezier(0.4, 0, 0.2, 1) forwards;
27
- }
28
- @keyframes draw { to { stroke-dashoffset: 0; } }
29
- .fill {
30
- animation: fill-in 0.55s ease 2.4s forwards;
31
- }
32
- @keyframes fill-in { from { opacity: 0; } to { opacity: 1; } }
33
- .breathe {
34
- transform-origin: 50% 50%;
35
- animation: breathe 3.2s ease-in-out 2.8s infinite;
36
- }
37
- @keyframes breathe {
38
- 0%, 100% { transform: scale(1); }
39
- 50% { transform: scale(1.045); }
40
- }
41
- </style>
42
- <g class="breathe">
43
- <path class="ink" d="M48.8354 10.0479C48.3232 9.79199 48.1025 10.2798 47.8032 10.5278C47.7007 10.6079 47.6143 10.7119 47.5273 10.8076C46.7793 11.624 45.9048 12.1597 44.7622 12.0957C43.0923 12 41.666 12.5356 40.4058 13.8398C40.1377 12.2319 39.2476 11.272 37.8926 10.6558C37.1836 10.3359 36.4668 10.0156 35.9702 9.31982C35.6235 8.82373 35.5293 8.27197 35.356 7.72754C35.2456 7.3999 35.1353 7.06396 34.7651 7.00781C34.3633 6.94385 34.2056 7.2876 34.0479 7.57568C33.418 8.75195 33.1733 10.0479 33.1973 11.3599C33.2524 14.312 34.4736 16.6641 36.8999 18.3359C37.1758 18.5278 37.2466 18.7197 37.1597 19C36.9946 19.5757 36.7974 20.1357 36.624 20.7119C36.5137 21.0801 36.3486 21.1597 35.9624 21C34.6309 20.4321 33.481 19.5918 32.4644 18.5757C30.7393 16.8721 29.1792 14.9917 27.2334 13.52C26.7764 13.1758 26.3193 12.856 25.8467 12.5518C23.8618 10.584 26.1069 8.96777 26.627 8.77588C27.1704 8.57568 26.8159 7.8877 25.0591 7.896C23.3022 7.90381 21.6953 8.50391 19.647 9.30371C19.3477 9.42383 19.0322 9.51172 18.7095 9.58398C16.8501 9.22363 14.9199 9.14355 12.9033 9.37598C9.10596 9.80762 6.07275 11.6396 3.84326 14.7681C1.16455 18.5278 0.53418 22.7998 1.30664 27.2559C2.11768 31.9521 4.46582 35.8398 8.07373 38.8799C11.8159 42.0322 16.1255 43.5762 21.041 43.2803C24.0269 43.104 27.3516 42.6963 31.1016 39.4561C32.0469 39.936 33.0396 40.1279 34.686 40.272C35.9546 40.3921 37.1758 40.208 38.1211 40.0078C39.6021 39.688 39.4995 38.2881 38.9639 38.0322C34.623 35.9678 35.5762 36.8081 34.71 36.1279C36.9155 33.4639 40.2402 30.6958 41.54 21.728C41.6426 21.0161 41.5557 20.5679 41.54 19.9917C41.5322 19.6396 41.6108 19.5039 42.0049 19.4639C43.0923 19.3359 44.1479 19.0317 45.1167 18.4878C47.9292 16.9199 49.064 14.3438 49.3315 11.2559C49.3711 10.7837 49.3237 10.2959 48.8354 10.0479ZM24.3262 37.8398C20.1196 34.4639 18.0791 33.3521 17.2358 33.3999C16.4482 33.4482 16.5898 34.3682 16.7632 34.9678C16.9443 35.5601 17.1812 35.9683 17.5117 36.4878C17.7402 36.832 17.8979 37.3442 17.2832 37.728C15.9282 38.584 13.5728 37.4399 13.4624 37.3838C10.7207 35.7358 8.42822 33.5601 6.81348 30.584C5.25342 27.7197 4.34766 24.6479 4.19775 21.3677C4.1582 20.5757 4.38672 20.2959 5.15869 20.1519C6.17529 19.96 7.22314 19.9199 8.23926 20.0718C12.5327 20.7119 16.1885 22.6719 19.2529 25.7759C21.002 27.5439 22.3252 29.6558 23.6885 31.7202C25.1377 33.9121 26.6978 36 28.6831 37.7119C29.3843 38.312 29.9434 38.7681 30.479 39.104C28.8643 39.2881 26.1699 39.3281 24.3262 37.8398ZM26.3433 24.6001C26.3433 24.248 26.6191 23.9678 26.9658 23.9678C27.0444 23.9678 27.1152 23.9839 27.1782 24.0078C27.2651 24.04 27.3438 24.0879 27.4067 24.1602C27.5171 24.272 27.5801 24.4321 27.5801 24.6001C27.5801 24.9521 27.3042 25.2319 26.9575 25.2319C26.6108 25.2319 26.3433 24.9521 26.3433 24.6001ZM32.6064 27.8799C32.2046 28.0479 31.8027 28.1919 31.4165 28.208C30.8179 28.2397 30.1641 27.9922 29.8096 27.688C29.2583 27.2158 28.8643 26.9521 28.6987 26.1279C28.6279 25.7759 28.6675 25.2319 28.7305 24.9199C28.8721 24.248 28.7144 23.8159 28.2495 23.4238C27.8716 23.104 27.3911 23.0161 26.8633 23.0161C26.666 23.0161 26.4849 22.9277 26.3511 22.856C26.1304 22.7441 25.9492 22.4639 26.1226 22.1201C26.1777 22.0078 26.4458 21.7358 26.5088 21.688C27.2256 21.272 28.0527 21.4077 28.8169 21.7197C29.5259 22.0161 30.0615 22.5601 30.834 23.3281C31.6216 24.2559 31.7632 24.5117 32.2124 25.208C32.5669 25.752 32.8901 26.312 33.1104 26.9521C33.2446 27.3521 33.0713 27.6802 32.6064 27.8799Z" pathLength="1000"
44
- stroke="url(#inkGrad)" stroke-width="0.85"
45
- stroke-linecap="round" stroke-linejoin="round" fill="none"/>
46
- <path class="fill" d="M48.8354 10.0479C48.3232 9.79199 48.1025 10.2798 47.8032 10.5278C47.7007 10.6079 47.6143 10.7119 47.5273 10.8076C46.7793 11.624 45.9048 12.1597 44.7622 12.0957C43.0923 12 41.666 12.5356 40.4058 13.8398C40.1377 12.2319 39.2476 11.272 37.8926 10.6558C37.1836 10.3359 36.4668 10.0156 35.9702 9.31982C35.6235 8.82373 35.5293 8.27197 35.356 7.72754C35.2456 7.3999 35.1353 7.06396 34.7651 7.00781C34.3633 6.94385 34.2056 7.2876 34.0479 7.57568C33.418 8.75195 33.1733 10.0479 33.1973 11.3599C33.2524 14.312 34.4736 16.6641 36.8999 18.3359C37.1758 18.5278 37.2466 18.7197 37.1597 19C36.9946 19.5757 36.7974 20.1357 36.624 20.7119C36.5137 21.0801 36.3486 21.1597 35.9624 21C34.6309 20.4321 33.481 19.5918 32.4644 18.5757C30.7393 16.8721 29.1792 14.9917 27.2334 13.52C26.7764 13.1758 26.3193 12.856 25.8467 12.5518C23.8618 10.584 26.1069 8.96777 26.627 8.77588C27.1704 8.57568 26.8159 7.8877 25.0591 7.896C23.3022 7.90381 21.6953 8.50391 19.647 9.30371C19.3477 9.42383 19.0322 9.51172 18.7095 9.58398C16.8501 9.22363 14.9199 9.14355 12.9033 9.37598C9.10596 9.80762 6.07275 11.6396 3.84326 14.7681C1.16455 18.5278 0.53418 22.7998 1.30664 27.2559C2.11768 31.9521 4.46582 35.8398 8.07373 38.8799C11.8159 42.0322 16.1255 43.5762 21.041 43.2803C24.0269 43.104 27.3516 42.6963 31.1016 39.4561C32.0469 39.936 33.0396 40.1279 34.686 40.272C35.9546 40.3921 37.1758 40.208 38.1211 40.0078C39.6021 39.688 39.4995 38.2881 38.9639 38.0322C34.623 35.9678 35.5762 36.8081 34.71 36.1279C36.9155 33.4639 40.2402 30.6958 41.54 21.728C41.6426 21.0161 41.5557 20.5679 41.54 19.9917C41.5322 19.6396 41.6108 19.5039 42.0049 19.4639C43.0923 19.3359 44.1479 19.0317 45.1167 18.4878C47.9292 16.9199 49.064 14.3438 49.3315 11.2559C49.3711 10.7837 49.3237 10.2959 48.8354 10.0479ZM24.3262 37.8398C20.1196 34.4639 18.0791 33.3521 17.2358 33.3999C16.4482 33.4482 16.5898 34.3682 16.7632 34.9678C16.9443 35.5601 17.1812 35.9683 17.5117 36.4878C17.7402 36.832 17.8979 37.3442 17.2832 37.728C15.9282 38.584 13.5728 37.4399 13.4624 37.3838C10.7207 35.7358 8.42822 33.5601 6.81348 30.584C5.25342 27.7197 4.34766 24.6479 4.19775 21.3677C4.1582 20.5757 4.38672 20.2959 5.15869 20.1519C6.17529 19.96 7.22314 19.9199 8.23926 20.0718C12.5327 20.7119 16.1885 22.6719 19.2529 25.7759C21.002 27.5439 22.3252 29.6558 23.6885 31.7202C25.1377 33.9121 26.6978 36 28.6831 37.7119C29.3843 38.312 29.9434 38.7681 30.479 39.104C28.8643 39.2881 26.1699 39.3281 24.3262 37.8398ZM26.3433 24.6001C26.3433 24.248 26.6191 23.9678 26.9658 23.9678C27.0444 23.9678 27.1152 23.9839 27.1782 24.0078C27.2651 24.04 27.3438 24.0879 27.4067 24.1602C27.5171 24.272 27.5801 24.4321 27.5801 24.6001C27.5801 24.9521 27.3042 25.2319 26.9575 25.2319C26.6108 25.2319 26.3433 24.9521 26.3433 24.6001ZM32.6064 27.8799C32.2046 28.0479 31.8027 28.1919 31.4165 28.208C30.8179 28.2397 30.1641 27.9922 29.8096 27.688C29.2583 27.2158 28.8643 26.9521 28.6987 26.1279C28.6279 25.7759 28.6675 25.2319 28.7305 24.9199C28.8721 24.248 28.7144 23.8159 28.2495 23.4238C27.8716 23.104 27.3911 23.0161 26.8633 23.0161C26.666 23.0161 26.4849 22.9277 26.3511 22.856C26.1304 22.7441 25.9492 22.4639 26.1226 22.1201C26.1777 22.0078 26.4458 21.7358 26.5088 21.688C27.2256 21.272 28.0527 21.4077 28.8169 21.7197C29.5259 22.0161 30.0615 22.5601 30.834 23.3281C31.6216 24.2559 31.7632 24.5117 32.2124 25.208C32.5669 25.752 32.8901 26.312 33.1104 26.9521C33.2446 27.3521 33.0713 27.6802 32.6064 27.8799Z" fill="url(#fillGrad)" opacity="0" filter="url(#softGlow)"/>
47
- </g>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="200" height="200" fill="none">
2
+ <defs>
3
+ <linearGradient id="inkGrad" x1="4" y1="8" x2="46" y2="44" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#a7c0ff"/>
5
+ <stop offset="0.45" stop-color="#4d6bfe"/>
6
+ <stop offset="0.75" stop-color="#7c5cff"/>
7
+ <stop offset="1" stop-color="#22d3ee"/>
8
+ </linearGradient>
9
+ <linearGradient id="fillGrad" x1="14" y1="12" x2="34" y2="40" gradientUnits="userSpaceOnUse">
10
+ <stop offset="0" stop-color="#ffffff"/>
11
+ <stop offset="0.55" stop-color="#dbeafe"/>
12
+ <stop offset="1" stop-color="#9db8ff"/>
13
+ </linearGradient>
14
+ <filter id="softGlow" x="-40%" y="-40%" width="180%" height="180%">
15
+ <feGaussianBlur stdDeviation="1.6" result="b"/>
16
+ <feMerge>
17
+ <feMergeNode in="b"/>
18
+ <feMergeNode in="SourceGraphic"/>
19
+ </feMerge>
20
+ </filter>
21
+ </defs>
22
+ <style>
23
+ .ink {
24
+ stroke-dasharray: 1000;
25
+ stroke-dashoffset: 1000;
26
+ animation: draw 2.35s cubic-bezier(0.4, 0, 0.2, 1) forwards;
27
+ }
28
+ @keyframes draw { to { stroke-dashoffset: 0; } }
29
+ .fill {
30
+ animation: fill-in 0.55s ease 2.4s forwards;
31
+ }
32
+ @keyframes fill-in { from { opacity: 0; } to { opacity: 1; } }
33
+ .breathe {
34
+ transform-origin: 50% 50%;
35
+ animation: breathe 3.2s ease-in-out 2.8s infinite;
36
+ }
37
+ @keyframes breathe {
38
+ 0%, 100% { transform: scale(1); }
39
+ 50% { transform: scale(1.045); }
40
+ }
41
+ </style>
42
+ <g class="breathe">
43
+ <path class="ink" d="M48.8354 10.0479C48.3232 9.79199 48.1025 10.2798 47.8032 10.5278C47.7007 10.6079 47.6143 10.7119 47.5273 10.8076C46.7793 11.624 45.9048 12.1597 44.7622 12.0957C43.0923 12 41.666 12.5356 40.4058 13.8398C40.1377 12.2319 39.2476 11.272 37.8926 10.6558C37.1836 10.3359 36.4668 10.0156 35.9702 9.31982C35.6235 8.82373 35.5293 8.27197 35.356 7.72754C35.2456 7.3999 35.1353 7.06396 34.7651 7.00781C34.3633 6.94385 34.2056 7.2876 34.0479 7.57568C33.418 8.75195 33.1733 10.0479 33.1973 11.3599C33.2524 14.312 34.4736 16.6641 36.8999 18.3359C37.1758 18.5278 37.2466 18.7197 37.1597 19C36.9946 19.5757 36.7974 20.1357 36.624 20.7119C36.5137 21.0801 36.3486 21.1597 35.9624 21C34.6309 20.4321 33.481 19.5918 32.4644 18.5757C30.7393 16.8721 29.1792 14.9917 27.2334 13.52C26.7764 13.1758 26.3193 12.856 25.8467 12.5518C23.8618 10.584 26.1069 8.96777 26.627 8.77588C27.1704 8.57568 26.8159 7.8877 25.0591 7.896C23.3022 7.90381 21.6953 8.50391 19.647 9.30371C19.3477 9.42383 19.0322 9.51172 18.7095 9.58398C16.8501 9.22363 14.9199 9.14355 12.9033 9.37598C9.10596 9.80762 6.07275 11.6396 3.84326 14.7681C1.16455 18.5278 0.53418 22.7998 1.30664 27.2559C2.11768 31.9521 4.46582 35.8398 8.07373 38.8799C11.8159 42.0322 16.1255 43.5762 21.041 43.2803C24.0269 43.104 27.3516 42.6963 31.1016 39.4561C32.0469 39.936 33.0396 40.1279 34.686 40.272C35.9546 40.3921 37.1758 40.208 38.1211 40.0078C39.6021 39.688 39.4995 38.2881 38.9639 38.0322C34.623 35.9678 35.5762 36.8081 34.71 36.1279C36.9155 33.4639 40.2402 30.6958 41.54 21.728C41.6426 21.0161 41.5557 20.5679 41.54 19.9917C41.5322 19.6396 41.6108 19.5039 42.0049 19.4639C43.0923 19.3359 44.1479 19.0317 45.1167 18.4878C47.9292 16.9199 49.064 14.3438 49.3315 11.2559C49.3711 10.7837 49.3237 10.2959 48.8354 10.0479ZM24.3262 37.8398C20.1196 34.4639 18.0791 33.3521 17.2358 33.3999C16.4482 33.4482 16.5898 34.3682 16.7632 34.9678C16.9443 35.5601 17.1812 35.9683 17.5117 36.4878C17.7402 36.832 17.8979 37.3442 17.2832 37.728C15.9282 38.584 13.5728 37.4399 13.4624 37.3838C10.7207 35.7358 8.42822 33.5601 6.81348 30.584C5.25342 27.7197 4.34766 24.6479 4.19775 21.3677C4.1582 20.5757 4.38672 20.2959 5.15869 20.1519C6.17529 19.96 7.22314 19.9199 8.23926 20.0718C12.5327 20.7119 16.1885 22.6719 19.2529 25.7759C21.002 27.5439 22.3252 29.6558 23.6885 31.7202C25.1377 33.9121 26.6978 36 28.6831 37.7119C29.3843 38.312 29.9434 38.7681 30.479 39.104C28.8643 39.2881 26.1699 39.3281 24.3262 37.8398ZM26.3433 24.6001C26.3433 24.248 26.6191 23.9678 26.9658 23.9678C27.0444 23.9678 27.1152 23.9839 27.1782 24.0078C27.2651 24.04 27.3438 24.0879 27.4067 24.1602C27.5171 24.272 27.5801 24.4321 27.5801 24.6001C27.5801 24.9521 27.3042 25.2319 26.9575 25.2319C26.6108 25.2319 26.3433 24.9521 26.3433 24.6001ZM32.6064 27.8799C32.2046 28.0479 31.8027 28.1919 31.4165 28.208C30.8179 28.2397 30.1641 27.9922 29.8096 27.688C29.2583 27.2158 28.8643 26.9521 28.6987 26.1279C28.6279 25.7759 28.6675 25.2319 28.7305 24.9199C28.8721 24.248 28.7144 23.8159 28.2495 23.4238C27.8716 23.104 27.3911 23.0161 26.8633 23.0161C26.666 23.0161 26.4849 22.9277 26.3511 22.856C26.1304 22.7441 25.9492 22.4639 26.1226 22.1201C26.1777 22.0078 26.4458 21.7358 26.5088 21.688C27.2256 21.272 28.0527 21.4077 28.8169 21.7197C29.5259 22.0161 30.0615 22.5601 30.834 23.3281C31.6216 24.2559 31.7632 24.5117 32.2124 25.208C32.5669 25.752 32.8901 26.312 33.1104 26.9521C33.2446 27.3521 33.0713 27.6802 32.6064 27.8799Z" pathLength="1000"
44
+ stroke="url(#inkGrad)" stroke-width="0.85"
45
+ stroke-linecap="round" stroke-linejoin="round" fill="none"/>
46
+ <path class="fill" d="M48.8354 10.0479C48.3232 9.79199 48.1025 10.2798 47.8032 10.5278C47.7007 10.6079 47.6143 10.7119 47.5273 10.8076C46.7793 11.624 45.9048 12.1597 44.7622 12.0957C43.0923 12 41.666 12.5356 40.4058 13.8398C40.1377 12.2319 39.2476 11.272 37.8926 10.6558C37.1836 10.3359 36.4668 10.0156 35.9702 9.31982C35.6235 8.82373 35.5293 8.27197 35.356 7.72754C35.2456 7.3999 35.1353 7.06396 34.7651 7.00781C34.3633 6.94385 34.2056 7.2876 34.0479 7.57568C33.418 8.75195 33.1733 10.0479 33.1973 11.3599C33.2524 14.312 34.4736 16.6641 36.8999 18.3359C37.1758 18.5278 37.2466 18.7197 37.1597 19C36.9946 19.5757 36.7974 20.1357 36.624 20.7119C36.5137 21.0801 36.3486 21.1597 35.9624 21C34.6309 20.4321 33.481 19.5918 32.4644 18.5757C30.7393 16.8721 29.1792 14.9917 27.2334 13.52C26.7764 13.1758 26.3193 12.856 25.8467 12.5518C23.8618 10.584 26.1069 8.96777 26.627 8.77588C27.1704 8.57568 26.8159 7.8877 25.0591 7.896C23.3022 7.90381 21.6953 8.50391 19.647 9.30371C19.3477 9.42383 19.0322 9.51172 18.7095 9.58398C16.8501 9.22363 14.9199 9.14355 12.9033 9.37598C9.10596 9.80762 6.07275 11.6396 3.84326 14.7681C1.16455 18.5278 0.53418 22.7998 1.30664 27.2559C2.11768 31.9521 4.46582 35.8398 8.07373 38.8799C11.8159 42.0322 16.1255 43.5762 21.041 43.2803C24.0269 43.104 27.3516 42.6963 31.1016 39.4561C32.0469 39.936 33.0396 40.1279 34.686 40.272C35.9546 40.3921 37.1758 40.208 38.1211 40.0078C39.6021 39.688 39.4995 38.2881 38.9639 38.0322C34.623 35.9678 35.5762 36.8081 34.71 36.1279C36.9155 33.4639 40.2402 30.6958 41.54 21.728C41.6426 21.0161 41.5557 20.5679 41.54 19.9917C41.5322 19.6396 41.6108 19.5039 42.0049 19.4639C43.0923 19.3359 44.1479 19.0317 45.1167 18.4878C47.9292 16.9199 49.064 14.3438 49.3315 11.2559C49.3711 10.7837 49.3237 10.2959 48.8354 10.0479ZM24.3262 37.8398C20.1196 34.4639 18.0791 33.3521 17.2358 33.3999C16.4482 33.4482 16.5898 34.3682 16.7632 34.9678C16.9443 35.5601 17.1812 35.9683 17.5117 36.4878C17.7402 36.832 17.8979 37.3442 17.2832 37.728C15.9282 38.584 13.5728 37.4399 13.4624 37.3838C10.7207 35.7358 8.42822 33.5601 6.81348 30.584C5.25342 27.7197 4.34766 24.6479 4.19775 21.3677C4.1582 20.5757 4.38672 20.2959 5.15869 20.1519C6.17529 19.96 7.22314 19.9199 8.23926 20.0718C12.5327 20.7119 16.1885 22.6719 19.2529 25.7759C21.002 27.5439 22.3252 29.6558 23.6885 31.7202C25.1377 33.9121 26.6978 36 28.6831 37.7119C29.3843 38.312 29.9434 38.7681 30.479 39.104C28.8643 39.2881 26.1699 39.3281 24.3262 37.8398ZM26.3433 24.6001C26.3433 24.248 26.6191 23.9678 26.9658 23.9678C27.0444 23.9678 27.1152 23.9839 27.1782 24.0078C27.2651 24.04 27.3438 24.0879 27.4067 24.1602C27.5171 24.272 27.5801 24.4321 27.5801 24.6001C27.5801 24.9521 27.3042 25.2319 26.9575 25.2319C26.6108 25.2319 26.3433 24.9521 26.3433 24.6001ZM32.6064 27.8799C32.2046 28.0479 31.8027 28.1919 31.4165 28.208C30.8179 28.2397 30.1641 27.9922 29.8096 27.688C29.2583 27.2158 28.8643 26.9521 28.6987 26.1279C28.6279 25.7759 28.6675 25.2319 28.7305 24.9199C28.8721 24.248 28.7144 23.8159 28.2495 23.4238C27.8716 23.104 27.3911 23.0161 26.8633 23.0161C26.666 23.0161 26.4849 22.9277 26.3511 22.856C26.1304 22.7441 25.9492 22.4639 26.1226 22.1201C26.1777 22.0078 26.4458 21.7358 26.5088 21.688C27.2256 21.272 28.0527 21.4077 28.8169 21.7197C29.5259 22.0161 30.0615 22.5601 30.834 23.3281C31.6216 24.2559 31.7632 24.5117 32.2124 25.208C32.5669 25.752 32.8901 26.312 33.1104 26.9521C33.2446 27.3521 33.0713 27.6802 32.6064 27.8799Z" fill="url(#fillGrad)" opacity="0" filter="url(#softGlow)"/>
47
+ </g>
48
48
  </svg>