@lmvz-ds/components 0.38.0 → 0.40.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 (114) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +12 -20
  3. package/cjs/{directional-focus-controller-8Xd_7MHT.js → directional-focus-controller-DDnhfX5w.js} +15 -5
  4. package/cjs/index.cjs.js +3 -195
  5. package/cjs/lmvz-action-list.cjs.entry.js +2 -2
  6. package/cjs/lmvz-button-group.cjs.entry.js +4 -0
  7. package/cjs/lmvz-button_2.cjs.entry.js +1 -1
  8. package/cjs/lmvz-card.cjs.entry.js +1 -1
  9. package/cjs/lmvz-components.cjs.js +1 -1
  10. package/cjs/lmvz-header_2.cjs.entry.js +3 -3
  11. package/cjs/lmvz-message.cjs.entry.js +2 -0
  12. package/cjs/lmvz-popover.cjs.entry.js +1 -1
  13. package/cjs/lmvz-select.cjs.entry.js +2 -3
  14. package/cjs/lmvz-tab.cjs.entry.js +3 -3
  15. package/cjs/lmvz-tabs.cjs.entry.js +43 -44
  16. package/cjs/loader.cjs.js +1 -1
  17. package/cjs/public-DTgpEs1_.js +206 -0
  18. package/collection/components/lmvz-action-list/lmvz-action-list.css +119 -116
  19. package/collection/components/lmvz-button/lmvz-button.css +109 -106
  20. package/collection/components/lmvz-card/lmvz-card.css +106 -103
  21. package/collection/components/lmvz-header/lmvz-header.js +2 -2
  22. package/collection/components/lmvz-select/lmvz-select.css +58 -43
  23. package/collection/components/lmvz-select/lmvz-select.js +1 -25
  24. package/collection/components/lmvz-snackbar/public.js +3 -0
  25. package/collection/components/lmvz-tab/lmvz-tab.css +0 -13
  26. package/collection/components/lmvz-tab/lmvz-tab.js +10 -14
  27. package/collection/components/lmvz-tabs/lmvz-tabs.css +0 -5
  28. package/collection/components/lmvz-tabs/lmvz-tabs.js +50 -65
  29. package/collection/utils/aria/directional-focus-controller.js +16 -7
  30. package/collection/utils/icons/public.js +3 -0
  31. package/components/index.js +1 -1
  32. package/components/lmvz-action-list.js +1 -1
  33. package/components/lmvz-button-group.js +1 -1
  34. package/components/lmvz-button.js +1 -1
  35. package/components/lmvz-card.js +1 -1
  36. package/components/lmvz-datepicker.js +1 -1
  37. package/components/lmvz-header.js +1 -1
  38. package/components/lmvz-icon.js +1 -1
  39. package/components/lmvz-input.js +1 -1
  40. package/components/lmvz-link.js +1 -1
  41. package/components/lmvz-menuitem.js +1 -1
  42. package/components/lmvz-message.js +1 -1
  43. package/components/lmvz-modal.js +1 -1
  44. package/components/lmvz-popover.js +1 -1
  45. package/components/lmvz-select.js +1 -1
  46. package/components/lmvz-snackbar.js +1 -1
  47. package/components/lmvz-tab.js +1 -1
  48. package/components/lmvz-tabs.js +1 -1
  49. package/components/{p-CcP_sfo8.js → p--mU29mrX.js} +1 -1
  50. package/components/p-BPa0FHVO.js +1 -0
  51. package/components/{p-SnHLBAbf.js → p-Bc5MM0zh.js} +1 -1
  52. package/components/p-CyDgnpOB.js +1 -0
  53. package/components/{p-C-pRMuMh.js → p-DIyiticz.js} +1 -1
  54. package/components/{p-BhALzK62.js → p-DJLdOjL4.js} +1 -1
  55. package/components/{p-B6bUOPCG.js → p-DSDBThqb.js} +1 -1
  56. package/components/p-DXhP6UeF.js +1 -0
  57. package/components/p-DsTgD0_a.js +1 -0
  58. package/components/p-DyQ1GbaN.js +1 -0
  59. package/components/p-niXjuPxe.js +1 -0
  60. package/esm/{directional-focus-controller-QukTTWBE.js → directional-focus-controller-CJ0yNC00.js} +15 -5
  61. package/esm/index.js +1 -197
  62. package/esm/lmvz-action-list.entry.js +2 -2
  63. package/esm/lmvz-button-group.entry.js +4 -0
  64. package/esm/lmvz-button_2.entry.js +1 -1
  65. package/esm/lmvz-card.entry.js +1 -1
  66. package/esm/lmvz-components.js +1 -1
  67. package/esm/lmvz-header_2.entry.js +3 -3
  68. package/esm/lmvz-message.entry.js +2 -0
  69. package/esm/lmvz-popover.entry.js +1 -1
  70. package/esm/lmvz-select.entry.js +2 -3
  71. package/esm/lmvz-tab.entry.js +3 -3
  72. package/esm/lmvz-tabs.entry.js +43 -44
  73. package/esm/loader.js +1 -1
  74. package/esm/public-m6pRVUeP.js +204 -0
  75. package/hydrate/index.js +280 -66
  76. package/hydrate/index.mjs +280 -66
  77. package/lmvz-components/index.esm.js +1 -1
  78. package/lmvz-components/lmvz-components.esm.js +1 -1
  79. package/lmvz-components/p-143e9621.entry.js +1 -0
  80. package/lmvz-components/p-220e455e.entry.js +1 -0
  81. package/lmvz-components/p-304c7554.entry.js +1 -0
  82. package/lmvz-components/p-316dd61a.entry.js +1 -0
  83. package/lmvz-components/{p-1e1dea53.entry.js → p-41286514.entry.js} +1 -1
  84. package/lmvz-components/p-93b781ca.entry.js +1 -0
  85. package/lmvz-components/p-BPa0FHVO.js +1 -0
  86. package/lmvz-components/p-BlkpdeQI.js +1 -0
  87. package/lmvz-components/p-c884c76e.entry.js +1 -0
  88. package/lmvz-components/p-ebad823c.entry.js +1 -0
  89. package/lmvz-components/p-edec4d09.entry.js +1 -0
  90. package/lmvz-components/p-f911691c.entry.js +1 -0
  91. package/manifest.json +38 -98
  92. package/package.json +2 -1
  93. package/types/components/lmvz-select/lmvz-select.d.ts +0 -1
  94. package/types/components/lmvz-snackbar/public.d.ts +6 -0
  95. package/types/components/lmvz-tab/lmvz-tab.d.ts +1 -1
  96. package/types/components/lmvz-tabs/lmvz-tabs.d.ts +8 -8
  97. package/types/components.d.ts +17 -39
  98. package/types/index.d.ts +5 -0
  99. package/types/utils/aria/directional-focus-controller.d.ts +9 -7
  100. package/types/utils/icons/public.d.ts +6 -0
  101. package/components/p-CgGqXTxQ.js +0 -1
  102. package/components/p-D3wobLRi.js +0 -1
  103. package/components/p-DfFdoFeH.js +0 -1
  104. package/components/p-GJaYKpHS.js +0 -1
  105. package/lmvz-components/p-3b7203a3.entry.js +0 -1
  106. package/lmvz-components/p-3fc6c3f6.entry.js +0 -1
  107. package/lmvz-components/p-9813a7d2.entry.js +0 -1
  108. package/lmvz-components/p-CHxiS3ja.js +0 -1
  109. package/lmvz-components/p-b5a5eb9a.entry.js +0 -1
  110. package/lmvz-components/p-cadd88e5.entry.js +0 -1
  111. package/lmvz-components/p-cebaddb0.entry.js +0 -1
  112. package/lmvz-components/p-d53e69de.entry.js +0 -1
  113. package/lmvz-components/p-db75e362.entry.js +0 -1
  114. package/lmvz-components/p-eb741e1f.entry.js +0 -1
