@navikt/ds-react 6.4.1 → 6.6.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 (349) 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/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  10. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  11. package/cjs/form/combobox/Input/Input.js +6 -1
  12. package/cjs/form/combobox/Input/Input.js.map +1 -1
  13. package/cjs/form/form-summary/FormSummary.d.ts +82 -0
  14. package/cjs/form/form-summary/FormSummary.js +81 -0
  15. package/cjs/form/form-summary/FormSummary.js.map +1 -0
  16. package/cjs/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  17. package/cjs/form/form-summary/FormSummaryAnswer.js +25 -0
  18. package/cjs/form/form-summary/FormSummaryAnswer.js.map +1 -0
  19. package/cjs/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  20. package/cjs/{toggle-group/ToggleItem.js → form/form-summary/FormSummaryAnswers.js} +6 -10
  21. package/cjs/form/form-summary/FormSummaryAnswers.js.map +1 -0
  22. package/cjs/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  23. package/cjs/form/form-summary/FormSummaryEditLink.js +49 -0
  24. package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -0
  25. package/cjs/form/form-summary/FormSummaryHeader.d.ts +9 -0
  26. package/cjs/{tabs/TabPanel.js → form/form-summary/FormSummaryHeader.js} +6 -6
  27. package/cjs/form/form-summary/FormSummaryHeader.js.map +1 -0
  28. package/cjs/form/form-summary/FormSummaryHeading.d.ts +14 -0
  29. package/cjs/form/form-summary/FormSummaryHeading.js +31 -0
  30. package/cjs/form/form-summary/FormSummaryHeading.js.map +1 -0
  31. package/cjs/form/form-summary/FormSummaryLabel.d.ts +6 -0
  32. package/cjs/form/form-summary/FormSummaryLabel.js +45 -0
  33. package/cjs/form/form-summary/FormSummaryLabel.js.map +1 -0
  34. package/cjs/form/form-summary/FormSummaryValue.d.ts +6 -0
  35. package/cjs/form/form-summary/FormSummaryValue.js +49 -0
  36. package/cjs/form/form-summary/FormSummaryValue.js.map +1 -0
  37. package/cjs/form/form-summary/index.d.ts +8 -0
  38. package/cjs/form/form-summary/index.js +24 -0
  39. package/cjs/form/form-summary/index.js.map +1 -0
  40. package/cjs/index.d.ts +3 -2
  41. package/cjs/index.js +5 -3
  42. package/cjs/index.js.map +1 -1
  43. package/cjs/tabs/Tabs.context.d.ts +30 -0
  44. package/cjs/tabs/Tabs.context.js +14 -0
  45. package/cjs/tabs/Tabs.context.js.map +1 -0
  46. package/cjs/tabs/Tabs.d.ts +8 -43
  47. package/cjs/tabs/Tabs.js +19 -12
  48. package/cjs/tabs/Tabs.js.map +1 -1
  49. package/cjs/tabs/Tabs.types.d.ts +41 -0
  50. package/cjs/tabs/Tabs.types.js +3 -0
  51. package/cjs/tabs/Tabs.types.js.map +1 -0
  52. package/cjs/tabs/index.d.ts +5 -4
  53. package/cjs/tabs/index.js +6 -6
  54. package/cjs/tabs/index.js.map +1 -1
  55. package/cjs/tabs/parts/tab/Tab.d.ts +25 -0
  56. package/cjs/tabs/parts/tab/Tab.js +64 -0
  57. package/cjs/tabs/parts/tab/Tab.js.map +1 -0
  58. package/cjs/tabs/parts/tab/useTab.d.ts +20 -0
  59. package/cjs/tabs/parts/tab/useTab.js +29 -0
  60. package/cjs/tabs/parts/tab/useTab.js.map +1 -0
  61. package/cjs/tabs/parts/tablist/ScrollButtons.d.ts +8 -0
  62. package/cjs/tabs/parts/tablist/ScrollButtons.js +15 -0
  63. package/cjs/tabs/parts/tablist/ScrollButtons.js.map +1 -0
  64. package/{esm/tabs → cjs/tabs/parts/tablist}/TabList.d.ts +1 -1
  65. package/cjs/tabs/parts/tablist/TabList.js +61 -0
  66. package/cjs/tabs/parts/tablist/TabList.js.map +1 -0
  67. package/cjs/tabs/parts/tablist/useScrollButtons.d.ts +12 -0
  68. package/cjs/tabs/parts/tablist/useScrollButtons.js +61 -0
  69. package/cjs/tabs/parts/tablist/useScrollButtons.js.map +1 -0
  70. package/cjs/tabs/parts/tablist/useTabList.d.ts +7 -0
  71. package/cjs/tabs/parts/tablist/useTabList.js +66 -0
  72. package/cjs/tabs/parts/tablist/useTabList.js.map +1 -0
  73. package/cjs/tabs/parts/tabpanel/TabPanel.d.ts +25 -0
  74. package/cjs/tabs/{Tab.js → parts/tabpanel/TabPanel.js} +7 -20
  75. package/cjs/tabs/parts/tabpanel/TabPanel.js.map +1 -0
  76. package/cjs/tabs/parts/tabpanel/useTabPanel.d.ts +12 -0
  77. package/cjs/tabs/parts/tabpanel/useTabPanel.js +17 -0
  78. package/cjs/tabs/parts/tabpanel/useTabPanel.js.map +1 -0
  79. package/cjs/tabs/useTabs.d.ts +14 -0
  80. package/cjs/tabs/useTabs.js +43 -0
  81. package/cjs/tabs/useTabs.js.map +1 -0
  82. package/cjs/toggle-group/ToggleGroup.context.d.ts +31 -0
  83. package/cjs/toggle-group/ToggleGroup.context.js +16 -0
  84. package/cjs/toggle-group/ToggleGroup.context.js.map +1 -0
  85. package/cjs/toggle-group/ToggleGroup.d.ts +5 -36
  86. package/cjs/toggle-group/ToggleGroup.js +24 -24
  87. package/cjs/toggle-group/ToggleGroup.js.map +1 -1
  88. package/cjs/toggle-group/ToggleGroup.types.d.ts +38 -0
  89. package/cjs/toggle-group/ToggleGroup.types.js +3 -0
  90. package/cjs/toggle-group/ToggleGroup.types.js.map +1 -0
  91. package/cjs/toggle-group/index.d.ts +3 -2
  92. package/cjs/toggle-group/index.js +1 -1
  93. package/cjs/toggle-group/index.js.map +1 -1
  94. package/cjs/toggle-group/{ToggleItem.d.ts → parts/ToggleItem.d.ts} +2 -2
  95. package/cjs/toggle-group/parts/ToggleItem.js +53 -0
  96. package/cjs/toggle-group/parts/ToggleItem.js.map +1 -0
  97. package/cjs/toggle-group/parts/useToggleItem.d.ts +20 -0
  98. package/cjs/toggle-group/parts/useToggleItem.js +76 -0
  99. package/cjs/toggle-group/parts/useToggleItem.js.map +1 -0
  100. package/cjs/toggle-group/useToggleGroup.d.ts +8 -0
  101. package/cjs/toggle-group/useToggleGroup.js +29 -0
  102. package/cjs/toggle-group/useToggleGroup.js.map +1 -0
  103. package/cjs/util/hooks/descendants/descendant.js +10 -1
  104. package/cjs/util/hooks/descendants/descendant.js.map +1 -1
  105. package/cjs/util/hooks/descendants/useDescendant.js +0 -5
  106. package/cjs/util/hooks/descendants/useDescendant.js.map +1 -1
  107. package/esm/date/datepicker/parts/DayButton.js +1 -1
  108. package/esm/date/datepicker/parts/DayButton.js.map +1 -1
  109. package/esm/date/hooks/useDatepicker.js +4 -1
  110. package/esm/date/hooks/useDatepicker.js.map +1 -1
  111. package/esm/date/hooks/useMonthPicker.js +4 -1
  112. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  113. package/esm/date/monthpicker/MonthButton.js +1 -1
  114. package/esm/date/monthpicker/MonthButton.js.map +1 -1
  115. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +2 -4
  116. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  117. package/esm/form/combobox/Input/Input.js +6 -1
  118. package/esm/form/combobox/Input/Input.js.map +1 -1
  119. package/esm/form/form-summary/FormSummary.d.ts +82 -0
  120. package/esm/form/form-summary/FormSummary.js +52 -0
  121. package/esm/form/form-summary/FormSummary.js.map +1 -0
  122. package/esm/form/form-summary/FormSummaryAnswer.d.ts +11 -0
  123. package/esm/form/form-summary/FormSummaryAnswer.js +19 -0
  124. package/esm/form/form-summary/FormSummaryAnswer.js.map +1 -0
  125. package/esm/form/form-summary/FormSummaryAnswers.d.ts +9 -0
  126. package/esm/{tabs/TabPanel.js → form/form-summary/FormSummaryAnswers.js} +5 -6
  127. package/esm/form/form-summary/FormSummaryAnswers.js.map +1 -0
  128. package/esm/form/form-summary/FormSummaryEditLink.d.ts +17 -0
  129. package/esm/form/form-summary/FormSummaryEditLink.js +20 -0
  130. package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -0
  131. package/esm/form/form-summary/FormSummaryHeader.d.ts +9 -0
  132. package/esm/form/form-summary/FormSummaryHeader.js +19 -0
  133. package/esm/form/form-summary/FormSummaryHeader.js.map +1 -0
  134. package/esm/form/form-summary/FormSummaryHeading.d.ts +14 -0
  135. package/esm/form/form-summary/FormSummaryHeading.js +5 -0
  136. package/esm/form/form-summary/FormSummaryHeading.js.map +1 -0
  137. package/esm/form/form-summary/FormSummaryLabel.d.ts +6 -0
  138. package/esm/form/form-summary/FormSummaryLabel.js +19 -0
  139. package/esm/form/form-summary/FormSummaryLabel.js.map +1 -0
  140. package/esm/form/form-summary/FormSummaryValue.d.ts +6 -0
  141. package/esm/form/form-summary/FormSummaryValue.js +20 -0
  142. package/esm/form/form-summary/FormSummaryValue.js.map +1 -0
  143. package/esm/form/form-summary/index.d.ts +8 -0
  144. package/esm/form/form-summary/index.js +10 -0
  145. package/esm/form/form-summary/index.js.map +1 -0
  146. package/esm/index.d.ts +3 -2
  147. package/esm/index.js +2 -1
  148. package/esm/index.js.map +1 -1
  149. package/esm/tabs/Tabs.context.d.ts +30 -0
  150. package/esm/tabs/Tabs.context.js +10 -0
  151. package/esm/tabs/Tabs.context.js.map +1 -0
  152. package/esm/tabs/Tabs.d.ts +8 -43
  153. package/esm/tabs/Tabs.js +19 -12
  154. package/esm/tabs/Tabs.js.map +1 -1
  155. package/esm/tabs/Tabs.types.d.ts +41 -0
  156. package/esm/tabs/Tabs.types.js +2 -0
  157. package/esm/tabs/Tabs.types.js.map +1 -0
  158. package/esm/tabs/index.d.ts +5 -4
  159. package/esm/tabs/index.js +3 -3
  160. package/esm/tabs/index.js.map +1 -1
  161. package/esm/tabs/parts/tab/Tab.d.ts +25 -0
  162. package/esm/tabs/parts/tab/Tab.js +35 -0
  163. package/esm/tabs/parts/tab/Tab.js.map +1 -0
  164. package/esm/tabs/parts/tab/useTab.d.ts +20 -0
  165. package/esm/tabs/parts/tab/useTab.js +25 -0
  166. package/esm/tabs/parts/tab/useTab.js.map +1 -0
  167. package/esm/tabs/parts/tablist/ScrollButtons.d.ts +8 -0
  168. package/esm/tabs/parts/tablist/ScrollButtons.js +10 -0
  169. package/esm/tabs/parts/tablist/ScrollButtons.js.map +1 -0
  170. package/{cjs/tabs → esm/tabs/parts/tablist}/TabList.d.ts +1 -1
  171. package/esm/tabs/parts/tablist/TabList.js +32 -0
  172. package/esm/tabs/parts/tablist/TabList.js.map +1 -0
  173. package/esm/tabs/parts/tablist/useScrollButtons.d.ts +12 -0
  174. package/esm/tabs/parts/tablist/useScrollButtons.js +57 -0
  175. package/esm/tabs/parts/tablist/useScrollButtons.js.map +1 -0
  176. package/esm/tabs/parts/tablist/useTabList.d.ts +7 -0
  177. package/esm/tabs/parts/tablist/useTabList.js +62 -0
  178. package/esm/tabs/parts/tablist/useTabList.js.map +1 -0
  179. package/esm/tabs/parts/tabpanel/TabPanel.d.ts +25 -0
  180. package/esm/tabs/parts/tabpanel/TabPanel.js +22 -0
  181. package/esm/tabs/parts/tabpanel/TabPanel.js.map +1 -0
  182. package/esm/tabs/parts/tabpanel/useTabPanel.d.ts +12 -0
  183. package/esm/tabs/parts/tabpanel/useTabPanel.js +13 -0
  184. package/esm/tabs/parts/tabpanel/useTabPanel.js.map +1 -0
  185. package/esm/tabs/useTabs.d.ts +14 -0
  186. package/esm/tabs/useTabs.js +39 -0
  187. package/esm/tabs/useTabs.js.map +1 -0
  188. package/esm/toggle-group/ToggleGroup.context.d.ts +31 -0
  189. package/esm/toggle-group/ToggleGroup.context.js +12 -0
  190. package/esm/toggle-group/ToggleGroup.context.js.map +1 -0
  191. package/esm/toggle-group/ToggleGroup.d.ts +5 -36
  192. package/esm/toggle-group/ToggleGroup.js +24 -24
  193. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  194. package/esm/toggle-group/ToggleGroup.types.d.ts +38 -0
  195. package/esm/toggle-group/ToggleGroup.types.js +2 -0
  196. package/esm/toggle-group/ToggleGroup.types.js.map +1 -0
  197. package/esm/toggle-group/index.d.ts +3 -2
  198. package/esm/toggle-group/index.js +1 -1
  199. package/esm/toggle-group/index.js.map +1 -1
  200. package/esm/toggle-group/{ToggleItem.d.ts → parts/ToggleItem.d.ts} +2 -2
  201. package/esm/toggle-group/parts/ToggleItem.js +25 -0
  202. package/esm/toggle-group/parts/ToggleItem.js.map +1 -0
  203. package/esm/toggle-group/parts/useToggleItem.d.ts +20 -0
  204. package/esm/toggle-group/parts/useToggleItem.js +72 -0
  205. package/esm/toggle-group/parts/useToggleItem.js.map +1 -0
  206. package/esm/toggle-group/useToggleGroup.d.ts +8 -0
  207. package/esm/toggle-group/useToggleGroup.js +25 -0
  208. package/esm/toggle-group/useToggleGroup.js.map +1 -0
  209. package/esm/util/hooks/descendants/descendant.js +10 -1
  210. package/esm/util/hooks/descendants/descendant.js.map +1 -1
  211. package/esm/util/hooks/descendants/useDescendant.js +0 -5
  212. package/esm/util/hooks/descendants/useDescendant.js.map +1 -1
  213. package/package.json +15 -6
  214. package/src/date/datepicker/parts/DayButton.tsx +2 -0
  215. package/src/date/hooks/useDatepicker.tsx +5 -1
  216. package/src/date/hooks/useMonthPicker.tsx +5 -1
  217. package/src/date/monthpicker/MonthButton.tsx +1 -0
  218. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +9 -1
  219. package/src/form/combobox/Input/Input.tsx +5 -0
  220. package/src/form/form-summary/FormSummary.tsx +106 -0
  221. package/src/form/form-summary/FormSummaryAnswer.tsx +27 -0
  222. package/src/form/form-summary/FormSummaryAnswers.tsx +25 -0
  223. package/src/form/form-summary/FormSummaryEditLink.tsx +35 -0
  224. package/src/form/form-summary/FormSummaryHeader.tsx +25 -0
  225. package/src/form/form-summary/FormSummaryHeading.tsx +23 -0
  226. package/src/form/form-summary/FormSummaryLabel.tsx +17 -0
  227. package/src/form/form-summary/FormSummaryValue.tsx +24 -0
  228. package/src/form/form-summary/index.ts +30 -0
  229. package/src/index.ts +16 -15
  230. package/src/tabs/Tabs.context.ts +24 -0
  231. package/src/tabs/Tabs.test.tsx +99 -37
  232. package/src/tabs/Tabs.tsx +48 -70
  233. package/src/tabs/Tabs.types.ts +43 -0
  234. package/src/tabs/index.ts +11 -4
  235. package/src/tabs/parts/tab/Tab.tsx +93 -0
  236. package/src/tabs/parts/tab/useTab.ts +52 -0
  237. package/src/tabs/parts/tablist/ScrollButtons.tsx +29 -0
  238. package/src/tabs/parts/tablist/TabList.tsx +56 -0
  239. package/src/tabs/parts/tablist/useScrollButtons.ts +69 -0
  240. package/src/tabs/parts/tablist/useTabList.ts +68 -0
  241. package/src/tabs/parts/tabpanel/TabPanel.tsx +50 -0
  242. package/src/tabs/parts/tabpanel/useTabPanel.ts +18 -0
  243. package/src/tabs/useTabs.ts +51 -0
  244. package/src/toggle-group/ToggleGroup.context.ts +31 -0
  245. package/src/toggle-group/ToggleGroup.test.tsx +57 -16
  246. package/src/toggle-group/ToggleGroup.tsx +63 -90
  247. package/src/toggle-group/ToggleGroup.types.ts +40 -0
  248. package/src/toggle-group/index.ts +3 -2
  249. package/src/toggle-group/parts/ToggleItem.tsx +55 -0
  250. package/src/toggle-group/parts/useToggleItem.ts +104 -0
  251. package/src/toggle-group/useToggleGroup.ts +33 -0
  252. package/src/util/hooks/descendants/descendant.ts +15 -1
  253. package/src/util/hooks/descendants/useDescendant.tsx +0 -5
  254. package/cjs/tabs/Tab.d.ts +0 -18
  255. package/cjs/tabs/Tab.js.map +0 -1
  256. package/cjs/tabs/TabList.js +0 -111
  257. package/cjs/tabs/TabList.js.map +0 -1
  258. package/cjs/tabs/TabPanel.d.ts +0 -13
  259. package/cjs/tabs/TabPanel.js.map +0 -1
  260. package/cjs/tabs/context.d.ts +0 -8
  261. package/cjs/tabs/context.js +0 -6
  262. package/cjs/tabs/context.js.map +0 -1
  263. package/cjs/toggle-group/ToggleItem.js.map +0 -1
  264. package/cjs/toggle-group/context.d.ts +0 -6
  265. package/cjs/toggle-group/context.js +0 -6
  266. package/cjs/toggle-group/context.js.map +0 -1
  267. package/esm/tabs/Tab.d.ts +0 -18
  268. package/esm/tabs/Tab.js +0 -34
  269. package/esm/tabs/Tab.js.map +0 -1
  270. package/esm/tabs/TabList.js +0 -82
  271. package/esm/tabs/TabList.js.map +0 -1
  272. package/esm/tabs/TabPanel.d.ts +0 -13
  273. package/esm/tabs/TabPanel.js.map +0 -1
  274. package/esm/tabs/context.d.ts +0 -8
  275. package/esm/tabs/context.js +0 -3
  276. package/esm/tabs/context.js.map +0 -1
  277. package/esm/toggle-group/ToggleItem.js +0 -24
  278. package/esm/toggle-group/ToggleItem.js.map +0 -1
  279. package/esm/toggle-group/context.d.ts +0 -6
  280. package/esm/toggle-group/context.js +0 -3
  281. package/esm/toggle-group/context.js.map +0 -1
  282. package/src/accordion/accordion.stories.tsx +0 -286
  283. package/src/alert/alert.stories.tsx +0 -306
  284. package/src/button/button.stories.tsx +0 -185
  285. package/src/chat/chat.stories.tsx +0 -341
  286. package/src/chips/chips.stories.tsx +0 -260
  287. package/src/copybutton/copy-button.stories.tsx +0 -261
  288. package/src/date/datepicker/datepicker.stories.tsx +0 -575
  289. package/src/date/monthpicker/monthpicker.stories.tsx +0 -204
  290. package/src/dropdown/dropdown.stories.tsx +0 -124
  291. package/src/expansion-card/expansion-card.stories.tsx +0 -282
  292. package/src/form/checkbox/checkbox.stories.tsx +0 -281
  293. package/src/form/combobox/combobox.stories.tsx +0 -626
  294. package/src/form/confirmation-panel/confirmation-panel.stories.tsx +0 -128
  295. package/src/form/error-summary/error-summary.stories.tsx +0 -81
  296. package/src/form/fieldset/fieldset.stories.tsx +0 -157
  297. package/src/form/file-upload/file-upload-dropzone.stories.tsx +0 -123
  298. package/src/form/file-upload/file-upload-item.stories.tsx +0 -148
  299. package/src/form/file-upload/file-upload.stories.tsx +0 -248
  300. package/src/form/radio/radio.stories.tsx +0 -230
  301. package/src/form/search/search.stories.tsx +0 -238
  302. package/src/form/select/select.stories.tsx +0 -172
  303. package/src/form/switch/switch.stories.tsx +0 -171
  304. package/src/form/textarea/textarea.stories.tsx +0 -254
  305. package/src/form/textfield/text-field.stories.tsx +0 -143
  306. package/src/guide-panel/guidepanel.stories.tsx +0 -90
  307. package/src/help-text/help-text.stories.tsx +0 -91
  308. package/src/internal-header/header.stories.tsx +0 -229
  309. package/src/layout/bleed/Bleed.stories.tsx +0 -395
  310. package/src/layout/box/Box.stories.tsx +0 -380
  311. package/src/layout/grid/h-grid.stories.tsx +0 -122
  312. package/src/layout/page/Page.stories.tsx +0 -271
  313. package/src/layout/responsive/hide.stories.tsx +0 -80
  314. package/src/layout/responsive/show.stories.tsx +0 -80
  315. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +0 -69
  316. package/src/layout/stack/stack.stories.tsx +0 -183
  317. package/src/link/stories/link.stories.tsx +0 -304
  318. package/src/link-panel/link-panel.stories.tsx +0 -59
  319. package/src/list/list.stories.tsx +0 -280
  320. package/src/loader/loader.stories.tsx +0 -82
  321. package/src/modal/modal.stories.tsx +0 -395
  322. package/src/pagination/pagination.stories.tsx +0 -110
  323. package/src/popover/popover.stories.tsx +0 -113
  324. package/src/portal/Portal.stories.tsx +0 -102
  325. package/src/read-more/readmore.stories.tsx +0 -91
  326. package/src/skeleton/skeleton.stories.tsx +0 -130
  327. package/src/stepper/stepper.stories.tsx +0 -200
  328. package/src/table/stories/table-1.stories.tsx +0 -292
  329. package/src/table/stories/table-2-expandable.stories.tsx +0 -298
  330. package/src/table/stories/table-3-async.stories.tsx +0 -179
  331. package/src/table/stories/tests/table.stories.tsx +0 -102
  332. package/src/tabs/Tab.tsx +0 -66
  333. package/src/tabs/TabList.tsx +0 -128
  334. package/src/tabs/TabPanel.tsx +0 -26
  335. package/src/tabs/Tabs.stories.tsx +0 -191
  336. package/src/tabs/context.ts +0 -9
  337. package/src/tag/tag.stories.tsx +0 -126
  338. package/src/timeline/timeline.stories.tsx +0 -445
  339. package/src/toggle-group/ToggleGroup.stories.tsx +0 -137
  340. package/src/toggle-group/ToggleItem.tsx +0 -41
  341. package/src/toggle-group/context.ts +0 -9
  342. package/src/tooltip/tooltip.stories.tsx +0 -101
  343. package/src/typography/stories/bodylong.stories.tsx +0 -209
  344. package/src/typography/stories/bodyshort.stories.tsx +0 -208
  345. package/src/typography/stories/detail.stories.tsx +0 -115
  346. package/src/typography/stories/error-message.stories.tsx +0 -122
  347. package/src/typography/stories/heading.stories.tsx +0 -169
  348. package/src/typography/stories/label.stories.tsx +0 -131
  349. package/src/util/hooks/descendants/descendant.stories.tsx +0 -147
