@navikt/ds-react 7.32.3 → 7.32.5

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 (47) hide show
  1. package/cjs/accordion/AccordionHeader.js +1 -1
  2. package/cjs/accordion/AccordionHeader.js.map +1 -1
  3. package/cjs/form/combobox/Input/ToggleListButton.js +2 -1
  4. package/cjs/form/combobox/Input/ToggleListButton.js.map +1 -1
  5. package/cjs/modal/Modal.js +12 -0
  6. package/cjs/modal/Modal.js.map +1 -1
  7. package/cjs/modal/ModalUtils.d.ts +3 -2
  8. package/cjs/modal/ModalUtils.js +60 -10
  9. package/cjs/modal/ModalUtils.js.map +1 -1
  10. package/cjs/util/detectBrowser.d.ts +3 -1
  11. package/cjs/util/detectBrowser.js +27 -1
  12. package/cjs/util/detectBrowser.js.map +1 -1
  13. package/cjs/util/hideNonTargetElements.d.ts +8 -0
  14. package/cjs/util/hideNonTargetElements.js +141 -0
  15. package/cjs/util/hideNonTargetElements.js.map +1 -0
  16. package/cjs/util/hooks/useScrollLock.d.ts +11 -0
  17. package/cjs/util/hooks/useScrollLock.js +270 -0
  18. package/cjs/util/hooks/useScrollLock.js.map +1 -0
  19. package/esm/accordion/AccordionHeader.js +1 -1
  20. package/esm/accordion/AccordionHeader.js.map +1 -1
  21. package/esm/form/combobox/Input/ToggleListButton.js +2 -1
  22. package/esm/form/combobox/Input/ToggleListButton.js.map +1 -1
  23. package/esm/modal/Modal.js +13 -1
  24. package/esm/modal/Modal.js.map +1 -1
  25. package/esm/modal/ModalUtils.d.ts +3 -2
  26. package/esm/modal/ModalUtils.js +27 -7
  27. package/esm/modal/ModalUtils.js.map +1 -1
  28. package/esm/util/detectBrowser.d.ts +3 -1
  29. package/esm/util/detectBrowser.js +25 -1
  30. package/esm/util/detectBrowser.js.map +1 -1
  31. package/esm/util/hideNonTargetElements.d.ts +8 -0
  32. package/esm/util/hideNonTargetElements.js +139 -0
  33. package/esm/util/hideNonTargetElements.js.map +1 -0
  34. package/esm/util/hooks/useScrollLock.d.ts +11 -0
  35. package/esm/util/hooks/useScrollLock.js +268 -0
  36. package/esm/util/hooks/useScrollLock.js.map +1 -0
  37. package/package.json +5 -5
  38. package/src/accordion/AccordionHeader.tsx +1 -1
  39. package/src/form/combobox/Input/ToggleListButton.tsx +2 -1
  40. package/src/form/combobox/__tests__/combobox.test.tsx +45 -106
  41. package/src/modal/Modal.test.tsx +13 -24
  42. package/src/modal/Modal.tsx +16 -0
  43. package/src/modal/ModalUtils.ts +35 -7
  44. package/src/util/__tests__/hideNonTargetElements.test.ts +147 -0
  45. package/src/util/detectBrowser.ts +41 -1
  46. package/src/util/hideNonTargetElements.ts +179 -0
  47. package/src/util/hooks/useScrollLock.ts +317 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Modified version of `aria-hidden`-package.
