@celestia-island/hikari 0.55.193 → 0.55.195

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.
Files changed (40) hide show
  1. package/package.json +1 -1
  2. package/src/components/HkAlert.scss +1 -1
  3. package/src/components/HkCheckbox.scss +2 -2
  4. package/src/components/HkDrawer.scss +1 -1
  5. package/src/components/HkEmptyState.scss +1 -1
  6. package/src/components/HkFab.scss +4 -4
  7. package/src/components/HkIconButtonGroup.scss +2 -2
  8. package/src/components/HkKeywordSearchModal.scss +2 -2
  9. package/src/components/HkLoadingVeil.scss +2 -2
  10. package/src/components/HkMarkdownRenderer.scss +1 -1
  11. package/src/components/HkModal.scss +4 -4
  12. package/src/components/HkModalBreadcrumb.scss +1 -1
  13. package/src/components/HkPasswordSurface.scss +1 -1
  14. package/src/components/HkRadio.scss +1 -1
  15. package/src/components/HkScrollContainer.scss +1 -1
  16. package/src/components/HkScrollPin.scss +1 -1
  17. package/src/components/HkSidebar.scss +1 -1
  18. package/src/components/HkStepFlow.scss +1 -1
  19. package/src/components/HkStepGuide.scss +1 -1
  20. package/src/components/HkSwitch.scss +1 -1
  21. package/src/components/HkTag.scss +1 -1
  22. package/src/components/HkTitleBar.scss +1 -1
  23. package/src/components/HkTitleBar.test.tsx +24 -0
  24. package/src/components/HkTitleBar.tsx +14 -6
  25. package/src/components/HkTree.scss +1 -1
  26. package/src/components/HkUserPicker.scss +1 -1
  27. package/src/i18n/locales/ar/components.json +5 -1
  28. package/src/i18n/locales/de/components.json +5 -1
  29. package/src/i18n/locales/en/components.json +5 -1
  30. package/src/i18n/locales/es/components.json +5 -1
  31. package/src/i18n/locales/fr/components.json +5 -1
  32. package/src/i18n/locales/ja/components.json +5 -1
  33. package/src/i18n/locales/ko/components.json +5 -1
  34. package/src/i18n/locales/pt/components.json +5 -1
  35. package/src/i18n/locales/ru/components.json +5 -1
  36. package/src/i18n/locales/zh-Hans/components.json +5 -1
  37. package/src/i18n/locales/zh-Hant/components.json +5 -1
  38. package/src/styles/admin-tokens.scss +10 -10
  39. package/src/styles/theme/channels.scss +8 -2
  40. package/src/tokens.scss +8 -2
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.195",
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",
@@ -116,7 +116,7 @@
116
116
  transition: background var(--duration-fast, 0.15s) ease, color var(--duration-fast, 0.15s) ease;
117
117
 
