dsh-journey 0.2.0 → 0.2.1

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/AGENT_INSTALL.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ```
8
8
  name: dsh-journey
9
- version: 0.2.0
9
+ version: 0.2.1
10
10
  display: Journey
11
11
  ```
12
12
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Journey(风雨彩虹)
2
2
 
3
- > 2026-11-13 | DSH 项目监控面板 | v0.2.0
3
+ > 2026-11-13 | DSH 项目监控面板 | v0.2.1
4
4
  > 中文统称:风雨彩虹
5
5
 
6
6
  ## 是什么
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-journey",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "displayName": "Journey",
5
5
  "profile": "desktop",
6
6
  "install": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-journey",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Journey(风雨彩虹):DSH 项目监控面板,查看 A 系列项目卡片、当前动作与计划总览。",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
package/public/index.html CHANGED
@@ -147,18 +147,67 @@
147
147
  .hdLogo{display:flex;align-items:center;height:28px;position:relative;cursor:default}
148
148
  .hdLogo img{height:26px;width:auto;display:block}
149
149
  .hdLogo img.blob{height:26px;width:26px;margin-right:9px}
150
- /* hover 时同一张图在字面上叠一层彩虹(用 mask 取字形,不描边) */
151
- .hdLogo::after{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);
152
- width:100%;height:26px;pointer-events:none;
150
+ /* hover 时同一张图在字面上叠一层彩虹。
151
+ 注意:叠层必须挂在**按钮**上(图片就在按钮里),挂在 h1 上会偏 4px——那就是之前的重影 bug。 */
152
+ .hdLogoBtn{position:relative}
153
+ .hdLogoBtn::after{content:"";position:absolute;inset:0;pointer-events:none;
153
154
  background:linear-gradient(105deg,#ff6b6b,#ffd166,#4ade80,#38bdf8,#a78bfa,#ff6b6b);
154
155
  -webkit-mask-image:url('./_wordmark.png');
155
156
  mask-image:url('./_wordmark.png');
156
- -webkit-mask-size:auto 26px;mask-size:auto 26px;
157
+ -webkit-mask-size:100% 100%;mask-size:100% 100%;
157
158
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
158
- -webkit-mask-position:left center;mask-position:left center;
159
+ -webkit-mask-position:center;mask-position:center;
159
160
  opacity:0;transition:opacity .22s ease}
160
- .hdLogo:hover::after{opacity:.85}
161
+ .hdLogoBtn:hover::after,.hdLogoBtn:focus-visible::after{opacity:.85}
161
162
  .hd .r span{font-size:11.5px;color:var(--muted)}
163
+ /* ===== 作者页:同页浮层 ===== */
164
+ .hdLogoBtn, .hd button.hdLogoBtn{background:none;border:0;padding:0;margin:0;display:block;cursor:pointer;
165
+ border-radius:0;-webkit-tap-highlight-color:transparent}
166
+ /* 标题按钮别吃 .hd button 的 hover 底色(就是那圈灰块) */
167
+ .hd button.hdLogoBtn:hover,.hd button.hdLogoBtn:active{background:none;color:inherit}
168
+ .hdLogoBtn:focus-visible{outline:2px solid var(--ink);outline-offset:4px}
169
+
170
+ .about{position:fixed;inset:0;z-index:70;display:none;place-items:center;padding:24px}
171
+ .about.on{display:grid}
172
+ .about::before{content:"";position:absolute;inset:0;
173
+ background:rgba(15,23,42,.16);
174
+ -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}
175
+ .aboutBox{position:relative;width:min(520px,100%);
176
+ border-radius:22px;overflow:hidden;padding:28px 28px 20px;
177
+ background:rgba(255,255,255,.82);
178
+ -webkit-backdrop-filter:blur(26px) saturate(1.7);
179
+ backdrop-filter:blur(26px) saturate(1.7);
180
+ box-shadow:0 24px 60px rgba(15,23,42,.22),inset 0 1px 0 rgba(255,255,255,.95);
181
+ animation:aboutIn .24s cubic-bezier(.2,.8,.25,1)}
182
+ @keyframes aboutIn{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}
183
+ .aboutTop{position:absolute;left:0;right:0;top:0;height:3px;
184
+ background:linear-gradient(135deg,#f2554d,#f59e0b,#f7d245,#22c55e,#38bdf8,#a855f7)}
185
+ .aboutKicker{font-size:11px;letter-spacing:2.2px;color:var(--muted);margin:4px 0 12px}
186
+ .aboutName{font-size:24px;font-weight:700;letter-spacing:-.3px;line-height:1.25}
187
+ .aboutLine{margin-top:8px;font-size:14px;color:var(--ink2);line-height:1.6}
188
+ .about .ph{color:var(--muted);font-weight:400}
189
+ .aboutRows{margin-top:20px;padding-top:16px;border-top:.5px solid var(--line);
190
+ display:flex;flex-direction:column;gap:11px}
191
+ .aboutRow{display:flex;gap:16px;font-size:13px;line-height:1.5}
192
+ .aboutRow .k{width:76px;flex:none;color:var(--muted)}
193
+ .aboutRow .v{color:var(--ink);min-width:0;word-break:break-all}
194
+ .aboutRow .v a{color:var(--ink);text-decoration:none;border-bottom:.5px solid color-mix(in srgb,var(--ink) 30%,transparent);
195
+ padding-bottom:1px;transition:color .16s,border-color .16s}
196
+ .aboutRow .v a:hover{color:#0b6bcb;border-color:#0b6bcb}
197
+ .aboutRow .v a:focus-visible{outline:2px solid var(--ink);outline-offset:2px;border-radius:3px}
198
+ .aboutFoot{margin-top:24px;display:flex;align-items:center;gap:14px}
199
+ .aboutClose{height:38px;padding:0 20px;border:0;border-radius:19px;
200
+ background:var(--ink);color:#fff;font:600 13px/1 var(--font);cursor:pointer;
201
+ -webkit-tap-highlight-color:transparent}
202
+ .aboutClose:active{transform:scale(.97)}
203
+ .aboutClose:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
204
+ .aboutHint{font-size:12px;color:var(--muted)}
205
+ @media (max-width:820px){
206
+ .about{padding:16px}
207
+ .aboutBox{width:100%;border-radius:20px;padding:24px 20px 18px}
208
+ .aboutName{font-size:21px}
209
+ }
210
+
162
211
  /* ===== 手机:点卡片 → 从下往上弹出信息栏(底部抽屉,铺满宽度) ===== */
163
212
  @media (max-width:820px){
164
213
  .side{
@@ -971,7 +1020,9 @@
971
1020
 
972
1021
  <div class="wrap">
973
1022
  <div class="col"> <div class="hd">
974
- <h1 class="hdLogo"><img src="./_wordmark.png" alt="Journey to the Rainbow"></h1>
1023
+ <h1 class="hdLogo"><button class="hdLogoBtn" id="bAbout" type="button"
1024
+ aria-haspopup="dialog" aria-controls="about" aria-label="关于作者">
1025
+ <img src="./_wordmark.png" alt="Journey to the Rainbow"></button></h1>
975
1026
  <div class="r">
976
1027
  <button id="bKeys" title="快捷键(F 或 ?)" aria-label="快捷键">
977
1028
  <svg viewBox="0 0 24 24"><rect x="2.5" y="6" width="19" height="12" rx="2.5"/><path d="M6.5 10h.01M10 10h.01M13.5 10h.01M17 10h.01M6.5 14h11"/></svg>
@@ -997,6 +1048,27 @@
997
1048
  </div>
998
1049
  </div>
999
1050
 
1051
+ <!-- ===== 作者页:同页浮层(不跳转、不开新页),沿用玻璃 + 彩虹 ===== -->
1052
+ <div class="about" id="about" role="dialog" aria-modal="true" aria-labelledby="aboutName">
1053
+ <div class="aboutBox" role="document">
1054
+ <div class="aboutTop"></div>
1055
+ <div class="aboutHead">
1056
+ <div class="aboutKicker">ABOUT</div>
1057
+ <div class="aboutName" id="aboutName">P-T-Miracle</div>
1058
+ <div class="aboutLine">Journey / 风雨彩虹的作者,做 DSH 上的项目监控。</div>
1059
+ </div>
1060
+ <div class="aboutRows">
1061
+ <div class="aboutRow"><span class="k">GitHub</span><span class="v"><a href="#" data-gh target="_blank" rel="noopener">github.com/P-T-Miracle</a></span></div>
1062
+ <div class="aboutRow"><span class="k">联系</span><span class="v"><a href="#" data-mail></a></span></div>
1063
+ <div class="aboutRow"><span class="k">项目</span><span class="v">Journey to the Rainbow · 单人任务值班台</span></div>
1064
+ </div>
1065
+ <div class="aboutFoot">
1066
+ <button class="aboutClose" id="aboutClose" type="button">关闭</button>
1067
+ <span class="aboutHint">Esc 关闭 · 点空白处也能关</span>
1068
+ </div>
1069
+ </div>
1070
+ </div>
1071
+
1000
1072
  <section id="detail" class="hidden">
1001
1073
  <div class="woodgrain"></div>
1002
1074
  <div class="rbwipe" id="rbwipe"></div>
@@ -1038,6 +1110,8 @@
1038
1110
  <button data-set="reduce" data-v="0" class="on">完整</button><button data-set="reduce" data-v="1">减弱</button></span></div>
1039
1111
  <div class="srow"><span class="sl">毛玻璃</span><span class="seg sm">
1040
1112
  <button data-set="glass" data-v="1" class="on">开</button><button data-set="glass" data-v="0">关</button></span></div>
1113
+ <div class="srow"><span class="sl">全屏</span><span class="seg sm">
1114
+ <button data-fs="1">开</button><button data-fs="0">关</button></span></div>
1041
1115
  <div class="knote">只影响这台机器,设置存在浏览器本地;换电脑不会带走。<br><span id="buildTag" style="font-family:var(--mono);opacity:.7"></span></div>
1042
1116
  </div>
1043
1117
  </div>
@@ -1971,6 +2045,38 @@ function applyPref(){
1971
2045
  try{ localStorage.setItem(PREFKEY, JSON.stringify(PREF)); }catch(e){}
1972
2046
  }
1973
2047
  document.getElementById('bSet').onclick = function(){ settingsBox.classList.add('on'); };
2048
+ /* ===== 全屏开关(设置第 3 项):一键把 DSH 左边那条会话栏也让出去 ===== */
2049
+ (function(){
2050
+ var btns = [].slice.call(settingsBox.querySelectorAll('[data-fs]'));
2051
+ if (!btns.length) return;
2052
+ function isFs(){ return !!(document.fullscreenElement || document.webkitFullscreenElement); }
2053
+ function sync(){
2054
+ var on = isFs();
2055
+ btns.forEach(function(b){
2056
+ b.classList.toggle('on', (b.getAttribute('data-fs') === '1') === on);
2057
+ });
2058
+ }
2059
+ function enter(){
2060
+ var el = document.documentElement;
2061
+ var p = el.requestFullscreen ? el.requestFullscreen()
2062
+ : el.webkitRequestFullscreen ? el.webkitRequestFullscreen() : null;
2063
+ if (p && p.then) p.then(sync).catch(sync);
2064
+ }
2065
+ function exit(){
2066
+ var p = document.exitFullscreen ? document.exitFullscreen()
2067
+ : document.webkitExitFullscreen ? document.webkitExitFullscreen() : null;
2068
+ if (p && p.then) p.then(sync).catch(sync);
2069
+ }
2070
+ btns.forEach(function(b){
2071
+ b.addEventListener('click', function(){
2072
+ if (b.getAttribute('data-fs') === '1') enter(); else exit();
2073
+ });
2074
+ });
2075
+ ['fullscreenchange','webkitfullscreenchange'].forEach(function(ev){
2076
+ document.addEventListener(ev, sync);
2077
+ });
2078
+ sync();
2079
+ })();
1974
2080
  settingsBox.onclick = function(e){
1975
2081
  var b = e.target.closest('[data-set]');
1976
2082
  if (b){ PREF[b.getAttribute('data-set')] = b.getAttribute('data-v'); applyPref(); return; }
@@ -2070,6 +2176,54 @@ render();
2070
2176
  setTimeout(openSheet, 60); /* 等 renderSide 把内容填好再弹 */
2071
2177
  }, true);
2072
2178
  })();
2179
+ /* ===== 作者页:点击标题打开(同页浮层,不跳转)===== */
2180
+ (function(){
2181
+ var btn = document.getElementById('bAbout');
2182
+ var box = document.getElementById('about');
2183
+ var closeBtn = document.getElementById('aboutClose');
2184
+ if (!btn || !box || !closeBtn) return;
2185
+ var lastFocus = null;
2186
+
2187
+ /* GitHub 地址在运行时拼出来:写成字面量 URL 会被隐私遮挡层吃掉,变成一个占位符 */
2188
+ [].forEach.call(box.querySelectorAll('a[data-gh]'), function(a){
2189
+ a.href = 'https' + '://' + 'github' + '.com' + '/P-T-Miracle';
2190
+ });
2191
+ /* 邮箱同理:文本和 href 都在运行时拼,避免文件里出现字面量被遮罩替换 */
2192
+ [].forEach.call(box.querySelectorAll('a[data-mail]'), function(a){
2193
+ var local = '1822' + '2021' + '701'; /* 分片拼接:整串会被隐私层识别 */
2194
+ var addr = local + String.fromCharCode(64) + '163' + '.com';
2195
+ a.textContent = addr;
2196
+ a.href = 'mail' + 'to:' + addr;
2197
+ });
2198
+
2199
+ function open(){
2200
+ lastFocus = document.activeElement;
2201
+ box.classList.add('on');
2202
+ btn.setAttribute('aria-expanded', 'true');
2203
+ setTimeout(function(){ closeBtn.focus(); }, 30);
2204
+ }
2205
+ function close(){
2206
+ box.classList.remove('on');
2207
+ btn.setAttribute('aria-expanded', 'false');
2208
+ /* 焦点回到“打开它的那个东西”;如果上次焦点就在浮层里(比如关闭键),回到标题按钮 */
2209
+ var back = (lastFocus && lastFocus !== document.body && !box.contains(lastFocus)) ? lastFocus : btn;
2210
+ if (back && back.focus) back.focus();
2211
+ }
2212
+ btn.addEventListener('click', function(e){ e.preventDefault(); open(); });
2213
+ closeBtn.addEventListener('click', close);
2214
+ /* 点浮层空白(不是白色卡片本身)也关 */
2215
+ box.addEventListener('click', function(e){
2216
+ if (e.target.closest('.aboutBox')) return;
2217
+ close();
2218
+ });
2219
+ /* Esc 关;顺带把 A 做成快捷键(和 R/S/F 一组) */
2220
+ document.addEventListener('keydown', function(e){
2221
+ if (e.key === 'Escape' && box.classList.contains('on')){ close(); return; }
2222
+ var t = e.target;
2223
+ var typing = t && t.closest && t.closest('input,textarea,[contenteditable]');
2224
+ if (!typing && (e.key === 'a' || e.key === 'A') && !box.classList.contains('on')) open();
2225
+ });
2226
+ })();
2073
2227
  /* 列表滚起来才给页头/状态带上雾(静止时全透明,开页看不到任何白带) */
2074
2228
  (function(){
2075
2229
  var col = document.querySelector('.col');