@nationaldesignstudio/react 0.5.2 → 0.5.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.
Files changed (161) hide show
  1. package/package.json +10 -2
  2. package/src/components/organisms/navbar/navbar.tsx +8 -8
  3. package/src/App.css +0 -0
  4. package/src/App.tsx +0 -7
  5. package/src/assets/fonts/PPNeueMontreal-Variable.woff2 +0 -0
  6. package/src/assets/react.svg +0 -1
  7. package/src/components/atoms/accordion/accordion.stories.tsx +0 -228
  8. package/src/components/atoms/accordion/accordion.test.tsx +0 -231
  9. package/src/components/atoms/accordion/index.ts +0 -6
  10. package/src/components/atoms/background/background.test.tsx +0 -213
  11. package/src/components/atoms/background/index.ts +0 -22
  12. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-chromium-darwin.png +0 -0
  13. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-chromium-linux.png +0 -0
  14. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-chromium-darwin.png +0 -0
  15. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-chromium-linux.png +0 -0
  16. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-quiet-chromium-darwin.png +0 -0
  17. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-quiet-chromium-linux.png +0 -0
  18. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-disabled-chromium-darwin.png +0 -0
  19. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-disabled-chromium-linux.png +0 -0
  20. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-chromium-darwin.png +0 -0
  21. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-chromium-linux.png +0 -0
  22. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-chromium-darwin.png +0 -0
  23. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-chromium-linux.png +0 -0
  24. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-quiet-chromium-darwin.png +0 -0
  25. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-quiet-chromium-linux.png +0 -0
  26. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-large-chromium-darwin.png +0 -0
  27. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-large-chromium-linux.png +0 -0
  28. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-medium-chromium-darwin.png +0 -0
  29. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-medium-chromium-linux.png +0 -0
  30. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-small-chromium-darwin.png +0 -0
  31. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-small-chromium-linux.png +0 -0
  32. package/src/components/atoms/button/button.stories.tsx +0 -289
  33. package/src/components/atoms/button/button.test.tsx +0 -419
  34. package/src/components/atoms/button/button.visual.test.tsx +0 -98
  35. package/src/components/atoms/button/icon-button.stories.tsx +0 -260
  36. package/src/components/atoms/button/icon-button.test.tsx +0 -186
  37. package/src/components/atoms/button/index.ts +0 -6
  38. package/src/components/atoms/input/index.ts +0 -17
  39. package/src/components/atoms/input/input-group.stories.tsx +0 -646
  40. package/src/components/atoms/input/input-group.test.tsx +0 -362
  41. package/src/components/atoms/input/input.stories.tsx +0 -228
  42. package/src/components/atoms/input/input.test.tsx +0 -167
  43. package/src/components/atoms/ndstudio-footer/index.ts +0 -1
  44. package/src/components/atoms/pager-control/index.ts +0 -5
  45. package/src/components/atoms/pager-control/pager-control.stories.tsx +0 -207
  46. package/src/components/atoms/pager-control/pager-control.test.tsx +0 -130
  47. package/src/components/atoms/popover/index.ts +0 -30
  48. package/src/components/atoms/popover/popover.stories.tsx +0 -531
  49. package/src/components/atoms/popover/popover.test.tsx +0 -486
  50. package/src/components/atoms/select/index.ts +0 -18
  51. package/src/components/atoms/select/select.stories.tsx +0 -455
  52. package/src/components/atoms/tooltip/index.ts +0 -24
  53. package/src/components/atoms/tooltip/tooltip.stories.tsx +0 -348
  54. package/src/components/atoms/tooltip/tooltip.test.tsx +0 -363
  55. package/src/components/dev-tools/dev-toolbar/dev-toolbar.stories.tsx +0 -73
  56. package/src/components/dev-tools/dev-toolbar/index.ts +0 -1
  57. package/src/components/dev-tools/grid-overlay/index.ts +0 -1
  58. package/src/components/dev-tools/index.ts +0 -2
  59. package/src/components/foundation/typography/typography.stories.tsx +0 -401
  60. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-default-vertical-chromium-darwin.png +0 -0
  61. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-default-vertical-chromium-linux.png +0 -0
  62. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-horizontal-chromium-darwin.png +0 -0
  63. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-horizontal-chromium-linux.png +0 -0
  64. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-minimal-chromium-darwin.png +0 -0
  65. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-minimal-chromium-linux.png +0 -0
  66. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-actions-chromium-darwin.png +0 -0
  67. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-actions-chromium-linux.png +0 -0
  68. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-eyebrow-chromium-darwin.png +0 -0
  69. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-eyebrow-chromium-linux.png +0 -0
  70. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-image-chromium-darwin.png +0 -0
  71. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-image-chromium-linux.png +0 -0
  72. package/src/components/organisms/card/card.stories.tsx +0 -293
  73. package/src/components/organisms/card/card.test.tsx +0 -247
  74. package/src/components/organisms/card/card.visual.test.tsx +0 -197
  75. package/src/components/organisms/card/index.ts +0 -26
  76. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-active-link-chromium-darwin.png +0 -0
  77. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-active-link-chromium-linux.png +0 -0
  78. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-brand-only-chromium-darwin.png +0 -0
  79. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-brand-only-chromium-linux.png +0 -0
  80. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-default-chromium-darwin.png +0 -0
  81. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-default-chromium-linux.png +0 -0
  82. package/src/components/organisms/navbar/index.ts +0 -18
  83. package/src/components/organisms/navbar/navbar.stories.tsx +0 -313
  84. package/src/components/organisms/navbar/navbar.test.tsx +0 -190
  85. package/src/components/organisms/navbar/navbar.visual.test.tsx +0 -85
  86. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-icon-chromium-darwin.png +0 -0
  87. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-icon-chromium-linux.png +0 -0
  88. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-text-chromium-darwin.png +0 -0
  89. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-text-chromium-linux.png +0 -0
  90. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-default-chromium-darwin.png +0 -0
  91. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-default-chromium-linux.png +0 -0
  92. package/src/components/organisms/us-gov-banner/index.ts +0 -5
  93. package/src/components/organisms/us-gov-banner/us-gov-banner.stories.tsx +0 -35
  94. package/src/components/organisms/us-gov-banner/us-gov-banner.test.tsx +0 -107
  95. package/src/components/organisms/us-gov-banner/us-gov-banner.visual.test.tsx +0 -46
  96. package/src/components/sections/banner/banner.stories.tsx +0 -150
  97. package/src/components/sections/banner/banner.test.tsx +0 -185
  98. package/src/components/sections/banner/index.ts +0 -2
  99. package/src/components/sections/card-grid/card-grid.stories.tsx +0 -351
  100. package/src/components/sections/card-grid/index.ts +0 -1
  101. package/src/components/sections/faq-section/faq-section.stories.tsx +0 -453
  102. package/src/components/sections/faq-section/index.ts +0 -2
  103. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-desktop-chromium-darwin.png +0 -0
  104. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-desktop-chromium-linux.png +0 -0
  105. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-mobile-chromium-darwin.png +0 -0
  106. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-mobile-chromium-linux.png +0 -0
  107. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-tablet-chromium-darwin.png +0 -0
  108. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-tablet-chromium-linux.png +0 -0
  109. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-desktop-chromium-darwin.png +0 -0
  110. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-desktop-chromium-linux.png +0 -0
  111. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-mobile-chromium-darwin.png +0 -0
  112. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-mobile-chromium-linux.png +0 -0
  113. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-tablet-chromium-darwin.png +0 -0
  114. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-tablet-chromium-linux.png +0 -0
  115. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-desktop-chromium-darwin.png +0 -0
  116. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-desktop-chromium-linux.png +0 -0
  117. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-mobile-chromium-darwin.png +0 -0
  118. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-mobile-chromium-linux.png +0 -0
  119. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-tablet-chromium-darwin.png +0 -0
  120. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-tablet-chromium-linux.png +0 -0
  121. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-custom-class-chromium-darwin.png +0 -0
  122. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-custom-class-chromium-linux.png +0 -0
  123. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-default-chromium-linux.png +0 -0
  124. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-long-title-chromium-darwin.png +0 -0
  125. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-long-title-chromium-linux.png +0 -0
  126. package/src/components/sections/hero/hero.stories.tsx +0 -397
  127. package/src/components/sections/hero/hero.test.tsx +0 -138
  128. package/src/components/sections/hero/hero.visual.test.tsx +0 -140
  129. package/src/components/sections/hero/index.ts +0 -23
  130. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-h3-heading-chromium-darwin.png +0 -0
  131. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-h3-heading-chromium-linux.png +0 -0
  132. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-paragraphs-chromium-darwin.png +0 -0
  133. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-paragraphs-chromium-linux.png +0 -0
  134. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-sections-chromium-darwin.png +0 -0
  135. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-sections-chromium-linux.png +0 -0
  136. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-single-section-chromium-darwin.png +0 -0
  137. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-single-section-chromium-linux.png +0 -0
  138. package/src/components/sections/prose/index.ts +0 -6
  139. package/src/components/sections/prose/prose.stories.tsx +0 -144
  140. package/src/components/sections/prose/prose.test.tsx +0 -178
  141. package/src/components/sections/prose/prose.visual.test.tsx +0 -105
  142. package/src/components/sections/quote-block/index.ts +0 -5
  143. package/src/components/sections/river/index.ts +0 -1
  144. package/src/components/sections/river/river.stories.tsx +0 -237
  145. package/src/components/sections/river/river.test.tsx +0 -268
  146. package/src/components/sections/tout/index.ts +0 -1
  147. package/src/components/sections/tout/tout.stories.tsx +0 -171
  148. package/src/components/sections/tout/tout.test.tsx +0 -242
  149. package/src/components/sections/two-column-section/index.ts +0 -5
  150. package/src/components/sections/two-column-section/two-column-section.stories.tsx +0 -285
  151. package/src/components/shared/index.ts +0 -5
  152. package/src/index.ts +0 -293
  153. package/src/main.tsx +0 -13
  154. package/src/stories/grid-system.stories.tsx +0 -309
  155. package/src/stories/introduction.mdx +0 -128
  156. package/src/stories/theme-provider.stories.tsx +0 -349
  157. package/src/stories/token-showcase.stories.tsx +0 -73
  158. package/src/stories/token-showcase.tsx +0 -777
  159. package/src/styles.css +0 -14
  160. package/src/tests/token-resolution.test.tsx +0 -298
  161. package/src/theme/theme-provider.test.tsx +0 -270
