@lmvz-ds/components 0.24.0 → 0.26.0

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 (140) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/cjs/{ds.constants-DSnxZ3ia.js → ds.constants-8fh6ItAF.js} +1 -1
  3. package/cjs/{index-lW-SEvL7.js → index-BCFBLj0e.js} +1 -1
  4. package/cjs/index.cjs.js +196 -2
  5. package/cjs/lmvz-action.cjs.entry.js +1 -1
  6. package/cjs/lmvz-button-group.cjs.entry.js +183 -0
  7. package/cjs/lmvz-button_2.cjs.entry.js +198 -0
  8. package/cjs/lmvz-card.cjs.entry.js +2 -2
  9. package/cjs/lmvz-checkbox.cjs.entry.js +5 -5
  10. package/cjs/lmvz-chip.cjs.entry.js +4 -4
  11. package/cjs/lmvz-components.cjs.js +3 -3
  12. package/cjs/lmvz-header_2.cjs.entry.js +2 -2
  13. package/cjs/lmvz-input.cjs.entry.js +3 -3
  14. package/cjs/lmvz-menuitem.cjs.entry.js +3 -3
  15. package/cjs/lmvz-modal.cjs.entry.js +5 -5
  16. package/cjs/lmvz-radio.cjs.entry.js +334 -0
  17. package/cjs/lmvz-select.cjs.entry.js +4 -4
  18. package/cjs/lmvz-snackbar.cjs.entry.js +83 -0
  19. package/cjs/lmvz-toggle.cjs.entry.js +7 -5
  20. package/cjs/loader.cjs.js +2 -2
  21. package/cjs/{reactive-controller-host-BOFg4vL-.js → reactive-controller-host-DrtMkMd7.js} +1 -1
  22. package/collection/api/ds.constants.js +4 -1
  23. package/collection/collection-manifest.json +3 -1
  24. package/collection/components/lmvz-button/lmvz-button.css +8 -8
  25. package/collection/components/lmvz-button-group/lmvz-button-group.css +1 -1
  26. package/collection/components/lmvz-card/lmvz-card.css +11 -11
  27. package/collection/components/lmvz-checkbox/lmvz-checkbox.css +8 -11
  28. package/collection/components/lmvz-checkbox/lmvz-checkbox.js +2 -2
  29. package/collection/components/lmvz-chip/lmvz-chip.css +3 -3
  30. package/collection/components/lmvz-icon/lmvz-icon.js +1 -1
  31. package/collection/components/lmvz-input/lmvz-input.css +5 -9
  32. package/collection/components/lmvz-menuitem/lmvz-menuitem.css +3 -3
  33. package/collection/components/lmvz-modal/lmvz-modal.css +21 -15
  34. package/collection/components/lmvz-modal/lmvz-modal.js +2 -2
  35. package/collection/components/lmvz-radio/lmvz-radio.css +182 -0
  36. package/collection/components/lmvz-radio/lmvz-radio.js +487 -0
  37. package/collection/components/lmvz-select/lmvz-select.css +3 -3
  38. package/collection/components/lmvz-select/lmvz-select.js +1 -1
  39. package/collection/components/lmvz-snackbar/lmvz-snackbar.css +101 -0
  40. package/collection/components/lmvz-snackbar/lmvz-snackbar.js +266 -0
  41. package/collection/components/lmvz-snackbar/public.js +1 -0
  42. package/collection/components/lmvz-snackbar/snackbar-controller.js +194 -0
  43. package/collection/components/lmvz-toggle/lmvz-toggle.css +4 -9
  44. package/collection/components/lmvz-toggle/lmvz-toggle.js +3 -3
  45. package/collection/index.js +1 -0
  46. package/collection/integration/header-integration/header-integration.js +1 -1
  47. package/collection/styles/fragments/_focus-within.css +13 -0
  48. package/collection/utils/radio/radio-group-controller.js +160 -0
  49. package/components/index.d.ts +4 -0
  50. package/components/index.d.ts.bak +4 -0
  51. package/components/index.js +1 -1
  52. package/components/lmvz-action.js +1 -1
  53. package/components/lmvz-button-group.js +1 -1
  54. package/components/lmvz-button.js +1 -1
  55. package/components/lmvz-card.js +1 -1
  56. package/components/lmvz-checkbox.js +1 -1
  57. package/components/lmvz-chip.js +1 -1
  58. package/components/lmvz-header.js +1 -1
  59. package/components/lmvz-icon.js +1 -1
  60. package/components/lmvz-input.js +1 -1
  61. package/components/lmvz-menuitem.js +1 -1
  62. package/components/lmvz-modal.js +1 -1
  63. package/components/lmvz-radio.d.ts +11 -0
  64. package/components/lmvz-radio.d.ts.bak +11 -0
  65. package/components/lmvz-radio.js +1 -0
  66. package/components/lmvz-select.js +1 -1
  67. package/components/lmvz-snackbar.d.ts +11 -0
  68. package/components/lmvz-snackbar.d.ts.bak +11 -0
  69. package/components/lmvz-snackbar.js +1 -0
  70. package/components/lmvz-toggle.js +1 -1
  71. package/components/{p-slgmfnHm.js → p-BOzeYzKk.js} +1 -1
  72. package/components/{p-Cg2XX_J-.js → p-DYa3zcGE.js} +1 -1
  73. package/components/{p-DOTK1OW3.js → p-JAKQdFhF.js} +1 -1
  74. package/components/{p-CcnyKhAw.js → p-WLZ7VWNX.js} +1 -1
  75. package/components/{p-CK8cAKcB.js → p-c7OzBK8f.js} +1 -1
  76. package/components/{p-DSvYtVoD.js → p-lsUdmjdw.js} +1 -1
  77. package/esm/{ds.constants-Bmi89ll1.js → ds.constants-BOOwq5dE.js} +1 -1
  78. package/esm/{index-Aa_425iY.js → index-CKYszC64.js} +1 -1
  79. package/esm/index.js +198 -1
  80. package/esm/lmvz-action.entry.js +1 -1
  81. package/esm/lmvz-button-group.entry.js +181 -0
  82. package/esm/lmvz-button_2.entry.js +195 -0
  83. package/esm/lmvz-card.entry.js +2 -2
  84. package/esm/lmvz-checkbox.entry.js +5 -5
  85. package/esm/lmvz-chip.entry.js +4 -4
  86. package/esm/lmvz-components.js +4 -4
  87. package/esm/lmvz-header_2.entry.js +2 -2
  88. package/esm/lmvz-input.entry.js +3 -3
  89. package/esm/lmvz-menuitem.entry.js +3 -3
  90. package/esm/lmvz-modal.entry.js +5 -5
  91. package/esm/lmvz-radio.entry.js +332 -0
  92. package/esm/lmvz-select.entry.js +4 -4
  93. package/esm/lmvz-snackbar.entry.js +81 -0
  94. package/esm/lmvz-toggle.entry.js +7 -5
  95. package/esm/loader.js +3 -3
  96. package/esm/{reactive-controller-host-CroMsXdS.js → reactive-controller-host-ZrGf1F2-.js} +1 -1
  97. package/hydrate/index.js +467 -19
  98. package/hydrate/index.mjs +467 -19
  99. package/lmvz-components/index.esm.js +1 -1
  100. package/lmvz-components/lmvz-components.esm.js +1 -1
  101. package/lmvz-components/{p-d1dacf7e.entry.js → p-01aeca60.entry.js} +1 -1
  102. package/lmvz-components/p-0a37e0f2.entry.js +1 -0
  103. package/lmvz-components/p-14c3d837.entry.js +1 -0
  104. package/lmvz-components/{p-4263c9b2.entry.js → p-24e63b0a.entry.js} +1 -1
  105. package/lmvz-components/p-25f045b2.entry.js +1 -0
  106. package/lmvz-components/{p-f6d1d9df.entry.js → p-3da301a6.entry.js} +1 -1
  107. package/lmvz-components/p-40228d48.entry.js +1 -0
  108. package/lmvz-components/p-4da9073a.entry.js +1 -0
  109. package/lmvz-components/p-6de9981f.entry.js +1 -0
  110. package/lmvz-components/{p-6f8cbc4f.entry.js → p-758078db.entry.js} +1 -1
  111. package/lmvz-components/{p-88adb9fa.entry.js → p-8dae99f1.entry.js} +1 -1
  112. package/lmvz-components/p-BOOwq5dE.js +1 -0
  113. package/lmvz-components/{p-BRl6zKXT.js → p-CwX1wKkM.js} +1 -1
  114. package/lmvz-components/{p-a7c3074a.entry.js → p-e1eaa7a2.entry.js} +1 -1
  115. package/lmvz-components/p-f5cece32.entry.js +1 -0
  116. package/lmvz-components/p-fe607f10.entry.js +1 -0
  117. package/manifest.json +892 -205
  118. package/package.json +9 -1
  119. package/types/api/ds.constants.d.ts +9 -1
  120. package/types/components/lmvz-radio/lmvz-radio.d.ts +42 -0
  121. package/types/components/lmvz-snackbar/lmvz-snackbar.d.ts +21 -0
  122. package/types/components/lmvz-snackbar/public.d.ts +2 -0
  123. package/types/components/lmvz-snackbar/snackbar-controller.d.ts +32 -0
  124. package/types/components.d.ts +237 -1
  125. package/types/index.d.ts +1 -0
  126. package/types/stencil-public-runtime.d.ts +1 -0
  127. package/types/utils/radio/radio-group-controller.d.ts +26 -0
  128. package/assets/icons/checkmark.svg +0 -4
  129. package/assets/icons/close-sm.svg +0 -3
  130. package/cjs/lmvz-button_3.cjs.entry.js +0 -375
  131. package/collection/assets/icons/checkmark.svg +0 -4
  132. package/collection/assets/icons/close-sm.svg +0 -3
  133. package/esm/lmvz-button_3.entry.js +0 -371
  134. package/lmvz-components/p-2824a56b.entry.js +0 -1
  135. package/lmvz-components/p-3846ba08.entry.js +0 -1
  136. package/lmvz-components/p-4f5c3c4a.entry.js +0 -1
  137. package/lmvz-components/p-Bmi89ll1.js +0 -1
  138. package/lmvz-components/p-b3b04d46.entry.js +0 -1
  139. package/lmvz-components/p-fefefc54.entry.js +0 -1
  140. /package/lmvz-components/{p-Aa_425iY.js → p-CKYszC64.js} +0 -0
