velloo 0.5.0 → 0.7.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 (161) hide show
  1. package/README.md +116 -227
  2. package/THIRD-PARTY-NOTICES.md +3 -3
  3. package/canvas/assets/index-BQ5710lu.js +29 -0
  4. package/canvas/assets/index-GNLd0pCG.css +2 -0
  5. package/canvas/assets/lucide-all-DIRZdJPK.js +1 -0
  6. package/canvas/index.html +2 -2
  7. package/{chunk-qpv28z8d.js → chunk-0e5j6nqs.js} +1 -1
  8. package/{chunk-vrvkvb0v.js → chunk-0pxm5v0b.js} +3 -3
  9. package/{chunk-a16mz9zf.js → chunk-0vaff40g.js} +1 -1
  10. package/{chunk-42bj6r30.js → chunk-3m28pvzr.js} +1 -1
  11. package/{chunk-33t0csxs.js → chunk-4y2xy1kf.js} +2 -2
  12. package/{chunk-d4r0myxr.js → chunk-531xzfq5.js} +1 -1
  13. package/{chunk-1h3gqy7w.js → chunk-5s1wjhtj.js} +1 -1
  14. package/{chunk-4pkw6d9n.js → chunk-5x4nw0zz.js} +5 -5
  15. package/{chunk-b3x80jc1.js → chunk-5yhnnhkd.js} +1 -1
  16. package/{chunk-675tr675.js → chunk-64pex3mw.js} +1 -1
  17. package/chunk-667ag8ts.js +2 -0
  18. package/chunk-7gyzh0vq.js +5 -0
  19. package/{chunk-4sjvdakg.js → chunk-82x2jkfq.js} +1 -1
  20. package/{chunk-5y9hem1j.js → chunk-84n18xgx.js} +257 -3
  21. package/{chunk-edgwx026.js → chunk-abr2hgay.js} +1 -1
  22. package/{chunk-cqt1dpxd.js → chunk-acsv6m3n.js} +1 -1
  23. package/{chunk-j7tzbt3d.js → chunk-asfgvzse.js} +1 -1
  24. package/{chunk-0wqxb8r9.js → chunk-b8vcbbrg.js} +1 -1
  25. package/chunk-bms1sg4c.js +2 -0
  26. package/chunk-brnkprt5.js +723 -0
  27. package/{chunk-afe25dpr.js → chunk-bys7pqdb.js} +1 -1
  28. package/chunk-d0j8dg1e.js +3 -0
  29. package/chunk-d93kpv7s.js +12 -0
  30. package/chunk-dvh0b2r4.js +3 -0
  31. package/{chunk-5ma8zbty.js → chunk-eh2xp4v6.js} +1 -1
  32. package/{chunk-z78c1kf8.js → chunk-ejppcfa5.js} +1 -1
  33. package/{chunk-ngbqd7kb.js → chunk-ex36z3b3.js} +317 -119
  34. package/{chunk-6ytv1v2r.js → chunk-fmcm06xb.js} +1 -1
  35. package/{chunk-3ffs39e8.js → chunk-fvezyap4.js} +1 -1
  36. package/chunk-g7d065ek.js +2 -0
  37. package/{chunk-tw4kw4ps.js → chunk-g8xrwjvq.js} +2 -2
  38. package/{chunk-df557bn4.js → chunk-gbq5wv7x.js} +1 -1
  39. package/chunk-gcce587w.js +3 -0
  40. package/{chunk-cdqah1hy.js → chunk-gfppsgvv.js} +1 -1
  41. package/{chunk-5f0xv80x.js → chunk-j306gr0c.js} +1 -1
  42. package/chunk-j4fn2a2b.js +2 -0
  43. package/chunk-jbgde2v9.js +2 -0
  44. package/{chunk-wkqrb2tz.js → chunk-kkvf0xk2.js} +1 -1
  45. package/{chunk-d9kx7v12.js → chunk-md4mpvqc.js} +1 -1
  46. package/{chunk-vryadew3.js → chunk-mdgwdqnq.js} +2 -2
  47. package/chunk-p93x4pn2.js +3 -0
  48. package/chunk-pjkkp7xa.js +2 -0
  49. package/chunk-qp3wahg4.js +2 -0
  50. package/{chunk-f45p6kcb.js → chunk-qqrac4va.js} +1 -1
  51. package/chunk-qrnkrkkt.js +2 -0
  52. package/chunk-rqd4swxx.js +2 -0
  53. package/{chunk-xzkczmgg.js → chunk-rxkvjyst.js} +1 -1
  54. package/chunk-s84vxcdv.js +4 -0
  55. package/chunk-sjjnm4a1.js +2 -0
  56. package/chunk-skk6yvnw.js +3 -0
  57. package/{chunk-ahm4zd56.js → chunk-sme6hv6f.js} +1 -1
  58. package/chunk-snak5zpr.js +5 -0
  59. package/{chunk-gn9wcc1b.js → chunk-srp5gyr1.js} +1 -1
  60. package/{chunk-rd65xm6r.js → chunk-vdbr81a3.js} +1 -1
  61. package/chunk-vs8j3x6t.js +3 -0
  62. package/{chunk-hr3gbak5.js → chunk-xg71h7nb.js} +1 -1
  63. package/chunk-xzf52wvn.js +6 -0
  64. package/chunk-ykpctq15.js +6 -0
  65. package/chunk-zv17t1n7.js +3 -0
  66. package/cli.js +1 -1
  67. package/launcher.cjs +3 -1
  68. package/package.json +1 -1
  69. package/pkgs/helpers/src/box.tsx +12 -6
  70. package/pkgs/helpers/src/descriptors.ts +7 -0
  71. package/pkgs/helpers/src/icon.tsx +5 -3
  72. package/pkgs/helpers/src/index.ts +9 -6
  73. package/pkgs/helpers/src/lowering.ts +0 -24
  74. package/pkgs/helpers/src/primitive-classes.tsx +43 -0
  75. package/pkgs/helpers/src/text.tsx +29 -5
  76. package/pkgs/provider-antd/src/intro.ts +3 -3
  77. package/pkgs/provider-antd/src/manifest.ts +479 -57
  78. package/pkgs/provider-antd/src/registry.ts +8 -5
  79. package/pkgs/provider-antd/src/render-pass.ts +10 -4
  80. package/pkgs/provider-antd/src/reset-css.d.ts +5 -0
  81. package/pkgs/provider-antd/src/theme.ts +54 -11
  82. package/pkgs/provider-chakra/src/manifest.ts +6 -1
  83. package/pkgs/provider-mui/src/index.ts +4 -2
  84. package/pkgs/provider-mui/src/manifest.ts +11 -1
  85. package/pkgs/provider-mui/src/render-pass.ts +15 -1
  86. package/pkgs/provider-mui/src/theme.ts +10 -4
  87. package/pkgs/provider-none/src/components-inline.tsx +20 -14
  88. package/pkgs/provider-none/src/components.tsx +17 -54
  89. package/pkgs/provider-none/src/manifest.ts +1 -0
  90. package/pkgs/schema/src/annotation.ts +6 -3
  91. package/pkgs/schema/src/comment.ts +10 -1
  92. package/pkgs/schema/src/config.ts +4 -1
  93. package/pkgs/schema/src/index.ts +16 -1
  94. package/pkgs/schema/src/node-identity.ts +97 -0
  95. package/pkgs/schema/src/node.ts +49 -23
  96. package/pkgs/schema/src/snippet-resolve.ts +18 -12
  97. package/pkgs/schema/src/svg-sanitize.ts +3 -0
  98. package/pkgs/schema/src/theme.ts +6 -1
  99. package/pkgs/schema/src/typeset.ts +45 -21
  100. package/pkgs/shadcn-snapshot/dist/manifest.json +7 -0
  101. package/pkgs/shadcn-snapshot/src/components/ui/alert.tsx +2 -4
  102. package/pkgs/shadcn-snapshot/src/components/ui/aspect-ratio.tsx +2 -3
  103. package/pkgs/shadcn-snapshot/src/components/ui/attachment.tsx +3 -4
  104. package/pkgs/shadcn-snapshot/src/components/ui/avatar.tsx +2 -4
  105. package/pkgs/shadcn-snapshot/src/components/ui/badge.tsx +2 -4
  106. package/pkgs/shadcn-snapshot/src/components/ui/breadcrumb.tsx +2 -4
  107. package/pkgs/shadcn-snapshot/src/components/ui/bubble.tsx +2 -4
  108. package/pkgs/shadcn-snapshot/src/components/ui/button-group.tsx +3 -4
  109. package/pkgs/shadcn-snapshot/src/components/ui/button.tsx +2 -4
  110. package/pkgs/shadcn-snapshot/src/components/ui/card.tsx +2 -4
  111. package/pkgs/shadcn-snapshot/src/components/ui/carousel.tsx +3 -4
  112. package/pkgs/shadcn-snapshot/src/components/ui/chart.tsx +1 -1
  113. package/pkgs/shadcn-snapshot/src/components/ui/direction.tsx +2 -3
  114. package/pkgs/shadcn-snapshot/src/components/ui/empty.tsx +2 -4
  115. package/pkgs/shadcn-snapshot/src/components/ui/field.tsx +3 -4
  116. package/pkgs/shadcn-snapshot/src/components/ui/input-group.tsx +3 -4
  117. package/pkgs/shadcn-snapshot/src/components/ui/item.tsx +3 -4
  118. package/pkgs/shadcn-snapshot/src/components/ui/kbd.tsx +2 -3
  119. package/pkgs/shadcn-snapshot/src/components/ui/label.tsx +2 -4
  120. package/pkgs/shadcn-snapshot/src/components/ui/marker.tsx +2 -4
  121. package/pkgs/shadcn-snapshot/src/components/ui/message.tsx +2 -4
  122. package/pkgs/shadcn-snapshot/src/components/ui/native-select.tsx +2 -4
  123. package/pkgs/shadcn-snapshot/src/components/ui/navigation-menu.tsx +2 -4
  124. package/pkgs/shadcn-snapshot/src/components/ui/pagination.tsx +3 -4
  125. package/pkgs/shadcn-snapshot/src/components/ui/progress.tsx +2 -4
  126. package/pkgs/shadcn-snapshot/src/components/ui/radio-group.tsx +2 -4
  127. package/pkgs/shadcn-snapshot/src/components/ui/scroll-area.tsx +2 -4
  128. package/pkgs/shadcn-snapshot/src/components/ui/separator.tsx +2 -4
  129. package/pkgs/shadcn-snapshot/src/components/ui/skeleton.tsx +2 -3
  130. package/pkgs/shadcn-snapshot/src/components/ui/spinner.tsx +2 -3
  131. package/pkgs/shadcn-snapshot/src/components/ui/table.tsx +2 -4
  132. package/pkgs/shadcn-snapshot/src/components/ui/tabs.tsx +2 -4
  133. package/pkgs/shadcn-snapshot/src/components/ui/toggle.tsx +2 -4
  134. package/pkgs/shadcn-snapshot/src/shadcn-tailwind.css +1 -1
  135. package/pkgs/shadcn-snapshot/src/tailwind-entry.css +1 -1
  136. package/canvas/assets/index-BDBBHdHH.css +0 -2
  137. package/canvas/assets/index-QdsLJNY9.js +0 -29
  138. package/canvas/assets/lucide-all-R8DUyY-B.js +0 -1
  139. package/chunk-0rdf6trc.js +0 -2
  140. package/chunk-0wafc9aw.js +0 -4
  141. package/chunk-10hap8kc.js +0 -6
  142. package/chunk-18eqh3s1.js +0 -2
  143. package/chunk-19xyzep8.js +0 -2
  144. package/chunk-49w26e94.js +0 -5
  145. package/chunk-66qgm91k.js +0 -708
  146. package/chunk-6cgvzwec.js +0 -3
  147. package/chunk-75sc3adm.js +0 -2
  148. package/chunk-7cexzg71.js +0 -2
  149. package/chunk-98rann8t.js +0 -2
  150. package/chunk-asvdqkdp.js +0 -6
  151. package/chunk-emv1j50t.js +0 -2
  152. package/chunk-ewgdcgrk.js +0 -2
  153. package/chunk-mm8wv3bg.js +0 -3
  154. package/chunk-nkqtnwzz.js +0 -2
  155. package/chunk-q3kf8243.js +0 -3
  156. package/chunk-ryga3ny1.js +0 -3
  157. package/chunk-sb5h27w9.js +0 -3
  158. package/chunk-vgx47anc.js +0 -3
  159. package/chunk-w6f40y2x.js +0 -11
  160. package/chunk-we8hvy6e.js +0 -2
  161. package/chunk-ycrddh47.js +0 -5
