@opengovsg/oui 0.0.48 → 0.0.50

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 (48) hide show
  1. package/dist/cjs/index.cjs +31 -26
  2. package/dist/cjs/infobox/index.cjs +8 -0
  3. package/dist/cjs/infobox/infobox.cjs +39 -0
  4. package/dist/cjs/infobox/use-infobox.cjs +32 -0
  5. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-check.cjs +22 -0
  6. package/dist/cjs/pagination/index.cjs +5 -5
  7. package/dist/cjs/radio-group/index.cjs +9 -0
  8. package/dist/cjs/radio-group/radio-group-variant-context.cjs +15 -0
  9. package/dist/cjs/radio-group/radio.cjs +99 -0
  10. package/dist/cjs/search-field/search-field.cjs +6 -3
  11. package/dist/esm/accordion/accordion.js +1 -1
  12. package/dist/esm/badge/use-badge.js +1 -1
  13. package/dist/esm/breadcrumbs/breadcrumbs.js +2 -2
  14. package/dist/esm/calendar/calendar.js +1 -1
  15. package/dist/esm/combo-box/combo-box-item.js +1 -1
  16. package/dist/esm/combo-box/combo-box.js +1 -1
  17. package/dist/esm/index.js +4 -2
  18. package/dist/esm/infobox/index.js +2 -0
  19. package/dist/esm/infobox/infobox.js +37 -0
  20. package/dist/esm/infobox/use-infobox.js +30 -0
  21. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-check.js +17 -0
  22. package/dist/esm/number-field/number-field.js +1 -1
  23. package/dist/esm/pagination/use-pagination-item.js +1 -1
  24. package/dist/esm/phone-number-field/phone-number-field.js +4 -4
  25. package/dist/esm/popover/popover.js +1 -1
  26. package/dist/esm/radio-group/index.js +2 -0
  27. package/dist/esm/radio-group/radio-group-variant-context.js +12 -0
  28. package/dist/esm/radio-group/radio.js +96 -0
  29. package/dist/esm/search-field/search-field.js +6 -3
  30. package/dist/esm/tabs/tabs.js +2 -2
  31. package/dist/types/index.d.mts +2 -0
  32. package/dist/types/index.d.ts +2 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/types/infobox/index.d.ts +2 -0
  35. package/dist/types/infobox/index.d.ts.map +1 -0
  36. package/dist/types/infobox/infobox.d.ts +5 -0
  37. package/dist/types/infobox/infobox.d.ts.map +1 -0
  38. package/dist/types/infobox/use-infobox.d.ts +54 -0
  39. package/dist/types/infobox/use-infobox.d.ts.map +1 -0
  40. package/dist/types/radio-group/index.d.ts +3 -0
  41. package/dist/types/radio-group/index.d.ts.map +1 -0
  42. package/dist/types/radio-group/radio-group-variant-context.d.ts +6 -0
  43. package/dist/types/radio-group/radio-group-variant-context.d.ts.map +1 -0
  44. package/dist/types/radio-group/radio.d.ts +39 -0
  45. package/dist/types/radio-group/radio.d.ts.map +1 -0
  46. package/dist/types/search-field/search-field.d.ts +5 -0
  47. package/dist/types/search-field/search-field.d.ts.map +1 -1
  48. package/package.json +4 -4
@@ -9,7 +9,7 @@ var ripple = require('./ripple/ripple.cjs');
9
9
  var useRipple = require('./ripple/use-ripple.cjs');
10
10
  var spinner = require('./spinner/spinner.cjs');
11
11
  var useSpinner = require('./spinner/use-spinner.cjs');
12
- var toggle = require('./toggle/toggle.cjs');
12
+ var toggle$1 = require('./toggle/toggle.cjs');
13
13
  var skipNavLink = require('./skip-nav-link/skip-nav-link.cjs');
14
14
  var input = require('./input/input.cjs');
15
15
  var textField = require('./text-field/text-field.cjs');
@@ -29,7 +29,7 @@ var selectVariantContext = require('./select/select-variant-context.cjs');
29
29
  var badge = require('./badge/badge.cjs');
30
30
  var calendar = require('./calendar/calendar.cjs');
31
31
  var calendarStyleContext = require('./calendar/calendar-style-context.cjs');
32
- var utils = require('./calendar/utils.cjs');
32
+ var utils$1 = require('./calendar/utils.cjs');
33
33
  var date = require('@internationalized/date');
34
34
  var rangeCalendar = require('./range-calendar/range-calendar.cjs');
35
35
  var menu = require('./menu/menu.cjs');
