@helixui/library 1.1.2-next.2 → 1.1.2-next.26

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 (125) hide show
  1. package/custom-elements.json +387 -405
  2. package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
  3. package/dist/components/hx-avatar/index.js +1 -1
  4. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts +1 -0
  5. package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
  6. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +10 -8
  7. package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
  8. package/dist/components/hx-breadcrumb/index.js +1 -1
  9. package/dist/components/hx-button/hx-button.d.ts +12 -6
  10. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  11. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  12. package/dist/components/hx-button/index.js +1 -1
  13. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts +14 -6
  14. package/dist/components/hx-clinical-status/hx-clinical-status.d.ts.map +1 -1
  15. package/dist/components/hx-clinical-status/hx-clinical-status.styles.d.ts.map +1 -1
  16. package/dist/components/hx-clinical-status/index.d.ts +1 -1
  17. package/dist/components/hx-clinical-status/index.d.ts.map +1 -1
  18. package/dist/components/hx-clinical-status/index.js +1 -1
  19. package/dist/components/hx-menu/hx-menu-item.d.ts +5 -0
  20. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  21. package/dist/components/hx-menu/hx-menu.d.ts +1 -0
  22. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  23. package/dist/components/hx-menu/hx-menu.styles.d.ts.map +1 -1
  24. package/dist/components/hx-menu/index.js +1 -1
  25. package/dist/components/hx-nav/hx-nav.d.ts +10 -0
  26. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  27. package/dist/components/hx-nav/index.js +1 -1
  28. package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
  29. package/dist/components/hx-pagination/index.js +1 -1
  30. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts +8 -0
  31. package/dist/components/hx-patient-banner/hx-patient-banner.d.ts.map +1 -1
  32. package/dist/components/hx-patient-banner/hx-patient-banner.styles.d.ts.map +1 -1
  33. package/dist/components/hx-patient-banner/index.js +1 -1
  34. package/dist/components/hx-phi-field/hx-phi-field.d.ts +27 -2
  35. package/dist/components/hx-phi-field/hx-phi-field.d.ts.map +1 -1
  36. package/dist/components/hx-phi-field/hx-phi-field.styles.d.ts.map +1 -1
  37. package/dist/components/hx-phi-field/index.js +1 -1
  38. package/dist/components/hx-select/hx-select.d.ts +1 -0
  39. package/dist/components/hx-select/hx-select.d.ts.map +1 -1
  40. package/dist/components/hx-select/hx-select.styles.d.ts.map +1 -1
  41. package/dist/components/hx-select/index.js +1 -1
  42. package/dist/components/hx-side-nav/hx-nav-item.d.ts +5 -0
  43. package/dist/components/hx-side-nav/hx-nav-item.d.ts.map +1 -1
  44. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  45. package/dist/components/hx-side-nav/index.js +1 -1
  46. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +17 -1
  47. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  48. package/dist/components/hx-status-indicator/hx-status-indicator.styles.d.ts.map +1 -1
  49. package/dist/components/hx-status-indicator/index.js +1 -1
  50. package/dist/components/hx-steps/hx-step.d.ts +7 -0
  51. package/dist/components/hx-steps/hx-step.d.ts.map +1 -1
  52. package/dist/components/hx-steps/hx-steps.d.ts.map +1 -1
  53. package/dist/components/hx-steps/index.js +1 -1
  54. package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
  55. package/dist/components/hx-tabs/hx-tabs.d.ts +10 -0
  56. package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
  57. package/dist/components/hx-tabs/index.js +1 -1
  58. package/dist/components/hx-tree-view/hx-tree-item.d.ts +5 -0
  59. package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
  60. package/dist/components/hx-tree-view/hx-tree-view.d.ts +6 -0
  61. package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
  62. package/dist/components/hx-tree-view/index.js +1 -1
  63. package/dist/css/helix-all.css +202 -51
  64. package/dist/css/helix-core.css +52 -1
  65. package/dist/css/helix-feedback.css +33 -4
  66. package/dist/css/helix-forms.css +68 -41
  67. package/dist/css/helix-navigation.css +2 -0
  68. package/dist/css/hx-avatar.css +18 -1
  69. package/dist/css/hx-button.css +34 -0
  70. package/dist/css/hx-clinical-status.css +4 -2
  71. package/dist/css/hx-menu.css +2 -0
  72. package/dist/css/hx-patient-banner.css +31 -3
  73. package/dist/css/hx-phi-field.css +12 -0
  74. package/dist/css/hx-select.css +68 -41
  75. package/dist/css/hx-status-indicator.css +33 -4
  76. package/dist/css/index.css +1 -1
  77. package/dist/css/manifest.json +13 -5
  78. package/dist/index.d.ts +1 -1
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +15 -15
  81. package/dist/shared/{hx-avatar-7p1cj3lG.js → hx-avatar-CZfA9KEl.js} +27 -10
  82. package/dist/shared/hx-avatar-CZfA9KEl.js.map +1 -0
  83. package/dist/shared/{hx-breadcrumb-item-B2rjepqy.js → hx-breadcrumb-item-CObc-WJl.js} +8 -6
  84. package/dist/shared/hx-breadcrumb-item-CObc-WJl.js.map +1 -0
  85. package/dist/shared/{hx-button-6S3DwuIj.js → hx-button-CC1YH9RZ.js} +52 -12
  86. package/dist/shared/hx-button-CC1YH9RZ.js.map +1 -0
  87. package/dist/shared/{hx-clinical-status-De8yrA5I.js → hx-clinical-status-D6eaplvs.js} +5 -3
  88. package/dist/shared/hx-clinical-status-D6eaplvs.js.map +1 -0
  89. package/dist/shared/{hx-menu-divider-DR4G_rqw.js → hx-menu-divider-puPmRAdN.js} +40 -20
  90. package/dist/shared/hx-menu-divider-puPmRAdN.js.map +1 -0
  91. package/dist/shared/{hx-nav-D377Ngz4.js → hx-nav-CiyqaW2I.js} +112 -99
  92. package/dist/shared/hx-nav-CiyqaW2I.js.map +1 -0
  93. package/dist/shared/{hx-nav-item-CuGiJPAf.js → hx-nav-item-tM_6bolB.js} +132 -92
  94. package/dist/shared/hx-nav-item-tM_6bolB.js.map +1 -0
  95. package/dist/shared/{hx-pagination-DYhYPqDn.js → hx-pagination-Cb9UEWXz.js} +74 -66
  96. package/dist/shared/{hx-pagination-DYhYPqDn.js.map → hx-pagination-Cb9UEWXz.js.map} +1 -1
  97. package/dist/shared/{hx-patient-banner-BoJHddAL.js → hx-patient-banner-wk4qWmsH.js} +88 -47
  98. package/dist/shared/hx-patient-banner-wk4qWmsH.js.map +1 -0
  99. package/dist/shared/{hx-phi-field-EDWna59z.js → hx-phi-field-DX9z3nu0.js} +67 -33
  100. package/dist/shared/hx-phi-field-DX9z3nu0.js.map +1 -0
  101. package/dist/shared/{hx-select-4-nHL0vd.js → hx-select-BWzxWZs_.js} +82 -55
  102. package/dist/shared/hx-select-BWzxWZs_.js.map +1 -0
  103. package/dist/shared/{hx-status-indicator-4ClvA5mU.js → hx-status-indicator-Dl3Y34mc.js} +76 -35
  104. package/dist/shared/hx-status-indicator-Dl3Y34mc.js.map +1 -0
  105. package/dist/shared/{hx-step-DlANlr2A.js → hx-step-CmNwfcJx.js} +30 -26
  106. package/dist/shared/hx-step-CmNwfcJx.js.map +1 -0
  107. package/dist/shared/{hx-tab-panel-GGjk6Qg4.js → hx-tab-panel-Dnt8aA74.js} +89 -61
  108. package/dist/shared/hx-tab-panel-Dnt8aA74.js.map +1 -0
  109. package/dist/shared/{hx-tree-item-DTDIBRrI.js → hx-tree-item-C1PhX-HE.js} +50 -19
  110. package/dist/shared/hx-tree-item-C1PhX-HE.js.map +1 -0
  111. package/package.json +2 -2
  112. package/dist/shared/hx-avatar-7p1cj3lG.js.map +0 -1
  113. package/dist/shared/hx-breadcrumb-item-B2rjepqy.js.map +0 -1
  114. package/dist/shared/hx-button-6S3DwuIj.js.map +0 -1
  115. package/dist/shared/hx-clinical-status-De8yrA5I.js.map +0 -1
  116. package/dist/shared/hx-menu-divider-DR4G_rqw.js.map +0 -1
  117. package/dist/shared/hx-nav-D377Ngz4.js.map +0 -1
  118. package/dist/shared/hx-nav-item-CuGiJPAf.js.map +0 -1
  119. package/dist/shared/hx-patient-banner-BoJHddAL.js.map +0 -1
  120. package/dist/shared/hx-phi-field-EDWna59z.js.map +0 -1
  121. package/dist/shared/hx-select-4-nHL0vd.js.map +0 -1
  122. package/dist/shared/hx-status-indicator-4ClvA5mU.js.map +0 -1
  123. package/dist/shared/hx-step-DlANlr2A.js.map +0 -1
  124. package/dist/shared/hx-tab-panel-GGjk6Qg4.js.map +0 -1
  125. 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 ── */
