@opengovsg/oui 0.0.29 → 0.0.31

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 (106) hide show
  1. package/dist/cjs/avatar/avatar-context.cjs +12 -0
  2. package/dist/cjs/avatar/avatar-group-context.cjs +88 -0
  3. package/dist/cjs/avatar/avatar-group.cjs +60 -0
  4. package/dist/cjs/avatar/avatar.cjs +132 -0
  5. package/dist/cjs/avatar/hooks/use-img-loading-status.cjs +68 -0
  6. package/dist/cjs/avatar/index.cjs +23 -0
  7. package/dist/cjs/avatar/utils.cjs +9 -0
  8. package/dist/cjs/banner/banner.cjs +1 -1
  9. package/dist/cjs/checkbox/checkbox.cjs +3 -3
  10. package/dist/cjs/combo-box/combo-box.cjs +1 -1
  11. package/dist/cjs/date-field/date-field.cjs +1 -1
  12. package/dist/cjs/date-picker/date-picker.cjs +5 -4
  13. package/dist/cjs/date-range-picker/date-range-picker.cjs +3 -3
  14. package/dist/cjs/file-dropzone/file-dropzone.cjs +12 -8
  15. package/dist/cjs/file-dropzone/file-info.cjs +3 -2
  16. package/dist/cjs/file-dropzone/utils.cjs +4 -4
  17. package/dist/cjs/hooks/use-scroll-position.cjs +53 -0
  18. package/dist/cjs/index.cjs +61 -47
  19. package/dist/cjs/modal/modal-content.cjs +1 -1
  20. package/dist/cjs/navbar/navbar-menu/menu.cjs +2 -2
  21. package/dist/cjs/navbar/navbar-menu/toggle.cjs +3 -2
  22. package/dist/cjs/navbar/navbar.cjs +25 -1
  23. package/dist/cjs/navbar/use-navbar.cjs +42 -32
  24. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.cjs +22 -0
  25. package/dist/cjs/number-field/number-field.cjs +2 -2
  26. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  27. package/dist/cjs/select/select.cjs +2 -2
  28. package/dist/cjs/tag-field/tag-field.cjs +1 -1
  29. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  30. package/dist/cjs/text-field/text-field.cjs +1 -1
  31. package/dist/esm/avatar/avatar-context.js +9 -0
  32. package/dist/esm/avatar/avatar-group-context.js +84 -0
  33. package/dist/esm/avatar/avatar-group.js +58 -0
  34. package/dist/esm/avatar/avatar.js +128 -0
  35. package/dist/esm/avatar/hooks/use-img-loading-status.js +66 -0
  36. package/dist/esm/avatar/index.js +13 -0
  37. package/dist/esm/avatar/utils.js +7 -0
  38. package/dist/esm/banner/banner.js +1 -1
  39. package/dist/esm/checkbox/checkbox.js +3 -3
  40. package/dist/esm/combo-box/combo-box.js +1 -1
  41. package/dist/esm/date-field/date-field.js +1 -1
  42. package/dist/esm/date-picker/date-picker.js +5 -4
  43. package/dist/esm/date-range-picker/date-range-picker.js +3 -3
  44. package/dist/esm/file-dropzone/file-dropzone.js +12 -8
  45. package/dist/esm/file-dropzone/file-info.js +3 -2
  46. package/dist/esm/file-dropzone/utils.js +4 -4
  47. package/dist/esm/hooks/use-scroll-position.js +51 -0
  48. package/dist/esm/index.js +20 -15
  49. package/dist/esm/modal/modal-content.js +1 -1
  50. package/dist/esm/navbar/navbar-menu/menu.js +2 -2
  51. package/dist/esm/navbar/navbar-menu/toggle.js +3 -2
  52. package/dist/esm/navbar/navbar.js +26 -2
  53. package/dist/esm/navbar/use-navbar.js +43 -33
  54. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.js +17 -0
  55. package/dist/esm/number-field/number-field.js +2 -2
  56. package/dist/esm/range-calendar/range-calendar.js +1 -1
  57. package/dist/esm/select/select.js +2 -2
  58. package/dist/esm/tag-field/tag-field.js +1 -1
  59. package/dist/esm/text-area-field/text-area-field.js +1 -1
  60. package/dist/esm/text-field/text-field.js +1 -1
  61. package/dist/types/avatar/avatar-context.d.ts +12 -0
  62. package/dist/types/avatar/avatar-context.d.ts.map +1 -0
  63. package/dist/types/avatar/avatar-group-context.d.ts +70 -0
  64. package/dist/types/avatar/avatar-group-context.d.ts.map +1 -0
  65. package/dist/types/avatar/avatar-group.d.ts +5 -0
  66. package/dist/types/avatar/avatar-group.d.ts.map +1 -0
  67. package/dist/types/avatar/avatar.d.ts +18 -0
  68. package/dist/types/avatar/avatar.d.ts.map +1 -0
  69. package/dist/types/avatar/hooks/use-img-loading-status.d.ts +4 -0
  70. package/dist/types/avatar/hooks/use-img-loading-status.d.ts.map +1 -0
  71. package/dist/types/avatar/index.d.ts +15 -0
  72. package/dist/types/avatar/index.d.ts.map +1 -0
  73. package/dist/types/avatar/utils.d.ts +2 -0
  74. package/dist/types/avatar/utils.d.ts.map +1 -0
  75. package/dist/types/calendar/calendar.d.ts.map +1 -1
  76. package/dist/types/checkbox/checkbox-group-style-context.d.ts +1 -1
  77. package/dist/types/checkbox/checkbox-group-style-context.d.ts.map +1 -1
  78. package/dist/types/date-field/date-field.d.ts.map +1 -1
  79. package/dist/types/file-dropzone/file-dropzone.d.ts +8 -2
  80. package/dist/types/file-dropzone/file-dropzone.d.ts.map +1 -1
  81. package/dist/types/file-dropzone/file-info.d.ts.map +1 -1
  82. package/dist/types/file-dropzone/types.d.ts +1 -0
  83. package/dist/types/file-dropzone/types.d.ts.map +1 -1
  84. package/dist/types/file-dropzone/utils.d.ts +2 -1
  85. package/dist/types/file-dropzone/utils.d.ts.map +1 -1
  86. package/dist/types/hooks/use-scroll-position.d.ts +29 -0
  87. package/dist/types/hooks/use-scroll-position.d.ts.map +1 -0
  88. package/dist/types/index.d.mts +1 -0
  89. package/dist/types/index.d.ts +1 -0
  90. package/dist/types/index.d.ts.map +1 -1
  91. package/dist/types/menu/menu.d.ts.map +1 -1
  92. package/dist/types/navbar/navbar-context.d.ts +10 -2
  93. package/dist/types/navbar/navbar-context.d.ts.map +1 -1
  94. package/dist/types/navbar/navbar-menu/menu.d.ts.map +1 -1
  95. package/dist/types/navbar/navbar-menu/toggle.d.ts.map +1 -1
  96. package/dist/types/navbar/navbar.d.ts.map +1 -1
  97. package/dist/types/navbar/use-navbar.d.ts +33 -1
  98. package/dist/types/navbar/use-navbar.d.ts.map +1 -1
  99. package/dist/types/range-calendar/range-calendar.d.ts.map +1 -1
  100. package/dist/types/system/react-utils/context.d.ts +4 -4
  101. package/dist/types/system/react-utils/context.d.ts.map +1 -1
  102. package/dist/types/system/utils.d.ts.map +1 -1
  103. package/dist/types/tabs/tabs.d.ts.map +1 -1
  104. package/dist/types/tag-field/tag-field-item.d.ts.map +1 -1
  105. package/dist/types/tag-field/tag-field-list.d.ts.map +1 -1
  106. package/package.json +3 -3
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var context = require('../system/react-utils/context.cjs');
5
+
6
+ const [AvatarContext, useAvatarContext] = context.createContext({
7
+ name: "AvatarContext",
8
+ strict: true
9
+ });
10
+
11
+ exports.AvatarContext = AvatarContext;
12
+ exports.useAvatarContext = useAvatarContext;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var $670gB$react = require('react');
5
+ var ouiTheme = require('@opengovsg/oui-theme');
6
+ var children = require('../system/react-utils/children.cjs');
7
+ var context = require('../system/react-utils/context.cjs');
8
+ var refs = require('../system/react-utils/refs.cjs');
9
+
10
+ const [AvatarGroupProvider, useAvatarGroupContext] = context.createContext({
11
+ name: "AvatarGroupContext",
12
+ strict: false
13
+ });
14
+ function useAvatarGroup(props = {}) {
15
+ const {
16
+ as,
17
+ ref,
18
+ max = 5,
19
+ total,
20
+ size,
21
+ color,
22
+ prominence,
23
+ radius,
24
+ children: children$1,
25
+ renderCount,
26
+ className,
27
+ classNames,
28
+ countProps,
29
+ ...otherProps
30
+ } = props;
31
+ const domRef = refs.useDomRef(ref);
32
+ const Component = as || "div";
33
+ const context = $670gB$react.useMemo(
34
+ () => ({
35
+ size,
36
+ color,
37
+ radius,
38
+ prominence
39
+ }),
40
+ [size, color, radius, prominence]
41
+ );
42
+ const slots = $670gB$react.useMemo(
43
+ () => ouiTheme.avatarGroupStyles({ className: className ?? classNames?.base }),
44
+ [className, classNames?.base]
45
+ );
46
+ const validChildren = children.getValidChildren(children$1);
47
+ const childrenWithinMax = max ? validChildren.slice(0, max) : validChildren;
48
+ const remainingCount = total ? total : max != null ? validChildren.length - max : -1;
49
+ const clones = childrenWithinMax.map((child, index) => {
50
+ return $670gB$react.cloneElement(child, {
51
+ // @ts-expect-error: CSS variable is not recognized as a valid style property
52
+ style: {
53
+ "--avatar-zindex": childrenWithinMax.length - index
54
+ }
55
+ });
56
+ });
57
+ const getAvatarGroupProps = () => {
58
+ return {
59
+ ref: domRef,
60
+ className: slots.base({
61
+ class: ouiTheme.cn(classNames?.base, className)
62
+ }),
63
+ role: "group",
64
+ ...otherProps
65
+ };
66
+ };
67
+ const getAvatarGroupCountProps = () => {
68
+ return {
69
+ className: slots.counter({
70
+ class: classNames?.counter
71
+ }),
72
+ ...countProps
73
+ };
74
+ };
75
+ return {
76
+ Component,
77
+ context,
78
+ remainingCount,
79
+ clones,
80
+ renderCount,
81
+ getAvatarGroupProps,
82
+ getAvatarGroupCountProps
83
+ };
84
+ }
85
+
86
+ exports.AvatarGroupProvider = AvatarGroupProvider;
87
+ exports.useAvatarGroup = useAvatarGroup;
88
+ exports.useAvatarGroupContext = useAvatarGroupContext;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var $670gB$react = require('react');
6
+ var utils = require('../system/utils.cjs');
7
+ var avatar = require('./avatar.cjs');
8
+ var avatarGroupContext = require('./avatar-group-context.cjs');
9
+
10
+ const AvatarGroup = utils.forwardRef((props, ref) => {
11
+ const {
12
+ Component,
13
+ clones,
14
+ context,
15
+ remainingCount,
16
+ getAvatarGroupCountProps,
17
+ getAvatarGroupProps,
18
+ renderCount
19
+ } = avatarGroupContext.useAvatarGroup({
20
+ ...props,
21
+ ref
22
+ });
23
+ const renderedCount = $670gB$react.useMemo(() => {
24
+ if (remainingCount <= 0) return null;
25
+ if (renderCount) {
26
+ return renderCount(remainingCount);
27
+ }
28
+ const countAvatarVariantProps = {
29
+ prominence: "subtle",
30
+ color: "primary"
31
+ };
32
+ if (context.prominence === "subtle") {
33
+ countAvatarVariantProps.color = "white";
34
+ }
35
+ return /* @__PURE__ */ jsxRuntime.jsx(
36
+ avatar.AvatarRoot,
37
+ {
38
+ ...countAvatarVariantProps,
39
+ ...getAvatarGroupCountProps(),
40
+ name: `+${remainingCount}`,
41
+ children: /* @__PURE__ */ jsxRuntime.jsxs(avatar.AvatarFallback, { children: [
42
+ "+",
43
+ remainingCount
44
+ ] })
45
+ }
46
+ );
47
+ }, [
48
+ context.prominence,
49
+ getAvatarGroupCountProps,
50
+ remainingCount,
51
+ renderCount
52
+ ]);
53
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, { ...getAvatarGroupProps(), children: /* @__PURE__ */ jsxRuntime.jsxs(avatarGroupContext.AvatarGroupProvider, { value: context, children: [
54
+ clones,
55
+ renderedCount
56
+ ] }) });
57
+ });
58
+ AvatarGroup.displayName = "AvatarGroup";
59
+
60
+ exports.AvatarGroup = AvatarGroup;
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ "use client";
3
+ 'use strict';
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var $670gB$react = require('react');
7
+ var utils$2 = require('@react-aria/utils');
8
+ var ouiTheme = require('@opengovsg/oui-theme');
9
+ var utils = require('../system/utils.cjs');
10
+ var avatarContext = require('./avatar-context.cjs');
11
+ var avatarGroupContext = require('./avatar-group-context.cjs');
12
+ var useImgLoadingStatus = require('./hooks/use-img-loading-status.cjs');
13
+ var utils$1 = require('./utils.cjs');
14
+ var refs = require('../system/react-utils/refs.cjs');
15
+ var user = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.cjs');
16
+
17
+ const AvatarRoot = utils.forwardRef(
18
+ (originalProps, ref) => {
19
+ const groupContext = avatarGroupContext.useAvatarGroupContext();
20
+ const [
21
+ {
22
+ name,
23
+ getInitials = utils$1.getInitialsFromText,
24
+ classNames,
25
+ className,
26
+ children,
27
+ as,
28
+ ...props
29
+ },
30
+ {
31
+ color = groupContext?.color,
32
+ prominence = groupContext?.prominence,
33
+ size = groupContext?.size,
34
+ radius = groupContext?.radius,
35
+ ...variantProps
36
+ }
37
+ ] = utils.mapPropsVariants(originalProps, ouiTheme.avatarStyles.variantKeys);
38
+ const isInGroup = !!groupContext;
39
+ const domRef = refs.useDomRef(ref);
40
+ const slots = ouiTheme.avatarStyles({
41
+ color,
42
+ prominence,
43
+ size,
44
+ radius,
45
+ isInGroup,
46
+ ...variantProps
47
+ });
48
+ const [imageLoadingStatus, setImageLoadingStatus] = $670gB$react.useState("idle");
49
+ const Component = as || "span";
50
+ return /* @__PURE__ */ jsxRuntime.jsx(
51
+ avatarContext.AvatarContext,
52
+ {
53
+ value: {
54
+ imageLoadingStatus,
55
+ setImageLoadingStatus,
56
+ slots,
57
+ classNames,
58
+ getInitials,
59
+ name
60
+ },
61
+ children: /* @__PURE__ */ jsxRuntime.jsx(
62
+ Component,
63
+ {
64
+ ref: domRef,
65
+ ...props,
66
+ className: slots.base({ className: className ?? classNames?.base }),
67
+ children
68
+ }
69
+ )
70
+ }
71
+ );
72
+ }
73
+ );
74
+ const AvatarImage = utils.forwardRef(
75
+ ({ src, as, ...props }, ref) => {
76
+ const domRef = refs.useDomRef(ref);
77
+ const {
78
+ setImageLoadingStatus,
79
+ imageLoadingStatus,
80
+ slots,
81
+ name,
82
+ classNames
83
+ } = avatarContext.useAvatarContext();
84
+ const currentImageStatus = useImgLoadingStatus.useImageLoadingStatus(src, props);
85
+ const Component = as || "img";
86
+ utils$2.useLayoutEffect(() => {
87
+ setImageLoadingStatus(currentImageStatus);
88
+ }, [currentImageStatus, setImageLoadingStatus]);
89
+ return /* @__PURE__ */ jsxRuntime.jsx(
90
+ Component,
91
+ {
92
+ ref: domRef,
93
+ alt: name,
94
+ "data-loaded": ouiTheme.dataAttr(imageLoadingStatus === "loaded"),
95
+ ...props,
96
+ src,
97
+ className: slots.image({ className: classNames?.image })
98
+ }
99
+ );
100
+ }
101
+ );
102
+ const AvatarFallback = utils.forwardRef(
103
+ ({ children, as, ...props }, ref) => {
104
+ const domRef = refs.useDomRef(ref);
105
+ const { slots, classNames, imageLoadingStatus, name, getInitials } = avatarContext.useAvatarContext();
106
+ const childrenToRender = $670gB$react.useMemo(() => {
107
+ if (children) return children;
108
+ if (name) {
109
+ return getInitials(name);
110
+ }
111
+ return /* @__PURE__ */ jsxRuntime.jsx(user.default, { className: slots.icon({ className: classNames?.icon }) });
112
+ }, [children, classNames?.icon, getInitials, name, slots]);
113
+ const Component = as || "div";
114
+ if (imageLoadingStatus === "loaded") {
115
+ return null;
116
+ }
117
+ return /* @__PURE__ */ jsxRuntime.jsx(
118
+ Component,
119
+ {
120
+ title: name,
121
+ className: slots.fallback({ className: classNames?.fallback }),
122
+ ref: domRef,
123
+ ...props,
124
+ children: childrenToRender
125
+ }
126
+ );
127
+ }
128
+ );
129
+
130
+ exports.AvatarFallback = AvatarFallback;
131
+ exports.AvatarImage = AvatarImage;
132
+ exports.AvatarRoot = AvatarRoot;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var $670gB$react = require('react');
5
+
6
+ function useIsHydrated() {
7
+ return $670gB$react.useSyncExternalStore(
8
+ subscribe,
9
+ () => true,
10
+ () => false
11
+ );
12
+ }
13
+ function subscribe() {
14
+ return () => {
15
+ };
16
+ }
17
+ function resolveLoadingStatus(image, src) {
18
+ if (!image) {
19
+ return "idle";
20
+ }
21
+ if (!src) {
22
+ return "error";
23
+ }
24
+ if (image.src !== src) {
25
+ image.src = src;
26
+ }
27
+ return image.complete && image.naturalWidth > 0 ? "loaded" : "loading";
28
+ }
29
+ function useImageLoadingStatus(src, { referrerPolicy, crossOrigin }) {
30
+ const isHydrated = useIsHydrated();
31
+ const imageRef = $670gB$react.useRef(null);
32
+ const image = (() => {
33
+ if (!isHydrated) return null;
34
+ if (!imageRef.current) {
35
+ imageRef.current = new window.Image();
36
+ }
37
+ return imageRef.current;
38
+ })();
39
+ const [loadingStatus, setLoadingStatus] = $670gB$react.useState(
40
+ () => resolveLoadingStatus(image, src)
41
+ );
42
+ $670gB$react.useLayoutEffect(() => {
43
+ setLoadingStatus(resolveLoadingStatus(image, src));
44
+ }, [image, src]);
45
+ $670gB$react.useLayoutEffect(() => {
46
+ const updateStatus = (status) => () => {
47
+ setLoadingStatus(status);
48
+ };
49
+ if (!image) return;
50
+ const handleLoad = updateStatus("loaded");
51
+ const handleError = updateStatus("error");
52
+ image.addEventListener("load", handleLoad);
53
+ image.addEventListener("error", handleError);
54
+ if (referrerPolicy) {
55
+ image.referrerPolicy = referrerPolicy;
56
+ }
57
+ if (typeof crossOrigin === "string") {
58
+ image.crossOrigin = crossOrigin;
59
+ }
60
+ return () => {
61
+ image.removeEventListener("load", handleLoad);
62
+ image.removeEventListener("error", handleError);
63
+ };
64
+ }, [image, crossOrigin, referrerPolicy]);
65
+ return loadingStatus;
66
+ }
67
+
68
+ exports.useImageLoadingStatus = useImageLoadingStatus;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var avatar = require('./avatar.cjs');
5
+ var avatarContext = require('./avatar-context.cjs');
6
+ var avatarGroup = require('./avatar-group.cjs');
7
+ var avatarGroupContext = require('./avatar-group-context.cjs');
8
+
9
+ const Avatar = Object.assign(avatar.AvatarRoot, {
10
+ Root: avatar.AvatarRoot,
11
+ Image: avatar.AvatarImage,
12
+ Fallback: avatar.AvatarFallback
13
+ });
14
+
15
+ exports.AvatarFallback = avatar.AvatarFallback;
16
+ exports.AvatarImage = avatar.AvatarImage;
17
+ exports.AvatarRoot = avatar.AvatarRoot;
18
+ exports.AvatarContext = avatarContext.AvatarContext;
19
+ exports.useAvatarContext = avatarContext.useAvatarContext;
20
+ exports.AvatarGroup = avatarGroup.AvatarGroup;
21
+ exports.AvatarGroupProvider = avatarGroupContext.AvatarGroupProvider;
22
+ exports.useAvatarGroup = avatarGroupContext.useAvatarGroup;
23
+ exports.Avatar = Avatar;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ const getInitialsFromText = (text, limit = 2) => {
5
+ const initials = text?.trim().split(/[\s\-_.]+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase()).join("") || "";
6
+ return initials.slice(0, limit);
7
+ };
8
+
9
+ exports.getInitialsFromText = getInitialsFromText;
@@ -7,9 +7,9 @@ var $670gB$react = require('react');
7
7
  var reactAria = require('react-aria');
