dsh-vaultwarden 0.9.1 → 0.9.2

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 CHANGED
@@ -4,6 +4,19 @@ 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.2] — 2026-10-21
8
+
9
+ ### 变更
10
+
11
+ - 面板标题改为纯文字「凭据库」,去掉标题前的徽章;按钮改用不带动画的文字标签。
12
+ - 标题字号由 17px 提升到 19px。
13
+ - 侧栏与设置导航的分区徽章改为盾牌加锁孔,纯黑白,跟随主题明暗。
14
+
15
+ ### 修复
16
+
17
+ - 修复标题与后面的版本号、GitHub 链接文字高度不齐的问题。
18
+ - 修复 GitHub 链接内图标与文字未对齐的问题。
19
+
7
20
  ## [0.9.1] — 2026-10-21
8
21
 
9
22
  ### 修复
@@ -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.1'
399
+ const BUILD_VERSION = '0.9.2'
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: 'Vaultwarden 凭据库',
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: 'Vaultwarden credentials',
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
- titleHead: { display: 'inline-flex', alignItems: 'baseline', gap: 7, minWidth: 0, whiteSpace: 'nowrap' },
1246
- titleText: { fontSize: 16, fontWeight: 600, letterSpacing: 0.1, color: TOKEN.text },
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
- titleMeta: { display: 'inline-flex', alignItems: 'center', gap: 5, minWidth: 0, whiteSpace: 'nowrap' },
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
- titleDot: { width: 2, height: 2, borderRadius: 1, background: TOKEN.text2, opacity: 0.55, flex: 'none' },
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
- alignItems: 'center',
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: 11.5,
1305
+ fontSize: 12.5,
1283
1306
  color: TOKEN.text2,
1284
1307
  textDecoration: 'none',
1285
1308
  cursor: 'pointer',
@@ -1929,7 +1952,9 @@ const nextOffsetOf = (payload, fallback) => {
1929
1952
  every other row's text sits — no measured offsets, no negative margins
1930
1953
  that could push the label out of its cell on a tight layout. */
1931
1954
  .vw-nav-label { display: inline-flex; align-items: center; gap: 8px; min-width: 0 }
1932
- .vw-nav-glyph { flex: none; width: 16px; height: 16px; color: inherit }
1955
+ /* 18px, matching the component's own default: the badge is a two-shape mark and
1956
+ its plate needs the extra 2px to stay separate from the shield at this size. */
1957
+ .vw-nav-glyph { flex: none; width: 18px; height: 18px; color: inherit }
1933
1958
  .vw-nav-text { white-space: nowrap }
1934
1959
  /* The sidebar's own hover: its rows carry no border, so the shared button
1935
1960
  hover (which only moves a border colour) would say nothing there. */
@@ -2112,10 +2137,12 @@ const nextOffsetOf = (payload, fallback) => {
2112
2137
  .vw-root [data-vw-detail] { padding: 16px !important }
2113
2138
  .vw-root [data-row] { padding: 10px 12px !important; gap: 10px !important }
2114
2139
  /* The settings nav becomes a tight tab strip here (dsh-web-mobile packs
2115
- its cells at padding 6px 8px, gap 6px, 14px icons); the glyph follows
2116
- the host's metrics so the row keeps its rhythm. */
2140
+ its cells at padding 6px 8px, gap 6px, 14px icons). The glyph follows the
2141
+ strip's rhythm but stays at 17px rather than the 14px host icons: the
2142
+ shield's keyhole closes up below that, and this row is the one place the
2143
+ mark is the only thing identifying the section. */
2117
2144
  .vw-nav-label { gap: 6px }
2118
- .vw-nav-glyph { width: 14px; height: 14px }
2145
+ .vw-nav-glyph { width: 17px; height: 17px }
2119
2146
  }
