@hanzo/ui 4.6.0 → 4.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 (290) hide show
  1. package/dist/index.d.mts +16 -0
  2. package/dist/index.d.ts +16 -0
  3. package/dist/index.js +9458 -0
  4. package/dist/index.mjs +9449 -0
  5. package/dist/lib/utils.d.mts +2 -0
  6. package/dist/lib/utils.d.ts +2 -0
  7. package/dist/lib/utils.js +47 -0
  8. package/dist/lib/utils.mjs +28 -0
  9. package/dist/src/utils.d.mts +7 -0
  10. package/dist/src/utils.d.ts +7 -0
  11. package/dist/src/utils.js +47 -0
  12. package/dist/src/utils.mjs +28 -0
  13. package/dist/tailwind/index.d.mts +2 -0
  14. package/dist/tailwind/index.d.ts +2 -0
  15. package/dist/tailwind/index.js +2048 -0
  16. package/dist/tailwind/index.mjs +2017 -0
  17. package/dist/types/index.d.mts +12 -0
  18. package/dist/types/index.d.ts +12 -0
  19. package/dist/types/index.js +79 -0
  20. package/dist/types/index.mjs +56 -0
  21. package/package.json +151 -25
  22. package/MCP-INSTRUCTIONS.md +0 -73
  23. package/README-MCP.md +0 -175
  24. package/assets/ai-icons.tsx +0 -207
  25. package/assets/crypto.tsx +0 -33
  26. package/assets/file-type-icon.tsx +0 -66
  27. package/assets/file.tsx +0 -45
  28. package/assets/general.tsx +0 -2318
  29. package/assets/hanzo-logo.svg +0 -9
  30. package/assets/hanzo-logo.tsx +0 -15
  31. package/assets/index.ts +0 -8
  32. package/assets/index.tsx +0 -4
  33. package/assets/llm-provider.tsx +0 -1094
  34. package/blocks/components/accordian-block.tsx +0 -48
  35. package/blocks/components/block-component-props.ts +0 -11
  36. package/blocks/components/bullet-cards-block.tsx +0 -46
  37. package/blocks/components/card-block/index.tsx +0 -171
  38. package/blocks/components/card-block/link-out-button.tsx +0 -20
  39. package/blocks/components/card-block/util.ts +0 -28
  40. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  41. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  42. package/blocks/components/content.tsx +0 -70
  43. package/blocks/components/cta-block.tsx +0 -115
  44. package/blocks/components/enh-heading-block.tsx +0 -204
  45. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  46. package/blocks/components/grid-block/index.tsx +0 -83
  47. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  48. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  49. package/blocks/components/group-block.tsx +0 -83
  50. package/blocks/components/heading-block.tsx +0 -88
  51. package/blocks/components/image-block.tsx +0 -111
  52. package/blocks/components/index.ts +0 -30
  53. package/blocks/components/screenful-block/content.tsx +0 -123
  54. package/blocks/components/screenful-block/index.tsx +0 -107
  55. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  56. package/blocks/components/screenful-block/video-background.tsx +0 -45
  57. package/blocks/components/space-block.tsx +0 -66
  58. package/blocks/components/video-block.tsx +0 -138
  59. package/blocks/def/accordian-block.ts +0 -14
  60. package/blocks/def/block.ts +0 -7
  61. package/blocks/def/bullet-cards-block.ts +0 -22
  62. package/blocks/def/card-block.ts +0 -22
  63. package/blocks/def/carte-blanche-block.ts +0 -21
  64. package/blocks/def/cta-block.ts +0 -19
  65. package/blocks/def/element-block.ts +0 -11
  66. package/blocks/def/enh-heading-block.ts +0 -44
  67. package/blocks/def/grid-block.ts +0 -16
  68. package/blocks/def/group-block.ts +0 -11
  69. package/blocks/def/heading-block.ts +0 -15
  70. package/blocks/def/image-block.ts +0 -31
  71. package/blocks/def/index.ts +0 -35
  72. package/blocks/def/screenful-block.ts +0 -54
  73. package/blocks/def/space-block.ts +0 -64
  74. package/blocks/def/video-block.ts +0 -9
  75. package/blocks/index.ts +0 -2
  76. package/components/index.ts +0 -56
  77. package/dist/button.d.ts +0 -1
  78. package/dist/button.js +0 -1
  79. package/dist/hooks/index.d.ts +0 -7
  80. package/dist/hooks/index.js +0 -7
  81. package/dist/hooks/use-click-away.d.ts +0 -2
  82. package/dist/hooks/use-click-away.js +0 -23
  83. package/dist/hooks/use-combined-refs.d.ts +0 -3
  84. package/dist/hooks/use-combined-refs.js +0 -18
  85. package/dist/hooks/use-copy-clipboard.d.ts +0 -9
  86. package/dist/hooks/use-copy-clipboard.js +0 -21
  87. package/dist/hooks/use-debounce.d.ts +0 -1
  88. package/dist/hooks/use-debounce.js +0 -13
  89. package/dist/hooks/use-fill-ids.d.ts +0 -8
  90. package/dist/hooks/use-fill-ids.js +0 -20
  91. package/dist/hooks/use-map.d.ts +0 -1
  92. package/dist/hooks/use-map.js +0 -20
  93. package/dist/hooks/use-measure.d.ts +0 -8
  94. package/dist/hooks/use-measure.js +0 -25
  95. package/dist/hooks/use-reverse-video-playback.d.ts +0 -1
  96. package/dist/hooks/use-reverse-video-playback.js +0 -41
  97. package/dist/hooks/use-scroll-restoration.d.ts +0 -8
  98. package/dist/hooks/use-scroll-restoration.js +0 -36
  99. package/dist/mcp/enhanced-server.d.ts +0 -29
  100. package/dist/mcp/enhanced-server.js +0 -1128
  101. package/dist/mcp/index.d.ts +0 -28
  102. package/dist/mcp/index.js +0 -436
  103. package/dist/registry/api.d.ts +0 -37
  104. package/dist/registry/api.js +0 -129
  105. package/dist/registry/index.d.ts +0 -353
  106. package/dist/registry/index.js +0 -45
  107. package/dist/utils.d.ts +0 -1
  108. package/dist/utils.js +0 -1
  109. package/environment.d.ts +0 -6
  110. package/helpers/file.ts +0 -33
  111. package/helpers/memoization.ts +0 -40
  112. package/primitives/accordion.tsx +0 -74
  113. package/primitives/action-button.tsx +0 -42
  114. package/primitives/alert-dialog.tsx +0 -185
  115. package/primitives/alert.tsx +0 -74
  116. package/primitives/apply-typography.tsx +0 -55
  117. package/primitives/aspect-ratio.tsx +0 -5
  118. package/primitives/avatar.tsx +0 -57
  119. package/primitives/background-beams.tsx +0 -142
  120. package/primitives/badge.tsx +0 -44
  121. package/primitives/breadcrumb.tsx +0 -130
  122. package/primitives/breakpoint-indicator.tsx +0 -19
  123. package/primitives/button.tsx +0 -82
  124. package/primitives/calendar.tsx +0 -72
  125. package/primitives/card.tsx +0 -97
  126. package/primitives/carousel.tsx +0 -237
  127. package/primitives/chat/chat-input-area.tsx +0 -87
  128. package/primitives/chat/chat-input.tsx +0 -71
  129. package/primitives/chat/files-preview.tsx +0 -330
  130. package/primitives/chat/index.ts +0 -6
  131. package/primitives/chat/json-form.tsx +0 -8
  132. package/primitives/chat/message-list.tsx +0 -307
  133. package/primitives/chat/message.tsx +0 -569
  134. package/primitives/chat/sqlite-preview.tsx +0 -215
  135. package/primitives/checkbox.tsx +0 -31
  136. package/primitives/collapsible.tsx +0 -9
  137. package/primitives/combobox.tsx +0 -239
  138. package/primitives/command.tsx +0 -149
  139. package/primitives/context-menu.tsx +0 -206
  140. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  141. package/primitives/dialog-video-controller.tsx +0 -38
  142. package/primitives/dialog.tsx +0 -123
  143. package/primitives/dot-pattern.tsx +0 -57
  144. package/primitives/dots-loader.tsx +0 -13
  145. package/primitives/drawer.tsx +0 -110
  146. package/primitives/dropdown-menu.tsx +0 -199
  147. package/primitives/error-message.tsx +0 -19
  148. package/primitives/file-uploader.tsx +0 -200
  149. package/primitives/form.tsx +0 -183
  150. package/primitives/hover-card.tsx +0 -28
  151. package/primitives/icons/github.tsx +0 -14
  152. package/primitives/icons/index.ts +0 -18
  153. package/primitives/icons/youtube-logo.tsx +0 -59
  154. package/primitives/index-common.ts +0 -303
  155. package/primitives/index-next.ts +0 -4
  156. package/primitives/input-otp.tsx +0 -65
  157. package/primitives/input.tsx +0 -125
  158. package/primitives/label.tsx +0 -20
  159. package/primitives/list-adaptor.ts +0 -12
  160. package/primitives/list-box.tsx +0 -74
  161. package/primitives/loading-spinner.tsx +0 -33
  162. package/primitives/markdown-preview.tsx +0 -609
  163. package/primitives/mermaid.tsx +0 -196
  164. package/primitives/navigation-menu.tsx +0 -147
  165. package/primitives/next/image.tsx +0 -90
  166. package/primitives/next/index.ts +0 -7
  167. package/primitives/next/inline-icon.tsx +0 -36
  168. package/primitives/next/link-element.tsx +0 -109
  169. package/primitives/next/mdx-link.tsx +0 -22
  170. package/primitives/next/media-stack.tsx +0 -69
  171. package/primitives/next/nav-items.tsx +0 -45
  172. package/primitives/next/youtube-embed.tsx +0 -83
  173. package/primitives/pagination.tsx +0 -117
  174. package/primitives/popover.tsx +0 -32
  175. package/primitives/pretty-json-print.tsx +0 -28
  176. package/primitives/progress.tsx +0 -26
  177. package/primitives/prompt-textarea.tsx +0 -72
  178. package/primitives/qr-code.tsx +0 -112
  179. package/primitives/radio-group.tsx +0 -42
  180. package/primitives/resizable.tsx +0 -47
  181. package/primitives/scroll-area.tsx +0 -57
  182. package/primitives/search-input.tsx +0 -66
  183. package/primitives/select.tsx +0 -122
  184. package/primitives/separator.tsx +0 -25
  185. package/primitives/sheet.tsx +0 -139
  186. package/primitives/skeleton.tsx +0 -17
  187. package/primitives/slider.tsx +0 -62
  188. package/primitives/sonner.tsx +0 -35
  189. package/primitives/step-indicator.tsx +0 -69
  190. package/primitives/stepper.tsx +0 -272
  191. package/primitives/switch.tsx +0 -26
  192. package/primitives/table.tsx +0 -105
  193. package/primitives/tabs.tsx +0 -50
  194. package/primitives/text-area.tsx +0 -26
  195. package/primitives/text-link.tsx +0 -25
  196. package/primitives/textarea.tsx +0 -61
  197. package/primitives/textfield.tsx +0 -75
  198. package/primitives/toast.tsx +0 -30
  199. package/primitives/toggle-group.tsx +0 -63
  200. package/primitives/toggle.tsx +0 -44
  201. package/primitives/tooltip.tsx +0 -47
  202. package/primitives/video-player.tsx +0 -23
  203. package/public/r/accordion.json +0 -11
  204. package/public/r/alert.json +0 -11
  205. package/public/r/avatar.json +0 -11
  206. package/public/r/badge.json +0 -11
  207. package/public/r/button.json +0 -11
  208. package/public/r/card.json +0 -11
  209. package/public/r/checkbox.json +0 -11
  210. package/public/r/default.json +0 -6
  211. package/public/r/dialog.json +0 -11
  212. package/public/r/input.json +0 -11
  213. package/public/r/label.json +0 -11
  214. package/public/r/new-york.json +0 -6
  215. package/public/r/popover.json +0 -11
  216. package/public/r/select.json +0 -11
  217. package/public/r/table.json +0 -11
  218. package/public/r/tabs.json +0 -11
  219. package/public/r/toast.json +0 -11
  220. package/registry.json +0 -184
  221. package/src/button.ts +0 -1
  222. package/src/hooks/index.ts +0 -7
  223. package/src/hooks/use-click-away.ts +0 -31
  224. package/src/hooks/use-combined-refs.ts +0 -22
  225. package/src/hooks/use-copy-clipboard.ts +0 -30
  226. package/src/hooks/use-debounce.ts +0 -17
  227. package/src/hooks/use-fill-ids.ts +0 -25
  228. package/src/hooks/use-map.ts +0 -26
  229. package/src/hooks/use-measure.ts +0 -42
  230. package/src/hooks/use-reverse-video-playback.ts +0 -43
  231. package/src/hooks/use-scroll-restoration.ts +0 -50
  232. package/src/mcp/README.md +0 -141
  233. package/src/mcp/enhanced-server.ts +0 -1208
  234. package/src/mcp/index.ts +0 -518
  235. package/src/mcp/package.json +0 -10
  236. package/src/registry/api.ts +0 -164
  237. package/src/registry/index.ts +0 -60
  238. package/src/registry/package.json +0 -10
  239. package/src/utils.ts +0 -1
  240. package/tailwind/colors.tailwind.js +0 -53
  241. package/tailwind/fontFamily.tailwind.ts +0 -7
  242. package/tailwind/fontSize.tailwind.ts +0 -13
  243. package/tailwind/index.ts +0 -7
  244. package/tailwind/safelist.tailwind.js +0 -26
  245. package/tailwind/screens.tailwind.js +0 -8
  246. package/tailwind/spacing.tailwind.js +0 -65
  247. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  248. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  249. package/tailwind/tw-font-desc.ts +0 -15
  250. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  251. package/tailwind/typo-plugin/index.d.ts +0 -9
  252. package/tailwind/typo-plugin/index.js +0 -141
  253. package/tailwind/typo-plugin/utils.js +0 -60
  254. package/tailwind/typography-test.mdx +0 -35
  255. package/tailwind/z-index.tailwind.js +0 -71
  256. package/test/test-registry.js +0 -73
  257. package/test-imports.mjs +0 -19
  258. package/tsconfig.json +0 -22
  259. package/types/animation-def.ts +0 -3
  260. package/types/breakpoints.ts +0 -11
  261. package/types/bullet-item.ts +0 -10
  262. package/types/button-def.ts +0 -39
  263. package/types/dimensions.ts +0 -8
  264. package/types/grid-def.ts +0 -56
  265. package/types/image-def.ts +0 -32
  266. package/types/index.ts +0 -29
  267. package/types/link-def.ts +0 -56
  268. package/types/media-stack-def.ts +0 -31
  269. package/types/t-shirt-size.ts +0 -5
  270. package/types/tshirt-dimensions.ts +0 -20
  271. package/types/video-def.ts +0 -25
  272. package/util/blob.ts +0 -28
  273. package/util/copy-to-clipboard.ts +0 -17
  274. package/util/create-shadow-root.ts +0 -22
  275. package/util/date.ts +0 -83
  276. package/util/debounce.ts +0 -11
  277. package/util/file.ts +0 -15
  278. package/util/format-and-abbreviate-as-currency.ts +0 -125
  279. package/util/format-text.ts +0 -33
  280. package/util/format-to-max-char.ts +0 -68
  281. package/util/index-client.ts +0 -3
  282. package/util/index.ts +0 -9
  283. package/util/number-abbreviate.ts +0 -49
  284. package/util/specifier.ts +0 -43
  285. package/util/spread-to-transform.ts +0 -24
  286. package/util/step-animation.ts +0 -90
  287. package/util/timing.ts +0 -3
  288. package/util/toasts.tsx +0 -17
  289. package/util/two-way-map.ts +0 -19
  290. package/utils.ts +0 -9
