@vadimcomanescu/nadicode-design-system 4.0.3 → 4.0.5

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 (69) hide show
  1. package/.agents/skills/seed/SKILL.md +24 -3
  2. package/dist/catalog/catalog.d.ts +186 -0
  3. package/dist/catalog/catalog.js +194 -0
  4. package/dist/catalog/components.d.ts +26 -0
  5. package/dist/catalog/components.js +71 -40
  6. package/dist/{chunk-RMGDDOCD.js → chunk-3ZPNIY2Z.js} +2 -2
  7. package/dist/chunk-4KZLCCIR.js +88 -0
  8. package/dist/{chunk-AWZFQQGN.js → chunk-6NCLYJAI.js} +2 -2
  9. package/dist/{chunk-K4U67BVG.js → chunk-7ALMTY6W.js} +1 -1
  10. package/dist/chunk-CZ7NGW7N.js +60 -0
  11. package/dist/chunk-FRGZSR2P.js +86 -0
  12. package/dist/{chunk-LGW7FVG5.js → chunk-HMFIUUYC.js} +1 -1
  13. package/dist/chunk-IC3BMFHV.js +86 -0
  14. package/dist/chunk-JVIRZNQ6.js +37 -0
  15. package/dist/chunk-K5AFXZDL.js +30 -0
  16. package/dist/{chunk-LK2L3C7D.js → chunk-LCMAB2BX.js} +3 -3
  17. package/dist/chunk-LIJYUSSE.js +152 -0
  18. package/dist/chunk-MB6TIORE.js +103 -0
  19. package/dist/chunk-PTJPPKDR.js +115 -0
  20. package/dist/chunk-PV62D7H6.js +75 -0
  21. package/dist/chunk-QVAV4MA2.js +60 -0
  22. package/dist/chunk-RPVG37RB.js +24 -0
  23. package/dist/{chunk-QW5II6YK.js → chunk-TEWCCMRH.js} +2 -2
  24. package/dist/chunk-W74WK3HB.js +184 -0
  25. package/dist/chunk-WVKJNHQM.js +120 -0
  26. package/dist/chunk-XAAJBX6R.js +100 -0
  27. package/dist/chunk-ZXVDDZZL.js +96 -0
  28. package/dist/components/blocks/ApiKeysBlock.d.ts +18 -0
  29. package/dist/components/blocks/ApiKeysBlock.js +128 -0
  30. package/dist/components/blocks/BenchmarksBlock.d.ts +20 -0
  31. package/dist/components/blocks/BenchmarksBlock.js +11 -0
  32. package/dist/components/blocks/CheckEmailBlock.d.ts +9 -0
  33. package/dist/components/blocks/CheckEmailBlock.js +13 -0
  34. package/dist/components/blocks/CommandPaletteBlock.d.ts +9 -0
  35. package/dist/components/blocks/CommandPaletteBlock.js +125 -0
  36. package/dist/components/blocks/EmailVerifiedBlock.d.ts +10 -0
  37. package/dist/components/blocks/EmailVerifiedBlock.js +10 -0
  38. package/dist/components/blocks/ForgotPasswordBlock.d.ts +14 -0
  39. package/dist/components/blocks/ForgotPasswordBlock.js +15 -0
  40. package/dist/components/blocks/IntegrationsBlock.js +4 -4
  41. package/dist/components/blocks/MagicLinkBlock.d.ts +12 -0
  42. package/dist/components/blocks/MagicLinkBlock.js +18 -0
  43. package/dist/components/blocks/OTPBlock.d.ts +10 -0
  44. package/dist/components/blocks/OTPBlock.js +121 -0
  45. package/dist/components/blocks/PasswordChangedBlock.d.ts +10 -0
  46. package/dist/components/blocks/PasswordChangedBlock.js +10 -0
  47. package/dist/components/blocks/PricingTableBlock.d.ts +19 -0
  48. package/dist/components/blocks/PricingTableBlock.js +12 -0
  49. package/dist/components/blocks/SavingsCalculatorBlock.d.ts +30 -0
  50. package/dist/components/blocks/SavingsCalculatorBlock.js +22 -0
  51. package/dist/components/blocks/TimezonePickerBlock.d.ts +11 -0
  52. package/dist/components/blocks/TimezonePickerBlock.js +126 -0
  53. package/dist/components/blocks/WorkspaceSwitcherBlock.d.ts +11 -0
  54. package/dist/components/blocks/WorkspaceSwitcherBlock.js +129 -0
  55. package/dist/components/logos/index.js +3 -3
  56. package/dist/components/page-kits/BlogContentPageKit.js +4 -4
  57. package/dist/components/page-kits/CheckoutPageKit.js +3 -3
  58. package/dist/components/page-kits/CompanySuitePageKit.js +4 -4
  59. package/dist/components/page-kits/LandingPageKit.js +5 -5
  60. package/dist/components/page-kits/MarketingShellPageKit.js +2 -2
  61. package/dist/components/page-kits/PricingPageKit.js +4 -4
  62. package/dist/components/page-kits/ServiceSuitePageKit.js +3 -3
  63. package/dist/components/ui/SearchCommand.js +4 -152
  64. package/dist/hooks/useHotkey.js +1 -37
  65. package/dist/lib/timezones.d.ts +14 -0
  66. package/dist/lib/timezones.js +1 -0
  67. package/package.json +6 -2
  68. package/dist/{chunk-6HGSU24S.js → chunk-4TUJJ3UI.js} +3 -3
  69. package/dist/{chunk-Z233ZQZE.js → chunk-E4L6LR6P.js} +1 -1