@@ -1136,6 +1153,40 @@
1136
1153
  .button__label {
1137
1154
  flex: 1 1 auto;
1138
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
+ }
1139
1190
  /* ── hx-button-group ── */
1140
1191
  :host {
1141
1192
  display: inline-flex;
@@ -2081,7 +2132,8 @@
2081
2132
  }
2082
2133
 
2083
2134
  .clinical-status__dismiss-button:focus-visible {
2084
- 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));
2085
2137
  outline-offset: var(--hx-focus-ring-offset, 2px);
2086
2138
  opacity: 1;
2087
2139
  }
@@ -2126,7 +2178,8 @@
2126
2178
  }
2127
2179
 
2128
2180
  .clinical-status__acknowledge-button:focus-visible {
2129
- 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));
2130
2183
  outline-offset: var(--hx-focus-ring-offset, 2px);
2131
2184
  }
2132
2185
 
@@ -4282,6 +4335,8 @@ export const helixGridItemStyles = css`
4282
4335
  0 2px 4px -2px rgb(0 0 0 / 0.1)
4283
4336
  );
4284
4337
  min-width: var(--hx-menu-min-width, 10rem);
4338
+ max-height: var(--hx-menu-max-height, 20rem);
4339
+ overflow-y: auto;
4285
4340
  outline: none;
4286
4341
  }
4287
4342
  /* ── hx-meter ── */
@@ -5230,6 +5285,7 @@ export const helixGridItemStyles = css`
5230
5285
  --_value-color: var(--hx-patient-banner-value-color, var(--hx-color-neutral-900, #111827));
5231
5286
  --_value-font-size: var(--hx-patient-banner-value-font-size, var(--hx-font-size-sm, 0.875rem));
5232
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));
5233
5289
  }
