@vadimcomanescu/nadicode-design-system 2.0.6 → 2.0.7

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 (177) hide show
  1. package/.agents/skills/seed/contract.md +1 -0
  2. package/.agents/skills/seed/recipes/marketing-shell.md +10 -19
  3. package/.agents/skills/seed/recipes/navigation-shell.md +5 -5
  4. package/.agents/skills/seed/recipes/service-detail.md +1 -1
  5. package/.agents/skills/seed/references/blocks.md +25 -24
  6. package/.agents/skills/seed/references/brand-override.md +3 -1
  7. package/css/tokens.css +300 -122
  8. package/dist/catalog.json +1926 -125
  9. package/dist/chunk-2BADJLMV.js +117 -0
  10. package/dist/chunk-35EX5FP5.js +106 -0
  11. package/dist/chunk-5PORR6LE.js +60 -0
  12. package/dist/chunk-5PZ4VR2D.js +142 -0
  13. package/dist/chunk-5UESKK6S.js +76 -0
  14. package/dist/chunk-6N6CSJVE.js +269 -0
  15. package/dist/chunk-AURJQZC4.js +110 -0
  16. package/dist/{chunk-DF47R6LN.js → chunk-AWIG4QN6.js} +9 -9
  17. package/dist/chunk-AYWL4IYM.js +67 -0
  18. package/dist/{chunk-SV3KZ6CB.js → chunk-DSMGCFMJ.js} +7 -2
  19. package/dist/chunk-E4L6LR6P.js +33 -0
  20. package/dist/chunk-EJNF6JLL.js +105 -0
  21. package/dist/chunk-FX23F33E.js +57 -0
  22. package/dist/chunk-GJPTPLCQ.js +52 -0
  23. package/dist/chunk-GV4PKHG4.js +147 -0
  24. package/dist/chunk-HJ3A2YNO.js +163 -0
  25. package/dist/chunk-HJZRSPWB.js +38 -0
  26. package/dist/chunk-IDKZEPWK.js +133 -0
  27. package/dist/chunk-K7NQ6ZAW.js +84 -0
  28. package/dist/chunk-LCKLZ4XK.js +60 -0
  29. package/dist/chunk-MX5FUFQR.js +205 -0
  30. package/dist/chunk-NEHCPO53.js +44 -0
  31. package/dist/chunk-OHOOQUVJ.js +113 -0
  32. package/dist/chunk-QIHA7S3A.js +36 -0
  33. package/dist/chunk-RKQPU75I.js +126 -0
  34. package/dist/chunk-RMLS2QUC.js +77 -0
  35. package/dist/chunk-TS2JSPQR.js +120 -0
  36. package/dist/chunk-TUKZKU72.js +110 -0
  37. package/dist/chunk-TZXZFSD2.js +33 -0
  38. package/dist/chunk-UGV45DH3.js +18 -0
  39. package/dist/chunk-VBZQ4DBE.js +52 -0
  40. package/dist/{chunk-LQLFA2EL.js → chunk-VDONTZZX.js} +2 -2
  41. package/dist/{chunk-RWNJ54CI.js → chunk-VN475YZS.js} +1 -1
  42. package/dist/chunk-VZCB4APK.js +94 -0
  43. package/dist/chunk-W7FXDRQJ.js +94 -0
  44. package/dist/chunk-WAVU744B.js +183 -0
  45. package/dist/{chunk-5I3FWRC5.js → chunk-WOYBVPXK.js} +10 -10
  46. package/dist/chunk-WST5NLLC.js +73 -0
  47. package/dist/chunk-X6VXWEDO.js +125 -0
  48. package/dist/chunk-ZM2NODUK.js +39 -0
  49. package/dist/components/blocks/AccountLockedBlock.js +7 -57
  50. package/dist/components/blocks/ActivityFeedBlock.js +6 -39
  51. package/dist/components/blocks/AgentConversationBlock.js +5 -33
  52. package/dist/components/blocks/AudioVisualizerBlock.d.ts +1 -1
  53. package/dist/components/blocks/AudioVisualizerBlock.js +2 -2
  54. package/dist/components/blocks/AuthSuccessBlock.js +5 -60
  55. package/dist/components/blocks/BarChartBlock.d.ts +1 -1
  56. package/dist/components/blocks/BarChartBlock.js +2 -2
  57. package/dist/components/blocks/CallToActionBlock.d.ts +1 -1
  58. package/dist/components/blocks/CallToActionBlock.js +6 -52
  59. package/dist/components/blocks/ChangelogBlock.js +8 -105
  60. package/dist/components/blocks/ChartCollectionBlock.js +2 -2
  61. package/dist/components/blocks/CodeBlock.js +7 -60
  62. package/dist/components/blocks/ComparisonBlock.js +9 -94
  63. package/dist/components/blocks/ContactBlock.js +11 -120
  64. package/dist/components/blocks/FAQBlock.js +6 -44
  65. package/dist/components/blocks/FeatureBlock.d.ts +10 -14
  66. package/dist/components/blocks/FeatureBlock.js +17 -159
  67. package/dist/components/blocks/FeatureGridBlock.d.ts +1 -1
  68. package/dist/components/blocks/FeatureGridBlock.js +2 -2
  69. package/dist/components/blocks/FooterBlock.d.ts +2 -2
  70. package/dist/components/blocks/FooterBlock.js +11 -67
  71. package/dist/components/blocks/HeaderBlock.d.ts +2 -2
  72. package/dist/components/blocks/HeaderBlock.js +1 -1
  73. package/dist/components/blocks/HeatmapChartBlock.d.ts +1 -1
  74. package/dist/components/blocks/HeatmapChartBlock.js +1 -1
  75. package/dist/components/blocks/HeroBlock.d.ts +6 -3
  76. package/dist/components/blocks/HeroBlock.js +16 -199
  77. package/dist/components/blocks/HeroSectionBlock.d.ts +1 -1
  78. package/dist/components/blocks/HeroSectionBlock.js +4 -4
  79. package/dist/components/blocks/IntegrationsBlock.d.ts +1 -1
  80. package/dist/components/blocks/IntegrationsBlock.js +4 -4
  81. package/dist/components/blocks/InteractiveAreaChartBlock.d.ts +1 -1
  82. package/dist/components/blocks/InteractiveAreaChartBlock.js +2 -2
  83. package/dist/components/blocks/NewsletterBlock.js +11 -84
  84. package/dist/components/blocks/PasswordRecoveryBlock.js +14 -142
  85. package/dist/components/blocks/PricingBlock.d.ts +1 -1
  86. package/dist/components/blocks/PricingBlock.js +11 -110
  87. package/dist/components/blocks/ProcessFlowBlock.js +10 -77
  88. package/dist/components/blocks/ResetPasswordBlock.js +11 -125
  89. package/dist/components/blocks/SignUpBlock.d.ts +1 -1
  90. package/dist/components/blocks/SignUpBlock.js +2 -2
  91. package/dist/components/blocks/SocialProofBlock.d.ts +7 -11
  92. package/dist/components/blocks/SocialProofBlock.js +8 -107
  93. package/dist/components/blocks/StatsBlock.d.ts +1 -1
  94. package/dist/components/blocks/StatsBlock.js +2 -2
  95. package/dist/components/blocks/StatsMarketingBlock.d.ts +1 -1
  96. package/dist/components/blocks/StatsMarketingBlock.js +5 -36
  97. package/dist/components/blocks/TeamBlock.d.ts +1 -1
  98. package/dist/components/blocks/TeamBlock.js +4 -52
  99. package/dist/components/blocks/TestimonialsBlock.d.ts +1 -1
  100. package/dist/components/blocks/TestimonialsBlock.js +4 -133
  101. package/dist/components/blocks/TwoFactorChallengeBlock.js +9 -94
  102. package/dist/components/blocks/TwoFactorSetupBlock.js +16 -183
  103. package/dist/components/blocks/UsageDonutBlock.d.ts +1 -1
  104. package/dist/components/blocks/UsageDonutBlock.js +2 -2
  105. package/dist/components/logos/index.js +2 -2
  106. package/dist/components/page-kits/AccountLockedPageKit.d.ts +10 -0
  107. package/dist/components/page-kits/AccountLockedPageKit.js +48 -0
  108. package/dist/components/page-kits/AgentsChatPageKit.d.ts +46 -0
  109. package/dist/components/page-kits/AgentsChatPageKit.js +289 -0
  110. package/dist/components/page-kits/AnalyticsPageKit.d.ts +49 -0
  111. package/dist/components/page-kits/AnalyticsPageKit.js +277 -0
  112. package/dist/components/page-kits/BlogContentPageKit.d.ts +64 -0
  113. package/dist/components/page-kits/BlogContentPageKit.js +296 -0
  114. package/dist/components/page-kits/CheckoutPageKit.d.ts +36 -0
  115. package/dist/components/page-kits/CheckoutPageKit.js +209 -0
  116. package/dist/components/page-kits/CompanySuitePageKit.d.ts +25 -0
  117. package/dist/components/page-kits/CompanySuitePageKit.js +240 -0
  118. package/dist/components/page-kits/CrudFormPageKit.d.ts +54 -0
  119. package/dist/components/page-kits/CrudFormPageKit.js +138 -0
  120. package/dist/components/page-kits/CrudListDetailPageKit.d.ts +70 -0
  121. package/dist/components/page-kits/CrudListDetailPageKit.js +138 -0
  122. package/dist/components/page-kits/DashboardPageKit.d.ts +39 -0
  123. package/dist/components/page-kits/DashboardPageKit.js +284 -0
  124. package/dist/components/page-kits/ErrorPageKit.d.ts +22 -0
  125. package/dist/components/page-kits/ErrorPageKit.js +55 -0
  126. package/dist/components/page-kits/KanbanBoardPageKit.d.ts +31 -0
  127. package/dist/components/page-kits/KanbanBoardPageKit.js +305 -0
  128. package/dist/components/page-kits/LandingPageKit.d.ts +29 -0
  129. package/dist/components/page-kits/LandingPageKit.js +221 -0
  130. package/dist/components/page-kits/LoginPageKit.d.ts +16 -0
  131. package/dist/components/page-kits/LoginPageKit.js +43 -0
  132. package/dist/components/page-kits/MarketingShellPageKit.d.ts +21 -0
  133. package/dist/components/page-kits/MarketingShellPageKit.js +131 -0
  134. package/dist/components/page-kits/NavigationShellPageKit.d.ts +41 -0
  135. package/dist/components/page-kits/NavigationShellPageKit.js +132 -0
  136. package/dist/components/page-kits/OnboardingPageKit.d.ts +26 -0
  137. package/dist/components/page-kits/OnboardingPageKit.js +248 -0
  138. package/dist/components/page-kits/PricingPageKit.d.ts +41 -0
  139. package/dist/components/page-kits/PricingPageKit.js +279 -0
  140. package/dist/components/page-kits/ProfileSettingsPageKit.d.ts +50 -0
  141. package/dist/components/page-kits/ProfileSettingsPageKit.js +171 -0
  142. package/dist/components/page-kits/RecoveryPageKit.d.ts +17 -0
  143. package/dist/components/page-kits/RecoveryPageKit.js +58 -0
  144. package/dist/components/page-kits/ResetPageKit.d.ts +14 -0
  145. package/dist/components/page-kits/ResetPageKit.js +52 -0
  146. package/dist/components/page-kits/ServiceSuitePageKit.d.ts +25 -0
  147. package/dist/components/page-kits/ServiceSuitePageKit.js +320 -0
  148. package/dist/components/page-kits/SettingsPageKit.d.ts +27 -0
  149. package/dist/components/page-kits/SettingsPageKit.js +11 -0
  150. package/dist/components/page-kits/SignupPageKit.d.ts +15 -0
  151. package/dist/components/page-kits/SignupPageKit.js +41 -0
  152. package/dist/components/page-kits/SuccessPageKit.d.ts +15 -0
  153. package/dist/components/page-kits/SuccessPageKit.js +146 -0
  154. package/dist/components/page-kits/TeamSettingsPageKit.d.ts +50 -0
  155. package/dist/components/page-kits/TeamSettingsPageKit.js +297 -0
  156. package/dist/components/page-kits/TwoFactorPageKit.d.ts +16 -0
  157. package/dist/components/page-kits/TwoFactorPageKit.js +156 -0
  158. package/dist/components/page-kits/VerifyEmailPageKit.d.ts +15 -0
  159. package/dist/components/page-kits/VerifyEmailPageKit.js +146 -0
  160. package/dist/components/page-kits/VoiceAgentsPageKit.d.ts +35 -0
  161. package/dist/components/page-kits/VoiceAgentsPageKit.js +246 -0
  162. package/dist/components/ui/AudioWaveform.js +2 -76
  163. package/dist/components/ui/AvatarUpload.js +1 -1
  164. package/dist/components/ui/Breadcrumb.js +4 -106
  165. package/dist/components/ui/ChartCard.js +5 -38
  166. package/dist/components/ui/CheckoutFormDemo.js +5 -6
  167. package/dist/components/ui/DataFreshness.js +2 -73
  168. package/dist/components/ui/MouseEffect.js +1 -1
  169. package/dist/components/ui/NativeSelect.js +2 -18
  170. package/dist/components/ui/Pagination.js +6 -117
  171. package/dist/components/ui/ShaderBackground.js +2 -2
  172. package/dist/hooks/use-shader-preset.js +2 -2
  173. package/dist/lib/shader-presets.js +1 -1
  174. package/dist/lib/tokens.config.d.ts +19 -0
  175. package/package.json +792 -680
  176. package/scripts/ds-check.mjs +8 -0
  177. package/src/lib/tokens.config.js +63 -41