@@ -0,0 +1,69 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ import { debounce } from "../../../util";
3
+
4
+ export function useScrollButtons(listRef: React.RefObject<HTMLDivElement>) {
5
+ const [displayScroll, setDisplayScroll] = useState({
6
+ start: false,
7
+ end: false,
8
+ });
9
+
10
+ const updateScrollButtonState = useMemo(
11
+ () =>
12
+ debounce(() => {
13
+ if (!listRef?.current) return;
14
+ const { scrollWidth, clientWidth } = listRef.current;
15
+ const scrollLeft = listRef.current.scrollLeft;
16
+ // use 1 for the potential rounding error with browser zooms.
17
+ const showStartScroll = scrollLeft > 1;
18
+ const showEndScroll = scrollLeft < scrollWidth - clientWidth - 1;
19
+
20
+ setDisplayScroll((oldDisplayScroll) =>
21
+ showStartScroll === oldDisplayScroll.start &&
22
+ showEndScroll === oldDisplayScroll.end
23
+ ? oldDisplayScroll
24
+ : { start: showStartScroll, end: showEndScroll },
25
+ );
26
+ }),
27
+ [listRef],
28
+ );
29
+
30
+ useEffect(() => {
31
+ const handleResize = () => updateScrollButtonState();
32
+ const win = listRef.current?.ownerDocument ?? document ?? window;
33
+ win.addEventListener("resize", handleResize);
34
+
35
+ let resizeObserver;
36
+
37
+ if (typeof ResizeObserver !== "undefined") {
38
+ resizeObserver = new ResizeObserver(handleResize);
39
+ resizeObserver.observe(listRef.current);
40
+ }
41
+
42
+ return () => {
43
+ win.removeEventListener("resize", handleResize);
44
+ resizeObserver && resizeObserver.disconnect();
45
+ updateScrollButtonState.clear();
46
+ };
47
+ }, [listRef, updateScrollButtonState]);
48
+
49
+ useEffect(() => {
50
+ updateScrollButtonState();
51
+ });
52
+
53
+ return {
54
+ update: updateScrollButtonState,
55
+ start: displayScroll.start,
56
+ end: displayScroll.end,
57
+ show: displayScroll.end || displayScroll.start,
58
+ scrollLeft: () => {
59
+ if (listRef.current) {
60
+ listRef.current.scrollLeft -= 100;
61
+ }
62
+ },
63
+ scrollRight: () => {
64
+ if (listRef.current) {
65
+ listRef.current.scrollLeft += 100;
66
+ }
67
+ },
68
+ };
69
+ }
@@ -0,0 +1,68 @@
1
+ import { useCallback } from "react";
2
+ import { useTabsContext, useTabsDescendantsContext } from "../../Tabs.context";
3
+
4
+ /**
5
+ * TabList hook to manage multiple tab buttons,
6
+ * and ensures only one tab is selected at a time.
7
+ */
8
+ export function useTabList() {
9
+ const { focusedValue, loop, selectedValue, setFocusedValue } =
10
+ useTabsContext();
11
+
12
+ const descendants = useTabsDescendantsContext();
13
+
14
+ /**
15
+ * Implements rowing-tabindex for horizontal tabs
16
+ */
17
+ const onKeyDown = useCallback(
18
+ (event: React.KeyboardEvent) => {
19
+ /**
20
+ * Tabs.Tab is registered with its prop 'value'.
21
+ * We can then use it to find the current focuses descendant
22
+ */
23
+ const idx = descendants
24
+ .values()
25
+ .findIndex((x) => x.value === focusedValue);
26
+
27
+ const nextTab = () => {
28
+ const next = descendants.nextEnabled(idx, loop);
29
+ next && next.node?.focus();
30
+ };
31
+ const prevTab = () => {
32
+ const prev = descendants.prevEnabled(idx, loop);
33
+ prev && prev.node?.focus();
34
+ };
35
+ const firstTab = () => {
36
+ const first = descendants.firstEnabled();
37
+ first && first.node?.focus();
38
+ };
39
+ const lastTab = () => {
40
+ const last = descendants.lastEnabled();
41
+ last && last.node?.focus();
42
+ };
43
+
44
+ const keyMap: Record<string, React.KeyboardEventHandler> = {
45
+ ArrowLeft: prevTab,
46
+ ArrowRight: nextTab,
47
+ Home: firstTab,
48
+ End: lastTab,
49
+ };
50
+
51
+ const action = keyMap[event.key];
52
+
53
+ if (action) {
54
+ event.preventDefault();
55
+ action(event);
56
+ } else if (event.key === "Tab") {
57
+ /**
58
+ * Imperative focus during keydown is risky so we prevent React's batching updates
59
+ * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
60
+ */
61
+ selectedValue && setTimeout(() => setFocusedValue(selectedValue));
62
+ }
63
+ },
64
+ [descendants, focusedValue, loop, selectedValue, setFocusedValue],
65
+ );
66
+
67
+ return { onKeyDown };
68
+ }
@@ -0,0 +1,50 @@
1
+ import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
+ import { useTabPanel } from "./useTabPanel";
4
+
5
+ export interface TabPanelProps extends React.HTMLAttributes<HTMLDivElement> {
6
+ /**
7
+ * Tab panel content.
8
+ */
9
+ children: React.ReactNode;
10
+ /**
11
+ * Value for state-handling.
12
+ */
13
+ value: string;
14
+ /**
15
+ * If true, will only render children when selected.
16
+ * @default true
17
+ */
18
+ lazy?: boolean;
19
+ /**
20
+ * Overrides auto-generated id.
21
+ *
22
+ * **Warning**: TabPanel generates an id if not provided. If you need to override it,
23
+ * make sure to also include the correct `aria-labelledby` id for the Tab that labels it.
24
+ */
25
+ id?: string;
26
+ }
27
+
28
+ const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(
29
+ ({ className, value, children, lazy = true, id, ...rest }, ref) => {
30
+ const ctx = useTabPanel({ value });
31
+
32
+ return (
33
+ <div
34
+ ref={ref}
35
+ {...rest}
36
+ className={cl("navds-tabs__tabpanel", className)}
37
+ role="tabpanel"
38
+ tabIndex={0}
39
+ aria-labelledby={rest["aria-labelledby"] ?? ctx.labelledbyId}
40
+ id={id ?? ctx.id}
41
+ hidden={ctx.hidden}
42
+ data-state={!ctx.hidden ? "active" : "inactive"}
43
+ >
44
+ {lazy && ctx.hidden ? null : children}
45
+ </div>
46
+ );
47
+ },
48
+ );
49
+
50
+ export default TabPanel;
@@ -0,0 +1,18 @@
1
+ import { useTabsContext } from "../../Tabs.context";
2
+
3
+ type TabPanelProps = {
4
+ value: string;
5
+ };
6
+
7
+ /**
8
+ * Tabs hook for managing the visible/hidden state of Tabs.Panel
9
+ */
10
+ export function useTabPanel({ value }: TabPanelProps) {
11
+ const { id, selectedValue, makeTabId, makeTabPanelId } = useTabsContext();
12
+
13
+ return {
14
+ labelledbyId: makeTabId(id, value),
15
+ hidden: selectedValue !== value,
16
+ id: makeTabPanelId(id, value),
17
+ };
18
+ }
@@ -0,0 +1,51 @@
1
+ import { useEffect, useState } from "react";
2
+ import { useId } from "../util";
3
+ import { useControllableState } from "../util/hooks/useControllableState";
4
+ import { TabsProps } from "./Tabs.types";
5
+
6
+ export function useTabs({
7
+ onChange,
8
+ value,
9
+ defaultValue = "",
10
+ id,
11
+ }: Pick<TabsProps, "onChange" | "value" | "defaultValue" | "id">) {
12
+ const [focusedValue, setFocusedValue] = useState(defaultValue);
13
+
14
+ const [selectedValue, setSelectedValue] = useControllableState({
15
+ defaultValue,
16
+ value,
17
+ onChange,
18
+ });
19
+
20
+ /**
21
+ * Sync focused `value` with controlled `selectedValue`
22
+ */
23
+ useEffect(() => {
24
+ if (value != null) {
25
+ setFocusedValue(value);
26
+ }
27
+ }, [value]);
28
+
29
+ /**
30
+ * Scope ids for better tracking
31
+ */
32
+ const uuid = useId();
33
+
34
+ return {
35
+ id: `tabs-${id ?? uuid}`,
36
+ selectedValue,
37
+ setSelectedValue,
38
+ focusedValue,
39
+ setFocusedValue,
40
+ makeTabId,
41
+ makeTabPanelId,
42
+ };
43
+ }
44
+
45
+ function makeTabId(id: string, value: string) {
46
+ return `${id}--tab-${value}`;
47
+ }
48
+
49
+ function makeTabPanelId(id: string, value: string) {
50
+ return `${id}--tabpanel-${value}`;
51
+ }
@@ -0,0 +1,31 @@
1
+ import { createContext as ReactCreateContext } from "react";
2
+ import { createContext } from "../util/create-context";
3
+ import { createDescendantContext } from "../util/hooks/descendants/useDescendant";
4
+ import { ToggleGroupProps } from "./ToggleGroup.types";
5
+ import { useToggleGroup } from "./useToggleGroup";
6
+
7
+ interface ToggleContextProps {
8
+ size: "medium" | "small";
9
+ }
10
+
11
+ export const ToggleGroupContext = ReactCreateContext<ToggleContextProps | null>(
12
+ null,
13
+ );
14
+
15
+ export const [
16
+ ToggleGroupDescendantsProvider,
17
+ useToggleGroupDescendantsContext,
18
+ useToggleGroupDescendants,
19
+ useToggleGroupDescendant,
20
+ ] = createDescendantContext<HTMLButtonElement, { value: string }>();
21
+
22
+ type ToggleGroupProviderProps = ReturnType<typeof useToggleGroup> &
23
+ Pick<ToggleGroupProps, "size">;
24
+
25
+ /* State context */
26
+ export const [ToggleGroupProvider, useToggleGroupContext] =
27
+ createContext<ToggleGroupProviderProps>({
28
+ name: "ToggleGroupContext",
29
+ hookName: "useToggleGroupContext",
30
+ providerName: "ToggleGroupProvider",
31
+ });
@@ -1,4 +1,5 @@
1
- import { fireEvent, render, screen } from "@testing-library/react";
1
+ import { act, fireEvent, render, screen } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
2
3
  import React from "react";
