@sebgroup/green-core 3.31.0 → 3.32.1

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 (126) hide show
  1. package/components/dropdown/dropdown.component.d.ts +1 -0
  2. package/components/dropdown/dropdown.component.js +23 -4
  3. package/components/form-summary/summary.component.d.ts +3 -0
  4. package/components/form-summary/summary.component.js +17 -16
  5. package/custom-elements.json +11806 -11785
  6. package/gds-element.js +1 -1
  7. package/generated/locales/da.d.ts +5 -0
  8. package/generated/locales/da.js +5 -0
  9. package/generated/locales/de.d.ts +5 -0
  10. package/generated/locales/de.js +5 -0
  11. package/generated/locales/fi.d.ts +5 -0
  12. package/generated/locales/fi.js +5 -0
  13. package/generated/locales/fr.d.ts +5 -0
  14. package/generated/locales/fr.js +5 -0
  15. package/generated/locales/it.d.ts +5 -0
  16. package/generated/locales/it.js +5 -0
  17. package/generated/locales/nl.d.ts +5 -0
  18. package/generated/locales/nl.js +5 -0
  19. package/generated/locales/no.d.ts +5 -0
  20. package/generated/locales/no.js +5 -0
  21. package/generated/locales/sv.d.ts +5 -0
  22. package/generated/locales/sv.js +5 -0
  23. package/generated/mcp/alert/guidelines.md +105 -0
  24. package/generated/mcp/alert/index.json +1 -0
  25. package/generated/mcp/avatar/guidelines.md +40 -0
  26. package/generated/mcp/avatar/index.json +1 -0
  27. package/generated/mcp/badge/guidelines.md +56 -0
  28. package/generated/mcp/badge/index.json +1 -0
  29. package/generated/mcp/blur/guidelines.md +3 -0
  30. package/generated/mcp/blur/index.json +1 -0
  31. package/generated/mcp/breadcrumbs/guidelines.md +35 -0
  32. package/generated/mcp/breadcrumbs/index.json +1 -0
  33. package/generated/mcp/button/guidelines.md +83 -0
  34. package/generated/mcp/button/index.json +1 -0
  35. package/generated/mcp/calendar/guidelines.md +3 -0
  36. package/generated/mcp/calendar/index.json +1 -0
  37. package/generated/mcp/card/guidelines.md +78 -0
  38. package/generated/mcp/card/index.json +1 -0
  39. package/generated/mcp/card-pattern-01/guidelines.md +52 -0
  40. package/generated/mcp/card-pattern-01/index.json +1 -0
  41. package/generated/mcp/checkbox/guidelines.md +91 -0
  42. package/generated/mcp/checkbox/index.json +1 -0
  43. package/generated/mcp/coachmark/guidelines.md +8 -0
  44. package/generated/mcp/coachmark/index.json +1 -0
  45. package/generated/mcp/components.json +47 -1
  46. package/generated/mcp/context-menu/guidelines.md +33 -0
  47. package/generated/mcp/context-menu/index.json +1 -0
  48. package/generated/mcp/datepicker/guidelines.md +44 -0
  49. package/generated/mcp/datepicker/index.json +1 -0
  50. package/generated/mcp/details/guidelines.md +24 -0
  51. package/generated/mcp/details/index.json +1 -0
  52. package/generated/mcp/dialog/guidelines.md +35 -0
  53. package/generated/mcp/dialog/index.json +1 -0
  54. package/generated/mcp/div/guidelines.md +3 -0
  55. package/generated/mcp/div/index.json +1 -0
  56. package/generated/mcp/divider/guidelines.md +24 -0
  57. package/generated/mcp/divider/index.json +1 -0
  58. package/generated/mcp/dropdown/guidelines.md +96 -0
  59. package/generated/mcp/dropdown/index.json +1 -0
  60. package/generated/mcp/fab/guidelines.md +27 -0
  61. package/generated/mcp/fab/index.json +1 -0
  62. package/generated/mcp/filter-chips/guidelines.md +47 -0
  63. package/generated/mcp/filter-chips/index.json +1 -0
  64. package/generated/mcp/flex/guidelines.md +1 -0
  65. package/generated/mcp/flex/index.json +1 -0
  66. package/generated/mcp/form-summary/angular.md +8 -0
  67. package/generated/mcp/form-summary/api.md +7 -0
  68. package/generated/mcp/form-summary/guidelines.md +39 -0
  69. package/generated/mcp/form-summary/index.json +1 -0
  70. package/generated/mcp/form-summary/react.md +8 -0
  71. package/generated/mcp/grid/guidelines.md +3 -0
  72. package/generated/mcp/grid/index.json +1 -0
  73. package/generated/mcp/icons.json +1 -1
  74. package/generated/mcp/index.json +1 -1
  75. package/generated/mcp/input/guidelines.md +127 -0
  76. package/generated/mcp/input/index.json +1 -0
  77. package/generated/mcp/link/guidelines.md +43 -0
  78. package/generated/mcp/link/index.json +1 -0
  79. package/generated/mcp/list/guidelines.md +16 -0
  80. package/generated/mcp/list/index.json +1 -0
  81. package/generated/mcp/list-item-pattern-01/guidelines.md +49 -0
  82. package/generated/mcp/list-item-pattern-01/index.json +1 -0
  83. package/generated/mcp/menu-button/guidelines.md +39 -0
  84. package/generated/mcp/menu-button/index.json +1 -0
  85. package/generated/mcp/pagination/guidelines.md +24 -0
  86. package/generated/mcp/pagination/index.json +1 -0
  87. package/generated/mcp/popover/guidelines.md +3 -0
  88. package/generated/mcp/popover/index.json +1 -0
  89. package/generated/mcp/progress/guidelines.md +42 -0
  90. package/generated/mcp/progress/index.json +1 -0
  91. package/generated/mcp/radio/guidelines.md +74 -0
  92. package/generated/mcp/radio/index.json +1 -0
  93. package/generated/mcp/rich-text/guidelines.md +3 -0
  94. package/generated/mcp/rich-text/index.json +1 -0
  95. package/generated/mcp/segmented-control/guidelines.md +31 -0
  96. package/generated/mcp/segmented-control/index.json +1 -0
  97. package/generated/mcp/select/guidelines.md +29 -0
  98. package/generated/mcp/select/index.json +1 -0
  99. package/generated/mcp/signal/guidelines.md +14 -0
  100. package/generated/mcp/signal/index.json +1 -0
  101. package/generated/mcp/slider/guidelines.md +86 -0
  102. package/generated/mcp/slider/index.json +1 -0
  103. package/generated/mcp/spinner/guidelines.md +6 -0
  104. package/generated/mcp/spinner/index.json +1 -0
  105. package/generated/mcp/switch/guidelines.md +41 -0
  106. package/generated/mcp/switch/index.json +1 -0
  107. package/generated/mcp/table/guidelines.md +169 -0
  108. package/generated/mcp/table/index.json +1 -0
  109. package/generated/mcp/tabs/guidelines.md +64 -0
  110. package/generated/mcp/tabs/index.json +1 -0
  111. package/generated/mcp/text/guidelines.md +3 -0
  112. package/generated/mcp/text/index.json +1 -0
  113. package/generated/mcp/textarea/guidelines.md +73 -0
  114. package/generated/mcp/textarea/index.json +1 -0
  115. package/generated/mcp/theme/guidelines.md +3 -0
  116. package/generated/mcp/theme/index.json +1 -0
  117. package/generated/mcp/tokens.json +1 -1
  118. package/generated/mcp/tooltip/guidelines.md +107 -0
  119. package/generated/mcp/tooltip/index.json +1 -0
  120. package/generated/mcp/video/guidelines.md +3 -0
  121. package/generated/mcp/video/index.json +1 -0
  122. package/generated/react/form-summary/index.d.ts +6 -1
  123. package/generated/react/index.d.ts +4 -4
  124. package/generated/react/index.js +4 -4
  125. package/package.json +1 -1
  126. package/utils/helpers/custom-element-scoping.js +1 -1