@@ -43,11 +43,11 @@ var checkboxGroupStyleContext = require('./checkbox/checkbox-group-style-context
43
43
  var pagination = require('./pagination/pagination.cjs');
44
44
  var paginationCursor = require('./pagination/pagination-cursor.cjs');
45
45
  var paginationItem = require('./pagination/pagination-item.cjs');
46
- var usePagination = require('./pagination/hooks/use-pagination.cjs');
47
- var usePagination$1 = require('./pagination/use-pagination.cjs');
46
+ var usePagination$1 = require('./pagination/hooks/use-pagination.cjs');
47
+ var usePagination = 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');
50
- var utils$1 = require('./file-dropzone/utils.cjs');
50
+ var utils = require('./file-dropzone/utils.cjs');
51
51
  var numberField = require('./number-field/number-field.cjs');
52
52
  var modal = require('./modal/modal.cjs');
53
53
  var modalContent = require('./modal/modal-content.cjs');
@@ -61,7 +61,7 @@ var navbarBrand = require('./navbar/navbar-brand.cjs');
61
61
  var navbarContent = require('./navbar/navbar-content.cjs');
62
62
  var menu$1 = require('./navbar/navbar-menu/menu.cjs');
63
63
  var item = require('./navbar/navbar-menu/item.cjs');
64
- var toggle$1 = require('./navbar/navbar-menu/toggle.cjs');
64
+ var toggle = require('./navbar/navbar-menu/toggle.cjs');
65
65
  var navbarItem = require('./navbar/navbar-item.cjs');
66
66
  var useNavbar = require('./navbar/use-navbar.cjs');
67
67
  var navbarContext = require('./navbar/navbar-context.cjs');
@@ -79,11 +79,13 @@ var sidebarHeader = require('./sidebar/sidebar-header.cjs');
79
79
  var tooltip = require('./tooltip/tooltip.cjs');
80
80
  var phoneNumberField = require('./phone-number-field/phone-number-field.cjs');
81
81
  var BasePhoneInput = require('react-phone-number-input');
82
- var sonner = require('sonner');
82
+ var infobox = require('./infobox/infobox.cjs');
83
+ var radio = require('./radio-group/radio.cjs');
83
84
  var avatarContext = require('./avatar/avatar-context.cjs');
85
+ var avatar = require('./avatar/avatar.cjs');
84
86
  var avatarGroup = require('./avatar/avatar-group.cjs');
85
87
  var avatarGroupContext = require('./avatar/avatar-group-context.cjs');
86
- var avatar = require('./avatar/avatar.cjs');
88
+ var sonner = require('sonner');
87
89
 
88
90
 
89
91
 
@@ -95,7 +97,7 @@ exports.Ripple = ripple.Ripple;
95
97
  exports.useRipple = useRipple.useRipple;
96
98
  exports.Spinner = spinner.Spinner;
97
99
  exports.useSpinner = useSpinner.useSpinner;
98
- exports.Toggle = toggle.Toggle;
100
+ exports.Toggle = toggle$1.Toggle;
99
101
  exports.SkipNavLink = skipNavLink.SkipNavLink;
100
102
  exports.Input = input.Input;
101
103
  exports.TextField = textField.TextField;
@@ -124,10 +126,10 @@ exports.Calendar = calendar.Calendar;
124
126
  exports.CalendarStateWrapper = calendar.CalendarStateWrapper;
125
127
  exports.CalendarStyleContext = calendarStyleContext.CalendarStyleContext;
126
128
  exports.useCalendarStyleContext = calendarStyleContext.useCalendarStyleContext;
127
- exports.getEraFormat = utils.getEraFormat;
128
- exports.useGenerateLocalizedMonths = utils.useGenerateLocalizedMonths;
129
- exports.useGenerateLocalizedYears = utils.useGenerateLocalizedYears;
130
- exports.useLocalizedMonthYear = utils.useLocalizedMonthYear;
129
+ exports.getEraFormat = utils$1.getEraFormat;
130
+ exports.useGenerateLocalizedMonths = utils$1.useGenerateLocalizedMonths;
131
+ exports.useGenerateLocalizedYears = utils$1.useGenerateLocalizedYears;
132
+ exports.useLocalizedMonthYear = utils$1.useLocalizedMonthYear;
131
133
  Object.defineProperty(exports, "CalendarDate", {
132
134
  enumerable: true,
133
135
  get: function () { return date.CalendarDate; }
@@ -162,13 +164,13 @@ exports.useCheckboxGroupStyleContext = checkboxGroupStyleContext.useCheckboxGrou
162
164
  exports.Pagination = pagination.Pagination;
163
165
  exports.PaginationCursor = paginationCursor.PaginationCursor;
164
166
  exports.PaginationItem = paginationItem.PaginationItem;
165
- exports.PaginationItemType = usePagination.PaginationItemType;
166
- exports.CURSOR_TRANSITION_TIMEOUT = usePagination$1.CURSOR_TRANSITION_TIMEOUT;
167
- exports.usePagination = usePagination$1.usePagination;
167
+ exports.PaginationItemType = usePagination$1.PaginationItemType;
168
+ exports.CURSOR_TRANSITION_TIMEOUT = usePagination.CURSOR_TRANSITION_TIMEOUT;
169
+ exports.usePagination = usePagination.usePagination;
168
170
  exports.FileDropzone = fileDropzone.FileDropzone;
169
171
  exports.FileInfo = fileInfo.FileInfo;
170
- exports.formatBytes = utils$1.formatBytes;
171
- exports.formatErrorMessage = utils$1.formatErrorMessage;
172
+ exports.formatBytes = utils.formatBytes;
173
+ exports.formatErrorMessage = utils.formatErrorMessage;
172
174
  exports.NumberField = numberField.NumberField;
173
175
  exports.Modal = modal.Modal;
174
176
  exports.ModalContent = modalContent.ModalContent;
@@ -183,7 +185,7 @@ exports.NavbarBrand = navbarBrand.NavbarBrand;
183
185
  exports.NavbarContent = navbarContent.NavbarContent;
184
186
  exports.NavbarMenu = menu$1.NavbarMenu;
185
187
  exports.NavbarMenuItem = item.NavbarMenuItem;
186
- exports.NavbarMenuToggle = toggle$1.NavbarMenuToggle;
188
+ exports.NavbarMenuToggle = toggle.NavbarMenuToggle;
187
189
  exports.NavbarItem = navbarItem.NavbarItem;
188
190
  exports.useNavbar = useNavbar.useNavbar;
189
191
  exports.NavbarProvider = navbarContext.NavbarProvider;
@@ -232,15 +234,18 @@ Object.defineProperty(exports, "parsePhoneNumber", {
232
234
  enumerable: true,
233
235
  get: function () { return BasePhoneInput.parsePhoneNumber; }
234
236
  });
235
- Object.defineProperty(exports, "toast", {
236
- enumerable: true,
237
- get: function () { return sonner.toast; }
238
- });
237
+ exports.Infobox = infobox.Infobox;
238
+ exports.Radio = radio.Radio;
239
+ exports.RadioGroup = radio.RadioGroup;
239
240
  exports.AvatarContext = avatarContext.AvatarContext;
240
241
  exports.useAvatarContext = avatarContext.useAvatarContext;
241
- exports.AvatarGroup = avatarGroup.AvatarGroup;
242
- exports.AvatarGroupProvider = avatarGroupContext.AvatarGroupProvider;
243
- exports.useAvatarGroup = avatarGroupContext.useAvatarGroup;
244
242
  exports.AvatarFallback = avatar.AvatarFallback;
245
243
  exports.AvatarImage = avatar.AvatarImage;
246
244
  exports.AvatarRoot = avatar.AvatarRoot;
245
+ exports.AvatarGroup = avatarGroup.AvatarGroup;
246
+ exports.AvatarGroupProvider = avatarGroupContext.AvatarGroupProvider;
247
+ exports.useAvatarGroup = avatarGroupContext.useAvatarGroup;
248
+ Object.defineProperty(exports, "toast", {
249
+ enumerable: true,
250
+ get: function () { return sonner.toast; }
251
+ });
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var infobox = require('./infobox.cjs');
5
+
6
+
7
+
8
+ exports.Infobox = infobox.Infobox;
@@ -0,0 +1,39 @@
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 useInfobox = require('./use-infobox.cjs');
8
+ var info = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/info.cjs');
9
+ var circleCheck = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-check.cjs');
10
+ var circleAlert = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs');
11
+
12
+ const Infobox = (props) => {
13
+ const { Component, children, slots, classNames, icon, variant } = useInfobox.useInfobox(props);
14
+ const displayedIcon = $670gB$react.useMemo(() => {
15
+ if (icon) {
16
+ return icon;
17
+ }
18
+ if (icon === null) {
19
+ return null;
20
+ }
21
+ const iconClassName = slots.icon({ className: classNames?.icon });
22
+ switch (variant) {
23
+ case "error":
24
+ return /* @__PURE__ */ jsxRuntime.jsx(circleAlert.default, { className: iconClassName });
25
+ case "success":
26
+ return /* @__PURE__ */ jsxRuntime.jsx(circleCheck.default, { className: iconClassName });
27
+ case "warning":
28
+ case "info":
29
+ default:
30
+ return /* @__PURE__ */ jsxRuntime.jsx(info.default, { className: iconClassName });
31
+ }
32
+ }, [icon, variant, slots, classNames?.icon]);
33
+ return /* @__PURE__ */ jsxRuntime.jsxs(Component, { className: slots.base({ className: classNames?.base }), children: [
34
+ displayedIcon,
35
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: slots.wrapper({ className: classNames?.wrapper }), children })
36
+ ] });
37
+ };
38
+
39
+ exports.Infobox = Infobox;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var $670gB$react = require('react');
5
+ var useDeepCompare = require('use-deep-compare');
6
+ var ouiTheme = require('@opengovsg/oui-theme');
7
+ var utils = require('../system/utils.cjs');
8
+
9
+ function useInfobox(originalProps) {
10
+ const [_props, variantProps] = utils.mapPropsVariants(
11
+ originalProps,
12
+ ouiTheme.infoboxStyles.variantKeys
13
+ );
14
+ const { children, as, classNames, icon } = _props;
15
+ const Component = $670gB$react.useMemo(() => as || "div", [as]);
16
+ const slots = useDeepCompare.useDeepCompareMemo(
17
+ () => ({
18
+ ...ouiTheme.infoboxStyles({ ...variantProps })
19
+ }),
20
+ [variantProps, ouiTheme.infoboxStyles]
21
+ );
22
+ return {
23
+ Component,
24
+ children,
25
+ slots,
26
+ classNames,
27
+ icon,
28
+ variant: variantProps.variant
29
+ };
30
+ }
31
+
32
+ exports.useInfobox = useInfobox;
@@ -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
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
17
+ ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
18
+ ];
19
+ const CircleCheck = createLucideIcon.default("CircleCheck", __iconNode);
20
+
21
+ exports.__iconNode = __iconNode;
22
+ exports.default = CircleCheck;
@@ -4,14 +4,14 @@
4
4
  var pagination = require('./pagination.cjs');
