@opengovsg/oui 0.0.0-snapshot-20251216073051 → 0.0.0-snapshot-20260126025301

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 (113) hide show
  1. package/dist/cjs/accordion/accordion.cjs +189 -0
  2. package/dist/cjs/accordion/index.cjs +13 -0
  3. package/dist/cjs/avatar/avatar-context.cjs +12 -0
  4. package/dist/cjs/avatar/avatar-group-context.cjs +88 -0
  5. package/dist/cjs/avatar/avatar-group.cjs +60 -0
  6. package/dist/cjs/avatar/avatar.cjs +132 -0
  7. package/dist/cjs/avatar/hooks/use-img-loading-status.cjs +68 -0
  8. package/dist/cjs/avatar/index.cjs +23 -0
  9. package/dist/cjs/avatar/utils.cjs +9 -0
  10. package/dist/cjs/banner/banner.cjs +1 -1
  11. package/dist/cjs/button/button.cjs +13 -10
  12. package/dist/cjs/calendar/calendar-month-day-selector.cjs +2 -2
  13. package/dist/cjs/checkbox/checkbox.cjs +3 -3
  14. package/dist/cjs/combo-box/combo-box.cjs +2 -2
  15. package/dist/cjs/date-field/date-field.cjs +1 -1
  16. package/dist/cjs/date-picker/date-picker.cjs +5 -4
  17. package/dist/cjs/date-range-picker/date-range-picker.cjs +5 -5
  18. package/dist/cjs/file-dropzone/file-dropzone.cjs +13 -9
  19. package/dist/cjs/file-dropzone/file-info.cjs +3 -2
  20. package/dist/cjs/file-dropzone/utils.cjs +4 -4
  21. package/dist/cjs/index.cjs +33 -12
  22. package/dist/cjs/menu/menu.cjs +1 -1
  23. package/dist/cjs/modal/modal-content.cjs +1 -1
  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 +3 -3
  26. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  27. package/dist/cjs/select/select.cjs +89 -17
  28. package/dist/cjs/system/react-utils/children.cjs +7 -0
  29. package/dist/cjs/tag-field/tag-field.cjs +3 -3
  30. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  31. package/dist/cjs/text-field/text-field.cjs +1 -1
  32. package/dist/cjs/toast/toast.cjs +1 -1
  33. package/dist/esm/accordion/accordion.js +182 -0
  34. package/dist/esm/accordion/index.js +2 -0
  35. package/dist/esm/avatar/avatar-context.js +9 -0
  36. package/dist/esm/avatar/avatar-group-context.js +84 -0
  37. package/dist/esm/avatar/avatar-group.js +58 -0
  38. package/dist/esm/avatar/avatar.js +128 -0
  39. package/dist/esm/avatar/hooks/use-img-loading-status.js +66 -0
  40. package/dist/esm/avatar/index.js +13 -0
  41. package/dist/esm/avatar/utils.js +7 -0
  42. package/dist/esm/banner/banner.js +1 -1
  43. package/dist/esm/button/button.js +13 -10
  44. package/dist/esm/calendar/calendar-month-day-selector.js +2 -2
  45. package/dist/esm/checkbox/checkbox.js +3 -3
  46. package/dist/esm/combo-box/combo-box.js +2 -2
  47. package/dist/esm/date-field/date-field.js +1 -1
  48. package/dist/esm/date-picker/date-picker.js +5 -4
  49. package/dist/esm/date-range-picker/date-range-picker.js +5 -5
  50. package/dist/esm/file-dropzone/file-dropzone.js +13 -9
  51. package/dist/esm/file-dropzone/file-info.js +3 -2
  52. package/dist/esm/file-dropzone/utils.js +4 -4
  53. package/dist/esm/index.js +9 -3
  54. package/dist/esm/menu/menu.js +1 -1
  55. package/dist/esm/modal/modal-content.js +1 -1
  56. 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
  57. package/dist/esm/number-field/number-field.js +3 -3
  58. package/dist/esm/range-calendar/range-calendar.js +1 -1
  59. package/dist/esm/select/select.js +92 -20
  60. package/dist/esm/system/react-utils/children.js +7 -1
  61. package/dist/esm/tag-field/tag-field.js +3 -3
  62. package/dist/esm/text-area-field/text-area-field.js +1 -1
  63. package/dist/esm/text-field/text-field.js +1 -1
  64. package/dist/esm/toast/toast.js +1 -1
  65. package/dist/types/accordion/accordion.d.ts +50 -0
  66. package/dist/types/accordion/accordion.d.ts.map +1 -0
  67. package/dist/types/accordion/index.d.ts +2 -0
  68. package/dist/types/accordion/index.d.ts.map +1 -0
  69. package/dist/types/avatar/avatar-context.d.ts +12 -0
  70. package/dist/types/avatar/avatar-context.d.ts.map +1 -0
  71. package/dist/types/avatar/avatar-group-context.d.ts +70 -0
  72. package/dist/types/avatar/avatar-group-context.d.ts.map +1 -0
  73. package/dist/types/avatar/avatar-group.d.ts +5 -0
  74. package/dist/types/avatar/avatar-group.d.ts.map +1 -0
  75. package/dist/types/avatar/avatar.d.ts +18 -0
  76. package/dist/types/avatar/avatar.d.ts.map +1 -0
  77. package/dist/types/avatar/hooks/use-img-loading-status.d.ts +4 -0
  78. package/dist/types/avatar/hooks/use-img-loading-status.d.ts.map +1 -0
  79. package/dist/types/avatar/index.d.ts +15 -0
  80. package/dist/types/avatar/index.d.ts.map +1 -0
  81. package/dist/types/avatar/utils.d.ts +2 -0
  82. package/dist/types/avatar/utils.d.ts.map +1 -0
  83. package/dist/types/button/button.d.ts +12 -6
  84. package/dist/types/button/button.d.ts.map +1 -1
  85. package/dist/types/calendar/calendar.d.ts.map +1 -1
  86. package/dist/types/checkbox/checkbox-group-style-context.d.ts +1 -1
  87. package/dist/types/checkbox/checkbox-group-style-context.d.ts.map +1 -1
  88. package/dist/types/date-field/date-field.d.ts.map +1 -1
  89. package/dist/types/file-dropzone/file-dropzone.d.ts +8 -2
  90. package/dist/types/file-dropzone/file-dropzone.d.ts.map +1 -1
  91. package/dist/types/file-dropzone/file-info.d.ts.map +1 -1
  92. package/dist/types/file-dropzone/types.d.ts +1 -0
  93. package/dist/types/file-dropzone/types.d.ts.map +1 -1
  94. package/dist/types/file-dropzone/utils.d.ts +2 -1
  95. package/dist/types/file-dropzone/utils.d.ts.map +1 -1
  96. package/dist/types/index.d.mts +2 -0
  97. package/dist/types/index.d.ts +2 -0
  98. package/dist/types/index.d.ts.map +1 -1
  99. package/dist/types/menu/menu.d.ts.map +1 -1
  100. package/dist/types/range-calendar/range-calendar.d.ts.map +1 -1
  101. package/dist/types/select/select-item.d.ts +1 -2
  102. package/dist/types/select/select-item.d.ts.map +1 -1
  103. package/dist/types/select/select.d.ts +14 -0
  104. package/dist/types/select/select.d.ts.map +1 -1
  105. package/dist/types/system/react-utils/children.d.ts +3 -0
  106. package/dist/types/system/react-utils/children.d.ts.map +1 -1
  107. package/dist/types/system/react-utils/context.d.ts +4 -4
  108. package/dist/types/system/react-utils/context.d.ts.map +1 -1
  109. package/dist/types/system/utils.d.ts.map +1 -1
  110. package/dist/types/tabs/tabs.d.ts.map +1 -1
  111. package/dist/types/tag-field/tag-field-item.d.ts.map +1 -1
  112. package/dist/types/tag-field/tag-field-list.d.ts.map +1 -1
  113. package/package.json +8 -8
