@opengovsg/oui 0.0.30 → 0.0.32

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 (81) 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/button/button.cjs +1 -1
  10. package/dist/cjs/calendar/calendar-month-day-selector.cjs +2 -2
  11. package/dist/cjs/checkbox/checkbox.cjs +3 -3
  12. package/dist/cjs/combo-box/combo-box.cjs +2 -2
  13. package/dist/cjs/date-field/date-field.cjs +1 -1
  14. package/dist/cjs/date-picker/date-picker.cjs +4 -5
  15. package/dist/cjs/date-range-picker/date-range-picker.cjs +5 -5
  16. package/dist/cjs/file-dropzone/file-dropzone.cjs +2 -2
  17. package/dist/cjs/file-dropzone/file-info.cjs +1 -1
  18. package/dist/cjs/index.cjs +26 -12
  19. package/dist/cjs/menu/menu.cjs +1 -1
  20. package/dist/cjs/modal/modal-content.cjs +1 -1
  21. 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
  22. package/dist/cjs/number-field/number-field.cjs +3 -3
  23. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  24. package/dist/cjs/select/select.cjs +89 -17
  25. package/dist/cjs/tag-field/tag-field.cjs +3 -3
  26. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  27. package/dist/cjs/text-field/text-field.cjs +1 -1
  28. package/dist/cjs/toast/toast.cjs +1 -1
  29. package/dist/esm/avatar/avatar-context.js +9 -0
  30. package/dist/esm/avatar/avatar-group-context.js +84 -0
  31. package/dist/esm/avatar/avatar-group.js +58 -0
  32. package/dist/esm/avatar/avatar.js +128 -0
  33. package/dist/esm/avatar/hooks/use-img-loading-status.js +66 -0
  34. package/dist/esm/avatar/index.js +13 -0
  35. package/dist/esm/avatar/utils.js +7 -0
  36. package/dist/esm/banner/banner.js +1 -1
  37. package/dist/esm/button/button.js +1 -1
  38. package/dist/esm/calendar/calendar-month-day-selector.js +2 -2
  39. package/dist/esm/checkbox/checkbox.js +3 -3
  40. package/dist/esm/combo-box/combo-box.js +2 -2
  41. package/dist/esm/date-field/date-field.js +1 -1
  42. package/dist/esm/date-picker/date-picker.js +4 -5
  43. package/dist/esm/date-range-picker/date-range-picker.js +5 -5
  44. package/dist/esm/file-dropzone/file-dropzone.js +2 -2
  45. package/dist/esm/file-dropzone/file-info.js +1 -1
  46. package/dist/esm/index.js +8 -3
  47. package/dist/esm/menu/menu.js +1 -1
  48. package/dist/esm/modal/modal-content.js +1 -1
  49. 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
  50. package/dist/esm/number-field/number-field.js +3 -3
  51. package/dist/esm/range-calendar/range-calendar.js +1 -1
  52. package/dist/esm/select/select.js +92 -20
  53. package/dist/esm/tag-field/tag-field.js +3 -3
  54. package/dist/esm/text-area-field/text-area-field.js +1 -1
  55. package/dist/esm/text-field/text-field.js +1 -1
  56. package/dist/esm/toast/toast.js +1 -1
  57. package/dist/types/avatar/avatar-context.d.ts +12 -0
  58. package/dist/types/avatar/avatar-context.d.ts.map +1 -0
  59. package/dist/types/avatar/avatar-group-context.d.ts +70 -0
  60. package/dist/types/avatar/avatar-group-context.d.ts.map +1 -0
  61. package/dist/types/avatar/avatar-group.d.ts +5 -0
  62. package/dist/types/avatar/avatar-group.d.ts.map +1 -0
  63. package/dist/types/avatar/avatar.d.ts +18 -0
  64. package/dist/types/avatar/avatar.d.ts.map +1 -0
  65. package/dist/types/avatar/hooks/use-img-loading-status.d.ts +4 -0
  66. package/dist/types/avatar/hooks/use-img-loading-status.d.ts.map +1 -0
  67. package/dist/types/avatar/index.d.ts +15 -0
  68. package/dist/types/avatar/index.d.ts.map +1 -0
  69. package/dist/types/avatar/utils.d.ts +2 -0
  70. package/dist/types/avatar/utils.d.ts.map +1 -0
  71. package/dist/types/checkbox/checkbox-group-style-context.d.ts +1 -1
  72. package/dist/types/checkbox/checkbox-group-style-context.d.ts.map +1 -1
  73. package/dist/types/index.d.mts +1 -0
  74. package/dist/types/index.d.ts +1 -0
  75. package/dist/types/index.d.ts.map +1 -1
  76. package/dist/types/menu/menu.d.ts.map +1 -1
  77. package/dist/types/select/select.d.ts +14 -0
  78. package/dist/types/select/select.d.ts.map +1 -1
  79. package/dist/types/system/react-utils/context.d.ts +4 -4
  80. package/dist/types/system/react-utils/context.d.ts.map +1 -1
  81. package/package.json +5 -5
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  'use strict';
3
3
 
