@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.
- package/dist/cjs/avatar/avatar-context.cjs +12 -0
- package/dist/cjs/avatar/avatar-group-context.cjs +88 -0
- package/dist/cjs/avatar/avatar-group.cjs +60 -0
- package/dist/cjs/avatar/avatar.cjs +132 -0
- package/dist/cjs/avatar/hooks/use-img-loading-status.cjs +68 -0
- package/dist/cjs/avatar/index.cjs +23 -0
- package/dist/cjs/avatar/utils.cjs +9 -0
- package/dist/cjs/banner/banner.cjs +1 -1
- package/dist/cjs/checkbox/checkbox.cjs +3 -3
- package/dist/cjs/combo-box/combo-box.cjs +1 -1
- package/dist/cjs/date-field/date-field.cjs +1 -1
- package/dist/cjs/date-picker/date-picker.cjs +5 -4
- package/dist/cjs/date-range-picker/date-range-picker.cjs +3 -3
- package/dist/cjs/file-dropzone/file-dropzone.cjs +12 -8
- package/dist/cjs/file-dropzone/file-info.cjs +3 -2
- package/dist/cjs/file-dropzone/utils.cjs +4 -4
- package/dist/cjs/hooks/use-scroll-position.cjs +53 -0
- package/dist/cjs/index.cjs +61 -47
- package/dist/cjs/modal/modal-content.cjs +1 -1
- package/dist/cjs/navbar/navbar-menu/menu.cjs +2 -2
- package/dist/cjs/navbar/navbar-menu/toggle.cjs +3 -2
- package/dist/cjs/navbar/navbar.cjs +25 -1
- package/dist/cjs/navbar/use-navbar.cjs +42 -32
- 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
- package/dist/cjs/number-field/number-field.cjs +2 -2
- package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
- package/dist/cjs/select/select.cjs +2 -2
- package/dist/cjs/tag-field/tag-field.cjs +1 -1
- package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
- package/dist/cjs/text-field/text-field.cjs +1 -1
- package/dist/esm/avatar/avatar-context.js +9 -0
- package/dist/esm/avatar/avatar-group-context.js +84 -0
- package/dist/esm/avatar/avatar-group.js +58 -0
- package/dist/esm/avatar/avatar.js +128 -0
- package/dist/esm/avatar/hooks/use-img-loading-status.js +66 -0
- package/dist/esm/avatar/index.js +13 -0
- package/dist/esm/avatar/utils.js +7 -0
- package/dist/esm/banner/banner.js +1 -1
- package/dist/esm/checkbox/checkbox.js +3 -3
- package/dist/esm/combo-box/combo-box.js +1 -1
- package/dist/esm/date-field/date-field.js +1 -1
- package/dist/esm/date-picker/date-picker.js +5 -4
- package/dist/esm/date-range-picker/date-range-picker.js +3 -3
- package/dist/esm/file-dropzone/file-dropzone.js +12 -8
- package/dist/esm/file-dropzone/file-info.js +3 -2
- package/dist/esm/file-dropzone/utils.js +4 -4
- package/dist/esm/hooks/use-scroll-position.js +51 -0
- package/dist/esm/index.js +20 -15
- package/dist/esm/modal/modal-content.js +1 -1
- package/dist/esm/navbar/navbar-menu/menu.js +2 -2
- package/dist/esm/navbar/navbar-menu/toggle.js +3 -2
- package/dist/esm/navbar/navbar.js +26 -2
- package/dist/esm/navbar/use-navbar.js +43 -33
- 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
- package/dist/esm/number-field/number-field.js +2 -2
- package/dist/esm/range-calendar/range-calendar.js +1 -1
- package/dist/esm/select/select.js +2 -2
- package/dist/esm/tag-field/tag-field.js +1 -1
- package/dist/esm/text-area-field/text-area-field.js +1 -1
- package/dist/esm/text-field/text-field.js +1 -1
- package/dist/types/avatar/avatar-context.d.ts +12 -0
- package/dist/types/avatar/avatar-context.d.ts.map +1 -0
- package/dist/types/avatar/avatar-group-context.d.ts +70 -0
- package/dist/types/avatar/avatar-group-context.d.ts.map +1 -0
- package/dist/types/avatar/avatar-group.d.ts +5 -0
- package/dist/types/avatar/avatar-group.d.ts.map +1 -0
- package/dist/types/avatar/avatar.d.ts +18 -0
- package/dist/types/avatar/avatar.d.ts.map +1 -0
- package/dist/types/avatar/hooks/use-img-loading-status.d.ts +4 -0
- package/dist/types/avatar/hooks/use-img-loading-status.d.ts.map +1 -0
- package/dist/types/avatar/index.d.ts +15 -0
- package/dist/types/avatar/index.d.ts.map +1 -0
- package/dist/types/avatar/utils.d.ts +2 -0
- package/dist/types/avatar/utils.d.ts.map +1 -0
- package/dist/types/calendar/calendar.d.ts.map +1 -1
- package/dist/types/checkbox/checkbox-group-style-context.d.ts +1 -1
- package/dist/types/checkbox/checkbox-group-style-context.d.ts.map +1 -1
- package/dist/types/date-field/date-field.d.ts.map +1 -1
- package/dist/types/file-dropzone/file-dropzone.d.ts +8 -2
- package/dist/types/file-dropzone/file-dropzone.d.ts.map +1 -1
- package/dist/types/file-dropzone/file-info.d.ts.map +1 -1
- package/dist/types/file-dropzone/types.d.ts +1 -0
- package/dist/types/file-dropzone/types.d.ts.map +1 -1
- package/dist/types/file-dropzone/utils.d.ts +2 -1
- package/dist/types/file-dropzone/utils.d.ts.map +1 -1
- package/dist/types/hooks/use-scroll-position.d.ts +29 -0
- package/dist/types/hooks/use-scroll-position.d.ts.map +1 -0
- package/dist/types/index.d.mts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/menu/menu.d.ts.map +1 -1
- package/dist/types/navbar/navbar-context.d.ts +10 -2
- package/dist/types/navbar/navbar-context.d.ts.map +1 -1
- package/dist/types/navbar/navbar-menu/menu.d.ts.map +1 -1
- package/dist/types/navbar/navbar-menu/toggle.d.ts.map +1 -1
- package/dist/types/navbar/navbar.d.ts.map +1 -1
- package/dist/types/navbar/use-navbar.d.ts +33 -1
- package/dist/types/navbar/use-navbar.d.ts.map +1 -1
- package/dist/types/range-calendar/range-calendar.d.ts.map +1 -1
- package/dist/types/system/react-utils/context.d.ts +4 -4
- package/dist/types/system/react-utils/context.d.ts.map +1 -1
- package/dist/types/system/utils.d.ts.map +1 -1
- package/dist/types/tabs/tabs.d.ts.map +1 -1
- package/dist/types/tag-field/tag-field-item.d.ts.map +1 -1
- package/dist/types/tag-field/tag-field-list.d.ts.map +1 -1
- 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
|
|
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
|
|
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;
|