@justeattakeaway/pie-breadcrumb 0.3.0 → 0.4.0

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 @@
1
+ {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../src/pie-breadcrumb-item/defs.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,34 @@
1
+ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
2
+ import { type BreadcrumbItemProps } from './defs';
3
+ declare const componentSelector = "pie-breadcrumb-item";
4
+ export * from './defs';
5
+ declare const PieBreadcrumbItem_base: import("@justeattakeaway/pie-webc-core").GenericConstructor<import("@justeattakeaway/pie-webc-core").RTLInterface> & typeof PieElement;
6
+ /**
7
+ * @tagname pie-breadcrumb-item
8
+ */
9
+ export declare class PieBreadcrumbItem extends PieBreadcrumbItem_base implements BreadcrumbItemProps {
10
+ href: string;
11
+ /**
12
+ * Renders a separator icon between breadcrumb items.
13
+ * The icon direction depends on the RTL (Right-to-Left) setting.
14
+ *
15
+ * @returns {TemplateResult} HTML template for the separator icon.
16
+ *
17
+ * @private
18
+ */
19
+ private renderSeparator;
20
+ /**
21
+ * Renders a navigation link for a breadcrumb item.
22
+ *
23
+ * @private
24
+ */
25
+ private renderNavigationLink;
26
+ render(): import("lit-html").TemplateResult<1>;
27
+ static styles: import("lit").CSSResult;
28
+ }
29
+ declare global {
30
+ interface HTMLElementTagNameMap {
31
+ [componentSelector]: PieBreadcrumbItem;
32
+ }
33
+ }
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pie-breadcrumb-item/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,yDAAyD,CAAC;AAGrF,OAAO,2BAA2B,CAAC;AACnC,OAAO,0DAA0D,CAAC;AAClE,OAAO,yDAAyD,CAAC;AAGjE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAElD,QAAA,MAAM,iBAAiB,wBAAwB,CAAC;AAGhD,cAAc,QAAQ,CAAC;;AAEvB;;GAEG;AACH,qBACa,iBAAkB,SAAQ,sBAAqB,YAAW,mBAAmB;IAE/E,IAAI,SAAM;IAEjB;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAYvB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAQ5B,MAAM;IAUN,MAAM,CAAC,MAAM,0BAAqB;CACrC;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;KAC1C;CACJ"}
@@ -0,0 +1,66 @@
1
+ import { html as r, unsafeCSS as m } from "lit";
2
+ import { property as c } from "lit/decorators.js";
3
+ import { P as d, s as u } from "../breadcrumb-B5ACdbGG.js";
4
+ import { RtlMixin as f, safeCustomElement as h } from "@justeattakeaway/pie-webc-core";
5
+ import "@justeattakeaway/pie-link";
6
+ import "@justeattakeaway/pie-icons-webc/dist/IconChevronRight.js";
7
+ import "@justeattakeaway/pie-icons-webc/dist/IconChevronLeft.js";
8
+ var b = Object.defineProperty, v = Object.getOwnPropertyDescriptor, l = (p, t, n, i) => {
9
+ for (var e = i > 1 ? void 0 : i ? v(t, n) : t, a = p.length - 1, o; a >= 0; a--)
10
+ (o = p[a]) && (e = (i ? o(t, n, e) : o(e)) || e);
11
+ return i && e && b(t, n, e), e;
12
+ };
13
+ let s = class extends f(d) {
14
+ constructor() {
15
+ super(...arguments), this.href = "";
16
+ }
17
+ /**
18
+ * Renders a separator icon between breadcrumb items.
19
+ * The icon direction depends on the RTL (Right-to-Left) setting.
20
+ *
21
+ * @returns {TemplateResult} HTML template for the separator icon.
22
+ *
23
+ * @private
24
+ */
25
+ renderSeparator() {
26
+ return r`
27
+ <span
28
+ class="c-breadcrumb-separator"
29
+ role="presentation"
30
+ aria-hidden="true"
31
+ data-test-id="pie-breadcrumb-separator">
32
+ ${this.isRTL ? r`<icon-chevron-left></icon-chevron-left>` : r`<icon-chevron-right></icon-chevron-right>`}
33
+ </span>
34
+ `;
35
+ }
36
+ /**
37
+ * Renders a navigation link for a breadcrumb item.
38
+ *
39
+ * @private
40
+ */
41
+ renderNavigationLink() {
42
+ return r`
43
+ <pie-link isStandalone underline="reversed" href="${this.href}">
44
+ <span><slot></slot></span>
45
+ </pie-link>
46
+ `;
47
+ }
48
+ render() {
49
+ return r`
50
+ <li role="listitem" data-test-id="pie-breadcrumb-item" class="c-breadcrumb-item">
51
+ ${this.renderNavigationLink()}
52
+ ${this.renderSeparator()}
53
+ </li>
54
+ `;
55
+ }
56
+ };
57
+ s.styles = m(u);
58
+ l([
59
+ c({ type: String, reflect: !0 })
60
+ ], s.prototype, "href", 2);
61
+ s = l([
62
+ h("pie-breadcrumb-item")
63
+ ], s);
64
+ export {
65
+ s as PieBreadcrumbItem
66
+ };
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import { PieBreadcrumbItem as PieBreadcrumbItemLit } from './index';
3
+ import { type BreadcrumbItemProps } from './defs';
4
+ export * from './defs';
5
+ type ReactBaseType = React.HTMLAttributes<HTMLLIElement>;
6
+ export declare const PieBreadcrumbItem: React.ForwardRefExoticComponent<BreadcrumbItemProps & React.RefAttributes<PieBreadcrumbItemLit> & ReactBaseType>;
7
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/pie-breadcrumb-item/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAElD,cAAc,QAAQ,CAAC;AAUvB,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,CAAA;AAExD,eAAO,MAAM,iBAAiB,kHACkC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import * as e from "react";
2
+ import { createComponent as m } from "@lit/react";
3
+ import { PieBreadcrumbItem as r } from "./index.js";
4
+ const t = m({
5
+ displayName: "PieBreadcrumbItem",
6
+ elementClass: r,
7
+ react: e,
8
+ tagName: "pie-breadcrumb-item",
9
+ events: {}
10
+ }), i = t;
11
+ export {
12
+ i as PieBreadcrumbItem
13
+ };
package/dist/react.d.ts CHANGED
@@ -1,115 +1,7 @@
1
- import type { CSSResult } from 'lit';
2
- import type { GenericConstructor } from '@justeattakeaway/pie-webc-core';
3
- import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
4
- import * as React_2 from 'react';
5
- import type { RTLInterface } from '@justeattakeaway/pie-webc-core';
6
- import type { TemplateResult } from 'lit-html';
7
-
8
- export declare type BreadcrumbItem = {
9
- label: string;
10
- href: string;
11
- };
12
-
13
- export declare interface BreadcrumbProps {
14
- items: BreadcrumbItem[];
15
- /**
16
- * Optional variant for styling the breadcrumb component.
17
- */
18
- variant?: typeof variants[number];
19
- /**
20
- * Optional property for rendering a compact variation of the breadcrumb.
21
- */
22
- isCompact?: boolean;
23
- }
24
-
25
- export declare const defaultProps: Pick<BreadcrumbProps, 'variant' | 'isCompact'>;
26
-
27
- export declare const PieBreadcrumb: React_2.ForwardRefExoticComponent<BreadcrumbProps & React_2.RefAttributes<PieBreadcrumb_2> & ReactBaseType>;
28
-
29
- /**
30
- * @tagname pie-breadcrumb
31
- */
32
- declare class PieBreadcrumb_2 extends PieBreadcrumb_base implements BreadcrumbProps {
33
- items: BreadcrumbProps['items'];
34
- variant: "default" | "scrim" | undefined;
35
- isCompact: boolean | undefined;
36
- /**
37
- * Renders a separator icon between breadcrumb items.
38
- * The icon direction depends on the RTL (Right-to-Left) setting.
39
- *
40
- * @returns {TemplateResult} HTML template for the separator icon.
41
- *
42
- * @private
43
- */
44
- private renderSeparator;
45
- /**
46
- * Renders a navigation link for a breadcrumb item.
47
- *
48
- * @param {BreadcrumbItem} item - The breadcrumb item containing label and URL.
49
- *
50
- * @private
51
- */
52
- private renderNavigationLink;
53
- /**
54
- * Renders the last breadcrumb item.
55
- * It has 250px of max-width. If the label reaches this width the text truncates.
56
- *
57
- * @param {BreadcrumbItem} item - The breadcrumb item containing label and URL.
58
- *
59
- * @private
60
- */
61
- private renderLastItem;
62
- /**
63
- * Renders an individual breadcrumb item.
64
-
65
- * Conditionally renders either a clickable link or plain text for the last item.
66
- *
67
- * @param {BreadcrumbItem} item - The breadcrumb item to render.
68
- * @param {boolean} [isLastItem=false] - Indicates if the item is the last in the breadcrumb trail.
69
- *
70
- * @private
71
- */
72
- private renderItem;
73
- /**
74
- * Renders breadcrumb items using the default variant style.
75
- *
76
- * @param {BreadcrumbProps['items']} items - Breadcrumb items to render.
77
- *
78
- * @private
79
- */
80
- private renderDefaultBreadcrumb;
81
- /**
82
- * Renders a separator icon specifically for the back variant.
83
- * The icon direction depends on the RTL (Right-to-Left) setting.
84
- *
85
- * @private
86
- */
87
- private renderCompactBreadcrumbSeparator;
88
- /**
89
- * Renders breadcrumb items using the back variant style, displaying only the last item with a preceding separator.
90
- *
91
- * @param {BreadcrumbProps['items']} items - Breadcrumb items to render.
92
- *
93
- * @private
94
- */
95
- private renderCompactBreadcrumb;
96
- /**
97
- * Renders a complete breadcrumb list.
98
- * Iterates over breadcrumb items to generate the breadcrumb trail.
99
- *
100
- * @param {BreadcrumbProps['items']} items - Array of breadcrumb items to render.
101
- *
102
- * @private
103
- */
104
- private renderBreadcrumbItems;
105
- render(): TemplateResult<1>;
106
- static styles: CSSResult;
107
- }
108
-
109
- declare const PieBreadcrumb_base: GenericConstructor<RTLInterface> & typeof PieElement;
110
-
111
- declare type ReactBaseType = React_2.HTMLAttributes<HTMLElement>;
112
-
113
- export declare const variants: readonly ["default", "scrim"];
114
-
115
- export { }
1
+ import * as React from 'react';
2
+ import { PieBreadcrumb as PieBreadcrumbLit } from './index';
3
+ import { type BreadcrumbProps } from './defs';
4
+ export * from './defs';
5
+ type ReactBaseType = React.HTMLAttributes<HTMLElement>;
6
+ export declare const PieBreadcrumb: React.ForwardRefExoticComponent<BreadcrumbProps & React.RefAttributes<PieBreadcrumbLit> & ReactBaseType>;
7
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,cAAc,QAAQ,CAAC;AAUvB,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;AAEtD,eAAO,MAAM,aAAa,0GACkC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@justeattakeaway/pie-breadcrumb",
3
3
  "description": "PIE Design System Breadcrumb built using Web Components",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -33,19 +33,20 @@
33
33
  "license": "Apache-2.0",
34
34
  "devDependencies": {
35
35
  "@custom-elements-manifest/analyzer": "0.9.0",
36
- "@justeattakeaway/pie-components-config": "0.20.0",
36
+ "@justeattakeaway/pie-components-config": "0.20.1",
37
37
  "@justeattakeaway/pie-css": "0.16.0",
38
- "@justeattakeaway/pie-monorepo-utils": "0.5.0",
38
+ "@justeattakeaway/pie-monorepo-utils": "0.5.1",
39
39
  "cem-plugin-module-file-extensions": "0.0.5"
40
40
  },
41
41
  "dependencies": {
42
- "@justeattakeaway/pie-webc-core": "0.25.1"
42
+ "@justeattakeaway/pie-webc-core": "0.26.0"
43
43
  },
44
44
  "volta": {
45
45
  "extends": "../../../package.json"
46
46
  },
47
47
  "customElements": "custom-elements.json",
48
48
  "sideEffects": [
49
- "dist/*.js"
49
+ "dist/*.js",
50
+ "dist/**/*.js"
50
51
  ]
51
52
  }