5
5
  var paginationCursor = require('./pagination-cursor.cjs');
6
6
  var paginationItem = require('./pagination-item.cjs');
7
- var usePagination = require('./hooks/use-pagination.cjs');
8
- var usePagination$1 = require('./use-pagination.cjs');
7
+ var usePagination$1 = require('./hooks/use-pagination.cjs');
8
+ var usePagination = require('./use-pagination.cjs');
9
9
 
10
10
 
11
11
 
12
12
  exports.Pagination = pagination.Pagination;
13
13
  exports.PaginationCursor = paginationCursor.PaginationCursor;
14
14
  exports.PaginationItem = paginationItem.PaginationItem;
15
- exports.PaginationItemType = usePagination.PaginationItemType;
16
- exports.CURSOR_TRANSITION_TIMEOUT = usePagination$1.CURSOR_TRANSITION_TIMEOUT;
17
- exports.usePagination = usePagination$1.usePagination;
15
+ exports.PaginationItemType = usePagination$1.PaginationItemType;
16
+ exports.CURSOR_TRANSITION_TIMEOUT = usePagination.CURSOR_TRANSITION_TIMEOUT;
17
+ exports.usePagination = usePagination.usePagination;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var radio = require('./radio.cjs');
5
+
6
+
7
+
8
+ exports.Radio = radio.Radio;
9
+ exports.RadioGroup = radio.RadioGroup;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var context = require('../system/react-utils/context.cjs');
5
+
6
+ const [RadioGroupVariantContext, useRadioGroupVariantContext] = context.createContext({
7
+ name: "RadioGroupVariantContext",
8
+ strict: false,
9
+ defaultValue: {
10
+ size: "md"
11
+ }
12
+ });
13
+
14
+ exports.RadioGroupVariantContext = RadioGroupVariantContext;
15
+ exports.useRadioGroupVariantContext = useRadioGroupVariantContext;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ "use client";
3
+ 'use strict';
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var reactAriaComponents = require('react-aria-components');
7
+ var ouiTheme = require('@opengovsg/oui-theme');
8
+ var field = require('../field/field.cjs');
9
+ var children = require('../system/react-utils/children.cjs');
10
+ var utils = require('../system/utils.cjs');
11
+ var radioGroupVariantContext = require('./radio-group-variant-context.cjs');
12
+
13
+ const Radio = ({
14
+ classNames,
15
+ className,
16
+ children: children$1,
17
+ description,
18
+ ...originalProps
19
+ }) => {
20
+ const [props, variants] = utils.mapPropsVariants(
21
+ originalProps,
22
+ ouiTheme.radioStyles.variantKeys
23
+ );
24
+ const groupContext = radioGroupVariantContext.useRadioGroupVariantContext();
25
+ const styles = ouiTheme.radioStyles({ size: groupContext?.size, ...variants });
26
+ return /* @__PURE__ */ jsxRuntime.jsx(
27
+ reactAriaComponents.Radio,
28
+ {
29
+ ...props,
30
+ isDisabled: variants.isDisabled,
31
+ className: reactAriaComponents.composeRenderProps(
32
+ className ?? classNames?.base,
33
+ (className2, renderProps) => styles.base({ ...renderProps, className: className2 })
34
+ ),
35
+ children: (renderProps) => {
36
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
37
+ /* @__PURE__ */ jsxRuntime.jsx(
38
+ "span",
39
+ {
40
+ className: styles.circle({
41
+ ...renderProps,
42
+ className: classNames?.circle
43
+ }),
44
+ children: /* @__PURE__ */ jsxRuntime.jsx(
45
+ "span",
46
+ {
47
+ className: styles.icon({
48
+ ...renderProps,
49
+ className: classNames?.icon
50
+ })
51
+ }
52
+ )
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles.label({ className: classNames?.label }), children: children.renderChildren(renderProps, children$1) }),
56
+ description && /* @__PURE__ */ jsxRuntime.jsx(
57
+ field.Description,
58
+ {
59
+ size: groupContext?.size,
60
+ className: styles.description({
61
+ className: classNames?.description
62
+ }),
63
+ children: description
64
+ }
65
+ )
66
+ ] });
67
+ }
68
+ }
69
+ );
70
+ };
71
+ const RadioGroup = ({
72
+ label,
73
+ description,
74
+ errorMessage,
75
+ classNames,
76
+ size,
77
+ ...props
78
+ }) => {
79
+ const context = { size };
80
+ return /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Provider, { values: [[radioGroupVariantContext.RadioGroupVariantContext, context]], children: /* @__PURE__ */ jsxRuntime.jsxs(
81
+ reactAriaComponents.RadioGroup,
82
+ {
83
+ ...props,
84
+ className: reactAriaComponents.composeRenderProps(
85
+ props.className ?? classNames?.base,
86
+ (className, renderProps) => ouiTheme.radioGroupStyles({ ...renderProps, size, className })
87
+ ),
88
+ children: [
89
+ label && /* @__PURE__ */ jsxRuntime.jsx(field.Label, { size, className: classNames?.label, children: label }),
90
+ props.children,
91
+ description && /* @__PURE__ */ jsxRuntime.jsx(field.Description, { size, className: classNames?.description, children: description }),
92
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { size, classNames: classNames?.error, children: errorMessage })
93
+ ]
94
+ }
95
+ ) });
96
+ };
97
+
98
+ exports.Radio = Radio;
99
+ exports.RadioGroup = RadioGroup;
@@ -22,6 +22,7 @@ function SearchField(originalProps) {
22
22
  searchIcon,
23
23
  inputProps,
24
24
  classNames,
25
+ clearIcon,
25
26
  ...props
26
27
  },