4
+ var index = require('./avatar/index.cjs');
4
5
  var useControllableState = require('./hooks/use-controllable-state.cjs');
5
6
  var useDraggable = require('./hooks/use-draggable.cjs');
6
7
  var button = require('./button/button.cjs');
@@ -27,10 +28,10 @@ var select = require('./select/select.cjs');
27
28
  var selectItem = require('./select/select-item.cjs');
28
29
  var selectVariantContext = require('./select/select-variant-context.cjs');
29
30
  var badge = require('./badge/badge.cjs');
31
+ var date = require('@internationalized/date');
30
32
  var calendar = require('./calendar/calendar.cjs');
31
33
  var calendarStyleContext = require('./calendar/calendar-style-context.cjs');
32
34
  var utils = require('./calendar/utils.cjs');
33
- var date = require('@internationalized/date');
34
35
  var rangeCalendar = require('./range-calendar/range-calendar.cjs');
35
36
  var menu = require('./menu/menu.cjs');
36
37
  var popover = require('./popover/popover.cjs');
@@ -40,10 +41,10 @@ var datePicker = require('./date-picker/date-picker.cjs');
40
41
  var dateRangePicker = require('./date-range-picker/date-range-picker.cjs');
41
42
  var checkbox = require('./checkbox/checkbox.cjs');
42
43
  var checkboxGroupStyleContext = require('./checkbox/checkbox-group-style-context.cjs');
44
+ var usePagination = require('./pagination/hooks/use-pagination.cjs');
43
45
  var pagination = require('./pagination/pagination.cjs');
44
46
  var paginationCursor = require('./pagination/pagination-cursor.cjs');
45
47
  var paginationItem = require('./pagination/pagination-item.cjs');
46
- var usePagination = require('./pagination/hooks/use-pagination.cjs');
47
48
  var usePagination$1 = require('./pagination/use-pagination.cjs');
48
49
  var fileDropzone = require('./file-dropzone/file-dropzone.cjs');
49
50
  var fileInfo = require('./file-dropzone/file-info.cjs');
@@ -56,6 +57,7 @@ var modalBody = require('./modal/modal-body.cjs');
56
57
  var modalHeader = require('./modal/modal-header.cjs');
57
58
  var modalVariantContext = require('./modal/modal-variant-context.cjs');
58
59
  var toast = require('./toast/toast.cjs');
60
+ var sonner = require('sonner');
59
61
  var navbar = require('./navbar/navbar.cjs');
60
62
  var navbarBrand = require('./navbar/navbar-brand.cjs');
61
63
  var navbarContent = require('./navbar/navbar-content.cjs');
@@ -65,10 +67,14 @@ var toggle$1 = require('./navbar/navbar-menu/toggle.cjs');
65
67
  var navbarItem = require('./navbar/navbar-item.cjs');
66
68
  var useNavbar = require('./navbar/use-navbar.cjs');
67
69
  var navbarContext = require('./navbar/navbar-context.cjs');
68
- var sonner = require('sonner');
70
+ var avatarContext = require('./avatar/avatar-context.cjs');
71
+ var avatarGroup = require('./avatar/avatar-group.cjs');
72
+ var avatarGroupContext = require('./avatar/avatar-group-context.cjs');
73
+ var avatar = require('./avatar/avatar.cjs');
69
74
 
70
75
 
71
76
 
