@remit/web-client 0.0.229 → 0.0.231

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 (53) hide show
  1. package/package.json +1 -1
  2. package/src/components/calendar/CalendarComposePane.stories.tsx +25 -0
  3. package/src/components/calendar/CalendarComposePane.tsx +34 -0
  4. package/src/components/calendar/CalendarEventPane.stories.tsx +81 -0
  5. package/src/components/calendar/CalendarEventPane.tsx +67 -0
  6. package/src/components/calendar/CalendarShell.tsx +83 -0
  7. package/src/components/calendar/CalendarViewPlaceholder.tsx +37 -0
  8. package/src/components/calendar/CalendarWorkspace.stories.tsx +197 -0
  9. package/src/components/calendar/CalendarWorkspace.tsx +162 -0
  10. package/src/components/calendar/OpenCalendarEvent.tsx +39 -0
  11. package/src/components/calendar/calendar-workspace.render.test.ts +193 -0
  12. package/src/components/config-import/ConfigImportWizard.flow.test.ts +338 -0
  13. package/src/components/config-import/ConfigImportWizard.tsx +720 -0
  14. package/src/components/config-import/config-import.fixtures.ts +229 -0
  15. package/src/components/config-import/config-import.stories.tsx +449 -0
  16. package/src/components/config-import/steps.tsx +772 -0
  17. package/src/components/mail/MailSidebarAdapter.tsx +17 -0
  18. package/src/components/onboarding/OnboardingWizard.tsx +64 -390
  19. package/src/components/onboarding/credential-steps.tsx +441 -0
  20. package/src/components/settings/ConfigExportCard.tsx +114 -0
  21. package/src/components/settings/ConfigTransferPanel.tsx +72 -0
  22. package/src/hooks/useCalendarData.ts +72 -0
  23. package/src/lib/calendar-density.ts +34 -0
  24. package/src/lib/calendar-fixtures.ts +207 -0
  25. package/src/lib/calendar-format.ts +29 -0
  26. package/src/lib/calendar-route.test.ts +210 -0
  27. package/src/lib/calendar-route.ts +183 -0
  28. package/src/lib/config-import.test.ts +306 -0
  29. package/src/lib/config-import.ts +492 -0
  30. package/src/lib/json.ts +11 -0
  31. package/src/lib/search-params.test.ts +77 -0
  32. package/src/lib/search-params.ts +59 -0
  33. package/src/routeTree.gen.ts +220 -0
  34. package/src/router.tsx +5 -0
  35. package/src/routes/calendar/$view.$date/$calendarObjectId/$recurrenceId.tsx +26 -0
  36. package/src/routes/calendar/$view.$date/$calendarObjectId/index.tsx +18 -0
  37. package/src/routes/calendar/$view.$date/$calendarObjectId.tsx +15 -0
  38. package/src/routes/calendar/$view.$date/index.tsx +25 -0
  39. package/src/routes/calendar/$view.$date/new.tsx +20 -0
  40. package/src/routes/calendar/$view.$date.tsx +100 -0
  41. package/src/routes/calendar/-calendar-tree.test.ts +267 -0
  42. package/src/routes/calendar/index.tsx +27 -0
  43. package/src/routes/calendar.tsx +98 -0
  44. package/src/routes/import.tsx +51 -0
  45. package/src/routes/onboarding.tsx +9 -2
  46. package/src/routes/settings/accounts.tsx +30 -8
  47. package/src/routes/settings/advanced.tsx +5 -1
  48. package/src/routing/calendar-fragment.test.ts +66 -0
  49. package/src/routing/calendar.ts +139 -0
  50. package/src/routing/fragment.ts +19 -0
  51. package/src/routing/index.ts +10 -0
  52. package/src/routing/nav-selection.ts +2 -0
  53. package/src/routing/sections.ts +3 -1
@@ -10,9 +10,12 @@
10
10
 
11
11
  import { Route as rootRouteImport } from './routes/__root'
12
12
  import { Route as IndexRouteImport } from './routes/index'
13
+ import { Route as CalendarRouteImport } from './routes/calendar'
14
+ import { Route as ImportRouteImport } from './routes/import'
13
15
  import { Route as MailRouteImport } from './routes/mail'
14
16
  import { Route as OnboardingRouteImport } from './routes/onboarding'
15
17
  import { Route as SettingsRouteImport } from './routes/settings'
18
+ import { Route as CalendarIndexRouteImport } from './routes/calendar/index'
16
19
  import { Route as MailIndexRouteImport } from './routes/mail/index'
17
20
  import { Route as MailMailboxIdRouteImport } from './routes/mail/$mailboxId'
18
21
  import { Route as MailBriefRouteImport } from './routes/mail/brief'
@@ -27,6 +30,7 @@ import { Route as SettingsFoldersRouteImport } from './routes/settings/folders'
27
30
  import { Route as SettingsLabelsRouteImport } from './routes/settings/labels'
28
31
  import { Route as SettingsSendersRouteImport } from './routes/settings/senders'
29
32
  import { Route as SettingsSuggestedVipsRouteImport } from './routes/settings/suggested-vips'