3
4
  import { describe, expect, test } from "vitest";
4
5
  import { ToggleGroup } from "./ToggleGroup";
@@ -20,36 +21,76 @@ const TestToggleGroup = ({ value, onChange, defaultValue }: any) => (
20
21
  describe("ToggleGroup", () => {
21
22
  test("sets default value correctly", () => {
22
23
  render(<TestToggleGroup defaultValue="toggle2" />);
23
- const toggle = screen.getByTestId("toggle2");
24
+ const toggle2 = screen.getByTestId("toggle2");
24
25
 
25
- expect(toggle).toHaveAttribute("aria-checked", "true");
26
+ expect(toggle2).toHaveAttribute("aria-checked", "true");
26
27
  });
27
28
 
28
29
  test("sets correct attributes on active toggle", () => {
29
30
  render(<TestToggleGroup defaultValue="toggle2" />);
30
- const toggle = screen.getByTestId("toggle2");
31
+ const toggle2 = screen.getByTestId("toggle2");
31
32
 
32
- expect(toggle).toHaveAttribute("aria-checked", "true");
33
- expect(toggle).toHaveAttribute("role", "radio");
34
- expect(toggle).toHaveAttribute("type", "button");
35
- expect(toggle).toHaveAttribute("tabindex", "-1");
33
+ expect(toggle2).toHaveAttribute("aria-checked", "true");
34
+ expect(toggle2).toHaveAttribute("role", "radio");
35
+ expect(toggle2).toHaveAttribute("type", "button");
36
+ expect(toggle2).toHaveAttribute("tabindex", "0");
36
37
  });
37
38
 
38
39
  test("sets correct attributes on idle toggle", () => {
39
40
  render(<TestToggleGroup defaultValue="toggle1" />);
40
- const toggle = screen.getByTestId("toggle2");
41
+ const toggle2 = screen.getByTestId("toggle2");
41
42
 
42
- expect(toggle).toHaveAttribute("aria-checked", "false");
43
- expect(toggle).toHaveAttribute("role", "radio");
44
- expect(toggle).toHaveAttribute("type", "button");
45
- expect(toggle).toHaveAttribute("tabindex", "-1");
43
+ expect(toggle2).toHaveAttribute("aria-checked", "false");
44
+ expect(toggle2).toHaveAttribute("role", "radio");
45
+ expect(toggle2).toHaveAttribute("type", "button");
46
+ expect(toggle2).toHaveAttribute("tabindex", "-1");
46
47
  });
47
48
 
48
49
  test("sets tabindex to 0 when focused", () => {
49
50
  render(<TestToggleGroup defaultValue="toggle2" />);
50
- const toggle = screen.getByTestId("toggle2");
51
+ const toggle2 = screen.getByTestId("toggle2");
51
52
 
52
- fireEvent.focus(toggle);
53
- expect(toggle).toHaveAttribute("tabindex", "0");
53
+ fireEvent.focus(toggle2);
54
+ expect(toggle2).toHaveAttribute("tabindex", "0");
55
+ });
56
+
57
+ test("roving tabindex keydown moves focus", () => {
58
+ render(<TestToggleGroup defaultValue="toggle1" />);
59
+ const toggle1 = screen.getByTestId("toggle1");
60
+
61
+ expect(toggle1).toHaveAttribute("tabindex", "0");
62
+ fireEvent.keyDown(toggle1, { key: "ArrowRight" });
63
+
64
+ expect(toggle1).toHaveAttribute("tabindex", "-1");
65
+ expect(screen.getByTestId("toggle2")).toHaveAttribute("tabindex", "0");
66
+ expect(screen.getByTestId("toggle2")).toHaveAttribute(
67
+ "aria-checked",
68
+ "false",
69
+ );
70
+ });
71
+
72
+ test("Space selects focused toggle-item", async () => {
73
+ render(<TestToggleGroup defaultValue="toggle1" />);
74
+ const toggle1 = screen.getByTestId("toggle1");
75
+
76
+ expect(toggle1).toHaveAttribute("tabindex", "0");
77
+ fireEvent.keyDown(toggle1, { key: "ArrowRight" });
78
+
79
+ expect(toggle1).toHaveAttribute("tabindex", "-1");
80
+ expect(screen.getByTestId("toggle2")).toHaveAttribute("tabindex", "0");
81
+ expect(screen.getByTestId("toggle2")).toHaveAttribute(
82
+ "aria-checked",
83
+ "false",
84
+ );
85
+
86
+ // eslint-disable-next-line testing-library/no-unnecessary-act
87
+ await act(async () => {
88
+ await userEvent.keyboard(" ");
89
+ });
90
+
91
+ expect(screen.getByTestId("toggle2")).toHaveAttribute(
92
+ "aria-checked",
93
+ "true",
94
+ );
54
95
  });
55
96
  });
@@ -1,55 +1,24 @@
1
- import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
2
1
  import cl from "clsx";
3
- import React, { HTMLAttributes, forwardRef, useState } from "react";
2
+ import React, { forwardRef } from "react";
4
3
  import { Label } from "../typography";
5
- import { useId } from "../util/hooks";
6
- import ToggleItem, { ToggleGroupItemProps } from "./ToggleItem";
7
- import { ToggleGroupContext } from "./context";
8
-
9
- export interface ToggleGroupProps
10
- extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "dir"> {
11
- /**
12
- * Toggles.Item elements
13
- */
14
- children: React.ReactNode;
15
- /**
16
- * Changes padding and font-size
17
- * @default "medium"
18
- */
19
- size?: "medium" | "small";
20
- /**
21
- * Controlled selected value
22
- */
23
- value?: string;
24
- /**
25
- * If not controlled, a default-value needs to be set
26
- */
27
- defaultValue?: string;
28
- /**
29
- * Callback for selected toggle
30
- */
31
- onChange: (value: string) => void;
32
- /**
33
- * Label describing ToggleGroup
34
- */
35
- label?: React.ReactNode;
36
- /**
37
- * Changes design and interaction-visuals
38
- * @default "action"
39
- */
40
- variant?: "action" | "neutral";
41
- }
4
+ import { useId } from "../util";
5
+ import {
6
+ ToggleGroupDescendantsProvider,
7
+ ToggleGroupProvider,
8
+ useToggleGroupDescendants,
9
+ } from "./ToggleGroup.context";
10
+ import { ToggleGroupProps } from "./ToggleGroup.types";
11
+ import ToggleItem from "./parts/ToggleItem";
12
+ import { useToggleGroup } from "./useToggleGroup";
42
13
 
43
14
  interface ToggleGroupComponent
44
15
  extends React.ForwardRefExoticComponent<
45
16
  ToggleGroupProps & React.RefAttributes<HTMLDivElement>
46
17
  > {
47
18
  /**
48
- * @see 🏷️ {@link ToggleGroupItemProps}
19
+ * @see 🏷️ {@link ToggleItem}
49
20
  */
50
- Item: React.ForwardRefExoticComponent<
51
- ToggleGroupItemProps & React.RefAttributes<HTMLButtonElement>
52
- >;
21
+ Item: typeof ToggleItem;
53
22
  }
54
23
 
55
24
  /**
@@ -77,70 +46,74 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
77
46
  label,
78
47
  value,
79
48
  defaultValue,
80
- "aria-describedby": desc,
49
+ "aria-describedby": userDescribedby,
81
50
  variant = "action",
51
+ fill = false,
82
52
  ...rest
83
53
  },
84
54
  ref,
85
55
  ) => {
86
- const [groupValue, setGroupValue] = useState(defaultValue);
87
- const labelId = useId();
56
+ const descendants = useToggleGroupDescendants();
57
+
58
+ const toggleGroupContext = useToggleGroup({
59
+ defaultValue,
60
+ value,
61
+ onChange,
62
+ });
88
63
 
89
- const handleValueChange = (v: string) => {
90
- if (v !== "") {
91
- setGroupValue(v);
92
- onChange?.(v);
93
- }
64
+ /**
65
+ * ToggleGroupProvider handles memoization.
66
+ */
67
+ const context = {
68
+ ...toggleGroupContext,
69
+ size,
94
70
  };
95
71
 
72
+ const labelId = useId();
73
+
96
74
  if (!value && !defaultValue) {
97
- console.error("ToggleGroup without value/defaultvalue is not allowed");
75
+ console.error("ToggleGroup without value or defaultvalue is not allowed");
98
76
  }
99
77
 
100
- const describeBy = cl({
101
- [desc ?? ""]: !!desc,
102
- [labelId ?? ""]: !!label,
103
- });
104
-
105
78
  if (!value && !defaultValue) {
106
79
  console.error("ToggleGroup needs either a value or defaultValue");
107
80
  }
108
81
 
109
82
  return (
110
- <ToggleGroupContext.Provider
111
- value={{
112
- size,
113
- }}
114
- >
115
- <div className={cl("navds-toggle-group__wrapper", className)}>
116
- {label && (
117
- <Label
118
- size={size}
119
- className="navds-toggle-group__label"
120
- id={labelId}
121
- >
122
- {label}
123
- </Label>
124
- )}
125
- <RadixToggleGroup.Root
126
- {...rest}
127
- onValueChange={handleValueChange}
128
- value={value ?? groupValue}
129
- defaultValue={defaultValue}
130
- ref={ref}
131
- className={cl(
132
- "navds-toggle-group",
133
- `navds-toggle-group--${size}`,
134
- `navds-toggle-group--${variant}`,
135
- )}
136
- {...(describeBy && { "aria-describedby": describeBy })}
137
- role="radiogroup"
138
- type="single"
83
+ <ToggleGroupDescendantsProvider value={descendants}>
84
+ <ToggleGroupProvider {...context}>
85
+ <div
86
+ className={cl("navds-toggle-group__wrapper", className, {
87
+ "navds-toggle-group__wrapper--fill": fill,
88
+ })}
139
89
  >
140
- {children}
141
- </RadixToggleGroup.Root>
142
- </div>
143
- </ToggleGroupContext.Provider>
90
+ {label && (
91
+ <Label
92
+ size={size}
93
+ className="navds-toggle-group__label"
94
+ id={labelId}
95
+ >
96
+ {label}
97
+ </Label>
98
+ )}
99
+ <div
100
+ {...rest}
101
+ ref={ref}
102
+ className={cl(
103
+ "navds-toggle-group",
104
+ `navds-toggle-group--${size}`,
105
+ `navds-toggle-group--${variant}`,
106
+ )}
107
+ aria-describedby={
108
+ cl(userDescribedby, !!label && labelId) || undefined
109
+ }
110
+ role="radiogroup"
111
+ >
112
+ {children}
113
+ </div>
114
+ </div>
115
+ </ToggleGroupProvider>
116
+ </ToggleGroupDescendantsProvider>
144
117
  );
145
118
  },