@@ -2,8 +2,21 @@
2
2
 
3
3
  .c-breadcrumb {
4
4
  --breadcrumb-background-color: var(--dt-color-transparent);
5
+ --breadcrumb-item-flex-direction: row;
6
+ --breadcrumb-item-color: var(--dt-color-content-link);
7
+ --breadcrumb-separator-color: var(--dt-color-content-subdued);
8
+ --breadcrumb-separator-transform: none;
9
+
5
10
  background-color: var(--breadcrumb-background-color);
6
- padding: var(--dt-spacing-a) var(--dt-spacing-d) var(--dt-spacing-a) var(--dt-spacing-d);
11
+ padding: var(--dt-spacing-a) var(--dt-spacing-d);
12
+ }
13
+
14
+ .c-breadcrumb--scrim {
15
+ --breadcrumb-background-color: var(--dt-color-overlay);
16
+ --breadcrumb-item-color: var(--dt-color-content-link-light);
17
+ --breadcrumb-separator-color: var(--dt-color-content-light);
18
+
19
+ border-radius: var(--dt-radius-rounded-e);
7
20
  }
8
21
 
9
22
  .c-breadcrumb-list {
@@ -11,37 +24,58 @@
11
24
  padding: 0;
12
25
  display: flex;
13
26
  flex-flow: row;
27
+ gap: var(--dt-spacing-a);
28
+ }
14
29
 
