uikit-react-public 0.11.20 → 0.14.21

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 (295) hide show
  1. package/dist/components/Badge/Badge.d.ts +6 -0
  2. package/dist/components/Badge/Badge.stories.d.ts +15 -0
  3. package/dist/components/Badge/index.d.ts +2 -0
  4. package/dist/components/Button/Button.d.ts +2 -1
  5. package/dist/components/Calendar/Calendar.d.ts +3 -0
  6. package/dist/components/Calendar/Calendar.stories.d.ts +42 -0
  7. package/dist/components/Calendar/Calendar.types.d.ts +18 -0
  8. package/dist/components/Calendar/index.d.ts +2 -0
  9. package/dist/components/Calendar/subcomponents/AcademicWeeks.d.ts +7 -0
  10. package/dist/components/Calendar/subcomponents/ColumnHeading.d.ts +7 -0
  11. package/dist/components/Calendar/subcomponents/Controls.d.ts +6 -0
  12. package/dist/components/{Datepicker/subcomponents/Day → Calendar/subcomponents}/Day.d.ts +3 -3
  13. package/dist/components/{Datepicker → Calendar}/subcomponents/EventDot.d.ts +2 -2
  14. package/dist/components/Calendar/subcomponents/Grid.d.ts +11 -0
  15. package/dist/components/Calendar/subcomponents/index.d.ts +7 -0
  16. package/dist/components/{Datepicker → Calendar}/utils/getAcademicWeekNumbers/getAcademicWeekNumbers.d.ts +1 -1
  17. package/dist/components/Calendar/utils/index.d.ts +4 -0
  18. package/dist/components/Calendar/utils/normaliseMonth/normaliseMonth.d.ts +9 -0
  19. package/dist/components/Calendar/utils/parseDateFromString/parseDateFromString.d.ts +9 -0
  20. package/dist/components/Calendar/utils/parseDateFromString/parseDateFromString.test.d.ts +1 -0
  21. package/dist/components/CookieNotice/CookieNotice.d.ts +16 -0
  22. package/dist/components/CookieNotice/index.d.ts +2 -0
  23. package/dist/components/Datepicker/Datepicker.d.ts +3 -16
  24. package/dist/components/Datepicker/Datepicker.stories.d.ts +9 -3
  25. package/dist/components/Datepicker/Datepicker.types.d.ts +23 -7
  26. package/dist/components/Datepicker/index.d.ts +1 -2
  27. package/dist/components/Datepicker/subcomponents/CustomDatepicker.d.ts +17 -0
  28. package/dist/components/Datepicker/subcomponents/DatepickerInput.d.ts +10 -0
  29. package/dist/components/Datepicker/subcomponents/NativeDatepicker.d.ts +6 -0
  30. package/dist/components/Datepicker/subcomponents/Panel.d.ts +6 -0
  31. package/dist/components/Datepicker/subcomponents/VisibleField.d.ts +12 -0
  32. package/dist/components/Datepicker/subcomponents/index.d.ts +5 -7
  33. package/dist/components/Datepicker/utils/dateToLocaleISOString/dateToLocaleISOString.d.ts +17 -0
  34. package/dist/components/Datepicker/utils/dateToLocaleISOString/dateToLocaleISOString.test.d.ts +1 -0
  35. package/dist/components/Datepicker/utils/index.d.ts +2 -3
  36. package/dist/components/Datepicker/utils/parseInputValue/parseInputValue.d.ts +11 -0
  37. package/dist/components/Datepicker/utils/parseInputValue/parseInputValue.test.d.ts +1 -0
  38. package/dist/components/Dialog/BaseDialog.d.ts +7 -2
  39. package/dist/components/FileInput/FileInput.d.ts +8 -0
  40. package/dist/components/FileInput/FileInput.stories.d.ts +16 -0
  41. package/dist/components/FileInput/__tests__/FileInput.test.d.ts +1 -0
  42. package/dist/components/FileInput/index.d.ts +2 -0
  43. package/dist/components/Footer/Footer.d.ts +1 -1
  44. package/dist/components/Header/Header.d.ts +4 -1
  45. package/dist/components/Heading/Heading.d.ts +1 -1
  46. package/dist/components/Link/BaseLink.d.ts +10 -0
  47. package/dist/components/Link/Link.d.ts +5 -10
  48. package/dist/components/Link/Link.stories.d.ts +1 -1
  49. package/dist/components/Link/index.d.ts +1 -1
  50. package/dist/components/Menu/Menu.d.ts +2 -1
  51. package/dist/components/Menu/MenuContent.d.ts +2 -1
  52. package/dist/components/Menu/MenuItem.d.ts +2 -0
  53. package/dist/components/Menu/MenuSection.d.ts +1 -1
  54. package/dist/components/Search/Search.d.ts +16 -0
  55. package/dist/components/Search/Search.stories.d.ts +34 -0
  56. package/dist/components/Search/__tests__/Search.test.d.ts +1 -0
  57. package/dist/components/Search/index.d.ts +2 -0
  58. package/dist/components/Select/Select.d.ts +1 -1
  59. package/dist/components/Select/Select.stories.d.ts +3 -7
  60. package/dist/components/Select/Select.types.d.ts +19 -14
  61. package/dist/components/Select/subcomponents/CustomOption.d.ts +1 -1
  62. package/dist/components/Select/subcomponents/CustomSelect.d.ts +1 -2
  63. package/dist/components/Select/subcomponents/Panel.d.ts +1 -1
  64. package/dist/components/Select/subcomponents/VisibleField.d.ts +4 -4
  65. package/dist/components/StandaloneLink/StandaloneLink.d.ts +12 -0
  66. package/dist/components/StandaloneLink/StandaloneLink.stories.d.ts +13 -0
  67. package/dist/components/StandaloneLink/__tests__/StandaloneLink.test.d.ts +1 -0
  68. package/dist/components/StandaloneLink/index.d.ts +2 -0
  69. package/dist/components/Table/Table.d.ts +10 -8
  70. package/dist/components/Table/Table.stories.d.ts +21 -0
  71. package/dist/components/Table/Table.types.d.ts +11 -0
  72. package/dist/components/Table/__tests__/Table.test.d.ts +1 -0
  73. package/dist/components/Table/index.d.ts +2 -1
  74. package/dist/components/Table/subcomponents/Body.d.ts +4 -0
  75. package/dist/components/Table/subcomponents/Cell/Cell.d.ts +12 -0
  76. package/dist/components/Table/subcomponents/Cell/Cell.stories.d.ts +313 -0
  77. package/dist/components/Table/subcomponents/Cell/CellContent.d.ts +10 -0
  78. package/dist/components/Table/subcomponents/Cell/__tests__/Cell.test.d.ts +1 -0
  79. package/dist/components/Table/subcomponents/Head.d.ts +4 -0
  80. package/dist/components/Table/subcomponents/HeadCell/HeadCell.d.ts +13 -0
  81. package/dist/components/Table/subcomponents/HeadCell/HeadCell.stories.d.ts +312 -0
  82. package/dist/components/Table/subcomponents/HeadCell/HeadCellContent.d.ts +10 -0
  83. package/dist/components/Table/subcomponents/HeadCell/__tests__/HeadCell.test.d.ts +1 -0
  84. package/dist/components/Table/subcomponents/Row.d.ts +5 -0
  85. package/dist/components/Table/subcomponents/SortIcon.d.ts +7 -0
  86. package/dist/components/Table/subcomponents/index.d.ts +10 -0
  87. package/dist/components/Tabs/Tab.d.ts +1 -1
  88. package/dist/components/Tabs/TabContext.d.ts +1 -0
  89. package/dist/components/Tabs/Tabs.d.ts +3 -1
  90. package/dist/components/Tabs/Tabs.stories.d.ts +3 -0
  91. package/dist/components/Timepicker/Timepicker.d.ts +10 -0
  92. package/dist/components/Timepicker/Timepicker.stories.d.ts +7 -0
  93. package/dist/components/Timepicker/__tests__/Timepicker.test.d.ts +1 -0
  94. package/dist/components/Timepicker/index.d.ts +2 -0
  95. package/dist/components/Timepicker/utils/convertDateToTimeString.d.ts +2 -0
  96. package/dist/components/Timepicker/utils/convertDateToTimeString.test.d.ts +1 -0
  97. package/dist/components/Timepicker/utils/index.d.ts +1 -0
  98. package/dist/components/WeekPicker/WeekPicker.d.ts +3 -0
  99. package/dist/components/WeekPicker/index.d.ts +1 -0
  100. package/dist/components/WeekPicker/subcomponents/CustomDatepicker.d.ts +17 -0
  101. package/dist/components/WeekPicker/subcomponents/DatepickerInput.d.ts +13 -0
  102. package/dist/components/WeekPicker/subcomponents/VisibleField.d.ts +15 -0
  103. package/dist/components/WeekPicker/subcomponents/index.d.ts +3 -0
  104. package/dist/components/index.d.ts +13 -0
  105. package/dist/hooks/index.d.ts +2 -0
  106. package/dist/hooks/useFocusTrap.d.ts +9 -0
  107. package/dist/index.d.ts +1 -0
  108. package/dist/index.js +6006 -4599
  109. package/dist/theme/defaultTheme.d.ts +7 -0
  110. package/dist/theme/useTheme.d.ts +14 -0
  111. package/dist/utils/__tests__/capitalise.test.d.ts +1 -0
  112. package/dist/utils/capitalise.d.ts +2 -0
  113. package/lib/components/Alert/Alert.tsx +7 -1
  114. package/lib/components/Alert/__tests__/__snapshots__/Alert.test.tsx.snap +4 -0
  115. package/lib/components/Badge/Badge.stories.tsx +19 -0
  116. package/lib/components/Badge/Badge.tsx +48 -0
  117. package/lib/components/Badge/index.ts +2 -0
  118. package/lib/components/Breadcrumbs/__tests__/__snapshots__/Breadcrumbs.test.tsx.snap +4 -4
  119. package/lib/components/Button/Button.tsx +5 -2
  120. package/lib/components/Calendar/Calendar.stories.tsx +209 -0
  121. package/lib/components/Calendar/Calendar.tsx +121 -0
  122. package/lib/components/Calendar/Calendar.types.ts +21 -0
  123. package/lib/components/Calendar/__tests__/Calendar.test.tsx +71 -0
  124. package/lib/components/Calendar/__tests__/__snapshots__/Calendar.test.tsx.snap +1218 -0
  125. package/lib/components/Calendar/index.ts +6 -0
  126. package/lib/components/{Datepicker → Calendar}/subcomponents/AcademicWeek.tsx +1 -1
  127. package/lib/components/{Datepicker → Calendar}/subcomponents/AcademicWeeks.tsx +9 -7
  128. package/lib/components/Calendar/subcomponents/ColumnHeading.tsx +40 -0
  129. package/lib/components/{Datepicker/subcomponents/MonthSelector/MonthSelector.tsx → Calendar/subcomponents/Controls.tsx} +17 -17
  130. package/lib/components/{Datepicker/subcomponents/Day → Calendar/subcomponents}/Day.stories.tsx +8 -8
  131. package/lib/components/{Datepicker/subcomponents/Day → Calendar/subcomponents}/Day.tsx +28 -16
  132. package/lib/components/{Datepicker → Calendar}/subcomponents/EventDot.tsx +3 -3
  133. package/lib/components/Calendar/subcomponents/Grid.tsx +116 -0
  134. package/lib/components/Calendar/subcomponents/index.ts +7 -0
  135. package/lib/components/{Datepicker → Calendar}/utils/getAcademicWeekNumbers/getAcademicWeekNumbers.test.ts +1 -1
  136. package/lib/components/{Datepicker → Calendar}/utils/getAcademicWeekNumbers/getAcademicWeekNumbers.ts +1 -1
  137. package/lib/components/{Datepicker → Calendar}/utils/getDatesForCalendarGrid/getDatesForCalendarGrid.test.ts +29 -65
  138. package/lib/components/{Datepicker → Calendar}/utils/getDatesForCalendarGrid/getDatesForCalendarGrid.ts +11 -43
  139. package/lib/components/Calendar/utils/index.ts +4 -0
  140. package/lib/components/Calendar/utils/normaliseMonth/normaliseMonth.test.ts +40 -0
  141. package/lib/components/Calendar/utils/normaliseMonth/normaliseMonth.ts +16 -0
  142. package/lib/components/Calendar/utils/parseDateFromString/parseDateFromString.test.ts +15 -0
  143. package/lib/components/Calendar/utils/parseDateFromString/parseDateFromString.ts +19 -0
  144. package/lib/components/CookieNotice/CookieNotice.tsx +114 -0
  145. package/lib/components/CookieNotice/index.ts +2 -0
  146. package/lib/components/Datepicker/Datepicker.stories.tsx +128 -64
  147. package/lib/components/Datepicker/Datepicker.tsx +34 -114
  148. package/lib/components/Datepicker/Datepicker.types.ts +38 -9
  149. package/lib/components/Datepicker/__tests__/Datepicker.test.tsx +53 -112
  150. package/lib/components/Datepicker/__tests__/__snapshots__/Datepicker.test.tsx.snap +92 -747
  151. package/lib/components/Datepicker/index.ts +1 -2
  152. package/lib/components/Datepicker/subcomponents/CustomDatepicker.tsx +209 -0
  153. package/lib/components/Datepicker/subcomponents/DatepickerInput.tsx +74 -0
  154. package/lib/components/Datepicker/subcomponents/NativeDatepicker.tsx +70 -0
  155. package/lib/components/Datepicker/subcomponents/Panel.tsx +32 -0
  156. package/lib/components/Datepicker/subcomponents/VisibleField.tsx +104 -0
  157. package/lib/components/Datepicker/subcomponents/index.ts +5 -7
  158. package/lib/components/Datepicker/utils/dateToLocaleISOString/dateToLocaleISOString.test.ts +32 -0
  159. package/lib/components/Datepicker/utils/dateToLocaleISOString/dateToLocaleISOString.ts +23 -0
  160. package/lib/components/Datepicker/utils/index.ts +2 -3
  161. package/lib/components/Datepicker/utils/parseInputValue/parseInputValue.test.ts +110 -0
  162. package/lib/components/Datepicker/utils/parseInputValue/parseInputValue.ts +57 -0
  163. package/lib/components/Dialog/BaseDialog.tsx +44 -4
  164. package/lib/components/Field/__tests__/Field.test.tsx +148 -148
  165. package/lib/components/FileInput/FileInput.stories.tsx +70 -0
  166. package/lib/components/FileInput/FileInput.tsx +68 -0
  167. package/lib/components/FileInput/__tests__/FileInput.test.tsx +99 -0
  168. package/lib/components/FileInput/__tests__/__snapshots__/FileInput.test.tsx.snap +91 -0
  169. package/lib/components/FileInput/index.ts +2 -0
  170. package/lib/components/Footer/Footer.tsx +3 -3
  171. package/lib/components/Footer/__tests__/__snapshots__/Footer.test.tsx.snap +31 -31
  172. package/lib/components/Header/Header.tsx +19 -2
  173. package/lib/components/Header/__tests__/__snapshots__/Header.test.tsx.snap +4 -4
  174. package/lib/components/Heading/Documentation.mdx +1 -1
  175. package/lib/components/Heading/Heading.tsx +1 -1
  176. package/lib/components/Heading/__tests__/Heading.test.tsx +7 -19
  177. package/lib/components/Heading/__tests__/__snapshots__/Heading.test.tsx.snap +7 -7
  178. package/lib/components/Label/Label.tsx +0 -2
  179. package/lib/components/Label/__tests__/__snapshots__/Label.test.tsx.snap +7 -7
  180. package/lib/components/Link/BaseLink.tsx +84 -0
  181. package/lib/components/Link/Link.tsx +72 -32
  182. package/lib/components/Link/__tests__/__snapshots__/link.test.tsx.snap +3 -3
  183. package/lib/components/Link/__tests__/link.test.tsx +6 -13
  184. package/lib/components/Link/index.ts +1 -1
  185. package/lib/components/Menu/Menu.context.tsx +3 -1
  186. package/lib/components/Menu/Menu.tsx +5 -2
  187. package/lib/components/Menu/MenuContent.tsx +9 -6
  188. package/lib/components/Menu/MenuItem.tsx +20 -3
  189. package/lib/components/Menu/MenuSection.tsx +4 -3
  190. package/lib/components/Pagination/PaginationControls.tsx +1 -3
  191. package/lib/components/Search/Search.stories.tsx +41 -0
  192. package/lib/components/Search/Search.tsx +167 -0
  193. package/lib/components/Search/__tests__/Search.test.tsx +94 -0
  194. package/lib/components/Search/__tests__/__snapshots__/Search.test.tsx.snap +179 -0
  195. package/lib/components/Search/index.ts +2 -0
  196. package/lib/components/Select/Select.stories.tsx +8 -35
  197. package/lib/components/Select/Select.tsx +2 -2
  198. package/lib/components/Select/Select.types.ts +20 -15
  199. package/lib/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +3 -3
  200. package/lib/components/Select/subcomponents/CustomOption.tsx +22 -9
  201. package/lib/components/Select/subcomponents/CustomSelect.tsx +31 -20
  202. package/lib/components/Select/subcomponents/Panel.tsx +4 -5
  203. package/lib/components/Select/subcomponents/VisibleField.tsx +26 -22
  204. package/lib/components/StandaloneLink/StandaloneLink.stories.tsx +32 -0
  205. package/lib/components/StandaloneLink/StandaloneLink.tsx +183 -0
  206. package/lib/components/StandaloneLink/__tests__/StandaloneLink.test.tsx +57 -0
  207. package/lib/components/StandaloneLink/__tests__/__snapshots__/StandaloneLink.test.tsx.snap +19 -0
  208. package/lib/components/StandaloneLink/index.ts +2 -0
  209. package/lib/components/Table/Table.stories.tsx +337 -0
  210. package/lib/components/Table/Table.tsx +42 -67
  211. package/lib/components/Table/Table.types.ts +14 -0
  212. package/lib/components/Table/__tests__/Table.test.tsx +121 -0
  213. package/lib/components/Table/__tests__/__snapshots__/Table.test.tsx.snap +210 -0
  214. package/lib/components/Table/index.ts +8 -1
  215. package/lib/components/Table/subcomponents/Body.tsx +18 -0
  216. package/lib/components/Table/subcomponents/Cell/Cell.stories.tsx +151 -0
  217. package/lib/components/Table/subcomponents/Cell/Cell.tsx +72 -0
  218. package/lib/components/Table/subcomponents/Cell/CellContent.tsx +91 -0
  219. package/lib/components/Table/subcomponents/Cell/__tests__/Cell.test.tsx +115 -0
  220. package/lib/components/Table/subcomponents/Cell/__tests__/__snapshots__/Cell.test.tsx.snap +107 -0
  221. package/lib/components/Table/subcomponents/Head.tsx +34 -0
  222. package/lib/components/Table/subcomponents/HeadCell/HeadCell.stories.tsx +85 -0
  223. package/lib/components/Table/subcomponents/HeadCell/HeadCell.tsx +99 -0
  224. package/lib/components/Table/subcomponents/HeadCell/HeadCellContent.tsx +61 -0
  225. package/lib/components/Table/subcomponents/HeadCell/__tests__/HeadCell.test.tsx +137 -0
  226. package/lib/components/Table/subcomponents/HeadCell/__tests__/__snapshots__/HeadCell.test.tsx.snap +110 -0
  227. package/lib/components/Table/subcomponents/Row.tsx +49 -0
  228. package/lib/components/Table/subcomponents/SortIcon.tsx +63 -0
  229. package/lib/components/Table/subcomponents/index.ts +14 -0
  230. package/lib/components/Tabs/Tab.tsx +3 -3
  231. package/lib/components/Tabs/TabContext.tsx +1 -0
  232. package/lib/components/Tabs/Tabs.stories.tsx +9 -3
  233. package/lib/components/Tabs/Tabs.tsx +10 -32
  234. package/lib/components/Tabs/__tests__/Tabs.test.tsx +10 -4
  235. package/lib/components/Tabs/__tests__/__snapshots__/Tabs.test.tsx.snap +32 -32
  236. package/lib/components/Timepicker/Timepicker.stories.tsx +43 -0
  237. package/lib/components/Timepicker/Timepicker.tsx +96 -0
  238. package/lib/components/Timepicker/__tests__/Timepicker.test.tsx +55 -0
  239. package/lib/components/Timepicker/__tests__/__snapshots__/Timepicker.test.tsx.snap +19 -0
  240. package/lib/components/Timepicker/index.tsx +2 -0
  241. package/lib/components/Timepicker/utils/convertDateToTimeString.test.ts +54 -0
  242. package/lib/components/Timepicker/utils/convertDateToTimeString.ts +10 -0
  243. package/lib/components/Timepicker/utils/index.ts +1 -0
  244. package/lib/components/WeekPicker/WeekPicker.tsx +26 -0
  245. package/lib/components/WeekPicker/index.ts +1 -0
  246. package/lib/components/WeekPicker/subcomponents/CustomDatepicker.tsx +298 -0
  247. package/lib/components/WeekPicker/subcomponents/DatepickerInput.tsx +111 -0
  248. package/lib/components/WeekPicker/subcomponents/VisibleField.tsx +126 -0
  249. package/lib/components/WeekPicker/subcomponents/index.ts +3 -0
  250. package/lib/components/index.ts +20 -0
  251. package/lib/hooks/index.ts +2 -0
  252. package/lib/hooks/useFocusTrap.ts +123 -0
  253. package/lib/index.ts +1 -0
  254. package/lib/theme/defaultTheme.ts +7 -0
  255. package/lib/utils/__tests__/capitalise.test.ts +40 -0
  256. package/lib/utils/capitalise.ts +4 -0
  257. package/package.json +2 -2
  258. package/dist/components/Datepicker/subcomponents/AcademicWeeks.d.ts +0 -7
  259. package/dist/components/Datepicker/subcomponents/CalendarGrid/CalendarGrid.d.ts +0 -8
  260. package/dist/components/Datepicker/subcomponents/CalendarGrid/index.d.ts +0 -1
  261. package/dist/components/Datepicker/subcomponents/CalendarMenu/CalendarMenu.d.ts +0 -12
  262. package/dist/components/Datepicker/subcomponents/CalendarMenu/index.d.ts +0 -1
  263. package/dist/components/Datepicker/subcomponents/ColumnHeadings/ColumnHeadings.d.ts +0 -2
  264. package/dist/components/Datepicker/subcomponents/ColumnHeadings/index.d.ts +0 -1
  265. package/dist/components/Datepicker/subcomponents/DateField/DateField.d.ts +0 -7
  266. package/dist/components/Datepicker/subcomponents/DateField/index.d.ts +0 -1
  267. package/dist/components/Datepicker/subcomponents/Day/index.d.ts +0 -1
  268. package/dist/components/Datepicker/subcomponents/MonthSelector/MonthSelector.d.ts +0 -6
  269. package/dist/components/Datepicker/subcomponents/MonthSelector/index.d.ts +0 -1
  270. package/dist/components/Datepicker/subcomponents/Native/Native.d.ts +0 -9
  271. package/dist/components/Datepicker/subcomponents/Native/index.d.ts +0 -1
  272. package/dist/components/Datepicker/utils/parseDateForDateField/parseDateForDateField.d.ts +0 -20
  273. package/lib/components/Datepicker/subcomponents/CalendarGrid/CalendarGrid.tsx +0 -54
  274. package/lib/components/Datepicker/subcomponents/CalendarGrid/index.ts +0 -1
  275. package/lib/components/Datepicker/subcomponents/CalendarMenu/CalendarMenu.tsx +0 -90
  276. package/lib/components/Datepicker/subcomponents/CalendarMenu/index.ts +0 -1
  277. package/lib/components/Datepicker/subcomponents/ColumnHeadings/ColumnHeadings.tsx +0 -35
  278. package/lib/components/Datepicker/subcomponents/ColumnHeadings/index.ts +0 -1
  279. package/lib/components/Datepicker/subcomponents/DateField/DateField.tsx +0 -155
  280. package/lib/components/Datepicker/subcomponents/DateField/__tests__/DateField.test.tsx +0 -191
  281. package/lib/components/Datepicker/subcomponents/DateField/index.ts +0 -1
  282. package/lib/components/Datepicker/subcomponents/Day/index.ts +0 -1
  283. package/lib/components/Datepicker/subcomponents/MonthSelector/index.ts +0 -1
  284. package/lib/components/Datepicker/subcomponents/Native/Native.tsx +0 -59
  285. package/lib/components/Datepicker/subcomponents/Native/index.ts +0 -1
  286. package/lib/components/Datepicker/utils/parseDateForDateField/parseDateForDateField.test.ts +0 -41
  287. package/lib/components/Datepicker/utils/parseDateForDateField/parseDateForDateField.ts +0 -48
  288. package/lib/components/Field/__tests__/__snapshots__/Field.test.tsx.snap +0 -300
  289. /package/dist/components/{Datepicker/subcomponents/DateField/__tests__/DateField.test.d.ts → Calendar/__tests__/Calendar.test.d.ts} +0 -0
  290. /package/dist/components/{Datepicker → Calendar}/subcomponents/AcademicWeek.d.ts +0 -0
  291. /package/dist/components/{Datepicker/subcomponents/Day → Calendar/subcomponents}/Day.stories.d.ts +0 -0
  292. /package/dist/components/{Datepicker → Calendar}/utils/getAcademicWeekNumbers/getAcademicWeekNumbers.test.d.ts +0 -0
  293. /package/dist/components/{Datepicker → Calendar}/utils/getDatesForCalendarGrid/getDatesForCalendarGrid.d.ts +0 -0
  294. /package/dist/components/{Datepicker → Calendar}/utils/getDatesForCalendarGrid/getDatesForCalendarGrid.test.d.ts +0 -0
  295. /package/dist/components/{Datepicker/utils/parseDateForDateField/parseDateForDateField.test.d.ts → Calendar/utils/normaliseMonth/normaliseMonth.test.d.ts} +0 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Parses a date string into a Date object.
