@vadimcomanescu/nadicode-design-system 2.0.7 → 2.0.8

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 (231) 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 +6162 -0
  18. package/contracts/public-surface-registry.schema.json +227 -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 +2 -0
  212. package/eslint-rules/nadicode/index.js +4 -0
  213. package/eslint-rules/nadicode/rules/no-deprecated-ds-import.js +77 -0
  214. package/eslint-rules/nadicode/rules/no-forbidden-page-kit-import.js +99 -0
  215. package/eslint-rules/nadicode/rules/no-unregistered-glass.js +2 -0
  216. package/package.json +103 -6
  217. package/scripts/ds-check.mjs +94 -73
  218. package/dist/chunk-MLUSJTS2.js +0 -107
  219. package/dist/chunk-TZXZFSD2.js +0 -33
  220. package/dist/{chunk-MX5FUFQR.js → chunk-7A2RXKGH.js} +2 -2
  221. package/dist/{chunk-5DKCZWC6.js → chunk-CQEUNASC.js} +1 -1
  222. package/dist/{chunk-RMLS2QUC.js → chunk-HZERHGBT.js} +1 -1
  223. package/dist/{chunk-WAVU744B.js → chunk-IXQGKJU4.js} +3 -3
  224. package/dist/{chunk-4HRVRW2X.js → chunk-J2DCQDXO.js} +2 -2
  225. package/dist/{chunk-6MFAZU4B.js → chunk-RGE5OQMZ.js} +1 -1
  226. package/dist/{chunk-PJNHVPHF.js → chunk-TYP2MR3Q.js} +1 -1
  227. package/dist/{chunk-TS2JSPQR.js → chunk-U4GYSYGN.js} +1 -1
  228. package/dist/{chunk-EJNF6JLL.js → chunk-VEO56RH4.js} +1 -1
  229. package/dist/{chunk-AURJQZC4.js → chunk-VNNAL4A6.js} +1 -1
  230. package/dist/{chunk-5PORR6LE.js → chunk-XTASI4IY.js} +1 -1
  231. package/dist/{chunk-E4L6LR6P.js → chunk-Z233ZQZE.js} +1 -1