5234
5290
 
5235
5291
  * {
@@ -5247,6 +5303,7 @@ export const helixGridItemStyles = css`
5247
5303
  border-bottom: var(--hx-border-width-thin, 1px) solid var(--_border-color);
5248
5304
  font-family: var(--_font-family);
5249
5305
  width: 100%;
5306
+ position: relative;
5250
5307
  }
5251
5308
 
5252
5309
  /* ─── Photo Area ─── */
@@ -5255,12 +5312,15 @@ export const helixGridItemStyles = css`
5255
5312
  flex-shrink: 0;
5256
5313
  width: var(--_photo-size);
5257
5314
  height: var(--_photo-size);
5315
+ /* Minimum 44x44px touch target for interactive photo content. */
5316
+ min-width: 44px;
5317
+ min-height: 44px;
5258
5318
  border-radius: var(--hx-border-radius-full, 9999px);
5259
5319
  overflow: hidden;
5260
5320
  display: flex;
5261
5321
  align-items: center;
5262
5322
  justify-content: center;
5263
- background-color: var(--hx-color-neutral-200, #e5e7eb);
5323
+ background-color: var(--_photo-bg);
5264
5324
  }
5265
5325
 
5266
5326
  /* ─── Fields Grid ─── */
@@ -5306,9 +5366,8 @@ export const helixGridItemStyles = css`
5306
5366
  :host([aria-invalid='true']) .banner {
5307
5367
  border-bottom-color: var(--hx-color-error-400, #f87171);
5308
5368
  background-color: var(--hx-color-error-50, #fef2f2);
5309
- /* 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. */
5310
5370
  --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-700, #374151));
5311
- position: relative;
5312
5371
  }
5313
5372
 
5314
5373
  :host([aria-invalid='true']) .banner::before {
@@ -5322,6 +5381,30 @@ export const helixGridItemStyles = css`
5322
5381
  background-color: var(--hx-color-error-500, #ef4444);
5323
5382
  border-radius: 0;
5324
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
+ }
5325
5408
  /* ── hx-phi-field ── */
5326
5409
  :host {
5327
5410
  display: inline-flex;
@@ -5400,6 +5483,18 @@ export const helixGridItemStyles = css`
5400
5483
  pointer-events: none;
5401
5484
  }
5402
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
+
5403
5498
  /* ─── Reduced Motion ─── */
5404
5499
 
5405
5500
  @media (prefers-reduced-motion: reduce) {
@@ -5948,8 +6043,45 @@ export const helixGridItemStyles = css`
5948
6043
  }
5949
6044
  }