27
28
  variantProps
@@ -68,7 +69,7 @@ function SearchField(originalProps) {
68
69
  ...inputProps
69
70
  }
70
71
  ),
71
- /* @__PURE__ */ jsxRuntime.jsx(
72
+ clearIcon !== null && /* @__PURE__ */ jsxRuntime.jsx(
72
73
  button.Button,
73
74
  {
74
75
  isIconOnly: true,
@@ -76,8 +77,10 @@ function SearchField(originalProps) {
76
77
  variant: "clear",
77
78
  color: "sub",
78
79
  size: variantProps.size,
79
- className: styles.clearButton({ className: classNames?.clearButton }),
80
- children: /* @__PURE__ */ jsxRuntime.jsx(x.default, { "aria-hidden": true })
80
+ className: styles.clearButton({
81
+ className: classNames?.clearButton
82
+ }),
83
+ children: clearIcon ?? /* @__PURE__ */ jsxRuntime.jsx(x.default, { "aria-hidden": true })
81
84
  }
82
85
  )
83
86
  ] }),
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { useContext } from 'react';
5
- import { Disclosure, composeRenderProps, DisclosureGroup, DisclosureStateContext, Heading, Button, DisclosurePanel } from 'react-aria-components';
5
+ import { Disclosure, composeRenderProps, DisclosureGroup, DisclosurePanel, DisclosureStateContext, Heading, Button } from 'react-aria-components';
6
6
  import { cn, accordionStyles, composeTailwindRenderProps } from '@opengovsg/oui-theme';
7
7
  import { renderChildren } from '../system/react-utils/children.js';
8
8
  import { forwardRef, mapPropsVariants } from '../system/utils.js';
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- import { useMemo, useCallback, cloneElement, isValidElement } from 'react';
2
+ import { useMemo, useCallback, isValidElement, cloneElement } from 'react';
3
3
  import { mergeProps } from '@react-aria/utils';
4
4
  import { useLocalizedStringFormatter, useFocusRing, usePress } from 'react-aria';
5
5
  import { useDeepCompareMemo } from 'use-deep-compare';
@@ -3,12 +3,12 @@
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { useMemo } from 'react';
5
5
  import { useLocalizedStringFormatter } from 'react-aria';
6
- import { Provider, Breadcrumbs as Breadcrumbs$1, Breadcrumb as Breadcrumb$1, MenuTrigger } from 'react-aria-components';
6
+ import { Breadcrumb as Breadcrumb$1, Provider, Breadcrumbs as Breadcrumbs$1, MenuTrigger } from 'react-aria-components';
7
7
  import { breadcrumbsStyles, composeRenderProps } from '@opengovsg/oui-theme';
8
8
  import { Link } from '../link/link.js';
9
9
  import { Menu, MenuItem } from '../menu/menu.js';
10
10
  import { getValidChildren } from '../system/react-utils/children.js';
11
- import { BreadcrumbsStyleContext, useBreadcrumbsStyleContext } from './context.js';
11
+ import { useBreadcrumbsStyleContext, BreadcrumbsStyleContext } from './context.js';
12
12
  import { i18nStrings } from './i18n.js';
13
13
  import ChevronRight from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-right.js';
14
14
 
@@ -3,7 +3,7 @@
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { useMemo, useContext } from 'react';
5
5
  import { CalendarDate, today, getLocalTimeZone } from '@internationalized/date';
6
- import { Calendar as Calendar$1, composeRenderProps, Provider, CalendarGrid, CalendarGridBody, CalendarCell, Text, CalendarStateContext } from 'react-aria-components';
6
+ import { Calendar as Calendar$1, Provider, CalendarGrid, CalendarGridBody, CalendarCell, composeRenderProps, Text, CalendarStateContext } from 'react-aria-components';
7
7
  import { useDeepCompareMemo } from 'use-deep-compare';
8
8
  import { calendarStyles, dataAttr, cn } from '@opengovsg/oui-theme';
9
9
  import { forwardRefGeneric, mapPropsVariants } from '../system/utils.js';
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { useMemo } from 'react';
5
- import { useContextProps, ListBoxItem, composeRenderProps, Text } from 'react-aria-components';
5
+ import { useContextProps, ListBoxItem, Text, composeRenderProps } from 'react-aria-components';
6
6
  import { listBoxItemStyles } from '@opengovsg/oui-theme';
7
7
  import { forwardRef, mapPropsVariants } from '../system/utils.js';