@@ -0,0 +1,99 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const RULES_DIR = dirname(fileURLToPath(import.meta.url));
6
+ const REGISTRY_PATH = resolve(RULES_DIR, "../../../contracts/public-surface-registry.json");
7
+ const DS_PACKAGE = "@vadimcomanescu/nadicode-design-system";
8
+
9
+ let forbiddenByPageKit = null;
10
+
11
+ function loadForbiddenMap() {
12
+ if (forbiddenByPageKit) {
13
+ return forbiddenByPageKit;
14
+ }
15
+
16
+ forbiddenByPageKit = new Map();
17
+
18
+ try {
19
+ const registry = JSON.parse(readFileSync(REGISTRY_PATH, "utf8"));
20
+ for (const entry of registry.entries ?? []) {
21
+ if (
22
+ entry.category === "page-kits" &&
23
+ entry.pageKitContract?.forbiddenComponents?.length > 0
24
+ ) {
25
+ const forbidden = new Set(entry.pageKitContract.forbiddenComponents);
26
+ forbiddenByPageKit.set(entry.subpath, {
27
+ canonicalExport: entry.canonicalExport,
28
+ forbidden,
29
+ });
30
+ }
31
+ }
32
+ } catch {
33
+ // Registry unavailable. Rule becomes a no-op.
34
+ }
35
+
36
+ return forbiddenByPageKit;
37
+ }
38
+
39
+ function subpathFromImport(source) {
40
+ if (!source.startsWith(DS_PACKAGE + "/")) {
41
+ return null;
42
+ }
43
+ return "./" + source.slice(DS_PACKAGE.length + 1);
44
+ }
45
+
46
+ const rule = {
47
+ meta: {
48
+ type: "problem",
49
+ docs: {
50
+ description:
51
+ "Disallow importing components that are forbidden alongside a page-kit from the design system.",
52
+ },
53
+ schema: [],
54
+ },
55
+ create(context) {
56
+ const dsImports = [];
57
+
58
+ return {
59
+ ImportDeclaration(node) {
60
+ const source = node.source.value;
61
+ if (typeof source !== "string" || !source.startsWith(DS_PACKAGE + "/")) {
62
+ return;
63
+ }
64
+ dsImports.push({ node, subpath: subpathFromImport(source) });
65
+ },
66
+
67
+ "Program:exit"() {
68
+ const map = loadForbiddenMap();
69
+ if (map.size === 0 || dsImports.length === 0) {
70
+ return;
71
+ }
72
+
73
+ const activePageKits = dsImports.filter((imp) => map.has(imp.subpath));
74
+ if (activePageKits.length === 0) {
75
+ return;
76
+ }
77
+
78
+ for (const imp of dsImports) {
79
+ for (const pk of activePageKits) {
80
+ const pkData = map.get(pk.subpath);
81
+ if (pkData.forbidden.has(imp.subpath)) {
82
+ context.report({
83
+ node: imp.node,
84
+ message:
85
+ '"{{source}}" is forbidden when using {{pageKit}}. This import violates the page-kit\'s cross-domain contract.',
86
+ data: {
87
+ source: imp.node.source.value,
88
+ pageKit: pkData.canonicalExport,
89
+ },
90
+ });
91
+ }
92
+ }
93
+ }
94
+ },
95
+ };
96
+ },
97
+ };
98
+
99
+ export default rule;
@@ -39,6 +39,8 @@ const ALLOWED_FILES = [
39
39
  "Card.tsx",
40
40
  "Button.tsx",
41
41
  "ToolCallCard.tsx",
42
+ "ChatToolCall.tsx",
43
+ "ChatPromptInput.tsx",
42
44
  "ApprovalCard.tsx",
43
45
  "ThinkingIndicator.tsx",
44
46
  "AgentMessageBubble.tsx",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vadimcomanescu/nadicode-design-system",
3
- "version": "2.0.7",
3
+ "version": "2.0.8",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -8,6 +8,7 @@
8
8
  "type": "module",
9
9
  "files": [
10
10
  "dist",
11
+ "contracts",
11
12
  "css",
12
13
  "src/lib/tokens.config.js",
13
14
  "eslint-rules/nadicode",
@@ -27,7 +28,9 @@
27
28
  "build": "next build",
28
29
  "start": "next start",
29
30
  "build:types": "tsc -p tsconfig.types.json && node scripts/rewrite-dist-types.mjs",
30
- "build:lib": "node scripts/build-tokens-css.mjs && tsup && npm run build:types && node scripts/generate-catalog.mjs && node scripts/check-export-targets.mjs",
31
+ "build:lib": "node scripts/build-tokens-css.mjs && tsup && npm run build:types && npm run contracts:generate && node scripts/check-export-targets.mjs",
32
+ "contracts:generate": "npm run catalog:generate:readonly && npm run registry:generate && npm run artifacts:generate && npm run consumer-contract:generate",
33
+ "contracts:check": "npm run catalog:check && npm run registry:validate && npm run artifacts:check",
31
34
  "pack:artifact": "node scripts/pack-package-artifact.mjs",
32
35
  "exports:generate": "npm run artifacts:generate",
33
36
  "test:distribution": "node scripts/package-smoke-test.mjs",
@@ -41,20 +44,23 @@
41
44
  "ds:validate": "npm run ds:check && npm run lint && tsc --noEmit && node scripts/check-tokens-freshness.mjs && npm run build:lib && npm run test:distribution && npm run build",
42
45
  "ds:check": "node scripts/ds-check.mjs",
43
46
  "registry:generate": "node scripts/generate-public-surface-registry.mjs && node scripts/generate-consumer-intent-map.mjs && node scripts/generate-message-catalog-contract.mjs && node scripts/generate-spec-manifest.mjs",
44
- "registry:validate": "node scripts/validate-public-surface-registry.mjs && node scripts/validate-consumer-intent-map.mjs && node scripts/validate-spec-manifest.mjs && node scripts/validate-release-governance.mjs",
47
+ "registry:validate": "node scripts/validate-public-surface-registry.mjs && node scripts/validate-consumer-intent-map.mjs && node scripts/validate-spec-manifest.mjs && node scripts/validate-consumer-contract.mjs && node scripts/validate-release-governance.mjs",
45
48
  "intent-map:generate": "node scripts/generate-consumer-intent-map.mjs",
46
49
  "intent-map:validate": "node scripts/validate-consumer-intent-map.mjs",
47
50
  "message-contract:generate": "node scripts/generate-message-catalog-contract.mjs",
48
51
  "message-contract:check": "node scripts/generate-message-catalog-contract.mjs --check",
52
+ "consumer-contract:generate": "node scripts/generate-consumer-contract.mjs",
53
+ "consumer-contract:check": "node scripts/generate-consumer-contract.mjs --check",
49
54
  "spec-manifest:generate": "node scripts/generate-spec-manifest.mjs",
50
55
  "spec-manifest:check": "node scripts/validate-spec-manifest.mjs",
51
56
  "release-governance:baseline": "node scripts/generate-release-governance-baseline.mjs",
52
57
  "release-governance:validate": "node scripts/validate-release-governance.mjs",
53
58
  "ds:task-pack": "node scripts/ds-generate-task-pack.mjs",
54
59
  "catalog:generate": "node scripts/generate-catalog.mjs",
55
- "catalog:check": "node scripts/generate-catalog.mjs --check",
60
+ "catalog:generate:readonly": "SEED_GENERATE_CATALOG_SKIP_DOC_WRITES=1 node scripts/generate-catalog.mjs",
61
+ "catalog:check": "SEED_GENERATE_CATALOG_SKIP_DOC_WRITES=1 node scripts/generate-catalog.mjs --check",
56
62
  "docs:api": "node scripts/docs-generate-api.mjs",
57
- "docs:check": "node scripts/docs-check.mjs && node scripts/generate-catalog.mjs --check",
63
+ "docs:check": "node scripts/docs-check.mjs && npm run catalog:check",
58
64
  "docs:inventory": "node scripts/docs-inventory.mjs",
59
65
  "release:check": "npm run registry:validate && npm run docs:check && npm run test:all",
60
66
  "release:verify": "node scripts/verify-package-release.mjs",
@@ -62,7 +68,8 @@
62
68
  "release:patch": "npm version patch --no-git-tag-version && npm run publish:package",
63
69
  "release:minor": "npm version minor --no-git-tag-version && npm run publish:package",
64
70
  "release:major": "npm version major --no-git-tag-version && npm run publish:package",
65
- "precommit": "npm run typecheck && npx lint-staged && npm run lint && npm run ds:check && npm run docs:check && vitest run && npm run build",
71
+ "precommit": "npx lint-staged --config package.json && npm run ds:validate",
72
+ "gate:prepush": "npm run typecheck && npm run lint && npm run ds:check && npm run build:lib && npm run docs:check && npx vitest run --coverage && npm run build && npm run lighthouse",
66
73
  "test:visual": "npx playwright test --config=playwright.visual.config.ts",
67
74
  "test:visual:update": "npx playwright test --config=playwright.visual.config.ts --update-snapshots",
68
75
  "test:a11y": "npx playwright test --config=playwright.a11y.config.ts",
@@ -133,8 +140,10 @@
133
140
  "react-use-measure": "^2.1.7",
134
141
  "recharts": "^3.7.0",
135
142
  "sonner": "^2.0.7",
143
+ "streamdown": "2.5.0",
136
144
  "tailwind-merge": "^3.4.0",
137
145
  "tailwindcss-animate": "^1.0.7",
146
+ "use-stick-to-bottom": "1.0.47",
138
147
  "vaul": "^1.1.2",
139
148
  "zod": "^4.3.6"
140
149
  },
@@ -381,6 +390,7 @@
381
390
  "import": "./dist/components/ui/BentoGrid.js",
382
391
  "types": "./dist/components/ui/BentoGrid.d.ts"
383
392
  },