3
+ * Used in <VisibleField> to parse user input into the controlled <input> field.
4
+ *
5
+ * @param {string} value The date string to parse. Expected format is DD/MM/YYYY, DD-MM-YYYY, or DD MM YYYY.
6
+ * @param {string} [minDate] Optional minimum date string in YYYY-MM-DD format. If the parsed date is before this date, the function returns null.
7
+ * @param {string} [maxDate] Optional maximum date string in YYYY-MM-DD format. If the parsed date is after this date, the function returns null.
8
+ * @returns {Date | null} A Date object representing the parsed date, or null if the input is invalid or out of range.
9
+ */
10
+ const parseInputValue = (
11
+ value: string,
12
+ minDate?: string | null,
13
+ maxDate?: string | null
14
+ ): Date | null => {
15
+ const normaliseDate = (date: Date) => {
16
+ date.setHours(0, 0, 0, 0); // Normalize to UTC midnight to avoid time zone issues
17
+ return date;
18
+ };
19
+
20
+ const acceptedDelimiters = /[-/ ]/; // Hypen, slash, or space
21
+
22
+ const dateParts = value.trim().split(acceptedDelimiters);
23
+ const parsedDay = parseInt(dateParts[0], 10); // (Second argument is just for base 10 -- decimal)
24
+ const parsedMonth = parseInt(dateParts[1], 10);
25
+ const parsedYear = parseInt(dateParts[2], 10);
26
+
27
+ if (isNaN(parsedDay) || isNaN(parsedMonth) || isNaN(parsedYear)) {
28
+ return null;
29
+ }
30
+
31
+ const parsedDate = new Date(parsedYear, parsedMonth - 1, parsedDay); // Month is 0-indexed
32
+
33
+ if (isNaN(parsedDate.getTime())) {
34
+ console.warn(`Parsed date ${parsedDate} is invalid`);
35
+ return null;
36
+ }
37
+
38
+ if (minDate) {
39
+ if (parsedDate < normaliseDate(new Date(minDate))) {
40
+ console.warn(
41
+ `Parsed date ${parsedDate} is before the minimum date ${minDate}`
42
+ );
43
+ return null;
44
+ }
45
+ }
46
+ if (maxDate) {
47
+ if (parsedDate > normaliseDate(new Date(maxDate))) {
48
+ console.warn(
49
+ `Parsed date ${parsedDate} is after the maximum date ${maxDate}`
50
+ );
51
+ return null;
52
+ }
53
+ }
54
+ return parsedDate;
55
+ };
56
+
57
+ export default parseInputValue;
@@ -7,6 +7,7 @@ import React, {
7
7
  } from 'react';