@@ -66,7 +66,7 @@ h6 {
66
66
  --lmvz-button-padding-block: var(--lmvz-button-padding, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)));
67
67
  --lmvz-button-gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem));
68
68
  --lmvz-button-min-height: var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem));
69
- --lmvz-button-font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
69
+ --lmvz-button-font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
70
70
  Router);
71
71
  --lmvz-button-radius: var(--lmvz-component-input-radius-default, 999px);
72
72
  --lmvz-button-border-width: 0;
@@ -102,8 +102,8 @@ button > * {
102
102
  }
103
103
 
104
104
  button:focus-visible {
105
- outline: 2px solid var(--lmvz-semantic-color-border-active, #0f8acc);
106
- outline-offset: 2px;
105
+ outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
106
+ outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
107
107
  }
108
108
 
109
109
  button:is([disabled], .disabled) {
@@ -160,7 +160,7 @@ button.secondary:not([disabled], .disabled):active {
160
160
 
161
161
  button.tertiary {
162
162
  --lmvz-button-background: var(--lmvz-semantic-color-int-tertiary, #ffffff);
163
- --lmvz-button-color: var(--lmvz-semantic-color-int-on-tertiary, #545454);
163
+ --lmvz-button-color: var(--lmvz-semantic-color-int-on-tertiary, #000000);
164
164
  }
165
165
 
166
166
  button.tertiary:not([disabled], .disabled):hover {
@@ -176,18 +176,18 @@ button.tertiary:not([disabled], .disabled):active {
176
176
  button.small {
177
177
  --lmvz-button-padding-inline: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
178
178
  --lmvz-button-padding-block: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
179
- --lmvz-button-gap: var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.34rem + 0.13vw, 0.5rem));
179
+ --lmvz-button-gap: var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.31rem + 0.26vw, 0.63rem));
180
180
  --lmvz-button-min-height: var(--lmvz-component-input-size-sm, clamp(2rem, 1.94rem + 0.26vw, 2.25rem));
181
- --lmvz-button-font: var(--lmvz-typography-body-sm-strong, 500 clamp(0.75rem, 0.73rem + 0.06vw, 0.81rem) / 1.4
181
+ --lmvz-button-font: var(--lmvz-typography-body-sm-strong, 500 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5
182
182
  Router);
183
183
  }
184
184
 
185
185
  button.large {
186
186
  --lmvz-button-padding-inline: var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem));
187
187
  --lmvz-button-padding-block: var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem));
188
- --lmvz-button-gap: var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
188
+ --lmvz-button-gap: var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.69rem + 0.26vw, 1rem));
189
189
  --lmvz-button-min-height: var(--lmvz-component-input-size-lg, clamp(2.75rem, 2.69rem + 0.26vw, 3rem));