118
118
  &:hover {
119
- background: var(--hi-color-surface, #f0f4f8);
119
+ background: var(--hi-color-surface, #ffffff);
120
120
  color: var(--hi-color-text-primary, #1e1e1e);
121
121
  }
122
122
 
@@ -33,7 +33,7 @@
33
33
  * --hi-color-border is the faint divider channel (15% alpha) and melts
34
34
  * into white/dark surfaces. */
35
35
  border: 1px solid rgb(var(--color-border, 100 100 100));
36
- background: var(--hi-color-surface, rgba(240,244,248,0.95));
36
+ background: var(--hi-color-surface, rgba(255,255,255,0.95));
37
37
  transition:
38
38
  border-color var(--duration-normal, 0.3s) ease,
39
39
  background var(--duration-normal, 0.3s) ease,
@@ -95,7 +95,7 @@
95
95
  :focus-visible keeps mouse toggles ring-free. */
96
96
  .hk-checkbox-box:has(.hk-checkbox-input:focus-visible) {
97
97
  box-shadow:
98
- 0 0 0 2px var(--hi-color-surface, rgba(240,244,248,0.95)),
98
+ 0 0 0 2px var(--hi-color-surface, rgba(255,255,255,0.95)),
99
99
  0 0 0 4px var(--hi-color-primary, #7aa2f7);
100
100
  }
101
101
 
@@ -26,7 +26,7 @@
26
26
  position: fixed;
27
27
  display: flex;
28
28
  flex-direction: column;
29
- background: var(--hk-drawer-bg, var(--hi-color-surface, rgba(240,244,248,0.95)));
29
+ background: var(--hk-drawer-bg, var(--hi-color-surface, rgba(255,255,255,0.95)));
30
30
  // Token-gated (was a hard blur(12px)): the drawer resizes through
31
31
  // animated width/height, and a backdrop-filter on a resizing fixed
32
32
  // layer re-rasters the blurred region every frame — on phones that
@@ -12,7 +12,7 @@
12
12
  panel — usually already provides a surface, and an always-on box turned
13
13
  every in-card empty state into a nested placeholder layer. */
14
14
  .hk-empty-state--boxed {
15
- background: var(--hk-empty-bg, var(--hi-color-surface, rgba(240,244,248,0.95)));
15
+ background: var(--hk-empty-bg, var(--hi-color-surface, rgba(255,255,255,0.95)));
16
16
  backdrop-filter: blur(var(--blur-sm, 8px));
17
17
  border: 1px solid var(--hi-color-border, rgba(100,100,100,0.06));
18
18
  border-radius: var(--radius-md, 0.5rem);
@@ -85,12 +85,12 @@ $sizes: (sm: 34px, md: 42px, lg: 50px);
85
85
 
86
86
  .hk-fab[data-variant="glass"] .hk-fab-button {
87
87
  color: var(--hi-color-text-secondary, #666666);
88
- background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 78%, transparent);
88
+ background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 78%, transparent);
89
89
  border: 1px solid color-mix(in srgb, var(--hi-color-border, rgba(100,100,100,0.12)) 25%, transparent);
90
90
  backdrop-filter: blur(var(--blur-xs, 4px)); // chip language shared with autotag pills
91
91
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.14);
92
92
 
93
- &:hover:not(:disabled) { background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 92%, transparent); }
93
+ &:hover:not(:disabled) { background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 92%, transparent); }
94
94
  }
95
95
 
96
96
  .hk-fab[data-variant="primary"] .hk-fab-button {
@@ -130,7 +130,7 @@ $sizes: (sm: 34px, md: 42px, lg: 50px);
130
130
  letter-spacing: 0.02em;
131
131
  white-space: nowrap;
132
132
  color: var(--hi-color-text-secondary, #666666);
133
- background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 82%, transparent);
133
+ background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 82%, transparent);
134
134
  border: 1px solid color-mix(in srgb, var(--hi-color-border, rgba(100,100,100,0.12)) 25%, transparent);
135
135
  border-radius: var(--radius-full, 9999px);
136
136
  cursor: pointer;
@@ -149,7 +149,7 @@ $sizes: (sm: 34px, md: 42px, lg: 50px);
149
149
  &:focus-visible { outline: 2px solid var(--hi-color-primary, #7aa2f7); outline-offset: 1px; }
150
150
  &:disabled { opacity: 0.35; cursor: not-allowed; }
151
151
  // 82%→94% mirrors the main glass hover ladder (78%→92%).
152
- &:hover:not(:disabled) { background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 94%, transparent); }
152
+ &:hover:not(:disabled) { background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 94%, transparent); }
153
153
  }
154
154
 
155
155
  // Staggered reveal while expanded (CSS only, via nth-child delay).
@@ -22,7 +22,7 @@
22
22
  padding: var(--space-2, 0.125rem);
23
23
  border: 1px solid var(--border-faint);
24
24
  border-radius: var(--radius-md, 8px);
25
- background: rgb(var(--color-surface, 240 244 248) / 60%);
25
+ background: rgb(var(--color-surface, 255 255 255) / 60%);
26
26
  }
27
27
 