3
+ * - Removed "inert"-functionality.
4
+ * - Removed flexibility for different data-attributes.
5
+ * https://github.com/theKashey/aria-hidden/blob/720e8a8e1cfa047bd299a929d95d47ac860a5c1a/src/index.ts
6
+ */
7
+ import { ownerDocument } from "./owner.js";
8
+ let ariaHiddenCounter = new WeakMap();
9
+ let markerCounter = new WeakMap();
10
+ let uncontrolledElementsSet = new WeakSet();
11
+ let lockCount = 0;
12
+ const controlAttribute = "aria-hidden";
13
+ const markerName = "data-aksel-hidden";
14
+ /**
15
+ * Unwraps a Shadow DOM host to find the actual Element in the light DOM.
16
+ */
17
+ function unwrapHost(node) {
18
+ return (node &&
19
+ (node.host || unwrapHost(node.parentNode)));
20
+ }
21
+ /**
22
+ * Corrects the target elements by unwrapping Shadow DOM hosts if necessary.
23
+ *
24
+ * @param parent - The parent HTMLElement to check containment against.
25
+ * @param targets - An array of target Elements to correct.
26
+ * @returns An array of corrected Elements that are contained within the parent.
27
+ */
28
+ function correctElements(parent, targets) {
29
+ return targets
30
+ .map((target) => {
31
+ if (parent.contains(target)) {
32
+ return target;
33
+ }
34
+ const correctedTarget = unwrapHost(target);
35
+ if (parent.contains(correctedTarget)) {
36
+ return correctedTarget;
37
+ }
38
+ return null;
39
+ })
40
+ .filter((x) => x !== null);
41
+ }
42
+ /**
43
+ * Applies the aria-hidden attribute to all elements in the body except the specified avoid elements.
44
+ */
45
+ function applyAttributeToOthers(uncorrectedAvoidElements, body) {
46
+ const avoidElements = correctElements(body, uncorrectedAvoidElements);
47
+ const elementsToAvoidWithParents = new Set();
48
+ const elementsToAvoidUpdating = new Set(avoidElements);
49
+ const hiddenElements = [];
50
+ avoidElements.forEach(addToAvoidList);
51
+ applyAttributes(body);
52
+ elementsToAvoidWithParents.clear();
53
+ function addToAvoidList(el) {
54
+ if (!el || elementsToAvoidWithParents.has(el)) {
55
+ return;
56
+ }
57
+ elementsToAvoidWithParents.add(el);
58
+ if (el.parentNode) {
59
+ addToAvoidList(el.parentNode);
60
+ }
61
+ }
62
+ function applyAttributes(parent) {
63
+ if (!parent || elementsToAvoidUpdating.has(parent)) {
64
+ return;
65
+ }
66
+ const parentChildren = parent.children;
67
+ for (let index = 0; index < parentChildren.length; index += 1) {
68
+ const node = parentChildren[index];
69
+ if (elementsToAvoidWithParents.has(node)) {
70
+ applyAttributes(node);
71
+ }
72
+ else {
73
+ const attr = node.getAttribute(controlAttribute);
74
+ /*
75
+ * We only check for falsy values here since since arbitrary values
76
+ * (e.g. "true", "foo", "") are all valid for indicating that the element is already hidden.
77
+ */
78
+ const alreadyHidden = attr !== null && attr !== "false";
79
+ const counterValue = (ariaHiddenCounter.get(node) || 0) + 1;
80
+ const markerValue = (markerCounter.get(node) || 0) + 1;
81
+ ariaHiddenCounter.set(node, counterValue);
82
+ markerCounter.set(node, markerValue);
83
+ hiddenElements.push(node);
84
+ if (counterValue === 1 && alreadyHidden) {
85
+ uncontrolledElementsSet.add(node);
86
+ }
87
+ if (markerValue === 1) {
88
+ node.setAttribute(markerName, "");
89
+ }
90
+ if (!alreadyHidden) {
91
+ node.setAttribute(controlAttribute, "true");
92
+ }
93
+ }
94
+ }
95
+ }
96
+ lockCount += 1;
97
+ /* Cleanup */
98
+ return () => {
99
+ for (const element of hiddenElements) {
100
+ const currentCounterValue = ariaHiddenCounter.get(element) || 0;
101
+ const counterValue = currentCounterValue - 1;
102
+ const markerValue = (markerCounter.get(element) || 0) - 1;
103
+ ariaHiddenCounter.set(element, counterValue);
104
+ markerCounter.set(element, markerValue);
105
+ if (!counterValue) {
106
+ if (!uncontrolledElementsSet.has(element)) {
107
+ element.removeAttribute(controlAttribute);
108
+ }
109
+ uncontrolledElementsSet.delete(element);
110
+ }
111
+ if (!markerValue) {
112
+ element.removeAttribute(markerName);
113
+ }
114
+ }
115
+ lockCount -= 1;
116
+ /* Reset */
117
+ if (!lockCount) {
118
+ ariaHiddenCounter = new WeakMap();
119
+ uncontrolledElementsSet = new WeakSet();
120
+ markerCounter = new WeakMap();
121
+ }
122
+ };
123
+ }
124
+ /**
125
+ * Hides all elements in the document body for assertive technologies except the specified elements with `aria-hidden`.
126
+ * @param avoidElements - An array of elements to avoid hiding.
127
+ * @returns A function that, when called, will undo the hiding of elements.
128
+ */
129
+ function hideNonTargetElements(avoidElements) {
130
+ const body = ownerDocument(avoidElements[0]).body;
131
+ /**
132
+ * Assume that elements with `aria-live` or `script` tags should not be hidden.
133
+ * This ensures that live regions and scripts continue to function properly.
134
+ */
135
+ const ingoredElements = Array.from(body.querySelectorAll("[aria-live], script"));
136
+ return applyAttributeToOthers(avoidElements.concat(ingoredElements), body);
137
+ }
138
+ export { hideNonTargetElements };
139
+ //# sourceMappingURL=hideNonTargetElements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hideNonTargetElements.js","sourceRoot":"","sources":["../../src/util/hideNonTargetElements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Locks the scroll of the document when enabled.
3
+ * @param enabled - Whether to enable the scroll lock.
4
+ */
5
+ declare function useScrollLock(params: {
6
+ enabled: boolean;
7
+ mounted: boolean;
8
+ open: boolean;
9
+ referenceElement?: Element | null;
10
+ }): void;
11
+ export { useScrollLock };
@@ -0,0 +1,268 @@
1
+ import { isIOS, isWebKit } from "../detectBrowser.js";
2
+ import { ownerDocument, ownerWindow } from "../owner.js";
3
+ import { useClientLayoutEffect } from "./useClientLayoutEffect.js";
4
+ import { Timeout } from "./useTimeout.js";
5
+ let originalHtmlStyles = {};
6
+ let originalBodyStyles = {};
7
+ let originalHtmlScrollBehavior = "";
8
+ function hasInsetScrollbars(referenceElement) {
9
+ if (typeof document === "undefined") {
10
+ return false;
11
+ }
12
+ const doc = ownerDocument(referenceElement);
13
+ const win = ownerWindow(doc);
14
+ return win.innerWidth - doc.documentElement.clientWidth > 0;
15
+ }
16
+ function preventScrollBasic(referenceElement) {
17
+ const doc = ownerDocument(referenceElement);
18
+ const html = doc.documentElement;
19
+ const originalOverflow = html.style.overflow;
20
+ html.style.overflow = "hidden";
21
+ return () => {
22
+ html.style.overflow = originalOverflow;
23
+ };
24
+ }
25
+ function preventScrollStandard(referenceElement) {
26
+ var _a, _b;
27
+ const doc = ownerDocument(referenceElement);
28
+ const html = doc.documentElement;
29
+ const body = doc.body;
30
+ const win = ownerWindow(html);
31
+ let scrollTop = 0;
32
+ let scrollLeft = 0;
33
+ let resizeRaf = 0;
34
+ /* Pinch-zoom in Safari causes a shift. Just don't lock scroll if there's any pinch-zoom. */
35
+ if (isWebKit && ((_b = (_a = win.visualViewport) === null || _a === void 0 ? void 0 : _a.scale) !== null && _b !== void 0 ? _b : 1) !== 1) {
36
+ return () => { };
37
+ }
38
+ /**
39
+ * Locks the scroll by applying styles to Html and Body element.
40
+ * Reads the DOM first, then writes to avoid layout thrashing.
41
+ */
42
+ function lockScroll() {
43
+ /* DOM reads: */
44
+ var _a;
45
+ const htmlStyles = win.getComputedStyle(html);
46
+ const bodyStyles = win.getComputedStyle(body);
47
+ scrollTop = html.scrollTop;
48
+ scrollLeft = html.scrollLeft;
49
+ originalHtmlStyles = {
50
+ scrollbarGutter: html.style.scrollbarGutter,
51
+ overflowY: html.style.overflowY,
52
+ overflowX: html.style.overflowX,
53
+ };
54
+ originalHtmlScrollBehavior = html.style.scrollBehavior;
55
+ originalBodyStyles = {
56
+ position: body.style.position,
57
+ height: body.style.height,
58
+ width: body.style.width,
59
+ boxSizing: body.style.boxSizing,
60
+ overflowY: body.style.overflowY,
61
+ overflowX: body.style.overflowX,
62
+ scrollBehavior: body.style.scrollBehavior,
63
+ };
64
+ const isScrollableY = html.scrollHeight > html.clientHeight;
65
+ const isScrollableX = html.scrollWidth > html.clientWidth;
66
+ const hasConstantOverflowY = htmlStyles.overflowY === "scroll" || bodyStyles.overflowY === "scroll";
67
+ const hasConstantOverflowX = htmlStyles.overflowX === "scroll" || bodyStyles.overflowX === "scroll";
68
+ /* Values can be negative in Firefox */
69
+ const scrollbarWidth = Math.max(0, win.innerWidth - html.clientWidth);
70
+ const scrollbarHeight = Math.max(0, win.innerHeight - html.clientHeight);
71
+ /*
72
+ * Avoid shift due to <body> margin. NB: This does cause elements to be clipped
73
+ * with whitespace.
74
+ */
75
+ const marginY = parseFloat(bodyStyles.marginTop) + parseFloat(bodyStyles.marginBottom);
76
+ const marginX = parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight);
77
+ /**
78
+ * Check support for stable scrollbar gutter to avoid layout shift when scrollbars appear/disappear.
79
+ */
80
+ const supportsStableScrollbarGutter = typeof CSS !== "undefined" &&
81
+ ((_a = CSS.supports) === null || _a === void 0 ? void 0 : _a.call(CSS, "scrollbar-gutter", "stable"));
82
+ /*
83
+ * DOM writes:
84
+ * Do not read the DOM past this point!
85
+ */
86
+ Object.assign(html.style, {
87
+ scrollbarGutter: "stable",
88
+ overflowY: !supportsStableScrollbarGutter &&
89
+ (isScrollableY || hasConstantOverflowY)
90
+ ? "scroll"
91
+ : "hidden",
92
+ overflowX: !supportsStableScrollbarGutter &&
93
+ (isScrollableX || hasConstantOverflowX)
94
+ ? "scroll"
95
+ : "hidden",
96
+ });
97
+ Object.assign(body.style, {
98
+ /*
99
+ * Keeps existing positioned children in place (e.g. fixed headers).
100
+ */
101
+ position: "relative",
102
+ /**
103
+ * Limits height to the viewport minus margins/scrollbar compensation to stop vertical overflow from reappearing.
104
+ */
105
+ height: marginY || scrollbarHeight
106
+ ? `calc(100dvh - ${marginY + scrollbarHeight}px)`
107
+ : "100dvh",
108
+ /**
109
+ * Mirrors height-logic for width.
110
+ */
111
+ width: marginX || scrollbarWidth
112
+ ? `calc(100vw - ${marginX + scrollbarWidth}px)`
113
+ : "100vw",
114
+ /**
115
+ * Ensures the adjusted dimensions include padding/border, matching the measured values.
116
+ */
117
+ boxSizing: "border-box",
118
+ /**
119
+ * Blocks scrollable overflow.
120
+ */
121
+ overflow: "hidden",
122
+ /**
123
+ * Removes smooth-scrolling so immediate position restores occur without animation.
124
+ */
125
+ scrollBehavior: "unset",
126
+ });
127
+ body.scrollTop = scrollTop;
128
+ body.scrollLeft = scrollLeft;
129
+ html.setAttribute("data-aksel-scroll-locked", "");
130
+ html.style.scrollBehavior = "unset";
131
+ }
132
+ /**
133
+ * Restores the original scroll position and styles to Html and Body element.
134
+ */
135
+ function cleanup() {
136
+ Object.assign(html.style, originalHtmlStyles);
137
+ Object.assign(body.style, originalBodyStyles);
138
+ html.scrollTop = scrollTop;
139
+ html.scrollLeft = scrollLeft;
140
+ html.removeAttribute("data-aksel-scroll-locked");
141
+ html.style.scrollBehavior = originalHtmlScrollBehavior;
142
+ }
143
+ /**
144
+ * On resize, restore original styles, then re-apply scroll lock next frame.
145
+ */
146
+ function handleResize() {
147
+ cleanup();
148
+ if (resizeRaf) {
149
+ cancelAnimationFrame(resizeRaf);
150
+ }
151
+ /**
152
+ * Wait until next frame to re-apply scroll lock ensuring layout has settled after resize.
153
+ */
154
+ resizeRaf = requestAnimationFrame(lockScroll);
155
+ }
156
+ lockScroll();
157
+ win.addEventListener("resize", handleResize);
158
+ return () => {
159
+ if (resizeRaf) {
160
+ cancelAnimationFrame(resizeRaf);
161
+ }
162
+ cleanup();
163
+ win.removeEventListener("resize", handleResize);
164
+ };
165
+ }
166
+ class ScrollLocker {
167
+ constructor() {
168
+ this.lockCount = 0;
169
+ this.restore = null;
170
+ this.timeoutLock = Timeout.create();
171
+ this.timeoutUnlock = Timeout.create();
172
+ /**
173
+ * Releases a lock
174
+ * - If last lock, unlock document-scroll.
175
+ * - If not last lock, do nothing.
176
+ */
177
+ this.release = () => {
178
+ this.lockCount -= 1;
179
+ if (this.lockCount === 0 && this.restore) {
180
+ this.timeoutUnlock.start(0, this.unlock);
181
+ }
182
+ };
183
+ this.unlock = () => {
184
+ var _a;
185
+ if (this.lockCount === 0 && this.restore) {
186
+ (_a = this.restore) === null || _a === void 0 ? void 0 : _a.call(this);
187
+ this.restore = null;
188
+ }
189
+ };
190
+ }
191
+ /**
192
+ * Aquires a new lock
193
+ * - If first lock, lock document-scroll.
194
+ * - If not first lock, do nothing.
195
+ */
196
+ acquire(referenceElement) {
197
+ this.lockCount += 1;
198
+ if (this.lockCount === 1 && this.restore === null) {
199
+ /*
200
+ * Delay locking to avoid layout thrashing when multiple locks/unlocks are requested in quick succession.
201
+ */
202
+ this.timeoutLock.start(0, () => this.lock(referenceElement));
203
+ }
204
+ return this.release;
205
+ }
206
+ lock(referenceElement) {
207
+ if (this.lockCount === 0 || this.restore !== null) {
208
+ return;
209
+ }
210
+ const doc = ownerDocument(referenceElement);
211
+ const html = doc.documentElement;
212
+ const htmlOverflowY = ownerWindow(html).getComputedStyle(html).overflowY;
213
+ /* If the site author already hid overflow on <html>, respect it and bail out. */
214
+ if (htmlOverflowY === "hidden" || htmlOverflowY === "clip") {
215
+ this.restore = () => { };
216
+ return;
217
+ }
218
+ const shouldUseBasicLock = isIOS || !hasInsetScrollbars(referenceElement);
219
+ /**
220
+ * On iOS, the standard scroll locking method does not work properly if the navbar is collapsed.
221
+ * The following must be researched extensively before activating standard scroll locking on iOS:
222
+ * - Textboxes must scroll into view when focused, and not cause a glitchy scroll animation.
223
+ * - The navbar must not force itself into view and cause layout shift.
224
+ * - Scroll containers must not flicker upon closing a popup when it has an exit animation.
225
+ */
226
+ this.restore = shouldUseBasicLock
227
+ ? preventScrollBasic(referenceElement)
228
+ : preventScrollStandard(referenceElement);
229
+ }
230
+ }
231
+ const SCROLL_LOCKER = new ScrollLocker();
232
+ /**
233
+ * Locks the scroll of the document when enabled.
234
+ * @param enabled - Whether to enable the scroll lock.
235
+ */
236
+ function useScrollLock(params) {
237
+ const { enabled = true, mounted, open, referenceElement = null } = params;
238
+ /**
239
+ * When closing elements with "sloppy clicks" (clicks that start inside the element and ends outside),
240
+ * animating out on WebKit browsers (mounted + not open) can cause the whole page to be selected.
241
+ * To prevent this, we temporarily disable user-select on body while the element is animating out.
242
+ * This bug might be fixed in newer WebKit versions.
243
+ *
244
+ * @see https://github.com/mui/base-ui/issues/1135
245
+ */
246
+ useClientLayoutEffect(() => {
247
+ if (enabled && isWebKit && mounted && !open) {
248
+ const doc = ownerDocument(referenceElement);
249
+ const originalUserSelect = doc.body.style.userSelect;
250
+ const originalWebkitUserSelect = doc.body.style.webkitUserSelect;
251
+ doc.body.style.userSelect = "none";
252
+ doc.body.style.webkitUserSelect = "none";
253
+ return () => {
254
+ doc.body.style.userSelect = originalUserSelect;
255
+ doc.body.style.webkitUserSelect = originalWebkitUserSelect;
256
+ };
257
+ }
258
+ return undefined;
259
+ }, [enabled, mounted, open, referenceElement]);
260
+ useClientLayoutEffect(() => {
261
+ if (!enabled) {
262
+ return undefined;
263
+ }
264
+ return SCROLL_LOCKER.acquire(referenceElement);
265
+ }, [enabled, referenceElement]);
266
+ }
267
+ export { useScrollLock };
268
+ //# sourceMappingURL=useScrollLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollLock.js","sourceRoot":"","sources":["../../../src/util/hooks/useScrollLock.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "7.32.3",
3
+ "version": "7.32.5",
4
4
  "description": "React components from the Norwegian Labour and Welfare Administration.",