@@ -0,0 +1,57 @@
1
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from './chunk-AH6YSYYT.js';
2
+ import { Alert, AlertDescription } from './chunk-GJUR6HT3.js';
3
+ import { Button } from './chunk-7KIDDF3I.js';
4
+ import { useMotionConfig, m, scaleIn, motionSpring } from './chunk-PD2YEH3H.js';
5
+ import { LockIcon } from './chunk-RYOTIXZO.js';
6
+ import { cn } from './chunk-QYZT24TS.js';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var reasonMessages = {
10
+ too_many_attempts: (minutes) => `Too many failed login attempts.${minutes ? ` Try again in ${minutes} minutes.` : ""}`,
11
+ suspicious_activity: () => "We detected unusual activity on your account.",
12
+ admin: () => "Your account has been locked by an administrator."
13
+ };
14
+ function AccountLockedBlock({
15
+ className,
16
+ reason = "too_many_attempts",
17
+ unlockMinutes,
18
+ onContactSupport,
19
+ onBackToLogin,
20
+ title = "Account locked",
21
+ description = "Your account has been temporarily locked for security"
22
+ }) {
23
+ const motionConfig = useMotionConfig();
24
+ return /* @__PURE__ */ jsx(m.div, { ...scaleIn, className: cn("w-full max-w-md mx-auto", className), children: /* @__PURE__ */ jsxs(Card, { children: [
25
+ /* @__PURE__ */ jsxs(CardHeader, { className: "text-center", children: [
26
+ /* @__PURE__ */ jsx(
27
+ m.div,
28
+ {
29
+ className: "mx-auto mb-2",
30
+ initial: { x: 0 },
31
+ animate: { x: [0, -4, 4, -4, 4, 0] },
32
+ transition: { ...motionSpring.gentle, delay: 0.3, ...motionConfig },
33
+ children: /* @__PURE__ */ jsx("div", { className: "flex h-16 w-16 items-center justify-center rounded-full bg-destructive/10 shadow-[0_0_24px_rgb(var(--color-destructive)/0.2)]", children: /* @__PURE__ */ jsx(LockIcon, { size: 32, className: "text-destructive" }) })
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-2xl", children: title }),
37
+ /* @__PURE__ */ jsx(CardDescription, { children: description })
38
+ ] }),
39
+ /* @__PURE__ */ jsxs(CardContent, { className: "grid gap-4", children: [
40
+ /* @__PURE__ */ jsx(Alert, { variant: "warning", children: /* @__PURE__ */ jsx(AlertDescription, { children: reasonMessages[reason](unlockMinutes) }) }),
41
+ reason === "too_many_attempts" && unlockMinutes && /* @__PURE__ */ jsx("p", { className: "text-center text-sm text-text-tertiary", children: "Your account will be automatically unlocked after the waiting period." }),
42
+ (reason === "suspicious_activity" || reason === "admin") && /* @__PURE__ */ jsx("p", { className: "text-center text-sm text-text-tertiary", children: "Please contact support to regain access to your account." }),
43
+ /* @__PURE__ */ jsx(Button, { variant: "outline", className: "w-full", onClick: onContactSupport, children: "Contact support" })
44
+ ] }),
45
+ /* @__PURE__ */ jsx(CardFooter, { className: "justify-center", children: /* @__PURE__ */ jsx(
46
+ "button",
47
+ {
48
+ type: "button",
49
+ onClick: onBackToLogin,
50
+ className: "text-sm text-text-tertiary hover:text-text-primary transition-colors",
51
+ children: "Back to login"
52
+ }
53
+ ) })
54
+ ] }) });
55
+ }
56
+
57
+ export { AccountLockedBlock };
@@ -0,0 +1,52 @@
1
+ import { ShimmeringText } from './chunk-SGI25ZJ6.js';
2
+ import { StaggerChildren } from './chunk-DQPK2XRL.js';
3
+ import { Heading } from './chunk-WI547C47.js';
4
+ import { siteConfig } from './chunk-A7NUWD76.js';
5
+ import { Button } from './chunk-7KIDDF3I.js';
6
+ import Link from 'next/link';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var defaultDescription = `Join thousands of developers building premium interfaces with ${siteConfig.name}.`;
10
+ var defaultPrimaryAction = { label: "Get Started", href: "#" };
11
+ var defaultSecondaryAction = { label: "Book Demo", href: "#" };
12
+ function CallToActionBlock({
13
+ title = "Start Building",
14
+ description = defaultDescription,
15
+ primaryAction = defaultPrimaryAction,
16
+ secondaryAction = defaultSecondaryAction,
17
+ className
18
+ }) {
19
+ return /* @__PURE__ */ jsx("section", { className: className ?? "py-16 md:py-24", children: /* @__PURE__ */ jsx("div", { className: "mx-auto max-w-5xl px-6", children: /* @__PURE__ */ jsxs(StaggerChildren, { staggerMs: 100, className: "text-center", children: [
20
+ /* @__PURE__ */ jsx(Heading, { level: 2, size: "section", className: "text-4xl lg:text-5xl", children: /* @__PURE__ */ jsx(
21
+ ShimmeringText,
22
+ {
23
+ text: title,
24
+ color: "var(--color-text-primary)",
25
+ shimmeringColor: "var(--color-accent)",
26
+ duration: 2
27
+ }
28
+ ) }),
29
+ /* @__PURE__ */ jsx("p", { className: "mt-4 text-lg text-text-secondary", children: description }),
30
+ /* @__PURE__ */ jsxs("div", { className: "mt-12 flex flex-wrap justify-center gap-4", children: [
31
+ /* @__PURE__ */ jsx(
32
+ Button,
33
+ {
34
+ asChild: true,
35
+ size: "lg",
36
+ children: /* @__PURE__ */ jsx(Link, { href: primaryAction.href, children: /* @__PURE__ */ jsx("span", { children: primaryAction.label }) })
37
+ }
38
+ ),
39
+ /* @__PURE__ */ jsx(
40
+ Button,
41
+ {
42
+ asChild: true,
43
+ size: "lg",
44
+ variant: "outline",
45
+ children: /* @__PURE__ */ jsx(Link, { href: secondaryAction.href, children: /* @__PURE__ */ jsx("span", { children: secondaryAction.label }) })
46
+ }
47
+ )
48
+ ] })
49
+ ] }) }) });
50
+ }
51
+
52
+ export { CallToActionBlock };
@@ -0,0 +1,147 @@
1
+ import { NavigationShellPageKit } from './chunk-TUKZKU72.js';
2
+ import { Typography } from './chunk-N53OMWW2.js';
3
+ import { Textarea } from './chunk-4OBE2FS2.js';
4
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-WH62BE24.js';
5
+ import { FieldSet, Field, FieldLabel, FieldDescription, FieldError } from './chunk-RX5EUODB.js';
6
+ import { Heading } from './chunk-WI547C47.js';
7
+ import { Input } from './chunk-AP3XXYAY.js';
8
+ import { Card, CardHeader, CardTitle, CardContent } from './chunk-AH6YSYYT.js';
9
+ import { Button } from './chunk-7KIDDF3I.js';
10
+ import { Badge } from './chunk-S4JAHKOP.js';
11
+ import { cn } from './chunk-QYZT24TS.js';
12
+ import { jsx, jsxs } from 'react/jsx-runtime';
13
+
14
+ var EMPTY_SECTIONS = [];
15
+ var ALERT_CLASS = "rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive";
16
+ function renderFieldInput(field, onFieldChange) {
17
+ const disabled = field.disabled || field.readOnly;
18
+ if (field.type === "textarea") {
19
+ return /* @__PURE__ */ jsx(
20
+ Textarea,
21
+ {
22
+ id: field.id,
23
+ value: field.value,
24
+ placeholder: field.placeholder,
25
+ disabled,
26
+ readOnly: field.readOnly,
27
+ onChange: (event) => onFieldChange?.(field.id, event.target.value)
28
+ }
29
+ );
30
+ }
31
+ if (field.type === "select") {
32
+ return /* @__PURE__ */ jsxs(
33
+ Select,
34
+ {
35
+ value: field.value,
36
+ disabled,
37
+ onValueChange: (value) => onFieldChange?.(field.id, value),
38
+ children: [
39
+ /* @__PURE__ */ jsx(SelectTrigger, { id: field.id, "aria-label": field.label, children: /* @__PURE__ */ jsx(SelectValue, { placeholder: field.placeholder ?? "Select value" }) }),
40
+ /* @__PURE__ */ jsx(SelectContent, { children: (field.options ?? []).map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: option.label }, option.value)) })
41
+ ]
42
+ }
43
+ );
44
+ }
45
+ return /* @__PURE__ */ jsx(
46
+ Input,
47
+ {
48
+ id: field.id,
49
+ type: field.type ?? "text",
50
+ value: field.value,
51
+ placeholder: field.placeholder,
52
+ disabled,
53
+ readOnly: field.readOnly,
54
+ onChange: (event) => onFieldChange?.(field.id, event.target.value)
55
+ }
56
+ );
57
+ }
58
+ function CrudFormPageKit({
59
+ shell,
60
+ title = "CRUD form",
61
+ description = "Create and edit entities through a stable form contract with explicit save and error states.",
62
+ state = "pristine",
63
+ sections = EMPTY_SECTIONS,
64
+ onFieldChange,
65
+ actions,
66
+ validationMessage,
67
+ fatalErrorMessage,
68
+ savedMessage = "Changes saved.",
69
+ className
70
+ }) {
71
+ const isBusy = state === "submitting" || state === "validating";
72
+ return /* @__PURE__ */ jsx(NavigationShellPageKit, { ...shell, children: /* @__PURE__ */ jsxs("section", { className: cn("space-y-6", className), children: [
73
+ /* @__PURE__ */ jsxs("header", { className: "space-y-2", children: [
74
+ /* @__PURE__ */ jsx(Heading, { level: 3, children: title }),
75
+ /* @__PURE__ */ jsx(Typography, { variant: "muted", children: description })
76
+ ] }),
77
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
78
+ state === "dirty" ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Unsaved changes" }) : null,
79
+ state === "validating" ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Validating" }) : null,
80
+ state === "submitting" ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Saving" }) : null,
81
+ state === "saved" ? /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: "Saved" }) : null
82
+ ] }),
83
+ state === "validation-error" ? /* @__PURE__ */ jsx("div", { role: "alert", className: ALERT_CLASS, children: validationMessage ?? "Validation failed. Resolve field errors and retry." }) : null,
84
+ state === "fatal-error" ? /* @__PURE__ */ jsx("div", { role: "alert", className: ALERT_CLASS, children: fatalErrorMessage ?? "The form failed to load. Retry or contact support." }) : null,
85
+ state === "saved" ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-success", children: savedMessage }) : null,
86
+ /* @__PURE__ */ jsx("div", { className: "grid gap-4", children: sections.map((section) => /* @__PURE__ */ jsxs(Card, { children: [
87
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
88
+ /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
89
+ /* @__PURE__ */ jsx("span", { children: section.title }),
90
+ section.optional ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Optional" }) : null
91
+ ] }),
92
+ section.description ? /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-secondary", children: section.description }) : null
93
+ ] }),
94
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
95
+ section.content ? /* @__PURE__ */ jsx("div", { children: section.content }) : null,
96
+ section.fields && section.fields.length > 0 ? /* @__PURE__ */ jsx(FieldSet, { children: section.fields.map((field) => /* @__PURE__ */ jsxs(Field, { children: [
97
+ /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: field.id, children: [
98
+ field.label,
99
+ field.required ? /* @__PURE__ */ jsx("span", { className: "ml-1 text-destructive", children: "*" }) : null
100
+ ] }),
101
+ renderFieldInput(field, onFieldChange),
102
+ field.description ? /* @__PURE__ */ jsx(FieldDescription, { children: field.description }) : null,
103
+ field.errorMessage ? /* @__PURE__ */ jsx(FieldError, { children: field.errorMessage }) : null
104
+ ] }, field.id)) }) : null
105
+ ] })
106
+ ] }, section.id)) }),
107
+ actions ? /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [
108
+ actions.secondary ? /* @__PURE__ */ jsx(
109
+ Button,
110
+ {
111
+ variant: "ghost",
112
+ onClick: actions.secondary.onAction,
113
+ disabled: actions.secondary.disabled || isBusy,
114
+ children: actions.secondary.label
115
+ }
116
+ ) : null,
117
+ actions.tertiary ? /* @__PURE__ */ jsx(
118
+ Button,
119
+ {
120
+ variant: "outline",
121
+ onClick: actions.tertiary.onAction,
122
+ disabled: actions.tertiary.disabled || isBusy,
123
+ children: actions.tertiary.label
124
+ }
125
+ ) : null,
126
+ actions.destructive ? /* @__PURE__ */ jsx(
127
+ Button,
128
+ {
129
+ variant: "destructive",
130
+ onClick: actions.destructive.onAction,
131
+ disabled: actions.destructive.disabled || isBusy,
132
+ children: actions.destructive.label
133
+ }
134
+ ) : null,
135
+ actions.primary ? /* @__PURE__ */ jsx(
136
+ Button,
137
+ {
138
+ onClick: actions.primary.onAction,
139
+ disabled: actions.primary.disabled || isBusy,
140
+ children: actions.primary.label
141
+ }
142
+ ) : null
143
+ ] }) : null
144
+ ] }) });
145
+ }
146
+
147
+ export { CrudFormPageKit };
@@ -0,0 +1,163 @@
1
+ import { StaggerChildren } from './chunk-DQPK2XRL.js';
2
+ import { Heading } from './chunk-WI547C47.js';
3
+ import { Card, CardHeader, CardTitle, CardContent } from './chunk-AH6YSYYT.js';
4
+ import { Button } from './chunk-7KIDDF3I.js';
5
+ import { ZapIcon } from './chunk-FLF5AMNO.js';
6
+ import { KeyIcon } from './chunk-QSU23VYZ.js';
7
+ import { LaptopIcon } from './chunk-BJYCQ2NV.js';
8
+ import { LayersIcon } from './chunk-VM462WZC.js';
9
+ import { GlobeIcon } from './chunk-JL4MVVFH.js';
10
+ import { DatabaseIcon } from './chunk-WA45EC4Y.js';
11
+ import { CloudIcon } from './chunk-JRJGSNI4.js';
12
+ import { Code2Icon } from './chunk-RF6ECFS5.js';
13
+ import { ChartBarIcon } from './chunk-KYZT3RNW.js';
14
+ import { ShieldIcon } from './chunk-P6IRHPFM.js';
15
+ import { Badge } from './chunk-S4JAHKOP.js';
16
+ import { cn } from './chunk-QYZT24TS.js';
17
+ import { jsx, jsxs } from 'react/jsx-runtime';
18
+
19
+ var ICON_COLORS = [
20
+ "bg-primary/10 text-primary",
21
+ "bg-accent/10 text-accent",
22
+ "bg-chart-1/10 text-chart-1",
23
+ "bg-chart-2/10 text-chart-2",
24
+ "bg-chart-3/10 text-chart-3",
25
+ "bg-chart-4/10 text-chart-4"
26
+ ];
27
+ var defaultGridFeatures = [
28
+ {
29
+ title: "Edge Network",
30
+ description: "Deploy your AI models to the edge with a single click. Global low-latency inference.",
31
+ icon: /* @__PURE__ */ jsx(GlobeIcon, { size: 20 })
32
+ },
33
+ {
34
+ title: "Real-time Processing",
35
+ description: "Process locally on device or in the cloud. WebGPU and WebAssembly support built-in.",
36
+ icon: /* @__PURE__ */ jsx(ZapIcon, { size: 20 })
37
+ },
38
+ {
39
+ title: "Vector Database",
40
+ description: "Integrated vector storage for semantic search and long-term memory retrieval.",
41
+ icon: /* @__PURE__ */ jsx(DatabaseIcon, { size: 20 })
42
+ },
43
+ {
44
+ title: "End-to-End Encryption",
45
+ description: "Your data is encrypted at rest and in transit. Enterprise-grade security standards.",
46
+ icon: /* @__PURE__ */ jsx(ShieldIcon, { size: 20 })
47
+ },
48
+ {
49
+ title: "Automated Scaling",
50
+ description: "Scale from 0 to millions of requests without managing infrastructure.",
51
+ icon: /* @__PURE__ */ jsx(ChartBarIcon, { size: 20 })
52
+ },
53
+ {
54
+ title: "API First",
55
+ description: "Everything is available via API. Integrate with your existing stack seamlessly.",
56
+ icon: /* @__PURE__ */ jsx(Code2Icon, { size: 20 })
57
+ }
58
+ ];
59
+ function FeatureGridVariant({
60
+ badge = "Capabilities",
61
+ title = "Everything you need to build",
62
+ description = "A complete toolkit for the next generation of intelligent applications.",
63
+ features = defaultGridFeatures,
64
+ className
65
+ } = {}) {
66
+ return /* @__PURE__ */ jsx("section", { className: className ?? "py-24 relative", children: /* @__PURE__ */ jsxs("div", { className: "container mx-auto px-6 lg:px-8", children: [
67
+ /* @__PURE__ */ jsxs("div", { className: "text-center mb-16 max-w-2xl mx-auto", children: [
68
+ /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "mb-4", children: badge }),
69
+ /* @__PURE__ */ jsx(Heading, { level: 2, size: "section", className: "text-text-primary sm:text-4xl mb-4", children: title }),
70
+ /* @__PURE__ */ jsx("p", { className: "text-text-secondary text-lg", children: description })
71
+ ] }),
72
+ /* @__PURE__ */ jsx(StaggerChildren, { staggerMs: 80, className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 [grid-auto-rows:1fr]", children: features.map((feature, i) => /* @__PURE__ */ jsxs(Card, { interactive: true, className: "h-full", children: [
73
+ /* @__PURE__ */ jsxs(CardHeader, { className: "pb-2", children: [
74
+ /* @__PURE__ */ jsx("div", { className: cn("h-10 w-10 rounded-lg flex items-center justify-center mb-4", ICON_COLORS[i % ICON_COLORS.length]), children: feature.icon }),
75
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-lg", children: feature.title })
76
+ ] }),
77
+ /* @__PURE__ */ jsx(CardContent, { className: "flex-1", children: /* @__PURE__ */ jsx("p", { className: "text-text-secondary", children: feature.description }) })
78
+ ] }, i)) })
79
+ ] }) });
80
+ }
81
+ var defaultListFeatures = [
82
+ {
83
+ title: "Unified Component Architecture",
84
+ description: "Stop wrestling with fragmented libraries. Seed provides a cohesive set of primitives that work together perfectly out of the box. Themeable, accessible, and composable.",
85
+ icon: /* @__PURE__ */ jsx(LayersIcon, { size: 24 }),
86
+ bullets: ["Type-safe design tokens", "Radix UI primitives", "Automatic dark mode"],
87
+ buttonLabel: "Explore Architecture"
88
+ },
89
+ {
90
+ title: "Secure by Default",
91
+ description: "Enterprise-ready security features including SSO, audit logs, and role-based access control. Compliant with SOC2 and GDPR.",
92
+ icon: /* @__PURE__ */ jsx(ShieldIcon, { size: 24 }),
93
+ bullets: ["End-to-end encryption", "SAML & OIDC support", "99.99% Uptime SLA"],
94
+ buttonLabel: "View Security Docs"
95
+ }
96
+ ];
97
+ function FeatureListVariant({
98
+ features = defaultListFeatures,
99
+ className
100
+ } = {}) {
101
+ return /* @__PURE__ */ jsx("section", { className: className ?? "py-24 overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "container mx-auto px-6 lg:px-8 space-y-24", children: features.map((feature, i) => {
102
+ const isReversed = i % 2 !== 0;
103
+ return /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-2 gap-12 items-center", children: [
104
+ isReversed && /* @__PURE__ */ jsxs("div", { className: "order-2 lg:order-1 relative", children: [
105
+ /* @__PURE__ */ jsx("div", { className: "absolute -inset-4 bg-primary/10 blur-3xl rounded-full" }),
106
+ /* @__PURE__ */ jsx(Card, { className: "p-0 overflow-hidden border-border/50", children: /* @__PURE__ */ jsxs("div", { className: "glass-overlay p-6 h-[350px] relative overflow-hidden flex flex-col items-center justify-center", children: [
107
+ /* @__PURE__ */ jsx(CloudIcon, { size: 96, className: "text-primary opacity-20 absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" }),
108
+ /* @__PURE__ */ jsxs("div", { className: "z-10 surface-solid p-4 rounded-lg flex items-center gap-4 w-64", children: [
109
+ /* @__PURE__ */ jsx("div", { className: "h-8 w-8 rounded bg-chart-4/20 text-chart-4 flex items-center justify-center", children: /* @__PURE__ */ jsx(KeyIcon, { size: 16 }) }),
110
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
111
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-20 bg-text-primary/20 rounded mb-2" }),
112
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-full bg-text-primary/10 rounded" })
113
+ ] })
114
+ ] }),
115
+ /* @__PURE__ */ jsxs("div", { className: "z-10 surface-solid p-4 rounded-lg flex items-center gap-4 w-64 mt-4 translate-x-4", children: [
116
+ /* @__PURE__ */ jsx("div", { className: "h-8 w-8 rounded bg-chart-2/20 text-chart-2 flex items-center justify-center", children: /* @__PURE__ */ jsx(LaptopIcon, { size: 16 }) }),
117
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
118
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-16 bg-text-primary/20 rounded mb-2" }),
119
+ /* @__PURE__ */ jsx("div", { className: "h-2 w-full bg-text-primary/10 rounded" })
120
+ ] })
121
+ ] })
122
+ ] }) })
123
+ ] }),
124
+ /* @__PURE__ */ jsxs("div", { className: isReversed ? "order-1 lg:order-2" : void 0, children: [
125
+ /* @__PURE__ */ jsx("div", { className: cn(
126
+ "h-12 w-12 rounded-xl flex items-center justify-center mb-6",
127
+ isReversed ? "bg-primary/20 text-primary" : "bg-accent/20 text-accent"
128
+ ), children: feature.icon }),
129
+ /* @__PURE__ */ jsx(Heading, { level: 3, size: "section", className: "text-text-primary mb-4", children: feature.title }),
130
+ /* @__PURE__ */ jsx("p", { className: "text-lg text-text-secondary mb-8 leading-relaxed", children: feature.description }),
131
+ /* @__PURE__ */ jsx("ul", { className: "space-y-4 mb-8", children: feature.bullets.map((item) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-4 text-text-primary", children: [
132
+ /* @__PURE__ */ jsx("div", { className: isReversed ? "h-1.5 w-1.5 rounded-full bg-primary" : "h-1.5 w-1.5 rounded-full bg-accent" }),
133
+ item
134
+ ] }, item)) }),
135
+ /* @__PURE__ */ jsx(Button, { variant: "outline", children: feature.buttonLabel })
136
+ ] }),
137
+ !isReversed && /* @__PURE__ */ jsxs("div", { className: "relative", children: [
138
+ /* @__PURE__ */ jsx("div", { className: "absolute -inset-4 bg-accent/10 blur-3xl rounded-full" }),
139
+ /* @__PURE__ */ jsxs(Card, { className: "p-0 overflow-hidden border-border/50", children: [
140
+ /* @__PURE__ */ jsxs("div", { className: "p-4 border-b border-border/50 flex items-center gap-2", children: [
141
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-3 rounded-full bg-destructive/50" }),
142
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-3 rounded-full bg-warning/50" }),
143
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-3 rounded-full bg-success/50" })
144
+ ] }),
145
+ /* @__PURE__ */ jsx("div", { className: "p-8 h-[300px] flex items-center justify-center bg-background/50", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4 w-full opacity-80", children: [
146
+ /* @__PURE__ */ jsx("div", { className: "h-24 bg-surface/50 rounded-lg border border-border animate-pulse" }),
147
+ /* @__PURE__ */ jsx("div", { className: "h-24 bg-surface-active/50 rounded-lg border border-primary/20" }),
148
+ /* @__PURE__ */ jsx("div", { className: "h-24 bg-surface/50 rounded-lg border border-border" }),
149
+ /* @__PURE__ */ jsx("div", { className: "h-24 bg-surface rounded-lg border border-border" })
150
+ ] }) })
151
+ ] })
152
+ ] })
153
+ ] }, i);
154
+ }) }) });
155
+ }
156
+ function FeatureBlock({ variant = "grid", ...props }) {
157
+ if (variant === "list") {
158
+ return /* @__PURE__ */ jsx(FeatureListVariant, { ...props, features: props.features });
159
+ }
160
+ return /* @__PURE__ */ jsx(FeatureGridVariant, { ...props, features: props.features });
161
+ }
162
+
163
+ export { FeatureBlock };
@@ -0,0 +1,38 @@
1
+ import { Skeleton } from './chunk-RASEB2XI.js';
2
+ import { Empty, EmptyIcon, EmptyTitle, EmptyDescription } from './chunk-55HD4L6G.js';
3
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent } from './chunk-AH6YSYYT.js';
4
+ import { cn } from './chunk-QYZT24TS.js';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function ChartCard({
8
+ title,
9
+ description,
10
+ action,
11
+ chart,
12
+ data,
13
+ loading = false,
14
+ emptyIcon,
15
+ emptyTitle,
16
+ emptyDescription,
17
+ emptyCta,
18
+ className,
19
+ ref
20
+ }) {
21
+ return /* @__PURE__ */ jsxs(Card, { ref, className: cn(className), children: [
22
+ /* @__PURE__ */ jsxs(CardHeader, { className: action ? "flex flex-row items-start justify-between space-y-0 pb-4" : void 0, children: [
23
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col space-y-1.5", children: [
24
+ /* @__PURE__ */ jsx(CardTitle, { children: title }),
25
+ !!description && /* @__PURE__ */ jsx(CardDescription, { children: description })
26
+ ] }),
27
+ action
28
+ ] }),
29
+ /* @__PURE__ */ jsx(CardContent, { children: loading ? /* @__PURE__ */ jsx(Skeleton, { className: "h-[300px] rounded-lg" }) : data.length === 0 ? /* @__PURE__ */ jsxs(Empty, { children: [
30
+ !!emptyIcon && /* @__PURE__ */ jsx(EmptyIcon, { children: emptyIcon }),
31
+ !!emptyTitle && /* @__PURE__ */ jsx(EmptyTitle, { children: emptyTitle }),
32
+ !!emptyDescription && /* @__PURE__ */ jsx(EmptyDescription, { children: emptyDescription }),
33
+ !!emptyCta && emptyCta
34
+ ] }) : /* @__PURE__ */ jsx("div", { className: "chart-glow-bg", children: chart }) })
35
+ ] });
36
+ }
37
+
38
+ export { ChartCard };
@@ -0,0 +1,133 @@
1
+ import { Heading } from './chunk-WI547C47.js';
2
+ import { Card, CardHeader, CardContent } from './chunk-AH6YSYYT.js';
3
+ import { Avatar, AvatarImage, AvatarFallback } from './chunk-NAAU5IWU.js';
4
+ import * as React from 'react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var defaultTestimonials = [
8
+ {
9
+ quote: "Tailus has transformed the way I develop web applications. Their extensive collection of UI components, blocks, and templates has significantly accelerated my workflow. The flexibility to customize every aspect allows me to create unique user experiences. Tailus is a game-changer for modern web development",
10
+ author: "M\xE9schac Irung",
11
+ role: "Creator",
12
+ avatar: "https://avatars.githubusercontent.com/u/47919550?v=4",
13
+ featured: true
14
+ },
15
+ {
16
+ quote: "Tailus is really extraordinary and very practical, no need to break your head. A real gold mine.",
17
+ author: "Th\xE9o Balick",
18
+ role: "Frontend Dev",
19
+ avatar: "https://avatars.githubusercontent.com/u/68236786?v=4"
20
+ },
21
+ {
22
+ quote: "Great work on tailfolio template. This is one of the best personal website that I have seen so far!",
23
+ author: "Glodie Lukose",
24
+ role: "Frontend Dev",
25
+ avatar: "https://avatars.githubusercontent.com/u/99137927?v=4"
26
+ },
27
+ {
28
+ quote: "Great work on tailfolio template. This is one of the best personal website that I have seen so far!",
29
+ author: "Bernard Ngandu",
30
+ role: "Backend Dev",
31
+ avatar: "https://avatars.githubusercontent.com/u/31113941?v=4"
32
+ }
33
+ ];
34
+ function getInitials(name) {
35
+ return name.split(" ").map((w) => w[0]).join("").toUpperCase().slice(0, 2);
36
+ }
37
+ function TestimonialsBlock({
38
+ title = "Build by makers, loved by thousand developers",
39
+ description = "Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.",
40
+ testimonials = defaultTestimonials,
41
+ className
42
+ } = {}) {
43
+ const featured = React.useMemo(() => testimonials.find((t) => t.featured) ?? testimonials[0], [testimonials]);
44
+ const rest = React.useMemo(() => testimonials.filter((t) => t !== featured), [testimonials, featured]);
45
+ return /* @__PURE__ */ jsx("section", { className: className ?? "py-16 md:py-32", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-8 px-6 md:space-y-16", children: [
46
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 mx-auto max-w-xl space-y-6 text-center md:space-y-12", children: [
47
+ /* @__PURE__ */ jsx(Heading, { level: 2, size: "section", className: "text-4xl lg:text-5xl", children: title }),
48
+ /* @__PURE__ */ jsx("p", { children: description })
49
+ ] }),
50
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2 md:grid-cols-4 lg:grid-rows-2", children: [
51
+ !!featured && /* @__PURE__ */ jsxs(Card, { className: "grid grid-rows-[auto_1fr] gap-8 sm:col-span-2 sm:p-6 lg:row-span-2", children: [
52
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(
53
+ "img",
54
+ {
55
+ className: "h-6 w-fit dark:invert",
56
+ src: "https://html.tailus.io/blocks/customers/nike.svg",
57
+ alt: "Nike Logo",
58
+ height: "24",
59
+ width: "auto"
60
+ }
61
+ ) }),
62
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("blockquote", { className: "grid h-full grid-rows-[1fr_auto] gap-6", children: [
63
+ /* @__PURE__ */ jsx("p", { className: "text-xl font-medium", children: featured.quote }),
64
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] items-center gap-4", children: [
65
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-12", children: [
66
+ /* @__PURE__ */ jsx(
67
+ AvatarImage,
68
+ {
69
+ src: featured.avatar,
70
+ alt: featured.author,
71
+ height: "400",
72
+ width: "400",
73
+ loading: "lazy"
74
+ }
75
+ ),
76
+ /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(featured.author) })
77
+ ] }),
78
+ /* @__PURE__ */ jsxs("div", { children: [
79
+ /* @__PURE__ */ jsx("cite", { className: "text-sm font-medium", children: featured.author }),
80
+ /* @__PURE__ */ jsx("span", { className: "text-text-tertiary block text-sm", children: featured.role })
81
+ ] })
82
+ ] })
83
+ ] }) })
84
+ ] }),
85
+ rest[0] && /* @__PURE__ */ jsx(Card, { className: "md:col-span-2", children: /* @__PURE__ */ jsx(CardContent, { className: "h-full pt-6", children: /* @__PURE__ */ jsxs("blockquote", { className: "grid h-full grid-rows-[1fr_auto] gap-6", children: [
86
+ /* @__PURE__ */ jsx("p", { className: "text-xl font-medium", children: rest[0].quote }),
87
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] items-center gap-4", children: [
88
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-12", children: [
89
+ /* @__PURE__ */ jsx(
90
+ AvatarImage,
91
+ {
92
+ src: rest[0].avatar,
93
+ alt: rest[0].author,
94
+ height: "400",
95
+ width: "400",
96
+ loading: "lazy"
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(rest[0].author) })
100
+ ] }),
101
+ /* @__PURE__ */ jsxs("div", { children: [
102
+ /* @__PURE__ */ jsx("cite", { className: "text-sm font-medium", children: rest[0].author }),
103
+ /* @__PURE__ */ jsx("span", { className: "text-text-tertiary block text-sm", children: rest[0].role })
104
+ ] })
105
+ ] })
106
+ ] }) }) }),
107
+ rest.slice(1).map((t, i) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsx(CardContent, { className: "h-full pt-6", children: /* @__PURE__ */ jsxs("blockquote", { className: "grid h-full grid-rows-[1fr_auto] gap-6", children: [
108
+ /* @__PURE__ */ jsx("p", { children: t.quote }),
109
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[auto_1fr] items-center gap-4", children: [
110
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-12", children: [
111
+ /* @__PURE__ */ jsx(
112
+ AvatarImage,
113
+ {
114
+ src: t.avatar,
115
+ alt: t.author,
116
+ height: "400",
117
+ width: "400",
118
+ loading: "lazy"
119
+ }
120
+ ),
121
+ /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(t.author) })
122
+ ] }),
123
+ /* @__PURE__ */ jsxs("div", { children: [
124
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: t.author }),
125
+ /* @__PURE__ */ jsx("span", { className: "text-text-tertiary block text-sm", children: t.role })
126
+ ] })
127
+ ] })
128
+ ] }) }) }, i))
129
+ ] })
130
+ ] }) });
131
+ }
132
+
133
+ export { TestimonialsBlock };