@hanzo/ui 5.0.2 → 5.1.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 (371) hide show
  1. package/dist/accordion.js +1 -0
  2. package/dist/accordion.mjs +1 -0
  3. package/dist/alert-dialog.js +1 -0
  4. package/dist/alert-dialog.mjs +1 -0
  5. package/dist/alert.js +1 -0
  6. package/dist/alert.mjs +1 -0
  7. package/dist/avatar.js +1 -0
  8. package/dist/avatar.mjs +1 -0
  9. package/dist/badge.js +1 -0
  10. package/dist/badge.mjs +1 -0
  11. package/dist/breadcrumb.js +1 -0
  12. package/dist/breadcrumb.mjs +1 -0
  13. package/dist/calendar.js +1 -0
  14. package/dist/calendar.mjs +1 -0
  15. package/dist/carousel.js +1 -0
  16. package/dist/carousel.mjs +1 -0
  17. package/dist/checkbox.js +1 -0
  18. package/dist/checkbox.mjs +1 -0
  19. package/dist/chunk-3H5S2OQ3.mjs +1 -0
  20. package/dist/chunk-5GRJ7UQX.js +1 -0
  21. package/dist/chunk-63HNMH7C.js +1 -0
  22. package/dist/chunk-72TOQ4DM.mjs +1 -0
  23. package/dist/chunk-7AEFTV5R.mjs +1 -0
  24. package/dist/chunk-7M4AVV2R.js +1 -0
  25. package/dist/chunk-DKPVJSBC.js +1 -0
  26. package/dist/chunk-EI7MMDWY.js +1 -0
  27. package/dist/chunk-GANGDIZG.mjs +1 -0
  28. package/dist/chunk-GRGT2Z4K.js +1 -0
  29. package/dist/chunk-JCUUC6NY.mjs +1 -0
  30. package/dist/chunk-JUQMWLIN.js +1 -0
  31. package/dist/chunk-PRVEIITE.js +1 -0
  32. package/dist/chunk-SH52AKNZ.js +1 -0
  33. package/dist/chunk-TU67EJEW.mjs +1 -0
  34. package/dist/chunk-WN5KN73U.mjs +1 -0
  35. package/dist/chunk-YSXGDEY5.mjs +1 -0
  36. package/dist/chunk-Z76OOVUE.mjs +1 -0
  37. package/dist/collapsible.js +1 -0
  38. package/dist/collapsible.mjs +1 -0
  39. package/dist/command.js +1 -0
  40. package/dist/command.mjs +1 -0
  41. package/dist/context-menu.js +1 -0
  42. package/dist/context-menu.mjs +1 -0
  43. package/dist/dialog.js +1 -0
  44. package/dist/dialog.mjs +1 -0
  45. package/dist/drawer.js +1 -0
  46. package/dist/drawer.mjs +1 -0
  47. package/dist/dropdown-menu.js +1 -0
  48. package/dist/dropdown-menu.mjs +1 -0
  49. package/dist/form.js +1 -0
  50. package/dist/form.mjs +1 -0
  51. package/dist/hover-card.js +1 -0
  52. package/dist/hover-card.mjs +1 -0
  53. package/dist/index.js +1 -9079
  54. package/dist/index.mjs +1 -8700
  55. package/dist/input-otp.js +1 -0
  56. package/dist/input-otp.mjs +1 -0
  57. package/dist/lib/utils.js +1 -0
  58. package/dist/lib/utils.mjs +1 -0
  59. package/dist/navigation-menu.js +1 -0
  60. package/dist/navigation-menu.mjs +1 -0
  61. package/dist/popover.js +1 -0
  62. package/dist/popover.mjs +1 -0
  63. package/dist/progress.js +1 -0
  64. package/dist/progress.mjs +1 -0
  65. package/dist/radio-group.js +1 -0
  66. package/dist/radio-group.mjs +1 -0
  67. package/dist/resizable.js +1 -0
  68. package/dist/resizable.mjs +1 -0
  69. package/dist/scroll-area.js +1 -0
  70. package/dist/scroll-area.mjs +1 -0
  71. package/dist/select.js +1 -0
  72. package/dist/select.mjs +1 -0
  73. package/dist/separator.js +1 -0
  74. package/dist/separator.mjs +1 -0
  75. package/dist/sheet.js +1 -0
  76. package/dist/sheet.mjs +1 -0
  77. package/dist/skeleton.js +1 -0
  78. package/dist/skeleton.mjs +1 -0
  79. package/dist/slider.js +1 -0
  80. package/dist/slider.mjs +1 -0
  81. package/dist/sonner.js +1 -0
  82. package/dist/sonner.mjs +1 -0
  83. package/dist/src/utils.js +1 -0
  84. package/dist/src/utils.mjs +1 -0
  85. package/dist/switch.js +1 -0
  86. package/dist/switch.mjs +1 -0
  87. package/dist/table.js +1 -0
  88. package/dist/table.mjs +1 -0
  89. package/dist/tabs.js +1 -0
  90. package/dist/tabs.mjs +1 -0
  91. package/dist/tailwind/index.js +1 -0
  92. package/dist/tailwind/index.mjs +1 -0
  93. package/dist/textarea.js +1 -0
  94. package/dist/textarea.mjs +1 -0
  95. package/dist/toggle-group.js +1 -0
  96. package/dist/toggle-group.mjs +1 -0
  97. package/dist/toggle.js +1 -0
  98. package/dist/toggle.mjs +1 -0
  99. package/dist/tooltip.js +1 -0
  100. package/dist/tooltip.mjs +1 -0
  101. package/dist/types/index.js +1 -0
  102. package/dist/types/index.mjs +1 -0
  103. package/package.json +110 -81
  104. package/assets/ai-icons.tsx +0 -207
  105. package/assets/crypto.tsx +0 -33
  106. package/assets/file-type-icon.tsx +0 -66
  107. package/assets/file.tsx +0 -45
  108. package/assets/general.tsx +0 -2318
  109. package/assets/hanzo-logo.svg +0 -9
  110. package/assets/hanzo-logo.tsx +0 -17
  111. package/assets/index.ts +0 -122
  112. package/assets/index.tsx +0 -4
  113. package/assets/llm-provider.tsx +0 -1094
  114. package/blocks/auth/index.ts +0 -6
  115. package/blocks/auth/login-2fa.tsx +0 -165
  116. package/blocks/auth/login-basic.tsx +0 -94
  117. package/blocks/auth/login-social.tsx +0 -148
  118. package/blocks/auth/magic-link.tsx +0 -129
  119. package/blocks/auth/password-reset.tsx +0 -97
  120. package/blocks/auth/signup.tsx +0 -157
  121. package/blocks/components/accordian-block.tsx +0 -48
  122. package/blocks/components/block-component-props.ts +0 -11
  123. package/blocks/components/bullet-cards-block.tsx +0 -46
  124. package/blocks/components/card-block/index.tsx +0 -171
  125. package/blocks/components/card-block/link-out-button.tsx +0 -20
  126. package/blocks/components/card-block/util.ts +0 -28
  127. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  128. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  129. package/blocks/components/content.tsx +0 -70
  130. package/blocks/components/cta-block.tsx +0 -115
  131. package/blocks/components/enh-heading-block.tsx +0 -204
  132. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  133. package/blocks/components/grid-block/index.tsx +0 -83
  134. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  135. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  136. package/blocks/components/group-block.tsx +0 -83
  137. package/blocks/components/heading-block.tsx +0 -88
  138. package/blocks/components/image-block.tsx +0 -111
  139. package/blocks/components/index.ts +0 -30
  140. package/blocks/components/screenful-block/content.tsx +0 -123
  141. package/blocks/components/screenful-block/index.tsx +0 -107
  142. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  143. package/blocks/components/screenful-block/video-background.tsx +0 -45
  144. package/blocks/components/space-block.tsx +0 -66
  145. package/blocks/components/video-block.tsx +0 -138
  146. package/blocks/data-display/activity-feed.tsx +0 -242
  147. package/blocks/data-display/data-table.tsx +0 -235
  148. package/blocks/data-display/stats-grid.tsx +0 -194
  149. package/blocks/def/accordian-block.ts +0 -14
  150. package/blocks/def/block.ts +0 -7
  151. package/blocks/def/bullet-cards-block.ts +0 -22
  152. package/blocks/def/card-block.ts +0 -22
  153. package/blocks/def/carte-blanche-block.ts +0 -21
  154. package/blocks/def/cta-block.ts +0 -19
  155. package/blocks/def/element-block.ts +0 -11
  156. package/blocks/def/enh-heading-block.ts +0 -44
  157. package/blocks/def/grid-block.ts +0 -16
  158. package/blocks/def/group-block.ts +0 -11
  159. package/blocks/def/heading-block.ts +0 -15
  160. package/blocks/def/image-block.ts +0 -31
  161. package/blocks/def/index.ts +0 -35
  162. package/blocks/def/screenful-block.ts +0 -54
  163. package/blocks/def/space-block.ts +0 -64
  164. package/blocks/def/video-block.ts +0 -9
  165. package/blocks/ecommerce/checkout.tsx +0 -242
  166. package/blocks/ecommerce/index.ts +0 -7
  167. package/blocks/ecommerce/product-detail.tsx +0 -257
  168. package/blocks/ecommerce/product-grid.tsx +0 -148
  169. package/blocks/ecommerce/shopping-cart.tsx +0 -181
  170. package/blocks/index.ts +0 -2
  171. package/blocks/marketing/cta-section.tsx +0 -207
  172. package/blocks/marketing/faq.tsx +0 -159
  173. package/blocks/marketing/features-grid.tsx +0 -156
  174. package/blocks/marketing/hero-section.tsx +0 -192
  175. package/blocks/marketing/index.ts +0 -6
  176. package/blocks/marketing/pricing-table.tsx +0 -121
  177. package/blocks/marketing/testimonials.tsx +0 -196
  178. package/components/index.ts +0 -9
  179. package/dist/index.js.map +0 -1
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/tailwind.js +0 -2025
  182. package/dist/tailwind.js.map +0 -1
  183. package/dist/tailwind.mjs +0 -2013
  184. package/dist/tailwind.mjs.map +0 -1
  185. package/dist/types.js +0 -59
  186. package/dist/types.js.map +0 -1
  187. package/dist/types.mjs +0 -53
  188. package/dist/types.mjs.map +0 -1
  189. package/dist/utils.js +0 -30
  190. package/dist/utils.js.map +0 -1
  191. package/dist/utils.mjs +0 -26
  192. package/dist/utils.mjs.map +0 -1
  193. package/frameworks/core/index.ts +0 -6
  194. package/frameworks/core/utils/index.ts +0 -64
  195. package/frameworks/react/components/button.tsx +0 -26
  196. package/frameworks/react/components/index.ts +0 -5
  197. package/frameworks/react/hooks/index.ts +0 -5
  198. package/frameworks/react/index.ts +0 -9
  199. package/frameworks/react/package.json +0 -8
  200. package/frameworks/react/utils/index.ts +0 -2
  201. package/frameworks/react-native/index.ts +0 -9
  202. package/frameworks/react-native/package.json +0 -8
  203. package/frameworks/registry.json +0 -371
  204. package/frameworks/setup.sh +0 -69
  205. package/frameworks/svelte/index.ts +0 -9
  206. package/frameworks/svelte/package.json +0 -8
  207. package/frameworks/tracker.json +0 -1854
  208. package/frameworks/vue/index.ts +0 -9
  209. package/frameworks/vue/package.json +0 -8
  210. package/helpers/file.ts +0 -33
  211. package/helpers/memoization.ts +0 -40
  212. package/primitives/accordion.tsx +0 -74
  213. package/primitives/action-button.tsx +0 -42
  214. package/primitives/alert-dialog.tsx +0 -185
  215. package/primitives/alert.tsx +0 -74
  216. package/primitives/apply-typography.tsx +0 -55
  217. package/primitives/aspect-ratio.tsx +0 -5
  218. package/primitives/avatar.tsx +0 -57
  219. package/primitives/background-beams.tsx +0 -142
  220. package/primitives/badge.tsx +0 -45
  221. package/primitives/breadcrumb.tsx +0 -130
  222. package/primitives/breakpoint-indicator.tsx +0 -19
  223. package/primitives/button.tsx +0 -72
  224. package/primitives/calendar.tsx +0 -72
  225. package/primitives/card.tsx +0 -97
  226. package/primitives/carousel.tsx +0 -238
  227. package/primitives/chat/chat-input-area.tsx +0 -88
  228. package/primitives/chat/chat-input.tsx +0 -71
  229. package/primitives/chat/files-preview.tsx +0 -331
  230. package/primitives/chat/index.ts +0 -6
  231. package/primitives/chat/json-form.tsx +0 -8
  232. package/primitives/chat/message-list.tsx +0 -308
  233. package/primitives/chat/message.tsx +0 -569
  234. package/primitives/chat/sqlite-preview.tsx +0 -215
  235. package/primitives/checkbox.tsx +0 -32
  236. package/primitives/collapsible.tsx +0 -9
  237. package/primitives/combobox.tsx +0 -239
  238. package/primitives/command.tsx +0 -151
  239. package/primitives/context-menu.tsx +0 -206
  240. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  241. package/primitives/dialog-video-controller.tsx +0 -38
  242. package/primitives/dialog.tsx +0 -128
  243. package/primitives/dot-pattern.tsx +0 -57
  244. package/primitives/dots-loader.tsx +0 -13
  245. package/primitives/drawer.tsx +0 -113
  246. package/primitives/dropdown-menu.tsx +0 -199
  247. package/primitives/error-message.tsx +0 -19
  248. package/primitives/file-uploader.tsx +0 -203
  249. package/primitives/form.tsx +0 -185
  250. package/primitives/hover-card.tsx +0 -28
  251. package/primitives/icons/github.tsx +0 -14
  252. package/primitives/icons/index.ts +0 -18
  253. package/primitives/icons/youtube-logo.tsx +0 -59
  254. package/primitives/index-client.ts +0 -4
  255. package/primitives/index-common.ts +0 -304
  256. package/primitives/index-next.ts +0 -4
  257. package/primitives/input-otp.tsx +0 -65
  258. package/primitives/input.tsx +0 -128
  259. package/primitives/label.tsx +0 -21
  260. package/primitives/list-adaptor.ts +0 -12
  261. package/primitives/list-box.tsx +0 -74
  262. package/primitives/loading-spinner.tsx +0 -33
  263. package/primitives/markdown-preview.tsx +0 -612
  264. package/primitives/mermaid.tsx +0 -196
  265. package/primitives/navigation-menu.tsx +0 -147
  266. package/primitives/next/image.tsx +0 -91
  267. package/primitives/next/index.ts +0 -7
  268. package/primitives/next/inline-icon.tsx +0 -36
  269. package/primitives/next/link-element.tsx +0 -109
  270. package/primitives/next/mdx-link.tsx +0 -22
  271. package/primitives/next/media-stack.tsx +0 -52
  272. package/primitives/next/nav-items.tsx +0 -45
  273. package/primitives/next/youtube-embed.tsx +0 -83
  274. package/primitives/pagination.tsx +0 -117
  275. package/primitives/popover.tsx +0 -34
  276. package/primitives/pretty-json-print.tsx +0 -28
  277. package/primitives/progress.tsx +0 -27
  278. package/primitives/prompt-textarea.tsx +0 -72
  279. package/primitives/qr-code.tsx +0 -112
  280. package/primitives/radio-group.tsx +0 -42
  281. package/primitives/resizable.tsx +0 -47
  282. package/primitives/scroll-area.tsx +0 -57
  283. package/primitives/search-input.tsx +0 -66
  284. package/primitives/select.tsx +0 -122
  285. package/primitives/separator.tsx +0 -26
  286. package/primitives/sheet.tsx +0 -139
  287. package/primitives/skeleton.tsx +0 -18
  288. package/primitives/slider.tsx +0 -63
  289. package/primitives/sonner.tsx +0 -35
  290. package/primitives/step-indicator.tsx +0 -69
  291. package/primitives/stepper.tsx +0 -272
  292. package/primitives/switch.tsx +0 -27
  293. package/primitives/table.tsx +0 -105
  294. package/primitives/tabs.tsx +0 -50
  295. package/primitives/text-area.tsx +0 -26
  296. package/primitives/text-link.tsx +0 -27
  297. package/primitives/textarea.tsx +0 -64
  298. package/primitives/textfield.tsx +0 -78
  299. package/primitives/toast.tsx +0 -30
  300. package/primitives/toggle-group.tsx +0 -63
  301. package/primitives/toggle.tsx +0 -44
  302. package/primitives/tooltip.tsx +0 -47
  303. package/primitives/video-player.tsx +0 -23
  304. package/src/button.ts +0 -1
  305. package/src/hooks/index.ts +0 -7
  306. package/src/hooks/use-click-away.ts +0 -31
  307. package/src/hooks/use-combined-refs.ts +0 -22
  308. package/src/hooks/use-copy-clipboard.ts +0 -30
  309. package/src/hooks/use-debounce.ts +0 -17
  310. package/src/hooks/use-fill-ids.ts +0 -25
  311. package/src/hooks/use-map.ts +0 -26
  312. package/src/hooks/use-measure.ts +0 -42
  313. package/src/hooks/use-reverse-video-playback.ts +0 -43
  314. package/src/hooks/use-scroll-restoration.ts +0 -50
  315. package/src/index-lean.ts +0 -87
  316. package/src/index.ts +0 -54
  317. package/src/mcp/README.md +0 -141
  318. package/src/mcp/enhanced-server.ts +0 -1208
  319. package/src/mcp/index.ts +0 -518
  320. package/src/mcp/package.json +0 -10
  321. package/src/registry/api.ts +0 -164
  322. package/src/registry/index.ts +0 -60
  323. package/src/registry/package.json +0 -10
  324. package/src/utils.ts +0 -19
  325. package/tailwind/colors.tailwind.js +0 -53
  326. package/tailwind/fontFamily.tailwind.ts +0 -7
  327. package/tailwind/fontSize.tailwind.ts +0 -13
  328. package/tailwind/index.ts +0 -7
  329. package/tailwind/safelist.tailwind.js +0 -26
  330. package/tailwind/screens.tailwind.js +0 -8
  331. package/tailwind/spacing.tailwind.js +0 -65
  332. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  333. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  334. package/tailwind/tw-font-desc.ts +0 -15
  335. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  336. package/tailwind/typo-plugin/index.d.ts +0 -9
  337. package/tailwind/typo-plugin/index.js +0 -141
  338. package/tailwind/typo-plugin/utils.js +0 -60
  339. package/tailwind/typography-test.mdx +0 -35
  340. package/tailwind/z-index.tailwind.js +0 -71
  341. package/types/animation-def.ts +0 -3
  342. package/types/breakpoints.ts +0 -11
  343. package/types/bullet-item.ts +0 -10
  344. package/types/button-def.ts +0 -39
  345. package/types/dimensions.ts +0 -8
  346. package/types/grid-def.ts +0 -56
  347. package/types/image-def.ts +0 -32
  348. package/types/index.ts +0 -30
  349. package/types/link-def.ts +0 -56
  350. package/types/media-stack-def.ts +0 -31
  351. package/types/t-shirt-size.ts +0 -5
  352. package/types/tshirt-dimensions.ts +0 -20
  353. package/types/video-def.ts +0 -25
  354. package/util/blob.ts +0 -33
  355. package/util/copy-to-clipboard.ts +0 -17
  356. package/util/create-shadow-root.ts +0 -22
  357. package/util/date.ts +0 -84
  358. package/util/debounce.ts +0 -11
  359. package/util/file.ts +0 -15
  360. package/util/format-and-abbreviate-as-currency.ts +0 -125
  361. package/util/format-text.ts +0 -34
  362. package/util/format-to-max-char.ts +0 -68
  363. package/util/index-client.ts +0 -3
  364. package/util/index.ts +0 -112
  365. package/util/number-abbreviate.ts +0 -49
  366. package/util/specifier.ts +0 -43
  367. package/util/spread-to-transform.ts +0 -25
  368. package/util/step-animation.ts +0 -90
  369. package/util/timing.ts +0 -3
  370. package/util/toasts.tsx +0 -17
  371. package/util/two-way-map.ts +0 -19
