@celestia-island/hikari 0.45.3 → 0.45.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celestia-island/hikari",
3
- "version": "0.45.3",
3
+ "version": "0.45.5",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Hikari Vue 3 component library — production-grade UI components based on shittim-chest design system",
@@ -32,8 +32,16 @@
32
32
 
33
33
  .s-about-modal-header {
34
34
  display: flex;
35
+ flex-direction: column;
36
+ align-items: center;
37
+ gap: var(--space-8, 0.5rem);
38
+ text-align: center;
39
+ }
40
+
41
+ .s-about-modal-header > div {
42
+ display: flex;
43
+ flex-direction: column;
35
44
  align-items: center;
36
- gap: var(--space-12, 0.75rem);
37
45
  }
38
46
 
39
47
  .s-about-modal-logo-img {
@@ -72,6 +80,21 @@
72
80
  color: rgb(var(--color-muted));
73
81
  }
74
82
 
83
+ .s-about-modal-slogan {
84
+ margin: 0;
85
+ font-size: var(--text-base, 1rem);
86
+ font-weight: 600;
87
+ text-align: center;
88
+ color: rgb(var(--color-text));
89
+ }
90
+
91
+ .s-about-modal-made-by {
92
+ margin: 0;
93
+ font-size: var(--text-sm, 0.8125rem);
94
+ text-align: center;
95
+ color: rgb(var(--color-text));
96
+ }
97
+
75
98
  .s-about-modal-tagline {
76
99
  margin: var(--space-2, 0.125rem) 0 0;
77
100
  font-size: var(--text-xs, 0.75rem);
@@ -80,8 +103,9 @@
80
103
 
81
104
  .s-about-modal-description {
82
105
  margin: 0;
83
- font-size: var(--text-sm, 0.8125rem);
84
- line-height: 1.55;
106
+ font-size: var(--text-xs, 0.75rem);
107
+ line-height: 1.6;
108
+ text-align: center;
85
109
  color: rgb(var(--color-muted));
86
110
  }
87
111
 
@@ -127,6 +151,7 @@
127
151
  .s-about-modal-links-list {
128
152
  display: flex;
129
153
  flex-wrap: wrap;
154
+ justify-content: center;
130
155
  gap: var(--space-8, 0.5rem);
131
156
  }
132
157
 
@@ -154,7 +179,25 @@
154
179
  0 0 0 4px rgb(var(--color-primary));
155
180
  }
156
181
 
182
+ .s-about-modal-footer-links {
183
+ display: flex;
184
+ flex-wrap: wrap;
185
+ justify-content: center;
186
+ gap: var(--space-12, 0.75rem);
187
+ }
188
+
189
+ .s-about-modal-footer-link {
190
+ font-size: var(--text-xs, 0.75rem);
191
+ color: rgb(var(--color-muted));
192
+ text-decoration: none;
193
+ }
194
+
195
+ .s-about-modal-footer-link:hover {
196
+ color: rgb(var(--color-primary));
197
+ text-decoration: underline;
198
+ }
199
+
157
200
  .s-about-modal-footer {
158
201
  display: flex;
159
- justify-content: flex-end;
202
+ justify-content: center;
160
203
  }
@@ -94,30 +94,70 @@ describe("HkAboutModal branding", () => {
94
94
  expect(query<HTMLElement>(".s-about-modal-description").textContent).toBe("Save the world.");
95
95
  });
96
96
 
