@variocube/app-ui 1.15.0 → 1.16.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 (319) hide show
  1. package/esm/AppShell/AppShell.js +12 -12
  2. package/esm/AppShell/AppShell.js.map +1 -1
  3. package/esm/AppShell/index.js.map +1 -1
  4. package/esm/Input/ActionsMenu.js +1 -1
  5. package/esm/Input/ActionsMenu.js.map +1 -1
  6. package/esm/Input/EmailSenderField.js +3 -3
  7. package/esm/Input/EmailSenderField.js.map +1 -1
  8. package/esm/Input/Selector.js +2 -2
  9. package/esm/Input/Selector.js.map +1 -1
  10. package/esm/Paging/Paging.d.ts +1 -1
  11. package/esm/Paging/Paging.js +5 -5
  12. package/esm/Paging/Paging.js.map +1 -1
  13. package/esm/Paging/index.d.ts +2 -1
  14. package/esm/Paging/index.js.map +1 -1
  15. package/esm/VCThemeProvider/JetbrainsMonoFont.js +8 -8
  16. package/esm/VCThemeProvider/JetbrainsMonoFont.js.map +1 -1
  17. package/esm/VCThemeProvider/RobotoFont.js +8 -8
  18. package/esm/VCThemeProvider/RobotoFont.js.map +1 -1
  19. package/esm/VCThemeProvider/ThemeModeSwitcher.js +5 -5
  20. package/esm/VCThemeProvider/ThemeModeSwitcher.js.map +1 -1
  21. package/esm/VCThemeProvider/VCThemeProvider.d.ts +1 -1
  22. package/esm/VCThemeProvider/VCThemeProvider.js +21 -21
  23. package/esm/VCThemeProvider/VCThemeProvider.js.map +1 -1
  24. package/esm/audit/AuditChanges.js +9 -5
  25. package/esm/audit/AuditChanges.js.map +1 -1
  26. package/esm/audit/AuditTimeline.js +1 -1
  27. package/esm/audit/AuditTimeline.js.map +1 -1
  28. package/esm/audit/AuditTimelineItem.js +3 -3
  29. package/esm/audit/AuditTimelineItem.js.map +1 -1
  30. package/esm/audit/index.d.ts +1 -1
  31. package/esm/audit/index.js +1 -1
  32. package/esm/audit/index.js.map +1 -1
  33. package/esm/breadcrumbs.d.ts +2 -2
  34. package/esm/breadcrumbs.js +3 -3
  35. package/esm/breadcrumbs.js.map +1 -1
  36. package/esm/code/CodeBlock.d.ts +1 -1
  37. package/esm/code/CodeBlock.js +1 -1
  38. package/esm/code/CodeBlock.js.map +1 -1
  39. package/esm/confirm/ConfirmButton.js.map +1 -1
  40. package/esm/confirm/ConfirmDialog.js +1 -1
  41. package/esm/confirm/ConfirmDialog.js.map +1 -1
  42. package/esm/confirm/ConfirmMenuItem.js +1 -1
  43. package/esm/confirm/ConfirmMenuItem.js.map +1 -1
  44. package/esm/container/ContainerLayout.d.ts +1 -1
  45. package/esm/container/ContainerLayout.js +5 -5
  46. package/esm/container/ContainerLayout.js.map +1 -1
  47. package/esm/container/ContainerSettingsContext.d.ts +2 -2
  48. package/esm/container/ContainerSettingsContext.js +6 -6
  49. package/esm/container/ContainerSettingsContext.js.map +1 -1
  50. package/esm/container/ContainerWidthControl.js +2 -2
  51. package/esm/container/ContainerWidthControl.js.map +1 -1
  52. package/esm/container/index.d.ts +1 -1
  53. package/esm/container/index.js +1 -1
  54. package/esm/container/index.js.map +1 -1
  55. package/esm/content-table/ContentTable.d.ts +1 -1
  56. package/esm/content-table/ContentTable.js +26 -19
  57. package/esm/content-table/ContentTable.js.map +1 -1
  58. package/esm/content-table/UndrawEmpty.js.map +1 -1
  59. package/esm/content-table/index.js.map +1 -1
  60. package/esm/country/country-select.js.map +1 -1
  61. package/esm/country/index.d.ts +3 -3
  62. package/esm/country/index.js +3 -3
  63. package/esm/country/index.js.map +1 -1
  64. package/esm/country/locale-select.js +1 -1
  65. package/esm/country/locale-select.js.map +1 -1
  66. package/esm/country/locales.js +1 -1
  67. package/esm/country/locales.js.map +1 -1
  68. package/esm/country/phone-prefix-select.js +1 -1
  69. package/esm/country/phone-prefix-select.js.map +1 -1
  70. package/esm/cube/accessibility.js +2 -1
  71. package/esm/cube/accessibility.js.map +1 -1
  72. package/esm/data-table/DataTableColumnSettings.d.ts +1 -1
  73. package/esm/data-table/DataTableColumnSettings.js +2 -2
  74. package/esm/data-table/DataTableColumnSettings.js.map +1 -1
  75. package/esm/data-table/DataTableHeader.js +1 -1
  76. package/esm/data-table/DataTableHeader.js.map +1 -1
  77. package/esm/data-table/DataTableToolbar.js +1 -1
  78. package/esm/data-table/DataTableToolbar.js.map +1 -1
  79. package/esm/data-table/index.d.ts +4 -4
  80. package/esm/data-table/index.js +4 -4
  81. package/esm/data-table/index.js.map +1 -1
  82. package/esm/data-table/useDataTableColumnStorage.d.ts +9 -1
  83. package/esm/data-table/useDataTableColumnStorage.js +12 -5
  84. package/esm/data-table/useDataTableColumnStorage.js.map +1 -1
  85. package/esm/data-table/useDataTableStorage.d.ts +31 -6
  86. package/esm/data-table/useDataTableStorage.js +25 -5
  87. package/esm/data-table/useDataTableStorage.js.map +1 -1
  88. package/esm/date-pickers/PlainAdapterCommon.d.ts +1 -1
  89. package/esm/date-pickers/PlainAdapterCommon.js.map +1 -1
  90. package/esm/date-pickers/PlainDateAdapter.js.map +1 -1
  91. package/esm/date-pickers/PlainDatePicker.js +1 -1
  92. package/esm/date-pickers/PlainDatePicker.js.map +1 -1
  93. package/esm/date-pickers/PlainDatePicker.spec.js +2 -2
  94. package/esm/date-pickers/PlainDatePicker.spec.js.map +1 -1
  95. package/esm/date-pickers/PlainDateTimeAdapter.js.map +1 -1
  96. package/esm/date-pickers/PlainDateTimePicker.js +2 -2
  97. package/esm/date-pickers/PlainDateTimePicker.js.map +1 -1
  98. package/esm/date-pickers/PlainDateTimePicker.spec.js +2 -2
  99. package/esm/date-pickers/PlainDateTimePicker.spec.js.map +1 -1
  100. package/esm/date-pickers/PlainTimeAdapter.js.map +1 -1
  101. package/esm/date-pickers/PlainTimePicker.js +2 -2
  102. package/esm/date-pickers/PlainTimePicker.js.map +1 -1
  103. package/esm/date-pickers/PlainTimePicker.spec.js +2 -2
  104. package/esm/date-pickers/PlainTimePicker.spec.js.map +1 -1
  105. package/esm/date-pickers/TemporalAdapter.d.ts +1 -1
  106. package/esm/date-pickers/TemporalAdapter.js +1 -1
  107. package/esm/date-pickers/TemporalAdapter.js.map +1 -1
  108. package/esm/date-pickers/TimezoneSelect.js +348 -348
  109. package/esm/date-pickers/TimezoneSelect.js.map +1 -1
  110. package/esm/date-pickers/getFormatString.js.map +1 -1
  111. package/esm/date-pickers/index.d.ts +2 -1
  112. package/esm/date-pickers/index.js +1 -1
  113. package/esm/date-pickers/index.js.map +1 -1
  114. package/esm/date-pickers/parse.js.map +1 -1
  115. package/esm/date-pickers/timeframe-picker.js +7 -7
  116. package/esm/date-pickers/timeframe-picker.js.map +1 -1
  117. package/esm/date-pickers/useLocale.js.map +1 -1
  118. package/esm/date-pickers/useRenderInput.js +5 -3
  119. package/esm/date-pickers/useRenderInput.js.map +1 -1
  120. package/esm/formats/CompactFormat.js +1 -1
  121. package/esm/formats/CompactFormat.js.map +1 -1
  122. package/esm/formats/CompactFormat.spec.js +1 -1
  123. package/esm/formats/CompactFormat.spec.js.map +1 -1
  124. package/esm/formats/CurrencyFormat.js +1 -1
  125. package/esm/formats/CurrencyFormat.js.map +1 -1
  126. package/esm/formats/CurrencyFormat.spec.js +1 -1
  127. package/esm/formats/CurrencyFormat.spec.js.map +1 -1
  128. package/esm/formats/DecimalFormat.js +1 -1
  129. package/esm/formats/DecimalFormat.js.map +1 -1
  130. package/esm/formats/DecimalFormat.spec.js +1 -1
  131. package/esm/formats/DecimalFormat.spec.js.map +1 -1
  132. package/esm/formats/DurationFormat.js +2 -2
  133. package/esm/formats/DurationFormat.js.map +1 -1
  134. package/esm/formats/DurationFormat.spec.js +2 -2
  135. package/esm/formats/DurationFormat.spec.js.map +1 -1
  136. package/esm/formats/TemporalFormat.spec.js +2 -2
  137. package/esm/formats/TemporalFormat.spec.js.map +1 -1
  138. package/esm/formats/TemporalRangeFormat.js +1 -1
  139. package/esm/formats/TemporalRangeFormat.js.map +1 -1
  140. package/esm/formats/TemporalRangeFormat.spec.js +2 -2
  141. package/esm/formats/TemporalRangeFormat.spec.js.map +1 -1
  142. package/esm/formats/useDateTimeFormat.js +5 -2
  143. package/esm/formats/useDateTimeFormat.js.map +1 -1
  144. package/esm/formats/useNumberFormat.js +1 -1
  145. package/esm/formats/useNumberFormat.js.map +1 -1
  146. package/esm/formats/useRelativeTimeFormat.js +4 -2
  147. package/esm/formats/useRelativeTimeFormat.js.map +1 -1
  148. package/esm/forms/SearchForm.js +1 -1
  149. package/esm/forms/SearchForm.js.map +1 -1
  150. package/esm/getNavigatorLanguages.js.map +1 -1
  151. package/esm/getSupportedFormatLocale.js.map +1 -1
  152. package/esm/help/HelpDrawer.js +12 -8
  153. package/esm/help/HelpDrawer.js.map +1 -1
  154. package/esm/help/index.d.ts +1 -1
  155. package/esm/help/index.js +1 -1
  156. package/esm/help/index.js.map +1 -1
  157. package/esm/icons.d.ts +13 -13
  158. package/esm/icons.js +13 -13
  159. package/esm/icons.js.map +1 -1
  160. package/esm/layout/ErrorBoundary.js +36 -36
  161. package/esm/layout/ErrorBoundary.js.map +1 -1
  162. package/esm/layout/NotFound.js +6 -6
  163. package/esm/layout/NotFound.js.map +1 -1
  164. package/esm/layout/NotFoundSvg.js.map +1 -1
  165. package/esm/layout/UserNav.js +18 -18
  166. package/esm/layout/UserNav.js.map +1 -1
  167. package/esm/layout/index.d.ts +2 -2
  168. package/esm/layout/index.js +2 -2
  169. package/esm/layout/index.js.map +1 -1
  170. package/esm/logo/Logo.js +2 -2
  171. package/esm/logo/Logo.js.map +1 -1
  172. package/esm/logo/VCAppLogo.js +1 -1
  173. package/esm/logo/VCAppLogo.js.map +1 -1
  174. package/esm/logo/index.d.ts +3 -3
  175. package/esm/logo/index.js +3 -3
  176. package/esm/logo/index.js.map +1 -1
  177. package/esm/splash/index.js +2 -2
  178. package/esm/splash/index.js.map +1 -1
  179. package/esm/storage/MemoryStorage.d.ts +6 -4
  180. package/esm/storage/MemoryStorage.js +13 -4
  181. package/esm/storage/MemoryStorage.js.map +1 -1
  182. package/esm/storage/index.d.ts +2 -1
  183. package/esm/storage/index.js +1 -1
  184. package/esm/storage/index.js.map +1 -1
  185. package/esm/storage/storage.d.ts +6 -4
  186. package/esm/storage/storage.js +35 -15
  187. package/esm/storage/storage.js.map +1 -1
  188. package/esm/storage/types.d.ts +6 -0
  189. package/esm/storage/types.js +2 -0
  190. package/esm/storage/types.js.map +1 -0
  191. package/esm/storage/useStorage.d.ts +10 -1
  192. package/esm/storage/useStorage.js +18 -6
  193. package/esm/storage/useStorage.js.map +1 -1
  194. package/esm/tabs/Tabs.d.ts +2 -2
  195. package/esm/tabs/Tabs.js +15 -15
  196. package/esm/tabs/Tabs.js.map +1 -1
  197. package/esm/tabs/index.js.map +1 -1
  198. package/esm/temporal/index.d.ts +1 -1
  199. package/esm/temporal/index.js +1 -1
  200. package/esm/temporal/index.js.map +1 -1
  201. package/esm/temporal/parse.js.map +1 -1
  202. package/esm/temporal/polyfill.d.ts +1 -1
  203. package/esm/temporal/polyfill.js +3 -3
  204. package/esm/temporal/polyfill.js.map +1 -1
  205. package/esm/utils/defined.js.map +1 -1
  206. package/esm/utils/index.d.ts +1 -1
  207. package/esm/utils/index.js +1 -1
  208. package/esm/utils/index.js.map +1 -1
  209. package/esm/utils/useFlag.js.map +1 -1
  210. package/esm/utils/useIsMounted.js.map +1 -1
  211. package/package.json +8 -9
  212. package/src/AppShell/AppShell.tsx +147 -140
  213. package/src/AppShell/index.tsx +1 -1
  214. package/src/Input/ActionsMenu.tsx +70 -73
  215. package/src/Input/EmailSenderField.tsx +59 -52
  216. package/src/Input/Selector.tsx +15 -15
  217. package/src/LanguageSwitcher/index.ts +1 -1
  218. package/src/Paging/Paging.ts +56 -57
  219. package/src/Paging/index.ts +2 -1
  220. package/src/VCThemeProvider/JetbrainsMonoFont.tsx +52 -42
  221. package/src/VCThemeProvider/RobotoFont.tsx +47 -39
  222. package/src/VCThemeProvider/ThemeModeSwitcher.tsx +17 -17
  223. package/src/VCThemeProvider/VCThemeProvider.tsx +149 -145
  224. package/src/audit/AuditChanges.tsx +18 -12
  225. package/src/audit/AuditTimeline.tsx +16 -17
  226. package/src/audit/AuditTimelineItem.tsx +58 -61
  227. package/src/audit/index.ts +2 -2
  228. package/src/audit/types.ts +27 -28
  229. package/src/breadcrumbs.tsx +11 -15
  230. package/src/code/CodeBlock.tsx +10 -10
  231. package/src/confirm/ConfirmButton.tsx +56 -56
  232. package/src/confirm/ConfirmDialog.tsx +54 -54
  233. package/src/confirm/ConfirmMenuItem.tsx +51 -53
  234. package/src/container/ContainerLayout.tsx +7 -8
  235. package/src/container/ContainerSettingsContext.tsx +49 -46
  236. package/src/container/ContainerWidthControl.tsx +11 -9
  237. package/src/container/index.ts +8 -3
  238. package/src/content-table/ContentTable.tsx +235 -197
  239. package/src/content-table/UndrawEmpty.tsx +281 -281
  240. package/src/content-table/index.ts +1 -1
  241. package/src/country/country-select.tsx +0 -1
  242. package/src/country/index.ts +3 -3
  243. package/src/country/locale-select.tsx +36 -36
  244. package/src/country/locales.ts +185 -187
  245. package/src/country/phone-prefix-select.tsx +4 -5
  246. package/src/cube/accessibility.tsx +2 -1
  247. package/src/data-table/DataTableColumnSettings.tsx +181 -181
  248. package/src/data-table/DataTableHeader.tsx +6 -6
  249. package/src/data-table/DataTableToolbar.tsx +6 -6
  250. package/src/data-table/index.tsx +4 -4
  251. package/src/data-table/useDataTableColumnStorage.ts +30 -19
  252. package/src/data-table/useDataTableStorage.spec.ts +108 -0
  253. package/src/data-table/useDataTableStorage.ts +91 -36
  254. package/src/date-pickers/PlainAdapterCommon.ts +118 -120
  255. package/src/date-pickers/PlainDateAdapter.spec.ts +44 -46
  256. package/src/date-pickers/PlainDateAdapter.ts +130 -132
  257. package/src/date-pickers/PlainDatePicker.spec.tsx +17 -18
  258. package/src/date-pickers/PlainDatePicker.tsx +33 -36
  259. package/src/date-pickers/PlainDateTimeAdapter.spec.ts +44 -46
  260. package/src/date-pickers/PlainDateTimeAdapter.ts +141 -134
  261. package/src/date-pickers/PlainDateTimePicker.spec.tsx +17 -18
  262. package/src/date-pickers/PlainDateTimePicker.tsx +35 -36
  263. package/src/date-pickers/PlainTimeAdapter.ts +219 -221
  264. package/src/date-pickers/PlainTimePicker.spec.tsx +17 -18
  265. package/src/date-pickers/PlainTimePicker.tsx +35 -34
  266. package/src/date-pickers/TemporalAdapter.ts +110 -111
  267. package/src/date-pickers/TimezoneSelect.tsx +375 -375
  268. package/src/date-pickers/getFormatString.ts +29 -29
  269. package/src/date-pickers/index.ts +6 -5
  270. package/src/date-pickers/parse.spec.ts +37 -40
  271. package/src/date-pickers/parse.ts +44 -47
  272. package/src/date-pickers/timeframe-picker.tsx +16 -17
  273. package/src/date-pickers/useLocale.ts +1 -1
  274. package/src/date-pickers/useRenderInput.tsx +24 -15
  275. package/src/formats/CompactFormat.spec.tsx +18 -20
  276. package/src/formats/CompactFormat.tsx +30 -30
  277. package/src/formats/CurrencyFormat.spec.tsx +18 -20
  278. package/src/formats/CurrencyFormat.tsx +52 -52
  279. package/src/formats/DecimalFormat.spec.tsx +18 -20
  280. package/src/formats/DecimalFormat.tsx +47 -47
  281. package/src/formats/DurationFormat.spec.tsx +48 -49
  282. package/src/formats/DurationFormat.tsx +51 -51
  283. package/src/formats/TemporalFormat.spec.tsx +93 -95
  284. package/src/formats/TemporalRangeFormat.spec.tsx +143 -144
  285. package/src/formats/TemporalRangeFormat.tsx +54 -54
  286. package/src/formats/types.ts +1 -3
  287. package/src/formats/useDateTimeFormat.ts +5 -2
  288. package/src/formats/useNumberFormat.ts +3 -3
  289. package/src/formats/useRelativeTimeFormat.ts +5 -3
  290. package/src/forms/SearchForm.tsx +37 -38
  291. package/src/getNavigatorLanguages.ts +4 -5
  292. package/src/getSupportedFormatLocale.ts +10 -10
  293. package/src/help/HelpDrawer.tsx +76 -55
  294. package/src/help/index.ts +3 -3
  295. package/src/icons.ts +21 -21
  296. package/src/layout/ErrorBoundary.tsx +226 -215
  297. package/src/layout/NotFound.tsx +36 -39
  298. package/src/layout/NotFoundSvg.tsx +193 -169
  299. package/src/layout/UserNav.tsx +98 -98
  300. package/src/layout/index.ts +3 -3
  301. package/src/logo/Logo.tsx +6 -7
  302. package/src/logo/VCAppLogo.tsx +22 -20
  303. package/src/logo/index.tsx +3 -3
  304. package/src/splash/index.tsx +25 -25
  305. package/src/storage/MemoryStorage.ts +22 -15
  306. package/src/storage/index.ts +2 -1
  307. package/src/storage/storage.spec.ts +184 -0
  308. package/src/storage/storage.ts +37 -15
  309. package/src/storage/types.ts +6 -0
  310. package/src/storage/useStorage.ts +21 -6
  311. package/src/tabs/Tabs.tsx +172 -170
  312. package/src/tabs/index.ts +1 -1
  313. package/src/temporal/index.ts +1 -1
  314. package/src/temporal/parse.ts +1 -2
  315. package/src/temporal/polyfill.ts +11 -11
  316. package/src/utils/defined.ts +2 -3
  317. package/src/utils/index.ts +1 -1
  318. package/src/utils/useFlag.ts +5 -5
  319. package/src/utils/useIsMounted.ts +9 -9
