@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
@@ -4,12 +4,12 @@
4
4
  // transient toasts read as one stack; the card itself follows the toast
5
5
  // item conventions (variant background, icon column, clamped message)
6
6
  // with a button row appended. Pointer events pass through the column
7
- // and re-enable on the card, exactly like toasts.
7
+ // and re-enable on the per-card slot, exactly like toasts.
8
8
 
9
9
  .hk-blocking-toast-container {
10
10
  position: fixed;
11
11
  top: 4rem;
12
- right: 1rem;
12
+ inset-inline-end: 1rem;
13
13
  z-index: var(--hk-z-toast, 4000);
14
14
  max-width: 24rem;
15
15
  pointer-events: none;
@@ -19,7 +19,7 @@
19
19
  position: relative;
20
20
  display: flex;
21
21
  flex-direction: column;
22
- gap: var(--hi-space-12, 12px);
22
+ gap: var(--space-12, 12px);
23
23
  }
24
24
 
25
25
  .hk-blocking-toast-slot {
@@ -30,13 +30,12 @@
30
30
  .hk-blocking-toast-card {
31
31
  display: flex;
32
32
  align-items: flex-start;
33
- gap: var(--hi-space-8, 8px);
34
- padding: var(--hi-space-12, 12px) var(--hi-space-16, 16px);
33
+ gap: var(--space-8, 8px);
34
+ padding: var(--space-12, 12px) var(--space-16, 16px);
35
35
  border-radius: var(--hi-radius-sm, 4px);
36
- font-size: var(--hi-text-base, 0.875rem);
36
+ font-size: var(--text-base, 0.875rem);
37
37
  line-height: 1.4;
38
38
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
39
- pointer-events: auto;
40
39
  backdrop-filter: blur(12px);
41
40
  }
42
41
 
@@ -53,11 +52,10 @@
53
52
  min-width: 0;
54
53
  display: flex;
55
54
  flex-direction: column;
56
- gap: var(--hi-space-8, 8px);
55
+ gap: var(--space-8, 8px);
57
56
  }
58
57
 
59
58
  .hk-blocking-toast-title {
60
- font-size: 1em;
61
59
  font-weight: 700;
62
60
  }
63
61
 
@@ -73,7 +71,7 @@
73
71
  .hk-blocking-toast-actions {
74
72
  display: flex;
75
73
  justify-content: flex-end;
76
- gap: var(--hi-space-8, 8px);
74
+ gap: var(--space-8, 8px);
77
75
  }
78
76
 
79
77
  // Variant backgrounds follow the HkToast conventions (including the
@@ -118,6 +116,25 @@
118
116
  transform: translateX(1rem);
119
117
  }
120
118
 
119
+ // RTL: the fixed column sits at the inline-end (physical left) side, so
120
+ // the slide direction flips with it (house pattern: HkTimeline.scss).
121
+ // The leave-pin contract writes physical right/top inline, which within
122
+ // the shrink-to-fit column is edge-agnostic (slot width == column width).
123
+ [dir="rtl"] .hk-blocking-toast-enter-from,
124
+ [dir="rtl"] .hk-blocking-toast-leave-to {
125
+ transform: translateX(-1rem);
126
+ }
127
+
121
128
  .hk-blocking-toast-move {
122
129
  transition: transform var(--hi-duration-normal, 0.3s) ease;
123
130
  }
131
+
132
+ // Reduced motion: drop the slide/FLIP choreography, cards snap in and
133
+ // out (house pattern: HkListTransition.scss / HkExpansionPanel.scss).
134
+ @media (prefers-reduced-motion: reduce) {
135
+ .hk-blocking-toast-enter-active,
136
+ .hk-blocking-toast-leave-active,
137
+ .hk-blocking-toast-move {
138
+ transition: none;
139
+ }
140
+ }
@@ -37,10 +37,8 @@
37
37
  pointer-events: none;
38
38
  }
39
39
 