97
- it("renders author and license rows with an linked author", async () => {
97
+ it("renders the made-by sentence with a linked author name", async () => {
98
98
  mountAbout({
99
- author: "Celestia Island",
100
- authorHref: "https://github.com/celestia-island",
101
- license: "BUSL-1.1",
99
+ madeByPrefix: "由",
100
+ madeByName: "伊欧",
101
+ madeByNameHref: "https://github.com/langyo",
102
+ madeBySuffix: " 主创,来自 Celestia Island",
102
103
  });
103
104
  await flushModal();
105
+ const line = query<HTMLElement>(".s-about-modal-made-by");
106
+ expect(line.textContent).toBe("由伊欧 主创,来自 Celestia Island");
104
107
  const link = query<HTMLAnchorElement>(".s-about-modal-row-link");
105
- expect(link.textContent).toBe("Celestia Island");
106
- expect(link.getAttribute("href")).toBe("https://github.com/celestia-island");
108
+ expect(link.textContent).toBe("伊欧");
109
+ expect(link.getAttribute("href")).toBe("https://github.com/langyo");
107
110
  expect(link.getAttribute("target")).toBe("_blank");
108
- const rows = [...document.body.querySelectorAll<HTMLElement>(".s-about-modal-row")];
109
- const licenseRow = rows.find((row) => row.textContent?.includes("BUSL-1.1"));
110
- expect(licenseRow, "license row renders").toBeTruthy();
111
- expect(licenseRow!.textContent).toContain("License");
112
111
  });
113
112
 
114
- it("renders the author row as plain text without authorHref", async () => {
115
- mountAbout({ author: "Celestia Island" });
113
+ it("renders the made-by sentence without a link when no href", async () => {
114
+ mountAbout({ madeByPrefix: "由", madeByName: "伊欧", madeBySuffix: " 主创" });
116
115
  await flushModal();
117
- expect(query<HTMLElement>(".s-about-modal-row").textContent).toContain("Celestia Island");
116
+ expect(query<HTMLElement>(".s-about-modal-made-by").textContent).toBe("由伊欧 主创");
118
117
  expect(document.body.querySelector(".s-about-modal-row-link")).toBeNull();
119
118
  });
120
119
 
120
+ it("renders software-component version rows", async () => {
121
+ mountAbout({
122
+ componentVersions: [
123
+ { label: "WebUI 版本", value: "0.1.138 REW2HF 生产" },
124
+ { label: "计算引擎版本", value: "0.1.0" },
125
+ ],
126
+ });
127
+ await flushModal();
128
+ const rows = [...document.body.querySelectorAll<HTMLElement>(".s-about-modal-row")];
129
+ expect(rows.length).toBe(2);
130
+ expect(rows[0]!.textContent).toContain("WebUI 版本");
131
+ expect(rows[0]!.textContent).toContain("0.1.138 REW2HF 生产");
132
+ expect(rows[1]!.textContent).toContain("计算引擎版本");
133
+ });
134
+
135
+ it("renders centered license chips", async () => {
136
+ mountAbout({
137
+ licenses: [
138
+ { label: "SySL-1.0", href: "https://github.com/celestia-island/hikari/blob/master/LICENSE" },
139
+ { label: "BUSL-1.1", href: "https://github.com/celestia-island/shittim-chest/blob/master/LICENSE" },
140
+ ],
141
+ });
142
+ await flushModal();
143
+ const chips = [...document.body.querySelectorAll<HTMLAnchorElement>(".s-about-modal-link")];
144
+ expect(chips.map((chip) => chip.textContent)).toEqual(["SySL-1.0", "BUSL-1.1"]);
145
+ for (const chip of chips) expect(chip.getAttribute("target")).toBe("_blank");
146
+ });
147
+
148
+ it("renders centered legal footer links", async () => {
149
+ mountAbout({
150
+ footerLinks: [{ label: "京ICP备2026xxxx号", href: "https://beian.miit.gov.cn/" }],
151
+ });
152
+ await flushModal();
153
+ const links = [
154
+ ...document.body.querySelectorAll<HTMLAnchorElement>(".s-about-modal-footer-link"),
155
+ ];
156
+ expect(links.length).toBe(1);
157
+ expect(links[0]!.textContent).toBe("京ICP备2026xxxx号");
158
+ expect(links[0]!.getAttribute("href")).toBe("https://beian.miit.gov.cn/");
159
+ });
160
+
121
161
  it("renders the backdrop factory inside the clipped layer", async () => {
122
162
  mountAbout({ backdrop: () => h("div", { class: "test-backdrop-marker" }) });
123
163
  await flushModal();
@@ -159,23 +199,11 @@ describe("HkAboutModal branding", () => {
159
199
  expect(badge.textContent).toContain(`© ${year} Test App`);
160
200
  });
161
201
 
162
- it("localizes the author and license labels", async () => {
163
- mountAbout({ author: "Celestia Island", license: "BUSL-1.1" });
164
- await flushModal();
165
- const rows = () => [
166
- ...document.body.querySelectorAll<HTMLElement>(".s-about-modal-row-label"),
167
- ];
168
-
169
- setLocale("zh-Hans");
170
- await flushModal();
171
- let text = rows().map((el) => el.textContent);
172
- expect(text.some((t) => t === "作者")).toBe(true);
173
- expect(text.some((t) => t === "许可证")).toBe(true);
174
-
175
- setLocale("en");
202
+ it("renders no branding rows when no branding props are given", async () => {
203
+ mountAbout();
176
204
  await flushModal();
177
- text = rows().map((el) => el.textContent);
178
- expect(text.some((t) => t === "Author")).toBe(true);
179
- expect(text.some((t) => t === "License")).toBe(true);
205
+ expect(document.body.querySelectorAll(".s-about-modal-row").length).toBe(0);
206
+ expect(document.body.querySelector(".s-about-modal-made-by")).toBeNull();
207
+ expect(document.body.querySelector(".s-about-modal-links")).toBeNull();
180
208
  });
181
209
  });
@@ -10,17 +10,23 @@ export interface HAboutLink {
10
10
  href: string;
11
11
  }
12
12
 
13
+ /** One software-component version row (label left, composed value right). */
14
+ export interface HAboutComponentVersion {
15
+ label: string;
16
+ value: string;
17
+ }
18
+
13
19
  /**
14
20
  * HkAboutModal — version / about dialog.
15
21
  * (Upstreamed from shittim-chest's plana-legacy layer.)
16
22
  *
17
- * Shows the app identity and version metadata plus optional branding: a
18
- * logo image, tagline, organization blurb, author / license rows, a
19
- * decorative backdrop layer (canvas or anything else, rendered behind the
20
- * content and pointer-inert) and external links. Version/build hashes
21
- * render as short hashes when longer than 12 chars (full value in `title`
22
- * tooltip). Every branding prop is optional — the modal degrades to the
23
- * plain identity + version card when none are given.
23
+ * Shows a centered identity block (logo above the name above the tagline)
24
+ * plus optional branding: a made-by sentence with a linked author name, a
25
+ * centered organization line, software-component version rows, license and
26
+ * external link chips, a decorative backdrop layer (canvas or anything
27
+ * else, rendered behind the content and pointer-inert) and centered legal
28
+ * footer links (e.g. ICP filings). Every branding prop is optional — the
29
+ * modal degrades to the plain identity card when none are given.
24
30
  */
25
31
  export const HkAboutModal = defineComponent({
26
32
  name: "HkAboutModal",
@@ -30,28 +36,33 @@ export const HkAboutModal = defineComponent({
30
36
  appName: { type: String, required: true },
31
37
  /** Application version (e.g. "0.1.4"). */
32
38
  version: { type: String, required: true },
33
- /** Optional app build hash / commit. */
34
- buildHash: { type: String, default: undefined },
35
- /** Optional engine version (backend), e.g. "0.2.1". */
36
- engineVersion: { type: String, default: undefined },
37
- /** Optional engine build hash / commit. */
38
- engineBuildHash: { type: String, default: undefined },
39
39
  /** Optional logo image URL — replaces the first-letter tile. */
40
40
  logoSrc: { type: String, default: undefined },
41
41
  /** Optional one-liner under the version (e.g. the app tagline). */
42
42
  tagline: { type: String, default: undefined },
43
- /** Optional paragraph below the header (vision / organization blurb). */
43
+ /** Optional centered small line under the header (organization blurb). */
44
44
  description: { type: String, default: undefined },
45
- /** Optional author / organization row. */
46
- author: { type: String, default: undefined },
47
- /** Optional link applied to the author value. */
48
- authorHref: { type: String, default: undefined },
49
- /** Optional license identifier row (e.g. "BUSL-1.1"). */
50
- license: { type: String, default: undefined },
45
+ /** Made-by sentence: text before the linked author name (e.g. "由"). */
46
+ madeByPrefix: { type: String, default: undefined },
47
+ /** Made-by sentence: the linked author name (e.g. "伊欧"). */
48
+ madeByName: { type: String, default: undefined },
49
+ /** Link applied to the author name (e.g. the GitHub profile). */
50
+ madeByNameHref: { type: String, default: undefined },
51
+ /** Made-by sentence: text after the name (e.g. " 主创,来自 …"). */
52
+ madeBySuffix: { type: String, default: undefined },
53
+ /** License chips (e.g. SySL-1.0 / BUSL-1.1), rendered centered. */
54
+ licenses: { type: Array as PropType<HAboutLink[]>, default: () => [] },
55
+ /** Software-component version rows (WebUI / engines), label + value. */
56
+ componentVersions: {
57
+ type: Array as PropType<HAboutComponentVersion[]>,
58
+ default: () => [],
59
+ },
51
60
  /** Optional copyright holder in the footer (defaults to the app name). */
52
61
  copyright: { type: String, default: undefined },
53
62
  /** Optional external links (e.g. GitHub, docs). */
54
63
  links: { type: Array as PropType<HAboutLink[]>, default: () => [] },
64
+ /** Optional centered legal links above the copyright (ICP filings). */
65
+ footerLinks: { type: Array as PropType<HAboutLink[]>, default: () => [] },
55
66
  /**
56
67
  * Optional decorative backdrop factory, rendered behind the content
57
68
  * inside a clipped, pointer-inert layer. The modal owns only the layer —
@@ -66,21 +77,26 @@ export const HkAboutModal = defineComponent({
66
77
  setup(props, { emit }) {
67
78
  const { t } = useI18n();
68
79
 
69
- function shortHash(hash: string): string {
70
- return hash.length > 12 ? `${hash.slice(0, 12)}…` : hash;
71
- }
72
-
73
- const renderAuthorValue = () => {
74
- if (!props.authorHref) return props.author;
75
- return (
80
+ const renderMadeBy = () => {
81
+ if (!props.madeByName) return null;
82
+ const name = props.madeByNameHref ? (
76
83
  <a
77
84
  class="s-about-modal-row-link"
78
- href={props.authorHref}
85
+ href={props.madeByNameHref}
79
86
  target="_blank"
80
87
  rel="noopener noreferrer"
81
88
  >
82
- {props.author}
89
+ {props.madeByName}
83
90
  </a>
91
+ ) : (
92
+ <span>{props.madeByName}</span>
93
+ );
94
+ return (
95
+ <p class="s-about-modal-made-by">
96
+ {props.madeByPrefix}
97
+ {name}
98
+ {props.madeBySuffix}
99
+ </p>
84
100
  );
85
101
  };
86
102
 
@@ -113,50 +129,37 @@ export const HkAboutModal = defineComponent({
113
129
  </div>
114
130
  </header>
115
131
 
132
+ {renderMadeBy()}
116
133
  {props.description && <p class="s-about-modal-description">{props.description}</p>}
117
134
 
118
- <div class="s-about-modal-rows">
119
- {props.author && (
120
- <div class="s-about-modal-row">
121
- <span class="s-about-modal-row-label">{t("hikari::about.author", "Author")}</span>
122
- <span class="s-about-modal-row-value">{renderAuthorValue()}</span>
123
- </div>
124
- )}
125
- {props.license && (
126
- <div class="s-about-modal-row">
127
- <span class="s-about-modal-row-label">
128
- {t("hikari::about.license", "License")}
129
- </span>
130
- <span class="s-about-modal-row-value">{props.license}</span>
131
- </div>
132
- )}
133
- {props.buildHash && (
134
- <div class="s-about-modal-row">
135
- <span class="s-about-modal-row-label">{t("hikari::about.buildHash", "Build")}</span>
136
- <span class="s-about-modal-row-value" title={props.buildHash}>
137
- {shortHash(props.buildHash)}
138
- </span>
139
- </div>
140
- )}
141
- {props.engineVersion && (
142
- <div class="s-about-modal-row">
143
- <span class="s-about-modal-row-label">
144
- {t("hikari::about.engineVersion", "Engine version")}
145
- </span>
146
- <span class="s-about-modal-row-value">{props.engineVersion}</span>
147
- </div>
148
- )}
149
- {props.engineBuildHash && (
150
- <div class="s-about-modal-row">
151
- <span class="s-about-modal-row-label">
152
- {t("hikari::about.engineBuildHash", "Engine build")}
153
- </span>
154
- <span class="s-about-modal-row-value" title={props.engineBuildHash}>
155
- {shortHash(props.engineBuildHash)}
156
- </span>
135
+ {props.componentVersions.length > 0 && (
136
+ <div class="s-about-modal-rows">
137
+ {props.componentVersions.map((component) => (
138
+ <div class="s-about-modal-row" key={component.label}>
139
+ <span class="s-about-modal-row-label">{component.label}</span>
140
+ <span class="s-about-modal-row-value">{component.value}</span>
141
+ </div>
142
+ ))}
143
+ </div>
144
+ )}
145
+
146
+ {props.licenses.length > 0 && (
147
+ <div class="s-about-modal-links">
148
+ <div class="s-about-modal-links-list">
149
+ {props.licenses.map((license) => (
150
+ <a
151
+ key={license.href}
152
+ href={license.href}
153
+ target="_blank"
154
+ rel="noopener noreferrer"
155
+ class="s-about-modal-link"
156
+ >
157
+ {license.label}
158
+ </a>
159
+ ))}
157
160
  </div>
158
- )}
159
- </div>
161
+ </div>
162
+ )}
160
163
 
161
164
  {props.links.length > 0 && (
162
165
  <div class="s-about-modal-links">
@@ -176,6 +179,22 @@ export const HkAboutModal = defineComponent({
176
179
  </div>
177
180
  )}
178
181
 
182
+ {props.footerLinks.length > 0 && (
183
+ <div class="s-about-modal-footer-links">
184
+ {props.footerLinks.map((link) => (
185
+ <a
186
+ key={link.href}
187
+ href={link.href}
188
+ target="_blank"
189
+ rel="noopener noreferrer"
190
+ class="s-about-modal-footer-link"
191
+ >
192
+ {link.label}
193
+ </a>
194
+ ))}
195
+ </div>
196
+ )}
197
+
179
198
  <footer class="s-about-modal-footer">
180
199
  <HBadge variant="muted">
181
200
  © {new Date().getFullYear()} {props.copyright ?? props.appName}
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "فشل النسخ",
15
15
  "hikari::about.title": "حول",
16
16
  "hikari::about.version": "الإصدار",
17
- "hikari::about.buildHash": "البناء",
18
- "hikari::about.engineVersion": "إصدار المحرك",
19
- "hikari::about.engineBuildHash": "بناء المحرك",
20
- "hikari::about.author": "المؤلف",
21
- "hikari::about.license": "الترخيص",
22
17
  "hikari::theme.mode": "وضع السمة",
23
18
  "hikari::theme.modeLight": "فاتح",
24
19
  "hikari::theme.modeDark": "داكن",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "Kopieren fehlgeschlagen",
15
15
  "hikari::about.title": "Über",
16
16
  "hikari::about.version": "Version",
17
- "hikari::about.buildHash": "Build",
18
- "hikari::about.engineVersion": "Engine-Version",
19
- "hikari::about.engineBuildHash": "Engine-Build",
20
- "hikari::about.author": "Autor",
21
- "hikari::about.license": "Lizenz",
22
17
  "hikari::theme.mode": "Design-Modus",
23
18
  "hikari::theme.modeLight": "Hell",
24
19
  "hikari::theme.modeDark": "Dunkel",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "Copy failed",
15
15
  "hikari::about.title": "About",
16
16
  "hikari::about.version": "Version",
17
- "hikari::about.buildHash": "Build",
18
- "hikari::about.engineVersion": "Engine version",
19
- "hikari::about.engineBuildHash": "Engine build",
20
- "hikari::about.author": "Author",
21
- "hikari::about.license": "License",
22
17
  "hikari::theme.mode": "Theme mode",
23
18
  "hikari::theme.modeLight": "Light",
24
19
  "hikari::theme.modeDark": "Dark",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "Error al copiar",
15
15
  "hikari::about.title": "Acerca de",
16
16
  "hikari::about.version": "Versión",
17
- "hikari::about.buildHash": "Compilación",
18
- "hikari::about.engineVersion": "Versión del motor",
19
- "hikari::about.engineBuildHash": "Compilación del motor",
20
- "hikari::about.author": "Autor",
21
- "hikari::about.license": "Licencia",
22
17
  "hikari::theme.mode": "Modo de tema",
23
18
  "hikari::theme.modeLight": "Claro",
24
19
  "hikari::theme.modeDark": "Oscuro",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "Échec de la copie",
15
15
  "hikari::about.title": "À propos",
16
16
  "hikari::about.version": "Version",
17
- "hikari::about.buildHash": "Build",
18
- "hikari::about.engineVersion": "Version du moteur",
19
- "hikari::about.engineBuildHash": "Build du moteur",
20
- "hikari::about.author": "Auteur",
21
- "hikari::about.license": "Licence",
22
17
  "hikari::theme.mode": "Mode du thème",
23
18
  "hikari::theme.modeLight": "Clair",
24
19
  "hikari::theme.modeDark": "Sombre",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "コピーに失敗しました",
15
15
  "hikari::about.title": "このアプリについて",
16
16
  "hikari::about.version": "バージョン",
17
- "hikari::about.buildHash": "ビルド",
18
- "hikari::about.engineVersion": "エンジンバージョン",
19
- "hikari::about.engineBuildHash": "エンジンビルド",
20
- "hikari::about.author": "作者",
21
- "hikari::about.license": "ライセンス",
22
17
  "hikari::theme.mode": "テーマモード",
23
18
  "hikari::theme.modeLight": "ライト",
24
19
  "hikari::theme.modeDark": "ダーク",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "복사 실패",
15
15
  "hikari::about.title": "정보",
16
16
  "hikari::about.version": "버전",
17
- "hikari::about.buildHash": "빌드",
18
- "hikari::about.engineVersion": "엔진 버전",
19
- "hikari::about.engineBuildHash": "엔진 빌드",
20
- "hikari::about.author": "제작자",
21
- "hikari::about.license": "라이선스",
22
17
  "hikari::theme.mode": "테마 모드",
23
18
  "hikari::theme.modeLight": "라이트",
24
19
  "hikari::theme.modeDark": "다크",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "Falha ao copiar",
15
15
  "hikari::about.title": "Sobre",
16
16
  "hikari::about.version": "Versão",
17
- "hikari::about.buildHash": "Build",
18
- "hikari::about.engineVersion": "Versão do motor",
19
- "hikari::about.engineBuildHash": "Build do motor",
20
- "hikari::about.author": "Autor",
21
- "hikari::about.license": "Licença",
22
17
  "hikari::theme.mode": "Modo do tema",
23
18
  "hikari::theme.modeLight": "Claro",
24
19
  "hikari::theme.modeDark": "Escuro",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "Не удалось скопировать",
15
15
  "hikari::about.title": "О программе",
16
16
  "hikari::about.version": "Версия",
17
- "hikari::about.buildHash": "Сборка",
18
- "hikari::about.engineVersion": "Версия движка",
19
- "hikari::about.engineBuildHash": "Сборка движка",
20
- "hikari::about.author": "Автор",
21
- "hikari::about.license": "Лицензия",
22
17
  "hikari::theme.mode": "Режим темы",
23
18
  "hikari::theme.modeLight": "Светлая",
24
19
  "hikari::theme.modeDark": "Тёмная",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "复制失败",
15
15
  "hikari::about.title": "关于",
16
16
  "hikari::about.version": "版本",
17
- "hikari::about.buildHash": "构建",
18
- "hikari::about.engineVersion": "引擎版本",
19
- "hikari::about.engineBuildHash": "引擎构建",
20
- "hikari::about.author": "作者",
21
- "hikari::about.license": "许可证",
22
17
  "hikari::theme.mode": "主题模式",
23
18
  "hikari::theme.modeLight": "浅色",
24
19
  "hikari::theme.modeDark": "深色",
@@ -14,11 +14,6 @@
14
14
  "hikari::clipboard.copyFailed": "複製失敗",
15
15
  "hikari::about.title": "關於",
16
16
  "hikari::about.version": "版本",
17
- "hikari::about.buildHash": "建置",
18
- "hikari::about.engineVersion": "引擎版本",
19
- "hikari::about.engineBuildHash": "引擎建置",
20
- "hikari::about.author": "作者",
21
- "hikari::about.license": "授權條款",
22
17
  "hikari::theme.mode": "主題模式",
23
18
  "hikari::theme.modeLight": "淺色",
24
19
  "hikari::theme.modeDark": "深色",