@helixui/library 1.1.2-next.1 → 1.1.2-next.10

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 (150) hide show
  1. package/custom-elements.json +252 -168
  2. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  3. package/dist/components/hx-action-bar/index.js +1 -1
  4. package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
  5. package/dist/components/hx-avatar/index.js +1 -1
  6. package/dist/components/hx-badge/hx-badge.styles.d.ts.map +1 -1
  7. package/dist/components/hx-badge/index.js +1 -1
  8. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts +1 -0
  9. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  10. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +35 -9
  11. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  12. package/dist/components/hx-breadcrumb/index.js +1 -1
  13. package/dist/components/hx-button/hx-button.d.ts +12 -6
  14. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  15. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  16. package/dist/components/hx-button/index.js +1 -1
  17. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +14 -6
  18. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  19. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  20. package/dist/components/hx-clinical-status/index.d.ts +1 -1
  21. package/dist/components/hx-clinical-status/index.d.ts.map +1 -1
  22. package/dist/components/hx-clinical-status/index.js +1 -1
  23. package/dist/components/hx-combobox/hx-combobox.d.ts +5 -0
  24. package/dist/components/hx-combobox/hx-combobox.d.ts.map +1 -1
  25. package/dist/components/hx-drawer/hx-drawer.d.ts +1 -0
  26. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  27. package/dist/components/hx-menu/hx-menu-item.d.ts +5 -0
  28. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  29. package/dist/components/hx-menu/hx-menu.d.ts +1 -0
  30. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  31. package/dist/components/hx-menu/hx-menu.styles.d.ts.map +1 -1
  32. package/dist/components/hx-menu/index.js +1 -1
  33. package/dist/components/hx-nav/hx-nav.d.ts +10 -0
  34. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  35. package/dist/components/hx-nav/index.js +1 -1
  36. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  37. package/dist/components/hx-pagination/index.js +1 -1
  38. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts +8 -0
  39. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts.map +1 -1
  40. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts.map +1 -1
  41. package/dist/components/hx-patient-banner/index.js +1 -1
  42. package/dist/components/hx-phi-field/hx-phi-field.d.ts +27 -2
  43. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  44. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
  45. package/dist/components/hx-phi-field/index.js +1 -1
  46. package/dist/components/hx-select/hx-select.d.ts +1 -0
  47. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  48. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  49. package/dist/components/hx-select/index.js +1 -1
  50. package/dist/components/hx-side-nav/hx-nav-item.d.ts +5 -0
  51. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  52. package/dist/components/hx-side-nav/hx-nav-item.styles.d.ts.map +1 -1
  53. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  54. package/dist/components/hx-side-nav/hx-side-nav.styles.d.ts.map +1 -1
  55. package/dist/components/hx-side-nav/index.js +1 -1
  56. package/dist/components/hx-slider/hx-slider.d.ts +1 -0
  57. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  58. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +17 -1
  59. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  60. package/dist/components/hx-status-indicator/hx-status-indicator.styles.d.ts.map +1 -1
  61. package/dist/components/hx-status-indicator/index.js +1 -1
  62. package/dist/components/hx-steps/hx-step.d.ts +7 -0
  63. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  64. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  65. package/dist/components/hx-steps/index.js +1 -1
  66. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  67. package/dist/components/hx-tabs/hx-tabs.d.ts +10 -0
  68. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  69. package/dist/components/hx-tabs/index.js +1 -1
  70. package/dist/components/hx-time-picker/hx-time-picker.d.ts +3 -0
  71. package/dist/components/hx-time-picker/hx-time-picker.d.ts.map +1 -1
  72. package/dist/components/hx-tree-view/hx-tree-item.d.ts +5 -0
  73. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  74. package/dist/components/hx-tree-view/hx-tree-view.d.ts +6 -0
  75. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  76. package/dist/components/hx-tree-view/index.js +1 -1
  77. package/dist/css/helix-all.css +222 -60
  78. package/dist/css/helix-core.css +58 -3
  79. package/dist/css/helix-feedback.css +33 -4
  80. package/dist/css/helix-forms.css +68 -41
  81. package/dist/css/helix-navigation.css +16 -7
  82. package/dist/css/hx-avatar.css +18 -1
  83. package/dist/css/hx-badge.css +6 -2
  84. package/dist/css/hx-button.css +34 -0
  85. package/dist/css/hx-clinical-status.css +4 -2
  86. package/dist/css/hx-menu.css +2 -0
  87. package/dist/css/hx-patient-banner.css +31 -3
  88. package/dist/css/hx-phi-field.css +12 -0
  89. package/dist/css/hx-select.css +68 -41
  90. package/dist/css/hx-side-nav.css +14 -7
  91. package/dist/css/hx-status-indicator.css +33 -4
  92. package/dist/css/index.css +1 -1
  93. package/dist/css/manifest.json +13 -5
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +17 -17
  97. package/dist/shared/{hx-action-bar-D4bulGQP.js → hx-action-bar-vGFnNwNY.js} +33 -34
  98. package/dist/shared/{hx-action-bar-D4bulGQP.js.map → hx-action-bar-vGFnNwNY.js.map} +1 -1
  99. package/dist/shared/{hx-avatar-7p1cj3lG.js → hx-avatar-CZfA9KEl.js} +27 -10
  100. package/dist/shared/hx-avatar-CZfA9KEl.js.map +1 -0
  101. package/dist/shared/{hx-badge-DCxvskdw.js → hx-badge-Xg7zoh4Q.js} +31 -27
  102. package/dist/shared/hx-badge-Xg7zoh4Q.js.map +1 -0
  103. package/dist/shared/{hx-breadcrumb-item-B2rjepqy.js → hx-breadcrumb-item-CObc-WJl.js} +8 -6
  104. package/dist/shared/hx-breadcrumb-item-CObc-WJl.js.map +1 -0
  105. package/dist/shared/{hx-button-6S3DwuIj.js → hx-button-CC1YH9RZ.js} +52 -12
  106. package/dist/shared/hx-button-CC1YH9RZ.js.map +1 -0
  107. package/dist/shared/{hx-clinical-status-De8yrA5I.js → hx-clinical-status-D6eaplvs.js} +5 -3
  108. package/dist/shared/hx-clinical-status-D6eaplvs.js.map +1 -0
  109. package/dist/shared/hx-combobox-CNAJXIxo.js.map +1 -1
  110. package/dist/shared/hx-drawer-e0qeGxAD.js.map +1 -1
  111. package/dist/shared/{hx-menu-divider-DR4G_rqw.js → hx-menu-divider-puPmRAdN.js} +40 -20
  112. package/dist/shared/hx-menu-divider-puPmRAdN.js.map +1 -0
  113. package/dist/shared/{hx-nav-D377Ngz4.js → hx-nav-CiyqaW2I.js} +112 -99
  114. package/dist/shared/hx-nav-CiyqaW2I.js.map +1 -0
  115. package/dist/shared/{hx-nav-item-ByU2N921.js → hx-nav-item-tM_6bolB.js} +161 -107
  116. package/dist/shared/hx-nav-item-tM_6bolB.js.map +1 -0
  117. package/dist/shared/{hx-pagination-DYhYPqDn.js → hx-pagination-Cb9UEWXz.js} +74 -66
  118. package/dist/shared/{hx-pagination-DYhYPqDn.js.map → hx-pagination-Cb9UEWXz.js.map} +1 -1
  119. package/dist/shared/{hx-patient-banner-BoJHddAL.js → hx-patient-banner-wk4qWmsH.js} +88 -47
  120. package/dist/shared/hx-patient-banner-wk4qWmsH.js.map +1 -0
  121. package/dist/shared/{hx-phi-field-EDWna59z.js → hx-phi-field-DX9z3nu0.js} +67 -33
  122. package/dist/shared/hx-phi-field-DX9z3nu0.js.map +1 -0
  123. package/dist/shared/{hx-select-4-nHL0vd.js → hx-select-BWzxWZs_.js} +82 -55
  124. package/dist/shared/hx-select-BWzxWZs_.js.map +1 -0
  125. package/dist/shared/hx-slider-7Q-e0_pc.js.map +1 -1
  126. package/dist/shared/{hx-status-indicator-4ClvA5mU.js → hx-status-indicator-Dl3Y34mc.js} +76 -35
  127. package/dist/shared/hx-status-indicator-Dl3Y34mc.js.map +1 -0
  128. package/dist/shared/{hx-step-DlANlr2A.js → hx-step-CmNwfcJx.js} +30 -26
  129. package/dist/shared/hx-step-CmNwfcJx.js.map +1 -0
  130. package/dist/shared/{hx-tab-panel-GGjk6Qg4.js → hx-tab-panel-Dnt8aA74.js} +89 -61
  131. package/dist/shared/hx-tab-panel-Dnt8aA74.js.map +1 -0
  132. package/dist/shared/hx-time-picker-BpCRsh_z.js.map +1 -1
  133. package/dist/shared/{hx-tree-item-DTDIBRrI.js → hx-tree-item-C1PhX-HE.js} +50 -19
  134. package/dist/shared/hx-tree-item-C1PhX-HE.js.map +1 -0
  135. package/package.json +3 -3
  136. package/dist/shared/hx-avatar-7p1cj3lG.js.map +0 -1
  137. package/dist/shared/hx-badge-DCxvskdw.js.map +0 -1
  138. package/dist/shared/hx-breadcrumb-item-B2rjepqy.js.map +0 -1
  139. package/dist/shared/hx-button-6S3DwuIj.js.map +0 -1
  140. package/dist/shared/hx-clinical-status-De8yrA5I.js.map +0 -1
  141. package/dist/shared/hx-menu-divider-DR4G_rqw.js.map +0 -1
  142. package/dist/shared/hx-nav-D377Ngz4.js.map +0 -1
  143. package/dist/shared/hx-nav-item-ByU2N921.js.map +0 -1
  144. package/dist/shared/hx-patient-banner-BoJHddAL.js.map +0 -1
  145. package/dist/shared/hx-phi-field-EDWna59z.js.map +0 -1
  146. package/dist/shared/hx-select-4-nHL0vd.js.map +0 -1
  147. package/dist/shared/hx-status-indicator-4ClvA5mU.js.map +0 -1
  148. package/dist/shared/hx-step-DlANlr2A.js.map +0 -1
  149. package/dist/shared/hx-tab-panel-GGjk6Qg4.js.map +0 -1
  150. package/dist/shared/hx-tree-item-DTDIBRrI.js.map +0 -1