190
- --lmvz-button-font: var(--lmvz-typography-body-lg-strong, 500 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.4
190
+ --lmvz-button-font: var(--lmvz-typography-body-lg-strong, 500 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.5
191
191
  Router);
192
192
  }
193
193
 
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  justify-content: flex-end;
4
4
  gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem));
5
- font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
5
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
6
6
  Router);
7
7
 
8
8
  /* TODO(LDHCID-135): Action wrapping threshold remains an assumption and currently follows intrinsic content width */
@@ -67,7 +67,7 @@ h6 {
67
67
  --lmvz-button-padding-block: var(--lmvz-button-padding, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)));
68
68
  --lmvz-button-gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem));
69
69
  --lmvz-button-min-height: var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem));
70
- --lmvz-button-font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
70
+ --lmvz-button-font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
71
71
  Router);
72
72
  --lmvz-button-radius: var(--lmvz-component-input-radius-default, 999px);
73
73
  --lmvz-button-border-width: 0;
@@ -103,8 +103,8 @@ button > * {
103
103
  }
104
104
 
105
105
  button:focus-visible {
106
- outline: 2px solid var(--lmvz-semantic-color-border-active, #0f8acc);
107
- outline-offset: 2px;
106
+ outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
107
+ outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
108
108
  }
109
109
 
110
110
  button:is([disabled], .disabled) {
@@ -161,7 +161,7 @@ button.secondary:not([disabled], .disabled):active {
161
161
 
162
162
  button.tertiary {
163
163
  --lmvz-button-background: var(--lmvz-semantic-color-int-tertiary, #ffffff);
164
- --lmvz-button-color: var(--lmvz-semantic-color-int-on-tertiary, #545454);
164
+ --lmvz-button-color: var(--lmvz-semantic-color-int-on-tertiary, #000000);
165
165
  }
166
166
 
167
167
  button.tertiary:not([disabled], .disabled):hover {
@@ -177,18 +177,18 @@ button.tertiary:not([disabled], .disabled):active {
177
177
  button.small {
178
178
  --lmvz-button-padding-inline: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
179
179
  --lmvz-button-padding-block: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
180
- --lmvz-button-gap: var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.34rem + 0.13vw, 0.5rem));
180
+ --lmvz-button-gap: var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.31rem + 0.26vw, 0.63rem));
181
181
  --lmvz-button-min-height: var(--lmvz-component-input-size-sm, clamp(2rem, 1.94rem + 0.26vw, 2.25rem));
182
- --lmvz-button-font: var(--lmvz-typography-body-sm-strong, 500 clamp(0.75rem, 0.73rem + 0.06vw, 0.81rem) / 1.4
182
+ --lmvz-button-font: var(--lmvz-typography-body-sm-strong, 500 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5
183
183
  Router);
184
184
  }
185
185
 
186
186
  button.large {
187
187
  --lmvz-button-padding-inline: var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem));
188
188
  --lmvz-button-padding-block: var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem));
189
- --lmvz-button-gap: var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
189
+ --lmvz-button-gap: var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.69rem + 0.26vw, 1rem));
190
190
  --lmvz-button-min-height: var(--lmvz-component-input-size-lg, clamp(2.75rem, 2.69rem + 0.26vw, 3rem));
191
- --lmvz-button-font: var(--lmvz-typography-body-lg-strong, 500 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.4
191
+ --lmvz-button-font: var(--lmvz-typography-body-lg-strong, 500 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.5
192
192
  Router);
193
193
  }
194
194
 
@@ -205,7 +205,7 @@ button.large {
205
205
  }
206
206
  * {
207
207
  color: var(--lmvz-semantic-color-on-surface-primary, #000000);
208
- font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
208
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
209
209
  Router);
210
210
  }
