@opengovsg/oui 0.0.32 → 0.0.34

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 (42) hide show
  1. package/dist/cjs/accordion/accordion.cjs +189 -0
  2. package/dist/cjs/accordion/index.cjs +13 -0
  3. package/dist/cjs/button/button.cjs +13 -10
  4. package/dist/cjs/calendar/calendar-month-day-selector.cjs +2 -2
  5. package/dist/cjs/combo-box/combo-box.cjs +1 -1
  6. package/dist/cjs/date-picker/date-picker.cjs +1 -1
  7. package/dist/cjs/date-range-picker/date-range-picker.cjs +2 -2
  8. package/dist/cjs/file-dropzone/file-dropzone.cjs +1 -1
  9. package/dist/cjs/index.cjs +67 -60
  10. package/dist/cjs/menu/menu.cjs +1 -1
  11. package/dist/cjs/number-field/number-field.cjs +1 -1
  12. package/dist/cjs/select/select.cjs +1 -1
  13. package/dist/cjs/system/react-utils/children.cjs +7 -0
  14. package/dist/cjs/tag-field/tag-field.cjs +2 -2
  15. package/dist/cjs/toast/toast.cjs +1 -1
  16. package/dist/esm/accordion/accordion.js +182 -0
  17. package/dist/esm/accordion/index.js +2 -0
  18. package/dist/esm/button/button.js +13 -10
  19. package/dist/esm/calendar/calendar-month-day-selector.js +2 -2
  20. package/dist/esm/combo-box/combo-box.js +1 -1
  21. package/dist/esm/date-picker/date-picker.js +1 -1
  22. package/dist/esm/date-range-picker/date-range-picker.js +2 -2
  23. package/dist/esm/file-dropzone/file-dropzone.js +1 -1
  24. package/dist/esm/index.js +21 -20
  25. package/dist/esm/menu/menu.js +1 -1
  26. package/dist/esm/number-field/number-field.js +1 -1
  27. package/dist/esm/select/select.js +1 -1
  28. package/dist/esm/system/react-utils/children.js +7 -1
  29. package/dist/esm/tag-field/tag-field.js +2 -2
  30. package/dist/esm/toast/toast.js +1 -1
  31. package/dist/types/accordion/accordion.d.ts +50 -0
  32. package/dist/types/accordion/accordion.d.ts.map +1 -0
  33. package/dist/types/accordion/index.d.ts +2 -0
  34. package/dist/types/accordion/index.d.ts.map +1 -0
  35. package/dist/types/button/button.d.ts +12 -6
  36. package/dist/types/button/button.d.ts.map +1 -1
  37. package/dist/types/index.d.mts +1 -0
  38. package/dist/types/index.d.ts +1 -0
  39. package/dist/types/index.d.ts.map +1 -1
  40. package/dist/types/system/react-utils/children.d.ts +3 -0
  41. package/dist/types/system/react-utils/children.d.ts.map +1 -1
  42. package/package.json +3 -3
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ "use client";
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { useContext } from 'react';
5
+ import { Disclosure, composeRenderProps, DisclosureGroup, DisclosureStateContext, Heading, Button, DisclosurePanel } from 'react-aria-components';
6
+ import { cn, accordionStyles, composeTailwindRenderProps } from '@opengovsg/oui-theme';
7
+ import { renderChildren } from '../system/react-utils/children.js';
8
+ import { forwardRef, mapPropsVariants } from '../system/utils.js';
9
+ import { createContext } from '../system/react-utils/context.js';
10
+ import ChevronDown from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
11
+
12
+ const [AccordionStyleContext, useAccordionStyleContext] = createContext({
13
+ name: "AccordionStyleContext",
14
+ strict: true
15
+ });
16
+ const AccordionItem = forwardRef(
17
+ ({ classNames, className, children, ...props }, ref) => {
18
+ const { slots } = useContext(AccordionStyleContext);
19
+ return /* @__PURE__ */ jsx(
20
+ Disclosure,
21
+ {
22
+ ...props,
23
+ ref,
24
+ className: composeRenderProps(
25
+ className,
26
+ (className2, renderProps) => slots.item({
27
+ ...renderProps,
28
+ className: cn(classNames?.item, className2)
29
+ })
30
+ ),
31
+ children
32
+ }
33
+ );
34
+ }
35
+ );
36
+ AccordionItem.displayName = "AccordionItem";
37
+ function AccordionHeader({
38
+ children,
39
+ classNames,
40
+ indicator,
41
+ startContent,
42
+ endContent,
43
+ hideIndicator = false
44
+ }) {
45
+ const { slots, classNames: contextClassNames } = useContext(
46
+ AccordionStyleContext
47
+ );
48
+ const { isExpanded } = useContext(DisclosureStateContext);
49
+ return /* @__PURE__ */ jsx(
50
+ Heading,
51
+ {
52
+ className: slots.heading({
53
+ className: cn(contextClassNames?.heading, classNames?.heading)
54
+ }),
55
+ children: /* @__PURE__ */ jsx(
56
+ Button,
57
+ {
58
+ slot: "trigger",
59
+ className: slots.trigger({
60
+ className: cn(contextClassNames?.trigger, classNames?.trigger)
61
+ }),
62
+ children: (buttonRenderProps) => {
63
+ const headerRenderProps = { ...buttonRenderProps, isExpanded };
64
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
65
+ startContent && /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ className: slots.startContentWrapper({
69
+ className: cn(
70
+ contextClassNames?.startContentWrapper,
71
+ classNames?.startContentWrapper
72
+ )
73
+ }),
74
+ children: renderChildren(headerRenderProps, startContent)
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsx(
78
+ "span",
79
+ {
80
+ className: slots.title({
81
+ className: cn(contextClassNames?.title, classNames?.title)
82
+ }),
83
+ children: renderChildren(headerRenderProps, children)
84
+ }
85
+ ),
86
+ !hideIndicator && /* @__PURE__ */ jsx(
87
+ "span",
88
+ {
89
+ "aria-hidden": true,
90
+ className: slots.indicator({
91
+ isExpanded,
92
+ className: cn(
93
+ contextClassNames?.indicator,
94
+ classNames?.indicator
95
+ )
96
+ }),
97
+ children: renderChildren(
98
+ headerRenderProps,
99
+ indicator ?? /* @__PURE__ */ jsx(ChevronDown, {})
100
+ )
101
+ }
102
+ ),
103
+ endContent && /* @__PURE__ */ jsx(
104
+ "div",
105
+ {
106
+ className: slots.endContentWrapper({
107
+ className: cn(
108
+ contextClassNames?.endContentWrapper,
109
+ classNames?.endContentWrapper
110
+ )
111
+ }),
112
+ children: renderChildren(headerRenderProps, endContent)
113
+ }
114
+ )
115
+ ] });
116
+ }
117
+ }
118
+ )
119
+ }
120
+ );
121
+ }
122
+ function AccordionContent({
123
+ children,
124
+ classNames,
125
+ ...props
126
+ }) {
127
+ const { slots, classNames: contextClassNames } = useContext(
128
+ AccordionStyleContext
129
+ );
130
+ return /* @__PURE__ */ jsx(
131
+ DisclosurePanel,
132
+ {
133
+ ...props,
134
+ className: composeTailwindRenderProps(
135
+ props.className,
136
+ slots.panel({
137
+ className: cn(contextClassNames?.panel, classNames?.panel)
138
+ })
139
+ ),
140
+ children: /* @__PURE__ */ jsx(
141
+ "div",
142
+ {
143
+ className: slots.content({
144
+ className: cn(contextClassNames?.content, classNames?.content)
145
+ }),
146
+ children
147
+ }
148
+ )
149
+ }
150
+ );
151
+ }
152
+ const Accordion = forwardRef(
153
+ (originalProps, ref) => {
154
+ const [
155
+ { classNames, className, ...props },
156
+ { size = "md", ...variantProps }
157
+ ] = mapPropsVariants(originalProps, accordionStyles.variantKeys);
158
+ const slots = accordionStyles({ size, ...variantProps });
159
+ return /* @__PURE__ */ jsx(
160
+ AccordionStyleContext.Provider,
161
+ {
162
+ value: {
163
+ slots,
164
+ classNames
165
+ },
166
+ children: /* @__PURE__ */ jsx(
167
+ DisclosureGroup,
168
+ {
169
+ className: slots.base({
170
+ className: cn(classNames?.base, className)
171
+ }),
172
+ ...props,
173
+ ref
174
+ }
175
+ )
176
+ }
177
+ );
178
+ }
179
+ );
180
+ Accordion.displayName = "Accordion";
181
+
182
+ export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionStyleContext, useAccordionStyleContext };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionStyleContext, useAccordionStyleContext } from './accordion.js';
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  "use client";
3
- import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { forwardRef, useMemo } from 'react';
5
5
  import { chain } from '@react-aria/utils';