package/src/tabs/Tabs.tsx CHANGED
@@ -1,187 +1,189 @@
1
- import React, {Fragment, SyntheticEvent, useEffect, useRef, useState} from "react";
1
+ import MoreHorizIcon from "@mui/icons-material/MoreHoriz";
2
2
  import {IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Stack} from "@mui/material";
3
- import MuiTabs, {TabsProps as MuiTabsProps} from "@mui/material/Tabs";
4
- import MoreHorizIcon from '@mui/icons-material/MoreHoriz';
5
3
  import MuiTab, {TabProps as MuiTabProps} from "@mui/material/Tab";
4
+ import MuiTabs, {TabsProps as MuiTabsProps} from "@mui/material/Tabs";
5
+ import React, {Fragment, SyntheticEvent, useEffect, useRef, useState} from "react";
6
6
 
7
7
  interface TabItem {
8
- index: number;
9
- width: number;
8
+ index: number;
9
+ width: number;
10
10
  }
11
11
 
12
12
  interface TabProps extends MuiTabProps<React.ElementType> {
13
13
  }
14
14
 
15
15
  interface TabsProps extends MuiTabsProps {
16
- items: TabProps [];
16
+ items: TabProps[];
17
17
  }
18
18
 
19
19
  const hiddenSx = {
20
- visibility: 'hidden',
21
- height: 0,
22
- maxHeight: 'unset',
23
- minHeight: 'unset',
24
- padding: 0
25
- }
20
+ visibility: "hidden",
21
+ height: 0,
22
+ maxHeight: "unset",
23
+ minHeight: "unset",
24
+ padding: 0,
25
+ };
26
26
 
