@celestia-island/hikari 0.55.193 → 0.55.194

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.55.193",
3
+ "version": "0.55.194",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Hikari UI library, Vue 3 runtime — one design system for Vue 3 and Rust/WASM applications",
@@ -6,6 +6,8 @@ import { compile } from "sass";
6
6
  import { afterEach, describe, expect, it } from "vitest";
7
7
  import { createApp, h, nextTick, ref } from "vue";
8
8
 
9
+ import { setLocale } from "../i18n/context";
10
+
9
11
  import HkTitleBar from "./HkTitleBar";
10
12
 
11
13
  /**
@@ -83,6 +85,28 @@ describe("HkTitleBar", () => {
83
85
  const maximized = mount(h(HkTitleBar, { title: "App", maximized: true }));
84
86
  expect(maximized.querySelector('[title="Restore"]')).toBeTruthy();
85
87
  });
88
+
89
+ it("localizes the caption tooltips through the preset i18n keys", async () => {
90
+ // The bar is window chrome: its captions must follow the host's
91
+ // setLocale (the strings live in the preset locale bundles, not in
92
+ // props). en is the fallback locale a host that never calls
93
+ // setLocale gets — pinned here because the assertions above rely on
94
+ // the literals.
95
+ const windowed = mount(h(HkTitleBar, { title: "App", maximized: false }));
96
+ expect(windowed.querySelector('[title="Close"]')).toBeTruthy();
97
+ expect(windowed.querySelector('[title="Minimize"]')).toBeTruthy();
98
+
99
+ await setLocale("zh-Hans");
100
+ await nextTick();
101
+ expect(windowed.querySelector('[title="最小化"]')).toBeTruthy();
102
+ expect(windowed.querySelector('[title="最大化"]')).toBeTruthy();
103
+ expect(windowed.querySelector('[title="关闭"]')).toBeTruthy();
104
+
105
+ await setLocale("en");
106
+ await nextTick();
107
+ expect(windowed.querySelector('[title="Maximize"]')).toBeTruthy();
108
+ expect(windowed.querySelector('[title="关闭"]')).toBeNull();
109
+ });
86
110
  });
87
111
 
88
112
  describe("HkTitleBar stylesheet contract", () => {
@@ -1,4 +1,5 @@
1
1
  import { defineComponent, onBeforeUnmount, onMounted, ref } from "vue";
2
+ import { useI18n } from "../i18n/context";
2
3
 
3
4
  import "./HkTitleBar.scss";
4
5
 
@@ -26,6 +27,12 @@ import "./HkTitleBar.scss";
26
27
  * component swaps the maximize/restore glyph and squares the close button's
27
28
  * window corner radius (a maximized frame has no rounded corner to follow)
28
29
  * — no shell probing inside.
30
+ *
31
+ * The caption tooltips (minimize / maximize / restore / close) resolve
32
+ * through the preset i18n keys (`hikari::titleBar.*`): the bar is window
33
+ * chrome, so it follows the host's `setLocale` instead of receiving copy
34
+ * through props — with the English strings as the t() fallback for hosts
35
+ * that never set a locale.
29
36
  */
