@opengovsg/oui 0.0.44 → 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 (100) hide show
  1. package/dist/cjs/field/field.cjs +15 -12
  2. package/dist/cjs/index.cjs +40 -0
  3. package/dist/cjs/phone-number-field/constants.cjs +500 -0
  4. package/dist/cjs/phone-number-field/context.cjs +11 -0
  5. package/dist/cjs/phone-number-field/i18n.cjs +1043 -0
  6. package/dist/cjs/phone-number-field/index.cjs +32 -0
  7. package/dist/cjs/phone-number-field/phone-number-field.cjs +299 -0
  8. package/dist/cjs/phone-number-field/types.cjs +3 -0
  9. package/dist/cjs/select/i18n.cjs +23 -0
  10. package/dist/cjs/select/select.cjs +45 -45
  11. package/dist/cjs/sidebar/context.cjs +24 -0
  12. package/dist/cjs/sidebar/i18n.cjs +23 -0
  13. package/dist/cjs/sidebar/index.cjs +17 -0
  14. package/dist/cjs/sidebar/sidebar-header.cjs +40 -0
  15. package/dist/cjs/sidebar/sidebar-item.cjs +61 -0
  16. package/dist/cjs/sidebar/sidebar-list.cjs +213 -0
  17. package/dist/cjs/sidebar/sidebar-root.cjs +63 -0
  18. package/dist/cjs/sidebar/sidebar.cjs +31 -0
  19. package/dist/cjs/sidebar/types.cjs +3 -0
  20. package/dist/cjs/sidebar/utils.cjs +12 -0
  21. package/dist/cjs/system/l10n.cjs +18 -0
  22. package/dist/cjs/system/react-utils/sizing.cjs +21 -0
  23. package/dist/cjs/tooltip/index.cjs +9 -0
  24. package/dist/cjs/tooltip/tooltip.cjs +54 -0
  25. package/dist/esm/field/field.js +18 -15
  26. package/dist/esm/index.js +8 -0
  27. package/dist/esm/phone-number-field/constants.js +497 -0
  28. package/dist/esm/phone-number-field/context.js +8 -0
  29. package/dist/esm/phone-number-field/i18n.js +1041 -0
  30. package/dist/esm/phone-number-field/index.js +3 -0
  31. package/dist/esm/phone-number-field/phone-number-field.js +294 -0
  32. package/dist/esm/phone-number-field/types.js +1 -0
  33. package/dist/esm/select/i18n.js +21 -0
  34. package/dist/esm/select/select.js +45 -45
  35. package/dist/esm/sidebar/context.js +17 -0
  36. package/dist/esm/sidebar/i18n.js +21 -0
  37. package/dist/esm/sidebar/index.js +6 -0
  38. package/dist/esm/sidebar/sidebar-header.js +38 -0
  39. package/dist/esm/sidebar/sidebar-item.js +59 -0
  40. package/dist/esm/sidebar/sidebar-list.js +211 -0
  41. package/dist/esm/sidebar/sidebar-root.js +61 -0
  42. package/dist/esm/sidebar/sidebar.js +28 -0
  43. package/dist/esm/sidebar/types.js +1 -0
  44. package/dist/esm/sidebar/utils.js +9 -0
  45. package/dist/esm/system/l10n.js +16 -0
  46. package/dist/esm/system/react-utils/sizing.js +19 -0
  47. package/dist/esm/tooltip/index.js +2 -0
  48. package/dist/esm/tooltip/tooltip.js +51 -0
  49. package/dist/types/field/field.d.ts +1 -1
  50. package/dist/types/field/field.d.ts.map +1 -1
  51. package/dist/types/index.d.mts +3 -0
  52. package/dist/types/index.d.ts +3 -0
  53. package/dist/types/index.d.ts.map +1 -1
  54. package/dist/types/phone-number-field/constants.d.ts +495 -0
  55. package/dist/types/phone-number-field/constants.d.ts.map +1 -0
  56. package/dist/types/phone-number-field/context.d.ts +15 -0
  57. package/dist/types/phone-number-field/context.d.ts.map +1 -0
  58. package/dist/types/phone-number-field/i18n.d.ts +1039 -0
  59. package/dist/types/phone-number-field/i18n.d.ts.map +1 -0
  60. package/dist/types/phone-number-field/index.d.ts +9 -0
  61. package/dist/types/phone-number-field/index.d.ts.map +1 -0
  62. package/dist/types/phone-number-field/phone-number-field.d.ts +42 -0
  63. package/dist/types/phone-number-field/phone-number-field.d.ts.map +1 -0
  64. package/dist/types/phone-number-field/types.d.ts +21 -0
  65. package/dist/types/phone-number-field/types.d.ts.map +1 -0
  66. package/dist/types/select/i18n.d.ts +19 -0
  67. package/dist/types/select/i18n.d.ts.map +1 -0
  68. package/dist/types/select/select.d.ts +11 -1
  69. package/dist/types/select/select.d.ts.map +1 -1
  70. package/dist/types/sidebar/context.d.ts +22 -0
  71. package/dist/types/sidebar/context.d.ts.map +1 -0
  72. package/dist/types/sidebar/i18n.d.ts +19 -0
  73. package/dist/types/sidebar/i18n.d.ts.map +1 -0
  74. package/dist/types/sidebar/index.d.ts +7 -0
  75. package/dist/types/sidebar/index.d.ts.map +1 -0
  76. package/dist/types/sidebar/sidebar-header.d.ts +6 -0
  77. package/dist/types/sidebar/sidebar-header.d.ts.map +1 -0
  78. package/dist/types/sidebar/sidebar-item.d.ts +3 -0
  79. package/dist/types/sidebar/sidebar-item.d.ts.map +1 -0
  80. package/dist/types/sidebar/sidebar-list.d.ts +3 -0
  81. package/dist/types/sidebar/sidebar-list.d.ts.map +1 -0
  82. package/dist/types/sidebar/sidebar-root.d.ts +17 -0
  83. package/dist/types/sidebar/sidebar-root.d.ts.map +1 -0
  84. package/dist/types/sidebar/sidebar.d.ts +8 -0
  85. package/dist/types/sidebar/sidebar.d.ts.map +1 -0
  86. package/dist/types/sidebar/types.d.ts +48 -0
  87. package/dist/types/sidebar/types.d.ts.map +1 -0
  88. package/dist/types/sidebar/utils.d.ts +4 -0
  89. package/dist/types/sidebar/utils.d.ts.map +1 -0
  90. package/dist/types/system/l10n.d.ts +10 -0
  91. package/dist/types/system/l10n.d.ts.map +1 -0
  92. package/dist/types/system/react-utils/children.d.ts +1 -2
  93. package/dist/types/system/react-utils/children.d.ts.map +1 -1
  94. package/dist/types/system/react-utils/sizing.d.ts +8 -0
  95. package/dist/types/system/react-utils/sizing.d.ts.map +1 -0
  96. package/dist/types/tooltip/index.d.ts +2 -0
  97. package/dist/types/tooltip/index.d.ts.map +1 -0
  98. package/dist/types/tooltip/tooltip.d.ts +16 -0
  99. package/dist/types/tooltip/tooltip.d.ts.map +1 -0
  100. package/package.json +7 -5