40
- .hk-board-edge {
41
- fill: none;
42
- stroke-linecap: round;
43
- }
40
+ // Edge ink (fill/stroke/linecap) is set as presentation attributes on every
41
+ // emitted path (HkBoard.tsx) — no CSS declaration here, only per-edge attrs.
44
42
 
45
43
  .hk-board-node {
46
44
  position: absolute;
@@ -63,8 +61,9 @@
63
61
  justify-content: center;
64
62
  padding: 0 var(--space-6);
65
63
  box-sizing: border-box;
64
+ // NOTE: no text-overflow here — the shell is a flex container, ellipsis
65
+ // only renders on block containers; clipping is owned by overflow: hidden.
66
66
  overflow: hidden;
67
- text-overflow: ellipsis;
68
67
  white-space: nowrap;
69
68
  font-size: var(--text-2xs);
70
69
  color: rgb(var(--color-text));
@@ -72,12 +71,33 @@
72
71
  border: 1px solid rgb(var(--color-primary) / 45%);
73
72
  border-radius: var(--radius-sm);
74
73
  box-shadow: var(--shadow-elevated);
74
+ transition:
75
+ border-color 200ms ease,
76
+ box-shadow 200ms ease;
77
+
78
+ // Every visible node is click-interactive (HkBoard.tsx emits `nodeClick`
79
+ // on a short tap for draggable and read-only nodes alike), so the shell
80
+ // carries hover/press emphasis. The press ring draws INSIDE the border
81
+ // box (HkSelectionGrid model) so overlapping chrome cannot shave it.
82
+ &:hover {
83
+ border-color: rgb(var(--color-primary) / 80%);
84
+ }
85
+
86
+ &:active {
87
+ box-shadow:
88
+ var(--shadow-elevated),
89
+ inset 0 0 0 1px rgb(var(--color-primary) / 45%);
90
+ }
75
91
  }
76
92
 
77
93
  .hk-board-minimap {
78
94
  position: absolute;
79
- right: var(--space-10);
95
+ // Logical property: the corner dock mirrors in RTL (same spot in LTR).
96
+ inset-inline-end: var(--space-10);
80
97
  bottom: var(--space-10);
81
98
  z-index: 6;
99
+ // Defensive re-enable (the inner HkMinimap root asserts it too,
100
+ // HkMinimap.scss:15): keeps the dock alive if a host ever parks the
101
+ // board under an ancestor `pointer-events: none`.
82
102
  pointer-events: auto;
83
103
  }
@@ -28,7 +28,7 @@
28
28
  line-height: 1.5;
29
29
 
30
30
  // Gap
31
- gap: 0.5rem;
31
+ gap: var(--space-8);
32
32
  }
33
33
 
34
34
  // ------
@@ -46,27 +46,6 @@
46
46
  // Position
47
47
  position: relative;
48
48
 
49
- // Not the last item
50
- &:not(:last-child) {
51
- // Separator
52
- .hk-breadcrumb-separator {
53
- margin-left: 0.5rem;
54
- color: var(--hi-color-text-secondary);
55
- opacity: 0.5;
56
- // DISABLED - migrated to JS animation
57
-
58
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
59
-
60
- // Glow effect on separator
61
- filter: drop-shadow(0 0 4px var(--hi-primary));
62
-
63
- svg {
64
- width: 1rem;
65
- height: 1rem;
66
- }
67
- }
68
- }
69
-
70
49
  // Last item (current page)