27
27
  export function Tabs(props: TabsProps) {
28
- const {
29
- orientation = "horizontal",
30
- scrollButtons = "auto",
31
- allowScrollButtonsMobile = true,
32
- sx,
33
- onChange,
34
- items: inItems,
35
- value,
36
- ...rest
37
- } = props;
38
-
39
- const items = inItems.map((item, i) => ({
40
- ...item,
41
- value: typeof item.value == "undefined" ? i : item.value
42
- } as TabProps));
43
-
44
- const ref = useRef(null);
45
- const [dropdownEl, setDropdownEl] = useState<null|HTMLElement>(null);
46
-
47
- const [overflowIndex, setOverflowIndex] = useState<number>(items.length);
48
-
49
- const selectedIndex = items.findIndex((item) => item.value == value);
50
-
51
- function handleTabOverflow(root: Element, items: TabItem[]) {
52
- // clientWidth: what the user can see
53
- // scrollWidth: actual size of the DOM object
54
- const {clientWidth} = root;
55
-
56
- // this basically loop through each item size and adding up the width of all items
57
- // if the width exceed the clientWidth of the root node, item will be hidden from the horizontal tab display
58
- // else the item remains visible and its ref from the dropdown list will be hidden otherwise
59
- let overflowIndex = 0;
60
- let itemsWidth = 0;
61
- for (let i = 0; i < items.length; i++) {
62
- itemsWidth += items[i].width;
63
- if (itemsWidth < clientWidth) {
64
- overflowIndex++;
65
- }
66
- }
67
- setOverflowIndex(overflowIndex);
68
- }
69
-
70
- useEffect(() => {
71
- if (ref.current) {
72
- // fetch the root node of tabs
73
- const root = Array.from((ref.current as HTMLButtonElement).children).find(e => e.className.includes('tabRoot'));
74
- if (root) {
75
- // from the root node, traverse down to list node of tab items
76
- const list = Array.from(root.children).find(e => e.className.includes('tabList'));
77
- const items = list ? Array.from(list.children).map((e, index) => ({ index, width: e.clientWidth })) : [];
78
-
79
- // apply the resize observer to the root node and watch for the size changes
80
- const resizeObserver = new ResizeObserver(() => handleTabOverflow(root, items));
81
- resizeObserver.observe(root);
82
- return () => resizeObserver.disconnect();
83
- }
84
- }
85
- }, [ref])
86
-
87
- return (
88
- <Stack
89
- flex={1}
90
- direction="row"
91
- alignItems="center"
92
- sx={{
93
- borderBottom: 1,
94
- borderColor: "divider"
95
- }}
96
- >
97
- <MuiTabs
98
- ref={ref}
99
- orientation="horizontal"
100
- visibleScrollbar={false}
101
- scrollButtons={false}
102
- allowScrollButtonsMobile={false}
103
- sx={{
104
- ...sx,
105
- flex: 1,
106
- }}
107
- classes={{
108
- scroller: 'tabRoot',
109
- flexContainer: 'tabList'
110
- }}
111
- value={value}
112
- onChange={onChange}
113
- {...rest}
114
- >
115
- {items
116
- .map((tabProps, i) => (
117
- <MuiTab
118
- key={'muiTab-' + i}
119
- iconPosition="start"
120
- {...tabProps}
121
- sx={{
122
- ...tabProps.sx,
123
- ...(i >= overflowIndex ? {display: "none"} : undefined),
124
- minHeight: 48,
125
- }}
126
- />
127
- ))}
128
- </MuiTabs>
129
- {(overflowIndex < items.length) && (
130
- <Fragment>
131
- <IconButton
132
- sx={{
133
- ml: 1
134
- }}
135
- onClick={ev => setDropdownEl(ev.currentTarget)}
136
- color={selectedIndex >= overflowIndex ? "primary" : "default"}
137
- >
138
- <MoreHorizIcon fontSize="inherit" />
139
- </IconButton>
140
- <Menu
141
- anchorEl={dropdownEl}
142
- open={!!dropdownEl}
143
- onClose={() => setDropdownEl(null)}
144
- >
145
- {items
146
- .map((tabProps, i) => {
147
- const {
148
- label,
149
- icon,
150
- onClick,
151
- component,
152
- value: itemValue,
153
- ...rest
154
- } = tabProps;
155
-
156
- const selected = value == itemValue;
157
-
158
- function handleClick(ev: SyntheticEvent) {
28
+ const {
29
+ orientation = "horizontal",
30
+ scrollButtons = "auto",
31
+ allowScrollButtonsMobile = true,
32
+ sx,
33
+ onChange,
34
+ items: inItems,
35
+ value,
36
+ ...rest
37
+ } = props;
38
+
39
+ const items = inItems.map((item, i) => ({
40
+ ...item,
41
+ value: typeof item.value == "undefined" ? i : item.value,
42
+ } as TabProps));
43
+
44
+ const ref = useRef(null);
45
+ const [dropdownEl, setDropdownEl] = useState<null | HTMLElement>(null);
46
+
47
+ const [overflowIndex, setOverflowIndex] = useState<number>(items.length);
48
+
49
+ const selectedIndex = items.findIndex((item) => item.value == value);
50
+
51
+ function handleTabOverflow(root: Element, items: TabItem[]) {
52
+ // clientWidth: what the user can see
53
+ // scrollWidth: actual size of the DOM object
54
+ const {clientWidth} = root;
55
+
56
+ // this basically loop through each item size and adding up the width of all items
57
+ // if the width exceed the clientWidth of the root node, item will be hidden from the horizontal tab display
58
+ // else the item remains visible and its ref from the dropdown list will be hidden otherwise
59
+ let overflowIndex = 0;
60
+ let itemsWidth = 0;
61
+ for (let i = 0; i < items.length; i++) {
62
+ itemsWidth += items[i].width;
63
+ if (itemsWidth < clientWidth) {
64
+ overflowIndex++;
65
+ }
66
+ }
67
+ setOverflowIndex(overflowIndex);
68
+ }
69
+
70
+ useEffect(() => {
71
+ if (ref.current) {
72
+ // fetch the root node of tabs
73
+ const root = Array.from((ref.current as HTMLButtonElement).children).find(e =>
74
+ e.className.includes("tabRoot")
75
+ );
76
+ if (root) {
77
+ // from the root node, traverse down to list node of tab items
78
+ const list = Array.from(root.children).find(e => e.className.includes("tabList"));
79
+ const items = list ? Array.from(list.children).map((e, index) => ({index, width: e.clientWidth})) : [];
80
+
81
+ // apply the resize observer to the root node and watch for the size changes
82
+ const resizeObserver = new ResizeObserver(() => handleTabOverflow(root, items));
83
+ resizeObserver.observe(root);
84
+ return () => resizeObserver.disconnect();
85
+ }
86
+ }
87
+ }, [ref]);
88
+
89
+ return (
90
+ <Stack
91
+ flex={1}
92
+ direction="row"
93
+ alignItems="center"
94
+ sx={{
95
+ borderBottom: 1,
96
+ borderColor: "divider",
97
+ }}
98
+ >
99
+ <MuiTabs
100
+ ref={ref}
101
+ orientation="horizontal"
102
+ visibleScrollbar={false}
103
+ scrollButtons={false}
104
+ allowScrollButtonsMobile={false}
105
+ sx={{
106
+ ...sx,
107
+ flex: 1,
108
+ }}
109
+ classes={{
110
+ scroller: "tabRoot",
111
+ flexContainer: "tabList",
112
+ }}
113
+ value={value}
114
+ onChange={onChange}
115
+ {...rest}
116
+ >
117
+ {items
118
+ .map((tabProps, i) => (
119
+ <MuiTab
120
+ key={"muiTab-" + i}
121
+ iconPosition="start"
122
+ {...tabProps}
123
+ sx={{
124
+ ...tabProps.sx,
125
+ ...(i >= overflowIndex ? {display: "none"} : undefined),
126
+ minHeight: 48,
127
+ }}
128
+ />
129
+ ))}
130
+ </MuiTabs>
131
+ {(overflowIndex < items.length) && (
132
+ <Fragment>
133
+ <IconButton
134
+ sx={{
135
+ ml: 1,
136
+ }}
137
+ onClick={ev => setDropdownEl(ev.currentTarget)}
138
+ color={selectedIndex >= overflowIndex ? "primary" : "default"}
139
+ >
140
+ <MoreHorizIcon fontSize="inherit" />
141
+ </IconButton>
142
+ <Menu
143
+ anchorEl={dropdownEl}
144
+ open={!!dropdownEl}
145
+ onClose={() => setDropdownEl(null)}
146
+ >
147
+ {items
148
+ .map((tabProps, i) => {
149
+ const {
150
+ label,
151
+ icon,
152
+ onClick,
153
+ component,
154
+ value: itemValue,
155
+ ...rest
156
+ } = tabProps;
157
+
158
+ const selected = value == itemValue;
159
+
160
+ function handleClick(ev: SyntheticEvent) {
159
161
  if (!selected && onChange) {
160
- onChange(ev, itemValue);
161
- }
162
- if (onClick) {
163
- onClick(ev);
164
- }
165
- setDropdownEl(null);
166
- }
167
-
168
- return (
169
- <MenuItem
170
- key={'dropdownItem-' + i}
171
- onClick={handleClick}
172
- component={component ?? "li"}
173
- sx={i < overflowIndex ? hiddenSx : {}}
174
- selected={selected}
175
- {...rest}
176
- >
177
- {icon && <ListItemIcon>{icon}</ListItemIcon>}
178
- <ListItemText>{label}</ListItemText>
179
- </MenuItem>
180
- )
181
- })}
182
- </Menu>
183
- </Fragment>
184
- )}
185
- </Stack>
186
- );
162
+ onChange(ev, itemValue);
163
+ }
164
+ if (onClick) {
165
+ onClick(ev);
166
+ }
167
+ setDropdownEl(null);
168
+ }
169
+
170
+ return (
171
+ <MenuItem
172
+ key={"dropdownItem-" + i}
173
+ onClick={handleClick}
174
+ component={component ?? "li"}
175
+ sx={i < overflowIndex ? hiddenSx : {}}
176
+ selected={selected}
177
+ {...rest}
178
+ >
179
+ {icon && <ListItemIcon>{icon}</ListItemIcon>}
180
+ <ListItemText>{label}</ListItemText>
181
+ </MenuItem>
182
+ );
183
+ })}
184
+ </Menu>
185
+ </Fragment>
186
+ )}
187
+ </Stack>
188
+ );
187
189
  }