@@ -0,0 +1,189 @@
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 reactAriaComponents = require('react-aria-components');
8
+ var ouiTheme = require('@opengovsg/oui-theme');
9
+ var children = require('../system/react-utils/children.cjs');
10
+ var utils = require('../system/utils.cjs');
11
+ var context = require('../system/react-utils/context.cjs');
12
+ 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');
13
+
14
+ const [AccordionStyleContext, useAccordionStyleContext] = context.createContext({
15
+ name: "AccordionStyleContext",
16
+ strict: true
17
+ });
18
+ const AccordionItem = utils.forwardRef(
19
+ ({ classNames, className, children, ...props }, ref) => {
20
+ const { slots } = $670gB$react.useContext(AccordionStyleContext);
21
+ return /* @__PURE__ */ jsxRuntime.jsx(
22
+ reactAriaComponents.Disclosure,
23
+ {
24
+ ...props,
25
+ ref,
26
+ className: reactAriaComponents.composeRenderProps(
27
+ className,
28
+ (className2, renderProps) => slots.item({
29
+ ...renderProps,
30
+ className: ouiTheme.cn(classNames?.item, className2)
31
+ })
32
+ ),
33
+ children
34
+ }
35
+ );
36
+ }
37
+ );
38
+ AccordionItem.displayName = "AccordionItem";
39
+ function AccordionHeader({
40
+ children: children$1,
41
+ classNames,
42
+ indicator,
43
+ startContent,
44
+ endContent,
45
+ hideIndicator = false
46
+ }) {
47
+ const { slots, classNames: contextClassNames } = $670gB$react.useContext(
48
+ AccordionStyleContext
49
+ );
50
+ const { isExpanded } = $670gB$react.useContext(reactAriaComponents.DisclosureStateContext);
51
+ return /* @__PURE__ */ jsxRuntime.jsx(
52
+ reactAriaComponents.Heading,
53
+ {
54
+ className: slots.heading({
55
+ className: ouiTheme.cn(contextClassNames?.heading, classNames?.heading)
56
+ }),
57
+ children: /* @__PURE__ */ jsxRuntime.jsx(
58
+ reactAriaComponents.Button,
59
+ {
60
+ slot: "trigger",
61
+ className: slots.trigger({
62
+ className: ouiTheme.cn(contextClassNames?.trigger, classNames?.trigger)
63
+ }),
64
+ children: (buttonRenderProps) => {
65
+ const headerRenderProps = { ...buttonRenderProps, isExpanded };
66
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
67
+ startContent && /* @__PURE__ */ jsxRuntime.jsx(
68
+ "div",
69
+ {
70
+ className: slots.startContentWrapper({
71
+ className: ouiTheme.cn(
72
+ contextClassNames?.startContentWrapper,
73
+ classNames?.startContentWrapper
74
+ )
75
+ }),
76
+ children: children.renderChildren(headerRenderProps, startContent)
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsxRuntime.jsx(
80
+ "span",
81
+ {
82
+ className: slots.title({
83
+ className: ouiTheme.cn(contextClassNames?.title, classNames?.title)
84
+ }),
85
+ children: children.renderChildren(headerRenderProps, children$1)
86
+ }
87
+ ),
88
+ !hideIndicator && /* @__PURE__ */ jsxRuntime.jsx(
89
+ "span",
90
+ {
91
+ "aria-hidden": true,
92
+ className: slots.indicator({
93
+ isExpanded,
94
+ className: ouiTheme.cn(
95
+ contextClassNames?.indicator,
96
+ classNames?.indicator
97
+ )
98
+ }),
99
+ children: children.renderChildren(
100
+ headerRenderProps,
101
+ indicator ?? /* @__PURE__ */ jsxRuntime.jsx(chevronDown.default, {})
102
+ )
103
+ }
104
+ ),
105
+ endContent && /* @__PURE__ */ jsxRuntime.jsx(
106
+ "div",
107
+ {
108
+ className: slots.endContentWrapper({
109
+ className: ouiTheme.cn(
110
+ contextClassNames?.endContentWrapper,
111
+ classNames?.endContentWrapper
112
+ )
113
+ }),
114
+ children: children.renderChildren(headerRenderProps, endContent)
115
+ }
116
+ )
117
+ ] });
118
+ }
119
+ }
120
+ )
121
+ }
122
+ );
123
+ }
124
+ function AccordionContent({
125
+ children,
126
+ classNames,
127
+ ...props
128
+ }) {
129
+ const { slots, classNames: contextClassNames } = $670gB$react.useContext(
130
+ AccordionStyleContext
131
+ );
132
+ return /* @__PURE__ */ jsxRuntime.jsx(
133
+ reactAriaComponents.DisclosurePanel,
134
+ {
135
+ ...props,
136
+ className: ouiTheme.composeTailwindRenderProps(
137
+ props.className,
138
+ slots.panel({
139
+ className: ouiTheme.cn(contextClassNames?.panel, classNames?.panel)
140
+ })
141
+ ),
142
+ children: /* @__PURE__ */ jsxRuntime.jsx(
143
+ "div",
144
+ {
145
+ className: slots.content({
146
+ className: ouiTheme.cn(contextClassNames?.content, classNames?.content)
147
+ }),
148
+ children
149
+ }
150
+ )
151
+ }
152
+ );
153
+ }
154
+ const Accordion = utils.forwardRef(
155
+ (originalProps, ref) => {
156
+ const [
157
+ { classNames, className, ...props },
158
+ { size = "md", ...variantProps }
159
+ ] = utils.mapPropsVariants(originalProps, ouiTheme.accordionStyles.variantKeys);
160
+ const slots = ouiTheme.accordionStyles({ size, ...variantProps });
161
+ return /* @__PURE__ */ jsxRuntime.jsx(
162
+ AccordionStyleContext.Provider,
163
+ {
164
+ value: {
165
+ slots,
166
+ classNames
167
+ },
168
+ children: /* @__PURE__ */ jsxRuntime.jsx(
169
+ reactAriaComponents.DisclosureGroup,
170
+ {
171
+ className: slots.base({
172
+ className: ouiTheme.cn(classNames?.base, className)
173
+ }),
174
+ ...props,
175
+ ref
176
+ }
177
+ )
178
+ }
179
+ );
180
+ }
181
+ );
182
+ Accordion.displayName = "Accordion";
183
+
184
+ exports.Accordion = Accordion;
185
+ exports.AccordionContent = AccordionContent;
186
+ exports.AccordionHeader = AccordionHeader;
187
+ exports.AccordionItem = AccordionItem;
188
+ exports.AccordionStyleContext = AccordionStyleContext;
189
+ exports.useAccordionStyleContext = useAccordionStyleContext;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var accordion = require('./accordion.cjs');
5
+
6
+
7
+
8
+ exports.Accordion = accordion.Accordion;
9
+ exports.AccordionContent = accordion.AccordionContent;
10
+ exports.AccordionHeader = accordion.AccordionHeader;
11
+ exports.AccordionItem = accordion.AccordionItem;
12
+ exports.AccordionStyleContext = accordion.AccordionStyleContext;
13
+ exports.useAccordionStyleContext = accordion.useAccordionStyleContext;
@@ -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 = {
@@ -7,9 +7,10 @@ var $670gB$react = require('react');
7
7
  var utils = require('@react-aria/utils');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var ripple = require('../ripple/ripple.cjs');
10
11
  var useRipple = require('../ripple/use-ripple.cjs');
11
12
  var spinner = require('../spinner/spinner.cjs');
12
- var ripple = require('../ripple/ripple.cjs');
13
+ var children = require('../system/react-utils/children.cjs');
13
14
 
14
15
  const Button = $670gB$react.forwardRef(
15
16
  ({
@@ -23,8 +24,9 @@ const Button = $670gB$react.forwardRef(
23
24
  size = "md",
24
25
  spinnerPlacement = "start",
25
26
  loadingText,
27
+ pendingElement,
26
28
  onPress,
27
- children,
29
+ children: children$1,
28
30
  disableRipple,
29
31
  isPending,
30
32
  spinner: spinnerProp,
@@ -49,7 +51,7 @@ const Button = $670gB$react.forwardRef(
49
51
  const spinnerSize = buttonSpinnerSizeMap[size];
50
52
  return /* @__PURE__ */ jsxRuntime.jsx(spinner.Spinner, { size: spinnerSize });
51
53
  }, [size, spinnerProp]);
52
- return /* @__PURE__ */ jsxRuntime.jsxs(
54
+ return /* @__PURE__ */ jsxRuntime.jsx(
53
55
  reactAriaComponents.Button,
54
56
  {
55
57
  ...props,
@@ -70,15 +72,16 @@ const Button = $670gB$react.forwardRef(
70
72
  isPending,
71
73
  onPress: utils.chain(onPress, onPressRipple),
72
74
  ref,
73
- children: [
74
- startContent,
75
- isPending && spinnerPlacement === "start" ? spinner$1 : null,
76
- isPending ? null : children,
75
+ children: (renderProps) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
76
+ children.renderChildren(renderProps, startContent),
77
+ isPending && spinnerPlacement === "start" ? children.renderChildren(renderProps, spinner$1) : null,
78
+ isPending ? null : children.renderChildren(renderProps, children$1),
77
79
  isPending && loadingText ? loadingText : null,
78
- isPending && spinnerPlacement === "end" ? spinner$1 : null,
79
- endContent,
80
+ isPending && pendingElement ? children.renderChildren(renderProps, pendingElement) : null,
81
+ isPending && spinnerPlacement === "end" ? children.renderChildren(renderProps, spinner$1) : null,
82
+ children.renderChildren(renderProps, endContent),
80
83
  !disableRipple && /* @__PURE__ */ jsxRuntime.jsx(ripple.Ripple, { onClear: onClearRipple, ripples })
81
- ]
84
+ ] })
82
85
  }
83
86
  );
84
87
  }
@@ -6,11 +6,11 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
+ var select = require('../select/select.cjs');
10
+ var selectItem = require('../select/select-item.cjs');
9
11
  var agnosticCalendarStateContext = require('./agnostic-calendar-state-context.cjs');
10
12
  var calendarStyleContext = require('./calendar-style-context.cjs');
11
13
  var useCalendarSelectors = require('./hooks/use-calendar-selectors.cjs');
12
- var select = require('../select/select.cjs');
13
- var selectItem = require('../select/select-item.cjs');
14
14
  var useCalendarI18n = require('./hooks/use-calendar-i18n.cjs');
15
15
 
16
16
  const CalendarMonthDaySelector = () => {