@@ -78,12 +78,23 @@ legend {
78
78
  /** component dependencies */
79
79
  /* * the (invalid nested) import will be handled by postcss */
80
80
  /* stylelint-disable no-invalid-position-at-import-rule */
81
- button {
82
- /* secondary styling is default, primary is explicit */
83
- /* --lmvz-button-background, --lmvz-button-color, --lmvz-button-radius are declared on :host
81
+ /* stylelint-disable nesting-selector-no-missing-scoping-root */
82
+
83
+ /**
84
+ * This fragment is meant to be reusable in multiple component types.
85
+ * CAUTION: always wrap the import in a tag selector (ususally button)!
86
+ */
87
+ & {
88
+ /* the (invalid nested) import will be handled by postcss */
89
+ /* stylelint-disable-next-line no-invalid-position-at-import-rule */
90
+ /* stylelint-disable nesting-selector-no-missing-scoping-root */
91
+ & {
92
+ /* variables are declared on :host
84
93
  so that outer ::slotted(lmvz-button) overrides are inherited correctly via shadow inheritance.
85
- They are also declared here so that non-shadow consumers (e.g. @lmvz-ds/styles buttons.css
86
- bundle and lmvz-card) have the default values in scope. */
94
+ They are also declared here so that non-shadow consumers have the default values in scope. */
95
+
96
+ /* secondary styling is default, primary is explicit */
97
+
87
98
  --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-secondary, #f0f0f0));
88
99
  --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-secondary, #000000));
89
100
  --lmvz-button-radius: var(--lmvz-button-radius-override, var(--lmvz-component-input-radius-default, 999px));
@@ -98,19 +109,20 @@ legend {
98
109
 
99
110
  display: inline-flex;
100
111
  align-items: center;
101
- justify-content: var(--lmvz-button-content-justification-override, center);
102
- gap: var(--lmvz-button-gap);
103
- padding-block: var(--lmvz-button-padding-block);
104
- padding-inline: var(--lmvz-button-padding-inline);
105
- min-height: var(--lmvz-button-min-height);
106
- min-width: var(--lmvz-button-min-height);
107
- border-radius: var(--lmvz-button-radius);
108
- border: var(--lmvz-button-border-width) solid var(--lmvz-button-border-color);
112
+ justify-content: var(--lmvz-button-content-justification, center);
113
+ gap: var(--lmvz-button-gap, var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)));
114
+
115
+ box-sizing: border-box; /* to inlclude paddings & border in min-height */
116
+ padding-block: var(--lmvz-button-padding-block, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)));
117
+ padding-inline: var(--lmvz-button-padding-inline, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)));
118
+ min-height: var(--lmvz-button-min-height, var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem)));
119
+ border: var(--lmvz-button-border-width, 0) solid var(--lmvz-button-border-color, transparent);
120
+ border-radius: var(--lmvz-button-radius, var(--lmvz-component-input-radius-default, 999px));
121
+
109
122
  background-color: var(--lmvz-button-background);
110
123
  color: var(--lmvz-button-color);
111
124
  cursor: pointer;
112
125
  font: var(--lmvz-button-font);
113
- /* text-align: center; */
114
126
  text-decoration: none;
115
127
  white-space: nowrap;
116
128
  transition:
@@ -120,100 +132,91 @@ legend {
120
132
  box-shadow 0.15s ease;
121
133
  }
122
134
 
123
- button > * {
124
- font: inherit;
125
- color: inherit;
126
- }
127
135
 