211
211
  .top {
@@ -233,7 +233,7 @@ button.large {
233
233
 
234
234
  padding-bottom: var(--lmvz-global-s4, 4px);
235
235
  overflow-wrap: break-word;
236
- font: var(--lmvz-typography-heading-2xl, 500 clamp(2.25rem, 2.13rem + 0.52vw, 2.75rem) / 1.2
236
+ font: var(--lmvz-typography-heading-2xl, 500 clamp(2.25rem, 2.13rem + 0.52vw, 2.75rem) / 1.4
237
237
  Router);
238
238
  }
239
239
  .description {
@@ -243,7 +243,7 @@ button.large {
243
243
  align-items: flex-start;
244
244
  align-self: stretch;
245
245
  white-space: pre-line;
246
- font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
246
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
247
247
  Router);
248
248
  }
249
249
  .image-wrapper {
@@ -50,7 +50,7 @@
50
50
  --checkbox-border-color-error: var(--lmvz-semantic-color-status-on-danger, #e52a31);
51
51
 
52
52
  --checkbox-wrapper-bg-hover: var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0);
53
- --checkbox-wrapper-bg-checked: var(--lmvz-semantic-color-status-active, #f1f9fe);
53
+ --checkbox-wrapper-bg-checked: var(--lmvz-semantic-color-status-active, #f6fbfe);
54
54
 
55
55
  --checkbox-ripple-bg: var(--lmvz-semantic-color-int-secondary-hover, #e0e0e0);
56
56
 
@@ -117,20 +117,20 @@ input {
117
117
  min-width: 0;
118
118
  }
119
119
  label {
120
- font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
120
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
121
121
  Router);
122
122
  color: var(--checkbox-label-color);
123
123
  transition: color var(--checkbox-duration) var(--checkbox-easing);
124
124
  }
125
125
  .helper-text {
126
- font: var(--lmvz-typography-body-sm, 400 clamp(0.75rem, 0.73rem + 0.06vw, 0.81rem) / 1.4
126
+ font: var(--lmvz-typography-body-sm, 400 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5
127
127
  Router);
128
128
  /* font-weight: 400 per DS token standard (body-sm). Note: lmvz-input.css [role='status'] incorrectly uses font-weight: 500 — DS inconsistency, see lmvz-input.css line ~153 */
129
129
  color: var(--checkbox-helper-color);
130
130
  margin-block-start: 2px;
131
131
  }
132
132
  .error-text {
133
- font: var(--lmvz-typography-body-sm, 400 clamp(0.75rem, 0.73rem + 0.06vw, 0.81rem) / 1.4
133
+ font: var(--lmvz-typography-body-sm, 400 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5
134
134
  Router);
135
135
  color: var(--checkbox-error-color);
136
136
  display: block;
@@ -176,12 +176,9 @@ label {
176
176
  :host([disabled]) input {
177
177
  cursor: not-allowed;
178
178
  }
179
- /* Focus ring, applied via sibling combinator on the native input */
180
- input:focus-visible ~ .box {
181
- outline: 2px solid var(--checkbox-focus-color);
182
- outline-offset: 2px;
183
- /* box-shadow: 0 0 0 3px rgba(15, 138, 204, 0.2); TODO: no design token available for focus shadow color/spread */
184
- box-shadow: 0 var(--lmvz-semantic-shadow-l1-1-position-y, 2px) 0 var(--lmvz-semantic-shadow-l1-1-blur, 4px) var(--lmvz-semantic-color-shadow-l1-colored, rgba(175, 223, 249, 0.42));
179
+ :host(:focus-within) .pill {
180
+ outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
181
+ outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
185
182
  }
186
183
  /* Forced Colors / Windows High Contrast */
187
184
  @media (forced-colors: active) {
@@ -204,7 +201,7 @@ input:focus-visible ~ .box {
204
201
  color: HighlightText;
205
202
  }
206
203
 
207
- input:focus-visible ~ .box {
204
+ :host(:focus-within) .pill {
208
205
  outline-color: Highlight;
209
206
  box-shadow: none;
210
207
  }
@@ -1,6 +1,6 @@
1
+ import checkmark from "@lmvz-ds/icons/assets/checkmark.svg";
1
2
  import { toValidSvgStringWithFallback } from "@lmvz-ds/lib-ts/validation/svg.js";
2
3
  import { h, Host } from "@stencil/core";
3
- import checkmark from "../../assets/icons/checkmark.svg";
4
4
  import { AriaValidationController } from "../../utils/aria/aria-validation-controller";
5
5
  import { ReactiveControllerHost } from "../../utils/reactive-controller-host";
6
6
  const CHECKMARK_SVG = toValidSvgStringWithFallback(checkmark);
@@ -83,7 +83,7 @@ export class LmvzCheckbox extends ReactiveControllerHost {
83
83
  this.lmvzChange.emit(this.checked);
84
84
  };
85
85
  render() {
86
- return (h(Host, { key: '70201fa49465f1e29b98bb251ea254be0293b1df' }, h("div", { key: 'dfeb788e3e2d9a8329e7798954c744eee616692e', class: "pill" }, h("input", { key: '79fefaa297a5fbbb1b7f180c7cf4cccf8650a1f0', type: "checkbox", id: this.checkboxId, checked: this.checkedState, disabled: this.disabled, required: this.required, "aria-required": this.required ? 'true' : 'false', "aria-invalid": this.error ? 'true' : 'false', "aria-describedby": this.ariaDescribedBy, "aria-errormessage": this.error && this.errorId ? this.errorId : undefined, ref: (el) => (this.nativeInput = el), onChange: this.handleChange, autoFocus: this.autofocus }), h("span", { key: '8808a026274979678515b3e750065af38d62fff9', class: "box", "aria-hidden": "true" }, this.checkedState && h("span", { key: '861c08fb2a5cc6f24d3ae0a9f28cb6d2f51beda4', class: "indicator", innerHTML: CHECKMARK_SVG })), h("span", { key: '6dc36656d76bd3a6816553b4dcbdbea2c9bd2b0f', class: "content" }, h("label", { key: 'c343c4261e2eb231925d0f3ca0a83f9f3cdd0b9b', htmlFor: this.checkboxId }, this.label), this.helperText && (h("span", { key: '8473ed19adfe975b715a5e0b78c949c6b11de99e', class: "helper-text", id: this.helperId, role: "status" }, this.helperText)))), this.errorMessage && (h("span", { key: 'e934cec1cc622908188cf9090e24988e5df45799', class: "error-text", id: this.errorId, role: "alert" }, this.errorMessage))));
86
+ return (h(Host, { key: '158efacac5c28a18003149d4acb0d1cf5385cef4' }, h("div", { key: '5deaf853f9c465b70b7e5472579c5d5212105c34', class: "pill" }, h("input", { key: '7e8da452d41cd48293569ec60dad0585ff3290f1', type: "checkbox", id: this.checkboxId, checked: this.checkedState, disabled: this.disabled, required: this.required, "aria-required": this.required ? 'true' : 'false', "aria-invalid": this.error ? 'true' : 'false', "aria-describedby": this.ariaDescribedBy, "aria-errormessage": this.error && this.errorId ? this.errorId : undefined, ref: (el) => (this.nativeInput = el), onChange: this.handleChange, autoFocus: this.autofocus }), h("span", { key: 'd1ee72be8e3fc2b4e70ff64b70bfcec93f08f063', class: "box", "aria-hidden": "true" }, this.checkedState && h("span", { key: '73e123aa8c91e9098b4d8bbd48bbc7bae6c12383', class: "indicator", innerHTML: CHECKMARK_SVG })), h("span", { key: '2a161e6db9e792dca1fa24c1562bd0b79d62235b', class: "content" }, h("label", { key: 'fb38792095bf6da433867472d866d6700db45dac', htmlFor: this.checkboxId }, this.label), this.helperText && (h("span", { key: 'b8c16fc4782f67e1dca82329d081943a7d75a524', class: "helper-text", id: this.helperId, role: "status" }, this.helperText)))), this.errorMessage && (h("span", { key: '87d6940217d379777e26c578cff761dcfd96e79a', class: "error-text", id: this.errorId, role: "alert" }, this.errorMessage))));
87
87
  }
88
88
  static get is() { return "lmvz-checkbox"; }
89
89
  static get encapsulation() { return "scoped"; }
@@ -7,7 +7,7 @@
7
7
  padding-inline: var(--lmvz-dimension-8-10, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem));
8
8
  border: 1px solid var(--lmvz-chip-border-color);
9
9
  border-radius: var(--lmvz-semantic-border-radius-round, 999px);
10
- font: var(--lmvz-typography-body-xs-strong, 500 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.4
10
+ font: var(--lmvz-typography-body-xs-strong, 500 clamp(0.63rem, 0.61rem + 0.06vw, 0.69rem) / 1.5
11
11
  Router);
12
12
  background-color: var(--lmvz-chip-background-color);
13
13
  color: var(--lmvz-chip-foreground-color);
@@ -34,7 +34,7 @@
34
34
  :host([size='small']) {
35
35
  padding-block: var(--lmvz-dimension-2-4, clamp(0.13rem, 0.09rem + 0.13vw, 0.25rem));
36
36
  padding-inline: var(--lmvz-dimension-6-8, clamp(0.38rem, 0.34rem + 0.13vw, 0.5rem));
37
- font: var(--lmvz-typography-body-2xs-strong, 500 clamp(0.63rem, 0.61rem + 0.06vw, 0.69rem) / 1.4
37
+ font: var(--lmvz-typography-body-2xs-strong, 500 clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem) / 1.5
38
38
  Router);
39
39
  gap: var(--lmvz-dimension-2-4, clamp(0.13rem, 0.09rem + 0.13vw, 0.25rem));
40
40
  }
@@ -57,7 +57,7 @@
57
57
 
58
58
  :host([type='active']) {
59
59
  --lmvz-chip-border-color: var(--lmvz-semantic-color-status-on-active-subtle, #c1e6fa);
60
- --lmvz-chip-background-color: var(--lmvz-semantic-color-status-active, #f1f9fe);
60
+ --lmvz-chip-background-color: var(--lmvz-semantic-color-status-active, #f6fbfe);
61
61
  --lmvz-chip-foreground-color: var(--lmvz-semantic-color-status-on-active, #0e7ab4);
62
62
  }
63
63
 
@@ -124,7 +124,7 @@ export class LmvzIcon extends ReactiveControllerHost {
124
124
  "mutable": false,
125
125
  "complexType": {
126
126
  "original": "Icon.IconWeight",
127
- "resolved": "\"bold\" | \"filled\" | \"medium\" | \"thin\" | undefined",
127
+ "resolved": "\"bold\" | \"medium\" | \"thin\" | undefined",
128
128
  "references": {
129
129
  "Icon": {
130
130
  "location": "import",
@@ -50,9 +50,9 @@
50
50
  --input-height: 48px; /* From Figma input-size=48 */
51
51
  --input-padding-x: 16px;
52
52
 
53
- --label-color: var(--lmvz-semantic-color-on-surface-input-secondary, #7a7a7a);
53
+ --label-color: var(--lmvz-semantic-color-on-surface-input-secondary, #545454);
54
54
  --input-text-color: var(--lmvz-semantic-color-on-surface-input-primary, #000000);
55
- --helper-text-color: var(--lmvz-semantic-color-on-surface-input-secondary, #7a7a7a);
55
+ --helper-text-color: var(--lmvz-semantic-color-on-surface-input-secondary, #545454);
56
56
  --error-text-color: var(--lmvz-semantic-color-status-on-danger, #e52a31);
57
57
 
58
58
  --label-floating-scale: 0.85; /* 14px -> 12px approx */
@@ -87,13 +87,9 @@
87
87
  pointer-events: none;
88
88
  }
89
89
  .input-container:focus-within .input-wrapper {
90
- border-color: var(--input-border-color-focus);
91
- outline: 2px solid var(--input-border-color-focus);
92
- outline-offset: 2px;
93
- }
94
- /* Enhanced focus indicator for keyboard users */
95
- .input-container:has(input:focus-visible) .input-wrapper {
96
- box-shadow: 0 0 0 3px rgb(0 86 214 / 20%);
90
+ /* border-color: var(--input-border-color-focus); */
91
+ outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
92
+ outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
97
93
  }
98
94
  /* Error State */
99
95
  :host([error]) .input-wrapper {
@@ -44,12 +44,12 @@
44
44
  justify-content: center;
45
45
  gap: var(--lmvz-component-input-md-gap-x, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem));
46
46
  border-radius: var(--lmvz-semantic-border-radius-lg, 14px);
47
- font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
47
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
48
48
  Router);
49
49
  padding: var(--lmvz-component-input-md-padding-y, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)) var(--lmvz-component-input-md-padding-x, clamp(0.75rem, 0.69rem + 0.26vw, 1rem));
50
50
  cursor: pointer;
51
51
 
52
- --lmvz-menuitem-color: var(--lmvz-semantic-color-int-on-tertiary, #545454);
52
+ --lmvz-menuitem-color: var(--lmvz-semantic-color-int-on-tertiary, #000000);
53
53
  --lmvz-menuitem-background: var(--lmvz-semantic-color-int-tertiary, #ffffff);
54
54
 
55
55
  background: var(--lmvz-menuitem-background);
@@ -66,6 +66,6 @@
66
66
  z-index: 1;
67
67
  }
68
68
  :host([aria-expanded='true']) {
69
- --lmvz-menuitem-background: var(--lmvz-semantic-color-status-active, #f1f9fe);
69
+ --lmvz-menuitem-background: var(--lmvz-semantic-color-status-active, #f6fbfe);
70
70
  --lmvz-menuitem-color: var(--lmvz-semantic-color-status-on-active, #0e7ab4);
71
71
  }
@@ -66,6 +66,9 @@ dialog {
66
66
  border: none;
67
67
  padding: 0;
68
68
  background: transparent;
69
+ height: 100vh;
70
+ width: 100vw;
71
+ contain: layout size;
69
72
  }
70
73
  dialog::backdrop {
71
74
  /* TODO(LDHCID-135): Missing token for the modal backdrop color */
@@ -74,18 +77,23 @@ dialog::backdrop {
74
77
  background: rgb(from var(--lmvz-semantic-color-int-primary, #000000) r g b / 0.29);
75
78
  }
76
79
  .modal-shell {
77
- position: relative;
80
+ margin-inline: auto;
81
+ top: 50%;
82
+ transform: translateY(-50%);
83
+
84
+ box-sizing: border-box;
85
+ width: fit-content;
86
+ max-height: 100%;
87
+ max-width: clamp(20rem, 100%, 90vw);
88
+
78
89
  display: flex;
79
90
  flex-direction: column;
80
- inline-size: fit-content;
81
- max-inline-size: clamp(40rem, 100%, 80vw);
82
91
  gap: var(--lmvz-modal-shell-gap);
83
- padding-block: var(--lmvz-component-modal-padding-y, clamp(2.25rem, 2.19rem + 0.26vw, 2.5rem));
84
- padding-inline: var(--lmvz-component-modal-padding-x, clamp(1.5rem, 1.14rem + 1.55vw, 3rem));
85
- border-radius: var(--lmvz-component-modal-border-radius, 18px);
92
+ padding: var(--lmvz-component-wrapper-lg-padding-y, clamp(2.25rem, 2.19rem + 0.26vw, 2.5rem)) var(--lmvz-component-wrapper-lg-padding-x, clamp(1.5rem, 1.14rem + 1.55vw, 3rem));
93
+ border-radius: var(--lmvz-component-wrapper-lg-border-radius, 18px);
86
94
  background: var(--lmvz-semantic-color-surface-primary, #ffffff);
87
- /* TODO(LDHCID-135): clarify overflow behaviour */
88
- overflow: auto;
95
+
96
+ position: relative;
89
97
 
90
98
  .close-button {
91
99
  position: absolute;
@@ -93,11 +101,6 @@ dialog::backdrop {
93
101
  right: var(--lmvz-dimension-10-12, clamp(0.63rem, 0.59rem + 0.13vw, 0.75rem));
94
102
  }
95
103
  }
96
- @media (min-width: 768px) {
97
- .modal-shell {
98
- max-inline-size: 100vw;
99
- }
100
- }
101
104
  .header {
102
105
  display: flex;
103
106
  align-items: flex-start;
@@ -106,13 +109,16 @@ dialog::backdrop {
106
109
  }
107
110
  .title {
108
111
  min-inline-size: 0;
109
- font: var(--lmvz-typography-heading-lg, 500 clamp(1.25rem, 1.19rem + 0.26vw, 1.5rem) / 1.4
112
+ font: var(--lmvz-typography-heading-lg, 500 clamp(1.25rem, 1.19rem + 0.26vw, 1.5rem) / 1.5
110
113
  Router);
111
114
  }
112
115
  .has-title .title {
113
116
  flex: 1 1 auto;
114
117
  }
115
118
  .body {
116
- font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.4
119
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
117
120
  Router);
121
+ flex: 1;
122
+ overflow: scroll;
123
+ /* min-block-size: clamp(8rem, 40vw, 60vh); */
118
124
  }
@@ -1,6 +1,6 @@
1
+ import closeIcon from "@lmvz-ds/icons/assets/close-sm.svg";
1
2
  import { toValidSvgStringWithFallback } from "@lmvz-ds/lib-ts/validation/svg.js";
2
3
  import { Host, h } from "@stencil/core";
3
- import closeIcon from "../../assets/icons/close-sm.svg";
4
4
  import { AriaValidationController } from "../../utils/aria/aria-validation-controller";
5
5
  import { getDeepActiveElement, inheritAriaAttributes } from "../../utils/component";
6
6
  import { ReactiveControllerHost } from "../../utils/reactive-controller-host";
@@ -223,7 +223,7 @@ export class LmvzModal extends ReactiveControllerHost {
223
223
  this.hasHeader = this.hasAssignedContent(this.headerSlot);
224
224
  };
225
225
  render() {
226
- return (h(Host, { key: 'f014c692b82fae6dd96dffdbda4043aa9174004f' }, h("dialog", { key: '8939eda4aba44f1b6c9e8983cacddba83f668692', ref: (element) => (this.dialogEl = element), onCancel: this.handleDialogCancel, onClose: this.handleDialogClose, ...this.dialogAccessibilityAttributes }, h("div", { key: '93f43c5f7c258494c86f9604b7eeac0046f912d6', class: "modal-shell" }, h("header", { key: '2e8177a5e0812007fede430533e6a0aa9b7bc0ea', class: { header: true, 'has-title': this.hasHeader } }, h("div", { key: 'fb4b537386077b837758f4b61c45433ad6c747cc', class: "title", id: this.dialogTitleId, hidden: !this.hasHeader }, h("slot", { key: '2507b2b7af3b18e859e87b7d682bdf189c4df53d', name: "header", ref: (element) => (this.headerSlot = element), onSlotchange: this.handleHeaderSlotChange })), h("lmvz-button", { key: '5e4bcd8771babae9a9dc34fc908eb9210639a497', ref: (element) => (this.closeButtonEl = element), type: "button", class: "close-button", "aria-label": this.closeLabel, onClick: this.handleCloseButtonClick, variant: "tertiary" }, h("lmvz-icon", { key: '32aada0eea679fd1610eb704ac02cca1f27168ff', icon: closeIconSvg }))), h("div", { key: '1dc811f3edcd9ab1611483c90345483fee94b318', class: "body" }, h("slot", { key: 'cf870234c54d659cdd85d1a736626707f65cca4a' })), h("footer", { key: 'c2ed7badb41a09d1187af2221f33fc2a87bcb606', class: "actions", hidden: !this.buttonGroupEl?.hasActions }, h("lmvz-button-group", { key: 'c4846b44ff94b0411d79d88b3bb8447dd2a5967a', ref: (element) => (this.buttonGroupEl = element) }, h("slot", { key: '3aa5aa7b3a5d68c5c3c2da1739bee57316db07ff', name: "actions" })))))));
226
+ return (h(Host, { key: '1fbdbb1ab2d3ad423075465108d4ff807d07404e' }, h("dialog", { key: '622dd60366ad594e16471cc8921c97d23af14ccb', ref: (element) => (this.dialogEl = element), onCancel: this.handleDialogCancel, onClose: this.handleDialogClose, ...this.dialogAccessibilityAttributes }, h("div", { key: 'bcdfbefbd5f380e2bf946aed479d542a33927af1', class: "modal-shell" }, h("header", { key: 'dcd23467473d58b51bddaf613b3ac8c922eecdc6', class: { header: true, 'has-title': this.hasHeader } }, h("div", { key: 'b2aa21fda4a80d2ea003e6ec876c2b74df5d29fd', class: "title", id: this.dialogTitleId, hidden: !this.hasHeader }, h("slot", { key: 'b7238e5b24c0822a94087d4ff0567e6406542c73', name: "header", ref: (element) => (this.headerSlot = element), onSlotchange: this.handleHeaderSlotChange })), h("lmvz-button", { key: '5059671fb4d81c685becd3adb0be52dd92ec4dec', ref: (element) => (this.closeButtonEl = element), type: "button", class: "close-button", "aria-label": this.closeLabel, onClick: this.handleCloseButtonClick, variant: "tertiary" }, h("lmvz-icon", { key: '498447e60e0e33fc165f39cea35434080e869d3c', icon: closeIconSvg }))), h("div", { key: '39ecefb52d5990cb689b0e4f18a8b6fc501c840d', class: "body" }, h("slot", { key: 'b014d0633c28fb6b399f11f2323e102949548776' })), h("footer", { key: '201dae98bcf810f369d77b7e9f36d7cc71ed5db4', class: "actions", hidden: !this.buttonGroupEl?.hasActions }, h("lmvz-button-group", { key: 'e4559d383992e059f915670a0874cc3b9ef655a3', ref: (element) => (this.buttonGroupEl = element) }, h("slot", { key: '88b007e139d4a166a2ee886dcd0256293d5d33c9', name: "actions" })))))));
227
227
  }
228
228
  static get is() { return "lmvz-modal"; }
229
229
  static get encapsulation() { return "shadow"; }
@@ -0,0 +1,182 @@
1
+
2
+ @layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides;
3
+ /**
4
+ * This defines the order of our lmvz-ds' CSS layers. See readme.md for details.
5
+ * Important: Always import this file _before_ layering your own styles!
6
+ */
7
+ @layer lmvz-ds.theme {
8
+ /**
9
+ * !CAUTION: Changes to this file have to be manually synced into `/packages/styles/src/no-transform/router-font.css`
10
+ */
11
+
12
+ @font-face {
13
+ font-family: Router;
14
+ src:
15
+ local('RouterBook-Regular'),
16
+ local('Router-Book'),
17
+ url('/assets/fonts/Router-Book.woff') format('woff');
18
+ font-weight: 400;
19
+ }
20
+
21
+ @font-face {
22
+ font-family: Router;
23
+ src:
24
+ local('RouterMedium-Regular'),
25
+ local('Router-Medium'),
26
+ url('/assets/fonts/Router-Medium.woff') format('woff');
27
+ font-weight: 500;
28
+ }
29
+
30
+ @font-face {
31
+ font-family: Router;
32
+ src:
33
+ local('RouterBold-Regular'),
34
+ local('Router-Bold'),
35
+ url('/assets/fonts/Router-Bold.woff') format('woff');
36
+ font-weight: 700;
37
+ }
38
+
39
+ }
40
+ :host {
41
+ display: inline-block;
42
+
43
+ --radio-circle-size: var(--lmvz-global-s18, 18px);
44
+ --radio-dot-size: 0.5rem;
45
+
46
+ --radio-bg: var(--lmvz-semantic-color-surface-input-primary, #ffffff);
47
+ --radio-border-color: var(--lmvz-semantic-color-border-default, #e0e0e0);
48
+ --radio-border-color-hover: var(--lmvz-semantic-color-border-hover, #c7c7c7);
49
+ --radio-border-color-checked: var(--lmvz-semantic-color-border-active, #0f8acc);
50
+ --radio-border-color-error: var(--lmvz-semantic-color-status-on-danger, #e52a31);
51
+ --radio-dot-color: var(--lmvz-semantic-color-border-active, #0f8acc);
52
+
53
+ --radio-wrapper-bg-hover: var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0);
54
+ --radio-wrapper-bg-active: var(--lmvz-semantic-color-int-tertiary-active, #e0e0e0);
55
+
56
+ --radio-label-color: var(--lmvz-semantic-color-on-surface-primary, #000000);
57
+ --radio-label-color-checked: var(--lmvz-semantic-color-status-on-active, #0e7ab4);
58
+ --radio-helper-color: var(--lmvz-semantic-color-on-surface-secondary, #7a7a7a);
59
+
60
+ --radio-easing: var(--lmvz-global-easing-default, ease);
61
+ --radio-duration: 0.2s;
62
+
63
+ display: flex;
64
+ align-items: center;
65
+ gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem));
66
+ padding-block: var(--lmvz-dimension-2-8, clamp(0.13rem, 0.03rem + 0.39vw, 0.5rem));
67
+ padding-inline: var(--lmvz-dimension-8-12, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem));
68
+ border-radius: var(--lmvz-semantic-border-radius-round, 999px);
69
+ overflow: clip;
70
+ cursor: pointer;
71
+ background-color: transparent;
72
+ position: relative;
73
+ transition: background-color var(--radio-duration) var(--radio-easing);
74
+ }
75
+ input {
76
+ position: absolute;
77
+ inset-block-start: var(--lmvz-dimension-2-8, clamp(0.13rem, 0.03rem + 0.39vw, 0.5rem));
78
+ inset-inline-start: var(--lmvz-dimension-4-10, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem));
79
+ opacity: 0;
80
+ width: var(--radio-circle-size);
81
+ height: var(--radio-circle-size);
82
+ margin: 0;
83
+ cursor: pointer;
84
+ z-index: 1;
85
+ }
86
+ .circle {
87
+ width: var(--radio-circle-size);
88
+ height: var(--radio-circle-size);
89
+ border-radius: 50%;
90
+ border: var(--lmvz-semantic-border-width-default, 1px) solid var(--radio-border-color);
91
+ background-color: var(--radio-bg);
92
+ pointer-events: none;
93
+ flex-shrink: 0;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ box-sizing: border-box;
98
+ transition: border-color var(--radio-duration) var(--radio-easing);
99
+ }
100
+ .dot {
101
+ width: var(--radio-dot-size);
102
+ height: var(--radio-dot-size);
103
+ border-radius: 50%;
104
+ background-color: var(--radio-dot-color);
105
+ }
106
+ .content {
107
+ display: flex;
108
+ flex-direction: column;
109
+ overflow-wrap: break-word;
110
+ min-width: 0;
111
+ }
112
+ label {
113
+ font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
114
+ Router);
115
+ color: var(--radio-label-color);
116
+ cursor: pointer;
117
+ transition: color var(--radio-duration) var(--radio-easing);
118
+ }
119
+ .helper-text {
120
+ display: block;
121
+ font: var(--lmvz-typography-body-sm, 400 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5
122
+ Router);
123
+ color: var(--radio-helper-color);
124
+ margin-block-start: 2px;
125
+ }
126
+ .helper-text:empty {
127
+ display: none;
128
+ }
129
+ /* Hover state, guarded to prevent sticky hover on touch devices */
130
+ @media (hover: hover) {
131
+ :host(:hover) .circle {
132
+ border-color: var(--radio-border-color-hover);
133
+ }
134
+
135
+ :host(:hover) {
136
+ background-color: var(--radio-wrapper-bg-hover);
137
+ }
138
+ }
139
+ /* Active state */
140
+ :host(:active) {
141
+ background-color: var(--radio-wrapper-bg-active);
142
+ }
143
+ /* Checked state */
144
+ :host([checked]) .circle {
145
+ border-color: var(--radio-border-color-checked);
146
+ }
147
+ :host([checked]) label {
148
+ color: var(--radio-label-color-checked);
149
+ }
150
+ /* Error state. MUST appear AFTER checked state rules (error takes visual precedence) */
151
+ :host([error]) .circle {
152
+ border-color: var(--radio-border-color-error);
153
+ }
154
+ :host([error]) .helper-text {
155
+ color: var(--lmvz-semantic-color-status-on-danger, #e52a31);
156
+ }
157
+ /* Disabled state */
158
+ :host([disabled]) {
159
+ opacity: var(--lmvz-component-input-disabled-opacity, 40%);
160
+ pointer-events: none;
161
+ cursor: not-allowed;
162
+ }
163
+ /* Forced Colors / Windows High Contrast */
164
+ @media (forced-colors: active) {
165
+ .circle {
166
+ forced-color-adjust: auto;
167
+ border-color: ButtonText;
168
+ background-color: Field;
169
+ }
170
+
171
+ :host([checked]) .circle {
172
+ border-color: Highlight;
173
+ }
174
+
175
+ .dot {
176
+ background-color: ButtonText;
177
+ }
178
+
179
+ :host([checked]) .dot {
180
+ background-color: HighlightText;
181
+ }
182
+ }