@opengovsg/oui 0.0.42 → 0.0.44

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.
@@ -0,0 +1,180 @@
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 reactAria = require('react-aria');
8
+ var reactAriaComponents = require('react-aria-components');
9
+ var ouiTheme = require('@opengovsg/oui-theme');
10
+ var link = require('../link/link.cjs');
11
+ var menu = require('../menu/menu.cjs');
12
+ var children = require('../system/react-utils/children.cjs');
13
+ var context = require('./context.cjs');
14
+ var i18n = require('./i18n.cjs');
15
+ 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');
16
+
17
+ function Breadcrumbs({
18
+ separator = "chevron",
19
+ itemsBeforeTruncate = null,
20
+ itemsAfterTruncate = 2,
21
+ renderTruncate,
22
+ truncateProps,
23
+ ...props
24
+ }) {
25
+ const slots = ouiTheme.breadcrumbsStyles();
26
+ const children$1 = $670gB$react.useMemo(() => {
27
+ if (itemsBeforeTruncate == null) {
28
+ return props.children;
29
+ }
30
+ const validChildren = children.getValidChildren(props.children);
31
+ const totalVisible = itemsBeforeTruncate + itemsAfterTruncate;
32
+ if (validChildren.length <= totalVisible) {
33
+ return props.children;
34
+ }
35
+ const visibleStart = validChildren.slice(0, itemsBeforeTruncate);
36
+ const visibleEnd = itemsAfterTruncate > 0 ? validChildren.slice(-itemsAfterTruncate) : [];
37
+ const hiddenItems = itemsAfterTruncate > 0 ? validChildren.slice(itemsBeforeTruncate, -itemsAfterTruncate) : validChildren.slice(itemsBeforeTruncate);
38
+ const hiddenItemData = hiddenItems.map((child, index) => {
39
+ const childProps = child.props;
40
+ return {
41
+ href: childProps.href,
42
+ children: childProps.children,
43
+ onPress: childProps.onPress,
44
+ id: child.key != null ? String(child.key) : `breadcrumb-hidden-${index}`
45
+ };
46
+ });
47
+ return [
48
+ ...visibleStart,
49
+ /* @__PURE__ */ jsxRuntime.jsx(
50
+ BreadcrumbEllipsis,
51
+ {
52
+ items: hiddenItemData,
53
+ renderTruncate,
54
+ menuProps: truncateProps
55
+ },
56
+ "__breadcrumb-ellipsis"
57
+ ),
58
+ ...visibleEnd
59
+ ];
60
+ }, [
61
+ itemsBeforeTruncate,
62
+ props.children,
63
+ itemsAfterTruncate,
64
+ renderTruncate,
65
+ truncateProps
66
+ ]);
67
+ return /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Provider, { values: [[context.BreadcrumbsStyleContext, { separator, slots }]], children: /* @__PURE__ */ jsxRuntime.jsx(
68
+ reactAriaComponents.Breadcrumbs,
69
+ {
70
+ ...props,
71
+ className: slots.base({
72
+ className: props.className ?? props.classNames?.base
73
+ }),
74
+ children: children$1
75
+ }
76
+ ) });
77
+ }
78
+ function useBreadcrumbSeparator(separatorProp, classNameOverride) {
79
+ const context$1 = context.useBreadcrumbsStyleContext() ?? {};
80
+ const separatorValue = separatorProp === void 0 ? context$1?.separator : separatorProp;
81
+ const slots = context$1?.slots ?? ouiTheme.breadcrumbsStyles();
82
+ return $670gB$react.useMemo(() => {
83
+ if (!separatorValue) return null;
84
+ switch (separatorValue) {
85
+ case "chevron":
86
+ return /* @__PURE__ */ jsxRuntime.jsx(
87
+ chevronRight.default,
88
+ {
89
+ "aria-hidden": true,
90
+ className: slots.separator({ className: classNameOverride })
91
+ }
92
+ );
93
+ default:
94
+ return /* @__PURE__ */ jsxRuntime.jsx(
95
+ "span",
96
+ {
97
+ "aria-hidden": true,
98
+ className: slots.separator({ className: classNameOverride }),
99
+ children: separatorValue
100
+ }
101
+ );
102
+ }
103
+ }, [classNameOverride, separatorValue, slots]);
104
+ }
105
+ function Breadcrumb({
106
+ separator: separatorProp,
107
+ classNames,
108
+ ...props
109
+ }) {
110
+ const context$1 = context.useBreadcrumbsStyleContext() ?? {};
111
+ const slots = context$1?.slots ?? ouiTheme.breadcrumbsStyles();
112
+ const separator = useBreadcrumbSeparator(separatorProp, classNames?.separator);
113
+ return /* @__PURE__ */ jsxRuntime.jsx(
114
+ reactAriaComponents.Breadcrumb,
115
+ {
116
+ ...props,
117
+ className: ouiTheme.composeRenderProps(
118
+ props.className || classNames?.crumb,
119
+ (className, renderProp) => slots.crumb({ className, ...renderProp })
120
+ ),
121
+ children: ({ isCurrent }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
122
+ /* @__PURE__ */ jsxRuntime.jsx(
123
+ link.Link,
124
+ {
125
+ ...props,
126
+ className: ouiTheme.composeRenderProps(
127
+ props.className ?? classNames?.link,
128
+ (className, renderProps) => slots.link({ className, ...renderProps })
129
+ )
130
+ }
131
+ ),
132
+ !isCurrent && separator
133
+ ] })
134
+ }
135
+ );
136
+ }
137
+ function BreadcrumbEllipsis({
138
+ items,
139
+ renderTruncate,
140
+ menuProps
141
+ }) {
142
+ const context$1 = context.useBreadcrumbsStyleContext() ?? {};
143
+ const slots = context$1?.slots ?? ouiTheme.breadcrumbsStyles();
144
+ const separator = useBreadcrumbSeparator(void 0);
145
+ const stringFormatter = reactAria.useLocalizedStringFormatter(i18n.i18nStrings);
146
+ const ellipsisContent = "...";
147
+ if (renderTruncate === null) {
148
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactAriaComponents.Breadcrumb, { className: slots.crumb(), children: [
149
+ /* @__PURE__ */ jsxRuntime.jsx(link.Link, { isDisabled: true, children: ellipsisContent }),
150
+ separator
151
+ ] });
152
+ }
153
+ const menuContent = renderTruncate ? renderTruncate(items) : /* @__PURE__ */ jsxRuntime.jsx(menu.Menu, { placement: "bottom start", ...menuProps, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
154
+ menu.MenuItem,
155
+ {
156
+ id: item.id,
157
+ href: item.href,
158
+ onPress: item.onPress,
159
+ children: item.children
160
+ },
161
+ item.id
162
+ )) });
163
+ return /* @__PURE__ */ jsxRuntime.jsxs(reactAriaComponents.Breadcrumb, { className: slots.crumb(), children: [
164
+ /* @__PURE__ */ jsxRuntime.jsxs(reactAriaComponents.MenuTrigger, { children: [
165
+ /* @__PURE__ */ jsxRuntime.jsx(
166
+ link.Link,
167
+ {
168
+ "aria-label": stringFormatter.format("Show more navigation items"),
169
+ className: slots.ellipsisTrigger(),
170
+ children: ellipsisContent
171
+ }
172
+ ),
173
+ menuContent
174
+ ] }),
175
+ separator
176
+ ] });
177
+ }
178
+
179
+ exports.Breadcrumb = Breadcrumb;
180
+ exports.Breadcrumbs = Breadcrumbs;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var context = require('../system/react-utils/context.cjs');
5
+
6
+ const [BreadcrumbsStyleContext, useBreadcrumbsStyleContext] = context.createContext({
7
+ name: "BreadcrumbsStyleContext",
8
+ strict: false
9
+ });
10
+
11
+ exports.BreadcrumbsStyleContext = BreadcrumbsStyleContext;
12
+ exports.useBreadcrumbsStyleContext = useBreadcrumbsStyleContext;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ const i18nStrings = {
5
+ "en-SG": {
6
+ "Show more navigation items": "Show more navigation items"
7
+ },
8
+ "zh-SG": {
9
+ "Show more navigation items": "\u663E\u793A\u66F4\u591A\u5BFC\u822A\u9879"
10
+ },
11
+ "ms-SG": {
12
+ "Show more navigation items": "Tunjukkan lebih banyak item navigasi"
13
+ },
14
+ "ta-SG": {
15
+ "Show more navigation items": "\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BB5\u0BB4\u0BBF\u0B9A\u0BC6\u0BB2\u0BC1\u0BA4\u0BCD\u0BA4\u0BB2\u0BCD \u0B89\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF\u0B95\u0BB3\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1"
16
+ }
17
+ };
18
+
19
+ exports.i18nStrings = i18nStrings;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var breadcrumbs = require('./breadcrumbs.cjs');
5
+
6
+
7
+
8
+ exports.Breadcrumb = breadcrumbs.Breadcrumb;
9
+ exports.Breadcrumbs = breadcrumbs.Breadcrumbs;
@@ -70,6 +70,7 @@ var accordion = require('./accordion/accordion.cjs');
70
70
  var timeField = require('./time-field/time-field.cjs');
