uikit-react-public 0.14.21 → 0.21.8

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 (392) hide show
  1. package/README.md +2 -2
  2. package/dist/components/Accordion/Accordion.Heading.d.ts +5 -4
  3. package/dist/components/Accordion/Accordion.Panel.d.ts +2 -2
  4. package/dist/components/Accordion/Accordion.d.ts +1 -1
  5. package/dist/components/Accordion/Accordion.stories.d.ts +57 -0
  6. package/dist/components/Accordion/index.d.ts +2 -0
  7. package/dist/components/AppHeader/AppHeader.d.ts +1 -1
  8. package/dist/components/AppHeader/AppHeaderBottom.d.ts +1 -1
  9. package/dist/components/AppHeader/AppHeaderNav.d.ts +1 -1
  10. package/dist/components/AppHeader/AppHeaderTop.d.ts +1 -1
  11. package/dist/components/Avatar/Avatar.stories.d.ts +107 -1
  12. package/dist/components/Breadcrumbs/Breadcrumb.d.ts +3 -4
  13. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  14. package/dist/components/Breadcrumbs/Breadcrumbs.stories.d.ts +1 -1
  15. package/dist/components/Button/Button.d.ts +8 -3
  16. package/dist/components/Button/Button.stories.d.ts +17 -7
  17. package/dist/components/Button/style/buttonAccentStyle.d.ts +4 -0
  18. package/dist/components/Button/style/buttonPrimaryDestructiveStyle.d.ts +4 -0
  19. package/dist/components/Button/style/buttonPrimaryStyle.d.ts +4 -0
  20. package/dist/components/Button/style/buttonPrimarySubtleStyle.d.ts +4 -0
  21. package/dist/components/Button/style/buttonPrimaryWarningStyle.d.ts +4 -0
  22. package/dist/components/Button/style/buttonSecondaryDestructiveStyle.d.ts +4 -0
  23. package/dist/components/Button/style/buttonSecondaryStyle.d.ts +4 -0
  24. package/dist/components/Button/style/buttonSecondarySubtleStyle.d.ts +4 -0
  25. package/dist/components/Button/style/buttonTertiaryDestructiveStyle.d.ts +4 -0
  26. package/dist/components/Button/style/buttonTertiaryNoPaddingStyle.d.ts +4 -0
  27. package/dist/components/Button/style/buttonTertiaryStyle.d.ts +4 -0
  28. package/dist/components/Calendar/index.d.ts +1 -1
  29. package/dist/components/Checkbox/Checkbox.d.ts +1 -0
  30. package/dist/components/Datepicker/Datepicker.d.ts +1 -1
  31. package/dist/components/Datepicker/Datepicker.stories.d.ts +4 -3
  32. package/dist/components/Datepicker/Datepicker.types.d.ts +4 -5
  33. package/dist/components/Datepicker/subcomponents/CustomDatepicker.d.ts +4 -1
  34. package/dist/components/Datepicker/subcomponents/DatepickerInput.d.ts +15 -2
  35. package/dist/components/Datepicker/subcomponents/Panel.d.ts +1 -1
  36. package/dist/components/Datepicker/subcomponents/VisibleField.d.ts +6 -1
  37. package/dist/components/Datepicker/subcomponents/index.d.ts +0 -1
  38. package/dist/components/Datepicker/utils/index.d.ts +0 -1
  39. package/dist/components/Dialog/BaseDialog.d.ts +2 -1
  40. package/dist/components/Dialog/Dialog.d.ts +2 -0
  41. package/dist/components/FooterNew/BackToTop.d.ts +8 -0
  42. package/dist/components/FooterNew/Footer.d.ts +23 -0
  43. package/dist/components/FooterNew/FooterColumn.d.ts +8 -0
  44. package/dist/components/FooterNew/FooterLinks.d.ts +7 -0
  45. package/dist/components/FooterNew/FooterNavLink.d.ts +8 -0
  46. package/dist/components/FooterNew/LegalAndCopyright.d.ts +14 -0
  47. package/dist/components/FooterNew/LogoAddressAndSocial.d.ts +10 -0
  48. package/dist/components/FooterNew/SocialLink.d.ts +8 -0
  49. package/dist/components/FooterNew/index.d.ts +2 -0
  50. package/dist/components/Header/Header.d.ts +4 -1
  51. package/dist/components/Header/Header.stories.d.ts +40 -0
  52. package/dist/components/HeaderNew/Header.d.ts +18 -0
  53. package/dist/components/HeaderNew/HeaderBorder.d.ts +7 -0
  54. package/dist/components/HeaderNew/HeaderLogo.d.ts +9 -0
  55. package/dist/components/HeaderNew/HeaderMenuContainer.d.ts +7 -0
  56. package/dist/components/HeaderNew/HeaderTitle.d.ts +9 -0
  57. package/dist/components/HeaderNew/__tests__/Header.test.d.ts +1 -0
  58. package/dist/components/HeaderNew/constants.d.ts +3 -0
  59. package/dist/components/HeaderNew/index.d.ts +3 -0
  60. package/dist/components/HeadingNew/Heading.d.ts +13 -0
  61. package/dist/components/HeadingNew/index.d.ts +2 -0
  62. package/dist/components/Icon/svgImports.d.ts +7 -881
  63. package/dist/components/Link/BaseLink.d.ts +14 -5
  64. package/dist/components/Link/Link.d.ts +8 -3
  65. package/dist/components/Link/Link.stories.d.ts +3 -1
  66. package/dist/components/Main/Main.d.ts +21 -0
  67. package/dist/components/Main/Main.stories.d.ts +15 -0
  68. package/dist/components/Main/__tests__/Main.test.d.ts +1 -0
  69. package/dist/components/Main/index.d.ts +2 -0
  70. package/dist/components/MenuNew/Menu.context.d.ts +14 -0
  71. package/dist/components/MenuNew/Menu.d.ts +20 -0
  72. package/dist/components/MenuNew/MenuContent.d.ts +9 -0
  73. package/dist/components/MenuNew/MenuItem.d.ts +10 -0
  74. package/dist/components/MenuNew/MenuSection.d.ts +7 -0
  75. package/dist/components/MenuNew/index.d.ts +6 -0
  76. package/dist/components/MenuNew/trigger/ButtonMenuTrigger.d.ts +8 -0
  77. package/dist/components/MenuNew/trigger/IconMenuTrigger.d.ts +8 -0
  78. package/dist/components/NativeDatepicker/NativeDatepicker.d.ts +3 -0
  79. package/dist/components/NativeDatepicker/NativeDatepicker.stories.d.ts +36 -0
  80. package/dist/components/NativeDatepicker/NativeDatepicker.types.d.ts +10 -0
  81. package/dist/components/NativeDatepicker/index.d.ts +2 -0
  82. package/dist/components/{Datepicker → NativeDatepicker}/utils/dateToLocaleISOString/dateToLocaleISOString.d.ts +1 -1
  83. package/dist/components/NativeDatepicker/utils/dateToLocaleISOString/dateToLocaleISOString.test.d.ts +1 -0
  84. package/dist/components/NativeDatepicker/utils/index.d.ts +1 -0
  85. package/dist/components/Overlay/Overlay.stories.d.ts +12 -12
  86. package/dist/components/ParagraphNew/Paragraph.d.ts +13 -0
  87. package/dist/components/ParagraphNew/index.d.ts +4 -0
  88. package/dist/components/Select/Select.d.ts +2 -1
  89. package/dist/components/Select/Select.stories.d.ts +167 -3
  90. package/dist/components/Select/Select.types.d.ts +75 -19
  91. package/dist/components/Select/subcomponents/CustomOption.d.ts +1 -1
  92. package/dist/components/Select/subcomponents/CustomSelect.d.ts +3 -2
  93. package/dist/components/Select/subcomponents/FilterInput.d.ts +16 -0
  94. package/dist/components/Select/subcomponents/NativeSelect.d.ts +5 -1
  95. package/dist/components/Select/subcomponents/VisibleField.d.ts +6 -1
  96. package/dist/components/Select/subcomponents/index.d.ts +1 -0
  97. package/dist/components/Spinner/Spinner.d.ts +2 -0
  98. package/dist/components/StandaloneLink/StandaloneLink.d.ts +8 -5
  99. package/dist/components/StandaloneLink/StandaloneLink.stories.d.ts +3 -1
  100. package/dist/components/Table/Table.d.ts +3 -3
  101. package/dist/components/Table/Table.stories.d.ts +3 -3
  102. package/dist/components/Table/Table.types.d.ts +1 -0
  103. package/dist/components/Table/subcomponents/Cell/Cell.d.ts +5 -1
  104. package/dist/components/Table/subcomponents/Cell/Cell.stories.d.ts +15 -13
  105. package/dist/components/Table/subcomponents/Cell/CellContent.d.ts +5 -1
  106. package/dist/components/Table/subcomponents/HeadCell/HeadCell.d.ts +2 -1
  107. package/dist/components/Table/subcomponents/HeadCell/HeadCell.stories.d.ts +14 -13
  108. package/dist/components/Table/subcomponents/HeadCell/HeadCellContent.d.ts +2 -1
  109. package/dist/components/Table/subcomponents/__tests__/Row.test.d.ts +1 -0
  110. package/dist/components/UclLogoNew/UclLogo.d.ts +8 -0
  111. package/dist/components/UclLogoNew/index.d.ts +2 -0
  112. package/dist/components/WeekPicker/WeekPicker.d.ts +2 -2
  113. package/dist/components/WeekPicker/WeekPicker.stories.d.ts +41 -0
  114. package/dist/components/WeekPicker/WeekPicker.types.d.ts +16 -0
  115. package/dist/components/WeekPicker/index.d.ts +1 -0
  116. package/dist/components/WeekPicker/subcomponents/CustomDatepicker.d.ts +1 -1
  117. package/dist/components/index.d.ts +20 -0
  118. package/dist/hooks/useFocusTrap.d.ts +2 -1
  119. package/dist/index.d.ts +1 -0
  120. package/dist/index.js +22204 -16719
  121. package/dist/theme/__tests__/fonts.test.d.ts +1 -0
  122. package/dist/theme/common/themeCommon.d.ts +904 -0
  123. package/dist/theme/fonts.d.ts +18 -0
  124. package/dist/theme/index.d.ts +6 -3
  125. package/dist/theme/light/lightColour.d.ts +126 -0
  126. package/dist/theme/light/lightTheme.d.ts +3 -0
  127. package/dist/theme/original/color.d.ts +166 -0
  128. package/dist/theme/original/defaultTheme.d.ts +1340 -0
  129. package/dist/theme/original/originalColourNewStructure.d.ts +126 -0
  130. package/dist/theme/useTheme.d.ts +2174 -0
  131. package/dist/utils/__tests__/announce.test.d.ts +1 -0
  132. package/dist/utils/addAlphaToHex.d.ts +5 -0
  133. package/dist/utils/announce.d.ts +6 -0
  134. package/dist/utils/index.d.ts +1 -0
  135. package/dist/utils/scrollToTop.d.ts +2 -0
  136. package/lib/components/Accordion/Accordion.Heading.tsx +65 -34
  137. package/lib/components/Accordion/Accordion.Panel.tsx +11 -7
  138. package/lib/components/Accordion/Accordion.stories.tsx +139 -0
  139. package/lib/components/Accordion/Accordion.tsx +39 -31
  140. package/lib/components/Accordion/__tests__/__snapshots__/Accordion.test.tsx.snap +15 -13
  141. package/lib/components/Accordion/index.ts +2 -0
  142. package/lib/components/Alert/Alert.stories.tsx +1 -1
  143. package/lib/components/Alert/Alert.tsx +12 -12
  144. package/lib/components/Alert/__tests__/__snapshots__/Alert.test.tsx.snap +13 -39
  145. package/lib/components/AppHeader/AppHeader.tsx +6 -11
  146. package/lib/components/AppHeader/AppHeaderBottom.tsx +2 -3
  147. package/lib/components/AppHeader/AppHeaderNav.tsx +2 -3
  148. package/lib/components/AppHeader/AppHeaderTop.tsx +1 -1
  149. package/lib/components/AppHeader/__tests__/__snapshots__/AppHeader.test.tsx.snap +2 -2
  150. package/lib/components/AppMenu/__tests__/__snapshots__/AppMenu.test.tsx.snap +6 -19
  151. package/lib/components/Avatar/Avatar.mdx +117 -0
  152. package/lib/components/Avatar/Avatar.stories.tsx +110 -2
  153. package/lib/components/Badge/Badge.stories.tsx +1 -1
  154. package/lib/components/Blanket/Blanket.stories.tsx +1 -1
  155. package/lib/components/Breadcrumbs/Breadcrumb.tsx +26 -12
  156. package/lib/components/Breadcrumbs/Breadcrumbs.tsx +1 -1
  157. package/lib/components/Breadcrumbs/__tests__/Breadcrumbs.test.tsx +9 -27
  158. package/lib/components/Breadcrumbs/__tests__/__snapshots__/Breadcrumbs.test.tsx.snap +24 -20
  159. package/lib/components/Button/Button.mdx +32 -279
  160. package/lib/components/Button/Button.stories.tsx +44 -51
  161. package/lib/components/Button/Button.tsx +166 -25
  162. package/lib/components/Button/__tests__/Button.test.tsx +49 -15
  163. package/lib/components/Button/__tests__/__snapshots__/Button.test.tsx.snap +80 -73
  164. package/lib/components/Button/style/buttonAccentStyle.ts +53 -0
  165. package/lib/components/Button/style/buttonPrimaryDestructiveStyle.ts +55 -0
  166. package/lib/components/Button/style/buttonPrimaryStyle.ts +53 -0
  167. package/lib/components/Button/style/buttonPrimarySubtleStyle.ts +64 -0
  168. package/lib/components/Button/style/buttonPrimaryWarningStyle.ts +56 -0
  169. package/lib/components/Button/style/buttonSecondaryDestructiveStyle.ts +63 -0
  170. package/lib/components/Button/style/buttonSecondaryStyle.ts +62 -0
  171. package/lib/components/Button/style/buttonSecondarySubtleStyle.ts +72 -0
  172. package/lib/components/Button/style/buttonTertiaryDestructiveStyle.ts +65 -0
  173. package/lib/components/Button/style/buttonTertiaryNoPaddingStyle.ts +52 -0
  174. package/lib/components/Button/style/buttonTertiaryStyle.ts +62 -0
  175. package/lib/components/Calendar/Calendar.stories.tsx +1 -1
  176. package/lib/components/Calendar/Calendar.tsx +2 -2
  177. package/lib/components/Calendar/__tests__/Calendar.test.tsx +23 -15
  178. package/lib/components/Calendar/__tests__/__snapshots__/Calendar.test.tsx.snap +99 -95
  179. package/lib/components/Calendar/index.ts +1 -5
  180. package/lib/components/Calendar/subcomponents/AcademicWeek.tsx +2 -1
  181. package/lib/components/Calendar/subcomponents/AcademicWeeks.tsx +1 -1
  182. package/lib/components/Calendar/subcomponents/ColumnHeading.tsx +2 -2
  183. package/lib/components/Calendar/subcomponents/Controls.tsx +1 -1
  184. package/lib/components/Calendar/subcomponents/Day.stories.tsx +1 -1
  185. package/lib/components/Calendar/subcomponents/Day.tsx +7 -9
  186. package/lib/components/Calendar/subcomponents/EventDot.tsx +3 -6
  187. package/lib/components/Calendar/subcomponents/index.ts +1 -1
  188. package/lib/components/Calendar/utils/getDatesForCalendarGrid/getDatesForCalendarGrid.ts +43 -11
  189. package/lib/components/Calendar/utils/normaliseMonth/normaliseMonth.test.ts +5 -5
  190. package/lib/components/Checkbox/Checkbox.stories.tsx +1 -1
  191. package/lib/components/Checkbox/Checkbox.tsx +12 -10
  192. package/lib/components/Checkbox/__tests__/Checkbox.test.tsx +29 -0
  193. package/lib/components/Checkbox/__tests__/__snapshots__/Checkbox.test.tsx.snap +4 -4
  194. package/lib/components/Datepicker/Datepicker.lld.md +108 -0
  195. package/lib/components/Datepicker/Datepicker.stories.tsx +44 -5
  196. package/lib/components/Datepicker/Datepicker.tsx +14 -36
  197. package/lib/components/Datepicker/Datepicker.types.ts +5 -14
  198. package/lib/components/Datepicker/__tests__/Datepicker.test.tsx +267 -8
  199. package/lib/components/Datepicker/__tests__/__snapshots__/Datepicker.test.tsx.snap +20 -42
  200. package/lib/components/Datepicker/subcomponents/CustomDatepicker.tsx +48 -5
  201. package/lib/components/Datepicker/subcomponents/DatepickerInput.tsx +30 -17
  202. package/lib/components/Datepicker/subcomponents/Panel.tsx +6 -2
  203. package/lib/components/Datepicker/subcomponents/VisibleField.tsx +46 -8
  204. package/lib/components/Datepicker/subcomponents/index.ts +0 -1
  205. package/lib/components/Datepicker/utils/index.ts +0 -1
  206. package/lib/components/Dialog/BaseDialog.tsx +13 -2
  207. package/lib/components/Dialog/Dialog.stories.tsx +1 -1
  208. package/lib/components/Dialog/Dialog.tsx +8 -1
  209. package/lib/components/Dialog/DialogBody.tsx +5 -1
  210. package/lib/components/Dialog/DialogHeader.tsx +2 -1
  211. package/lib/components/Divider/Divider.stories.tsx +1 -1
  212. package/lib/components/Divider/__tests__/__snapshots__/Breadcrumbs.test.tsx.snap +12 -12
  213. package/lib/components/FeedbackDialog/FeedbackDialog.stories.tsx +1 -1
  214. package/lib/components/FeedbackDialog/FeedbackDialog.tsx +4 -6
  215. package/lib/components/Field/CharacterCount.tsx +2 -2
  216. package/lib/components/Field/ErrorText.tsx +2 -1
  217. package/lib/components/Field/Field.stories.tsx +1 -1
  218. package/lib/components/Field/Field.tsx +1 -1
  219. package/lib/components/Field/HelperText.tsx +3 -1
  220. package/lib/components/Field/__tests__/Field.test.tsx +13 -0
  221. package/lib/components/FileInput/FileInput.stories.tsx +1 -1
  222. package/lib/components/FileInput/__tests__/__snapshots__/FileInput.test.tsx.snap +4 -20
  223. package/lib/components/Footer/Footer.stories.tsx +1 -1
  224. package/lib/components/Footer/__tests__/__snapshots__/Footer.test.tsx.snap +73 -82
  225. package/lib/components/FooterNew/BackToTop.tsx +83 -0
  226. package/lib/components/FooterNew/Footer.tsx +110 -0
  227. package/lib/components/FooterNew/FooterColumn.tsx +79 -0
  228. package/lib/components/FooterNew/FooterLinks.tsx +44 -0
  229. package/lib/components/FooterNew/FooterNavLink.tsx +63 -0
  230. package/lib/components/FooterNew/LegalAndCopyright.tsx +150 -0
  231. package/lib/components/FooterNew/LogoAddressAndSocial.tsx +154 -0
  232. package/lib/components/FooterNew/SocialLink.tsx +108 -0
  233. package/lib/components/FooterNew/__tests__/Footer.test.tsx +51 -0
  234. package/lib/components/FooterNew/__tests__/__snapshots__/Footer.test.tsx.snap +1107 -0
  235. package/lib/components/FooterNew/index.ts +2 -0
  236. package/lib/components/Header/Header.mdx +52 -0
  237. package/lib/components/Header/Header.stories.tsx +98 -0
  238. package/lib/components/Header/Header.tsx +51 -6
  239. package/lib/components/Header/__tests__/Header.test.tsx +17 -1
  240. package/lib/components/HeaderDraft/__tests__/__snapshots__/Header.test.tsx.snap +3 -2
  241. package/lib/components/HeaderNew/Header.tsx +93 -0
  242. package/lib/components/HeaderNew/HeaderBorder.tsx +55 -0
  243. package/lib/components/HeaderNew/HeaderLogo.tsx +70 -0
  244. package/lib/components/HeaderNew/HeaderMenuContainer.tsx +35 -0
  245. package/lib/components/HeaderNew/HeaderTitle.tsx +53 -0
  246. package/lib/components/HeaderNew/__tests__/Header.test.tsx +42 -0
  247. package/lib/components/HeaderNew/__tests__/__snapshots__/Header.test.tsx.snap +79 -0
  248. package/lib/components/HeaderNew/constants.ts +3 -0
  249. package/lib/components/HeaderNew/index.ts +7 -0
  250. package/lib/components/Heading/Heading.stories.tsx +1 -1
  251. package/lib/components/HeadingNew/Heading.tsx +208 -0
  252. package/lib/components/HeadingNew/index.ts +2 -0
  253. package/lib/components/Icon/Icon.stories.tsx +1 -1
  254. package/lib/components/Icon/__tests__/__snapshots__/Icon.test.tsx.snap +16 -12
  255. package/lib/components/Icon/svgImports.ts +318 -296
  256. package/lib/components/IconButton/IconButton.stories.tsx +1 -1
  257. package/lib/components/IconButton/IconButton.tsx +3 -4
  258. package/lib/components/IconButton/__tests__/__snapshots__/IconButton.test.tsx.snap +12 -9
  259. package/lib/components/Input/Input.stories.tsx +1 -1
  260. package/lib/components/Label/Label.stories.tsx +1 -1
  261. package/lib/components/Link/BaseLink.tsx +114 -71
  262. package/lib/components/Link/Link.stories.tsx +1 -1
  263. package/lib/components/Link/Link.tsx +120 -109
  264. package/lib/components/Link/__tests__/__snapshots__/link.test.tsx.snap +2 -2
  265. package/lib/components/Main/Main.stories.tsx +36 -0
  266. package/lib/components/Main/Main.tsx +46 -0
  267. package/lib/components/Main/__tests__/Main.test.tsx +80 -0
  268. package/lib/components/Main/__tests__/__snapshots__/Main.test.tsx.snap +33 -0
  269. package/lib/components/Main/index.ts +2 -0
  270. package/lib/components/MenuNew/Menu.context.tsx +149 -0
  271. package/lib/components/MenuNew/Menu.tsx +75 -0
  272. package/lib/components/MenuNew/MenuContent.tsx +140 -0
  273. package/lib/components/MenuNew/MenuItem.tsx +101 -0
  274. package/lib/components/MenuNew/MenuSection.tsx +47 -0
  275. package/lib/components/MenuNew/index.ts +8 -0
  276. package/lib/components/MenuNew/trigger/ButtonMenuTrigger.tsx +42 -0
  277. package/lib/components/MenuNew/trigger/IconMenuTrigger.tsx +40 -0
  278. package/lib/components/NativeDatepicker/NativeDatepicker.stories.tsx +100 -0
  279. package/lib/components/{Datepicker/subcomponents → NativeDatepicker}/NativeDatepicker.tsx +14 -15
  280. package/lib/components/NativeDatepicker/NativeDatepicker.types.ts +19 -0
  281. package/lib/components/NativeDatepicker/index.ts +2 -0
  282. package/lib/components/{Datepicker → NativeDatepicker}/utils/dateToLocaleISOString/dateToLocaleISOString.ts +1 -1
  283. package/lib/components/NativeDatepicker/utils/index.ts +1 -0
  284. package/lib/components/Pagination/Pagination.stories.tsx +1 -1
  285. package/lib/components/Pagination/PaginationControls.tsx +59 -17
  286. package/lib/components/Pagination/PaginationInfo.tsx +7 -4
  287. package/lib/components/Paragraph/Paragraph.stories.tsx +1 -1
  288. package/lib/components/ParagraphNew/Paragraph.tsx +200 -0
  289. package/lib/components/ParagraphNew/index.ts +6 -0
  290. package/lib/components/Radio/Radio.stories.tsx +1 -1
  291. package/lib/components/Radio/Radio.tsx +8 -8
  292. package/lib/components/Radio/__tests__/__snapshots__/Radio.test.tsx.snap +4 -4
  293. package/lib/components/Search/Search.stories.tsx +1 -1
  294. package/lib/components/Search/Search.tsx +4 -1
  295. package/lib/components/Search/__tests__/Search.test.tsx +19 -1
  296. package/lib/components/Search/__tests__/__snapshots__/Search.test.tsx.snap +12 -32
  297. package/lib/components/Select/Select.mdx +192 -0
  298. package/lib/components/Select/Select.stories.tsx +229 -48
  299. package/lib/components/Select/Select.tsx +50 -15
  300. package/lib/components/Select/Select.types.ts +99 -44
  301. package/lib/components/Select/__tests__/Select.test.tsx +698 -8
  302. package/lib/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +5 -4
  303. package/lib/components/Select/subcomponents/CustomOption.tsx +12 -4
  304. package/lib/components/Select/subcomponents/CustomSelect.tsx +411 -41
  305. package/lib/components/Select/subcomponents/FilterInput.tsx +90 -0
  306. package/lib/components/Select/subcomponents/NativeSelect.tsx +21 -17
  307. package/lib/components/Select/subcomponents/Panel.tsx +2 -2
  308. package/lib/components/Select/subcomponents/VisibleField.tsx +59 -6
  309. package/lib/components/Select/subcomponents/index.tsx +1 -0
  310. package/lib/components/Snackbar/Snackbar.stories.tsx +1 -1
  311. package/lib/components/Snackbar/__tests__/__snapshots__/Snackbar.test.tsx.snap +9 -15
  312. package/lib/components/Spinner/Spinner.stories.tsx +1 -1
  313. package/lib/components/Spinner/Spinner.tsx +24 -5
  314. package/lib/components/Spinner/__tests__/Spinner.test.tsx +35 -5
  315. package/lib/components/Spinner/__tests__/__snapshots__/Spinner.test.tsx.snap +40 -16
  316. package/lib/components/StandaloneLink/StandaloneLink.stories.tsx +1 -1
  317. package/lib/components/StandaloneLink/StandaloneLink.tsx +180 -163
  318. package/lib/components/StandaloneLink/__tests__/__snapshots__/StandaloneLink.test.tsx.snap +2 -2
  319. package/lib/components/Table/Table.stories.tsx +1 -1
  320. package/lib/components/Table/Table.tsx +2 -0
  321. package/lib/components/Table/Table.types.ts +1 -0
  322. package/lib/components/Table/__tests__/Table.test.tsx +19 -0
  323. package/lib/components/Table/__tests__/__snapshots__/Table.test.tsx.snap +7 -3
  324. package/lib/components/Table/subcomponents/Cell/Cell.stories.tsx +1 -1
  325. package/lib/components/Table/subcomponents/Cell/Cell.tsx +23 -2
  326. package/lib/components/Table/subcomponents/Cell/CellContent.tsx +12 -1
  327. package/lib/components/Table/subcomponents/Cell/__tests__/Cell.test.tsx +106 -0
  328. package/lib/components/Table/subcomponents/Cell/__tests__/__snapshots__/Cell.test.tsx.snap +4 -3
  329. package/lib/components/Table/subcomponents/HeadCell/HeadCell.stories.tsx +1 -1
  330. package/lib/components/Table/subcomponents/HeadCell/HeadCell.tsx +28 -6
  331. package/lib/components/Table/subcomponents/HeadCell/HeadCellContent.tsx +3 -0
  332. package/lib/components/Table/subcomponents/HeadCell/__tests__/HeadCell.test.tsx +221 -2
  333. package/lib/components/Table/subcomponents/HeadCell/__tests__/__snapshots__/HeadCell.test.tsx.snap +6 -4
  334. package/lib/components/Table/subcomponents/Row.tsx +2 -2
  335. package/lib/components/Table/subcomponents/SortIcon.tsx +1 -0
  336. package/lib/components/Table/subcomponents/__tests__/Row.test.tsx +59 -0
  337. package/lib/components/Tabs/Tab.tsx +3 -3
  338. package/lib/components/Tabs/Tabs.stories.tsx +1 -1
  339. package/lib/components/Tabs/Tabs.tsx +5 -3
  340. package/lib/components/Tabs/__tests__/__snapshots__/Tabs.test.tsx.snap +4 -4
  341. package/lib/components/Textarea/Textarea.stories.tsx +1 -1
  342. package/lib/components/Timepicker/Timepicker.stories.tsx +1 -1
  343. package/lib/components/Timepicker/Timepicker.tsx +4 -0
  344. package/lib/components/Timepicker/__tests__/__snapshots__/Timepicker.test.tsx.snap +2 -2
  345. package/lib/components/Toggle/Toggle.stories.tsx +1 -1
  346. package/lib/components/Toggle/Toggle.tsx +5 -5
  347. package/lib/components/Toggle/ToggleHandle.tsx +2 -3
  348. package/lib/components/Tooltip/Tooltip.stories.tsx +1 -1
  349. package/lib/components/Tooltip/Tooltip.tsx +2 -2
  350. package/lib/components/Tooltip/__tests__/__snapshots__/tooltip.test.tsx.snap +2 -2
  351. package/lib/components/UclLogoNew/UclLogo.tsx +42 -0
  352. package/lib/components/UclLogoNew/index.ts +2 -0
  353. package/lib/components/WeekPicker/WeekPicker.stories.tsx +145 -0
  354. package/lib/components/WeekPicker/WeekPicker.tsx +2 -2
  355. package/lib/components/WeekPicker/WeekPicker.types.ts +21 -0
  356. package/lib/components/WeekPicker/index.ts +1 -0
  357. package/lib/components/WeekPicker/subcomponents/CustomDatepicker.tsx +1 -1
  358. package/lib/components/common/Common.mdx +1 -2
  359. package/lib/components/index.ts +30 -3
  360. package/lib/hooks/useFocusTrap.ts +40 -4
  361. package/lib/index.ts +1 -0
  362. package/lib/theme/Colours.mdx +1 -1
  363. package/lib/theme/Theme.mdx +1 -1
  364. package/lib/theme/Typography.mdx +1 -1
  365. package/lib/theme/__tests__/fonts.test.ts +37 -0
  366. package/lib/theme/common/themeCommon.ts +515 -0
  367. package/lib/theme/fonts.ts +110 -0
  368. package/lib/theme/index.ts +6 -6
  369. package/lib/theme/light/lightColour.ts +232 -0
  370. package/lib/theme/light/lightTheme.ts +37 -0
  371. package/lib/theme/{defaultTheme.ts → original/color.ts} +17 -199
  372. package/lib/theme/original/defaultTheme.ts +207 -0
  373. package/lib/theme/original/originalColourNewStructure.ts +185 -0
  374. package/lib/theme/useTheme.tsx +72 -15
  375. package/lib/types/assets.d.ts +10 -0
  376. package/lib/utils/__tests__/announce.test.ts +121 -0
  377. package/lib/utils/addAlphaToHex.ts +29 -0
  378. package/lib/utils/announce.ts +134 -0
  379. package/lib/utils/index.ts +1 -0
  380. package/lib/utils/scrollToTop.ts +5 -0
  381. package/package.json +11 -9
  382. package/dist/components/Button/buttonPrimaryStyle.d.ts +0 -4
  383. package/dist/components/Button/buttonSecondaryStyle.d.ts +0 -4
  384. package/dist/components/Button/buttonTertiaryStyle.d.ts +0 -4
  385. package/dist/components/Datepicker/subcomponents/NativeDatepicker.d.ts +0 -6
  386. package/dist/theme/defaultTheme.d.ts +0 -274
  387. package/lib/components/Accordion/Accordion.stories.tsx.NOT_READY +0 -93
  388. package/lib/components/Button/buttonPrimaryStyle.ts +0 -62
  389. package/lib/components/Button/buttonSecondaryStyle.ts +0 -65
  390. package/lib/components/Button/buttonTertiaryStyle.ts +0 -54
  391. /package/dist/components/{Datepicker/utils/dateToLocaleISOString/dateToLocaleISOString.test.d.ts → FooterNew/__tests__/Footer.test.d.ts} +0 -0
  392. /package/lib/components/{Datepicker → NativeDatepicker}/utils/dateToLocaleISOString/dateToLocaleISOString.test.ts +0 -0