128
- button:focus-visible {
129
- outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
130
- outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
131
- position: relative;
132
- z-index: 1;
133
- }
136
+ & > * {
137
+ font: inherit;
138
+ color: inherit;
139
+ }
140
+ &:focus-visible {
141
+ outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
142
+ outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
143
+ position: relative;
144
+ z-index: 1;
145
+ }
146
+ &:is([disabled], .disabled) {
147
+ cursor: not-allowed;
148
+ pointer-events: none;
149
+ /* } */
150
+
151
+ /* button:is(:is([disabled], .disabled):not(.secondary):not(.tertiary), .primary:is([disabled], .disabled)) { */
152
+ /* button:is([disabled], .disabled) { */
153
+ /* --lmvz-button-background: var(--lmvz-global-color-neutral-500); */
154
+ /* --lmvz-button-color: var(--lmvz-global-color-neutral-white); */
155
+ opacity: var(--lmvz-component-input-disabled-opacity, 40%);
156
+ }
157
+ &:not([disabled]):hover {
158
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-secondary-hover, #e0e0e0));
159
+ }
160
+ &:not([disabled]):active {
161
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-secondary-active, #d4d4d4));
162
+ }
134
163
 
135
- button:is([disabled], .disabled) {
136
- cursor: not-allowed;
137
- pointer-events: none;
138
- /* } */
139
-
140
- /* button:is(:is([disabled], .disabled):not(.secondary):not(.tertiary), .primary:is([disabled], .disabled)) { */
141
- /* button:is([disabled], .disabled) { */
142
- /* --lmvz-button-background: var(--lmvz-global-color-neutral-500); */
143
- /* --lmvz-button-color: var(--lmvz-global-color-neutral-white); */
144
- opacity: var(--lmvz-component-input-disabled-opacity, 40%);
145
- }
146
-
147
- button:not([disabled]):hover {
148
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-secondary-hover, #e0e0e0));
149
- }
150
-
151
- button:not([disabled]):active {
152
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-secondary-active, #d4d4d4));
153
- }
154
-
155
- button.primary {
156
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-primary, #000000));
157
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-primary, #ffffff));
158
- --lmvz-button-border-width: var(--lmvz-button-border-width-override, 0);
159
- --lmvz-button-border-color: var(--lmvz-button-border-color-override, transparent);
160
- }
161
-
162
- button.primary:not([disabled], .disabled):hover {
163
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-primary-hover, #2e2e2e));
164
- }
165
-
166
- button.primary:not([disabled], .disabled):active {
167
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-primary-active, #545454));
168
- }
169
-
170
- button.danger {
171
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary, #ffffff));
172
- --lmvz-button-border-color: var(--lmvz-button-border-color-override, transparent);
173
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-status-on-danger, #a31419));
174
- }
175
-
176
- button.danger:not([disabled], .disabled):hover {
177
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-status-danger, #fbdfe0));
178
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-status-on-danger, #a31419));
179
- }
180
-
181
- button.danger:not([disabled], .disabled):active {
182
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-status-on-danger-subtle, #e8454b));
183
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-status-on-danger, #a31419));
184
- }
185
-
186
- button.tertiary {
187
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary, #ffffff));
188
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-tertiary, #000000));
189
- }
190
-
191
- button.tertiary:not([disabled], .disabled):hover {
192
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0));
193
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-tertiary-hover, #000000));
194
- }
195
-
196
- button.tertiary:not([disabled], .disabled):active {
197
- --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary-active, #e0e0e0));
198
- --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-tertiary-active, #000000));
199
- }
164
+ /* secondary styling is default, primary is explicit */
200
165
 
201
- button.small {
202
- --lmvz-button-padding-inline: var(--lmvz-button-padding-inline-override, var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)));
203
- --lmvz-button-padding-block: var(--lmvz-button-padding-block-override, var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)));
204
- --lmvz-button-gap: var(--lmvz-button-gap-override, var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.31rem + 0.26vw, 0.63rem)));
205
- --lmvz-button-min-height: var(--lmvz-button-min-height-override, var(--lmvz-component-input-size-sm, clamp(2rem, 1.94rem + 0.26vw, 2.25rem)));
206
- --lmvz-button-font: var(--lmvz-button-font-override, var(--lmvz-typography-label-sm-strong, normal 700 clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem) / 1.5
166
+ &.primary {
167
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-primary, #000000));
168
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-primary, #ffffff));
169
+ --lmvz-button-border-width: var(--lmvz-button-border-width-override, 0);
170
+ --lmvz-button-border-color: var(--lmvz-button-border-color-override, transparent);
171
+ }
172
+ &.primary:not([disabled], .disabled):hover {
173
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-primary-hover, #2e2e2e));
174
+ }
175
+ &.primary:not([disabled], .disabled):active {
176
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-primary-active, #545454));
177
+ }
178
+ &.danger {
179
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary, #ffffff));
180
+ --lmvz-button-border-color: var(--lmvz-button-border-color-override, transparent);
181
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-status-on-danger, #a31419));
182
+ }
183
+ &.danger:not([disabled], .disabled):hover {
184
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-status-danger, #fbdfe0));
185
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-status-on-danger, #a31419));
186
+ }
187
+ &.danger:not([disabled], .disabled):active {
188
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-status-on-danger-subtle, #e8454b));
189
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-status-on-danger, #a31419));
190
+ }
191
+ &.tertiary {
192
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary, #ffffff));
193
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-tertiary, #000000));
194
+ }
195
+ &.tertiary:not([disabled], .disabled):hover {
196
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0));
197
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-tertiary-hover, #000000));
198
+ }
199
+ &.tertiary:not([disabled], .disabled):active {
200
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-tertiary-active, #e0e0e0));
201
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-tertiary-active, #000000));
202
+ }
203
+
204
+ &.small {
205
+ --lmvz-button-padding-inline: var(--lmvz-button-padding-inline-override, var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)));
206
+ --lmvz-button-padding-block: var(--lmvz-button-padding-block-override, var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)));
207
+ --lmvz-button-gap: var(--lmvz-button-gap-override, var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.31rem + 0.26vw, 0.63rem)));
208
+ --lmvz-button-min-height: var(--lmvz-button-min-height-override, var(--lmvz-component-input-size-sm, clamp(2rem, 1.94rem + 0.26vw, 2.25rem)));
209
+ --lmvz-button-font: var(--lmvz-button-font-override, var(--lmvz-typography-label-sm-strong, normal 700 clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem) / 1.5
207
210
  Router));
