@navikt/ds-react 6.4.0 → 6.5.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 (203) hide show
  1. package/cjs/date/datepicker/parts/DayButton.js +1 -1
  2. package/cjs/date/datepicker/parts/DayButton.js.map +1 -1
  3. package/cjs/date/hooks/useDatepicker.js +4 -1
  4. package/cjs/date/hooks/useDatepicker.js.map +1 -1
  5. package/cjs/date/hooks/useMonthPicker.js +4 -1
  6. package/cjs/date/hooks/useMonthPicker.js.map +1 -1
  7. package/cjs/date/monthpicker/MonthButton.js +1 -1
  8. package/cjs/date/monthpicker/MonthButton.js.map +1 -1
  9. package/cjs/tabs/Tabs.context.d.ts +30 -0
  10. package/cjs/tabs/Tabs.context.js +14 -0
  11. package/cjs/tabs/Tabs.context.js.map +1 -0
  12. package/cjs/tabs/Tabs.d.ts +8 -43
  13. package/cjs/tabs/Tabs.js +19 -12
  14. package/cjs/tabs/Tabs.js.map +1 -1
  15. package/cjs/tabs/Tabs.types.d.ts +41 -0
  16. package/cjs/tabs/Tabs.types.js +3 -0
  17. package/cjs/tabs/Tabs.types.js.map +1 -0
  18. package/cjs/tabs/index.d.ts +5 -4
  19. package/cjs/tabs/index.js +6 -6
  20. package/cjs/tabs/index.js.map +1 -1
  21. package/cjs/tabs/parts/tab/Tab.d.ts +25 -0
  22. package/cjs/tabs/{Tab.js → parts/tab/Tab.js} +15 -14
  23. package/cjs/tabs/parts/tab/Tab.js.map +1 -0
  24. package/cjs/tabs/parts/tab/useTab.d.ts +20 -0
  25. package/cjs/tabs/parts/tab/useTab.js +29 -0
  26. package/cjs/tabs/parts/tab/useTab.js.map +1 -0
  27. package/cjs/tabs/parts/tablist/ScrollButtons.d.ts +8 -0
  28. package/cjs/tabs/parts/tablist/ScrollButtons.js +15 -0
  29. package/cjs/tabs/parts/tablist/ScrollButtons.js.map +1 -0
  30. package/{esm/tabs → cjs/tabs/parts/tablist}/TabList.d.ts +1 -1
  31. package/cjs/tabs/parts/tablist/TabList.js +61 -0
  32. package/cjs/tabs/parts/tablist/TabList.js.map +1 -0
  33. package/cjs/tabs/parts/tablist/useScrollButtons.d.ts +12 -0
  34. package/cjs/tabs/parts/tablist/useScrollButtons.js +61 -0
  35. package/cjs/tabs/parts/tablist/useScrollButtons.js.map +1 -0
  36. package/cjs/tabs/parts/tablist/useTabList.d.ts +7 -0
  37. package/cjs/tabs/parts/tablist/useTabList.js +66 -0
  38. package/cjs/tabs/parts/tablist/useTabList.js.map +1 -0
  39. package/cjs/tabs/parts/tabpanel/TabPanel.d.ts +25 -0
  40. package/cjs/tabs/{TabPanel.js → parts/tabpanel/TabPanel.js} +5 -3
  41. package/cjs/tabs/parts/tabpanel/TabPanel.js.map +1 -0
  42. package/cjs/tabs/parts/tabpanel/useTabPanel.d.ts +12 -0
  43. package/cjs/tabs/parts/tabpanel/useTabPanel.js +17 -0
  44. package/cjs/tabs/parts/tabpanel/useTabPanel.js.map +1 -0
  45. package/cjs/tabs/useTabs.d.ts +14 -0
  46. package/cjs/tabs/useTabs.js +43 -0
  47. package/cjs/tabs/useTabs.js.map +1 -0
  48. package/cjs/toggle-group/ToggleGroup.context.d.ts +31 -0
  49. package/cjs/toggle-group/ToggleGroup.context.js +16 -0
  50. package/cjs/toggle-group/ToggleGroup.context.js.map +1 -0
  51. package/cjs/toggle-group/ToggleGroup.d.ts +5 -36
  52. package/cjs/toggle-group/ToggleGroup.js +24 -24
  53. package/cjs/toggle-group/ToggleGroup.js.map +1 -1
  54. package/cjs/toggle-group/ToggleGroup.types.d.ts +38 -0
  55. package/cjs/toggle-group/ToggleGroup.types.js +3 -0
  56. package/cjs/toggle-group/ToggleGroup.types.js.map +1 -0
  57. package/cjs/toggle-group/index.d.ts +3 -2
  58. package/cjs/toggle-group/index.js +1 -1
  59. package/cjs/toggle-group/index.js.map +1 -1
  60. package/cjs/toggle-group/{ToggleItem.d.ts → parts/ToggleItem.d.ts} +2 -2
  61. package/cjs/toggle-group/{ToggleItem.js → parts/ToggleItem.js} +9 -8
  62. package/cjs/toggle-group/parts/ToggleItem.js.map +1 -0
  63. package/cjs/toggle-group/parts/useToggleItem.d.ts +20 -0
  64. package/cjs/toggle-group/parts/useToggleItem.js +76 -0
  65. package/cjs/toggle-group/parts/useToggleItem.js.map +1 -0
  66. package/cjs/toggle-group/useToggleGroup.d.ts +8 -0
  67. package/cjs/toggle-group/useToggleGroup.js +29 -0
  68. package/cjs/toggle-group/useToggleGroup.js.map +1 -0
  69. package/esm/date/datepicker/parts/DayButton.js +1 -1
  70. package/esm/date/datepicker/parts/DayButton.js.map +1 -1
  71. package/esm/date/hooks/useDatepicker.js +4 -1
  72. package/esm/date/hooks/useDatepicker.js.map +1 -1
  73. package/esm/date/hooks/useMonthPicker.js +4 -1
  74. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  75. package/esm/date/monthpicker/MonthButton.js +1 -1
  76. package/esm/date/monthpicker/MonthButton.js.map +1 -1
  77. package/esm/tabs/Tabs.context.d.ts +30 -0
  78. package/esm/tabs/Tabs.context.js +10 -0
  79. package/esm/tabs/Tabs.context.js.map +1 -0
  80. package/esm/tabs/Tabs.d.ts +8 -43
  81. package/esm/tabs/Tabs.js +19 -12
  82. package/esm/tabs/Tabs.js.map +1 -1
  83. package/esm/tabs/Tabs.types.d.ts +41 -0
  84. package/esm/tabs/Tabs.types.js +2 -0
  85. package/esm/tabs/Tabs.types.js.map +1 -0
  86. package/esm/tabs/index.d.ts +5 -4
  87. package/esm/tabs/index.js +3 -3
  88. package/esm/tabs/index.js.map +1 -1
  89. package/esm/tabs/parts/tab/Tab.d.ts +25 -0
  90. package/esm/tabs/parts/tab/Tab.js +35 -0
  91. package/esm/tabs/parts/tab/Tab.js.map +1 -0
  92. package/esm/tabs/parts/tab/useTab.d.ts +20 -0
  93. package/esm/tabs/parts/tab/useTab.js +25 -0
  94. package/esm/tabs/parts/tab/useTab.js.map +1 -0
  95. package/esm/tabs/parts/tablist/ScrollButtons.d.ts +8 -0
  96. package/esm/tabs/parts/tablist/ScrollButtons.js +10 -0
  97. package/esm/tabs/parts/tablist/ScrollButtons.js.map +1 -0
  98. package/{cjs/tabs → esm/tabs/parts/tablist}/TabList.d.ts +1 -1
  99. package/esm/tabs/parts/tablist/TabList.js +32 -0
  100. package/esm/tabs/parts/tablist/TabList.js.map +1 -0
  101. package/esm/tabs/parts/tablist/useScrollButtons.d.ts +12 -0
  102. package/esm/tabs/parts/tablist/useScrollButtons.js +57 -0
  103. package/esm/tabs/parts/tablist/useScrollButtons.js.map +1 -0
  104. package/esm/tabs/parts/tablist/useTabList.d.ts +7 -0
  105. package/esm/tabs/parts/tablist/useTabList.js +62 -0
  106. package/esm/tabs/parts/tablist/useTabList.js.map +1 -0
  107. package/esm/tabs/parts/tabpanel/TabPanel.d.ts +25 -0
  108. package/esm/tabs/parts/tabpanel/TabPanel.js +22 -0
  109. package/esm/tabs/parts/tabpanel/TabPanel.js.map +1 -0
  110. package/esm/tabs/parts/tabpanel/useTabPanel.d.ts +12 -0
  111. package/esm/tabs/parts/tabpanel/useTabPanel.js +13 -0
  112. package/esm/tabs/parts/tabpanel/useTabPanel.js.map +1 -0
  113. package/esm/tabs/useTabs.d.ts +14 -0
  114. package/esm/tabs/useTabs.js +39 -0
  115. package/esm/tabs/useTabs.js.map +1 -0
  116. package/esm/toggle-group/ToggleGroup.context.d.ts +31 -0
  117. package/esm/toggle-group/ToggleGroup.context.js +12 -0
  118. package/esm/toggle-group/ToggleGroup.context.js.map +1 -0
  119. package/esm/toggle-group/ToggleGroup.d.ts +5 -36
  120. package/esm/toggle-group/ToggleGroup.js +24 -24
  121. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  122. package/esm/toggle-group/ToggleGroup.types.d.ts +38 -0
  123. package/esm/toggle-group/ToggleGroup.types.js +2 -0
  124. package/esm/toggle-group/ToggleGroup.types.js.map +1 -0
  125. package/esm/toggle-group/index.d.ts +3 -2
  126. package/esm/toggle-group/index.js +1 -1
  127. package/esm/toggle-group/index.js.map +1 -1
  128. package/esm/toggle-group/{ToggleItem.d.ts → parts/ToggleItem.d.ts} +2 -2
  129. package/esm/toggle-group/parts/ToggleItem.js +25 -0
  130. package/esm/toggle-group/parts/ToggleItem.js.map +1 -0
  131. package/esm/toggle-group/parts/useToggleItem.d.ts +20 -0
  132. package/esm/toggle-group/parts/useToggleItem.js +72 -0
  133. package/esm/toggle-group/parts/useToggleItem.js.map +1 -0
  134. package/esm/toggle-group/useToggleGroup.d.ts +8 -0
  135. package/esm/toggle-group/useToggleGroup.js +25 -0
  136. package/esm/toggle-group/useToggleGroup.js.map +1 -0
  137. package/package.json +3 -5
  138. package/src/date/datepicker/datepicker.stories.tsx +39 -0
  139. package/src/date/datepicker/parts/DayButton.tsx +2 -0
  140. package/src/date/hooks/useDatepicker.tsx +5 -1
  141. package/src/date/hooks/useMonthPicker.tsx +5 -1
  142. package/src/date/monthpicker/MonthButton.tsx +1 -0
  143. package/src/date/monthpicker/monthpicker.stories.tsx +36 -19
  144. package/src/modal/modal.stories.tsx +2 -6
  145. package/src/tabs/Tabs.context.ts +24 -0
  146. package/src/tabs/Tabs.stories.tsx +233 -113
  147. package/src/tabs/Tabs.test.tsx +99 -37
  148. package/src/tabs/Tabs.tsx +48 -70
  149. package/src/tabs/Tabs.types.ts +43 -0
  150. package/src/tabs/index.ts +11 -4
  151. package/src/tabs/parts/tab/Tab.tsx +93 -0
  152. package/src/tabs/parts/tab/useTab.ts +52 -0
  153. package/src/tabs/parts/tablist/ScrollButtons.tsx +29 -0
  154. package/src/tabs/parts/tablist/TabList.tsx +56 -0
  155. package/src/tabs/parts/tablist/useScrollButtons.ts +69 -0
  156. package/src/tabs/parts/tablist/useTabList.ts +68 -0
  157. package/src/tabs/parts/tabpanel/TabPanel.tsx +50 -0
  158. package/src/tabs/parts/tabpanel/useTabPanel.ts +18 -0
  159. package/src/tabs/useTabs.ts +51 -0
  160. package/src/toggle-group/ToggleGroup.context.ts +31 -0
  161. package/src/toggle-group/ToggleGroup.stories.tsx +67 -6
  162. package/src/toggle-group/ToggleGroup.test.tsx +57 -16
  163. package/src/toggle-group/ToggleGroup.tsx +63 -90
  164. package/src/toggle-group/ToggleGroup.types.ts +40 -0
  165. package/src/toggle-group/index.ts +3 -2
  166. package/src/toggle-group/parts/ToggleItem.tsx +55 -0
  167. package/src/toggle-group/parts/useToggleItem.ts +104 -0
  168. package/src/toggle-group/useToggleGroup.ts +33 -0
  169. package/cjs/tabs/Tab.d.ts +0 -18
  170. package/cjs/tabs/Tab.js.map +0 -1
  171. package/cjs/tabs/TabList.js +0 -111
  172. package/cjs/tabs/TabList.js.map +0 -1
  173. package/cjs/tabs/TabPanel.d.ts +0 -13
  174. package/cjs/tabs/TabPanel.js.map +0 -1
  175. package/cjs/tabs/context.d.ts +0 -8
  176. package/cjs/tabs/context.js +0 -6
  177. package/cjs/tabs/context.js.map +0 -1
  178. package/cjs/toggle-group/ToggleItem.js.map +0 -1
  179. package/cjs/toggle-group/context.d.ts +0 -6
  180. package/cjs/toggle-group/context.js +0 -6
  181. package/cjs/toggle-group/context.js.map +0 -1
  182. package/esm/tabs/Tab.d.ts +0 -18
  183. package/esm/tabs/Tab.js +0 -34
  184. package/esm/tabs/Tab.js.map +0 -1
  185. package/esm/tabs/TabList.js +0 -82
  186. package/esm/tabs/TabList.js.map +0 -1
  187. package/esm/tabs/TabPanel.d.ts +0 -13
  188. package/esm/tabs/TabPanel.js +0 -20
  189. package/esm/tabs/TabPanel.js.map +0 -1
  190. package/esm/tabs/context.d.ts +0 -8
  191. package/esm/tabs/context.js +0 -3
  192. package/esm/tabs/context.js.map +0 -1
  193. package/esm/toggle-group/ToggleItem.js +0 -24
  194. package/esm/toggle-group/ToggleItem.js.map +0 -1
  195. package/esm/toggle-group/context.d.ts +0 -6
  196. package/esm/toggle-group/context.js +0 -3
  197. package/esm/toggle-group/context.js.map +0 -1
  198. package/src/tabs/Tab.tsx +0 -66
  199. package/src/tabs/TabList.tsx +0 -128
  200. package/src/tabs/TabPanel.tsx +0 -26
  201. package/src/tabs/context.ts +0 -9
  202. package/src/toggle-group/ToggleItem.tsx +0 -41
  203. package/src/toggle-group/context.ts +0 -9