2120
2147
  `
2121
2148
  document.head.appendChild(style)
@@ -2128,37 +2155,45 @@ const nextOffsetOf = (payload, fallback) => {
2128
2155
  * `currentColor` at the sizes the host chrome uses, so it follows the
2129
2156
  * label colour instead of being painted blue everywhere.
2130
2157
  */
2131
- const VaultGlyph = ({ className, size = 16 }) =>
2158
+ const VaultGlyph = ({ className, size = 18 }) =>
2132
2159
  h(
2133
2160
  'svg',
2134
2161
  {
2135
2162
  className,
2136
2163
  width: size,
2137
2164
  height: size,
2138
- // Same 24-unit grid and 1.7 stroke as NAV_ICON_SHAPES: this glyph
2139
- // sits in the settings rail right beside host rows, so it has to
2140
- // draw at the same optical weight as the family it belongs to.
2141
- // The host's icon language, same as NAV_ICON_SHAPES: 16 grid, 1px
2142
- // stroke, default joins, and a 0.16 fill where the mark needs a
2143
- // body. This glyph sits in the settings rail beside host rows, so it
2144
- // has to draw at the host's own weight.
2165
+ // The plugin's badge: a shield outline with a solid keyhole.
2166
+ //
2167
+ // Two marks, one axis. Earlier passes added the dsh prompt to this —
2168
+ // first on a filled plate, then as a bare `>_` — and every version
2169
+ // failed the same way: three shapes in a 16-unit box have no room to
2170
+ // agree on a centre, so the mark read as scattered rather than
2171
+ // composed. The prompt is gone; what is left is the two things that
2172
+ // any password manager's own icon carries, both centred on x=8 and
2173
+ // both sized to leave the same air on every side.
2174
+ //
2175
+ // Monochrome through `currentColor`, so it follows the rail's ink and
2176
+ // flips with the theme.
2145
2177
  viewBox: '0 0 16 16',
2146
2178
  fill: 'none',
2147
- stroke: 'currentColor',
2148
- strokeWidth: 1,
2149
2179
  'aria-hidden': 'true',
2150
2180
  focusable: 'false',
2151
2181
  },
2152
- // A shield has to be TALLER than wide, or it reads as a stubby badge:
2153
- // the previous outline spanned 13 × 13.65 — close enough to a square
2154
- // that the silhouette lost the shape's one defining proportion. This
2155
- // one is 11 wide × 13.8 tall (≈1:1.25, the ratio a heraldic shield
2156
- // actually uses) and reaches the top of the box, so it sits level with
2157
- // the 16px text beside it at 18px.
2158
- h('path', { d: 'M8 1.1L13.5 3.6V7.55C13.5 11.2 11.2 13.75 8 14.9C4.8 13.75 2.5 11.2 2.5 7.55V3.6L8 1.1Z', fill: 'currentColor', fillOpacity: 0.16 }),
2159
- // The keyhole is scaled to the narrower body: a 1.55 radius bow over a
2160
- // 1.3-wide shaft, centred on the same x=8 as the outline.
2161
- h('path', { d: 'M8 5.05C8.86 5.05 9.55 5.74 9.55 6.6C9.55 7.25 9.18 7.81 8.65 8.08V10.1H7.35V8.08C6.82 7.81 6.45 7.25 6.45 6.6C6.45 5.74 7.14 5.05 8 5.05Z', fill: 'currentColor', stroke: 'none' }),
2182
+ // The shield: outline only, 1.3 stroke. Symmetric about x=8, and its
2183
+ // outer box is inset 1 unit on every side so the stroke never clips.
2184
+ h('path', {
2185
+ 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',
2186
+ fill: 'none',
2187
+ stroke: 'currentColor',
2188
+ strokeWidth: 1.3,
2189
+ strokeLinejoin: 'round',
2190
+ }),
2191
+ // The keyhole: a round bow over a tapered shaft, centred on the same
2192
+ // axis as the shield. Proportions are the ones a physical keyhole
2193
+ // actually has — the bow is about half the shaft's height and the taper
2194
+ // runs 1:2 — which is what keeps it from reading as a lollipop.
2195
+ h('circle', { cx: 8, cy: 5.4, r: 1.4, fill: 'currentColor' }),
2196
+ h('path', { d: 'M7.33 6.17 H8.67 L9.6 8.9 H6.4 Z', fill: 'currentColor' }),
2162
2197
  )
2163
2198
 
2164
2199
  /**
@@ -7130,11 +7165,11 @@ const nextOffsetOf = (payload, fallback) => {
7130
7165
  h(
7131
7166
  'div',
7132
7167
  { style: S.titleRow },
7133
- // No mark: the row is text, and the shield cost more than it gave —
7134
- // it had to be sized against the name beside it, and at any size it
7135
- // pushed the metadata onto a second row at phone width. The settings
7136
- // nav already carries the shield for this section, so the panel does
7137
- // not need to repeat it.
7168
+ // No mark in the heading. The shield was tried here and cost more
7169
+ // than it gave: it had to be sized against the name beside it, and at
7170
+ // any size it pushed the metadata onto a second row at phone width.
7171
+ // The settings rail already carries the badge for this section, so
7172
+ // repeating it one line below read as an icon beside an icon.
7138
7173
  //
7139
7174
  // Two groups, not four loose items. The heading is one unit and the
7140
7175
  // metadata is another, so a narrow panel moves the WHOLE metadata
@@ -7143,7 +7178,15 @@ const nextOffsetOf = (payload, fallback) => {
7143
7178
  // through, which read as an unfinished line. Within a group nothing
7144
7179
  // wraps; `nowrap` on each is what makes that a guarantee rather than
7145
7180
  // a hope about the text's width.
7146
- h('span', { style: S.titleHead }, h('span', { style: S.titleText }, t('panelTitle'))),
7181
+ h(
7182
+ 'span',
7183
+ { style: S.titleHead },
7184
+ // Heading only. The badge was here for a while and the row read as
7185
+ // "icon, gap, icon" beside the settings rail's own shield on the
7186
+ // same screen; the rail already identifies the section, so the
7187
+ // heading does not repeat it.
7188
+ h('span', { style: S.titleText }, t('panelTitle')),
7189
+ ),
7147
7190
  // `plugin` (the host's own manifest read) wins when it is there;
7148
7191
  // otherwise the build stamp answers, so the line is never empty — not
7149
7192
  // on an older host, and not on a bundle served before a restart
@@ -7172,7 +7215,7 @@ const nextOffsetOf = (payload, fallback) => {
7172
7215
  title: t('repoTitle'),
7173
7216
  style: S.titleLink,
7174
7217
  },
7175
- navGlyph('github', 12),
7218
+ h('span', { style: { display: 'inline-flex', alignSelf: 'center' } }, navGlyph('github', 13)),
7176
7219
  t('repoLabel'),
7177
7220
  ),
7178
7221
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-vaultwarden",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
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",