@@ -1,612 +0,0 @@
1
- import { Primitive } from '@radix-ui/react-primitive';
2
- import { useCallbackRef } from '@radix-ui/react-use-callback-ref';
3
- import { Element } from 'hast';
4
-
5
- import React, {
6
- type ComponentPropsWithoutRef,
7
- type ComponentType,
8
- createContext,
9
- type ElementType,
10
- type FC,
11
- memo,
12
- type ReactNode,
13
- useContext,
14
- useMemo,
15
- } from 'react';
16
- import ReactMarkdown, { Options } from 'react-markdown';
17
- import {
18
- PrismAsyncLight,
19
- type SyntaxHighlighterProps as SHP,
20
- } from 'react-syntax-highlighter';
21
- import python from 'react-syntax-highlighter/dist/esm/languages/prism/python';
22
- import tsx from 'react-syntax-highlighter/dist/esm/languages/prism/tsx';
23
- import { default as github } from 'react-syntax-highlighter/dist/esm/styles/hljs/github';
24
- import rehypeKatex from 'rehype-katex';
25
- import remarkGfm from 'remark-gfm';
26
- import remarkMath from 'remark-math';
27
-
28
- import {
29
- memoCompareNodes,
30
- memoizeMarkdownComponents,
31
- } from '../helpers/memoization';
32
- import { cn } from '../src/utils';
33
- import { CopyToClipboardIcon } from './copy-to-clipboard-icon';
34
-
35
- import { MermaidDiagram } from './mermaid';
36
-
37
- export type CodeHeaderProps = {
38
- node?: Element | undefined;
39
- language: string | undefined;
40
- code: string;
41
- };
42
-
43
- export const CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {
44
- return (
45
- <div className="code-header-root bg-bg-darker text-text-default flex items-center justify-between gap-4 rounded-t-lg px-4 py-1">
46
- <span className="code-header-language text-text-secondary text-xs font-medium lowercase">
47
- {language}
48
- </span>
49
- <CopyToClipboardIcon
50
- className={cn(
51
- 'text-text-secondary h-7 w-7 bg-transparent hover:bg-gray-900 [&>svg]:h-3 [&>svg]:w-3',
52
- )}
53
- string={code}
54
- />
55
- </div>
56
- );
57
- };
58
-
59
- const makeMakeSyntaxHighlighter =
60
- (SyntaxHighlighter: ComponentType<SHP>) =>
61
- (config: Omit<SHP, 'language' | 'children'>) => {
62
- const PrismSyntaxHighlighter: FC<SyntaxHighlighterProps> = ({
63
- components: { Pre, Code },
64
- language,
65
- code,
66
- }) => {
67
- return (
68
- <SyntaxHighlighter
69
- CodeTag={Code as any}
70
- PreTag={Pre as any}
71
- {...config}
72
- language={language}
73
- >
74
- {code}
75
- </SyntaxHighlighter>
76
- );
77
- };
78
-
79
- PrismSyntaxHighlighter.displayName = 'PrismSyntaxHighlighter';
80
-
81
- return PrismSyntaxHighlighter;
82
- };
83
-
84
- // register languages you want to support
85
- PrismAsyncLight.registerLanguage('js', tsx);
86
- PrismAsyncLight.registerLanguage('jsx', tsx);
87
- PrismAsyncLight.registerLanguage('ts', tsx);
88
- PrismAsyncLight.registerLanguage('tsx', tsx);
89
- PrismAsyncLight.registerLanguage('python', python);
90
-
91
- export const makePrismAsyncLightSyntaxHighlighter =
92
- makeMakeSyntaxHighlighter(PrismAsyncLight);
93
-
94
- export const SyntaxHighlighterBase = makePrismAsyncLightSyntaxHighlighter({
95
- style: github,
96
- customStyle: {
97
- margin: 0,
98
- width: '100%',
99
- background: 'var(--color-bg-darker)',
100
- padding: '1.5rem 1rem',
101
- fontSize: '0.875em',
102
- },
103
- });
104
-
105
- export const defaultComponents = memoizeMarkdownComponents({
106
- h1: ({ className, ...props }) => (
107
- <h1
108
- className={cn(
109
- 'mt-[1em] mb-[0.7em] scroll-m-20 text-[1.375rem] font-bold last:mb-0',
110
- className,
111
- )}
112
- {...props}
113
- />
114
- ),
115
- h2: ({ className, ...props }) => (
116
- <h2
117
- className={cn(
118
- 'text-em-xl mt-[0.8em] mb-[0.4em] scroll-m-20 font-semibold first:mt-0 last:mb-0',
119
- className,
120
- )}
121
- {...props}
122
- />
123
- ),
124
- h3: ({ className, ...props }) => (
125
- <h3
126
- className={cn(
127
- 'text-em-lg mt-[1em] mb-[0.5em] scroll-m-20 font-semibold first:mt-0 last:mb-0',
128
- className,
129
- )}
130
- {...props}
131
- />
132
- ),
133
- h4: ({ className, ...props }) => (
134
- <h4
135
- className={cn(
136
- 'text-em-base mt-[1em] mb-[0.5em] scroll-m-20 font-semibold first:mt-0 last:mb-0',
137
- className,
138
- )}
139
- {...props}
140
- />
141
- ),
142
- h5: ({ className, ...props }) => (
143
- <h5
144
- className={cn(
145
- 'text-em-base mt-[1em] mb-[0.5em] font-semibold first:mt-0 last:mb-0',
146
- className,
147
- )}
148
- {...props}
149
- />
150
- ),
151
- h6: ({ className, ...props }) => (
152
- <h6
153
- className={cn(
154
- 'text-em-base mt-[1em] mb-[0.5em] font-semibold first:mt-0 last:mb-0',
155
- className,
156
- )}
157
- {...props}
158
- />
159
- ),
160
- p: ({ className, ...props }) => (
161
- <p
162
- className={cn('text-em-base my-[0.5em] first:mt-0 last:mb-0', className)}
163
- {...props}
164
- />
165
- ),
166
- a: ({ className, ...props }) => (
167
- <a
168
- className={cn(
169
- 'font-medium text-blue-400 underline underline-offset-4',
170
- className,
171
- )}
172
- target="_blank"
173
- {...props}
174
- />
175
- ),
176
- blockquote: ({ className, ...props }) => (
177
- <blockquote
178
- className={cn('border-l-2 pl-6 italic', className)}
179
- {...props}
180
- />
181
- ),
182
- ul: ({ className, ...props }) => (
183
- <ul
184
- className={cn(
185
- 'text-em-base my-[1em] ml-6 list-disc [&>li]:mt-2',
186
- className,
187
- )}
188
- {...props}
189
- />
190
- ),
191
- ol: ({ className, ...props }) => (
192
- <ol
193
- className={cn(
194
- 'text-em-base my-[1em] ml-6 list-decimal [&>li]:mt-[0.5em]',
195
- className,
196
- )}
197
- {...props}
198
- />
199
- ),
200
- hr: ({ className, ...props }) => (
201
- <hr
202
- className={cn('border-divider my-[2.25em] border-b', className)}
203
- {...props}
204
- />
205
- ),
206
- table: ({ className, ...props }) => (
207
- <div className="my-[1.5em] size-full overflow-x-auto">
208
- <table className="w-full border-collapse border-spacing-0" {...props} />
209
- </div>
210
- ),
211
- thead: ({ className, ...props }) => (
212
- <thead className={cn('[&>tr]:border-none', className)} {...props} />
213
- ),
214
- th: ({ className, ...props }) => (
215
- <th
216
- className={cn(
217
- 'text-em-sm px-[1em] py-[0.875em] text-left font-semibold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right',
218
- className,
219
- )}
220
- {...props}
221
- />
222
- ),
223
- td: ({ className, ...props }) => (
224
- <td
225
- className={cn(
226
- 'text-em-sm border-divider border-b px-[1em] py-[0.875em] text-left [&[align=center]]:text-center [&[align=right]]:text-right',
227
- className,
228
- )}
229
- {...props}
230
- />
231
- ),
232
- tr: ({ className, ...props }) => (
233
- <tr
234
- className={cn(
235
- 'm-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg',
236
- className,
237
- )}
238
- {...props}
239
- />
240
- ),
241
- sup: ({ className, ...props }) => (
242
- <sup
243
- className={cn('[&>a]:text-em-xs [&>a]:no-underline', className)}
244
- {...props}
245
- />
246
- ),
247
- pre: ({ className, ...props }) => (
248
- <pre
249
- className={cn(
250
- 'bg-bg-darker text-text-default overflow-x-auto rounded-b-lg !px-[1em] !py-[0.5em]',
251
- className,
252
- )}
253
- {...props}
254
- />
255
- ),
256
- code: function Code({ className, ...props }) {
257
- const isCodeBlock = useIsMarkdownCodeBlock();
258
- return (
259
- <code
260
- className={cn(
261
- !isCodeBlock &&
262
- 'bg-bg-darker text-em-sm border-divider rounded-sm p-[0.25em] font-semibold',
263
- className,
264
- )}
265
- {...props}
266
- />
267
- );
268
- },
269
- CodeHeader,
270
- SyntaxHighlighter: SyntaxHighlighterBase,
271
- });
272
-
273
- export type PreComponent = ComponentType<
274
- ComponentPropsWithoutRef<'pre'> & { node?: Element | undefined }
275
- >;
276
- export type CodeComponent = ComponentType<
277
- ComponentPropsWithoutRef<'code'> & { node?: Element | undefined }
278
- >;
279
-
280
- export const PreContext = createContext<Omit<
281
- ComponentPropsWithoutRef<PreComponent>,
282
- 'children'
283
- > | null>(null);
284
-
285
- export const IsRunningContext = createContext<boolean | undefined>(undefined);
286
-
287
- export const useIsMarkdownCodeBlock = () => {
288
- return useContext(PreContext) !== null;
289
- };
290
-
291
- export const useIsRunning = () => {
292
- return useContext(IsRunningContext);
293
- };
294
-
295
- export const PreOverride: PreComponent = ({ children, ...rest }) => {
296
- return <PreContext.Provider value={rest}>{children}</PreContext.Provider>;
297
- };
298
-
299
- export const DefaultPre: PreComponent = ({
300
- className,
301
- ...rest
302
- }: ComponentPropsWithoutRef<'pre'>) => <pre className={className} {...rest} />;
303
-
304
- export const DefaultCode: CodeComponent = ({
305
- className,
306
- ...rest
307
- }: ComponentPropsWithoutRef<'code'>) => (
308
- <code className={className} {...rest} />
309
- );
310
-
311
- export const DefaultCodeBlockContent: ComponentType<{
312
- node: Element | undefined;
313
- components: { Pre: PreComponent; Code: CodeComponent };
314
- code: string | ReactNode | undefined;
315
- }> = ({ node, components: { Pre, Code }, code }) => (
316
- <Pre>
317
- <Code node={node}>{code}</Code>
318
- </Pre>
319
- );
320
-
321
- export const DefaultCodeHeader: ComponentType<CodeHeaderProps> = () => null;
322
-
323
- type PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;
324
-
325
- export type MarkdownTextPrimitiveProps = Omit<
326
- Options,
327
- 'components' | 'children'
328
- > & {
329
- containerProps?: Omit<PrimitiveDivProps, 'children' | 'asChild'> | undefined;
330
- containerComponent?: ElementType;
331
- componentsByLanguage?:
332
- | Record<
333
- string,
334
- {
335
- CodeHeader?: ComponentType<CodeHeaderProps> | undefined;
336
- SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;
337
- }
338
- >
339
- | undefined;
340
- components?:
341
- | (NonNullable<Options['components']> & {
342
- SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps> | undefined;
343
- CodeHeader?: ComponentType<CodeHeaderProps> | undefined;
344
- })
345
- | undefined;
346
- content: string;
347
- ref?: React.RefObject<HTMLDivElement>;
348
- };
349
-
350
- export type CodeOverrideProps = ComponentPropsWithoutRef<CodeComponent> & {
351
- components: {
352
- Pre: PreComponent;
353
- Code: CodeComponent;
354
- CodeHeader: ComponentType<CodeHeaderProps>;
355
- SyntaxHighlighter: ComponentType<SyntaxHighlighterProps>;
356
- };
357
- componentsByLanguage?:
358
- | Record<
359
- string,
360
- {
361
- CodeHeader?: ComponentType<CodeHeaderProps>;
362
- SyntaxHighlighter?: ComponentType<SyntaxHighlighterProps>;
363
- }
364
- >
365
- | undefined;
366
- };
367
-
368
- export type SyntaxHighlighterProps = {
369
- components: {
370
- Pre: PreComponent;
371
- Code: CodeComponent;
372
- };
373
- language: string;
374
- code: string;
375
- isRunning?: boolean;
376
- };
377
-
378
- export type CodeBlockProps = {
379
- node: Element | undefined;
380
- language: string;
381
- code: string;
382
- components: {
383
- Pre: PreComponent;
384
- Code: CodeComponent;
385
- CodeHeader: ComponentType<CodeHeaderProps>;
386
- SyntaxHighlighter: ComponentType<SyntaxHighlighterProps>;
387
- };
388
- isRunning?: boolean;
389
- };
390
-
391
- export const DefaultCodeBlock: FC<CodeBlockProps> = ({
392
- node,
393
- components: { Pre, Code, SyntaxHighlighter, CodeHeader },
394
- language,
395
- code,
396
- isRunning,
397
- }) => {
398
- const components = useMemo(() => ({ Pre, Code }), [Pre, Code]);
399
-
400
- const SH = !!language ? SyntaxHighlighter : DefaultCodeBlockContent;
401
-
402
- return (
403
- <>
404
- <CodeHeader node={node} language={language} code={code} />
405
- <SH
406
- node={node}
407
- components={components}
408
- language={language ?? 'unknown'}
409
- code={code}
410
- isRunning={isRunning}
411
- />
412
- </>
413
- );
414
- };
415
-
416
- export const withDefaultProps =
417
- <TProps extends { className?: string | undefined }>({
418
- className,
419
- ...defaultProps
420
- }: Partial<TProps>) =>
421
- ({ className: classNameProp, ...props }: TProps) => {
422
- return {
423
- className: cn(className, classNameProp),
424
- ...defaultProps,
425
- ...props,
426
- } as TProps;
427
- };
428
-
429
- const CodeBlockOverride: FC<CodeOverrideProps> = ({
430
- node,
431
- components: {
432
- Pre,
433
- Code,
434
- SyntaxHighlighter: FallbackSyntaxHighlighter,
435
- CodeHeader: FallbackCodeHeader,
436
- },
437
- componentsByLanguage = {},
438
- children,
439
- ...codeProps
440
- }) => {
441
- const preProps = useContext(PreContext)!;
442
- const isRunning = useIsRunning();
443
- const getPreProps = withDefaultProps<any>(preProps);
444
- const WrappedPre: PreComponent = useCallbackRef((props) => (
445
- <Pre {...getPreProps(props)} />
446
- ));
447
-
448
- const getCodeProps = withDefaultProps<any>(codeProps);
449
- const WrappedCode: CodeComponent = useCallbackRef((props) => (
450
- <Code {...getCodeProps(props)} />
451
- ));
452
-
453
- const language = /language-(\w+)/.exec(codeProps.className || '')?.[1] ?? '';
454
-
455
- // if the code content is not string (due to rehype plugins), return a default code block
456
- if (typeof children !== 'string') {
457
- return (
458
- <DefaultCodeBlockContent
459
- code={children}
460
- components={{ Pre: WrappedPre, Code: WrappedCode }}
461
- node={node}
462
- />
463
- );
464
- }
465
-
466
- const SyntaxHighlighter: ComponentType<SyntaxHighlighterProps> =
467
- componentsByLanguage[language]?.SyntaxHighlighter ??
468
- FallbackSyntaxHighlighter;
469
-
470
- const CodeHeader: ComponentType<CodeHeaderProps> =
471
- componentsByLanguage[language]?.CodeHeader ?? FallbackCodeHeader;
472
-
473
- return (
474
- <DefaultCodeBlock
475
- node={node}
476
- components={{
477
- Pre: WrappedPre,
478
- Code: WrappedCode,
479
- SyntaxHighlighter,
480
- CodeHeader,
481
- }}
482
- language={language || 'unknown'}
483
- code={children}
484
- isRunning={isRunning}
485
- />
486
- );
487
- };
488
-
489
- export const CodeOverrideBase: FC<CodeOverrideProps> = ({
490
- node,
491
- components,
492
- componentsByLanguage,
493
- ...props
494
- }) => {
495
- const isCodeBlock = useContext(PreContext) !== null;
496
- if (!isCodeBlock) return <components.Code {...props} />;
497
- return (
498
- <CodeBlockOverride
499
- components={components}
500
- componentsByLanguage={componentsByLanguage}
501
- node={node}
502
- {...props}
503
- />
504
- );
505
- };
506
-
507
- export const CodeOverride = memo(CodeOverrideBase, (prev, next) => {
508
- const isEqual =
509
- prev.components === next.components &&
510
- prev.componentsByLanguage === next.componentsByLanguage &&
511
- memoCompareNodes(prev, next);
512
- return isEqual;
513
- });
514
-
515
- export const MarkdownTextPrimitive = ({
516
- components: userComponents,
517
- className,
518
- containerProps,
519
- containerComponent: Container = 'div',
520
- content,
521
- componentsByLanguage,
522
- ref,
523
- isRunning,
524
- ...rest
525
- }: MarkdownTextPrimitiveProps & { isRunning?: boolean }) => {
526
- const {
527
- pre = DefaultPre,
528
- code = DefaultCode,
529
- SyntaxHighlighter = DefaultCodeBlockContent,
530
- CodeHeader = DefaultCodeHeader,
531
- } = userComponents ?? {};
532
-
533
- const useCodeOverrideComponents = useMemo(() => {
534
- return {
535
- Pre: pre,
536
- Code: code,
537
- SyntaxHighlighter,
538
- CodeHeader,
539
- };
540
- }, [pre, code, SyntaxHighlighter, CodeHeader]);
541
- const CodeComponent = useCallbackRef((props) => (
542
- <CodeOverride
543
- components={useCodeOverrideComponents}
544
- componentsByLanguage={componentsByLanguage}
545
- {...props}
546
- />
547
- ));
548
-
549
- const components: Options['components'] = useMemo(() => {
550
- const { pre, code, SyntaxHighlighter, CodeHeader, ...componentsRest } =
551
- userComponents ?? {};
552
- return {
553
- ...componentsRest,
554
- pre: PreOverride,
555
- code: CodeComponent,
556
- };
557
- }, [CodeComponent, userComponents]);
558
-
559
- return (
560
- <Container
561
- // data-status={status.type}
562
- {...containerProps}
563
- className={cn(className, containerProps?.className)}
564
- ref={ref}
565
- >
566
- <IsRunningContext.Provider value={isRunning}>
567
- <ReactMarkdown components={components} {...rest}>
568
- {content}
569
- </ReactMarkdown>
570
- </IsRunningContext.Provider>
571
- </Container>
572
- );
573
- };
574
-
575
- MarkdownTextPrimitive.displayName = 'MarkdownTextPrimitive';
576
-
577
- export type MakeMarkdownTextProps = MarkdownTextPrimitiveProps & {
578
- isRunning?: boolean;
579
- };
580
-
581
- export const MarkdownTextBase = ({
582
- className,
583
- isRunning,
584
- components: userComponents,
585
- ...rest
586
- }: MakeMarkdownTextProps) => {
587
- return (
588
- <MarkdownTextPrimitive
589
- components={defaultComponents}
590
- remarkPlugins={[remarkGfm, remarkMath]}
591
- rehypePlugins={[rehypeKatex]}
592
- className={cn(isRunning && 'md-running', className)}
593
- isRunning={isRunning}
594
- componentsByLanguage={{
595
- mermaid: {
596
- SyntaxHighlighter: MermaidDiagram,
597
- },
598
- }}
599
- {...rest}
600
- />
601
- );
602
- };
603
- export const MarkdownText = memo(
604
- MarkdownTextBase,
605
- (prev, next) =>
606
- prev.content === next.content &&
607
- prev.isRunning === next.isRunning &&
608
- prev.className === next.className,
609
- );
610
-
611
- // Alias for compatibility
612
- export const MarkdownPreview = MarkdownText;