@@ -44,11 +44,30 @@ const { LoginBlock, DashboardPageKit } = seedComponents
44
44
 
45
45
  **UI primitives** (Button, Heading, Input, etc.), icons, charts, and effects are imported via individual subpath exports. They are not registered in the catalog.
46
46
 
47
+ ## Catalog-First Rule (MANDATORY)
48
+
49
+ **Before creating any block-level or page-level component, you MUST query `seedComponentDefinitions` for an existing match.** This is non-negotiable.
50
+
51
+ ### The workflow
52
+
53
+ 1. **Check the catalog.** Read `seedComponentDefinitions` keys, descriptions, and props. If a catalog block or page-kit covers >= 70% of the required functionality, USE IT. Pass props, compose with primitives around it, or request missing props upstream.
54
+ 2. **If the catalog block doesn't fit**, document WHY in a code comment at the top of your new component: `// Catalog: <BlockName> exists but doesn't fit because <reason>`. This makes the gap visible for future DS improvement.
55
+ 3. **If no catalog match exists**, build from primitives, but flag the gap: open an issue on the DS repo or leave a `// TODO(catalog-gap): this should be a catalog block` comment.
56
+ 4. **Never silently reimplement** a catalog block. The catalog ships 60+ blocks and 20+ page-kits. Reimplementing from primitives what the catalog already offers is wasted work and creates drift.
57
+
58
+ ### What counts as "block-level"
59
+
60
+ Any component that composes 3+ Seed primitives into a reusable unit (a form section, a settings card, a data display, a modal with form fields). If you're importing Button + Card + Input + Dialog into one component, you're building a block. Check the catalog first.
61
+
62
+ ### Why this matters
63
+
64
+ The catalog is machine-readable, tested, accessible, and themed. Hand-built blocks skip all of that. Every reimplemented block is a maintenance burden that drifts from the DS over time.
65
+
47
66
  ## Read Order
48
67
 
49
68
  1. **This file** -- router, quick references, forbidden patterns, binary rules
