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

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 (129) 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/navbar/navbar-menu/menu.cjs +1 -1
  25. package/dist/cjs/navbar/use-navbar.cjs +1 -1
  26. 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
  27. package/dist/cjs/number-field/number-field.cjs +3 -3
  28. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  29. package/dist/cjs/select/select.cjs +89 -17
  30. package/dist/cjs/system/react-utils/children.cjs +7 -0
  31. package/dist/cjs/tag-field/tag-field.cjs +3 -3
  32. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  33. package/dist/cjs/text-field/text-field.cjs +1 -1
  34. package/dist/cjs/toast/toast.cjs +1 -1
  35. package/dist/esm/accordion/accordion.js +182 -0
  36. package/dist/esm/accordion/index.js +2 -0
  37. package/dist/esm/avatar/avatar-context.js +9 -0
  38. package/dist/esm/avatar/avatar-group-context.js +84 -0
  39. package/dist/esm/avatar/avatar-group.js +58 -0
  40. package/dist/esm/avatar/avatar.js +128 -0
  41. package/dist/esm/avatar/hooks/use-img-loading-status.js +66 -0
  42. package/dist/esm/avatar/index.js +13 -0
  43. package/dist/esm/avatar/utils.js +7 -0
  44. package/dist/esm/banner/banner.js +1 -1
  45. package/dist/esm/button/button.js +13 -10
  46. package/dist/esm/calendar/calendar-month-day-selector.js +2 -2
  47. package/dist/esm/checkbox/checkbox.js +3 -3
  48. package/dist/esm/combo-box/combo-box.js +2 -2
  49. package/dist/esm/date-field/date-field.js +1 -1
  50. package/dist/esm/date-picker/date-picker.js +5 -4
  51. package/dist/esm/date-range-picker/date-range-picker.js +5 -5
  52. package/dist/esm/file-dropzone/file-dropzone.js +13 -9
  53. package/dist/esm/file-dropzone/file-info.js +3 -2
  54. package/dist/esm/file-dropzone/utils.js +4 -4
  55. package/dist/esm/index.js +9 -3
  56. package/dist/esm/menu/menu.js +1 -1
  57. package/dist/esm/modal/modal-content.js +1 -1
  58. package/dist/esm/navbar/navbar-menu/menu.js +1 -1
  59. package/dist/esm/navbar/use-navbar.js +1 -1
  60. 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
  61. package/dist/esm/number-field/number-field.js +3 -3
  62. package/dist/esm/range-calendar/range-calendar.js +1 -1
  63. package/dist/esm/select/select.js +92 -20
  64. package/dist/esm/system/react-utils/children.js +7 -1
  65. package/dist/esm/tag-field/tag-field.js +3 -3
  66. package/dist/esm/text-area-field/text-area-field.js +1 -1
  67. package/dist/esm/text-field/text-field.js +1 -1
  68. package/dist/esm/toast/toast.js +1 -1
  69. package/dist/types/accordion/accordion.d.ts +50 -0
  70. package/dist/types/accordion/accordion.d.ts.map +1 -0
  71. package/dist/types/accordion/index.d.ts +2 -0
  72. package/dist/types/accordion/index.d.ts.map +1 -0
  73. package/dist/types/avatar/avatar-context.d.ts +12 -0
  74. package/dist/types/avatar/avatar-context.d.ts.map +1 -0
  75. package/dist/types/avatar/avatar-group-context.d.ts +70 -0
  76. package/dist/types/avatar/avatar-group-context.d.ts.map +1 -0
  77. package/dist/types/avatar/avatar-group.d.ts +5 -0
  78. package/dist/types/avatar/avatar-group.d.ts.map +1 -0
  79. package/dist/types/avatar/avatar.d.ts +18 -0
  80. package/dist/types/avatar/avatar.d.ts.map +1 -0
  81. package/dist/types/avatar/hooks/use-img-loading-status.d.ts +4 -0
  82. package/dist/types/avatar/hooks/use-img-loading-status.d.ts.map +1 -0
  83. package/dist/types/avatar/index.d.ts +15 -0
  84. package/dist/types/avatar/index.d.ts.map +1 -0
  85. package/dist/types/avatar/utils.d.ts +2 -0
  86. package/dist/types/avatar/utils.d.ts.map +1 -0
  87. package/dist/types/button/button.d.ts +12 -6
  88. package/dist/types/button/button.d.ts.map +1 -1
  89. package/dist/types/calendar/agnostic-calendar-state-context.d.ts +1 -1
  90. package/dist/types/calendar/agnostic-calendar-state-context.d.ts.map +1 -1
  91. package/dist/types/calendar/calendar.d.ts.map +1 -1
  92. package/dist/types/checkbox/checkbox-group-style-context.d.ts +1 -1
  93. package/dist/types/checkbox/checkbox-group-style-context.d.ts.map +1 -1
  94. package/dist/types/date-field/date-field.d.ts.map +1 -1
  95. package/dist/types/file-dropzone/file-dropzone.d.ts +8 -2
  96. package/dist/types/file-dropzone/file-dropzone.d.ts.map +1 -1
  97. package/dist/types/file-dropzone/file-info.d.ts.map +1 -1
  98. package/dist/types/file-dropzone/types.d.ts +1 -0
  99. package/dist/types/file-dropzone/types.d.ts.map +1 -1
  100. package/dist/types/file-dropzone/utils.d.ts +2 -1
  101. package/dist/types/file-dropzone/utils.d.ts.map +1 -1
  102. package/dist/types/index.d.mts +2 -0
  103. package/dist/types/index.d.ts +2 -0
  104. package/dist/types/index.d.ts.map +1 -1
  105. package/dist/types/menu/menu.d.ts +1 -1
  106. package/dist/types/menu/menu.d.ts.map +1 -1
  107. package/dist/types/navbar/navbar-context.d.ts +2 -2
  108. package/dist/types/navbar/use-navbar.d.ts +1 -1
  109. package/dist/types/range-calendar/range-calendar.d.ts.map +1 -1
  110. package/dist/types/select/select-item.d.ts +1 -2
  111. package/dist/types/select/select-item.d.ts.map +1 -1
  112. package/dist/types/select/select.d.ts +14 -0
  113. package/dist/types/select/select.d.ts.map +1 -1
  114. package/dist/types/system/react-utils/children.d.ts +3 -0
  115. package/dist/types/system/react-utils/children.d.ts.map +1 -1
  116. package/dist/types/system/react-utils/context.d.ts +4 -4
  117. package/dist/types/system/react-utils/context.d.ts.map +1 -1
  118. package/dist/types/system/utils.d.ts.map +1 -1
  119. package/dist/types/tabs/tabs.d.ts +1 -1
  120. package/dist/types/tabs/tabs.d.ts.map +1 -1
  121. package/dist/types/tag-field/tag-field-item.d.ts.map +1 -1
  122. package/dist/types/tag-field/tag-field-list.d.ts.map +1 -1
  123. package/package.json +20 -20
  124. /package/dist/cjs/node_modules/.pnpm/{@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3 → @react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3}/node_modules/@react-aria/overlays/dist/Overlay.cjs +0 -0
  125. /package/dist/cjs/node_modules/.pnpm/{@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3 → @react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3}/node_modules/@react-aria/overlays/dist/PortalProvider.cjs +0 -0
  126. /package/dist/cjs/node_modules/.pnpm/{@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3 → @react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3}/node_modules/@react-aria/overlays/dist/usePreventScroll.cjs +0 -0
  127. /package/dist/esm/node_modules/.pnpm/{@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3 → @react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3}/node_modules/@react-aria/overlays/dist/Overlay.js +0 -0
  128. /package/dist/esm/node_modules/.pnpm/{@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3 → @react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3}/node_modules/@react-aria/overlays/dist/PortalProvider.js +0 -0
  129. /package/dist/esm/node_modules/.pnpm/{@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3 → @react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3}/node_modules/@react-aria/overlays/dist/usePreventScroll.js +0 -0