393
+ "./block-props-schemas": "./contracts/block-props-schemas.json",
384
394
  "./blog-content-page-kit": {
385
395
  "import": "./dist/components/page-kits/BlogContentPageKit.js",
386
396
  "types": "./dist/components/page-kits/BlogContentPageKit.d.ts"
@@ -474,10 +484,78 @@
474
484
  "import": "./dist/components/ui/charts/Sparkline.js",
475
485
  "types": "./dist/components/ui/charts/Sparkline.d.ts"
476
486
  },
487
+ "./chat-actions": {
488
+ "import": "./dist/components/ui/ChatActions.js",
489
+ "types": "./dist/components/ui/ChatActions.d.ts"
490
+ },
491
+ "./chat-branch": {
492
+ "import": "./dist/components/ui/ChatBranch.js",
493
+ "types": "./dist/components/ui/ChatBranch.d.ts"
494
+ },
495
+ "./chat-chain-of-thought": {
496
+ "import": "./dist/components/ui/ChatChainOfThought.js",
497
+ "types": "./dist/components/ui/ChatChainOfThought.d.ts"
498
+ },
499
+ "./chat-confirmation": {
500
+ "import": "./dist/components/ui/ChatConfirmation.js",
501
+ "types": "./dist/components/ui/ChatConfirmation.d.ts"
502
+ },
503
+ "./chat-greeting": {
504
+ "import": "./dist/components/ui/ChatGreeting.js",
505
+ "types": "./dist/components/ui/ChatGreeting.d.ts"
506
+ },
477
507
  "./chat-layout": {
478
508
  "import": "./dist/components/blocks/ChatLayout.js",
479
509
  "types": "./dist/components/blocks/ChatLayout.d.ts"
480
510
  },