50
- 2. **catalog** (`@vadimcomanescu/nadicode-design-system/catalog`) -- machine-readable component metadata (variants, props, tiers)
51
- 3. **`references/`** -- deep dives as needed
69
+ 2. **catalog** (`@vadimcomanescu/nadicode-design-system/catalog`) -- machine-readable component metadata; ALWAYS check before building
70
+ 3. **`references/`** -- deep dives for custom composition (only after confirming catalog doesn't cover your need)
52
71
 
53
72
  ---
54
73
 
@@ -79,6 +98,8 @@ const { LoginBlock, DashboardPageKit } = seedComponents
79
98
  | Hex/rgb in chart config | `var(--color-chart-N)` tokens | Chart colors are tokenized |
80
99
  | Generic English defaults | Override ALL default copy per brand | No shipping placeholder text |
81
100
  | Hardcoded hex in components | Map to semantic tokens | Brand colors via tokens only |
101
+ | Building a block from 3+ primitives without checking catalog | Query `seedComponentDefinitions` first, use catalog block | Catalog-First Rule |
102
+ | Reimplementing a catalog block locally | `const { BlockName } = seedComponents` | Prevents drift and wasted work |
82
103
 
83
104
  ---
84
105
 
@@ -290,7 +311,7 @@ Every page = **Shell > Sections > Components**.
290
311
  - 2-8 sections (vertical bands, no nesting)
291
312
  - 1-6 components per section via CSS grid/flex
292
313
 
293
- Page-kits in the catalog ARE the ready-made compositions. Use `seedComponents.<Name>PageKit` from `@vadimcomanescu/nadicode-design-system/catalog/components` rather than assembling pages by hand.
314
+ **Page-kits are the default.** Before assembling a page from sections and primitives, check if a `*PageKit` exists in the catalog (ProfileSettingsPageKit, DashboardPageKit, AnalyticsPageKit, etc.). Page-kits are pre-composed, tested, accessible, and themed. Only build a page by hand if no page-kit covers your layout. See the Catalog-First Rule above.
294
315
 
295
316
  ### Shell Selection
296
317
 
@@ -39,6 +39,22 @@ export declare const seedComponentDefinitions: {
39
39
  events: string[];
40
40
  description: string;
41
41
  };
42
+ ApiKeysBlock: {
43
+ props: z.ZodObject<{
44
+ keys: z.ZodNullable<z.ZodArray<z.ZodObject<{
45
+ id: z.ZodString;
46
+ name: z.ZodString;
47
+ prefix: z.ZodString;
48
+ createdAt: z.ZodString;
49
+ lastUsedAt: z.ZodNullable<z.ZodString>;
50
+ revokedAt: z.ZodNullable<z.ZodString>;
51
+ }, z.core.$strip>>>;
52
+ title: z.ZodNullable<z.ZodString>;
53
+ description: z.ZodNullable<z.ZodString>;
54
+ }, z.core.$strip>;
55
+ events: string[];
56
+ description: string;
57
+ };
42
58
  ActivityFeedBlock: {
43
59
  props: z.ZodObject<{
44
60
  title: z.ZodNullable<z.ZodString>;
@@ -224,6 +240,24 @@ export declare const seedComponentDefinitions: {
224
240
  events: string[];
225
241
  description: string;
226
242
  };
243
+ BenchmarksBlock: {
244
+ props: z.ZodObject<{
245
+ badgeLabel: z.ZodNullable<z.ZodString>;
246
+ title: z.ZodNullable<z.ZodString>;
247
+ subtitle: z.ZodNullable<z.ZodString>;
248
+ datasets: z.ZodNullable<z.ZodArray<z.ZodObject<{
249
+ name: z.ZodString;
250
+ description: z.ZodString;
251
+ columns: z.ZodArray<z.ZodString>;
252
+ rows: z.ZodArray<z.ZodObject<{
253
+ cells: z.ZodArray<z.ZodString>;
254
+ highlight: z.ZodNullable<z.ZodBoolean>;
255
+ }, z.core.$strip>>;
256
+ }, z.core.$strip>>>;
257
+ staggerMs: z.ZodNullable<z.ZodNumber>;
258
+ }, z.core.$strip>;
259
+ description: string;
260
+ };
227
261
  BannerBlock: {
228
262
  props: z.ZodObject<{
229
263
  variant: z.ZodNullable<z.ZodEnum<{
@@ -297,6 +331,18 @@ export declare const seedComponentDefinitions: {
297
331
  }, z.core.$strip>;
298
332
  description: string;
299
333
  };
334
+ CheckEmailBlock: {
335
+ props: z.ZodObject<{
336
+ email: z.ZodNullable<z.ZodString>;
337
+ type: z.ZodNullable<z.ZodEnum<{
338
+ reset: "reset";
339
+ verification: "verification";
340
+ "magic-link": "magic-link";
341
+ }>>;
342
+ }, z.core.$strip>;
343
+ events: string[];
344
+ description: string;
345
+ };
300
346
  ChartBlock: {
301
347
  props: z.ZodObject<{
302
348
  data: z.ZodNullable<z.ZodArray<z.ZodObject<{
@@ -317,6 +363,18 @@ export declare const seedComponentDefinitions: {
317
363
  props: z.ZodObject<{}, z.core.$strip>;
318
364
  description: string;
319
365
  };
366
+ CommandPaletteBlock: {
367
+ props: z.ZodObject<{
368
+ items: z.ZodNullable<z.ZodArray<z.ZodObject<{
369
+ id: z.ZodString;
370
+ title: z.ZodString;
371
+ group: z.ZodNullable<z.ZodString>;
372
+ }, z.core.$strip>>>;
373
+ placeholder: z.ZodNullable<z.ZodString>;
374
+ }, z.core.$strip>;
375
+ events: string[];
376
+ description: string;
377
+ };
320
378
  ComparisonBlock: {
321
379
  props: z.ZodObject<{
322
380
  title: z.ZodNullable<z.ZodString>;
@@ -387,6 +445,16 @@ export declare const seedComponentDefinitions: {
387
445
  }, z.core.$strip>;
388
446
  description: string;
389
447
  };
448
+ EmailVerifiedBlock: {
449
+ props: z.ZodObject<{
450
+ title: z.ZodNullable<z.ZodString>;
451
+ description: z.ZodNullable<z.ZodString>;
452
+ buttonText: z.ZodNullable<z.ZodString>;
453
+ autoRedirectSeconds: z.ZodNullable<z.ZodNumber>;
454
+ }, z.core.$strip>;
455
+ events: string[];
456
+ description: string;
457
+ };
390
458
  FAQBlock: {
391
459
  props: z.ZodObject<{
392
460
  title: z.ZodNullable<z.ZodString>;
@@ -432,6 +500,19 @@ export declare const seedComponentDefinitions: {
432
500
  }, z.core.$strip>;
433
501
  description: string;
434
502
  };
503
+ ForgotPasswordBlock: {
504
+ props: z.ZodObject<{
505
+ title: z.ZodNullable<z.ZodString>;
506
+ description: z.ZodNullable<z.ZodString>;
507
+ successTitle: z.ZodNullable<z.ZodString>;
508
+ submitLabel: z.ZodNullable<z.ZodString>;
509
+ loadingLabel: z.ZodNullable<z.ZodString>;
510
+ backLabel: z.ZodNullable<z.ZodString>;
511
+ emailPlaceholder: z.ZodNullable<z.ZodString>;
512
+ }, z.core.$strip>;
513
+ events: string[];
514
+ description: string;
515
+ };
435
516
  FooterBlock: {
436
517
  props: z.ZodObject<{
437
518
  brandDescription: z.ZodNullable<z.ZodString>;
@@ -605,6 +686,17 @@ export declare const seedComponentDefinitions: {
605
686
  forgotPasswordHref: string;
606
687
  };
607
688
  };
689
+ MagicLinkBlock: {
690
+ props: z.ZodObject<{
691
+ title: z.ZodNullable<z.ZodString>;
692
+ subtitle: z.ZodNullable<z.ZodString>;
693
+ successTitle: z.ZodNullable<z.ZodString>;
694
+ expiryMinutes: z.ZodNullable<z.ZodNumber>;
695
+ placeholder: z.ZodNullable<z.ZodString>;
696
+ }, z.core.$strip>;
697
+ events: string[];
698
+ description: string;
699
+ };
608
700
  NewsletterBlock: {
609
701
  props: z.ZodObject<{
610
702
  title: z.ZodNullable<z.ZodString>;
@@ -626,6 +718,26 @@ export declare const seedComponentDefinitions: {
626
718
  events: string[];
627
719
  description: string;
628
720
  };
721
+ OTPBlock: {
722
+ props: z.ZodObject<{
723
+ title: z.ZodNullable<z.ZodString>;
724
+ description: z.ZodNullable<z.ZodString>;
725
+ maxLength: z.ZodNullable<z.ZodNumber>;
726
+ buttonText: z.ZodNullable<z.ZodString>;
727
+ }, z.core.$strip>;
728
+ events: string[];
729
+ description: string;
730
+ };
731
+ PasswordChangedBlock: {
732
+ props: z.ZodObject<{
733
+ autoRedirectSeconds: z.ZodNullable<z.ZodNumber>;
734
+ title: z.ZodNullable<z.ZodString>;
735
+ description: z.ZodNullable<z.ZodString>;
736
+ buttonLabel: z.ZodNullable<z.ZodString>;
737
+ }, z.core.$strip>;
738
+ events: string[];
739
+ description: string;
740
+ };
629
741
  PasswordRecoveryBlock: {
630
742
  props: z.ZodObject<{
631
743
  mode: z.ZodNullable<z.ZodEnum<{
@@ -662,6 +774,27 @@ export declare const seedComponentDefinitions: {
662
774
  showBillingToggle: boolean;
663
775
  };
664
776
  };
777
+ PricingTableBlock: {
778
+ props: z.ZodObject<{
779
+ heading: z.ZodNullable<z.ZodString>;
780
+ subheading: z.ZodNullable<z.ZodString>;
781
+ plans: z.ZodNullable<z.ZodArray<z.ZodObject<{
782
+ name: z.ZodString;
783
+ price: z.ZodString;
784
+ period: z.ZodString;
785
+ description: z.ZodString;
786
+ features: z.ZodArray<z.ZodString>;
787
+ highlighted: z.ZodOptional<z.ZodBoolean>;
788
+ badge: z.ZodOptional<z.ZodString>;
789
+ buttonVariant: z.ZodOptional<z.ZodEnum<{
790
+ outline: "outline";
791
+ primary: "primary";
792
+ }>>;
793
+ }, z.core.$strip>>>;
794
+ }, z.core.$strip>;
795
+ events: string[];
796
+ description: string;
797
+ };
665
798
  ProcessFlowBlock: {
666
799
  props: z.ZodObject<{
667
800
  title: z.ZodNullable<z.ZodString>;
@@ -696,6 +829,33 @@ export declare const seedComponentDefinitions: {
696
829
  showSocial: boolean;
697
830
  };
698
831
  };
832
+ SavingsCalculatorBlock: {
833
+ props: z.ZodObject<{
834
+ title: z.ZodNullable<z.ZodString>;
835
+ description: z.ZodNullable<z.ZodString>;
836
+ badgeLabel: z.ZodNullable<z.ZodString>;
837
+ billingTitle: z.ZodNullable<z.ZodString>;
838
+ billingDescription: z.ZodNullable<z.ZodString>;
839
+ billingModels: z.ZodNullable<z.ZodArray<z.ZodObject<{
840
+ model: z.ZodString;
841
+ inputRate: z.ZodString;
842
+ savedPerRead: z.ZodString;
843
+ }, z.core.$strip>>>;
844
+ projectionTitle: z.ZodNullable<z.ZodString>;
845
+ projectionDescription: z.ZodNullable<z.ZodString>;
846
+ projections: z.ZodNullable<z.ZodArray<z.ZodObject<{
847
+ label: z.ZodString;
848
+ amount: z.ZodNumber;
849
+ suffix: z.ZodString;
850
+ detail: z.ZodString;
851
+ }, z.core.$strip>>>;
852
+ summaryItems: z.ZodNullable<z.ZodArray<z.ZodObject<{
853
+ label: z.ZodString;
854
+ value: z.ZodString;
855
+ }, z.core.$strip>>>;
856
+ }, z.core.$strip>;
857
+ description: string;
858
+ };
699
859
  SocialProofBlock: {
700
860
  props: z.ZodObject<{
701
861
  variant: z.ZodNullable<z.ZodEnum<{
@@ -821,6 +981,24 @@ export declare const seedComponentDefinitions: {
821
981
  events: string[];
822
982
  description: string;
823
983
  };
984
+ TimezonePickerBlock: {
985
+ props: z.ZodObject<{
986
+ value: z.ZodNullable<z.ZodString>;
987
+ groups: z.ZodNullable<z.ZodArray<z.ZodObject<{
988
+ region: z.ZodString;
989
+ timezones: z.ZodArray<z.ZodObject<{
990
+ value: z.ZodString;
991
+ label: z.ZodString;
992
+ region: z.ZodString;
993
+ offset: z.ZodString;
994
+ offsetMinutes: z.ZodNumber;
995
+ }, z.core.$strip>>;
996
+ }, z.core.$strip>>>;
997
+ name: z.ZodNullable<z.ZodString>;
998
+ }, z.core.$strip>;
999
+ events: string[];
1000
+ description: string;
1001
+ };
824
1002
  UsageDonutBlock: {
825
1003
  props: z.ZodObject<{
826
1004
  data: z.ZodNullable<z.ZodArray<z.ZodObject<{
@@ -1026,6 +1204,14 @@ export declare const seedComponentDefinitions: {
1026
1204
  events: string[];
1027
1205
  description: string;
1028
1206
  };
1207
+ WorkspaceSwitcherBlock: {
1208
+ props: z.ZodObject<{
1209
+ name: z.ZodNullable<z.ZodString>;
1210
+ plan: z.ZodNullable<z.ZodString>;
1211
+ href: z.ZodNullable<z.ZodString>;
1212
+ }, z.core.$strip>;
1213
+ description: string;
1214
+ };
1029
1215
  AccountLockedPageKit: {
1030
1216
  props: z.ZodObject<{
1031
1217
  reason: z.ZodNullable<z.ZodEnum<{
@@ -58,6 +58,24 @@ var seedComponentDefinitions = {
58
58
  events: ["contactSupport", "backToLogin"],
59
59
  description: "Account locked notification with reason, countdown timer, and support/login actions."
60
60
  },
61
+ ApiKeysBlock: {
62
+ props: z.object({
63
+ keys: z.array(
64
+ z.object({
65
+ id: z.string(),
66
+ name: z.string(),
67
+ prefix: z.string(),
68
+ createdAt: z.string(),
69
+ lastUsedAt: z.string().nullable(),
70
+ revokedAt: z.string().nullable()
71
+ })
72
+ ).nullable(),
73
+ title: z.string().nullable(),
74
+ description: z.string().nullable()
75
+ }),
76
+ events: ["create", "revoke"],
77
+ description: "API key management block with table display, create dialog, copy-once flow, and revoke functionality."
78
+ },
61
79
  ActivityFeedBlock: {
62
80
  props: z.object({
63
81
  title: z.string().nullable(),
@@ -222,6 +240,28 @@ var seedComponentDefinitions = {
222
240
  events: ["composerChange", "composerSend"],
223
241
  description: "Agent workbench with conversation thread, code artifacts, diffs, terminal logs, and composer input."
224
242
  },
243
+ BenchmarksBlock: {
244
+ props: z.object({
245
+ badgeLabel: z.string().nullable(),
246
+ title: z.string().nullable(),
247
+ subtitle: z.string().nullable(),
248
+ datasets: z.array(
249
+ z.object({
250
+ name: z.string(),
251
+ description: z.string(),
252
+ columns: z.array(z.string()),
253
+ rows: z.array(
254
+ z.object({
255
+ cells: z.array(z.string()),
256
+ highlight: z.boolean().nullable()
257
+ })
258
+ )
259
+ })
260
+ ).nullable(),
261
+ staggerMs: z.number().nullable()
262
+ }),
263
+ description: "Benchmark results grid with tabular datasets, badge header, and staggered card animation."
264
+ },
225
265
  BannerBlock: {
226
266
  props: z.object({
227
267
  variant: z.enum(["info", "warning", "accent"]).nullable(),
@@ -269,6 +309,14 @@ var seedComponentDefinitions = {
269
309
  }),
270
310
  description: "Changelog display with versioned entries and categorized changes."
271
311
  },
312
+ CheckEmailBlock: {
313
+ props: z.object({
314
+ email: z.string().nullable(),
315
+ type: z.enum(["verification", "reset", "magic-link"]).nullable()
316
+ }),
317
+ events: ["resend", "backToLogin"],
318
+ description: "Post-submission email check prompt with resend action and step-by-step instructions."
319
+ },
272
320
  ChartBlock: {
273
321
  props: z.object({
274
322
  data: z.array(
@@ -288,6 +336,20 @@ var seedComponentDefinitions = {
288
336
  props: z.object({}),
289
337
  description: "Pre-composed collection of multiple chart types displayed in a dashboard grid."
290
338
  },
339
+ CommandPaletteBlock: {
340
+ props: z.object({
341
+ items: z.array(
342
+ z.object({
343
+ id: z.string(),
344
+ title: z.string(),
345
+ group: z.string().nullable()
346
+ })
347
+ ).nullable(),
348
+ placeholder: z.string().nullable()
349
+ }),
350
+ events: ["select"],
351
+ description: "Keyboard-driven command palette with fuzzy search, hotkey trigger (Cmd+K), and responsive trigger button."
352
+ },
291
353
  ComparisonBlock: {
292
354
  props: z.object({
293
355
  title: z.string().nullable(),
@@ -361,6 +423,16 @@ var seedComponentDefinitions = {
361
423
  }),
362
424
  description: "Navigation directory with sidebar items and project listings."
363
425
  },
426
+ EmailVerifiedBlock: {
427
+ props: z.object({
428
+ title: z.string().nullable(),
429
+ description: z.string().nullable(),
430
+ buttonText: z.string().nullable(),
431
+ autoRedirectSeconds: z.number().nullable()
432
+ }),
433
+ events: ["continue"],
434
+ description: "Email verification success card with check icon, continue button, and optional auto-redirect countdown."
435
+ },
364
436
  FAQBlock: {
365
437
  props: z.object({
366
438
  title: z.string().nullable(),
@@ -404,6 +476,19 @@ var seedComponentDefinitions = {
404
476
  }),
405
477
  description: "Simple feature grid with title and description per feature card."
406
478
  },
479
+ ForgotPasswordBlock: {
480
+ props: z.object({
481
+ title: z.string().nullable(),
482
+ description: z.string().nullable(),
483
+ successTitle: z.string().nullable(),
484
+ submitLabel: z.string().nullable(),
485
+ loadingLabel: z.string().nullable(),
486
+ backLabel: z.string().nullable(),
487
+ emailPlaceholder: z.string().nullable()
488
+ }),
489
+ events: ["submit", "backToLogin"],
490
+ description: "Forgot password form with email input, loading state, and success confirmation."
491
+ },
407
492
  FooterBlock: {
408
493
  props: z.object({
409
494
  brandDescription: z.string().nullable(),
@@ -545,6 +630,17 @@ var seedComponentDefinitions = {
545
630
  description: "Authentication login form with email/password fields and optional social login buttons.",
546
631
  example: { showSocial: true, forgotPasswordHref: "/reset-password" }
547
632
  },
633
+ MagicLinkBlock: {
634
+ props: z.object({
635
+ title: z.string().nullable(),
636
+ subtitle: z.string().nullable(),
637
+ successTitle: z.string().nullable(),
638
+ expiryMinutes: z.number().nullable(),
639
+ placeholder: z.string().nullable()
640
+ }),
641
+ events: ["submit", "backToLogin"],
642
+ description: "Magic link authentication form with email input, loading state, and success confirmation with expiry info."
643
+ },
548
644
  NewsletterBlock: {
549
645
  props: z.object({
550
646
  title: z.string().nullable(),
@@ -568,6 +664,26 @@ var seedComponentDefinitions = {
568
664
  events: ["toggle"],
569
665
  description: "Onboarding checklist with toggleable step completion tracking."
570
666
  },
667
+ OTPBlock: {
668
+ props: z.object({
669
+ title: z.string().nullable(),
670
+ description: z.string().nullable(),
671
+ maxLength: z.number().nullable(),
672
+ buttonText: z.string().nullable()
673
+ }),
674
+ events: ["verify"],
675
+ description: "OTP verification card with configurable code length, title, and verify callback."
676
+ },
677
+ PasswordChangedBlock: {
678
+ props: z.object({
679
+ autoRedirectSeconds: z.number().nullable(),
680
+ title: z.string().nullable(),
681
+ description: z.string().nullable(),
682
+ buttonLabel: z.string().nullable()
683
+ }),
684
+ events: ["continue"],
685
+ description: "Password change success confirmation with optional auto-redirect countdown and continue-to-login action."
686
+ },
571
687
  PasswordRecoveryBlock: {
572
688
  props: z.object({
573
689
  mode: z.enum(["reset", "magic-link"]).nullable(),
@@ -600,6 +716,26 @@ var seedComponentDefinitions = {
600
716
  description: "Pricing table with plan comparison, billing toggle, and feature lists.",
601
717
  example: { title: "Simple, transparent pricing", showBillingToggle: true }
602
718
  },
719
+ PricingTableBlock: {
720
+ props: z.object({
721
+ heading: z.string().nullable(),
722
+ subheading: z.string().nullable(),
723
+ plans: z.array(
724
+ z.object({
725
+ name: z.string(),
726
+ price: z.string(),
727
+ period: z.string(),
728
+ description: z.string(),
729
+ features: z.array(z.string()),
730
+ highlighted: z.boolean().optional(),
731
+ badge: z.string().optional(),
732
+ buttonVariant: z.enum(["primary", "outline"]).optional()
733
+ })
734
+ ).nullable()
735
+ }),
736
+ events: ["selectPlan"],
737
+ description: "Pricing comparison table with tiered plan cards, feature lists, and call-to-action buttons."
738
+ },
603
739
  ProcessFlowBlock: {
604
740
  props: z.object({
605
741
  title: z.string().nullable(),
@@ -633,6 +769,34 @@ var seedComponentDefinitions = {
633
769
  description: "Sign-up form with name, email, and password fields. Optional social login buttons.",
634
770
  example: { title: "Create an Account", showSocial: true }
635
771
  },
772
+ SavingsCalculatorBlock: {
773
+ props: z.object({
774
+ title: z.string().nullable(),
775
+ description: z.string().nullable(),
776
+ badgeLabel: z.string().nullable(),
777
+ billingTitle: z.string().nullable(),
778
+ billingDescription: z.string().nullable(),
779
+ billingModels: z.array(
780
+ z.object({
781
+ model: z.string(),
782
+ inputRate: z.string(),
783
+ savedPerRead: z.string()
784
+ })
785
+ ).nullable(),
786
+ projectionTitle: z.string().nullable(),
787
+ projectionDescription: z.string().nullable(),
788
+ projections: z.array(
789
+ z.object({
790
+ label: z.string(),
791
+ amount: z.number(),
792
+ suffix: z.string(),
793
+ detail: z.string()
794
+ })
795
+ ).nullable(),
796
+ summaryItems: z.array(z.object({ label: z.string(), value: z.string() })).nullable()
797
+ }),
798
+ description: "Savings calculator block with billing table and monthly projection cards featuring animated counting numbers."
799
+ },
636
800
  SocialProofBlock: {
637
801
  props: z.object({
638
802
  variant: z.enum(["logo-cloud", "testimonials"]).nullable(),
@@ -761,6 +925,28 @@ var seedComponentDefinitions = {
761
925
  events: ["verify", "complete"],
762
926
  description: "Two-factor setup wizard with QR code, secret key display, backup codes, and verification."
763
927
  },
928
+ TimezonePickerBlock: {
929
+ props: z.object({
930
+ value: z.string().nullable(),
931
+ groups: z.array(
932
+ z.object({
933
+ region: z.string(),
934
+ timezones: z.array(
935
+ z.object({
936
+ value: z.string(),
937
+ label: z.string(),
938
+ region: z.string(),
939
+ offset: z.string(),
940
+ offsetMinutes: z.number()
941
+ })
942
+ )
943
+ })
944
+ ).nullable(),
945
+ name: z.string().nullable()
946
+ }),
947
+ events: ["change"],
948
+ description: "Searchable timezone picker with grouped IANA timezones, offset display, and form integration."
949
+ },
764
950
  UsageDonutBlock: {
765
951
  props: z.object({
766
952
  data: z.array(
@@ -965,6 +1151,14 @@ var seedComponentDefinitions = {
965
1151
  events: ["finish"],
966
1152
  description: "Opinionated multi-step wizard card with Stepper progress indicator and built-in step content slots. Handles account, profile, plan, and launch steps by default. Use for onboarding and setup flows."
967
1153
  },
1154
+ WorkspaceSwitcherBlock: {
1155
+ props: z.object({
1156
+ name: z.string().nullable(),
1157
+ plan: z.string().nullable(),
1158
+ href: z.string().nullable()
1159
+ }),
1160
+ description: "Sidebar workspace switcher button with icon, workspace name, and plan label. Renders inside a SidebarMenu."
1161
+ },
968
1162
  // =========================================================================
969
1163
  // Page Kits (28 entries, alphabetical)
970
1164
  // =========================================================================