208
- }
209
-
210
- button.large {
211
- --lmvz-button-padding-inline: var(--lmvz-button-padding-inline-override, var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem)));
212
- --lmvz-button-padding-block: var(--lmvz-button-padding-block-override, var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem)));
213
- --lmvz-button-gap: var(--lmvz-button-gap-override, var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)));
214
- --lmvz-button-min-height: var(--lmvz-button-min-height-override, var(--lmvz-component-input-size-lg, clamp(2.75rem, 2.69rem + 0.26vw, 3rem)));
215
- --lmvz-button-font: var(--lmvz-button-font-override, var(--lmvz-typography-label-lg-strong, normal 700 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.5
211
+ }
212
+ &.large {
213
+ --lmvz-button-padding-inline: var(--lmvz-button-padding-inline-override, var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem)));
214
+ --lmvz-button-padding-block: var(--lmvz-button-padding-block-override, var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem)));
215
+ --lmvz-button-gap: var(--lmvz-button-gap-override, var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)));
216
+ --lmvz-button-min-height: var(--lmvz-button-min-height-override, var(--lmvz-component-input-size-lg, clamp(2.75rem, 2.69rem + 0.26vw, 3rem)));
217
+ --lmvz-button-font: var(--lmvz-button-font-override, var(--lmvz-typography-label-lg-strong, normal 700 clamp(1rem, 0.97rem + 0.13vw, 1.13rem) / 1.5
216
218
  Router));
219
+ }
217
220
  }
218
221
 
219
222
 
@@ -11,7 +11,7 @@ export class LmvzHeader extends ReactiveControllerHost {
11
11
  primarySlot;
12
12
  secondarySlot;
13
13
  secondaryNav;
14
- keyboardNavigationController = new DirectionalFocusController(this, { orientation: 'both' });
14
+ keyboardNavigationController = new DirectionalFocusController(this, { orientation: 'both', manageTabIndex: false, enableHomeAndEnd: false });
15
15
  get primaryMenuitems() {
16
16
  return this.primarySlot?.assignedElements({ flatten: false }) || [];
17
17
  }
@@ -87,7 +87,7 @@ export class LmvzHeader extends ReactiveControllerHost {
87
87
  }
88
88
  }
89
89
  render() {
90
- return (h(Host, { key: '77744fd74160551232eb0347e9ebb01eb3b9bec0', onFocus: this.delegateFocus.bind(this) }, h("div", { key: 'dfd78b2a2ab06b010d9f29dd61f57aced82243fe', class: "brand" }, h("slot", { key: 'c6d29bbdbcbe581a8a170fbeb3d6ab1e31d27dcd', name: "brand" }, h("img", { key: '80cea3b254d153411864d52c2ba300e0eb3c57a7', id: "fallback-logo-lmvz", src: logo, alt: "Lehrmittelverlag Z\u00FCrich" }))), h("nav", { key: '71c53ae0300b61291d0763cdb23f1f645a83928a', "aria-label": "Hauptnavigation" }, h("div", { key: '09949b77a66c54a10c4c141de846fd5697b9d445', role: "menubar", class: "primary-menubar" }, h("slot", { key: 'acec0cf7e13325c49d1e0929b90b056ad1cbbe64', name: "nav-primary", ref: (el) => (this.primarySlot = el) }), h("div", { key: 'd35860c71ad5e28ee2e3aaafb157acbeff41d83e', role: "menu", id: "nav-secondary", class: "secondary-menubar", hidden: !this.lmvzActiveNav, ref: (el) => (this.secondaryNav = el) }, h("slot", { key: 'a4c3a1ad1b1de5bd903b54ed6bd1616ce6517bbb', name: this.secondarySlotName, ref: (el) => (this.secondarySlot = el) })))), h("div", { key: 'ff50045d9ab28bf66a619a48d9ea1f0ed2f5f952', class: "actions" }, h("slot", { key: '6ead0b7a54bf93bb06f0eab2aa8159bd6e96e8f5', name: "actions" }))));
90
+ return (h(Host, { key: 'a72c860d7f67c9631c462c0abcc798bb142dfc55', onFocus: this.delegateFocus.bind(this) }, h("div", { key: '4ed87264d201c513bce284536793692424ed864b', class: "brand" }, h("slot", { key: '9291d81d7f8a630007b8ad827a16ebea7222b9d2', name: "brand" }, h("img", { key: '77da99409f40d93e4a2d190cbb2a8857f1e81c36', id: "fallback-logo-lmvz", src: logo, alt: "Lehrmittelverlag Z\u00FCrich" }))), h("nav", { key: '3c40c04bb23524ae58e391a54b044e225a25ad07', "aria-label": "Hauptnavigation" }, h("div", { key: '207b8032d3d11b4bfacb6e7fcffb683ad5da8ccc', role: "menubar", class: "primary-menubar" }, h("slot", { key: '8ae67a57ac7b6bb6083c469a857542e31b0c2294', name: "nav-primary", ref: (el) => (this.primarySlot = el) }), h("div", { key: '86b9696c95e9ae0e3843fa1607f268dcae8cb279', role: "menu", id: "nav-secondary", class: "secondary-menubar", hidden: !this.lmvzActiveNav, ref: (el) => (this.secondaryNav = el) }, h("slot", { key: '67966de33555dc26ac2dc51fc8a85d456a2e8e85', name: this.secondarySlotName, ref: (el) => (this.secondarySlot = el) })))), h("div", { key: 'bfb2831144cee723c3182d96d64f44be1cc5a78b', class: "actions" }, h("slot", { key: '6956b81fa8ed6c446edc5f7d9708462b39bc8cbb', name: "actions" }))));
91
91
  }
92
92
  static get is() { return "lmvz-header"; }
93
93
  static get encapsulation() { return "shadow"; }
@@ -126,24 +126,12 @@ label > span[aria-hidden='true'],
126
126
  z-index: 1;