71
71
  var searchField = require('./search-field/search-field.cjs');
72
72
  var link = require('./link/link.cjs');
73
+ var breadcrumbs = require('./breadcrumbs/breadcrumbs.cjs');
73
74
  var sonner = require('sonner');
74
75
  var avatarContext = require('./avatar/avatar-context.cjs');
75
76
  var avatarGroup = require('./avatar/avatar-group.cjs');
@@ -188,6 +189,8 @@ exports.useAccordionStyleContext = accordion.useAccordionStyleContext;
188
189
  exports.TimeField = timeField.TimeField;
189
190
  exports.SearchField = searchField.SearchField;
190
191
  exports.Link = link.Link;
192
+ exports.Breadcrumb = breadcrumbs.Breadcrumb;
193
+ exports.Breadcrumbs = breadcrumbs.Breadcrumbs;
191
194
  Object.defineProperty(exports, "toast", {
192
195
  enumerable: true,
193
196
  get: function () { return sonner.toast; }
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ "use client";
2
3
  'use strict';
3
4
 
4
5
  var jsxRuntime = require('react/jsx-runtime');
@@ -11,7 +11,15 @@ var modalVariantContext = require('./modal-variant-context.cjs');
11
11
 
12
12
  const Modal = $670gB$react.forwardRef(function Modal2(originalProps, ref) {
13
13
  const [
14
- { classNames, isOpen, onOpenChange, isDismissable, defaultOpen, ...props },
14
+ {
15
+ classNames,
16
+ isOpen,
17
+ onOpenChange,
18
+ isDismissable,
19
+ isKeyboardDismissDisabled,
20
+ defaultOpen,
21
+ ...props
22
+ },
15
23
  variantProps
16
24
  ] = utils.mapPropsVariants(originalProps, ouiTheme.modalStyles.variantKeys);
17
25
  const slots = ouiTheme.modalStyles(variantProps);
@@ -39,6 +47,7 @@ const Modal = $670gB$react.forwardRef(function Modal2(originalProps, ref) {
39
47
  isOpen,
40
48
  onOpenChange,
41
49
  isDismissable,
50
+ isKeyboardDismissDisabled,
42
51
  defaultOpen,
43
52
  className: ouiTheme.composeRenderProps(
44
53
  classNames?.overlay,
@@ -50,6 +59,8 @@ const Modal = $670gB$react.forwardRef(function Modal2(originalProps, ref) {
50
59
  ...props,
51
60
  ref,
52
61
  "data-placement": variantProps.placement,
62
+ isDismissable,
63
+ isKeyboardDismissDisabled,
53
64
  className: ouiTheme.composeRenderProps(
54
65
  props.className ?? classNames?.base,
55
66
  (className, renderProps) => slots.base({ className, ...renderProps })
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ "use client";
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { useMemo } from 'react';
5
+ import { useLocalizedStringFormatter } from 'react-aria';
6
+ import { Provider, Breadcrumbs as Breadcrumbs$1, Breadcrumb as Breadcrumb$1, MenuTrigger } from 'react-aria-components';
7
+ import { breadcrumbsStyles, composeRenderProps } from '@opengovsg/oui-theme';
8
+ import { Link } from '../link/link.js';
9
+ import { Menu, MenuItem } from '../menu/menu.js';
10
+ import { getValidChildren } from '../system/react-utils/children.js';
11
+ import { BreadcrumbsStyleContext, useBreadcrumbsStyleContext } from './context.js';
12
+ import { i18nStrings } from './i18n.js';
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
+
15
+ function Breadcrumbs({
16
+ separator = "chevron",
17
+ itemsBeforeTruncate = null,
18
+ itemsAfterTruncate = 2,
19
+ renderTruncate,
20
+ truncateProps,
21
+ ...props
22
+ }) {
23
+ const slots = breadcrumbsStyles();
24
+ const children = useMemo(() => {
25
+ if (itemsBeforeTruncate == null) {
26
+ return props.children;
27
+ }
28
+ const validChildren = getValidChildren(props.children);
29
+ const totalVisible = itemsBeforeTruncate + itemsAfterTruncate;
30
+ if (validChildren.length <= totalVisible) {
31
+ return props.children;
32
+ }
33
+ const visibleStart = validChildren.slice(0, itemsBeforeTruncate);
34
+ const visibleEnd = itemsAfterTruncate > 0 ? validChildren.slice(-itemsAfterTruncate) : [];
35
+ const hiddenItems = itemsAfterTruncate > 0 ? validChildren.slice(itemsBeforeTruncate, -itemsAfterTruncate) : validChildren.slice(itemsBeforeTruncate);
36
+ const hiddenItemData = hiddenItems.map((child, index) => {
37
+ const childProps = child.props;
38
+ return {
39
+ href: childProps.href,
40
+ children: childProps.children,
41
+ onPress: childProps.onPress,
42
+ id: child.key != null ? String(child.key) : `breadcrumb-hidden-${index}`
43
+ };
44
+ });
45
+ return [
46
+ ...visibleStart,
47
+ /* @__PURE__ */ jsx(
48
+ BreadcrumbEllipsis,
49
+ {
50
+ items: hiddenItemData,
51
+ renderTruncate,
52
+ menuProps: truncateProps
53
+ },
54
+ "__breadcrumb-ellipsis"
55
+ ),
56
+ ...visibleEnd
57
+ ];
58
+ }, [
59
+ itemsBeforeTruncate,
60
+ props.children,
61
+ itemsAfterTruncate,
62
+ renderTruncate,
63
+ truncateProps
64
+ ]);
65
+ return /* @__PURE__ */ jsx(Provider, { values: [[BreadcrumbsStyleContext, { separator, slots }]], children: /* @__PURE__ */ jsx(
66
+ Breadcrumbs$1,
67
+ {
68
+ ...props,
69
+ className: slots.base({
70
+ className: props.className ?? props.classNames?.base
71
+ }),
72
+ children
73
+ }
74
+ ) });
75
+ }
76
+ function useBreadcrumbSeparator(separatorProp, classNameOverride) {
77
+ const context = useBreadcrumbsStyleContext() ?? {};
78
+ const separatorValue = separatorProp === void 0 ? context?.separator : separatorProp;
79
+ const slots = context?.slots ?? breadcrumbsStyles();
80
+ return useMemo(() => {
81
+ if (!separatorValue) return null;
82
+ switch (separatorValue) {
83
+ case "chevron":
84
+ return /* @__PURE__ */ jsx(
85
+ ChevronRight,
86
+ {
87
+ "aria-hidden": true,
88
+ className: slots.separator({ className: classNameOverride })
89
+ }
90
+ );
91
+ default:
92
+ return /* @__PURE__ */ jsx(
93
+ "span",
94
+ {
95
+ "aria-hidden": true,
96
+ className: slots.separator({ className: classNameOverride }),
97
+ children: separatorValue
98
+ }
99
+ );
100
+ }
101
+ }, [classNameOverride, separatorValue, slots]);
102
+ }
103
+ function Breadcrumb({
104
+ separator: separatorProp,
105
+ classNames,
106
+ ...props
107
+ }) {
108
+ const context = useBreadcrumbsStyleContext() ?? {};
109
+ const slots = context?.slots ?? breadcrumbsStyles();
110
+ const separator = useBreadcrumbSeparator(separatorProp, classNames?.separator);
111
+ return /* @__PURE__ */ jsx(
112
+ Breadcrumb$1,
113
+ {
114
+ ...props,
115
+ className: composeRenderProps(
116
+ props.className || classNames?.crumb,
117
+ (className, renderProp) => slots.crumb({ className, ...renderProp })
118
+ ),
119
+ children: ({ isCurrent }) => /* @__PURE__ */ jsxs(Fragment, { children: [
120
+ /* @__PURE__ */ jsx(
121
+ Link,
122
+ {
123
+ ...props,
124
+ className: composeRenderProps(
125
+ props.className ?? classNames?.link,
126
+ (className, renderProps) => slots.link({ className, ...renderProps })
127
+ )
128
+ }
129
+ ),
130
+ !isCurrent && separator
131
+ ] })
132
+ }
133
+ );
134
+ }
135
+ function BreadcrumbEllipsis({
136
+ items,
137
+ renderTruncate,
138
+ menuProps
139
+ }) {
140
+ const context = useBreadcrumbsStyleContext() ?? {};
141
+ const slots = context?.slots ?? breadcrumbsStyles();
142
+ const separator = useBreadcrumbSeparator(void 0);
143
+ const stringFormatter = useLocalizedStringFormatter(i18nStrings);
144
+ const ellipsisContent = "...";
145
+ if (renderTruncate === null) {
146
+ return /* @__PURE__ */ jsxs(Breadcrumb$1, { className: slots.crumb(), children: [
147
+ /* @__PURE__ */ jsx(Link, { isDisabled: true, children: ellipsisContent }),
148
+ separator
149
+ ] });
150
+ }
151
+ const menuContent = renderTruncate ? renderTruncate(items) : /* @__PURE__ */ jsx(Menu, { placement: "bottom start", ...menuProps, children: items.map((item) => /* @__PURE__ */ jsx(
152
+ MenuItem,
153
+ {
154
+ id: item.id,
155
+ href: item.href,
156
+ onPress: item.onPress,
157
+ children: item.children
158
+ },
159
+ item.id
160
+ )) });
161
+ return /* @__PURE__ */ jsxs(Breadcrumb$1, { className: slots.crumb(), children: [
162
+ /* @__PURE__ */ jsxs(MenuTrigger, { children: [
163
+ /* @__PURE__ */ jsx(
164
+ Link,
165
+ {
166
+ "aria-label": stringFormatter.format("Show more navigation items"),
167
+ className: slots.ellipsisTrigger(),
168
+ children: ellipsisContent
169
+ }
170
+ ),
171
+ menuContent
172
+ ] }),
173
+ separator
174
+ ] });
175
+ }
176
+
177
+ export { Breadcrumb, Breadcrumbs };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ import { createContext } from '../system/react-utils/context.js';
3
+
4
+ const [BreadcrumbsStyleContext, useBreadcrumbsStyleContext] = createContext({
5
+ name: "BreadcrumbsStyleContext",
6
+ strict: false
7
+ });
8
+
9
+ export { BreadcrumbsStyleContext, useBreadcrumbsStyleContext };
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ const i18nStrings = {
3
+ "en-SG": {
4
+ "Show more navigation items": "Show more navigation items"
5
+ },
6
+ "zh-SG": {
7
+ "Show more navigation items": "\u663E\u793A\u66F4\u591A\u5BFC\u822A\u9879"
8
+ },
9
+ "ms-SG": {
10
+ "Show more navigation items": "Tunjukkan lebih banyak item navigasi"
11
+ },
12
+ "ta-SG": {
13
+ "Show more navigation items": "\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BB5\u0BB4\u0BBF\u0B9A\u0BC6\u0BB2\u0BC1\u0BA4\u0BCD\u0BA4\u0BB2\u0BCD \u0B89\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0B9F\u0BBF\u0B95\u0BB3\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1"
14
+ }
15
+ };
16
+
17
+ export { i18nStrings };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ export { Breadcrumb, Breadcrumbs } from './breadcrumbs.js';
package/dist/esm/index.js CHANGED
@@ -68,6 +68,7 @@ export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionS
68
68
  export { TimeField } from './time-field/time-field.js';
69
69
  export { SearchField } from './search-field/search-field.js';
70
70
  export { Link } from './link/link.js';
71
+ export { Breadcrumb, Breadcrumbs } from './breadcrumbs/breadcrumbs.js';
71
72
  export { toast } from 'sonner';
72
73
  export { AvatarContext, useAvatarContext } from './avatar/avatar-context.js';
73
74
  export { AvatarGroup } from './avatar/avatar-group.js';
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ "use client";
2
3
  import { jsx } from 'react/jsx-runtime';
3
4
  import { Link as Link$1, composeRenderProps } from 'react-aria-components';
4
5
  import { linkStyles } from '@opengovsg/oui-theme';
@@ -2,8 +2,8 @@
2
2
  "use client";
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
4
  import { forwardRef, useMemo, useCallback } from 'react';
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
- import { listBoxItemStyles, menuItemStyles, menuStyles, menuSectionStyles, menuDividerStyles } from '@opengovsg/oui-theme';
5
+ import { useContextProps, MenuItem as MenuItem$1, composeRenderProps, MenuTrigger as MenuTrigger$1, SubmenuTrigger as SubmenuTrigger$1, Separator, Provider, Menu as Menu$1, MenuSection as MenuSection$1, Header, Collection } from 'react-aria-components';
6
+ import { listBoxItemStyles, menuItemStyles, menuDividerStyles, menuStyles, menuSectionStyles } from '@opengovsg/oui-theme';
7
7
  import { Popover } from '../popover/popover.js';
8
8
  import { forwardRefGeneric, mapPropsVariants } from '../system/utils.js';
9
9
  import { createContext } from '../system/react-utils/context.js';
@@ -9,7 +9,15 @@ import { ModalVariantContext } from './modal-variant-context.js';
9
9
 
10
10
  const Modal = forwardRef(function Modal2(originalProps, ref) {
11
11
  const [
12
- { classNames, isOpen, onOpenChange, isDismissable, defaultOpen, ...props },
12
+ {
13
+ classNames,
14
+ isOpen,
15
+ onOpenChange,
16
+ isDismissable,
17
+ isKeyboardDismissDisabled,
18
+ defaultOpen,
19
+ ...props
20
+ },
13
21
  variantProps
14
22
  ] = mapPropsVariants(originalProps, modalStyles.variantKeys);
15
23
  const slots = modalStyles(variantProps);
@@ -37,6 +45,7 @@ const Modal = forwardRef(function Modal2(originalProps, ref) {
37
45
  isOpen,
38
46
  onOpenChange,
39
47
  isDismissable,
48
+ isKeyboardDismissDisabled,
40
49
  defaultOpen,
41
50
  className: composeRenderProps(
42
51
  classNames?.overlay,
@@ -48,6 +57,8 @@ const Modal = forwardRef(function Modal2(originalProps, ref) {
48
57
  ...props,
49
58
  ref,
50
59
  "data-placement": variantProps.placement,
60
+ isDismissable,
61
+ isKeyboardDismissDisabled,
51
62
  className: composeRenderProps(
52
63
  props.className ?? classNames?.base,
53
64
  (className, renderProps) => slots.base({ className, ...renderProps })
@@ -0,0 +1,56 @@
1
+ import type { BreadcrumbProps as AriaBreadcrumbProps, BreadcrumbsProps as AriaBreadcrumbsProps, LinkProps } from "react-aria-components";
2
+ import type { BreadcrumbsSlots, SlotsToClasses } from "@opengovsg/oui-theme";
3
+ import type { MenuProps } from "../menu";
4
+ import type { BreadcrumbSeparator } from "./context";
5
+ type BreadcrumbsBaseProps<T extends object> = Omit<AriaBreadcrumbsProps<T>, "items"> & {
6
+ separator?: BreadcrumbSeparator;
7
+ classNames?: SlotsToClasses<BreadcrumbsSlots>;
8
+ };
9
+ export type BreadcrumbsProps<T extends object> = BreadcrumbsBaseProps<T> & ({
10
+ /** Data items for the Collection API. Cannot be used with truncation props. */
11
+ items: Iterable<T>;
12
+ itemsBeforeTruncate?: never;
13
+ itemsAfterTruncate?: never;
14
+ renderTruncate?: never;
15
+ truncateProps?: never;
16
+ } | {
17
+ items?: never;
18
+ /**
19
+ * Number of items to show before the truncation indicator.
20
+ * Setting this to a number enables truncation.
21
+ * Set to `null` to explicitly disable truncation.
22
+ *
23
+ * @example itemsBeforeTruncate={1} with [Home, A, B, C, D, Current]:
24
+ * Renders: Home > ... > Current
25
+ *
26
+ * @default null
27
+ */
28
+ itemsBeforeTruncate?: number | null;
29
+ /**
30
+ * Number of items to show after the truncation indicator.
31
+ * @default 2
32
+ */
33
+ itemsAfterTruncate?: number;
34
+ /**
35
+ * Custom render function for the dropdown content of the truncation ellipsis.
36
+ * The ellipsis breadcrumb item always renders; this controls the dropdown.
37
+ * Defaults to a dropdown menu showing hidden items.
38
+ * Set to `null` to show the ellipsis with no dropdown.
39
+ */
40
+ renderTruncate?: ((items: BreadcrumbEllipsisItem[]) => React.ReactNode) | null;
41
+ truncateProps?: Partial<MenuProps<object>>;
42
+ });
43
+ export declare function Breadcrumbs<T extends object>({ separator, itemsBeforeTruncate, itemsAfterTruncate, renderTruncate, truncateProps, ...props }: BreadcrumbsProps<T>): import("react/jsx-runtime").JSX.Element;
44
+ type BreadcrumbProps = AriaBreadcrumbProps & Omit<LinkProps, "className"> & {
45
+ separator?: BreadcrumbSeparator;
46
+ classNames?: SlotsToClasses<Exclude<BreadcrumbsSlots, "base">>;
47
+ };
48
+ export declare function Breadcrumb({ separator: separatorProp, classNames, ...props }: BreadcrumbProps): import("react/jsx-runtime").JSX.Element;
49
+ export interface BreadcrumbEllipsisItem {
50
+ href?: string;
51
+ children: React.ReactNode;
52
+ id: string;
53
+ onPress?: LinkProps["onPress"];
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=breadcrumbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../../src/breadcrumbs/breadcrumbs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,IAAI,mBAAmB,EACtC,gBAAgB,IAAI,oBAAoB,EACxC,SAAS,EACV,MAAM,uBAAuB,CAAA;AAW9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,WAAW,CAAA;AAOlB,KAAK,oBAAoB,CAAC,CAAC,SAAS,MAAM,IAAI,IAAI,CAChD,oBAAoB,CAAC,CAAC,CAAC,EACvB,OAAO,CACR,GAAG;IACF,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAC/B,UAAU,CAAC,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAA;CAC9C,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,GACtE,CACI;IACE,+EAA+E;IAC/E,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB,mBAAmB,CAAC,EAAE,KAAK,CAAA;IAC3B,kBAAkB,CAAC,EAAE,KAAK,CAAA;IAC1B,cAAc,CAAC,EAAE,KAAK,CAAA;IACtB,aAAa,CAAC,EAAE,KAAK,CAAA;CACtB,GACD;IACE,KAAK,CAAC,EAAE,KAAK,CAAA;IACb;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;OAKG;IACH,cAAc,CAAC,EACX,CAAC,CAAC,KAAK,EAAE,sBAAsB,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,GACtD,IAAI,CAAA;IAER,aAAa,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;CAC3C,CACJ,CAAA;AAEH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,EAC5C,SAAqB,EACrB,mBAA0B,EAC1B,kBAAsB,EACtB,cAAc,EACd,aAAa,EACb,GAAG,KAAK,EACT,EAAE,gBAAgB,CAAC,CAAC,CAAC,2CAoErB;AAoCD,KAAK,eAAe,GAAG,mBAAmB,GACxC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;IAC7B,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAC/B,UAAU,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAA;CAC/D,CAAA;AAEH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EAAE,aAAa,EACxB,UAAU,EACV,GAAG,KAAK,EACT,EAAE,eAAe,2CA8BjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CAC/B"}
@@ -0,0 +1,8 @@
1
+ import type { breadcrumbsStyles } from "@opengovsg/oui-theme";
2
+ export type BreadcrumbSeparator = "chevron" | Exclude<React.ReactNode, string> | (string & {}) | null;
3
+ export interface UseProvideBreadcrumbsStylesReturn {
4
+ slots: ReturnType<typeof breadcrumbsStyles>;
5
+ separator?: BreadcrumbSeparator;
6
+ }
7
+ export declare const BreadcrumbsStyleContext: import("react").Context<UseProvideBreadcrumbsStylesReturn | undefined>, useBreadcrumbsStyleContext: () => UseProvideBreadcrumbsStylesReturn | undefined;
8
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/breadcrumbs/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAI7D,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,GAChC,CAAC,MAAM,GAAG,EAAE,CAAC,GACb,IAAI,CAAA;AAER,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;IAC3C,SAAS,CAAC,EAAE,mBAAmB,CAAA;CAChC;AAED,eAAO,MAAO,uBAAuB,0EAAE,0BAA0B,qDAI7D,CAAA"}
@@ -0,0 +1,15 @@
1
+ export declare const i18nStrings: {
2
+ "en-SG": {
3
+ "Show more navigation items": string;
4
+ };
5
+ "zh-SG": {
6
+ "Show more navigation items": string;
7
+ };
8
+ "ms-SG": {
9
+ "Show more navigation items": string;
10
+ };
11
+ "ta-SG": {
12
+ "Show more navigation items": string;
13
+ };
14
+ };
15
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/breadcrumbs/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW;;;;;;;;;;;;;CAaI,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "./breadcrumbs";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/breadcrumbs/index.tsx"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
@@ -35,4 +35,5 @@ export * from "./accordion";
35
35
  export * from "./time-field";
36
36
  export * from "./search-field";
37
37
  export * from "./link";
38
+ export * from "./breadcrumbs";
38
39
  //# sourceMappingURL=index.d.ts.map
@@ -35,4 +35,5 @@ export * from "./accordion";
35
35
  export * from "./time-field";
36
36
  export * from "./search-field";
37
37
  export * from "./link";
38
+ export * from "./breadcrumbs";
38
39
  //# 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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/link/link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAK5D,UAAU,SAAU,SAAQ,aAAa,EAAE,gBAAgB;CAAG;AAE9D,wBAAgB,IAAI,CAAC,aAAa,EAAE,SAAS,2CAa5C"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/link/link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAK5D,UAAU,SAAU,SAAQ,aAAa,EAAE,gBAAgB;CAAG;AAE9D,wBAAgB,IAAI,CAAC,aAAa,EAAE,SAAS,2CAa5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/modal/modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAQ9D,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAsB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMtE,MAAM,WAAW,UACf,SAAQ,iBAAiB,EACvB,YAAY,CAAC,OAAO,WAAW,CAAC;IAClC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;CACxC;AAED,eAAO,MAAM,KAAK,uGAsDhB,CAAA"}
1
+ {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/modal/modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAQ9D,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAsB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMtE,MAAM,WAAW,UACf,SAAQ,iBAAiB,EACvB,YAAY,CAAC,OAAO,WAAW,CAAC;IAClC,UAAU,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;CACxC;AAED,eAAO,MAAM,KAAK,uGAiEhB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengovsg/oui",
3
- "version": "0.0.42",
3
+ "version": "0.0.44",
4
4
  "sideEffects": false,
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "type": "module",
@@ -50,11 +50,11 @@
50
50
  "storybook": "10.1.10",
51
51
  "tsx": "^4.21.0",
52
52
  "typescript": "5.7.3",
53
- "@opengovsg/oui-theme": "0.0.42",
53
+ "@opengovsg/oui-theme": "0.0.44",
54
54
  "@oui/chromatic": "0.0.0",
55
- "@oui/prettier-config": "0.0.0",
56
55
  "@oui/eslint-config": "0.0.0",
57
- "@oui/typescript-config": "0.0.0"
56
+ "@oui/typescript-config": "0.0.0",
57
+ "@oui/prettier-config": "0.0.0"
58
58
  },
59
59
  "dependencies": {
60
60
  "@internationalized/date": "^3.10.1",
@@ -88,7 +88,7 @@
88
88
  "motion": ">=11.12.0 || >=12.0.0-alpha.1",
89
89
  "react": ">= 18",
90
90
  "react-aria-components": "^1.14.0",
91
- "@opengovsg/oui-theme": "0.0.42"
91
+ "@opengovsg/oui-theme": "0.0.44"
92
92
  },
93
93
  "scripts": {
94
94
  "build": "tsx ../../tooling/build-scripts/main.ts --dts --clean",