511
+ "./chat-message": {
512
+ "import": "./dist/components/ui/ChatMessage.js",
513
+ "types": "./dist/components/ui/ChatMessage.d.ts"
514
+ },
515
+ "./chat-plan": {
516
+ "import": "./dist/components/ui/ChatPlan.js",
517
+ "types": "./dist/components/ui/ChatPlan.d.ts"
518
+ },
519
+ "./chat-prompt-input": {
520
+ "import": "./dist/components/ui/ChatPromptInput.js",
521
+ "types": "./dist/components/ui/ChatPromptInput.d.ts"
522
+ },
523
+ "./chat-prompt-input-attachments": {
524
+ "import": "./dist/components/ui/ChatPromptInputAttachments.js",
525
+ "types": "./dist/components/ui/ChatPromptInputAttachments.d.ts"
526
+ },
527
+ "./chat-queue": {
528
+ "import": "./dist/components/ui/ChatQueue.js",
529
+ "types": "./dist/components/ui/ChatQueue.d.ts"
530
+ },
531
+ "./chat-reasoning": {
532
+ "import": "./dist/components/ui/ChatReasoning.js",
533
+ "types": "./dist/components/ui/ChatReasoning.d.ts"
534
+ },
535
+ "./chat-response": {
536
+ "import": "./dist/components/ui/ChatResponse.js",
537
+ "types": "./dist/components/ui/ChatResponse.d.ts"
538
+ },
539
+ "./chat-shimmer": {
540
+ "import": "./dist/components/ui/ChatShimmer.js",
541
+ "types": "./dist/components/ui/ChatShimmer.d.ts"
542
+ },
543
+ "./chat-sources": {
544
+ "import": "./dist/components/ui/ChatSources.js",
545
+ "types": "./dist/components/ui/ChatSources.d.ts"
546
+ },
547
+ "./chat-suggestion": {
548
+ "import": "./dist/components/ui/ChatSuggestion.js",
549
+ "types": "./dist/components/ui/ChatSuggestion.d.ts"
550
+ },
551
+ "./chat-thinking-message": {
552
+ "import": "./dist/components/ui/ChatThinkingMessage.js",
553
+ "types": "./dist/components/ui/ChatThinkingMessage.d.ts"
554
+ },
555
+ "./chat-tool-call": {
556
+ "import": "./dist/components/ui/ChatToolCall.js",
557
+ "types": "./dist/components/ui/ChatToolCall.d.ts"
558
+ },
481
559
  "./check-status": {
482
560
  "import": "./dist/components/ui/CheckStatus.js",
483
561
  "types": "./dist/components/ui/CheckStatus.d.ts"
@@ -522,10 +600,13 @@
522
600
  "import": "./dist/components/blocks/ComparisonBlock.js",
523
601
  "types": "./dist/components/blocks/ComparisonBlock.d.ts"
524
602
  },
603
+ "./component-props-schemas": "./contracts/component-props-schemas.json",
525
604
  "./confetti-burst": {
526
605
  "import": "./dist/components/ui/ConfettiBurst.js",
527
606
  "types": "./dist/components/ui/ConfettiBurst.d.ts"
528
607
  },
608
+ "./consumer-contract": "./contracts/consumer-contract.json",
609
+ "./consumer-intent-map": "./contracts/consumer-intent-map.json",
529
610
  "./contact-block": {
530
611
  "import": "./dist/components/blocks/ContactBlock.js",
531
612
  "types": "./dist/components/blocks/ContactBlock.d.ts"
@@ -538,6 +619,10 @@
538
619
  "import": "./dist/components/ui/ContextMeter.js",
539
620
  "types": "./dist/components/ui/ContextMeter.d.ts"
540
621
  },