127
127
  transition: border-color 0.15s ease;
128
128
  }
129
- :host(:not([disabled], [highlighted], [error])) .select-wrapper:hover .select-trigger {
129
+ :host(:not([disabled], [error])) .select-wrapper:hover .select-trigger {
130
130
  border-color: var(--lmvz-select-border-color-hover);
131
131
  }
132
132
  :host([error]) .select-trigger {
133
133
  border-color: var(--lmvz-select-error-color);
134
134
  }
135
- :host([highlighted]) .select-trigger {
136
- background-color: var(--lmvz-semantic-color-status-active-alternate, #0f8acc);
137
- border-color: var(--lmvz-semantic-color-border-active, #0f8acc);
138
- color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff);
139
- }
140
- :host([highlighted]) .select-trigger > span:first-child {
141
- color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff);
142
- }
143
- :host([highlighted]) label.floating-label {
144
- background-color: var(--lmvz-semantic-color-status-active-alternate, #0f8acc);
145
- color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff);
146
- }
147
135
  :host:has(:focus-visible) .select-trigger {
148
136
  outline: var(--lmvz-ds-outline, 1px solid #0e7ab4);
149
137
  outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem));
@@ -158,8 +146,7 @@ label > span[aria-hidden='true'],
158
146
  white-space: nowrap;
159
147
  text-align: left;
160
148
  }
161
- /* Active-selected text color: when a value is selected (not applicable in highlighted state) */
162
- :host(:not([highlighted])) .select-wrapper.has-value .select-trigger > span:first-child {
149
+ .select-wrapper.has-value .select-trigger > span:first-child {
163
150
  color: var(--lmvz-semantic-color-int-on-secondary-active, #000000);
164
151
  }
165
152
  /* Trailing chevron child span, shared by single- and multiselect modes. Scoped with the
@@ -177,8 +164,7 @@ label > span[aria-hidden='true'],
177
164
  flex-shrink: 0;
178
165
  }
179
166
  /* Chip row — rendered inline inside the trigger's leading text span (.select-trigger >
180
- span:first-child), reusing that span's flex/overflow/ellipsis truncation contract instead of
181
- duplicating it. Single-line: overflowing chips are truncated with an ellipsis, never wrapped. */
167
+ span:first-child). Overflowing chips are truncated with an ellipsis to enforce single line. */
182
168
  .select-trigger > span:first-child lmvz-chip {
183
169
  vertical-align: middle;
184
170
  }
@@ -228,40 +214,69 @@ label > span[aria-hidden='true'],
228
214
  :host([size='large']) .select-trigger > span:first-child {
229
215
  font-size: var(--lmvz-component-body-lg-font-size, clamp(1rem, 0.97rem + 0.13vw, 1.13rem));
230
216
  }
231
- /*
232
- * Option-list item styling for the `role="option"` elements rendered inside the
233
- * `lmvz-popover` (containerRole="listbox") popup. The token set mirrors the states
234
- * `lmvz-action-list` applies to its `<lmvz-button>`/`<button>` items (tertiary variant),
235
- * so the listbox looks visually identical to an action-list item:
236
- * - default: --lmvz-semantic-color-int-tertiary / --lmvz-semantic-color-int-on-tertiary
237
- * - hover: --lmvz-semantic-color-int-tertiary-hover / --lmvz-semantic-color-int-on-tertiary-hover
238
- * - active: --lmvz-semantic-color-int-tertiary-active / --lmvz-semantic-color-int-on-tertiary-active
239
- * - disabled: --lmvz-component-input-disabled-opacity (opacity, same token as lib-styles buttons fragment)
240
- * - focus: --lmvz-ds-outline / --lmvz-ds-outline-offset (same as lib-styles buttons fragment focus-visible)
241
- * "selected" has no action-list equivalent (action-list is a menu, not a listbox), so it
242
- * reuses this component's own highlighted-state tokens for consistency with the trigger.
243
- * "active" (`data-active="true"`) is this component's own addition: since the combobox uses
244
- * the activedescendant model, the highlighted option never receives real DOM focus, so
245
- * `:hover`/`:focus-visible` cannot indicate it to sighted keyboard users — `data-active` is
246
- * set by the host from `ListboxController`'s active id and styled the same as hover/focus.
247
- */
248
217
  .lmvz-select-option {
249
218
  --lmvz-select-option-background: var(--lmvz-semantic-color-int-tertiary, #ffffff);
250
219
  --lmvz-select-option-color: var(--lmvz-semantic-color-int-on-tertiary, #000000);
251
220
 
252
- display: flex;
221
+ /* The configuration here will match lmvz-action-list's items, though semantic states might differ intentionally */
222
+ --lmvz-button-background-override: var(--lmvz-select-option-background);
223
+ --lmvz-button-color-override: var(--lmvz-select-option-color);
224
+ --lmvz-button-radius-override: var(--lmvz-semantic-border-radius-md, 6px);
225
+ --lmvz-button-padding-inline-override: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
226
+ --lmvz-button-padding-block-override: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
227
+ --lmvz-button-content-justification: normal;
228
+ --lmvz-button-font-override: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
229
+ Router);
230
+
231
+ /* the (invalid nested) import will be handled by postcss */
232
+ /* stylelint-disable-next-line no-invalid-position-at-import-rule */
233
+ /* stylelint-disable nesting-selector-no-missing-scoping-root */
234
+ & {
235
+ /* variables are declared on :host
236
+ so that outer ::slotted(lmvz-button) overrides are inherited correctly via shadow inheritance.
237
+ They are also declared here so that non-shadow consumers have the default values in scope. */
238
+
239
+ /* secondary styling is default, primary is explicit */
240
+
241
+ --lmvz-button-background: var(--lmvz-button-background-override, var(--lmvz-semantic-color-int-secondary, #f0f0f0));
242
+ --lmvz-button-color: var(--lmvz-button-color-override, var(--lmvz-semantic-color-int-on-secondary, #000000));
243
+ --lmvz-button-radius: var(--lmvz-button-radius-override, var(--lmvz-component-input-radius-default, 999px));
244
+ --lmvz-button-padding-inline: var(--lmvz-button-padding-inline-override, var(--lmvz-button-padding, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem))));
245
+ --lmvz-button-padding-block: var(--lmvz-button-padding-block-override, var(--lmvz-button-padding, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem))));
246
+ --lmvz-button-gap: var(--lmvz-button-gap-override, var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)));
247
+ --lmvz-button-min-height: var(--lmvz-button-min-height-override, var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem)));
248
+ --lmvz-button-font: var(--lmvz-button-font-override, var(--lmvz-typography-label-md-strong, normal 700 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
249
+ Router));
250
+ --lmvz-button-border-width: var(--lmvz-button-border-width-override, 0);
251
+ --lmvz-button-border-color: var(--lmvz-button-border-color-override, transparent);
252
+
253
+ display: inline-flex;
253
254
  align-items: center;