@@ -132,6 +132,7 @@ declare class Dropdown extends GdsFormControlElement implements OptionsContainer
132
132
  get navigableItems(): GdsOption[];
133
133
  private _elTriggerBtn;
134
134
  private _elSearchInput;
135
+ private _elListbox;
135
136
  connectedCallback(): void;
136
137
  disconnectedCallback(): void;
137
138
  render(): any;
@@ -5,7 +5,7 @@ import {
5
5
  __privateMethod,
6
6
  __privateSet
7
7
  } from "../../chunks/chunk.H2T4A5YY.js";
8
- var _optionElements, _Dropdown_instances, shouldShowFooter_fn, _renderCombobox, _renderTriggerButton, _handleBlur, _calcMaxHeight, _dispatchUISateEvent, _handlePopoverStateChange, _handleClearButton, _handleSearchFieldInput, _handleSearchFieldKeyDown, _handleListboxKeyDown, _handleOptionFocusChange, _handleOptionSelect, toggleOptionValue_fn, syncOptionSelection_fn, _focusListbox, _isPointerPressedInListbox, _handleListboxPointerDown, _handleListboxFocus, _isCommitting, commitSelection_fn, registerAutoCloseListener_fn, unregisterAutoCloseListener_fn, _blurCloseListener, _tabCloseListener;
8
+ var _optionElements, _Dropdown_instances, shouldShowFooter_fn, _renderCombobox, _renderTriggerButton, _handleBlur, _calcMaxHeight, _dispatchUISateEvent, _handlePopoverStateChange, _handleClearButton, _handleSearchFieldInput, _handleSearchFieldKeyDown, _handleListboxKeyDown, _handleOptionFocusChange, _handleOptionSelect, toggleOptionValue_fn, syncOptionSelection_fn, _focusListbox, _isPointerPressedInListbox, _handleListboxPointerDown, _handleListboxFocus, _isCommitting, commitSelection_fn, scrollOptionIntoView_fn, registerAutoCloseListener_fn, unregisterAutoCloseListener_fn, _blurCloseListener, _tabCloseListener;
9
9
  import { localized, msg, str } from "@lit/localize";