146
119
  ) as ToggleGroupComponent;
@@ -0,0 +1,40 @@
1
+ import { HTMLAttributes } from "react";
2
+
3
+ export interface ToggleGroupProps
4
+ extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "dir"> {
5
+ /**
6
+ * Toggles.Item elements.
7
+ */
8
+ children: React.ReactNode;
9
+ /**
10
+ * Changes padding and font-size.
11
+ * @default "medium"
12
+ */
13
+ size?: "medium" | "small";
14
+ /**
15
+ * Controlled selected value.
16
+ */
17
+ value?: string;
18
+ /**
19
+ * If not controlled, a default-value needs to be set.
20
+ */
21
+ defaultValue?: string;
22
+ /**
23
+ * Callback for selected toggle.
24
+ */
25
+ onChange: (value: string) => void;
26
+ /**
27
+ * Label describing ToggleGroup.
28
+ */
29
+ label?: React.ReactNode;
30
+ /**
31
+ * Changes design and interaction-visuals.
32
+ * @default "action"
33
+ */
34
+ variant?: "action" | "neutral";
35
+ /**
36
+ * Stretch each button to fill avaliable space in container.
37
+ * @default false
38
+ */
39
+ fill?: boolean;
40
+ }
@@ -1,6 +1,7 @@
1
1
  "use client";