8
8
  var reactStately = require('react-stately');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var button = require('../button/button.cjs');
10
11
  var circleAlert = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs');
11
12
  var info = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/info.cjs');
12
- var button = require('../button/button.cjs');
13
13
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.cjs');
14
14
 
15
15
  const i18nStrings = {
@@ -5,11 +5,11 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
+ var field = require('../field/field.cjs');
8
9
  var utils = require('../system/utils.cjs');
9
10
  var checkboxGroupStyleContext = require('./checkbox-group-style-context.cjs');
10
11
  var minus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.cjs');
11
12
  var check = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.cjs');
12
- var field = require('../field/field.cjs');
13
13
 
14
14
  const Checkbox = ({
15
15
  classNames,
@@ -20,8 +20,8 @@ const Checkbox = ({
20
20
  originalProps,
21
21
  ouiTheme.checkboxStyles.variantKeys
22
22
  );
23
- const { size } = checkboxGroupStyleContext.useCheckboxGroupStyleContext();
24
- const styles = ouiTheme.checkboxStyles({ size, ...variants });
23
+ const context = checkboxGroupStyleContext.useCheckboxGroupStyleContext();
24
+ const styles = ouiTheme.checkboxStyles({ size: context?.size, ...variants });
25
25
  return /* @__PURE__ */ jsxRuntime.jsx(
26
26
  reactAriaComponents.Checkbox,
27
27
  {
@@ -7,10 +7,10 @@ var $670gB$react = require('react');
7
7
  var reactAria = require('react-aria');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var field = require('../field/field.cjs');
10
11
  var popover = require('../popover/popover.cjs');
11
12
  var utils = require('../system/utils.cjs');
12
13
  var comboBoxVariantContext = require('./combo-box-variant-context.cjs');
13
- var field = require('../field/field.cjs');
14
14
  var chevronUp = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs');
15
15
  var chevronDown = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs');
16
16
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.cjs');
@@ -6,8 +6,8 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
- var utils = require('../system/utils.cjs');
10
9
  var field = require('../field/field.cjs');
10
+ var utils = require('../system/utils.cjs');
11
11
 
12
12
  function DateField(originalProps) {
13
13
  const [
@@ -6,13 +6,14 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
+ var button = require('../button/button.cjs');
10
+ var calendar$1 = require('../calendar/calendar.cjs');
11
+ require('@internationalized/date');
12
+ var dateField = require('../date-field/date-field.cjs');
13
+ var field = require('../field/field.cjs');
9
14
  var popover = require('../popover/popover.cjs');
10
15
  var utils = require('../system/utils.cjs');
11
- var dateField = require('../date-field/date-field.cjs');
12
16
  var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
13
- var calendar$1 = require('../calendar/calendar.cjs');
14
- var field = require('../field/field.cjs');
15
- var button = require('../button/button.cjs');
16
17
 
17
18
  function DatePicker(originalProps) {
18
19
  const [
@@ -7,13 +7,13 @@ var $670gB$react = require('react');
7
7
  var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var button = require('../button/button.cjs');
11
+ var dateField = require('../date-field/date-field.cjs');
12
+ var field = require('../field/field.cjs');
10
13
  var popover = require('../popover/popover.cjs');
11
14
  var rangeCalendar = require('../range-calendar/range-calendar.cjs');
12
15
  var utils = require('../system/utils.cjs');
13
16
  var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
14
- var field = require('../field/field.cjs');
15
- var dateField = require('../date-field/date-field.cjs');
16
- var button = require('../button/button.cjs');
17
17
 
18
18
  function DateRangePicker(originalProps) {
19
19
  const [
@@ -9,13 +9,13 @@ var reactAria = require('react-aria');
9
9
  var reactAriaComponents = require('react-aria-components');
10
10
  var reactDropzone = require('react-dropzone');
11
11
  var ouiTheme = require('@opengovsg/oui-theme');
12
+ var field = require('../field/field.cjs');
12
13
  var useControllableState = require('../hooks/use-controllable-state.cjs');
13
14
  var utils = require('../system/utils.cjs');
14
15
  var contexts = require('./contexts.cjs');
15
16
  var fileInfo = require('./file-info.cjs');
16
17
  var utils$1 = require('./utils.cjs');
17
18
  var upload = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/upload.cjs');
18
- var field = require('../field/field.cjs');
19
19
 
20
20
  const FileDropzone = (originalProps) => {
21
21
  const [props, variantProps] = utils.mapPropsVariants(
@@ -25,6 +25,7 @@ const FileDropzone = (originalProps) => {
25
25
  const {
26
26
  name,
27
27
  allowedMimeTypes = [],
28
+ fileSizeBase = "binary",
28
29
  maxFileSize = Number.POSITIVE_INFINITY,
29
30
  minFileSize = 0,
30
31
  showFileSizeText = true,
@@ -69,9 +70,10 @@ const FileDropzone = (originalProps) => {
69
70
  (error) => utils$1.formatErrorMessage(error, {
70
71
  maxFileSize,
71
72
  minFileSize,
72
- maxFiles
73
+ maxFiles,
74
+ fileSizeBase
73
75
  }),
74
- [maxFileSize, maxFiles, minFileSize]
76
+ [fileSizeBase, maxFileSize, maxFiles, minFileSize]
75
77
  );
76
78
  const onDrop = $670gB$react.useCallback(
77
79
  (acceptedFiles, fileRejections) => {
@@ -129,19 +131,20 @@ const FileDropzone = (originalProps) => {
129
131
  const shouldShow = showFileSizeText && (notDefaultMaxFileSize || notDefaultMinFileSize);
130
132
  if (!shouldShow) return null;
131
133
  if (notDefaultMaxFileSize && notDefaultMinFileSize) {
132
- return `File size must be between ${utils$1.formatBytes(minFileSize, 2)} and ${utils$1.formatBytes(
134
+ return `File size must be between ${utils$1.formatBytes(minFileSize, 2, fileSizeBase)} and ${utils$1.formatBytes(
133
135
  maxFileSize,
134
- 2
136
+ 2,
137
+ fileSizeBase
135
138
  )}`;
136
139
  }
137
140
  if (notDefaultMaxFileSize) {
138
- return `Maximum file size: ${utils$1.formatBytes(maxFileSize, 2)}`;
141
+ return `Maximum file size: ${utils$1.formatBytes(maxFileSize, 2, fileSizeBase)}`;
139
142
  }
140
143
  if (notDefaultMinFileSize) {
141
- return `Minimum file size: ${utils$1.formatBytes(minFileSize, 2)}`;
144
+ return `Minimum file size: ${utils$1.formatBytes(minFileSize, 2, fileSizeBase)}`;
142
145
  }
143
146
  return null;
144
- }, [maxFileSize, minFileSize, showFileSizeText]);
147
+ }, [maxFileSize, minFileSize, showFileSizeText, fileSizeBase]);
145
148
  const triggerFileSelector = $670gB$react.useCallback(() => {
146
149
  if (isDisabled || isReadOnly) return;
147
150
  dropzoneState.inputRef.current?.click();
@@ -187,6 +190,7 @@ const FileDropzone = (originalProps) => {
187
190
  {
188
191
  isDisabled,
189
192
  isReadOnly,
193
+ fileSizeBase,
190
194
  maxFiles,
191
195
  maxFileSize,
192
196
  showDropzone,
@@ -5,10 +5,10 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
+ var button = require('../button/button.cjs');
8
9
  var contexts = require('./contexts.cjs');
9
10
  var utils = require('./utils.cjs');
10
11
  var trash2 = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/trash-2.cjs');
11
- var button = require('../button/button.cjs');
12
12
 
13
13
  const FileInfo = ({ file, imagePreview, classNames }) => {
14
14
  const {
@@ -19,7 +19,8 @@ const FileInfo = ({ file, imagePreview, classNames }) => {
19
19
  isReadOnly
20
20
  } = contexts.useFileDropzoneStateContext();
21
21
  const { size, variant, itemClassNames } = contexts.useFileDropzoneStyleContext();
22
- const readableFileSize = utils.formatBytes(file.size, 2);
22
+ const { fileSizeBase } = contexts.useFileDropzoneStateContext();
23
+ const readableFileSize = utils.formatBytes(file.size, 2, fileSizeBase);
23
24
  const styles = ouiTheme.fileInfoDropzoneStyles({
24
25
  size,
25
26
  variant,
@@ -3,8 +3,8 @@
3
3
 
4
4
  var reactDropzone = require('react-dropzone');
5
5
 
6
- const formatBytes = (bytes, decimals = 2, size) => {
7
- const k = 1e3;
6
+ const formatBytes = (bytes, decimals = 2, base = "binary", size) => {
7
+ const k = base === "binary" ? 1024 : 1e3;
8
8
  const dm = decimals < 0 ? 0 : decimals;
9
9
  const sizes = ["bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
10
10
  if (bytes === 0 || bytes === void 0)
@@ -16,9 +16,9 @@ const formatErrorMessage = (error, config) => {
16
16
  const { maxFileSize, minFileSize, maxFiles } = config;
17
17
  switch (error.code) {
18
18
  case reactDropzone.ErrorCode.FileTooLarge:
19
- return `You have exceeded the size limit, please upload a file below ${formatBytes(maxFileSize, 2)}`;
19
+ return `You have exceeded the size limit, please upload a file below ${formatBytes(maxFileSize, 2, config.fileSizeBase)}`;
20
20
  case reactDropzone.ErrorCode.FileTooSmall:
21
- return `Please upload a file above ${formatBytes(minFileSize, 2)}`;
21
+ return `Please upload a file above ${formatBytes(minFileSize, 2, config.fileSizeBase)}`;
22
22
  case reactDropzone.ErrorCode.TooManyFiles:
23
23
  return `Maximum number of files allowed is ${maxFiles}.`;
24
24
  default: {
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var $670gB$react = require('react');
5
+
6
+ const isBrowser = typeof window !== "undefined";
7
+ function getScrollPosition(element) {
8
+ if (!isBrowser) return { x: 0, y: 0 };
9
+ if (!element) {
10
+ return { x: window.scrollX, y: window.scrollY };
11
+ }
12
+ return { x: element.scrollLeft, y: element.scrollTop };
13
+ }
14
+ const useScrollPosition = (props) => {
15
+ const { elementRef, delay = 30, callback, isEnabled } = props;
16
+ const position = $670gB$react.useRef(
17
+ isEnabled ? getScrollPosition(elementRef?.current) : { x: 0, y: 0 }
18
+ );
19
+ const throttleTimeout = $670gB$react.useRef(null);
20
+ const handler = $670gB$react.useCallback(() => {
21
+ const currPos = getScrollPosition(elementRef?.current);
22
+ if (typeof callback === "function") {
23
+ callback({ prevPos: position.current, currPos });
24
+ }
25
+ position.current = currPos;
26
+ throttleTimeout.current = null;
27
+ }, [callback, elementRef]);
28
+ $670gB$react.useEffect(() => {
29
+ if (!isEnabled) return;
30
+ const handleScroll = () => {
31
+ if (delay) {
32
+ if (throttleTimeout.current) {
33
+ clearTimeout(throttleTimeout.current);
34
+ }
35
+ throttleTimeout.current = setTimeout(handler, delay);
36
+ } else {
37
+ handler();
38
+ }
39
+ };
40
+ const target = elementRef?.current || window;
41
+ target.addEventListener("scroll", handleScroll);
42
+ return () => {
43
+ target.removeEventListener("scroll", handleScroll);
44
+ if (throttleTimeout.current) {
45
+ clearTimeout(throttleTimeout.current);
46
+ throttleTimeout.current = null;
47
+ }
48
+ };
49
+ }, [elementRef?.current, delay, handler, isEnabled]);
50
+ return position.current;
51
+ };
52
+
53
+ exports.useScrollPosition = useScrollPosition;