@@ -450,11 +450,28 @@
450
450
  }
451
451
 
452
452
  /* P1-B: Windows High Contrast Mode — avatar background is stripped by the system,
453
- leaving no visual boundary. Add a border so the avatar remains perceivable.
453
+ leaving no visual boundary. Restore a visible border, explicit foreground, and
454
+ background so the avatar container, initials, and fallback icon all remain
455
+ perceivable at any contrast level.
454
456
  WCAG 1.4.11 Non-text Contrast (Level AA). */
455
457
  @media (forced-colors: active) {
456
458
  .avatar {
459
+ forced-color-adjust: none;
457
460
  border: 2px solid ButtonText;
461
+ background-color: Canvas;
462
+ color: CanvasText;
463
+ }
464
+
465
+ .avatar__initials {
466
+ color: CanvasText;
467
+ }
468
+
469
+ .avatar__fallback-icon {
470
+ color: CanvasText;
471
+ }
472
+
473
+ .avatar__image {
474
+ forced-color-adjust: auto;
458
475
  }
459
476
  }
460
477
  /* ── hx-badge ── */
@@ -578,17 +595,21 @@
578
595
  display: none;
579
596
  }
580
597
 
598
+ .badge--dot slot[name='prefix'] {
599
+ display: none;
600
+ }
601
+
581
602
  /* ─── Pulse Animation ─── */