2
- export { default as ToggleGroup, type ToggleGroupProps } from "./ToggleGroup";
2
+ export { default as ToggleGroup } from "./ToggleGroup";
3
+ export { type ToggleGroupProps } from "./ToggleGroup.types";
3
4
  export {
4
5
  default as ToggleGroupItem,
5
6
  type ToggleGroupItemProps,
6
- } from "./ToggleItem";
7
+ } from "./parts/ToggleItem";
@@ -0,0 +1,55 @@
1
+ import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
+ import { BodyShort } from "../../typography/BodyShort";
4
+ import { useToggleGroupContext } from "../ToggleGroup.context";
5
+ import { useToggleItem } from "./useToggleItem";
6
+
7
+ export interface ToggleGroupItemProps
8
+ extends React.HTMLAttributes<HTMLButtonElement> {
9
+ /**
10
+ * Content.
11
+ */
12
+ children: React.ReactNode;
13
+ /**
14
+ * Value for state-handling.
15
+ */
16
+ value: string;
17
+ }
18
+
19
+ const ToggleItem = forwardRef<HTMLButtonElement, ToggleGroupItemProps>(
20
+ (
21
+ { className, children, value, onClick, onFocus, onKeyDown, ...rest },
22
+ forwardedRef,
23
+ ) => {
24
+ const itemCtx = useToggleItem(
25
+ { value, onClick, onFocus, disabled: false, onKeyDown },
26
+ forwardedRef,
27
+ );
28
+ const ctx = useToggleGroupContext();
29
+
30
+ return (
31
+ <button
32
+ {...rest}
33
+ ref={itemCtx.ref}
34
+ className={cl("navds-toggle-group__button", className)}
35
+ type="button"
36
+ role="radio"
37
+ aria-checked={itemCtx.isSelected}
38
+ tabIndex={itemCtx.isFocused ? 0 : -1}
39
+ onClick={itemCtx.onClick}
40
+ onFocus={itemCtx.onFocus}
41
+ onKeyDown={itemCtx.onKeyDown}
42
+ >
43
+ <BodyShort
44
+ as="span"
45
+ className="navds-toggle-group__button-inner"
46
+ size={ctx?.size}
47
+ >
48
+ {children}
49
+ </BodyShort>
50
+ </button>
51
+ );
52
+ },
53
+ );
54
+
55
+ export default ToggleItem;