30
+ .c-breadcrumb-item {
31
+ display: flex;
32
+ flex-direction: var(--breadcrumb-item-flex-direction);
33
+ align-items: center;
34
+ white-space: nowrap;
15
35
  gap: var(--dt-spacing-a);
36
+
37
+ pie-link {
38
+ --link-text-color: var(--breadcrumb-item-color);
39
+ --link-font-weight: var(--dt-font-weight-bold);
40
+ }
41
+ }
16
42
 
17
- li {
18
- list-style-type: none;
19
- display: flex;
20
- align-items: center;
21
- white-space: nowrap;
22
- }
43
+ .c-breadcrumb-separator {
44
+ display: inline-flex;
45
+ color: var(--breadcrumb-separator-color);
46
+ transform: var(--breadcrumb-separator-transform);
23
47
  }
24
48
 
25
- .c-breadcrumb--scrim {
26
- --breadcrumb-background-color: var(--dt-color-overlay);
27
- border-radius: var(--dt-radius-rounded-e);
49
+ :host([isCompact]) {
50
+ .c-breadcrumb {
51
+ --breadcrumb-item-flex-direction: row-reverse;
52
+ --breadcrumb-separator-transform: rotate(180deg);
53
+ }
54
+
55
+ ::slotted(pie-breadcrumb-item:not(:nth-last-of-type(2))) {
56
+ display: none;
57
+ }
28
58
  }
29
59
 
30
- .c-breadcrumb-list-last-item {
31
- overflow: hidden;
32
- text-overflow: ellipsis;
33
- max-width: 250px;
34
- color: var(--dt-color-content-subdued);
35
- }
60
+ :host(:last-of-type) {
61
+ pie-link {
62
+ --link-font-weight: var(--dt-font-weight-regular);
36
63
 
37
- .c-breadcrumb-list-last-item--scrim {
38
- color: var(--dt-color-content-link-light);
39
- }
64
+ span {
65
+ max-width: 250px;
66
+ white-space: nowrap;
67
+ overflow: hidden;
68
+ text-overflow: ellipsis;
69
+ }
70
+ }
40
71
 
41
- .c-breadcrumb-separator {
42
- color: var(--dt-color-content-subdued);
72
+ .c-breadcrumb-separator {
73
+ display: none;
74
+ }
43
75
  }
44
76
 
45
- .c-breadcrumb-separator--scrim {
46
- color: var(--dt-color-content-link-light);
47
- }
77
+ :host {
78
+ ::slotted(pie-breadcrumb-item:only-child) {
79
+ display: none;
80
+ }
81
+ }
package/src/defs-react.ts CHANGED
@@ -1,8 +1,3 @@
1
1
  import type React from 'react';
2
- /**
3
- * TODO: Verify if ReactBaseType can be set as a more specific React interface
4
- * Use the React IntrinsicElements interface to find how to map standard HTML elements to existing React Interfaces
5
- * Example: an HTML button maps to `React.ButtonHTMLAttributes<HTMLButtonElement>`
6
- * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0bb210867d16170c4a08d9ce5d132817651a0f80/types/react/index.d.ts#L2829
7
- */
2
+
8
3
  export type ReactBaseType = React.HTMLAttributes<HTMLElement>
package/src/defs.ts CHANGED
@@ -1,13 +1,8 @@
1
- export const variants = ['default', 'scrim'] as const;
1
+ import { type ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
2
2
 
3
- export type BreadcrumbItem = {
4
- label: string;
5
- href: string;
6
- }
3
+ export const variants = ['default', 'scrim'] as const;
7
4
 
8
5
  export interface BreadcrumbProps {
9
- items: BreadcrumbItem[];
10
-
11
6
  /**
12
7
  * Optional variant for styling the breadcrumb component.
13
8
  */
@@ -19,7 +14,9 @@ export interface BreadcrumbProps {
19
14
  isCompact?: boolean;
20
15
  }
21
16
 
22
- export const defaultProps: Pick<BreadcrumbProps, 'variant' | 'isCompact'> = {
17
+ export type DefaultProps = ComponentDefaultProps<BreadcrumbProps>;
18
+
19
+ export const defaultProps:DefaultProps = {
23
20
  variant: 'default',
24
21
  isCompact: false,
25
22
  };
package/src/index.ts CHANGED
@@ -1,18 +1,12 @@
1
- import { html, nothing, unsafeCSS } from 'lit';
1
+ import { html, unsafeCSS } from 'lit';
2
2
  import { property } from 'lit/decorators.js';
3
- import { RtlMixin, defineCustomElement, validPropertyValues } from '@justeattakeaway/pie-webc-core';
3
+ import { safeCustomElement, validPropertyValues } from '@justeattakeaway/pie-webc-core';
4
4
  import { classMap } from 'lit/directives/class-map.js';
5
-
6
5
  import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
7
6
 
8
- import '@justeattakeaway/pie-link';
9
- import '@justeattakeaway/pie-icons-webc/dist/IconChevronRight.js';
10
- import '@justeattakeaway/pie-icons-webc/dist/IconChevronLeft.js';
11
-
12
7
  import styles from './breadcrumb.scss?inline';
13
8
  import {
14
9
  type BreadcrumbProps,
15
- type BreadcrumbItem,
16
10
  variants,
17
11
  defaultProps,
18
12
  } from './defs';
@@ -25,173 +19,32 @@ export * from './defs';
25
19
  /**
26
20
  * @tagname pie-breadcrumb
27
21
  */
28
- export class PieBreadcrumb extends RtlMixin(PieElement) implements BreadcrumbProps {
29
- @property({ type: Array })
30
- public items: BreadcrumbProps['items'] = [];
31
-
22
+ @safeCustomElement('pie-breadcrumb')
23
+ export class PieBreadcrumb extends PieElement implements BreadcrumbProps {
32
24
  @property({ type: String })
33
25
  @validPropertyValues(componentSelector, variants, defaultProps.variant)
34
26
  public variant = defaultProps.variant;
35
27
 
36
- @property({ type: Boolean })
28
+ @property({ type: Boolean, reflect: true })
37
29
  public isCompact = defaultProps.isCompact;
38
30
 
39
- /**
40
- * Renders a separator icon between breadcrumb items.
41
- * The icon direction depends on the RTL (Right-to-Left) setting.
42
- *
43
- * @returns {TemplateResult} HTML template for the separator icon.
44
- *
45
- * @private
46
- */
47
- private renderSeparator () {
48
- const separatorVariant = this.variant === 'scrim' ? 'c-breadcrumb-separator--scrim' : 'c-breadcrumb-separator';
49
-
50
- return html`
51
- <li
52
- role="presentation"
53
- aria-hidden="true"
54
- class="${separatorVariant}"
55
- data-test-id="pie-breadcrumb-separator">
56
- ${this.isRTL ? html`<icon-chevron-left></icon-chevron-left>` : html`<icon-chevron-right></icon-chevron-right>`}
57
- </li>
58
- `;
59
- }
60
-
61
- /**
62
- * Renders a navigation link for a breadcrumb item.
63
- *
64
- * @param {BreadcrumbItem} item - The breadcrumb item containing label and URL.
65
- *
66
- * @private
67
- */
68
- private renderNavigationLink (item: BreadcrumbItem) {
69
- const linkVariant = this.variant === 'scrim' ? 'inverse' : 'default';
70
-
71
- return html`
72
- <pie-link variant="${linkVariant}" isStandalone underline="reversed" isBold href="${item.href}">
73
- ${item.label}
74
- </pie-link>
75
- `;
76
- }
77
-
78
- /**
79
- * Renders the last breadcrumb item.
80
- * It has 250px of max-width. If the label reaches this width the text truncates.
81
- *
82
- * @param {BreadcrumbItem} item - The breadcrumb item containing label and URL.
83
- *
84
- * @private
85
- */
86
- private renderLastItem (item: BreadcrumbItem) {
87
- const wrapperClasses = {
88
- 'c-breadcrumb-list-last-item': true,
89
- 'c-breadcrumb-list-last-item--scrim': this.variant === 'scrim',
90
- };
91
-
92
- return html`<span class="${classMap(wrapperClasses)}">${item.label}</span>`;
93
- }
94
-
95
- /**
96
- * Renders an individual breadcrumb item.
97
-
98
- * Conditionally renders either a clickable link or plain text for the last item.
99
- *
100
- * @param {BreadcrumbItem} item - The breadcrumb item to render.
101
- * @param {boolean} [isLastItem=false] - Indicates if the item is the last in the breadcrumb trail.
102
- *
103
- * @private
104
- */
105
- private renderItem (item: BreadcrumbItem, isLastItem = false) {
106
- return html`
107
- <li role="listitem" data-test-id="pie-breadcrumb-item">
108
- ${
109
- isLastItem
110
- ? this.renderLastItem(item)
111
- : this.renderNavigationLink(item)
112
- }
113
- </li>
114
- ${isLastItem ? nothing : this.renderSeparator()}
115
- `;
116
- }
117
-
118
- /**
119
- * Renders breadcrumb items using the default variant style.
120
- *
121
- * @param {BreadcrumbProps['items']} items - Breadcrumb items to render.
122
- *
123
- * @private
124
- */
125
- private renderDefaultBreadcrumb (items: BreadcrumbProps['items']) {
126
- const numberOfSeparators = items.length - 1;
127
-
128
- return html`${items.map((item, index) => this.renderItem(item, numberOfSeparators <= index))}`;
129
- }
130
-
131
- /**
132
- * Renders a separator icon specifically for the back variant.
133
- * The icon direction depends on the RTL (Right-to-Left) setting.
134
- *
135
- * @private
136
- */
137
- private renderCompactBreadcrumbSeparator () {
138
- const separatorVariant = this.variant === 'scrim' ? 'c-breadcrumb-separator--scrim' : 'c-breadcrumb-separator';
139
-
140
- return html`
141
- <li role="presentation" aria-hidden="true" class="${separatorVariant}" data-test-id="pie-breadcrumb-separator">
142
- ${this.isRTL ? html`<icon-chevron-right></icon-chevron-right>` : html`<icon-chevron-left></icon-chevron-left>`}
143
- </li>
144
- `;
145
- }
146
-
147
- /**
148
- * Renders breadcrumb items using the back variant style, displaying only the last item with a preceding separator.
149
- *
150
- * @param {BreadcrumbProps['items']} items - Breadcrumb items to render.
151
- *
152
- * @private
153
- */
154
- private renderCompactBreadcrumb (items: BreadcrumbProps['items']) {
155
- const lastItem = items[items.length - 1];
156
-
157
- return html`
158
- ${this.renderCompactBreadcrumbSeparator()}
159
- <li role="listitem" data-test-id="pie-breadcrumb-item">
160
- ${this.renderNavigationLink(lastItem)}
161
- </li>
162
- `;
163
- }
164
-
165
- /**
166
- * Renders a complete breadcrumb list.
167
- * Iterates over breadcrumb items to generate the breadcrumb trail.
168
- *
169
- * @param {BreadcrumbProps['items']} items - Array of breadcrumb items to render.
170
- *
171
- * @private
172
- */
173
- private renderBreadcrumbItems (items: BreadcrumbProps['items'], isCompact: BreadcrumbProps['isCompact']) {
174
- return html`
175
- <ol class="c-breadcrumb-list" data-test-id="pie-breadcrumb-list">
176
- ${isCompact ? this.renderCompactBreadcrumb(items) : this.renderDefaultBreadcrumb(items)}
177
- </ol>
178
- `;
179
- }
180
-
181
31
  render () {
182
- const { items, variant, isCompact } = this;
32
+ const { variant, isCompact } = this;
183
33
 
184
- const componentWrapperClasses = {
34
+ const classes = {
185
35
  'c-breadcrumb': true,
186
- 'c-breadcrumb--scrim': variant === 'scrim',
36
+ [`c-breadcrumb--${variant}`]: true,
37
+ 'c-breadcrumb--compact': isCompact,
187
38
  };
188
39
 
189
40
  return html`
190
41
  <nav
191
42
  aria-label="breadcrumb"
192
43
  data-test-id="pie-breadcrumb"
193
- class="${classMap(componentWrapperClasses)}">
194
- ${items ? this.renderBreadcrumbItems(items, isCompact) : nothing}
44
+ class="${classMap(classes)}">
45
+ <ol class="c-breadcrumb-list" data-test-id="pie-breadcrumb-list">
46
+ <slot></slot>
47
+ </ol>
195
48
  </nav>`;
196
49
  }
197
50
 
@@ -199,8 +52,6 @@ export class PieBreadcrumb extends RtlMixin(PieElement) implements BreadcrumbPro
199
52
  static styles = unsafeCSS(styles);
200
53
  }
201
54
 
202
- defineCustomElement(componentSelector, PieBreadcrumb);
203
-
204
55
  declare global {
205
56
  interface HTMLElementTagNameMap {
206
57
  [componentSelector]: PieBreadcrumb;
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLLIElement>
@@ -0,0 +1,6 @@
1
+ export interface BreadcrumbItemProps {
2
+ /**
3
+ * The URL that the breadcrumb item links to
4
+ */
5
+ href?: string;
6
+ }