33
+ import { Route as CalendarViewDateRouteImport } from './routes/calendar/$view.$date'
30
34
  import { Route as MailMailboxIdIndexRouteImport } from './routes/mail/$mailboxId/index'
31
35
  import { Route as MailMailboxIdThreadIdRouteImport } from './routes/mail/$mailboxId/$threadId'
32
36
  import { Route as MailBriefIndexRouteImport } from './routes/mail/brief/index'
@@ -34,6 +38,9 @@ import { Route as MailBriefThreadIdRouteImport } from './routes/mail/brief/$thre
34
38
  import { Route as MailFlaggedIndexRouteImport } from './routes/mail/flagged/index'
35
39
  import { Route as MailFlaggedThreadIdRouteImport } from './routes/mail/flagged/$threadId'
36
40
  import { Route as MailOutboxIndexRouteImport } from './routes/mail/outbox/index'
41
+ import { Route as CalendarViewDateIndexRouteImport } from './routes/calendar/$view.$date/index'
42
+ import { Route as CalendarViewDateCalendarObjectIdRouteImport } from './routes/calendar/$view.$date/$calendarObjectId'
43
+ import { Route as CalendarViewDateNewRouteImport } from './routes/calendar/$view.$date/new'
37
44
  import { Route as MailMailboxIdThreadIdIndexRouteImport } from './routes/mail/$mailboxId/$threadId/index'
38
45
  import { Route as MailMailboxIdThreadIdMessageIdRouteImport } from './routes/mail/$mailboxId/$threadId/$messageId'
