@schukai/monster 4.148.9 → 4.149.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 (205) hide show
  1. package/package.json +1 -1
  2. package/source/components/accessibility/stylesheet/locale-picker.mjs +61 -1
  3. package/source/components/content/image-editor.mjs +79 -11
  4. package/source/components/content/style/copy.pcss +1 -1
  5. package/source/components/content/stylesheet/camera-capture.mjs +1 -1
  6. package/source/components/content/stylesheet/copy.mjs +1 -1
  7. package/source/components/content/stylesheet/fetch-box.mjs +1 -1
  8. package/source/components/content/stylesheet/viewer.mjs +61 -1
  9. package/source/components/data/kpi-tile.mjs +5 -3
  10. package/source/components/data/metric-graph.mjs +22 -20
  11. package/source/components/data/metric.mjs +20 -18
  12. package/source/components/data/style/kpi-tile.pcss +65 -43
  13. package/source/components/data/style/metric-graph.pcss +35 -18
  14. package/source/components/data/style/metric.pcss +35 -28
  15. package/source/components/data/stylesheet/kpi-tile.mjs +61 -1
  16. package/source/components/data/stylesheet/metric-graph.mjs +61 -1
  17. package/source/components/data/stylesheet/metric.mjs +61 -1
  18. package/source/components/datatable/columnbar.mjs +4 -2
  19. package/source/components/datatable/datatable.mjs +73 -15
  20. package/source/components/datatable/filter/date-range.mjs +61 -61
  21. package/source/components/datatable/filter/date-time.mjs +5 -1
  22. package/source/components/datatable/filter/range.mjs +3 -3
  23. package/source/components/datatable/filter/select-operator.mjs +7 -1
  24. package/source/components/datatable/filter/text-operator.mjs +11 -3
  25. package/source/components/datatable/filter.mjs +16 -0
  26. package/source/components/datatable/pagination.mjs +2 -2
  27. package/source/components/datatable/style/column-bar.pcss +115 -23
  28. package/source/components/datatable/style/datatable.pcss +257 -29
  29. package/source/components/datatable/style/embedded-pagination.pcss +63 -34
  30. package/source/components/datatable/style/filter-button.pcss +1 -1
  31. package/source/components/datatable/style/filter-controls-defaults.pcss +49 -3
  32. package/source/components/datatable/style/filter-select.pcss +4 -1
  33. package/source/components/datatable/style/filter.pcss +18 -1
  34. package/source/components/datatable/stylesheet/change-button.mjs +61 -1
  35. package/source/components/datatable/stylesheet/column-bar.mjs +69 -1
  36. package/source/components/datatable/stylesheet/dataset.mjs +61 -1
  37. package/source/components/datatable/stylesheet/datatable.mjs +71 -1
  38. package/source/components/datatable/stylesheet/embedded-pagination.mjs +1 -1
  39. package/source/components/datatable/stylesheet/filter-button.mjs +1 -1
  40. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +1 -1
  41. package/source/components/datatable/stylesheet/filter-select.mjs +61 -1
  42. package/source/components/datatable/stylesheet/filter.mjs +61 -1
  43. package/source/components/datatable/stylesheet/pagination.mjs +67 -1
  44. package/source/components/datatable/stylesheet/save-button.mjs +61 -1
  45. package/source/components/datatable/stylesheet/status.mjs +61 -1
  46. package/source/components/form/action-button.mjs +2 -1
  47. package/source/components/form/button-bar.mjs +7 -2
  48. package/source/components/form/context-error.mjs +4 -3
  49. package/source/components/form/context-help.mjs +10 -4
  50. package/source/components/form/context-hint.mjs +1 -1
  51. package/source/components/form/context-info.mjs +1 -1
  52. package/source/components/form/context-note.mjs +1 -1
  53. package/source/components/form/context-success.mjs +1 -1
  54. package/source/components/form/context-warning.mjs +1 -1
  55. package/source/components/form/control-bar.mjs +300 -14
  56. package/source/components/form/credential-button.mjs +4 -2
  57. package/source/components/form/digits.mjs +28 -1
  58. package/source/components/form/field-set.mjs +30 -0
  59. package/source/components/form/login.mjs +13 -10
  60. package/source/components/form/password.mjs +6 -0
  61. package/source/components/form/popper-button.mjs +1 -1
  62. package/source/components/form/quantity.mjs +14 -6
  63. package/source/components/form/register-wizard.mjs +46 -26
  64. package/source/components/form/select.mjs +17 -10
  65. package/source/components/form/sheet.mjs +13 -2
  66. package/source/components/form/style/action-button.pcss +131 -5
  67. package/source/components/form/style/button-bar.pcss +204 -3
  68. package/source/components/form/style/control-bar.pcss +254 -26
  69. package/source/components/form/style/digits.pcss +7 -6
  70. package/source/components/form/style/input-group.pcss +65 -1
  71. package/source/components/form/style/login.pcss +1 -1
  72. package/source/components/form/style/mixin/field-set-layout.pcss +8 -0
  73. package/source/components/form/style/password.pcss +25 -1
  74. package/source/components/form/style/popper-button.pcss +1 -0
  75. package/source/components/form/style/quantity.pcss +11 -20
  76. package/source/components/form/style/select.pcss +52 -7
  77. package/source/components/form/style/sheet.pcss +70 -1
  78. package/source/components/form/style/state-button.pcss +5 -2
  79. package/source/components/form/style/toggle-switch.pcss +7 -4
  80. package/source/components/form/stylesheet/action-button.mjs +63 -1
  81. package/source/components/form/stylesheet/button-bar.mjs +153 -1
  82. package/source/components/form/stylesheet/button.mjs +61 -1
  83. package/source/components/form/stylesheet/control-bar.mjs +163 -1
  84. package/source/components/form/stylesheet/digits.mjs +1 -1
  85. package/source/components/form/stylesheet/field-layout.mjs +1 -1
  86. package/source/components/form/stylesheet/field-set.mjs +1 -1
  87. package/source/components/form/stylesheet/form.mjs +1 -1
  88. package/source/components/form/stylesheet/input-group.mjs +15 -1
  89. package/source/components/form/stylesheet/login.mjs +1 -1
  90. package/source/components/form/stylesheet/password.mjs +7 -1
  91. package/source/components/form/stylesheet/popper-button.mjs +61 -1
  92. package/source/components/form/stylesheet/quantity.mjs +1 -1
  93. package/source/components/form/stylesheet/register-wizard.mjs +1 -1
  94. package/source/components/form/stylesheet/select.mjs +3 -1
  95. package/source/components/form/stylesheet/sheet.mjs +1 -1
  96. package/source/components/form/stylesheet/state-button.mjs +3 -1
  97. package/source/components/form/stylesheet/toggle-switch.mjs +1 -1
  98. package/source/components/form/stylesheet/wizard.mjs +1 -1
  99. package/source/components/form/util/floating-ui.mjs +35 -7
  100. package/source/components/host/call-button.mjs +3 -1
  101. package/source/components/host/stylesheet/call-button.mjs +61 -1
  102. package/source/components/host/stylesheet/host.mjs +1 -1
  103. package/source/components/host/stylesheet/toggle-button.mjs +61 -1
  104. package/source/components/layout/full-screen.mjs +31 -23
  105. package/source/components/layout/iframe.mjs +5 -1
  106. package/source/components/layout/popper.mjs +34 -4
  107. package/source/components/layout/style/full-screen.pcss +94 -23
  108. package/source/components/layout/style/split-panel.pcss +57 -5
  109. package/source/components/layout/style/tabs.pcss +277 -47
  110. package/source/components/layout/style/vertical-tabs.pcss +147 -0
  111. package/source/components/layout/stylesheet/collapse.mjs +61 -1
  112. package/source/components/layout/stylesheet/details.mjs +61 -1
  113. package/source/components/layout/stylesheet/full-screen.mjs +23 -1
  114. package/source/components/layout/stylesheet/overlay.mjs +1 -1
  115. package/source/components/layout/stylesheet/panel.mjs +1 -1
  116. package/source/components/layout/stylesheet/slider.mjs +1 -1
  117. package/source/components/layout/stylesheet/split-panel.mjs +17 -1
  118. package/source/components/layout/stylesheet/tabs.mjs +97 -1
  119. package/source/components/layout/stylesheet/vertical-tabs.mjs +33 -95
  120. package/source/components/layout/tabs.mjs +63 -0
  121. package/source/components/layout/vertical-tabs.mjs +63 -0
  122. package/source/components/navigation/stylesheet/site-navigation.mjs +1 -1
  123. package/source/components/navigation/stylesheet/table-of-content.mjs +1 -1
  124. package/source/components/navigation/stylesheet/wizard-navigation.mjs +1 -1
  125. package/source/components/navigation/table-of-content.mjs +13 -0
  126. package/source/components/notify/style/notify.pcss +1 -2
  127. package/source/components/notify/stylesheet/message.mjs +1 -1
  128. package/source/components/notify/stylesheet/notify.mjs +1 -1
  129. package/source/components/state/style/log.pcss +1 -0
  130. package/source/components/state/style/state.pcss +5 -1
  131. package/source/components/state/stylesheet/log.mjs +1 -1
  132. package/source/components/state/stylesheet/state.mjs +7 -1
  133. package/source/components/style/button.css +61 -205
  134. package/source/components/style/button.pcss +78 -34
  135. package/source/components/style/common.css +1 -170
  136. package/source/components/style/common.pcss +5 -9
  137. package/source/components/style/form.css +1 -49
  138. package/source/components/style/form.pcss +24 -6
  139. package/source/components/style/link.css +1 -39
  140. package/source/components/style/link.pcss +8 -16
  141. package/source/components/style/mixin/button.pcss +19 -10
  142. package/source/components/style/mixin/property.pcss +8 -0
  143. package/source/components/style/mixin/skeleton.pcss +11 -5
  144. package/source/components/style/normalize.css +1 -144
  145. package/source/components/style/normalize.pcss +5 -5
  146. package/source/components/style/property.css +1 -387
  147. package/source/components/style/skeleton.css +1 -198
  148. package/source/components/style/skeleton.pcss +8 -2
  149. package/source/components/style/theme-modern.css +74 -0
  150. package/source/components/style/theme-modern.pcss +498 -0
  151. package/source/components/stylesheet/button.mjs +61 -1
  152. package/source/components/stylesheet/common.mjs +1 -1
  153. package/source/components/stylesheet/form.mjs +1 -1
  154. package/source/components/stylesheet/link.mjs +1 -1
  155. package/source/components/stylesheet/normalize.mjs +1 -1
  156. package/source/components/stylesheet/property.mjs +1 -1
  157. package/source/components/stylesheet/skeleton.mjs +1 -1
  158. package/source/components/stylesheet/theme-modern.mjs +110 -0
  159. package/source/components/time/stylesheet/day.mjs +61 -1
  160. package/source/components/time/stylesheet/month-calendar.mjs +61 -1
  161. package/source/components/time/timeline/stylesheet/appointment.mjs +61 -1
  162. package/source/components/time/timeline/stylesheet/segment.mjs +61 -1
  163. package/source/components/tree-menu/style/tree-menu.pcss +26 -37
  164. package/source/components/tree-menu/stylesheet/tree-menu.mjs +1 -1
  165. package/test/cases/components/content/image-editor.mjs +19 -0
  166. package/test/cases/components/datatable/accessibility-defaults.mjs +112 -0
  167. package/test/cases/components/datatable/filter-availability.mjs +37 -0
  168. package/test/cases/components/datatable/filter-date-range-layout.mjs +40 -0
  169. package/test/cases/components/datatable/filter-select-operator.mjs +118 -0
  170. package/test/cases/components/datatable/mobile-layout.mjs +203 -0
  171. package/test/cases/components/datatable/responsive-breakpoint.mjs +41 -0
  172. package/test/cases/components/datatable/selection.mjs +149 -0
  173. package/test/cases/components/form/action-button-style.mjs +85 -0
  174. package/test/cases/components/form/button-bar.mjs +222 -3
  175. package/test/cases/components/form/context-theme-colors.mjs +59 -0
  176. package/test/cases/components/form/control-bar.mjs +228 -3
  177. package/test/cases/components/form/control-heights.mjs +103 -0
  178. package/test/cases/components/form/digits-accessibility.mjs +65 -0
  179. package/test/cases/components/form/field-set.mjs +54 -0
  180. package/test/cases/components/form/floating-ui.mjs +74 -0
  181. package/test/cases/components/form/input-group.mjs +61 -28
  182. package/test/cases/components/form/login.mjs +47 -0
  183. package/test/cases/components/form/password.mjs +63 -0
  184. package/test/cases/components/form/popper-button.mjs +30 -15
  185. package/test/cases/components/form/quantity-accessibility.mjs +46 -0
  186. package/test/cases/components/form/register-wizard.mjs +79 -0
  187. package/test/cases/components/form/select.mjs +94 -2
  188. package/test/cases/components/form/sheet.mjs +56 -2
  189. package/test/cases/components/host/toggle-button.mjs +50 -0
  190. package/test/cases/components/layout/full-screen.mjs +60 -0
  191. package/test/cases/components/layout/iframe-accessibility.mjs +44 -0
  192. package/test/cases/components/layout/popper.mjs +128 -0
  193. package/test/cases/components/layout/slit-panel.mjs +30 -1
  194. package/test/cases/components/layout/tabs.mjs +93 -0
  195. package/test/cases/components/navigation/table-of-content.mjs +18 -0
  196. package/test/cases/components/state/state-style.mjs +31 -0
  197. package/test/cases/components/style/action-menu.mjs +74 -0
  198. package/test/cases/components/style/form-controls.mjs +37 -0
  199. package/test/cases/components/style/kpi-tile.mjs +60 -0
  200. package/test/cases/components/style/legacy-theme-compatibility.mjs +137 -0
  201. package/test/cases/components/style/metric-layout.mjs +94 -0
  202. package/test/cases/components/style/skeleton.mjs +69 -0
  203. package/test/cases/components/style/theme-component-catalog.mjs +853 -0
  204. package/test/cases/components/style/theme-modern.mjs +439 -0
  205. package/test/cases/components/style/theme-review-regressions.mjs +41 -0
