@vadimcomanescu/nadicode-design-system 2.0.8 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.agents/skills/seed/SKILL.md +19 -10
  2. package/.agents/skills/seed/contract.md +9 -2
  3. package/.agents/skills/seed/references/blocks.md +5 -5
  4. package/.agents/skills/seed/references/components.md +2 -2
  5. package/.agents/skills/seed/references/nextjs.md +2 -2
  6. package/README.md +3 -3
  7. package/contracts/consumer-intent-map.json +1 -2
  8. package/contracts/release-governance-baseline.json +3 -37
  9. package/dist/catalog/catalog.d.ts +2220 -0
  10. package/dist/catalog/catalog.js +1913 -0
  11. package/dist/catalog/components.d.ts +201 -0
  12. package/dist/catalog/components.js +407 -0
  13. package/dist/catalog/types.d.ts +4 -0
  14. package/dist/catalog/types.js +1 -0
  15. package/dist/chunk-224KPIOG.js +60 -0
  16. package/dist/chunk-25BOZMXA.js +169 -0
  17. package/dist/chunk-32OLQ7FC.js +130 -0
  18. package/dist/chunk-3JJBJ4VR.js +47 -0
  19. package/dist/chunk-3U56FXYC.js +30 -0
  20. package/dist/chunk-4MWKE6F5.js +86 -0
  21. package/dist/chunk-6HGSU24S.js +94 -0
  22. package/dist/chunk-7IADIXDV.js +168 -0
  23. package/dist/chunk-7NS3VFD7.js +86 -0
  24. package/dist/chunk-7XLZCXUL.js +175 -0
  25. package/dist/chunk-ALA6OM7K.js +134 -0
  26. package/dist/chunk-AN5TW4AL.js +50 -0
  27. package/dist/chunk-AWZFQQGN.js +167 -0
  28. package/dist/chunk-BRCBJ3S4.js +42 -0
  29. package/dist/chunk-BRICSLHJ.js +30 -0
  30. package/dist/chunk-BYEHHZZN.js +115 -0
  31. package/dist/chunk-C33GUEDY.js +149 -0
  32. package/dist/chunk-CUDMDYKE.js +150 -0
  33. package/dist/chunk-CVTMWSNS.js +145 -0
  34. package/dist/chunk-DEZXWNYF.js +165 -0
  35. package/dist/chunk-DNJEVMDY.js +40 -0
  36. package/dist/chunk-DNJOBML6.js +66 -0
  37. package/dist/chunk-FTGFOK6T.js +69 -0
  38. package/dist/chunk-HFBJ6L6O.js +104 -0
  39. package/dist/chunk-HPTHS7SX.js +52 -0
  40. package/dist/chunk-KNR3WB5C.js +147 -0
  41. package/dist/chunk-KQ7ZC6EM.js +66 -0
  42. package/dist/chunk-LGW7FVG5.js +83 -0
  43. package/dist/chunk-LP6ZZYOQ.js +36 -0
  44. package/dist/chunk-LV4P7WVM.js +54 -0
  45. package/dist/chunk-MGSGCARB.js +164 -0
  46. package/dist/chunk-N3YFYMNZ.js +73 -0
  47. package/dist/chunk-Q5IYBNA7.js +56 -0
  48. package/dist/chunk-QJCE7NZF.js +85 -0
  49. package/dist/chunk-QW5II6YK.js +96 -0
  50. package/dist/chunk-RMGDDOCD.js +138 -0
  51. package/dist/chunk-RNCX4JIE.js +70 -0
  52. package/dist/chunk-RWCL5OPX.js +112 -0
  53. package/dist/chunk-S5OY2B63.js +28 -0
  54. package/dist/chunk-SIQNG72C.js +257 -0
  55. package/dist/chunk-SP7NIZFP.js +117 -0
  56. package/dist/chunk-SWRJWMGG.js +30 -0
  57. package/dist/chunk-TCQIJ3DO.js +85 -0
  58. package/dist/chunk-TPJ6JJ2F.js +290 -0
  59. package/dist/chunk-TUJZMJXW.js +72 -0
  60. package/dist/chunk-UR43ANYS.js +159 -0
  61. package/dist/chunk-VRGPG2YN.js +79 -0
  62. package/dist/chunk-WSBLCWY7.js +126 -0
  63. package/dist/chunk-XKKFSFYO.js +93 -0
  64. package/dist/chunk-XO7TBM47.js +32 -0
  65. package/dist/chunk-YDYDGG5K.js +132 -0
  66. package/dist/chunk-YMJOUYMT.js +171 -0
  67. package/dist/chunk-Z2WION42.js +32 -0
  68. package/dist/chunk-ZFKSVEYW.js +35 -0
  69. package/dist/components/blocks/AgentProfileGridBlock.js +8 -86
  70. package/dist/components/blocks/AgentRunOverviewBlock.js +8 -147
  71. package/dist/components/blocks/AgentWorkbenchBlock.js +15 -257
  72. package/dist/components/blocks/AudioVisualizerBlock.js +2 -50
  73. package/dist/components/blocks/AuthLayout.js +9 -73
  74. package/dist/components/blocks/BannerBlock.js +8 -66
  75. package/dist/components/blocks/BarChartBlock.js +5 -47
  76. package/dist/components/blocks/ChartBlock.js +7 -54
  77. package/dist/components/blocks/ChartCollectionBlock.js +11 -171
  78. package/dist/components/blocks/ChatLayout.js +12 -126
  79. package/dist/components/blocks/CreateBlock.js +9 -104
  80. package/dist/components/blocks/DataGridBlock.js +9 -117
  81. package/dist/components/blocks/DirectoryBlock.js +12 -85
  82. package/dist/components/blocks/FeatureGridBlock.js +6 -56
  83. package/dist/components/blocks/GalleryBlock.js +6 -69
  84. package/dist/components/blocks/HeroSectionBlock.js +10 -134
  85. package/dist/components/blocks/IntegrationsBlock.js +13 -94
  86. package/dist/components/blocks/InteractiveAreaChartBlock.js +5 -290
  87. package/dist/components/blocks/KanbanDemoBlock.js +8 -145
  88. package/dist/components/blocks/LogoCloud.js +4 -35
  89. package/dist/components/blocks/NavUser.js +5 -85
  90. package/dist/components/blocks/NotFoundBlock.js +8 -32
  91. package/dist/components/blocks/OnboardingBlock.js +7 -66
  92. package/dist/components/blocks/SettingsLayout.js +13 -86
  93. package/dist/components/blocks/SignUpBlock.js +8 -168
  94. package/dist/components/blocks/SolutionShowcaseBlock.js +11 -112
  95. package/dist/components/blocks/StatsBlock.js +6 -60
  96. package/dist/components/blocks/UsageDonutBlock.js +5 -79
  97. package/dist/components/blocks/WizardBlock.js +12 -93
  98. package/dist/components/blocks/user/InviteUserModal.js +10 -132
  99. package/dist/components/page-kits/AccountLockedPageKit.js +3 -40
  100. package/dist/components/page-kits/AgentsChatPageKit.js +11 -159
  101. package/dist/components/page-kits/AnalyticsPageKit.js +12 -150
  102. package/dist/components/page-kits/BlogContentPageKit.js +12 -167
  103. package/dist/components/page-kits/CheckoutPageKit.js +9 -83
  104. package/dist/components/page-kits/CompanySuitePageKit.js +9 -96
  105. package/dist/components/page-kits/DashboardPageKit.js +11 -149
  106. package/dist/components/page-kits/ErrorPageKit.js +5 -52
  107. package/dist/components/page-kits/KanbanBoardPageKit.js +7 -169
  108. package/dist/components/page-kits/LandingPageKit.js +11 -72
  109. package/dist/components/page-kits/LoginPageKit.js +3 -32
  110. package/dist/components/page-kits/OnboardingPageKit.js +6 -115
  111. package/dist/components/page-kits/PricingPageKit.js +12 -138
  112. package/dist/components/page-kits/ProfileSettingsPageKit.js +10 -164
  113. package/dist/components/page-kits/RecoveryPageKit.js +3 -42
  114. package/dist/components/page-kits/ResetPageKit.js +3 -36
  115. package/dist/components/page-kits/ServiceSuitePageKit.js +10 -175
  116. package/dist/components/page-kits/SignupPageKit.js +3 -30
  117. package/dist/components/page-kits/SuccessPageKit.js +4 -30
  118. package/dist/components/page-kits/TeamSettingsPageKit.js +9 -165
  119. package/dist/components/page-kits/TwoFactorPageKit.js +4 -28
  120. package/dist/components/page-kits/VerifyEmailPageKit.js +4 -30
  121. package/dist/components/page-kits/VoiceAgentsPageKit.js +13 -130
  122. package/dist/components/ui/CheckoutForm.js +5 -70
  123. package/eslint-rules/nadicode/config.js +1 -1
  124. package/eslint-rules/nadicode/data/catalog-names.json +93 -0
  125. package/eslint-rules/nadicode/index.js +2 -2
  126. package/eslint-rules/nadicode/rules/__tests__/require-catalog-component.test.js +77 -0
  127. package/eslint-rules/nadicode/rules/require-catalog-component.js +79 -0
  128. package/package.json +18 -25
  129. package/contracts/block-props-schemas.json +0 -2186
  130. package/contracts/component-props-schemas.json +0 -8322
  131. package/contracts/consumer-contract.json +0 -178
  132. package/contracts/page-kit-props-schemas.json +0 -1894
  133. package/contracts/public-surface-registry.json +0 -6162
  134. package/contracts/public-surface-registry.schema.json +0 -227
  135. package/contracts/spec-manifest.json +0 -46
  136. package/dist/catalog.json +0 -5221
  137. package/eslint-rules/nadicode/rules/no-forbidden-page-kit-import.js +0 -99