@@ -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
+
@@ -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;
@@ -10,28 +10,12 @@ var ouiTheme = require('@opengovsg/oui-theme');
10
10
  var button = require('../button/button.cjs');
11
11
  var field = require('../field/field.cjs');
12
12
  var popover = require('../popover/popover.cjs');
13
+ var sizing = require('../system/react-utils/sizing.cjs');
13
14
  var utils = require('../system/utils.cjs');
15
+ var i18n = require('./i18n.cjs');
14
16
  var selectVariantContext = require('./select-variant-context.cjs');
15
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');
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
  ) });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ "use client";
3
+ 'use strict';
4
+
5
+ var context = require('../system/react-utils/context.cjs');
6
+
7
+ const [SidebarStyleContext, useSidebarStyleContext] = context.createContext({
8
+ name: "SidebarStyleContext"
9
+ });
10
+ const [SidebarCollapseContext, useSidebarCollapseContext] = context.createContext({
11
+ name: "SidebarCollapseContext"
12
+ });
13
+ const [SidebarNestContext, useSidebarNestContext] = context.createContext({
14
+ name: "SidebarNestContext",
15
+ strict: false,
16
+ defaultValue: { isNested: false, isExpanded: false }
17
+ });
18
+
19
+ exports.SidebarCollapseContext = SidebarCollapseContext;
20
+ exports.SidebarNestContext = SidebarNestContext;
21
+ exports.SidebarStyleContext = SidebarStyleContext;
22
+ exports.useSidebarCollapseContext = useSidebarCollapseContext;
23
+ exports.useSidebarNestContext = useSidebarNestContext;
24
+ exports.useSidebarStyleContext = useSidebarStyleContext;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ const i18nStrings = {
5
+ "en-SG": {
6
+ "Expand sidebar section": "Expand sidebar section",
7
+ "Collapse sidebar section": "Collapse sidebar section"
8
+ },
9
+ "zh-SG": {
10
+ "Expand sidebar section": "\u5C55\u5F00\u4FA7\u8FB9\u680F\u90E8\u5206",
11
+ "Collapse sidebar section": "\u6298\u53E0\u4FA7\u8FB9\u680F\u90E8\u5206"
12
+ },
13
+ "ms-SG": {
14
+ "Expand sidebar section": "Perluas bahagian bar sisi",
15
+ "Collapse sidebar section": "Kuncupkan bahagian bar sisi"
16
+ },
17
+ "ta-SG": {
18
+ "Expand sidebar section": "\u0BAA\u0B95\u0BCD\u0B95\u0BB5\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0B95\u0BC1\u0BA4\u0BBF\u0BAF\u0BC8 \u0BB5\u0BBF\u0BB0\u0BBF\u0BB5\u0BBE\u0B95\u0BCD\u0B95\u0BC1",
19
+ "Collapse sidebar section": "\u0BAA\u0B95\u0BCD\u0B95\u0BB5\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0BAA\u0BCD \u0BAA\u0B95\u0BC1\u0BA4\u0BBF\u0BAF\u0BC8 \u0B9A\u0BC1\u0BB0\u0BC1\u0B95\u0BCD\u0B95\u0BC1"
20
+ }
21
+ };
22
+
23
+ exports.i18nStrings = i18nStrings;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var sidebar = require('./sidebar.cjs');
5
+ var sidebarRoot = require('./sidebar-root.cjs');
6
+ var sidebarItem = require('./sidebar-item.cjs');
7
+ var sidebarList = require('./sidebar-list.cjs');
8
+ var sidebarHeader = require('./sidebar-header.cjs');
9
+
10
+
11
+
12
+ exports.Sidebar = sidebar.Sidebar;
13
+ exports.generateSidebarItems = sidebar.generateSidebarItems;
14
+ exports.SidebarRoot = sidebarRoot.SidebarRoot;
15
+ exports.SidebarItem = sidebarItem.SidebarItem;
16
+ exports.SidebarList = sidebarList.SidebarList;
17
+ exports.SidebarHeader = sidebarHeader.SidebarHeader;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ "use client";
3
+ 'use strict';
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var children = require('../system/react-utils/children.cjs');
7
+ var utils = require('../system/utils.cjs');
8
+ var context = require('./context.cjs');
9
+
10
+ const SidebarHeader = utils.forwardRef(
11
+ ({ children: children$1, startContent, endContent, ...props }, ref) => {
12
+ const { slots, classNames } = context.useSidebarStyleContext();
13
+ return /* @__PURE__ */ jsxRuntime.jsx(
14
+ "li",
15
+ {
16
+ className: slots.headerLi({
17
+ className: classNames?.headerLi
18
+ }),
19
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
20
+ "h2",
21
+ {
22
+ className: slots.header({
23
+ className: classNames?.header
24
+ }),
25
+ ref,
26
+ ...props,
27
+ children: [
28
+ startContent,
29
+ children.renderChildren({}, children$1),
30
+ endContent
31
+ ]
32
+ }
33
+ )
34
+ }
35
+ );
36
+ }
37
+ );
38
+ SidebarHeader.displayName = "SidebarHeader";
39
+
40
+ exports.SidebarHeader = SidebarHeader;
@@ -0,0 +1,61 @@
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 tooltip = require('../tooltip/tooltip.cjs');
12
+ var context = require('./context.cjs');
13
+
14
+ const SidebarItem = utils.forwardRef(
15
+ ({ children: children$1, startContent, endContent, tooltip: tooltip$1, isSelected, ...props }, ref) => {
16
+ const { slots, classNames } = context.useSidebarStyleContext();
17
+ const { isNested, isExpanded } = context.useSidebarNestContext() ?? {};
18
+ const { isCollapsed, tooltipProps, tooltipTriggerProps } = context.useSidebarCollapseContext() ?? {};
19
+ const dataSelected = $670gB$react.useMemo(() => {
20
+ if (typeof isSelected === "function") {
21
+ return isSelected();
22
+ }
23
+ return isSelected;
24
+ }, [isSelected]);
25
+ return /* @__PURE__ */ jsxRuntime.jsx(
26
+ "li",
27
+ {
28
+ "data-selected": ouiTheme.dataAttr(dataSelected),
29
+ "data-nested": ouiTheme.dataAttr(isNested),
30
+ className: slots.item({
31
+ isNested,
32
+ className: classNames?.item
33
+ }),
34
+ ref,
35
+ children: /* @__PURE__ */ jsxRuntime.jsxs(tooltip.TooltipTrigger, { delay: 0, ...tooltipTriggerProps, children: [
36
+ /* @__PURE__ */ jsxRuntime.jsx(
37
+ reactAriaComponents.Link,
38
+ {
39
+ "aria-label": isCollapsed ? tooltip$1 : void 0,
40
+ ...props,
41
+ className: slots.label({
42
+ isNested,
43
+ isExpanded,
44
+ className: classNames?.label
45
+ }),
46
+ children: (renderProps) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
47
+ startContent,
48
+ !isCollapsed && children.renderChildren(renderProps, children$1),
49
+ !isCollapsed && endContent
50
+ ] })
51
+ }
52
+ ),
53
+ isCollapsed && /* @__PURE__ */ jsxRuntime.jsx(tooltip.Tooltip, { placement: "end", ...tooltipProps, children: tooltip$1 })
54
+ ] })
55
+ }
56
+ );
57
+ }
58
+ );
59
+ SidebarItem.displayName = "SidebarItem";
60
+
61
+ exports.SidebarItem = SidebarItem;