@celestia-island/hikari 0.43.10 → 0.43.13

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 (121) hide show
  1. package/package.json +1 -1
  2. package/src/components/HkAboutModal.scss +12 -1
  3. package/src/components/HkAdaptiveDialog.scss +2 -2
  4. package/src/components/HkAffixPicker.scss +55 -27
  5. package/src/components/HkAlert.scss +35 -31
  6. package/src/components/HkAltSignIn.scss +10 -4
  7. package/src/components/HkAuthMethodList.scss +5 -5
  8. package/src/components/HkAuthSubmitButton.scss +3 -3
  9. package/src/components/HkAvatar.scss +10 -49
  10. package/src/components/HkBadge.scss +6 -9
  11. package/src/components/HkBlockingToast.scss +27 -10
  12. package/src/components/HkBoard.scss +26 -6
  13. package/src/components/HkBreadcrumb.scss +82 -268
  14. package/src/components/HkButton.scss +26 -3
  15. package/src/components/HkCaptchaWidget.scss +2 -3
  16. package/src/components/HkCard.scss +14 -8
  17. package/src/components/HkCheckbox.scss +11 -9
  18. package/src/components/HkColorPicker.scss +22 -8
  19. package/src/components/HkContextRing.scss +8 -4
  20. package/src/components/HkCookieConsent.scss +12 -3
  21. package/src/components/HkDatePicker.scss +49 -65
  22. package/src/components/HkDateTimePicker.scss +48 -31
  23. package/src/components/HkDivider.scss +14 -15
  24. package/src/components/HkDraggableGrid.scss +41 -11
  25. package/src/components/HkDraggableList.scss +22 -11
  26. package/src/components/HkDrawer.scss +24 -4
  27. package/src/components/HkEmptyState.scss +10 -11
  28. package/src/components/HkErrorLanding.scss +5 -5
  29. package/src/components/HkExpansionPanel.scss +6 -2
  30. package/src/components/HkFab.scss +29 -12
  31. package/src/components/HkFileBrowserDialog.scss +21 -10
  32. package/src/components/HkFileField.scss +20 -9
  33. package/src/components/HkFilePickerField.scss +12 -6
  34. package/src/components/HkGaugeRing.scss +8 -0
  35. package/src/components/HkHoverRevealAction.scss +30 -12
  36. package/src/components/HkIcon.scss +0 -18
  37. package/src/components/HkIconButton.scss +29 -62
  38. package/src/components/HkIconButtonVars.scss +8 -28
  39. package/src/components/HkImageLightbox.scss +4 -3
  40. package/src/components/HkImagePreview.scss +17 -9
  41. package/src/components/HkImageViewer.scss +8 -0
  42. package/src/components/HkInput.scss +28 -28
  43. package/src/components/HkJsonTree.scss +13 -9
  44. package/src/components/HkKeywordSearchModal.scss +40 -29
  45. package/src/components/HkLabel.scss +8 -3
  46. package/src/components/HkListTransition.scss +16 -1
  47. package/src/components/HkLoadMore.scss +11 -2
  48. package/src/components/HkLocalizedInput.scss +11 -11
  49. package/src/components/HkLogWindow.scss +22 -4
  50. package/src/components/HkLogo.scss +12 -3
  51. package/src/components/HkMarkdownRenderer.scss +19 -13
  52. package/src/components/HkMediaControlBar.scss +2 -4
  53. package/src/components/HkMediaSlider.scss +0 -2
  54. package/src/components/HkMenu.scss +32 -20
  55. package/src/components/HkMenuIdentityItem.scss +3 -3
  56. package/src/components/HkMinimap.scss +23 -8
  57. package/src/components/HkModal.scss +17 -20
  58. package/src/components/HkModalBreadcrumb.scss +25 -6
  59. package/src/components/HkModelTag.scss +23 -13
  60. package/src/components/HkNavItem.scss +27 -14
  61. package/src/components/HkNumberInput.scss +25 -21
  62. package/src/components/HkPageHeader.scss +7 -6
  63. package/src/components/HkPasswordInput.scss +36 -36
  64. package/src/components/HkPhaseTransition.scss +16 -0
  65. package/src/components/HkPhoneInput.scss +10 -5
  66. package/src/components/HkPickerPane.scss +32 -5
  67. package/src/components/HkPlaceholderMarquee.scss +7 -2
  68. package/src/components/HkPlaceholderMarquee.test.ts +27 -0
  69. package/src/components/HkPlaceholderMarquee.tsx +14 -6
  70. package/src/components/HkPopover.scss +18 -10
  71. package/src/components/HkPopupSelect.scss +28 -7
  72. package/src/components/HkProgressBar.scss +29 -7
  73. package/src/components/HkProgressDialog.scss +4 -2
  74. package/src/components/HkProgressRing.scss +7 -14
  75. package/src/components/HkProtocolModal.scss +0 -3
  76. package/src/components/HkQrCode.scss +2 -2
  77. package/src/components/HkRadio.scss +15 -6
  78. package/src/components/HkRichInput.scss +29 -13
  79. package/src/components/HkRollingNumber.scss +14 -6
  80. package/src/components/HkScrollContainer.scss +20 -8
  81. package/src/components/HkSearchInput.scss +12 -10
  82. package/src/components/HkSecretRevealModal.scss +11 -1
  83. package/src/components/HkSelect.scss +35 -17
  84. package/src/components/HkSelectionGrid.scss +41 -20
  85. package/src/components/HkSelectionWaterfall.scss +21 -9
  86. package/src/components/HkShareBar.scss +14 -5
  87. package/src/components/HkSidebar.scss +23 -9
  88. package/src/components/HkSkeleton.scss +16 -8
  89. package/src/components/HkSlider.scss +12 -2
  90. package/src/components/HkSpinner.scss +15 -9
  91. package/src/components/HkSplash.scss +10 -10
  92. package/src/components/HkStatCard.scss +7 -3
  93. package/src/components/HkStatusPill.scss +4 -7
  94. package/src/components/HkStepFlow.scss +24 -4
  95. package/src/components/HkSwitch.scss +41 -9
  96. package/src/components/HkTable.scss +25 -20
  97. package/src/components/HkTabs.scss +40 -26
  98. package/src/components/HkTag.scss +35 -29
  99. package/src/components/HkTagInput.scss +22 -16
  100. package/src/components/HkTextarea.scss +8 -6
  101. package/src/components/HkThemeToggle.scss +28 -18
  102. package/src/components/HkTimeline.scss +46 -29
  103. package/src/components/HkTimeline.test.tsx +39 -0
  104. package/src/components/HkTimeline.tsx +16 -2
  105. package/src/components/HkTitleBar.scss +16 -7
  106. package/src/components/HkToast.scss +40 -10
  107. package/src/components/HkTokenUsagePanel.scss +11 -6
  108. package/src/components/HkToolBlock.scss +23 -11
  109. package/src/components/HkTooltip.scss +5 -9
  110. package/src/components/HkTree.scss +26 -35
  111. package/src/components/HkVoiceInputPopup.scss +11 -6
  112. package/src/components/HkWindowedItem.scss +3 -9
  113. package/src/components/HkZoomToolbar.scss +12 -10
  114. package/src/components/_menu-item.scss +4 -3
  115. package/src/components/window-close.scss +8 -13
  116. package/src/composables/layoutGeometry.test.ts +177 -0
  117. package/src/composables/layoutGeometry.ts +231 -0
  118. package/src/composables/useOverlayScrollbar.test.ts +32 -0
  119. package/src/composables/useOverlayScrollbar.ts +9 -1
  120. package/src/composables/usePointerReorder.test.ts +5 -2
  121. package/src/composables/usePointerReorder.ts +83 -147
