@vadimcomanescu/nadicode-design-system 2.0.7 → 2.0.9

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 (230) hide show
  1. package/.agents/skills/seed/SKILL.md +17 -8
  2. package/.agents/skills/seed/contract.md +5 -5
  3. package/.agents/skills/seed/intent-map.md +3 -3
  4. package/.agents/skills/seed/recipes/agents-chat.md +44 -20
  5. package/.agents/skills/seed/references/blocks.md +5 -2
  6. package/.agents/skills/seed/references/components.md +22 -2
  7. package/.agents/skills/seed/references/dashboard-patterns.md +12 -12
  8. package/.agents/skills/seed/references/nextjs.md +20 -80
  9. package/.agents/skills/seed/references/tokens.md +57 -248
  10. package/README.md +43 -215
  11. package/contracts/block-props-schemas.json +2186 -0
  12. package/contracts/component-props-schemas.json +8322 -0
  13. package/contracts/consumer-contract.json +178 -0
  14. package/contracts/consumer-intent-map.json +707 -0
  15. package/contracts/message-catalog-contract.json +820 -0
  16. package/contracts/page-kit-props-schemas.json +1894 -0
  17. package/contracts/public-surface-registry.json +5822 -0
  18. package/contracts/public-surface-registry.schema.json +219 -0
  19. package/contracts/release-governance-baseline.json +850 -0
  20. package/contracts/spec-manifest.json +46 -0
  21. package/dist/catalog.json +284 -81
  22. package/dist/chunk-4IGBBIYW.js +47 -0
  23. package/dist/chunk-4WPZ6T7V.js +186 -0
  24. package/dist/{chunk-OHOOQUVJ.js → chunk-C7WHMSF3.js} +2 -1
  25. package/dist/{chunk-4K3PATUT.js → chunk-EEL4RAPC.js} +13 -1
  26. package/dist/{chunk-ILIHQ2KZ.js → chunk-EK43W2Y6.js} +16 -10
  27. package/dist/{chunk-IDKZEPWK.js → chunk-FV2G6SAF.js} +6 -5
  28. package/dist/chunk-HWHJ6IRQ.js +78 -0
  29. package/dist/{chunk-AUSYEAIJ.js → chunk-I66XWYSS.js} +32 -8
  30. package/dist/chunk-JDJY4ABS.js +60 -0
  31. package/dist/{chunk-GV4PKHG4.js → chunk-KWILREVQ.js} +2 -2
  32. package/dist/{chunk-WI37ZYIF.js → chunk-M4XKO45H.js} +13 -1
  33. package/dist/{chunk-6N6CSJVE.js → chunk-OJ7OO3QB.js} +2 -2
  34. package/dist/{chunk-ZHTQF2KI.js → chunk-OSNTB6RY.js} +29 -22
  35. package/dist/{chunk-GMMPLZLC.js → chunk-PDSQC6VE.js} +1 -1
  36. package/dist/chunk-QQOWC53X.js +98 -0
  37. package/dist/chunk-VJ5VD4UT.js +91 -0
  38. package/dist/{chunk-TUKZKU72.js → chunk-ZKLB5N3Q.js} +1 -1
  39. package/dist/components/blocks/AgentConversationBlock.d.ts +6 -1
  40. package/dist/components/blocks/AgentConversationBlock.js +44 -42
  41. package/dist/components/blocks/AgentRunOverviewBlock.js +1 -1
  42. package/dist/components/blocks/AgentWorkbenchBlock.d.ts +5 -1
  43. package/dist/components/blocks/AgentWorkbenchBlock.js +47 -46
  44. package/dist/components/blocks/AuthLayout.js +2 -2
  45. package/dist/components/blocks/BannerBlock.js +38 -38
  46. package/dist/components/blocks/CallToActionBlock.js +2 -2
  47. package/dist/components/blocks/ChangelogBlock.js +39 -39
  48. package/dist/components/blocks/ChartBlock.js +38 -38
  49. package/dist/components/blocks/ChartCollectionBlock.js +1 -1
  50. package/dist/components/blocks/ChatLayout.d.ts +4 -1
  51. package/dist/components/blocks/ChatLayout.js +39 -39
  52. package/dist/components/blocks/CodeBlock.js +2 -2
  53. package/dist/components/blocks/ContactBlock.js +2 -2
  54. package/dist/components/blocks/CreateBlock.js +39 -39
  55. package/dist/components/blocks/DataGridBlock.js +40 -40
  56. package/dist/components/blocks/DirectoryBlock.js +43 -43
  57. package/dist/components/blocks/FAQBlock.js +38 -38
  58. package/dist/components/blocks/FeatureBlock.js +38 -38
  59. package/dist/components/blocks/GalleryBlock.js +38 -38
  60. package/dist/components/blocks/HeaderBlock.js +38 -38
  61. package/dist/components/blocks/HeroBlock.js +41 -41
  62. package/dist/components/blocks/HeroSectionBlock.js +55 -59
  63. package/dist/components/blocks/IntegrationsBlock.js +40 -40
  64. package/dist/components/blocks/InteractiveAreaChartBlock.js +38 -38
  65. package/dist/components/blocks/KanbanDemoBlock.js +3 -3
  66. package/dist/components/blocks/LoginBlock.js +2 -2
  67. package/dist/components/blocks/LogoCloud.js +2 -13
  68. package/dist/components/blocks/NavUser.js +42 -42
  69. package/dist/components/blocks/NotFoundBlock.js +41 -41
  70. package/dist/components/blocks/OnboardingBlock.js +38 -38
  71. package/dist/components/blocks/PricingBlock.js +4 -4
  72. package/dist/components/blocks/ProcessFlowBlock.js +2 -2
  73. package/dist/components/blocks/SettingsLayout.js +42 -42
  74. package/dist/components/blocks/SignUpBlock.js +1 -1
  75. package/dist/components/blocks/SocialProofBlock.js +4 -3
  76. package/dist/components/blocks/StatsBlock.js +38 -38
  77. package/dist/components/blocks/StatsMarketingBlock.js +2 -2
  78. package/dist/components/blocks/TestimonialsBlock.js +2 -1
  79. package/dist/components/blocks/TwoFactorChallengeBlock.js +38 -38
  80. package/dist/components/blocks/TwoFactorSetupBlock.js +41 -41
  81. package/dist/components/blocks/VoiceAgentCard.d.ts +3 -1
  82. package/dist/components/blocks/VoiceAgentCard.js +7 -76
  83. package/dist/components/blocks/WizardBlock.js +39 -39
  84. package/dist/components/blocks/user/InviteUserModal.js +38 -38
  85. package/dist/components/logos/index.js +2 -2
  86. package/dist/components/page-kits/AgentsChatPageKit.js +59 -58
  87. package/dist/components/page-kits/AnalyticsPageKit.js +44 -44
  88. package/dist/components/page-kits/BlogContentPageKit.js +43 -43
  89. package/dist/components/page-kits/CheckoutPageKit.js +41 -41
  90. package/dist/components/page-kits/CompanySuitePageKit.js +47 -47
  91. package/dist/components/page-kits/CrudFormPageKit.js +44 -44
  92. package/dist/components/page-kits/CrudListDetailPageKit.js +44 -44
  93. package/dist/components/page-kits/DashboardPageKit.js +44 -44
  94. package/dist/components/page-kits/KanbanBoardPageKit.js +47 -47
  95. package/dist/components/page-kits/LandingPageKit.js +50 -49
  96. package/dist/components/page-kits/LoginPageKit.js +2 -2
  97. package/dist/components/page-kits/MarketingShellPageKit.js +40 -40
  98. package/dist/components/page-kits/NavigationShellPageKit.js +42 -42
  99. package/dist/components/page-kits/OnboardingPageKit.js +44 -44
  100. package/dist/components/page-kits/PricingPageKit.js +46 -46
  101. package/dist/components/page-kits/ProfileSettingsPageKit.js +2 -2
  102. package/dist/components/page-kits/ServiceSuitePageKit.js +47 -46
  103. package/dist/components/page-kits/SignupPageKit.js +2 -2
  104. package/dist/components/page-kits/SuccessPageKit.js +38 -38
  105. package/dist/components/page-kits/TeamSettingsPageKit.js +45 -45
  106. package/dist/components/page-kits/TwoFactorPageKit.js +41 -41
  107. package/dist/components/page-kits/VerifyEmailPageKit.js +38 -38
  108. package/dist/components/page-kits/VoiceAgentsPageKit.js +80 -76
  109. package/dist/components/ui/Accordion.js +38 -38
  110. package/dist/components/ui/AgentMessageBubble.d.ts +20 -4
  111. package/dist/components/ui/AgentMessageBubble.js +39 -39
  112. package/dist/components/ui/AgentStatus.d.ts +1 -1
  113. package/dist/components/ui/AgentStatus.js +5 -10
  114. package/dist/components/ui/AgentTerminal.d.ts +4 -1
  115. package/dist/components/ui/AgentTerminal.js +3 -1
  116. package/dist/components/ui/AgentTimeline.d.ts +2 -2
  117. package/dist/components/ui/AgentTimeline.js +15 -6
  118. package/dist/components/ui/AnimatedDialog.js +38 -38
  119. package/dist/components/ui/AnimatedSheet.js +38 -38
  120. package/dist/components/ui/ApprovalCard.js +1 -1
  121. package/dist/components/ui/Breadcrumb.js +38 -38
  122. package/dist/components/ui/Calendar.js +38 -38
  123. package/dist/components/ui/Carousel.js +38 -38
  124. package/dist/components/ui/ChatActions.d.ts +14 -0
  125. package/dist/components/ui/ChatActions.js +52 -0
  126. package/dist/components/ui/ChatBranch.d.ts +18 -0
  127. package/dist/components/ui/ChatBranch.js +84 -0
  128. package/dist/components/ui/ChatChainOfThought.d.ts +25 -0
  129. package/dist/components/ui/ChatChainOfThought.js +99 -0
  130. package/dist/components/ui/ChatConfirmation.d.ts +37 -0
  131. package/dist/components/ui/ChatConfirmation.js +115 -0
  132. package/dist/components/ui/ChatGreeting.d.ts +18 -0
  133. package/dist/components/ui/ChatGreeting.js +80 -0
  134. package/dist/components/ui/ChatMessage.d.ts +40 -0
  135. package/dist/components/ui/ChatMessage.js +96 -0
  136. package/dist/components/ui/ChatPlan.d.ts +29 -0
  137. package/dist/components/ui/ChatPlan.js +86 -0
  138. package/dist/components/ui/ChatPromptInput.d.ts +32 -0
  139. package/dist/components/ui/ChatPromptInput.js +193 -0
  140. package/dist/components/ui/ChatPromptInputAttachments.d.ts +9 -0
  141. package/dist/components/ui/ChatPromptInputAttachments.js +145 -0
  142. package/dist/components/ui/ChatQueue.d.ts +32 -0
  143. package/dist/components/ui/ChatQueue.js +93 -0
  144. package/dist/components/ui/ChatReasoning.d.ts +20 -0
  145. package/dist/components/ui/ChatReasoning.js +91 -0
  146. package/dist/components/ui/ChatResponse.d.ts +14 -0
  147. package/dist/components/ui/ChatResponse.js +25 -0
  148. package/dist/components/ui/ChatShimmer.d.ts +23 -0
  149. package/dist/components/ui/ChatShimmer.js +6 -0
  150. package/dist/components/ui/ChatSources.d.ts +30 -0
  151. package/dist/components/ui/ChatSources.js +113 -0
  152. package/dist/components/ui/ChatSuggestion.d.ts +13 -0
  153. package/dist/components/ui/ChatSuggestion.js +41 -0
  154. package/dist/components/ui/ChatThinkingMessage.d.ts +12 -0
  155. package/dist/components/ui/ChatThinkingMessage.js +55 -0
  156. package/dist/components/ui/ChatToolCall.d.ts +41 -0
  157. package/dist/components/ui/ChatToolCall.js +192 -0
  158. package/dist/components/ui/CheckStatus.d.ts +1 -1
  159. package/dist/components/ui/Checkbox.js +38 -38
  160. package/dist/components/ui/CheckoutForm.js +38 -38
  161. package/dist/components/ui/CheckoutFormDemo.js +38 -38
  162. package/dist/components/ui/Combobox.js +38 -38
  163. package/dist/components/ui/Command.js +38 -38
  164. package/dist/components/ui/ContextMenu.js +38 -38
  165. package/dist/components/ui/Conversation.d.ts +21 -0
  166. package/dist/components/ui/Conversation.js +196 -0
  167. package/dist/components/ui/ConversationThread.d.ts +8 -2
  168. package/dist/components/ui/ConversationThread.js +34 -16
  169. package/dist/components/ui/DataTable.js +40 -40
  170. package/dist/components/ui/DatePicker.js +38 -38
  171. package/dist/components/ui/DateRangePicker.js +38 -38
  172. package/dist/components/ui/Dialog.js +38 -38
  173. package/dist/components/ui/DropdownMenu.js +39 -39
  174. package/dist/components/ui/FileUpload.js +38 -38
  175. package/dist/components/ui/InputOTP.js +38 -38
  176. package/dist/components/ui/KanbanBoard.js +2 -2
  177. package/dist/components/ui/LanguageSwitcher.js +38 -38
  178. package/dist/components/ui/Menubar.js +38 -38
  179. package/dist/components/ui/NavigationMenu.js +38 -38
  180. package/dist/components/ui/NotificationCenter.js +38 -38
  181. package/dist/components/ui/Pagination.js +38 -38
  182. package/dist/components/ui/RadioGroup.js +38 -38
  183. package/dist/components/ui/Resizable.js +38 -38
  184. package/dist/components/ui/SearchCommand.js +38 -38
  185. package/dist/components/ui/Select.js +38 -38
  186. package/dist/components/ui/SettingsModal.js +38 -38
  187. package/dist/components/ui/Sheet.js +38 -38
  188. package/dist/components/ui/Sidebar.js +41 -41
  189. package/dist/components/ui/StyleToggle.js +1 -1
  190. package/dist/components/ui/TagInput.js +38 -38
  191. package/dist/components/ui/ThemeToggle.js +39 -39
  192. package/dist/components/ui/ThinkingIndicator.d.ts +3 -1
  193. package/dist/components/ui/ThinkingIndicator.js +2 -1
  194. package/dist/components/ui/Toast.js +38 -38
  195. package/dist/components/ui/Toaster.js +38 -38
  196. package/dist/components/ui/ToolCallCard.d.ts +1 -1
  197. package/dist/components/ui/ToolCallCard.js +5 -1
  198. package/dist/components/ui/TreeView.js +38 -38
  199. package/dist/components/ui/charts/index.js +1 -1
  200. package/dist/components/ui/icons/index.js +38 -38
  201. package/dist/components/ui/text-effects/index.js +2 -2
  202. package/dist/hooks/use-scroll-to-bottom.d.ts +13 -0
  203. package/dist/hooks/use-scroll-to-bottom.js +2 -0
  204. package/dist/index.js +43 -43
  205. package/dist/internal/local-image-assets.d.ts +12 -0
  206. package/dist/messages/en.js +1 -1
  207. package/dist/messages/it.js +1 -1
  208. package/dist/test/PublicSeedTestProvider.js +2 -2
  209. package/dist/test/simulate-ime-composition.d.ts +54 -0
  210. package/dist/test/simulate-ime-composition.js +55 -0
  211. package/eslint-rules/nadicode/config.js +1 -0
  212. package/eslint-rules/nadicode/index.js +2 -0
  213. package/eslint-rules/nadicode/rules/no-deprecated-ds-import.js +77 -0
  214. package/eslint-rules/nadicode/rules/no-unregistered-glass.js +2 -0
  215. package/package.json +103 -6
  216. package/scripts/ds-check.mjs +94 -73
  217. package/dist/chunk-MLUSJTS2.js +0 -107
  218. package/dist/chunk-TZXZFSD2.js +0 -33
  219. package/dist/{chunk-MX5FUFQR.js → chunk-7A2RXKGH.js} +2 -2
  220. package/dist/{chunk-5DKCZWC6.js → chunk-CQEUNASC.js} +1 -1
  221. package/dist/{chunk-RMLS2QUC.js → chunk-HZERHGBT.js} +1 -1
  222. package/dist/{chunk-WAVU744B.js → chunk-IXQGKJU4.js} +3 -3
  223. package/dist/{chunk-4HRVRW2X.js → chunk-J2DCQDXO.js} +2 -2
  224. package/dist/{chunk-6MFAZU4B.js → chunk-RGE5OQMZ.js} +1 -1
  225. package/dist/{chunk-PJNHVPHF.js → chunk-TYP2MR3Q.js} +1 -1
  226. package/dist/{chunk-TS2JSPQR.js → chunk-U4GYSYGN.js} +1 -1
  227. package/dist/{chunk-EJNF6JLL.js → chunk-VEO56RH4.js} +1 -1
  228. package/dist/{chunk-AURJQZC4.js → chunk-VNNAL4A6.js} +1 -1
  229. package/dist/{chunk-5PORR6LE.js → chunk-XTASI4IY.js} +1 -1
  230. package/dist/{chunk-E4L6LR6P.js → chunk-Z233ZQZE.js} +1 -1