@@ -27,11 +27,13 @@ function lookup(name: string): IconNode | undefined {
27
27
  return viaPascal === undefined ? undefined : ICON_NODES[viaPascal];
28
28
  }
29
29
 
30
- const FALLBACK = lookup("HelpCircle");
31
-
32
30
  export function Icon({ name, className, size = 16, strokeWidth = 2, ...props }: IconProps) {
33
31
  const hit = lookup(name);
34
- const node = hit ?? FALLBACK;
32
+ // Looked up here, not once at module level: a call at the top of this file
33
+ // is a side effect to a bundler, which then keeps the module — and the 0.6 MB
34
+ // of icon data behind it — in every bundle that imports anything at all from
35
+ // the helpers index, `Icon` on the screen or not.
36
+ const node = hit ?? lookup("HelpCircle");
35
37
  if (!node) return null;
36
38
  const tint = hit ? className : cn("text-[var(--color-fg-muted)]", className);
37
39
  return (
@@ -1,4 +1,4 @@
1
- export { Box } from "./box.tsx";
1
+ export { Box, ELEMENT_TAG } from "./box.tsx";
2
2
  export { cn, mergeTailwind } from "./cn.ts";
3
3
  export { HELPER_DESCRIPTORS, helperDescriptors } from "./descriptors.ts";
4
4
  export { Divider, type DividerProps } from "./divider.tsx";
@@ -15,15 +15,18 @@ export {
15
15
  } from "./icon-data.ts";
16
16
  export { Image, type ImageProps } from "./image.tsx";
17
17
  export { Layer, type LayerProps } from "./layer.tsx";
18
+ export { PLACEHOLDER_ASPECT_CLASS, PLACEHOLDER_AVATAR_SIZE_CLASS } from "./lowering.ts";
19
+ export { Placeholder, type PlaceholderProps } from "./placeholder.tsx";
18
20
  export {
21
+ BUTTON_BASE_CLASS,
22
+ BUTTON_VARIANT_CLASS,
23
+ CARD_CLASS,
19
24
  CONTAINER_WIDTH_CLASS,
20
- PLACEHOLDER_ASPECT_CLASS,
21
- PLACEHOLDER_AVATAR_SIZE_CLASS,
25
+ INPUT_CLASS,
22
26
  STACK_ALIGN_CLASS,
23
27
  STACK_JUSTIFY_CLASS,
24
- } from "./lowering.ts";
25
- export { Placeholder, type PlaceholderProps } from "./placeholder.tsx";
28
+ } from "./primitive-classes.tsx";
26
29
  export { Prose, type ProseProps } from "./prose.tsx";
27
30
  export { helpersRegistry } from "./registry.ts";
28
31
  export { SVG, type SVGProps } from "./svg.tsx";
29
- export { Text, type TextProps } from "./text.tsx";
32
+ export { Text, type TextProps, TextRunContext, textTag } from "./text.tsx";
@@ -27,27 +27,3 @@ export const PLACEHOLDER_AVATAR_SIZE_CLASS: Record<string, string> = {
27
27
  lg: "size-14 text-base",
28
28
  xl: "size-20 text-lg",
29
29
  };
30
-
31
- // Keep in sync with packages/provider-none/src/components.tsx (Stack/Container
32
- // live there, not here — these tables ride along so codegen has one home for
33
- // every lowered-primitive class map).
34
- export const STACK_ALIGN_CLASS: Record<string, string> = {
35
- start: "items-start",
36
- center: "items-center",
37
- end: "items-end",
38
- stretch: "items-stretch",
39
- };
40
- export const STACK_JUSTIFY_CLASS: Record<string, string> = {
41
- start: "justify-start",
42
- center: "justify-center",
43
- end: "justify-end",
44
- between: "justify-between",
45
- around: "justify-around",
46
- };
47
- export const CONTAINER_WIDTH_CLASS: Record<string, string> = {
48
- sm: "max-w-screen-sm",
49
- md: "max-w-screen-md",
50
- lg: "max-w-screen-lg",
51
- xl: "max-w-screen-xl",
52
- full: "max-w-full",
53
- };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The class tables the no-library primitives (`@velloo/provider-none`'s
3
+ * Stack, Container, Card, Button, Input) apply, shared with codegen's
4
+ * lowering of the same primitives so the emitted classes are the rendered
5
+ * ones by construction.
6
+ *
7
+ * A `.tsx` module although it holds no JSX: the server's Tailwind JIT scans
8
+ * only `.tsx` files for class candidates, and these literals are the only
9
+ * place the utilities appear once the components import them.
10
+ */
11
+
12
+ export const STACK_ALIGN_CLASS: Record<string, string> = {
13
+ start: "items-start",
14
+ center: "items-center",
15
+ end: "items-end",
16
+ stretch: "items-stretch",
17
+ };
18
+ export const STACK_JUSTIFY_CLASS: Record<string, string> = {
19
+ start: "justify-start",
20
+ center: "justify-center",
21
+ end: "justify-end",
22
+ between: "justify-between",
23
+ around: "justify-around",
24
+ };
25
+ export const CONTAINER_WIDTH_CLASS: Record<string, string> = {
26
+ sm: "max-w-screen-sm",
27
+ md: "max-w-screen-md",
28
+ lg: "max-w-screen-lg",
29
+ xl: "max-w-screen-xl",
30
+ full: "max-w-full",
31
+ };
32
+
33
+ export const CARD_CLASS =
34
+ "rounded-lg border border-border bg-card p-6 text-card-foreground shadow-sm";
35
+ export const BUTTON_BASE_CLASS =
36
+ "inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium focus-visible:outline-2 focus-visible:outline-offset-2";
37
+ export const BUTTON_VARIANT_CLASS: Record<string, string> = {
38
+ default: "bg-foreground text-background hover:bg-foreground/90",
39
+ ghost: "bg-transparent text-foreground hover:bg-muted",
40
+ outline: "bg-transparent text-foreground border border-border hover:bg-muted",
41
+ };
42
+ export const INPUT_CLASS =
43
+ "block w-full rounded-md border border-input bg-background px-3 py-2 text-sm placeholder:text-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2";
@@ -3,14 +3,38 @@ import { textClasses } from "@velloo/schema/typeset";
3
3
  import * as React from "react";
4
4
  import { cn } from "./cn.ts";
5
5
 
6
- export interface TextProps extends React.HTMLAttributes<HTMLParagraphElement> {
6
+ export interface TextProps extends React.HTMLAttributes<HTMLElement> {
7
7
  /** Visual weight. Selects a rung of the theme's type ladder plus a tone. */
8
8
  variant?: "default" | "muted" | "small" | "lead";
9
9
  }
10
10
 
11
- export const Text = React.forwardRef<HTMLParagraphElement, TextProps>(
12
- ({ variant = "default", className, ...props }, ref) => (
13
- <p ref={ref} className={cn(textClasses(variant), className)} {...props} />
14
- ),
11
+ /**
12
+ * True beneath a `Text`. A paragraph cannot hold a paragraph: an HTML parser
13
+ * ends the outer `<p>` where the inner one starts, so markup that is rendered
14
+ * on the server and parsed again (a screenshot, a comparison) lays the inner
15
+ * text out as a sibling, while the same tree mounted on the client keeps it
16
+ * nested. A `Text` inside a `Text` is a run of that paragraph, so it renders
17
+ * the element a run is — and every path draws the same line.
18
+ */
19
+ export const TextRunContext = React.createContext(false);
20
+
21
+ /** The element a `Text` renders: a paragraph, or a run inside one. */
22
+ export function textTag(run: boolean): "p" | "span" {
23
+ return run ? "span" : "p";
24
+ }
25
+
26
+ export const Text = React.forwardRef<HTMLElement, TextProps>(
27
+ ({ variant, className, ...props }, ref) => {
28
+ const run = React.useContext(TextRunContext);
29
+ return (
30
+ <TextRunContext.Provider value={true}>
31
+ {React.createElement(textTag(run), {
32
+ ref,
33
+ className: cn(textClasses(variant, run), className) || undefined,
34
+ ...props,
35
+ })}
36
+ </TextRunContext.Provider>
37
+ );
38
+ },
15
39
  );
16
40
  Text.displayName = "Text";
@@ -5,10 +5,10 @@
5
5
  * and the style channel positively rather than correcting a shadcn claim.
6
6
  */
7
7
  export const ANTD_INTRO: readonly string[] = [
8
- "**This folder targets Ant Design v5.** Components are real antd: `Flex`/`Space`/`Row`+`Col` for layout, `Card`, `TypographyTitle`/`TypographyText`/`TypographyParagraph` (ALL text — these are antd's `Typography.Title/Text/Paragraph` under flat ids), `Button`, `Input`/`Select`/`Checkbox`/`Radio`/`Switch`/`Segmented`/`Slider`/`Rate`, `Tag`/`Badge`/`Avatar`/`Alert`/`Statistic`/`Progress`/`Skeleton`/`Empty`, `Table`/`List`+`ListItem`/`Tabs`/`Steps`/`Breadcrumb`/`Pagination`/`Menu` (data components take `items`/`columns` arrays — no render functions), and the overlay surface `Modal`/`Drawer`/`Popover`/`Tooltip`/`Dropdown` (rendered open + inline in design mode). Call `list_components` for the full set and per-component `example` props.",
8
+ "**This folder targets Ant Design v5.** Components are real antd: `Flex`/`Space`/`Row`+`Col` for layout, `Card`, `TypographyTitle`/`TypographyText`/`TypographyParagraph` (ALL text — antd's `Typography.Title/Text/Paragraph`, which compose under flat ids because a `$ref` can't carry a dot, and emit as the dotted exports), `Button`, `Input`/`Select`/`Checkbox`/`Radio`/`Switch`/`Segmented`/`Slider`/`Rate`, `Tag`/`Badge`/`Avatar`/`Alert`/`Statistic`/`Progress`/`Skeleton`/`Empty`, `Table`/`List`+`ListItem`/`Tabs`/`Steps`/`Breadcrumb`/`Pagination`/`Menu` (data components take `items`/`columns` arrays — no render functions), and the overlay surface `Modal`/`Drawer`/`Popover`/`Tooltip`/`Dropdown` (rendered open + inline in design mode). Call `list_components` for the full set and per-component `example` props.",
9
9
  "",
10
- '**Style through the inline `style` object.** `update_props { style: { display: "flex", alignItems: "center", gap: "16px", padding: "24px" } }` — a plain React style object (merges shallowly; an inner `null` drops a key, `style: null` clears). The theme runs in antd\'s `cssVar` mode, so antd tokens are CSS variables: inside any antd component subtree you can reference `var(--ant-color-primary)`, `var(--ant-color-text-secondary)`, `var(--ant-color-bg-container)`, `var(--ant-border-radius)` etc. to stay themable; plain CSS values always work. Prefer component props (`type`, `size`, `gap`) over style overrides where they exist.',
10
+ '**Style through the inline `style` object.** `update_props { style: { display: "flex", alignItems: "center", gap: "16px", padding: "24px" } }` — a plain React style object (merges shallowly; an inner `null` drops a key, `style: null` clears). The theme runs in antd\'s `cssVar` mode, so antd tokens are CSS variables: inside any antd component subtree you can reference `var(--ant-color-primary)`, `var(--ant-color-text-secondary)`, `var(--ant-color-bg-container)`, `var(--ant-border-radius)` etc. to stay themable; plain CSS values always work. Prefer component props (`type`, `size`, `gap`) over style overrides where they exist. A plain `<div>`/`<span>` composes as `Box` and emits as the bare element.',
11
11
  "",
12
- '`emit_code` emits idiomatic antd JSX with `style={{…}}` — components import from `"antd"`. The flat typography/list ids map to dotted antd exports: destructure them when writing real code (`const { Title: TypographyTitle, Text: TypographyText, Paragraph: TypographyParagraph } = Typography;` and `const ListItem = List.Item; const ListItemMeta = List.Item.Meta;`) or rename the JSX tags to the dotted form. `emit_theme` emits a ConfigProvider `ThemeConfig` module (default `antd-theme.ts`) — wire it with `<ConfigProvider theme={theme}>`. Tailwind utility diagnostics do not apply here.',
12
+ "`emit_code` emits idiomatic antd JSX with `style={{…}}`, already written against the real exports — `<Typography.Title>`, `<List.Item.Meta>` — and `packagesToImport` names the package they come from. `emit_theme` emits a ConfigProvider `ThemeConfig` module (default `antd-theme.ts`) — wire it with `<ConfigProvider theme={theme}>`. Tailwind utility diagnostics do not apply here.",
13
13
  "",
14
14
  ];