39
46
  import { Route as MailMailboxIdComposeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/$mailboxId/compose.{-$outboxMessageId}'
@@ -45,6 +52,8 @@ import { Route as MailFlaggedThreadIdMessageIdRouteImport } from './routes/mail/
45
52
  import { Route as MailFlaggedComposeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/flagged/compose.{-$outboxMessageId}'
46
53
  import { Route as MailOutboxComposeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/outbox/compose.{-$outboxMessageId}'
47
54
  import { Route as MailOutboxDraftOutboxMessageIdRouteImport } from './routes/mail/outbox/draft/$outboxMessageId'
55
+ import { Route as CalendarViewDateCalendarObjectIdIndexRouteImport } from './routes/calendar/$view.$date/$calendarObjectId/index'
56
+ import { Route as CalendarViewDateCalendarObjectIdRecurrenceIdRouteImport } from './routes/calendar/$view.$date/$calendarObjectId/$recurrenceId'
48
57
  import { Route as MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/$mailboxId/$threadId/$messageId/$mode.{-$outboxMessageId}'
49
58
  import { Route as MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/brief/$threadId/$messageId/$mode.{-$outboxMessageId}'
50
59
  import { Route as MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/flagged/$threadId/$messageId/$mode.{-$outboxMessageId}'
@@ -54,6 +63,16 @@ const IndexRoute = IndexRouteImport.update({
54
63
  path: '/',
55
64
  getParentRoute: () => rootRouteImport,
56
65
  } as any)
66
+ const CalendarRoute = CalendarRouteImport.update({
67
+ id: '/calendar',
68
+ path: '/calendar',
69
+ getParentRoute: () => rootRouteImport,
70
+ } as any)
71
+ const ImportRoute = ImportRouteImport.update({
72
+ id: '/import',
73
+ path: '/import',
74
+ getParentRoute: () => rootRouteImport,
75
+ } as any)
57
76
  const MailRoute = MailRouteImport.update({
58
77
  id: '/mail',
59
78
  path: '/mail',
@@ -69,6 +88,11 @@ const SettingsRoute = SettingsRouteImport.update({
69
88
  path: '/settings',
70
89
  getParentRoute: () => rootRouteImport,
71
90
  } as any)
91
+ const CalendarIndexRoute = CalendarIndexRouteImport.update({
92
+ id: '/',
93
+ path: '/',
94
+ getParentRoute: () => CalendarRoute,
95
+ } as any)
72
96
  const MailIndexRoute = MailIndexRouteImport.update({
73
97
  id: '/',
74
98
  path: '/',
@@ -139,6 +163,11 @@ const SettingsSuggestedVipsRoute = SettingsSuggestedVipsRouteImport.update({
139
163
  path: '/suggested-vips',
140
164
  getParentRoute: () => SettingsRoute,
141
165
  } as any)
166
+ const CalendarViewDateRoute = CalendarViewDateRouteImport.update({
167
+ id: '/$view/$date',
168
+ path: '/$view/$date',
169
+ getParentRoute: () => CalendarRoute,
170
+ } as any)
142
171
  const MailMailboxIdIndexRoute = MailMailboxIdIndexRouteImport.update({
143
172
  id: '/',
144
173
  path: '/',
@@ -174,6 +203,22 @@ const MailOutboxIndexRoute = MailOutboxIndexRouteImport.update({
174
203
  path: '/',
175
204
  getParentRoute: () => MailOutboxRoute,
176
205
  } as any)
206
+ const CalendarViewDateIndexRoute = CalendarViewDateIndexRouteImport.update({
207
+ id: '/',
208
+ path: '/',
209
+ getParentRoute: () => CalendarViewDateRoute,
210
+ } as any)
211
+ const CalendarViewDateCalendarObjectIdRoute =
212
+ CalendarViewDateCalendarObjectIdRouteImport.update({
213
+ id: '/$calendarObjectId',
214
+ path: '/$calendarObjectId',
215
+ getParentRoute: () => CalendarViewDateRoute,
216
+ } as any)
217
+ const CalendarViewDateNewRoute = CalendarViewDateNewRouteImport.update({
218
+ id: '/new',
219
+ path: '/new',
220
+ getParentRoute: () => CalendarViewDateRoute,
221
+ } as any)
177
222
  const MailMailboxIdThreadIdIndexRoute =
178
223
  MailMailboxIdThreadIdIndexRouteImport.update({
179
224
  id: '/',
@@ -239,6 +284,18 @@ const MailOutboxDraftOutboxMessageIdRoute =
239
284
  path: '/draft/$outboxMessageId',
240
285
  getParentRoute: () => MailOutboxRoute,
241
286
  } as any)
287
+ const CalendarViewDateCalendarObjectIdIndexRoute =
288
+ CalendarViewDateCalendarObjectIdIndexRouteImport.update({
289
+ id: '/',
290
+ path: '/',
291
+ getParentRoute: () => CalendarViewDateCalendarObjectIdRoute,
292
+ } as any)
293
+ const CalendarViewDateCalendarObjectIdRecurrenceIdRoute =
294
+ CalendarViewDateCalendarObjectIdRecurrenceIdRouteImport.update({
295
+ id: '/$recurrenceId',
296
+ path: '/$recurrenceId',
297
+ getParentRoute: () => CalendarViewDateCalendarObjectIdRoute,
298
+ } as any)
242
299
  const MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route =
243
300
  MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport.update(
244
301
  {
@@ -266,6 +323,8 @@ const MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route =
266
323
 
267
324
  export interface FileRoutesByFullPath {
268
325
  '/': typeof IndexRoute
326
+ '/calendar': typeof CalendarRouteWithChildren
327
+ '/import': typeof ImportRoute
269
328
  '/mail': typeof MailRouteWithChildren
270
329
  '/onboarding': typeof OnboardingRoute
271
330
  '/settings': typeof SettingsRouteWithChildren
@@ -281,8 +340,10 @@ export interface FileRoutesByFullPath {
281
340
  '/settings/labels': typeof SettingsLabelsRoute
282
341
  '/settings/senders': typeof SettingsSendersRoute
283
342
  '/settings/suggested-vips': typeof SettingsSuggestedVipsRoute
343
+ '/calendar/': typeof CalendarIndexRoute
284
344
  '/mail/': typeof MailIndexRoute
285
345
  '/settings/': typeof SettingsIndexRoute
346
+ '/calendar/$view/$date': typeof CalendarViewDateRouteWithChildren
286
347
  '/mail/$mailboxId/$threadId': typeof MailMailboxIdThreadIdRouteWithChildren
287
348
  '/mail/brief/$threadId': typeof MailBriefThreadIdRouteWithChildren
288
349
  '/mail/flagged/$threadId': typeof MailFlaggedThreadIdRouteWithChildren
@@ -290,6 +351,8 @@ export interface FileRoutesByFullPath {
290
351
  '/mail/brief/': typeof MailBriefIndexRoute
291
352
  '/mail/flagged/': typeof MailFlaggedIndexRoute
292
353
  '/mail/outbox/': typeof MailOutboxIndexRoute
354
+ '/calendar/$view/$date/$calendarObjectId': typeof CalendarViewDateCalendarObjectIdRouteWithChildren
355
+ '/calendar/$view/$date/new': typeof CalendarViewDateNewRoute
293
356
  '/mail/$mailboxId/$threadId/$messageId': typeof MailMailboxIdThreadIdMessageIdRouteWithChildren
294
357
  '/mail/$mailboxId/compose/{-$outboxMessageId}': typeof MailMailboxIdComposeChar123OutboxMessageIdChar125Route
295
358
  '/mail/brief/$threadId/$messageId': typeof MailBriefThreadIdMessageIdRouteWithChildren
@@ -298,15 +361,19 @@ export interface FileRoutesByFullPath {
298
361
  '/mail/flagged/compose/{-$outboxMessageId}': typeof MailFlaggedComposeChar123OutboxMessageIdChar125Route
299
362
  '/mail/outbox/compose/{-$outboxMessageId}': typeof MailOutboxComposeChar123OutboxMessageIdChar125Route
300
363
  '/mail/outbox/draft/$outboxMessageId': typeof MailOutboxDraftOutboxMessageIdRoute
364
+ '/calendar/$view/$date/': typeof CalendarViewDateIndexRoute
301
365
  '/mail/$mailboxId/$threadId/': typeof MailMailboxIdThreadIdIndexRoute
302
366
  '/mail/brief/$threadId/': typeof MailBriefThreadIdIndexRoute
303
367
  '/mail/flagged/$threadId/': typeof MailFlaggedThreadIdIndexRoute
368
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
369
+ '/calendar/$view/$date/$calendarObjectId/': typeof CalendarViewDateCalendarObjectIdIndexRoute
304
370
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
305
371
  '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
306
372
  '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
307
373
  }
308
374
  export interface FileRoutesByTo {
309
375
  '/': typeof IndexRoute
376
+ '/import': typeof ImportRoute
310
377
  '/onboarding': typeof OnboardingRoute
311
378
  '/settings/accounts': typeof SettingsAccountsRoute
312
379
  '/settings/advanced': typeof SettingsAdvancedRoute
@@ -316,12 +383,14 @@ export interface FileRoutesByTo {
316
383
  '/settings/labels': typeof SettingsLabelsRoute
317
384
  '/settings/senders': typeof SettingsSendersRoute
318
385
  '/settings/suggested-vips': typeof SettingsSuggestedVipsRoute
386
+ '/calendar': typeof CalendarIndexRoute
319
387
  '/mail': typeof MailIndexRoute
320
388
  '/settings': typeof SettingsIndexRoute
321
389
  '/mail/$mailboxId': typeof MailMailboxIdIndexRoute
322
390
  '/mail/brief': typeof MailBriefIndexRoute
323
391
  '/mail/flagged': typeof MailFlaggedIndexRoute
324
392
  '/mail/outbox': typeof MailOutboxIndexRoute
393
+ '/calendar/$view/$date/new': typeof CalendarViewDateNewRoute
325
394
  '/mail/$mailboxId/$threadId/$messageId': typeof MailMailboxIdThreadIdMessageIdRouteWithChildren
326
395
  '/mail/$mailboxId/compose/{-$outboxMessageId}': typeof MailMailboxIdComposeChar123OutboxMessageIdChar125Route
327
396
  '/mail/brief/$threadId/$messageId': typeof MailBriefThreadIdMessageIdRouteWithChildren
@@ -330,9 +399,12 @@ export interface FileRoutesByTo {
330
399
  '/mail/flagged/compose/{-$outboxMessageId}': typeof MailFlaggedComposeChar123OutboxMessageIdChar125Route
331
400
  '/mail/outbox/compose/{-$outboxMessageId}': typeof MailOutboxComposeChar123OutboxMessageIdChar125Route
332
401
  '/mail/outbox/draft/$outboxMessageId': typeof MailOutboxDraftOutboxMessageIdRoute
402
+ '/calendar/$view/$date': typeof CalendarViewDateIndexRoute
333
403
  '/mail/$mailboxId/$threadId': typeof MailMailboxIdThreadIdIndexRoute
334
404
  '/mail/brief/$threadId': typeof MailBriefThreadIdIndexRoute
335
405
  '/mail/flagged/$threadId': typeof MailFlaggedThreadIdIndexRoute
406
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
407
+ '/calendar/$view/$date/$calendarObjectId': typeof CalendarViewDateCalendarObjectIdIndexRoute
336
408
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
337
409
  '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
338
410
  '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
@@ -340,6 +412,8 @@ export interface FileRoutesByTo {
340
412
  export interface FileRoutesById {
341
413
  __root__: typeof rootRouteImport
342
414
  '/': typeof IndexRoute
415
+ '/calendar': typeof CalendarRouteWithChildren
416
+ '/import': typeof ImportRoute
343
417
  '/mail': typeof MailRouteWithChildren
344
418
  '/onboarding': typeof OnboardingRoute
345
419
  '/settings': typeof SettingsRouteWithChildren
@@ -355,8 +429,10 @@ export interface FileRoutesById {
355
429
  '/settings/labels': typeof SettingsLabelsRoute
356
430
  '/settings/senders': typeof SettingsSendersRoute
357
431
  '/settings/suggested-vips': typeof SettingsSuggestedVipsRoute
432
+ '/calendar/': typeof CalendarIndexRoute
358
433
  '/mail/': typeof MailIndexRoute
359
434
  '/settings/': typeof SettingsIndexRoute
435
+ '/calendar/$view/$date': typeof CalendarViewDateRouteWithChildren
360
436
  '/mail/$mailboxId/$threadId': typeof MailMailboxIdThreadIdRouteWithChildren
361
437
  '/mail/brief/$threadId': typeof MailBriefThreadIdRouteWithChildren
362
438
  '/mail/flagged/$threadId': typeof MailFlaggedThreadIdRouteWithChildren
@@ -364,6 +440,8 @@ export interface FileRoutesById {
364
440
  '/mail/brief/': typeof MailBriefIndexRoute
365
441
  '/mail/flagged/': typeof MailFlaggedIndexRoute
366
442
  '/mail/outbox/': typeof MailOutboxIndexRoute
443
+ '/calendar/$view/$date/$calendarObjectId': typeof CalendarViewDateCalendarObjectIdRouteWithChildren
444
+ '/calendar/$view/$date/new': typeof CalendarViewDateNewRoute
367
445
  '/mail/$mailboxId/$threadId/$messageId': typeof MailMailboxIdThreadIdMessageIdRouteWithChildren
368
446
  '/mail/$mailboxId/compose/{-$outboxMessageId}': typeof MailMailboxIdComposeChar123OutboxMessageIdChar125Route
369
447
  '/mail/brief/$threadId/$messageId': typeof MailBriefThreadIdMessageIdRouteWithChildren
@@ -372,9 +450,12 @@ export interface FileRoutesById {
372
450
  '/mail/flagged/compose/{-$outboxMessageId}': typeof MailFlaggedComposeChar123OutboxMessageIdChar125Route
373
451
  '/mail/outbox/compose/{-$outboxMessageId}': typeof MailOutboxComposeChar123OutboxMessageIdChar125Route
374
452
  '/mail/outbox/draft/$outboxMessageId': typeof MailOutboxDraftOutboxMessageIdRoute
453
+ '/calendar/$view/$date/': typeof CalendarViewDateIndexRoute
375
454
  '/mail/$mailboxId/$threadId/': typeof MailMailboxIdThreadIdIndexRoute
376
455
  '/mail/brief/$threadId/': typeof MailBriefThreadIdIndexRoute
377
456
  '/mail/flagged/$threadId/': typeof MailFlaggedThreadIdIndexRoute
457
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
458
+ '/calendar/$view/$date/$calendarObjectId/': typeof CalendarViewDateCalendarObjectIdIndexRoute
378
459
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
379
460
  '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
380
461
  '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
@@ -383,6 +464,8 @@ export interface FileRouteTypes {
383
464
  fileRoutesByFullPath: FileRoutesByFullPath
384
465
  fullPaths:
385
466
  | '/'
467
+ | '/calendar'
468
+ | '/import'
386
469
  | '/mail'
387
470
  | '/onboarding'
388
471
  | '/settings'
@@ -398,8 +481,10 @@ export interface FileRouteTypes {
398
481
  | '/settings/labels'
399
482
  | '/settings/senders'
400
483
  | '/settings/suggested-vips'
484
+ | '/calendar/'
401
485
  | '/mail/'
402
486
  | '/settings/'
487
+ | '/calendar/$view/$date'
403
488
  | '/mail/$mailboxId/$threadId'
404
489
  | '/mail/brief/$threadId'
405
490
  | '/mail/flagged/$threadId'
@@ -407,6 +492,8 @@ export interface FileRouteTypes {
407
492
  | '/mail/brief/'
408
493
  | '/mail/flagged/'
409
494
  | '/mail/outbox/'
495
+ | '/calendar/$view/$date/$calendarObjectId'
496
+ | '/calendar/$view/$date/new'
410
497
  | '/mail/$mailboxId/$threadId/$messageId'
411
498
  | '/mail/$mailboxId/compose/{-$outboxMessageId}'
412
499
  | '/mail/brief/$threadId/$messageId'
@@ -415,15 +502,19 @@ export interface FileRouteTypes {
415
502
  | '/mail/flagged/compose/{-$outboxMessageId}'
416
503
  | '/mail/outbox/compose/{-$outboxMessageId}'
417
504
  | '/mail/outbox/draft/$outboxMessageId'
505
+ | '/calendar/$view/$date/'
418
506
  | '/mail/$mailboxId/$threadId/'
419
507
  | '/mail/brief/$threadId/'
420
508
  | '/mail/flagged/$threadId/'
509
+ | '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
510
+ | '/calendar/$view/$date/$calendarObjectId/'
421
511
  | '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
422
512
  | '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}'
423
513
  | '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}'
424
514
  fileRoutesByTo: FileRoutesByTo
425
515
  to:
426
516
  | '/'
517
+ | '/import'
427
518
  | '/onboarding'
428
519
  | '/settings/accounts'
429
520
  | '/settings/advanced'
@@ -433,12 +524,14 @@ export interface FileRouteTypes {
433
524
  | '/settings/labels'
434
525
  | '/settings/senders'
435
526
  | '/settings/suggested-vips'
527
+ | '/calendar'
436
528
  | '/mail'
437
529
  | '/settings'
438
530
  | '/mail/$mailboxId'
439
531
  | '/mail/brief'
440
532
  | '/mail/flagged'
441
533
  | '/mail/outbox'
534
+ | '/calendar/$view/$date/new'
442
535
  | '/mail/$mailboxId/$threadId/$messageId'
443
536
  | '/mail/$mailboxId/compose/{-$outboxMessageId}'
444
537
  | '/mail/brief/$threadId/$messageId'
@@ -447,15 +540,20 @@ export interface FileRouteTypes {
447
540
  | '/mail/flagged/compose/{-$outboxMessageId}'
448
541
  | '/mail/outbox/compose/{-$outboxMessageId}'
449
542
  | '/mail/outbox/draft/$outboxMessageId'
543
+ | '/calendar/$view/$date'
450
544
  | '/mail/$mailboxId/$threadId'
451
545
  | '/mail/brief/$threadId'
452
546
  | '/mail/flagged/$threadId'
547
+ | '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
548
+ | '/calendar/$view/$date/$calendarObjectId'
453
549
  | '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
454
550
  | '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}'
455
551
  | '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}'
456
552
  id:
457
553
  | '__root__'
458
554
  | '/'
555
+ | '/calendar'
556
+ | '/import'
459
557
  | '/mail'
460
558
  | '/onboarding'
461
559
  | '/settings'
@@ -471,8 +569,10 @@ export interface FileRouteTypes {
471
569
  | '/settings/labels'
472
570
  | '/settings/senders'
473
571
  | '/settings/suggested-vips'
572
+ | '/calendar/'
474
573
  | '/mail/'
475
574
  | '/settings/'
575
+ | '/calendar/$view/$date'
476
576
  | '/mail/$mailboxId/$threadId'
477
577
  | '/mail/brief/$threadId'
478
578
  | '/mail/flagged/$threadId'
@@ -480,6 +580,8 @@ export interface FileRouteTypes {
480
580
  | '/mail/brief/'
481
581
  | '/mail/flagged/'
482
582
  | '/mail/outbox/'
583
+ | '/calendar/$view/$date/$calendarObjectId'
584
+ | '/calendar/$view/$date/new'
483
585
  | '/mail/$mailboxId/$threadId/$messageId'
484
586
  | '/mail/$mailboxId/compose/{-$outboxMessageId}'
485
587
  | '/mail/brief/$threadId/$messageId'
@@ -488,9 +590,12 @@ export interface FileRouteTypes {
488
590
  | '/mail/flagged/compose/{-$outboxMessageId}'
489
591
  | '/mail/outbox/compose/{-$outboxMessageId}'
490
592
  | '/mail/outbox/draft/$outboxMessageId'
593
+ | '/calendar/$view/$date/'
491
594
  | '/mail/$mailboxId/$threadId/'
492
595
  | '/mail/brief/$threadId/'
493
596
  | '/mail/flagged/$threadId/'
597
+ | '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
598
+ | '/calendar/$view/$date/$calendarObjectId/'
494
599
  | '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
495
600
  | '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}'
496
601
  | '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}'
@@ -498,6 +603,8 @@ export interface FileRouteTypes {
498
603
  }
499
604
  export interface RootRouteChildren {
500
605
  IndexRoute: typeof IndexRoute
606
+ CalendarRoute: typeof CalendarRouteWithChildren
607
+ ImportRoute: typeof ImportRoute
501
608
  MailRoute: typeof MailRouteWithChildren
502
609
  OnboardingRoute: typeof OnboardingRoute
503
610
  SettingsRoute: typeof SettingsRouteWithChildren
@@ -512,6 +619,20 @@ declare module '@tanstack/react-router' {
512
619
  preLoaderRoute: typeof IndexRouteImport
513
620
  parentRoute: typeof rootRouteImport
514
621
  }
622
+ '/calendar': {
623
+ id: '/calendar'
624
+ path: '/calendar'
625
+ fullPath: '/calendar'
626
+ preLoaderRoute: typeof CalendarRouteImport
627
+ parentRoute: typeof rootRouteImport
628
+ }
629
+ '/import': {
630
+ id: '/import'
631
+ path: '/import'
632
+ fullPath: '/import'
633
+ preLoaderRoute: typeof ImportRouteImport
634
+ parentRoute: typeof rootRouteImport
635
+ }
515
636
  '/mail': {
516
637
  id: '/mail'
517
638
  path: '/mail'
@@ -533,6 +654,13 @@ declare module '@tanstack/react-router' {
533
654
  preLoaderRoute: typeof SettingsRouteImport
534
655
  parentRoute: typeof rootRouteImport
535
656
  }
657
+ '/calendar/': {
658
+ id: '/calendar/'
659
+ path: '/'
660
+ fullPath: '/calendar/'
661
+ preLoaderRoute: typeof CalendarIndexRouteImport
662
+ parentRoute: typeof CalendarRoute
663
+ }
536
664
  '/mail/': {
537
665
  id: '/mail/'
538
666
  path: '/'
@@ -631,6 +759,13 @@ declare module '@tanstack/react-router' {
631
759
  preLoaderRoute: typeof SettingsSuggestedVipsRouteImport
632
760
  parentRoute: typeof SettingsRoute
633
761
  }
762
+ '/calendar/$view/$date': {
763
+ id: '/calendar/$view/$date'
764
+ path: '/$view/$date'
765
+ fullPath: '/calendar/$view/$date'
766
+ preLoaderRoute: typeof CalendarViewDateRouteImport
767
+ parentRoute: typeof CalendarRoute
768
+ }
634
769
  '/mail/$mailboxId/': {
635
770
  id: '/mail/$mailboxId/'
636
771
  path: '/'
@@ -680,6 +815,27 @@ declare module '@tanstack/react-router' {
680
815
  preLoaderRoute: typeof MailOutboxIndexRouteImport
681
816
  parentRoute: typeof MailOutboxRoute
682
817
  }
818
+ '/calendar/$view/$date/': {
819
+ id: '/calendar/$view/$date/'
820
+ path: '/'
821
+ fullPath: '/calendar/$view/$date/'
822
+ preLoaderRoute: typeof CalendarViewDateIndexRouteImport
823
+ parentRoute: typeof CalendarViewDateRoute
824
+ }
825
+ '/calendar/$view/$date/$calendarObjectId': {
826
+ id: '/calendar/$view/$date/$calendarObjectId'
827
+ path: '/$calendarObjectId'
828
+ fullPath: '/calendar/$view/$date/$calendarObjectId'
829
+ preLoaderRoute: typeof CalendarViewDateCalendarObjectIdRouteImport
830
+ parentRoute: typeof CalendarViewDateRoute
831
+ }
832
+ '/calendar/$view/$date/new': {
833
+ id: '/calendar/$view/$date/new'
834
+ path: '/new'
835
+ fullPath: '/calendar/$view/$date/new'
836
+ preLoaderRoute: typeof CalendarViewDateNewRouteImport
837
+ parentRoute: typeof CalendarViewDateRoute
838
+ }
683
839
  '/mail/$mailboxId/$threadId/': {
684
840
  id: '/mail/$mailboxId/$threadId/'
685
841
  path: '/'
@@ -757,6 +913,20 @@ declare module '@tanstack/react-router' {
757
913
  preLoaderRoute: typeof MailOutboxDraftOutboxMessageIdRouteImport
758
914
  parentRoute: typeof MailOutboxRoute
759
915
  }
916
+ '/calendar/$view/$date/$calendarObjectId/': {
917
+ id: '/calendar/$view/$date/$calendarObjectId/'
918
+ path: '/'
919
+ fullPath: '/calendar/$view/$date/$calendarObjectId/'
920
+ preLoaderRoute: typeof CalendarViewDateCalendarObjectIdIndexRouteImport
921
+ parentRoute: typeof CalendarViewDateCalendarObjectIdRoute
922
+ }
923
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': {
924
+ id: '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
925
+ path: '/$recurrenceId'
926
+ fullPath: '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
927
+ preLoaderRoute: typeof CalendarViewDateCalendarObjectIdRecurrenceIdRouteImport
928
+ parentRoute: typeof CalendarViewDateCalendarObjectIdRoute
929
+ }
760
930
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': {
761
931
  id: '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
762
932
  path: '/$mode/{-$outboxMessageId}'
@@ -781,6 +951,54 @@ declare module '@tanstack/react-router' {
781
951
  }
782
952
  }
783
953
 
954
+ interface CalendarViewDateCalendarObjectIdRouteChildren {
955
+ CalendarViewDateCalendarObjectIdRecurrenceIdRoute: typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
956
+ CalendarViewDateCalendarObjectIdIndexRoute: typeof CalendarViewDateCalendarObjectIdIndexRoute
957
+ }
958
+
959
+ const CalendarViewDateCalendarObjectIdRouteChildren: CalendarViewDateCalendarObjectIdRouteChildren =
960
+ {
961
+ CalendarViewDateCalendarObjectIdRecurrenceIdRoute:
962
+ CalendarViewDateCalendarObjectIdRecurrenceIdRoute,
963
+ CalendarViewDateCalendarObjectIdIndexRoute:
964
+ CalendarViewDateCalendarObjectIdIndexRoute,
965
+ }
966
+
967
+ const CalendarViewDateCalendarObjectIdRouteWithChildren =
968
+ CalendarViewDateCalendarObjectIdRoute._addFileChildren(
969
+ CalendarViewDateCalendarObjectIdRouteChildren,
970
+ )
971
+
972
+ interface CalendarViewDateRouteChildren {
973
+ CalendarViewDateCalendarObjectIdRoute: typeof CalendarViewDateCalendarObjectIdRouteWithChildren
974
+ CalendarViewDateNewRoute: typeof CalendarViewDateNewRoute
975
+ CalendarViewDateIndexRoute: typeof CalendarViewDateIndexRoute
976
+ }
977
+
978
+ const CalendarViewDateRouteChildren: CalendarViewDateRouteChildren = {
979
+ CalendarViewDateCalendarObjectIdRoute:
980
+ CalendarViewDateCalendarObjectIdRouteWithChildren,
981
+ CalendarViewDateNewRoute: CalendarViewDateNewRoute,
982
+ CalendarViewDateIndexRoute: CalendarViewDateIndexRoute,
983
+ }
984
+
985
+ const CalendarViewDateRouteWithChildren =
986
+ CalendarViewDateRoute._addFileChildren(CalendarViewDateRouteChildren)
987
+
988
+ interface CalendarRouteChildren {
989
+ CalendarIndexRoute: typeof CalendarIndexRoute
990
+ CalendarViewDateRoute: typeof CalendarViewDateRouteWithChildren
991
+ }
992
+
993
+ const CalendarRouteChildren: CalendarRouteChildren = {
994
+ CalendarIndexRoute: CalendarIndexRoute,
995
+ CalendarViewDateRoute: CalendarViewDateRouteWithChildren,
996
+ }
997
+
998
+ const CalendarRouteWithChildren = CalendarRoute._addFileChildren(
999
+ CalendarRouteChildren,
1000
+ )
1001
+
784
1002
  interface MailMailboxIdThreadIdMessageIdRouteChildren {
785
1003
  MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route: typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
786
1004
  }
@@ -985,6 +1203,8 @@ const SettingsRouteWithChildren = SettingsRoute._addFileChildren(
985
1203
 
986
1204
  const rootRouteChildren: RootRouteChildren = {
987
1205
  IndexRoute: IndexRoute,
1206
+ CalendarRoute: CalendarRouteWithChildren,
1207
+ ImportRoute: ImportRoute,
988
1208
  MailRoute: MailRouteWithChildren,
989
1209
  OnboardingRoute: OnboardingRoute,
990
1210
  SettingsRoute: SettingsRouteWithChildren,
package/src/router.tsx CHANGED
@@ -2,6 +2,7 @@ import type { QueryClient } from "@tanstack/react-query";
2
2
  import { createRouter } from "@tanstack/react-router";
3
3
  import { AppShellSkeleton } from "./components/layout/AppShellSkeleton";
4
4
  import { recordRoute } from "./lib/route-breadcrumbs";
5
+ import { stringifySearch } from "./lib/search-params";
5
6
  import type { Telemetry } from "./lib/telemetry";
6
7
  import { routeTree } from "./routeTree.gen";
7
8
 
@@ -16,6 +17,10 @@ export const createAppRouter = (
16
17
  const router = createRouter({
17
18
  routeTree,
18
19
  context: { queryClient },
20
+ // A query param that carries a list writes one param per value
21
+ // (`lib/search-params.ts`), which is what the router's own reader already
22
+ // expects and what a hand-written link says.
23
+ stringifySearch,
19
24
  defaultPreload: "intent",
20
25
  // A route arrives with its own code, and each mail list carries a whole pane
21
26
  // in it. Without a pending state the router keeps the previous route on
@@ -0,0 +1,26 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * One occurrence of a repeating event, under the series it belongs to.
4
+ *
5
+ * A segment rather than a param on the event, because an edit asks which
6
+ * instances it applies to and the answer starts from the one on screen: the
7
+ * series stays matched behind the occurrence, so the address names both.
8
+ */
9
+ import { createFileRoute } from "@tanstack/react-router";
10
+ import { OpenCalendarEvent } from "@/components/calendar/OpenCalendarEvent";
11
+
12
+ function CalendarOccurrenceRoute() {
13
+ const { calendarObjectId, recurrenceId } = Route.useParams();
14
+ return (
15
+ <OpenCalendarEvent
16
+ calendarObjectId={calendarObjectId}
17
+ recurrenceId={recurrenceId}
18
+ />
19
+ );
20
+ }
21
+
22
+ export const Route = createFileRoute(
23
+ "/calendar/$view/$date/$calendarObjectId/$recurrenceId",
24
+ )({
25
+ component: CalendarOccurrenceRoute,
26
+ });
@@ -0,0 +1,18 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * The event itself — the series, where it repeats. An occurrence of it is the
4
+ * `$recurrenceId` segment beside this one.
5
+ */
6
+ import { createFileRoute } from "@tanstack/react-router";
7
+ import { OpenCalendarEvent } from "@/components/calendar/OpenCalendarEvent";
8
+
9
+ function CalendarEventRoute() {
10
+ const { calendarObjectId } = Route.useParams();
11
+ return <OpenCalendarEvent calendarObjectId={calendarObjectId} />;
12
+ }
13
+
14
+ export const Route = createFileRoute(
15
+ "/calendar/$view/$date/$calendarObjectId/",
16
+ )({
17
+ component: CalendarEventRoute,
18
+ });
@@ -0,0 +1,15 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * /calendar/{view}/{date}/{calendarObjectId} — an event open in the reading
4
+ * pane, mirroring `$threadId` under a mail list.
5
+ *
6
+ * A layout, because one instance of a series nests under it: the series is what
7
+ * the address names, and the occurrence is the segment below.
8
+ */
9
+ import { createFileRoute, Outlet } from "@tanstack/react-router";
10
+
11
+ export const Route = createFileRoute("/calendar/$view/$date/$calendarObjectId")(
12
+ {
13
+ component: Outlet,
14
+ },
15
+ );
@@ -0,0 +1,25 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * The calendar's reading pane with nothing open. It is a route because the pane
4
+ * belongs to the view it was opened from, and the event and the composer arrive
5
+ * as segments beside it.
6
+ */
7
+
8
+ import { createFileRoute } from "@tanstack/react-router";
9
+ import { CalendarDays } from "lucide-react";
10
+ import { EmptyState } from "@/components/ui/EmptyState";
11
+
12
+ function CalendarReadingPane() {
13
+ return (
14
+ <div className="flex h-full items-center justify-center bg-surface">
15
+ <EmptyState
16
+ message="Pick an event to read it here."
17
+ icon={<CalendarDays className="size-8" />}
18
+ />
19
+ </div>
20
+ );
21
+ }
22
+
23
+ export const Route = createFileRoute("/calendar/$view/$date/")({
24
+ component: CalendarReadingPane,
25
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * /calendar/{view}/{date}/new — writing an event.
3
+ *
4
+ * A sibling of the event route, so navigating here unmatches whatever the
5
+ * calendar had open in the same transition: nothing has to be closed first, and
6
+ * a composer over an open event is unrepresentable. The address is exactly the
7
+ * move `compose` makes over a mail list.
8
+ */
9
+ import { createFileRoute } from "@tanstack/react-router";
10
+ import { CalendarComposePane } from "@/components/calendar/CalendarComposePane";
11
+ import { useCalendarNavigation } from "@/routing";
12
+
13
+ function CalendarComposeRoute() {
14
+ const { closeEvent } = useCalendarNavigation();
15
+ return <CalendarComposePane onClose={closeEvent} />;
16
+ }
17
+
18
+ export const Route = createFileRoute("/calendar/$view/$date/new")({
19
+ component: CalendarComposeRoute,
20
+ });