@purpurds/drawer 5.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/LICENSE.txt +478 -0
  2. package/dist/drawer-container.d.ts +11 -0
  3. package/dist/drawer-container.d.ts.map +1 -0
  4. package/dist/drawer-content.d.ts +27 -0
  5. package/dist/drawer-content.d.ts.map +1 -0
  6. package/dist/drawer-frame.d.ts +23 -0
  7. package/dist/drawer-frame.d.ts.map +1 -0
  8. package/dist/drawer-handle.d.ts +13 -0
  9. package/dist/drawer-handle.d.ts.map +1 -0
  10. package/dist/drawer-header.d.ts +14 -0
  11. package/dist/drawer-header.d.ts.map +1 -0
  12. package/dist/drawer-scroll-area.d.ts +9 -0
  13. package/dist/drawer-scroll-area.d.ts.map +1 -0
  14. package/dist/drawer-trigger.d.ts +9 -0
  15. package/dist/drawer-trigger.d.ts.map +1 -0
  16. package/dist/drawer.cjs.js +62 -0
  17. package/dist/drawer.cjs.js.map +1 -0
  18. package/dist/drawer.context.d.ts +4 -0
  19. package/dist/drawer.context.d.ts.map +1 -0
  20. package/dist/drawer.d.ts +17 -0
  21. package/dist/drawer.d.ts.map +1 -0
  22. package/dist/drawer.es.js +2791 -0
  23. package/dist/drawer.es.js.map +1 -0
  24. package/dist/styles.css +1 -0
  25. package/dist/types.d.ts +8 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/use-swipe-to-dismiss.hook.d.ts +13 -0
  28. package/dist/use-swipe-to-dismiss.hook.d.ts.map +1 -0
  29. package/dist/use-swipe-tracking.hook.d.ts +15 -0
  30. package/dist/use-swipe-tracking.hook.d.ts.map +1 -0
  31. package/package.json +67 -0
  32. package/src/drawer-container.module.scss +24 -0
  33. package/src/drawer-container.test.tsx +74 -0
  34. package/src/drawer-container.tsx +48 -0
  35. package/src/drawer-content.module.scss +101 -0
  36. package/src/drawer-content.test.tsx +80 -0
  37. package/src/drawer-content.tsx +124 -0
  38. package/src/drawer-frame.module.scss +44 -0
  39. package/src/drawer-frame.test.tsx +139 -0
  40. package/src/drawer-frame.tsx +140 -0
  41. package/src/drawer-handle.module.scss +23 -0
  42. package/src/drawer-handle.test.tsx +37 -0
  43. package/src/drawer-handle.tsx +59 -0
  44. package/src/drawer-header.module.scss +29 -0
  45. package/src/drawer-header.test.tsx +173 -0
  46. package/src/drawer-header.tsx +117 -0
  47. package/src/drawer-scroll-area.module.scss +42 -0
  48. package/src/drawer-scroll-area.test.tsx +28 -0
  49. package/src/drawer-scroll-area.tsx +45 -0
  50. package/src/drawer-trigger.test.tsx +33 -0
  51. package/src/drawer-trigger.tsx +34 -0
  52. package/src/drawer.context.ts +5 -0
  53. package/src/drawer.module.scss +3 -0
  54. package/src/drawer.stories.tsx +197 -0
  55. package/src/drawer.test.tsx +210 -0
  56. package/src/drawer.tsx +59 -0
  57. package/src/global.d.ts +4 -0
  58. package/src/types.ts +3 -0
  59. package/src/use-swipe-to-dismiss.hook.ts +60 -0
  60. package/src/use-swipe-tracking.hook.ts +78 -0