8
8
  import { css, cx } from '@emotion/css';
9
9
  import useTheme from '../../theme/useTheme';
10
+ import { useFocusTrap } from '../../hooks/useFocusTrap';
10
11
 
11
12
  export const NAME = 'ucl-uikit-base-dialog';
12
13
  export const SMALL_WIDTH = 495;
@@ -19,7 +20,13 @@ export interface BaseDialogProps extends HTMLAttributes<HTMLDialogElement> {
19
20
  modal?: boolean;
20
21
  closeOnClickOutside?: boolean;
21
22
  closeOnClickOutsideStopPropagation?: boolean;
22
- onClose?: (ev: React.MouseEvent) => void;
23
+ nonModalCloseOnEscape?: boolean;
24
+ onClose?: (ev: React.MouseEvent | KeyboardEvent) => void;
25
+ // Focus trap related props
26
+ initialFocusRef?: React.RefObject<HTMLElement>;
27
+ finalFocusRef?: React.RefObject<HTMLElement>;
28
+ disableFocusTrap?: boolean;
29
+ restoreFocus?: boolean;
23
30
  testId?: string;
24
31
  }
25
32
 
@@ -29,10 +36,15 @@ const BaseDialog = ({
29
36
  modal = true,
30
37
  closeOnClickOutside = true,
31
38
  closeOnClickOutsideStopPropagation = true,
39
+ nonModalCloseOnEscape = false,
32
40
  onClose,
33
- testId = NAME,
34
41
  className,
35
42
  children,
43
+ initialFocusRef,
44
+ finalFocusRef,
45
+ disableFocusTrap = false,
46
+ restoreFocus = true,
47
+ testId = NAME,
36
48
  ...props
37
49
  }: BaseDialogProps) => {
38
50
  const width = {
@@ -46,6 +58,15 @@ const BaseDialog = ({
46
58
  const dialogRef = useRef<HTMLDialogElement>(null);
47
59
  const previousActiveElement = useRef<HTMLElement | null>(null);
48
60
 
61
+ // Use the focus trap hook
62
+ useFocusTrap({
63
+ isActive: open && modal && !disableFocusTrap,
64
+ containerRef: dialogRef,
65
+ initialFocusRef,
66
+ finalFocusRef,
67
+ restoreFocus,
68
+ });
69
+
49
70
  const hideBodyScroll = css`
50
71
  overflow: hidden;
51
72
  `;
@@ -75,9 +96,27 @@ const BaseDialog = ({
75
96
  }
76
97
  } else if (!open && dialogElement.hasAttribute('open')) {
77
98
  dialogElement.close();
78
- previousActiveElement.current?.focus();
99
+ // Focus restoration is handled by the focus trap hook for modal dialogs,
100
+ // but we keep the fallback for non-modal dialogs or when focus trap is disabled
101
+ if ((!modal || disableFocusTrap) && restoreFocus) {
102
+ previousActiveElement.current?.focus();
103
+ }
79
104
  }
80
- }, [open, modal]);
105
+ }, [open, modal, disableFocusTrap, restoreFocus]);
106
+
107
+ // Handle Escape key to close dialog
108
+ useEffect(() => {
109
+ if (!open || modal || !nonModalCloseOnEscape) return;
110
+
111
+ const handleKeyDown = (event: KeyboardEvent) => {
112
+ if (event.key === 'Escape' && onClose) {
113
+ onClose(event);
114
+ }
115
+ };
116
+
117
+ document.addEventListener('keydown', handleKeyDown);
118
+ return () => document.removeEventListener('keydown', handleKeyDown);
119
+ }, [open, modal, nonModalCloseOnEscape, onClose]);
81
120
 
