@opengovsg/oui 0.0.41 → 0.0.43

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;
@@ -69,6 +69,8 @@ var index = require('./avatar/index.cjs');
69
69
  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
+ var link = require('./link/link.cjs');
73
+ var breadcrumbs = require('./breadcrumbs/breadcrumbs.cjs');
72
74
  var sonner = require('sonner');
73
75
  var avatarContext = require('./avatar/avatar-context.cjs');
74
76
  var avatarGroup = require('./avatar/avatar-group.cjs');
@@ -186,6 +188,9 @@ exports.AccordionStyleContext = accordion.AccordionStyleContext;
186
188
  exports.useAccordionStyleContext = accordion.useAccordionStyleContext;
187
189
  exports.TimeField = timeField.TimeField;
188
190
  exports.SearchField = searchField.SearchField;
191
+ exports.Link = link.Link;
192
+ exports.Breadcrumb = breadcrumbs.Breadcrumb;
193
+ exports.Breadcrumbs = breadcrumbs.Breadcrumbs;
189
194
  Object.defineProperty(exports, "toast", {
190
195
  enumerable: true,
191
196
  get: function () { return sonner.toast; }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var link = require('./link.cjs');
5
+
6
+
7
+
8
+ exports.Link = link.Link;
@@ -0,0 +1,27 @@
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 utils = require('../system/utils.cjs');
9
+
10
+ function Link(originalProps) {
11
+ const [props, variantProps] = utils.mapPropsVariants(
12
+ originalProps,
13
+ ouiTheme.linkStyles.variantKeys
14
+ );
15
+ return /* @__PURE__ */ jsxRuntime.jsx(
16
+ reactAriaComponents.Link,
17
+ {
18
+ ...props,
19
+ className: reactAriaComponents.composeRenderProps(
20
+ props.className,
21
+ (className, renderProps) => ouiTheme.linkStyles({ ...variantProps, className, ...renderProps })
22
+ )
23
+ }
24
+ );
25
+ }
26
+
27
+ exports.Link = Link;
@@ -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
@@ -67,6 +67,8 @@ export { Avatar } from './avatar/index.js';
67
67
  export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionStyleContext, useAccordionStyleContext } from './accordion/accordion.js';
68
68
  export { TimeField } from './time-field/time-field.js';
69
69
  export { SearchField } from './search-field/search-field.js';
70
+ export { Link } from './link/link.js';
71
+ export { Breadcrumb, Breadcrumbs } from './breadcrumbs/breadcrumbs.js';
70
72
  export { toast } from 'sonner';
71
73
  export { AvatarContext, useAvatarContext } from './avatar/avatar-context.js';
72
74
  export { AvatarGroup } from './avatar/avatar-group.js';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ export { Link } from './link.js';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ "use client";
3
+ import { jsx } from 'react/jsx-runtime';
4
+ import { Link as Link$1, composeRenderProps } from 'react-aria-components';
5
+ import { linkStyles } from '@opengovsg/oui-theme';
6
+ import { mapPropsVariants } from '../system/utils.js';
7
+
8
+ function Link(originalProps) {
9
+ const [props, variantProps] = mapPropsVariants(
10
+ originalProps,
11
+ linkStyles.variantKeys
12
+ );
13
+ return /* @__PURE__ */ jsx(
14
+ Link$1,
15
+ {
16
+ ...props,
17
+ className: composeRenderProps(
18
+ props.className,
19
+ (className, renderProps) => linkStyles({ ...variantProps, className, ...renderProps })
20
+ )
21
+ }
22
+ );
23
+ }
24
+
25
+ export { Link };
@@ -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';
@@ -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"}
@@ -34,4 +34,6 @@ export * from "./avatar";
34
34
  export * from "./accordion";
35
35
  export * from "./time-field";
36
36
  export * from "./search-field";
37
+ export * from "./link";
38
+ export * from "./breadcrumbs";
37
39
  //# sourceMappingURL=index.d.ts.map
@@ -34,4 +34,6 @@ export * from "./avatar";
34
34
  export * from "./accordion";
35
35
  export * from "./time-field";
36
36
  export * from "./search-field";
37
+ export * from "./link";
38
+ export * from "./breadcrumbs";
37
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"}
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"}
@@ -0,0 +1,2 @@
1
+ export * from "./link";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/link/index.tsx"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { LinkProps as AriaLinkProps } from "react-aria-components";
2
+ import type { LinkVariantProps } from "@opengovsg/oui-theme";
3
+ interface LinkProps extends AriaLinkProps, LinkVariantProps {
4
+ }
5
+ export declare function Link(originalProps: LinkProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengovsg/oui",
3
- "version": "0.0.41",
3
+ "version": "0.0.43",
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.41",
53
+ "@opengovsg/oui-theme": "0.0.43",
54
54
  "@oui/chromatic": "0.0.0",
55
55
  "@oui/eslint-config": "0.0.0",
56
- "@oui/prettier-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.41"
91
+ "@opengovsg/oui-theme": "0.0.43"
92
92
  },
93
93
  "scripts": {
94
94
  "build": "tsx ../../tooling/build-scripts/main.ts --dts --clean",