@arbor-education/design-system.components 0.25.2 → 0.25.4
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.
- package/.gather/skills/write-stories/README.md +1 -1
- package/.gather/skills/write-stories/SKILL.md +1 -1
- package/.gather/skills/write-stories/meta.md +1 -1
- package/CHANGELOG.md +14 -0
- package/component-library.md +26 -1
- package/dist/components/breadcrumbs/BreadcrumbCopyButton.d.ts +3 -0
- package/dist/components/breadcrumbs/BreadcrumbCopyButton.d.ts.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbCopyButton.js +13 -0
- package/dist/components/breadcrumbs/BreadcrumbCopyButton.js.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbDropdown.d.ts +3 -0
- package/dist/components/breadcrumbs/BreadcrumbDropdown.d.ts.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbDropdown.js +8 -0
- package/dist/components/breadcrumbs/BreadcrumbDropdown.js.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbEllipsis.d.ts +3 -0
- package/dist/components/breadcrumbs/BreadcrumbEllipsis.d.ts.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbEllipsis.js +7 -0
- package/dist/components/breadcrumbs/BreadcrumbEllipsis.js.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbItemSeparator.d.ts +2 -0
- package/dist/components/breadcrumbs/BreadcrumbItemSeparator.d.ts.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbItemSeparator.js +5 -0
- package/dist/components/breadcrumbs/BreadcrumbItemSeparator.js.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbLink.d.ts +6 -0
- package/dist/components/breadcrumbs/BreadcrumbLink.d.ts.map +1 -0
- package/dist/components/breadcrumbs/BreadcrumbLink.js +9 -0
- package/dist/components/breadcrumbs/BreadcrumbLink.js.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.d.ts +21 -0
- package/dist/components/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js +51 -0
- package/dist/components/breadcrumbs/Breadcrumbs.js.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.stories.d.ts +81 -0
- package/dist/components/breadcrumbs/Breadcrumbs.stories.d.ts.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.stories.js +681 -0
- package/dist/components/breadcrumbs/Breadcrumbs.stories.js.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.test.d.ts +2 -0
- package/dist/components/breadcrumbs/Breadcrumbs.test.d.ts.map +1 -0
- package/dist/components/breadcrumbs/Breadcrumbs.test.js +160 -0
- package/dist/components/breadcrumbs/Breadcrumbs.test.js.map +1 -0
- package/dist/components/breadcrumbs/types.d.ts +27 -0
- package/dist/components/breadcrumbs/types.d.ts.map +1 -0
- package/dist/components/breadcrumbs/types.js +2 -0
- package/dist/components/breadcrumbs/types.js.map +1 -0
- package/dist/components/row/Row.d.ts +1 -0
- package/dist/components/row/Row.d.ts.map +1 -1
- package/dist/components/row/Row.js +4 -2
- package/dist/components/row/Row.js.map +1 -1
- package/dist/components/row/Row.stories.d.ts +111 -4
- package/dist/components/row/Row.stories.d.ts.map +1 -1
- package/dist/components/row/Row.stories.js +362 -64
- package/dist/components/row/Row.stories.js.map +1 -1
- package/dist/components/row/Row.test.js +19 -0
- package/dist/components/row/Row.test.js.map +1 -1
- package/dist/components/skeleton/Skeleton.d.ts +10 -0
- package/dist/components/skeleton/Skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/Skeleton.js +9 -0
- package/dist/components/skeleton/Skeleton.js.map +1 -0
- package/dist/components/skeleton/Skeleton.stories.d.ts +99 -0
- package/dist/components/skeleton/Skeleton.stories.d.ts.map +1 -0
- package/dist/components/skeleton/Skeleton.stories.js +539 -0
- package/dist/components/skeleton/Skeleton.stories.js.map +1 -0
- package/dist/components/skeleton/Skeleton.test.d.ts +2 -0
- package/dist/components/skeleton/Skeleton.test.d.ts.map +1 -0
- package/dist/components/skeleton/Skeleton.test.js +49 -0
- package/dist/components/skeleton/Skeleton.test.js.map +1 -0
- package/dist/index.css +159 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/breadcrumbs/BreadcrumbCopyButton.tsx +27 -0
- package/src/components/breadcrumbs/BreadcrumbDropdown.tsx +27 -0
- package/src/components/breadcrumbs/BreadcrumbEllipsis.tsx +16 -0
- package/src/components/breadcrumbs/BreadcrumbItemSeparator.tsx +3 -0
- package/src/components/breadcrumbs/BreadcrumbLink.tsx +29 -0
- package/src/components/breadcrumbs/Breadcrumbs.stories.tsx +870 -0
- package/src/components/breadcrumbs/Breadcrumbs.test.tsx +185 -0
- package/src/components/breadcrumbs/Breadcrumbs.tsx +92 -0
- package/src/components/breadcrumbs/breadcrumbs.scss +158 -0
- package/src/components/breadcrumbs/types.ts +31 -0
- package/src/components/dropdown/dropdown.scss +1 -0
- package/src/components/row/Row.stories.tsx +504 -81
- package/src/components/row/Row.test.tsx +25 -0
- package/src/components/row/Row.tsx +11 -1
- package/src/components/skeleton/Skeleton.stories.tsx +748 -0
- package/src/components/skeleton/Skeleton.test.tsx +55 -0
- package/src/components/skeleton/Skeleton.tsx +36 -0
- package/src/components/skeleton/skeleton.scss +23 -0
- package/src/index.scss +2 -0
- package/src/index.ts +2 -0
|
@@ -118,7 +118,7 @@ Look up designer guidance for this component using the Atlassian MCP tools. Use
|
|
|
118
118
|
|
|
119
119
|
### Step 4 — Read the Component Library Manifest
|
|
120
120
|
|
|
121
|
-
Read
|
|
121
|
+
Read `/component-library.md` for a comprehensive overview of the component's role in the design system, use cases, and known relationships to other components.
|
|
122
122
|
|
|
123
123
|
If it contains guidance about when to use this component vs. alternatives, note it — it goes into the story description.
|
|
124
124
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.25.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#218](https://github.com/arbor-education/design-system.components/pull/218) [`c64c66e`](https://github.com/arbor-education/design-system.components/commit/c64c66e26e6071e53c655b811039c7a2260ed227) Thanks [@Alex-DN-SP](https://github.com/Alex-DN-SP)! - MIS-70982 Added base skeleton component
|
|
8
|
+
|
|
9
|
+
- [#202](https://github.com/arbor-education/design-system.components/pull/202) [`1fef4aa`](https://github.com/arbor-education/design-system.components/commit/1fef4aa06f0ce20ff0a8d0dc0353d2749a68473c) Thanks [@Alex-DN-SP](https://github.com/Alex-DN-SP)! - MIS-64732 Breadcrumbs Component
|
|
10
|
+
|
|
11
|
+
## 0.25.3
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [#219](https://github.com/arbor-education/design-system.components/pull/219) [`263e11a`](https://github.com/arbor-education/design-system.components/commit/263e11af1fb329c81365538f483c90025a538f3a) Thanks [@Alex-DN-SP](https://github.com/Alex-DN-SP)! - MIS-70565 Added support for links in Row component
|
|
16
|
+
|
|
3
17
|
## 0.25.2
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/component-library.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Auto-generated reference for AI agents (Sophia, analyze-design, etc.)
|
|
4
4
|
> Source: `src/components/` · Public API: `src/index.ts`
|
|
5
|
-
> Last updated: 2026-
|
|
5
|
+
> Last updated: 2026-06-24
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -1247,6 +1247,30 @@ Component-scoped tokens follow: `--{component}-{state}-{property}` (e.g. `--butt
|
|
|
1247
1247
|
|
|
1248
1248
|
---
|
|
1249
1249
|
|
|
1250
|
+
### 40a. Skeleton
|
|
1251
|
+
|
|
1252
|
+
**File:** `src/components/skeleton/Skeleton.tsx` · **Public export:** Yes
|
|
1253
|
+
**Also exports:** `SkeletonProps`, `Skeleton.Props` types
|
|
1254
|
+
|
|
1255
|
+
**Use case:** Loading placeholder that wraps real content. When `loading={true}`, renders an animated skeleton block sized to the content (or explicit `width`/`height`). When `loading={false}`, renders `children` unchanged — no DOM wrapper.
|
|
1256
|
+
|
|
1257
|
+
| Prop | Type | Required | Default | Description |
|
|
1258
|
+
|---|---|---|---|---|
|
|
1259
|
+
| `loading` | `boolean` | No | `true` | When `true`, renders the skeleton; when `false`, renders children directly |
|
|
1260
|
+
| `width` | `string \| number` | No | — | Explicit skeleton width (CSS value or px number); use when children are unknown at load time |
|
|
1261
|
+
| `height` | `string \| number` | No | — | Explicit skeleton height |
|
|
1262
|
+
| `children` | `ReactNode` | No | — | Real content shown once `loading={false}`; also sizes the skeleton when `loading={true}` |
|
|
1263
|
+
| `className` | `string` | No | — | Additional CSS class on the skeleton `<span>` |
|
|
1264
|
+
| `style` | `CSSProperties` | No | — | Inline styles (merged with width/height) |
|
|
1265
|
+
| `...rest` | `HTMLAttributes<HTMLSpanElement>` | No | — | Any `<span>` attribute |
|
|
1266
|
+
|
|
1267
|
+
**Key features:**
|
|
1268
|
+
- When `loading={true}`: renders `<span aria-hidden="true" class="ds-skeleton">` wrapping children so the skeleton takes the same dimensions as the real content
|
|
1269
|
+
- When `loading={false}`: returns `<>{children}</>` with no wrapping element
|
|
1270
|
+
- CSS: `ds-skeleton` — animated shimmer via CSS
|
|
1271
|
+
|
|
1272
|
+
---
|
|
1273
|
+
|
|
1250
1274
|
## Utility / Infrastructure (publicly exported)
|
|
1251
1275
|
|
|
1252
1276
|
| Export | File | Description |
|
|
@@ -1316,3 +1340,4 @@ Component-scoped tokens follow: `--{component}-{state}-{property}` (e.g. `--butt
|
|
|
1316
1340
|
| `Toggle` | Yes | on/off switch; controlled or uncontrolled | Radix Switch |
|
|
1317
1341
|
| `Row` | Yes | clickable or static; label/value/note | — |
|
|
1318
1342
|
| `SingleUser` | Yes | avatar + name label; size variants | — |
|
|
1343
|
+
| `Skeleton` | Yes | loading/loaded toggle; wraps children for size inference | — |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbCopyButton.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbCopyButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG5D,eAAO,MAAM,oBAAoB,GAAI,OAAO,yBAAyB,4CAqBpE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '../button/Button.js';
|
|
3
|
+
import { TooltipWrapper } from '../tooltip/TooltipWrapper.js';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
export const BreadcrumbCopyButton = (props) => {
|
|
6
|
+
const { isClicked, onClick, ...rest } = props;
|
|
7
|
+
const iconName = isClicked ? 'check' : 'link';
|
|
8
|
+
const screenReaderText = isClicked ? 'Breadcrumb path copied' : 'Copy breadcrumb path';
|
|
9
|
+
return (_jsx(TooltipWrapper, { tooltipContent: screenReaderText, children: _jsx(Button, { ...rest, onClick: onClick, iconLeftName: iconName, "aria-label": screenReaderText, size: "S", className: classNames('ds-breadcrumbs__copy-icon', {
|
|
10
|
+
'ds-breadcrumbs__copy-icon--clicked': isClicked,
|
|
11
|
+
}) }) }));
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=BreadcrumbCopyButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbCopyButton.js","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbCopyButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAgC,EAAE,EAAE;IACvE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAE9C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9C,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAEvF,OAAO,CACL,KAAC,cAAc,IAAC,cAAc,EAAE,gBAAgB,YAC9C,KAAC,MAAM,OACD,IAAI,EACR,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,QAAQ,gBACV,gBAAgB,EAC5B,IAAI,EAAC,GAAG,EACR,SAAS,EAAE,UAAU,CAAC,2BAA2B,EAAE;gBACjD,oCAAoC,EAAE,SAAS;aAChD,CAAC,GACF,GACa,CAClB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbDropdown.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,eAAO,MAAM,kBAAkB,GAAI,OAAO,uBAAuB,4CAsBhE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Dropdown } from '../dropdown/Dropdown.js';
|
|
3
|
+
import { BreadcrumbLink } from './BreadcrumbLink.js';
|
|
4
|
+
export const BreadcrumbDropdown = (props) => {
|
|
5
|
+
const { item } = props;
|
|
6
|
+
return (_jsxs(Dropdown, { children: [_jsx(Dropdown.Trigger, { children: _jsx(BreadcrumbLink, { item: item, isDropdown: true, isActive: false }) }), _jsx(Dropdown.Content, { children: item.dropdownOptions?.map((option, index) => (_jsx(Dropdown.Item, { asChild: true, children: _jsx("a", { href: option.href, onClick: () => option.onClick?.(), children: option.label }) }, `${option.label}-${index}`))) })] }));
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=BreadcrumbDropdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbDropdown.js","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbDropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAA8B,EAAE,EAAE;IACnE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,OAAO,CACL,MAAC,QAAQ,eACP,KAAC,QAAQ,CAAC,OAAO,cACf,KAAC,cAAc,IACb,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,KAAK,GACf,GACe,EACnB,KAAC,QAAQ,CAAC,OAAO,cACd,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC5C,KAAC,QAAQ,CAAC,IAAI,IAAC,OAAO,kBACpB,YAAG,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,YACpD,MAAM,CAAC,KAAK,GACX,IAHsB,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,EAAE,CAItC,CACjB,CAAC,GACe,IACV,CACZ,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbEllipsis.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbEllipsis.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,eAAO,MAAM,kBAAkB,GAAI,OAAO,uBAAuB,4CAYhE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '../button/Button.js';
|
|
3
|
+
export const BreadcrumbEllipsis = (props) => {
|
|
4
|
+
const { screenReaderText, ...rest } = props;
|
|
5
|
+
return (_jsx(Button, { ...rest, size: "S", iconLeftName: "ellipsis", "aria-label": screenReaderText, className: "ds-breadcrumbs__ellipsis-button" }));
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=BreadcrumbEllipsis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbEllipsis.js","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbEllipsis.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGlD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAA8B,EAAE,EAAE;IACnE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAE5C,OAAO,CACL,KAAC,MAAM,OACD,IAAI,EACR,IAAI,EAAC,GAAG,EACR,YAAY,EAAC,UAAU,gBACX,gBAAgB,EAC5B,SAAS,EAAC,iCAAiC,GAC3C,CACH,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbItemSeparator.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbItemSeparator.tsx"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,+CAEnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbItemSeparator.js","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbItemSeparator.tsx"],"names":[],"mappings":";AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,OAAO,eAAM,SAAS,EAAC,2BAA2B,iBAAa,MAAM,kBAAS,CAAC;AACjF,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const BreadcrumbLink: import("react").ForwardRefExoticComponent<{
|
|
2
|
+
item: import("./types.js").BreadcrumbItem;
|
|
3
|
+
isDropdown?: boolean;
|
|
4
|
+
isActive?: boolean;
|
|
5
|
+
} & import("react").AnchorHTMLAttributes<HTMLAnchorElement> & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
6
|
+
//# sourceMappingURL=BreadcrumbLink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbLink.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbLink.tsx"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc;;;;+GAsBzB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { Icon } from '../icon/Icon.js';
|
|
4
|
+
export const BreadcrumbLink = forwardRef((props, ref) => {
|
|
5
|
+
const { item, isDropdown, isActive, onClick, ...rest } = props;
|
|
6
|
+
return (_jsxs("a", { ...rest, ref: ref, href: isDropdown || isActive ? undefined : item.href, tabIndex: isDropdown ? 0 : undefined, "aria-current": isActive ? 'page' : undefined, role: isDropdown ? 'button' : undefined, className: "ds-breadcrumbs__link", "aria-haspopup": isDropdown ? 'menu' : undefined, onClick: onClick, children: [_jsx("span", { className: "ds-breadcrumbs__label", children: item.label }), isDropdown && _jsx(Icon, { name: "chevron-down", size: 12 })] }));
|
|
7
|
+
});
|
|
8
|
+
BreadcrumbLink.displayName = 'BreadcrumbLink';
|
|
9
|
+
//# sourceMappingURL=BreadcrumbLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BreadcrumbLink.js","sourceRoot":"","sources":["../../../src/components/breadcrumbs/BreadcrumbLink.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAG5C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAGtC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAE/D,OAAO,CACL,gBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EACpD,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,kBACtB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC3C,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACvC,SAAS,EAAC,sBAAsB,mBACjB,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9C,OAAO,EAAE,OAAO,aAEhB,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,CAAC,KAAK,GAAQ,EAC1D,UAAU,IAAI,KAAC,IAAI,IAAC,IAAI,EAAC,cAAc,EAAC,IAAI,EAAE,EAAE,GAAI,IACnD,CACL,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BreadcrumbsProps, BreadcrumbLinkProps, BreadcrumbEllipsisProps, BreadcrumbDropdownProps, BreadcrumbCopyButtonProps, BreadcrumbItem } from './types.js';
|
|
2
|
+
export declare const Breadcrumbs: {
|
|
3
|
+
(props: BreadcrumbsProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
Link: import("react").ForwardRefExoticComponent<{
|
|
5
|
+
item: BreadcrumbItem;
|
|
6
|
+
isDropdown?: boolean;
|
|
7
|
+
isActive?: boolean;
|
|
8
|
+
} & import("react").AnchorHTMLAttributes<HTMLAnchorElement> & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
9
|
+
Ellipsis: (props: BreadcrumbEllipsisProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
ItemSeparator: () => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
Dropdown: (props: BreadcrumbDropdownProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
CopyButton: (props: BreadcrumbCopyButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
};
|
|
14
|
+
export declare namespace Breadcrumbs {
|
|
15
|
+
type Props = BreadcrumbsProps;
|
|
16
|
+
type LinkProps = BreadcrumbLinkProps;
|
|
17
|
+
type EllipsisProps = BreadcrumbEllipsisProps;
|
|
18
|
+
type DropdownProps = BreadcrumbDropdownProps;
|
|
19
|
+
type CopyButtonProps = BreadcrumbCopyButtonProps;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=Breadcrumbs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/Breadcrumbs.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,cAAc,EACf,MAAM,YAAY,CAAC;AAkBpB,eAAO,MAAM,WAAW;YAAW,gBAAgB;;;;;;;;;;CAgDlD,CAAC;AAQF,yBAAiB,WAAW,CAAC;IAC3B,KAAY,KAAK,GAAG,gBAAgB,CAAC;IACrC,KAAY,SAAS,GAAG,mBAAmB,CAAC;IAC5C,KAAY,aAAa,GAAG,uBAAuB,CAAC;IACpD,KAAY,aAAa,GAAG,uBAAuB,CAAC;IACpD,KAAY,eAAe,GAAG,yBAAyB,CAAC;CACzD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BreadcrumbLink } from './BreadcrumbLink.js';
|
|
3
|
+
import { BreadcrumbEllipsis } from './BreadcrumbEllipsis.js';
|
|
4
|
+
import { BreadcrumbItemSeparator } from './BreadcrumbItemSeparator.js';
|
|
5
|
+
import { BreadcrumbDropdown } from './BreadcrumbDropdown.js';
|
|
6
|
+
import classNames from 'classnames';
|
|
7
|
+
import { BreadcrumbCopyButton } from './BreadcrumbCopyButton.js';
|
|
8
|
+
import { useEffect, useRef, useState } from 'react';
|
|
9
|
+
const COPY_FEEDBACK_DURATION_MS = 2000;
|
|
10
|
+
const renderLink = (item, isLast) => {
|
|
11
|
+
const hasDropdownOptions = Boolean(item.dropdownOptions?.length);
|
|
12
|
+
if (item.isEllipsis) {
|
|
13
|
+
return _jsx(BreadcrumbEllipsis, { screenReaderText: item.label, onClick: item.onClick });
|
|
14
|
+
}
|
|
15
|
+
if (hasDropdownOptions) {
|
|
16
|
+
return _jsx(BreadcrumbDropdown, { item: item });
|
|
17
|
+
}
|
|
18
|
+
return _jsx(BreadcrumbLink, { item: item, isActive: isLast });
|
|
19
|
+
};
|
|
20
|
+
export const Breadcrumbs = (props) => {
|
|
21
|
+
const { items, breadcrumbLabel = 'Breadcrumbs', className, copyText, ...rest } = props;
|
|
22
|
+
const [copyButtonClicked, setCopyButtonClicked] = useState(false);
|
|
23
|
+
const copyTimerRef = useRef(undefined);
|
|
24
|
+
useEffect(() => () => clearTimeout(copyTimerRef.current), []);
|
|
25
|
+
const handleCopyButtonClick = () => {
|
|
26
|
+
if (!navigator.clipboard) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
setCopyButtonClicked(true);
|
|
30
|
+
navigator.clipboard
|
|
31
|
+
.writeText(copyText ?? items.filter(item => !item.isEllipsis).map(item => item.label).join(' > '))
|
|
32
|
+
.catch(() => { })
|
|
33
|
+
.finally(() => {
|
|
34
|
+
copyTimerRef.current = setTimeout(() => {
|
|
35
|
+
setCopyButtonClicked(false);
|
|
36
|
+
}, COPY_FEEDBACK_DURATION_MS);
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
return (_jsx("nav", { ...rest, "aria-label": breadcrumbLabel, className: classNames('ds-breadcrumbs__container', className), children: _jsx("ol", { className: "ds-breadcrumbs__list", children: items.map((item, index) => {
|
|
40
|
+
const isLast = index === items.length - 1;
|
|
41
|
+
return (_jsxs("li", { className: "ds-breadcrumbs__item", children: [renderLink(item, isLast), isLast
|
|
42
|
+
? (!item.isEllipsis && _jsx(BreadcrumbCopyButton, { isClicked: copyButtonClicked, onClick: handleCopyButtonClick }))
|
|
43
|
+
: (_jsx(BreadcrumbItemSeparator, {}))] }, `${item.label}-${index}`));
|
|
44
|
+
}) }) }));
|
|
45
|
+
};
|
|
46
|
+
Breadcrumbs.Link = BreadcrumbLink;
|
|
47
|
+
Breadcrumbs.Ellipsis = BreadcrumbEllipsis;
|
|
48
|
+
Breadcrumbs.ItemSeparator = BreadcrumbItemSeparator;
|
|
49
|
+
Breadcrumbs.Dropdown = BreadcrumbDropdown;
|
|
50
|
+
Breadcrumbs.CopyButton = BreadcrumbCopyButton;
|
|
51
|
+
//# sourceMappingURL=Breadcrumbs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.js","sourceRoot":"","sources":["../../../src/components/breadcrumbs/Breadcrumbs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import { Breadcrumbs } from './Breadcrumbs.js';
|
|
3
|
+
import type { BreadcrumbItem } from './types.js';
|
|
4
|
+
declare function BreadcrumbsDocsPage(): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare const meta: {
|
|
6
|
+
title: string;
|
|
7
|
+
component: {
|
|
8
|
+
(props: import("./types.js").BreadcrumbsProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
Link: import("react").ForwardRefExoticComponent<{
|
|
10
|
+
item: BreadcrumbItem;
|
|
11
|
+
isDropdown?: boolean;
|
|
12
|
+
isActive?: boolean;
|
|
13
|
+
} & import("react").AnchorHTMLAttributes<HTMLAnchorElement> & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
14
|
+
Ellipsis: (props: import("./types.js").BreadcrumbEllipsisProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
ItemSeparator: () => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
Dropdown: (props: import("./types.js").BreadcrumbDropdownProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
CopyButton: (props: import("./types.js").BreadcrumbCopyButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
};
|
|
19
|
+
tags: string[];
|
|
20
|
+
parameters: {
|
|
21
|
+
layout: string;
|
|
22
|
+
docs: {
|
|
23
|
+
page: typeof BreadcrumbsDocsPage;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
argTypes: {
|
|
27
|
+
items: {
|
|
28
|
+
control: "object";
|
|
29
|
+
description: string;
|
|
30
|
+
table: {
|
|
31
|
+
type: {
|
|
32
|
+
summary: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
breadcrumbLabel: {
|
|
37
|
+
control: "text";
|
|
38
|
+
description: string;
|
|
39
|
+
table: {
|
|
40
|
+
type: {
|
|
41
|
+
summary: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
copyText: {
|
|
46
|
+
control: "text";
|
|
47
|
+
description: string;
|
|
48
|
+
table: {
|
|
49
|
+
type: {
|
|
50
|
+
summary: string;
|
|
51
|
+
};
|
|
52
|
+
defaultValue: {
|
|
53
|
+
summary: string;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
className: {
|
|
58
|
+
control: false;
|
|
59
|
+
description: string;
|
|
60
|
+
table: {
|
|
61
|
+
type: {
|
|
62
|
+
summary: string;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
export default meta;
|
|
69
|
+
type Story = StoryObj<typeof Breadcrumbs>;
|
|
70
|
+
export declare const Default: Story;
|
|
71
|
+
export declare const TwoItems: Story;
|
|
72
|
+
export declare const LongTrail: Story;
|
|
73
|
+
export declare const WithDropdown: Story;
|
|
74
|
+
export declare const MultipleDropdowns: Story;
|
|
75
|
+
export declare const WithEllipsis: Story;
|
|
76
|
+
export declare const ExpandableEllipsis: Story;
|
|
77
|
+
export declare const WithDropdownAndEllipsis: Story;
|
|
78
|
+
export declare const EllipsisAsLastItem: Story;
|
|
79
|
+
export declare const WithBreadcrumbLabel: Story;
|
|
80
|
+
export declare const ActiveItemAriaCurrent: Story;
|
|
81
|
+
//# sourceMappingURL=Breadcrumbs.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumbs.stories.d.ts","sourceRoot":"","sources":["../../../src/components/breadcrumbs/Breadcrumbs.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAU5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoGjD,iBAAS,mBAAmB,4CAmB3B;AAMD,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiD0B,CAAC;AAErC,eAAe,IAAI,CAAC;AAGpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA2J1C,eAAO,MAAM,OAAO,EAAE,KAmBrB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAkCtB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAkDvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KA6D1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAkF/B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KA6C1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAmDhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KA2DrC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAmChC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,KA+BjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAoCnC,CAAC"}
|