@@ -0,0 +1,186 @@
1
+ import { useSafeTimeout } from './chunk-MDAYDDTC.js';
2
+ import { WrenchIcon } from './chunk-AWIJHDNK.js';
3
+ import { LoaderCircleIcon } from './chunk-BRP6D56U.js';
4
+ import { ClockIcon } from './chunk-6G3RRWJT.js';
5
+ import { CheckIcon } from './chunk-CXACRCZ4.js';
6
+ import { ShieldCheckIcon } from './chunk-BFLN54VR.js';
7
+ import { XIcon } from './chunk-UIUMTURU.js';
8
+ import { CopyIcon } from './chunk-TV4RSQH4.js';
9
+ import { ChevronDownIcon } from './chunk-HJBXUXTD.js';
10
+ import { cn } from './chunk-QYZT24TS.js';
11
+ import * as React from 'react';
12
+ import { cva } from 'class-variance-authority';
13
+ import { jsxs, jsx } from 'react/jsx-runtime';
14
+
15
+ var ARGS_COLLAPSE_THRESHOLD = 300;
16
+ var toolCallCardVariants = cva(
17
+ "rounded-lg border p-4 glass-panel transition-colors",
18
+ {
19
+ variants: {
20
+ status: {
21
+ "pending": "border-border",
22
+ "running": "border-accent/40",
23
+ "complete": "border-success/40",
24
+ "error": "border-destructive/40",
25
+ "approval-requested": "border-warning/40",
26
+ "approval-responded": "border-accent/40",
27
+ "output-denied": "border-destructive/40"
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ status: "pending"
32
+ }
33
+ }
34
+ );
35
+ var StatusIcon = ({ status }) => {
36
+ switch (status) {
37
+ case "complete":
38
+ return /* @__PURE__ */ jsx(CheckIcon, { size: 16, className: "text-success" });
39
+ case "error":
40
+ case "output-denied":
41
+ return /* @__PURE__ */ jsx(XIcon, { size: 16, className: "text-destructive" });
42
+ case "running":
43
+ return /* @__PURE__ */ jsx(LoaderCircleIcon, { size: 16, className: "text-accent animate-spin" });
44
+ case "approval-requested":
45
+ return /* @__PURE__ */ jsx(ClockIcon, { size: 16, className: "text-warning" });
46
+ case "approval-responded":
47
+ return /* @__PURE__ */ jsx(ShieldCheckIcon, { size: 16, className: "text-accent" });
48
+ default:
49
+ return /* @__PURE__ */ jsx(WrenchIcon, { size: 16, className: "text-text-tertiary" });
50
+ }
51
+ };
52
+ function CopyButton({ text, label }) {
53
+ const [copied, setCopied] = React.useState(false);
54
+ const setSafeTimeout = useSafeTimeout();
55
+ const handleCopy = () => {
56
+ navigator.clipboard.writeText(text);
57
+ setCopied(true);
58
+ setSafeTimeout(() => setCopied(false), 2e3);
59
+ };
60
+ return /* @__PURE__ */ jsx(
61
+ "button",
62
+ {
63
+ type: "button",
64
+ onClick: handleCopy,
65
+ "aria-label": label,
66
+ className: "inline-flex items-center justify-center rounded-sm p-1 text-text-tertiary hover:text-text-secondary transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent",
67
+ children: copied ? /* @__PURE__ */ jsx(CheckIcon, { size: 14 }) : /* @__PURE__ */ jsx(CopyIcon, { size: 14 })
68
+ }
69
+ );
70
+ }
71
+ function ToolCallCard({
72
+ className,
73
+ status,
74
+ toolName,
75
+ args,
76
+ result,
77
+ duration,
78
+ defaultExpanded = false,
79
+ ref,
80
+ ...props
81
+ }) {
82
+ const argsJson = React.useMemo(
83
+ () => args && Object.keys(args).length > 0 ? JSON.stringify(args, null, 2) : null,
84
+ [args]
85
+ );
86
+ const argsIsLarge = argsJson != null && argsJson.length > ARGS_COLLAPSE_THRESHOLD;
87
+ const [resultExpanded, setResultExpanded] = React.useState(defaultExpanded);
88
+ const [argsExpanded, setArgsExpanded] = React.useState(!argsIsLarge);
89
+ const resultPanelId = React.useId();
90
+ const argsPanelId = React.useId();
91
+ return /* @__PURE__ */ jsxs(
92
+ "div",
93
+ {
94
+ ref,
95
+ className: cn(toolCallCardVariants({ status }), className),
96
+ ...props,
97
+ children: [
98
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
99
+ /* @__PURE__ */ jsx(StatusIcon, { status }),
100
+ /* @__PURE__ */ jsx("code", { className: "text-sm font-semibold text-text-primary", children: toolName }),
101
+ duration != null && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-xs text-text-tertiary", children: [
102
+ duration,
103
+ "ms"
104
+ ] })
105
+ ] }),
106
+ argsJson != null && /* @__PURE__ */ jsxs("div", { className: "mt-2", children: [
107
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
108
+ !!argsIsLarge && /* @__PURE__ */ jsxs(
109
+ "button",
110
+ {
111
+ type: "button",
112
+ onClick: () => setArgsExpanded(!argsExpanded),
113
+ "aria-expanded": argsExpanded,
114
+ "aria-controls": argsPanelId,
115
+ className: "flex items-center gap-1.5 text-xs text-text-tertiary hover:text-text-secondary transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent rounded-sm",
116
+ children: [
117
+ /* @__PURE__ */ jsx(
118
+ ChevronDownIcon,
119
+ {
120
+ size: 14,
121
+ className: cn("transition-transform", argsExpanded && "rotate-180")
122
+ }
123
+ ),
124
+ "Arguments"
125
+ ]
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsx(CopyButton, { text: argsJson, label: "Copy arguments" })
129
+ ] }),
130
+ /* @__PURE__ */ jsx(
131
+ "pre",
132
+ {
133
+ id: argsPanelId,
134
+ className: cn(
135
+ "mt-1.5 rounded bg-surface p-2 text-xs text-text-secondary overflow-x-auto",
136
+ argsIsLarge && !argsExpanded && "hidden"
137
+ ),
138
+ ...argsIsLarge && !argsExpanded ? { inert: true, "aria-hidden": true } : {},
139
+ children: argsJson
140
+ }
141
+ )
142
+ ] }),
143
+ !!result && /* @__PURE__ */ jsxs("div", { className: "mt-2", children: [
144
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
145
+ /* @__PURE__ */ jsxs(
146
+ "button",
147
+ {
148
+ type: "button",
149
+ onClick: () => setResultExpanded(!resultExpanded),
150
+ "aria-expanded": resultExpanded,
151
+ "aria-controls": resultPanelId,
152
+ className: "flex items-center gap-1.5 text-xs text-text-tertiary hover:text-text-secondary transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent rounded-sm",
153
+ children: [
154
+ /* @__PURE__ */ jsx(
155
+ ChevronDownIcon,
156
+ {
157
+ size: 14,
158
+ className: cn("transition-transform", resultExpanded && "rotate-180")
159
+ }
160
+ ),
161
+ resultExpanded ? "Hide result" : "Show result"
162
+ ]
163
+ }
164
+ ),
165
+ !!resultExpanded && /* @__PURE__ */ jsx(CopyButton, { text: result, label: "Copy result" })
166
+ ] }),
167
+ /* @__PURE__ */ jsx(
168
+ "pre",
169
+ {
170
+ id: resultPanelId,
171
+ className: cn(
172
+ "mt-1.5 rounded bg-surface p-2 text-xs text-text-secondary overflow-x-auto whitespace-pre-wrap",
173
+ !resultExpanded && "hidden"
174
+ ),
175
+ "aria-hidden": !resultExpanded,
176
+ ...!resultExpanded ? { inert: true } : {},
177
+ children: result
178
+ }
179
+ )
180
+ ] })
181
+ ]
182
+ }
183
+ );
184
+ }
185
+
186
+ export { ToolCallCard, toolCallCardVariants };
@@ -1,4 +1,5 @@
1
1
  import { Shine } from './chunk-DARC2ACH.js';