77
+ exports.Avatar = index.Avatar;
72
78
  exports.useControllableState = useControllableState.useControllableState;
73
79
  exports.useDraggable = useDraggable.useDraggable;
74
80
  exports.Button = button.Button;
@@ -102,6 +108,10 @@ exports.SelectItem = selectItem.SelectItem;
102
108
  exports.SelectVariantContext = selectVariantContext.SelectVariantContext;
103
109
  exports.useSelectVariantContext = selectVariantContext.useSelectVariantContext;
104
110
  exports.Badge = badge.Badge;
111
+ Object.defineProperty(exports, "CalendarDate", {
112
+ enumerable: true,
113
+ get: function () { return date.CalendarDate; }
114
+ });
105
115
  exports.Calendar = calendar.Calendar;
106
116
  exports.CalendarStateWrapper = calendar.CalendarStateWrapper;
107
117
  exports.CalendarStyleContext = calendarStyleContext.CalendarStyleContext;
@@ -110,10 +120,6 @@ exports.getEraFormat = utils.getEraFormat;
110
120
  exports.useGenerateLocalizedMonths = utils.useGenerateLocalizedMonths;
111
121
  exports.useGenerateLocalizedYears = utils.useGenerateLocalizedYears;
112
122
  exports.useLocalizedMonthYear = utils.useLocalizedMonthYear;
113
- Object.defineProperty(exports, "CalendarDate", {
114
- enumerable: true,
115
- get: function () { return date.CalendarDate; }
116
- });
117
123
  exports.RangeCalendar = rangeCalendar.RangeCalendar;
118
124
  exports.RangeCalendarCell = rangeCalendar.RangeCalendarCell;
119
125
  exports.RangeCalendarStateWrapper = rangeCalendar.RangeCalendarStateWrapper;
@@ -140,10 +146,10 @@ exports.Checkbox = checkbox.Checkbox;
140
146
  exports.CheckboxGroup = checkbox.CheckboxGroup;
141
147
  exports.CheckboxGroupStyleContext = checkboxGroupStyleContext.CheckboxGroupStyleContext;
142
148
  exports.useCheckboxGroupStyleContext = checkboxGroupStyleContext.useCheckboxGroupStyleContext;
149
+ exports.PaginationItemType = usePagination.PaginationItemType;
143
150
  exports.Pagination = pagination.Pagination;
144
151
  exports.PaginationCursor = paginationCursor.PaginationCursor;
145
152
  exports.PaginationItem = paginationItem.PaginationItem;
146
- exports.PaginationItemType = usePagination.PaginationItemType;
147
153
  exports.CURSOR_TRANSITION_TIMEOUT = usePagination$1.CURSOR_TRANSITION_TIMEOUT;
148
154
  exports.usePagination = usePagination$1.usePagination;
149
155
  exports.FileDropzone = fileDropzone.FileDropzone;
@@ -159,6 +165,10 @@ exports.ModalHeader = modalHeader.ModalHeader;
159
165
  exports.ModalVariantContext = modalVariantContext.ModalVariantContext;
160
166
  exports.useModalVariantContext = modalVariantContext.useModalVariantContext;
161
167
  exports.Toaster = toast.Toaster;
168
+ Object.defineProperty(exports, "toast", {
169
+ enumerable: true,
170
+ get: function () { return sonner.toast; }
171
+ });
162
172
  exports.Navbar = navbar.Navbar;
163
173
  exports.NavbarBrand = navbarBrand.NavbarBrand;
164
174
  exports.NavbarContent = navbarContent.NavbarContent;
@@ -169,7 +179,11 @@ exports.NavbarItem = navbarItem.NavbarItem;
169
179
  exports.useNavbar = useNavbar.useNavbar;
170
180
  exports.NavbarProvider = navbarContext.NavbarProvider;
171
181
  exports.useNavbarContext = navbarContext.useNavbarContext;