@@ -9,13 +9,13 @@ var __rest = (this && this.__rest) || function (s, e) {
9
9
  }
10
10
  return t;
11
11
  };
12
- import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
13
12
  import cl from "clsx";
14
- import React, { forwardRef, useState } from "react";
13
+ import React, { forwardRef } from "react";
15
14
  import { Label } from "../typography/index.js";
16
- import { useId } from "../util/hooks/index.js";
17
- import ToggleItem from "./ToggleItem.js";
18
- import { ToggleGroupContext } from "./context.js";
15
+ import { useId } from "../util/index.js";
16
+ import { ToggleGroupDescendantsProvider, ToggleGroupProvider, useToggleGroupDescendants, } from "./ToggleGroup.context.js";
17
+ import ToggleItem from "./parts/ToggleItem.js";
18
+ import { useToggleGroup } from "./useToggleGroup.js";
19
19
  /**
20
20
  * A component that displays a group of toggle buttons.
21
21
  *
@@ -32,31 +32,31 @@ import { ToggleGroupContext } from "./context.js";
32
32
  * ```
33
33
  */
34
34
  export const ToggleGroup = forwardRef((_a, ref) => {
35
- var { className, children, onChange, size = "medium", label, value, defaultValue, "aria-describedby": desc, variant = "action" } = _a, rest = __rest(_a, ["className", "children", "onChange", "size", "label", "value", "defaultValue", "aria-describedby", "variant"]);
36
- const [groupValue, setGroupValue] = useState(defaultValue);
35
+ var { className, children, onChange, size = "medium", label, value, defaultValue, "aria-describedby": userDescribedby, variant = "action", fill = false } = _a, rest = __rest(_a, ["className", "children", "onChange", "size", "label", "value", "defaultValue", "aria-describedby", "variant", "fill"]);
36
+ const descendants = useToggleGroupDescendants();
37
+ const toggleGroupContext = useToggleGroup({
38
+ defaultValue,
39
+ value,
40
+ onChange,
41
+ });
42
+ /**
43
+ * ToggleGroupProvider handles memoization.
44
+ */
45
+ const context = Object.assign(Object.assign({}, toggleGroupContext), { size });
37
46
  const labelId = useId();
38
- const handleValueChange = (v) => {
39
- if (v !== "") {
40
- setGroupValue(v);
41
- onChange === null || onChange === void 0 ? void 0 : onChange(v);
42
- }
43
- };
44
47
  if (!value && !defaultValue) {
45
- console.error("ToggleGroup without value/defaultvalue is not allowed");
48
+ console.error("ToggleGroup without value or defaultvalue is not allowed");
46
49
  }
47
- const describeBy = cl({
48
- [desc !== null && desc !== void 0 ? desc : ""]: !!desc,
49
- [labelId !== null && labelId !== void 0 ? labelId : ""]: !!label,
50
- });
51
50
  if (!value && !defaultValue) {
52
51
  console.error("ToggleGroup needs either a value or defaultValue");
53
52
  }
54
- return (React.createElement(ToggleGroupContext.Provider, { value: {
55
- size,
56
- } },
57
- React.createElement("div", { className: cl("navds-toggle-group__wrapper", className) },
58
- label && (React.createElement(Label, { size: size, className: "navds-toggle-group__label", id: labelId }, label)),
59
- React.createElement(RadixToggleGroup.Root, Object.assign({}, rest, { onValueChange: handleValueChange, value: value !== null && value !== void 0 ? value : groupValue, defaultValue: defaultValue, ref: ref, className: cl("navds-toggle-group", `navds-toggle-group--${size}`, `navds-toggle-group--${variant}`) }, (describeBy && { "aria-describedby": describeBy }), { role: "radiogroup", type: "single" }), children))));
53
+ return (React.createElement(ToggleGroupDescendantsProvider, { value: descendants },
54
+ React.createElement(ToggleGroupProvider, Object.assign({}, context),
55
+ React.createElement("div", { className: cl("navds-toggle-group__wrapper", className, {
56
+ "navds-toggle-group__wrapper--fill": fill,
57
+ }) },
58
+ label && (React.createElement(Label, { size: size, className: "navds-toggle-group__label", id: labelId }, label)),
59
+ React.createElement("div", Object.assign({}, rest, { ref: ref, className: cl("navds-toggle-group", `navds-toggle-group--${size}`, `navds-toggle-group--${variant}`), "aria-describedby": cl(userDescribedby, !!label && labelId) || undefined, role: "radiogroup" }), children)))));
60
60
  });