8
8
  import { ComboBoxVariantContext } from './combo-box-variant-context.js';
@@ -4,7 +4,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { useMemo, useCallback } from 'react';
5
5
  import { useLocalizedStringFormatter } from 'react-aria';
6
6
  import { ListLayout, Provider, ComboBox as ComboBox$1, Input, Button, Virtualizer, ListBox } from 'react-aria-components';
7
- import { listBoxItemStyles, cn, comboBoxStyles, composeTailwindRenderProps, composeRenderProps, comboBoxClearButtonStyles } from '@opengovsg/oui-theme';
7
+ import { comboBoxStyles, composeRenderProps, comboBoxClearButtonStyles, composeTailwindRenderProps, listBoxItemStyles, cn } from '@opengovsg/oui-theme';
8
8
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
9
9
  import { Popover } from '../popover/popover.js';
10
10
  import { mapPropsVariants } from '../system/utils.js';
package/dist/esm/index.js CHANGED
@@ -77,8 +77,10 @@ export { SidebarHeader } from './sidebar/sidebar-header.js';
77
77
  export { Tooltip, TooltipTrigger } from './tooltip/tooltip.js';
78
78
  export { CountrySelect, FlagComponent, PhoneInput, PhoneNumberField } from './phone-number-field/phone-number-field.js';
79
79
  export { formatPhoneNumber, formatPhoneNumberIntl, isPossiblePhoneNumber, isValidPhoneNumber, parsePhoneNumber } from 'react-phone-number-input';
80
- export { toast } from 'sonner';
80
+ export { Infobox } from './infobox/infobox.js';
81
+ export { Radio, RadioGroup } from './radio-group/radio.js';
81
82
  export { AvatarContext, useAvatarContext } from './avatar/avatar-context.js';
83
+ export { AvatarFallback, AvatarImage, AvatarRoot } from './avatar/avatar.js';
82
84
  export { AvatarGroup } from './avatar/avatar-group.js';
83
85
  export { AvatarGroupProvider, useAvatarGroup } from './avatar/avatar-group-context.js';
84
- export { AvatarFallback, AvatarImage, AvatarRoot } from './avatar/avatar.js';
86
+ export { toast } from 'sonner';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ export { Infobox } from './infobox.js';
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ "use client";
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+ import { useMemo } from 'react';
5
+ import { useInfobox } from './use-infobox.js';
6
+ import Info from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/info.js';
7
+ import CircleCheck from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/circle-check.js';
8
+ 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';
9
+
10
+ const Infobox = (props) => {
11
+ const { Component, children, slots, classNames, icon, variant } = useInfobox(props);
12
+ const displayedIcon = useMemo(() => {
13
+ if (icon) {
14
+ return icon;
15
+ }
16
+ if (icon === null) {
17
+ return null;
18
+ }
19
+ const iconClassName = slots.icon({ className: classNames?.icon });
20
+ switch (variant) {
21
+ case "error":
22
+ return /* @__PURE__ */ jsx(CircleAlert, { className: iconClassName });
23
+ case "success":
24
+ return /* @__PURE__ */ jsx(CircleCheck, { className: iconClassName });
25
+ case "warning":
26
+ case "info":
27
+ default:
28
+ return /* @__PURE__ */ jsx(Info, { className: iconClassName });
29
+ }
30
+ }, [icon, variant, slots, classNames?.icon]);
31
+ return /* @__PURE__ */ jsxs(Component, { className: slots.base({ className: classNames?.base }), children: [
32
+ displayedIcon,
33
+ /* @__PURE__ */ jsx("div", { className: slots.wrapper({ className: classNames?.wrapper }), children })
34
+ ] });
35
+ };
36
+
37
+ export { Infobox };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ import { useMemo } from 'react';
3
+ import { useDeepCompareMemo } from 'use-deep-compare';
4
+ import { infoboxStyles } from '@opengovsg/oui-theme';
5
+ import { mapPropsVariants } from '../system/utils.js';
6
+
7
+ function useInfobox(originalProps) {
8
+ const [_props, variantProps] = mapPropsVariants(
9
+ originalProps,
10
+ infoboxStyles.variantKeys
11
+ );
12
+ const { children, as, classNames, icon } = _props;
13
+ const Component = useMemo(() => as || "div", [as]);
14
+ const slots = useDeepCompareMemo(
15
+ () => ({
16
+ ...infoboxStyles({ ...variantProps })
17
+ }),
18
+ [variantProps, infoboxStyles]
19
+ );
20
+ return {
21
+ Component,
22
+ children,
23
+ slots,
24
+ classNames,
25
+ icon,
26
+ variant: variantProps.variant
27
+ };
28
+ }
29
+
30
+ export { useInfobox };
@@ -0,0 +1,17 @@
1
+ import createLucideIcon from '../createLucideIcon.js';
2
+
3
+ /**
4
+ * @license lucide-react v0.475.0 - ISC
5
+ *
6
+ * This source code is licensed under the ISC license.
7
+ * See the LICENSE file in the root directory of this source tree.
8
+ */
9
+
10
+
11
+ const __iconNode = [
12
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
13
+ ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
14
+ ];
15
+ const CircleCheck = createLucideIcon("CircleCheck", __iconNode);
16
+
17
+ export { __iconNode, CircleCheck as default };
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
  import { NumberField as NumberField$1 } from 'react-aria-components';
5
- import { numberFieldStyles, composeTailwindRenderProps, dataAttr, fieldBorderStyles, cn } from '@opengovsg/oui-theme';
5
+ import { numberFieldStyles, fieldBorderStyles, cn, composeTailwindRenderProps, dataAttr } from '@opengovsg/oui-theme';
6
6
  import { Button } from '../button/button.js';
7
7
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
8
8
  import { Input } from '../input/input.js';
@@ -3,7 +3,7 @@
3
3
  import { useMemo } from 'react';
4
4
  import { useFocusRing } from '@react-aria/focus';
5
5
  import { usePress, useHover } from '@react-aria/interactions';
6
- import { useRouter, mergeProps, chain, shouldClientNavigate } from '@react-aria/utils';
6
+ import { useRouter, chain, shouldClientNavigate, mergeProps } from '@react-aria/utils';
7
7
  import { cn, dataAttr } from '@opengovsg/oui-theme';
8
8
  import { useDomRef } from '../system/react-utils/refs.js';