@@ -5,11 +5,11 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
+ var field = require('../field/field.cjs');
8
9
  var utils = require('../system/utils.cjs');
9
10
  var checkboxGroupStyleContext = require('./checkbox-group-style-context.cjs');
10
11
  var minus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.cjs');
11
12
  var check = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.cjs');
12
- var field = require('../field/field.cjs');
13
13
 
14
14
  const Checkbox = ({
15
15
  classNames,
@@ -20,8 +20,8 @@ const Checkbox = ({
20
20
  originalProps,
21
21
  ouiTheme.checkboxStyles.variantKeys
22
22
  );
23
- const { size } = checkboxGroupStyleContext.useCheckboxGroupStyleContext();
24
- const styles = ouiTheme.checkboxStyles({ size, ...variants });
23
+ const context = checkboxGroupStyleContext.useCheckboxGroupStyleContext();
24
+ const styles = ouiTheme.checkboxStyles({ size: context?.size, ...variants });
25
25
  return /* @__PURE__ */ jsxRuntime.jsx(
26
26
  reactAriaComponents.Checkbox,
27
27
  {
@@ -7,13 +7,13 @@ var $670gB$react = require('react');
7
7
  var reactAria = require('react-aria');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
+ var field = require('../field/field.cjs');
11
+ var popover = require('../popover/popover.cjs');
10
12
  var utils = require('../system/utils.cjs');
11
13
  var comboBoxVariantContext = require('./combo-box-variant-context.cjs');
12
- var field = require('../field/field.cjs');
13
14
  var chevronUp = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs');
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
16
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.cjs');
16
- var popover = require('../popover/popover.cjs');
17
17
 
18
18
  const calculateEstimatedRowHeight = (size) => {
19
19
  switch (size) {
@@ -6,8 +6,8 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
- var utils = require('../system/utils.cjs');
10
9
  var field = require('../field/field.cjs');
10
+ var utils = require('../system/utils.cjs');
11
11
 
12
12
  function DateField(originalProps) {
13
13
  const [
@@ -6,13 +6,14 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
- var utils = require('../system/utils.cjs');
10
- var dateField = require('../date-field/date-field.cjs');
11
- var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
9
+ var button = require('../button/button.cjs');
12
10
  var calendar$1 = require('../calendar/calendar.cjs');
11
+ require('@internationalized/date');
12
+ var dateField = require('../date-field/date-field.cjs');
13
13
  var field = require('../field/field.cjs');
14
- var button = require('../button/button.cjs');
15
14
  var popover = require('../popover/popover.cjs');
15
+ var utils = require('../system/utils.cjs');
16
+ var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
16
17
 
17
18
  function DatePicker(originalProps) {
18
19
  const [
@@ -7,13 +7,13 @@ var $670gB$react = require('react');
7
7
  var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
- var utils = require('../system/utils.cjs');
11
- var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
12
- var rangeCalendar = require('../range-calendar/range-calendar.cjs');
13
- var field = require('../field/field.cjs');
14
- var dateField = require('../date-field/date-field.cjs');
15
10
  var button = require('../button/button.cjs');
11
+ var dateField = require('../date-field/date-field.cjs');
12
+ var field = require('../field/field.cjs');
16
13
  var popover = require('../popover/popover.cjs');
14
+ var rangeCalendar = require('../range-calendar/range-calendar.cjs');
15
+ var utils = require('../system/utils.cjs');
16
+ var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
17
17
 
18
18
  function DateRangePicker(originalProps) {
19
19
  const [
@@ -9,13 +9,13 @@ var reactAria = require('react-aria');
9
9
  var reactAriaComponents = require('react-aria-components');
10
10
  var reactDropzone = require('react-dropzone');
11
11
  var ouiTheme = require('@opengovsg/oui-theme');
12
+ var field = require('../field/field.cjs');
13
+ var useControllableState = require('../hooks/use-controllable-state.cjs');
12
14
  var utils = require('../system/utils.cjs');
13
15
  var contexts = require('./contexts.cjs');
14
16
  var fileInfo = require('./file-info.cjs');
15
17
  var utils$1 = require('./utils.cjs');
16
- var useControllableState = require('../hooks/use-controllable-state.cjs');
17
18
  var upload = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/upload.cjs');
18
- var field = require('../field/field.cjs');
19
19
 
20
20
  const FileDropzone = (originalProps) => {
21
21
  const [props, variantProps] = utils.mapPropsVariants(
@@ -25,6 +25,7 @@ const FileDropzone = (originalProps) => {
25
25
  const {
26
26
  name,
27
27
  allowedMimeTypes = [],
28
+ fileSizeBase = "binary",
28
29
  maxFileSize = Number.POSITIVE_INFINITY,
29
30
  minFileSize = 0,
30
31
  showFileSizeText = true,
@@ -69,9 +70,10 @@ const FileDropzone = (originalProps) => {
69
70
  (error) => utils$1.formatErrorMessage(error, {
70
71
  maxFileSize,
71
72
  minFileSize,
72
- maxFiles
73
+ maxFiles,
74
+ fileSizeBase
73
75
  }),
74
- [maxFileSize, maxFiles, minFileSize]
76
+ [fileSizeBase, maxFileSize, maxFiles, minFileSize]
75
77
  );
76
78
  const onDrop = $670gB$react.useCallback(
77
79
  (acceptedFiles, fileRejections) => {
@@ -129,19 +131,20 @@ const FileDropzone = (originalProps) => {
129
131
  const shouldShow = showFileSizeText && (notDefaultMaxFileSize || notDefaultMinFileSize);
130
132
  if (!shouldShow) return null;
131
133
  if (notDefaultMaxFileSize && notDefaultMinFileSize) {
132
- return `File size must be between ${utils$1.formatBytes(minFileSize, 2)} and ${utils$1.formatBytes(
134
+ return `File size must be between ${utils$1.formatBytes(minFileSize, 2, fileSizeBase)} and ${utils$1.formatBytes(
133
135
  maxFileSize,
134
- 2
136
+ 2,
137
+ fileSizeBase
135
138
  )}`;
136
139
  }
137
140
  if (notDefaultMaxFileSize) {
138
- return `Maximum file size: ${utils$1.formatBytes(maxFileSize, 2)}`;
141
+ return `Maximum file size: ${utils$1.formatBytes(maxFileSize, 2, fileSizeBase)}`;
139
142
  }
140
143
  if (notDefaultMinFileSize) {
141
- return `Minimum file size: ${utils$1.formatBytes(minFileSize, 2)}`;
144
+ return `Minimum file size: ${utils$1.formatBytes(minFileSize, 2, fileSizeBase)}`;
142
145
  }
143
146
  return null;
144
- }, [maxFileSize, minFileSize, showFileSizeText]);
147
+ }, [maxFileSize, minFileSize, showFileSizeText, fileSizeBase]);
145
148
  const triggerFileSelector = $670gB$react.useCallback(() => {
146
149
  if (isDisabled || isReadOnly) return;
147
150
  dropzoneState.inputRef.current?.click();
@@ -187,6 +190,7 @@ const FileDropzone = (originalProps) => {
187
190
  {
188
191
  isDisabled,
189
192
  isReadOnly,
193
+ fileSizeBase,
190
194
  maxFiles,
191
195
  maxFileSize,
192
196
  showDropzone,
@@ -5,10 +5,10 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
+ var button = require('../button/button.cjs');
8
9
  var contexts = require('./contexts.cjs');
9
10
  var utils = require('./utils.cjs');
10
11
  var trash2 = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/trash-2.cjs');
11
- var button = require('../button/button.cjs');
12
12
 
13
13
  const FileInfo = ({ file, imagePreview, classNames }) => {
14
14
  const {
@@ -19,7 +19,8 @@ const FileInfo = ({ file, imagePreview, classNames }) => {
19
19
  isReadOnly
20
20
  } = contexts.useFileDropzoneStateContext();
21
21
  const { size, variant, itemClassNames } = contexts.useFileDropzoneStyleContext();
22
- const readableFileSize = utils.formatBytes(file.size, 2);
22
+ const { fileSizeBase } = contexts.useFileDropzoneStateContext();
23
+ const readableFileSize = utils.formatBytes(file.size, 2, fileSizeBase);
23
24
  const styles = ouiTheme.fileInfoDropzoneStyles({
24
25
  size,
25
26
  variant,
@@ -3,8 +3,8 @@
3
3
 
4
4
  var reactDropzone = require('react-dropzone');
5
5
 
6
- const formatBytes = (bytes, decimals = 2, size) => {
7
- const k = 1e3;
6
+ const formatBytes = (bytes, decimals = 2, base = "binary", size) => {
7
+ const k = base === "binary" ? 1024 : 1e3;
8
8
  const dm = decimals < 0 ? 0 : decimals;
9
9
  const sizes = ["bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
10
10
  if (bytes === 0 || bytes === void 0)
@@ -16,9 +16,9 @@ const formatErrorMessage = (error, config) => {
16
16
  const { maxFileSize, minFileSize, maxFiles } = config;
17
17
  switch (error.code) {
18
18
  case reactDropzone.ErrorCode.FileTooLarge:
19
- return `You have exceeded the size limit, please upload a file below ${formatBytes(maxFileSize, 2)}`;
19
+ return `You have exceeded the size limit, please upload a file below ${formatBytes(maxFileSize, 2, config.fileSizeBase)}`;
20
20
  case reactDropzone.ErrorCode.FileTooSmall:
21
- return `Please upload a file above ${formatBytes(minFileSize, 2)}`;
21
+ return `Please upload a file above ${formatBytes(minFileSize, 2, config.fileSizeBase)}`;
22
22
  case reactDropzone.ErrorCode.TooManyFiles:
23
23
  return `Maximum number of files allowed is ${maxFiles}.`;
24
24
  default: {
@@ -27,10 +27,10 @@ var select = require('./select/select.cjs');
27
27
  var selectItem = require('./select/select-item.cjs');
28
28
  var selectVariantContext = require('./select/select-variant-context.cjs');
29
29
  var badge = require('./badge/badge.cjs');
30
- var date = require('@internationalized/date');
31
30
  var calendar = require('./calendar/calendar.cjs');
32
31
  var calendarStyleContext = require('./calendar/calendar-style-context.cjs');
33
32
  var utils = require('./calendar/utils.cjs');
33
+ var date = require('@internationalized/date');
34
34
  var rangeCalendar = require('./range-calendar/range-calendar.cjs');
35
35
  var menu = require('./menu/menu.cjs');
36
36
  var popover = require('./popover/popover.cjs');
@@ -40,10 +40,10 @@ var datePicker = require('./date-picker/date-picker.cjs');
40
40
  var dateRangePicker = require('./date-range-picker/date-range-picker.cjs');
41
41
  var checkbox = require('./checkbox/checkbox.cjs');
42
42
  var checkboxGroupStyleContext = require('./checkbox/checkbox-group-style-context.cjs');
43
- var usePagination = require('./pagination/hooks/use-pagination.cjs');
44
43
  var pagination = require('./pagination/pagination.cjs');
45
44
  var paginationCursor = require('./pagination/pagination-cursor.cjs');
46
45
  var paginationItem = require('./pagination/pagination-item.cjs');
46
+ var usePagination = require('./pagination/hooks/use-pagination.cjs');
47
47
  var usePagination$1 = require('./pagination/use-pagination.cjs');
48
48
  var fileDropzone = require('./file-dropzone/file-dropzone.cjs');
49
49
  var fileInfo = require('./file-dropzone/file-info.cjs');
@@ -56,7 +56,6 @@ var modalBody = require('./modal/modal-body.cjs');
56
56
  var modalHeader = require('./modal/modal-header.cjs');
57
57
  var modalVariantContext = require('./modal/modal-variant-context.cjs');
58
58
  var toast = require('./toast/toast.cjs');
59
- var sonner = require('sonner');
60
59
  var navbar = require('./navbar/navbar.cjs');
61
60
  var navbarBrand = require('./navbar/navbar-brand.cjs');
62
61
  var navbarContent = require('./navbar/navbar-content.cjs');
@@ -66,6 +65,13 @@ var toggle$1 = require('./navbar/navbar-menu/toggle.cjs');
66
65
  var navbarItem = require('./navbar/navbar-item.cjs');
67
66
  var useNavbar = require('./navbar/use-navbar.cjs');
68
67
  var navbarContext = require('./navbar/navbar-context.cjs');
68
+ var index = require('./avatar/index.cjs');
69
+ var accordion = require('./accordion/accordion.cjs');
70
+ var sonner = require('sonner');
71
+ var avatarContext = require('./avatar/avatar-context.cjs');
72
+ var avatarGroup = require('./avatar/avatar-group.cjs');
73
+ var avatarGroupContext = require('./avatar/avatar-group-context.cjs');
74
+ var avatar = require('./avatar/avatar.cjs');
69
75
 
70
76
 
71
77
 
@@ -102,10 +108,6 @@ exports.SelectItem = selectItem.SelectItem;
102
108
  exports.SelectVariantContext = selectVariantContext.SelectVariantContext;
103
109
  exports.useSelectVariantContext = selectVariantContext.useSelectVariantContext;
104
110
  exports.Badge = badge.Badge;
105
- Object.defineProperty(exports, "CalendarDate", {
106
- enumerable: true,
107
- get: function () { return date.CalendarDate; }
108
- });
109
111
  exports.Calendar = calendar.Calendar;
110
112
  exports.CalendarStateWrapper = calendar.CalendarStateWrapper;
111
113
  exports.CalendarStyleContext = calendarStyleContext.CalendarStyleContext;
@@ -114,6 +116,10 @@ exports.getEraFormat = utils.getEraFormat;
114
116
  exports.useGenerateLocalizedMonths = utils.useGenerateLocalizedMonths;
115
117
  exports.useGenerateLocalizedYears = utils.useGenerateLocalizedYears;
116
118
  exports.useLocalizedMonthYear = utils.useLocalizedMonthYear;
119
+ Object.defineProperty(exports, "CalendarDate", {
120
+ enumerable: true,
121
+ get: function () { return date.CalendarDate; }
122
+ });
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;
143
- exports.PaginationItemType = usePagination.PaginationItemType;
144
149
  exports.Pagination = pagination.Pagination;
145
150
  exports.PaginationCursor = paginationCursor.PaginationCursor;
146
151
  exports.PaginationItem = paginationItem.PaginationItem;
152
+ 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,10 +165,6 @@ exports.ModalHeader = modalHeader.ModalHeader;
159
165
  exports.ModalVariantContext = modalVariantContext.ModalVariantContext;
160
166
  exports.useModalVariantContext = modalVariantContext.useModalVariantContext;
161
167
  exports.Toaster = toast.Toaster;
162
- Object.defineProperty(exports, "toast", {
163
- enumerable: true,
164
- get: function () { return sonner.toast; }
165
- });
166
168
  exports.Navbar = navbar.Navbar;
167
169
  exports.NavbarBrand = navbarBrand.NavbarBrand;
168
170
  exports.NavbarContent = navbarContent.NavbarContent;
@@ -173,3 +175,22 @@ exports.NavbarItem = navbarItem.NavbarItem;
173
175
  exports.useNavbar = useNavbar.useNavbar;
174
176
  exports.NavbarProvider = navbarContext.NavbarProvider;
175
177
  exports.useNavbarContext = navbarContext.useNavbarContext;
178
+ exports.Avatar = index.Avatar;
179
+ exports.Accordion = accordion.Accordion;
180
+ exports.AccordionContent = accordion.AccordionContent;
181
+ exports.AccordionHeader = accordion.AccordionHeader;
182
+ exports.AccordionItem = accordion.AccordionItem;
183
+ exports.AccordionStyleContext = accordion.AccordionStyleContext;
184
+ exports.useAccordionStyleContext = accordion.useAccordionStyleContext;
185
+ Object.defineProperty(exports, "toast", {
186
+ enumerable: true,
187
+ get: function () { return sonner.toast; }
188
+ });
189
+ exports.AvatarContext = avatarContext.AvatarContext;
190
+ exports.useAvatarContext = avatarContext.useAvatarContext;
191
+ exports.AvatarGroup = avatarGroup.AvatarGroup;
192
+ exports.AvatarGroupProvider = avatarGroupContext.AvatarGroupProvider;
193
+ exports.useAvatarGroup = avatarGroupContext.useAvatarGroup;
194
+ exports.AvatarFallback = avatar.AvatarFallback;
195
+ exports.AvatarImage = avatar.AvatarImage;
196
+ 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');
9
10
  var utils = require('../system/utils.cjs');
10
11
  var context = require('../system/react-utils/context.cjs');
11
12
  var check = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.cjs');
12
13
  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');
10
11
  var i18n = require('./i18n.cjs');
11
12
  var modalVariantContext = require('./modal-variant-context.cjs');
12
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');
13
- var button = require('../button/button.cjs');
14
14
 
15
15
  function ModalContent({
16
16
  closeButtonContent: closeButtonContentProp,
@@ -3,7 +3,7 @@
3
3
  'use strict';
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
- var Overlay = require('../../node_modules/.pnpm/@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@react-aria/overlays/dist/Overlay.cjs');
6
+ var Overlay = require('../../node_modules/.pnpm/@react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@react-aria/overlays/dist/Overlay.cjs');
7
7
  var reactAria = require('react-aria');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
9
  var utils = require('../../system/utils.cjs');
@@ -3,7 +3,7 @@
3
3
  'use strict';
4
4
 
5
5
  var $670gB$react = require('react');
6
- var usePreventScroll = require('../node_modules/.pnpm/@react-aria_overlays@3.30.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@react-aria/overlays/dist/usePreventScroll.cjs');
6
+ var usePreventScroll = require('../node_modules/.pnpm/@react-aria_overlays@3.31.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/@react-aria/overlays/dist/usePreventScroll.cjs');
7
7
  var utils$2 = require('@react-aria/utils');
8
8
  var utils$1 = require('@react-stately/utils');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
@@ -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');
8
11
  var utils = require('../system/utils.cjs');
9
12
  var minus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.cjs');
10
13
  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');
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(
@@ -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');
10
+ var button = require('../button/button.cjs');
11
+ var field = require('../field/field.cjs');
12
+ var popover = require('../popover/popover.cjs');
9
13
  var utils = require('../system/utils.cjs');
10
14
  var selectVariantContext = require('./select-variant-context.cjs');
11
- var field = require('../field/field.cjs');
12
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');
13
- var popover = require('../popover/popover.cjs');
14
- 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
  ) });
@@ -21,6 +21,13 @@ const pickChildren = (children, targetChild) => {
21
21
  const targetChildren = target.length >= 0 ? target : void 0;
22
22
  return [withoutTargetChildren, targetChildren];
23
23
  };
24
+ const renderChildren = (renderProps, children) => {
25
+ if (typeof children === "function") {
26
+ return children(renderProps);
27
+ }
28
+ return children;
29
+ };
24
30
 
25
31
  exports.getValidChildren = getValidChildren;
26
32
  exports.pickChildren = pickChildren;
33
+ exports.renderChildren = renderChildren;
@@ -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');
9
12
  var tagFieldItem = require('./tag-field-item.cjs');
10
13
  var tagFieldList = require('./tag-field-list.cjs');
11
14
  var tagFieldRoot = require('./tag-field-root.cjs');
12
15
  var tagFieldTagList = require('./tag-field-tag-list.cjs');
13
16
  var tagFieldTrigger = require('./tag-field-trigger.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 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 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 @@
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');
8
9
  var utils = require('../system/utils.cjs');
9
10
  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);