package/src/tabs/index.ts CHANGED
@@ -1 +1 @@
1
- export {Tabs} from "./Tabs";
1
+ export { Tabs } from "./Tabs";
@@ -1,2 +1,2 @@
1
- export * from "./polyfill";
2
1
  export * from "./parse";
2
+ export * from "./polyfill";
@@ -20,8 +20,7 @@ function tryParseString<T>(value: string | undefined | null, parseFn: (value: st
20
20
  if (value) {
21
21
  try {
22
22
  return parseFn(value);
23
- }
24
- catch (error) {
23
+ } catch (error) {
25
24
  // ignore parse error
26
25
  }
27
26
  }
@@ -4,17 +4,17 @@
4
4
  * switch to a conditional polyfill or using the browser built-ins.
5
5
  */
6
6
 
7
- import {Temporal, Intl, toTemporalInstant} from '@js-temporal/polyfill';
7
+ import {Intl, Temporal, toTemporalInstant} from "@js-temporal/polyfill";
8
8
 
9
9
  export const {
10
- Instant,
11
- ZonedDateTime,
12
- PlainDateTime,
13
- PlainDate,
14
- PlainTime,
15
- Now,
16
- Duration,
17
- TimeZone
10
+ Instant,
11
+ ZonedDateTime,
12
+ PlainDateTime,
13
+ PlainDate,
14
+ PlainTime,
15
+ Now,
16
+ Duration,
17
+ TimeZone,
18
18
  } = Temporal;
19
19
 
20
20
  export type Instant = Temporal.Instant;
@@ -26,11 +26,11 @@ export type Duration = Temporal.Duration;
26
26
  export type TimeZone = Temporal.TimeZone;
27
27
 
28
28
  export const {
29
- DateTimeFormat
29
+ DateTimeFormat,
30
30
  } = Intl;
31
31
 
32
32
  export type DateTimeFormat = Intl.DateTimeFormat;
33
33
  export type DateTimeFormatOptions = Intl.DateTimeFormatOptions;
34
34
  export type Formattable = Intl.Formattable;
35
35
 
36
- export {toTemporalInstant};
36
+ export { toTemporalInstant };
@@ -1,4 +1,3 @@
1
-
2
1
  export function defined<T>(x: T | undefined): x is T {
3
- return x !== undefined;
4
- }
2
+ return x !== undefined;
3
+ }
@@ -1,3 +1,3 @@
1
+ export * from "./defined";
1
2
  export * from "./useFlag";
2
3
  export * from "./useIsMounted";
3
- export * from "./defined";
@@ -1,9 +1,9 @@
1
1
  import {useCallback, useState} from "react";
2
2
 
3
3
  export function useFlag(initialValue: boolean) {
4
- const [flag, setFlag] = useState(initialValue);
5
- const set = useCallback(() => setFlag(true), []);
6
- const clear = useCallback(() => setFlag(false), []);
7
- const toggle = useCallback(() => setFlag(prev => !prev), []);
8
- return [flag, set, clear, toggle] as const;
4
+ const [flag, setFlag] = useState(initialValue);
5
+ const set = useCallback(() => setFlag(true), []);
6
+ const clear = useCallback(() => setFlag(false), []);
7
+ const toggle = useCallback(() => setFlag(prev => !prev), []);
8
+ return [flag, set, clear, toggle] as const;
9
9
  }
@@ -1,12 +1,12 @@
1
1
  import {useEffect, useRef} from "react";
2
2
 
3
3
  export function useIsMounted() {
4
- const isMounted = useRef(false);
5
- useEffect(() => {
6
- isMounted.current = true;
7
- return () => {
8
- isMounted.current = false;
9
- }
10
- }, []);
11
- return isMounted.current;
12
- }
4
+ const isMounted = useRef(false);
5
+ useEffect(() => {
6
+ isMounted.current = true;
7
+ return () => {
8
+ isMounted.current = false;
9
+ };
10
+ }, []);
11
+ return isMounted.current;
12
+ }