9
9
  import { filterDOMProps } from '../system/react-utils/filter-dom-props.js';
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  "use client";
3
- import { jsxs, jsx } from 'react/jsx-runtime';
4
- import { useMemo, useState, useRef, useCallback } from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+ import { useMemo, useCallback, useState, useRef } from 'react';
5
5
  import { TextField, Provider } from 'react-aria-components';
6
6
  import BasePhoneInput, { getCountryCallingCode } from 'react-phone-number-input';
7
7
  import flags from 'react-phone-number-input/flags';
8
8
  import NonInternationalBasePhoneInput from 'react-phone-number-input/input';
9
- import { phoneNumberFieldStyles, cn } from '@opengovsg/oui-theme';
9
+ import { cn, phoneNumberFieldStyles } from '@opengovsg/oui-theme';
10
10
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
11
11
  import { useControllableState } from '../hooks/use-controllable-state.js';
12
12
  import { Input } from '../input/input.js';
@@ -15,7 +15,7 @@ import { SelectItem } from '../select/select-item.js';
15
15
  import { useLocalizedStringFormatter } from '../system/l10n.js';
16
16
  import { mapPropsVariants } from '../system/utils.js';
17
17
  import { MOBILE_EXAMPLES } from './constants.js';
18
- import { PhoneInputContext, usePhoneInputContext } from './context.js';
18
+ import { usePhoneInputContext, PhoneInputContext } from './context.js';
19
19
  import { i18nStrings } from './i18n.js';
20
20
 
21
21
  const PhoneInput = ({
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  "use client";
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
- import { useSlottedContext, PopoverContext, Popover as Popover$1, composeRenderProps, OverlayArrow } from 'react-aria-components';
4
+ import { useSlottedContext, PopoverContext, Popover as Popover$1, OverlayArrow, composeRenderProps } from 'react-aria-components';
5
5
  import { popoverArrowStyles, popoverStyles } from '@opengovsg/oui-theme';
6
6
 
7
7
  const Popover = ({
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ export { Radio, RadioGroup } from './radio.js';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ import { createContext } from '../system/react-utils/context.js';
3
+
4
+ const [RadioGroupVariantContext, useRadioGroupVariantContext] = createContext({
5
+ name: "RadioGroupVariantContext",
6
+ strict: false,
7
+ defaultValue: {
8
+ size: "md"
9
+ }
10
+ });
11
+
12
+ export { RadioGroupVariantContext, useRadioGroupVariantContext };
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ "use client";
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { Radio as Radio$1, composeRenderProps, Provider, RadioGroup as RadioGroup$1 } from 'react-aria-components';
5
+ import { radioStyles, radioGroupStyles } from '@opengovsg/oui-theme';
6
+ import { Description, Label, FieldError } from '../field/field.js';
7
+ import { renderChildren } from '../system/react-utils/children.js';
8
+ import { mapPropsVariants } from '../system/utils.js';
9
+ import { useRadioGroupVariantContext, RadioGroupVariantContext } from './radio-group-variant-context.js';
10
+
11
+ const Radio = ({
12
+ classNames,
13
+ className,
14
+ children,
15
+ description,
16
+ ...originalProps
17
+ }) => {
18
+ const [props, variants] = mapPropsVariants(
19
+ originalProps,
20
+ radioStyles.variantKeys
21
+ );
22
+ const groupContext = useRadioGroupVariantContext();
23
+ const styles = radioStyles({ size: groupContext?.size, ...variants });
24
+ return /* @__PURE__ */ jsx(
25
+ Radio$1,
26
+ {
27
+ ...props,
28
+ isDisabled: variants.isDisabled,
29
+ className: composeRenderProps(
30
+ className ?? classNames?.base,
31
+ (className2, renderProps) => styles.base({ ...renderProps, className: className2 })
32
+ ),
33
+ children: (renderProps) => {
34
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
35
+ /* @__PURE__ */ jsx(
36
+ "span",
37
+ {
38
+ className: styles.circle({
39
+ ...renderProps,
40
+ className: classNames?.circle
41
+ }),
42
+ children: /* @__PURE__ */ jsx(
43
+ "span",
44
+ {
45
+ className: styles.icon({
46
+ ...renderProps,
47
+ className: classNames?.icon
48
+ })
49
+ }
50
+ )
51
+ }
52
+ ),
53
+ /* @__PURE__ */ jsx("span", { className: styles.label({ className: classNames?.label }), children: renderChildren(renderProps, children) }),
54
+ description && /* @__PURE__ */ jsx(
55
+ Description,
56
+ {
57
+ size: groupContext?.size,
58
+ className: styles.description({
59
+ className: classNames?.description
60
+ }),
61
+ children: description
62
+ }
63
+ )
64
+ ] });
65
+ }
66
+ }
67
+ );
68
+ };
69
+ const RadioGroup = ({
70
+ label,
71
+ description,
72
+ errorMessage,
73
+ classNames,
74
+ size,
75
+ ...props
76
+ }) => {
77
+ const context = { size };
78
+ return /* @__PURE__ */ jsx(Provider, { values: [[RadioGroupVariantContext, context]], children: /* @__PURE__ */ jsxs(
79
+ RadioGroup$1,
80
+ {
81
+ ...props,
82
+ className: composeRenderProps(
83
+ props.className ?? classNames?.base,
84
+ (className, renderProps) => radioGroupStyles({ ...renderProps, size, className })
85
+ ),
86
+ children: [
87
+ label && /* @__PURE__ */ jsx(Label, { size, className: classNames?.label, children: label }),
88
+ props.children,
89
+ description && /* @__PURE__ */ jsx(Description, { size, className: classNames?.description, children: description }),
90
+ /* @__PURE__ */ jsx(FieldError, { size, classNames: classNames?.error, children: errorMessage })
91
+ ]
92
+ }
93
+ ) });
94
+ };
95
+
96
+ export { Radio, RadioGroup };
@@ -20,6 +20,7 @@ function SearchField(originalProps) {
20
20
  searchIcon,
21
21
  inputProps,
22
22
  classNames,
23
+ clearIcon,
23
24
  ...props
24
25
  },
25
26
  variantProps
@@ -66,7 +67,7 @@ function SearchField(originalProps) {
66
67
  ...inputProps
67
68
  }
68
69
  ),