2
+ import { createAvatarDataUri } from './chunk-QQOWC53X.js';
2
3
  import { ShimmeringText } from './chunk-SGI25ZJ6.js';
3
4
  import { StaggerChildren } from './chunk-DQPK2XRL.js';
4
5
  import { Heading } from './chunk-WI547C47.js';
@@ -92,7 +93,7 @@ function TestimonialsVariant({
92
93
  ] }),
93
94
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
94
95
  /* @__PURE__ */ jsxs(Avatar, { className: "h-10 w-10 border border-primary/20", children: [
95
- /* @__PURE__ */ jsx(AvatarImage, { src: `https://api.dicebear.com/7.x/avataaars/svg?seed=${t.author}` }),
96
+ /* @__PURE__ */ jsx(AvatarImage, { src: createAvatarDataUri(t.author, t.avatar) }),
96
97
  /* @__PURE__ */ jsx(AvatarFallback, { children: t.avatar })
97
98
  ] }),
98
99
  /* @__PURE__ */ jsxs("div", { children: [
@@ -98,6 +98,7 @@ var seedMessagesEn = {
98
98
  },
99
99
  "thinkingIndicator": {
100
100
  "thinking": "Thinking",
101
+ "complete": "Complete",
101
102
  "showReasoning": "Show reasoning",
102
103
  "hideReasoning": "Hide reasoning"
103
104
  },
@@ -150,8 +151,19 @@ var seedMessagesEn = {
150
151
  "agentTeamPanel": {
151
152
  "agentTeam": "Agent team"
152
153
  },
154
+ "agentConversationBlock": {
155
+ "noMessages": "No messages"
156
+ },
157
+ "agentStatus": {
158
+ "idle": "Idle",
159
+ "thinking": "Thinking...",
160
+ "streaming": "Streaming",
161
+ "error": "Error",
162
+ "complete": "Complete"
163
+ },
153
164
  "agentTimeline": {
154
- "timeline": "Timeline"
165
+ "timeline": "Timeline",
166
+ "noEvents": "No events"
155
167
  },
156
168
  "morphingText": {
157
169
  "morphingText": "Morphing text"
@@ -1,3 +1,4 @@
1
+ import { CopyIcon } from './chunk-TV4RSQH4.js';
1
2
  import { cn } from './chunk-QYZT24TS.js';
2
3
  import * as React from 'react';
3
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -12,21 +13,26 @@ var lineTypePrefix = {
12
13
  stdout: "",
13
14
  stderr: ""
14
15
  };
15
- function AgentTerminal({ className, lines, title, onCopy, ref, ...props }) {
16
+ function AgentTerminal({ className, lines, title, onCopy, maxHeight = "max-h-80", ref, ...props }) {
16
17
  const scrollRef = React.useRef(null);
17
18
  React.useEffect(() => {
18
19
  if (scrollRef.current) {
19
20
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
20
21
  }
21
22
  }, [lines]);
23
+ const handleCopy = React.useCallback(() => {
24
+ const text = lines.map((l) => {
25
+ const prefix = lineTypePrefix[l.type || "stdout"];
26
+ return `${prefix}${l.text}`;
27
+ }).join("\n");
28
+ navigator.clipboard.writeText(text);
29
+ onCopy?.();
30
+ }, [lines, onCopy]);
22
31
  return /* @__PURE__ */ jsxs(
23
32
  "div",
24
33
  {
25
34
  ref,
26
- className: cn(
27
- "surface-solid rounded-lg overflow-hidden",
28
- className
29
- ),
35
+ className: cn("surface-solid rounded-lg overflow-hidden", className),
30
36
  ...props,
31
37
  children: [
32
38
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-border/50", children: [
@@ -38,14 +44,14 @@ function AgentTerminal({ className, lines, title, onCopy, ref, ...props }) {
38
44
  ] }),
39
45
  !!title && /* @__PURE__ */ jsx("span", { className: "text-xs text-text-secondary font-mono ml-1.5", children: title })
40
46
  ] }),
41
- !!onCopy && /* @__PURE__ */ jsx(
47
+ /* @__PURE__ */ jsx(
42
48
  "button",
43
49
  {
44
50
  type: "button",
45
- onClick: onCopy,
46
- className: "text-xs text-text-tertiary hover:text-text-primary transition-colors",
51
+ onClick: handleCopy,
52
+ className: "text-text-tertiary hover:text-text-primary transition-colors min-h-10 min-w-10 inline-flex items-center justify-center",
47
53
  "aria-label": "Copy terminal output",
48
- children: "Copy"
54
+ children: /* @__PURE__ */ jsx(CopyIcon, { size: 14, "aria-hidden": "true" })
49
55
  }
50
56
  )
51
57
  ] }),
@@ -53,7 +59,7 @@ function AgentTerminal({ className, lines, title, onCopy, ref, ...props }) {
53
59
  "div",
54
60
  {
55
61
  ref: scrollRef,
56
- className: "p-4 max-h-80 overflow-y-auto font-mono text-xs leading-5",
62
+ className: cn("p-4 overflow-y-auto font-mono text-xs leading-5", maxHeight),
57
63
  role: "log",
58
64
  "aria-label": title || "Terminal output",
59
65
  children: lines.map((line, idx) => {
@@ -1,3 +1,4 @@
1
+ import { createAvatarDataUri, LOCAL_NIKE_LOGO_SRC } from './chunk-QQOWC53X.js';
1
2
  import { Heading } from './chunk-WI547C47.js';
2
3
  import { Card, CardHeader, CardContent } from './chunk-AH6YSYYT.js';
3
4
  import { Avatar, AvatarImage, AvatarFallback } from './chunk-NAAU5IWU.js';
@@ -9,26 +10,26 @@ var defaultTestimonials = [
9
10
  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
11
  author: "M\xE9schac Irung",
11
12
  role: "Creator",
12
- avatar: "https://avatars.githubusercontent.com/u/47919550?v=4",
13
+ avatar: createAvatarDataUri("M\xE9schac Irung", "MI"),
13
14
  featured: true
14
15
  },
15
16
  {
16
17
  quote: "Tailus is really extraordinary and very practical, no need to break your head. A real gold mine.",
17
18
  author: "Th\xE9o Balick",
18
19
  role: "Frontend Dev",
19
- avatar: "https://avatars.githubusercontent.com/u/68236786?v=4"
20
+ avatar: createAvatarDataUri("Th\xE9o Balick", "TB")
20
21
  },
21
22
  {
22
23
  quote: "Great work on tailfolio template. This is one of the best personal website that I have seen so far!",
23
24
  author: "Glodie Lukose",
24
25
  role: "Frontend Dev",
25
- avatar: "https://avatars.githubusercontent.com/u/99137927?v=4"
26
+ avatar: createAvatarDataUri("Glodie Lukose", "GL")
26
27
  },
27
28
  {
28
29
  quote: "Great work on tailfolio template. This is one of the best personal website that I have seen so far!",
29
30
  author: "Bernard Ngandu",
30
31
  role: "Backend Dev",
31
- avatar: "https://avatars.githubusercontent.com/u/31113941?v=4"
32
+ avatar: createAvatarDataUri("Bernard Ngandu", "BN")
32
33
  }
33
34
  ];
34
35
  function getInitials(name) {
@@ -53,7 +54,7 @@ function TestimonialsBlock({
53
54
  "img",
54
55
  {
55
56
  className: "h-6 w-fit dark:invert",
56
- src: "https://html.tailus.io/blocks/customers/nike.svg",
57
+ src: LOCAL_NIKE_LOGO_SRC,
57
58
  alt: "Nike Logo",
58
59
  height: "24",
59
60
  width: "auto"
@@ -0,0 +1,78 @@
1
+ import { Typography } from './chunk-N53OMWW2.js';
2
+ import { Heading } from './chunk-WI547C47.js';
3
+ import { Avatar3D } from './chunk-4S326Z3D.js';
4
+ import { useMotionConfig, m, motionSpring } from './chunk-PD2YEH3H.js';
5
+ import { Badge } from './chunk-S4JAHKOP.js';
6
+ import { cn } from './chunk-QYZT24TS.js';
7
+ import * as React from 'react';
8
+ import { useTranslations } from 'next-intl';
9
+ import { jsxs, jsx } from 'react/jsx-runtime';
10
+
11
+ var stateBadgeVariants = {
12
+ idle: "secondary",
13
+ listening: "primary",
14
+ speaking: "accent"
15
+ };
16
+ function VoiceAgentCard({
17
+ agent,
18
+ state,
19
+ selected = false,
20
+ onSelect,
21
+ ariaLabel,
22
+ className
23
+ }) {
24
+ const t = useTranslations("blocks.voiceAgentCard");
25
+ const motionConfig = useMotionConfig();
26
+ const isInteractive = typeof onSelect === "function";
27
+ const stateLabels = React.useMemo(() => ({
28
+ idle: t("stateReady"),
29
+ listening: t("stateListening"),
30
+ speaking: t("stateSpeaking")
31
+ }), [t]);
32
+ return /* @__PURE__ */ jsxs(
33
+ m.button,
34
+ {
35
+ type: "button",
36
+ className: cn(
37
+ "flex flex-col items-center gap-4 rounded-xl p-4 transition-colors border-0 bg-transparent text-left focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-accent",
38
+ isInteractive ? "cursor-pointer" : "cursor-default",
39
+ selected ? "glass-panel ring-1 ring-accent/30" : "hover:bg-surface-hover/50",
40
+ className
41
+ ),
42
+ onClick: onSelect,
43
+ disabled: !isInteractive,
44
+ "aria-label": ariaLabel,
45
+ "aria-pressed": selected,
46
+ whileHover: isInteractive ? { y: -2 } : void 0,
47
+ transition: { ...motionSpring.snappy, ...motionConfig },
48
+ children: [
49
+ /* @__PURE__ */ jsx("div", { "aria-hidden": "true", children: /* @__PURE__ */ jsx(
50
+ Avatar3D,
51
+ {
52
+ src: agent.avatar,
53
+ name: agent.name,
54
+ state: selected ? state : "idle",
55
+ size: "lg",
56
+ enableTilt: selected,
57
+ interactive: false
58
+ }
59
+ ) }),
60
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-1.5 text-center", children: [
61
+ /* @__PURE__ */ jsx(Heading, { level: 4, size: "title", className: "text-sm font-semibold text-text-primary", children: agent.name }),
62
+ /* @__PURE__ */ jsx(Typography, { variant: "small", className: "text-text-tertiary text-xs", children: agent.role })
63
+ ] }),
64
+ !!selected && /* @__PURE__ */ jsx(
65
+ m.div,
66
+ {
67
+ initial: { opacity: 0, scale: 0.8 },
68
+ animate: { opacity: 1, scale: 1 },
69
+ transition: { ...motionSpring.snappy, ...motionConfig },
70
+ children: /* @__PURE__ */ jsx(Badge, { variant: stateBadgeVariants[state], className: "text-[10px]", children: stateLabels[state] })
71
+ }
72
+ )
73
+ ]
74
+ }
75
+ );
76
+ }
77
+
78
+ export { VoiceAgentCard };
@@ -10,12 +10,18 @@ var bubbleVariants = cva(
10
10
  variants: {
11
11
  role: {
12
12
  user: "ml-auto bg-primary/10 border-primary/20 text-text-primary",
13
+ assistant: "mr-auto glass-panel border-border text-text-primary",
13
14
  agent: "mr-auto glass-panel border-border text-text-primary",
14
15
  system: "mx-auto bg-muted border-border text-text-secondary text-center text-xs"
16
+ },
17
+ status: {
18
+ default: "",
19
+ error: "border-destructive/40 bg-destructive/5"
15
20
  }
16
21
  },
17
22
  defaultVariants: {
18
- role: "agent"
23
+ role: "assistant",
24
+ status: "default"
19
25
  }
20
26
  }
21
27
  );
@@ -26,6 +32,7 @@ function AgentMessageBubble({
26
32
  avatar,
27
33
  timestamp,
28
34
  toolCalls,
35
+ status = "default",
29
36
  actions,
30
37
  isStreaming,
31
38
  ref,
@@ -45,11 +52,28 @@ function AgentMessageBubble({
45
52
  children: [
46
53
  avatar && role !== "system" && /* @__PURE__ */ jsx("div", { className: "flex-shrink-0", "aria-hidden": "true", children: avatar }),
47
54
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 min-w-0", children: [
48
- /* @__PURE__ */ jsxs("div", { className: cn(bubbleVariants({ role })), children: [
49
- /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap break-words", children: content }),
50
- isStreaming && /* @__PURE__ */ jsx("span", { className: "inline-block w-1.5 h-4 ml-0.5 bg-accent animate-pulse rounded-sm" })
51
- ] }),
52
- !!toolCalls && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1.5 mt-1.5", children: toolCalls }),
55
+ /* @__PURE__ */ jsxs(
56
+ "div",
57
+ {
58
+ className: cn(bubbleVariants({ role, status })),
59
+ ...isStreaming ? { "aria-live": "polite" } : {},
60
+ children: [
61
+ /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap break-words", children: content }),
62
+ !!isStreaming && /* @__PURE__ */ jsx("span", { className: "inline-block w-1.5 h-4 ml-0.5 bg-accent animate-pulse rounded-sm" })
63
+ ]
64
+ }
65
+ ),
66
+ !!toolCalls && (Array.isArray(toolCalls) ? toolCalls.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 mt-1.5", children: toolCalls.map((tc) => /* @__PURE__ */ jsx(
67
+ "span",
68
+ {
69
+ className: cn(
70
+ "inline-flex items-center gap-1 rounded-md border px-2 py-0.5 text-xs",
71
+ tc.state === "error" ? "border-destructive/30 text-destructive" : tc.state === "complete" ? "border-success/30 text-success" : tc.state === "running" ? "border-accent/30 text-accent" : "border-border text-text-tertiary"
72
+ ),
73
+ children: tc.name
74
+ },
75
+ tc.id
76
+ )) }) : /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-1.5 mt-1.5", children: toolCalls })),
53
77
  /* @__PURE__ */ jsxs(
54
78
  "div",
55
79
  {
@@ -67,7 +91,7 @@ function AgentMessageBubble({
67
91
  onClick: actions.onCopy,
68
92
  className: "hover:text-text-secondary transition-colors",
69
93
  "aria-label": "Copy message",
70
- children: /* @__PURE__ */ jsx(CopyIcon, { size: 12 })
94
+ children: /* @__PURE__ */ jsx(CopyIcon, { size: 12, "aria-hidden": "true" })
71
95
  }
72
96
  ),
73
97
  actions.onRetry && /* @__PURE__ */ jsx(
@@ -77,7 +101,7 @@ function AgentMessageBubble({
77
101
  onClick: actions.onRetry,
78
102
  className: "hover:text-text-secondary transition-colors",
79
103
  "aria-label": "Retry message",
80
- children: /* @__PURE__ */ jsx(RefreshCWIcon, { size: 12 })
104
+ children: /* @__PURE__ */ jsx(RefreshCWIcon, { size: 12, "aria-hidden": "true" })
81
105
  }
82
106
  )
83
107
  ] })
@@ -0,0 +1,60 @@
1
+ import { m } from './chunk-PD2YEH3H.js';
2
+ import { cn } from './chunk-QYZT24TS.js';
3
+ import { memo, useMemo } from 'react';
4
+ import { useReducedMotion } from 'motion/react';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ function ChatShimmerInner({
8
+ children,
9
+ as: Component = "span",
10
+ className,
11
+ duration = 2,
12
+ spread = 2,
13
+ ref
14
+ }) {
15
+ const prefersReduced = useReducedMotion();
16
+ const dynamicSpread = useMemo(
17
+ () => (children?.length ?? 0) * spread,
18
+ [children, spread]
19
+ );
20
+ const style = {
21
+ "--spread": `${dynamicSpread}px`,
22
+ backgroundImage: "var(--bg), linear-gradient(var(--color-text-secondary), var(--color-text-secondary))"
23
+ };
24
+ if (prefersReduced) {
25
+ return /* @__PURE__ */ jsx(
26
+ Component,
27
+ {
28
+ ref,
29
+ className: cn("inline-block text-text-secondary", className),
30
+ "data-shimmer": "true",
31
+ children
32
+ }
33
+ );
34
+ }
35
+ const MotionComponent = m[Component];
36
+ return /* @__PURE__ */ jsx(
37
+ MotionComponent,
38
+ {
39
+ ref,
40
+ className: cn(
41
+ "inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent",
42
+ "[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-text-primary),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]",
43
+ className
44
+ ),
45
+ "data-shimmer": "true",
46
+ style,
47
+ initial: { backgroundPosition: "100% center" },
48
+ animate: { backgroundPosition: "0% center" },
49
+ transition: {
50
+ repeat: Number.POSITIVE_INFINITY,
51
+ duration,
52
+ ease: "linear"
53
+ },
54
+ children
55
+ }
56
+ );
57
+ }
58
+ var ChatShimmer = memo(ChatShimmerInner);
59
+
60
+ export { ChatShimmer };
@@ -1,9 +1,9 @@
1
- import { NavigationShellPageKit } from './chunk-TUKZKU72.js';
1
+ import { NavigationShellPageKit } from './chunk-ZKLB5N3Q.js';
2
2
  import { Typography } from './chunk-N53OMWW2.js';
3
3
  import { Textarea } from './chunk-4OBE2FS2.js';
4
4
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-WH62BE24.js';
5
- import { FieldSet, Field, FieldLabel, FieldDescription, FieldError } from './chunk-RX5EUODB.js';
6
5
  import { Heading } from './chunk-WI547C47.js';
6
+ import { FieldSet, Field, FieldLabel, FieldDescription, FieldError } from './chunk-RX5EUODB.js';
7
7
  import { Input } from './chunk-AP3XXYAY.js';
8
8
  import { Card, CardHeader, CardTitle, CardContent } from './chunk-AH6YSYYT.js';
9
9
  import { Button } from './chunk-7KIDDF3I.js';
@@ -98,6 +98,7 @@ var seedMessagesIt = {
98
98
  },
99
99
  "thinkingIndicator": {
100
100
  "thinking": "In elaborazione",
101
+ "complete": "Completo",
101
102
  "showReasoning": "Mostra ragionamento",
102
103
  "hideReasoning": "Nascondi ragionamento"
103
104
  },
@@ -150,8 +151,19 @@ var seedMessagesIt = {
150
151
  "agentTeamPanel": {
151
152
  "agentTeam": "Team agente"
152
153
  },
154
+ "agentConversationBlock": {
155
+ "noMessages": "Nessun messaggio"
156
+ },
157
+ "agentStatus": {
158
+ "idle": "Inattivo",
159
+ "thinking": "In elaborazione...",
160
+ "streaming": "In streaming",
161
+ "error": "Errore",
162
+ "complete": "Completato"
163
+ },
153
164
  "agentTimeline": {
154
- "timeline": "Cronologia"
165
+ "timeline": "Cronologia",
166
+ "noEvents": "Nessun evento"
155
167
  },
156
168
  "morphingText": {
157
169
  "morphingText": "Testo in trasformazione"
@@ -1,11 +1,11 @@
1
- import { NavigationShellPageKit } from './chunk-TUKZKU72.js';
1
+ import { NavigationShellPageKit } from './chunk-ZKLB5N3Q.js';
2
2
  import { Typography } from './chunk-N53OMWW2.js';
3
3
  import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from './chunk-HOWTYZL5.js';
4
4
  import { Pagination, PaginationContent, PaginationItem, PaginationPrevious, PaginationLink, PaginationNext } from './chunk-2BADJLMV.js';
5
5
  import { Heading } from './chunk-WI547C47.js';
6
6
  import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from './chunk-PXDHNGTG.js';
7
- import { Empty, EmptyTitle, EmptyDescription } from './chunk-55HD4L6G.js';
8
7
  import { Input } from './chunk-AP3XXYAY.js';
8
+ import { Empty, EmptyTitle, EmptyDescription } from './chunk-55HD4L6G.js';
9
9
  import { Card, CardHeader, CardTitle, CardContent } from './chunk-AH6YSYYT.js';
10
10
  import { Button } from './chunk-7KIDDF3I.js';
11
11
  import { Badge } from './chunk-S4JAHKOP.js';