@@ -0,0 +1,139 @@
1
+ import React from "react";
2
+ import * as RadixDialog from "@radix-ui/react-dialog";
3
+ import * as matchers from "@testing-library/jest-dom/matchers";
4
+ import { cleanup, render, screen } from "@testing-library/react";
5
+ import { afterEach, describe, expect, it } from "vitest";
6
+
7
+ import { DrawerFrame } from "./drawer-frame";
8
+
9
+ expect.extend(matchers);
10
+
11
+ const noop = () => {};
12
+
13
+ afterEach(() => {
14
+ cleanup();
15
+ });
16
+
17
+ describe("DrawerFrame", () => {
18
+ it("should have the sticky-footer class if stickyFooter is set", () => {
19
+ render(
20
+ <RadixDialog.Root open={true}>
21
+ <RadixDialog.Content>
22
+ <DrawerFrame
23
+ data-testid={Selectors.DRAWER_FRAME}
24
+ backButton
25
+ backButtonOnlyIcon={false}
26
+ backButtonText="Back"
27
+ closeButtonText="Close"
28
+ footerContent={<div>Footer content</div>}
29
+ onAnimationEnd={noop}
30
+ onBackButtonClick={noop}
31
+ onSwipeStart={noop}
32
+ onSwipeMove={noop}
33
+ onSwipeCancel={noop}
34
+ onSwipeEnd={noop}
35
+ stickyFooter
36
+ title="Title"
37
+ >
38
+ Some drawer-content
39
+ </DrawerFrame>
40
+ </RadixDialog.Content>
41
+ </RadixDialog.Root>
42
+ );
43
+ expect(screen.getByTestId(Selectors.DRAWER_FRAME)).toHaveClass(
44
+ "purpur-drawer-frame--sticky-footer"
45
+ );
46
+ });
47
+
48
+ it.each([
49
+ { stickyFooter: true, expectedScrollArea: Selectors.STICKY_FOOTER_SCROLL_AREA },
50
+ { stickyFooter: false, expectedScrollArea: Selectors.DEFAULT_SCROLL_AREA },
51
+ ])("should render the correct scroll area depending on stickyFooter prop", (args) => {
52
+ render(
53
+ <RadixDialog.Root open={true}>
54
+ <RadixDialog.Content>
55
+ <DrawerFrame
56
+ data-testid={Selectors.DRAWER_FRAME}
57
+ backButton
58
+ backButtonOnlyIcon={false}
59
+ backButtonText="Back"
60
+ closeButtonText="Close"
61
+ footerContent={<div>Footer content</div>}
62
+ onAnimationEnd={noop}
63
+ onBackButtonClick={noop}
64
+ onSwipeStart={noop}
65
+ onSwipeMove={noop}
66
+ onSwipeCancel={noop}
67
+ onSwipeEnd={noop}
68
+ stickyFooter={args.stickyFooter}
69
+ title="Title"
70
+ >
71
+ Some drawer-content
72
+ </DrawerFrame>
73
+ </RadixDialog.Content>
74
+ </RadixDialog.Root>
75
+ );
76
+ expect(screen.getByTestId(args.expectedScrollArea)).toBeInTheDocument();
77
+ });
78
+
79
+ it.each([
80
+ {
81
+ stickyFooter: true,
82
+ footerContent: <div>Footer content</div>,
83
+ expectedFooter: Selectors.STICKY_FOOTER,
84
+ },
85
+ {
86
+ stickyFooter: true,
87
+ footerContent: undefined,
88
+ expectedFooter: Selectors.STICKY_FOOTER,
89
+ },
90
+ {
91
+ stickyFooter: false,
92
+ footerContent: <div>Footer content</div>,
93
+ expectedFooter: Selectors.FOOTER,
94
+ },
95
+ {
96
+ stickyFooter: false,
97
+ footerContent: undefined,
98
+ expectedFooter: Selectors.FOOTER,
99
+ },
100
+ ])("should only show footerContent if there is any", (args) => {
101
+ render(
102
+ <RadixDialog.Root open={true}>
103
+ <RadixDialog.Content>
104
+ <DrawerFrame
105
+ data-testid={Selectors.DRAWER_FRAME}
106
+ backButton
107
+ backButtonOnlyIcon={false}
108
+ backButtonText="Back"
109
+ closeButtonText="Close"
110
+ footerContent={args.footerContent}
111
+ onAnimationEnd={noop}
112
+ onBackButtonClick={noop}
113
+ onSwipeStart={noop}
114
+ onSwipeMove={noop}
115
+ onSwipeCancel={noop}
116
+ onSwipeEnd={noop}
117
+ stickyFooter={args.stickyFooter}
118
+ title="Title"
119
+ >
120
+ Some drawer-content
121
+ </DrawerFrame>
122
+ </RadixDialog.Content>
123
+ </RadixDialog.Root>
124
+ );
125
+ if (args.footerContent) {
126
+ expect(screen.getByTestId(args.expectedFooter)).toBeInTheDocument();
127
+ } else {
128
+ expect(screen.queryByTestId(args.expectedFooter)).not.toBeInTheDocument();
129
+ }
130
+ });
131
+ });
132
+
133
+ const Selectors = {
134
+ DRAWER_FRAME: "purpur-drawer-frame",
135
+ STICKY_FOOTER_SCROLL_AREA: "purpur-drawer-frame-sticky-footer-scroll-area",
136
+ STICKY_FOOTER: "purpur-drawer-frame-sticky-footer",
137
+ DEFAULT_SCROLL_AREA: "purpur-drawer-frame-scroll-area",
138
+ FOOTER: "purpur-drawer-frame-footer",
139
+ };
@@ -0,0 +1,140 @@
1
+ import React, { ForwardedRef, forwardRef, ReactNode } from "react";
2
+ import c from "classnames/bind";
3
+
4
+ import { DrawerContainer } from "./drawer-container";
5
+ import styles from "./drawer-frame.module.scss";
6
+ import { DrawerHandle } from "./drawer-handle";
7
+ import { DrawerHeader } from "./drawer-header";
8
+ import { DrawerScrollArea } from "./drawer-scroll-area";
9
+ import { SwipeEvent } from "./types";
10
+ const cx = c.bind(styles);
11
+
12
+ export type DrawerFrameProps = {
13
+ ["data-testid"]?: string;
14
+ backButton: boolean;
15
+ backButtonText?: string;
16
+ backButtonOnlyIcon: boolean;
17
+ children: ReactNode;
18
+ className?: string;
19
+ closeButtonText: string;
20
+ footerContent?: ReactNode;
21
+ onAnimationEnd: (event: React.AnimationEvent<HTMLDivElement>) => void;
22
+ onBackButtonClick?: () => void;
23
+ onSwipeStart(): void;
24
+ onSwipeMove(event: SwipeEvent): void;
25
+ onSwipeCancel(): void;
26
+ onSwipeEnd(event: SwipeEvent): void;
27
+ stickyFooter: boolean;
28
+ title: string;
29
+ };
30
+
31
+ const rootClassName = "purpur-drawer-frame";
32
+
33
+ export const DrawerFrame = forwardRef(
34
+ (
35
+ {
36
+ ["data-testid"]: dataTestId = "purpur-drawer-frame",
37
+ backButton,
38
+ backButtonText,
39
+ backButtonOnlyIcon,
40
+ children,
41
+ className,
42
+ closeButtonText,
43
+ footerContent,
44
+ onAnimationEnd,
45
+ onBackButtonClick,
46
+ onSwipeStart,
47
+ onSwipeMove,
48
+ onSwipeCancel,
49
+ onSwipeEnd,
50
+ title,
51
+ stickyFooter,
52
+ ...props
53
+ }: DrawerFrameProps,
54
+ ref: ForwardedRef<HTMLDivElement>
55
+ ) => {
56
+ const classes = cx([
57
+ className,
58
+ rootClassName,
59
+ {
60
+ [`${rootClassName}--sticky-footer`]: stickyFooter,
61
+ },
62
+ ]);
63
+
64
+ return (
65
+ <div
66
+ className={classes}
67
+ data-testid={dataTestId}
68
+ ref={ref}
69
+ onAnimationEnd={onAnimationEnd}
70
+ {...props}
71
+ >
72
+ <DrawerHandle
73
+ onSwipeStart={onSwipeStart}
74
+ onSwipeMove={onSwipeMove}
75
+ onSwipeCancel={onSwipeCancel}
76
+ onSwipeEnd={onSwipeEnd}
77
+ />
78
+ <DrawerContainer
79
+ className={cx(`${rootClassName}__header`)}
80
+ variant="header"
81
+ stickyFooter={stickyFooter}
82
+ >
83
+ <DrawerHeader
84
+ title={title}
85
+ backButtonOnlyIcon={backButtonOnlyIcon}
86
+ backButton={backButton}
87
+ backButtonText={backButtonText}
88
+ closeButtonText={closeButtonText}
89
+ onBackButtonClick={onBackButtonClick}
90
+ />
91
+ </DrawerContainer>
92
+ {stickyFooter ? (
93
+ <>
94
+ <DrawerScrollArea
95
+ className={cx(`${rootClassName}__body`)}
96
+ data-testid={`${dataTestId}-sticky-footer-scroll-area`}
97
+ >
98
+ <DrawerContainer stickyFooter>{children}</DrawerContainer>
99
+ </DrawerScrollArea>
100
+ {footerContent && (
101
+ <DrawerContainer
102
+ className={cx(`${rootClassName}__footer`)}
103
+ data-testid={`${dataTestId}-sticky-footer`}
104
+ variant="footer"
105
+ stickyFooter={stickyFooter}
106
+ >
107
+ {footerContent}
108
+ </DrawerContainer>
109
+ )}
110
+ </>
111
+ ) : (
112
+ <DrawerScrollArea
113
+ className={cx(`${rootClassName}__body`)}
114
+ data-testid={`${dataTestId}-scroll-area`}
115
+ >
116
+ <div
117
+ className={cx([
118
+ `${rootClassName}__content-container`,
119
+ { [`${rootClassName}__content-container--no-footer`]: !footerContent },
120
+ ])}
121
+ >
122
+ <DrawerContainer stickyFooter={stickyFooter}>{children}</DrawerContainer>
123
+ {footerContent && (
124
+ <DrawerContainer
125
+ data-testid={`${dataTestId}-footer`}
126
+ stickyFooter={stickyFooter}
127
+ variant="footer"
128
+ >
129
+ {footerContent}
130
+ </DrawerContainer>
131
+ )}
132
+ </div>
133
+ </DrawerScrollArea>
134
+ )}
135
+ </div>
136
+ );
137
+ }
138
+ );
139
+
140
+ DrawerFrame.displayName = "DrawerFrame";
@@ -0,0 +1,23 @@
1
+ @import "@purpurds/tokens/breakpoint/variables";
2
+
3
+ .purpur-drawer-handle {
4
+ align-items: center;
5
+ display: flex;
6
+ height: var(--purpur-spacing-250);
7
+ justify-content: center;
8
+ position: absolute;
9
+ top: 0;
10
+ width: 100%;
11
+
12
+ @media screen and (min-width: $purpur-breakpoint-md) {
13
+ display: none;
14
+ }
15
+
16
+ &::before {
17
+ content: "";
18
+ background: var(--purpur-color-border-weak);
19
+ border-radius: var(--purpur-border-radius-full);
20
+ height: var(--purpur-spacing-50);
21
+ width: var(--purpur-spacing-600);
22
+ }
23
+ }
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import * as matchers from "@testing-library/jest-dom/matchers";
3
+ import { cleanup, render, screen } from "@testing-library/react";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+
6
+ import { DrawerHandle } from "./drawer-handle";
7
+
8
+ expect.extend(matchers);
9
+
10
+ const onSwipeStart = vi.fn();
11
+ const onSwipeMove = vi.fn();
12
+ const onSwipeCancel = vi.fn();
13
+ const onSwipeEnd = vi.fn();
14
+
15
+ afterEach(() => {
16
+ cleanup();
17
+ });
18
+
19
+ describe("DrawerHandle", () => {
20
+ it("should render", async () => {
21
+ render(
22
+ <DrawerHandle
23
+ data-testid={Selectors.DRAWER_HANDLE}
24
+ onSwipeStart={onSwipeStart}
25
+ onSwipeMove={onSwipeMove}
26
+ onSwipeCancel={onSwipeCancel}
27
+ onSwipeEnd={onSwipeEnd}
28
+ />
29
+ );
30
+ const drawerHandle = screen.getByTestId(Selectors.DRAWER_HANDLE);
31
+ expect(drawerHandle).toBeInTheDocument();
32
+ });
33
+ });
34
+
35
+ const Selectors = {
36
+ DRAWER_HANDLE: "purpur-drawer-handle",
37
+ };
@@ -0,0 +1,59 @@
1
+ import React, { ForwardedRef, forwardRef } from "react";
2
+ import c from "classnames/bind";
3
+
4
+ import styles from "./drawer-handle.module.scss";
5
+ import { SwipeEvent } from "./types";
6
+ import { useSwipeTracking } from "./use-swipe-tracking.hook";
7
+ const cx = c.bind(styles);
8
+
9
+ export type DrawerHandleProps = {
10
+ ["data-testid"]?: string;
11
+ className?: string;
12
+ onSwipeStart(): void;
13
+ onSwipeMove(event: SwipeEvent): void;
14
+ onSwipeCancel(): void;
15
+ onSwipeEnd(event: SwipeEvent): void;
16
+ };
17
+
18
+ const rootClassName = "purpur-drawer-handle";
19
+
20
+ export const DrawerHandle = forwardRef(
21
+ (
22
+ {
23
+ ["data-testid"]: dataTestId = "purpur-drawer-handle",
24
+ className,
25
+ onSwipeStart,
26
+ onSwipeMove,
27
+ onSwipeCancel,
28
+ onSwipeEnd,
29
+ ...props
30
+ }: DrawerHandleProps,
31
+ ref: ForwardedRef<HTMLDivElement>
32
+ ) => {
33
+ const classes = cx([className, rootClassName]);
34
+ const pointerStartRef = React.useRef<{ y: number } | null>(null);
35
+ const swipeDeltaRef = React.useRef<{ y: number } | null>(null);
36
+ const { onPointerDown, onPointerMove, onPointerUp } = useSwipeTracking(
37
+ swipeDeltaRef,
38
+ pointerStartRef,
39
+ onSwipeStart,
40
+ onSwipeMove,
41
+ onSwipeCancel,
42
+ onSwipeEnd
43
+ );
44
+
45
+ return (
46
+ <div
47
+ className={classes}
48
+ data-testid={dataTestId}
49
+ onPointerDown={onPointerDown}
50
+ onPointerMove={onPointerMove}
51
+ onPointerUp={onPointerUp}
52
+ ref={ref}
53
+ {...props}
54
+ />
55
+ );
56
+ }
57
+ );
58
+
59
+ DrawerHandle.displayName = "DrawerHandle";
@@ -0,0 +1,29 @@
1
+ .purpur-drawer-header {
2
+ &__row {
3
+ display: flex;
4
+ align-items: center;
5
+ gap: var(--purpur-spacing-100);
6
+
7
+ &--with-back-button {
8
+ margin-bottom: var(--purpur-spacing-100);
9
+ }
10
+ }
11
+
12
+ &__left {
13
+ flex: 1 1 auto;
14
+ }
15
+
16
+ &__right {
17
+ flex: 0 0 auto;
18
+ }
19
+
20
+ &__close-button {
21
+ margin-right: calc(-1 * var(--purpur-spacing-100));
22
+ }
23
+
24
+ &__back-button {
25
+ &--only-icon {
26
+ margin-left: calc(-1 * var(--purpur-spacing-100));
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,173 @@
1
+ import React from "react";
2
+ import * as RadixDialog from "@radix-ui/react-dialog";
3
+ import * as matchers from "@testing-library/jest-dom/matchers";
4
+ import { cleanup, render, screen } from "@testing-library/react";
5
+ import { afterEach, describe, expect, it, vi } from "vitest";
6
+
7
+ import { DrawerHeader } from "./drawer-header";
8
+
9
+ expect.extend(matchers);
10
+
11
+ const handleBackClick = vi.fn();
12
+
13
+ afterEach(() => {
14
+ cleanup();
15
+ });
16
+
17
+ describe("DrawerHeader", () => {
18
+ it.each([
19
+ {
20
+ backButton: true,
21
+ backButtonText: "Back",
22
+ handleBackClick: handleBackClick,
23
+ shouldExist: true,
24
+ },
25
+ { backButton: true, backButtonText: "Back", handleBackClick: undefined, shouldExist: false },
26
+ {
27
+ backButton: true,
28
+ backButtonText: "",
29
+ handleBackClick: handleBackClick,
30
+ shouldExist: false,
31
+ },
32
+ {
33
+ backButton: true,
34
+ backButtonText: undefined,
35
+ handleBackClick: handleBackClick,
36
+ shouldExist: false,
37
+ },
38
+ {
39
+ backButton: false,
40
+ backButtonText: "Back",
41
+ handleBackClick: handleBackClick,
42
+ shouldExist: false,
43
+ },
44
+ ])("should display the back button if required props are set", (args) => {
45
+ render(
46
+ <RadixDialog.Root open={true}>
47
+ <RadixDialog.Content>
48
+ <DrawerHeader
49
+ backButton={args.backButton}
50
+ backButtonText={args.backButtonText}
51
+ backButtonOnlyIcon={false}
52
+ closeButtonText="Close"
53
+ data-testid={Selectors.DRAWER_HEADER}
54
+ onBackButtonClick={args.handleBackClick}
55
+ title="Title"
56
+ />
57
+ </RadixDialog.Content>
58
+ </RadixDialog.Root>
59
+ );
60
+ if (args.shouldExist) {
61
+ expect(screen.getByTestId(Selectors.HEADER_ROW)).toHaveClass(
62
+ "purpur-drawer-header__row--with-back-button"
63
+ );
64
+ expect(screen.getByTestId(Selectors.BACK_BUTTON)).toBeInTheDocument();
65
+ } else {
66
+ expect(screen.getByTestId(Selectors.HEADER_ROW)).not.toHaveClass(
67
+ "purpur-drawer-header__row--with-back-button"
68
+ );
69
+ expect(screen.queryByTestId(Selectors.BACK_BUTTON)).not.toBeInTheDocument();
70
+ }
71
+ });
72
+
73
+ it.each([
74
+ {
75
+ backButton: true,
76
+ backButtonText: "Back",
77
+ handleBackClick: handleBackClick,
78
+ expectedTitleSelector: Selectors.TITLE_TOGETHER_WITH_BACK_BUTTON,
79
+ },
80
+ {
81
+ backButton: true,
82
+ backButtonText: "Back",
83
+ handleBackClick: undefined,
84
+ expectedTitleSelector: Selectors.TITLE,
85
+ },
86
+ {
87
+ backButton: true,
88
+ backButtonText: "",
89
+ handleBackClick: handleBackClick,
90
+ expectedTitleSelector: Selectors.TITLE,
91
+ },
92
+ {
93
+ backButton: true,
94
+ backButtonText: undefined,
95
+ handleBackClick: handleBackClick,
96
+ expectedTitleSelector: Selectors.TITLE,
97
+ },
98
+ {
99
+ backButton: false,
100
+ backButtonText: "Back",
101
+ handleBackClick: handleBackClick,
102
+ expectedTitleSelector: Selectors.TITLE,
103
+ },
104
+ ])(
105
+ "should display the title in the correct position depending on if back button is present or not",
106
+ (args) => {
107
+ render(
108
+ <RadixDialog.Root open={true}>
109
+ <RadixDialog.Content>
110
+ <DrawerHeader
111
+ backButton={args.backButton}
112
+ backButtonText={args.backButtonText}
113
+ backButtonOnlyIcon={false}
114
+ closeButtonText="Close"
115
+ data-testid={Selectors.DRAWER_HEADER}
116
+ onBackButtonClick={args.handleBackClick}
117
+ title="Title"
118
+ />
119
+ </RadixDialog.Content>
120
+ </RadixDialog.Root>
121
+ );
122
+ expect(screen.getByTestId(args.expectedTitleSelector)).toBeInTheDocument();
123
+ }
124
+ );
125
+
126
+ it("should add the button text as aria-label if backButtonOnlyIcon is true", () => {
127
+ render(
128
+ <RadixDialog.Root open={true}>
129
+ <RadixDialog.Content>
130
+ <DrawerHeader
131
+ backButton
132
+ backButtonText="Back"
133
+ backButtonOnlyIcon
134
+ closeButtonText="Close"
135
+ data-testid={Selectors.DRAWER_HEADER}
136
+ onBackButtonClick={handleBackClick}
137
+ title="Title"
138
+ />
139
+ </RadixDialog.Content>
140
+ </RadixDialog.Root>
141
+ );
142
+ expect(screen.getByTestId(Selectors.BACK_BUTTON)).toHaveAttribute("aria-label", "Back");
143
+ expect(screen.getByTestId(Selectors.BACK_BUTTON)).not.toHaveTextContent("Back");
144
+ });
145
+
146
+ it("should not add the button text as aria-label if backButtonOnlyIcon is false", () => {
147
+ render(
148
+ <RadixDialog.Root open={true}>
149
+ <RadixDialog.Content>
150
+ <DrawerHeader
151
+ backButton
152
+ backButtonText="Back"
153
+ backButtonOnlyIcon={false}
154
+ closeButtonText="Close"
155
+ data-testid={Selectors.DRAWER_HEADER}
156
+ onBackButtonClick={handleBackClick}
157
+ title="Title"
158
+ />
159
+ </RadixDialog.Content>
160
+ </RadixDialog.Root>
161
+ );
162
+ expect(screen.getByTestId(Selectors.BACK_BUTTON)).not.toHaveAttribute("aria-label", "Back");
163
+ expect(screen.getByTestId(Selectors.BACK_BUTTON)).toHaveTextContent("Back");
164
+ });
165
+ });
166
+
167
+ const Selectors = {
168
+ DRAWER_HEADER: "purpur-drawer-header",
169
+ HEADER_ROW: "purpur-drawer-header-row",
170
+ BACK_BUTTON: "purpur-drawer-header-back-button",
171
+ TITLE_TOGETHER_WITH_BACK_BUTTON: "purpur-drawer-header-title-with-back-button",
172
+ TITLE: "purpur-drawer-header-title",
173
+ };