582
603
 
583
604
  @keyframes hx-badge-pulse {
584
605
  0%,
585
606
  100% {
586
607
  opacity: 1;
587
- box-shadow: 0 0 0 0 var(--hx-badge-pulse-color, currentColor);
608
+ box-shadow: 0 0 0 2px var(--hx-badge-pulse-color, currentColor);
588
609
  }
589
610
  50% {
590
611
  opacity: var(--hx-opacity-75, 0.75);
591
- box-shadow: 0 0 0 4px transparent;
612
+ box-shadow: 0 0 0 6px transparent;
592
613
  }
593
614
  }
594
615
 
@@ -1132,6 +1153,40 @@
1132
1153
  .button__label {
1133
1154
  flex: 1 1 auto;
1134
1155
  }
1156
+
1157
+ /* ─── High Contrast Mode (forced-colors) ─── */
1158
+
1159
+ @media (forced-colors: active) {
1160
+ .button {
1161
+ /* Ensure button outline is visible in Windows High Contrast mode.
1162
+ ButtonText/ButtonFace are system colors recognized by the browser. */
1163
+ forced-color-adjust: none;
1164
+ background-color: ButtonFace;
1165
+ color: ButtonText;
1166
+ border: 2px solid ButtonText;
1167
+ }
1168
+
1169
+ .button:focus-visible {
1170
+ outline: 3px solid Highlight;
1171
+ outline-offset: 2px;
1172
+ }
1173
+
1174
+ .button[disabled] {
1175
+ background-color: ButtonFace;
1176
+ color: GrayText;
1177
+ border-color: GrayText;
1178
+ opacity: 1;
1179
+ }
1180
+
1181
+ :host([disabled]) {
1182
+ opacity: 1;
1183
+ }
1184
+
1185
+ .button--loading .button__spinner {
1186
+ /* Ensure spinner is visible in HCM */
1187
+ forced-color-adjust: auto;
1188
+ }
1189
+ }
1135
1190
  /* ── hx-button-group ── */
1136
1191
  :host {
1137
1192
  display: inline-flex;
@@ -2077,7 +2132,8 @@
2077
2132
  }
2078
2133
 
2079
2134
  .clinical-status__dismiss-button:focus-visible {
2080
- outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);
2135
+ outline: var(--hx-focus-ring-width, 2px) solid
2136
+ var(--hx-focus-ring-color, var(--hx-color-focus, #2563eb));
2081
2137
  outline-offset: var(--hx-focus-ring-offset, 2px);
2082
2138
  opacity: 1;
2083
2139
  }
@@ -2122,7 +2178,8 @@
2122
2178
  }
2123
2179
 