@@ -0,0 +1,126 @@
1
+ import { useSafeTimeout } from './chunk-MDAYDDTC.js';
2
+ import { ScrollArea } from './chunk-GLU236NN.js';
3
+ import { Input } from './chunk-AP3XXYAY.js';
4
+ import { Avatar, AvatarFallback } from './chunk-NAAU5IWU.js';
5
+ import { Button } from './chunk-7KIDDF3I.js';
6
+ import { useMotionConfig, m, motionSpring } from './chunk-PD2YEH3H.js';
7
+ import { MicIcon } from './chunk-4NXZIMYZ.js';
8
+ import { BotIcon } from './chunk-LSPO6OBI.js';
9
+ import { SendIcon } from './chunk-CRZ2JE24.js';
10
+ import { UserIcon } from './chunk-UHXGBV5N.js';
11
+ import { cn } from './chunk-QYZT24TS.js';
12
+ import * as React from 'react';
13
+ import { useTranslations } from 'next-intl';
14
+ import { jsxs, jsx } from 'react/jsx-runtime';
15
+
16
+ var defaultInitialMessages = [
17
+ {
18
+ id: "1",
19
+ role: "assistant",
20
+ content: "Hello! How can I help you today?"
21
+ }
22
+ ];
23
+ function ChatLayout({
24
+ initialMessages = defaultInitialMessages,
25
+ assistantName = "AI Assistant",
26
+ assistantStatus = "Online",
27
+ placeholder = "Type a message...",
28
+ className
29
+ }) {
30
+ const t = useTranslations("blocks.chatLayout");
31
+ const motionConfig = useMotionConfig();
32
+ const [messages, setMessages] = React.useState(initialMessages);
33
+ const [input, setInput] = React.useState("");
34
+ const scrollRef = React.useRef(null);
35
+ const setSafeTimeout = useSafeTimeout();
36
+ const handleSend = () => {
37
+ if (!input.trim()) return;
38
+ const newMessage = {
39
+ id: Date.now().toString(),
40
+ role: "user",
41
+ content: input
42
+ };
43
+ setMessages((prev) => [...prev, newMessage]);
44
+ setInput("");
45
+ setSafeTimeout(() => {
46
+ setMessages((prev) => [
47
+ ...prev,
48
+ {
49
+ id: (Date.now() + 1).toString(),
50
+ role: "assistant",
51
+ content: "This is a simulated response matching the design system."
52
+ }
53
+ ]);
54
+ }, 1e3);
55
+ };
56
+ React.useEffect(() => {
57
+ if (scrollRef.current) {
58
+ scrollRef.current.scrollIntoView({ behavior: "smooth" });
59
+ }
60
+ }, [messages]);
61
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex h-[350px] md:h-[500px] w-full flex-col overflow-hidden rounded-lg glass-panel", className), children: [
62
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-between border-b border-border/50 p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
63
+ /* @__PURE__ */ jsx(Avatar, { className: "h-8 w-8", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-accent text-accent-foreground", children: /* @__PURE__ */ jsx(BotIcon, { size: 16 }) }) }),
64
+ /* @__PURE__ */ jsxs("div", { children: [
65
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: assistantName }),
66
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-text-tertiary", children: assistantStatus })
67
+ ] })
68
+ ] }) }),
69
+ /* @__PURE__ */ jsx(ScrollArea, { className: "flex-1 p-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
70
+ messages.map((message, index) => /* @__PURE__ */ jsxs(
71
+ m.div,
72
+ {
73
+ initial: { opacity: 0, y: 8 },
74
+ animate: { opacity: 1, y: 0 },
75
+ transition: { ...motionSpring.snappy, delay: index * 0.05, ...motionConfig },
76
+ className: cn(
77
+ "flex w-full gap-2",
78
+ message.role === "user" ? "justify-end" : "justify-start"
79
+ ),
80
+ children: [
81
+ message.role !== "user" && /* @__PURE__ */ jsx(Avatar, { className: "h-8 w-8 mt-1.5", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-accent text-accent-foreground", children: /* @__PURE__ */ jsx(BotIcon, { size: 16 }) }) }),
82
+ /* @__PURE__ */ jsx(
83
+ "div",
84
+ {
85
+ className: cn(
86
+ "max-w-[80%] rounded-lg px-4 py-2 text-sm",
87
+ message.role === "user" ? "bg-primary text-primary-foreground" : "bg-surface border border-border"
88
+ ),
89
+ children: message.content
90
+ }
91
+ ),
92
+ message.role === "user" && /* @__PURE__ */ jsx(Avatar, { className: "h-8 w-8 mt-1.5", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "bg-secondary", children: /* @__PURE__ */ jsx(UserIcon, { size: 16 }) }) })
93
+ ]
94
+ },
95
+ message.id
96
+ )),
97
+ /* @__PURE__ */ jsx("div", { ref: scrollRef })
98
+ ] }) }),
99
+ /* @__PURE__ */ jsx("div", { className: "p-4 border-t border-border bg-surface/30", children: /* @__PURE__ */ jsxs(
100
+ "form",
101
+ {
102
+ onSubmit: (e) => {
103
+ e.preventDefault();
104
+ handleSend();
105
+ },
106
+ className: "flex items-center gap-2",
107
+ children: [
108
+ /* @__PURE__ */ jsx(Button, { type: "button", size: "icon", variant: "ghost", "aria-label": t("voiceInput"), children: /* @__PURE__ */ jsx(MicIcon, { size: 16 }) }),
109
+ /* @__PURE__ */ jsx(
110
+ Input,
111
+ {
112
+ name: "message",
113
+ placeholder,
114
+ value: input,
115
+ onChange: (e) => setInput(e.target.value),
116
+ className: "flex-1"
117
+ }
118
+ ),
119
+ /* @__PURE__ */ jsx(Button, { type: "submit", size: "icon", disabled: !input.trim(), "aria-label": t("sendMessage"), children: /* @__PURE__ */ jsx(SendIcon, { size: 16 }) })
120
+ ]
121
+ }
122
+ ) })
123
+ ] });
124
+ }
125
+
126
+ export { ChatLayout };
@@ -0,0 +1,93 @@
1
+ import { Step } from './chunk-HS7QNBCO.js';
2
+ import { Stepper } from './chunk-2WEUTBDI.js';
3
+ import { Heading } from './chunk-WI547C47.js';
4
+ import { Field, FieldLabel } from './chunk-RX5EUODB.js';
5
+ import { Input } from './chunk-AP3XXYAY.js';
6
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from './chunk-AH6YSYYT.js';
7
+ import { Button } from './chunk-7KIDDF3I.js';
8
+ import { SettingsIcon } from './chunk-OITJWGFV.js';
9
+ import { RocketIcon } from './chunk-QPXTBZWN.js';
10
+ import { CreditCardIcon } from './chunk-JHQTKMKG.js';
11
+ import { UserIcon } from './chunk-UHXGBV5N.js';
12
+ import { useState } from 'react';
13
+ import { jsxs, jsx } from 'react/jsx-runtime';
14
+
15
+ var defaultSteps = [
16
+ { title: "Account", description: "Setup your account", icon: /* @__PURE__ */ jsx(UserIcon, { size: 16 }) },
17
+ { title: "Profile", description: "Add personal info", icon: /* @__PURE__ */ jsx(SettingsIcon, { size: 16 }) },
18
+ { title: "Plan", description: "Choose a plan", icon: /* @__PURE__ */ jsx(CreditCardIcon, { size: 16 }) },
19
+ { title: "Launch", description: "Ready to go", icon: /* @__PURE__ */ jsx(RocketIcon, { size: 16 }) }
20
+ ];
21
+ function WizardBlock({
22
+ title = "Create Project",
23
+ description = "Follow the steps to setup your new project workspace.",
24
+ steps = defaultSteps,
25
+ onFinish,
26
+ className
27
+ }) {
28
+ const [activeStep, setActiveStep] = useState(0);
29
+ const handleNext = () => setActiveStep((p) => Math.min(p + 1, steps.length - 1));
30
+ const handlePrev = () => setActiveStep((p) => Math.max(p - 1, 0));
31
+ return /* @__PURE__ */ jsxs(Card, { className: className ?? "w-full max-w-2xl mx-auto", children: [
32
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
33
+ /* @__PURE__ */ jsx(CardTitle, { children: title }),
34
+ /* @__PURE__ */ jsx(CardDescription, { children: description })
35
+ ] }),
36
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-8", children: [
37
+ /* @__PURE__ */ jsx(Stepper, { activeStep, onStepChange: setActiveStep, className: "justify-between", children: steps.map((step, index) => /* @__PURE__ */ jsx(
38
+ Step,
39
+ {
40
+ index,
41
+ title: step.title,
42
+ description: step.description,
43
+ icon: step.icon,
44
+ completed: index < activeStep
45
+ },
46
+ index
47
+ )) }),
48
+ /* @__PURE__ */ jsxs("div", { className: "min-h-[200px] border rounded-lg p-6 bg-muted/20 animate-in fade-in slide-in-from-bottom-2 duration-300", children: [
49
+ activeStep === 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
50
+ /* @__PURE__ */ jsxs(Field, { children: [
51
+ /* @__PURE__ */ jsx(FieldLabel, { children: "Username" }),
52
+ /* @__PURE__ */ jsx(Input, { placeholder: "jdoe" })
53
+ ] }),
54
+ /* @__PURE__ */ jsxs(Field, { children: [
55
+ /* @__PURE__ */ jsx(FieldLabel, { children: "Email" }),
56
+ /* @__PURE__ */ jsx(Input, { placeholder: "john@example.com" })
57
+ ] })
58
+ ] }),
59
+ activeStep === 1 && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
60
+ /* @__PURE__ */ jsxs(Field, { children: [
61
+ /* @__PURE__ */ jsx(FieldLabel, { children: "Full Name" }),
62
+ /* @__PURE__ */ jsx(Input, { placeholder: "John Doe" })
63
+ ] }),
64
+ /* @__PURE__ */ jsxs(Field, { children: [
65
+ /* @__PURE__ */ jsx(FieldLabel, { children: "Bio" }),
66
+ /* @__PURE__ */ jsx(Input, { placeholder: "Tell us about yourself" })
67
+ ] })
68
+ ] }),
69
+ activeStep === 2 && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
70
+ /* @__PURE__ */ jsxs("div", { className: "border p-4 rounded-lg bg-background hover:bg-accent/50 cursor-pointer transition-colors", children: [
71
+ /* @__PURE__ */ jsx(Heading, { level: 3, size: "title", className: "font-bold", children: "Free" }),
72
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-text-tertiary", children: "For hobbyists" })
73
+ ] }),
74
+ /* @__PURE__ */ jsxs("div", { className: "border border-primary p-4 rounded-lg bg-primary/10 cursor-pointer", children: [
75
+ /* @__PURE__ */ jsx(Heading, { level: 3, size: "title", className: "font-bold text-primary", children: "Pro" }),
76
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-text-tertiary", children: "For professionals" })
77
+ ] })
78
+ ] }),
79
+ activeStep === 3 && /* @__PURE__ */ jsxs("div", { className: "text-center space-y-4 py-8", children: [
80
+ /* @__PURE__ */ jsx(RocketIcon, { size: 64, className: "mx-auto text-primary animate-[float_2s_ease-in-out_infinite] motion-reduce:animate-none" }),
81
+ /* @__PURE__ */ jsx(Heading, { level: 3, size: "title", children: "Ready to Launch!" }),
82
+ /* @__PURE__ */ jsx("p", { className: "text-text-tertiary", children: "Review your settings and click Finish to deploy." })
83
+ ] })
84
+ ] })
85
+ ] }),
86
+ /* @__PURE__ */ jsxs(CardFooter, { className: "flex justify-between", children: [
87
+ /* @__PURE__ */ jsx(Button, { variant: "outline", onClick: handlePrev, disabled: activeStep === 0, children: "Previous" }),
88
+ /* @__PURE__ */ jsx(Button, { onClick: activeStep === steps.length - 1 ? onFinish : handleNext, children: activeStep === steps.length - 1 ? "Finish" : "Next" })
89
+ ] })
90
+ ] });
91
+ }
92
+
93
+ export { WizardBlock };
@@ -0,0 +1,32 @@
1
+ import { AnimatedGradientText } from './chunk-XZ3A33GP.js';
2
+ import { Typography } from './chunk-N53OMWW2.js';
3
+ import { MeteorShower } from './chunk-ZU55E4A7.js';
4
+ import { Heading } from './chunk-WI547C47.js';
5
+ import { Button } from './chunk-7KIDDF3I.js';
6
+ import { ArrowLeftIcon } from './chunk-74RKVIBV.js';
7
+ import { cn } from './chunk-QYZT24TS.js';
8
+ import Link from 'next/link';
9
+ import { jsxs, jsx } from 'react/jsx-runtime';
10
+
11
+ function NotFoundBlock({
12
+ title = "404",
13
+ description = "The page you're looking for doesn't exist or has been moved.",
14
+ backHref = "/",
15
+ backLabel = "Back home",
16
+ className
17
+ }) {
18
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative flex min-h-[60vh] items-center justify-center overflow-hidden", className), children: [
19
+ /* @__PURE__ */ jsx(MeteorShower, { className: "absolute inset-0" }),
20
+ /* @__PURE__ */ jsx("div", { className: "relative z-10 mx-auto max-w-md px-6 text-center", children: /* @__PURE__ */ jsxs("div", { className: "glass-panel rounded-2xl border border-border/50 p-10 shadow-2xl", children: [
21
+ /* @__PURE__ */ jsx(AnimatedGradientText, { className: "text-8xl font-extrabold tracking-tighter sm:text-9xl", children: title }),
22
+ /* @__PURE__ */ jsx(Heading, { level: 3, size: "subsection", className: "mt-4 text-text-primary", children: "Page not found" }),
23
+ /* @__PURE__ */ jsx(Typography, { variant: "body", className: "mt-2 text-text-secondary", children: description }),
24
+ /* @__PURE__ */ jsx(Button, { asChild: true, size: "lg", variant: "accent", className: "mt-8", children: /* @__PURE__ */ jsxs(Link, { href: backHref, children: [
25
+ /* @__PURE__ */ jsx(ArrowLeftIcon, { size: 16, className: "mr-2" }),
26
+ backLabel
27
+ ] }) })
28
+ ] }) })
29
+ ] });
30
+ }
31
+
32
+ export { NotFoundBlock };
@@ -0,0 +1,132 @@
1
+ import { RoleBadge } from './chunk-OHCQPI3W.js';
2
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-WH62BE24.js';
3
+ import { Field, FieldLabel } from './chunk-RX5EUODB.js';
4
+ import { Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from './chunk-W73JAOHW.js';
5
+ import { Input } from './chunk-AP3XXYAY.js';
6
+ import { Button } from './chunk-7KIDDF3I.js';
7
+ import { PlusIcon } from './chunk-E7RBK6ML.js';
8
+ import { MailIcon } from './chunk-XQ2UDMPO.js';
9
+ import { CheckIcon } from './chunk-CXACRCZ4.js';
10
+ import * as React from 'react';
11
+ import { useForm } from 'react-hook-form';
12
+ import { zodResolver } from '@hookform/resolvers/zod';
13
+ import * as z from 'zod';
14
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
15
+
16
+ var inviteSchema = z.object({
17
+ email: z.string().email({ message: "Please enter a valid email address." }),
18
+ role: z.enum(["admin", "member", "guest"])
19
+ });
20
+ function InviteUserModal({ onInvite, onInvited }) {
21
+ const [open, setOpen] = React.useState(false);
22
+ const [isPending, startTransition] = React.useTransition();
23
+ const [submitError, setSubmitError] = React.useState();
24
+ const {
25
+ register,
26
+ handleSubmit,
27
+ setValue,
28
+ reset,
29
+ formState: { errors }
30
+ } = useForm({
31
+ resolver: zodResolver(inviteSchema),
32
+ defaultValues: {
33
+ role: "member"
34
+ }
35
+ });
36
+ function onSubmit(values) {
37
+ setSubmitError(void 0);
38
+ startTransition(() => {
39
+ void Promise.resolve(onInvite?.(values)).then((result) => {
40
+ if (result === false) {
41
+ setSubmitError("Failed to send invitation.");
42
+ return;
43
+ }
44
+ if (typeof result === "object" && result !== null && "success" in result && result.success === false) {
45
+ setSubmitError(result.error ?? "Failed to send invitation.");
46
+ return;
47
+ }
48
+ setOpen(false);
49
+ reset();
50
+ onInvited?.();
51
+ }).catch(() => {
52
+ setSubmitError("Failed to send invitation.");
53
+ });
54
+ });
55
+ }
56
+ return /* @__PURE__ */ jsxs(Dialog, { open, onOpenChange: setOpen, children: [
57
+ /* @__PURE__ */ jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "accent", className: "gap-2", children: [
58
+ /* @__PURE__ */ jsx(PlusIcon, { size: 16 }),
59
+ "Invite User"
60
+ ] }) }),
61
+ /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-[425px]", children: [
62
+ /* @__PURE__ */ jsxs(DialogHeader, { children: [
63
+ /* @__PURE__ */ jsx(DialogTitle, { children: "Invite Teammate" }),
64
+ /* @__PURE__ */ jsx(DialogDescription, { children: "Send an invitation to join your workspace. They will receive an email with a magic link." })
65
+ ] }),
66
+ /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-6 pt-4", children: [
67
+ /* @__PURE__ */ jsxs(Field, { children: [
68
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: "email", children: "Email Address" }),
69
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
70
+ /* @__PURE__ */ jsx(MailIcon, { size: 16, className: "absolute left-4 top-2.5 text-text-tertiary" }),
71
+ /* @__PURE__ */ jsx(
72
+ Input,
73
+ {
74
+ id: "email",
75
+ placeholder: "colleague@company.com",
76
+ className: "pl-10",
77
+ ...register("email")
78
+ }
79
+ )
80
+ ] }),
81
+ errors.email && /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-destructive", children: errors.email.message })
82
+ ] }),
83
+ /* @__PURE__ */ jsxs(Field, { children: [
84
+ /* @__PURE__ */ jsx(FieldLabel, { children: "Role" }),
85
+ /* @__PURE__ */ jsxs(
86
+ Select,
87
+ {
88
+ defaultValue: "member",
89
+ onValueChange: (val) => setValue("role", val),
90
+ children: [
91
+ /* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select a role" }) }),
92
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
93
+ /* @__PURE__ */ jsx(SelectItem, { value: "admin", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
94
+ /* @__PURE__ */ jsx(RoleBadge, { role: "admin" }),
95
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Full access" })
96
+ ] }) }),
97
+ /* @__PURE__ */ jsx(SelectItem, { value: "member", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
98
+ /* @__PURE__ */ jsx(RoleBadge, { role: "member" }),
99
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "Can view and edit" })
100
+ ] }) }),
101
+ /* @__PURE__ */ jsx(SelectItem, { value: "guest", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
102
+ /* @__PURE__ */ jsx(RoleBadge, { role: "guest" }),
103
+ /* @__PURE__ */ jsx("span", { className: "text-text-secondary", children: "View only" })
104
+ ] }) })
105
+ ] })
106
+ ]
107
+ }
108
+ ),
109
+ errors.role && /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-destructive", children: errors.role.message })
110
+ ] }),
111
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [
112
+ /* @__PURE__ */ jsx(
113
+ Button,
114
+ {
115
+ type: "button",
116
+ variant: "outline",
117
+ onClick: () => setOpen(false),
118
+ children: "Cancel"
119
+ }
120
+ ),
121
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "accent", disabled: isPending, children: isPending ? /* @__PURE__ */ jsx(Fragment, { children: "Sending..." }) : /* @__PURE__ */ jsxs(Fragment, { children: [
122
+ /* @__PURE__ */ jsx(CheckIcon, { size: 16, className: "mr-2" }),
123
+ " Send Invite"
124
+ ] }) })
125
+ ] }),
126
+ !!submitError && /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-destructive", children: submitError })
127
+ ] })
128
+ ] })
129
+ ] });
130
+ }
131
+
132
+ export { InviteUserModal };
@@ -0,0 +1,171 @@
1
+ import { HeatmapChartBlock } from './chunk-VDONTZZX.js';
2
+ import { RadialBarChart } from './chunk-WAP7DBSW.js';
3
+ import { AreaChart } from './chunk-IPXL7WX7.js';
4
+ import { BarChart } from './chunk-UWHKZX4Y.js';
5
+ import { LineChart } from './chunk-HRIEX66J.js';
6
+ import { PieChart } from './chunk-U7V6TREO.js';
7
+ import { RadarChart } from './chunk-LDW4LHUM.js';
8
+ import { StaggerChildren } from './chunk-DQPK2XRL.js';
9
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent } from './chunk-AH6YSYYT.js';
10
+ import { cn } from './chunk-QYZT24TS.js';
11
+ import { jsxs, jsx } from 'react/jsx-runtime';
12
+
13
+ var areaData = [
14
+ { month: "Jan", desktop: 186, mobile: 80 },
15
+ { month: "Feb", desktop: 305, mobile: 200 },
16
+ { month: "Mar", desktop: 237, mobile: 120 },
17
+ { month: "Apr", desktop: 73, mobile: 190 },
18
+ { month: "May", desktop: 209, mobile: 130 },
19
+ { month: "Jun", desktop: 214, mobile: 140 }
20
+ ];
21
+ var chartData = [
22
+ { browser: "chrome", visitors: 275, fill: "rgb(var(--chart-1))" },
23
+ { browser: "safari", visitors: 200, fill: "rgb(var(--chart-2))" },
24
+ { browser: "firefox", visitors: 187, fill: "rgb(var(--chart-3))" },
25
+ { browser: "edge", visitors: 173, fill: "rgb(var(--chart-4))" },
26
+ { browser: "other", visitors: 90, fill: "rgb(var(--chart-5))" }
27
+ ];
28
+ var radarData = [
29
+ { month: "January", desktop: 186 },
30
+ { month: "February", desktop: 305 },
31
+ { month: "March", desktop: 237 },
32
+ { month: "April", desktop: 273 },
33
+ { month: "May", desktop: 209 },
34
+ { month: "June", desktop: 214 }
35
+ ];
36
+ var radialData = [
37
+ { browser: "chrome", visitors: 275, fill: "rgb(var(--chart-1))" },
38
+ { browser: "safari", visitors: 200, fill: "rgb(var(--chart-2))" },
39
+ { browser: "firefox", visitors: 187, fill: "rgb(var(--chart-3))" },
40
+ { browser: "edge", visitors: 173, fill: "rgb(var(--chart-4))" },
41
+ { browser: "other", visitors: 90, fill: "rgb(var(--chart-5))" }
42
+ ];
43
+ var areaConfig = {
44
+ desktop: {
45
+ label: "Desktop",
46
+ color: "rgb(var(--chart-1))"
47
+ }
48
+ };
49
+ var barLineConfig = {
50
+ desktop: {
51
+ label: "Desktop",
52
+ color: "rgb(var(--chart-1))"
53
+ }
54
+ };
55
+ var pieConfig = {
56
+ chrome: { label: "Chrome", color: "rgb(var(--chart-1))" },
57
+ safari: { label: "Safari", color: "rgb(var(--chart-2))" },
58
+ firefox: { label: "Firefox", color: "rgb(var(--chart-3))" },
59
+ edge: { label: "Edge", color: "rgb(var(--chart-4))" },
60
+ other: { label: "Other", color: "rgb(var(--chart-5))" }
61
+ };
62
+ var radarConfig = {
63
+ desktop: {
64
+ label: "Desktop",
65
+ color: "rgb(var(--chart-1))"
66
+ }
67
+ };
68
+ var radialConfig = {
69
+ chrome: { label: "Chrome", color: "rgb(var(--chart-1))" },
70
+ safari: { label: "Safari", color: "rgb(var(--chart-2))" },
71
+ firefox: { label: "Firefox", color: "rgb(var(--chart-3))" },
72
+ edge: { label: "Edge", color: "rgb(var(--chart-4))" },
73
+ other: { label: "Other", color: "rgb(var(--chart-5))" }
74
+ };
75
+ function ChartCollectionBlock({ className }) {
76
+ return /* @__PURE__ */ jsxs(StaggerChildren, { staggerMs: 100, className: cn("grid gap-6 md:grid-cols-2 lg:grid-cols-3", className), children: [
77
+ /* @__PURE__ */ jsxs(Card, { children: [
78
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
79
+ /* @__PURE__ */ jsx(CardTitle, { children: "Area Chart" }),
80
+ /* @__PURE__ */ jsx(CardDescription, { children: "Usage overview" })
81
+ ] }),
82
+ /* @__PURE__ */ jsx(CardContent, { children: areaData.length > 0 && /* @__PURE__ */ jsx(
83
+ AreaChart,
84
+ {
85
+ data: areaData,
86
+ config: areaConfig,
87
+ indexKey: "month",
88
+ areas: ["desktop"],
89
+ className: "h-[250px] w-full",
90
+ showLegend: false
91
+ }
92
+ ) })
93
+ ] }),
94
+ /* @__PURE__ */ jsxs(Card, { children: [
95
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: "Bar Chart" }) }),
96
+ /* @__PURE__ */ jsx(CardContent, { children: areaData.length > 0 && /* @__PURE__ */ jsx(
97
+ BarChart,
98
+ {
99
+ data: areaData,
100
+ config: barLineConfig,
101
+ indexKey: "month",
102
+ bars: ["desktop"],
103
+ className: "h-[250px] w-full",
104
+ showLegend: false
105
+ }
106
+ ) })
107
+ ] }),
108
+ /* @__PURE__ */ jsxs(Card, { children: [
109
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: "Line Chart" }) }),
110
+ /* @__PURE__ */ jsx(CardContent, { children: areaData.length > 0 && /* @__PURE__ */ jsx(
111
+ LineChart,
112
+ {
113
+ data: areaData,
114
+ config: barLineConfig,
115
+ indexKey: "month",
116
+ lines: ["desktop"],
117
+ className: "h-[250px] w-full",
118
+ showLegend: false
119
+ }
120
+ ) })
121
+ ] }),
122
+ /* @__PURE__ */ jsxs(Card, { children: [
123
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: "Pie Chart" }) }),
124
+ /* @__PURE__ */ jsx(CardContent, { children: chartData.length > 0 && /* @__PURE__ */ jsx(
125
+ PieChart,
126
+ {
127
+ data: chartData,
128
+ config: pieConfig,
129
+ dataKey: "visitors",
130
+ nameKey: "browser",
131
+ variant: "donut",
132
+ innerRadius: 60,
133
+ showLegend: false
134
+ }
135
+ ) })
136
+ ] }),
137
+ /* @__PURE__ */ jsxs(Card, { children: [
138
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: "Radar Chart" }) }),
139
+ /* @__PURE__ */ jsx(CardContent, { children: radarData.length > 0 && /* @__PURE__ */ jsx(
140
+ RadarChart,
141
+ {
142
+ data: radarData,
143
+ config: radarConfig,
144
+ indexKey: "month",
145
+ series: ["desktop"],
146
+ className: "h-[250px] w-full",
147
+ showLegend: false
148
+ }
149
+ ) })
150
+ ] }),
151
+ /* @__PURE__ */ jsxs(Card, { children: [
152
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: "Radial Chart" }) }),
153
+ /* @__PURE__ */ jsx(CardContent, { children: radialData.length > 0 && /* @__PURE__ */ jsx(
154
+ RadialBarChart,
155
+ {
156
+ data: radialData,
157
+ config: radialConfig,
158
+ dataKey: "visitors",
159
+ nameKey: "browser",
160
+ innerRadius: 40,
161
+ outerRadius: 100,
162
+ className: "h-[250px] w-full",
163
+ showLegend: false
164
+ }
165
+ ) })
166
+ ] }),
167
+ /* @__PURE__ */ jsx(HeatmapChartBlock, {})
168
+ ] });
169
+ }
170
+
171
+ export { ChartCollectionBlock };
@@ -0,0 +1,32 @@
1
+ import { LoginBlock } from './chunk-RGE5OQMZ.js';
2
+ import { cn } from './chunk-QYZT24TS.js';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ function LoginPageKit({
6
+ action,
7
+ googleAction,
8
+ error,
9
+ showSocial = true,
10
+ labels,
11
+ forgotPasswordHref,
12
+ signUpHref,
13
+ className,
14
+ cardClassName
15
+ }) {
16
+ return /* @__PURE__ */ jsx("section", { className: cn("min-h-dvh w-full bg-background px-4 py-12 md:px-8 md:py-20", className), children: /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-5xl items-center justify-center", children: /* @__PURE__ */ jsx(
17
+ LoginBlock,
18
+ {
19
+ className: cn("w-full", cardClassName),
20
+ type: "login",
21
+ action,
22
+ googleAction,
23
+ error,
24
+ showSocial,
25
+ labels,
26
+ forgotPasswordHref,
27
+ signUpHref
28
+ }
29
+ ) }) });
30
+ }
31
+
32
+ export { LoginPageKit };
@@ -0,0 +1,35 @@
1
+ import { LOCAL_CLOUD_LOGOS } from './chunk-QQOWC53X.js';
2
+ import { Heading } from './chunk-WI547C47.js';
3
+ import { cn } from './chunk-QYZT24TS.js';
4
+ import Image from 'next/image';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var defaultLogos = LOCAL_CLOUD_LOGOS;
8
+ function heightClass(h) {
9
+ if (h <= 16) return "h-4";
10
+ if (h <= 20) return "h-5";
11
+ if (h <= 24) return "h-6";
12
+ return "h-7";
13
+ }
14
+ function LogoCloud({
15
+ title = "Your favorite companies are our partners.",
16
+ logos = defaultLogos,
17
+ className
18
+ }) {
19
+ return /* @__PURE__ */ jsx("section", { className: className ?? "bg-background py-16", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-5xl px-6", children: [
20
+ /* @__PURE__ */ jsx(Heading, { level: 2, size: "eyebrow", className: "text-center", children: title }),
21
+ /* @__PURE__ */ jsx("div", { className: "mx-auto mt-20 flex max-w-4xl flex-wrap items-center justify-center gap-x-12 gap-y-8 sm:gap-x-16 sm:gap-y-12", children: logos.map((logo) => /* @__PURE__ */ jsx(
22
+ Image,
23
+ {
24
+ className: cn(heightClass(logo.height), "w-auto dark:invert"),
25
+ src: logo.src,
26
+ alt: logo.alt,
27
+ height: logo.height,
28
+ width: logo.height * 4
29
+ },
30
+ logo.alt
31
+ )) })
32
+ ] }) });
33
+ }
34
+
35
+ export { LogoCloud };