61
61
  ToggleGroup.Item = ToggleItem;
62
62
  export default ToggleGroup;
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleGroup.js","sourceRoot":"","sources":["../../src/toggle-group/ToggleGroup.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,gBAAgB,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAkB,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,UAAoC,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAgD/C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CACnC,CACE,EAWC,EACD,GAAG,EACH,EAAE;QAbF,EACE,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,IAAI,GAAG,QAAQ,EACf,KAAK,EACL,KAAK,EACL,YAAY,EACZ,kBAAkB,EAAE,IAAI,EACxB,OAAO,GAAG,QAAQ,OAEnB,EADI,IAAI,cAVT,8GAWC,CADQ;IAIT,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IAExB,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE;QACtC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;YACb,aAAa,CAAC,CAAC,CAAC,CAAC;YACjB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC;QACpB,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI;QACpB,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CACL,oBAAC,kBAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE;YACL,IAAI;SACL;QAED,6BAAK,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC;YACzD,KAAK,IAAI,CACR,oBAAC,KAAK,IACJ,IAAI,EAAE,IAAI,EACV,SAAS,EAAC,2BAA2B,EACrC,EAAE,EAAE,OAAO,IAEV,KAAK,CACA,CACT;YACD,oBAAC,gBAAgB,CAAC,IAAI,oBAChB,IAAI,IACR,aAAa,EAAE,iBAAiB,EAChC,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,UAAU,EAC1B,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,oBAAoB,EACpB,uBAAuB,IAAI,EAAE,EAC7B,uBAAuB,OAAO,EAAE,CACjC,IACG,CAAC,UAAU,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,IACtD,IAAI,EAAC,YAAY,EACjB,IAAI,EAAC,QAAQ,KAEZ,QAAQ,CACa,CACpB,CACsB,CAC/B,CAAC;AACJ,CAAC,CACsB,CAAC;AAE1B,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC;AAE9B,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ToggleGroup.js","sourceRoot":"","sources":["../../src/toggle-group/ToggleGroup.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CACnC,CACE,EAYC,EACD,GAAG,EACH,EAAE;QAdF,EACE,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,IAAI,GAAG,QAAQ,EACf,KAAK,EACL,KAAK,EACL,YAAY,EACZ,kBAAkB,EAAE,eAAe,EACnC,OAAO,GAAG,QAAQ,EAClB,IAAI,GAAG,KAAK,OAEb,EADI,IAAI,cAXT,sHAYC,CADQ;IAIT,MAAM,WAAW,GAAG,yBAAyB,EAAE,CAAC;IAEhD,MAAM,kBAAkB,GAAG,cAAc,CAAC;QACxC,YAAY;QACZ,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,OAAO,mCACR,kBAAkB,KACrB,IAAI,GACL,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IAExB,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CACL,oBAAC,8BAA8B,IAAC,KAAK,EAAE,WAAW;QAChD,oBAAC,mBAAmB,oBAAK,OAAO;YAC9B,6BACE,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,EAAE;oBACtD,mCAAmC,EAAE,IAAI;iBAC1C,CAAC;gBAED,KAAK,IAAI,CACR,oBAAC,KAAK,IACJ,IAAI,EAAE,IAAI,EACV,SAAS,EAAC,2BAA2B,EACrC,EAAE,EAAE,OAAO,IAEV,KAAK,CACA,CACT;gBACD,6CACM,IAAI,IACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,oBAAoB,EACpB,uBAAuB,IAAI,EAAE,EAC7B,uBAAuB,OAAO,EAAE,CACjC,sBAEC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,SAAS,EAEtD,IAAI,EAAC,YAAY,KAEhB,QAAQ,CACL,CACF,CACc,CACS,CAClC,CAAC;AACJ,CAAC,CACsB,CAAC;AAE1B,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC;AAE9B,eAAe,WAAW,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { HTMLAttributes } from "react";
2
+ export interface ToggleGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "dir"> {
3
+ /**
4
+ * Toggles.Item elements.
5
+ */
6
+ children: React.ReactNode;
7
+ /**
8
+ * Changes padding and font-size.
9
+ * @default "medium"
10
+ */
11
+ size?: "medium" | "small";
12
+ /**
13
+ * Controlled selected value.
14
+ */
15
+ value?: string;
16
+ /**
17
+ * If not controlled, a default-value needs to be set.
18
+ */
19
+ defaultValue?: string;
20
+ /**
21
+ * Callback for selected toggle.
22
+ */
23
+ onChange: (value: string) => void;
24
+ /**
25
+ * Label describing ToggleGroup.
26
+ */
27
+ label?: React.ReactNode;
28
+ /**
29
+ * Changes design and interaction-visuals.
30
+ * @default "action"
31
+ */
32
+ variant?: "action" | "neutral";
33
+ /**
34
+ * Stretch each button to fill avaliable space in container.
35
+ * @default false
36
+ */
37
+ fill?: boolean;
38
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ToggleGroup.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleGroup.types.js","sourceRoot":"","sources":["../../src/toggle-group/ToggleGroup.types.ts"],"names":[],"mappings":""}
@@ -1,2 +1,3 @@
1
- export { default as ToggleGroup, type ToggleGroupProps } from "./ToggleGroup.js";
2
- export { default as ToggleGroupItem, type ToggleGroupItemProps, } from "./ToggleItem.js";
1
+ export { default as ToggleGroup } from "./ToggleGroup.js";
2
+ export { type ToggleGroupProps } from "./ToggleGroup.types.js";
3
+ export { default as ToggleGroupItem, type ToggleGroupItemProps, } from "./parts/ToggleItem.js";
@@ -1,4 +1,4 @@
1
1
  "use client";
2
2
  export { default as ToggleGroup } from "./ToggleGroup.js";
3
- export { default as ToggleGroupItem, } from "./ToggleItem.js";
3
+ export { default as ToggleGroupItem, } from "./parts/ToggleItem.js";
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/toggle-group/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,OAAO,IAAI,WAAW,EAAyB,MAAM,eAAe,CAAC;AAC9E,OAAO,EACL,OAAO,IAAI,eAAe,GAE3B,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/toggle-group/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EACL,OAAO,IAAI,eAAe,GAE3B,MAAM,oBAAoB,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  export interface ToggleGroupItemProps extends React.HTMLAttributes<HTMLButtonElement> {
3
3
  /**
4
- * Content
4
+ * Content.
5
5
  */
6
6
  children: React.ReactNode;
7
7
  /**
8
- * Value for state-handling
8
+ * Value for state-handling.
9
9
  */
10
10
  value: string;
11
11
  }
@@ -0,0 +1,25 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import cl from "clsx";
13
+ import React, { forwardRef } from "react";
14
+ import { BodyShort } from "../../typography/BodyShort.js";
15
+ import { useToggleGroupContext } from "../ToggleGroup.context.js";
16
+ import { useToggleItem } from "./useToggleItem.js";
17
+ const ToggleItem = forwardRef((_a, forwardedRef) => {
18
+ var { className, children, value, onClick, onFocus, onKeyDown } = _a, rest = __rest(_a, ["className", "children", "value", "onClick", "onFocus", "onKeyDown"]);
19
+ const itemCtx = useToggleItem({ value, onClick, onFocus, disabled: false, onKeyDown }, forwardedRef);
20
+ const ctx = useToggleGroupContext();
21
+ return (React.createElement("button", Object.assign({}, rest, { ref: itemCtx.ref, className: cl("navds-toggle-group__button", className), type: "button", role: "radio", "aria-checked": itemCtx.isSelected, tabIndex: itemCtx.isFocused ? 0 : -1, onClick: itemCtx.onClick, onFocus: itemCtx.onFocus, onKeyDown: itemCtx.onKeyDown }),
22
+ React.createElement(BodyShort, { as: "span", className: "navds-toggle-group__button-inner", size: ctx === null || ctx === void 0 ? void 0 : ctx.size }, children)));
23
+ });
24
+ export default ToggleItem;
25
+ //# sourceMappingURL=ToggleItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleItem.js","sourceRoot":"","sources":["../../../src/toggle-group/parts/ToggleItem.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,MAAM,CAAC;AACtB,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAchD,MAAM,UAAU,GAAG,UAAU,CAC3B,CACE,EAAoE,EACpE,YAAY,EACZ,EAAE;QAFF,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,OAAW,EAAN,IAAI,cAAlE,qEAAoE,CAAF;IAGlE,MAAM,OAAO,GAAG,aAAa,CAC3B,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EACvD,YAAY,CACb,CAAC;IACF,MAAM,GAAG,GAAG,qBAAqB,EAAE,CAAC;IAEpC,OAAO,CACL,gDACM,IAAI,IACR,GAAG,EAAE,OAAO,CAAC,GAAG,EAChB,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,EACtD,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,OAAO,kBACE,OAAO,CAAC,UAAU,EAChC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACpC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAE5B,oBAAC,SAAS,IACR,EAAE,EAAC,MAAM,EACT,SAAS,EAAC,kCAAkC,EAC5C,IAAI,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,IAEd,QAAQ,CACC,CACL,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,20 @@
1
+ /// <reference types="react" />
2
+ export interface UseToggleItemProps {
3
+ /**
4
+ * If `true`, the `ToggleItem` won't be toggleable
5
+ * @default false
6
+ */
7
+ disabled?: boolean;
8
+ onClick?: React.MouseEventHandler;
9
+ onFocus?: React.FocusEventHandler;
10
+ onKeyDown?: React.KeyboardEventHandler;
11
+ value: string;
12
+ }
13
+ export declare function useToggleItem<P extends UseToggleItemProps>({ value, disabled, onFocus: _onFocus, onClick, onKeyDown: _onKeyDown, }: P, ref: React.ForwardedRef<HTMLButtonElement>): {
14
+ ref: (instance: HTMLButtonElement | null) => void;
15
+ isSelected: boolean;
16
+ isFocused: boolean;
17
+ onClick: (event: import("react").MouseEvent<Element, MouseEvent>) => void;
18
+ onFocus: ((event: import("react").FocusEvent<Element, Element>) => void) | undefined;
19
+ onKeyDown: (event: import("react").KeyboardEvent<Element>) => void;
20
+ };
@@ -0,0 +1,72 @@
1
+ import { useCallback } from "react";
2
+ import { composeEventHandlers } from "../../util/composeEventHandlers.js";
3
+ import { mergeRefs } from "../../util/hooks/useMergeRefs.js";
4
+ import { useToggleGroupContext, useToggleGroupDescendant, } from "../ToggleGroup.context.js";
5
+ export function useToggleItem({ value, disabled = false, onFocus: _onFocus, onClick, onKeyDown: _onKeyDown, }, ref) {
6
+ const { setSelectedValue, setFocusedValue, selectedValue, focusedValue } = useToggleGroupContext();
7
+ const { register, descendants } = useToggleGroupDescendant({
8
+ disabled,
9
+ value,
10
+ });
11
+ const isSelected = value === selectedValue;
12
+ const onFocus = () => setFocusedValue(value);
13
+ /**
14
+ * Implements roving-tabindex for horizontal tabs
15
+ */
16
+ const onKeyDown = useCallback((event) => {
17
+ /**
18
+ * ToggleGroup.Item is registered with its prop 'value'.
19
+ * We can then use it to find the current focuses descendant
20
+ */
21
+ const idx = descendants
22
+ .values()
23
+ .findIndex((x) => x.value === focusedValue);
24
+ const nextTab = () => {
25
+ var _a;
26
+ const next = descendants.nextEnabled(idx, false);
27
+ next && ((_a = next.node) === null || _a === void 0 ? void 0 : _a.focus());
28
+ };
29
+ const prevTab = () => {
30
+ var _a;
31
+ const prev = descendants.prevEnabled(idx, false);
32
+ prev && ((_a = prev.node) === null || _a === void 0 ? void 0 : _a.focus());
33
+ };
34
+ const firstTab = () => {
35
+ var _a;
36
+ const first = descendants.firstEnabled();
37
+ first && ((_a = first.node) === null || _a === void 0 ? void 0 : _a.focus());
38
+ };
39
+ const lastTab = () => {
40
+ var _a;
41
+ const last = descendants.lastEnabled();
42
+ last && ((_a = last.node) === null || _a === void 0 ? void 0 : _a.focus());
43
+ };
44
+ const keyMap = {
45
+ ArrowLeft: prevTab,
46
+ ArrowRight: nextTab,
47
+ Home: firstTab,
48
+ End: lastTab,
49
+ };
50
+ const action = keyMap[event.key];
51
+ if (action) {
52
+ event.preventDefault();
53
+ action(event);
54
+ }
55
+ else if (event.key === "Tab") {
56
+ /**
57
+ * Imperative focus during keydown is risky so we prevent React's batching updates
58
+ * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
59
+ */
60
+ selectedValue && setTimeout(() => setFocusedValue(selectedValue));
61
+ }
62
+ }, [descendants, focusedValue, selectedValue, setFocusedValue]);
63
+ return {
64
+ ref: mergeRefs([register, ref]),
65
+ isSelected,
66
+ isFocused: focusedValue === value,
67
+ onClick: composeEventHandlers(onClick, () => setSelectedValue(value)),
68
+ onFocus: disabled ? undefined : composeEventHandlers(_onFocus, onFocus),
69
+ onKeyDown: composeEventHandlers(_onKeyDown, onKeyDown),
70
+ };
71
+ }
72
+ //# sourceMappingURL=useToggleItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToggleItem.js","sourceRoot":"","sources":["../../../src/toggle-group/parts/useToggleItem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { ToggleGroupProps } from "./ToggleGroup.types.js";
3
+ export declare function useToggleGroup({ onChange, value, defaultValue, }: Pick<ToggleGroupProps, "onChange" | "value" | "defaultValue">): {
4
+ selectedValue: string;
5
+ setSelectedValue: (next: import("react").SetStateAction<string>) => void;
6
+ focusedValue: string;
7
+ setFocusedValue: import("react").Dispatch<import("react").SetStateAction<string>>;
8
+ };
@@ -0,0 +1,25 @@
1
+ import { useEffect, useState } from "react";
2
+ import { useControllableState } from "../util/hooks/useControllableState.js";
3
+ export function useToggleGroup({ onChange, value, defaultValue = "", }) {
4
+ const [focusedValue, setFocusedValue] = useState(defaultValue);
5
+ const [selectedValue, setSelectedValue] = useControllableState({
6
+ defaultValue,
7
+ value,
8
+ onChange,
9
+ });
10
+ /**
11
+ * Sync focused `value` with controlled `selectedValue`
12
+ */
13
+ useEffect(() => {
14
+ if (value != null) {
15
+ setFocusedValue(value);
16
+ }
17
+ }, [value]);
18
+ return {
19
+ selectedValue,
20
+ setSelectedValue,
21
+ focusedValue,
22
+ setFocusedValue,
23
+ };
24
+ }
25
+ //# sourceMappingURL=useToggleGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToggleGroup.js","sourceRoot":"","sources":["../../src/toggle-group/useToggleGroup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAG1E,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,YAAY,GAAG,EAAE,GAC6C;IAC9D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,oBAAoB,CAAC;QAC7D,YAAY;QACZ,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEH;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO;QACL,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,eAAe;KAChB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "6.4.0",
3
+ "version": "6.5.0",
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",
@@ -562,10 +562,8 @@
562
562
  },