30
37
  export default defineComponent({
31
38
  name: "HkTitleBar",
@@ -52,6 +59,7 @@ export default defineComponent({
52
59
  action: (_id: string) => true,
53
60
  },
54
61
  setup(props, { emit, slots }) {
62
+ const { t } = useI18n();
55
63
  return () => (
56
64
  <div
57
65
  class="hk-titlebar"
@@ -89,8 +97,8 @@ export default defineComponent({
89
97
  <button
90
98
  type="button"
91
99
  class="hk-titlebar-btn"
92
- title="Minimize"
93
- aria-label="Minimize"
100
+ title={t("hikari::titleBar.minimize", "Minimize")}
101
+ aria-label={t("hikari::titleBar.minimize", "Minimize")}
94
102
  onClick={(e: MouseEvent) => {
95
103
  e.stopPropagation();
96
104
  emit("minimize");
@@ -103,8 +111,8 @@ export default defineComponent({
103
111
  <button
104
112
  type="button"
105
113
  class="hk-titlebar-btn"
106
- title={props.maximized ? "Restore" : "Maximize"}
107
- aria-label={props.maximized ? "Restore" : "Maximize"}
114
+ title={props.maximized ? t("hikari::titleBar.restore", "Restore") : t("hikari::titleBar.maximize", "Maximize")}
115
+ aria-label={props.maximized ? t("hikari::titleBar.restore", "Restore") : t("hikari::titleBar.maximize", "Maximize")}
108
116
  onClick={(e: MouseEvent) => {
109
117
  e.stopPropagation();
110
118
  emit("toggle-maximize");
@@ -121,8 +129,8 @@ export default defineComponent({
121
129
  <button
122
130
  type="button"
123
131
  class="hk-titlebar-btn hk-titlebar-btn-close"
124
- title="Close"
125
- aria-label="Close"
132
+ title={t("hikari::titleBar.close", "Close")}
133
+ aria-label={t("hikari::titleBar.close", "Close")}
126
134
  onClick={(e: MouseEvent) => {
127
135
  e.stopPropagation();
128
136
  emit("close");
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "بحث",
285
285
  "hikari::search.clear": "مسح البحث",
286
286
  "hikari::search.apply": "تطبيق",
287
- "hikari::statusBar.idle": "جاهز"
287
+ "hikari::statusBar.idle": "جاهز",
288
+ "hikari::titleBar.minimize": "تصغير",
289
+ "hikari::titleBar.maximize": "تكبير",
290
+ "hikari::titleBar.restore": "استعادة",
291
+ "hikari::titleBar.close": "إغلاق"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "Suchen",
285
285
  "hikari::search.clear": "Suche löschen",
286
286
  "hikari::search.apply": "Anwenden",
287
- "hikari::statusBar.idle": "Bereit"
287
+ "hikari::statusBar.idle": "Bereit",
288
+ "hikari::titleBar.minimize": "Minimieren",
289
+ "hikari::titleBar.maximize": "Maximieren",
290
+ "hikari::titleBar.restore": "Wiederherstellen",
291
+ "hikari::titleBar.close": "Schließen"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "Search",
285
285
  "hikari::search.clear": "Clear search",
286
286
  "hikari::search.apply": "Apply",
287
- "hikari::statusBar.idle": "Ready"
287
+ "hikari::statusBar.idle": "Ready",
288
+ "hikari::titleBar.minimize": "Minimize",
289
+ "hikari::titleBar.maximize": "Maximize",
290
+ "hikari::titleBar.restore": "Restore",
291
+ "hikari::titleBar.close": "Close"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "Buscar",
285
285
  "hikari::search.clear": "Borrar búsqueda",
286
286
  "hikari::search.apply": "Aplicar",
287
- "hikari::statusBar.idle": "Listo"
287
+ "hikari::statusBar.idle": "Listo",
288
+ "hikari::titleBar.minimize": "Minimizar",
289
+ "hikari::titleBar.maximize": "Maximizar",
290
+ "hikari::titleBar.restore": "Restaurar",
291
+ "hikari::titleBar.close": "Cerrar"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "Rechercher",
285
285
  "hikari::search.clear": "Effacer la recherche",
286
286
  "hikari::search.apply": "Appliquer",
287
- "hikari::statusBar.idle": "Prêt"
287
+ "hikari::statusBar.idle": "Prêt",
288
+ "hikari::titleBar.minimize": "Réduire",
289
+ "hikari::titleBar.maximize": "Agrandir",
290
+ "hikari::titleBar.restore": "Restaurer",
291
+ "hikari::titleBar.close": "Fermer"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "検索",
285
285
  "hikari::search.clear": "検索をクリア",
286
286
  "hikari::search.apply": "適用",
287
- "hikari::statusBar.idle": "準備完了"
287
+ "hikari::statusBar.idle": "準備完了",
288
+ "hikari::titleBar.minimize": "最小化",
289
+ "hikari::titleBar.maximize": "最大化",
290
+ "hikari::titleBar.restore": "元に戻す",
291
+ "hikari::titleBar.close": "閉じる"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "검색",
285
285
  "hikari::search.clear": "검색 지우기",
286
286
  "hikari::search.apply": "적용",
287
- "hikari::statusBar.idle": "준비됨"
287
+ "hikari::statusBar.idle": "준비됨",
288
+ "hikari::titleBar.minimize": "최소화",
289
+ "hikari::titleBar.maximize": "최대화",
290
+ "hikari::titleBar.restore": "복원",
291
+ "hikari::titleBar.close": "닫기"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "Pesquisar",
285
285
  "hikari::search.clear": "Limpar pesquisa",
286
286
  "hikari::search.apply": "Aplicar",
287
- "hikari::statusBar.idle": "Pronto"
287
+ "hikari::statusBar.idle": "Pronto",
288
+ "hikari::titleBar.minimize": "Minimizar",
289
+ "hikari::titleBar.maximize": "Maximizar",
290
+ "hikari::titleBar.restore": "Restaurar",
291
+ "hikari::titleBar.close": "Fechar"
288
292
  }
@@ -284,5 +284,9 @@
284
284
  "hikari::search.trigger": "Поиск",
285
285
  "hikari::search.clear": "Очистить поиск",
286
286
  "hikari::search.apply": "Применить",
287
- "hikari::statusBar.idle": "Готово"
287
+ "hikari::statusBar.idle": "Готово",
288
+ "hikari::titleBar.minimize": "Свернуть",
289
+ "hikari::titleBar.maximize": "Развернуть",
290
+ "hikari::titleBar.restore": "Восстановить",
291
+ "hikari::titleBar.close": "Закрыть"
288
292
  }
@@ -288,5 +288,9 @@
288
288
  "hikari::search.trigger": "搜索",
289
289
  "hikari::search.clear": "清除搜索",
290
290
  "hikari::search.apply": "应用",
291
- "hikari::statusBar.idle": "就绪"
291
+ "hikari::statusBar.idle": "就绪",
292
+ "hikari::titleBar.minimize": "最小化",
293
+ "hikari::titleBar.maximize": "最大化",
294
+ "hikari::titleBar.restore": "还原",
295
+ "hikari::titleBar.close": "关闭"
292
296
  }
@@ -288,5 +288,9 @@
288
288
  "hikari::search.trigger": "搜尋",
289
289
  "hikari::search.clear": "清除搜尋",
290
290
  "hikari::search.apply": "套用",
291
- "hikari::statusBar.idle": "就緒"
291
+ "hikari::statusBar.idle": "就緒",
292
+ "hikari::titleBar.minimize": "最小化",
293
+ "hikari::titleBar.maximize": "最大化",
294
+ "hikari::titleBar.restore": "還原",
295
+ "hikari::titleBar.close": "關閉"
292
296
  }