@@ -1,486 +0,0 @@
1
- import { describe, expect, test, vi } from "vitest";
2
- import { page, userEvent } from "vitest/browser";
3
- import { render } from "vitest-browser-react";
4
- import { Button } from "../button";
5
- import {
6
- Popover,
7
- PopoverArrow,
8
- PopoverBackdrop,
9
- PopoverClose,
10
- PopoverDescription,
11
- PopoverParts,
12
- PopoverPopup,
13
- PopoverPortal,
14
- PopoverPositioner,
15
- PopoverTitle,
16
- PopoverTrigger,
17
- } from "./popover";
18
-
19
- describe("Popover", () => {
20
- describe("Accessibility", () => {
21
- test("trigger element is accessible", async () => {
22
- render(
23
- <Popover trigger={<Button>Open Popover</Button>} title="Title">
24
- Content
25
- </Popover>,
26
- );
27
- await expect
28
- .element(page.getByRole("button", { name: "Open Popover" }))
29
- .toBeInTheDocument();
30
- });
31
-
32
- test("popover has correct role when visible", async () => {
33
- render(
34
- <Popover
35
- trigger={<Button>Open Popover</Button>}
36
- title="Popover Title"
37
- defaultOpen
38
- >
39
- Popover content
40
- </Popover>,
41
- );
42
- // Popover uses dialog role
43
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
44
- });
45
-
46
- test("trigger element is focusable", async () => {
47
- render(
48
- <Popover trigger={<Button>Focus me</Button>} title="Title">
49
- Content
50
- </Popover>,
51
- );
52
- await userEvent.keyboard("{Tab}");
53
- await expect
54
- .element(page.getByRole("button", { name: "Focus me" }))
55
- .toHaveFocus();
56
- });
57
- });
58
-
59
- describe("Interactions", () => {
60
- test("shows popover on click", async () => {
61
- render(
62
- <Popover trigger={<Button>Click me</Button>} title="Click Popover">
63
- Click content
64
- </Popover>,
65
- );
66
-
67
- // Popover should not be visible initially
68
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
69
-
70
- // Click the trigger
71
- await page.getByRole("button", { name: "Click me" }).click();
72
-
73
- // Popover should now be visible
74
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
75
- });
76
-
77
- test("closes popover when clicking outside", async () => {
78
- render(
79
- <div>
80
- <Popover trigger={<Button>Click me</Button>} title="Test">
81
- Content
82
- </Popover>
83
- <Button>Outside</Button>
84
- </div>,
85
- );
86
-
87
- // Open popover
88
- await page.getByRole("button", { name: "Click me" }).click();
89
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
90
-
91
- // Click outside
92
- await page.getByRole("button", { name: "Outside" }).click();
93
-
94
- // Popover should be closed
95
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
96
- });
97
-
98
- test("closes popover on escape key", async () => {
99
- render(
100
- <Popover trigger={<Button>Click me</Button>} title="Test" defaultOpen>
101
- Content
102
- </Popover>,
103
- );
104
-
105
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
106
-
107
- // Press escape
108
- await userEvent.keyboard("{Escape}");
109
-
110
- // Popover should be closed
111
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
112
- });
113
- });
114
-
115
- describe("Controlled State", () => {
116
- test("respects controlled open state", async () => {
117
- render(
118
- <Popover
119
- trigger={<Button>Trigger</Button>}
120
- title="Controlled"
121
- open={true}
122
- >
123
- Controlled content
124
- </Popover>,
125
- );
126
-
127
- // Popover should be visible when open=true
128
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
129
- });
130
-
131
- test("respects controlled closed state", async () => {
132
- render(
133
- <Popover
134
- trigger={<Button>Trigger</Button>}
135
- title="Controlled"
136
- open={false}
137
- >
138
- Controlled content
139
- </Popover>,
140
- );
141
-
142
- // Popover should not be visible when open=false
143
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
144
-
145
- // Should not show on click when controlled
146
- await page.getByRole("button", { name: "Trigger" }).click();
147
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
148
- });
149
-
150
- test("calls onOpenChange callback", async () => {
151
- const handleOpenChange = vi.fn();
152
- render(
153
- <Popover
154
- trigger={<Button>Trigger</Button>}
155
- title="Callback"
156
- onOpenChange={handleOpenChange}
157
- >
158
- Content
159
- </Popover>,
160
- );
161
-
162
- // Click to trigger open
163
- await page.getByRole("button", { name: "Trigger" }).click();
164
-
165
- // Callback should have been called with true as first argument
166
- // (Base UI passes additional context as second argument)
167
- expect(handleOpenChange).toHaveBeenCalled();
168
- expect(handleOpenChange.mock.calls[0][0]).toBe(true);
169
- });
170
-
171
- test("defaultOpen shows popover initially", async () => {
172
- render(
173
- <Popover
174
- trigger={<Button>Trigger</Button>}
175
- title="Default Open"
176
- defaultOpen
177
- >
178
- Content
179
- </Popover>,
180
- );
181
-
182
- // Popover should be visible initially
183
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
184
- });
185
- });
186
-
187
- describe("Content", () => {
188
- test("displays title", async () => {
189
- render(
190
- <Popover
191
- trigger={<Button>Trigger</Button>}
192
- title="My Title"
193
- defaultOpen
194
- >
195
- Content
196
- </Popover>,
197
- );
198
-
199
- await expect.element(page.getByText("My Title")).toBeInTheDocument();
200
- });
201
-
202
- test("displays description content", async () => {
203
- render(
204
- <Popover trigger={<Button>Trigger</Button>} title="Title" defaultOpen>
205
- Description content here
206
- </Popover>,
207
- );
208
-
209
- await expect
210
- .element(page.getByText("Description content here"))
211
- .toBeInTheDocument();
212
- });
213
-
214
- test("displays content without title", async () => {
215
- render(
216
- <Popover trigger={<Button>Trigger</Button>} defaultOpen>
217
- <p data-testid="custom-content">Custom content</p>
218
- </Popover>,
219
- );
220
-
221
- await expect
222
- .element(page.getByTestId("custom-content"))
223
- .toBeInTheDocument();
224
- });
225
- });
226
-
227
- describe("Close Button", () => {
228
- test("shows close button when showClose is true", async () => {
229
- render(
230
- <Popover
231
- trigger={<Button>Trigger</Button>}
232
- title="With Close"
233
- showClose={true}
234
- defaultOpen
235
- >
236
- Content
237
- </Popover>,
238
- );
239
-
240
- await expect
241
- .element(page.getByRole("button", { name: "Close" }))
242
- .toBeInTheDocument();
243
- });
244
-
245
- test("hides close button by default", async () => {
246
- render(
247
- <Popover
248
- trigger={<Button>Trigger</Button>}
249
- title="No Close"
250
- defaultOpen
251
- >
252
- Content
253
- </Popover>,
254
- );
255
-
256
- await expect
257
- .element(page.getByRole("button", { name: "Close" }))
258
- .not.toBeInTheDocument();
259
- });
260
-
261
- test("closes popover when clicking close button", async () => {
262
- render(
263
- <Popover
264
- trigger={<Button>Trigger</Button>}
265
- title="Closeable"
266
- showClose={true}
267
- defaultOpen
268
- >
269
- Content
270
- </Popover>,
271
- );
272
-
273
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
274
-
275
- // Click the close button
276
- await page.getByRole("button", { name: "Close" }).click();
277
-
278
- // Popover should be closed
279
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
280
- });
281
- });
282
-
283
- describe("Arrow", () => {
284
- test("shows arrow by default", async () => {
285
- render(
286
- <Popover
287
- trigger={<Button>Trigger</Button>}
288
- title="With Arrow"
289
- defaultOpen
290
- >
291
- Content
292
- </Popover>,
293
- );
294
-
295
- const dialog = page.getByRole("dialog");
296
- await expect.element(dialog).toBeInTheDocument();
297
- });
298
-
299
- test("hides arrow when showArrow is false", async () => {
300
- render(
301
- <Popover
302
- trigger={<Button>Trigger</Button>}
303
- title="Without Arrow"
304
- showArrow={false}
305
- defaultOpen
306
- >
307
- Content
308
- </Popover>,
309
- );
310
-
311
- const dialog = page.getByRole("dialog");
312
- await expect.element(dialog).toBeInTheDocument();
313
- });
314
- });
315
-
316
- describe("Compound Components", () => {
317
- test("renders with compound component API", async () => {
318
- render(
319
- <PopoverParts defaultOpen>
320
- <PopoverTrigger>
321
- <Button>Compound trigger</Button>
322
- </PopoverTrigger>
323
- <PopoverPortal>
324
- <PopoverPositioner>
325
- <PopoverPopup>
326
- <PopoverArrow />
327
- <PopoverTitle>Compound Title</PopoverTitle>
328
- <PopoverDescription>Compound content</PopoverDescription>
329
- </PopoverPopup>
330
- </PopoverPositioner>
331
- </PopoverPortal>
332
- </PopoverParts>,
333
- );
334
-
335
- await expect
336
- .element(page.getByRole("button", { name: "Compound trigger" }))
337
- .toBeInTheDocument();
338
- await expect
339
- .element(page.getByText("Compound Title"))
340
- .toBeInTheDocument();
341
- await expect
342
- .element(page.getByText("Compound content"))
343
- .toBeInTheDocument();
344
- });
345
-
346
- test("backdrop renders correctly", async () => {
347
- render(
348
- <PopoverParts defaultOpen>
349
- <PopoverTrigger>
350
- <Button>With Backdrop</Button>
351
- </PopoverTrigger>
352
- <PopoverPortal>
353
- <PopoverBackdrop data-testid="backdrop" />
354
- <PopoverPositioner>
355
- <PopoverPopup>Content with backdrop</PopoverPopup>
356
- </PopoverPositioner>
357
- </PopoverPortal>
358
- </PopoverParts>,
359
- );
360
-
361
- await expect.element(page.getByTestId("backdrop")).toBeInTheDocument();
362
- await expect
363
- .element(page.getByText("Content with backdrop"))
364
- .toBeInTheDocument();
365
- });
366
-
367
- test("close button works with compound API", async () => {
368
- render(
369
- <PopoverParts defaultOpen>
370
- <PopoverTrigger>
371
- <Button>Trigger</Button>
372
- </PopoverTrigger>
373
- <PopoverPortal>
374
- <PopoverPositioner>
375
- <PopoverPopup>
376
- <PopoverClose>
377
- <span>X</span>
378
- </PopoverClose>
379
- Content
380
- </PopoverPopup>
381
- </PopoverPositioner>
382
- </PopoverPortal>
383
- </PopoverParts>,
384
- );
385
-
386
- await expect.element(page.getByRole("dialog")).toBeInTheDocument();
387
-
388
- // Click the close button
389
- await page.getByText("X").click();
390
-
391
- // Popover should be closed
392
- await expect.element(page.getByRole("dialog")).not.toBeInTheDocument();
393
- });
394
- });
395
-
396
- describe("Styles", () => {
397
- test("popover popup has light background", async () => {
398
- render(
399
- <Popover trigger={<Button>Trigger</Button>} title="Styled" defaultOpen>
400
- Content
401
- </Popover>,
402
- );
403
-
404
- const dialog = page.getByRole("dialog");
405
- await expect.element(dialog).toBeInTheDocument();
406
-
407
- const element = dialog.element();
408
- const styles = window.getComputedStyle(element);
409
-
410
- // Popover should have a non-transparent background
411
- expect(styles.backgroundColor).not.toBe("rgba(0, 0, 0, 0)");
412
- expect(styles.backgroundColor).not.toBe("transparent");
413
- });
414
-
415
- test("popover has border radius", async () => {
416
- render(
417
- <Popover trigger={<Button>Trigger</Button>} title="Styled" defaultOpen>
418
- Content
419
- </Popover>,
420
- );
421
-
422
- const dialog = page.getByRole("dialog");
423
- await expect.element(dialog).toBeInTheDocument();
424
-
425
- const element = dialog.element();
426
- const styles = window.getComputedStyle(element);
427
-
428
- // Should have border radius
429
- const borderRadius = parseFloat(styles.borderRadius);
430
- expect(borderRadius).toBeGreaterThan(0);
431
- });
432
-
433
- test("popover has shadow", async () => {
434
- render(
435
- <Popover trigger={<Button>Trigger</Button>} title="Styled" defaultOpen>
436
- Content
437
- </Popover>,
438
- );
439
-
440
- const dialog = page.getByRole("dialog");
441
- await expect.element(dialog).toBeInTheDocument();
442
-
443
- const element = dialog.element();
444
- const styles = window.getComputedStyle(element);
445
-
446
- // Should have a box shadow
447
- expect(styles.boxShadow).not.toBe("none");
448
- });
449
-
450
- test("popover has high z-index", async () => {
451
- render(
452
- <Popover trigger={<Button>Trigger</Button>} title="Styled" defaultOpen>
453
- Content
454
- </Popover>,
455
- );
456
-
457
- const dialog = page.getByRole("dialog");
458
- await expect.element(dialog).toBeInTheDocument();
459
-
460
- const element = dialog.element();
461
- const styles = window.getComputedStyle(element);
462
-
463
- // Should have z-index of 50 or higher
464
- const zIndex = parseInt(styles.zIndex, 10);
465
- expect(zIndex).toBeGreaterThanOrEqual(50);
466
- });
467
-
468
- test("popover has border", async () => {
469
- render(
470
- <Popover trigger={<Button>Trigger</Button>} title="Styled" defaultOpen>
471
- Content
472
- </Popover>,
473
- );
474
-
475
- const dialog = page.getByRole("dialog");
476
- await expect.element(dialog).toBeInTheDocument();
477
-
478
- const element = dialog.element();
479
- const styles = window.getComputedStyle(element);
480
-
481
- // Should have a border
482
- const borderWidth = parseFloat(styles.borderWidth);
483
- expect(borderWidth).toBeGreaterThan(0);
484
- });
485
- });
486
- });
@@ -1,18 +0,0 @@
1
- export {
2
- Select,
3
- SelectGroup,
4
- SelectGroupLabel,
5
- type SelectGroupLabelProps,
6
- type SelectGroupProps,
7
- SelectOption,
8
- type SelectOptionProps,
9
- SelectPopup,
10
- type SelectPopupProps,
11
- type SelectProps,
12
- SelectRoot,
13
- SelectTrigger,
14
- type SelectTriggerProps,
15
- selectOptionVariants,
16
- selectPopupVariants,
17
- selectTriggerVariants,
18
- } from "./select";