@@ -1,37 +1,135 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
  import { useArgs } from '@storybook/preview-api';
3
3
  import Select from './Select';
4
+ import { css } from '@emotion/css';
5
+
6
+ const select400pxWidthClass = css`
7
+ width: 400px;
8
+ `;
9
+ const storyWrapperStyle: React.CSSProperties = { minHeight: 150, width: 400 };
4
10
 
5
11
  const meta = {
6
- title: 'Components/Ready to use/Select',
12
+ title: 'Components/Select',
7
13
  component: Select,
8
14
  argTypes: {
9
- value: { control: { type: 'text' } },
15
+ selectionBehaviour: {
16
+ description:
17
+ 'Keyboard selection behaviour for custom variant: `focus` commits on arrow keys, `commit` commits on Enter/click',
18
+ control: { type: 'radio' },
19
+ options: ['focus', 'commit'],
20
+ table: { type: { summary: "'focus' | 'commit'" } },
21
+ },
22
+ options: {
23
+ description: 'Array of option objects `{ label, value, optionProps? }`',
24
+ control: { type: 'object' },
25
+ table: { type: { summary: 'OptionData[]' } },
26
+ },
27
+ value: {
28
+ description: 'Selected value (string | number | null)',
29
+ control: { type: 'text' },
30
+ table: { type: { summary: 'string | number | null' } },
31
+ },
32
+ onValueChange: {
33
+ description:
34
+ 'Change handler for the custom select variant (value, event)',
35
+ control: false,
36
+ table: {
37
+ type: {
38
+ summary:
39
+ '(value: string | number | null, ev: React.SyntheticEvent) => void',
40
+ },
41
+ },
42
+ },
10
43
  native: {
44
+ description: 'Render the native `<select>` variant when true',
11
45
  control: { type: 'boolean' },
46
+ table: { type: { summary: 'boolean' } },
47
+ },
48
+ nativeHtmlAttributes: {
49
+ description: 'Additional props to spread onto the native `<select>`',
50
+ control: false,
51
+ table: {
52
+ type: { summary: 'React.SelectHTMLAttributes<HTMLSelectElement>' },
53
+ },
12
54
  },
13
55
  disabled: {
56
+ description: 'Disable interaction',
14
57
  control: { type: 'boolean' },
58
+ table: { type: { summary: 'boolean' } },
15
59
  },
16
60
  placeholder: {
61
+ description: 'Helper text when no value is selected',
17
62
  control: { type: 'text' },
63
+ table: { type: { summary: 'string' } },
18
64
  },
19
- testId: {
65
+ filterable: {
66
+ description:
67
+ 'Show a filter input to narrow options in the custom variant',
68
+ control: { type: 'boolean' },
69
+ table: { type: { summary: 'boolean' } },
70
+ },
71
+ clearable: {
72
+ description:
73
+ 'Show a clear action in the custom variant when a value is selected',
74
+ control: { type: 'boolean' },
75
+ table: { type: { summary: 'boolean' } },
76
+ },
77
+ filterInputProps: {
78
+ description:
79
+ 'Additional props to spread onto the filter input (when filterable)',
80
+ control: { type: 'object' },
81
+ table: {
82
+ type: {
83
+ summary: 'React.InputHTMLAttributes<HTMLInputElement>',
84
+ },
85
+ },
86
+ },
87
+ id: {
88
+ description: 'Standard HTML id forwarded to the combobox/native select',
20
89
  control: { type: 'text' },
90
+ table: { type: { summary: 'string' } },
91
+ },
92
+ title: {
93
+ description:
94
+ 'Standard title attribute forwarded to the combobox/native select',
95
+ control: { type: 'text' },
96
+ table: { type: { summary: 'string' } },
21
97
  },
22
98
  lineBreak: {
99
+ description: 'Wrap long option labels',
23
100
  control: { type: 'boolean' },
101
+ table: { type: { summary: 'boolean' } },
102
+ },
103
+ panelClassName: {
104
+ description: 'Custom className for the options panel',
105
+ control: { type: 'text' },
106
+ table: { type: { summary: 'string' } },
107
+ },
108
+ className: {
109
+ description: 'Custom className for the root element',
110
+ control: { type: 'text' },
111
+ table: { type: { summary: 'string' } },
112
+ },
113
+ testId: {
114
+ description: 'Test id applied to the root element',
115
+ control: { type: 'text' },
116
+ table: { type: { summary: 'string' } },
24
117
  },
25
118
  },
26
119
  args: {
120
+ selectionBehaviour: 'focus',
27
121
  value: undefined,
28
- onChange: () => {},
29
122
  options: [
30
123
  { label: 'Option one', value: '1' },
31
124
  { label: 'Option two', value: '2' },
32
125
  { label: 'Option three', value: '3' },
33
126
  ],
34
127
  },
128
+ parameters: {
129
+ docs: {
130
+ story: { inline: true },
131
+ },
132
+ },
35
133
  } satisfies Meta<typeof Select>;
36
134
 
37
135
  export default meta;
@@ -40,16 +138,19 @@ type Story = StoryObj<typeof meta>;
40
138
  export const Default: Story = {
41
139
  render: () => {
42
140
  const [args, updateArgs] = useArgs();
43
- const onValueChange = (value: string | number) => {
141
+ const onValueChange = (value: string | number | null) => {
44
142
  updateArgs({ value });
45
143
  };
46
144
  return (
47
- <Select
48
- {...args}
49
- options={args.options}
50
- value={args.value}
51
- onValueChange={onValueChange}
52
- />
145
+ <div style={storyWrapperStyle}>
146
+ <Select
147
+ {...args}
148
+ className={select400pxWidthClass}
149
+ options={args.options}
150
+ value={args.value}
151
+ onValueChange={onValueChange}
152
+ />
153
+ </div>
53
154
  );
54
155
  },
55
156
  };
@@ -60,16 +161,18 @@ export const Native: Story = {
60
161
  },
61
162
  render: () => {
62
163
  const [args, updateArgs] = useArgs();
63
- const onValueChange = (value: string | number) => {
64
- updateArgs({ value });
65
- };
164
+ const onNativeChange = (event: React.ChangeEvent<HTMLSelectElement>) =>
165
+ updateArgs({ value: event.target.value });
66
166
  return (
67
- <Select
68
- {...args}
69
- options={args.options}
70
- value={args.value}
71
- onValueChange={onValueChange}
72
- />
167
+ <div style={storyWrapperStyle}>
168
+ <Select
169
+ {...args}
170
+ className={select400pxWidthClass}
171
+ options={args.options}
172
+ value={args.value}
173
+ nativeHtmlAttributes={{ onChange: onNativeChange }}
174
+ />
175
+ </div>
73
176
  );
74
177
  },
75
178
  };
@@ -80,17 +183,20 @@ export const Disabled: Story = {
80
183
  },
81
184
  render: () => {
82
185
  const [args, updateArgs] = useArgs();
83
- const onValueChange = (value: string | number) => {
186
+ const onValueChange = (value: string | number | null) => {
84
187
  updateArgs({ value });
85
188
  };
86
189
 
87
190
  return (
88
- <Select
89
- {...args}
90
- options={args.options}
91
- value={args.value}
92
- onValueChange={onValueChange}
93
- />
191
+ <div style={storyWrapperStyle}>
192
+ <Select
193
+ {...args}
194
+ className={select400pxWidthClass}
195
+ options={args.options}
196
+ value={args.value}
197
+ onValueChange={onValueChange}
198
+ />
199
+ </div>
94
200
  );
95
201
  },
96
202
  };
@@ -99,17 +205,20 @@ export const WithPlaceholder: Story = {
99
205
  args: { placeholder: 'Please select an option' },
100
206
  render: () => {
101
207
  const [args, updateArgs] = useArgs();
102
- const onValueChange = (value: string | number) => {
208
+ const onValueChange = (value: string | number | null) => {
103
209
  updateArgs({ value });
104
210
  };
105
211
 
106
212
  return (
107
- <Select
108
- {...args}
109
- options={args.options}
110
- value={args.value}
111
- onValueChange={onValueChange}
112
- />
213
+ <div style={storyWrapperStyle}>
214
+ <Select
215
+ {...args}
216
+ className={select400pxWidthClass}
217
+ options={args.options}
218
+ value={args.value}
219
+ onValueChange={onValueChange}
220
+ />
221
+ </div>
113
222
  );
114
223
  },
115
224
  };
@@ -125,17 +234,20 @@ export const SingleLongOption: Story = {
125
234
  },
126
235
  render: () => {
127
236
  const [args, updateArgs] = useArgs();
128
- const onValueChange = (value: string | number) => {
237
+ const onValueChange = (value: string | number | null) => {
129
238
  updateArgs({ value });
130
239
  };
131
240
 
132
241
  return (
133
- <Select
134
- {...args}
135
- options={args.options}
136
- value={args.value}
137
- onValueChange={onValueChange}
138
- />
242
+ <div style={storyWrapperStyle}>
243
+ <Select
244
+ {...args}
245
+ className={select400pxWidthClass}
246
+ options={args.options}
247
+ value={args.value}
248
+ onValueChange={onValueChange}
249
+ />
250
+ </div>
139
251
  );
140
252
  },
141
253
  };
@@ -163,16 +275,85 @@ export const ManyOptions: Story = {
163
275
  },
164
276
  render: () => {
165
277
  const [args, updateArgs] = useArgs();
166
- const onValueChange = (value: string | number) => {
278
+ const onValueChange = (value: string | number | null) => {
167
279
  updateArgs({ value });
168
280
  };
169
281
  return (
170
- <Select
171
- {...args}
172
- options={args.options}
173
- value={args.value}
174
- onValueChange={onValueChange}
175
- />
282
+ <div style={storyWrapperStyle}>
283
+ <Select
284
+ {...args}
285
+ className={select400pxWidthClass}
286
+ options={args.options}
287
+ value={args.value}
288
+ onValueChange={onValueChange}
289
+ />
290
+ </div>
291
+ );
292
+ },
293
+ };
294
+
295
+ export const filterable: Story = {
296
+ args: { filterable: true },
297
+ render: () => {
298
+ const [args, updateArgs] = useArgs();
299
+ const onValueChange = (value: string | number | null) =>
300
+ updateArgs({ value });
301
+ return (
302
+ <div style={storyWrapperStyle}>
303
+ <Select
304
+ {...args}
305
+ className={select400pxWidthClass}
306
+ options={args.options}
307
+ value={args.value}
308
+ onValueChange={onValueChange}
309
+ placeholder='Type to filter...'
310
+ />
311
+ </div>
312
+ );
313
+ },
314
+ };
315
+
316
+ export const Clearable: Story = {
317
+ args: {
318
+ clearable: true,
319
+ value: '2',
320
+ placeholder: 'Clear selection',
321
+ },
322
+ render: () => {
323
+ const [args, updateArgs] = useArgs();
324
+ const onValueChange = (value: string | number | null) =>
325
+ updateArgs({ value });
326
+ return (
327
+ <div style={storyWrapperStyle}>
328
+ <Select
329
+ {...args}
330
+ className={select400pxWidthClass}
331
+ options={args.options}
332
+ value={args.value}
333
+ onValueChange={onValueChange}
334
+ />
335
+ </div>
336
+ );
337
+ },
338
+ };
339
+
340
+ export const SelectionBehaviourCommit: Story = {
341
+ name: 'Selection behaviour: commit',
342
+ args: { selectionBehaviour: 'commit' },
343
+ render: () => {
344
+ const [args, updateArgs] = useArgs();
345
+ const onValueChange = (value: string | number | null) =>
346
+ updateArgs({ value });
347
+ return (
348
+ <div style={storyWrapperStyle}>
349
+ <Select
350
+ {...args}
351
+ className={select400pxWidthClass}
352
+ options={args.options}
353
+ value={args.value}
354
+ onValueChange={onValueChange}
355
+ />
356
+ </div>
176
357
  );
177
358
  },
178
359
  };
@@ -1,25 +1,60 @@
1
1
  import { NativeSelect, CustomSelect } from './subcomponents';
2
- import { SelectProps } from './Select.types';
2
+ import type { InternalSelectProps, SelectProps } from './Select.types';
3
3
 
4
- const Select = <T extends string | number = string>(props: SelectProps<T>) => {
5
- if (props.native) {
6
- const { onChange, value, ...rest } = props;
4
+ type SelectComponent = <T extends string | number = string>(
5
+ props: SelectProps<T>
6
+ ) => React.JSX.Element;
7
+
8
+ const Select = (<T extends string | number = string>(
9
+ props: InternalSelectProps<T>
10
+ ) => {
11
+ const {
12
+ native,
13
+ nativeHtmlAttributes,
14
+ filterable,
15
+ clearable,
16
+ onValueChange,
17
+ ref,
18
+ ...rest
19
+ } = props;
20
+
21
+ if (native) {
22
+ if (filterable) {
23
+ console.warn('filterable is not supported on native Select; ignoring.');
24
+ }
25
+ if (clearable) {
26
+ console.warn('clearable is not supported on native Select; ignoring.');
27
+ }
28
+ const { value, ...nativeRest } = rest;
29
+ const {
30
+ value: nativeAttrValue,
31
+ onChange,
32
+ ...nativeAttrs
33
+ } = nativeHtmlAttributes || {};
34
+ const nativeValue: string | number | undefined =
35
+ typeof value === 'string' || typeof value === 'number'
36
+ ? value
37
+ : undefined;
7
38
  return (
8
39
  <NativeSelect
40
+ value={nativeValue ?? (nativeAttrValue as string | number | undefined)}
9
41
  onChange={onChange}
10
- value={value || ''}
11
- {...rest}
12
- />
13
- );
14
- } else {
15
- const { onValueChange, ...rest } = props;
16
- return (
17
- <CustomSelect<T>
18
- onValueChange={onValueChange}
19
- {...rest}
42
+ ref={ref as React.Ref<HTMLSelectElement>}
43
+ {...nativeRest}
44
+ {...nativeAttrs}
20
45
  />
21
46
  );
22
47
  }
23
- };
48
+
49
+ return (
50
+ <CustomSelect<T>
51
+ onValueChange={onValueChange}
52
+ filterable={filterable}
53
+ clearable={clearable}
54
+ ref={ref as React.Ref<HTMLDivElement>}
55
+ {...rest}
56
+ />
57
+ );
58
+ }) as SelectComponent;
24
59
 
25
60
  export default Select;
@@ -24,9 +24,29 @@ export type OptionData<T> = {
24
24
  };
25
25
 
26
26
  /**
27
- * Top level props that <Select> accepts when implemented
27
+ * Additional props forwarded to the filter input when `filterable` is true
28
28
  */
29
- interface BaseSelectProps<T = string> {
29
+ export type FilterInputProps = Omit<
30
+ React.InputHTMLAttributes<HTMLInputElement>,
31
+ | 'value'
32
+ | 'onChange'
33
+ | 'disabled'
34
+ | 'ref'
35
+ | 'role'
36
+ | 'aria-autocomplete'
37
+ | 'aria-label'
38
+ >;
39
+
40
+ type SelectBaseProps<T = string | number> = Omit<
41
+ React.HTMLAttributes<HTMLElement>,
42
+ 'onChange'
43
+ > & {
44
+ /**
45
+ * Controls keyboard selection behaviour in the custom select variant.
46
+ * - `focus` (default): arrow keys move focus and commit value immediately.
47
+ * - `commit`: arrow keys only move focus; Enter or click commits value.
48
+ */
49
+ selectionBehaviour?: 'focus' | 'commit';
30
50
  /**
31
51
  * An array of option data, to be rendered either natively or custom
32
52
  */
@@ -51,62 +71,97 @@ interface BaseSelectProps<T = string> {
51
71
  * Native flag determines which implementation to use
52
72
  */
53
73
  native?: boolean;
54
- }
55
-
56
- // export type SelectProps = BaseSelectProps &
57
- // // Discriminated union to determine which implementation to use
58
- // (| ({ native: true; ref?: React.RefObject<HTMLSelectElement | null> } & Omit<
59
- // React.SelectHTMLAttributes<HTMLSelectElement>,
60
- // keyof BaseSelectProps
61
- // >)
62
- // | ({ native?: false; ref?: React.RefObject<HTMLDivElement | null> } & Omit<
63
- // React.HTMLAttributes<HTMLDivElement>,
64
- // keyof BaseSelectProps
65
- // >)
66
- // );
67
-
68
- // Props interface for the two variants are separated.
69
- // We expose SelectProps for developers to use, and handle discrepancies internally.
74
+ /**
75
+ * Adds a text input to filter options in the custom variant; ignored for native
76
+ */
77
+ filterable?: boolean;
78
+ /**
79
+ * Extra props to apply to the filter input when `filterable` is true
80
+ */
81
+ filterInputProps?: FilterInputProps;
82
+ /**
83
+ * Extra attributes forwarded to the native <select> when `native` is true
84
+ */
85
+ nativeHtmlAttributes?: React.SelectHTMLAttributes<HTMLSelectElement>;
86
+ /**
87
+ * Disable interaction
88
+ */
89
+ disabled?: boolean;
90
+ /**
91
+ * Allow long option labels to wrap instead of truncating
92
+ */
93
+ lineBreak?: boolean;
94
+ /**
95
+ * Custom className for the root element
96
+ */
97
+ className?: string;
98
+ /**
99
+ * Custom className for the options panel
100
+ */
101
+ panelClassName?: string;
102
+ /**
103
+ * Ref forwarded to the rendered element
104
+ * (div for custom, select for native)
105
+ */
106
+ ref?: React.Ref<HTMLDivElement | HTMLSelectElement | null>;
107
+ };
70
108
 
71
- /**
72
- * Internal props for the custom implementation, with <div> as root element
73
- * onChange already exists on <div>. We override it.
74
- */
75
- export type CustomSelectProps<T> = Omit<
76
- React.HTMLAttributes<HTMLDivElement>,
77
- 'onChange'
78
- > &
79
- BaseSelectProps<T> & {
80
- native?: false;
109
+ export type NonClearableSelectProps<T = string | number> =
110
+ SelectBaseProps<T> & {
111
+ /**
112
+ * Current value (controlled)
113
+ */
81
114
  value?: T;
82
- disabled?: boolean;
83
- lineBreak?: boolean;
84
- panelClassName?: string;
85
- onValueChange?: (value: T, ev: React.UIEvent) => void;
86
- ref?: React.RefObject<HTMLDivElement | null>;
115
+ /**
116
+ * Show a clear action in the custom variant when a value is selected
117
+ */
118
+ clearable?: false | undefined;
119
+ /**
120
+ * Change handler for the custom variant
121
+ */
122
+ onValueChange?: (value: T, ev: React.SyntheticEvent) => void;
87
123
  };
88
124
 
125
+ export type ClearableSelectProps<T = string | number> = SelectBaseProps<T> & {
126
+ /**
127
+ * Current value (controlled)
128
+ */
129
+ value?: T | null;
130
+ /**
131
+ * Show a clear action in the custom variant when a value is selected
132
+ */
133
+ clearable: true;
134
+ /**
135
+ * Change handler for the custom variant
136
+ */
137
+ onValueChange?: (value: T | null, ev: React.SyntheticEvent) => void;
138
+ };
139
+
89
140
  /**
90
- * Internal props for native implementation, with <select> as root element
91
- * Default props like value and onChange are passed to the <select> element automatically
141
+ * Public props for <Select>, used by both custom and native render paths.
92
142
  */
93
- export type NativeSelectProps = React.SelectHTMLAttributes<HTMLSelectElement> &
94
- BaseSelectProps & {
95
- native: true;
96
- ref?: React.RefObject<HTMLSelectElement | null>;
97
- };
143
+ export type SelectProps<T = string | number> =
144
+ | NonClearableSelectProps<T>
145
+ | ClearableSelectProps<T>;
98
146
 
99
- export type SelectProps<T> = NativeSelectProps | CustomSelectProps<T>;
147
+ export type InternalSelectProps<T = string | number> = SelectBaseProps<T> & {
148
+ value?: T | null;
149
+ clearable?: boolean;
150
+ onValueChange?: (value: T | null, ev: React.SyntheticEvent) => void;
151
+ };
100
152
 
101
153
  /**
102
154
  * Each option as displayed in the Panel of <CustomSelect>
103
155
  * Roughly equivalent to a custom version of <option>
104
156
  */
105
- export interface CustomOptionProps<T>
106
- extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {
157
+ export interface CustomOptionProps<T> extends Omit<
158
+ React.HTMLAttributes<HTMLDivElement>,
159
+ 'onSelect'
160
+ > {
107
161
  value: T;
162
+ optionIndex?: number;
108
163
  testId?: string;
109
164
  isSelected?: boolean;
110
- onSelect: (event: React.MouseEvent, value: T) => void;
165
+ onSelect: (event: React.MouseEvent, value: T, optionIndex?: number) => void;
111
166
  lineBreak?: boolean;
112
167
  }