@nationaldesignstudio/react 0.5.2 → 0.5.3

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 (160) hide show
  1. package/package.json +10 -2
  2. package/src/App.css +0 -0
  3. package/src/App.tsx +0 -7
  4. package/src/assets/fonts/PPNeueMontreal-Variable.woff2 +0 -0
  5. package/src/assets/react.svg +0 -1
  6. package/src/components/atoms/accordion/accordion.stories.tsx +0 -228
  7. package/src/components/atoms/accordion/accordion.test.tsx +0 -231
  8. package/src/components/atoms/accordion/index.ts +0 -6
  9. package/src/components/atoms/background/background.test.tsx +0 -213
  10. package/src/components/atoms/background/index.ts +0 -22
  11. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-chromium-darwin.png +0 -0
  12. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-chromium-linux.png +0 -0
  13. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-chromium-darwin.png +0 -0
  14. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-chromium-linux.png +0 -0
  15. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-quiet-chromium-darwin.png +0 -0
  16. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-charcoal-outline-quiet-chromium-linux.png +0 -0
  17. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-disabled-chromium-darwin.png +0 -0
  18. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-disabled-chromium-linux.png +0 -0
  19. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-chromium-darwin.png +0 -0
  20. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-chromium-linux.png +0 -0
  21. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-chromium-darwin.png +0 -0
  22. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-chromium-linux.png +0 -0
  23. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-quiet-chromium-darwin.png +0 -0
  24. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-ivory-outline-quiet-chromium-linux.png +0 -0
  25. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-large-chromium-darwin.png +0 -0
  26. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-large-chromium-linux.png +0 -0
  27. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-medium-chromium-darwin.png +0 -0
  28. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-medium-chromium-linux.png +0 -0
  29. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-small-chromium-darwin.png +0 -0
  30. package/src/components/atoms/button/__screenshots__/button.visual.test.tsx/button-size-small-chromium-linux.png +0 -0
  31. package/src/components/atoms/button/button.stories.tsx +0 -289
  32. package/src/components/atoms/button/button.test.tsx +0 -419
  33. package/src/components/atoms/button/button.visual.test.tsx +0 -98
  34. package/src/components/atoms/button/icon-button.stories.tsx +0 -260
  35. package/src/components/atoms/button/icon-button.test.tsx +0 -186
  36. package/src/components/atoms/button/index.ts +0 -6
  37. package/src/components/atoms/input/index.ts +0 -17
  38. package/src/components/atoms/input/input-group.stories.tsx +0 -646
  39. package/src/components/atoms/input/input-group.test.tsx +0 -362
  40. package/src/components/atoms/input/input.stories.tsx +0 -228
  41. package/src/components/atoms/input/input.test.tsx +0 -167
  42. package/src/components/atoms/ndstudio-footer/index.ts +0 -1
  43. package/src/components/atoms/pager-control/index.ts +0 -5
  44. package/src/components/atoms/pager-control/pager-control.stories.tsx +0 -207
  45. package/src/components/atoms/pager-control/pager-control.test.tsx +0 -130
  46. package/src/components/atoms/popover/index.ts +0 -30
  47. package/src/components/atoms/popover/popover.stories.tsx +0 -531
  48. package/src/components/atoms/popover/popover.test.tsx +0 -486
  49. package/src/components/atoms/select/index.ts +0 -18
  50. package/src/components/atoms/select/select.stories.tsx +0 -455
  51. package/src/components/atoms/tooltip/index.ts +0 -24
  52. package/src/components/atoms/tooltip/tooltip.stories.tsx +0 -348
  53. package/src/components/atoms/tooltip/tooltip.test.tsx +0 -363
  54. package/src/components/dev-tools/dev-toolbar/dev-toolbar.stories.tsx +0 -73
  55. package/src/components/dev-tools/dev-toolbar/index.ts +0 -1
  56. package/src/components/dev-tools/grid-overlay/index.ts +0 -1
  57. package/src/components/dev-tools/index.ts +0 -2
  58. package/src/components/foundation/typography/typography.stories.tsx +0 -401
  59. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-default-vertical-chromium-darwin.png +0 -0
  60. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-default-vertical-chromium-linux.png +0 -0
  61. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-horizontal-chromium-darwin.png +0 -0
  62. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-horizontal-chromium-linux.png +0 -0
  63. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-minimal-chromium-darwin.png +0 -0
  64. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-minimal-chromium-linux.png +0 -0
  65. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-actions-chromium-darwin.png +0 -0
  66. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-actions-chromium-linux.png +0 -0
  67. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-eyebrow-chromium-darwin.png +0 -0
  68. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-eyebrow-chromium-linux.png +0 -0
  69. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-image-chromium-darwin.png +0 -0
  70. package/src/components/organisms/card/__screenshots__/card.visual.test.tsx/card-without-image-chromium-linux.png +0 -0
  71. package/src/components/organisms/card/card.stories.tsx +0 -293
  72. package/src/components/organisms/card/card.test.tsx +0 -247
  73. package/src/components/organisms/card/card.visual.test.tsx +0 -197
  74. package/src/components/organisms/card/index.ts +0 -26
  75. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-active-link-chromium-darwin.png +0 -0
  76. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-active-link-chromium-linux.png +0 -0
  77. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-brand-only-chromium-darwin.png +0 -0
  78. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-brand-only-chromium-linux.png +0 -0
  79. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-default-chromium-darwin.png +0 -0
  80. package/src/components/organisms/navbar/__screenshots__/navbar.visual.test.tsx/navbar-default-chromium-linux.png +0 -0
  81. package/src/components/organisms/navbar/index.ts +0 -18
  82. package/src/components/organisms/navbar/navbar.stories.tsx +0 -313
  83. package/src/components/organisms/navbar/navbar.test.tsx +0 -190
  84. package/src/components/organisms/navbar/navbar.visual.test.tsx +0 -85
  85. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-icon-chromium-darwin.png +0 -0
  86. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-icon-chromium-linux.png +0 -0
  87. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-text-chromium-darwin.png +0 -0
  88. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-custom-text-chromium-linux.png +0 -0
  89. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-default-chromium-darwin.png +0 -0
  90. package/src/components/organisms/us-gov-banner/__screenshots__/us-gov-banner.visual.test.tsx/us-gov-banner-default-chromium-linux.png +0 -0
  91. package/src/components/organisms/us-gov-banner/index.ts +0 -5
  92. package/src/components/organisms/us-gov-banner/us-gov-banner.stories.tsx +0 -35
  93. package/src/components/organisms/us-gov-banner/us-gov-banner.test.tsx +0 -107
  94. package/src/components/organisms/us-gov-banner/us-gov-banner.visual.test.tsx +0 -46
  95. package/src/components/sections/banner/banner.stories.tsx +0 -150
  96. package/src/components/sections/banner/banner.test.tsx +0 -185
  97. package/src/components/sections/banner/index.ts +0 -2
  98. package/src/components/sections/card-grid/card-grid.stories.tsx +0 -351
  99. package/src/components/sections/card-grid/index.ts +0 -1
  100. package/src/components/sections/faq-section/faq-section.stories.tsx +0 -453
  101. package/src/components/sections/faq-section/index.ts +0 -2
  102. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-desktop-chromium-darwin.png +0 -0
  103. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-desktop-chromium-linux.png +0 -0
  104. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-mobile-chromium-darwin.png +0 -0
  105. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-mobile-chromium-linux.png +0 -0
  106. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-tablet-chromium-darwin.png +0 -0
  107. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a1-tablet-chromium-linux.png +0 -0
  108. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-desktop-chromium-darwin.png +0 -0
  109. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-desktop-chromium-linux.png +0 -0
  110. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-mobile-chromium-darwin.png +0 -0
  111. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-mobile-chromium-linux.png +0 -0
  112. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-tablet-chromium-darwin.png +0 -0
  113. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a2-tablet-chromium-linux.png +0 -0
  114. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-desktop-chromium-darwin.png +0 -0
  115. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-desktop-chromium-linux.png +0 -0
  116. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-mobile-chromium-darwin.png +0 -0
  117. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-mobile-chromium-linux.png +0 -0
  118. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-tablet-chromium-darwin.png +0 -0
  119. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-a3-tablet-chromium-linux.png +0 -0
  120. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-custom-class-chromium-darwin.png +0 -0
  121. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-custom-class-chromium-linux.png +0 -0
  122. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-default-chromium-linux.png +0 -0
  123. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-long-title-chromium-darwin.png +0 -0
  124. package/src/components/sections/hero/__screenshots__/hero.visual.test.tsx/hero-long-title-chromium-linux.png +0 -0
  125. package/src/components/sections/hero/hero.stories.tsx +0 -397
  126. package/src/components/sections/hero/hero.test.tsx +0 -138
  127. package/src/components/sections/hero/hero.visual.test.tsx +0 -140
  128. package/src/components/sections/hero/index.ts +0 -23
  129. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-h3-heading-chromium-darwin.png +0 -0
  130. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-h3-heading-chromium-linux.png +0 -0
  131. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-paragraphs-chromium-darwin.png +0 -0
  132. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-paragraphs-chromium-linux.png +0 -0
  133. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-sections-chromium-darwin.png +0 -0
  134. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-multiple-sections-chromium-linux.png +0 -0
  135. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-single-section-chromium-darwin.png +0 -0
  136. package/src/components/sections/prose/__screenshots__/prose.visual.test.tsx/prose-single-section-chromium-linux.png +0 -0
  137. package/src/components/sections/prose/index.ts +0 -6
  138. package/src/components/sections/prose/prose.stories.tsx +0 -144
  139. package/src/components/sections/prose/prose.test.tsx +0 -178
  140. package/src/components/sections/prose/prose.visual.test.tsx +0 -105
  141. package/src/components/sections/quote-block/index.ts +0 -5
  142. package/src/components/sections/river/index.ts +0 -1
  143. package/src/components/sections/river/river.stories.tsx +0 -237
  144. package/src/components/sections/river/river.test.tsx +0 -268
  145. package/src/components/sections/tout/index.ts +0 -1
  146. package/src/components/sections/tout/tout.stories.tsx +0 -171
  147. package/src/components/sections/tout/tout.test.tsx +0 -242
  148. package/src/components/sections/two-column-section/index.ts +0 -5
  149. package/src/components/sections/two-column-section/two-column-section.stories.tsx +0 -285
  150. package/src/components/shared/index.ts +0 -5
  151. package/src/index.ts +0 -293
  152. package/src/main.tsx +0 -13
  153. package/src/stories/grid-system.stories.tsx +0 -309
  154. package/src/stories/introduction.mdx +0 -128
  155. package/src/stories/theme-provider.stories.tsx +0 -349
  156. package/src/stories/token-showcase.stories.tsx +0 -73
  157. package/src/stories/token-showcase.tsx +0 -777
  158. package/src/styles.css +0 -14
  159. package/src/tests/token-resolution.test.tsx +0 -298
  160. package/src/theme/theme-provider.test.tsx +0 -270