5950
6045
  /* ── hx-select ── */
5951
- :host {
6046
+ /* ─── 3-tier token cascade: component → semantic → hardcoded fallback ─── */
6047
+ :host {
5952
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));
5953
6085
  }
5954
6086
 
5955
6087
  :host([disabled]) {
@@ -5965,7 +6097,7 @@ export const helixGridItemStyles = css`
5965
6097
  display: flex;
5966
6098
  flex-direction: column;
5967
6099
  gap: var(--hx-space-1, 0.25rem);
5968
- font-family: var(--hx-select-font-family, var(--hx-font-family-sans, sans-serif));
6100
+ font-family: var(--_font-family);
5969
6101
  position: relative;
5970
6102
  }
5971
6103
 
@@ -5975,7 +6107,7 @@ export const helixGridItemStyles = css`
5975
6107
  gap: var(--hx-space-1, 0.25rem);
5976
6108
  font-size: var(--hx-font-size-sm, 0.875rem);
5977
6109
  font-weight: var(--hx-font-weight-medium, 500);
5978
- color: var(--hx-select-label-color, var(--hx-color-neutral-700, #343a40));
6110
+ color: var(--_label-color);
5979
6111
  line-height: var(--hx-line-height-normal, 1.5);
5980
6112
  }
5981
6113
 
@@ -5996,11 +6128,10 @@ export const helixGridItemStyles = css`
5996
6128
  gap: var(--hx-space-2, 0.5rem);
5997
6129
  width: 100%;
5998
6130
  min-height: var(--hx-input-height-md, var(--hx-size-10, 2.5rem));
5999
- border: var(--hx-border-width-thin, 1px) solid
6000
- var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
6001
- border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
6002
- background-color: var(--hx-select-bg, var(--hx-color-neutral-0, #ffffff));
6003
- 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);
6004
6135
  font-family: inherit;
6005
6136
  font-size: var(--hx-font-size-md, 1rem);
6006
6137
  line-height: var(--hx-line-height-normal, 1.5);
@@ -6015,18 +6146,11 @@ export const helixGridItemStyles = css`
6015
6146
 
6016
6147
  .field__trigger:focus,
6017
6148
  .field__trigger:focus-visible {
6018
- border-color: var(
6019
- --hx-select-focus-ring-color,
6020
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
6021
- );
6149
+ border-color: var(--_focus-ring-color);
6022
6150
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6023
6151
  color-mix(
6024
6152
  in srgb,
6025
- var(
6026
- --hx-select-focus-ring-color,
6027
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
6028
- )
6029
- calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6153
+ var(--_focus-ring-color) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6030
6154
  transparent
6031
6155
  );
6032
6156
  }
@@ -6056,15 +6180,15 @@ export const helixGridItemStyles = css`
6056
6180
  }
6057
6181
 
6058
6182
  .field__trigger--placeholder .field__trigger-value {
6059
- color: var(--hx-select-placeholder-color, var(--hx-color-neutral-400, #adb5bd));
6183
+ color: var(--_placeholder-color);
6060
6184
  }
6061
6185
 
6062
6186
  .field__chevron {
6063
6187
  flex-shrink: 0;
6064
- width: 12px;
6065
- height: 8px;
6188
+ width: calc(var(--_chevron-size) * 1.5);
6189
+ height: var(--_chevron-size);
6066
6190
  position: relative;
6067
- color: var(--hx-select-chevron-color, var(--hx-color-neutral-500, #6c757d));
6191
+ color: var(--_chevron-color);
6068
6192
  pointer-events: none;
6069
6193
  transition: transform var(--hx-transition-fast, 150ms ease);
6070
6194
  }
@@ -6073,11 +6197,11 @@ export const helixGridItemStyles = css`
6073
6197
  content: '';
6074
6198
  position: absolute;
6075
6199
  top: 0;
6076
- left: 2px;
6077
- width: 7px;
6078
- height: 7px;
6079
- border-inline-end: 1.5px solid currentColor;
6080
- 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;
6081
6205
  transform: rotate(45deg);
6082
6206
  }
6083
6207
 
@@ -6086,17 +6210,16 @@ export const helixGridItemStyles = css`
6086
6210
  }
6087
6211
 
6088
6212
  .field--error .field__trigger {
6089
- border-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
6213
+ border-color: var(--_error-color);
6090
6214
  }
6091
6215
 
6092
6216
  .field--error .field__trigger:focus,
6093
6217
  .field--error .field__trigger:focus-visible {
6094
- border-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
6218
+ border-color: var(--_error-color);
6095
6219
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
6096
6220
  color-mix(
6097
6221
  in srgb,
6098
- var(--hx-select-error-color, var(--hx-color-error-500, #dc3545))
6099
- calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6222
+ var(--_error-color) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
6100
6223
  transparent
6101
6224
  );
6102
6225
  }
@@ -6107,10 +6230,9 @@ export const helixGridItemStyles = css`
6107
6230
  left: 0;
6108
6231
  right: 0;
6109
6232
  z-index: var(--hx-z-index-dropdown, 1000);
6110
- background-color: var(--hx-select-listbox-bg, var(--hx-color-neutral-0, #ffffff));
6111
- border: var(--hx-border-width-thin, 1px) solid
6112
- var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
6113
- 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);
6114
6236
  box-shadow: var(
6115
6237
  --hx-select-listbox-shadow,
6116
6238
  0 4px 16px var(--hx-overlay-neutral-12, rgba(13, 17, 23, 0.12))
@@ -6137,7 +6259,7 @@ export const helixGridItemStyles = css`
6137
6259
  gap: var(--hx-space-2, 0.5rem);
6138
6260
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);
6139
6261
  font-size: var(--hx-font-size-md, 1rem);
6140
- color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
6262
+ color: var(--_color);
6141
6263
  cursor: pointer;
6142
6264
  user-select: none;
6143
6265
  -webkit-user-select: none;
@@ -6145,23 +6267,23 @@ export const helixGridItemStyles = css`
6145
6267
  }
6146
6268
 
6147
6269
  .field__option:hover {
6148
- background-color: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
6270
+ background-color: var(--_option-hover-bg);
6149
6271
  }
6150
6272
 
6151
6273
  .field__option--selected {
6152
- background-color: var(--hx-select-option-selected-bg, var(--hx-color-primary-100, #dbeafe));
6274
+ background-color: var(--_option-selected-bg);
6153
6275
  font-weight: var(--hx-font-weight-medium, 500);
6154
6276
  }
6155
6277
 
6156
6278
  .field__option--focused {
6157
- background-color: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
6279
+ background-color: var(--_option-hover-bg);
6158
6280
  outline: var(--hx-focus-ring-width, 2px) solid
6159
- 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));
6160
6282
  outline-offset: var(--hx-select-option-focus-ring-offset, -2px);
6161
6283
  }
6162
6284
 
6163
6285
  .field__option--focused.field__option--selected {
6164
- background-color: var(--hx-select-option-selected-bg, var(--hx-color-primary-100, #dbeafe));
6286
+ background-color: var(--_option-selected-bg);
6165
6287
  }
6166
6288
 
6167
6289
  .field__option--disabled {
@@ -6180,7 +6302,7 @@ export const helixGridItemStyles = css`
6180
6302
  .field__no-options {
6181
6303
  padding: var(--hx-space-3, 0.75rem);
6182
6304
  text-align: center;
6183
- color: var(--hx-color-neutral-400, #adb5bd);
6305
+ color: var(--_placeholder-color);
6184
6306
  font-size: var(--hx-font-size-sm, 0.875rem);
6185
6307
  }
6186
6308
 
@@ -7541,9 +7663,12 @@ export const helixGridItemStyles = css`
7541
7663
  display: inline-flex;
7542
7664
  align-items: center;
7543
7665
  justify-content: center;
7666
+ gap: var(--hx-space-2, 0.5rem);
7544
7667
  position: relative;
7545
7668
  flex-shrink: 0;
7546
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));
7547
7672
  }
7548
7673
 
7549
7674
  .indicator {
@@ -7598,18 +7723,44 @@ export const helixGridItemStyles = css`
7598
7723
  }
7599
7724
  }
7600
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
+
7601
7752
  /* ─── Size Variants ─── */
7602
7753
 
7603
- :host([size='sm']) {
7754
+ :host([hx-size='sm']) {
7604
7755
  --_indicator-size: var(--hx-status-indicator-size-sm, var(--hx-space-2, 0.5rem));
7605
7756
  }
7606
7757
 
7607
- :host([size='md']) {
7758
+ :host([hx-size='md']) {
7608
7759
  --_indicator-size: var(--hx-status-indicator-size-md, var(--hx-space-3, 0.75rem));
7609
7760
  }
7610
7761
 
7611
- :host([size='lg']) {
7612
- --_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));
7613
7764
  }
7614
7765
 
7615
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 ── */
@@ -557,6 +574,40 @@
557
574
  .button__label {
558
575
  flex: 1 1 auto;
559
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
+ }
560
611
  /* ── hx-button-group ── */
561
612
  :host {
562
613
  display: inline-flex;
@@ -915,9 +915,12 @@
915
915
  display: inline-flex;
916
916
  align-items: center;
917
917
  justify-content: center;
918
+ gap: var(--hx-space-2, 0.5rem);
918
919
  position: relative;
919
920
  flex-shrink: 0;
920
921
  --_dot-color: var(--hx-status-indicator-color-default, var(--hx-color-neutral-300, #ced4da));
922
+ /* Default size (md) — always defined so .indicator never collapses to 0x0 */
923
+ --_indicator-size: var(--hx-status-indicator-size-md, var(--hx-space-3, 0.75rem));
921
924
  }
922
925
 
923
926
  .indicator {
@@ -972,18 +975,44 @@
972
975
  }
973
976
  }
974
977
 
978
+ /* ─── Visible label (part="label") ─── */
979
+
980
+ .indicator__label {
981
+ font-size: var(
982
+ --hx-status-indicator-label-font-size,
983
+ var(--hx-font-size-sm, var(--hx-text-sm, 0.875rem))
984
+ );
985
+ color: var(--hx-status-indicator-label-color, var(--hx-color-neutral-700, #374151));
986
+ line-height: 1;
987
+ white-space: nowrap;
988
+ }
989
+
990
+ /* ─── aria-live announcement region (visually hidden) ─── */
991
+
992
+ .indicator__live-region {
993
+ position: absolute;
994
+ width: 1px;
995
+ height: 1px;
996
+ padding: 0;
997
+ margin: -1px;
998
+ overflow: hidden;
999
+ clip: rect(0, 0, 0, 0);
1000
+ white-space: nowrap;
1001
+ border: 0;
1002
+ }
1003
+
975
1004
  /* ─── Size Variants ─── */
976
1005
 
977
- :host([size='sm']) {
1006
+ :host([hx-size='sm']) {
978
1007
  --_indicator-size: var(--hx-status-indicator-size-sm, var(--hx-space-2, 0.5rem));
979
1008
  }
980
1009
 
981
- :host([size='md']) {
1010
+ :host([hx-size='md']) {
982
1011
  --_indicator-size: var(--hx-status-indicator-size-md, var(--hx-space-3, 0.75rem));
983
1012
  }
984
1013
 
985
- :host([size='lg']) {
986
- --_indicator-size: var(--hx-status-indicator-size-lg, var(--hx-size-4));
1014
+ :host([hx-size='lg']) {
1015
+ --_indicator-size: var(--hx-status-indicator-size-lg, var(--hx-space-4, 1rem));
987
1016
  }
988
1017
 
989
1018
  /* ─── Status Colors ─── */