254
- gap: var(--lmvz-select-gap);
255
- padding: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem));
256
- border-radius: var(--lmvz-semantic-border-radius-md, 6px);
257
- background-color: var(--lmvz-select-option-background);
258
- color: var(--lmvz-select-option-color);
255
+ justify-content: var(--lmvz-button-content-justification, center);
256
+ gap: var(--lmvz-button-gap, var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)));
257
+
258
+ box-sizing: border-box; /* to inlclude paddings & border in min-height */
259
+ padding-block: var(--lmvz-button-padding-block, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)));
260
+ padding-inline: var(--lmvz-button-padding-inline, var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)));
261
+ min-height: var(--lmvz-button-min-height, var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem)));
262
+ border: var(--lmvz-button-border-width, 0) solid var(--lmvz-button-border-color, transparent);
263
+ border-radius: var(--lmvz-button-radius, var(--lmvz-component-input-radius-default, 999px));
264
+
265
+ background-color: var(--lmvz-button-background);
266
+ color: var(--lmvz-button-color);
259
267
  cursor: pointer;
260
- font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5
261
- Router);
268
+ font: var(--lmvz-button-font);
269
+ text-decoration: none;
270
+ white-space: nowrap;
262
271
  transition:
263
272
  background-color 0.15s ease,
264
- color 0.15s ease;
273
+ color 0.15s ease,
274
+ border-color 0.15s ease,
275
+ box-shadow 0.15s ease;
276
+ }
277
+
278
+
279
+ display: flex;
265
280
  }
266
281
  .lmvz-select-option:not([aria-disabled='true']):hover {
267
282
  --lmvz-select-option-background: var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0);