172
- Object.defineProperty(exports, "toast", {
173
- enumerable: true,
174
- get: function () { return sonner.toast; }
175
- });
182
+ exports.AvatarContext = avatarContext.AvatarContext;
183
+ exports.useAvatarContext = avatarContext.useAvatarContext;
184
+ exports.AvatarGroup = avatarGroup.AvatarGroup;
185
+ exports.AvatarGroupProvider = avatarGroupContext.AvatarGroupProvider;
186
+ exports.useAvatarGroup = avatarGroupContext.useAvatarGroup;
187
+ exports.AvatarFallback = avatar.AvatarFallback;
188
+ exports.AvatarImage = avatar.AvatarImage;
189
+ exports.AvatarRoot = avatar.AvatarRoot;
@@ -6,11 +6,11 @@ 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 popover = require('../popover/popover.cjs');
10
9
  var utils = require('../system/utils.cjs');
11
10
  var context = require('../system/react-utils/context.cjs');
12
11
  var check = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.cjs');
13
12
  var chevronRight = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-right.cjs');
13
+ var popover = require('../popover/popover.cjs');
14
14
 
15
15
  const [MenuVariantContext, useMenuVariantContext] = context.createContext({
16
16
  name: "MenuVariantContext",
@@ -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 button = require('../button/button.cjs');
11
10
  var i18n = require('./i18n.cjs');
12
11
  var modalVariantContext = require('./modal-variant-context.cjs');
13
12
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.cjs');
13
+ var button = require('../button/button.cjs');
14
14
 
15
15
  function ModalContent({
16
16
  closeButtonContent: closeButtonContentProp,
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var createLucideIcon = require('../createLucideIcon.cjs');
6
+
7
+ /**
8
+ * @license lucide-react v0.475.0 - ISC
9
+ *
10
+ * This source code is licensed under the ISC license.
11
+ * See the LICENSE file in the root directory of this source tree.
12
+ */
13
+
14
+
15
+ const __iconNode = [
16
+ ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
17
+ ["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
18
+ ];
19
+ const User = createLucideIcon.default("User", __iconNode);
20
+
21
+ exports.__iconNode = __iconNode;
22
+ exports.default = User;
@@ -5,12 +5,12 @@
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 button = require('../button/button.cjs');
9
- var field = require('../field/field.cjs');
10
- var input = require('../input/input.cjs');
11
8
  var utils = require('../system/utils.cjs');
12
9
  var minus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.cjs');
13
10
  var plus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/plus.cjs');
11
+ var field = require('../field/field.cjs');
12
+ var input = require('../input/input.cjs');
13
+ var button = require('../button/button.cjs');
14
14
 
15
15
  function NumberField(originalProps) {
16
16
  const [
@@ -8,12 +8,12 @@ var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var useDeepCompare = require('use-deep-compare');
10
10
  var ouiTheme = require('@opengovsg/oui-theme');
11
- var calendarStyleContext = require('../calendar/calendar-style-context.cjs');
12
11
  var agnosticCalendarStateContext = require('../calendar/agnostic-calendar-state-context.cjs');
13
12
  var calendarBottomContent = require('../calendar/calendar-bottom-content.cjs');
14
13
  var calendarGridHeader = require('../calendar/calendar-grid-header.cjs');
15
14
  var calendarHeader = require('../calendar/calendar-header.cjs');
16
15
  var utils = require('../system/utils.cjs');
16
+ var calendarStyleContext = require('../calendar/calendar-style-context.cjs');
17
17
 
18
18
  const RangeCalendar = utils.forwardRefGeneric(function RangeCalendar2(originalProps, ref) {
19
19
  const [props, variantProps] = utils.mapPropsVariants(
@@ -4,15 +4,34 @@
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
+ var reactAria = require('react-aria');
7
8
  var reactAriaComponents = require('react-aria-components');
8
9
  var ouiTheme = require('@opengovsg/oui-theme');
9
- var button = require('../button/button.cjs');
10
- var field = require('../field/field.cjs');
11
- var popover = require('../popover/popover.cjs');
12
10
  var utils = require('../system/utils.cjs');
13
11
  var selectVariantContext = require('./select-variant-context.cjs');
12
+ var field = require('../field/field.cjs');
14
13
  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');
14
+ var popover = require('../popover/popover.cjs');
15
+ var button = require('../button/button.cjs');
15
16
 
17
+ const i18nStrings = {
18
+ "en-SG": {
19
+ searchPlaceholder: "Search...",
20
+ searchAriaLabel: "Search options"
21
+ },
22
+ "zh-SG": {
23
+ searchPlaceholder: "\u641C\u7D22...",
24
+ searchAriaLabel: "\u641C\u7D22\u9009\u9879"
25
+ },
26
+ "ms-SG": {
27
+ searchPlaceholder: "Cari...",
28
+ searchAriaLabel: "Cari pilihan"
29
+ },
30
+ "ta-SG": {
31
+ searchPlaceholder: "\u0BA4\u0BC7\u0B9F\u0BC1...",
32
+ searchAriaLabel: "\u0BA4\u0BC7\u0B9F\u0BB2\u0BCD \u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0B99\u0BCD\u0B95\u0BB3\u0BCD"
33
+ }
34
+ };
16
35
  const calculateEstimatedRowHeight = (size) => {
17
36
  switch (size) {
18
37
  case "xs":
@@ -30,12 +49,22 @@ function Select({
30
49
  errorMessage,
31
50
  ...originalProps
32
51
  }) {
52
+ const formatter = reactAria.useLocalizedStringFormatter(i18nStrings);
33
53
  const [_props, variantProps] = utils.mapPropsVariants(
34
54
  originalProps,
35
55
  ouiTheme.selectStyles.variantKeys
36
56
  );
37
- const { items, children, listLayoutOptions, ...props } = _props;
57
+ const {
58
+ items,
59
+ children,
60
+ listLayoutOptions,
61
+ enableSearch = false,
62
+ searchPlaceholder,
63
+ searchIcon,
64
+ ...props
65
+ } = _props;
38
66
  const styles = ouiTheme.selectStyles(variantProps);
67
+ const { contains } = reactAriaComponents.useFilter({ sensitivity: "base" });
39
68
  const layoutOptions = $670gB$react.useMemo(() => {
40
69
  return {
41
70
  estimatedRowHeight: calculateEstimatedRowHeight(
@@ -44,6 +73,37 @@ function Select({
44
73
  ...listLayoutOptions
45
74
  };
46
75
  }, [listLayoutOptions, variantProps.size]);
76
+ const renderedSearchIcon = $670gB$react.useMemo(() => {
77
+ if (!enableSearch || !searchIcon) return null;
78
+ if ($670gB$react.isValidElement(searchIcon)) {
79
+ const iconElement = searchIcon;
80
+ return $670gB$react.cloneElement(iconElement, {
81
+ className: styles.searchIcon({
82
+ className: ouiTheme.cn(classNames?.searchIcon, iconElement.props.className)
83
+ })
84
+ });
85
+ }
86
+ return /* @__PURE__ */ jsxRuntime.jsx(
87
+ "span",
88
+ {
89
+ className: styles.searchIcon({ className: classNames?.searchIcon }),
90
+ children: searchIcon
91
+ }
92
+ );
93
+ }, [classNames?.searchIcon, enableSearch, searchIcon, styles]);
94
+ const listContent = /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Virtualizer, { layout: reactAriaComponents.ListLayout, layoutOptions, children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ reactAriaComponents.ListBox,
96
+ {
97
+ autoFocus: !enableSearch,
98
+ items,
99
+ shouldFocusWrap: true,
100
+ className: ouiTheme.composeRenderProps(
101
+ classNames?.list,
102
+ (className, renderProps) => styles.list({ className, ...renderProps })
103
+ ),
104
+ children
105
+ }
106
+ ) });
47
107
  return /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Provider, { values: [[selectVariantContext.SelectVariantContext, variantProps]], children: /* @__PURE__ */ jsxRuntime.jsxs(
48
108
  reactAriaComponents.Select,
49
109
  {
@@ -93,19 +153,31 @@ function Select({
93
153
  }
94
154
  ),
95
155
  /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { size: variantProps.size, className: classNames?.error, children: errorMessage }),
96
- /* @__PURE__ */ jsxRuntime.jsx(popover.Popover, { className: styles.popover({ className: classNames?.popover }), children: /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Virtualizer, { layout: reactAriaComponents.ListLayout, layoutOptions, children: /* @__PURE__ */ jsxRuntime.jsx(
97
- reactAriaComponents.ListBox,
98
- {
99
- autoFocus: true,
100
- items,
101
- shouldFocusWrap: true,
102
- className: ouiTheme.composeRenderProps(
103
- classNames?.list,
104
- (className, renderProps) => styles.list({ className, ...renderProps })
105
- ),
106
- children
107
- }
108
- ) }) })
156
+ /* @__PURE__ */ jsxRuntime.jsx(popover.Popover, { className: styles.popover({ className: classNames?.popover }), children: enableSearch ? /* @__PURE__ */ jsxRuntime.jsxs(reactAriaComponents.Autocomplete, { filter: contains, children: [
157
+ /* @__PURE__ */ jsxRuntime.jsxs(
158
+ reactAriaComponents.SearchField,
159
+ {
160
+ autoFocus: true,
161
+ "aria-label": formatter.format("searchAriaLabel"),
162
+ className: styles.searchField({
163
+ className: classNames?.searchField
164
+ }),
165
+ children: [
166
+ renderedSearchIcon,
167
+ /* @__PURE__ */ jsxRuntime.jsx(
168
+ reactAriaComponents.Input,
169
+ {
170
+ placeholder: searchPlaceholder ?? formatter.format("searchPlaceholder"),
171
+ className: styles.searchInput({
172
+ className: classNames?.searchInput
173
+ })
174
+ }
175
+ )
176
+ ]
177
+ }
178
+ ),
179
+ listContent
180
+ ] }) : listContent })
109
181
  ]
110
182
  }
111
183
  ) });
@@ -6,15 +6,15 @@ 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 field = require('../field/field.cjs');
10
- var input = require('../input/input.cjs');
11
- var popover = require('../popover/popover.cjs');
12
9
  var tagFieldItem = require('./tag-field-item.cjs');
13
10
  var tagFieldList = require('./tag-field-list.cjs');
14
11
  var tagFieldRoot = require('./tag-field-root.cjs');
15
12
  var tagFieldTagList = require('./tag-field-tag-list.cjs');
16
13
  var tagFieldTrigger = require('./tag-field-trigger.cjs');
17
14
  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');
15
+ var field = require('../field/field.cjs');
16
+ var input = require('../input/input.cjs');
17
+ var popover = require('../popover/popover.cjs');
18
18
 
19
19
  function TagField({
20
20
  classNames,
@@ -5,8 +5,8 @@
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');
9
8
  var textArea = require('../text-area/text-area.cjs');
9
+ var field = require('../field/field.cjs');
10
10
 
11
11
  function TextAreaField({
12
12
  label,
@@ -5,8 +5,8 @@
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');
9
8
  var input = require('../input/input.cjs');
9
+ var field = require('../field/field.cjs');
10
10
 
11
11
  function TextField({
12
12
  label,
@@ -5,9 +5,9 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var sonner = require('sonner');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
- var spinner = require('../spinner/spinner.cjs');
9
8
  var utils = require('../system/utils.cjs');
10
9
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.cjs');
10
+ var spinner = require('../spinner/spinner.cjs');
11
11
 
12
12
  function Toaster(originalProps) {
13
13
  const [{ toastOptions, closeButton = true, ...props }, variantProps] = utils.mapPropsVariants(originalProps, ouiTheme.toastStyles.variantKeys);
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ import { createContext } from '../system/react-utils/context.js';
3
+
4
+ const [AvatarContext, useAvatarContext] = createContext({
5
+ name: "AvatarContext",
6
+ strict: true
7
+ });
8
+
9
+ export { AvatarContext, useAvatarContext };
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ import { useMemo, cloneElement } from 'react';
3
+ import { avatarGroupStyles, cn } from '@opengovsg/oui-theme';
4
+ import { getValidChildren } from '../system/react-utils/children.js';
5
+ import { createContext } from '../system/react-utils/context.js';
6
+ import { useDomRef } from '../system/react-utils/refs.js';
7
+
8
+ const [AvatarGroupProvider, useAvatarGroupContext] = createContext({
9
+ name: "AvatarGroupContext",
10
+ strict: false
11
+ });
12
+ function useAvatarGroup(props = {}) {
13
+ const {
14
+ as,
15
+ ref,
16
+ max = 5,
17
+ total,
18
+ size,
19
+ color,
20
+ prominence,
21
+ radius,
22
+ children,
23
+ renderCount,
24
+ className,
25
+ classNames,
26
+ countProps,
27
+ ...otherProps
28
+ } = props;
29
+ const domRef = useDomRef(ref);
30
+ const Component = as || "div";
31
+ const context = useMemo(
32
+ () => ({
33
+ size,
34
+ color,
35
+ radius,
36
+ prominence
37
+ }),
38
+ [size, color, radius, prominence]
39
+ );
40
+ const slots = useMemo(
41
+ () => avatarGroupStyles({ className: className ?? classNames?.base }),
42
+ [className, classNames?.base]
43
+ );
44
+ const validChildren = getValidChildren(children);
45
+ const childrenWithinMax = max ? validChildren.slice(0, max) : validChildren;
46
+ const remainingCount = total ? total : max != null ? validChildren.length - max : -1;
47
+ const clones = childrenWithinMax.map((child, index) => {
48
+ return cloneElement(child, {
49
+ // @ts-expect-error: CSS variable is not recognized as a valid style property
50
+ style: {
51
+ "--avatar-zindex": childrenWithinMax.length - index
52
+ }
53
+ });
54
+ });
55
+ const getAvatarGroupProps = () => {
56
+ return {
57
+ ref: domRef,
58
+ className: slots.base({
59
+ class: cn(classNames?.base, className)
60
+ }),
61
+ role: "group",
62
+ ...otherProps
63
+ };
64
+ };
65
+ const getAvatarGroupCountProps = () => {
66
+ return {
67
+ className: slots.counter({
68
+ class: classNames?.counter
69
+ }),
70
+ ...countProps
71
+ };
72
+ };
73
+ return {
74
+ Component,
75
+ context,
76
+ remainingCount,
77
+ clones,
78
+ renderCount,
79
+ getAvatarGroupProps,
80
+ getAvatarGroupCountProps
81
+ };
82
+ }
83
+
84
+ export { AvatarGroupProvider, useAvatarGroup, useAvatarGroupContext };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { useMemo } from 'react';
4
+ import { forwardRef } from '../system/utils.js';
5
+ import { AvatarRoot, AvatarFallback } from './avatar.js';
6
+ import { useAvatarGroup, AvatarGroupProvider } from './avatar-group-context.js';
7
+
8
+ const AvatarGroup = forwardRef((props, ref) => {
9
+ const {
10
+ Component,
11
+ clones,
12
+ context,
13
+ remainingCount,
14
+ getAvatarGroupCountProps,
15
+ getAvatarGroupProps,
16
+ renderCount
17
+ } = useAvatarGroup({
18
+ ...props,
19
+ ref
20
+ });
21
+ const renderedCount = useMemo(() => {
22
+ if (remainingCount <= 0) return null;
23
+ if (renderCount) {
24
+ return renderCount(remainingCount);
25
+ }
26
+ const countAvatarVariantProps = {
27
+ prominence: "subtle",
28
+ color: "primary"
29
+ };
30
+ if (context.prominence === "subtle") {
31
+ countAvatarVariantProps.color = "white";
32
+ }
33
+ return /* @__PURE__ */ jsx(
34
+ AvatarRoot,
35
+ {
36
+ ...countAvatarVariantProps,
37
+ ...getAvatarGroupCountProps(),
38
+ name: `+${remainingCount}`,
39
+ children: /* @__PURE__ */ jsxs(AvatarFallback, { children: [
40
+ "+",
41
+ remainingCount
42
+ ] })
43
+ }
44
+ );
45
+ }, [
46
+ context.prominence,
47
+ getAvatarGroupCountProps,
48
+ remainingCount,
49
+ renderCount
50
+ ]);
51
+ return /* @__PURE__ */ jsx(Component, { ...getAvatarGroupProps(), children: /* @__PURE__ */ jsxs(AvatarGroupProvider, { value: context, children: [
52
+ clones,
53
+ renderedCount
54
+ ] }) });
55
+ });
56
+ AvatarGroup.displayName = "AvatarGroup";
57
+
58
+ export { AvatarGroup };
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ "use client";
3
+ import { jsx } from 'react/jsx-runtime';
4
+ import { useState, useMemo } from 'react';
5
+ import { useLayoutEffect } from '@react-aria/utils';
6
+ import { avatarStyles, dataAttr } from '@opengovsg/oui-theme';
7
+ import { forwardRef, mapPropsVariants } from '../system/utils.js';
8
+ import { AvatarContext, useAvatarContext } from './avatar-context.js';
9
+ import { useAvatarGroupContext } from './avatar-group-context.js';
10
+ import { useImageLoadingStatus } from './hooks/use-img-loading-status.js';
11
+ import { getInitialsFromText } from './utils.js';
12
+ import { useDomRef } from '../system/react-utils/refs.js';
13
+ import User from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.js';
14
+
15
+ const AvatarRoot = forwardRef(
16
+ (originalProps, ref) => {
17
+ const groupContext = useAvatarGroupContext();
18
+ const [
19
+ {
20
+ name,
21
+ getInitials = getInitialsFromText,
22
+ classNames,
23
+ className,
24
+ children,
25
+ as,
26
+ ...props
27
+ },
28
+ {
29
+ color = groupContext?.color,
30
+ prominence = groupContext?.prominence,
31
+ size = groupContext?.size,
32
+ radius = groupContext?.radius,
33
+ ...variantProps
34
+ }
35
+ ] = mapPropsVariants(originalProps, avatarStyles.variantKeys);
36
+ const isInGroup = !!groupContext;
37
+ const domRef = useDomRef(ref);
38
+ const slots = avatarStyles({
39
+ color,
40
+ prominence,
41
+ size,
42
+ radius,
43
+ isInGroup,
44
+ ...variantProps
45
+ });
46
+ const [imageLoadingStatus, setImageLoadingStatus] = useState("idle");
47
+ const Component = as || "span";
48
+ return /* @__PURE__ */ jsx(
49
+ AvatarContext,
50
+ {
51
+ value: {
52
+ imageLoadingStatus,
53
+ setImageLoadingStatus,
54
+ slots,
55
+ classNames,
56
+ getInitials,
57
+ name
58
+ },
59
+ children: /* @__PURE__ */ jsx(
60
+ Component,
61
+ {
62
+ ref: domRef,
63
+ ...props,
64
+ className: slots.base({ className: className ?? classNames?.base }),
65
+ children
66
+ }
67
+ )
68
+ }
69
+ );
70
+ }
71
+ );
72
+ const AvatarImage = forwardRef(
73
+ ({ src, as, ...props }, ref) => {
74
+ const domRef = useDomRef(ref);
75
+ const {
76
+ setImageLoadingStatus,
77
+ imageLoadingStatus,
78
+ slots,
79
+ name,
80
+ classNames
81
+ } = useAvatarContext();
82
+ const currentImageStatus = useImageLoadingStatus(src, props);
83
+ const Component = as || "img";
84
+ useLayoutEffect(() => {
85
+ setImageLoadingStatus(currentImageStatus);
86
+ }, [currentImageStatus, setImageLoadingStatus]);
87
+ return /* @__PURE__ */ jsx(
88
+ Component,
89
+ {
90
+ ref: domRef,
91
+ alt: name,
92
+ "data-loaded": dataAttr(imageLoadingStatus === "loaded"),
93
+ ...props,
94
+ src,
95
+ className: slots.image({ className: classNames?.image })
96
+ }
97
+ );
98
+ }
99
+ );
100
+ const AvatarFallback = forwardRef(
101
+ ({ children, as, ...props }, ref) => {
102
+ const domRef = useDomRef(ref);
103
+ const { slots, classNames, imageLoadingStatus, name, getInitials } = useAvatarContext();
104
+ const childrenToRender = useMemo(() => {
105
+ if (children) return children;
106
+ if (name) {
107
+ return getInitials(name);
108
+ }
109
+ return /* @__PURE__ */ jsx(User, { className: slots.icon({ className: classNames?.icon }) });
110
+ }, [children, classNames?.icon, getInitials, name, slots]);
111
+ const Component = as || "div";
112
+ if (imageLoadingStatus === "loaded") {
113
+ return null;
114
+ }
115
+ return /* @__PURE__ */ jsx(
116
+ Component,
117
+ {
118
+ title: name,
119
+ className: slots.fallback({ className: classNames?.fallback }),
120
+ ref: domRef,
121
+ ...props,
122
+ children: childrenToRender
123
+ }
124
+ );
125
+ }
126
+ );
127
+
128
+ export { AvatarFallback, AvatarImage, AvatarRoot };