@@ -70,6 +70,12 @@ const toggleSwitchElementSymbol = Symbol("toggleSwitchElement");
70
70
  */
71
71
  const extendedSwitchElementSymbol = Symbol("extendedSwitchElement");
72
72
 
73
+ /**
74
+ * @private
75
+ * @type {string}
76
+ */
77
+ const ATTRIBUTE_CHOICE_LABEL = "data-monster-field-set-choice-label";
78
+
73
79
  /**
74
80
  * A field set control that can be used to group form elements.
75
81
  *
@@ -99,6 +105,7 @@ class FieldSet extends CustomControl {
99
105
  initControlReferences.call(this);
100
106
  initEventHandler.call(this);
101
107
  updateExtendedFields.call(this);
108
+ updateChoiceLabels.call(this);
102
109
  updateColumns.call(this);
103
110
  return this;
104
111
  }
@@ -333,6 +340,23 @@ function updateExtendedFields() {
333
340
  }
334
341
  }
335
342
 
343
+ /**
344
+ * Keep native checkbox and radio labels visually grouped without changing the
345
+ * established split layout for ordinary field labels.
346
+ *
347
+ * @private
348
+ */
349
+ function updateChoiceLabels() {
350
+ const labels = getSlottedElements.call(this, "label");
351
+ for (const label of labels) {
352
+ const isChoiceLabel =
353
+ label.querySelector(
354
+ ':scope > input:is([type="checkbox"], [type="radio"])',
355
+ ) instanceof HTMLInputElement;
356
+ label.toggleAttribute(ATTRIBUTE_CHOICE_LABEL, isChoiceLabel);
357
+ }
358
+ }
359
+
336
360
  /**
337
361
  * @private
338
362
  */