5
5
  "author": "Aksel, a team part of the Norwegian Labour and Welfare Administration.",
6
6
  "license": "MIT",
@@ -643,15 +643,15 @@
643
643
  "clean": "rimraf cjs esm",
644
644
  "build": "yarn i18n-jsdoc && concurrently \"tsc -p tsconfig.build.json\" \"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json && yarn write-packagejson\" && yarn i18n-jsdoc --cleanup && yarn copy-types",
645
645
  "watch": "tsc --watch -p tsconfig.esm.json",
646
- "test": "TZ=UTC vitest run -c tests/vitest.config.ts --silent",
646
+ "test": "TZ=UTC vitest run -c tests/vitest.config.ts",
647
647
  "test:watch": "TZ=UTC vitest watch -c tests/vitest.config.ts",
648
648
  "copy-types": "copyfiles -f ./src/types/theme.d.ts ./esm/types"
649
649
  },
650
650
  "dependencies": {
651
651
  "@floating-ui/react": "0.27.8",
652
652
  "@floating-ui/react-dom": "^2.1.6",
653
- "@navikt/aksel-icons": "^7.32.3",
654
- "@navikt/ds-tokens": "^7.32.3",
653
+ "@navikt/aksel-icons": "^7.32.5",
654
+ "@navikt/ds-tokens": "^7.32.5",
655
655
  "clsx": "^2.1.0",
656
656
  "date-fns": "^4.0.0",
657
657
  "react-day-picker": "9.7.0"
@@ -667,7 +667,7 @@
667
667
  "copyfiles": "^2.4.1",
668
668
  "fast-glob": "3.2.11",
669
669
  "jscodeshift": "^0.15.1",
670
- "jsdom": "26.1.0",
670
+ "jsdom": "27.0.1",
671
671
  "react-dom": "^18.0.0",
672
672
  "react-router": "^7.6.2",
673
673
  "rimraf": "6.0.1",
@@ -33,7 +33,7 @@ const AccordionHeader = forwardRef<HTMLButtonElement, AccordionHeaderProps>(
33
33
 
34
34
  if (themeContext?.isDarkside) {
35
35
  /* Fallback to "medium" Accordion-size if any other sizes are used */
36
- headingSize = accordionContext?.size === "small" ? "xsmall" : "small";
36
+ headingSize = accordionContext?.size === "large" ? "small" : "xsmall";
37
37
  }
38
38
 
39
39
  return (
@@ -12,7 +12,8 @@ export const ToggleListButton = forwardRef<HTMLDivElement>((_, ref) => {
12
12
  return (
13
13
  <div
14
14
  ref={ref}
15
- onClick={() => {
15
+ onClick={(event) => {
16
+ event.stopPropagation();
16
17
  toggleIsListOpen();
17
18
  focusInput();
18
19
  }}