69
- /* @__PURE__ */ jsx(
70
+ clearIcon !== null && /* @__PURE__ */ jsx(
70
71
  Button,
71
72
  {
72
73
  isIconOnly: true,
@@ -74,8 +75,10 @@ function SearchField(originalProps) {
74
75
  variant: "clear",
75
76
  color: "sub",
76
77
  size: variantProps.size,
77
- className: styles.clearButton({ className: classNames?.clearButton }),
78
- children: /* @__PURE__ */ jsx(X, { "aria-hidden": true })
78
+ className: styles.clearButton({
79
+ className: classNames?.clearButton
80
+ }),
81
+ children: clearIcon ?? /* @__PURE__ */ jsx(X, { "aria-hidden": true })
79
82
  }
80
83
  )
81
84
  ] }),
@@ -2,8 +2,8 @@
2
2
  "use client";
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { forwardRef } from 'react';
5
- import { useContextProps, TabList as TabList$1, composeRenderProps, Tab as Tab$1, TabPanels as TabPanels$1, Provider, Tabs as Tabs$1, TabPanel as TabPanel$1 } from 'react-aria-components';
6
- import { tabListStyles, tabStyles, tabsStyles, tabPanelStyles } from '@opengovsg/oui-theme';
5
+ import { useContextProps, TabList as TabList$1, composeRenderProps, Tab as Tab$1, TabPanels as TabPanels$1, TabPanel as TabPanel$1, Provider, Tabs as Tabs$1 } from 'react-aria-components';
6
+ import { tabListStyles, tabStyles, tabPanelStyles, tabsStyles } from '@opengovsg/oui-theme';
7
7
  import { forwardRefGeneric, mapPropsVariants } from '../system/utils.js';
8
8
  import { createContext } from '../system/react-utils/context.js';
9
9
 
@@ -39,4 +39,6 @@ export * from "./breadcrumbs";
39
39
  export * from "./sidebar";
40
40
  export * from "./tooltip";
41
41
  export * from "./phone-number-field";
42
+ export * from "./infobox";
43
+ export * from "./radio-group";
42
44
  //# sourceMappingURL=index.d.ts.map
@@ -39,4 +39,6 @@ export * from "./breadcrumbs";
39
39
  export * from "./sidebar";
40
40
  export * from "./tooltip";
41
41
  export * from "./phone-number-field";
42
+ export * from "./infobox";
43
+ export * from "./radio-group";
42
44
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,QAAQ,CAAA;AACtB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "./infobox";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infobox/index.tsx"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { UseInfoboxProps } from "./use-infobox";
2
+ export interface InfoboxProps extends UseInfoboxProps {
3
+ }
4
+ export declare const Infobox: (props: InfoboxProps) => import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=infobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infobox.d.ts","sourceRoot":"","sources":["../../../src/infobox/infobox.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAIpD,MAAM,WAAW,YAAa,SAAQ,eAAe;CAAG;AAExD,eAAO,MAAM,OAAO,UAAW,YAAY,4CAsC1C,CAAA"}
@@ -0,0 +1,54 @@
1
+ import type { InfoboxSlots, InfoboxVariantProps, SlotsToClasses } from "@opengovsg/oui-theme";
2
+ import type { HtmlUiProps } from "../system/types";
3
+ export interface UseInfoboxProps extends HtmlUiProps, InfoboxVariantProps {
4
+ /**
5
+ * Icon to show on the left of the infobox.
6
+ * If not specified, a default icon will be used according to the infobox variant.
7
+ * Pass `null` to explicitly hide the icon.
8
+ */
9
+ icon?: React.ReactNode | null;
10
+ /**
11
+ * Classname or List of classes to change the classNames of the element.
12
+ * if `className` is passed, it will be added to the base slot.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * <Infobox classNames={{
17
+ * base: "base-classes",
18
+ * icon: "icon-classes",
19
+ * }} />
20
+ * ```
21
+ */
22
+ classNames?: SlotsToClasses<InfoboxSlots>;
23
+ }
24
+ export declare function useInfobox(originalProps: UseInfoboxProps): {
25
+ Component: import("../system/types").As<any>;
26
+ children: import("react").ReactNode;
27
+ slots: {
28
+ base: ((slotProps?: ({
29
+ size?: "md" | "sm" | undefined;
30
+ variant?: "error" | "warning" | "success" | "info" | undefined;
31
+ } & import("tailwind-variants").ClassProp<import("tailwind-merge").ClassNameValue>) | undefined) => string) & ((slotProps?: ({
32
+ size?: "md" | "sm" | undefined;
33
+ variant?: "error" | "warning" | "success" | "info" | undefined;
34
+ } & import("tailwind-variants").ClassProp<import("tailwind-merge").ClassNameValue>) | undefined) => string);
35
+ icon: ((slotProps?: ({
36
+ size?: "md" | "sm" | undefined;
37
+ variant?: "error" | "warning" | "success" | "info" | undefined;
38
+ } & import("tailwind-variants").ClassProp<import("tailwind-merge").ClassNameValue>) | undefined) => string) & ((slotProps?: ({
39
+ size?: "md" | "sm" | undefined;
40
+ variant?: "error" | "warning" | "success" | "info" | undefined;
41
+ } & import("tailwind-variants").ClassProp<import("tailwind-merge").ClassNameValue>) | undefined) => string);
42
+ wrapper: ((slotProps?: ({
43
+ size?: "md" | "sm" | undefined;
44
+ variant?: "error" | "warning" | "success" | "info" | undefined;
45
+ } & import("tailwind-variants").ClassProp<import("tailwind-merge").ClassNameValue>) | undefined) => string) & ((slotProps?: ({
46
+ size?: "md" | "sm" | undefined;
47
+ variant?: "error" | "warning" | "success" | "info" | undefined;
48
+ } & import("tailwind-variants").ClassProp<import("tailwind-merge").ClassNameValue>) | undefined) => string);
49
+ };
50
+ classNames: SlotsToClasses<"base" | "wrapper" | "icon"> | undefined;
51
+ icon: import("react").ReactNode;
52
+ variant: "error" | "warning" | "success" | "info" | undefined;
53
+ };
54
+ //# sourceMappingURL=use-infobox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-infobox.d.ts","sourceRoot":"","sources":["../../../src/infobox/use-infobox.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGlD,MAAM,WAAW,eAAgB,SAAQ,WAAW,EAAE,mBAAmB;IACvE;;;;OAIG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IAC7B;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC,CAAA;CAC1C;AAED,wBAAgB,UAAU,CAAC,aAAa,EAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBxD"}
@@ -0,0 +1,3 @@
1
+ export { Radio, RadioGroup } from "./radio";
2
+ export type { RadioGroupProps, RadioProps } from "./radio";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/radio-group/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE3C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { RadioGroupVariantProps } from "@opengovsg/oui-theme";
2
+ export interface RadioGroupVariantContextValue extends RadioGroupVariantProps {
3
+ size: RadioGroupVariantProps["size"];
4
+ }
5
+ export declare const RadioGroupVariantContext: import("react").Context<RadioGroupVariantContextValue | undefined>, useRadioGroupVariantContext: () => RadioGroupVariantContextValue | undefined;
6
+ //# sourceMappingURL=radio-group-variant-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-group-variant-context.d.ts","sourceRoot":"","sources":["../../../src/radio-group/radio-group-variant-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAIlE,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAA;CACrC;AAED,eAAO,MAAO,wBAAwB,sEAAE,2BAA2B,iDAO/D,CAAA"}
@@ -0,0 +1,39 @@
1
+ import type { RadioGroupProps as AriaRadioGroupProps, RadioProps as AriaRadioProps, ValidationResult } from "react-aria-components";
2
+ import type { FieldErrorSlots, RadioGroupVariantProps, RadioSlots, SlotsToClasses, VariantProps } from "@opengovsg/oui-theme";
3
+ import { radioStyles } from "@opengovsg/oui-theme";
4
+ export interface RadioProps extends AriaRadioProps, VariantProps<typeof radioStyles> {
5
+ classNames?: SlotsToClasses<RadioSlots>;
6
+ description?: string;
7
+ }
8
+ export declare const Radio: ({ classNames, className, children, description, ...originalProps }: RadioProps) => import("react/jsx-runtime").JSX.Element;
9
+ export interface RadioGroupProps extends Omit<AriaRadioGroupProps, "children">, RadioGroupVariantProps {
10
+ /**
11
+ * Label for the radio group
12
+ */
13
+ label?: string;
14
+ /**
15
+ * Radio components
16
+ */
17
+ children?: React.ReactNode;
18
+ /**
19
+ * Description text for the radio group
20
+ */
21
+ description?: string;
22
+ /**
23
+ * Error message - can be string or function for validation
24
+ */
25
+ errorMessage?: string | ((validation: ValidationResult) => string);
26
+ /**
27
+ * Optional classNames for different parts of the group
28
+ */
29
+ classNames?: SlotsToClasses<"label" | "base" | "description"> & {
30
+ error?: SlotsToClasses<FieldErrorSlots>;
31
+ };
32
+ /**
33
+ * Size of all Radio children
34
+ * Will be propagated via context
35
+ */
36
+ size?: RadioProps["size"];
37
+ }
38
+ export declare const RadioGroup: ({ label, description, errorMessage, classNames, size, ...props }: RadioGroupProps) => import("react/jsx-runtime").JSX.Element;
39
+ //# sourceMappingURL=radio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.d.ts","sourceRoot":"","sources":["../../../src/radio-group/radio.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,IAAI,mBAAmB,EACtC,UAAU,IAAI,cAAc,EAC5B,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAQ9B,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAoB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAUpE,MAAM,WAAW,UACf,SAAQ,cAAc,EACpB,YAAY,CAAC,OAAO,WAAW,CAAC;IAClC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,eAAO,MAAM,KAAK,uEAMf,UAAU,4CAqDZ,CAAA;AAED,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,EAC3C,sBAAsB;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAE1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,gBAAgB,KAAK,MAAM,CAAC,CAAA;IAElE;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,GAAG;QAC9D,KAAK,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;KACxC,CAAA;IAED;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;CAC1B;AAED,eAAO,MAAM,UAAU,qEAOpB,eAAe,4CA+BjB,CAAA"}
@@ -10,6 +10,11 @@ export interface SearchFieldProps extends AriaSearchFieldProps, SearchFieldVaria
10
10
  searchIcon?: React.ReactNode | null;