10
10
  import { nothing } from "lit";
11
11
  import { property, query } from "lit/decorators.js";
@@ -162,6 +162,8 @@ let Dropdown = class extends GdsFormControlElement {
162
162
  }
163
163
  if (__privateGet(this, _dispatchUISateEvent).call(this, e.detail.open, e.detail.reason)) {
164
164
  this.open = e.detail.open;
165
+ } else {
166
+ e.preventDefault();
165
167
  }
166
168
  });
167
169
  __privateAdd(this, _handleClearButton, (e) => {
@@ -535,9 +537,7 @@ let Dropdown = class extends GdsFormControlElement {
535
537
  const selectedOption = this.options.find((option) => option.selected);
536
538
  requestAnimationFrame(async () => {
537
539
  await this.updateComplete;
538
- selectedOption?.scrollIntoView({
539
- block: "center"
540
- });
540
+ __privateMethod(this, _Dropdown_instances, scrollOptionIntoView_fn).call(this, selectedOption);
541
541
  });
542
542
  }
543
543
  };
@@ -605,6 +605,22 @@ commitSelection_fn = function(value, options = {}) {
605
605
  __privateSet(this, _isCommitting, false);
606
606
  }
607
607
  };
608
+ /**
609
+ * Centers an option inside the listbox container by adjusting the container's own
610
+ * `scrollTop`. `Element.scrollIntoView` was used here previously, but it also scrolls
611
+ * ancestor scrollports, including the window when the popover is non-modal (combobox
612
+ * mode). That self-inflicted page scroll closes the popover through its own
613
+ * scroll-to-close behavior. See #3290.
614
+ */
615
+ scrollOptionIntoView_fn = function(option) {
616
+ const container = this._elListbox;
617
+ if (!container || !option) return;
618
+ const containerRect = container.getBoundingClientRect();
619
+ const optionRect = option.getBoundingClientRect();
620
+ const offsetFromContainerTop = optionRect.top - containerRect.top;
621
+ const centeredOffset = (containerRect.height - optionRect.height) / 2;
622
+ container.scrollTop += offsetFromContainerTop - centeredOffset;
623
+ };
608
624
  registerAutoCloseListener_fn = function() {
609
625
  this.addEventListener("blur", __privateGet(this, _blurCloseListener));
610
626
  this.addEventListener("gds-blur", __privateGet(this, _blurCloseListener));
@@ -678,6 +694,9 @@ __decorateClass([
678
694
  __decorateClass([
679
695
  query("#searchinput")
680
696
  ], Dropdown.prototype, "_elSearchInput", 2);
697
+ __decorateClass([
698
+ query("#listbox")
699
+ ], Dropdown.prototype, "_elListbox", 2);
681
700
  __decorateClass([
682
701
  observeLightDOM({
683
702
  attributes: true,
@@ -8,6 +8,9 @@ import { GdsElement } from '../../gds-element';
8
8
  * in a consolidated manner. It provides a clear indication of what went wrong and what needs to be corrected.
9
9
  *
10
10
  * @slot header - Optional slot for customizing the header of the summary.
11
+ *
12
+ * @event gds-control-focus - Fired when an item in the summary is clicked, before focus moves to the related control.
13
+ * The detail object contains the control. Can be cancelled with event.preventDefault() to handle focus yourself.
11
14
  */
12
15
  export declare class GdsFormSummary extends GdsElement {
13
16
  #private;
@@ -7,9 +7,7 @@ import {
7
7
  } from "../../chunks/chunk.H2T4A5YY.js";
8
8
  var _form, _formObserver, _GdsFormSummary_instances, renderControlItem_fn, groupByFieldset_fn, getFormControls_fn, getErrorControls_fn, renderArrowIcon_fn;
9
9
  import { msg, str } from "@lit/localize";
10
- import { nothing } from "lit";
11
10
  import { property, queryAsync } from "lit/decorators.js";
12
- import { until } from "lit/directives/until.js";
13
11
  import { when } from "lit/directives/when.js";
14
12
  import { GdsElement } from "../../gds-element.js";
15
13
  import { gdsCustomElement, html } from "../../scoping.js";
@@ -43,9 +41,9 @@ let GdsFormSummary = class extends GdsElement {
43
41
  * Focuses the first focusable element in the summary.
44
42
  */
45
43
  focus(options) {
46
- this._elRoot.then((el) => {
47
- const firstFocusable = el.querySelector(
48
- '[gds-element="gds-button"]'
44
+ void this._elRoot.then((el) => {
45
+ const firstFocusable = el?.querySelector(
46
+ 'li.item:not([inert]) [gds-element="gds-button"]'
49
47
  );
50
48
  if (firstFocusable) {
51
49
  firstFocusable.focus(options);
@@ -89,7 +87,6 @@ let GdsFormSummary = class extends GdsElement {
89
87
  border-color="negative-01"
90
88
  border-radius="m"
91
89
  overflow="hidden"
92
- aria-describedby="description"
93
90
  aria-label=${msg(`Form error summary`)}
94
91
  >
95
92
  <gds-flex gap="0" flex-direction="column">
@@ -137,6 +134,7 @@ _form = new WeakMap();
137
134
  _formObserver = new WeakMap();
138
135
  _GdsFormSummary_instances = new WeakSet();
139
136
  renderControlItem_fn = function(el) {
137
+ const label = el.dataset.label || el.label || el.ariaLabel;
140
138
  return html`<li
141
139
  class="item"
142
140
  ?inert=${!(el.ariaInvalid === "true" || el.invalid)}
@@ -155,20 +153,23 @@ renderControlItem_fn = function(el) {
155
153
  padding="xs s"
156
154
  @click=${(e) => {
157
155
  e.preventDefault();
158
- el.focus();
156
+ const proceed = this.dispatchCustomEvent("gds-control-focus", {
157
+ detail: { control: el },
158
+ bubbles: false,
159
+ composed: false
160
+ });
161
+ if (proceed) el.focus();
159
162
  }}
160
163
  >
161
164
  <div>
162
- <gds-div font-weight="book"
163
- >${el.dataset.label || el.label || el.ariaLabel}</gds-div
164
- >
165
+ <gds-div font-weight="book">${label}</gds-div>
165
166
  </div>
166
167
  <gds-button
167
168
  size="xs"
168
169
  rank="secondary"
169
- label=${`Move focus to ${el.label} field`}
170
+ label=${msg(str`Move focus to ${label} field`)}
170
171
  >
171
- ${until(__privateMethod(this, _GdsFormSummary_instances, renderArrowIcon_fn).call(this, el), nothing)}
172
+ ${__privateMethod(this, _GdsFormSummary_instances, renderArrowIcon_fn).call(this, el)}
172
173
  </gds-button>
173
174
  </gds-card>
174
175
  </li>`;
@@ -204,10 +205,10 @@ getErrorControls_fn = function() {
204
205
  (el) => el.ariaInvalid === "true" || el.invalid
205
206
  );
206
207
  };
207
- renderArrowIcon_fn = async function(el) {
208
- const selfTop = (await this._elRoot).getBoundingClientRect().top;
209
- const elTop = el.getBoundingClientRect().top;
210
- const isAbove = elTop < selfTop;
208
+ renderArrowIcon_fn = function(el) {
209
+ const isAbove = Boolean(
210
+ this.compareDocumentPosition(el) & Node.DOCUMENT_POSITION_PRECEDING
211
+ );
211
212
  return when(
212
213
  isAbove,
213
214
  () => html`<gds-icon-arrow-up></gds-icon-arrow-up>`,