622
+ "./conversation": {
623
+ "import": "./dist/components/ui/Conversation.js",
624
+ "types": "./dist/components/ui/Conversation.d.ts"
625
+ },
541
626
  "./conversation-thread": {
542
627
  "import": "./dist/components/ui/ConversationThread.js",
543
628
  "types": "./dist/components/ui/ConversationThread.d.ts"
@@ -706,6 +791,10 @@
706
791
  "import": "./dist/hooks/use-safe-timeout.js",
707
792
  "types": "./dist/hooks/use-safe-timeout.d.ts"
708
793
  },
794
+ "./hooks/use-scroll-to-bottom": {
795
+ "import": "./dist/hooks/use-scroll-to-bottom.js",
796
+ "types": "./dist/hooks/use-scroll-to-bottom.d.ts"
797
+ },
709
798
  "./hooks/use-shader-preset": {
710
799
  "import": "./dist/hooks/use-shader-preset.js",
711
800
  "types": "./dist/hooks/use-shader-preset.d.ts"
@@ -1318,6 +1407,7 @@
1318
1407
  "import": "./dist/components/ui/Menubar.js",
1319
1408
  "types": "./dist/components/ui/Menubar.d.ts"
1320
1409
  },
1410
+ "./message-catalog-contract": "./contracts/message-catalog-contract.json",
1321
1411
  "./messages/en": {
1322
1412
  "import": "./dist/messages/en.js",
1323
1413
  "types": "./dist/messages/en.d.ts"
@@ -1382,6 +1472,7 @@
1382
1472
  "import": "./dist/components/page-kits/OnboardingPageKit.js",
1383
1473
  "types": "./dist/components/page-kits/OnboardingPageKit.d.ts"
1384
1474
  },
1475
+ "./page-kit-props-schemas": "./contracts/page-kit-props-schemas.json",
1385
1476
  "./page-transition": {
1386
1477
  "import": "./dist/components/ui/PageTransition.js",
1387
1478
  "types": "./dist/components/ui/PageTransition.d.ts"
@@ -1438,6 +1529,7 @@
1438
1529
  "import": "./dist/components/ui/PromoCard.js",
1439
1530
  "types": "./dist/components/ui/PromoCard.d.ts"
1440
1531
  },
1532
+ "./public-surface-registry": "./contracts/public-surface-registry.json",
1441
1533
  "./radio-group": {
1442
1534
  "import": "./dist/components/ui/RadioGroup.js",
1443
1535
  "types": "./dist/components/ui/RadioGroup.d.ts"
@@ -1550,6 +1642,7 @@
1550
1642
  "import": "./dist/components/ui/SourceCitation.js",
1551
1643
  "types": "./dist/components/ui/SourceCitation.d.ts"
1552
1644
  },
1645
+ "./spec-manifest": "./contracts/spec-manifest.json",
1553
1646
  "./spinner": {
1554
1647
  "import": "./dist/components/ui/Spinner.js",
1555
1648
  "types": "./dist/components/ui/Spinner.d.ts"
@@ -1631,6 +1724,10 @@
1631
1724
  "import": "./dist/test/PublicSeedTestProvider.js",
1632
1725
  "types": "./dist/test/PublicSeedTestProvider.d.ts"
1633
1726
  },