11
11
  inputProps?: Partial<InputProps>;
12
12
  classNames?: SlotsToClasses<SearchFieldSlots>;
13
+ /**
14
+ * The icon to show in the clear button. Defaults to an `XIcon`. Set to `null` to hide the clear button.
15
+ * @example Can also be used to provide a spinner icon while the search is loading.
16
+ */
17
+ clearIcon?: React.ReactNode;
13
18
  }
14
19
  export declare function SearchField(originalProps: SearchFieldProps): import("react/jsx-runtime").JSX.Element;
15
20
  //# sourceMappingURL=search-field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-field.d.ts","sourceRoot":"","sources":["../../../src/search-field/search-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,IAAI,oBAAoB,EACxC,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAK9B,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAO1C,MAAM,WAAW,gBACf,SAAQ,oBAAoB,EAC1B,uBAAuB;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,YAAY,CAAC,EACT,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,UAAU,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAA;IACvD;yCACqC;IACrC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAA;CAC9C;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,gBAAgB,2CAwE1D"}
1
+ {"version":3,"file":"search-field.d.ts","sourceRoot":"","sources":["../../../src/search-field/search-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,IAAI,oBAAoB,EACxC,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAK9B,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAO1C,MAAM,WAAW,gBACf,SAAQ,oBAAoB,EAC1B,uBAAuB;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,YAAY,CAAC,EACT,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,UAAU,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAA;IACvD;yCACqC;IACrC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAA;IAE7C;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,gBAAgB,2CA6E1D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengovsg/oui",
3
- "version": "0.0.48",
3
+ "version": "0.0.50",
4
4
  "sideEffects": false,
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "type": "module",
@@ -50,9 +50,9 @@
50
50
  "storybook": "10.1.10",
51
51
  "tsx": "^4.21.0",
52
52
  "typescript": "5.7.3",
53
- "@oui/chromatic": "0.0.0",
54
- "@opengovsg/oui-theme": "0.0.48",
53
+ "@opengovsg/oui-theme": "0.0.50",
55
54
  "@oui/eslint-config": "0.0.0",
55
+ "@oui/chromatic": "0.0.0",
56
56
  "@oui/prettier-config": "0.0.0",
57
57
  "@oui/typescript-config": "0.0.0"
58
58
  },
@@ -90,7 +90,7 @@
90
90
  "motion": ">=11.12.0 || >=12.0.0-alpha.1",
91
91
  "react": ">= 18",
92
92
  "react-aria-components": "^1.14.0",
93
- "@opengovsg/oui-theme": "0.0.48"
93
+ "@opengovsg/oui-theme": "0.0.50"
94
94
  },
95
95
  "scripts": {
96
96
  "build": "tsx ../../tooling/build-scripts/main.ts --dts --clean",