dsh-vaultwarden 0.9.1 → 0.9.3
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/CHANGELOG.md +22 -0
- package/assets/badge/badge-tile.svg +30 -0
- package/assets/badge/badge-white.svg +22 -0
- package/assets/badge/badge.svg +22 -0
- package/assets/badge/index.html +32 -0
- package/lib/client.js +197 -51
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,28 @@ All notable changes to `dsh-vaultwarden` are documented here.
|
|
|
4
4
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.9.3] — 2026-10-21
|
|
8
|
+
|
|
9
|
+
### 修复
|
|
10
|
+
|
|
11
|
+
- 修复首次加载后侧栏一直停在占位块、下方留一大片空白的问题。根因是「读取资料夹」与「读取侧栏统计」被放在同一个 `Promise.all` 里:后者决定侧栏画什么,前者只用于「移动到文件夹」,但前者一旦挂住,就会把已经返回的统计一起扣住,侧栏因此永远停在"加载中",而列表早已渲染出全部条目。
|
|
12
|
+
- 两次读取改为各自结算:各带自己的超时,谁先到谁先渲染,互不等待。资料夹读取超时 5 秒,侧栏统计 6 秒(且整条重试链共用一个上限,不是每次尝试各算一遍)。
|
|
13
|
+
- 统计读取失败时侧栏落到三个结构项并退出忙碌态,不再保留永远不会兑现的占位块。
|
|
14
|
+
- 占位骨架条的颜色由背景层色改为宿主边框色:原先在白底面板上几乎不可见,一片空白看起来像空盒子而不是"加载中"。
|
|
15
|
+
|
|
16
|
+
## [0.9.2] — 2026-10-21
|
|
17
|
+
|
|
18
|
+
### 变更
|
|
19
|
+
|
|
20
|
+
- 面板标题改为纯文字「凭据库」,去掉标题前的徽章;按钮改用不带动画的文字标签。
|
|
21
|
+
- 标题字号由 17px 提升到 19px。
|
|
22
|
+
- 侧栏与设置导航的分区徽章改为盾牌加锁孔,纯黑白,跟随主题明暗。
|
|
23
|
+
|
|
24
|
+
### 修复
|
|
25
|
+
|
|
26
|
+
- 修复标题与后面的版本号、GitHub 链接文字高度不齐的问题。
|
|
27
|
+
- 修复 GitHub 链接内图标与文字未对齐的问题。
|
|
28
|
+
|
|
7
29
|
## [0.9.1] — 2026-10-21
|
|
8
30
|
|
|
9
31
|
### 修复
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
dsh-vaultwarden — app tile
|
|
4
|
+
A dark rounded tile for launcher/app-icon slots, where the badge has to hold its own on a dark surface.
|
|
5
|
+
|
|
6
|
+
Elements
|
|
7
|
+
shield outline ..... a credential vault (Bitwarden's own mark is a shield)
|
|
8
|
+
keyhole ........... Bitwarden / Vaultwarden
|
|
9
|
+
orca .............. dsh's own whale wordmark
|
|
10
|
+
accent #175DDC .... Bitwarden brand blue
|
|
11
|
+
|
|
12
|
+
The whale is the real dsh mark: the single <path> from the host's frontend
|
|
13
|
+
bundle (viewBox 0 0 23.16 17.04), embedded verbatim rather than redrawn.
|
|
14
|
+
MIT, same as the plugin.
|
|
15
|
+
-->
|
|
16
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" width="96" height="96" role="img" aria-label="dsh-vaultwarden">
|
|
17
|
+
<title>dsh-vaultwarden</title>
|
|
18
|
+
<defs>
|
|
19
|
+
<linearGradient id="tile" x1="0" y1="0" x2="0" y2="1">
|
|
20
|
+
<stop offset="0" stop-color="#262B33"/>
|
|
21
|
+
<stop offset="1" stop-color="#14171C"/>
|
|
22
|
+
</linearGradient>
|
|
23
|
+
</defs>
|
|
24
|
+
<rect x="2" y="2" width="92" height="92" rx="23" fill="url(#tile)"/>
|
|
25
|
+
<rect x="2" y="2" width="92" height="92" rx="23" fill="none" stroke="#333A44" stroke-width="1"/>
|
|
26
|
+
<path d="M48 10 L82 24 V52 C82 71 66 84 48 90 C30 84 14 71 14 52 V24 Z" transform="translate(6,4) scale(0.875)" fill="none" stroke="#FFFFFF" stroke-width="4.4" stroke-linejoin="round"/>
|
|
27
|
+
<circle cx="48" cy="32" r="5.6" fill="#FFFFFF"/>
|
|
28
|
+
<path d="M44 36.4 L52 36.4 L54.6 47 L41.4 47 Z" fill="#FFFFFF"/>
|
|
29
|
+
<g transform="translate(32,53)"><svg width="32" height="23.54" viewBox="0 0 23.16 17.04" fill="#175DDC" overflow="visible"><path d="M22.9168 1.43018C22.6713 1.31018 22.5658 1.53918 22.4223 1.65519C22.3733 1.69269 22.3318 1.74169 22.2903 1.78669C21.9317 2.1697 21.5127 2.42121 20.9657 2.39121C20.1657 2.34621 19.4827 2.59771 18.8787 3.20973C18.7502 2.45521 18.3236 2.0047 17.6746 1.71569C17.3351 1.56568 16.9916 1.41518 16.7536 1.08867C16.5876 0.856163 16.5421 0.597155 16.4591 0.341647C16.4061 0.187643 16.3536 0.0301382 16.1761 0.00363739C15.9836 -0.0263635 15.9081 0.135141 15.8326 0.270145C15.5306 0.822162 15.4136 1.43018 15.4251 2.0462C15.4516 3.43174 16.0366 4.53527 17.1991 5.3203C17.3311 5.4103 17.3651 5.5003 17.3236 5.63181C17.2441 5.90231 17.1501 6.16482 17.0671 6.43533C17.0141 6.60784 16.9351 6.64584 16.7501 6.57033C16.1121 6.30383 15.5611 5.90931 15.074 5.4328C14.2475 4.63328 13.5 3.75075 12.568 3.05973C12.349 2.89822 12.13 2.74822 11.9034 2.60522C10.9524 1.68169 12.028 0.923165 12.277 0.833162C12.5375 0.739159 12.3675 0.41615 11.5259 0.42015C10.6844 0.42365 9.91439 0.705658 8.93286 1.08117C8.78935 1.13767 8.63835 1.17867 8.48384 1.21267C7.59332 1.04367 6.66829 1.00617 5.70226 1.11517C3.88321 1.31768 2.43016 2.1777 1.36213 3.64575C0.0790928 5.4103 -0.222916 7.41536 0.146595 9.50642C0.535106 11.7105 1.66014 13.535 3.38869 14.9616C5.18125 16.4406 7.24581 17.1657 9.60138 17.0266C11.0319 16.9441 12.6245 16.7526 14.421 15.2321C14.874 15.4576 15.3496 15.5476 16.1381 15.6151C16.7456 15.6716 17.3306 15.5851 17.7836 15.4911C18.4931 15.3411 18.4441 14.6841 18.1876 14.5636C16.1081 13.595 16.5646 13.9891 16.1496 13.67C17.2061 12.42 18.8202 10.1979 19.3182 7.17235C19.3672 6.83834 19.4297 6.36783 19.4222 6.09732C19.4182 5.93231 19.4562 5.86831 19.6447 5.84931C20.1657 5.78931 20.6712 5.64681 21.1357 5.3913C22.4833 4.65528 23.0268 3.44624 23.1548 1.9972C23.1738 1.77569 23.1508 1.54668 22.9168 1.43018ZM11.1749 14.4736C9.15936 12.889 8.18184 12.3675 7.77832 12.39C7.40081 12.4125 7.46881 12.8445 7.55182 13.126C7.63882 13.404 7.75182 13.5955 7.91033 13.8396C8.01983 14.0011 8.09533 14.2411 7.80083 14.4216C7.15181 14.8231 6.02327 14.2866 5.97027 14.2601C4.65673 13.4865 3.5587 12.4655 2.78467 11.069C2.03715 9.72493 1.60314 8.28289 1.53164 6.74384C1.51264 6.37233 1.62214 6.24082 1.99215 6.17332C2.47916 6.08332 2.98118 6.06432 3.46769 6.13582C5.52476 6.43633 7.27581 7.35586 8.74385 8.8129C9.58188 9.64243 10.2159 10.634 10.8689 11.6025C11.5634 12.631 12.3105 13.611 13.262 14.4146C13.598 14.6961 13.866 14.9101 14.1225 15.0681C13.349 15.1546 12.058 15.1731 11.1749 14.4746L11.1749 14.4736ZM12.141 8.25988C12.141 8.09488 12.273 7.96338 12.439 7.96338C12.4765 7.96338 12.5105 7.97088 12.541 7.98188C12.5825 7.99688 12.6205 8.01938 12.6505 8.05338C12.7035 8.10588 12.7335 8.18088 12.7335 8.25988C12.7335 8.42489 12.6015 8.55639 12.4355 8.55639C12.2695 8.55639 12.141 8.42489 12.141 8.25988ZM15.1415 9.79893C14.949 9.87793 14.7565 9.94544 14.5715 9.95294C14.2845 9.96794 13.9715 9.85143 13.8015 9.70893C13.5375 9.48742 13.3485 9.36342 13.2695 8.97691C13.2355 8.8119 13.2545 8.55639 13.2845 8.40989C13.3525 8.09438 13.277 7.89187 13.0545 7.70787C12.8735 7.55786 12.643 7.51636 12.39 7.51636C12.2955 7.51636 12.209 7.47486 12.1445 7.44136C12.039 7.38886 11.9519 7.25735 12.035 7.09585C12.0615 7.04335 12.19 6.91584 12.22 6.89334C12.5635 6.69784 12.9595 6.76184 13.326 6.90834C13.6655 7.04735 13.9225 7.30236 14.292 7.66287C14.6695 8.09838 14.7375 8.21838 14.9525 8.54539C15.1225 8.8009 15.277 9.06341 15.3831 9.36392C15.4471 9.55142 15.3641 9.70493 15.1415 9.79893Z"/></svg></g>
|
|
30
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
dsh-vaultwarden — badge, white shield
|
|
4
|
+
For a coloured or photographic background where a tint would disappear.
|
|
5
|
+
|
|
6
|
+
Elements
|
|
7
|
+
shield outline ..... a credential vault (Bitwarden's own mark is a shield)
|
|
8
|
+
keyhole ........... Bitwarden / Vaultwarden
|
|
9
|
+
orca .............. dsh's own whale wordmark
|
|
10
|
+
accent #175DDC .... Bitwarden brand blue
|
|
11
|
+
|
|
12
|
+
The whale is the real dsh mark: the single <path> from the host's frontend
|
|
13
|
+
bundle (viewBox 0 0 23.16 17.04), embedded verbatim rather than redrawn.
|
|
14
|
+
MIT, same as the plugin.
|
|
15
|
+
-->
|
|
16
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" width="96" height="96" role="img" aria-label="dsh-vaultwarden">
|
|
17
|
+
<title>dsh-vaultwarden</title>
|
|
18
|
+
<path d="M48 10 L82 24 V52 C82 71 66 84 48 90 C30 84 14 71 14 52 V24 Z" fill="#FFFFFF" stroke="#1F2328" stroke-width="3.2" stroke-linejoin="round"/>
|
|
19
|
+
<circle cx="48" cy="30" r="6" fill="#1F2328"/>
|
|
20
|
+
<path d="M44 34.8 L52 34.8 L54.6 47 L41.4 47 Z" fill="#1F2328"/>
|
|
21
|
+
<g transform="translate(31,53)"><svg width="34" height="25.02" viewBox="0 0 23.16 17.04" fill="#175DDC" overflow="visible"><path d="M22.9168 1.43018C22.6713 1.31018 22.5658 1.53918 22.4223 1.65519C22.3733 1.69269 22.3318 1.74169 22.2903 1.78669C21.9317 2.1697 21.5127 2.42121 20.9657 2.39121C20.1657 2.34621 19.4827 2.59771 18.8787 3.20973C18.7502 2.45521 18.3236 2.0047 17.6746 1.71569C17.3351 1.56568 16.9916 1.41518 16.7536 1.08867C16.5876 0.856163 16.5421 0.597155 16.4591 0.341647C16.4061 0.187643 16.3536 0.0301382 16.1761 0.00363739C15.9836 -0.0263635 15.9081 0.135141 15.8326 0.270145C15.5306 0.822162 15.4136 1.43018 15.4251 2.0462C15.4516 3.43174 16.0366 4.53527 17.1991 5.3203C17.3311 5.4103 17.3651 5.5003 17.3236 5.63181C17.2441 5.90231 17.1501 6.16482 17.0671 6.43533C17.0141 6.60784 16.9351 6.64584 16.7501 6.57033C16.1121 6.30383 15.5611 5.90931 15.074 5.4328C14.2475 4.63328 13.5 3.75075 12.568 3.05973C12.349 2.89822 12.13 2.74822 11.9034 2.60522C10.9524 1.68169 12.028 0.923165 12.277 0.833162C12.5375 0.739159 12.3675 0.41615 11.5259 0.42015C10.6844 0.42365 9.91439 0.705658 8.93286 1.08117C8.78935 1.13767 8.63835 1.17867 8.48384 1.21267C7.59332 1.04367 6.66829 1.00617 5.70226 1.11517C3.88321 1.31768 2.43016 2.1777 1.36213 3.64575C0.0790928 5.4103 -0.222916 7.41536 0.146595 9.50642C0.535106 11.7105 1.66014 13.535 3.38869 14.9616C5.18125 16.4406 7.24581 17.1657 9.60138 17.0266C11.0319 16.9441 12.6245 16.7526 14.421 15.2321C14.874 15.4576 15.3496 15.5476 16.1381 15.6151C16.7456 15.6716 17.3306 15.5851 17.7836 15.4911C18.4931 15.3411 18.4441 14.6841 18.1876 14.5636C16.1081 13.595 16.5646 13.9891 16.1496 13.67C17.2061 12.42 18.8202 10.1979 19.3182 7.17235C19.3672 6.83834 19.4297 6.36783 19.4222 6.09732C19.4182 5.93231 19.4562 5.86831 19.6447 5.84931C20.1657 5.78931 20.6712 5.64681 21.1357 5.3913C22.4833 4.65528 23.0268 3.44624 23.1548 1.9972C23.1738 1.77569 23.1508 1.54668 22.9168 1.43018ZM11.1749 14.4736C9.15936 12.889 8.18184 12.3675 7.77832 12.39C7.40081 12.4125 7.46881 12.8445 7.55182 13.126C7.63882 13.404 7.75182 13.5955 7.91033 13.8396C8.01983 14.0011 8.09533 14.2411 7.80083 14.4216C7.15181 14.8231 6.02327 14.2866 5.97027 14.2601C4.65673 13.4865 3.5587 12.4655 2.78467 11.069C2.03715 9.72493 1.60314 8.28289 1.53164 6.74384C1.51264 6.37233 1.62214 6.24082 1.99215 6.17332C2.47916 6.08332 2.98118 6.06432 3.46769 6.13582C5.52476 6.43633 7.27581 7.35586 8.74385 8.8129C9.58188 9.64243 10.2159 10.634 10.8689 11.6025C11.5634 12.631 12.3105 13.611 13.262 14.4146C13.598 14.6961 13.866 14.9101 14.1225 15.0681C13.349 15.1546 12.058 15.1731 11.1749 14.4746L11.1749 14.4736ZM12.141 8.25988C12.141 8.09488 12.273 7.96338 12.439 7.96338C12.4765 7.96338 12.5105 7.97088 12.541 7.98188C12.5825 7.99688 12.6205 8.01938 12.6505 8.05338C12.7035 8.10588 12.7335 8.18088 12.7335 8.25988C12.7335 8.42489 12.6015 8.55639 12.4355 8.55639C12.2695 8.55639 12.141 8.42489 12.141 8.25988ZM15.1415 9.79893C14.949 9.87793 14.7565 9.94544 14.5715 9.95294C14.2845 9.96794 13.9715 9.85143 13.8015 9.70893C13.5375 9.48742 13.3485 9.36342 13.2695 8.97691C13.2355 8.8119 13.2545 8.55639 13.2845 8.40989C13.3525 8.09438 13.277 7.89187 13.0545 7.70787C12.8735 7.55786 12.643 7.51636 12.39 7.51636C12.2955 7.51636 12.209 7.47486 12.1445 7.44136C12.039 7.38886 11.9519 7.25735 12.035 7.09585C12.0615 7.04335 12.19 6.91584 12.22 6.89334C12.5635 6.69784 12.9595 6.76184 13.326 6.90834C13.6655 7.04735 13.9225 7.30236 14.292 7.66287C14.6695 8.09838 14.7375 8.21838 14.9525 8.54539C15.1225 8.8009 15.277 9.06341 15.3831 9.36392C15.4471 9.55142 15.3641 9.70493 15.1415 9.79893Z"/></svg></g>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!--
|
|
3
|
+
dsh-vaultwarden — badge
|
|
4
|
+
The primary badge. Tinted shield, ink keyhole, blue orca.
|
|
5
|
+
|
|
6
|
+
Elements
|
|
7
|
+
shield outline ..... a credential vault (Bitwarden's own mark is a shield)
|
|
8
|
+
keyhole ........... Bitwarden / Vaultwarden
|
|
9
|
+
orca .............. dsh's own whale wordmark
|
|
10
|
+
accent #175DDC .... Bitwarden brand blue
|
|
11
|
+
|
|
12
|
+
The whale is the real dsh mark: the single <path> from the host's frontend
|
|
13
|
+
bundle (viewBox 0 0 23.16 17.04), embedded verbatim rather than redrawn.
|
|
14
|
+
MIT, same as the plugin.
|
|
15
|
+
-->
|
|
16
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" width="96" height="96" role="img" aria-label="dsh-vaultwarden">
|
|
17
|
+
<title>dsh-vaultwarden</title>
|
|
18
|
+
<path d="M48 10 L82 24 V52 C82 71 66 84 48 90 C30 84 14 71 14 52 V24 Z" fill="#E7EDFB" stroke="#1F2328" stroke-width="3.2" stroke-linejoin="round"/>
|
|
19
|
+
<circle cx="48" cy="30" r="6" fill="#1F2328"/>
|
|
20
|
+
<path d="M44 34.8 L52 34.8 L54.6 47 L41.4 47 Z" fill="#1F2328"/>
|
|
21
|
+
<g transform="translate(31,53)"><svg width="34" height="25.02" viewBox="0 0 23.16 17.04" fill="#175DDC" overflow="visible"><path d="M22.9168 1.43018C22.6713 1.31018 22.5658 1.53918 22.4223 1.65519C22.3733 1.69269 22.3318 1.74169 22.2903 1.78669C21.9317 2.1697 21.5127 2.42121 20.9657 2.39121C20.1657 2.34621 19.4827 2.59771 18.8787 3.20973C18.7502 2.45521 18.3236 2.0047 17.6746 1.71569C17.3351 1.56568 16.9916 1.41518 16.7536 1.08867C16.5876 0.856163 16.5421 0.597155 16.4591 0.341647C16.4061 0.187643 16.3536 0.0301382 16.1761 0.00363739C15.9836 -0.0263635 15.9081 0.135141 15.8326 0.270145C15.5306 0.822162 15.4136 1.43018 15.4251 2.0462C15.4516 3.43174 16.0366 4.53527 17.1991 5.3203C17.3311 5.4103 17.3651 5.5003 17.3236 5.63181C17.2441 5.90231 17.1501 6.16482 17.0671 6.43533C17.0141 6.60784 16.9351 6.64584 16.7501 6.57033C16.1121 6.30383 15.5611 5.90931 15.074 5.4328C14.2475 4.63328 13.5 3.75075 12.568 3.05973C12.349 2.89822 12.13 2.74822 11.9034 2.60522C10.9524 1.68169 12.028 0.923165 12.277 0.833162C12.5375 0.739159 12.3675 0.41615 11.5259 0.42015C10.6844 0.42365 9.91439 0.705658 8.93286 1.08117C8.78935 1.13767 8.63835 1.17867 8.48384 1.21267C7.59332 1.04367 6.66829 1.00617 5.70226 1.11517C3.88321 1.31768 2.43016 2.1777 1.36213 3.64575C0.0790928 5.4103 -0.222916 7.41536 0.146595 9.50642C0.535106 11.7105 1.66014 13.535 3.38869 14.9616C5.18125 16.4406 7.24581 17.1657 9.60138 17.0266C11.0319 16.9441 12.6245 16.7526 14.421 15.2321C14.874 15.4576 15.3496 15.5476 16.1381 15.6151C16.7456 15.6716 17.3306 15.5851 17.7836 15.4911C18.4931 15.3411 18.4441 14.6841 18.1876 14.5636C16.1081 13.595 16.5646 13.9891 16.1496 13.67C17.2061 12.42 18.8202 10.1979 19.3182 7.17235C19.3672 6.83834 19.4297 6.36783 19.4222 6.09732C19.4182 5.93231 19.4562 5.86831 19.6447 5.84931C20.1657 5.78931 20.6712 5.64681 21.1357 5.3913C22.4833 4.65528 23.0268 3.44624 23.1548 1.9972C23.1738 1.77569 23.1508 1.54668 22.9168 1.43018ZM11.1749 14.4736C9.15936 12.889 8.18184 12.3675 7.77832 12.39C7.40081 12.4125 7.46881 12.8445 7.55182 13.126C7.63882 13.404 7.75182 13.5955 7.91033 13.8396C8.01983 14.0011 8.09533 14.2411 7.80083 14.4216C7.15181 14.8231 6.02327 14.2866 5.97027 14.2601C4.65673 13.4865 3.5587 12.4655 2.78467 11.069C2.03715 9.72493 1.60314 8.28289 1.53164 6.74384C1.51264 6.37233 1.62214 6.24082 1.99215 6.17332C2.47916 6.08332 2.98118 6.06432 3.46769 6.13582C5.52476 6.43633 7.27581 7.35586 8.74385 8.8129C9.58188 9.64243 10.2159 10.634 10.8689 11.6025C11.5634 12.631 12.3105 13.611 13.262 14.4146C13.598 14.6961 13.866 14.9101 14.1225 15.0681C13.349 15.1546 12.058 15.1731 11.1749 14.4746L11.1749 14.4736ZM12.141 8.25988C12.141 8.09488 12.273 7.96338 12.439 7.96338C12.4765 7.96338 12.5105 7.97088 12.541 7.98188C12.5825 7.99688 12.6205 8.01938 12.6505 8.05338C12.7035 8.10588 12.7335 8.18088 12.7335 8.25988C12.7335 8.42489 12.6015 8.55639 12.4355 8.55639C12.2695 8.55639 12.141 8.42489 12.141 8.25988ZM15.1415 9.79893C14.949 9.87793 14.7565 9.94544 14.5715 9.95294C14.2845 9.96794 13.9715 9.85143 13.8015 9.70893C13.5375 9.48742 13.3485 9.36342 13.2695 8.97691C13.2355 8.8119 13.2545 8.55639 13.2845 8.40989C13.3525 8.09438 13.277 7.89187 13.0545 7.70787C12.8735 7.55786 12.643 7.51636 12.39 7.51636C12.2955 7.51636 12.209 7.47486 12.1445 7.44136C12.039 7.38886 11.9519 7.25735 12.035 7.09585C12.0615 7.04335 12.19 6.91584 12.22 6.89334C12.5635 6.69784 12.9595 6.76184 13.326 6.90834C13.6655 7.04735 13.9225 7.30236 14.292 7.66287C14.6695 8.09838 14.7375 8.21838 14.9525 8.54539C15.1225 8.8009 15.277 9.06341 15.3831 9.36392C15.4471 9.55142 15.3641 9.70493 15.1415 9.79893Z"/></svg></g>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!doctype html><html><head><meta charset="utf-8"><style>
|
|
2
|
+
*{box-sizing:border-box} body{margin:0;padding:18px;background:#f6f7f9;font:13px system-ui;color:#1f2328}
|
|
3
|
+
.grid{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-start}
|
|
4
|
+
.cell{background:#fff;border:1px solid #e3e5e8;border-radius:14px;padding:14px;display:flex;flex-direction:column;align-items:center;gap:12px}
|
|
5
|
+
.big img{display:block;width:160px;height:160px}
|
|
6
|
+
.small{display:flex;gap:8px;align-items:flex-end}
|
|
7
|
+
.small img{display:block}
|
|
8
|
+
.n{font-size:11px;color:#666;font-family:ui-monospace,monospace}
|
|
9
|
+
.dark{background:#1F2328;padding:16px;border-radius:14px;display:flex;gap:16px;align-items:center;margin-top:16px}
|
|
10
|
+
</style></head><body>
|
|
11
|
+
<div class="grid">
|
|
12
|
+
<div class="cell"><div class="big"><img src="badge.svg"></div>
|
|
13
|
+
<div class="small">
|
|
14
|
+
<img src="badge.svg" width="64" height="64"><img src="badge.svg" width="48" height="48">
|
|
15
|
+
<img src="badge.svg" width="32" height="32"><img src="badge.svg" width="24" height="24">
|
|
16
|
+
<img src="badge.svg" width="16" height="16">
|
|
17
|
+
</div><div class="n">badge.svg</div></div>
|
|
18
|
+
<div class="cell"><div class="big"><img src="badge-white.svg"></div>
|
|
19
|
+
<div class="small">
|
|
20
|
+
<img src="badge-white.svg" width="64" height="64"><img src="badge-white.svg" width="48" height="48">
|
|
21
|
+
<img src="badge-white.svg" width="32" height="32"><img src="badge-white.svg" width="24" height="24">
|
|
22
|
+
<img src="badge-white.svg" width="16" height="16">
|
|
23
|
+
</div><div class="n">badge-white.svg</div></div>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="dark"><span style="font-size:11px;color:#8A9099">深色底 badge-tile.svg:</span>
|
|
26
|
+
<img src="badge-tile.svg" width="96" height="96">
|
|
27
|
+
<img src="badge-tile.svg" width="48" height="48">
|
|
28
|
+
<img src="badge-tile.svg" width="32" height="32">
|
|
29
|
+
<img src="badge-tile.svg" width="24" height="24">
|
|
30
|
+
<img src="badge-tile.svg" width="16" height="16">
|
|
31
|
+
</div>
|
|
32
|
+
</body></html>
|
package/lib/client.js
CHANGED
|
@@ -396,7 +396,7 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
396
396
|
* `scripts/build.sh` stamps both constants from package.json on every
|
|
397
397
|
* build, so this fallback is never hand-maintained and cannot drift.
|
|
398
398
|
*/
|
|
399
|
-
const BUILD_VERSION = '0.9.
|
|
399
|
+
const BUILD_VERSION = '0.9.3'
|
|
400
400
|
const BUILD_REPOSITORY = 'https://github.com/BuvkB/dsh-vaultwarden'
|
|
401
401
|
/**
|
|
402
402
|
* Turn a package.json repository url into something a browser can open.
|
|
@@ -415,7 +415,7 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
415
415
|
|
|
416
416
|
// ── dictionaries (zh first; en mirrors the same keys) ─────────────────────
|
|
417
417
|
const DICT_ZH = {
|
|
418
|
-
panelTitle: '
|
|
418
|
+
panelTitle: '凭据库',
|
|
419
419
|
// The heading is now three parts: a 凭据库 badge (its own key, shared with
|
|
420
420
|
// the settings nav), the package name, then the version and repo link in
|
|
421
421
|
// small type.
|
|
@@ -720,7 +720,7 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
720
720
|
sessionEventTwoFactor: '后台重新登录需要两步验证',
|
|
721
721
|
}
|
|
722
722
|
const DICT_EN = {
|
|
723
|
-
panelTitle: '
|
|
723
|
+
panelTitle: 'Credentials',
|
|
724
724
|
packageLabel: 'dsh-vaultwarden',
|
|
725
725
|
versionLabel: 'v{version}',
|
|
726
726
|
repoLabel: 'GitHub',
|
|
@@ -1242,8 +1242,21 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
1242
1242
|
* piece and the metadata follows it — rather than a package name stranded
|
|
1243
1243
|
* on line one above a version on line two.
|
|
1244
1244
|
*/
|
|
1245
|
-
|
|
1246
|
-
|
|
1245
|
+
// `baseline`: this group is pure text now (the mark lives on the settings
|
|
1246
|
+
// rail), and two sizes on one line have to sit on a shared baseline. With
|
|
1247
|
+
// `center` the 17px heading centred against the 12.5px metadata's line box
|
|
1248
|
+
// and hung a pixel low — visible as the heading looking dropped against
|
|
1249
|
+
// its own metadata.
|
|
1250
|
+
titleHead: { display: 'inline-flex', alignItems: 'baseline', gap: 4, minWidth: 0, whiteSpace: 'nowrap' },
|
|
1251
|
+
// 17px, not 16: the heading is the one line a reader lands on when the
|
|
1252
|
+
// panel opens, and at 16 it sat only half a step above the 13.5px list
|
|
1253
|
+
// rows beside it. 17 with a 0.1 tracking keeps it a heading without
|
|
1254
|
+
// turning it into a banner.
|
|
1255
|
+
// 19px, and lifted 2px off the shared baseline: a 19px CJK glyph puts its
|
|
1256
|
+
// ink about 2px lower than the 12.5px Latin x-height beside it even when
|
|
1257
|
+
// both sit on the same baseline, which reads as the heading being dropped.
|
|
1258
|
+
// The lift is optical, not structural — measured against the live DOM.
|
|
1259
|
+
titleText: { fontSize: 19, fontWeight: 600, letterSpacing: 0.1, color: TOKEN.text, position: 'relative', top: -2 },
|
|
1247
1260
|
/**
|
|
1248
1261
|
* The package name: secondary grey, regular weight.
|
|
1249
1262
|
*
|
|
@@ -1260,11 +1273,18 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
1260
1273
|
* whole; without it the version could end a line and the link start the
|
|
1261
1274
|
* next, which reads as two unrelated notes rather than one.
|
|
1262
1275
|
*/
|
|
1263
|
-
|
|
1276
|
+
// `baseline`, not `center`: the group mixes 12.5px (the package) with
|
|
1277
|
+
// 11.5px (version, link) and 2px dots. Centring each item in the line box
|
|
1278
|
+
// puts their optical centres together but leaves their baselines apart, so
|
|
1279
|
+
// the row reads as slightly staggered letters. A shared baseline is what
|
|
1280
|
+
// makes mixed sizes look set rather than assembled.
|
|
1281
|
+
titleMeta: { display: 'inline-flex', alignItems: 'baseline', gap: 5, minWidth: 0, whiteSpace: 'nowrap' },
|
|
1264
1282
|
/** The build number: monospace digits so a version never shifts the row. */
|
|
1265
1283
|
titleVersion: { fontSize: 11.5, color: TOKEN.text2, fontVariantNumeric: 'tabular-nums', letterSpacing: 0.05 },
|
|
1266
1284
|
/** The separator between version and link — the host's own 2px caption dot. */
|
|
1267
|
-
|
|
1285
|
+
// A dot has no baseline of its own, so it is nudged up to the optical
|
|
1286
|
+
// middle of the text beside it when the row is baseline-aligned.
|
|
1287
|
+
titleDot: { width: 2, height: 2, borderRadius: 1, background: TOKEN.text2, opacity: 0.55, flex: 'none', alignSelf: 'center' },
|
|
1268
1288
|
/**
|
|
1269
1289
|
* The repo link. Underlined only on hover: an always-underlined link next
|
|
1270
1290
|
* to the heading reads as a mis-styled title.
|
|
@@ -1277,9 +1297,12 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
1277
1297
|
*/
|
|
1278
1298
|
titleLink: {
|
|
1279
1299
|
display: 'inline-flex',
|
|
1280
|
-
|
|
1300
|
+
// `baseline`, not `center`: the label is text and has to sit on the
|
|
1301
|
+
// row's baseline like the package name and the version beside it. The
|
|
1302
|
+
// mark inside is nudged back to the text's optical centre below.
|
|
1303
|
+
alignItems: 'baseline',
|
|
1281
1304
|
gap: 4,
|
|
1282
|
-
fontSize:
|
|
1305
|
+
fontSize: 12.5,
|
|
1283
1306
|
color: TOKEN.text2,
|
|
1284
1307
|
textDecoration: 'none',
|
|
1285
1308
|
cursor: 'pointer',
|
|
@@ -1686,7 +1709,13 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
1686
1709
|
* The pulse is in the stylesheet, so a reader who asked for reduced motion
|
|
1687
1710
|
* gets a static bar rather than a blinking one.
|
|
1688
1711
|
*/
|
|
1689
|
-
|
|
1712
|
+
// The host's border colour, not `bg2`. `bg2` is a layer tint (#f5f5f5 on
|
|
1713
|
+
// a white surface), and a bar painted in it is invisible on the panel's
|
|
1714
|
+
// own background: the rail then reads as an empty box rather than as
|
|
1715
|
+
// "still loading". The border token is by definition visible against the
|
|
1716
|
+
// surface it borders, in both themes, and no browser-support question
|
|
1717
|
+
// attaches to it the way it would to a colour mix.
|
|
1718
|
+
skeletonBar: { height: 10, borderRadius: 999, background: TOKEN.border, flex: 'none' },
|
|
1690
1719
|
/** A skeleton line: bar + optional label column, one per field row. */
|
|
1691
1720
|
skeletonField: { display: 'grid', gridTemplateColumns: '92px minmax(0, 1fr) 28px', gap: 12, alignItems: 'center' },
|
|
1692
1721
|
/** The list's own placeholder row: avatar tile + two bars + the chevron slot. */
|
|
@@ -1929,7 +1958,9 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
1929
1958
|
every other row's text sits — no measured offsets, no negative margins
|
|
1930
1959
|
that could push the label out of its cell on a tight layout. */
|
|
1931
1960
|
.vw-nav-label { display: inline-flex; align-items: center; gap: 8px; min-width: 0 }
|
|
1932
|
-
|
|
1961
|
+
/* 18px, matching the component's own default: the badge is a two-shape mark and
|
|
1962
|
+
its plate needs the extra 2px to stay separate from the shield at this size. */
|
|
1963
|
+
.vw-nav-glyph { flex: none; width: 18px; height: 18px; color: inherit }
|
|
1933
1964
|
.vw-nav-text { white-space: nowrap }
|
|
1934
1965
|
/* The sidebar's own hover: its rows carry no border, so the shared button
|
|
1935
1966
|
hover (which only moves a border colour) would say nothing there. */
|
|
@@ -2112,10 +2143,12 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
2112
2143
|
.vw-root [data-vw-detail] { padding: 16px !important }
|
|
2113
2144
|
.vw-root [data-row] { padding: 10px 12px !important; gap: 10px !important }
|
|
2114
2145
|
/* The settings nav becomes a tight tab strip here (dsh-web-mobile packs
|
|
2115
|
-
its cells at padding 6px 8px, gap 6px, 14px icons)
|
|
2116
|
-
|
|
2146
|
+
its cells at padding 6px 8px, gap 6px, 14px icons). The glyph follows the
|
|
2147
|
+
strip's rhythm but stays at 17px rather than the 14px host icons: the
|
|
2148
|
+
shield's keyhole closes up below that, and this row is the one place the
|
|
2149
|
+
mark is the only thing identifying the section. */
|
|
2117
2150
|
.vw-nav-label { gap: 6px }
|
|
2118
|
-
.vw-nav-glyph { width:
|
|
2151
|
+
.vw-nav-glyph { width: 17px; height: 17px }
|
|
2119
2152
|
}
|
|
2120
2153
|
`
|
|
2121
2154
|
document.head.appendChild(style)
|
|
@@ -2128,37 +2161,45 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
2128
2161
|
* `currentColor` at the sizes the host chrome uses, so it follows the
|
|
2129
2162
|
* label colour instead of being painted blue everywhere.
|
|
2130
2163
|
*/
|
|
2131
|
-
const VaultGlyph = ({ className, size =
|
|
2164
|
+
const VaultGlyph = ({ className, size = 18 }) =>
|
|
2132
2165
|
h(
|
|
2133
2166
|
'svg',
|
|
2134
2167
|
{
|
|
2135
2168
|
className,
|
|
2136
2169
|
width: size,
|
|
2137
2170
|
height: size,
|
|
2138
|
-
//
|
|
2139
|
-
//
|
|
2140
|
-
//
|
|
2141
|
-
//
|
|
2142
|
-
//
|
|
2143
|
-
//
|
|
2144
|
-
//
|
|
2171
|
+
// The plugin's badge: a shield outline with a solid keyhole.
|
|
2172
|
+
//
|
|
2173
|
+
// Two marks, one axis. Earlier passes added the dsh prompt to this —
|
|
2174
|
+
// first on a filled plate, then as a bare `>_` — and every version
|
|
2175
|
+
// failed the same way: three shapes in a 16-unit box have no room to
|
|
2176
|
+
// agree on a centre, so the mark read as scattered rather than
|
|
2177
|
+
// composed. The prompt is gone; what is left is the two things that
|
|
2178
|
+
// any password manager's own icon carries, both centred on x=8 and
|
|
2179
|
+
// both sized to leave the same air on every side.
|
|
2180
|
+
//
|
|
2181
|
+
// Monochrome through `currentColor`, so it follows the rail's ink and
|
|
2182
|
+
// flips with the theme.
|
|
2145
2183
|
viewBox: '0 0 16 16',
|
|
2146
2184
|
fill: 'none',
|
|
2147
|
-
stroke: 'currentColor',
|
|
2148
|
-
strokeWidth: 1,
|
|
2149
2185
|
'aria-hidden': 'true',
|
|
2150
2186
|
focusable: 'false',
|
|
2151
2187
|
},
|
|
2152
|
-
//
|
|
2153
|
-
//
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2188
|
+
// The shield: outline only, 1.3 stroke. Symmetric about x=8, and its
|
|
2189
|
+
// outer box is inset 1 unit on every side so the stroke never clips.
|
|
2190
|
+
h('path', {
|
|
2191
|
+
d: 'M8 0.5 L13.2 2.85 V7.15 C13.2 10.6 11.1 13 8 14.3 C4.9 13 2.8 10.6 2.8 7.15 V2.85 Z',
|
|
2192
|
+
fill: 'none',
|
|
2193
|
+
stroke: 'currentColor',
|
|
2194
|
+
strokeWidth: 1.3,
|
|
2195
|
+
strokeLinejoin: 'round',
|
|
2196
|
+
}),
|
|
2197
|
+
// The keyhole: a round bow over a tapered shaft, centred on the same
|
|
2198
|
+
// axis as the shield. Proportions are the ones a physical keyhole
|
|
2199
|
+
// actually has — the bow is about half the shaft's height and the taper
|
|
2200
|
+
// runs 1:2 — which is what keeps it from reading as a lollipop.
|
|
2201
|
+
h('circle', { cx: 8, cy: 5.4, r: 1.4, fill: 'currentColor' }),
|
|
2202
|
+
h('path', { d: 'M7.33 6.17 H8.67 L9.6 8.9 H6.4 Z', fill: 'currentColor' }),
|
|
2162
2203
|
)
|
|
2163
2204
|
|
|
2164
2205
|
/**
|
|
@@ -2697,6 +2738,34 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
2697
2738
|
return /load failed|failed to fetch|networkerror|network error|fetch failed/i.test(text)
|
|
2698
2739
|
}
|
|
2699
2740
|
|
|
2741
|
+
/**
|
|
2742
|
+
* Put a ceiling on one read.
|
|
2743
|
+
*
|
|
2744
|
+
* A promise that never settles is worse than one that rejects: `await`
|
|
2745
|
+
* simply waits, so a request the host never answers — a request dropped by a
|
|
2746
|
+
* captive portal, a socket the phone's radio parked until the tab wakes —
|
|
2747
|
+
* leaves the sidebar shimmering with no rows and no error, which is the
|
|
2748
|
+
* one failure mode the reader cannot act on. The timeout turns that into an
|
|
2749
|
+
* ordinary rejection so the caller's existing fallback runs.
|
|
2750
|
+
*
|
|
2751
|
+
* Silent by construction: the timeout rejects with the same shape a failed
|
|
2752
|
+
* call would (no host code), so callers cannot tell a slow host from a
|
|
2753
|
+
* dropped one, and neither can the reader — who is told the counts are
|
|
2754
|
+
* unknown, not which of a dozen network faults produced that.
|
|
2755
|
+
*/
|
|
2756
|
+
const withTimeout = (promise, ms, label) =>
|
|
2757
|
+
new Promise((resolve, reject) => {
|
|
2758
|
+
const timer = setTimeout(() => {
|
|
2759
|
+
const error = new Error(`${label} 超时`)
|
|
2760
|
+
error.code = 'timeout'
|
|
2761
|
+
reject(error)
|
|
2762
|
+
}, ms)
|
|
2763
|
+
promise.then(
|
|
2764
|
+
(value) => { clearTimeout(timer); resolve(value) },
|
|
2765
|
+
(failure) => { clearTimeout(timer); reject(failure) },
|
|
2766
|
+
)
|
|
2767
|
+
})
|
|
2768
|
+
|
|
2700
2769
|
/** Build the RPC caller over the authenticated `/api` channel. */
|
|
2701
2770
|
const makeInvoke = (connection) => async (method, args = {}) => {
|
|
2702
2771
|
if (!connection || typeof connection.rpc?.call !== 'function') {
|
|
@@ -2746,6 +2815,30 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
2746
2815
|
* meantime, which is a worse bug than the one this fixes.
|
|
2747
2816
|
*/
|
|
2748
2817
|
const CLIPBOARD_TTL_MS = 20000
|
|
2818
|
+
/**
|
|
2819
|
+
* Ceiling on the sidebar's overview read, in milliseconds.
|
|
2820
|
+
*
|
|
2821
|
+
* A read that never settles is worse than one that rejects: `await` simply
|
|
2822
|
+
* waits, so a request the host never answers — dropped by a captive portal,
|
|
2823
|
+
* or a socket the phone's radio parked until the tab wakes — would leave the
|
|
2824
|
+
* sidebar shimmering with no rows and no error, which is the one failure
|
|
2825
|
+
* mode the reader cannot act on. The timeout turns that into an ordinary
|
|
2826
|
+
* rejection so the caller's existing fallback runs.
|
|
2827
|
+
*
|
|
2828
|
+
* Long enough that a merely slow network still gets its counts, short enough
|
|
2829
|
+
* that the rail settles into its structural places when the answer is simply
|
|
2830
|
+
* not coming: the sidebar is furniture, and a count that never arrives must
|
|
2831
|
+
* not hold the shape of the panel hostage.
|
|
2832
|
+
*/
|
|
2833
|
+
const OVERVIEW_TIMEOUT_MS = 6000
|
|
2834
|
+
/**
|
|
2835
|
+
* The same ceiling for the other read that describes a place rather than a
|
|
2836
|
+
* row. Shorter than the overview's, because nothing waits on it: the folder
|
|
2837
|
+
* list only feeds the move-to-folder step, so a slow answer is better
|
|
2838
|
+
* dropped than kept open — but it still must not stay open forever, which
|
|
2839
|
+
* is exactly how the sidebar used to get stuck.
|
|
2840
|
+
*/
|
|
2841
|
+
const READ_TIMEOUT_MS = 5000
|
|
2749
2842
|
/**
|
|
2750
2843
|
* Write `text` to the clipboard and schedule its removal.
|
|
2751
2844
|
*
|
|
@@ -5040,15 +5133,52 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
5040
5133
|
// either method, or a read that fails, leaves the sidebar on the one
|
|
5041
5134
|
// place that needs no counts at all.
|
|
5042
5135
|
await readVault(nextQuery, { quiet: Boolean(paintedSection ?? painted), identity, section: view })
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
|
|
5050
|
-
|
|
5051
|
-
|
|
5136
|
+
// These two reads are settled INDEPENDENTLY, not awaited together.
|
|
5137
|
+
//
|
|
5138
|
+
// They used to sit in one Promise.all, which made the slower read the
|
|
5139
|
+
// gate for the faster one: the rail is drawn from `overview`, and
|
|
5140
|
+
// `folders` only feeds the move-to-folder step, but a folders call
|
|
5141
|
+
// that never settled held the already-arrived overview hostage. The
|
|
5142
|
+
// panel then showed its rows (readVault had finished) under a rail
|
|
5143
|
+
// stuck on its ghost block, forever — the list said 428 entries and
|
|
5144
|
+
// the sidebar still said "loading". That is the reported bug, and no
|
|
5145
|
+
// amount of retrying or timing out the overview can fix it, because
|
|
5146
|
+
// the overview had already succeeded.
|
|
5147
|
+
//
|
|
5148
|
+
// So each read gets its own ceiling and its own landing. Whatever
|
|
5149
|
+
// arrives is applied at once; whatever does not is dropped on the
|
|
5150
|
+
// floor by its own timer. Nothing here waits for anything else.
|
|
5151
|
+
const foldersRead = withTimeout(invoke('folders'), READ_TIMEOUT_MS, 'folders')
|
|
5152
|
+
.then((payload) => setFolders(Array.isArray(payload?.folders) ? payload.folders : []))
|
|
5153
|
+
.catch(() => { /* an older host, or a read that failed: keep the folders on screen */ })
|
|
5154
|
+
// Retry once: a single transient failure on a slow network used to
|
|
5155
|
+
// leave the rail shimmering with no rows and no way to get them — the
|
|
5156
|
+
// panel looked broken rather than busy. One quiet retry covers the
|
|
5157
|
+
// dropped first attempt without doubling the cost of a host that
|
|
5158
|
+
// genuinely lacks the method.
|
|
5159
|
+
//
|
|
5160
|
+
// ONE ceiling over the chain, not one per attempt: bounding each try
|
|
5161
|
+
// separately makes the worst case the sum of them (two six-second
|
|
5162
|
+
// waits), and the sum is exactly the case this exists for — a request
|
|
5163
|
+
// that never answers, where the retry cannot help because the first
|
|
5164
|
+
// one is still open. A single timer covers both attempts and the gap
|
|
5165
|
+
// between them.
|
|
5166
|
+
const overviewRead = withTimeout(invoke('overview').catch(() => invoke('overview')), OVERVIEW_TIMEOUT_MS, 'overview')
|
|
5167
|
+
.then((payload) => {
|
|
5168
|
+
openCache.overview = { key: identity, overview: payload, at: Date.now() }
|
|
5169
|
+
setOverview(payload)
|
|
5170
|
+
})
|
|
5171
|
+
.catch(() => {
|
|
5172
|
+
// Nothing arrived: stop pretending the rail is loading. An empty
|
|
5173
|
+
// overview renders the three structural places and lets the nav
|
|
5174
|
+
// fall out of its busy state, which is honest — the counts are
|
|
5175
|
+
// unknown, but the rail is not stuck. A rail that kept claiming
|
|
5176
|
+
// to be busy while the list underneath was already full is the
|
|
5177
|
+
// shape of a hung panel, which is the one thing this file spends
|
|
5178
|
+
// its length trying to avoid.
|
|
5179
|
+
setOverview({ failed: true, sections: [], types: [], folderList: [], folderCount: 0, unfiled: 0 })
|
|
5180
|
+
})
|
|
5181
|
+
await Promise.all([foldersRead, overviewRead])
|
|
5052
5182
|
},
|
|
5053
5183
|
[invoke, readVault],
|
|
5054
5184
|
)
|
|
@@ -6074,6 +6204,14 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
6074
6204
|
navPlaceholders(t),
|
|
6075
6205
|
)
|
|
6076
6206
|
}
|
|
6207
|
+
// The read failed and no retry is coming: the rail keeps its three
|
|
6208
|
+
// structural places and stops claiming to be busy. Ghosts here would be
|
|
6209
|
+
// a placeholder for something that is never going to arrive, which is
|
|
6210
|
+
// the shape of a hung panel — the one thing this file spends its length
|
|
6211
|
+
// trying to avoid.
|
|
6212
|
+
if (overview.failed) {
|
|
6213
|
+
return h('nav', { 'data-vw-nav': '', style: S.nav, 'aria-label': t('navSections') }, places)
|
|
6214
|
+
}
|
|
6077
6215
|
const types = overview.types ?? []
|
|
6078
6216
|
if (types.length) {
|
|
6079
6217
|
places.push(h('div', { key: 'g-types', 'data-vw-nav-group': 'types', style: S.navGroup }, `${t('sectionTypes')} (${types.length})`))
|
|
@@ -6110,7 +6248,7 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
6110
6248
|
const refreshOverview = async () => {
|
|
6111
6249
|
const identity = cacheKey(openCache.config?.config)
|
|
6112
6250
|
try {
|
|
6113
|
-
const payload = await invoke('overview')
|
|
6251
|
+
const payload = await withTimeout(invoke('overview'), OVERVIEW_TIMEOUT_MS, 'overview')
|
|
6114
6252
|
openCache.overview = { key: identity, overview: payload, at: Date.now() }
|
|
6115
6253
|
setOverview(payload)
|
|
6116
6254
|
} catch {
|
|
@@ -7130,11 +7268,11 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
7130
7268
|
h(
|
|
7131
7269
|
'div',
|
|
7132
7270
|
{ style: S.titleRow },
|
|
7133
|
-
// No mark
|
|
7134
|
-
// it had to be sized against the name beside it, and at
|
|
7135
|
-
// pushed the metadata onto a second row at phone width.
|
|
7136
|
-
//
|
|
7137
|
-
//
|
|
7271
|
+
// No mark in the heading. The shield was tried here and cost more
|
|
7272
|
+
// than it gave: it had to be sized against the name beside it, and at
|
|
7273
|
+
// any size it pushed the metadata onto a second row at phone width.
|
|
7274
|
+
// The settings rail already carries the badge for this section, so
|
|
7275
|
+
// repeating it one line below read as an icon beside an icon.
|
|
7138
7276
|
//
|
|
7139
7277
|
// Two groups, not four loose items. The heading is one unit and the
|
|
7140
7278
|
// metadata is another, so a narrow panel moves the WHOLE metadata
|
|
@@ -7143,7 +7281,15 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
7143
7281
|
// through, which read as an unfinished line. Within a group nothing
|
|
7144
7282
|
// wraps; `nowrap` on each is what makes that a guarantee rather than
|
|
7145
7283
|
// a hope about the text's width.
|
|
7146
|
-
h(
|
|
7284
|
+
h(
|
|
7285
|
+
'span',
|
|
7286
|
+
{ style: S.titleHead },
|
|
7287
|
+
// Heading only. The badge was here for a while and the row read as
|
|
7288
|
+
// "icon, gap, icon" beside the settings rail's own shield on the
|
|
7289
|
+
// same screen; the rail already identifies the section, so the
|
|
7290
|
+
// heading does not repeat it.
|
|
7291
|
+
h('span', { style: S.titleText }, t('panelTitle')),
|
|
7292
|
+
),
|
|
7147
7293
|
// `plugin` (the host's own manifest read) wins when it is there;
|
|
7148
7294
|
// otherwise the build stamp answers, so the line is never empty — not
|
|
7149
7295
|
// on an older host, and not on a bundle served before a restart
|
|
@@ -7172,7 +7318,7 @@ const nextOffsetOf = (payload, fallback) => {
|
|
|
7172
7318
|
title: t('repoTitle'),
|
|
7173
7319
|
style: S.titleLink,
|
|
7174
7320
|
},
|
|
7175
|
-
navGlyph('github',
|
|
7321
|
+
h('span', { style: { display: 'inline-flex', alignSelf: 'center' } }, navGlyph('github', 13)),
|
|
7176
7322
|
t('repoLabel'),
|
|
7177
7323
|
),
|
|
7178
7324
|
),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-vaultwarden",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "Vaultwarden/Bitwarden real-time sync for DeepSeek Harness: WebSocket push notifications, on-disk vault cache with revision probing, read/write tools and an entry browser panel. Independent implementation; see THIRD-PARTY-NOTICES.md.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|