@opengovsg/oui 0.0.45 → 0.0.46

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 (84) hide show
  1. package/dist/cjs/banner/banner.cjs +1 -1
  2. package/dist/cjs/checkbox/checkbox.cjs +1 -1
  3. package/dist/cjs/combo-box/combo-box.cjs +1 -1
  4. package/dist/cjs/date-field/date-field.cjs +1 -1
  5. package/dist/cjs/date-picker/date-picker.cjs +5 -4
  6. package/dist/cjs/date-range-picker/date-range-picker.cjs +3 -3
  7. package/dist/cjs/field/field.cjs +15 -12
  8. package/dist/cjs/file-dropzone/file-dropzone.cjs +2 -2
  9. package/dist/cjs/file-dropzone/file-info.cjs +1 -1
  10. package/dist/cjs/index.cjs +98 -72
  11. package/dist/cjs/modal/modal-content.cjs +1 -1
  12. package/dist/cjs/number-field/number-field.cjs +2 -2
  13. package/dist/cjs/phone-number-field/constants.cjs +500 -0
  14. package/dist/cjs/phone-number-field/context.cjs +11 -0
  15. package/dist/cjs/phone-number-field/i18n.cjs +1043 -0
  16. package/dist/cjs/phone-number-field/index.cjs +32 -0
  17. package/dist/cjs/phone-number-field/phone-number-field.cjs +299 -0
  18. package/dist/cjs/phone-number-field/types.cjs +3 -0
  19. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  20. package/dist/cjs/search-field/search-field.cjs +2 -2
  21. package/dist/cjs/select/i18n.cjs +23 -0
  22. package/dist/cjs/select/select.cjs +47 -47
  23. package/dist/cjs/sidebar/sidebar-list.cjs +1 -1
  24. package/dist/cjs/system/l10n.cjs +18 -0
  25. package/dist/cjs/system/react-utils/sizing.cjs +21 -0
  26. package/dist/cjs/tag-field/tag-field.cjs +1 -1
  27. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  28. package/dist/cjs/text-field/text-field.cjs +1 -1
  29. package/dist/cjs/time-field/time-field.cjs +2 -2
  30. package/dist/esm/banner/banner.js +1 -1
  31. package/dist/esm/checkbox/checkbox.js +1 -1
  32. package/dist/esm/combo-box/combo-box.js +1 -1
  33. package/dist/esm/date-field/date-field.js +1 -1
  34. package/dist/esm/date-picker/date-picker.js +5 -4
  35. package/dist/esm/date-range-picker/date-range-picker.js +3 -3
  36. package/dist/esm/field/field.js +18 -15
  37. package/dist/esm/file-dropzone/file-dropzone.js +2 -2
  38. package/dist/esm/file-dropzone/file-info.js +1 -1
  39. package/dist/esm/index.js +27 -25
  40. package/dist/esm/modal/modal-content.js +1 -1
  41. package/dist/esm/number-field/number-field.js +2 -2
  42. package/dist/esm/phone-number-field/constants.js +497 -0
  43. package/dist/esm/phone-number-field/context.js +8 -0
  44. package/dist/esm/phone-number-field/i18n.js +1041 -0
  45. package/dist/esm/phone-number-field/index.js +3 -0
  46. package/dist/esm/phone-number-field/phone-number-field.js +294 -0
  47. package/dist/esm/phone-number-field/types.js +1 -0
  48. package/dist/esm/range-calendar/range-calendar.js +1 -1
  49. package/dist/esm/search-field/search-field.js +2 -2
  50. package/dist/esm/select/i18n.js +21 -0
  51. package/dist/esm/select/select.js +47 -47
  52. package/dist/esm/sidebar/sidebar-list.js +1 -1
  53. package/dist/esm/system/l10n.js +16 -0
  54. package/dist/esm/system/react-utils/sizing.js +19 -0
  55. package/dist/esm/tag-field/tag-field.js +1 -1
  56. package/dist/esm/text-area-field/text-area-field.js +1 -1
  57. package/dist/esm/text-field/text-field.js +1 -1
  58. package/dist/esm/time-field/time-field.js +2 -2
  59. package/dist/types/field/field.d.ts +1 -1
  60. package/dist/types/field/field.d.ts.map +1 -1
  61. package/dist/types/index.d.mts +1 -0
  62. package/dist/types/index.d.ts +1 -0
  63. package/dist/types/index.d.ts.map +1 -1
  64. package/dist/types/phone-number-field/constants.d.ts +495 -0
  65. package/dist/types/phone-number-field/constants.d.ts.map +1 -0
  66. package/dist/types/phone-number-field/context.d.ts +15 -0
  67. package/dist/types/phone-number-field/context.d.ts.map +1 -0
  68. package/dist/types/phone-number-field/i18n.d.ts +1039 -0
  69. package/dist/types/phone-number-field/i18n.d.ts.map +1 -0
  70. package/dist/types/phone-number-field/index.d.ts +9 -0
  71. package/dist/types/phone-number-field/index.d.ts.map +1 -0
  72. package/dist/types/phone-number-field/phone-number-field.d.ts +42 -0
  73. package/dist/types/phone-number-field/phone-number-field.d.ts.map +1 -0
  74. package/dist/types/phone-number-field/types.d.ts +21 -0
  75. package/dist/types/phone-number-field/types.d.ts.map +1 -0
  76. package/dist/types/select/i18n.d.ts +19 -0
  77. package/dist/types/select/i18n.d.ts.map +1 -0
  78. package/dist/types/select/select.d.ts +11 -1
  79. package/dist/types/select/select.d.ts.map +1 -1
  80. package/dist/types/system/l10n.d.ts +10 -0
  81. package/dist/types/system/l10n.d.ts.map +1 -0
  82. package/dist/types/system/react-utils/sizing.d.ts +8 -0
  83. package/dist/types/system/react-utils/sizing.d.ts.map +1 -0
  84. package/package.json +6 -4
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var phoneNumberField = require('./phone-number-field.cjs');
5
+ var BasePhoneInput = require('react-phone-number-input');
6
+
7
+
8
+
9
+ exports.CountrySelect = phoneNumberField.CountrySelect;
10
+ exports.FlagComponent = phoneNumberField.FlagComponent;
11
+ exports.PhoneInput = phoneNumberField.PhoneInput;
12
+ exports.PhoneNumberField = phoneNumberField.PhoneNumberField;
13
+ Object.defineProperty(exports, "formatPhoneNumber", {
14
+ enumerable: true,
15
+ get: function () { return BasePhoneInput.formatPhoneNumber; }
16
+ });
17
+ Object.defineProperty(exports, "formatPhoneNumberIntl", {
18
+ enumerable: true,
19
+ get: function () { return BasePhoneInput.formatPhoneNumberIntl; }
20
+ });
21
+ Object.defineProperty(exports, "isPossiblePhoneNumber", {
22
+ enumerable: true,
23
+ get: function () { return BasePhoneInput.isPossiblePhoneNumber; }
24
+ });
25
+ Object.defineProperty(exports, "isValidPhoneNumber", {
26
+ enumerable: true,
27
+ get: function () { return BasePhoneInput.isValidPhoneNumber; }
28
+ });
29
+ Object.defineProperty(exports, "parsePhoneNumber", {
30
+ enumerable: true,
31
+ get: function () { return BasePhoneInput.parsePhoneNumber; }
32
+ });
@@ -0,0 +1,299 @@
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 BasePhoneInput = require('react-phone-number-input');
9
+ var flags = require('react-phone-number-input/flags');
10
+ var NonInternationalBasePhoneInput = require('react-phone-number-input/input');
11
+ var ouiTheme = require('@opengovsg/oui-theme');
12
+ var field = require('../field/field.cjs');
13
+ var useControllableState = require('../hooks/use-controllable-state.cjs');
14
+ var input = require('../input/input.cjs');
15
+ var select = require('../select/select.cjs');
16
+ var selectItem = require('../select/select-item.cjs');
17
+ var l10n = require('../system/l10n.cjs');
18
+ var utils = require('../system/utils.cjs');
19
+ var constants = require('./constants.cjs');
20
+ var context = require('./context.cjs');
21
+ var i18n = require('./i18n.cjs');
22
+
23
+ const PhoneInput = ({
24
+ onClear,
25
+ onKeyDown,
26
+ ...props
27
+ }) => {
28
+ const {
29
+ placeholderMode,
30
+ examples,
31
+ selectedCountry,
32
+ styles,
33
+ size,
34
+ classNames,
35
+ stringFormatter
36
+ } = context.usePhoneInputContext();
37
+ const inputPlaceholder = $670gB$react.useMemo(() => {
38
+ const defaultPlaceholder = stringFormatter.format("Enter a phone number");
39
+ if (placeholderMode === "off") {
40
+ return props.placeholder ?? defaultPlaceholder;
41
+ }
42
+ const exampleNumber = selectedCountry && examples[selectedCountry];
43
+ if (placeholderMode === "aggressive") {
44
+ return exampleNumber ?? props.placeholder ?? defaultPlaceholder;
45
+ }
46
+ return props.placeholder ?? exampleNumber ?? defaultPlaceholder;
47
+ }, [
48
+ props.placeholder,
49
+ stringFormatter,
50
+ placeholderMode,
51
+ examples,
52
+ selectedCountry
53
+ ]);
54
+ const handleKeyDown = $670gB$react.useCallback(
55
+ (event) => {
56
+ if (event.metaKey && event.key === "Backspace") {
57
+ event.preventDefault();
58
+ onClear?.();
59
+ } else {
60
+ onKeyDown?.(event);
61
+ }
62
+ },
63
+ [onClear, onKeyDown]
64
+ );
65
+ return /* @__PURE__ */ jsxRuntime.jsx(
66
+ input.Input,
67
+ {
68
+ variant: "unstyled",
69
+ placeholder: inputPlaceholder,
70
+ type: "tel",
71
+ autoComplete: "tel",
72
+ size,
73
+ ...props,
74
+ onKeyDown: handleKeyDown,
75
+ className: styles.input({
76
+ className: ouiTheme.cn(classNames?.input, props.className)
77
+ })
78
+ }
79
+ );
80
+ };
81
+ const PhoneNumberField = (originalProps) => {
82
+ const [
83
+ {
84
+ placeholderMode = "polite",
85
+ examples = constants.MOBILE_EXAMPLES,
86
+ label,
87
+ description,
88
+ errorMessage,
89
+ classNames,
90
+ isInvalid,
91
+ ...props
92
+ },
93
+ { variant = "international", ...variantProps }
94
+ ] = utils.mapPropsVariants(originalProps, ouiTheme.phoneNumberFieldStyles.variantKeys);
95
+ const stringFormatter = l10n.useLocalizedStringFormatter(i18n.i18nStrings);
96
+ const defaultCountry = $670gB$react.useMemo(
97
+ () => props.defaultCountry ?? "SG",
98
+ [props.defaultCountry]
99
+ );
100
+ const [selectedCountry, setSelectedCountry] = $670gB$react.useState(
101
+ defaultCountry
102
+ );
103
+ const [value, setValue] = useControllableState.useControllableState({
104
+ defaultValue: props.defaultValue,
105
+ value: props.value,
106
+ onChange: props.onChange
107
+ });
108
+ const triggerRef = $670gB$react.useRef(null);
109
+ const { size = "md", isDisabled } = variantProps;
110
+ const styles = ouiTheme.phoneNumberFieldStyles({
111
+ ...variantProps,
112
+ variant,
113
+ isDisabled,
114
+ size
115
+ });
116
+ return /* @__PURE__ */ jsxRuntime.jsxs(
117
+ reactAriaComponents.TextField,
118
+ {
119
+ isDisabled,
120
+ className: styles.base({
121
+ className: classNames?.base
122
+ }),
123
+ isInvalid,
124
+ children: [
125
+ label && /* @__PURE__ */ jsxRuntime.jsx(field.Label, { size, className: classNames?.label, children: label }),
126
+ /* @__PURE__ */ jsxRuntime.jsx(
127
+ reactAriaComponents.Provider,
128
+ {
129
+ values: [
130
+ [
131
+ context.PhoneInputContext,
132
+ {
133
+ triggerRef,
134
+ placeholderMode,
135
+ examples,
136
+ selectedCountry,
137
+ classNames,
138
+ styles,
139
+ variant,
140
+ ...variantProps,
141
+ size,
142
+ stringFormatter
143
+ }
144
+ ]
145
+ ],
146
+ children: /* @__PURE__ */ jsxRuntime.jsx(
147
+ field.FieldGroup,
148
+ {
149
+ isInvalid,
150
+ isDisabled,
151
+ "data-variant": variant,
152
+ ref: triggerRef,
153
+ className: styles.group({
154
+ className: classNames?.group
155
+ }),
156
+ children: variant === "international" ? /* @__PURE__ */ jsxRuntime.jsx(
157
+ BasePhoneInput,
158
+ {
159
+ disabled: isDisabled,
160
+ className: styles.wrapper({
161
+ className: classNames?.wrapper
162
+ }),
163
+ international: false,
164
+ addInternationalOption: false,
165
+ defaultCountry: selectedCountry,
166
+ countryOptionsOrder: [defaultCountry],
167
+ onCountryChange: setSelectedCountry,
168
+ countrySelectComponent: CountrySelect,
169
+ inputComponent: PhoneInput,
170
+ onClear: () => setValue(void 0),
171
+ ...props,
172
+ value,
173
+ onChange: (v) => setValue(v)
174
+ }
175
+ ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles.wrapper({ className: classNames?.wrapper }), children: [
176
+ /* @__PURE__ */ jsxRuntime.jsx(
177
+ NonInternationalBasePhoneInput,
178
+ {
179
+ country: defaultCountry,
180
+ onClear: () => setValue(void 0),
181
+ ...props,
182
+ inputComponent: PhoneInput,
183
+ value,
184
+ onChange: setValue
185
+ }
186
+ ),
187
+ /* @__PURE__ */ jsxRuntime.jsx(
188
+ FlagComponent,
189
+ {
190
+ className: styles.flag({ className: classNames?.flag }),
191
+ country: defaultCountry,
192
+ countryName: stringFormatter.format(defaultCountry)
193
+ }
194
+ )
195
+ ] })
196
+ }
197
+ )
198
+ }
199
+ ),
200
+ description && /* @__PURE__ */ jsxRuntime.jsx(field.Description, { size, className: classNames?.description, children: description }),
201
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { size, className: classNames?.error, children: errorMessage })
202
+ ]
203
+ }
204
+ );
205
+ };
206
+ function CountrySelect(props) {
207
+ const { options, value, onChange, onBlur, onFocus } = props;
208
+ const { triggerRef, classNames, styles, size, isDisabled, stringFormatter } = context.usePhoneInputContext();
209
+ return /* @__PURE__ */ jsxRuntime.jsx(
210
+ select.Select,
211
+ {
212
+ size,
213
+ popoverProps: {
214
+ // Position popover relative to the wrapping div instead of the Button
215
+ triggerRef
216
+ },
217
+ classNames: {
218
+ base: styles.select({ className: classNames?.select }),
219
+ trigger: styles.selectTrigger({
220
+ className: classNames?.selectTrigger
221
+ }),
222
+ icon: styles.selectIcon({ className: classNames?.selectIcon }),
223
+ // Apply same styles as trigger for consistent sizing
224
+ list: styles.selectList({ className: classNames?.selectList }),
225
+ popover: styles.selectPopover({ className: classNames?.selectPopover })
226
+ },
227
+ enableSearch: true,
228
+ variant: "unstyled",
229
+ isDisabled,
230
+ value,
231
+ onChange: (v) => onChange(v),
232
+ items: options,
233
+ renderSelectValue: () => /* @__PURE__ */ jsxRuntime.jsx(
234
+ FlagComponent,
235
+ {
236
+ className: styles.flag({ className: classNames?.flag }),
237
+ country: value,
238
+ countryName: value && stringFormatter.format(value)
239
+ }
240
+ ),
241
+ onBlur,
242
+ onFocus,
243
+ children: (country) => {
244
+ const l10nLabel = country.value ? stringFormatter.format(country.value) : "";
245
+ return /* @__PURE__ */ jsxRuntime.jsxs(
246
+ selectItem.SelectItem,
247
+ {
248
+ classNames: {
249
+ text: styles.selectItem({ className: classNames?.selectItem })
250
+ },
251
+ textValue: `${l10nLabel} ${country.label}`,
252
+ id: country.value,
253
+ children: [
254
+ /* @__PURE__ */ jsxRuntime.jsx(
255
+ FlagComponent,
256
+ {
257
+ className: styles.flag({ className: classNames?.flag }),
258
+ country: country.value,
259
+ countryName: l10nLabel
260
+ }
261
+ ),
262
+ /* @__PURE__ */ jsxRuntime.jsx(
263
+ "span",
264
+ {
265
+ className: styles.selectItemLabel({
266
+ className: classNames?.selectItemLabel
267
+ }),
268
+ children: l10nLabel
269
+ }
270
+ ),
271
+ country.value && /* @__PURE__ */ jsxRuntime.jsx(
272
+ "span",
273
+ {
274
+ className: styles.selectItemCountryCode({
275
+ className: classNames?.selectItemCountryCode
276
+ }),
277
+ children: `+${BasePhoneInput.getCountryCallingCode(country.value)}`
278
+ }
279
+ )
280
+ ]
281
+ }
282
+ );
283
+ }
284
+ }
285
+ );
286
+ }
287
+ const FlagComponent = ({
288
+ country,
289
+ countryName,
290
+ className
291
+ }) => {
292
+ const Flag = country && flags[country];
293
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className, children: Flag && /* @__PURE__ */ jsxRuntime.jsx(Flag, { title: countryName }) });
294
+ };
295
+
296
+ exports.CountrySelect = CountrySelect;
297
+ exports.FlagComponent = FlagComponent;
298
+ exports.PhoneInput = PhoneInput;
299
+ exports.PhoneNumberField = PhoneNumberField;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ 'use strict';
3
+
@@ -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');
11
12
  var agnosticCalendarStateContext = require('../calendar/agnostic-calendar-state-context.cjs');
