@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,196 +0,0 @@
1
- // import { save } from '@tauri-apps/plugin-dialog'; // Not available in web environment
2
- // import * as fs from '@tauri-apps/plugin-fs'; // Not available in web environment
3
- import { RotateCcw, Download } from 'lucide-react';
4
- import mermaid from 'mermaid';
5
- import { FC, useEffect, useRef, useState, useCallback } from 'react';
6
- import { toast } from 'sonner';
7
- import { cn } from '../src/utils';
8
- import { Button } from './button';
9
- import { SyntaxHighlighterProps } from './markdown-preview';
10
- import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';
11
-
12
- export type MermaidDiagramProps = SyntaxHighlighterProps & {
13
- className?: string;
14
- isRunning?: boolean;
15
- };
16
-
17
- mermaid.initialize({
18
- startOnLoad: true,
19
- mindmap: {
20
- useWidth: 800,
21
- },
22
- theme: 'dark',
23
- fontSize: 18,
24
- darkMode: true,
25
- fontFamily: 'Inter',
26
- });
27
-
28
- const generateId = () => `mermaid-${Math.random().toString(36).slice(2)}`;
29
-
30
- const downloadBlob = async (blob: Blob, filename: string) => {
31
- // Web-compatible download (instead of Tauri)
32
- try {
33
- const link = document.createElement('a');
34
- link.href = URL.createObjectURL(blob);
35
- link.download = filename;
36
- document.body.appendChild(link);
37
- link.click();
38
- document.body.removeChild(link);
39
- URL.revokeObjectURL(link.href);
40
- toast.success('Mermaid diagram saved successfully');
41
- } catch (error) {
42
- toast.error('Failed to download diagram');
43
- }
44
- };
45
-
46
- export const MermaidDiagram: FC<MermaidDiagramProps> = ({
47
- code,
48
- className,
49
- isRunning,
50
- }) => {
51
- const ref = useRef<HTMLDivElement>(null);
52
- const lastCode = useRef<string | null>(null);
53
- const [instance, setInstance] = useState<any>(null);
54
-
55
- const isComplete = !isRunning;
56
-
57
- const resetZoom = useCallback(() => {
58
- instance?.fit();
59
- instance?.center();
60
- }, [instance]);
61
-
62
- const downloadSVG = useCallback(() => {
63
- if (ref.current) {
64
- const svg = ref.current.innerHTML;
65
- const blob = new Blob([svg], { type: 'image/svg+xml' });
66
- void downloadBlob(blob, 'mermaid-diagram.svg');
67
- }
68
- }, []);
69
-
70
- const enableZoom = useCallback(() => {
71
- instance?.enablePan();
72
- instance?.enableZoom();
73
- }, [instance]);
74
-
75
- const disableZoom = useCallback(() => {
76
- instance?.disablePan();
77
- instance?.disableZoom();
78
- }, [instance]);
79
-
80
- const handleFocus = useCallback(() => {
81
- enableZoom();
82
- }, [enableZoom]);
83
-
84
- const handleBlur = useCallback(() => {
85
- disableZoom();
86
- }, [disableZoom]);
87
-
88
- const handleClick = useCallback(() => {
89
- if (ref.current) {
90
- ref.current.focus();
91
- }
92
- }, []);
93
-
94
- useEffect(() => {
95
- if (!isComplete || !ref.current || !code) return;
96
-
97
- if (lastCode.current === code) return;
98
-
99
- void (async () => {
100
- try {
101
- const id = generateId();
102
- const { svg } = await mermaid.render(id, code);
103
-
104
- if (ref.current) {
105
- ref.current.innerHTML = svg;
106
-
107
- const svgElement = ref.current.querySelector('svg');
108
- if (svgElement) {
109
- svgElement.setAttribute('height', '100%');
110
- svgElement.setAttribute('width', '100%');
111
- svgElement.style.height = '100%';
112
- svgElement.style.width = '100%';
113
- svgElement.style.position = 'absolute';
114
- svgElement.style.top = '0';
115
- svgElement.style.left = '0';
116
-
117
- // Dynamically import svg-pan-zoom only on client side
118
- if (typeof window !== 'undefined') {
119
- const svgPanZoomModule = await import('svg-pan-zoom');
120
- const svgPanZoom = svgPanZoomModule.default || svgPanZoomModule;
121
-
122
- const panZoomInstance = svgPanZoom(svgElement);
123
- panZoomInstance.fit();
124
- panZoomInstance.center();
125
- panZoomInstance.zoomAtPoint(1, { x: 0, y: 0 });
126
- panZoomInstance.disablePan();
127
- panZoomInstance.disableZoom();
128
- setInstance(panZoomInstance);
129
- }
130
- }
131
- }
132
-
133
- lastCode.current = code;
134
- } catch (e) {
135
- console.warn('Failed to render Mermaid diagram:', e);
136
- }
137
- })();
138
- }, [code, isComplete]);
139
-
140
- return (
141
- <div className="relative">
142
- <div className="absolute top-2 right-2 z-10 flex gap-1">
143
- <Tooltip>
144
- <TooltipTrigger asChild>
145
- <Button
146
- variant="tertiary"
147
- size="icon"
148
- onClick={resetZoom}
149
- className="text-text-secondary"
150
- >
151
- <RotateCcw size={14} />
152
- </Button>
153
- </TooltipTrigger>
154
- <TooltipContent>
155
- <p>Reset Zoom</p>
156
- </TooltipContent>
157
- </Tooltip>
158
- <Tooltip>
159
- <TooltipTrigger asChild>
160
- <Button
161
- variant="tertiary"
162
- size="icon"
163
- onClick={downloadSVG}
164
- className="text-text-secondary"
165
- >
166
- <Download size={14} />
167
- </Button>
168
- </TooltipTrigger>
169
- <TooltipContent>
170
- <p>Download SVG</p>
171
- </TooltipContent>
172
- </Tooltip>
173
- </div>
174
- <div
175
- onClick={handleClick}
176
- className="text-text-secondary bg-bg-quaternary absolute right-2 bottom-2 z-10 rounded px-2 py-1 text-xs"
177
- >
178
- Click to focus, then scroll to zoom & drag to pan
179
- </div>
180
- <div
181
- ref={ref}
182
- tabIndex={0}
183
- onFocus={handleFocus}
184
- onBlur={handleBlur}
185
- onClick={handleClick}
186
- className={cn(
187
- 'text-text-secondary bg-bg-quaternary focus:ring-opacity-50 relative w-full cursor-grab overflow-hidden rounded-b-lg p-4 py-10 text-center text-sm focus:cursor-grabbing focus:ring-2 focus:ring-blue-500 focus:outline-none',
188
- className,
189
- )}
190
- style={{ width: '100%', minHeight: '400px' }}
191
- >
192
- Drawing diagram...
193
- </div>
194
- </div>
195
- );
196
- };
@@ -1,147 +0,0 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import * as NavigationMenuPrimitive from '@radix-ui/react-navigation-menu'
5
- import { cva } from 'class-variance-authority'
6
- import { ChevronDown } from 'lucide-react'
7
-
8
- import { cn } from '../util'
9
-
10
- const NavigationMenu = React.forwardRef<
11
- React.ElementRef<typeof NavigationMenuPrimitive.Root>,
12
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>
13
- >(({ className, children, ...props }, ref) => (
14
- <NavigationMenuPrimitive.Root
15
- ref={ref}
16
- className={cn(
17
- 'relative z-10 flex max-w-max flex-1 items-center justify-center',
18
- className
19
- )}
20
- {...props}
21
- >
22
- {children}
23
- {/* <NavigationMenuViewport /> */}
24
- </NavigationMenuPrimitive.Root>
25
- ))
26
- NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName
27
-
28
- const NavigationMenuList = React.forwardRef<
29
- React.ElementRef<typeof NavigationMenuPrimitive.List>,
30
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>
31
- >(({ className, ...props }, ref) => (
32
- <NavigationMenuPrimitive.List
33
- ref={ref}
34
- className={cn(
35
- 'group flex flex-1 list-none items-center justify-center space-x-1',
36
- className
37
- )}
38
- {...props}
39
- />
40
- ))
41
- NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName
42
-
43
- const NavigationMenuItem = React.forwardRef<
44
- React.ElementRef<typeof NavigationMenuPrimitive.Item>,
45
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Item>
46
- >(({ className, ...props }, ref) => (
47
- <NavigationMenuPrimitive.Item
48
- ref={ref}
49
- className={cn("relative", className)}
50
- {...props}
51
- />
52
- ))
53
- NavigationMenuItem.displayName = 'NavigationMenuItem'
54
-
55
- const navigationMenuTriggerStyle = cva(
56
- 'group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 ' +
57
- 'text-sm font-medium transition-colors hover:bg-level-1 text-foreground hover:text-accent ' +
58
- ' focus:text-accent focus:outline-none disabled:pointer-events-none disabled:opacity-50 ' +
59
- 'data-[active]:bg-level-1/50 data-[state=open]:bg-level-1/50'
60
- )
61
-
62
- const NavigationMenuTrigger = React.forwardRef<
63
- React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
64
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
65
- >(({ className, children, ...props }, ref) => (
66
- <NavigationMenuPrimitive.Trigger
67
- ref={ref}
68
- className={cn(navigationMenuTriggerStyle(), 'group', className)}
69
- {...props}
70
- >
71
- {children}{' '}
72
- <ChevronDown
73
- className='relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180'
74
- aria-hidden='true'
75
- />
76
- </NavigationMenuPrimitive.Trigger>
77
- ))
78
- NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName
79
-
80
- const NavigationMenuContent = React.forwardRef<
81
- React.ElementRef<typeof NavigationMenuPrimitive.Content>,
82
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>
83
- >(({ className, ...props }, ref) => (
84
- <NavigationMenuPrimitive.Content
85
- ref={ref}
86
- className={cn(
87
- "right-0 absolute",
88
- "absolute top-full w-fit bg-popover mt-[5px]",
89
- "data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 bg-background overflow-hidden rounded-md border",
90
- className
91
- )}
92
- {...props}
93
- />
94
- ))
95
- NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName
96
-
97
- const NavigationMenuLink = NavigationMenuPrimitive.Link
98
-
99
- const NavigationMenuViewport = React.forwardRef<
100
- React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
101
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>
102
- >(({ className, ...props }, ref) => (
103
- <div className={cn('absolute left-0 top-full flex justify-center')}>
104
- <NavigationMenuPrimitive.Viewport
105
- className={cn(
106
- 'origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border ',
107
- 'bg-background text-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]',
108
- className
109
- )}
110
- ref={ref}
111
- {...props}
112
- />
113
- </div>
114
- ))
115
- NavigationMenuViewport.displayName =
116
- NavigationMenuPrimitive.Viewport.displayName
117
-
118
- const NavigationMenuIndicator = React.forwardRef<
119
- React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
120
- React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>
121
- >(({ className, ...props }, ref) => (
122
- <NavigationMenuPrimitive.Indicator
123
- ref={ref}
124
- className={cn(
125
- 'top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden',
126
- 'data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in',
127
- className
128
- )}
129
- {...props}
130
- >
131
- <div className='relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md' />
132
- </NavigationMenuPrimitive.Indicator>
133
- ))
134
- NavigationMenuIndicator.displayName =
135
- NavigationMenuPrimitive.Indicator.displayName
136
-
137
- export {
138
- navigationMenuTriggerStyle,
139
- NavigationMenu,
140
- NavigationMenuList,
141
- NavigationMenuItem,
142
- NavigationMenuContent,
143
- NavigationMenuTrigger,
144
- NavigationMenuLink,
145
- NavigationMenuIndicator,
146
- NavigationMenuViewport,
147
- }
@@ -1,91 +0,0 @@
1
- import React from 'react'
2
- import NextImage from 'next/image'
3
-
4
- // @ts-ignore
5
- const { ImageDef, Dimensions, MediaTransform } = {}
6
- import { constrain, cn, spreadToTransform } from '../../util'
7
-
8
- const Image: React.FC<{
9
- def: ImageDef
10
- constrainTo?: Dimensions
11
- transform?: MediaTransform
12
- fullWidth?: boolean
13
- className?: string
14
- preload?: boolean
15
- }> = ({
16
- def,
17
- constrainTo,
18
- transform={},
19
- fullWidth=false,
20
- className='',
21
- preload=false
22
- }) => {
23
-
24
- const {
25
- src,
26
- alt: _alt,
27
- dim,
28
- sizes,
29
- svgFillClass: _svgFillClass,
30
- } = def
31
-
32
- const toSpread: any = {}
33
- if (fullWidth) {
34
- toSpread.style = {
35
- width: '100%',
36
- height: 'auto',
37
- ...spreadToTransform(transform)
38
- }
39
- if (constrainTo) {
40
- toSpread.style.maxWidth = constrainTo.w
41
- toSpread.style.maxHeight = constrainTo.h
42
- }
43
- }
44
- else {
45
- const resolved = constrainTo ? constrain(dim, constrainTo) : dim
46
- toSpread.width = resolved.w
47
- toSpread.height = resolved.h
48
- toSpread.style = {...spreadToTransform(transform)}
49
- }
50
-
51
- if (sizes) {
52
- toSpread.sizes = sizes
53
- }
54
-
55
- // Note: cannot be spread (a Next thing)
56
- let alt: string
57
- if (_alt) {
58
- alt = _alt
59
- }
60
- else {
61
- const tokens = src.split('/')
62
- // Something remotely meaningful
63
- alt = (tokens.length > 0) ? tokens[tokens.length - 1] : src
64
- }
65
-
66
- const svgFillClass = _svgFillClass ?? ''
67
-
68
- return (fullWidth) ? (
69
- <div className='relative flex flex-col items-center justify-center w-full'>
70
- <NextImage
71
- src={src}
72
- alt={alt}
73
- {...toSpread}
74
- priority={preload}
75
- loading={preload ? 'eager' : 'lazy'}
76
- className={cn(svgFillClass, className)}
77
- />
78
- </div>
79
- ) : (
80
- <NextImage
81
- src={src}
82
- alt={alt}
83
- {...toSpread}
84
- priority={preload}
85
- loading={preload ? 'eager' : 'lazy'}
86
- className={cn(svgFillClass, className)}
87
- />
88
- )
89
- }
90
-
91
- export default Image
@@ -1,7 +0,0 @@
1
- export { default as Image } from './image'
2
- export { default as InlineIcon } from './inline-icon'
3
- export { default as LinkElement } from './link-element'
4
- export { default as MDXLink } from './mdx-link'
5
- export { default as MediaStack } from './media-stack'
6
- export { default as NavItems } from './nav-items'
7
- export { default as YouTubeEmbed } from './youtube-embed'
@@ -1,36 +0,0 @@
1
- import React from 'react'
2
- import Image from 'next/image'
3
-
4
- interface InlineIconProps {
5
- /**
6
- * If a ReactNode is passed in, it should be set to 'w-full h-auto' so that it can be sized
7
- * according to width of parent.
8
- */
9
- icon: React.ReactNode;
10
- /** default should be handled by calling code. */
11
- size?: number;
12
- agent?: string;
13
- className?: string;
14
- }
15
-
16
- const InlineIcon: React.FC<InlineIconProps> = ({
17
- icon,
18
- size,
19
- agent,
20
- className=''
21
- }) => {
22
- if (!icon) return null
23
-
24
- const phone = agent === 'phone'
25
- if (typeof icon === 'string') {
26
- const _size = (phone && size) ? (size * .75) : size
27
- return (<Image src={icon} width={_size} height={_size} alt='icon' className={className}/>)
28
- }
29
- return (
30
- <div className={className}>
31
- {icon}
32
- </div>
33
- )
34
- }
35
-
36
- export default InlineIcon
@@ -1,109 +0,0 @@
1
- import React, { PropsWithChildren } from 'react'
2
- import Link from 'next/link'
3
-
4
- import type { LinkDef } from '../../types'
5
- import { buttonVariants } from '../button'
6
- import { cn, type VariantProps } from '../../util'
7
-
8
- /**
9
- * If this is rendered directly (and not auto generated in a Block)
10
- * and it has any children, title, icon, and iconAfter
11
- * are ignore.
12
- */
13
- const LinkElement: React.FC<
14
- PropsWithChildren &
15
- VariantProps<typeof buttonVariants> &
16
- {
17
- def: LinkDef,
18
-
19
- /**
20
- * Use to trigger other events in addition to the
21
- * link action itself. For example, to also close a drawer menu.
22
- */
23
- onClick?: () => void
24
-
25
- /** overrides def (eg, for title area)*/
26
- icon?: React.ReactNode
27
- /** overrides def */
28
- iconAfter?: boolean
29
- className?: string,
30
- }> = ({
31
- def,
32
- // DO NOT provide a default to any of the props that also appear in def!
33
- onClick,
34
- size,
35
- variant,
36
- rounded,
37
- icon,
38
- iconAfter,
39
- className = '',
40
- children,
41
- } ) => {
42
-
43
- const {
44
- href,
45
- newTab,
46
- variant: defVariant,
47
- size: defSize,
48
- rounded: defRounded,
49
- title
50
- } = def
51
-
52
- const linkProps: any = {}
53
-
54
- // As per LinkDef docs
55
- if (href.startsWith('http') || href.startsWith('mailto')) {
56
- linkProps.rel = 'noreferrer noopener'
57
- if (newTab ?? true) {
58
- linkProps.target = '_blank'
59
- }
60
- }
61
- else if (newTab) {
62
- linkProps.target = '_blank'
63
- }
64
-
65
- const toSpread = {
66
- href,
67
- ...(onClick ? { onClick } : {}),
68
- ...linkProps
69
- }
70
-
71
- const Contents: React.FC = () => {
72
-
73
- if (React.Children.count(children) > 0) return children
74
-
75
- // Props > def fields > defaults.
76
- const _icon = (icon) ? icon : (def.icon) ? def.icon : undefined
77
- const _iconAfter = (iconAfter) ? iconAfter : (def.iconAfter) ? def.iconAfter : false
78
-
79
- // 'title' is not guaranteed as it could be an icon only button / link
80
- return (<>
81
- {_icon && !_iconAfter && (<div className='pr-1'>{_icon}</div>)}
82
- {title && (<div>{title}</div>)}
83
- {_icon && _iconAfter && (<div className='pl-1'>{_icon}</div>)}
84
- </>)
85
- }
86
-
87
- return (
88
- <Link
89
- className={cn(
90
- buttonVariants({
91
- variant: variant ? variant : (defVariant ? defVariant : 'link'),
92
- size: (!defVariant || defVariant.includes('link') || variant?.includes('link')) ?
93
- 'link'
94
- :
95
- (size ? size : defSize),
96
- rounded: rounded ? rounded : (defRounded ? defRounded : 'md'),
97
- }),
98
- // This is a "label only" LinkDef. cf: footer"
99
- ((href.length > 0 || onClick) ? '' : 'pointer-events-none'),
100
- className
101
- )}
102
- {...toSpread}
103
- >
104
- <Contents />
105
- </Link>
106
- )
107
- }
108
-
109
- export default LinkElement
@@ -1,22 +0,0 @@
1
- import React, { AnchorHTMLAttributes, type PropsWithChildren } from 'react'
2
- import Link from 'next/link'
3
-
4
- const MDXLink: React.FC<AnchorHTMLAttributes<HTMLAnchorElement> > = ({
5
- href,
6
- children,
7
- ...rest
8
- }) => {
9
-
10
- // internal link
11
- if (href && (href.startsWith('/'))) {
12
- return (
13
- <Link href={href} {...rest}>
14
- {children}
15
- </Link>
16
- )
17
- }
18
-
19
- return <a target="_blank" href={href} {...rest} >{children}</a>
20
- }
21
-
22
- export default MDXLink
@@ -1,52 +0,0 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import { cn, constrain, spreadToTransform } from '../../util'
5
- import type { MediaStackDef, Dimensions } from '../../types'
6
-
7
- import Image from './image'
8
- import VideoPlayer from '../video-player'
9
-
10
- const MediaStack: React.FC<{
11
- media: MediaStackDef
12
- constrainTo?: Dimensions
13
- clx?: string
14
- }> = ({
15
- media,
16
- constrainTo: cnst = {w: 250, h: 250},
17
- clx=''
18
- }) => {
19
- const {img, video, mediaTransform} = media
20
-
21
- const transform = mediaTransform ?? {}
22
-
23
- // Order of precedence: MP4 > Image
24
- if (video) {
25
- const dim = constrain(video.dim.md, cnst)
26
- return (
27
- <VideoPlayer
28
- className={clx}
29
- sources={video.sources}
30
- width={dim.w}
31
- height={dim.h}
32
- style={{
33
- minHeight: dim.h, // prevents layout jumps
34
- ...spreadToTransform(transform)
35
- }}
36
- {...video.videoProps}
37
- />
38
- )
39
- }
40
- return img ? (
41
- <Image
42
- def={img}
43
- constrainTo={cnst}
44
- className={clx}
45
- transform={transform}
46
- />
47
- ) : (
48
- <div style={{width: cnst.w, height: cnst.h}} className={cn('bg-level-2', clx)} />
49
- )
50
- }
51
-
52
- export default MediaStack