@@ -72,7 +72,6 @@ export class LmvzSelect extends ReactiveControllerHost {
72
72
  required = false;
73
73
  name;
74
74
  size = 'default';
75
- highlighted = false;
76
75
  selectedLabel = '';
77
76
  selectedId;
78
77
  activeId;
@@ -346,7 +345,7 @@ export class LmvzSelect extends ReactiveControllerHost {
346
345
  const hasValue = this.hasValue;
347
346
  const shouldShowLabel = hasValue;
348
347
  const showChips = this.multiple && hasValue;
349
- return (h(Host, { key: 'aece4095568891e34afc978c6a0aa9e638e7e207', "data-highlighted": String(this.highlighted) }, h("div", { key: '7c0e2a71a2b3b0bee46009c3498062b86f6eca72', class: hasValue ? 'select-wrapper has-value' : 'select-wrapper' }, h("label", { key: 'f473d3a012cbd43c691de1782ead4a5d5e59cd32', htmlFor: this.triggerId, class: shouldShowLabel ? 'floating-label' : 'assistive-label', onMouseDown: (event) => event.preventDefault(), onClick: this.handleLabelClick }, this.label, this.required && shouldShowLabel && h("span", { key: '50a2d3999af0310fcf1af62fdf72109fc25f76ee', "aria-hidden": "true" }, " *")), h("div", { key: 'd09b26c4e8d9e4ae8ab503c4abb2b22f7e0d905c', id: this.triggerId, ref: (el) => (this.triggerEl = el), class: "select-trigger", role: "combobox", tabIndex: this.disabled ? -1 : 0, "aria-haspopup": "listbox", "aria-expanded": String(this.isOpen), "aria-controls": this.popoverId, "aria-activedescendant": this.isOpen ? this.activeId : undefined, "aria-label": this.triggerAriaLabel, "aria-disabled": this.disabled ? 'true' : undefined, "aria-required": this.required ? 'true' : 'false', "aria-invalid": this.error ? 'true' : 'false', "aria-errormessage": this.showErrorMessage ? this.errorId : undefined, "aria-describedby": this.describedBy, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeydown, onBlur: this.handleTriggerBlur }, h("span", { key: '99fbb4a7a2ce16e63bf30b2c25a0c413533d60f5' }, showChips ? this.renderChips() : hasValue ? this.selectedLabel : this.label, this.required && !hasValue && h("span", { key: '3f6473f7f064e98bcdf936e2b9a5978f20e00772', "aria-hidden": "true" }, " *")), h("span", { key: 'cfb75d279c2c101d7724c596a4f2cd34ce13d7c0', "aria-hidden": "true" }, h("svg", { key: '51e30ae88d4355e0513cce076c97dd335b6a1d7e', width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("path", { key: '0b1fb9c3d6809daa93abc404fbb82469d9f4a1cc', d: "M20.3334 8.66663L12.0001 17L3.66675 8.66663", stroke: "currentColor", "stroke-width": "1.75", "stroke-linecap": "round", "stroke-linejoin": "round" })))), h("lmvz-popover", { key: '02b3524eed3eb4da9899f2acb85eba2cc3f09d78', id: this.popoverId, anchor: this.triggerId, open: this.isOpen, containerRole: "listbox", autoFocus: false, label: this.label, "aria-multiselectable": this.multiple ? 'true' : undefined, onLmvzClose: this.handlePopoverClose, size: "sm" }, this.renderOptionGroups()), h("div", { key: '84cbf09b5d47eeebba9ed55f21aa715257faf1f1', class: "lmvz-select-native-options", hidden: true, "aria-hidden": "true", ref: (el) => (this.optionsSourceEl = el) }, h("slot", { key: '928aa417eca972d4d85592f569c3fc95419dd9b3', onSlotchange: this.handleSlotChange }))), this.helperText && (h("div", { key: '5c0dac612458ba3564c3ac445f396c9e95832fe6', id: this.helperId, role: "status" }, this.helperText)), this.showErrorMessage && (h("div", { key: '4c5c0a3826239fd2d5b52ad9118937dc5494c632', id: this.errorId, role: "alert" }, this.errorMessage))));
348
+ return (h(Host, { key: '77cb72cdce635eae0f9a29cb9121dd7d16955219' }, h("div", { key: 'cc6c04090457df17c6a9e74354fc21875d378642', class: hasValue ? 'select-wrapper has-value' : 'select-wrapper' }, h("label", { key: '8dc52469a7b3333578494b2f7bdb4e870044ac6c', htmlFor: this.triggerId, class: shouldShowLabel ? 'floating-label' : 'assistive-label', onMouseDown: (event) => event.preventDefault(), onClick: this.handleLabelClick }, this.label, this.required && shouldShowLabel && h("span", { key: 'c198fb4944e46c5219a42e16ae24dc3c414b1b00', "aria-hidden": "true" }, " *")), h("div", { key: '034cc67405aac73a6557036dea90e4644c1578ed', id: this.triggerId, ref: (el) => (this.triggerEl = el), class: "select-trigger", role: "combobox", tabIndex: this.disabled ? -1 : 0, "aria-haspopup": "listbox", "aria-expanded": String(this.isOpen), "aria-controls": this.popoverId, "aria-activedescendant": this.isOpen ? this.activeId : undefined, "aria-label": this.triggerAriaLabel, "aria-disabled": this.disabled ? 'true' : undefined, "aria-required": this.required ? 'true' : 'false', "aria-invalid": this.error ? 'true' : 'false', "aria-errormessage": this.showErrorMessage ? this.errorId : undefined, "aria-describedby": this.describedBy, onClick: this.handleTriggerClick, onKeyDown: this.handleTriggerKeydown, onBlur: this.handleTriggerBlur }, h("span", { key: 'c61c136bfaab211572a988d3b16c2746f80b1ac6' }, showChips ? this.renderChips() : hasValue ? this.selectedLabel : this.label, this.required && !hasValue && h("span", { key: '24201baae63a4f6fdaef2441d304cd8f69430fb5', "aria-hidden": "true" }, " *")), h("span", { key: '547c61dfdc83f89cf7cd0582c785b9552190e533', "aria-hidden": "true" }, h("svg", { key: 'f6a0cb7c77682aec03cd146e84712c17df5ff910', width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("path", { key: '35a8a50e27f18e54003974ae5b5ed578602664d3', d: "M20.3334 8.66663L12.0001 17L3.66675 8.66663", stroke: "currentColor", "stroke-width": "1.75", "stroke-linecap": "round", "stroke-linejoin": "round" })))), h("lmvz-popover", { key: '0d5b94659c23763d59638046a397963d79a5e588', id: this.popoverId, anchor: this.triggerId, open: this.isOpen, containerRole: "listbox", autoFocus: false, label: this.label, "aria-multiselectable": this.multiple ? 'true' : undefined, onLmvzClose: this.handlePopoverClose, size: "sm" }, this.renderOptionGroups()), h("div", { key: 'c4a313fe4b6c53678a4f3dafced210f00e3c93d5', class: "lmvz-select-native-options", hidden: true, "aria-hidden": "true", ref: (el) => (this.optionsSourceEl = el) }, h("slot", { key: '1fb311e6938812e68ae5155184af2e2ba7c19861', onSlotchange: this.handleSlotChange }))), this.helperText && (h("div", { key: 'accade9aae4cb2e23fa1d8f62dd9b6efdf3ddfb5', id: this.helperId, role: "status" }, this.helperText)), this.showErrorMessage && (h("div", { key: 'faa5eba225adda67b44b8a63ae98a678fddf49ad', id: this.errorId, role: "alert" }, this.errorMessage))));
350
349
  }
351
350
  static get is() { return "lmvz-select"; }
352
351
  static get encapsulation() { return "scoped"; }
@@ -592,29 +591,6 @@ export class LmvzSelect extends ReactiveControllerHost {
592
591
  "reflect": true,
593
592
  "attribute": "size",
594
593
  "defaultValue": "'default'"
595
- },
596
- "highlighted": {
597
- "type": "boolean",
598
- "mutable": false,
599
- "complexType": {
600
- "original": "boolean",
601
- "resolved": "boolean",
602
- "references": {}
603
- },
604
- "required": false,
605
- "optional": false,
606
- "docs": {
607
- "tags": [{
608
- "name": "default",
609
- "text": "false"
610
- }],
611
- "text": "Whether the select has an active filter or selection that should be visually\ndistinguished (e.g. a filter chip is applied).\n\nWhen `true`:\n- The host attribute `highlighted` is present (CSS: `:host([highlighted])`).\n- The host attribute `data-highlighted=\"true\"` is set for assistive-technology\n consumers that observe data attributes. When `false`, `data-highlighted` is\n set to `\"false\"`.\n\nNote: `aria-pressed` is intentionally not used here; it is reserved for toggle-button\nroles. `aria-selected` is reserved for this component's own `role=\"option\"` elements.\nThe `data-highlighted` attribute provides the accessible contract for this state."
612
- },
613
- "getter": false,
614
- "setter": false,
615
- "reflect": true,
616
- "attribute": "highlighted",
617
- "defaultValue": "false"
618
594
  }
619
595
  };
620
596
  }
@@ -1 +1,4 @@
1
+ import { SnackbarController } from "./snackbar-controller";
1
2
  export { SnackbarController } from './snackbar-controller';
3
+ window.LmvzApi ??= {};
4
+ window.LmvzApi.SnackbarController = SnackbarController;
@@ -128,7 +128,6 @@ button:active {
128
128
  opacity: 0;
129
129
  transition: opacity 0.15s ease;
130
130
 
131
- /* Horizontal: full-width bar at bottom */
132
131
  inset-block-end: 0;
133
132
  inset-inline: 0;
134
133
  block-size: var(--lmvz-tab-indicator-size);
@@ -140,18 +139,6 @@ button:active {
140
139
  :host([selected][has-media]) .indicator {
141
140
  opacity: 1;
142
141
  }
143
- :host([vertical]) button {
144
- border-radius: var(--lmvz-semantic-border-radius-round, 999px);
145
- }
146
- :host([vertical]) .indicator {
147
- /* Vertical: narrow bar at inline-start edge */
148
- inset-block: 0;
149
- inset-inline: 0 auto;
150
- inline-size: var(--lmvz-tab-indicator-size);
151
- block-size: auto;
152
- border-radius: 0 var(--lmvz-tab-indicator-size) var(--lmvz-tab-indicator-size) 0;
153
- background: linear-gradient(to bottom, var(--lmvz-semantic-color-gradient-main-1, #0e7ab4), var(--lmvz-semantic-color-gradient-main-2, #0e7ab4));
154
- }
155
142
  ::slotted(*) {
156
143
  --lmvz-component-color: var(--lmvz-tab-color);
157
144
  }
@@ -5,7 +5,7 @@ export class LmvzTab {
5
5
  value;
6
6
  disabled = false;
7
7
  selected = false;
8
- vertical = false;
8
+ panel;
9
9
  handleMediaSlotChange = () => {
10
10
  this.el.toggleAttribute('has-media', (this.mediaSlotEl?.assignedElements() ?? []).length > 0);
11
11
  };
@@ -14,7 +14,7 @@ export class LmvzTab {
14
14
  this.el.dispatchEvent(new CustomEvent('lmvzTabReady', { bubbles: true, composed: false }));
15
15
  }
16
16
  render() {
17
- return (h(Host, { key: '4380fe35cacb11bc7114664c126504e8f4fb09a0' }, h("button", { key: 'ac77443cbba5c94f864820088f60c0bac23d0775', part: "button", role: "tab", disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, tabIndex: 0 }, h("slot", { key: '9988497505ca3effa6c41011ac408a5d25629ca1', name: "media", ref: (el) => (this.mediaSlotEl = el), onSlotchange: this.handleMediaSlotChange }), h("span", { key: '70566c46fba36b8717aa82917e45abd39cd7a2ea', class: "label" }, h("slot", { key: 'a595738c387ee2f4f77f6ccdfdfb0589751ce999' })), h("span", { key: '933758dc965d1151ca6a96367ea40290189384ad', "aria-hidden": "true", part: "indicator", class: "indicator" }))));
17
+ return (h(Host, { key: '8fb0ddc827d31fa1669a7fdaef288be5002a7c53' }, h("button", { key: '72b8f8be2f7ec7d0d2840148d48188382699d9b9', part: "button", role: "tab", disabled: this.disabled, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, tabIndex: 0 }, h("slot", { key: 'c951ae74e7b15feff7f32bc87b2e3fd46221b6b4', name: "media", ref: (el) => (this.mediaSlotEl = el), onSlotchange: this.handleMediaSlotChange }), h("span", { key: '8a06f3a9598bbf90819ff3644874f53b1ed9f840', class: "label" }, h("slot", { key: '98217fca2371ad7b0ded79628895337603a54c2f' })), h("span", { key: '68a11cf2f3d51aa6f4b9a7d2efcce1a1bb0c7640', "aria-hidden": "true", part: "indicator", class: "indicator" }))));
18
18
  }
19
19
  static get is() { return "lmvz-tab"; }
20
20
  static get encapsulation() { return "shadow"; }
@@ -96,28 +96,24 @@ export class LmvzTab {
96
96
  "attribute": "selected",
97
97
  "defaultValue": "false"
98
98
  },
99
- "vertical": {
100
- "type": "boolean",
99
+ "panel": {
100
+ "type": "string",
101
101
  "mutable": false,
102
102
  "complexType": {
103
- "original": "boolean",
104
- "resolved": "boolean",
103
+ "original": "string",
104
+ "resolved": "string | undefined",
105
105
  "references": {}
106
106
  },
107
107
  "required": false,
108
- "optional": false,
108
+ "optional": true,
109
109
  "docs": {
110
- "tags": [{
111
- "name": "default",
112
- "text": "false"
113
- }],
114
- "text": "Vertical orientation context.\nSet by the parent `lmvz-tabs` when `orientation=\"vertical\"` \u2014 do not set manually.\nWhen true the selection indicator moves to the inline-start edge."
110
+ "tags": [],
111
+ "text": "The `id` of the target `lmvz-tab-panel` this tab controls.\nWhen omitted, pairing falls back to DOM position."
115
112
  },
116
113
  "getter": false,
117
114
  "setter": false,
118
115
  "reflect": true,
119
- "attribute": "vertical",
120
- "defaultValue": "false"
116
+ "attribute": "panel"
121
117
  }
122
118
  };
123
119
  }
@@ -62,11 +62,6 @@ legend {
62
62
  background: none;
63
63
  border-radius: 0;
64
64
  }
65
- /* ── Vertical orientation ────────────────────────────────────────────────── */
66
- :host([orientation='vertical']) .tablist {
67
- flex-direction: column;
68
- overflow: visible auto;
69
- }
70
65
  /* The panels slot renders inline; individual panels control their own display */
71
66
  ::slotted([role='tabpanel']) {
72
67
  display: block;