12
13
  var calendarBottomContent = require('../calendar/calendar-bottom-content.cjs');
13
14
  var calendarGridHeader = require('../calendar/calendar-grid-header.cjs');
14
15
  var calendarHeader = require('../calendar/calendar-header.cjs');
15
16
  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(
@@ -5,13 +5,13 @@ var jsxRuntime = require('react/jsx-runtime');
5
5
  var reactAria = require('react-aria');
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');
8
10
  var input = require('../input/input.cjs');
9
11
  var utils = require('../system/utils.cjs');
10
12
  var i18n = require('./i18n.cjs');
11
13
  var search = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/search.cjs');
12
14
  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 field = require('../field/field.cjs');
14
- var button = require('../button/button.cjs');
15
15
 
16
16
  function SearchField(originalProps) {
17
17
  const [
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ const i18nStrings = {
5
+ "en-SG": {
6
+ "Search...": "Search...",
7
+ "Search options": "Search options"
8
+ },
9
+ "zh-SG": {
10
+ "Search...": "\u641C\u7D22...",
11
+ "Search options": "\u641C\u7D22\u9009\u9879"
12
+ },
13
+ "ms-SG": {
14
+ "Search...": "Cari...",
15
+ "Search options": "Cari pilihan"
16
+ },
17
+ "ta-SG": {
18
+ "Search...": "\u0BA4\u0BC7\u0B9F\u0BC1...",
19
+ "Search options": "\u0BA4\u0BC7\u0B9F\u0BB2\u0BCD \u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0B99\u0BCD\u0B95\u0BB3\u0BCD"
20
+ }
21
+ };
22
+
23
+ exports.i18nStrings = i18nStrings;
@@ -7,31 +7,15 @@ 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
+ var field = require('../field/field.cjs');
10
12
  var popover = require('../popover/popover.cjs');
13
+ var sizing = require('../system/react-utils/sizing.cjs');
11
14
  var utils = require('../system/utils.cjs');
15
+ var i18n = require('./i18n.cjs');
12
16
  var selectVariantContext = require('./select-variant-context.cjs');
13
- var field = require('../field/field.cjs');
14
17
  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 button = require('../button/button.cjs');
16
18
 
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
- };
35
19
  const calculateEstimatedRowHeight = (size) => {
36
20
  switch (size) {
37
21
  case "xs":
@@ -49,7 +33,7 @@ function Select({
49
33
  errorMessage,
50
34
  ...originalProps
51
35
  }) {
52
- const formatter = reactAria.useLocalizedStringFormatter(i18nStrings);
36
+ const stringFormatter = reactAria.useLocalizedStringFormatter(i18n.i18nStrings);
53
37
  const [_props, variantProps] = utils.mapPropsVariants(
54
38
  originalProps,
55
39
  ouiTheme.selectStyles.variantKeys
@@ -61,9 +45,12 @@ function Select({
61
45
  enableSearch = false,
62
46
  searchPlaceholder,
63
47
  searchIcon,
48
+ renderSelectValue,
49
+ popoverProps,
64
50
  ...props
65
51
  } = _props;
66
52
  const styles = ouiTheme.selectStyles(variantProps);
53
+ const triggerWidth = sizing.useElementWidth(popoverProps?.triggerRef);
67
54
  const { contains } = reactAriaComponents.useFilter({ sensitivity: "base" });
68
55
  const layoutOptions = $670gB$react.useMemo(() => {
69
56
  return {
@@ -130,7 +117,8 @@ function Select({
130
117
  {
131
118
  className: styles.selectedText({
132
119
  className: classNames?.selectedText
133
- })
120
+ }),
121
+ children: renderSelectValue
134
122
  }
135
123
  ),
136
124
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -153,31 +141,43 @@ function Select({
153
141
  }
154
142
  ),
155
143
  /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { size: variantProps.size, className: classNames?.error, children: errorMessage }),
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 })
144
+ /* @__PURE__ */ jsxRuntime.jsx(
145
+ popover.Popover,
146
+ {
147
+ className: styles.popover({ className: classNames?.popover }),
148
+ ...triggerWidth !== null ? {
149
+ style: {
150
+ "--trigger-width": triggerWidth
151
+ }
152
+ } : {},
153
+ ...popoverProps,
154
+ children: enableSearch ? /* @__PURE__ */ jsxRuntime.jsxs(reactAriaComponents.Autocomplete, { filter: contains, children: [
155
+ /* @__PURE__ */ jsxRuntime.jsxs(
156
+ reactAriaComponents.SearchField,
157
+ {
158
+ autoFocus: true,
159
+ "aria-label": stringFormatter.format("Search options"),
160
+ className: styles.searchField({
161
+ className: classNames?.searchField
162
+ }),
163
+ children: [
164
+ renderedSearchIcon,
165
+ /* @__PURE__ */ jsxRuntime.jsx(
166
+ reactAriaComponents.Input,
167
+ {
168
+ placeholder: searchPlaceholder ?? stringFormatter.format("Search..."),
169
+ className: styles.searchInput({
170
+ className: classNames?.searchInput
171
+ })
172
+ }
173
+ )
174
+ ]
175
+ }
176
+ ),
177
+ listContent
178
+ ] }) : listContent
179
+ }
180
+ )
181
181
  ]
182
182
  }
183
183
  ) });
@@ -8,11 +8,11 @@ var reactAria = require('react-aria');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var reactStately = require('react-stately');
10
10
  var ouiTheme = require('@opengovsg/oui-theme');
11
+ var button = require('../button/button.cjs');
11
12
  var utils = require('../system/utils.cjs');
12
13
  var context = require('./context.cjs');
13
14
  var i18n = require('./i18n.cjs');
14
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');
15
- var button = require('../button/button.cjs');
16
16
 
17
17
  const SidebarListSection = ({
18
18
  onlyCaretToggle,
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var $670gB$react = require('react');
5
+ var string = require('@internationalized/string');
6
+ var i18n = require('@react-aria/i18n');
7
+ var reactAriaComponents = require('react-aria-components');
8
+
9
+ function useLocalizedStringFormatter(strings, packageName) {
10
+ const { locale } = reactAriaComponents.useLocale();
11
+ const dictionary = i18n.useLocalizedStringDictionary(strings, packageName);
12
+ return $670gB$react.useMemo(
13
+ () => new string.LocalizedStringFormatter(locale, dictionary),
14
+ [locale, dictionary]
15
+ );
16
+ }
17
+
18
+ exports.useLocalizedStringFormatter = useLocalizedStringFormatter;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var $670gB$react = require('react');
5
+ var utils = require('@react-aria/utils');
6
+
7
+ function useElementWidth(ref) {
8
+ const [elementWidth, setElementWidth] = $670gB$react.useState(null);
9
+ const onResize = $670gB$react.useCallback(() => {
10
+ if (ref && ref.current && ref.current instanceof HTMLElement) {
11
+ setElementWidth(`${ref.current.offsetWidth}px`);
12
+ }
13
+ }, [ref]);
14
+ utils.useResizeObserver({
15
+ ref,
16
+ onResize
17
+ });
18
+ return elementWidth;
19
+ }
20
+
21
+ exports.useElementWidth = useElementWidth;
@@ -6,6 +6,7 @@ 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');
9
10
  var input = require('../input/input.cjs');
10
11
  var popover = require('../popover/popover.cjs');
11
12
  var tagFieldItem = require('./tag-field-item.cjs');
@@ -14,7 +15,6 @@ var tagFieldRoot = require('./tag-field-root.cjs');
14
15
  var tagFieldTagList = require('./tag-field-tag-list.cjs');
15
16
  var tagFieldTrigger = require('./tag-field-trigger.cjs');
16
17
  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');
17
- var field = require('../field/field.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 textArea = require('../text-area/text-area.cjs');
9
8
  var field = require('../field/field.cjs');
9
+ var textArea = require('../text-area/text-area.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 input = require('../input/input.cjs');
9
8
  var field = require('../field/field.cjs');
9
+ var input = require('../input/input.cjs');
10
10
 
11
11
  function TextField({
12
12
  label,
@@ -5,9 +5,9 @@ var jsxRuntime = require('react/jsx-runtime');
5
5
  var $670gB$react = require('react');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
- var utils = require('../system/utils.cjs');
9
- var field = require('../field/field.cjs');
10
8
  var dateField = require('../date-field/date-field.cjs');
9
+ var field = require('../field/field.cjs');
10
+ var utils = require('../system/utils.cjs');
11
11
 
12
12
  function TimeField(originalProps) {
13
13
  const [
@@ -5,10 +5,10 @@ import { useMemo, useRef } from 'react';
5
5
  import { useLocalizedStringFormatter, useDisclosure } from 'react-aria';
6
6
  import { useDisclosureState } from 'react-stately';
7
7
  import { bannerStyles } from '@opengovsg/oui-theme';
8
+ import { Button } from '../button/button.js';
8
9
  import { i18nStrings } from './i18n.js';
9
10
  import CircleAlert from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-alert.js';
10
11
  import Info from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/info.js';
11
- import { Button } from '../button/button.js';
12
12
  import X from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.js';
13
13
 
14
14
  const Banner = ({
@@ -3,11 +3,11 @@
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { Checkbox as Checkbox$1, composeRenderProps, Provider, CheckboxGroup as CheckboxGroup$1 } from 'react-aria-components';
5
5
  import { checkboxStyles, checkboxGroupStyles } from '@opengovsg/oui-theme';
6
+ import { Label, Description, FieldError } from '../field/field.js';
6
7
  import { mapPropsVariants } from '../system/utils.js';
7
8
  import { useCheckboxGroupStyleContext, CheckboxGroupStyleContext } from './checkbox-group-style-context.js';
8
9
  import Minus from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.js';
9
10
  import Check from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.js';
10
- import { Label, Description, FieldError } from '../field/field.js';
11
11
 
12
12
  const Checkbox = ({
13
13
  classNames,