2124
2180
  .clinical-status__acknowledge-button:focus-visible {
2125
- outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);
2181
+ outline: var(--hx-focus-ring-width, 2px) solid
2182
+ var(--hx-focus-ring-color, var(--hx-color-focus, #2563eb));
2126
2183
  outline-offset: var(--hx-focus-ring-offset, 2px);
2127
2184
  }
2128
2185
 
@@ -4278,6 +4335,8 @@ export const helixGridItemStyles = css`
4278
4335
  0 2px 4px -2px rgb(0 0 0 / 0.1)
4279
4336
  );
4280
4337
  min-width: var(--hx-menu-min-width, 10rem);
4338
+ max-height: var(--hx-menu-max-height, 20rem);
4339
+ overflow-y: auto;
4281
4340
  outline: none;
4282
4341
  }
4283
4342
  /* ── hx-meter ── */
@@ -5226,6 +5285,7 @@ export const helixGridItemStyles = css`
5226
5285
  --_value-color: var(--hx-patient-banner-value-color, var(--hx-color-neutral-900, #111827));
5227
5286
  --_value-font-size: var(--hx-patient-banner-value-font-size, var(--hx-font-size-sm, 0.875rem));
5228
5287
  --_photo-size: var(--hx-patient-banner-photo-size, var(--hx-space-10, 2.5rem));
5288
+ --_photo-bg: var(--hx-patient-banner-photo-bg, var(--hx-color-neutral-200, #e5e7eb));
5229
5289
  }
5230
5290
 
5231
5291
  * {
@@ -5243,6 +5303,7 @@ export const helixGridItemStyles = css`
5243
5303
  border-bottom: var(--hx-border-width-thin, 1px) solid var(--_border-color);
5244
5304
  font-family: var(--_font-family);
5245
5305
  width: 100%;
5306
+ position: relative;
5246
5307
  }
5247
5308
 
5248
5309
  /* ─── Photo Area ─── */
@@ -5251,12 +5312,15 @@ export const helixGridItemStyles = css`
5251
5312
  flex-shrink: 0;
5252
5313
  width: var(--_photo-size);
5253
5314
  height: var(--_photo-size);
5315
+ /* Minimum 44x44px touch target for interactive photo content. */
5316
+ min-width: 44px;
5317
+ min-height: 44px;
5254
5318
  border-radius: var(--hx-border-radius-full, 9999px);
5255
5319
  overflow: hidden;
5256
5320
  display: flex;
5257
5321
  align-items: center;
5258
5322
  justify-content: center;
5259
- background-color: var(--hx-color-neutral-200, #e5e7eb);
5323
+ background-color: var(--_photo-bg);
5260
5324
  }
5261
5325
 
5262
5326
  /* ─── Fields Grid ─── */
@@ -5302,9 +5366,8 @@ export const helixGridItemStyles = css`
5302
5366
  :host([aria-invalid='true']) .banner {
5303
5367
  border-bottom-color: var(--hx-color-error-400, #f87171);
5304
5368
  background-color: var(--hx-color-error-50, #fef2f2);
5305
- /* Darken label color to maintain 4.5:1 contrast on error-50 background */
5369
+ /* Darken label color to maintain 4.5:1 contrast on error-50 background. */
5306
5370
  --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-700, #374151));
5307
- position: relative;
5308
5371
  }
5309
5372
 
5310
5373
  :host([aria-invalid='true']) .banner::before {
@@ -5318,6 +5381,30 @@ export const helixGridItemStyles = css`
5318
5381
  background-color: var(--hx-color-error-500, #ef4444);
5319
5382
  border-radius: 0;
5320
5383
  }
5384
+
5385
+ /* ─── Visually-hidden violation live region ─── */
5386
+ /* Announces identifier rule violations to screen readers without visible text. */
5387
+
5388
+ .violation-message {
5389
+ position: absolute;
5390
+ width: 1px;
5391
+ height: 1px;
5392
+ padding: 0;
5393
+ margin: -1px;
5394
+ overflow: hidden;
5395
+ clip: rect(0, 0, 0, 0);
5396
+ white-space: nowrap;
5397
+ border-width: 0;
5398
+ }
5399
+
5400
+ /* ─── Motion reduction ─── */
5401
+
5402
+ @media (prefers-reduced-motion: reduce) {
5403
+ * {
5404
+ transition: none !important;
5405
+ animation: none !important;
5406
+ }
5407
+ }
5321
5408
  /* ── hx-phi-field ── */
5322
5409
  :host {
5323
5410
  display: inline-flex;
@@ -5396,6 +5483,18 @@ export const helixGridItemStyles = css`
5396
5483
  pointer-events: none;
5397
5484
  }
5398
5485
 
5486
+ /* ─── Disabled State ─── */
5487
+
5488
+ :host([disabled]) {
5489
+ opacity: var(--hx-phi-field-disabled-opacity, var(--hx-opacity-50, 0.5));
5490
+ pointer-events: none;
5491
+ cursor: not-allowed;
5492
+ }
5493
+
5494
+ .phi-field--disabled .phi-field__toggle {
5495
+ cursor: not-allowed;
5496
+ }
5497
+
5399
5498
  /* ─── Reduced Motion ─── */
5400
5499
 
5401
5500
  @media (prefers-reduced-motion: reduce) {
@@ -5944,8 +6043,45 @@ export const helixGridItemStyles = css`
5944
6043
  }
5945
6044
  }
5946
6045
  /* ── hx-select ── */
5947
- :host {
6046
+ /* ─── 3-tier token cascade: component → semantic → hardcoded fallback ─── */
6047
+ :host {
5948
6048
  display: block;
6049
+
6050
+ /* Background & foreground */
6051
+ --_bg: var(--hx-select-bg, var(--hx-color-neutral-0, #ffffff));
6052
+ --_color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
6053
+ --_placeholder-color: var(--hx-select-placeholder-color, var(--hx-color-neutral-400, #adb5bd));
6054
+
6055
+ /* Label */
6056
+ --_label-color: var(--hx-select-label-color, var(--hx-color-neutral-700, #343a40));
6057
+
6058
+ /* Border */
6059
+ --_border-color: var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
6060
+ --_border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
6061
+
6062
+ /* Focus ring */
6063
+ --_focus-ring-color: var(
6064
+ --hx-select-focus-ring-color,
6065
+ var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
6066
+ );
6067
+
6068
+ /* Error */
6069
+ --_error-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
6070
+
6071
+ /* Chevron */
6072
+ --_chevron-color: var(--hx-select-chevron-color, var(--hx-color-neutral-500, #6c757d));
6073
+ --_chevron-size: var(--hx-select-chevron-size, 0.5rem);
6074
+
6075
+ /* Listbox */
6076
+ --_listbox-bg: var(--hx-select-listbox-bg, var(--hx-color-neutral-0, #ffffff));
6077
+ --_option-hover-bg: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
6078
+ --_option-selected-bg: var(
6079
+ --hx-select-option-selected-bg,
6080
+ var(--hx-color-primary-100, #dbeafe)
6081
+ );
6082
+
6083
+ /* Typography */
6084
+ --_font-family: var(--hx-select-font-family, var(--hx-font-family-sans, sans-serif));
5949
6085
  }
5950
6086
 
5951
6087
  :host([disabled]) {
@@ -5961,7 +6097,7 @@ export const helixGridItemStyles = css`
5961
6097
  display: flex;
5962
6098
  flex-direction: column;
5963
6099
  gap: var(--hx-space-1, 0.25rem);
5964
- font-family: var(--hx-select-font-family, var(--hx-font-family-sans, sans-serif));
6100
+ font-family: var(--_font-family);
5965
6101
  position: relative;
5966
6102
  }
5967
6103
 
@@ -5971,7 +6107,7 @@ export const helixGridItemStyles = css`
5971
6107
  gap: var(--hx-space-1, 0.25rem);
5972
6108
  font-size: var(--hx-font-size-sm, 0.875rem);
5973
6109
  font-weight: var(--hx-font-weight-medium, 500);
5974
- color: var(--hx-select-label-color, var(--hx-color-neutral-700, #343a40));
6110
+ color: var(--_label-color);
5975
6111
  line-height: var(--hx-line-height-normal, 1.5);
5976
6112
  }
5977
6113
 
@@ -5992,11 +6128,10 @@ export const helixGridItemStyles = css`
5992
6128
  gap: var(--hx-space-2, 0.5rem);
5993
6129
  width: 100%;
5994
6130
  min-height: var(--hx-input-height-md, var(--hx-size-10, 2.5rem));
5995
- border: var(--hx-border-width-thin, 1px) solid
5996
- var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
5997
- border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
5998
- background-color: var(--hx-select-bg, var(--hx-color-neutral-0, #ffffff));
5999
- color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
6131
+ border: var(--hx-border-width-thin, 1px) solid var(--_border-color);
6132
+ border-radius: var(--_border-radius);
6133
+ background-color: var(--_bg);
6134
+ color: var(--_color);
6000
6135
  font-family: inherit;
6001
6136
  font-size: var(--hx-font-size-md, 1rem);
6002
6137
  line-height: var(--hx-line-height-normal, 1.5);
@@ -6011,18 +6146,11 @@ export const helixGridItemStyles = css`
6011
6146
 
6012
6147
  .field__trigger:focus,
6013
6148
  .field__trigger:focus-visible {
6014
- border-color: var(
6015
- --hx-select-focus-ring-color,
6016
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
6017
- );
6149
+ border-color: var(--_focus-ring-color);
6018
6150
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6019
6151
  color-mix(
6020
6152
  in srgb,
6021
- var(
6022
- --hx-select-focus-ring-color,
6023
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
6024
- )
6025
- calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6153
+ var(--_focus-ring-color) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6026
6154
  transparent
6027
6155
  );
6028
6156
  }
@@ -6052,15 +6180,15 @@ export const helixGridItemStyles = css`
6052
6180
  }
6053
6181
 
6054
6182
  .field__trigger--placeholder .field__trigger-value {
6055
- color: var(--hx-select-placeholder-color, var(--hx-color-neutral-400, #adb5bd));
6183
+ color: var(--_placeholder-color);
6056
6184
  }
6057
6185
 
6058
6186
  .field__chevron {
6059
6187
  flex-shrink: 0;
6060
- width: 12px;
6061
- height: 8px;
6188
+ width: calc(var(--_chevron-size) * 1.5);
6189
+ height: var(--_chevron-size);
6062
6190
  position: relative;
6063
- color: var(--hx-select-chevron-color, var(--hx-color-neutral-500, #6c757d));
6191
+ color: var(--_chevron-color);
6064
6192
  pointer-events: none;
6065
6193
  transition: transform var(--hx-transition-fast, 150ms ease);
6066
6194
  }
@@ -6069,11 +6197,11 @@ export const helixGridItemStyles = css`
6069
6197
  content: '';
6070
6198
  position: absolute;
6071
6199
  top: 0;
6072
- left: 2px;
6073
- width: 7px;
6074
- height: 7px;
6075
- border-inline-end: 1.5px solid currentColor;
6076
- border-bottom: 1.5px solid currentColor;
6200
+ left: var(--hx-space-px, 2px);
6201
+ width: var(--_chevron-size);
6202
+ height: var(--_chevron-size);
6203
+ border-inline-end: var(--hx-border-width-thin, 1.5px) solid currentColor;
6204
+ border-bottom: var(--hx-border-width-thin, 1.5px) solid currentColor;
6077
6205
  transform: rotate(45deg);
6078
6206
  }
6079
6207
 
@@ -6082,17 +6210,16 @@ export const helixGridItemStyles = css`
6082
6210
  }
6083
6211
 
6084
6212
  .field--error .field__trigger {
6085
- border-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
6213
+ border-color: var(--_error-color);
6086
6214
  }
6087
6215
 
6088
6216
  .field--error .field__trigger:focus,
6089
6217
  .field--error .field__trigger:focus-visible {
6090
- border-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
6218
+ border-color: var(--_error-color);
6091
6219
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6092
6220
  color-mix(
6093
6221
  in srgb,
6094
- var(--hx-select-error-color, var(--hx-color-error-500, #dc3545))
6095
- calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6222
+ var(--_error-color) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6096
6223
  transparent
6097
6224
  );
6098
6225
  }
@@ -6103,10 +6230,9 @@ export const helixGridItemStyles = css`
6103
6230
  left: 0;
6104
6231
  right: 0;
6105
6232
  z-index: var(--hx-z-index-dropdown, 1000);
6106
- background-color: var(--hx-select-listbox-bg, var(--hx-color-neutral-0, #ffffff));
6107
- border: var(--hx-border-width-thin, 1px) solid
6108
- var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
6109
- border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
6233
+ background-color: var(--_listbox-bg);
6234
+ border: var(--hx-border-width-thin, 1px) solid var(--_border-color);
6235
+ border-radius: var(--_border-radius);
6110
6236
  box-shadow: var(
6111
6237
  --hx-select-listbox-shadow,
6112
6238
  0 4px 16px var(--hx-overlay-neutral-12, rgba(13, 17, 23, 0.12))
@@ -6133,7 +6259,7 @@ export const helixGridItemStyles = css`
6133
6259
  gap: var(--hx-space-2, 0.5rem);
6134
6260
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);
6135
6261
  font-size: var(--hx-font-size-md, 1rem);
6136
- color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
6262
+ color: var(--_color);
6137
6263
  cursor: pointer;
6138
6264
  user-select: none;
6139
6265
  -webkit-user-select: none;
@@ -6141,23 +6267,23 @@ export const helixGridItemStyles = css`
6141
6267
  }
6142
6268
 
6143
6269
  .field__option:hover {
6144
- background-color: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
6270
+ background-color: var(--_option-hover-bg);
6145
6271
  }
6146
6272
 
6147
6273
  .field__option--selected {
6148
- background-color: var(--hx-select-option-selected-bg, var(--hx-color-primary-100, #dbeafe));
6274
+ background-color: var(--_option-selected-bg);
6149
6275
  font-weight: var(--hx-font-weight-medium, 500);
6150
6276
  }
6151
6277
 
6152
6278
  .field__option--focused {
6153
- background-color: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
6279
+ background-color: var(--_option-hover-bg);
6154
6280
  outline: var(--hx-focus-ring-width, 2px) solid
6155
- var(--hx-select-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
6281
+ var(--_focus-ring-color, var(--hx-color-primary-500));
6156
6282
  outline-offset: var(--hx-select-option-focus-ring-offset, -2px);
6157
6283
  }
6158
6284
 
6159
6285
  .field__option--focused.field__option--selected {
6160
- background-color: var(--hx-select-option-selected-bg, var(--hx-color-primary-100, #dbeafe));
6286
+ background-color: var(--_option-selected-bg);
6161
6287
  }
6162
6288
 
6163
6289
  .field__option--disabled {
@@ -6176,7 +6302,7 @@ export const helixGridItemStyles = css`
6176
6302
  .field__no-options {
6177
6303
  padding: var(--hx-space-3, 0.75rem);
6178
6304
  text-align: center;
6179
- color: var(--hx-color-neutral-400, #adb5bd);
6305
+ color: var(--_placeholder-color);
6180
6306
  font-size: var(--hx-font-size-sm, 0.875rem);
6181
6307
  }
6182
6308
 
@@ -6215,6 +6341,13 @@ export const helixGridItemStyles = css`
6215
6341
  :host {
6216
6342
  display: block;
6217
6343
  height: 100%;
6344
+ /* Mirror the nav background and text on the host so slotted light-DOM
6345
+ content (header, footer slots) inherits the correct dark surface color.
6346
+ Without this, axe-core cannot resolve the background for slotted nodes
6347
+ and evaluates their text against the page white background, producing
6348
+ false-positive color-contrast violations (WCAG 2.1 AA). */
6349
+ background-color: var(--hx-side-nav-bg, var(--hx-color-neutral-900, #0f172a));
6350
+ color: var(--hx-side-nav-color, var(--hx-color-neutral-100, #f1f5f9));
6218
6351
  }
6219
6352
 
6220
6353
  * {
@@ -6228,12 +6361,12 @@ export const helixGridItemStyles = css`
6228
6361
  flex-direction: column;
6229
6362
  height: 100%;
6230
6363
  width: var(--hx-side-nav-width, 16rem);
6231
- background-color: var(--hx-side-nav-bg, var(--hx-color-neutral-900, #111827));
6232
- color: var(--hx-side-nav-color, var(--hx-color-neutral-100, #f3f4f6));
6364
+ background-color: var(--hx-side-nav-bg, var(--hx-color-neutral-900, #0f172a));
6365
+ color: var(--hx-side-nav-color, var(--hx-color-neutral-100, #f1f5f9));
6233
6366
  transition: width var(--hx-transition-normal, 300ms) ease;
6234
6367
  overflow: hidden;
6235
6368
  border-inline-end: var(--hx-border-width-thin, 1px) solid
6236
- var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #374151));
6369
+ var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #334155));
6237
6370
  }
6238
6371
 
6239
6372
  /* ─── Collapsed State ─── */
@@ -6251,7 +6384,7 @@ export const helixGridItemStyles = css`
6251
6384
  flex-shrink: 0;
6252
6385
  min-height: var(--hx-space-14, 3.5rem);
6253
6386
  border-bottom: var(--hx-border-width-thin, 1px) solid
6254
- var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #374151));
6387
+ var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #334155));
6255
6388
  overflow: hidden;
6256
6389
  }
6257
6390
 
@@ -6278,7 +6411,7 @@ export const helixGridItemStyles = css`
6278
6411
  flex-shrink: 0;
6279
6412
  min-height: var(--hx-space-14, 3.5rem);
6280
6413
  border-top: var(--hx-border-width-thin, 1px) solid
6281
- var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #374151));
6414
+ var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #334155));
6282
6415
  overflow: hidden;
6283
6416
  }
6284
6417
 
@@ -6301,7 +6434,7 @@ export const helixGridItemStyles = css`
6301
6434
  border: none;
6302
6435
  border-radius: var(--hx-border-radius-sm, 0.25rem);
6303
6436
  background: transparent;
6304
- color: var(--hx-side-nav-toggle-color, var(--hx-color-neutral-400, #9ca3af));
6437
+ color: var(--hx-side-nav-toggle-color, var(--hx-color-neutral-400, #94a3b8));
6305
6438
  cursor: pointer;
6306
6439
  transition:
6307
6440
  background-color var(--hx-transition-fast, 150ms) ease,
@@ -6313,7 +6446,7 @@ export const helixGridItemStyles = css`
6313
6446
  --hx-overlay-white-10,
6314
6447
  rgba(255, 255, 255, 0.1)
6315
6448
  ); /* fallback for browsers without color-mix() */
6316
- color: var(--hx-color-neutral-100, #f3f4f6);
6449
+ color: var(--hx-color-neutral-100, #f1f5f9);
6317
6450
  }
6318
6451
 
6319
6452
  @supports (color: color-mix(in srgb, red 50%, blue)) {
@@ -7530,9 +7663,12 @@ export const helixGridItemStyles = css`
7530
7663
  display: inline-flex;
7531
7664
  align-items: center;
7532
7665
  justify-content: center;
7666
+ gap: var(--hx-space-2, 0.5rem);
7533
7667
  position: relative;
7534
7668
  flex-shrink: 0;
7535
7669
  --_dot-color: var(--hx-status-indicator-color-default, var(--hx-color-neutral-300, #ced4da));
7670
+ /* Default size (md) — always defined so .indicator never collapses to 0x0 */
7671
+ --_indicator-size: var(--hx-status-indicator-size-md, var(--hx-space-3, 0.75rem));
7536
7672
  }
7537
7673
 
7538
7674
  .indicator {
@@ -7587,18 +7723,44 @@ export const helixGridItemStyles = css`
7587
7723
  }
7588
7724
  }
7589
7725
 
7726
+ /* ─── Visible label (part="label") ─── */
7727
+
7728
+ .indicator__label {
7729
+ font-size: var(
7730
+ --hx-status-indicator-label-font-size,
7731
+ var(--hx-font-size-sm, var(--hx-text-sm, 0.875rem))
7732
+ );
7733
+ color: var(--hx-status-indicator-label-color, var(--hx-color-neutral-700, #374151));
7734
+ line-height: 1;
7735
+ white-space: nowrap;
7736
+ }
7737
+
7738
+ /* ─── aria-live announcement region (visually hidden) ─── */
7739
+
7740
+ .indicator__live-region {
7741
+ position: absolute;
7742
+ width: 1px;
7743
+ height: 1px;
7744
+ padding: 0;
7745
+ margin: -1px;
7746
+ overflow: hidden;
7747
+ clip: rect(0, 0, 0, 0);
7748
+ white-space: nowrap;
7749
+ border: 0;
7750
+ }
7751
+
7590
7752
  /* ─── Size Variants ─── */
7591
7753
 
7592
- :host([size='sm']) {
7754
+ :host([hx-size='sm']) {
7593
7755
  --_indicator-size: var(--hx-status-indicator-size-sm, var(--hx-space-2, 0.5rem));
7594
7756
  }
7595
7757
 
7596
- :host([size='md']) {
7758
+ :host([hx-size='md']) {
7597
7759
  --_indicator-size: var(--hx-status-indicator-size-md, var(--hx-space-3, 0.75rem));
7598
7760
  }
7599
7761
 
7600
- :host([size='lg']) {
7601
- --_indicator-size: var(--hx-status-indicator-size-lg, var(--hx-size-4));
7762
+ :host([hx-size='lg']) {
7763
+ --_indicator-size: var(--hx-status-indicator-size-lg, var(--hx-space-4, 1rem));
7602
7764
  }
7603
7765
 
7604
7766
  /* ─── Status Colors ─── */
@@ -110,11 +110,28 @@
110
110
  }
111
111
 
112
112
  /* P1-B: Windows High Contrast Mode — avatar background is stripped by the system,
113
- leaving no visual boundary. Add a border so the avatar remains perceivable.
113
+ leaving no visual boundary. Restore a visible border, explicit foreground, and
114
+ background so the avatar container, initials, and fallback icon all remain
115
+ perceivable at any contrast level.
114
116
  WCAG 1.4.11 Non-text Contrast (Level AA). */
115
117
  @media (forced-colors: active) {
116
118
  .avatar {
119
+ forced-color-adjust: none;
117
120
  border: 2px solid ButtonText;
121
+ background-color: Canvas;
122
+ color: CanvasText;
123
+ }
124
+
125
+ .avatar__initials {
126
+ color: CanvasText;
127
+ }
128
+
129
+ .avatar__fallback-icon {
130
+ color: CanvasText;
131
+ }
132
+
133
+ .avatar__image {
134
+ forced-color-adjust: auto;
118
135
  }
119
136
  }
120
137
  /* ── hx-badge ── */
@@ -238,17 +255,21 @@
238
255
  display: none;
239
256
  }
240
257
 
258
+ .badge--dot slot[name='prefix'] {
259
+ display: none;
260
+ }
261
+
241
262
  /* ─── Pulse Animation ─── */
242
263
 
243
264
  @keyframes hx-badge-pulse {
244
265
  0%,
245
266
  100% {
246
267
  opacity: 1;
247
- box-shadow: 0 0 0 0 var(--hx-badge-pulse-color, currentColor);
268
+ box-shadow: 0 0 0 2px var(--hx-badge-pulse-color, currentColor);
248
269
  }
249
270
  50% {
250
271
  opacity: var(--hx-opacity-75, 0.75);
251
- box-shadow: 0 0 0 4px transparent;
272
+ box-shadow: 0 0 0 6px transparent;
252
273
  }
253
274
  }
254
275
 
@@ -553,6 +574,40 @@
553
574
  .button__label {
554
575
  flex: 1 1 auto;
555
576
  }
577
+
578
+ /* ─── High Contrast Mode (forced-colors) ─── */
579
+
580
+ @media (forced-colors: active) {
581
+ .button {
582
+ /* Ensure button outline is visible in Windows High Contrast mode.
583
+ ButtonText/ButtonFace are system colors recognized by the browser. */
584
+ forced-color-adjust: none;
585
+ background-color: ButtonFace;
586
+ color: ButtonText;
587
+ border: 2px solid ButtonText;
588
+ }
589
+
590
+ .button:focus-visible {
591
+ outline: 3px solid Highlight;
592
+ outline-offset: 2px;
593
+ }
594
+
595
+ .button[disabled] {
596
+ background-color: ButtonFace;
597
+ color: GrayText;
598
+ border-color: GrayText;
599
+ opacity: 1;
600
+ }
601
+
602
+ :host([disabled]) {
603
+ opacity: 1;
604
+ }
605
+
606
+ .button--loading .button__spinner {
607
+ /* Ensure spinner is visible in HCM */
608
+ forced-color-adjust: auto;
609
+ }
610
+ }
556
611
  /* ── hx-button-group ── */
557
612
  :host {
558
613
  display: inline-flex;