@@ -351,6 +375,12 @@ function updateColumns() {
351
375
  * @fires monster-field-set-clicked
352
376
  */
353
377
  function initEventHandler() {
378
+ for (const slot of this.shadowRoot.querySelectorAll("slot")) {
379
+ slot.addEventListener("slotchange", () => {
380
+ updateChoiceLabels.call(this);
381
+ });
382
+ }
383
+
354
384
  this[toggleSwitchElementSymbol].setOption(
355
385
  "labels.toggleSwitchOn",
356
386
  this.getOption("labels.toggleSwitchOn"),
@@ -1918,19 +1918,21 @@ function getTemplate() {
1918
1918
  collapse:field-set-login-collapse"
1919
1919
  part="login-field-set">
1920
1920
  <slot name="login-header"></slot>
1921
- <label part="login-label" data-monster-replace="path:labels.username"></label>
1922
- <input part="login-username"
1921
+ <label for="monster-login-username" part="login-label" data-monster-replace="path:labels.username"></label>
1922
+ <input id="monster-login-username" part="login-username"
1923
1923
  data-monster-attributes="placeholder path:placeholder.username, autocomplete path:autocomplete.username"
1924
1924
  type="text" name="username" autofocus>
1925
- <div data-monster-attributes="class path:classes.usernameInvalid"></div>
1925
+ <div style="grid-column: 1 / -1"
1926
+ data-monster-attributes="class path:classes.usernameInvalid"></div>
1926
1927
  <label part="login-password-label" data-monster-replace="path:labels.password"></label>
1927
1928
  <monster-password
1928
- data-monster-attributes="data-monster-option-placeholder path:placeholder.password, data-monster-option-autocomplete path:autocomplete.password"
1929
+ data-monster-attributes="data-monster-option-placeholder path:placeholder.password, data-monster-option-autocomplete path:autocomplete.password, data-monster-option-labels-input path:labels.password"
1929
1930
  exportparts="input-group:input-group-password,
1930
1931
  control:input-group-password-control,
1931
1932
  input:input-group-password-input" part="login-password"
1932
1933
  data-monster-bind="path:password"></monster-password>
1933
- <div data-monster-attributes="class path:classes.passwordInvalid"></div>
1934
+ <div style="grid-column: 1 / -1"
1935
+ data-monster-attributes="class path:classes.passwordInvalid"></div>
1934
1936
  <monster-message-state-button id="loginButton"
1935
1937
  part="login-button"
1936
1938
  data-monster-attributes="data-monster-option-classes-button path:classes.button"
@@ -1965,14 +1967,15 @@ function getTemplate() {
1965
1967
  content:field-set-forgot-password-content,
1966
1968
  collapse:field-set-forgot-password-collapse">
1967
1969
  <slot name="forgot-password-header"></slot>
1968
- <label part="forgot-password-label" data-monster-replace="path:labels.mailAddress"></label>
1969
- <input type="email" name="email"
1970
+ <label for="monster-login-email" part="forgot-password-label" data-monster-replace="path:labels.mailAddress"></label>
1971
+ <input id="monster-login-email" type="email" name="email"
1970
1972
  part="field-set-forgot-password-email"
1971
1973
  data-monster-attributes="accesskey path:accessKeys.username,
1972
1974
  placeholder path:placeholder.email,
1973
1975
  autocomplete path:autocomplete.email"
1974
1976
  >
1975
- <div data-monster-attributes="class path:classes.emailInvalid"></div>
1977
+ <div style="grid-column: 1 / -1"
1978
+ data-monster-attributes="class path:classes.emailInvalid"></div>
1976
1979
  <monster-message-state-button id="requestLinkButton"
1977
1980
  part="request-link-button"
1978
1981
  data-monster-attributes="data-monster-option-classes-button path:classes.button"
@@ -2011,7 +2014,7 @@ function getTemplate() {
2011
2014
  <slot name="second-factor-header"></slot>
2012
2015
  <label part="second-factor-label" data-monster-replace="path:labels.secondFactor"></label>
2013
2016
  <div>
2014
- <monster-digits data-monster-attributes="data-monster-option-digits path:digits"
2017
+ <monster-digits data-monster-attributes="data-monster-option-digits path:digits, data-monster-option-labels-group path:labels.secondFactor"
2015
2018
  part="second-factor-digits-control"
2016
2019
  id="secondFactorControl"></monster-digits>
2017
2020
  </div>
@@ -2053,7 +2056,7 @@ function getTemplate() {
2053
2056
  <label part="digits-label" data-monster-replace="path:labels.digits"></label>
2054
2057
  <div>
2055
2058
  <monster-digits part="digits-control"
2056
- data-monster-attributes="data-monster-option-digits path:digits"
2059
+ data-monster-attributes="data-monster-option-digits path:digits, data-monster-option-labels-group path:labels.digits"
2057
2060
  id="digitsControl"></monster-digits>
2058
2061
  </div>
2059
2062
  <monster-message-state-button id="digitsButton"
@@ -115,6 +115,8 @@ class Password extends CustomControl {
115
115
  * @property {string} autocomplete="off" The autocomplete state of the input field
116
116
  * @property {string} inputmode="text" The inputmode state of the input field
117
117
  * @property {Object} aria Aria attributes
118
+ * @property {Object} labels Accessible labels
119
+ * @property {string} labels.input="Password" Label for the native password input
118
120
  * @property {boolean} aria.required=false The required state of the input field
119
121
  * @property {string} aria.placeholder="" The placeholder of the input field
120
122
  * @property {boolean} disabled=false Disabled state
@@ -142,6 +144,9 @@ class Password extends CustomControl {
142
144
  required: false,
143
145
  placeholder: "",
144
146
  },
147
+ labels: {
148
+ input: "Password",
149
+ },
145
150
  disabled: false,
146
151
  value: null,
147
152
 
@@ -261,6 +266,7 @@ function getTemplate() {
261
266
  required path:required,
262
267
  autocomplete path:autocomplete,
263
268
  inputmode path:inputmode,
269
+ aria-label path:labels.input,
264
270
  aria-required path:aria.required,
265
271
  aria-placeholder path:aria.placeholder">
266
272
  <svg viewBox="0 0 16 16" data-monster-role="visible-icon" class="hidden">
@@ -463,7 +463,7 @@ function updatePopper() {
463
463
 
464
464
  positionPopper.call(
465
465
  this,
466
- this[controlElementSymbol],
466
+ this[buttonElementSymbol],
467
467
  this[popperElementSymbol],
468
468
  this.getOption("popper", {}),
469
469
  );
@@ -103,6 +103,10 @@ class Quantity extends CustomControl {
103
103
  * @property {string} templateMapping.plus Icon (SVG-Path) Plus
104
104
  * @property {string} templateMapping.minus Icon (SVG-Path) Minus
105
105
  * @property {Object} classes CSS classes
106
+ * @property {Object} labels Accessible labels
107
+ * @property {string} labels.input="Quantity" Label for the numeric input
108
+ * @property {string} labels.decrement="Decrease quantity" Label for the decrement button
109
+ * @property {string} labels.increment="Increase quantity" Label for the increment button
106
110
  * @property {string} classes.button Button class (e.g. monster-button-outline-primary)
107
111
  * @property {string} classes.input Additional class for input
108
112
  * @property {Object} features Feature toggles
@@ -125,12 +129,17 @@ class Quantity extends CustomControl {
125
129
  plus: `
126
130
  <path d="M8 1a1 1 0 0 1 1 1v5h5a1 1 0 1 1 0 2H9v5a1 1 0 1 1-2 0V9H2a1 1 0 1 1 0-2h5V2a1 1 0 0 1 1-1z"/>`,
127
131
  minus: `
128
- <path d="M2 7.5a1 1 0 0 0 0 1H14a1 1 0 1 0 0-2H2a1 1 0 0 0 0 1z"/>`,
132
+ <path d="M2 7h12v2H2z"/>`,
129
133
  },
130
134
  classes: {
131
135
  button: "monster-button-outline-primary",
132
136
  input: "",
133
137
  },
138
+ labels: {
139
+ input: "Quantity",
140
+ decrement: "Decrease quantity",
141
+ increment: "Increase quantity",
142
+ },
134
143
  features: {
135
144
  editable: true,
136
145
  hold: true,
@@ -341,9 +350,8 @@ function getTemplate() {
341
350
  <monster-input-group part="input-group">
342
351
  <button type="button"
343
352
  part="decrement-button"
344
- data-monster-attributes="class path:classes.button"
345
353
  data-monster-role="decrement"
346
- aria-label="decrement">
354
+ data-monster-attributes="class path:classes.button, aria-label path:labels.decrement">
347
355
  <svg viewBox="0 0 16 16" aria-hidden="true" fill="currentColor"
348
356
  >\${minus}</svg>
349
357
  </button>
@@ -353,14 +361,14 @@ function getTemplate() {
353
361
  data-monster-attributes="
354
362
  class path:classes.input,
355
363
  placeholder path:placeholder,
356
- inputmode path:inputmode"
364
+ inputmode path:inputmode,
365
+ aria-label path:labels.input"
357
366
  autocomplete="off" />
358
367
 
359
368
  <button type="button"
360
369
  part="increment-button"
361
- data-monster-attributes="class path:classes.button"
362
370
  data-monster-role="increment"
363
- aria-label="increment">
371
+ data-monster-attributes="class path:classes.button, aria-label path:labels.increment">
364
372
  <svg viewBox="0 0 16 16" aria-hidden="true" fill="currentColor">\${plus}</svg>
365
373
  </button>
366
374
  </monster-input-group>
@@ -250,6 +250,7 @@ class RegisterWizard extends CustomElement {
250
250
  }
251
251
 
252
252
  [assembleMethodSymbol]() {
253
+ ensureLabels.call(this);
253
254
  super[assembleMethodSymbol]();
254
255
  this[currentStepSymbol] = 0;
255
256
  this[completedSymbol] = false;
@@ -265,12 +266,14 @@ class RegisterWizard extends CustomElement {
265
266
  applyPasswordConfirmVisibility.call(this);
266
267
  applyProfileFeatureVisibility.call(this);
267
268
  applyAddressLayout.call(this);
268
- ensureLabels.call(this);
269
269
  applyFieldLabels.call(this);
270
270
  updateWizardLabels.call(this);
271
271
  updateStepVisibility.call(this);
272
272
  loadConsentTopics.call(this);
273
273
  goToStep.call(this, 0, true);
274
+ setTimeout(() => {
275
+ applyFieldLabels.call(this);
276
+ }, 0);
274
277
  return this;
275
278
  }
276
279
 
@@ -1247,8 +1250,11 @@ function ensureLabels() {
1247
1250
  this.setOption("labels", fallback);
1248
1251
  return;
1249
1252
  }
1250
- const merged = Object.assign({}, fallback, current);
1251
- this.setOption("labels", merged);
1253
+ for (const [key, value] of Object.entries(fallback)) {
1254
+ if (current[key] === undefined) {
1255
+ this.setOption(`labels.${key}`, value);
1256
+ }
1257
+ }
1252
1258
  }
1253
1259
 
1254
1260
  function applyFieldLabels() {
@@ -1297,66 +1303,81 @@ function applyFieldLabels() {
1297
1303
  '[data-monster-role~="country-label"]',
1298
1304
  labels.country,
1299
1305
  );
1306
+ setLabelText.call(
1307
+ this,
1308
+ '[data-monster-role="consents-title"]',
1309
+ labels.consentsTitle,
1310
+ );
1300
1311
 
1301
1312
  setInputMeta.call(
1302
1313
  this,
1303
1314
  this[emailInputSymbol],
1304
1315
  labels.emailPlaceholder,
1305
1316
  labels.emailAria,
1317
+ this.getOption("autocomplete.email"),
1306
1318
  );
1307
1319
  setInputMeta.call(
1308
1320
  this,
1309
1321
  this[passwordConfirmInputSymbol],
1310
1322
  labels.passwordConfirmPlaceholder,
1311
1323
  labels.passwordConfirmAria,
1324
+ this.getOption("autocomplete.passwordConfirm"),
1312
1325
  );
1313
1326
  setInputMeta.call(
1314
1327
  this,
1315
1328
  this[profileInputsSymbol]?.firstName,
1316
1329
  labels.firstNamePlaceholder,
1317
1330
  labels.firstNameAria,
1331
+ this.getOption("autocomplete.firstName"),
1318
1332
  );
1319
1333
  setInputMeta.call(
1320
1334
  this,
1321
1335
  this[profileInputsSymbol]?.lastName,
1322
1336
  labels.lastNamePlaceholder,
1323
1337
  labels.lastNameAria,
1338
+ this.getOption("autocomplete.lastName"),
1324
1339
  );
1325
1340
  setInputMeta.call(
1326
1341
  this,
1327
1342
  this[profileInputsSymbol]?.birthDate,
1328
1343
  null,
1329
1344
  labels.birthDateAria,
1345
+ this.getOption("autocomplete.birthDate"),
1330
1346
  );
1331
1347
  setInputMeta.call(
1332
1348
  this,
1333
1349
  this[profileInputsSymbol]?.nationality,
1334
1350
  labels.nationalityPlaceholder,
1335
1351
  labels.nationalityAria,
1352
+ this.getOption("autocomplete.nationality"),
1336
1353
  );
1337
1354
  setInputMeta.call(
1338
1355
  this,
1339
1356
  this[addressInputsSymbol]?.street,
1340
1357
  labels.streetPlaceholder,
1341
1358
  labels.streetAria,
1359
+ this.getOption("autocomplete.street"),
1342
1360
  );
1343
1361
  setInputMeta.call(
1344
1362
  this,
1345
1363
  this[addressInputsSymbol]?.zip,
1346
1364
  labels.zipPlaceholder,
1347
1365
  labels.zipAria,
1366
+ this.getOption("autocomplete.zip"),
1348
1367
  );
1349
1368
  setInputMeta.call(
1350
1369
  this,
1351
1370
  this[addressInputsSymbol]?.city,
1352
1371
  labels.cityPlaceholder,
1353
1372
  labels.cityAria,
1373
+ this.getOption("autocomplete.city"),
1354
1374
  );
1355
1375
  setInputMeta.call(
1356
1376
  this,
1357
1377
  this[addressInputsSymbol]?.country,
1358
1378
  labels.countryPlaceholder,
1359
1379
  labels.countryAria,
1380
+ this.getOption("autocomplete.country"),
1360
1381
  );
1361
1382
  }
1362
1383
 
@@ -1376,7 +1397,7 @@ function setLabelText(selector, text) {
1376
1397
  element.textContent = text || "";
1377
1398
  }
1378
1399
 
1379
- function setInputMeta(element, placeholder, aria) {
1400
+ function setInputMeta(element, placeholder, aria, autocomplete) {
1380
1401
  if (!element) {
1381
1402
  return;
1382
1403
  }
@@ -1386,6 +1407,9 @@ function setInputMeta(element, placeholder, aria) {
1386
1407
  if (aria) {
1387
1408
  element.setAttribute("aria-label", aria);
1388
1409
  }
1410
+ if (autocomplete) {
1411
+ element.setAttribute("autocomplete", autocomplete);
1412
+ }
1389
1413
  }
1390
1414
 
1391
1415
  async function loadConsentTopics() {
@@ -1799,8 +1823,8 @@ function getTemplate() {
1799
1823
  <div data-monster-role="content" part="content">
1800
1824
  <section data-monster-role="panel" data-step="email" part="panel panel-email">
1801
1825
  <monster-field-set data-monster-role="field-set-email" part="field-set field-set-email">
1802
- <label data-monster-role="field-label email-label" part="field-label email-label"
1803
- data-monster-replace="path:labels.email"></label>
1826
+ <label data-monster-role="field-label email-label"
1827
+ part="field-label email-label"></label>
1804
1828
  <input data-monster-role="email-input" part="input input-email"
1805
1829
  type="text" name="email"
1806
1830
  data-monster-attributes="placeholder path:labels.emailPlaceholder, autocomplete path:autocomplete.email, aria-label path:labels.emailAria" />
@@ -1817,14 +1841,14 @@ function getTemplate() {
1817
1841
 
1818
1842
  <section data-monster-role="panel" data-step="password" part="panel panel-password">
1819
1843
  <monster-field-set data-monster-role="field-set-password" part="field-set field-set-password">
1820
- <label data-monster-role="field-label password-label" part="field-label password-label"
1821
- data-monster-replace="path:labels.password"></label>
1844
+ <label data-monster-role="field-label password-label"
1845
+ part="field-label password-label"></label>
1822
1846
  <monster-password data-monster-role="password-input" part="input input-password"
1823
- data-monster-attributes="data-monster-option-autocomplete path:autocomplete.password, aria-label path:labels.passwordAria"></monster-password>
1847
+ data-monster-attributes="data-monster-option-autocomplete path:autocomplete.password, data-monster-option-labels-input path:labels.passwordAria"></monster-password>
1824
1848
  <label data-monster-role="field-label password-confirm-label"
1825
1849
  part="field-label password-confirm-label"
1826
1850
  data-monster-attributes="class path:features.confirmPassword | ?::hidden"
1827
- data-monster-replace="path:labels.passwordConfirm"></label>
1851
+ ></label>
1828
1852
  <input data-monster-role="password-confirm-input" part="input input-password-confirm"
1829
1853
  type="password" name="passwordConfirm"
1830
1854
  data-monster-attributes="class path:features.confirmPassword | ?::hidden, placeholder path:labels.passwordConfirmPlaceholder, autocomplete path:autocomplete.passwordConfirm, aria-label path:labels.passwordConfirmAria" />
@@ -1842,25 +1866,25 @@ function getTemplate() {
1842
1866
 
1843
1867
  <section data-monster-role="panel" data-step="profile" part="panel panel-profile">
1844
1868
  <monster-field-set data-monster-role="field-set-profile" part="field-set field-set-profile">
1845
- <label data-monster-role="field-label first-name-label" part="field-label first-name-label"
1846
- data-monster-replace="path:labels.firstName"></label>
1869
+ <label data-monster-role="field-label first-name-label"
1870
+ part="field-label first-name-label"></label>
1847
1871
  <input data-monster-role="first-name-input" part="input input-first-name"
1848
1872
  type="text" name="firstName"
1849
1873
  data-monster-attributes="placeholder path:labels.firstNamePlaceholder, autocomplete path:autocomplete.firstName, aria-label path:labels.firstNameAria" />
1850
- <label data-monster-role="field-label last-name-label" part="field-label last-name-label"
1851
- data-monster-replace="path:labels.lastName"></label>
1874
+ <label data-monster-role="field-label last-name-label"
1875
+ part="field-label last-name-label"></label>
1852
1876
  <input data-monster-role="last-name-input" part="input input-last-name"
1853
1877
  type="text" name="lastName"
1854
1878
  data-monster-attributes="placeholder path:labels.lastNamePlaceholder, autocomplete path:autocomplete.lastName, aria-label path:labels.lastNameAria" />
1855
1879
  <label data-monster-role="field-label birth-date-label" part="field-label birth-date-label"
1856
1880
  data-monster-attributes="class path:features.showBirthDate | ?::hidden"
1857
- data-monster-replace="path:labels.birthDate"></label>
1881
+ ></label>
1858
1882
  <input data-monster-role="birth-date-input" part="input input-birth-date"
1859
1883
  type="text" name="birthDate"
1860
1884
  data-monster-attributes="class path:features.showBirthDate | ?::hidden, autocomplete path:autocomplete.birthDate, aria-label path:labels.birthDateAria" />
1861
1885
  <label data-monster-role="field-label nationality-label" part="field-label nationality-label"
1862
1886
  data-monster-attributes="class path:features.showNationality | ?::hidden"
1863
- data-monster-replace="path:labels.nationality"></label>
1887
+ ></label>
1864
1888
  <input data-monster-role="nationality-input" part="input input-nationality"
1865
1889
  type="text" name="nationality"
1866
1890
  data-monster-attributes="class path:features.showNationality | ?::hidden, placeholder path:labels.nationalityPlaceholder, autocomplete path:autocomplete.nationality, aria-label path:labels.nationalityAria" />
@@ -1879,29 +1903,25 @@ function getTemplate() {
1879
1903
  <section data-monster-role="panel" data-step="address" part="panel panel-address">
1880
1904
  <monster-field-set data-monster-role="field-set-address" part="field-set field-set-address">
1881
1905
  <label data-monster-role="field-label street-label" part="field-label street-label"
1882
- class="grid-start-1"
1883
- data-monster-replace="path:labels.street"></label>
1906
+ class="grid-start-1"></label>
1884
1907
  <input data-monster-role="street-input" part="input input-street"
1885
1908
  class="grid-start-2 grid-span-full"
1886
1909
  type="text" name="street"
1887
1910
  data-monster-attributes="placeholder path:labels.streetPlaceholder, autocomplete path:autocomplete.street, aria-label path:labels.streetAria" />
1888
1911
  <label data-monster-role="field-label zip-label" part="field-label zip-label"
1889
- class="grid-start-1"
1890
- data-monster-replace="path:labels.zip"></label>
1912
+ class="grid-start-1"></label>
1891
1913
  <input data-monster-role="zip-input" part="input input-zip"
1892
1914
  class="grid-start-2"
1893
1915
  type="text" name="zip"
1894
1916
  data-monster-attributes="placeholder path:labels.zipPlaceholder, autocomplete path:autocomplete.zip, aria-label path:labels.zipAria" />
1895
1917
  <label data-monster-role="field-label city-label" part="field-label city-label"
1896
- class="grid-start-3"
1897
- data-monster-replace="path:labels.city"></label>
1918
+ class="grid-start-3"></label>
1898
1919
  <input data-monster-role="city-input" part="input input-city"
1899
1920
  class="grid-start-4"
1900
1921
  type="text" name="city"
1901
1922
  data-monster-attributes="placeholder path:labels.cityPlaceholder, autocomplete path:autocomplete.city, aria-label path:labels.cityAria" />
1902
1923
  <label data-monster-role="field-label country-label" part="field-label country-label"
1903
- class="grid-start-1"
1904
- data-monster-replace="path:labels.country"></label>
1924
+ class="grid-start-1"></label>
1905
1925
  <input data-monster-role="country-input" part="input input-country"
1906
1926
  class="grid-start-2 grid-span-full"
1907
1927
  type="text" name="country"
@@ -1920,8 +1940,8 @@ function getTemplate() {
1920
1940
 
1921
1941
  <section data-monster-role="panel" data-step="consents" part="panel panel-consents">
1922
1942
  <monster-field-set data-monster-role="field-set-consents" part="field-set field-set-consents">
1923
- <div data-monster-role="consents-title" part="consents-title"
1924
- data-monster-replace="path:labels.consentsTitle"></div>
1943
+ <div data-monster-role="consents-title"
1944
+ part="consents-title"></div>
1925
1945
  <div data-monster-role="consents-list" part="consents-list"></div>
1926
1946
  <slot name="consents-fields"></slot>
1927
1947
  </monster-field-set>
@@ -962,7 +962,7 @@ class Select extends CustomControl {
962
962
 
963
963
  new Processing(() => {
964
964
  gatherState.call(this);
965
- focusFilter.call(this);
965
+ focusFilter.call(this, { preventScroll: true });
966
966
  })
967
967
  .run()
968
968
  .catch((e) => {
@@ -3793,6 +3793,10 @@ function getSelectPopperPositionOptions() {
3793
3793
  popperOptions.placement = getDefaultSelectPopperPositionProfile().placement;
3794
3794
  }
3795
3795
 
3796
+ if (!isString(popperOptions.strategy)) {
3797
+ popperOptions.strategy = getDefaultSelectPopperPositionProfile().strategy;
3798
+ }
3799
+
3796
3800
  popperOptions.adaptiveSize = false;
3797
3801
  popperOptions.hideWhenReferenceHidden = true;
3798
3802
 
@@ -3820,6 +3824,7 @@ function getSelectPopperPositionOptions() {
3820
3824
  function getDefaultSelectPopperPositionProfile() {
3821
3825
  return {
3822
3826
  placement: "bottom-start",
3827
+ strategy: "fixed",
3823
3828
  middleware: ["flip", "offset:4", "shift:crossAxis", "size"],
3824
3829
  };
3825
3830
  }
@@ -3903,7 +3908,7 @@ function activateCurrentOption(direction) {
3903
3908
  }
3904
3909
  }
3905
3910
  if (found === false) {
3906
- focusFilter.call(this);
3911
+ focusFilter.call(this, { preventScroll: true });
3907
3912
  }
3908
3913
  }
3909
3914
  }
@@ -5130,7 +5135,7 @@ function show() {
5130
5135
 
5131
5136
  setTotalText.call(this);
5132
5137
 
5133
- focusFilter.call(this);
5138
+ focusFilter.call(this, { preventScroll: true });
5134
5139
 
5135
5140
  if (shouldLazyLoadOptions.call(this)) {
5136
5141
  if (this[lazyLoadRequestSymbol] instanceof Promise) {
@@ -5277,7 +5282,7 @@ function show() {
5277
5282
  } else {
5278
5283
  initTotal.call(self);
5279
5284
  }
5280
- focusFilter.call(this);
5285
+ focusFilter.call(this, { preventScroll: true });
5281
5286
  return performSelectLayoutCycle
5282
5287
  .call(this, SELECT_LAYOUT_REASON_ALL)
5283
5288
  .then(() => {
@@ -6026,12 +6031,14 @@ function getTemplate() {
6026
6031
  <div part="options" data-monster-role="options" data-monster-insert="options path:options"
6027
6032
  tabindex="-1"></div>
6028
6033
  </div>
6029
- <monster-pagination data-monster-role="pagination" part="pagination"
6030
- data-monster-option-layout-mode="compact"></monster-pagination>
6031
- <div part="remote-info"
6032
- data-monster-role="remote-info"
6033
- data-monster-attributes="class path:classes.remoteInfo"
6034
- data-monster-replace="path:messages.total"></div>
6034
+ <div part="pagination-footer" data-monster-role="pagination-footer">
6035
+ <div part="remote-info"
6036
+ data-monster-role="remote-info"
6037
+ data-monster-attributes="class path:classes.remoteInfo"
6038
+ data-monster-replace="path:messages.total"></div>
6039
+ <monster-pagination data-monster-role="pagination" part="pagination"
6040
+ data-monster-option-layout-mode="compact"></monster-pagination>
6041
+ </div>
6035
6042
  <div part="no-options" data-monster-role="no-options"
6036
6043
  data-monster-attributes="class path:classes.noOptions"
6037
6044
  data-monster-replace="path:messages.emptyOptions"></div>
@@ -80,7 +80,12 @@ class Sheet extends CustomControl {
80
80
  get defaults() {
81
81
  return Object.assign({}, super.defaults, {
82
82
  templates: { main: getTemplate() },
83
- labels: getTranslations(),
83
+ labels: Object.assign(
84
+ {
85
+ cell: "Column {column}, row {row}",
86
+ },
87
+ getTranslations(),
88
+ ),
84
89
  classes: {
85
90
  button: "monster-button-outline-primary",
86
91
  },
@@ -636,6 +641,12 @@ function buildCell(row, column, cells, isLastColumn) {
636
641
  input.autocomplete = "off";
637
642
  input.inputMode = "text";
638
643
  input.placeholder = this.getOption("cell.placeholder", "");
644
+ input.setAttribute(
645
+ "aria-label",
646
+ String(this.getOption("labels.cell", "Column {column}, row {row}"))
647
+ .replaceAll("{column}", String(column.label ?? column.id))
648
+ .replaceAll("{row}", String(row.label ?? row.id)),
649
+ );
639
650
  const value =
640
651
  typeof cells === "function"
641
652
  ? cells(row.id, column.id)
@@ -1790,7 +1801,7 @@ function showContextMenu(clientX, clientY) {
1790
1801
  const wrapper = this[gridWrapperSymbol];
1791
1802
  if (!menu || !wrapper) return;
1792
1803
  menu.hidden = false;
1793
- menu.style.display = "block";
1804
+ menu.style.display = "flex";
1794
1805
  const wrapperRect = wrapper.getBoundingClientRect();
1795
1806
  const offsetX = clientX - wrapperRect.left + wrapper.scrollLeft;
1796
1807
  const offsetY = clientY - wrapperRect.top + wrapper.scrollTop;