@@ -93,8 +93,6 @@
93
93
  top: var(--space-12, 0.75rem);
94
94
  right: var(--space-12, 0.75rem);
95
95
  z-index: 2;
96
- background: var(--hi-icon-button-bg);
97
- color: var(--hi-icon-button-icon-color);
98
96
  backdrop-filter: blur(6px);
99
97
 
100
98
  &:hover,
@@ -115,9 +113,12 @@
115
113
  }
116
114
  }
117
115
 
116
+ // Focus ring rides INSIDE the chip (negative offset, HkSelectionGrid
117
+ // precedent): an outward ring floats over raw imagery and vanishes on
118
+ // light photos.
118
119
  &:focus-visible {
119
120
  outline: 2px solid rgb(255 255 255 / 80%);
120
- outline-offset: 2px;
121
+ outline-offset: -2px;
121
122
  }
122
123
  }
123
124
 
@@ -16,15 +16,23 @@
16
16
  // Enlarge affordance: the tile acts as a button once the image is up.
17
17
  .hk-image-preview.is-zoomable {
18
18
  cursor: zoom-in;
19
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
19
+ transition: border-color 0.15s ease, box-shadow 0.15s ease, filter 0.15s ease;
20
20
 
21
21
  &:hover {
22
- border-color: var(--hi-color-primary, #ffc0cb);
23
- box-shadow: 0 0 0 1px var(--hi-color-primary, #ffc0cb);
22
+ border-color: var(--hi-color-primary, #58a6ff);
23
+ // Emphasis drawn INSIDE the border box (HkSelectionGrid precedent):
24
+ // outer spread rings get shaved per-side by overlapping chrome.
25
+ box-shadow: inset 0 0 0 1px var(--hi-color-primary, #58a6ff);
26
+ }
27
+
28
+ // Press feedback matching the house button pattern (HkButton variants,
29
+ // HkSelectionGrid): the tile is role="button" once zoomable.
30
+ &:active {
31
+ filter: brightness(0.95);
24
32
  }
25
33
 
26
34
  &:focus-visible {
27
- outline: 2px solid var(--hi-color-primary, #ffc0cb);
35
+ outline: 2px solid var(--hi-color-primary, #58a6ff);
28
36
  outline-offset: 2px;
29
37
  }
30
38
  }
@@ -35,10 +43,10 @@
35
43
  width: 100%;
36
44
  height: 100%;
37
45
  // object-fit comes from the prop (inline style).
38
- opacity: 1;
39
-
40
46
  // Hidden while loading so the shimmer shows through; the real pixels
41
47
  // fade in on the load event.
48
+ transition: opacity 0.2s ease;
49
+
42
50
  &.is-pending {
43
51
  opacity: 0;
44
52
  }
@@ -57,9 +65,9 @@
57
65
  justify-content: center;
58
66
  background: linear-gradient(
59
67
  90deg,
60
- color-mix(in srgb, var(--hi-color-primary, #ffc0cb) 8%, transparent) 25%,
61
- color-mix(in srgb, var(--hi-color-primary, #ffc0cb) 18%, transparent) 50%,
62
- color-mix(in srgb, var(--hi-color-primary, #ffc0cb) 8%, transparent) 75%
68
+ color-mix(in srgb, var(--hi-color-primary, #58a6ff) 8%, transparent) 25%,
69
+ color-mix(in srgb, var(--hi-color-primary, #58a6ff) 18%, transparent) 50%,
70
+ color-mix(in srgb, var(--hi-color-primary, #58a6ff) 8%, transparent) 75%
63
71
  );
64
72
  background-size: 200% 100%;
65
73
  animation: hk-image-preview-shimmer 1.5s ease-in-out infinite;
@@ -31,3 +31,11 @@
31
31
  align-items: center;
32
32
  justify-content: center;
33
33
  }
34
+
35
+ // Reduced motion: pan/zoom keeps working, the transform just stops
36
+ // gliding (house pattern — HkExpansionPanel / HkAffixPicker).
37
+ @media (prefers-reduced-motion: reduce) {
38
+ .hk-image-viewer-img {
39
+ transition: none;
40
+ }
41
+ }
@@ -18,7 +18,7 @@
18
18
  }
19
19
 
20
20
  .hk-input-required {
21
- margin-left: var(--space-2);
21
+ margin-inline-start: var(--space-2);
22
22
  color: rgb(var(--color-error));
23
23
  }
24
24
 
@@ -34,7 +34,12 @@
34
34
  border: 1px solid color-mix(in srgb, rgb(var(--color-text)) 14%, transparent);
35
35
  border-radius: var(--radius-sm);
36
36
  overflow: hidden;
37
- transition: background-color, border-color, color, box-shadow, opacity, transform, filter var(--duration-normal) var(--ease-standard);
37
+ /* Longhand on purpose: the comma shorthand attached the duration to the
38
+ * LAST property only, so hover border-color and the focus-within
39
+ * background/box-shadow snapped at 0s (HkButton F5, same disease). */
40
+ transition-property: background-color, border-color, color, box-shadow, opacity, transform, filter;
41
+ transition-duration: var(--duration-normal);
42
+ transition-timing-function: var(--ease-standard);
38
43
  color: rgb(var(--color-text));
39
44
 
40
45
  &:hover:not(.hk-input-box-disabled) {
@@ -63,7 +68,6 @@
63
68
  }
64
69
 
65
70
  .hk-input-box[data-autogrow] {
66
- display: flex;
67
71
  flex-direction: column;
68
72
  align-items: stretch;
69
73
  }
@@ -140,7 +144,6 @@
140
144
  .hk-input-element.hk-input-textarea {
141
145
  position: relative;
142
146
  inset: unset;
143
- width: 100%;
144
147
  height: auto;
145
148
  flex: 1;
146
149
  min-width: 0;
@@ -163,28 +166,6 @@
163
166
  resize: none;
164
167
  }
165
168
 
166
- .hk-input-box[data-autogrow] {
167
- display: flex;
168
- flex-direction: column;
169
- align-items: stretch;
170
- }
171
-
172
- .hk-input-autogrow {
173
- flex: 1;
174
- min-height: 0;
175
- }
176
-
177
- .hk-input-textarea[data-autogrow] {
178
- position: relative;
179
- inset: unset;
180
- width: 100%;
181
- flex: 0 0 auto;
182
- resize: none;
183
- overflow: hidden;
184
- min-height: 2.5rem;
185
- text-align: start;
186
- }
187
-
188
169
  .hk-input-affix {
189
170
  display: flex;
190
171
  align-items: center;
@@ -282,10 +263,29 @@
282
263
  padding: 0;
283
264
  border: none;
284
265
  background: transparent;
285
- color: var(--color-text-secondary, #888);
266
+ /* Contract tokens, not the raw app triplets: --color-text-secondary is a
267
+ * bare "R G B" triplet, so using it directly as a color is invalid at
268
+ * computed-value time (the rule silently inherits); --color-text-primary
269
+ * is not defined anywhere. --hi-color-* wrap the triplets in rgb(). */
270
+ color: var(--hi-color-text-secondary, #888);
286
271
  cursor: pointer;
287
272
 
288
273
  &:hover {
289
- color: var(--color-text-primary, #222);
274
+ color: var(--hi-color-text-primary, #222);
275
+ }
276
+
277
+ // Keyboard parity (house icon-button pattern, HkIconButton): this real
278
+ // <button> had a hover state only, so keyboard focus was invisible.
279
+ // Offset 2px is safe here — the toggle rides the box's inline padding,
280
+ // well inside the box's overflow:hidden clip edge.
281
+ &:focus-visible {
282
+ outline: 2px solid rgb(var(--color-primary));
283
+ outline-offset: 2px;
284
+ border-radius: var(--radius-sm);
285
+ }
286
+
287
+ // Press feedback matching the house button pattern (HkButton variants).
288
+ &:active {
289
+ filter: brightness(0.95);
290
290
  }
291
291
  }
@@ -50,7 +50,9 @@
50
50
  display: flex;
51
51
  align-items: baseline;
52
52
  min-height: 1.55em;
53
- padding: 0 var(--space-6, 0.375rem);
53
+ /* Inline paddingLeft (tsx) always overrides the left half; spell out the
54
+ dead slot so the live right inset is not mistaken for symmetric. */
55
+ padding: 0 var(--space-6, 0.375rem) 0 0;
54
56
  border-radius: var(--radius-xs, 2px);
55
57
  cursor: default;
56
58
  }
@@ -70,7 +72,7 @@
70
72
  width: var(--jt-toggle);
71
73
  height: var(--jt-toggle);
72
74
  flex-shrink: 0;
73
- margin-right: 2px;
75
+ margin-inline-end: var(--space-2, 0.125rem);
74
76
  /* The toggle box has no text baseline of its own — pin it to the line
75
77
  top instead of letting it join the row's baseline group with a
76
78
  synthesized border-box baseline. */
@@ -115,7 +117,7 @@
115
117
 
116
118
  .s-jt-colon {
117
119
  color: rgb(var(--color-muted));
118
- margin-right: 0.35em;
120
+ margin-inline-end: 0.35em;
119
121
  }
120
122
 
121
123
  .s-jv-null {
@@ -123,21 +125,24 @@
123
125
  font-style: italic;
124
126
  }
125
127
 
128
+ /* Value colors join the shared --code-* family (see tokens.scss) so themes
129
+ restyle the tree together with HkToolBlock's code blocks; fallbacks keep
130
+ the One Dark originals. */
126
131
  .s-jv-str {
127
- color: #98c379;
132
+ color: var(--code-string, #98c379);
128
133
  word-break: break-all;
129
134
  }
130
135
 
131
136
  .s-jv-num {
132
- color: #d19a66;
137
+ color: var(--code-number, #d19a66);
133
138
  }
134
139
 
135
140
  .s-jv-bool {
136
- color: #c678dd;
141
+ color: var(--code-keyword, #c678dd);
137
142
  }
138
143
 
139
144
  .s-jv-str-raw {
140
- color: #98c379;
145
+ color: var(--code-string, #98c379);
141
146
  white-space: pre-wrap;
142
147
  word-break: break-all;
143
148
  }
@@ -146,8 +151,8 @@
146
151
  color: rgb(var(--color-muted) / 0.6);
147
152
  font-size: var(--text-3xs, 0.5rem);
148
153
  font-style: italic;
149
- margin-left: 0.75em;
150
154
  font-weight: 400;
155
+ margin-inline-start: 0.75em;
151
156
  }
152
157
 
153
158
  .s-jt-badge {
@@ -162,7 +167,6 @@
162
167
  }
163
168
 
164
169
  .s-jt-badge.is-open {
165
- color: rgb(var(--color-muted));
166
170
  background: transparent;
167
171
  border-color: transparent;
168
172
  font-weight: 400;
@@ -1,23 +1,26 @@
1
1
  .hk-kw-search {
2
2
  display: flex;
3
3
  flex-direction: column;
4
- gap: var(--hi-space-10, 1.25rem);
5
- padding: var(--hi-space-4, 0.25rem) 0;
4
+ /* Token names follow the VALUES this component has always rendered
5
+ * (the old --hi-space-* names never resolved), not the numerals:
6
+ * 1.25rem is --space-20, not --space-10. */
7
+ gap: var(--space-20, 1.25rem);
8
+ padding: var(--space-4, 0.25rem) 0;
6
9
  }
7
10
 
8
11
  .hk-kw-search-box {
9
12
  display: flex;
10
13
  align-items: center;
11
- gap: var(--hi-space-8, 0.5rem);
12
- padding: var(--hi-space-8, 0.5rem) var(--hi-space-10, 0.75rem);
14
+ gap: var(--space-8, 0.5rem);
15
+ padding: var(--space-8, 0.5rem) var(--space-12, 0.75rem);
13
16
  background: var(--hi-color-surface, rgba(255, 255, 255, 0.95));
14
- border: 1px solid var(--hk-kw-border, rgba(0, 0, 0, 0.08));
17
+ border: 1px solid var(--hk-kw-border, rgb(var(--color-border) / 8%));
15
18
  border-radius: var(--hi-radius-lg, 0.75rem);
16
19
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
17
20
 
18
21
  &:focus-within {
19
22
  border-color: var(--hi-color-primary, #58a6ff);
20
- box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.12);
23
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--hi-color-primary, #58a6ff) 12%, transparent);
21
24
  }
22
25
  }
23
26
 
@@ -34,7 +37,7 @@
34
37
  border: 0;
35
38
  outline: none;
36
39
  color: var(--hi-color-text-primary, #333);
37
- font-size: 0.875rem;
40
+ font-size: var(--text-base, 0.875rem);
38
41
  }
39
42
 
40
43
  .hk-kw-search-clear {
@@ -44,12 +47,17 @@
44
47
  color: var(--hi-color-text-secondary, #666);
45
48
  cursor: pointer;
46
49
  display: inline-flex;
47
- padding: var(--hi-space-2, 0.125rem);
50
+ padding: var(--space-2, 0.125rem);
48
51
  border-radius: var(--hi-radius-sm, 0.25rem);
49
52
 
50
53
  &:hover {
51
54
  color: var(--hi-color-text-primary, #333);
52
55
  }
56
+
57
+ &:focus-visible {
58
+ outline: 2px solid color-mix(in srgb, var(--hi-color-primary, #58a6ff) 55%, transparent);
59
+ outline-offset: 2px;
60
+ }
53
61
  }
54
62
 
55
63
  /* ONE SCROLLBAR PER WINDOW (2026-09-08 audit): the results list is NOT a
@@ -59,17 +67,17 @@
59
67
  .hk-kw-search-results {
60
68
  display: flex;
61
69
  flex-direction: column;
62
- gap: var(--hi-space-4, 0.25rem);
63
- padding: 0 var(--hi-space-2, 0.125rem);
70
+ gap: var(--space-4, 0.25rem);
71
+ padding: 0 var(--space-2, 0.125rem);
64
72
  }
65
73
 
66
74
  .hk-kw-search-result {
67
75
  appearance: none;
68
- text-align: left;
76
+ text-align: start;
69
77
  background: transparent;
70
78
  border: 1px solid transparent;
71
79
  border-radius: var(--hi-radius-sm, 0.25rem);
72
- padding: var(--hi-space-8, 0.5rem) var(--hi-space-10, 0.75rem);
80
+ padding: var(--space-8, 0.5rem) var(--space-12, 0.75rem);
73
81
  cursor: pointer;
74
82
  width: 100%;
75
83
  color: var(--hi-color-text-primary, #333);
@@ -77,25 +85,28 @@
77
85
 
78
86
  &:hover {
79
87
  background: var(--hi-color-surface, rgba(255, 255, 255, 0.95));
80
- border-color: rgba(0, 0, 0, 0.06);
88
+ border-color: rgb(var(--color-border) / 6%);
89
+ }
90
+
91
+ &:focus-visible {
92
+ outline: 2px solid color-mix(in srgb, var(--hi-color-primary, #58a6ff) 55%, transparent);
93
+ outline-offset: 2px;
81
94
  }
82
95
  }
83
96
 
84
97
  .hk-kw-search-empty {
85
- padding: var(--hi-space-24, 3rem) var(--hi-space-8, 0.5rem);
98
+ /* 3rem sits beyond the theme scale (--space-40 ends it); the token
99
+ * name documents the intent, the fallback keeps the rendered size. */
100
+ padding: var(--space-48, 3rem) var(--space-8, 0.5rem);
86
101
  text-align: center;
87
- font-size: 0.875rem;
102
+ font-size: var(--text-base, 0.875rem);
88
103
  color: var(--hi-color-text-secondary, #666);
89
104
  }
90
105
 
91
- .hk-kw-search-result-semantic {
92
- display: block;
93
- }
94
-
95
106
  .hk-kw-search-semantic {
96
107
  display: flex;
97
108
  flex-direction: column;
98
- gap: var(--hi-space-4, 0.25rem);
109
+ gap: var(--space-4, 0.25rem);
99
110
  min-width: 0;
100
111
  }
101
112
 
@@ -103,11 +114,11 @@
103
114
  display: flex;
104
115
  align-items: baseline;
105
116
  justify-content: space-between;
106
- gap: var(--hi-space-8, 0.5rem);
117
+ gap: var(--space-8, 0.5rem);
107
118
  }
108
119
 
109
120
  .hk-kw-search-semantic-title {
110
- font-size: 0.875rem;
121
+ font-size: var(--text-base, 0.875rem);
111
122
  font-weight: 600;
112
123
  color: var(--hi-color-text-primary, #333);
113
124
  overflow: hidden;
@@ -117,17 +128,17 @@
117
128
 
118
129
  .hk-kw-search-semantic-score {
119
130
  flex-shrink: 0;
120
- font-size: var(--hi-text-xs, 0.75rem);
131
+ font-size: var(--text-xs, 0.75rem);
121
132
  font-variant-numeric: tabular-nums;
122
133
  color: var(--hi-color-primary, #58a6ff);
123
- background: rgba(88, 166, 255, 0.12);
124
- padding: 0 var(--hi-space-6, 0.375rem);
134
+ background: color-mix(in srgb, var(--hi-color-primary, #58a6ff) 12%, transparent);
135
+ padding: 0 var(--space-6, 0.375rem);
125
136
  border-radius: var(--hi-radius-sm, 0.25rem);
126
137
  line-height: 1.5;
127
138
  }
128
139
 
129
140
  .hk-kw-search-semantic-snippet {
130
- font-size: var(--hi-text-xs, 0.75rem);
141
+ font-size: var(--text-xs, 0.75rem);
131
142
  color: var(--hi-color-text-secondary, #666);
132
143
  line-height: 1.5;
133
144
  display: -webkit-box;
@@ -139,11 +150,11 @@
139
150
 
140
151
  .hk-kw-search-semantic-source {
141
152
  align-self: flex-start;
142
- font-size: var(--hi-text-xs, 0.75rem);
153
+ font-size: var(--text-xs, 0.75rem);
143
154
  text-transform: uppercase;
144
155
  letter-spacing: 0.04em;
145
156
  color: var(--hi-color-text-secondary, #666);
146
- background: rgba(0, 0, 0, 0.04);
147
- padding: 0 var(--hi-space-6, 0.375rem);
157
+ background: rgb(var(--color-border) / 4%);
158
+ padding: 0 var(--space-6, 0.375rem);
148
159
  border-radius: var(--hi-radius-sm, 0.25rem);
149
160
  }
@@ -9,16 +9,16 @@
9
9
 
10
10
  .hk-label {
11
11
  display: inline;
12
- font-size: var(--hi-text-base, 0.875rem);
12
+ font-size: var(--text-base, 0.875rem);
13
13
  line-height: 1.5;
14
14
  color: var(--hi-color-text-primary, #333);
15
15
 
16
16
  &.hk-label-sm {
17
- font-size: var(--hi-text-xs, 0.75rem);
17
+ font-size: var(--text-xs, 0.75rem);
18
18
  }
19
19
 
20
20
  &.hk-label-lg {
21
- font-size: var(--hi-text-md, 1rem);
21
+ font-size: var(--text-md, 1rem);
22
22
  }
23
23
 
24
24
  a {
@@ -30,5 +30,10 @@
30
30
  &:hover {
31
31
  text-decoration: underline;
32
32
  }
33
+
34
+ &:focus-visible {
35
+ outline: 2px solid color-mix(in srgb, var(--hi-color-primary, #58a6ff) 55%, transparent);
36
+ outline-offset: 2px;
37
+ }
33
38
  }
34
39
  }
@@ -1,4 +1,9 @@
1
- .hk-list-move {
1
+ /* FLIP move: vue applies `${name}-move` (runtime-dom resolves moveClass
2
+ * as `${name}-move`), never a bare `.hk-list-move`. pop/slide/fade share
3
+ * the normal duration; grow/reveal define their staggered bases below. */
4
+ .hk-list-pop-move,
5
+ .hk-list-slide-move,
6
+ .hk-list-fade-move {
2
7
  transition: transform var(--hi-duration-normal, 0.3s) ease;
3
8
  }
4
9
 
@@ -52,6 +57,16 @@
52
57
  transform: translateX(12px);
53
58
  }
54
59
 
60
+ /* RTL: reading direction flips, so slide enters from the right and
61
+ * exits to the left (HkBreadcrumb/HkBlockingToast [dir="rtl"] form). */
62
+ [dir="rtl"] .hk-list-slide-enter-from {
63
+ transform: translateX(12px);
64
+ }
65
+
66
+ [dir="rtl"] .hk-list-slide-leave-to {
67
+ transform: translateX(-12px);
68
+ }
69
+
55
70
  .hk-list-fade-enter-active {
56
71
  transition: opacity var(--hi-duration-normal, 0.3s) ease;
57
72
  }
@@ -25,6 +25,16 @@
25
25
  background: linear-gradient(to left, transparent, rgb(var(--color-muted) / 35%));
26
26
  }
27
27
 
28
+ /* The flex row flips in RTL, so the hairlines mirror too: transparent
29
+ * stays on the outer edge, muted towards the central control. */
30
+ [dir="rtl"] .hk-load-more-rule {
31
+ background: linear-gradient(to left, transparent, rgb(var(--color-muted) / 35%));
32
+ }
33
+
34
+ [dir="rtl"] .hk-load-more-rule-end {
35
+ background: linear-gradient(to right, transparent, rgb(var(--color-muted) / 35%));
36
+ }
37
+
28
38
  .hk-load-more-core {
29
39
  flex: none;
30
40
  display: inline-flex;
@@ -39,7 +49,7 @@
39
49
  font-size: var(--text-2xs);
40
50
  font-variant-numeric: tabular-nums;
41
51
  letter-spacing: 0.04em;
42
- color: rgb(var(--color-text-tertiary));
52
+ transition: opacity 200ms ease;
43
53
  }
44
54
 
45
55
  .hk-load-more[data-state="loading"] .hk-load-more-count {
@@ -49,5 +59,4 @@
49
59
  .hk-load-more-end {
50
60
  font-size: var(--text-2xs);
51
61
  letter-spacing: 0.08em;
52
- color: rgb(var(--color-text-tertiary));
53
62
  }
@@ -20,7 +20,6 @@
20
20
  * keep focus inside the input. */
21
21
  .hk-localized-input-chip {
22
22
  padding: 0;
23
- border-radius: var(--radius-sm, 999px);
24
23
  background: transparent;
25
24
  color: rgb(var(--color-muted));
26
25
 
@@ -54,26 +53,27 @@
54
53
  * The base HkInput box flows affixes as a flex ROW (single-line input
55
54
  * absolutely positioned over the box) — but a textarea-type element is
56
55
  * in-flow, so the language chip would land BELOW the field. Pin it to
57
- * the field's top-right corner instead and keep every text line clear
58
- * of the chip column via the measured affix width. */
56
+ * the field's top inline-end corner instead and keep every text line
57
+ * clear of the chip column via the measured affix width. Logical
58
+ * properties throughout: the pinned chips and the textarea clearance
59
+ * mirror with the writing direction, matching the base field's
60
+ * logical padding-inline / margin-inline-start affix layout. */
59
61
  .hk-localized-input[data-multiline] {
60
62
  .hk-input-affix.hk-input-suffix {
61
63
  position: absolute;
62
- top: 6px;
63
- right: var(--space-8, 8px);
64
- margin-inline-start: 0;
64
+ top: var(--space-6, 6px);
65
+ inset-inline-end: var(--space-8, 8px);
65
66
  }
66
67
 
67
68
  .hk-input-affix.hk-input-prefix {
68
69
  position: absolute;
69
- top: 6px;
70
- left: var(--space-8, 8px);
71
- margin-inline-end: 0;
70
+ top: var(--space-6, 6px);
71
+ inset-inline-start: var(--space-8, 8px);
72
72
  }
73
73
 
74
74
  .hk-input-element.hk-input-textarea {
75
- padding-right: calc(var(--space-12, 12px) + var(--hk-input-affix-end-w, 0px));
76
- padding-left: calc(var(--space-12, 12px) + var(--hk-input-affix-start-w, 0px));
75
+ padding-inline-end: calc(var(--space-12, 12px) + var(--hk-input-affix-end-w, 0px));
76
+ padding-inline-start: calc(var(--space-12, 12px) + var(--hk-input-affix-start-w, 0px));
77
77
  }
78
78
  }
79
79
 
@@ -29,9 +29,21 @@
29
29
  color: rgb(var(--color-muted));
30
30
  font-size: var(--text-xs, 0.75rem);
31
31
  cursor: pointer;
32
+ /* Declared here on purpose: these s-log classes intentionally escape
33
+ * the `button:where(:not([class^="hk-"])…)` element baseline (base.scss),
34
+ * which currently supplies their transition/focus ring only by accident
35
+ * of the hk- exclusion — do not lean on it. */
36
+ transition: background 200ms ease, color 200ms ease, border-color 200ms ease,
37
+ box-shadow 200ms ease, opacity 200ms ease;
32
38
  }
33
39
 
34
- .s-log-tab:hover:not([data-active]) {
40
+ .s-log-tab:focus-visible {
41
+ outline: none;
42
+ box-shadow: 0 0 0 2px rgb(var(--color-surface)), 0 0 0 4px rgb(var(--color-primary));
43
+ }
44
+
45
+ .s-log-tab:hover:not([data-active]),
46
+ .s-log-btn:hover:not([data-active]) {
35
47
  background: rgb(var(--color-primary) / 12%);
36
48
  color: rgb(var(--color-text));
37
49
  }
@@ -51,6 +63,10 @@
51
63
  display: inline-flex;
52
64
  align-items: center;
53
65
  justify-content: center;
66
+ /* Reset the element-baseline button padding (base.scss button-base
67
+ * reaches these non-hk buttons): 0.5rem/1rem inside the fixed 1.75rem
68
+ * border-box collapses the content box and off-centers the icon. */
69
+ padding: 0;
54
70
  width: 1.75rem;
55
71
  height: 1.75rem;
56
72
  border: 1px solid var(--border-faint, rgb(var(--color-border) / 12%));
@@ -58,11 +74,13 @@
58
74
  background: rgb(var(--color-surface));
59
75
  color: rgb(var(--color-muted));
60
76
  cursor: pointer;
77
+ transition: background 200ms ease, color 200ms ease, border-color 200ms ease,
78
+ box-shadow 200ms ease, opacity 200ms ease;
61
79
  }
62
80
 
63
- .s-log-btn:hover:not([data-active]) {
64
- background: rgb(var(--color-primary) / 12%);
65
- color: rgb(var(--color-text));
81
+ .s-log-btn:focus-visible {
82
+ outline: none;
83
+ box-shadow: 0 0 0 2px rgb(var(--color-surface)), 0 0 0 4px rgb(var(--color-primary));
66
84
  }
67
85
 
68
86
  .s-log-btn[data-active] {
@@ -13,6 +13,14 @@ a.hk-logo {
13
13
  text-decoration: none;
14
14
  }
15
15
 
16
+ /* Keyboard parity (HkButton double ring): the anchor variant otherwise
17
+ * falls back to the rectangular UA outline. The div variant never
18
+ * matches :focus-visible (not focusable without a tsx tabindex). */
19
+ a.hk-logo:focus-visible {
20
+ outline: none;
21
+ box-shadow: 0 0 0 2px rgb(var(--color-surface)), 0 0 0 4px rgb(var(--color-primary));
22
+ }
23
+
16
24
  .hk-logo-img {
17
25
  display: block;
18
26
  border-radius: var(--hi-radius-md, 8px);
@@ -23,14 +31,15 @@ a.hk-logo {
23
31
  display: flex;
24
32
  align-items: center;
25
33
  justify-content: center;
26
- background: var(--hi-color-primary);
34
+ /* Contract token with hex fallback (house idiom). No radius here: the
35
+ * only render site is inside .hk-logo, whose matching border-radius +
36
+ * overflow: hidden already clip this exactly-fitting child. */
37
+ background: var(--hi-color-primary, #58a6ff);
27
38
  color: rgb(var(--color-on-solid-text, 255 255 255));
28
- border-radius: var(--hi-radius-md, 8px);
29
39
  }
30
40
 
31
41
  .hk-logo-initial {
32
42
  font-weight: 700;
33
43
  font-size: 50%;
34
44
  line-height: 1;
35
- user-select: none;
36
45
  }