@@ -1,196 +0,0 @@
1
- import { save } from '@tauri-apps/plugin-dialog';
2
- import * as fs from '@tauri-apps/plugin-fs';
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 svgPanZoom from 'svg-pan-zoom';
8
- import { cn } from '../src/utils';
9
- import { Button } from './button';
10
- import { SyntaxHighlighterProps } from './markdown-preview';
11
- import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';
12
-
13
- export type MermaidDiagramProps = SyntaxHighlighterProps & {
14
- className?: string;
15
- isRunning?: boolean;
16
- };
17
-
18
- mermaid.initialize({
19
- startOnLoad: true,
20
- mindmap: {
21
- useWidth: 800,
22
- },
23
- theme: 'dark',
24
- fontSize: 18,
25
- darkMode: true,
26
- fontFamily: 'Inter',
27
- });
28
-
29
- const generateId = () => `mermaid-${Math.random().toString(36).slice(2)}`;
30
-
31
- const downloadBlob = async (blob: Blob, filename: string) => {
32
- const filePath = await save({
33
- title: 'Save Mermaid Diagram',
34
- filters: [
35
- {
36
- name: 'SVG Files',
37
- extensions: ['svg'],
38
- },
39
- ],
40
- defaultPath: filename,
41
- });
42
-
43
- if (filePath) {
44
- const arrayBuffer = await blob.arrayBuffer();
45
- await fs.writeFile(filePath, new Uint8Array(arrayBuffer), {
46
- baseDir: fs.BaseDirectory.Download,
47
- });
48
- toast.success('Mermaid diagram saved successfully');
49
- }
50
- };
51
-
52
- export const MermaidDiagram: FC<MermaidDiagramProps> = ({
53
- code,
54
- className,
55
- isRunning,
56
- }) => {
57
- const ref = useRef<HTMLDivElement>(null);
58
- const lastCode = useRef<string | null>(null);
59
- const [instance, setInstance] = useState<any>(null);
60
-
61
- const isComplete = !isRunning;
62
-
63
- const resetZoom = useCallback(() => {
64
- instance?.fit();
65
- instance?.center();
66
- }, [instance]);
67
-
68
- const downloadSVG = useCallback(() => {
69
- if (ref.current) {
70
- const svg = ref.current.innerHTML;
71
- const blob = new Blob([svg], { type: 'image/svg+xml' });
72
- void downloadBlob(blob, 'mermaid-diagram.svg');
73
- }
74
- }, []);
75
-
76
- const enableZoom = useCallback(() => {
77
- instance?.enablePan();
78
- instance?.enableZoom();
79
- }, [instance]);
80
-
81
- const disableZoom = useCallback(() => {
82
- instance?.disablePan();
83
- instance?.disableZoom();
84
- }, [instance]);
85
-
86
- const handleFocus = useCallback(() => {
87
- enableZoom();
88
- }, [enableZoom]);
89
-
90
- const handleBlur = useCallback(() => {
91
- disableZoom();
92
- }, [disableZoom]);
93
-
94
- const handleClick = useCallback(() => {
95
- if (ref.current) {
96
- ref.current.focus();
97
- }
98
- }, []);
99
-
100
- useEffect(() => {
101
- if (!isComplete || !ref.current || !code) return;
102
-
103
- if (lastCode.current === code) return;
104
-
105
- void (async () => {
106
- try {
107
- const id = generateId();
108
- const { svg } = await mermaid.render(id, code);
109
-
110
- if (ref.current) {
111
- ref.current.innerHTML = svg;
112
-
113
- const svgElement = ref.current.querySelector('svg');
114
- if (svgElement) {
115
- svgElement.setAttribute('height', '100%');
116
- svgElement.setAttribute('width', '100%');
117
- svgElement.style.height = '100%';
118
- svgElement.style.width = '100%';
119
- svgElement.style.position = 'absolute';
120
- svgElement.style.top = '0';
121
- svgElement.style.left = '0';
122
-
123
- const panZoomInstance = svgPanZoom(svgElement);
124
- panZoomInstance.fit();
125
- panZoomInstance.center();
126
- panZoomInstance.zoomAtPoint(1, { x: 0, y: 0 });
127
- panZoomInstance.disablePan();
128
- panZoomInstance.disableZoom();
129
- setInstance(panZoomInstance);
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,90 +0,0 @@
1
- import React from 'react'
2
- import NextImage from 'next/image'
3
-
4
- import type { ImageDef, Dimensions, MediaTransform } from '../../types'
5
- import { constrain, cn, spreadToTransform } from '../../util'
6
-
7
- const Image: React.FC<{
8
- def: ImageDef
9
- constrainTo?: Dimensions
10
- transform?: MediaTransform
11
- fullWidth?: boolean
12
- className?: string
13
- preload?: boolean
14
- }> = ({
15
- def,
16
- constrainTo,
17
- transform={},
18
- fullWidth=false,
19
- className='',
20
- preload=false
21
- }) => {
22
-
23
- const {
24
- src,
25
- alt: _alt,
26
- dim,
27
- sizes,
28
- svgFillClass: _svgFillClass,
29
- } = def
30
-
31
- const toSpread: any = {}
32
- if (fullWidth) {
33
- toSpread.style = {
34
- width: '100%',
35
- height: 'auto',
36
- ...spreadToTransform(transform)
37
- }
38
- if (constrainTo) {
39
- toSpread.style.maxWidth = constrainTo.w
40
- toSpread.style.maxHeight = constrainTo.h
41
- }
42
- }
43
- else {
44
- const resolved = constrainTo ? constrain(dim, constrainTo) : dim
45
- toSpread.width = resolved.w
46
- toSpread.height = resolved.h
47
- toSpread.style = {...spreadToTransform(transform)}
48
- }
49
-
50
- if (sizes) {
51
- toSpread.sizes = sizes
52
- }
53
-
54
- // Note: cannot be spread (a Next thing)
55
- let alt: string
56
- if (_alt) {
57
- alt = _alt
58
- }
59
- else {
60
- const tokens = src.split('/')
61
- // Something remotely meaningful
62
- alt = (tokens.length > 0) ? tokens[tokens.length - 1] : src
63
- }
64
-
65
- const svgFillClass = _svgFillClass ?? ''
66
-
67
- return (fullWidth) ? (
68
- <div className='relative flex flex-col items-center justify-center w-full'>
69
- <NextImage
70
- src={src}
71
- alt={alt}
72
- {...toSpread}
73
- priority={preload}
74
- loading={preload ? 'eager' : 'lazy'}
75
- className={cn(svgFillClass, className)}
76
- />
77
- </div>
78
- ) : (
79
- <NextImage
80
- src={src}
81
- alt={alt}
82
- {...toSpread}
83
- priority={preload}
84
- loading={preload ? 'eager' : 'lazy'}
85
- className={cn(svgFillClass, className)}
86
- />
87
- )
88
- }
89
-
90
- 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
-
5
- const InlineIcon: React.FC<{
6
- /**
7
- * If a ReactNode is passed in, it should be set to 'w-full h-auto' so that it can be sized
8
- * according to width of parent.
9
- */
10
- icon: React.ReactNode
11
- /** default should be handled by calling code. */
12
- size?: number
13
-
14
- agent?: string,
15
- className?: string
16
- }> = ({
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,69 +0,0 @@
1
- 'use client'
2
- import React from 'react'
3
-
4
- import Spline from '@splinetool/react-spline'
5
-
6
- import { cn, constrain, spreadToTransform } from '../../util'
7
- import type { MediaStackDef, Dimensions } from '../../types'
8
-
9
- import Image from './image'
10
- import VideoPlayer from '../video-player'
11
-
12
- const MediaStack: React.FC<{
13
- media: MediaStackDef
14
- constrainTo?: Dimensions
15
- clx?: string
16
- }> = ({
17
- media,
18
- constrainTo: cnst = {w: 250, h: 250},
19
- clx=''
20
- }) => {
21
- const {img, video, animation, mediaTransform} = media
22
-
23
- const transform = mediaTransform ?? {}
24
-
25
- // Order of precedence: 3D > MP4 > Image
26
- if (animation) {
27
- return (
28
- <Spline
29
- scene={animation}
30
- className={cn(clx, 'pointer-events-none')}
31
- data-vaul-no-drag
32
- style={{
33
- // // !aspect-[12/10]
34
- width: (6/5 * (typeof cnst.h === 'number' ? cnst.h as number : parseInt(cnst.h as string)) ),
35
- height: cnst.h,
36
- ...spreadToTransform(transform)
37
- }}
38
- />
39
- )
40
- }
41
- if (video) {
42
- const dim = constrain(video.dim.md, cnst)
43
- return (
44
- <VideoPlayer
45
- className={clx}
46
- sources={video.sources}
47
- width={dim.w}
48
- height={dim.h}
49
- style={{
50
- minHeight: dim.h, // prevents layout jumps
51
- ...spreadToTransform(transform)
52
- }}
53
- {...video.videoProps}
54
- />
55
- )
56
- }
57
- return img ? (
58
- <Image
59
- def={img}
60
- constrainTo={cnst}
61
- className={clx}
62
- transform={transform}
63
- />
64
- ) : (
65
- <div style={{width: cnst.w, height: cnst.h}} className={cn('bg-level-2', clx)} />
66
- )
67
- }
68
-
69
- export default MediaStack