28
28
  .hk-icon-group-sm {
@@ -196,7 +196,7 @@
196
196
 
197
197
  .hk-icon-group-item-marker-success {
198
198
  background: rgb(var(--color-success, 14 184 64));
199
- box-shadow: 0 0 0 0.125rem rgb(var(--color-surface, 240 244 248));
199
+ box-shadow: 0 0 0 0.125rem rgb(var(--color-surface, 255 255 255));
200
200
  }
201
201
 
202
202
  /* Slider items already establish position:relative for the thumb stack —
@@ -13,7 +13,7 @@
13
13
  align-items: center;
14
14
  gap: var(--space-8, 0.5rem);
15
15
  padding: var(--space-8, 0.5rem) var(--space-12, 0.75rem);
16
- background: var(--hi-color-surface, rgba(240,244,248,0.95));
16
+ background: var(--hi-color-surface, rgba(255,255,255,0.95));
17
17
  border: 1px solid var(--hk-kw-border, rgb(var(--color-border) / 8%));
18
18
  border-radius: var(--radius-lg, 0.75rem);
19
19
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
@@ -84,7 +84,7 @@
84
84
  transition: background 0.15s ease, border-color 0.15s ease;
85
85
 
86
86
  &:hover {
87
- background: var(--hi-color-surface, rgba(240,244,248,0.95));
87
+ background: var(--hi-color-surface, rgba(255,255,255,0.95));
88
88
  border-color: rgb(var(--color-border) / 6%);
89
89
  }
90
90
 
@@ -11,7 +11,7 @@
11
11
  justify-content: center;
12
12
  // Semi-transparent backdrop with a slight blur: the page beneath
13
13
  // stays readable (orientation) but clearly inactive.
14
- background: rgb(var(--color-background, 214 236 240) / 0.55);
14
+ background: rgb(var(--color-background, 255 255 255) / 0.55);
15
15
  backdrop-filter: blur(6px);
16
16
  -webkit-backdrop-filter: blur(6px);
17
17
  pointer-events: all;
@@ -27,7 +27,7 @@
27
27
  gap: 12px;
28
28
  padding: 24px 32px;
29
29
  border-radius: 12px;
30
- background: rgb(var(--color-surface, 240 244 248) / 0.85);
30
+ background: rgb(var(--color-surface, 255 255 255) / 0.85);
31
31
  box-shadow: 0 8px 32px rgb(0 0 0 / 0.12);
32
32
  }
33
33
 
@@ -161,7 +161,7 @@
161
161
  display: flex;
162
162
  align-items: center;
163
163
  justify-content: center;
164
- background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 70%, transparent);
164
+ background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 70%, transparent);
165
165
  backdrop-filter: blur(4px);
166
166
  z-index: 10;
167
167
  }
@@ -79,7 +79,7 @@
79
79
  height var(--duration-fast, 0.15s) var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1)),
80
80
  max-height var(--duration-fast, 0.15s) var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1)),
81
81
  clip-path var(--duration-fast, 0.15s) var(--ease-standard, cubic-bezier(0.4, 0, 0.2, 1));
82
- background: var(--hk-modal-bg, var(--hi-color-surface, rgba(240,244,248,0.95)));
82
+ background: var(--hk-modal-bg, var(--hi-color-surface, rgba(255,255,255,0.95)));
83
83
  backdrop-filter: var(--hk-modal-blur, none);
84
84
  border: 1px solid var(--hk-modal-border-color, var(--hi-color-border, rgba(100,100,100,0.08)));
85
85
  border-radius: var(--hk-modal-radius, var(--radius-lg, 12px));
@@ -323,7 +323,7 @@
323
323
  // covers never surface as foreign bands over the padding.
324
324
  background: var(
325
325
  --hk-scroll-pin-cover-bg,
326
- var(--hk-modal-bg, var(--hi-color-surface, rgba(240, 244, 248, 0.95)))
326
+ var(--hk-modal-bg, var(--hi-color-surface, rgba(255, 255, 255, 0.95)))
327
327
  );
328
328
  }
329
329
 
@@ -391,7 +391,7 @@
391
391
  font-size: var(--text-2xs);
392
392
  letter-spacing: 0.04em;
393
393
  color: var(--hi-color-muted, #6c6c6c);
394
- background: color-mix(in srgb, var(--hi-color-surface, rgba(240,244,248,0.95)) 78%, transparent);
394
+ background: color-mix(in srgb, var(--hi-color-surface, rgba(255,255,255,0.95)) 78%, transparent);
395
395
  border: 1px solid color-mix(in srgb, var(--hi-color-border, rgba(100,100,100,0.08)) 12%, transparent);
396
396
  border-radius: var(--radius-full, 9999px);
397
397
  backdrop-filter: blur(4px);
@@ -547,7 +547,7 @@
547
547
  backdrop-filter: var(--hk-modal-blur-mobile, none);
548
548
  background: var(
549
549
  --hk-modal-bg-mobile,
550
- var(--hk-modal-bg, var(--hi-color-surface, rgba(240, 244, 248, 0.95)))
550
+ var(--hk-modal-bg, var(--hi-color-surface, rgba(255, 255, 255, 0.95)))
551
551
  );
552
552
  border-radius: var(--hk-modal-radius, var(--radius-lg, 12px))
553
553
  var(--hk-modal-radius, var(--radius-lg, 12px))
@@ -13,7 +13,7 @@
13
13
  // family don't collapse this strip (8px→4px gap, 32px→16px padding).
14
14
  gap: var(--space-8, 0.5rem);
15
15
  padding: var(--space-12, 0.75rem) var(--space-32, 2rem);
16
- background: var(--hi-color-surface, rgba(240,244,248,0.95));
16
+ background: var(--hi-color-surface, rgba(255,255,255,0.95));
17
17
  border: 1px solid var(--hk-breadcrumb-border, rgba(0, 0, 0, 0.06));
18
18
  border-radius: var(--radius-md, 0.5rem);
19
19
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
@@ -342,6 +342,6 @@
342
342
  .hk-pwd-box input:-webkit-autofill:active {
343
343
  -webkit-text-fill-color: var(--hi-color-text-primary, #1e1e1e) !important;
344
344
  caret-color: var(--hi-color-text-primary, #1e1e1e);
345
- box-shadow: 0 0 0 1000px var(--hi-color-surface, #f0f4f8) inset !important;
345
+ box-shadow: 0 0 0 1000px var(--hi-color-surface, #ffffff) inset !important;
346
346
  transition: background-color calc(infinity * 1s) step-end, color calc(infinity * 1s) step-end;
347
347
  }
@@ -101,7 +101,7 @@
101
101
  :focus-visible keeps mouse clicks ring-free. */
102
102
  .hk-radio-box:has(.hk-radio-input:focus-visible) {
103
103
  box-shadow:
104
- 0 0 0 2px var(--hi-color-surface, rgba(240,244,248,0.95)),
104
+ 0 0 0 2px var(--hi-color-surface, rgba(255,255,255,0.95)),
105
105
  0 0 0 4px var(--hi-color-primary, #7aa2f7);
106
106
  }
107
107
 
@@ -194,7 +194,7 @@
194
194
  font-size: var(--text-2xs);
195
195
  letter-spacing: 0.04em;
196
196
  color: var(--hi-color-muted, #6c6c6c);
197
- background: color-mix(in srgb, var(--hi-color-surface, rgba(240,244,248,0.95)) 78%, transparent);
197
+ background: color-mix(in srgb, var(--hi-color-surface, rgba(255,255,255,0.95)) 78%, transparent);
198
198
  border: 1px solid color-mix(in srgb, var(--hi-color-border, rgba(100,100,100,0.08)) 12%, transparent);
199
199
  border-radius: var(--radius-full, 9999px);
200
200
  backdrop-filter: blur(4px);
@@ -23,7 +23,7 @@
23
23
  // sticky header introduced; hosts retune through --hk-scroll-pin-bg).
24
24
  background: var(
25
25
  --hk-scroll-pin-bg,
26
- color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 95%, transparent)
26
+ color-mix(in srgb, var(--hi-color-surface, #ffffff) 95%, transparent)
27
27
  );
28
28
  backdrop-filter: var(--hk-scroll-pin-blur, blur(6px));
29
29
  }
@@ -24,7 +24,7 @@
24
24
  display: flex;
25
25
  flex-direction: column;
26
26
  height: 100%;
27
- background: var(--hk-sidebar-bg, var(--hi-color-surface, rgba(240,244,248,0.95)));
27
+ background: var(--hk-sidebar-bg, var(--hi-color-surface, rgba(255,255,255,0.95)));
28
28
  backdrop-filter: blur(var(--blur-sm, 8px));
29
29
  /* Logical edge: the border rides the content-facing side in either
30
30
  * direction (LTR sidebar docks left, RTL docks right). */
@@ -30,7 +30,7 @@
30
30
  --hk-scroll-pin-z: var(--hk-stepflow-sticky-z, 10);
31
31
  --hk-scroll-pin-bg: var(
32
32
  --hk-stepflow-sticky-bg,
33
- color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 95%, transparent)
33
+ color-mix(in srgb, var(--hi-color-surface, #ffffff) 95%, transparent)
34
34
  );
35
35
  // The HOST's declared gutter owns the resting offset, not this rule. The
36
36
  // pin contract's offset rule is (0,3,0) and parks a top pin at
@@ -49,7 +49,7 @@
49
49
  padding: var(--space-20, 1.25rem);
50
50
  padding-block-start: calc(var(--space-20, 1.25rem) + var(--space-2, 0.125rem));
51
51
  border-radius: var(--radius-lg, 1rem);
52
- background: var(--hi-color-surface, #f0f4f8);
52
+ background: var(--hi-color-surface, #ffffff);
53
53
 
54
54
  &[data-done] {
55
55
  box-shadow: inset 0 0 0 1px rgb(from var(--hi-color-success, #0eb840) r g b / 0.55);
@@ -29,7 +29,7 @@
29
29
  the label; house pattern: HkButton double ring). */
30
30
  .hk-switch-input:focus-visible ~ .hk-switch-track {
31
31
  box-shadow:
32
- 0 0 0 2px var(--hi-color-surface, rgba(240, 244, 248, 0.95)),
32
+ 0 0 0 2px var(--hi-color-surface, rgba(255, 255, 255, 0.95)),
33
33
  0 0 0 4px var(--hi-color-primary, #7aa2f7);
34
34
  }
35
35
 
@@ -58,7 +58,7 @@
58
58
  }
59
59
 
60
60
  .hk-tag-default {
61
- background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 60%, transparent);
61
+ background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 60%, transparent);
62
62
  color: var(--hi-color-text-primary, #1e1e1e);
63
63
  border-color: var(--hi-color-border, #646464);
64
64
  }
@@ -7,7 +7,7 @@
7
7
 
8
8
  .hk-titlebar {
9
9
  --hk-tb-height: 32px;
10
- --hk-tb-bg: color-mix(in srgb, rgb(var(--color-surface, 240 244 248)) 80%, transparent);
10
+ --hk-tb-bg: color-mix(in srgb, rgb(var(--color-surface, 255 255 255)) 80%, transparent);
11
11
  --hk-tb-border: rgb(var(--color-border, 100 100 100) / 0.25);
12
12
  --hk-tb-fg: rgb(var(--color-text-secondary, 102 102 102));
13
13
  --hk-tb-fg-strong: rgb(var(--color-text, 30 30 30));
@@ -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");
@@ -114,7 +114,7 @@
114
114
  cursor: pointer;
115
115
 
116
116
  &:hover {
117
- background: color-mix(in srgb, var(--hi-color-surface, #f0f4f8) 40%, transparent);
117
+ background: color-mix(in srgb, var(--hi-color-surface, #ffffff) 40%, transparent);
118
118
  color: var(--hi-color-text-primary, #1e1e1e);
119
119
  }
120
120
  }
@@ -25,7 +25,7 @@
25
25
  gap: var(--space-8, 0.5rem);
26
26
  min-height: 2.5rem;
27
27
  padding: var(--space-8, 0.5rem) var(--space-12, 0.75rem);
28
- background: var(--hi-color-surface, rgba(240, 244, 248, 0.95));
28
+ background: var(--hi-color-surface, rgba(255, 255, 255, 0.95));
29
29
  border: 1px solid var(--hk-kw-border, rgb(var(--color-border) / 8%));
30
30
  border-radius: var(--radius-lg, 0.75rem);
31
31
  cursor: pointer;
@@ -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
  }
@@ -23,7 +23,7 @@
23
23
  /* ── Hikari color bridge ─ */
24
24
  --hi-color-primary: rgb(var(--color-primary, 122 162 247));
25
25
  --hi-color-primary-rgb: var(--color-primary, 122 162 247);
26
- --hi-color-surface: rgb(var(--color-surface, 240 244 248));
26
+ --hi-color-surface: rgb(var(--color-surface, 255 255 255));
27
27
  --hi-color-border: rgb(var(--color-border, 100 100 100) / 15%);
28
28
  --hi-color-text-primary: rgb(var(--color-text, 30 30 30));
29
29
  --hi-color-text-on-primary: rgb(var(--color-on-primary, 255 255 255)); /* deprecated in-tree: prefer the on-solid slots */
@@ -34,11 +34,11 @@
34
34
  --hi-color-icon-on-solid: rgb(var(--color-on-solid-icon, 255 255 255));
35
35
  --hi-color-text-secondary: color-mix(in srgb, rgb(var(--color-text, 30 30 30)) 60%, transparent);
36
36
  --hi-color-muted: rgb(var(--color-muted, 108 108 108));
37
- --hi-color-background: rgb(var(--color-background, 214 236 240));
38
- --hi-color-bg-canvas: rgb(var(--color-background, 214 236 240));
39
- --hi-color-bg-elevated: rgb(var(--color-surface, 240 244 248));
40
- --hi-color-bg-subtle: rgb(var(--color-surface, 240 244 248) / 0.5);
41
- --hi-secondary-bg: rgb(var(--color-surface, 240 244 248) / 0.5);
37
+ --hi-color-background: rgb(var(--color-background, 255 255 255));
38
+ --hi-color-bg-canvas: rgb(var(--color-background, 255 255 255));
39
+ --hi-color-bg-elevated: rgb(var(--color-surface, 255 255 255));
40
+ --hi-color-bg-subtle: rgb(var(--color-surface, 255 255 255) / 0.5);
41
+ --hi-secondary-bg: rgb(var(--color-surface, 255 255 255) / 0.5);
42
42
  --hi-color-danger: rgb(var(--color-error, 247 118 142));
43
43
  --hi-color-success: rgb(var(--color-success, 14 184 64));
44
44
  --hi-color-warning: rgb(var(--color-warning, 238 214 119));
@@ -58,7 +58,7 @@
58
58
  * by load order. (--hk-surface's only in-tree consumer — the retired
59
59
  * HTabs tail overlay — is gone; the token stays published for
60
60
  * external plana-ui readers.) */
61
- --hk-surface: var(--color-surface, 240 244 248);
61
+ --hk-surface: var(--color-surface, 255 255 255);
62
62
  --hk-primary: var(--color-primary, 122 162 247);
63
63
  }
64
64
 
@@ -948,7 +948,7 @@
948
948
  depend on the host having loaded the reset sheet (without it a 1px
949
949
  border pushes the box 2px past its max-width and off-centre). */
950
950
  box-sizing: border-box;
951
- background: color-mix(in srgb, rgb(var(--color-surface, 240 244 248)) 70%, transparent);
951
+ background: color-mix(in srgb, rgb(var(--color-surface, 255 255 255)) 70%, transparent);
952
952
  border: 1px solid color-mix(in srgb, rgb(var(--color-text, 30 30 30)) 12%, transparent);
953
953
  border-radius: var(--hi-radius-sm, 4px);
954
954
  box-shadow: 0 2px 16px rgb(0 0 0 / 8%);
@@ -1207,11 +1207,11 @@
1207
1207
  }
1208
1208
 
1209
1209
  .a-bg-secondary {
1210
- background: rgb(var(--color-background, 214 236 240));
1210
+ background: rgb(var(--color-background, 255 255 255));
1211
1211
  }
1212
1212
 
1213
1213
  .a-bg-tertiary {
1214
- background: rgb(var(--color-surface, 240 244 248));
1214
+ background: rgb(var(--color-surface, 255 255 255));
1215
1215
  }
1216
1216
 
1217
1217
  .a-latency-text {
@@ -93,8 +93,14 @@
93
93
  --color-muted: 108 108 108;
94
94
  --color-border: 100 100 100;
95
95
  --color-focused-border: 122 162 247;
96
- --color-background: 214 236 240;
97
- --color-surface: 240 244 248;
96
+ /* Static seed floor (2026-10-22 user direction): pure white — the
97
+ * pale-cyan paper default retired. These seeds are the PRE-ENGINE
98
+ * paint (and the engine-failure floor); the runtime theme overrides
99
+ * them on :root once JS applies a preset (dark mode included — the
100
+ * engine owns scheme switching, the seeds are the light default). */
101
+ --color-background: 255 255 255;
102
+ --color-surface: 255 255 255;
103
+
98
104
  /* Derived seed defaults for the runtime-selected channels: a primary
99
105
  * wash over the background (selected) and the surface tint (status
100
106
  * bar), matching what presets derive at runtime. */
package/src/tokens.scss CHANGED
@@ -86,8 +86,14 @@
86
86
  --color-muted: 108 108 108;
87
87
  --color-border: 100 100 100;
88
88
  --color-focused-border: 122 162 247;
89
- --color-background: 214 236 240;
90
- --color-surface: 240 244 248;
89
+ /* Static seed floor (2026-10-22 user direction): pure white — the
90
+ * pale-cyan paper default retired. These seeds are the PRE-ENGINE
91
+ * paint (and the engine-failure floor); the runtime theme overrides
92
+ * them on :root once JS applies a preset (dark mode included — the
93
+ * engine owns scheme switching, the seeds are the light default). */
94
+ --color-background: 255 255 255;
95
+ --color-surface: 255 255 255;
96
+
91
97
  /* Derived seed defaults for the runtime-selected channels: a primary
92
98
  * wash over the background (selected) and the surface tint (status
93
99
  * bar), matching what presets derive at runtime. */