dsh-life-pack 0.3.13 → 0.3.14

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/dist/client.js CHANGED
@@ -100,7 +100,7 @@ window.__ModuleLoader__.load({
100
100
  const PANEL_LINKS = [{
101
101
  key: "star",
102
102
  glyph: "⭐",
103
- tip: "去 GitHub 点 Star",
103
+ tip: "你的🌟是我夜空中最亮的星。",
104
104
  url: "https://github.com/FeatherHunter/ilife"
105
105
  }, {
106
106
  key: "feedback",
@@ -668,7 +668,7 @@ window.__ModuleLoader__.load({
668
668
  marginBottom: 10
669
669
  },
670
670
  tab: {
671
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.35))",
671
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.35))",
672
672
  background: "transparent",
673
673
  color: "var(--dsw-alias-label-primary, inherit)",
674
674
  borderRadius: 999,
@@ -679,13 +679,13 @@ window.__ModuleLoader__.load({
679
679
  tabActive: {
680
680
  background: "var(--dsw-alias-brand-primary, #0a84ff)",
681
681
  borderColor: "transparent",
682
- color: "#fff",
682
+ color: "var(--dsw-alias-label-primary-foreground, #0f1115)",
683
683
  fontWeight: 700
684
684
  },
685
685
  reco: {
686
686
  padding: "12px 14px",
687
687
  borderRadius: 10,
688
- border: "1px dashed var(--dsw-alias-border, rgba(128,128,128,.45))",
688
+ border: "1px dashed var(--dsw-alias-border-l1, rgba(128,128,128,.45))",
689
689
  color: "var(--dsw-alias-label-secondary, #9a9a9a)",
690
690
  fontSize: 13,
691
691
  lineHeight: 1.7
@@ -702,7 +702,7 @@ window.__ModuleLoader__.load({
702
702
  userSelect: "all"
703
703
  },
704
704
  btn: {
705
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.35))",
705
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.35))",
706
706
  background: "transparent",
707
707
  color: "var(--dsw-alias-label-primary, inherit)",
708
708
  borderRadius: 8,
@@ -714,7 +714,7 @@ window.__ModuleLoader__.load({
714
714
  padding: "10px 12px",
715
715
  marginBottom: 10,
716
716
  borderRadius: 8,
717
- border: "1px solid var(--dsw-alias-state-warning-primary, #d8a300)",
717
+ border: "1px solid var(--dsw-alias-state-warn-primary, #d8a300)",
718
718
  background: "var(--dsw-alias-bg-base, rgba(216,163,0,.12))",
719
719
  color: "var(--dsw-alias-label-primary, inherit)",
720
720
  fontSize: 13,
@@ -724,7 +724,7 @@ window.__ModuleLoader__.load({
724
724
  padding: "10px 12px",
725
725
  marginBottom: 8,
726
726
  borderRadius: 10,
727
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.3))",
727
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.3))",
728
728
  borderLeftWidth: 3,
729
729
  fontSize: 13,
730
730
  lineHeight: 1.7
@@ -774,7 +774,7 @@ window.__ModuleLoader__.load({
774
774
  btnPrimary: {
775
775
  border: "1px solid transparent",
776
776
  background: "var(--dsw-alias-brand-primary, #0a84ff)",
777
- color: "#fff",
777
+ color: "var(--dsw-alias-label-primary-foreground, #0f1115)",
778
778
  borderRadius: 8,
779
779
  padding: "5px 14px",
780
780
  fontSize: 13,
@@ -807,8 +807,8 @@ window.__ModuleLoader__.load({
807
807
  flexDirection: "column",
808
808
  overflow: "hidden",
809
809
  borderRadius: 12,
810
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.4))",
811
- background: "var(--dsw-alias-bg-elevated, var(--dsw-alias-bg-base, #222))",
810
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.4))",
811
+ background: "var(--dsw-alias-bg-layer-2, var(--dsw-alias-bg-base, #222))",
812
812
  color: "var(--dsw-alias-label-primary, inherit)",
813
813
  boxShadow: "0 12px 32px rgba(0,0,0,.35)"
814
814
  },
@@ -819,7 +819,7 @@ window.__ModuleLoader__.load({
819
819
  gap: 8,
820
820
  flex: "0 0 auto",
821
821
  padding: "12px 14px",
822
- borderBottom: "1px solid var(--dsw-alias-border, rgba(128,128,128,.3))"
822
+ borderBottom: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.3))"
823
823
  },
824
824
  dialogTitle: {
825
825
  fontSize: 14,
@@ -833,7 +833,7 @@ window.__ModuleLoader__.load({
833
833
  padding: "12px 14px"
834
834
  },
835
835
  close: {
836
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.35))",
836
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.35))",
837
837
  background: "transparent",
838
838
  color: "var(--dsw-alias-label-primary, inherit)",
839
839
  borderRadius: 8,
@@ -857,7 +857,7 @@ window.__ModuleLoader__.load({
857
857
  },
858
858
  blocked: {
859
859
  mark: "!",
860
- color: "var(--dsw-alias-state-warning-primary, #d8a300)",
860
+ color: "var(--dsw-alias-state-warn-primary, #d8a300)",
861
861
  tint: "rgba(216,163,0,.10)"
862
862
  },
863
863
  failed: {
@@ -1556,7 +1556,7 @@ window.__ModuleLoader__.load({
1556
1556
  /** 面板上的文字色与分隔线(与 `client.ts` 同一套别名)。 */
1557
1557
  const INK = "var(--dsw-alias-label-primary, inherit)";
1558
1558
  const INK_DIM = "var(--dsw-alias-label-secondary, #9a9a9a)";
1559
- const BORDER = "var(--dsw-alias-border, rgba(128,128,128,.35))";
1559
+ const BORDER = "var(--dsw-alias-border-l1, rgba(128,128,128,.35))";
1560
1560
  const HEALTH_STYLE = {
1561
1561
  box: {
1562
1562
  padding: "10px 12px",
@@ -2432,7 +2432,7 @@ window.__ModuleLoader__.load({
2432
2432
  textOverflow: "ellipsis",
2433
2433
  whiteSpace: "nowrap"
2434
2434
  },
2435
- error: { color: "var(--dsw-alias-label-error, #e66)" }
2435
+ error: { color: "var(--dsw-alias-state-error-primary, #e66)" }
2436
2436
  };
2437
2437
  /** 面包屑:从文件系统根到当前层,每一格都是跳转目标(`listing.crumbs` 由取数方给)。 */
2438
2438
  function crumbRow(state, onEnter) {
@@ -2742,11 +2742,23 @@ window.__ModuleLoader__.load({
2742
2742
  fontSize: 14,
2743
2743
  lineHeight: 1
2744
2744
  },
2745
- meta: {
2746
- color: "var(--dsw-alias-label-secondary, #9a9a9a)",
2747
- fontSize: 12,
2748
- lineHeight: 1.7,
2749
- marginBottom: 10
2745
+ /** #933:页签格里「配置卡 + 体检卡」这一列的堆叠间距(唯一口径,别再给某一张卡加 margin)。 */
2746
+ tabStack: {
2747
+ display: "flex",
2748
+ flexDirection: "column",
2749
+ gap: 10
2750
+ },
2751
+ /** #937:标题行里那枚版本胶囊(形状照真源 v3.1 的 `.ic-ver`:10px 字、1px 描边、999 圆角)。 */
2752
+ versionCapsule: {
2753
+ fontSize: 10.5,
2754
+ lineHeight: 1.6,
2755
+ color: "var(--dsw-alias-label-tertiary, #adb2b8)",
2756
+ border: "1px solid var(--dsw-alias-border-l2, rgba(255,255,255,.12))",
2757
+ borderRadius: 999,
2758
+ padding: "0 7px",
2759
+ whiteSpace: "nowrap",
2760
+ flex: "0 0 auto",
2761
+ fontWeight: 400
2750
2762
  },
2751
2763
  tablist: {
2752
2764
  display: "flex",
@@ -2755,7 +2767,7 @@ window.__ModuleLoader__.load({
2755
2767
  marginBottom: 10
2756
2768
  },
2757
2769
  tab: {
2758
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.35))",
2770
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.35))",
2759
2771
  background: "transparent",
2760
2772
  color: "var(--dsw-alias-label-primary, inherit)",
2761
2773
  borderRadius: 999,
@@ -2766,13 +2778,13 @@ window.__ModuleLoader__.load({
2766
2778
  tabActive: {
2767
2779
  background: "var(--dsw-alias-brand-primary, #0a84ff)",
2768
2780
  borderColor: "transparent",
2769
- color: "#fff",
2781
+ color: "var(--dsw-alias-label-primary-foreground, #0f1115)",
2770
2782
  fontWeight: 700
2771
2783
  },
2772
2784
  reco: {
2773
2785
  padding: "12px 14px",
2774
2786
  borderRadius: 10,
2775
- border: "1px dashed var(--dsw-alias-border, rgba(128,128,128,.45))",
2787
+ border: "1px dashed var(--dsw-alias-border-l1, rgba(128,128,128,.45))",
2776
2788
  color: "var(--dsw-alias-label-secondary, #9a9a9a)",
2777
2789
  fontSize: 13,
2778
2790
  lineHeight: 1.7
@@ -2792,7 +2804,7 @@ window.__ModuleLoader__.load({
2792
2804
  marginTop: 16,
2793
2805
  padding: "10px 12px",
2794
2806
  borderRadius: 10,
2795
- border: "1px solid var(--dsw-alias-border, rgba(128,128,128,.35))"
2807
+ border: "1px solid var(--dsw-alias-border-l1, rgba(128,128,128,.35))"
2796
2808
  },
2797
2809
  moreTitle: {
2798
2810
  fontSize: 13,
@@ -2884,22 +2896,47 @@ window.__ModuleLoader__.load({
2884
2896
  style: S.moreRow
2885
2897
  }, react.createElement("span", { style: S.morePkg }, row.pkg), react.createElement("span", { style: S.moreDesc }, row.desc), react.createElement("span", { style: S.moreIcon }, react.createElement(ExternalIcon, null)))));
2886
2898
  }
2887
- /** 总管自述版本(票 #737):**不手写**,问宿主——宿主读自己这份已安装包的 `package.json`。
2899
+ /** 总管自述版本(票 #737;#937 改口):**不手写**,问宿主——宿主读自己这份已安装包的 `package.json`。
2888
2900
  *
2889
- * 单次取数(`loadManagerVersion`),无轮询;初值 `unknown`,读不到也停在 `unknown`。
2901
+ * 三态(#937):`loading`(首帧就画胶囊占位 `…`)/`ready`(读到,画包名 · 版本)/`missing`(读不到,画「版本未知」)。
2902
+ * **失败要重试**:原先只取一次、一失败就永远停在未知(#937 查出来的真缺陷);这里按 1s/3s/8s 退避重试三次。
2890
2903
  * 与卡路里 #130 同一条路:面板是浏览器产物、禁 node 内建,读盘只许在宿主半。 */
2904
+ /** 读中 / 读不到 两种胶囊文案(#937:占位符用 `…`,读不到给人话,不把 `unknown` 印给人看)。 */
2905
+ const VERSION_PENDING_TEXT = "…";
2906
+ const VERSION_MISSING_TEXT = "版本未知";
2907
+ /** 重试间隔(#937):三次退避,之后不再打扰宿主。 */
2908
+ const VERSION_RETRY_MS = [
2909
+ 1e3,
2910
+ 3e3,
2911
+ 8e3
2912
+ ];
2891
2913
  function useManagerVersion(getCall) {
2892
- const [version, setVersion] = react.useState(VERSION_UNKNOWN);
2914
+ const [state, setState] = react.useState({ kind: "loading" });
2893
2915
  react.useEffect(() => {
2894
2916
  let alive = true;
2895
- loadManagerVersion(getCall()).then((next) => {
2896
- if (alive) setVersion(next);
2897
- });
2917
+ const timers = [];
2918
+ const attempt = (index) => {
2919
+ loadManagerVersion(getCall()).then((next) => {
2920
+ if (!alive) return;
2921
+ if (next !== "unknown") {
2922
+ setState({
2923
+ kind: "ready",
2924
+ version: next
2925
+ });
2926
+ return;
2927
+ }
2928
+ setState({ kind: "missing" });
2929
+ const wait = VERSION_RETRY_MS[index];
2930
+ if (wait !== void 0) timers.push(setTimeout(() => attempt(index + 1), wait));
2931
+ });
2932
+ };
2933
+ attempt(0);
2898
2934
  return () => {
2899
2935
  alive = false;
2936
+ for (const id of timers) clearTimeout(id);
2900
2937
  };
2901
2938
  }, [getCall]);
2902
- return version;
2939
+ return state;
2903
2940
  }
2904
2941
  /** 爱生活面板:总设置区 + 检查更新(七家)+ 爱生活页签条(slot 驱动)+ 技能设置页投影/缺席卡。 */
2905
2942
  function LifePackSection(props) {
@@ -2979,7 +3016,10 @@ window.__ModuleLoader__.load({
2979
3016
  setActiveId(next.plugin);
2980
3017
  tabRefs.current[nextIndex]?.focus();
2981
3018
  }
2982
- return react.createElement("div", null, react.createElement("div", { style: S.headRow }, react.createElement("div", { style: S.head }, "爱生活"), react.createElement("div", { style: S.headActions }, react.createElement(CheckUpdateButton, { face }), react.createElement(PanelActions, null))), react.createElement("div", { style: S.meta }, react.createElement("div", null, "总管 dsh-life-pack · " + managerVersion)), react.createElement(UpdateResults, { face }), react.createElement(HealthSummaryLine, {
3019
+ return react.createElement("div", null, react.createElement("div", { style: S.headRow }, react.createElement("div", { style: S.head }, "爱生活"), react.createElement("span", {
3020
+ style: S.versionCapsule,
3021
+ "data-ilife-version": "capsule"
3022
+ }, managerVersion.kind === "ready" ? "dsh-life-pack · " + managerVersion.version : managerVersion.kind === "missing" ? VERSION_MISSING_TEXT : VERSION_PENDING_TEXT), react.createElement("div", { style: S.headActions }, react.createElement(CheckUpdateButton, { face }), react.createElement(PanelActions, null))), react.createElement(UpdateResults, { face }), react.createElement(HealthSummaryLine, {
2983
3023
  lights,
2984
3024
  running: health.running,
2985
3025
  error: summaryErrorOf(health),
@@ -3039,8 +3079,8 @@ window.__ModuleLoader__.load({
3039
3079
  id: tabsId + "-panel-" + tab.plugin,
3040
3080
  role: "tabpanel",
3041
3081
  "aria-labelledby": tabsId + "-tab-" + tab.plugin,
3042
- hidden: !selected
3043
- }, present.has(tab.plugin) ? react.createElement("div", null, props.renderSlot(CONFIG_TAB_SLOT, {}, { only: tab.plugin }), react.createElement(HealthTable, {
3082
+ style: selected ? void 0 : { display: "none" }
3083
+ }, present.has(tab.plugin) ? react.createElement("div", { style: S.tabStack }, props.renderSlot(CONFIG_TAB_SLOT, {}, { only: tab.plugin }), react.createElement(HealthTable, {
3044
3084
  title: labelFor(tab),
3045
3085
  phase: health.rows[tab.plugin]?.phase ?? "idle",
3046
3086
  report: health.rows[tab.plugin]?.report ?? null,