82
121
  const handleClick = useCallback(
83
122
  (ev: React.MouseEvent<HTMLDialogElement>) => {
@@ -150,6 +189,7 @@ const BaseDialog = ({
150
189
  data-testid={testId}
151
190
  onClick={handleClick}
152
191
  onClose={handleDialogClose}
192
+ aria-modal={modal ? 'true' : 'false'}
153
193
  {...props}
154
194
  >
155
195
  {children}
@@ -9,154 +9,154 @@ import { ThemeContextProvider } from '../../../theme/useTheme';
9
9
  describe('Field', () => {
10
10
  // Snapshot tests
11
11
 
12
- test('Snapshot: Default (no children)', () => {
13
- const renderResult = render(
14
- <ThemeContextProvider>
15
- <Field />
16
- </ThemeContextProvider>
17
- );
18
- expect(renderResult.container.firstChild).toMatchSnapshot();
19
- });
20
-
21
- test('Snapshot: Field.HelperText alone', () => {
22
- const renderResult = render(
23
- <ThemeContextProvider>
24
- <Field.HelperText>Helper text</Field.HelperText>
25
- </ThemeContextProvider>
26
- );
27
- expect(renderResult.container.firstChild).toMatchSnapshot();
28
- });
29
-
30
- test('Snapshot: Field.ErrorText alone', () => {
31
- const renderResult = render(
32
- <ThemeContextProvider>
33
- <Field.ErrorText>Error text</Field.ErrorText>
34
- </ThemeContextProvider>
35
- );
36
- // Expected behaviour here is to return `null`
37
- // unless <Field> provides `error` via context
38
- expect(renderResult.container.firstChild).toMatchSnapshot();
39
- });
40
-
41
- test('Snapshot: With Label, Input', () => {
42
- const renderResult = render(
43
- <ThemeContextProvider>
44
- <Field>
45
- <Label>Name</Label>
46
- <Input />
47
- </Field>
48
- </ThemeContextProvider>
49
- );
50
- expect(renderResult.container.firstChild).toMatchSnapshot();
51
- });
52
-
53
- test('Snapshot: With Label, HelperText, ErrorText, Input', () => {
54
- const renderResult = render(
55
- <ThemeContextProvider>
56
- <Field>
57
- <Label>Name</Label>
58
- <Field.HelperText>Helper text</Field.HelperText>
59
- <Field.ErrorText>Error text</Field.ErrorText>
60
- <Input />
61
- </Field>
62
- </ThemeContextProvider>
63
- );
64
- expect(renderResult.container.firstChild).toMatchSnapshot();
65
- });
66
-
67
- test('Snapshot: With Label, HelperText, ErrorText, Input, & prop disabled', () => {
68
- const renderResult = render(
69
- <ThemeContextProvider>
70
- <Field disabled>
71
- <Label>Name</Label>
72
- <Field.HelperText>Helper text</Field.HelperText>
73
- <Field.ErrorText>Error text</Field.ErrorText>
74
- <Input />
75
- </Field>
76
- </ThemeContextProvider>
77
- );
78
- expect(renderResult.container.firstChild).toMatchSnapshot();
79
- });
80
-
81
- test('Snapshot: With Label, HelperText, ErrorText, Input, & prop error', () => {
82
- const renderResult = render(
83
- <ThemeContextProvider>
84
- <Field error>
85
- <Label>Name</Label>
86
- <Field.HelperText>Helper text</Field.HelperText>
87
- <Field.ErrorText>Error text</Field.ErrorText>
88
- <Input />
89
- </Field>
90
- </ThemeContextProvider>
91
- );
92
- expect(renderResult.container.firstChild).toMatchSnapshot();
93
- });
94
-
95
- test('Snapshot: With Label, HelperText, ErrorText, Input, & prop optional', () => {
96
- const renderResult = render(
97
- <ThemeContextProvider>
98
- <Field optional>
99
- <Label>Name</Label>
100
- <Field.HelperText>Helper text</Field.HelperText>
101
- <Field.ErrorText>Error text</Field.ErrorText>
102
- <Input />
103
- </Field>
104
- </ThemeContextProvider>
105
- );
106
- expect(renderResult.container.firstChild).toMatchSnapshot();
107
- });
108
-
109
- test('Snapshot: With Label, Textarea', () => {
110
- const renderResult = render(
111
- <ThemeContextProvider>
112
- <Field>
113
- <Label>Name</Label>
114
- <Textarea />
115
- </Field>
116
- </ThemeContextProvider>
117
- );
118
- expect(renderResult.container.firstChild).toMatchSnapshot();
119
- });
120
-
121
- test('Snapshot: With Label, HelperText, ErrorText, Textarea', () => {
122
- const renderResult = render(
123
- <ThemeContextProvider>
124
- <Field>
125
- <Label>Name</Label>
126
- <Field.HelperText>Helper text</Field.HelperText>
127
- <Field.ErrorText>Error text</Field.ErrorText>
128
- <Textarea />
129
- </Field>
130
- </ThemeContextProvider>
131
- );
132
- expect(renderResult.container.firstChild).toMatchSnapshot();
133
- });
134
-
135
- test('Snapshot: With Label, HelperText, ErrorText, Textarea, & prop disabled', () => {
136
- const renderResult = render(
137
- <ThemeContextProvider>
138
- <Field disabled>
139
- <Label>Name</Label>
140
- <Field.HelperText>Helper text</Field.HelperText>
141
- <Field.ErrorText>Error text</Field.ErrorText>
142
- <Textarea />
143
- </Field>
144
- </ThemeContextProvider>
145
- );
146
- expect(renderResult.container.firstChild).toMatchSnapshot();
147
- });
148
-
149
- test('Snapshot: With Textarea & prop maxChar', () => {
150
- const renderResult = render(
151
- <ThemeContextProvider>
152
- <Field>
153
- <Textarea />
154
- <Field.CharacterCount maxChars={100} />
155
- </Field>
156
- </ThemeContextProvider>
157
- );
158
- expect(renderResult.container.firstChild).toMatchSnapshot();
159
- });
12
+ // test('Snapshot: Default (no children)', () => {
13
+ // const renderResult = render(
14
+ // <ThemeContextProvider>
15
+ // <Field />
16
+ // </ThemeContextProvider>
17
+ // );
18
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
19
+ // });
20
+
21
+ // test('Snapshot: Field.HelperText alone', () => {
22
+ // const renderResult = render(
23
+ // <ThemeContextProvider>
24
+ // <Field.HelperText>Helper text</Field.HelperText>
25
+ // </ThemeContextProvider>
26
+ // );
27
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
28
+ // });
29
+
30
+ // test('Snapshot: Field.ErrorText alone', () => {
31
+ // const renderResult = render(
32
+ // <ThemeContextProvider>
33
+ // <Field.ErrorText>Error text</Field.ErrorText>
34
+ // </ThemeContextProvider>
35
+ // );
36
+ // // Expected behaviour here is to return `null`
37
+ // // unless <Field> provides `error` via context
38
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
39
+ // });
40
+
41
+ // test('Snapshot: With Label, Input', () => {
42
+ // const renderResult = render(
43
+ // <ThemeContextProvider>
44
+ // <Field>
45
+ // <Label>Name</Label>
46
+ // <Input />
47
+ // </Field>
48
+ // </ThemeContextProvider>
49
+ // );
50
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
51
+ // });
52
+
53
+ // test('Snapshot: With Label, HelperText, ErrorText, Input', () => {
54
+ // const renderResult = render(
55
+ // <ThemeContextProvider>
56
+ // <Field>
57
+ // <Label>Name</Label>
58
+ // <Field.HelperText>Helper text</Field.HelperText>
59
+ // <Field.ErrorText>Error text</Field.ErrorText>
60
+ // <Input />
61
+ // </Field>
62
+ // </ThemeContextProvider>
63
+ // );
64
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
65
+ // });
66
+
67
+ // test('Snapshot: With Label, HelperText, ErrorText, Input, & prop disabled', () => {
68
+ // const renderResult = render(
69
+ // <ThemeContextProvider>
70
+ // <Field disabled>
71
+ // <Label>Name</Label>
72
+ // <Field.HelperText>Helper text</Field.HelperText>
73
+ // <Field.ErrorText>Error text</Field.ErrorText>
74
+ // <Input />
75
+ // </Field>
76
+ // </ThemeContextProvider>
77
+ // );
78
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
79
+ // });
80
+
81
+ // test('Snapshot: With Label, HelperText, ErrorText, Input, & prop error', () => {
82
+ // const renderResult = render(
83
+ // <ThemeContextProvider>
84
+ // <Field error>
85
+ // <Label>Name</Label>
86
+ // <Field.HelperText>Helper text</Field.HelperText>
87
+ // <Field.ErrorText>Error text</Field.ErrorText>
88
+ // <Input />
89
+ // </Field>
90
+ // </ThemeContextProvider>
91
+ // );
92
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
93
+ // });
94
+
95
+ // test('Snapshot: With Label, HelperText, ErrorText, Input, & prop optional', () => {
96
+ // const renderResult = render(
97
+ // <ThemeContextProvider>
98
+ // <Field optional>
99
+ // <Label>Name</Label>
100
+ // <Field.HelperText>Helper text</Field.HelperText>
101
+ // <Field.ErrorText>Error text</Field.ErrorText>
102
+ // <Input />
103
+ // </Field>
104
+ // </ThemeContextProvider>
105
+ // );
106
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
107
+ // });
108
+
109
+ // test('Snapshot: With Label, Textarea', () => {
110
+ // const renderResult = render(
111
+ // <ThemeContextProvider>
112
+ // <Field>
113
+ // <Label>Name</Label>
114
+ // <Textarea />
115
+ // </Field>
116
+ // </ThemeContextProvider>
117
+ // );
118
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
119
+ // });
120
+
121
+ // test('Snapshot: With Label, HelperText, ErrorText, Textarea', () => {
122
+ // const renderResult = render(
123
+ // <ThemeContextProvider>
124
+ // <Field>
125
+ // <Label>Name</Label>
126
+ // <Field.HelperText>Helper text</Field.HelperText>
127
+ // <Field.ErrorText>Error text</Field.ErrorText>
128
+ // <Textarea />
129
+ // </Field>
130
+ // </ThemeContextProvider>
131
+ // );
132
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
133
+ // });
134
+
135
+ // test('Snapshot: With Label, HelperText, ErrorText, Textarea, & prop disabled', () => {
136
+ // const renderResult = render(
137
+ // <ThemeContextProvider>
138
+ // <Field disabled>
139
+ // <Label>Name</Label>
140
+ // <Field.HelperText>Helper text</Field.HelperText>
141
+ // <Field.ErrorText>Error text</Field.ErrorText>
142
+ // <Textarea />
143
+ // </Field>
144
+ // </ThemeContextProvider>
145
+ // );
146
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
147
+ // });
148
+
149
+ // test('Snapshot: With Textarea & prop maxChar', () => {
150
+ // const renderResult = render(
151
+ // <ThemeContextProvider>
152
+ // <Field>
153
+ // <Textarea />
154
+ // <Field.CharacterCount maxChars={100} />
155
+ // </Field>
156
+ // </ThemeContextProvider>
157
+ // );
158
+ // expect(renderResult.container.firstChild).toMatchSnapshot();
159
+ // });
160
160
 
161
161
  // Interation tests
162
162
 
@@ -0,0 +1,70 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import FileInput from './FileInput';
3
+
4
+ const meta = {
5
+ title: 'Components/WorkInProgress/FileInput',
6
+ component: FileInput,
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ tags: ['autodocs'],
11
+ } satisfies Meta<typeof FileInput>;
12
+
13
+ export default meta;
14
+ type Story = StoryObj<typeof meta>;
15
+
16
+ export const Default: Story = {
17
+ args: {
18
+ children: 'Upload file or images',
19
+ testId: 'file-input-default',
20
+ },
21
+ };
22
+
23
+ export const WithCustomClass: Story = {
24
+ args: {
25
+ children: 'Custom Styled File Input',
26
+ className: 'custom-class',
27
+ testId: 'file-input-custom',
28
+ },
29
+ };
30
+
31
+ export const MultipleFiles: Story = {
32
+ args: {
33
+ children: 'Upload multiple files',
34
+ testId: 'file-input-multiple',
35
+ multiple: true,
36
+ },
37
+ };
38
+
39
+ export const NoChildren: Story = {
40
+ args: {
41
+ testId: 'file-input-no-children',
42
+ },
43
+ };
44
+
45
+ export const WithDecorator: Story = {
46
+ name: 'FileInput with decorator',
47
+ args: {
48
+ children: 'FileInput with a decorator',
49
+ testId: 'file-input-decorator',
50
+ },
51
+ decorators: [
52
+ (Story) => (
53
+ <div>
54
+ <div
55
+ style={{
56
+ height: '16px',
57
+ backgroundColor: '#0d68cf',
58
+ }}
59
+ />
60
+ <Story />
61
+ <div
62
+ style={{
63
+ height: '16px',
64
+ backgroundColor: '#0d68cf',
65
+ }}
66
+ />
67
+ </div>
68
+ ),
69
+ ],
70
+ };
@@ -0,0 +1,68 @@
1
+ import { css, cx } from '@emotion/css';
2
+ import { useTheme } from '../../theme';
3
+ import { InputHTMLAttributes } from 'react';
4
+ import { Icon } from '..';
5
+ import { useRef } from 'react';
6
+
7
+ export const NAME = 'ucl-uikit-fileinput';
8
+
9
+ export interface FileInputProps extends InputHTMLAttributes<HTMLInputElement> {
10
+ testId?: string;
11
+ labelId?: string;
12
+ }
13
+
14
+ const FileInput = ({
15
+ testId = NAME,
16
+ children,
17
+ labelId = '1',
18
+ ...props
19
+ }: FileInputProps) => {
20
+ const [theme] = useTheme();
21
+ const fileInputRef = useRef<HTMLInputElement>(null);
22
+
23
+ const baseStyle = css`
24
+ font-size: ${theme.font.size.f16};
25
+ font-family: ${theme.font.family.primary};
26
+ color: ${theme.color.link.default};
27
+ `;
28
+
29
+ const hiddenInputContainerStyle = css`
30
+ opacity: 0;
31
+ width: 0;
32
+ height: 0;
33
+ position: absolute;
34
+ `;
35
+
36
+ const labelStyle = css`
37
+ display: inline-flex;
38
+ text-decoration: underline;
39
+ gap: 6px;
40
+ font-weight: 700;
41
+ margin-top: 3px;
42
+ cursor: pointer;
43
+ `;
44
+
45
+ const style = cx(NAME, baseStyle, props.className);
46
+
47
+ return (
48
+ <div className={style}>
49
+ <label
50
+ htmlFor={`file-input-${labelId}`}
51
+ className={labelStyle}
52
+ >
53
+ <Icon.Upload />
54
+ {children}
55
+ </label>
56
+ <input
57
+ ref={fileInputRef}
58
+ type='file'
59
+ data-testid={testId}
60
+ className={hiddenInputContainerStyle}
61
+ id={`file-input-${labelId}`}
62
+ {...props}
63
+ />
64
+ </div>
65
+ );
66
+ };
67
+
68
+ export default FileInput;