6
6
  import { Button as Button$1, composeRenderProps } from 'react-aria-components';
7
7
  import { buttonStyles } from '@opengovsg/oui-theme';
8
+ import { Ripple } from '../ripple/ripple.js';
8
9
  import { useRipple } from '../ripple/use-ripple.js';
9
10
  import { Spinner } from '../spinner/spinner.js';
10
- import { Ripple } from '../ripple/ripple.js';
11
+ import { renderChildren } from '../system/react-utils/children.js';
11
12
 
12
13
  const Button = forwardRef(
13
14
  ({
@@ -21,6 +22,7 @@ const Button = forwardRef(
21
22
  size = "md",
22
23
  spinnerPlacement = "start",
23
24
  loadingText,
25
+ pendingElement,
24
26
  onPress,
25
27
  children,
26
28
  disableRipple,
@@ -47,7 +49,7 @@ const Button = forwardRef(
47
49
  const spinnerSize = buttonSpinnerSizeMap[size];
48
50
  return /* @__PURE__ */ jsx(Spinner, { size: spinnerSize });
49
51
  }, [size, spinnerProp]);
50
- return /* @__PURE__ */ jsxs(
52
+ return /* @__PURE__ */ jsx(
51
53
  Button$1,
52
54
  {
53
55
  ...props,
@@ -68,15 +70,16 @@ const Button = forwardRef(
68
70
  isPending,
69
71
  onPress: chain(onPress, onPressRipple),
70
72
  ref,
71
- children: [
72
- startContent,
73
- isPending && spinnerPlacement === "start" ? spinner : null,
74
- isPending ? null : children,
73
+ children: (renderProps) => /* @__PURE__ */ jsxs(Fragment, { children: [
74
+ renderChildren(renderProps, startContent),
75
+ isPending && spinnerPlacement === "start" ? renderChildren(renderProps, spinner) : null,
76
+ isPending ? null : renderChildren(renderProps, children),
75
77
  isPending && loadingText ? loadingText : null,
76
- isPending && spinnerPlacement === "end" ? spinner : null,
77
- endContent,
78
+ isPending && pendingElement ? renderChildren(renderProps, pendingElement) : null,
79
+ isPending && spinnerPlacement === "end" ? renderChildren(renderProps, spinner) : null,
80
+ renderChildren(renderProps, endContent),
78
81
  !disableRipple && /* @__PURE__ */ jsx(Ripple, { onClear: onClearRipple, ripples })
79
- ]
82
+ ] })
80
83
  }
81
84
  );
82
85
  }
@@ -4,11 +4,11 @@ import { jsx } from 'react/jsx-runtime';
4
4
  import { useContext } from 'react';
5
5
  import { CalendarDate } from '@internationalized/date';
6
6
  import { Group } from 'react-aria-components';
7
+ import { Select } from '../select/select.js';
8
+ import { SelectItem } from '../select/select-item.js';
7
9
  import { AgnosticCalendarStateContext } from './agnostic-calendar-state-context.js';
8
10
  import { useCalendarStyleContext } from './calendar-style-context.js';
9
11
  import { useCalendarSelectors } from './hooks/use-calendar-selectors.js';
10
- import { Select } from '../select/select.js';
11
- import { SelectItem } from '../select/select-item.js';
12
12
  import { useCalendarI18n } from './hooks/use-calendar-i18n.js';
13
13
 
14
14
  const CalendarMonthDaySelector = () => {
@@ -5,13 +5,13 @@ import { useMemo, useCallback } from 'react';
5
5
  import { useMessageFormatter } from 'react-aria';
6
6
  import { ListLayout, Provider, ComboBox as ComboBox$1, Input, Button, Virtualizer, ListBox } from 'react-aria-components';
7
7
  import { listBoxItemStyles, cn, comboBoxStyles, composeTailwindRenderProps, composeRenderProps, comboBoxClearButtonStyles } from '@opengovsg/oui-theme';
8
+ import { Popover } from '../popover/popover.js';
8
9
  import { mapPropsVariants } from '../system/utils.js';
9
10
  import { ComboBoxVariantContext } from './combo-box-variant-context.js';
10
11
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
11
12
  import ChevronUp from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-up.js';
12
13
  import ChevronDown from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
13
14
  import X from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.js';
14
- import { Popover } from '../popover/popover.js';
15
15
 
16
16
  const calculateEstimatedRowHeight = (size) => {
17
17
  switch (size) {
@@ -4,13 +4,13 @@ import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { useMemo } from 'react';
5
5
  import { DatePicker as DatePicker$1, Dialog } from 'react-aria-components';
6
6
  import { datePickerStyles, composeTailwindRenderProps } from '@opengovsg/oui-theme';
7
+ import { Popover } from '../popover/popover.js';
7
8
  import { mapPropsVariants } from '../system/utils.js';
8
9
  import { DateInput } from '../date-field/date-field.js';
9
10
  import Calendar from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.js';
10
11
  import { Calendar as Calendar$1 } from '../calendar/calendar.js';
11
12
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
12
13
  import { Button } from '../button/button.js';
13
- import { Popover } from '../popover/popover.js';
14
14
 
15
15
  function DatePicker(originalProps) {
16
16
  const [
@@ -5,13 +5,13 @@ import { useMemo } from 'react';
5
5
  import { CalendarDate } from '@internationalized/date';
6
6
  import { DateRangePicker as DateRangePicker$1, Dialog } from 'react-aria-components';
7
7
  import { dateRangePickerStyles, composeTailwindRenderProps } from '@opengovsg/oui-theme';
8
+ import { Popover } from '../popover/popover.js';
9
+ import { RangeCalendar } from '../range-calendar/range-calendar.js';
8
10
  import { mapPropsVariants } from '../system/utils.js';
9
11
  import Calendar from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/calendar.js';
10
- import { RangeCalendar } from '../range-calendar/range-calendar.js';
11
12
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
12
13
  import { DateInput } from '../date-field/date-field.js';
13
14
  import { Button } from '../button/button.js';
14
- import { Popover } from '../popover/popover.js';
15
15
 
16
16
  function DateRangePicker(originalProps) {
17
17
  const [
@@ -7,11 +7,11 @@ import { useField, useId } from 'react-aria';
7
7
  import { Provider, LabelContext, GroupContext, TextContext, FieldErrorContext, Group } from 'react-aria-components';
8
8
  import { useDropzone } from 'react-dropzone';
9
9
  import { fileDropzoneStyles, dataAttr } from '@opengovsg/oui-theme';
10
+ import { useControllableState } from '../hooks/use-controllable-state.js';
10
11
  import { mapPropsVariants } from '../system/utils.js';
11
12
  import { FileDropzoneStyleContext, FileDropzoneStateContext, useFileDropzoneStateContext, useFileDropzoneStyleContext } from './contexts.js';
12
13
  import { FileInfo } from './file-info.js';
13
14
  import { formatErrorMessage, formatBytes } from './utils.js';
14
- import { useControllableState } from '../hooks/use-controllable-state.js';
15
15
  import Upload from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/upload.js';
16
16
  import { Label, Description, FieldError } from '../field/field.js';
17
17
 
package/dist/esm/index.js CHANGED
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
- export { Avatar } from './avatar/index.js';
3
2
  export { useControllableState } from './hooks/use-controllable-state.js';
4
3
  export { useDraggable } from './hooks/use-draggable.js';
5
- export { Button } from './button/button.js';
6
4
  export { GovtBanner } from './govt-banner/govt-banner.js';
7
5
  export { Ripple } from './ripple/ripple.js';
8
6
  export { useRipple } from './ripple/use-ripple.js';
@@ -12,37 +10,21 @@ export { Toggle } from './toggle/toggle.js';
12
10
  export { SkipNavLink } from './skip-nav-link/skip-nav-link.js';
13
11
  export { Input } from './input/input.js';
14
12
  export { TextField } from './text-field/text-field.js';
15
- export { Description, FieldError, FieldErrorIcon, FieldGroup, Label } from './field/field.js';
16
13
  export { TextArea } from './text-area/text-area.js';
17
14
  export { TextAreaField } from './text-area-field/text-area-field.js';
18
- export { ComboBox, ComboBoxEmptyState } from './combo-box/combo-box.js';
19
- export { ComboBoxFuzzy } from './combo-box/combo-box-fuzzy.js';
20
- export { ComboBoxItem } from './combo-box/combo-box-item.js';
21
- export { ComboBoxVariantContext, useComboBoxVariantContext } from './combo-box/combo-box-variant-context.js';
22
- export { Banner } from './banner/banner.js';
23
15
  export { TagField } from './tag-field/tag-field.js';
24
16
  export { TagFieldItem } from './tag-field/tag-field-item.js';
25
17
  export { Select } from './select/select.js';
26
18
  export { SelectItem } from './select/select-item.js';
27
19
  export { SelectVariantContext, useSelectVariantContext } from './select/select-variant-context.js';
28
- export { Badge } from './badge/badge.js';
29
- export { CalendarDate } from '@internationalized/date';
30
- export { Calendar, CalendarStateWrapper } from './calendar/calendar.js';
31
- export { CalendarStyleContext, useCalendarStyleContext } from './calendar/calendar-style-context.js';
32
- export { getEraFormat, useGenerateLocalizedMonths, useGenerateLocalizedYears, useLocalizedMonthYear } from './calendar/utils.js';
33
20
  export { RangeCalendar, RangeCalendarCell, RangeCalendarStateWrapper } from './range-calendar/range-calendar.js';
34
21
  export { Menu, MenuItem, MenuSection, MenuSeparator, MenuTrigger, MenuVariantContext, SubmenuTrigger, useMenuVariantContext } from './menu/menu.js';
35
22
  export { Popover } from './popover/popover.js';
36
23
  export { Tab, TabList, TabPanel, Tabs, TabsVariantContext, useTabsVariantContext } from './tabs/tabs.js';
37
- export { DateField, DateInput } from './date-field/date-field.js';
38
- export { DatePicker } from './date-picker/date-picker.js';
39
- export { DateRangePicker } from './date-range-picker/date-range-picker.js';
40
- export { Checkbox, CheckboxGroup } from './checkbox/checkbox.js';
41
- export { CheckboxGroupStyleContext, useCheckboxGroupStyleContext } from './checkbox/checkbox-group-style-context.js';
42
- export { PaginationItemType } from './pagination/hooks/use-pagination.js';
43
24
  export { Pagination } from './pagination/pagination.js';
44
25
  export { PaginationCursor } from './pagination/pagination-cursor.js';
45
26
  export { PaginationItem } from './pagination/pagination-item.js';
27
+ export { PaginationItemType } from './pagination/hooks/use-pagination.js';
46
28
  export { CURSOR_TRANSITION_TIMEOUT, usePagination } from './pagination/use-pagination.js';
47
29
  export { FileDropzone } from './file-dropzone/file-dropzone.js';
48
30
  export { FileInfo } from './file-dropzone/file-info.js';
@@ -55,7 +37,6 @@ export { ModalBody } from './modal/modal-body.js';
55
37
  export { ModalHeader } from './modal/modal-header.js';
56
38
  export { ModalVariantContext, useModalVariantContext } from './modal/modal-variant-context.js';
57
39
  export { Toaster } from './toast/toast.js';
58
- export { toast } from 'sonner';
59
40
  export { Navbar } from './navbar/navbar.js';
60
41
  export { NavbarBrand } from './navbar/navbar-brand.js';
61
42
  export { NavbarContent } from './navbar/navbar-content.js';
@@ -65,7 +46,27 @@ export { NavbarMenuToggle } from './navbar/navbar-menu/toggle.js';
65
46
  export { NavbarItem } from './navbar/navbar-item.js';
66
47
  export { useNavbar } from './navbar/use-navbar.js';
67
48
  export { NavbarProvider, useNavbarContext } from './navbar/navbar-context.js';
49
+ export { Avatar } from './avatar/index.js';
50
+ export { Button } from './button/button.js';
51
+ export { Description, FieldError, FieldErrorIcon, FieldGroup, Label } from './field/field.js';
52
+ export { ComboBox, ComboBoxEmptyState } from './combo-box/combo-box.js';
53
+ export { ComboBoxFuzzy } from './combo-box/combo-box-fuzzy.js';
54
+ export { ComboBoxItem } from './combo-box/combo-box-item.js';
55
+ export { ComboBoxVariantContext, useComboBoxVariantContext } from './combo-box/combo-box-variant-context.js';
56
+ export { Banner } from './banner/banner.js';
57
+ export { Badge } from './badge/badge.js';
58
+ export { CalendarDate } from '@internationalized/date';
59
+ export { Calendar, CalendarStateWrapper } from './calendar/calendar.js';
60
+ export { CalendarStyleContext, useCalendarStyleContext } from './calendar/calendar-style-context.js';
61
+ export { getEraFormat, useGenerateLocalizedMonths, useGenerateLocalizedYears, useLocalizedMonthYear } from './calendar/utils.js';
62
+ export { DateField, DateInput } from './date-field/date-field.js';
63
+ export { DatePicker } from './date-picker/date-picker.js';
64
+ export { DateRangePicker } from './date-range-picker/date-range-picker.js';
65
+ export { Checkbox, CheckboxGroup } from './checkbox/checkbox.js';
66
+ export { CheckboxGroupStyleContext, useCheckboxGroupStyleContext } from './checkbox/checkbox-group-style-context.js';
67
+ export { toast } from 'sonner';
68
68
  export { AvatarContext, useAvatarContext } from './avatar/avatar-context.js';
69
69
  export { AvatarGroup } from './avatar/avatar-group.js';
70
70
  export { AvatarGroupProvider, useAvatarGroup } from './avatar/avatar-group-context.js';
71
71
  export { AvatarFallback, AvatarImage, AvatarRoot } from './avatar/avatar.js';
72
+ export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionStyleContext, useAccordionStyleContext } from './accordion/accordion.js';
@@ -4,11 +4,11 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { forwardRef, useMemo, useCallback } from 'react';
5
5
  import { useContextProps, MenuItem as MenuItem$1, composeRenderProps, Provider, Menu as Menu$1, MenuSection as MenuSection$1, Header, Collection, MenuTrigger as MenuTrigger$1, SubmenuTrigger as SubmenuTrigger$1, Separator } from 'react-aria-components';
6
6
  import { listBoxItemStyles, menuItemStyles, menuStyles, menuSectionStyles, menuDividerStyles } from '@opengovsg/oui-theme';
7
+ import { Popover } from '../popover/popover.js';
7
8
  import { forwardRefGeneric, mapPropsVariants } from '../system/utils.js';
8
9
  import { createContext } from '../system/react-utils/context.js';
9
10
  import Check from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/check.js';
10
11
  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';
11
- import { Popover } from '../popover/popover.js';
12
12
 
13
13
  const [MenuVariantContext, useMenuVariantContext] = createContext({
14
14
  name: "MenuVariantContext",
@@ -3,11 +3,11 @@
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
  import { NumberField as NumberField$1 } from 'react-aria-components';
5
5
  import { numberFieldStyles, composeTailwindRenderProps, dataAttr, fieldBorderStyles, cn } from '@opengovsg/oui-theme';
6
+ import { Input } from '../input/input.js';
6
7
  import { mapPropsVariants } from '../system/utils.js';
7
8
  import Minus from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/minus.js';
8
9
  import Plus from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/plus.js';
9
10
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
10
- import { Input } from '../input/input.js';
11
11
  import { Button } from '../button/button.js';
12
12
 
13
13
  function NumberField(originalProps) {
@@ -5,11 +5,11 @@ import { useMemo, isValidElement, cloneElement } from 'react';
5
5
  import { useLocalizedStringFormatter } from 'react-aria';
6
6
  import { useFilter, Virtualizer, ListLayout, ListBox, Provider, Select as Select$1, SelectValue, Autocomplete, SearchField, Input } from 'react-aria-components';
7
7
  import { selectStyles, cn, composeRenderProps } from '@opengovsg/oui-theme';
8
+ import { Popover } from '../popover/popover.js';
8
9
  import { mapPropsVariants } from '../system/utils.js';
9
10
  import { SelectVariantContext } from './select-variant-context.js';
10
11
  import { Label, Description, FieldError } from '../field/field.js';
11
12
  import ChevronDown from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
12
- import { Popover } from '../popover/popover.js';
13
13
  import { Button } from '../button/button.js';
14
14
 
15
15
  const i18nStrings = {
@@ -19,5 +19,11 @@ const pickChildren = (children, targetChild) => {
19
19
  const targetChildren = target.length >= 0 ? target : void 0;
20
20
  return [withoutTargetChildren, targetChildren];
21
21
  };
22
+ const renderChildren = (renderProps, children) => {
23
+ if (typeof children === "function") {
24
+ return children(renderProps);
25
+ }
26
+ return children;
27
+ };
22
28
 
23
- export { getValidChildren, pickChildren };
29
+ export { getValidChildren, pickChildren, renderChildren };
@@ -4,6 +4,8 @@ import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { createElement } from 'react';
5
5
  import { composeRenderProps } from 'react-aria-components';
6
6
  import { tagFieldStyles } from '@opengovsg/oui-theme';
7
+ import { Input } from '../input/input.js';
8
+ import { Popover } from '../popover/popover.js';
7
9
  import { TagFieldItem } from './tag-field-item.js';
8
10
  import { TagFieldList } from './tag-field-list.js';
9
11
  import { TagFieldRoot } from './tag-field-root.js';
@@ -11,8 +13,6 @@ import { TagFieldTagList } from './tag-field-tag-list.js';
11
13
  import { TagFieldTrigger } from './tag-field-trigger.js';
12
14
  import ChevronDown from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
13
15
  import { Label, FieldGroup, Description, FieldError } from '../field/field.js';
14
- import { Input } from '../input/input.js';
15
- import { Popover } from '../popover/popover.js';
16
16
 
17
17
  function TagField({
18
18
  classNames,
@@ -4,9 +4,9 @@ import { jsx } from 'react/jsx-runtime';
4
4
  import { Toaster as Toaster$1 } from 'sonner';
5
5
  export { toast } from 'sonner';
6
6
  import { toastStyles } from '@opengovsg/oui-theme';
7
+ import { Spinner } from '../spinner/spinner.js';
7
8
  import { mapPropsVariants } from '../system/utils.js';
8
9
  import X from '../node_modules/.pnpm/lucide-react@0.475.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/x.js';
9
- import { Spinner } from '../spinner/spinner.js';
10
10
 
11
11
  function Toaster(originalProps) {
12
12
  const [{ toastOptions, closeButton = true, ...props }, variantProps] = mapPropsVariants(originalProps, toastStyles.variantKeys);
@@ -0,0 +1,50 @@
1
+ import type React from "react";
2
+ import type { DisclosurePanelProps as AriaDisclosurePanelProps, DisclosureProps as AriaDisclosureProps, ButtonRenderProps, DisclosureGroupProps, RenderProps } from "react-aria-components";
3
+ import type { AccordionSlots, AccordionVariantProps, SlotsToClasses } from "@opengovsg/oui-theme";
4
+ import { accordionStyles } from "@opengovsg/oui-theme";
5
+ export interface UseProvideAccordionStylesReturn {
6
+ slots: ReturnType<typeof accordionStyles>;
7
+ classNames?: SlotsToClasses<AccordionSlots>;
8
+ }
9
+ export declare const AccordionStyleContext: React.Context<UseProvideAccordionStylesReturn>, useAccordionStyleContext: () => UseProvideAccordionStylesReturn;
10
+ export interface AccordionItemProps extends Omit<AriaDisclosureProps, "isExpanded" | "defaultExpanded" | "onExpandedChange"> {
11
+ children: React.ReactNode;
12
+ classNames?: SlotsToClasses<AccordionSlots>;
13
+ }
14
+ export declare const AccordionItem: import("../system/utils").InternalForwardRefRenderFunction<"div", AccordionItemProps, never>;
15
+ export interface AccordionHeaderRenderProps extends ButtonRenderProps {
16
+ isExpanded: boolean;
17
+ }
18
+ export interface AccordionHeaderProps extends Pick<RenderProps<AccordionHeaderRenderProps>, "children"> {
19
+ classNames?: SlotsToClasses<Extract<AccordionSlots, "heading" | "title" | "trigger" | "indicator" | "startContentWrapper" | "endContentWrapper">>;
20
+ /**
21
+ * The indicator. Defaults to a chevron icon.
22
+ */
23
+ indicator?: RenderProps<AccordionHeaderRenderProps>["children"];
24
+ /**
25
+ * Whether to hide the indicator.
26
+ * @default false
27
+ */
28
+ hideIndicator?: boolean;
29
+ /**
30
+ * The header start content.
31
+ */
32
+ startContent?: RenderProps<AccordionHeaderRenderProps>["children"];
33
+ /**
34
+ * The header end content.
35
+ */
36
+ endContent?: RenderProps<AccordionHeaderRenderProps>["children"];
37
+ }
38
+ export declare function AccordionHeader({ children, classNames, indicator, startContent, endContent, hideIndicator, }: AccordionHeaderProps): import("react/jsx-runtime").JSX.Element;
39
+ export interface AccordionContentProps extends AriaDisclosurePanelProps {
40
+ children: React.ReactNode;
41
+ classNames?: SlotsToClasses<"panel" | "content">;
42
+ }
43
+ export declare function AccordionContent({ children, classNames, ...props }: AccordionContentProps): import("react/jsx-runtime").JSX.Element;
44
+ interface AccordionProps extends DisclosureGroupProps, AccordionVariantProps {
45
+ children: React.ReactNode;
46
+ classNames?: SlotsToClasses<AccordionSlots>;
47
+ }
48
+ export declare const Accordion: import("../system/utils").InternalForwardRefRenderFunction<"div", AccordionProps, never>;
49
+ export {};
50
+ //# sourceMappingURL=accordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/accordion/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EACV,oBAAoB,IAAI,wBAAwB,EAChD,eAAe,IAAI,mBAAmB,EACtC,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,uBAAuB,CAAA;AAa9B,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,cAAc,EACf,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,eAAe,EAGhB,MAAM,sBAAsB,CAAA;AAM7B,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;IACzC,UAAU,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;CAC5C;AAED,eAAO,MAAO,qBAAqB,kDAAE,wBAAwB,uCAIzD,CAAA;AAEJ,MAAM,WAAW,kBACf,SAAQ,IAAI,CACV,mBAAmB,EACnB,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CACtD;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;CAC5C;AAED,eAAO,MAAM,aAAa,8FAkBzB,CAAA;AAGD,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,oBACf,SAAQ,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,EAAE,UAAU,CAAC;IACjE,UAAU,CAAC,EAAE,cAAc,CACzB,OAAO,CACL,cAAc,EACZ,SAAS,GACT,OAAO,GACP,SAAS,GACT,WAAW,GACX,qBAAqB,GACrB,mBAAmB,CACtB,CACF,CAAA;IAED;;OAEG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC,UAAU,CAAC,CAAA;IAE/D;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC,UAAU,CAAC,CAAA;IAClE;;OAEG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,0BAA0B,CAAC,CAAC,UAAU,CAAC,CAAA;CACjE;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,aAAqB,GACtB,EAAE,oBAAoB,2CA6EtB;AAED,MAAM,WAAW,qBAAsB,SAAQ,wBAAwB;IACrE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;CACjD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,UAAU,EACV,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAuBvB;AAED,UAAU,cAAe,SAAQ,oBAAoB,EAAE,qBAAqB;IAC1E,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;CAC5C;AAED,eAAO,MAAM,SAAS,0FA0BrB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "./accordion";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/accordion/index.tsx"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
@@ -1,30 +1,36 @@
1
- import type { ButtonProps as AriaButtonProps } from "react-aria-components";
1
+ import type { ButtonProps as AriaButtonProps, RenderProps } from "react-aria-components";
2
2
  import type { ButtonVariantProps } from "@opengovsg/oui-theme";
3
- export interface ButtonProps extends Omit<AriaButtonProps, "children">, ButtonVariantProps {
3
+ export interface ButtonProps extends AriaButtonProps, ButtonVariantProps {
4
4
  /**
5
5
  * Whether the button should display a ripple effect on press.
6
6
  * @defaultValue false
7
7
  */
8
8
  disableRipple?: boolean;
9
- children: React.ReactNode;
10
9
  /**
11
10
  * The button start content.
12
11
  */
13
- startContent?: React.ReactNode;
12
+ startContent?: RenderProps<ButtonProps>["children"];
14
13
  /**
15
14
  * The button end content.
16
15
  */
17
- endContent?: React.ReactNode;
16
+ endContent?: RenderProps<ButtonProps>["children"];
18
17
  /**
19
18
  * Spinner to display when loading.
20
19
  * @defaultValue \@opengovsg/oui/components/spinner
21
20
  */
22
- spinner?: React.ReactNode;
21
+ spinner?: RenderProps<ButtonProps>["children"];
23
22
  /**
24
23
  * Text to show when the button is loading.
25
24
  * If not provided, the button will only show the loading spinner.
25
+ *
26
+ * @deprecated Use `pendingElement` instead.
26
27
  */
27
28
  loadingText?: string;
29
+ /**
30
+ * Text to show when the button is loading.
31
+ * If not provided, the button will only show the loading spinner.
32
+ */
33
+ pendingElement?: RenderProps<ButtonProps>["children"];
28
34
  /**
29
35
  * The spinner placement.
30
36
  * @defaultValue "start"
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/button/button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAK3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAO9D,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,EACvC,kBAAkB;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB;;OAEG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC9B;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;IAElC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,2GA0ElB,CAAA"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/button/button.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,WAAW,EACZ,MAAM,uBAAuB,CAAA;AAK9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAQ9D,MAAM,WAAW,WAAY,SAAQ,eAAe,EAAE,kBAAkB;IACtE;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAA;IACnD;;OAEG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAA;IACjD;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAA;IAE9C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,cAAc,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAA;IAErD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;IAElC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,2GAwFlB,CAAA"}
@@ -31,4 +31,5 @@ export * from "./modal";
31
31
  export * from "./toast";
32
32
  export * from "./navbar";
33
33
  export * from "./avatar";
34
+ export * from "./accordion";
34
35
  //# sourceMappingURL=index.d.ts.map
@@ -31,4 +31,5 @@ export * from "./modal";
31
31
  export * from "./toast";
32
32
  export * from "./navbar";
33
33
  export * from "./avatar";
34
+ export * from "./accordion";
34
35
  //# 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"}
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"}