@navikt/ds-react 7.32.3 → 7.32.4

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.
@@ -65,7 +65,7 @@ const AccordionHeader = (0, react_1.forwardRef)((_a, ref) => {
65
65
  let headingSize = (_b = accordionContext === null || accordionContext === void 0 ? void 0 : accordionContext.headingSize) !== null && _b !== void 0 ? _b : "small";
66
66
  if (themeContext === null || themeContext === void 0 ? void 0 : themeContext.isDarkside) {
67
67
  /* Fallback to "medium" Accordion-size if any other sizes are used */
68
- headingSize = (accordionContext === null || accordionContext === void 0 ? void 0 : accordionContext.size) === "small" ? "xsmall" : "small";
68
+ headingSize = (accordionContext === null || accordionContext === void 0 ? void 0 : accordionContext.size) === "large" ? "small" : "xsmall";
69
69
  }
70
70
  return (react_1.default.createElement("button", Object.assign({ ref: ref }, rest, { className: cn("navds-accordion__header", className), onClick: (0, composeEventHandlers_1.composeEventHandlers)(onClick, itemContext.toggleOpen), "aria-expanded": itemContext.open, type: "button" }),
71
71
  react_1.default.createElement("span", { className: cn("navds-accordion__icon-wrapper") },
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionHeader.js","sourceRoot":"","sources":["../../src/accordion/AccordionHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAsD;AACtD,qDAAsD;AACtD,0CAAgE;AAChE,8CAAwC;AACxC,uEAAoE;AACpE,yDAAsD;AACtD,mDAAuD;AAUvD,MAAM,eAAe,GAAG,IAAA,kBAAU,EAChC,CAAC,EAAyC,EAAE,GAAG,EAAE,EAAE;;QAAlD,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,OAAW,EAAN,IAAI,cAAvC,oCAAyC,CAAF;IACtC,MAAM,WAAW,GAAG,IAAA,kBAAU,EAAC,oCAAoB,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,IAAA,kBAAU,EAAC,mCAAgB,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,oBAAY,GAAE,CAAC;IAE9B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,2GAA2G,CAC5G,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,mCAAI,OAAO,CAAC;IAE3D,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAE,CAAC;QAC7B,qEAAqE;QACrE,WAAW,GAAG,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,MAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACxE,CAAC;IAED,OAAO,CACL,wDACE,GAAG,EAAE,GAAG,IACJ,IAAI,IACR,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,EACnD,OAAO,EAAE,IAAA,2CAAoB,EAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,mBAC/C,WAAW,CAAC,IAAI,EAC/B,IAAI,EAAC,QAAQ;QAEb,wCAAM,SAAS,EAAE,EAAE,CAAC,+BAA+B,CAAC;YAClD,8BAAC,6BAAe,IACd,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,wBAEhD,CACG;QACP,8BAAC,oBAAO,IACN,IAAI,EAAE,WAAW,EACjB,EAAE,EAAC,MAAM,EACT,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAE/C,QAAQ,CACD,CACH,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,kBAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"AccordionHeader.js","sourceRoot":"","sources":["../../src/accordion/AccordionHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAsD;AACtD,qDAAsD;AACtD,0CAAgE;AAChE,8CAAwC;AACxC,uEAAoE;AACpE,yDAAsD;AACtD,mDAAuD;AAUvD,MAAM,eAAe,GAAG,IAAA,kBAAU,EAChC,CAAC,EAAyC,EAAE,GAAG,EAAE,EAAE;;QAAlD,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,OAAW,EAAN,IAAI,cAAvC,oCAAyC,CAAF;IACtC,MAAM,WAAW,GAAG,IAAA,kBAAU,EAAC,oCAAoB,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,IAAA,kBAAU,EAAC,mCAAgB,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,oBAAY,GAAE,CAAC;IAE9B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,2GAA2G,CAC5G,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,mCAAI,OAAO,CAAC;IAE3D,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAE,CAAC;QAC7B,qEAAqE;QACrE,WAAW,GAAG,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,MAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxE,CAAC;IAED,OAAO,CACL,wDACE,GAAG,EAAE,GAAG,IACJ,IAAI,IACR,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,EACnD,OAAO,EAAE,IAAA,2CAAoB,EAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,mBAC/C,WAAW,CAAC,IAAI,EAC/B,IAAI,EAAC,QAAQ;QAEb,wCAAM,SAAS,EAAE,EAAE,CAAC,+BAA+B,CAAC;YAClD,8BAAC,6BAAe,IACd,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,wBAEhD,CACG;QACP,8BAAC,oBAAO,IACN,IAAI,EAAE,WAAW,EACjB,EAAE,EAAC,MAAM,EACT,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAE/C,QAAQ,CACD,CACH,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,kBAAe,eAAe,CAAC"}
@@ -43,7 +43,8 @@ exports.ToggleListButton = (0, react_1.forwardRef)((_, ref) => {
43
43
  const { cn } = (0, Theme_1.useRenameCSS)();
44
44
  const { isListOpen, toggleIsListOpen } = (0, filteredOptionsContext_1.useFilteredOptionsContext)();
45
45
  const { focusInput } = (0, Input_context_1.useInputContext)();
46
- return (react_1.default.createElement("div", { ref: ref, onClick: () => {
46
+ return (react_1.default.createElement("div", { ref: ref, onClick: (event) => {
47
+ event.stopPropagation();
47
48
  toggleIsListOpen();
48
49
  focusInput();
49
50
  }, className: cn("navds-combobox__button-toggle-list"), "aria-hidden": true }, isListOpen ? react_1.default.createElement(aksel_icons_1.ChevronUpIcon, null) : react_1.default.createElement(aksel_icons_1.ChevronDownIcon, null)));
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleListButton.js","sourceRoot":"","sources":["../../../../src/form/combobox/Input/ToggleListButton.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA0C;AAC1C,qDAAqE;AACrE,gDAAoD;AACpD,sFAAsF;AACtF,mDAAkD;AAErC,QAAA,gBAAgB,GAAG,IAAA,kBAAU,EAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,oBAAY,GAAE,CAAC;IAC9B,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,IAAA,kDAAyB,GAAE,CAAC;IACrE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,+BAAe,GAAE,CAAC;IAEzC,OAAO,CACL,uCACE,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,GAAG,EAAE;YACZ,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;QACf,CAAC,EACD,SAAS,EAAE,EAAE,CAAC,oCAAoC,CAAC,yBAGlD,UAAU,CAAC,CAAC,CAAC,8BAAC,2BAAa,OAAG,CAAC,CAAC,CAAC,8BAAC,6BAAe,OAAG,CACjD,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,kBAAe,wBAAgB,CAAC"}
1
+ {"version":3,"file":"ToggleListButton.js","sourceRoot":"","sources":["../../../../src/form/combobox/Input/ToggleListButton.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA0C;AAC1C,qDAAqE;AACrE,gDAAoD;AACpD,sFAAsF;AACtF,mDAAkD;AAErC,QAAA,gBAAgB,GAAG,IAAA,kBAAU,EAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,oBAAY,GAAE,CAAC;IAC9B,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,IAAA,kDAAyB,GAAE,CAAC;IACrE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,+BAAe,GAAE,CAAC;IAEzC,OAAO,CACL,uCACE,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;QACf,CAAC,EACD,SAAS,EAAE,EAAE,CAAC,oCAAoC,CAAC,yBAGlD,UAAU,CAAC,CAAC,CAAC,8BAAC,2BAAa,OAAG,CAAC,CAAC,CAAC,8BAAC,6BAAe,OAAG,CACjD,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,kBAAe,wBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ type UndoFn = () => void;
2
+ /**
3
+ * Hides all elements in the document body for assertive technologies except the specified elements with `aria-hidden`.
4
+ * @param avoidElements - An array of elements to avoid hiding.
5
+ * @returns A function that, when called, will undo the hiding of elements.
6
+ */
7
+ declare function hideNonTargetElements(avoidElements: Element[]): UndoFn;
8
+ export { hideNonTargetElements };
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hideNonTargetElements = hideNonTargetElements;
4
+ /**
5
+ * Modified version of `aria-hidden`-package.
6
+ * - Removed "inert"-functionality.
7
+ * - Removed flexibility for different data-attributes.
8
+ * https://github.com/theKashey/aria-hidden/blob/720e8a8e1cfa047bd299a929d95d47ac860a5c1a/src/index.ts
9
+ */
10
+ const owner_1 = require("./owner");
11
+ let ariaHiddenCounter = new WeakMap();
12
+ let markerCounter = new WeakMap();
13
+ let uncontrolledElementsSet = new WeakSet();
14
+ let lockCount = 0;
15
+ const controlAttribute = "aria-hidden";
16
+ const markerName = "data-aksel-hidden";
17
+ /**
18
+ * Unwraps a Shadow DOM host to find the actual Element in the light DOM.
19
+ */
20
+ function unwrapHost(node) {
21
+ return (node &&
22
+ (node.host || unwrapHost(node.parentNode)));
23
+ }
24
+ /**
25
+ * Corrects the target elements by unwrapping Shadow DOM hosts if necessary.
26
+ *
27
+ * @param parent - The parent HTMLElement to check containment against.
28
+ * @param targets - An array of target Elements to correct.
29
+ * @returns An array of corrected Elements that are contained within the parent.
30
+ */
31
+ function correctElements(parent, targets) {
32
+ return targets
33
+ .map((target) => {
34
+ if (parent.contains(target)) {
35
+ return target;
36
+ }
37
+ const correctedTarget = unwrapHost(target);
38
+ if (parent.contains(correctedTarget)) {
39
+ return correctedTarget;
40
+ }
41
+ return null;
42
+ })
43
+ .filter((x) => x !== null);
44
+ }
45
+ /**
46
+ * Applies the aria-hidden attribute to all elements in the body except the specified avoid elements.
47
+ */
48
+ function applyAttributeToOthers(uncorrectedAvoidElements, body) {
49
+ const avoidElements = correctElements(body, uncorrectedAvoidElements);
50
+ const elementsToAvoidWithParents = new Set();
51
+ const elementsToAvoidUpdating = new Set(avoidElements);
52
+ const hiddenElements = [];
53
+ avoidElements.forEach(addToAvoidList);
54
+ applyAttributes(body);
55
+ elementsToAvoidWithParents.clear();
56
+ function addToAvoidList(el) {
57
+ if (!el || elementsToAvoidWithParents.has(el)) {
58
+ return;
59
+ }
60
+ elementsToAvoidWithParents.add(el);
61
+ if (el.parentNode) {
62
+ addToAvoidList(el.parentNode);
63
+ }
64
+ }
65
+ function applyAttributes(parent) {
66
+ if (!parent || elementsToAvoidUpdating.has(parent)) {
67
+ return;
68
+ }
69
+ const parentChildren = parent.children;
70
+ for (let index = 0; index < parentChildren.length; index += 1) {
71
+ const node = parentChildren[index];
72
+ if (elementsToAvoidWithParents.has(node)) {
73
+ applyAttributes(node);
74
+ }
75
+ else {
76
+ const attr = node.getAttribute(controlAttribute);
77
+ /*
78
+ * We only check for falsy values here since since arbitrary values
79
+ * (e.g. "true", "foo", "") are all valid for indicating that the element is already hidden.
80
+ */
81
+ const alreadyHidden = attr !== null && attr !== "false";
82
+ const counterValue = (ariaHiddenCounter.get(node) || 0) + 1;
83
+ const markerValue = (markerCounter.get(node) || 0) + 1;
84
+ ariaHiddenCounter.set(node, counterValue);
85
+ markerCounter.set(node, markerValue);
86
+ hiddenElements.push(node);
87
+ if (counterValue === 1 && alreadyHidden) {
88
+ uncontrolledElementsSet.add(node);
89
+ }
90
+ if (markerValue === 1) {
91
+ node.setAttribute(markerName, "");
92
+ }
93
+ if (!alreadyHidden) {
94
+ node.setAttribute(controlAttribute, "true");
95
+ }
96
+ }
97
+ }
98
+ }
99
+ lockCount += 1;
100
+ /* Cleanup */
101
+ return () => {
102
+ for (const element of hiddenElements) {
103
+ const currentCounterValue = ariaHiddenCounter.get(element) || 0;
104
+ const counterValue = currentCounterValue - 1;
105
+ const markerValue = (markerCounter.get(element) || 0) - 1;
106
+ ariaHiddenCounter.set(element, counterValue);
107
+ markerCounter.set(element, markerValue);
108
+ if (!counterValue) {
109
+ if (!uncontrolledElementsSet.has(element)) {
110
+ element.removeAttribute(controlAttribute);
111
+ }
112
+ uncontrolledElementsSet.delete(element);
113
+ }
114
+ if (!markerValue) {
115
+ element.removeAttribute(markerName);
116
+ }
117
+ }
118
+ lockCount -= 1;
119
+ /* Reset */
120
+ if (!lockCount) {
121
+ ariaHiddenCounter = new WeakMap();
122
+ uncontrolledElementsSet = new WeakSet();
123
+ markerCounter = new WeakMap();
124
+ }
125
+ };
126
+ }
127
+ /**
128
+ * Hides all elements in the document body for assertive technologies except the specified elements with `aria-hidden`.
129
+ * @param avoidElements - An array of elements to avoid hiding.
130
+ * @returns A function that, when called, will undo the hiding of elements.
131
+ */
132
+ function hideNonTargetElements(avoidElements) {
133
+ const body = (0, owner_1.ownerDocument)(avoidElements[0]).body;
134
+ /**
135
+ * Assume that elements with `aria-live` or `script` tags should not be hidden.
136
+ * This ensures that live regions and scripts continue to function properly.
137
+ */
138
+ const ingoredElements = Array.from(body.querySelectorAll("[aria-live], script"));
139
+ return applyAttributeToOthers(avoidElements.concat(ingoredElements), body);
140
+ }
141
+ //# 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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"}
@@ -30,7 +30,7 @@ const AccordionHeader = forwardRef((_a, ref) => {
30
30
  let headingSize = (_b = accordionContext === null || accordionContext === void 0 ? void 0 : accordionContext.headingSize) !== null && _b !== void 0 ? _b : "small";
31
31
  if (themeContext === null || themeContext === void 0 ? void 0 : themeContext.isDarkside) {
32
32
  /* Fallback to "medium" Accordion-size if any other sizes are used */
33
- headingSize = (accordionContext === null || accordionContext === void 0 ? void 0 : accordionContext.size) === "small" ? "xsmall" : "small";
33
+ headingSize = (accordionContext === null || accordionContext === void 0 ? void 0 : accordionContext.size) === "large" ? "small" : "xsmall";
34
34
  }
35
35
  return (React.createElement("button", Object.assign({ ref: ref }, rest, { className: cn("navds-accordion__header", className), onClick: composeEventHandlers(onClick, itemContext.toggleOpen), "aria-expanded": itemContext.open, type: "button" }),
36
36
  React.createElement("span", { className: cn("navds-accordion__icon-wrapper") },
@@ -1 +1 @@
1
- {"version":3,"file":"AccordionHeader.js","sourceRoot":"","sources":["../../src/accordion/AccordionHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAUvD,MAAM,eAAe,GAAG,UAAU,CAChC,CAAC,EAAyC,EAAE,GAAG,EAAE,EAAE;;QAAlD,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,OAAW,EAAN,IAAI,cAAvC,oCAAyC,CAAF;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,2GAA2G,CAC5G,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,mCAAI,OAAO,CAAC;IAE3D,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAE,CAAC;QAC7B,qEAAqE;QACrE,WAAW,GAAG,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,MAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACxE,CAAC;IAED,OAAO,CACL,8CACE,GAAG,EAAE,GAAG,IACJ,IAAI,IACR,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,EACnD,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,mBAC/C,WAAW,CAAC,IAAI,EAC/B,IAAI,EAAC,QAAQ;QAEb,8BAAM,SAAS,EAAE,EAAE,CAAC,+BAA+B,CAAC;YAClD,oBAAC,eAAe,IACd,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,wBAEhD,CACG;QACP,oBAAC,OAAO,IACN,IAAI,EAAE,WAAW,EACjB,EAAE,EAAC,MAAM,EACT,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAE/C,QAAQ,CACD,CACH,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"AccordionHeader.js","sourceRoot":"","sources":["../../src/accordion/AccordionHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAUvD,MAAM,eAAe,GAAG,UAAU,CAChC,CAAC,EAAyC,EAAE,GAAG,EAAE,EAAE;;QAAlD,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,OAAW,EAAN,IAAI,cAAvC,oCAAyC,CAAF;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC;IAE9B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CACX,2GAA2G,CAC5G,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,mCAAI,OAAO,CAAC;IAE3D,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAE,CAAC;QAC7B,qEAAqE;QACrE,WAAW,GAAG,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,MAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxE,CAAC;IAED,OAAO,CACL,8CACE,GAAG,EAAE,GAAG,IACJ,IAAI,IACR,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,EACnD,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,mBAC/C,WAAW,CAAC,IAAI,EAC/B,IAAI,EAAC,QAAQ;QAEb,8BAAM,SAAS,EAAE,EAAE,CAAC,+BAA+B,CAAC;YAClD,oBAAC,eAAe,IACd,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,wBAEhD,CACG;QACP,oBAAC,OAAO,IACN,IAAI,EAAE,WAAW,EACjB,EAAE,EAAC,MAAM,EACT,SAAS,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAE/C,QAAQ,CACD,CACH,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -7,7 +7,8 @@ export const ToggleListButton = forwardRef((_, ref) => {
7
7
  const { cn } = useRenameCSS();
8
8
  const { isListOpen, toggleIsListOpen } = useFilteredOptionsContext();
9
9
  const { focusInput } = useInputContext();
10
- return (React.createElement("div", { ref: ref, onClick: () => {
10
+ return (React.createElement("div", { ref: ref, onClick: (event) => {
11
+ event.stopPropagation();
11
12
  toggleIsListOpen();
12
13
  focusInput();
13
14
  }, className: cn("navds-combobox__button-toggle-list"), "aria-hidden": true }, isListOpen ? React.createElement(ChevronUpIcon, null) : React.createElement(ChevronDownIcon, null)));
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleListButton.js","sourceRoot":"","sources":["../../../../src/form/combobox/Input/ToggleListButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,yBAAyB,EAAE,CAAC;IACrE,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC;IAEzC,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,GAAG,EAAE;YACZ,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;QACf,CAAC,EACD,SAAS,EAAE,EAAE,CAAC,oCAAoC,CAAC,yBAGlD,UAAU,CAAC,CAAC,CAAC,oBAAC,aAAa,OAAG,CAAC,CAAC,CAAC,oBAAC,eAAe,OAAG,CACjD,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ToggleListButton.js","sourceRoot":"","sources":["../../../../src/form/combobox/Input/ToggleListButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;IACpE,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,yBAAyB,EAAE,CAAC;IACrE,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC;IAEzC,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;QACf,CAAC,EACD,SAAS,EAAE,EAAE,CAAC,oCAAoC,CAAC,yBAGlD,UAAU,CAAC,CAAC,CAAC,oBAAC,aAAa,OAAG,CAAC,CAAC,CAAC,oBAAC,eAAe,OAAG,CACjD,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ type UndoFn = () => void;
2
+ /**
3
+ * Hides all elements in the document body for assertive technologies except the specified elements with `aria-hidden`.
4
+ * @param avoidElements - An array of elements to avoid hiding.
5
+ * @returns A function that, when called, will undo the hiding of elements.
6
+ */
7
+ declare function hideNonTargetElements(avoidElements: Element[]): UndoFn;
8
+ export { hideNonTargetElements };
@@ -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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"}
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.4",
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.4",
654
+ "@navikt/ds-tokens": "^7.32.4",
655
655
  "clsx": "^2.1.0",
656
656
  "date-fns": "^4.0.0",
657
657
  "react-day-picker": "9.7.0"
@@ -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
  }}
@@ -1,5 +1,4 @@
1
- /* eslint-disable testing-library/no-unnecessary-act -- https://kentcdodds.com/blog/fix-the-not-wrapped-in-act-warning */
2
- import { act, render, screen } from "@testing-library/react";
1
+ import { render, screen } from "@testing-library/react";
3
2
  import userEvent from "@testing-library/user-event";
4
3
  import React from "react";
5
4
  import { describe, expect, test, vi } from "vitest";
@@ -40,34 +39,20 @@ describe("Render combobox", () => {
40
39
  test("Should be able to search, select and remove selections", async () => {
41
40
  render(<App isMultiSelect options={options} />);
42
41
 
43
- await act(async () => {
44
- await userEvent.click(
45
- screen.getByRole("combobox", {
46
- name: "Hva er dine favorittfrukter?",
47
- }),
48
- );
49
- });
50
- await act(async () => {
51
- await userEvent.type(
52
- screen.getByRole("combobox", {
53
- name: "Hva er dine favorittfrukter?",
54
- }),
55
- "apple",
56
- );
57
- });
58
- await act(async () => {
59
- await userEvent.click(
60
- await screen.findByRole("option", { name: "apple" }),
61
- );
42
+ const input = screen.getByRole("combobox", {
43
+ name: "Hva er dine favorittfrukter?",
62
44
  });
45
+ await userEvent.click(input);
46
+ await userEvent.type(input, "apple");
47
+ await userEvent.click(
48
+ await screen.findByRole("option", { name: "apple" }),
49
+ );
63
50
  expect(
64
51
  await screen.findByRole("option", { name: "apple", selected: true }),
65
52
  ).toBeInTheDocument();
66
- await act(async () => {
67
- await userEvent.click(
68
- await screen.findByRole("button", { name: "apple slett" }),
69
- );
70
- });
53
+ await userEvent.click(
54
+ await screen.findByRole("button", { name: "apple slett" }),
55
+ );
71
56
  });
72
57
  });
73
58
 
@@ -81,24 +66,14 @@ describe("Render combobox", () => {
81
66
  test("Should not select previous focused element when closes", async () => {
82
67
  render(<App options={options} />);
83
68
 
84
- await act(async () => {
85
- await userEvent.click(
86
- screen.getByRole("combobox", {
87
- name: "Hva er dine favorittfrukter?",
88
- }),
89
- );
90
- });
91
- await act(async () => {
92
- await userEvent.type(
93
- screen.getByRole("combobox", {
94
- name: "Hva er dine favorittfrukter?",
95
- }),
96
- "ban",
97
- );
98
- await userEvent.keyboard("{ArrowDown}");
99
- await userEvent.keyboard("{ArrowUp}");
100
- await userEvent.keyboard("{Enter}");
69
+ const input = screen.getByRole("combobox", {
70
+ name: "Hva er dine favorittfrukter?",
101
71
  });
72
+ await userEvent.click(input);
73
+ await userEvent.type(input, "ban");
74
+ await userEvent.keyboard("{ArrowDown}");
75
+ await userEvent.keyboard("{ArrowUp}");
76
+ await userEvent.keyboard("{Enter}");
102
77
 
103
78
  expect(screen.queryByRole("button", { name: "banana slett" })).toBeNull();
104
79
  });
@@ -106,24 +81,14 @@ describe("Render combobox", () => {
106
81
  test("Should reset list when resetting input (ESC)", async () => {
107
82
  render(<App options={options} />);
108
83
 
109
- await act(async () => {
110
- await userEvent.click(
111
- screen.getByRole("combobox", {
112
- name: "Hva er dine favorittfrukter?",
113
- }),
114
- );
115
- });
116
- await act(async () => {
117
- await userEvent.type(
118
- screen.getByRole("combobox", {
119
- name: "Hva er dine favorittfrukter?",
120
- }),
121
- "apple",
122
- );
123
- await userEvent.keyboard("{ArrowDown}");
124
- await userEvent.keyboard("{Escape}");
125
- await userEvent.keyboard("{ArrowDown}");
84
+ const input = screen.getByRole("combobox", {
85
+ name: "Hva er dine favorittfrukter?",
126
86
  });
87
+ await userEvent.click(input);
88
+ await userEvent.type(input, "apple");
89
+ await userEvent.keyboard("{ArrowDown}");
90
+ await userEvent.keyboard("{Escape}");
91
+ await userEvent.keyboard("{ArrowDown}");
127
92
 
128
93
  expect(
129
94
  await screen.findByRole("option", { name: "banana" }),
@@ -145,13 +110,11 @@ describe("Render combobox", () => {
145
110
  );
146
111
 
147
112
  expect(screen.getByRole("combobox")).toBeInTheDocument();
148
- const bananaOption = screen.getByRole("option", {
113
+ const option = screen.getByRole("option", {
149
114
  name: "Hjelpemidler [HJE]",
150
115
  selected: false,
151
116
  });
152
- await act(async () => {
153
- await userEvent.click(bananaOption);
154
- });
117
+ await userEvent.click(option);
155
118
  expect(onToggleSelected).toHaveBeenCalledWith("HJE", true, false);
156
119
  expect(
157
120
  screen.getByRole("option", {
@@ -175,10 +138,8 @@ describe("Render combobox", () => {
175
138
  const combobox = screen.getByRole("combobox");
176
139
  expect(combobox).toBeInTheDocument();
177
140
 
178
- await act(async () => {
179
- await userEvent.click(combobox);
180
- await userEvent.type(combobox, "Lemon");
181
- });
141
+ await userEvent.click(combobox);
142
+ await userEvent.type(combobox, "Lemon");
182
143
  expect(onChange).toHaveBeenNthCalledWith(1, "L");
183
144
  expect(onChange).toHaveBeenNthCalledWith(2, "Le");
184
145
  expect(onChange).toHaveBeenNthCalledWith(3, "Lem");
@@ -205,13 +166,11 @@ describe("Render combobox", () => {
205
166
  const combobox = screen.getByRole("combobox");
206
167
  expect(combobox).toBeInTheDocument();
207
168
 
208
- await act(async () => {
209
- await userEvent.click(combobox);
210
- await userEvent.type(combobox, "Syke");
211
- await userEvent.keyboard("{ArrowRight}");
212
- await userEvent.keyboard("{ArrowDown}");
213
- await userEvent.keyboard("{Enter}");
214
- });
169
+ await userEvent.click(combobox);
170
+ await userEvent.type(combobox, "Syke");
171
+ await userEvent.keyboard("{ArrowRight}");
172
+ await userEvent.keyboard("{ArrowDown}");
173
+ await userEvent.keyboard("{Enter}");
215
174
  expect(onChange).toHaveBeenNthCalledWith(1, "S");
216
175
  expect(onChange).toHaveBeenNthCalledWith(2, "Sy");
217
176
  expect(onChange).toHaveBeenNthCalledWith(3, "Syk");
@@ -228,18 +187,14 @@ describe("Render combobox", () => {
228
187
  });
229
188
 
230
189
  describe("search", () => {
231
- test("should find matched anywhere in the label", async () => {
190
+ test("should find matches anywhere in the label", async () => {
232
191
  render(<App options={options} />);
233
192
 
234
193
  const combobox = screen.getByRole("combobox", {
235
194
  name: "Hva er dine favorittfrukter?",
236
195
  });
237
-
238
- await act(async () => {
239
- await userEvent.click(combobox);
240
-
241
- await userEvent.type(combobox, "p");
242
- });
196
+ await userEvent.click(combobox);
197
+ await userEvent.type(combobox, "p");
243
198
 
244
199
  const searchHits = [
245
200
  "apple",
@@ -273,18 +228,12 @@ describe("Render combobox", () => {
273
228
  const combobox = screen.getByRole("combobox", {
274
229
  name: "Hva er dine favorittfrukter?",
275
230
  });
276
-
277
- await act(async () => {
278
- await userEvent.click(combobox);
279
-
280
- await userEvent.type(combobox, "p");
281
- });
231
+ await userEvent.click(combobox);
232
+ await userEvent.type(combobox, "p");
282
233
 
283
234
  expect(combobox.getAttribute("value")).toBe("passion fruit");
284
235
 
285
- await act(async () => {
286
- await userEvent.keyboard("{Enter}");
287
- });
236
+ await userEvent.keyboard("{Enter}");
288
237
 
289
238
  expect(onToggleSelected).toHaveBeenCalledWith(
290
239
  "passion fruit",
@@ -310,20 +259,14 @@ describe("Render combobox", () => {
310
259
  const combobox = screen.getByRole("combobox", {
311
260
  name: "Hva er dine favorittfrukter?",
312
261
  });
313
-
314
- await act(async () => {
315
- await userEvent.click(combobox);
316
-
317
- await userEvent.type(combobox, "p");
318
- });
262
+ await userEvent.click(combobox);
263
+ await userEvent.type(combobox, "p");
319
264
 
320
265
  expect(combobox.getAttribute("value")).toBe(
321
266
  "passion fruit (passion fruit)",
322
267
  );
323
268
 
324
- await act(async () => {
325
- await userEvent.keyboard("{Enter}");
326
- });
269
+ await userEvent.keyboard("{Enter}");
327
270
 
328
271
  expect(onToggleSelected).toHaveBeenCalledWith(
329
272
  "passion fruit",
@@ -342,9 +285,7 @@ describe("Render combobox", () => {
342
285
  });
343
286
 
344
287
  const pressKey = async (key: string) => {
345
- await act(async () => {
346
- await userEvent.keyboard(`{${key}}`);
347
- });
288
+ await userEvent.keyboard(`{${key}}`);
348
289
  };
349
290
 
350
291
  const hasVirtualFocus = (option: string) =>
@@ -352,9 +293,7 @@ describe("Render combobox", () => {
352
293
  screen.getByRole("option", { name: option }).id,
353
294
  );
354
295
 
355
- await act(async () => {
356
- await userEvent.click(combobox);
357
- });
296
+ await userEvent.click(combobox);
358
297
 
359
298
  await pressKey("ArrowDown");
360
299
  hasVirtualFocus("apple");
@@ -0,0 +1,147 @@
1
+ import { beforeEach, describe, expect, test } from "vitest";
2
+ import { hideNonTargetElements } from "../hideNonTargetElements";
3
+
4
+ describe("hideNonTargetElements util", () => {
5
+ beforeEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+
9
+ test("marks non-avoided siblings with marker and cleans up on undo", () => {
10
+ document.body.innerHTML = `
11
+ <div id="root">
12
+ <div id="target"></div>
13
+ <div id="hidden-1"></div>
14
+ <div aria-live="polite" id="live-region"></div>
15
+ <script id="script-el"></script>
16
+ </div>
17
+ `;
18
+ const target = document.getElementById("target") as Element;
19
+ const hidden1 = document.getElementById("hidden-1") as Element;
20
+ const live = document.getElementById("live-region") as Element;
21
+ const script = document.getElementById("script-el") as Element;
22
+
23
+ const undo = hideNonTargetElements([target]);
24
+
25
+ expect(hidden1.hasAttribute("data-aksel-hidden")).toBe(true);
26
+ expect(live.hasAttribute("data-aksel-hidden")).toBe(false);
27
+ expect(script.hasAttribute("data-aksel-hidden")).toBe(false);
28
+ expect(target.hasAttribute("data-aksel-hidden")).toBe(false);
29
+
30
+ undo();
31
+
32
+ expect(hidden1.hasAttribute("data-aksel-hidden")).toBe(false);
33
+ expect(live.hasAttribute("data-aksel-hidden")).toBe(false);
34
+ expect(script.hasAttribute("data-aksel-hidden")).toBe(false);
35
+ expect(target.hasAttribute("data-aksel-hidden")).toBe(false);
36
+ });
37
+
38
+ test("nested: marks non-avoided siblings with marker and cleans up on undo", () => {
39
+ document.body.innerHTML = `
40
+ <div id="root">
41
+ <div id="inner">
42
+ <div id="target"></div>
43
+ <div id="hidden-1"></div>
44
+ </div>
45
+ <div id="hidden-2"></div>
46
+ </div>
47
+ `;
48
+ const target = document.getElementById("target") as Element;
49
+ const hidden1 = document.getElementById("hidden-1") as Element;
50
+ const hidden2 = document.getElementById("hidden-2") as Element;
51
+
52
+ const undo = hideNonTargetElements([target]);
53
+
54
+ expect(hidden1.hasAttribute("data-aksel-hidden")).toBe(true);
55
+ expect(hidden2.hasAttribute("data-aksel-hidden")).toBe(true);
56
+ expect(target.hasAttribute("data-aksel-hidden")).toBe(false);
57
+
58
+ undo();
59
+
60
+ expect(hidden1.hasAttribute("data-aksel-hidden")).toBe(false);
61
+ expect(hidden2.hasAttribute("data-aksel-hidden")).toBe(false);
62
+ expect(target.hasAttribute("data-aksel-hidden")).toBe(false);
63
+ });
64
+
65
+ test("applies aria-hidden when requested and restores previous state", () => {
66
+ document.body.innerHTML = `
67
+ <div id="root">
68
+ <div id="target"></div>
69
+ <div id="hidden-2"></div>
70
+ <div id="pre-hidden" aria-hidden="true"></div>
71
+ </div>
72
+ `;
73
+ const target = document.getElementById("target") as Element;
74
+ const hidden2 = document.getElementById("hidden-2") as Element;
75
+ const preHidden = document.getElementById("pre-hidden") as Element;
76
+
77
+ const undo = hideNonTargetElements([target]);
78
+
79
+ expect(hidden2.getAttribute("aria-hidden")).toBe("true");
80
+ expect(preHidden.getAttribute("aria-hidden")).toBe("true");
81
+ expect(hidden2.hasAttribute("data-aksel-hidden")).toBe(true);
82
+ expect(preHidden.hasAttribute("data-aksel-hidden")).toBe(true);
83
+
84
+ undo();
85
+
86
+ expect(hidden2.hasAttribute("aria-hidden")).toBe(false);
87
+ expect(preHidden.getAttribute("aria-hidden")).toBe("true");
88
+ expect(hidden2.hasAttribute("data-aksel-hidden")).toBe(false);
89
+ expect(preHidden.hasAttribute("data-aksel-hidden")).toBe(false);
90
+ });
91
+
92
+ test("treats shadow-hosted avoid elements as connected to host", () => {
93
+ document.body.innerHTML = `
94
+ <div id="root"></div>
95
+ `;
96
+ const root = document.getElementById("root") as HTMLElement;
97
+
98
+ const host = document.createElement("div");
99
+ host.id = "shadow-host";
100
+ const shadow = host.attachShadow({ mode: "open" });
101
+ const shadowTarget = document.createElement("button");
102
+ shadowTarget.id = "shadow-target";
103
+ shadow.appendChild(shadowTarget);
104
+
105
+ const sibling = document.createElement("div");
106
+ sibling.id = "outside";
107
+
108
+ root.append(host, sibling);
109
+
110
+ const undo = hideNonTargetElements([shadowTarget]);
111
+
112
+ expect(sibling.hasAttribute("data-aksel-hidden")).toBe(true);
113
+ expect(host.hasAttribute("data-aksel-hidden")).toBe(false);
114
+
115
+ undo();
116
+
117
+ expect(sibling.hasAttribute("data-aksel-hidden")).toBe(false);
118
+ expect(host.hasAttribute("data-aksel-hidden")).toBe(false);
119
+ });
120
+
121
+ test("maintains counters across nested calls until final undo", () => {
122
+ document.body.innerHTML = `
123
+ <div id="root">
124
+ <div id="target-a"></div>
125
+ <div id="target-b"></div>
126
+ <div id="shared"></div>
127
+ </div>
128
+ `;
129
+ const targetA = document.getElementById("target-a") as Element;
130
+ const targetB = document.getElementById("target-b") as Element;
131
+ const shared = document.getElementById("shared") as Element;
132
+
133
+ const undoA = hideNonTargetElements([targetA]);
134
+ expect(shared.hasAttribute("data-aksel-hidden")).toBe(true);
135
+
136
+ const undoB = hideNonTargetElements([targetB]);
137
+ expect(shared.hasAttribute("data-aksel-hidden")).toBe(true);
138
+
139
+ undoB();
140
+ expect(shared.hasAttribute("data-aksel-hidden")).toBe(true);
141
+ expect(shared.getAttribute("aria-hidden")).toBe("true");
142
+
143
+ undoA();
144
+ expect(shared.hasAttribute("data-aksel-hidden")).toBe(false);
145
+ expect(shared.hasAttribute("aria-hidden")).toBe(false);
146
+ });
147
+ });
@@ -0,0 +1,179 @@
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";
8
+
9
+ type UndoFn = () => void;
10
+
11
+ let ariaHiddenCounter = new WeakMap<Element, number>();
12
+ let markerCounter = new WeakMap<Element, number>();
13
+
14
+ let uncontrolledElementsSet = new WeakSet<Element>();
15
+ let lockCount = 0;
16
+
17
+ const controlAttribute = "aria-hidden";
18
+ const markerName = "data-aksel-hidden";
19
+
20
+ /**
21
+ * Unwraps a Shadow DOM host to find the actual Element in the light DOM.
22
+ */
23
+ function unwrapHost(node: Element | ShadowRoot): Element | null {
24
+ return (
25
+ node &&
26
+ ((node as ShadowRoot).host || unwrapHost(node.parentNode as Element))
27
+ );
28
+ }
29
+
30
+ /**
31
+ * Corrects the target elements by unwrapping Shadow DOM hosts if necessary.
32
+ *
33
+ * @param parent - The parent HTMLElement to check containment against.
34
+ * @param targets - An array of target Elements to correct.
35
+ * @returns An array of corrected Elements that are contained within the parent.
36
+ */
37
+ function correctElements(parent: HTMLElement, targets: Element[]): Element[] {
38
+ return targets
39
+ .map((target) => {
40
+ if (parent.contains(target)) {
41
+ return target;
42
+ }
43
+
44
+ const correctedTarget = unwrapHost(target);
45
+
46
+ if (parent.contains(correctedTarget)) {
47
+ return correctedTarget;
48
+ }
49
+
50
+ return null;
51
+ })
52
+ .filter((x): x is Element => x !== null);
53
+ }
54
+
55
+ /**
56
+ * Applies the aria-hidden attribute to all elements in the body except the specified avoid elements.
57
+ */
58
+ function applyAttributeToOthers(
59
+ uncorrectedAvoidElements: Element[],
60
+ body: HTMLElement,
61
+ ): UndoFn {
62
+ const avoidElements = correctElements(body, uncorrectedAvoidElements);
63
+ const elementsToAvoidWithParents = new Set<Node>();
64
+ const elementsToAvoidUpdating = new Set<Node>(avoidElements);
65
+ const hiddenElements: Element[] = [];
66
+
67
+ avoidElements.forEach(addToAvoidList);
68
+ applyAttributes(body);
69
+ elementsToAvoidWithParents.clear();
70
+
71
+ function addToAvoidList(el: Node | undefined) {
72
+ if (!el || elementsToAvoidWithParents.has(el)) {
73
+ return;
74
+ }
75
+
76
+ elementsToAvoidWithParents.add(el);
77
+ if (el.parentNode) {
78
+ addToAvoidList(el.parentNode);
79
+ }
80
+ }
81
+
82
+ function applyAttributes(parent: Element | null) {
83
+ if (!parent || elementsToAvoidUpdating.has(parent)) {
84
+ return;
85
+ }
86
+
87
+ const parentChildren = parent.children;
88
+
89
+ for (let index = 0; index < parentChildren.length; index += 1) {
90
+ const node = parentChildren[index] as Element;
91
+
92
+ if (elementsToAvoidWithParents.has(node)) {
93
+ applyAttributes(node);
94
+ } else {
95
+ const attr = node.getAttribute(controlAttribute);
96
+
97
+ /*
98
+ * We only check for falsy values here since since arbitrary values
99
+ * (e.g. "true", "foo", "") are all valid for indicating that the element is already hidden.
100
+ */
101
+ const alreadyHidden = attr !== null && attr !== "false";
102
+ const counterValue = (ariaHiddenCounter.get(node) || 0) + 1;
103
+ const markerValue = (markerCounter.get(node) || 0) + 1;
104
+
105
+ ariaHiddenCounter.set(node, counterValue);
106
+ markerCounter.set(node, markerValue);
107
+ hiddenElements.push(node);
108
+
109
+ if (counterValue === 1 && alreadyHidden) {
110
+ uncontrolledElementsSet.add(node);
111
+ }
112
+
113
+ if (markerValue === 1) {
114
+ node.setAttribute(markerName, "");
115
+ }
116
+
117
+ if (!alreadyHidden) {
118
+ node.setAttribute(controlAttribute, "true");
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ lockCount += 1;
125
+
126
+ /* Cleanup */
127
+ return () => {
128
+ for (const element of hiddenElements) {
129
+ const currentCounterValue = ariaHiddenCounter.get(element) || 0;
130
+ const counterValue = currentCounterValue - 1;
131
+ const markerValue = (markerCounter.get(element) || 0) - 1;
132
+
133
+ ariaHiddenCounter.set(element, counterValue);
134
+ markerCounter.set(element, markerValue);
135
+
136
+ if (!counterValue) {
137
+ if (!uncontrolledElementsSet.has(element)) {
138
+ element.removeAttribute(controlAttribute);
139
+ }
140
+
141
+ uncontrolledElementsSet.delete(element);
142
+ }
143
+
144
+ if (!markerValue) {
145
+ element.removeAttribute(markerName);
146
+ }
147
+ }
148
+
149
+ lockCount -= 1;
150
+
151
+ /* Reset */
152
+ if (!lockCount) {
153
+ ariaHiddenCounter = new WeakMap();
154
+ uncontrolledElementsSet = new WeakSet();
155
+ markerCounter = new WeakMap();
156
+ }
157
+ };
158
+ }
159
+
160
+ /**
161
+ * Hides all elements in the document body for assertive technologies except the specified elements with `aria-hidden`.
162
+ * @param avoidElements - An array of elements to avoid hiding.
163
+ * @returns A function that, when called, will undo the hiding of elements.
164
+ */
165
+ function hideNonTargetElements(avoidElements: Element[]): UndoFn {
166
+ const body = ownerDocument(avoidElements[0]).body;
167
+
168
+ /**
169
+ * Assume that elements with `aria-live` or `script` tags should not be hidden.
170
+ * This ensures that live regions and scripts continue to function properly.
171
+ */
172
+ const ingoredElements = Array.from(
173
+ body.querySelectorAll("[aria-live], script"),
174
+ );
175
+
176
+ return applyAttributeToOthers(avoidElements.concat(ingoredElements), body);
177
+ }
178
+
179
+ export { hideNonTargetElements };