1727
+ "./test/simulate-ime-composition": {
1728
+ "import": "./dist/test/simulate-ime-composition.js",
1729
+ "types": "./dist/test/simulate-ime-composition.d.ts"
1730
+ },
1634
1731
  "./testimonials-block": {
1635
1732
  "import": "./dist/components/blocks/TestimonialsBlock.js",
1636
1733
  "types": "./dist/components/blocks/TestimonialsBlock.d.ts"
@@ -261,15 +261,14 @@ function expectFile(candidates, rule, detail) {
261
261
  return path;
262
262
  }
263
263
 
264
- function ensureFileContains(path, snippet, rule, detail) {
265
- if (!path) {
266
- return;
267
- }
268
-
269
- const content = readFileSync(path, "utf8");
270
- if (!content.includes(snippet)) {
271
- addIssue(relativePath(path), rule, detail);
272
- }
264
+ function hasImportFrom(content, moduleSpecifier) {
265
+ const code = maskNonCode(content, { preserveStrings: true });
266
+ const escaped = escapeRegExp(moduleSpecifier);
267
+ const boundary = moduleSpecifier.endsWith("/") ? "" : `["']`;
268
+ return (
269
+ new RegExp(String.raw`^\s*import\b.*["']${escaped}${boundary}`, "m").test(code) ||
270
+ new RegExp(String.raw`\bimport\s*\(\s*["']${escaped}${boundary}`, "m").test(code)
271
+ );
273
272
  }
274
273
 
275
274
  function stripJsonComments(text) {
@@ -789,12 +788,21 @@ function checkProvidersContract() {
789
788
  "App Router providers.tsx must exist.",
790
789
  );
791
790
 
792
- ensureFileContains(
793
- providersPath,
794
- "@vadimcomanescu/nadicode-design-system/theme-provider",
795
- "seed-providers-contract",
796
- "providers.tsx must import ThemeProvider from @vadimcomanescu/nadicode-design-system/theme-provider.",
797
- );
791
+ if (!providersPath) {
792
+ return;
793
+ }
794
+
795
+ const providersContent = readFileSync(providersPath, "utf8");
796
+ const themeProviderBinding =
797
+ getNamedImportBinding(providersContent, "@vadimcomanescu/nadicode-design-system/theme-provider", "ThemeProvider") ??
798
+ getDefaultImportBinding(providersContent, "@vadimcomanescu/nadicode-design-system/theme-provider");
799
+ if (!themeProviderBinding) {
800
+ addIssue(
801
+ relativePath(providersPath),
802
+ "seed-providers-contract",
803
+ "providers.tsx must import ThemeProvider from @vadimcomanescu/nadicode-design-system/theme-provider.",
804
+ );
805
+ }
798
806
  }
799
807
 
800
808
  function checkI18nContract() {
@@ -804,60 +812,67 @@ function checkI18nContract() {
804
812
  "The app must own src/i18n/request.ts and merge package-backed Seed catalogs there.",
805
813
  );
806
814
 
807
- ensureFileContains(
808
- requestPath,
809
- "@vadimcomanescu/nadicode-design-system/messages/",
810
- "seed-i18n-request-contract",
811
- "src/i18n/request.ts must import Seed catalogs from @vadimcomanescu/nadicode-design-system/messages/<locale>.",
812
- );
813
- ensureFileContains(
814
- requestPath,
815
- "mergeSeedMessages",
816
- "seed-i18n-request-contract",
817
- "src/i18n/request.ts must merge package-backed Seed catalogs with app messages via mergeSeedMessages().",
818
- );
815
+ if (!requestPath) {
816
+ return;
817
+ }
819
818
 
820
- if (requestPath) {
821
- const requestContent = readFileSync(requestPath, "utf8");
822
- const requestCodeWithoutImports = getCodeWithoutImports(requestContent);
823
- if (requestContent.includes("seed-messages/")) {
824
- addIssue(
825
- relativePath(requestPath),
826
- "seed-i18n-request-contract",
827
- "src/i18n/request.ts must not import DS catalogs from repo-local seed-messages/*.json.",
828
- );
829
- }
819
+ const requestContent = readFileSync(requestPath, "utf8");
820
+ const maskedRequest = maskNonCode(requestContent, { preserveStrings: true });
821
+ const requestCodeWithoutImports = getCodeWithoutImports(requestContent);
830
822
 
831
- if (!hasGetRequestConfigExport(requestContent)) {
832
- addIssue(
833
- relativePath(requestPath),
834
- "seed-i18n-request-contract",
835
- "src/i18n/request.ts must default-export a next-intl getRequestConfig(...) result.",
836
- );
837
- }
823
+ if (!hasImportFrom(requestContent, "@vadimcomanescu/nadicode-design-system/messages/")) {
824
+ addIssue(
825
+ relativePath(requestPath),
826
+ "seed-i18n-request-contract",
827
+ "src/i18n/request.ts must import Seed catalogs from @vadimcomanescu/nadicode-design-system/messages/<locale>.",
828
+ );
829
+ }
830
+
831
+ if (!maskNonCode(requestContent).includes("mergeSeedMessages")) {
832
+ addIssue(
833
+ relativePath(requestPath),
834
+ "seed-i18n-request-contract",
835
+ "src/i18n/request.ts must merge package-backed Seed catalogs with app messages via mergeSeedMessages().",
836
+ );
837
+ }
838
+
839
+ if (maskedRequest.includes("seed-messages/")) {
840
+ addIssue(
841
+ relativePath(requestPath),
842
+ "seed-i18n-request-contract",
843
+ "src/i18n/request.ts must not import DS catalogs from repo-local seed-messages/*.json.",
844
+ );
845
+ }
846
+
847
+ if (!hasGetRequestConfigExport(requestContent)) {
848
+ addIssue(
849
+ relativePath(requestPath),
850
+ "seed-i18n-request-contract",
851
+ "src/i18n/request.ts must default-export a next-intl getRequestConfig(...) result.",
852
+ );
853
+ }
854
+
855
+ const appMessageBindings = [...maskedRequest.matchAll(
856
+ /import\s+([A-Za-z_$][\w$]*)\s+from\s+["'][^"']*messages\/[^"']+\.json["']/g,
857
+ )].map((match) => match[1]);
838
858
 
839
- const appMessageBindings = [...requestContent.matchAll(
840
- /import\s+([A-Za-z_$][\w$]*)\s+from\s+["'][^"']*messages\/[^"']+\.json["']/g,
841
- )].map((match) => match[1]);
859
+ if (appMessageBindings.length === 0) {
860
+ addIssue(
861
+ relativePath(requestPath),
862
+ "seed-i18n-request-contract",
863
+ "src/i18n/request.ts must import app-owned locale catalogs from messages/<locale>.json.",
864
+ );
865
+ } else {
866
+ const unreferencedAppMessages = appMessageBindings.filter((binding) => {
867
+ return !new RegExp(`\\b${escapeRegExp(binding)}\\b`).test(requestCodeWithoutImports);
868
+ });
842
869
 
843
- if (appMessageBindings.length === 0) {
870
+ if (unreferencedAppMessages.length > 0) {
844
871
  addIssue(
845
872
  relativePath(requestPath),
846
873
  "seed-i18n-request-contract",
847
- "src/i18n/request.ts must import app-owned locale catalogs from messages/<locale>.json.",
874
+ `src/i18n/request.ts must wire every imported app-owned locale catalog into the Seed message merge path. Unused imports: ${unreferencedAppMessages.join(", ")}.`,
848
875
  );
849
- } else {
850
- const unreferencedAppMessages = appMessageBindings.filter((binding) => {
851
- return !new RegExp(`\\b${escapeRegExp(binding)}\\b`).test(requestCodeWithoutImports);
852
- });
853
-
854
- if (unreferencedAppMessages.length > 0) {
855
- addIssue(
856
- relativePath(requestPath),
857
- "seed-i18n-request-contract",
858
- `src/i18n/request.ts must wire every imported app-owned locale catalog into the Seed message merge path. Unused imports: ${unreferencedAppMessages.join(", ")}.`,
859
- );
860
- }
861
876
  }
862
877
  }
863
878
 
@@ -887,12 +902,16 @@ function checkDelegatorScripts() {
887
902
  "seed-ds-check-missing",
888
903
  "scripts/ds-check.mjs must exist.",
889
904
  );
890
- ensureFileContains(
891
- dsCheckPath,
892
- "@vadimcomanescu/nadicode-design-system/ds-check",
893
- "seed-ds-check-contract",
894
- "scripts/ds-check.mjs must delegate to @vadimcomanescu/nadicode-design-system/ds-check.",
895
- );
905
+ if (dsCheckPath) {
906
+ const dsCheckContent = readFileSync(dsCheckPath, "utf8");
907
+ if (!hasImportFrom(dsCheckContent, "@vadimcomanescu/nadicode-design-system/ds-check")) {
908
+ addIssue(
909
+ relativePath(dsCheckPath),
910
+ "seed-ds-check-contract",
911
+ "scripts/ds-check.mjs must delegate to @vadimcomanescu/nadicode-design-system/ds-check.",
912
+ );
913
+ }
914
+ }
896
915
 
897
916
  const dsUpdatePath = expectFile(
898
917
  [join(root, "scripts", "ds-update.mjs")],
@@ -900,12 +919,14 @@ function checkDelegatorScripts() {
900
919
  "scripts/ds-update.mjs must exist.",
901
920
  );
902
921
  if (dsUpdatePath) {
903
- ensureFileContains(
904
- dsUpdatePath,
905
- "@vadimcomanescu/nadicode-design-system/ds-update",
906
- "seed-ds-update-contract",
907
- "scripts/ds-update.mjs must delegate to @vadimcomanescu/nadicode-design-system/ds-update so the package owns the install-and-skill-sync flow.",
908
- );
922
+ const dsUpdateContent = readFileSync(dsUpdatePath, "utf8");
923
+ if (!hasImportFrom(dsUpdateContent, "@vadimcomanescu/nadicode-design-system/ds-update")) {
924
+ addIssue(
925
+ relativePath(dsUpdatePath),
926
+ "seed-ds-update-contract",
927
+ "scripts/ds-update.mjs must delegate to @vadimcomanescu/nadicode-design-system/ds-update so the package owns the install-and-skill-sync flow.",
928
+ );
929
+ }
909
930
  }
910
931
  }
911
932
 
@@ -1,107 +0,0 @@
1
- import { WrenchIcon } from './chunk-AWIJHDNK.js';
2
- import { LoaderCircleIcon } from './chunk-BRP6D56U.js';
3
- import { CheckIcon } from './chunk-CXACRCZ4.js';
4
- import { XIcon } from './chunk-UIUMTURU.js';
5
- import { ChevronDownIcon } from './chunk-HJBXUXTD.js';
6
- import { cn } from './chunk-QYZT24TS.js';
7
- import * as React from 'react';
8
- import { cva } from 'class-variance-authority';
9
- import { jsxs, jsx } from 'react/jsx-runtime';
10
-
11
- var toolCallCardVariants = cva(
12
- "rounded-lg border p-4 glass-panel transition-colors",
13
- {
14
- variants: {
15
- status: {
16
- pending: "border-border",
17
- running: "border-accent/40",
18
- complete: "border-success/40",
19
- error: "border-destructive/40"
20
- }
21
- },
22
- defaultVariants: {
23
- status: "pending"
24
- }
25
- }
26
- );
27
- var StatusIcon = ({ status }) => {
28
- switch (status) {
29
- case "complete":
30
- return /* @__PURE__ */ jsx(CheckIcon, { size: 16, className: "text-success" });
31
- case "error":
32
- return /* @__PURE__ */ jsx(XIcon, { size: 16, className: "text-destructive" });
33
- case "running":
34
- return /* @__PURE__ */ jsx(LoaderCircleIcon, { size: 16, className: "text-accent animate-spin" });
35
- default:
36
- return /* @__PURE__ */ jsx(WrenchIcon, { size: 16, className: "text-text-tertiary" });
37
- }
38
- };
39
- function ToolCallCard({
40
- className,
41
- status,
42
- toolName,
43
- args,
44
- result,
45
- duration,
46
- defaultExpanded = false,
47
- ref,
48
- ...props
49
- }) {
50
- const [expanded, setExpanded] = React.useState(defaultExpanded);
51
- const resultPanelId = React.useId();
52
- return /* @__PURE__ */ jsxs(
53
- "div",
54
- {
55
- ref,
56
- className: cn(toolCallCardVariants({ status }), className),
57
- ...props,
58
- children: [
59
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
60
- /* @__PURE__ */ jsx(StatusIcon, { status }),
61
- /* @__PURE__ */ jsx("code", { className: "text-sm font-semibold text-text-primary", children: toolName }),
62
- duration != null && /* @__PURE__ */ jsxs("span", { className: "ml-auto text-xs text-text-tertiary", children: [
63
- duration,
64
- "ms"
65
- ] })
66
- ] }),
67
- args && Object.keys(args).length > 0 && /* @__PURE__ */ jsx("pre", { className: "mt-2 rounded bg-surface p-2 text-xs text-text-secondary overflow-x-auto", children: JSON.stringify(args, null, 2) }),
68
- !!result && /* @__PURE__ */ jsxs("div", { className: "mt-2", children: [
69
- /* @__PURE__ */ jsxs(
70
- "button",
71
- {
72
- type: "button",
73
- onClick: () => setExpanded(!expanded),
74
- "aria-expanded": expanded,
75
- "aria-controls": resultPanelId,
76
- 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",
77
- children: [
78
- /* @__PURE__ */ jsx(
79
- ChevronDownIcon,
80
- {
81
- size: 14,
82
- className: cn("transition-transform", expanded && "rotate-180")
83
- }
84
- ),
85
- expanded ? "Hide result" : "Show result"
86
- ]
87
- }
88
- ),
89
- /* @__PURE__ */ jsx(
90
- "pre",
91
- {
92
- id: resultPanelId,
93
- className: cn(
94
- "mt-1.5 rounded bg-surface p-2 text-xs text-text-secondary overflow-x-auto whitespace-pre-wrap",
95
- !expanded && "hidden"
96
- ),
97
- "aria-hidden": !expanded,
98
- children: result
99
- }
100
- )
101
- ] })
102
- ]
103
- }
104
- );
105
- }
106
-
107
- export { ToolCallCard, toolCallCardVariants };