71
50
  &:last-child {
72
51
  .hk-breadcrumb-link {
@@ -91,59 +70,57 @@
91
70
  text-decoration: none;
92
71
  white-space: nowrap;
93
72
 
94
- // Cursor
95
- cursor: pointer;
96
-
97
- // Transitions
98
- // DISABLED - migrated to JS animation
99
-
100
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
73
+ // Transitions — house convention (200ms ease on color/background/
74
+ // box-shadow, cf. HkSelectionGrid). The old value was commented out as
75
+ // "migrated to JS animation", but HkBreadcrumb.tsx ships no animation
76
+ // code, so hover/focus snapped.
77
+ transition:
78
+ color 200ms ease,
79
+ background 200ms ease,
80
+ box-shadow 200ms ease,
81
+ filter 200ms ease;
101
82
 
102
83
  // Padding
103
- padding: 0.25rem 0.5rem;
104
- margin: -0.25rem -0.5rem;
84
+ padding: var(--space-4) var(--space-8);
85
+ margin: calc(-1 * var(--space-4)) calc(-1 * var(--space-8));
105
86
  border-radius: vars.$hikari-radius-fui-sm;
106
87
 
107
88
  // Display
108
89
  display: inline-flex;
109
90
  align-items: center;
110
- gap: 0.375rem;
91
+ gap: var(--space-6);
111
92
 
112
- // Icon
113
- .hk-breadcrumb-icon {
114
- flex-shrink: 0;
115
- width: 1rem;
116
- height: 1rem;
117
- // DISABLED - migrated to JS animation
93
+ // Interactive affordance only for REAL links: items without `to` render
94
+ // as a <span class="hk-breadcrumb-link"> (HkBreadcrumb.tsx) — a pointer
95
+ // cursor + hover fill on that dead span read as a broken link.
96
+ &[href] {
97
+ cursor: pointer;
118
98
 
119
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
99
+ // Hover state
100
+ &:hover {
101
+ color: var(--hi-color-text-primary);
102
+ background: var(--hi-primary);
120
103
 
121
- svg {
122
- width: 100%;
123
- height: 100%;
104
+ // Glow effect on text
105
+ text-shadow: 0 0 8px var(--hi-primary);
124
106
  }
125
- }
126
107
 
127
- // Hover state
128
- &:hover {
129
- color: var(--hi-color-text-primary);
130
- background: var(--hi-primary);
131
-
132
- .hk-breadcrumb-icon {
133
- color: var(--hi-color-primary);
134
- filter: drop-shadow(0 0 4px var(--hi-primary));
108
+ // Press feedback (house idiom: HkButton brightness dip)
109
+ &:active {
110
+ filter: brightness(0.95);
135
111
  }
136
-
137
- // Glow effect on text
138
- text-shadow: 0 0 8px var(--hi-primary);
139
112
  }
140
113
 
141
- // Active/focus state
114
+ // Keyboard focus (spans are not focusable, so <a href> only): house
115
+ // double ring (HkButton pattern). The former single 2px primary ring
116
+ // shared its ink with the focus fill and merged into it / got shaved
117
+ // per-side by overlapping chrome.
142
118
  &:focus-visible {
143
119
  outline: none;
144
120
  background: var(--hi-primary);
145
121
  box-shadow:
146
- 0 0 0 2px var(--hi-primary),
122
+ 0 0 0 2px rgb(var(--color-surface)),
123
+ 0 0 0 4px rgb(var(--color-primary)),
147
124
  0 0 12px var(--hi-primary);
148
125
  }
149
126
 
@@ -158,65 +135,38 @@
158
135
  // Breadcrumb Separator
159
136
  // ------
160
137
 
138
+ // Separator styling lives at TOP LEVEL, not scoped under
139
+ // `.hk-breadcrumb-item:not(:last-child)` — every rendered separator sits in
140
+ // a non-last item (HkBreadcrumb.tsx renders it only for index < len-1), and
141
+ // the deeper base specificity made the sm/lg size overrides below
142
+ // cascade-dead. Spacing uses a logical property so it mirrors in RTL.
161
143
  .hk-breadcrumb-separator {
162
144
  // Layout
163
145
  display: inline-flex;
164
146
  align-items: center;
165
147
 
166
148
  // Typography
167
- font-size: 0.875rem;
168
-
169
- // Transitions
170
- // DISABLED - migrated to JS animation
149
+ font-size: var(--text-base);
171
150
 
172
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
173
-
174
- // Custom separator glow
175
- &.hk-breadcrumb-separator-glow {
176
- color: var(--hi-color-primary);
177
- opacity: 0.8;
178
- filter: drop-shadow(0 0 6px var(--hi-primary));
179
- }
180
- }
181
-
182
- // ------
183
- // Separator Variants
184
- // ------
185
-
186
- // Slash separator
187
- .hk-breadcrumb-separator-slash {
188
- &::before {
189
- content: '/';
190
- }
191
- }
151
+ // Spacing
152
+ margin-inline-start: var(--space-8);
153
+ color: var(--hi-color-text-secondary);
154
+ opacity: 0.5;
192
155
 
193
- // Arrow separator
194
- .hk-breadcrumb-separator-arrow {
195
- &::before {
196
- content: '›';
197
- font-size: 1.1em;
198
- }
199
- }
156
+ // Glow effect on separator
157
+ filter: drop-shadow(0 0 4px var(--hi-primary));
200
158
 
201
- // Double arrow separator
202
- .hk-breadcrumb-separator-double-arrow {
203
- &::before {
204
- content: '»';
205
- font-size: 0.9em;
159
+ svg {
160
+ width: 1rem;
161
+ height: 1rem;
206
162
  }
207
163
  }
208
164
 
209
- // Chevron separator (default with icon)
210
- .hk-breadcrumb-separator-chevron {
211
- // Uses chevron-right icon
212
- }
213
-
214
- // Dot separator
215
- .hk-breadcrumb-separator-dot {
216
- &::before {
217
- content: '•';
218
- font-size: 1.2em;
219
- }
165
+ // RTL mirrors the chevron: the tsx always renders a right-pointing glyph,
166
+ // which reads backwards on the flipped axis (HkTimeline precedent —
167
+ // scaleX mirrors paint only; the box is symmetric around its center).
168
+ [dir="rtl"] .hk-breadcrumb-separator svg {
169
+ transform: scaleX(-1);
220
170
  }
221
171
 
222
172
  // ------
@@ -234,15 +184,12 @@
234
184
  // Layout
235
185
  display: inline-flex;
236
186
  align-items: center;
237
- gap: 0.25rem;
187
+ gap: var(--space-4);
238
188
 
239
189
  // Arrow icon
240
190
  .hk-breadcrumb-dropdown-arrow {
241
191
  width: 0.75rem;
242
192
  height: 0.75rem;
243
- // DISABLED - migrated to JS animation
244
-
245
- // transition: transform vars.$hikari-duration-fast vars.$hikari-ease-smooth;
246
193
 
247
194
  svg {
248
195
  width: 100%;
@@ -277,12 +224,7 @@
277
224
  0 0 0 1px var(--hi-white-5, rgba(255, 255, 255, 0.05)) inset;
278
225
 
279
226
  // Padding
280
- padding: 0.5rem;
281
-
282
- // Transitions
283
- // DISABLED - migrated to JS animation
284
-
285
- // transition: all vars.$hikari-duration-normal vars.$hikari-ease-smooth;
227
+ padding: var(--space-8);
286
228
 
287
229
  // Animation
288
230
  opacity: 0;
@@ -312,62 +254,30 @@
312
254
  @include mi.item;
313
255
 
314
256
  // Spacing
315
- margin: 0.125rem 0;
257
+ margin: var(--space-2) 0;
316
258
 
317
- // Typography
318
- color: var(--hi-color-text-primary);
259
+ // Typography — the mixin owns the row ink (rgb(var(--color-text) / 88%));
260
+ // the former full-opacity color here silently defeated it in-rule.
319
261
  text-decoration: none;
320
262
  white-space: nowrap;
321
263
  }
322
264
 
323
- // ------
324
- // Icon Styles
325
- // ------
326
-
327
- .hk-breadcrumb-icon {
328
- // Layout
329
- display: inline-flex;
330
- align-items: center;
331
-
332
- // Size
333
- width: 1rem;
334
- height: 1rem;
335
-
336
- // Color
337
- color: var(--hi-color-text-secondary);
338
-
339
- // Transitions
340
- // DISABLED - migrated to JS animation
341
-
342
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
343
-
344
- svg {
345
- width: 100%;
346
- height: 100%;
347
- }
348
- }
349
-
350
265
  // ------
351
266
  // Size Variants
352
267
  // ------
353
268
 
354
269
  .hk-breadcrumb-sm {
355
- font-size: 0.75rem;
356
- gap: 0.375rem;
270
+ font-size: var(--text-xs);
271
+ gap: var(--space-6);
357
272
 
358
273
  .hk-breadcrumb-link {
359
- padding: 0.125rem 0.375rem;
360
- margin: -0.125rem -0.375rem;
361
-
362
- .hk-breadcrumb-icon {
363
- width: 0.875rem;
364
- height: 0.875rem;
365
- }
274
+ padding: var(--space-2) var(--space-6);
275
+ margin: calc(-1 * var(--space-2)) calc(-1 * var(--space-6));
366
276
  }
367
277
 
368
278
  .hk-breadcrumb-separator {
369
- margin-left: 0.375rem;
370
- font-size: 0.75rem;
279
+ margin-inline-start: var(--space-6);
280
+ font-size: var(--text-xs);
371
281
 
372
282
  svg {
373
283
  width: 0.875rem;
@@ -376,28 +286,21 @@
376
286
  }
377
287
  }
378
288
 
379
- .hk-breadcrumb-md {
380
- font-size: vars.$hikari-font-size-sm;
381
- gap: 0.5rem;
382
- }
289
+ // NOTE: no .hk-breadcrumb-md rule — the tsx always applies the md class
290
+ // (default size) and it restated the base values exactly.
383
291
 
384
292
  .hk-breadcrumb-lg {
385
- font-size: 1rem;
386
- gap: 0.625rem;
293
+ font-size: var(--text-md);
294
+ gap: var(--space-10);
387
295
 
388
296
  .hk-breadcrumb-link {
389
- padding: 0.375rem 0.625rem;
390
- margin: -0.375rem -0.625rem;
391
-
392
- .hk-breadcrumb-icon {
393
- width: 1.125rem;
394
- height: 1.125rem;
395
- }
297
+ padding: var(--space-6) var(--space-10);
298
+ margin: calc(-1 * var(--space-6)) calc(-1 * var(--space-10));
396
299
  }
397
300
 
398
301
  .hk-breadcrumb-separator {
399
- margin-left: 0.625rem;
400
- font-size: 1rem;
302
+ margin-inline-start: var(--space-10);
303
+ font-size: var(--text-md);
401
304
 
402
305
  svg {
403
306
  width: 1.125rem;
@@ -418,9 +321,6 @@
418
321
  background: var(--hi-card-bg);
419
322
  padding: 0.375rem 0.75rem;
420
323
  border-radius: vars.$hikari-radius-fui-sm;
421
- // DISABLED - migrated to JS animation
422
-
423
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
424
324
 
425
325
  &:not(:last-child):hover {
426
326
  background: var(--hi-primary);
@@ -442,19 +342,16 @@
442
342
  padding: 0.375rem 0.875rem;
443
343
  border-radius: 999px;
444
344
  border: 1px solid var(--hi-color-border);
445
- // DISABLED - migrated to JS animation
446
-
447
- // transition: all vars.$hikari-duration-fast vars.$hikari-ease-smooth;
448
345
 
449
- &:not(:last-child) {
450
- &:hover {
451
- background: var(--hi-primary);
452
- border-color: var(--hi-primary);
453
- }
346
+ &:not(:last-child):hover {
347
+ background: var(--hi-primary);
348
+ border-color: var(--hi-primary);
454
349
  }
455
350
 
351
+ // Solid fill: the former linear-gradient(135deg, primary, primary) had
352
+ // identical stops and rendered exactly this solid.
456
353
  &:last-child {
457
- background: linear-gradient(135deg, var(--hi-primary), var(--hi-primary));
354
+ background: var(--hi-primary);
458
355
  border-color: var(--hi-primary);
459
356
  box-shadow:
460
357
  0 0 12px var(--hi-primary),
@@ -463,29 +360,6 @@
463
360
  }
464
361
  }
465
362
 
466
- // ------
467
- // Separator Animations
468
- // ------
469
-
470
- // Animated separator (pulsing glow)
471
- .hk-breadcrumb-separator-animated {
472
- // DISABLED - migrated to JS animation
473
-
474
- // animation: breadcrumb-separator-pulse 2s ease-in-out infinite;
475
- }
476
-
477
- // DISABLED - migrated to JS animation
478
- // @keyframes breadcrumb-separator-pulse {
479
- // 0%, 100% {
480
- // opacity: 0.5;
481
- // filter: drop-shadow(0 0 4px var(--hi-primary));
482
- // }
483
- // 50% {
484
- // opacity: 1;
485
- // filter: drop-shadow(0 0 8px var(--hi-primary));
486
- // }
487
- // }
488
-
489
363
  // ------
490
364
  // Collapsible Breadcrumb (for mobile)
491
365
  // ------
@@ -508,73 +382,13 @@
508
382
  }
509
383
  }
510
384
 
511
- // ------
512
- // Animations
513
- // ------
514
-
515
- // Fade-in animation
516
- .hk-breadcrumb-animate-in {
517
- .hk-breadcrumb-item {
518
- opacity: 0;
519
- // DISABLED - migrated to JS animation
520
-
521
- // animation: breadcrumb-fade-in vars.$hikari-duration-normal vars.$hikari-ease-smooth forwards;
522
-
523
- @for $i from 1 through 10 {
524
- &:nth-child(#{$i}) {
525
- animation-delay: #{$i * 0.1s};
526
- }
527
- }
528
- }
529
- }
530
-
531
- // DISABLED - migrated to JS animation
532
- // @keyframes breadcrumb-fade-in {
533
- // from {
534
- // opacity: 0;
535
- // transform: translateY(-4px);
536
- // }
537
- // to {
538
- // opacity: 1;
539
- // transform: translateY(0);
540
- // }
541
- // }
542
-
543
- // Slide-in animation
544
- .hk-breadcrumb-slide-in {
545
- .hk-breadcrumb-item {
546
- opacity: 0;
547
- // DISABLED - migrated to JS animation
548
-
549
- // animation: breadcrumb-slide-in vars.$hikari-duration-normal vars.$hikari-ease-smooth forwards;
550
-
551
- @for $i from 1 through 10 {
552
- &:nth-child(#{$i}) {
553
- animation-delay: #{$i * 0.08s};
554
- }
555
- }
556
- }
557
- }
558
-
559
- // DISABLED - migrated to JS animation
560
- // @keyframes breadcrumb-slide-in {
561
- // from {
562
- // opacity: 0;
563
- // transform: translateX(-8px);
564
- // }
565
- // to {
566
- // opacity: 1;
567
- // transform: translateX(0);
568
- // }
569
- // }
570
-
571
385
  // ------
572
386
  // Custom Colors
573
387
  // ------
574
388
 
575
389
  .hk-breadcrumb-primary {
576
390
  .hk-breadcrumb-link {
577
- &:hover {
391
+ &[href]:hover {
578
392
  color: var(--hi-color-primary);
579
393
  text-shadow: 0 0 8px var(--hi-color-primary);
580
394
  }
@@ -583,7 +397,7 @@
583
397
 
584
398
  .hk-breadcrumb-success {
585
399
  .hk-breadcrumb-link {
586
- &:hover {
400
+ &[href]:hover {
587
401
  color: var(--hi-color-success);
588
402
  text-shadow: 0 0 8px var(--hi-color-success);
589
403
  }
@@ -592,7 +406,7 @@
592
406
 
593
407
  .hk-breadcrumb-warning {
594
408
  .hk-breadcrumb-link {
595
- &:hover {
409
+ &[href]:hover {
596
410
  color: var(--hi-color-warning);
597
411
  text-shadow: 0 0 8px var(--hi-color-warning);
598
412
  }
@@ -601,7 +415,7 @@
601
415
 
602
416
  .hk-breadcrumb-danger {
603
417
  .hk-breadcrumb-link {
604
- &:hover {
418
+ &[href]:hover {
605
419
  color: var(--hi-color-danger);
606
420
  text-shadow: 0 0 8px var(--hi-color-danger);
607
421
  }