@mdxui/zero 6.0.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,321 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ /**
4
+ * Visual Regression Tests for @mdxui/zero components
5
+ *
6
+ * These tests ensure our Zero email components match the original
7
+ * Mail-0/Zero design by comparing screenshots pixel-by-pixel.
8
+ *
9
+ * Run: pnpm test:visual
10
+ * Update baselines: pnpm test:visual --update-snapshots
11
+ *
12
+ * Storybook URLs follow the pattern:
13
+ * /iframe.html?id=<story-title>--<story-name>&viewMode=story
14
+ */
15
+
16
+ test.describe('Mail List Components', () => {
17
+ test('MailList - default view', async ({ page }) => {
18
+ await page.goto('/iframe.html?id=zero-mail-maillist--default&viewMode=story')
19
+ await page.waitForLoadState('networkidle')
20
+
21
+ // Wait for content to render
22
+ await page.waitForSelector('[data-slot="mail-list"]')
23
+
24
+ await expect(page).toHaveScreenshot('mail-list-default.png', {
25
+ fullPage: true,
26
+ })
27
+ })
28
+
29
+ test('MailList - compact mode', async ({ page }) => {
30
+ await page.goto('/iframe.html?id=zero-mail-maillist--compact&viewMode=story')
31
+ await page.waitForLoadState('networkidle')
32
+ await page.waitForSelector('[data-slot="mail-list"]')
33
+
34
+ await expect(page).toHaveScreenshot('mail-list-compact.png', {
35
+ fullPage: true,
36
+ })
37
+ })
38
+
39
+ test('MailList - multi-select mode', async ({ page }) => {
40
+ await page.goto('/iframe.html?id=zero-mail-maillist--multi-select&viewMode=story')
41
+ await page.waitForLoadState('networkidle')
42
+ await page.waitForSelector('[data-slot="mail-list"]')
43
+
44
+ await expect(page).toHaveScreenshot('mail-list-multi-select.png', {
45
+ fullPage: true,
46
+ })
47
+ })
48
+
49
+ test('MailList - empty state', async ({ page }) => {
50
+ await page.goto('/iframe.html?id=zero-mail-maillist--empty&viewMode=story')
51
+ await page.waitForLoadState('networkidle')
52
+ await page.waitForSelector('[data-slot="mail-list-empty"]')
53
+
54
+ await expect(page).toHaveScreenshot('mail-list-empty.png', {
55
+ fullPage: true,
56
+ })
57
+ })
58
+
59
+ test('MailList - loading skeleton', async ({ page }) => {
60
+ await page.goto('/iframe.html?id=zero-mail-maillist--loading&viewMode=story')
61
+ await page.waitForLoadState('networkidle')
62
+ await page.waitForSelector('[data-slot="mail-skeleton"]')
63
+
64
+ await expect(page).toHaveScreenshot('mail-list-loading.png', {
65
+ fullPage: true,
66
+ })
67
+ })
68
+
69
+ test('MailItem - single item', async ({ page }) => {
70
+ await page.goto('/iframe.html?id=zero-mail-maillist--single-item&viewMode=story')
71
+ await page.waitForLoadState('networkidle')
72
+ await page.waitForSelector('[data-slot="mail-item"]')
73
+
74
+ await expect(page).toHaveScreenshot('mail-item-single.png', {
75
+ fullPage: true,
76
+ })
77
+ })
78
+ })
79
+
80
+ test.describe('Thread Display Components', () => {
81
+ test('ThreadDisplay - full thread', async ({ page }) => {
82
+ await page.goto('/iframe.html?id=zero-mail-threaddisplay--default&viewMode=story')
83
+ await page.waitForLoadState('networkidle')
84
+ await page.waitForSelector('[data-slot="thread-display"]')
85
+
86
+ await expect(page).toHaveScreenshot('thread-display-default.png', {
87
+ fullPage: true,
88
+ })
89
+ })
90
+
91
+ test('ThreadDisplay - no navigation', async ({ page }) => {
92
+ await page.goto('/iframe.html?id=zero-mail-threaddisplay--no-navigation&viewMode=story')
93
+ await page.waitForLoadState('networkidle')
94
+ await page.waitForSelector('[data-slot="thread-display"]')
95
+
96
+ await expect(page).toHaveScreenshot('thread-display-no-nav.png', {
97
+ fullPage: true,
98
+ })
99
+ })
100
+
101
+ test('MessageView - expanded', async ({ page }) => {
102
+ await page.goto('/iframe.html?id=zero-mail-threaddisplay--single-message-view&viewMode=story')
103
+ await page.waitForLoadState('networkidle')
104
+ await page.waitForSelector('[data-slot="message-view"]')
105
+
106
+ await expect(page).toHaveScreenshot('message-view-expanded.png', {
107
+ fullPage: true,
108
+ })
109
+ })
110
+
111
+ test('MessageView - collapsed', async ({ page }) => {
112
+ await page.goto('/iframe.html?id=zero-mail-threaddisplay--collapsed-message-view&viewMode=story')
113
+ await page.waitForLoadState('networkidle')
114
+ await page.waitForSelector('[data-slot="message-view"]')
115
+
116
+ await expect(page).toHaveScreenshot('message-view-collapsed.png', {
117
+ fullPage: true,
118
+ })
119
+ })
120
+ })
121
+
122
+ test.describe('Sidebar Components', () => {
123
+ test('MailSidebar - full view', async ({ page }) => {
124
+ await page.goto('/iframe.html?id=zero-dashboard-mailsidebar--default&viewMode=story')
125
+ await page.waitForLoadState('networkidle')
126
+ await page.waitForSelector('[data-slot="mail-sidebar"]')
127
+
128
+ await expect(page).toHaveScreenshot('mail-sidebar-default.png', {
129
+ fullPage: true,
130
+ })
131
+ })
132
+
133
+ test('MailSidebar - collapsed', async ({ page }) => {
134
+ await page.goto('/iframe.html?id=zero-dashboard-mailsidebar--collapsed&viewMode=story')
135
+ await page.waitForLoadState('networkidle')
136
+ await page.waitForSelector('[data-slot="mail-sidebar"]')
137
+
138
+ await expect(page).toHaveScreenshot('mail-sidebar-collapsed.png', {
139
+ fullPage: true,
140
+ })
141
+ })
142
+
143
+ test('MailSidebar - no labels', async ({ page }) => {
144
+ await page.goto('/iframe.html?id=zero-dashboard-mailsidebar--no-labels&viewMode=story')
145
+ await page.waitForLoadState('networkidle')
146
+ await page.waitForSelector('[data-slot="mail-sidebar"]')
147
+
148
+ await expect(page).toHaveScreenshot('mail-sidebar-no-labels.png', {
149
+ fullPage: true,
150
+ })
151
+ })
152
+
153
+ test('MailSidebar - many unread', async ({ page }) => {
154
+ await page.goto('/iframe.html?id=zero-dashboard-mailsidebar--many-unread&viewMode=story')
155
+ await page.waitForLoadState('networkidle')
156
+ await page.waitForSelector('[data-slot="mail-sidebar"]')
157
+
158
+ await expect(page).toHaveScreenshot('mail-sidebar-many-unread.png', {
159
+ fullPage: true,
160
+ })
161
+ })
162
+ })
163
+
164
+ test.describe('Email Composer Components', () => {
165
+ test('EmailComposer - new email', async ({ page }) => {
166
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--default&viewMode=story')
167
+ await page.waitForLoadState('networkidle')
168
+ await page.waitForSelector('[data-slot="email-composer"]')
169
+
170
+ await expect(page).toHaveScreenshot('email-composer-default.png', {
171
+ fullPage: true,
172
+ })
173
+ })
174
+
175
+ test('EmailComposer - with draft', async ({ page }) => {
176
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--with-draft&viewMode=story')
177
+ await page.waitForLoadState('networkidle')
178
+ await page.waitForSelector('[data-slot="email-composer"]')
179
+
180
+ await expect(page).toHaveScreenshot('email-composer-draft.png', {
181
+ fullPage: true,
182
+ })
183
+ })
184
+
185
+ test('EmailComposer - reply mode', async ({ page }) => {
186
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--reply&viewMode=story')
187
+ await page.waitForLoadState('networkidle')
188
+ await page.waitForSelector('[data-slot="email-composer"]')
189
+
190
+ await expect(page).toHaveScreenshot('email-composer-reply.png', {
191
+ fullPage: true,
192
+ })
193
+ })
194
+
195
+ test('EmailComposer - with CC/BCC', async ({ page }) => {
196
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--with-cc-bcc&viewMode=story')
197
+ await page.waitForLoadState('networkidle')
198
+ await page.waitForSelector('[data-slot="email-composer"]')
199
+
200
+ await expect(page).toHaveScreenshot('email-composer-cc-bcc.png', {
201
+ fullPage: true,
202
+ })
203
+ })
204
+
205
+ test('RecipientInput', async ({ page }) => {
206
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--recipient-input-default&viewMode=story')
207
+ await page.waitForLoadState('networkidle')
208
+ await page.waitForSelector('[data-slot="recipient-input"]')
209
+
210
+ await expect(page).toHaveScreenshot('recipient-input.png', {
211
+ fullPage: true,
212
+ })
213
+ })
214
+
215
+ test('EditorToolbar - default', async ({ page }) => {
216
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--toolbar-default&viewMode=story')
217
+ await page.waitForLoadState('networkidle')
218
+ await page.waitForSelector('[data-slot="editor-toolbar"]')
219
+
220
+ await expect(page).toHaveScreenshot('editor-toolbar.png', {
221
+ fullPage: true,
222
+ })
223
+ })
224
+
225
+ test('EditorToolbar - compact', async ({ page }) => {
226
+ await page.goto('/iframe.html?id=zero-compose-emailcomposer--toolbar-compact&viewMode=story')
227
+ await page.waitForLoadState('networkidle')
228
+ await page.waitForSelector('[data-slot="editor-toolbar"]')
229
+
230
+ await expect(page).toHaveScreenshot('editor-toolbar-compact.png', {
231
+ fullPage: true,
232
+ })
233
+ })
234
+ })
235
+
236
+ test.describe('Mail Shell (Full Dashboard)', () => {
237
+ test('MailShell - default layout', async ({ page }) => {
238
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--default&viewMode=story')
239
+ await page.waitForLoadState('networkidle')
240
+ await page.waitForSelector('[data-slot="mail-shell"]')
241
+
242
+ await expect(page).toHaveScreenshot('mail-shell-default.png', {
243
+ fullPage: true,
244
+ })
245
+ })
246
+
247
+ test('MailShell - no thread selected', async ({ page }) => {
248
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--no-thread-selected&viewMode=story')
249
+ await page.waitForLoadState('networkidle')
250
+ await page.waitForSelector('[data-slot="mail-shell"]')
251
+
252
+ await expect(page).toHaveScreenshot('mail-shell-no-thread.png', {
253
+ fullPage: true,
254
+ })
255
+ })
256
+
257
+ test('MailShell - collapsed sidebar', async ({ page }) => {
258
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--collapsed-sidebar&viewMode=story')
259
+ await page.waitForLoadState('networkidle')
260
+ await page.waitForSelector('[data-slot="mail-shell"]')
261
+
262
+ await expect(page).toHaveScreenshot('mail-shell-collapsed.png', {
263
+ fullPage: true,
264
+ })
265
+ })
266
+
267
+ test('MailShell - empty inbox', async ({ page }) => {
268
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--empty-inbox&viewMode=story')
269
+ await page.waitForLoadState('networkidle')
270
+ await page.waitForSelector('[data-slot="mail-shell"]')
271
+
272
+ await expect(page).toHaveScreenshot('mail-shell-empty.png', {
273
+ fullPage: true,
274
+ })
275
+ })
276
+
277
+ test('MailShell - loading state', async ({ page }) => {
278
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--loading&viewMode=story')
279
+ await page.waitForLoadState('networkidle')
280
+ await page.waitForSelector('[data-slot="mail-shell"]')
281
+
282
+ await expect(page).toHaveScreenshot('mail-shell-loading.png', {
283
+ fullPage: true,
284
+ })
285
+ })
286
+
287
+ test('MailShell - compact mode', async ({ page }) => {
288
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--compact-mode&viewMode=story')
289
+ await page.waitForLoadState('networkidle')
290
+ await page.waitForSelector('[data-slot="mail-shell"]')
291
+
292
+ await expect(page).toHaveScreenshot('mail-shell-compact.png', {
293
+ fullPage: true,
294
+ })
295
+ })
296
+ })
297
+
298
+ test.describe('Responsive Behavior', () => {
299
+ test('MailShell - tablet view', async ({ page }) => {
300
+ await page.setViewportSize({ width: 1024, height: 768 })
301
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--default&viewMode=story')
302
+ await page.waitForLoadState('networkidle')
303
+ await page.waitForSelector('[data-slot="mail-shell"]')
304
+
305
+ await expect(page).toHaveScreenshot('mail-shell-tablet.png', {
306
+ fullPage: true,
307
+ })
308
+ })
309
+
310
+ test.skip('MailShell - mobile view', async ({ page }) => {
311
+ // Skip on wide viewport projects
312
+ await page.setViewportSize({ width: 390, height: 844 })
313
+ await page.goto('/iframe.html?id=zero-dashboard-mailshell--no-thread-selected&viewMode=story')
314
+ await page.waitForLoadState('networkidle')
315
+ await page.waitForSelector('[data-slot="mail-shell"]')
316
+
317
+ await expect(page).toHaveScreenshot('mail-shell-mobile.png', {
318
+ fullPage: true,
319
+ })
320
+ })
321
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "@mdxui/typescript-config/react-library.json",
3
+ "include": ["."],
4
+ "exclude": ["dist", "build", "node_modules"]
5
+ }