@@ -1,293 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/react-vite";
2
- import { Button } from "../../atoms/button";
3
- import {
4
- Card,
5
- CardActions,
6
- CardBody,
7
- CardContent,
8
- CardDescription,
9
- CardEyebrow,
10
- CardImage,
11
- CardTitle,
12
- } from ".";
13
-
14
- const meta: Meta<typeof Card> = {
15
- title: "Organisms/Card",
16
- component: Card,
17
- parameters: {
18
- layout: "centered",
19
- },
20
- } as Meta<typeof Card>;
21
-
22
- export default meta;
23
- type Story = StoryObj<typeof Card>;
24
-
25
- // =============================================================================
26
- // Default
27
- // =============================================================================
28
-
29
- export const Default: Story = {
30
- render: () => (
31
- <div className="w-[418px]">
32
- <Card>
33
- <CardImage />
34
- <CardContent>
35
- <CardBody>
36
- <CardEyebrow>Optional Eyebrow</CardEyebrow>
37
- <div className="flex flex-col gap-6">
38
- <CardTitle>Card Title</CardTitle>
39
- <CardDescription>
40
- Use cards when citizens need to scan items at a glance, either
41
- to jump to a more detailed page or absorb short information.
42
- </CardDescription>
43
- </div>
44
- </CardBody>
45
- <CardActions>
46
- <Button size="md" variant="primary">
47
- Primary
48
- </Button>
49
- <Button size="md" variant="primary-outline">
50
- Secondary
51
- </Button>
52
- </CardActions>
53
- </CardContent>
54
- </Card>
55
- </div>
56
- ),
57
- };
58
-
59
- // =============================================================================
60
- // Layouts
61
- // =============================================================================
62
-
63
- export const Vertical: Story = {
64
- render: () => (
65
- <div className="w-[418px]">
66
- <Card layout="vertical">
67
- <CardImage />
68
- <CardContent>
69
- <CardBody>
70
- <CardEyebrow>Optional Eyebrow</CardEyebrow>
71
- <div className="flex flex-col gap-6">
72
- <CardTitle>Card Title</CardTitle>
73
- <CardDescription>
74
- Use cards when citizens need to scan items at a glance, either
75
- to jump to a more detailed page or absorb short information.
76
- </CardDescription>
77
- </div>
78
- </CardBody>
79
- <CardActions>
80
- <Button size="md" variant="primary">
81
- Primary
82
- </Button>
83
- <Button size="md" variant="primary-outline">
84
- Secondary
85
- </Button>
86
- </CardActions>
87
- </CardContent>
88
- </Card>
89
- </div>
90
- ),
91
- };
92
-
93
- export const Horizontal: Story = {
94
- render: () => (
95
- <div className="w-[700px]">
96
- <Card layout="horizontal">
97
- <CardImage />
98
- <CardContent>
99
- <CardBody>
100
- <CardEyebrow>Eyebrow</CardEyebrow>
101
- <div className="flex flex-col gap-8">
102
- <CardTitle>
103
- Cards can support multi line headings easily.
104
- </CardTitle>
105
- <CardDescription>
106
- Use cards when citizens need to scan items at a glance, either
107
- to jump to a more detailed page or absorb short information.
108
- </CardDescription>
109
- </div>
110
- </CardBody>
111
- <CardActions>
112
- <Button size="sm" variant="primary">
113
- Primary
114
- </Button>
115
- <Button size="sm" variant="primary-outline">
116
- Secondary
117
- </Button>
118
- </CardActions>
119
- </CardContent>
120
- </Card>
121
- </div>
122
- ),
123
- };
124
-
125
- // =============================================================================
126
- // Variations
127
- // =============================================================================
128
-
129
- export const WithoutImage: Story = {
130
- render: () => (
131
- <div className="w-[418px]">
132
- <Card>
133
- <CardContent>
134
- <CardBody>
135
- <CardEyebrow>Category</CardEyebrow>
136
- <div className="flex flex-col gap-6">
137
- <CardTitle>Card Without Image</CardTitle>
138
- <CardDescription>
139
- Cards can be used without images for text-focused content.
140
- </CardDescription>
141
- </div>
142
- </CardBody>
143
- <CardActions>
144
- <Button size="md" variant="primary">
145
- Learn More
146
- </Button>
147
- </CardActions>
148
- </CardContent>
149
- </Card>
150
- </div>
151
- ),
152
- };
153
-
154
- export const WithoutEyebrow: Story = {
155
- render: () => (
156
- <div className="w-[418px]">
157
- <Card>
158
- <CardImage />
159
- <CardContent>
160
- <CardBody>
161
- <div className="flex flex-col gap-6">
162
- <CardTitle>Card Title</CardTitle>
163
- <CardDescription>
164
- The eyebrow is optional and can be omitted when not needed.
165
- </CardDescription>
166
- </div>
167
- </CardBody>
168
- <CardActions>
169
- <Button size="md" variant="primary">
170
- Primary
171
- </Button>
172
- </CardActions>
173
- </CardContent>
174
- </Card>
175
- </div>
176
- ),
177
- };
178
-
179
- export const WithoutActions: Story = {
180
- render: () => (
181
- <div className="w-[418px]">
182
- <Card>
183
- <CardImage />
184
- <CardContent>
185
- <CardBody>
186
- <CardEyebrow>Information</CardEyebrow>
187
- <div className="flex flex-col gap-6">
188
- <CardTitle>Informational Card</CardTitle>
189
- <CardDescription>
190
- Cards without actions can be used for purely informational
191
- content that doesn't require user interaction.
192
- </CardDescription>
193
- </div>
194
- </CardBody>
195
- </CardContent>
196
- </Card>
197
- </div>
198
- ),
199
- };
200
-
201
- export const Minimal: Story = {
202
- render: () => (
203
- <div className="w-[418px]">
204
- <Card>
205
- <CardContent>
206
- <CardBody>
207
- <CardTitle>Minimal Card</CardTitle>
208
- <CardDescription>
209
- A minimal card with just title and description.
210
- </CardDescription>
211
- </CardBody>
212
- </CardContent>
213
- </Card>
214
- </div>
215
- ),
216
- };
217
-
218
- // =============================================================================
219
- // Grid Example
220
- // =============================================================================
221
-
222
- export const CardGrid: Story = {
223
- render: () => (
224
- <div className="grid max-w-[900px] grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
225
- {[1, 2, 3].map((i) => (
226
- <Card key={i}>
227
- <CardImage />
228
- <CardContent>
229
- <CardBody>
230
- <CardEyebrow>Category {i}</CardEyebrow>
231
- <div className="flex flex-col gap-6">
232
- <CardTitle>Card Title {i}</CardTitle>
233
- <CardDescription>
234
- Brief description of the card content goes here.
235
- </CardDescription>
236
- </div>
237
- </CardBody>
238
- <CardActions>
239
- <Button size="sm" variant="primary">
240
- Action
241
- </Button>
242
- </CardActions>
243
- </CardContent>
244
- </Card>
245
- ))}
246
- </div>
247
- ),
248
- parameters: {
249
- layout: "padded",
250
- },
251
- };
252
-
253
- // =============================================================================
254
- // Playground
255
- // =============================================================================
256
-
257
- export const Playground: Story = {
258
- render: (args) => (
259
- <div className="w-[418px]">
260
- <Card {...args}>
261
- <CardImage />
262
- <CardContent>
263
- <CardBody>
264
- <CardEyebrow>Eyebrow</CardEyebrow>
265
- <div className="flex flex-col gap-6">
266
- <CardTitle>Card Title</CardTitle>
267
- <CardDescription>
268
- Use cards when citizens need to scan items at a glance.
269
- </CardDescription>
270
- </div>
271
- </CardBody>
272
- <CardActions>
273
- <Button size="md" variant="primary">
274
- Primary
275
- </Button>
276
- <Button size="md" variant="primary-outline">
277
- Secondary
278
- </Button>
279
- </CardActions>
280
- </CardContent>
281
- </Card>
282
- </div>
283
- ),
284
- };
285
- Playground.argTypes = {
286
- layout: {
287
- control: { type: "radio" },
288
- options: ["vertical", "horizontal"],
289
- },
290
- };
291
- Playground.args = {
292
- layout: "vertical",
293
- };
@@ -1,247 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { page } from "vitest/browser";
3
- import { render } from "vitest-browser-react";
4
- import { Button } from "../../atoms/button";
5
- import {
6
- Card,
7
- CardActions,
8
- CardBody,
9
- CardContent,
10
- CardDescription,
11
- CardEyebrow,
12
- CardImage,
13
- CardTitle,
14
- } from "./card";
15
-
16
- describe("Card", () => {
17
- describe("Accessibility", () => {
18
- test("CardTitle renders as h3 heading by default", async () => {
19
- render(
20
- <Card>
21
- <CardContent>
22
- <CardBody>
23
- <CardTitle>Test Title</CardTitle>
24
- </CardBody>
25
- </CardContent>
26
- </Card>,
27
- );
28
-
29
- await expect
30
- .element(page.getByRole("heading", { level: 3, name: "Test Title" }))
31
- .toBeInTheDocument();
32
- });
33
-
34
- test("CardTitle supports as prop to change heading level", async () => {
35
- render(
36
- <Card>
37
- <CardContent>
38
- <CardBody>
39
- <CardTitle as="h2">H2 Title</CardTitle>
40
- </CardBody>
41
- </CardContent>
42
- </Card>,
43
- );
44
-
45
- await expect
46
- .element(page.getByRole("heading", { level: 2, name: "H2 Title" }))
47
- .toBeInTheDocument();
48
- });
49
-
50
- test("CardImage renders img with alt text when src provided", async () => {
51
- render(
52
- <Card>
53
- <CardImage
54
- src="https://example.com/image.jpg"
55
- alt="Test image description"
56
- />
57
- <CardContent>
58
- <CardBody>
59
- <CardTitle>Card with Image</CardTitle>
60
- </CardBody>
61
- </CardContent>
62
- </Card>,
63
- );
64
-
65
- await expect
66
- .element(page.getByRole("img", { name: "Test image description" }))
67
- .toBeInTheDocument();
68
- });
69
-
70
- test("CardImage does not render img when no src provided", async () => {
71
- render(
72
- <Card>
73
- <CardImage />
74
- <CardContent>
75
- <CardBody>
76
- <CardTitle>Card without Image Source</CardTitle>
77
- </CardBody>
78
- </CardContent>
79
- </Card>,
80
- );
81
-
82
- // Should not have an img element
83
- const images = page.getByRole("img");
84
- await expect.element(images).not.toBeInTheDocument();
85
- });
86
-
87
- // Skip: Base UI Button has React context issues in vitest-browser-react
88
- test.skip("buttons in CardActions are accessible", async () => {
89
- render(
90
- <Card>
91
- <CardContent>
92
- <CardBody>
93
- <CardTitle>Card with Actions</CardTitle>
94
- </CardBody>
95
- <CardActions>
96
- <Button>Primary Action</Button>
97
- <Button variant="outline">Secondary Action</Button>
98
- </CardActions>
99
- </CardContent>
100
- </Card>,
101
- );
102
-
103
- await expect
104
- .element(page.getByRole("button", { name: "Primary Action" }))
105
- .toBeInTheDocument();
106
- await expect
107
- .element(page.getByRole("button", { name: "Secondary Action" }))
108
- .toBeInTheDocument();
109
- });
110
-
111
- test("Card structure is semantically correct", async () => {
112
- render(
113
- <Card data-testid="card">
114
- <CardContent>
115
- <CardBody>
116
- <CardEyebrow>Eyebrow Text</CardEyebrow>
117
- <CardTitle>Card Title</CardTitle>
118
- <CardDescription>Card description text</CardDescription>
119
- </CardBody>
120
- </CardContent>
121
- </Card>,
122
- );
123
-
124
- // Verify all text content is present and readable
125
- await expect.element(page.getByText("Eyebrow Text")).toBeInTheDocument();
126
- await expect.element(page.getByText("Card Title")).toBeInTheDocument();
127
- await expect
128
- .element(page.getByText("Card description text"))
129
- .toBeInTheDocument();
130
- });
131
- });
132
-
133
- describe("Layout Variants", () => {
134
- test("vertical layout applies correct classes", async () => {
135
- render(
136
- <Card layout="vertical" data-testid="card">
137
- <CardContent>
138
- <CardBody>
139
- <CardTitle>Vertical Card</CardTitle>
140
- </CardBody>
141
- </CardContent>
142
- </Card>,
143
- );
144
-
145
- const card = page.getByTestId("card");
146
- await expect.element(card).toHaveClass(/flex-col/);
147
- });
148
-
149
- test("horizontal layout applies correct classes", async () => {
150
- render(
151
- <Card layout="horizontal" data-testid="card">
152
- <CardContent>
153
- <CardBody>
154
- <CardTitle>Horizontal Card</CardTitle>
155
- </CardBody>
156
- </CardContent>
157
- </Card>,
158
- );
159
-
160
- const card = page.getByTestId("card");
161
- await expect.element(card).toHaveClass(/flex-row/);
162
- });
163
-
164
- test("default layout is vertical", async () => {
165
- render(
166
- <Card data-testid="card">
167
- <CardContent>
168
- <CardBody>
169
- <CardTitle>Default Card</CardTitle>
170
- </CardBody>
171
- </CardContent>
172
- </Card>,
173
- );
174
-
175
- const card = page.getByTestId("card");
176
- await expect.element(card).toHaveClass(/flex-col/);
177
- });
178
- });
179
-
180
- describe("Component Composition", () => {
181
- // Skip: Base UI Button has React context issues in vitest-browser-react
182
- test.skip("renders complete card with all sub-components", async () => {
183
- render(
184
- <Card>
185
- <CardImage src="https://example.com/test.jpg" alt="Test" />
186
- <CardContent>
187
- <CardBody>
188
- <CardEyebrow>Category</CardEyebrow>
189
- <CardTitle>Full Card Example</CardTitle>
190
- <CardDescription>
191
- This is a complete card with all components.
192
- </CardDescription>
193
- </CardBody>
194
- <CardActions>
195
- <Button>Action</Button>
196
- </CardActions>
197
- </CardContent>
198
- </Card>,
199
- );
200
-
201
- await expect
202
- .element(page.getByRole("img", { name: "Test" }))
203
- .toBeInTheDocument();
204
- await expect.element(page.getByText("Category")).toBeInTheDocument();
205
- await expect
206
- .element(page.getByRole("heading", { name: "Full Card Example" }))
207
- .toBeInTheDocument();
208
- await expect
209
- .element(page.getByText("This is a complete card with all components."))
210
- .toBeInTheDocument();
211
- await expect
212
- .element(page.getByRole("button", { name: "Action" }))
213
- .toBeInTheDocument();
214
- });
215
-
216
- test("renders minimal card with only required components", async () => {
217
- render(
218
- <Card>
219
- <CardContent>
220
- <CardBody>
221
- <CardTitle>Minimal</CardTitle>
222
- </CardBody>
223
- </CardContent>
224
- </Card>,
225
- );
226
-
227
- await expect
228
- .element(page.getByRole("heading", { name: "Minimal" }))
229
- .toBeInTheDocument();
230
- });
231
-
232
- test("supports custom className on Card", async () => {
233
- render(
234
- <Card className="custom-class" data-testid="card">
235
- <CardContent>
236
- <CardBody>
237
- <CardTitle>Custom Card</CardTitle>
238
- </CardBody>
239
- </CardContent>
240
- </Card>,
241
- );
242
-
243
- const card = page.getByTestId("card");
244
- await expect.element(card).toHaveClass(/custom-class/);
245
- });
246
- });
247
- });