563
563
  "dependencies": {
564
564
  "@floating-ui/react": "0.25.4",
565
- "@navikt/aksel-icons": "^6.4.0",
566
- "@navikt/ds-tokens": "^6.4.0",
567
- "@radix-ui/react-tabs": "1.0.0",
568
- "@radix-ui/react-toggle-group": "1.0.0",
565
+ "@navikt/aksel-icons": "^6.5.0",
566
+ "@navikt/ds-tokens": "^6.5.0",
569
567
  "clsx": "^2.1.0",
570
568
  "date-fns": "^3.0.0",
571
569
  "react-day-picker": "8.10.0"
@@ -1,6 +1,8 @@
1
1
  import { Meta, StoryObj } from "@storybook/react";
2
+ import { expect, userEvent, within } from "@storybook/test";
2
3
  import { isSameDay } from "date-fns";
3
4
  import React, { useId, useState } from "react";
5
+ import { act } from "react-dom/test-utils";
4
6
  import { Button } from "../../button";
5
7
  import { HGrid } from "../../layout/grid";
6
8
  import { VStack } from "../../layout/stack";
@@ -440,6 +442,43 @@ export const WeekDayClick = () => {
440
442
  );
441
443
  };
442
444
 
445
+ export const Required = {
446
+ render: () => {
447
+ const { datepickerProps } = useDatepicker({
448
+ defaultSelected: new Date("Apr 10 2024"),
449
+ required: true,
450
+ });
451
+
452
+ return (
453
+ <div style={{ height: "20rem" }}>
454
+ <DatePicker.Standalone {...datepickerProps} />
455
+ </div>
456
+ );
457
+ },
458
+ play: async ({ canvasElement }) => {
459
+ const canvas = within(canvasElement);
460
+
461
+ const button10 = canvas.getByRole("button", { pressed: true });
462
+
463
+ await act(async () => {
464
+ await userEvent.click(button10);
465
+ });
466
+
467
+ expect(button10.ariaPressed).toBe("true");
468
+
469
+ const button17 = canvas.getByText("17").closest("button");
470
+
471
+ expect(button17?.ariaPressed).toBe("false");
472
+
473
+ await act(async () => {
474
+ button17 && (await userEvent.click(button17));
475
+ });
476
+
477
+ expect(button17?.ariaPressed).toBe("true");
478
+ expect(button10.ariaPressed).toBe("false");
479
+ },
480
+ };
481
+
443
482
  export const ModalDemo = () => {
444
483
  const { datepickerProps, inputProps } = useDatepicker({
445
484
  fromDate: new Date("Aug 23 2019"),
@@ -23,6 +23,8 @@ const DayButton = (props: DayProps) => {
23
23
  role={undefined}
24
24
  aria-label={dateTime}
25
25
  aria-hidden={dayRender.activeModifiers.outside}
26
+ aria-selected={undefined}
27
+ aria-pressed={!!dayRender.activeModifiers.selected}
26
28
  />
27
29
  );
28
30
  };
@@ -229,12 +229,16 @@ export const useDatepicker = (
229
229
 
230
230
  /* Only allow de-selecting if not required */
231
231
  const handleDayClick: DayClickEventHandler = (day, { selected }) => {
232
+ if (selected && required) {
233
+ return;
234
+ }
235
+
232
236
  if (day && !selected) {
233
237
  handleOpen(false);
234
238
  anchorRef?.focus();
235
239
  }
236
240
 
237
- if (!required && selected) {
241
+ if (selected) {
238
242
  updateDate(undefined);
239
243
  setInputValue("");
240
244
  updateValidation({ isValidDate: false, isEmpty: true });
@@ -225,13 +225,17 @@ export const useMonthpicker = (
225
225
 
226
226
  /* Only allow de-selecting if not required */
227
227
  const handleMonthClick = (month?: Date) => {
228
+ if (!month && required) {
229
+ return;
230
+ }
231
+
228
232
  if (month) {
229
233
  handleOpen(false);
230
234
  setYear(month);
231
235
  anchorRef?.focus();
232
236
  }
233
237
 
234
- if (!required && !month) {
238
+ if (!month) {
235
239
  updateMonth(undefined);
236
240
  updateValidation({ isValidMonth: false, isEmpty: true });
237
241
  setInputValue("");
@@ -66,6 +66,7 @@ export const MonthButton = ({
66
66
  type="button"
67
67
  onClick={() => onSelect(isSelected ? undefined : month)}
68
68
  disabled={isDisabled}
69
+ aria-pressed={!!isSelected}
69
70
  className={cl("navds-date__month-button", {
70
71
  "rdp-day_today": dateIsInCurrentMonth(month, year),
71
72
  "rdp-day_selected": isSelected,
@@ -1,6 +1,8 @@
1
1
  import { Meta, StoryFn, StoryObj } from "@storybook/react";
2
+ import { expect, userEvent, within } from "@storybook/test";
2
3
  import { setYear } from "date-fns";
3
4
  import React, { useId, useState } from "react";
5
+ import { act } from "react-dom/test-utils";
4
6
  import { Button } from "../../button";
5
7
  import { useMonthpicker } from "../hooks";
6
8
  import { DateInputProps } from "../parts/DateInput";
@@ -121,25 +123,41 @@ export const UseMonthpickerFormat = () => {
121
123
  );
122
124
  };
123
125
 
124
- export const Required = () => {
125
- const { inputProps, monthpickerProps } = useMonthpicker({
126
- locale: "nb",
127
- defaultSelected: new Date(),
128
- disabled: [new Date("Apr 1 2022")],
129
- required: true,
130
- });
126
+ export const Required = {
127
+ render: () => {
128
+ const { monthpickerProps } = useMonthpicker({
129
+ defaultSelected: new Date("Apr 10 2024"),
130
+ required: true,
131
+ });
131
132
 
132
- return (
133
- <div style={{ height: "20rem" }}>
134
- <MonthPicker {...monthpickerProps}>
135
- <MonthPicker.Input
136
- {...inputProps}
137
- label="Velg måned"
138
- variant="monthpicker"
139
- />
140
- </MonthPicker>
141
- </div>
142
- );
133
+ return (
134
+ <div style={{ height: "20rem" }}>
135
+ <MonthPicker.Standalone {...monthpickerProps} />
136
+ </div>
137
+ );
138
+ },
139
+ play: async ({ canvasElement }) => {
140
+ const canvas = within(canvasElement);
141
+
142
+ const buttonApr = canvas.getByRole("button", { pressed: true });
143
+
144
+ await act(async () => {
145
+ await userEvent.click(buttonApr);
146
+ });
147
+
148
+ expect(buttonApr.ariaPressed).toBe("true");
149
+
150
+ const buttonSep = canvas.getByText("september").closest("button");
151
+
152
+ expect(buttonSep?.ariaPressed).toBe("false");
153
+
154
+ await act(async () => {
155
+ buttonSep && (await userEvent.click(buttonSep));
156
+ });
157
+
158
+ expect(buttonSep?.ariaPressed).toBe("true");
159
+ expect(buttonApr.ariaPressed).toBe("false");
160
+ },
143
161
  };
144
162
 
145
163
  export const UserControlled = () => {
@@ -193,7 +211,6 @@ export const Chromatic: Story = {
193
211
  <DisabledMonths />
194
212
  <UseMonthpicker />
195
213
  <UseMonthpickerFormat />
196
- <Required />
197
214
  <UserControlled />
198
215
  <FollowYear />
199
216
  </div>
@@ -146,6 +146,7 @@ export const WithUseState: StoryFn = () => {
146
146
  );
147
147
  };
148
148
  WithUseState.storyName = "With useState";
149
+ WithUseState.parameters = { chromatic: { disable: true } };
149
150
 
150
151
  export const EmptyHeader: StoryFn = () => (
151
152
  <Modal open onClose={() => null} aria-label="Modal with empty header">
@@ -225,6 +226,7 @@ export const WithTooltip: StoryFn = () => {
225
226
  </div>
226
227
  );
227
228
  };
229
+ WithTooltip.parameters = { chromatic: { disable: true } }; // The tooltip behaves unpredictably in Chromatic
228
230
 
229
231
  export const WithSrOnlyElement: StoryFn = () => (
230
232
  <Modal
@@ -330,12 +332,6 @@ ChromaticViewportTesting.parameters = {
330
332
  height: 400,
331
333
  },
332
334
  },
333
- desktop: {
334
- viewport: {
335
- width: 1280,
336
- height: 960,
337
- },
338
- },
339
335
  },
340
336
  },
341
337
  };
@@ -0,0 +1,24 @@
1
+ import { createContext } from "../util/create-context";
2
+ import { createDescendantContext } from "../util/hooks/descendants/useDescendant";
3
+ import { TabsProps } from "./Tabs.types";
4
+ import { useTabs } from "./useTabs";
5
+
6
+ export const [
7
+ TabsDescendantsProvider,
8
+ useTabsDescendantsContext,
9
+ useTabsDescendants,
10
+ useTabsDescendant,
11
+ ] = createDescendantContext<HTMLButtonElement, { value: string }>();
12
+
13
+ type TabsProviderProps = ReturnType<typeof useTabs> &
14
+ Pick<
15
+ TabsProps,
16
+ "selectionFollowsFocus" | "loop" | "size" | "iconPosition" | "fill"
17
+ >;
18
+
19
+ /* State context */
20
+ export const [TabsProvider, useTabsContext] = createContext<TabsProviderProps>({
21
+ name: "TabsContext",
22
+ hookName: "useTabsContext",
23
+ providerName: "TabsProvider",
24
+ });