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

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 +476 -392
  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
@@ -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 ─── */
@@ -1170,8 +1170,45 @@
1170
1170
  }
1171
1171
  }
1172
1172
  /* ── hx-select ── */
1173
- :host {
1173
+ /* ─── 3-tier token cascade: component → semantic → hardcoded fallback ─── */
1174
+ :host {
1174
1175
  display: block;
1176
+
1177
+ /* Background & foreground */
1178
+ --_bg: var(--hx-select-bg, var(--hx-color-neutral-0, #ffffff));
1179
+ --_color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
1180
+ --_placeholder-color: var(--hx-select-placeholder-color, var(--hx-color-neutral-400, #adb5bd));
1181
+
1182
+ /* Label */
1183
+ --_label-color: var(--hx-select-label-color, var(--hx-color-neutral-700, #343a40));
1184
+
1185
+ /* Border */
1186
+ --_border-color: var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
1187
+ --_border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
1188
+
1189
+ /* Focus ring */
1190
+ --_focus-ring-color: var(
1191
+ --hx-select-focus-ring-color,
1192
+ var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
1193
+ );
1194
+
1195
+ /* Error */
1196
+ --_error-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
1197
+
1198
+ /* Chevron */
1199
+ --_chevron-color: var(--hx-select-chevron-color, var(--hx-color-neutral-500, #6c757d));
1200
+ --_chevron-size: var(--hx-select-chevron-size, 0.5rem);
1201
+
1202
+ /* Listbox */
1203
+ --_listbox-bg: var(--hx-select-listbox-bg, var(--hx-color-neutral-0, #ffffff));
1204
+ --_option-hover-bg: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
1205
+ --_option-selected-bg: var(
1206
+ --hx-select-option-selected-bg,
1207
+ var(--hx-color-primary-100, #dbeafe)
1208
+ );
1209
+
1210
+ /* Typography */
1211
+ --_font-family: var(--hx-select-font-family, var(--hx-font-family-sans, sans-serif));
1175
1212
  }
1176
1213
 
1177
1214
  :host([disabled]) {
@@ -1187,7 +1224,7 @@
1187
1224
  display: flex;
1188
1225
  flex-direction: column;
1189
1226
  gap: var(--hx-space-1, 0.25rem);
1190
- font-family: var(--hx-select-font-family, var(--hx-font-family-sans, sans-serif));
1227
+ font-family: var(--_font-family);
1191
1228
  position: relative;
1192
1229
  }
1193
1230
 
@@ -1197,7 +1234,7 @@
1197
1234
  gap: var(--hx-space-1, 0.25rem);
1198
1235
  font-size: var(--hx-font-size-sm, 0.875rem);
1199
1236
  font-weight: var(--hx-font-weight-medium, 500);
1200
- color: var(--hx-select-label-color, var(--hx-color-neutral-700, #343a40));
1237
+ color: var(--_label-color);
1201
1238
  line-height: var(--hx-line-height-normal, 1.5);
1202
1239
  }
1203
1240
 
@@ -1218,11 +1255,10 @@
1218
1255
  gap: var(--hx-space-2, 0.5rem);
1219
1256
  width: 100%;
1220
1257
  min-height: var(--hx-input-height-md, var(--hx-size-10, 2.5rem));
1221
- border: var(--hx-border-width-thin, 1px) solid
1222
- var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
1223
- border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
1224
- background-color: var(--hx-select-bg, var(--hx-color-neutral-0, #ffffff));
1225
- color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
1258
+ border: var(--hx-border-width-thin, 1px) solid var(--_border-color);
1259
+ border-radius: var(--_border-radius);
1260
+ background-color: var(--_bg);
1261
+ color: var(--_color);
1226
1262
  font-family: inherit;
1227
1263
  font-size: var(--hx-font-size-md, 1rem);
1228
1264
  line-height: var(--hx-line-height-normal, 1.5);
@@ -1237,18 +1273,11 @@
1237
1273
 
1238
1274
  .field__trigger:focus,
1239
1275
  .field__trigger:focus-visible {
1240
- border-color: var(
1241
- --hx-select-focus-ring-color,
1242
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
1243
- );
1276
+ border-color: var(--_focus-ring-color);
1244
1277
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
1245
1278
  color-mix(
1246
1279
  in srgb,
1247
- var(
1248
- --hx-select-focus-ring-color,
1249
- var(--hx-focus-ring-color, var(--hx-color-primary-400, #60a5fa))
1250
- )
1251
- calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
1280
+ var(--_focus-ring-color) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
1252
1281
  transparent
1253
1282
  );
1254
1283
  }
@@ -1278,15 +1307,15 @@
1278
1307
  }
1279
1308
 
1280
1309
  .field__trigger--placeholder .field__trigger-value {
1281
- color: var(--hx-select-placeholder-color, var(--hx-color-neutral-400, #adb5bd));
1310
+ color: var(--_placeholder-color);
1282
1311
  }
1283
1312
 
1284
1313
  .field__chevron {
1285
1314
  flex-shrink: 0;
1286
- width: 12px;
1287
- height: 8px;
1315
+ width: calc(var(--_chevron-size) * 1.5);
1316
+ height: var(--_chevron-size);
1288
1317
  position: relative;
1289
- color: var(--hx-select-chevron-color, var(--hx-color-neutral-500, #6c757d));
1318
+ color: var(--_chevron-color);
1290
1319
  pointer-events: none;
1291
1320
  transition: transform var(--hx-transition-fast, 150ms ease);
1292
1321
  }
@@ -1295,11 +1324,11 @@
1295
1324
  content: '';
1296
1325
  position: absolute;
1297
1326
  top: 0;
1298
- left: 2px;
1299
- width: 7px;
1300
- height: 7px;
1301
- border-inline-end: 1.5px solid currentColor;
1302
- border-bottom: 1.5px solid currentColor;
1327
+ left: var(--hx-space-px, 2px);
1328
+ width: var(--_chevron-size);
1329
+ height: var(--_chevron-size);
1330
+ border-inline-end: var(--hx-border-width-thin, 1.5px) solid currentColor;
1331
+ border-bottom: var(--hx-border-width-thin, 1.5px) solid currentColor;
1303
1332
  transform: rotate(45deg);
1304
1333
  }
1305
1334
 
@@ -1308,17 +1337,16 @@
1308
1337
  }
1309
1338
 
1310
1339
  .field--error .field__trigger {
1311
- border-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
1340
+ border-color: var(--_error-color);
1312
1341
  }
1313
1342
 
1314
1343
  .field--error .field__trigger:focus,
1315
1344
  .field--error .field__trigger:focus-visible {
1316
- border-color: var(--hx-select-error-color, var(--hx-color-error-500, #dc3545));
1345
+ border-color: var(--_error-color);
1317
1346
  box-shadow: 0 0 0 var(--hx-focus-ring-width, 2px)
1318
1347
  color-mix(
1319
1348
  in srgb,
1320
- var(--hx-select-error-color, var(--hx-color-error-500, #dc3545))
1321
- calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
1349
+ var(--_error-color) calc(var(--hx-focus-ring-opacity, 0.25) * 100%),
1322
1350
  transparent
1323
1351
  );
1324
1352
  }
@@ -1329,10 +1357,9 @@
1329
1357
  left: 0;
1330
1358
  right: 0;
1331
1359
  z-index: var(--hx-z-index-dropdown, 1000);
1332
- background-color: var(--hx-select-listbox-bg, var(--hx-color-neutral-0, #ffffff));
1333
- border: var(--hx-border-width-thin, 1px) solid
1334
- var(--hx-select-border-color, var(--hx-color-neutral-300, #ced4da));
1335
- border-radius: var(--hx-select-border-radius, var(--hx-border-radius-md, 0.375rem));
1360
+ background-color: var(--_listbox-bg);
1361
+ border: var(--hx-border-width-thin, 1px) solid var(--_border-color);
1362
+ border-radius: var(--_border-radius);
1336
1363
  box-shadow: var(
1337
1364
  --hx-select-listbox-shadow,
1338
1365
  0 4px 16px var(--hx-overlay-neutral-12, rgba(13, 17, 23, 0.12))
@@ -1359,7 +1386,7 @@
1359
1386
  gap: var(--hx-space-2, 0.5rem);
1360
1387
  padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);
1361
1388
  font-size: var(--hx-font-size-md, 1rem);
1362
- color: var(--hx-select-color, var(--hx-color-neutral-800, #212529));
1389
+ color: var(--_color);
1363
1390
  cursor: pointer;
1364
1391
  user-select: none;
1365
1392
  -webkit-user-select: none;
@@ -1367,23 +1394,23 @@
1367
1394
  }
1368
1395
 
1369
1396
  .field__option:hover {
1370
- background-color: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
1397
+ background-color: var(--_option-hover-bg);
1371
1398
  }
1372
1399
 
1373
1400
  .field__option--selected {
1374
- background-color: var(--hx-select-option-selected-bg, var(--hx-color-primary-100, #dbeafe));
1401
+ background-color: var(--_option-selected-bg);
1375
1402
  font-weight: var(--hx-font-weight-medium, 500);
1376
1403
  }
1377
1404
 
1378
1405
  .field__option--focused {
1379
- background-color: var(--hx-select-option-hover-bg, var(--hx-color-primary-50, #eff6ff));
1406
+ background-color: var(--_option-hover-bg);
1380
1407
  outline: var(--hx-focus-ring-width, 2px) solid
1381
- var(--hx-select-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));
1408
+ var(--_focus-ring-color, var(--hx-color-primary-500));
1382
1409
  outline-offset: var(--hx-select-option-focus-ring-offset, -2px);
1383
1410
  }
1384
1411
 
1385
1412
  .field__option--focused.field__option--selected {
1386
- background-color: var(--hx-select-option-selected-bg, var(--hx-color-primary-100, #dbeafe));
1413
+ background-color: var(--_option-selected-bg);
1387
1414
  }
1388
1415
 
1389
1416
  .field__option--disabled {
@@ -1402,7 +1429,7 @@
1402
1429
  .field__no-options {
1403
1430
  padding: var(--hx-space-3, 0.75rem);
1404
1431
  text-align: center;
1405
- color: var(--hx-color-neutral-400, #adb5bd);
1432
+ color: var(--_placeholder-color);
1406
1433
  font-size: var(--hx-font-size-sm, 0.875rem);
1407
1434
  }
1408
1435
 
@@ -55,6 +55,8 @@
55
55
  0 2px 4px -2px rgb(0 0 0 / 0.1)
56
56
  );
57
57
  min-width: var(--hx-menu-min-width, 10rem);
58
+ max-height: var(--hx-menu-max-height, 20rem);
59
+ overflow-y: auto;
58
60
  outline: none;
59
61
  }
60
62
  /* ── hx-nav ── */
@@ -629,6 +631,13 @@
629
631
  :host {
630
632
  display: block;
631
633
  height: 100%;
634
+ /* Mirror the nav background and text on the host so slotted light-DOM
635
+ content (header, footer slots) inherits the correct dark surface color.
636
+ Without this, axe-core cannot resolve the background for slotted nodes
637
+ and evaluates their text against the page white background, producing
638
+ false-positive color-contrast violations (WCAG 2.1 AA). */
639
+ background-color: var(--hx-side-nav-bg, var(--hx-color-neutral-900, #0f172a));
640
+ color: var(--hx-side-nav-color, var(--hx-color-neutral-100, #f1f5f9));
632
641
  }
633
642
 
634
643
  * {
@@ -642,12 +651,12 @@
642
651
  flex-direction: column;
643
652
  height: 100%;
644
653
  width: var(--hx-side-nav-width, 16rem);
645
- background-color: var(--hx-side-nav-bg, var(--hx-color-neutral-900, #111827));
646
- color: var(--hx-side-nav-color, var(--hx-color-neutral-100, #f3f4f6));
654
+ background-color: var(--hx-side-nav-bg, var(--hx-color-neutral-900, #0f172a));
655
+ color: var(--hx-side-nav-color, var(--hx-color-neutral-100, #f1f5f9));
647
656
  transition: width var(--hx-transition-normal, 300ms) ease;
648
657
  overflow: hidden;
649
658
  border-inline-end: var(--hx-border-width-thin, 1px) solid
650
- var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #374151));
659
+ var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #334155));
651
660
  }
652
661
 
653
662
  /* ─── Collapsed State ─── */
@@ -665,7 +674,7 @@
665
674
  flex-shrink: 0;
666
675
  min-height: var(--hx-space-14, 3.5rem);
667
676
  border-bottom: var(--hx-border-width-thin, 1px) solid
668
- var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #374151));
677
+ var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #334155));
669
678
  overflow: hidden;
670
679
  }
671
680
 
@@ -692,7 +701,7 @@
692
701
  flex-shrink: 0;
693
702
  min-height: var(--hx-space-14, 3.5rem);
694
703
  border-top: var(--hx-border-width-thin, 1px) solid
695
- var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #374151));
704
+ var(--hx-side-nav-border-color, var(--hx-color-neutral-700, #334155));
696
705
  overflow: hidden;
697
706
  }
698
707
 
@@ -715,7 +724,7 @@
715
724
  border: none;
716
725
  border-radius: var(--hx-border-radius-sm, 0.25rem);
717
726
  background: transparent;
718
- color: var(--hx-side-nav-toggle-color, var(--hx-color-neutral-400, #9ca3af));
727
+ color: var(--hx-side-nav-toggle-color, var(--hx-color-neutral-400, #94a3b8));
719
728
  cursor: pointer;
720
729
  transition:
721
730
  background-color var(--hx-transition-fast, 150ms) ease,
@@ -727,7 +736,7 @@
727
736
  --hx-overlay-white-10,
728
737
  rgba(255, 255, 255, 0.1)
729
738
  ); /* fallback for browsers without color-mix() */
730
- color: var(--hx-color-neutral-100, #f3f4f6);
739
+ color: var(--hx-color-neutral-100, #f1f5f9);
731
740
  }
732
741
 
733
742
  @supports (color: color-mix(in srgb, red 50%, blue)) {
@@ -108,10 +108,27 @@
108
108
  }
109
109
 
110
110
  /* P1-B: Windows High Contrast Mode — avatar background is stripped by the system,
111
- leaving no visual boundary. Add a border so the avatar remains perceivable.
111
+ leaving no visual boundary. Restore a visible border, explicit foreground, and
112
+ background so the avatar container, initials, and fallback icon all remain
113
+ perceivable at any contrast level.
112
114
  WCAG 1.4.11 Non-text Contrast (Level AA). */
113
115
  @media (forced-colors: active) {
114
116
  .avatar {
117
+ forced-color-adjust: none;
115
118
  border: 2px solid ButtonText;
119
+ background-color: Canvas;
120
+ color: CanvasText;
121
+ }
122
+
123
+ .avatar__initials {
124
+ color: CanvasText;
125
+ }
126
+
127
+ .avatar__fallback-icon {
128
+ color: CanvasText;
129
+ }
130
+
131
+ .avatar__image {
132
+ forced-color-adjust: auto;
116
133
  }
117
134
  }
@@ -119,17 +119,21 @@
119
119
  display: none;
120
120
  }
121
121
 
122
+ .badge--dot slot[name='prefix'] {
123
+ display: none;
124
+ }
125
+
122
126
  /* ─── Pulse Animation ─── */
123
127
 
124
128
  @keyframes hx-badge-pulse {
125
129
  0%,
126
130
  100% {
127
131
  opacity: 1;
128
- box-shadow: 0 0 0 0 var(--hx-badge-pulse-color, currentColor);
132
+ box-shadow: 0 0 0 2px var(--hx-badge-pulse-color, currentColor);
129
133
  }
130
134
  50% {
131
135
  opacity: var(--hx-opacity-75, 0.75);
132
- box-shadow: 0 0 0 4px transparent;
136
+ box-shadow: 0 0 0 6px transparent;
133
137
  }
134
138
  }
135
139
 
@@ -260,3 +260,37 @@
260
260
  .button__label {
261
261
  flex: 1 1 auto;
262
262
  }
263
+
264
+ /* ─── High Contrast Mode (forced-colors) ─── */
265
+
266
+ @media (forced-colors: active) {
267
+ .button {
268
+ /* Ensure button outline is visible in Windows High Contrast mode.
269
+ ButtonText/ButtonFace are system colors recognized by the browser. */
270
+ forced-color-adjust: none;
271
+ background-color: ButtonFace;
272
+ color: ButtonText;
273
+ border: 2px solid ButtonText;
274
+ }
275
+
276
+ .button:focus-visible {
277
+ outline: 3px solid Highlight;
278
+ outline-offset: 2px;
279
+ }
280
+
281
+ .button[disabled] {
282
+ background-color: ButtonFace;
283
+ color: GrayText;
284
+ border-color: GrayText;
285
+ opacity: 1;
286
+ }
287
+
288
+ :host([disabled]) {
289
+ opacity: 1;
290
+ }
291
+
292
+ .button--loading .button__spinner {
293
+ /* Ensure spinner is visible in HCM */
294
+ forced-color-adjust: auto;
295
+ }
296
+ }
@@ -184,7 +184,8 @@
184
184
  }
185
185
 
186
186
  .clinical-status__dismiss-button:focus-visible {
187
- outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);
187
+ outline: var(--hx-focus-ring-width, 2px) solid
188
+ var(--hx-focus-ring-color, var(--hx-color-focus, #2563eb));
188
189
  outline-offset: var(--hx-focus-ring-offset, 2px);
189
190
  opacity: 1;
190
191
  }
@@ -229,7 +230,8 @@
229
230
  }
230
231
 
231
232
  .clinical-status__acknowledge-button:focus-visible {
232
- outline: var(--hx-focus-ring-width, 2px) solid var(--hx-focus-ring-color, #2563eb);
233
+ outline: var(--hx-focus-ring-width, 2px) solid
234
+ var(--hx-focus-ring-color, var(--hx-color-focus, #2563eb));
233
235
  outline-offset: var(--hx-focus-ring-offset, 2px);
234
236
  }
235
237
 
@@ -17,5 +17,7 @@
17
17
  0 2px 4px -2px rgb(0 0 0 / 0.1)
18
18
  );
19
19
  min-width: var(--hx-menu-min-width, 10rem);
20
+ max-height: var(--hx-menu-max-height, 20rem);
21
+ overflow-y: auto;
20
22
  outline: none;
21
23
  }
@@ -17,6 +17,7 @@
17
17
  --_value-color: var(--hx-patient-banner-value-color, var(--hx-color-neutral-900, #111827));
18
18
  --_value-font-size: var(--hx-patient-banner-value-font-size, var(--hx-font-size-sm, 0.875rem));
19
19
  --_photo-size: var(--hx-patient-banner-photo-size, var(--hx-space-10, 2.5rem));
20
+ --_photo-bg: var(--hx-patient-banner-photo-bg, var(--hx-color-neutral-200, #e5e7eb));
20
21
  }
21
22
 
22
23
  * {
@@ -34,6 +35,7 @@
34
35
  border-bottom: var(--hx-border-width-thin, 1px) solid var(--_border-color);
35
36
  font-family: var(--_font-family);
36
37
  width: 100%;
38
+ position: relative;
37
39
  }
38
40
 
39
41
  /* ─── Photo Area ─── */
@@ -42,12 +44,15 @@
42
44
  flex-shrink: 0;
43
45
  width: var(--_photo-size);
44
46
  height: var(--_photo-size);
47
+ /* Minimum 44x44px touch target for interactive photo content. */
48
+ min-width: 44px;
49
+ min-height: 44px;
45
50
  border-radius: var(--hx-border-radius-full, 9999px);
46
51
  overflow: hidden;
47
52
  display: flex;
48
53
  align-items: center;
49
54
  justify-content: center;
50
- background-color: var(--hx-color-neutral-200, #e5e7eb);
55
+ background-color: var(--_photo-bg);
51
56
  }
52
57
 
53
58
  /* ─── Fields Grid ─── */
@@ -93,9 +98,8 @@
93
98
  :host([aria-invalid='true']) .banner {
94
99
  border-bottom-color: var(--hx-color-error-400, #f87171);
95
100
  background-color: var(--hx-color-error-50, #fef2f2);
96
- /* Darken label color to maintain 4.5:1 contrast on error-50 background */
101
+ /* Darken label color to maintain 4.5:1 contrast on error-50 background. */
97
102
  --_label-color: var(--hx-patient-banner-label-color, var(--hx-color-neutral-700, #374151));
98
- position: relative;
99
103
  }
100
104
 
101
105
  :host([aria-invalid='true']) .banner::before {
@@ -109,3 +113,27 @@
109
113
  background-color: var(--hx-color-error-500, #ef4444);
110
114
  border-radius: 0;
111
115
  }
116
+
117
+ /* ─── Visually-hidden violation live region ─── */
118
+ /* Announces identifier rule violations to screen readers without visible text. */
119
+
120
+ .violation-message {
121
+ position: absolute;
122
+ width: 1px;
123
+ height: 1px;
124
+ padding: 0;
125
+ margin: -1px;
126
+ overflow: hidden;
127
+ clip: rect(0, 0, 0, 0);
128
+ white-space: nowrap;
129
+ border-width: 0;
130
+ }
131
+
132
+ /* ─── Motion reduction ─── */
133
+
134
+ @media (prefers-reduced-motion: reduce) {
135
+ * {
136
+ transition: none !important;
137
+ animation: none !important;
138
+ }
139
+ }
@@ -76,6 +76,18 @@
76
76
  pointer-events: none;
77
77
  }
78
78
 
79
+ /* ─── Disabled State ─── */
80
+
81
+ :host([disabled]) {
82
+ opacity: var(--hx-phi-field-disabled-opacity, var(--hx-opacity-50, 0.5));
83
+ pointer-events: none;
84
+ cursor: not-allowed;
85
+ }
86
+
87
+ .phi-field--disabled .phi-field__toggle {
88
+ cursor: not-allowed;
89
+ }
90
+
79
91
  /* ─── Reduced Motion ─── */
80
92
 
81
93
  @media (prefers-reduced-motion: reduce) {