@hanzo/ui 4.7.0 → 4.8.2

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 (272) hide show
  1. package/assets/ai-icons.tsx +207 -0
  2. package/assets/crypto.tsx +33 -0
  3. package/assets/file-type-icon.tsx +66 -0
  4. package/assets/file.tsx +45 -0
  5. package/assets/general.tsx +2318 -0
  6. package/assets/hanzo-logo.svg +9 -0
  7. package/assets/hanzo-logo.tsx +17 -0
  8. package/assets/index.ts +122 -0
  9. package/assets/index.tsx +4 -0
  10. package/assets/llm-provider.tsx +1094 -0
  11. package/blocks/auth/index.ts +6 -0
  12. package/blocks/auth/login-2fa.tsx +165 -0
  13. package/blocks/auth/login-basic.tsx +94 -0
  14. package/blocks/auth/login-social.tsx +148 -0
  15. package/blocks/auth/magic-link.tsx +129 -0
  16. package/blocks/auth/password-reset.tsx +97 -0
  17. package/blocks/auth/signup.tsx +157 -0
  18. package/blocks/components/accordian-block.tsx +48 -0
  19. package/blocks/components/block-component-props.ts +11 -0
  20. package/blocks/components/bullet-cards-block.tsx +46 -0
  21. package/blocks/components/card-block/index.tsx +171 -0
  22. package/blocks/components/card-block/link-out-button.tsx +20 -0
  23. package/blocks/components/card-block/util.ts +28 -0
  24. package/blocks/components/carte-blanche-block/index.tsx +127 -0
  25. package/blocks/components/carte-blanche-block/variant-content-left.tsx +49 -0
  26. package/blocks/components/content.tsx +70 -0
  27. package/blocks/components/cta-block.tsx +115 -0
  28. package/blocks/components/enh-heading-block.tsx +204 -0
  29. package/blocks/components/grid-block/grid-block-mutator.ts +12 -0
  30. package/blocks/components/grid-block/index.tsx +83 -0
  31. package/blocks/components/grid-block/mutator-registry.ts +10 -0
  32. package/blocks/components/grid-block/table-borders.mutator.ts +47 -0
  33. package/blocks/components/group-block.tsx +83 -0
  34. package/blocks/components/heading-block.tsx +88 -0
  35. package/blocks/components/image-block.tsx +111 -0
  36. package/blocks/components/index.ts +30 -0
  37. package/blocks/components/screenful-block/content.tsx +123 -0
  38. package/blocks/components/screenful-block/index.tsx +107 -0
  39. package/blocks/components/screenful-block/poster-background.tsx +34 -0
  40. package/blocks/components/screenful-block/video-background.tsx +45 -0
  41. package/blocks/components/space-block.tsx +66 -0
  42. package/blocks/components/video-block.tsx +138 -0
  43. package/blocks/data-display/activity-feed.tsx +242 -0
  44. package/blocks/data-display/data-table.tsx +235 -0
  45. package/blocks/data-display/stats-grid.tsx +194 -0
  46. package/blocks/def/accordian-block.ts +14 -0
  47. package/blocks/def/block.ts +7 -0
  48. package/blocks/def/bullet-cards-block.ts +22 -0
  49. package/blocks/def/card-block.ts +22 -0
  50. package/blocks/def/carte-blanche-block.ts +21 -0
  51. package/blocks/def/cta-block.ts +19 -0
  52. package/blocks/def/element-block.ts +11 -0
  53. package/blocks/def/enh-heading-block.ts +44 -0
  54. package/blocks/def/grid-block.ts +16 -0
  55. package/blocks/def/group-block.ts +11 -0
  56. package/blocks/def/heading-block.ts +15 -0
  57. package/blocks/def/image-block.ts +31 -0
  58. package/blocks/def/index.ts +35 -0
  59. package/blocks/def/screenful-block.ts +54 -0
  60. package/blocks/def/space-block.ts +64 -0
  61. package/blocks/def/video-block.ts +9 -0
  62. package/blocks/ecommerce/checkout.tsx +242 -0
  63. package/blocks/ecommerce/index.ts +7 -0
  64. package/blocks/ecommerce/product-detail.tsx +257 -0
  65. package/blocks/ecommerce/product-grid.tsx +148 -0
  66. package/blocks/ecommerce/shopping-cart.tsx +181 -0
  67. package/blocks/index.ts +2 -0
  68. package/blocks/marketing/cta-section.tsx +207 -0
  69. package/blocks/marketing/faq.tsx +159 -0
  70. package/blocks/marketing/features-grid.tsx +156 -0
  71. package/blocks/marketing/hero-section.tsx +192 -0
  72. package/blocks/marketing/index.ts +6 -0
  73. package/blocks/marketing/pricing-table.tsx +121 -0
  74. package/blocks/marketing/testimonials.tsx +196 -0
  75. package/components/index.ts +9 -0
  76. package/dist/index.js +1407 -1514
  77. package/dist/index.mjs +1363 -1472
  78. package/dist/tailwind/index.js +3 -1
  79. package/dist/tailwind/index.mjs +3 -1
  80. package/dist/util/format-text.js +51 -0
  81. package/dist/util/format-text.mjs +32 -0
  82. package/dist/util/index.js +384 -0
  83. package/dist/util/index.mjs +363 -0
  84. package/frameworks/core/index.ts +6 -0
  85. package/frameworks/core/utils/index.ts +64 -0
  86. package/frameworks/react/components/button.tsx +26 -0
  87. package/frameworks/react/components/index.ts +5 -0
  88. package/frameworks/react/hooks/index.ts +5 -0
  89. package/frameworks/react/index.ts +9 -0
  90. package/frameworks/react/package.json +8 -0
  91. package/frameworks/react/utils/index.ts +2 -0
  92. package/frameworks/react-native/index.ts +9 -0
  93. package/frameworks/react-native/package.json +8 -0
  94. package/frameworks/registry.json +371 -0
  95. package/frameworks/setup.sh +69 -0
  96. package/frameworks/svelte/index.ts +9 -0
  97. package/frameworks/svelte/package.json +8 -0
  98. package/frameworks/tracker.json +1854 -0
  99. package/frameworks/vue/index.ts +9 -0
  100. package/frameworks/vue/package.json +8 -0
  101. package/helpers/file.ts +33 -0
  102. package/helpers/memoization.ts +40 -0
  103. package/package.json +49 -11
  104. package/primitives/accordion.tsx +74 -0
  105. package/primitives/action-button.tsx +42 -0
  106. package/primitives/alert-dialog.tsx +185 -0
  107. package/primitives/alert.tsx +74 -0
  108. package/primitives/apply-typography.tsx +55 -0
  109. package/primitives/aspect-ratio.tsx +5 -0
  110. package/primitives/avatar.tsx +57 -0
  111. package/primitives/background-beams.tsx +142 -0
  112. package/primitives/badge.tsx +45 -0
  113. package/primitives/breadcrumb.tsx +130 -0
  114. package/primitives/breakpoint-indicator.tsx +19 -0
  115. package/primitives/button.tsx +72 -0
  116. package/primitives/calendar.tsx +72 -0
  117. package/primitives/card.tsx +97 -0
  118. package/primitives/carousel.tsx +238 -0
  119. package/primitives/chat/chat-input-area.tsx +88 -0
  120. package/primitives/chat/chat-input.tsx +71 -0
  121. package/primitives/chat/files-preview.tsx +331 -0
  122. package/primitives/chat/index.ts +6 -0
  123. package/primitives/chat/json-form.tsx +8 -0
  124. package/primitives/chat/message-list.tsx +308 -0
  125. package/primitives/chat/message.tsx +569 -0
  126. package/primitives/chat/sqlite-preview.tsx +215 -0
  127. package/primitives/checkbox.tsx +32 -0
  128. package/primitives/collapsible.tsx +9 -0
  129. package/primitives/combobox.tsx +239 -0
  130. package/primitives/command.tsx +151 -0
  131. package/primitives/context-menu.tsx +206 -0
  132. package/primitives/copy-to-clipboard-icon.tsx +60 -0
  133. package/primitives/dialog-video-controller.tsx +38 -0
  134. package/primitives/dialog.tsx +128 -0
  135. package/primitives/dot-pattern.tsx +57 -0
  136. package/primitives/dots-loader.tsx +13 -0
  137. package/primitives/drawer.tsx +113 -0
  138. package/primitives/dropdown-menu.tsx +199 -0
  139. package/primitives/error-message.tsx +19 -0
  140. package/primitives/file-uploader.tsx +202 -0
  141. package/primitives/form.tsx +183 -0
  142. package/primitives/hover-card.tsx +28 -0
  143. package/primitives/icons/github.tsx +14 -0
  144. package/primitives/icons/index.ts +18 -0
  145. package/primitives/icons/youtube-logo.tsx +59 -0
  146. package/primitives/index-common.ts +304 -0
  147. package/primitives/index-next.ts +4 -0
  148. package/primitives/input-otp.tsx +65 -0
  149. package/primitives/input.tsx +126 -0
  150. package/primitives/label.tsx +21 -0
  151. package/primitives/list-adaptor.ts +12 -0
  152. package/primitives/list-box.tsx +74 -0
  153. package/primitives/loading-spinner.tsx +33 -0
  154. package/primitives/markdown-preview.tsx +612 -0
  155. package/primitives/mermaid.tsx +191 -0
  156. package/primitives/navigation-menu.tsx +147 -0
  157. package/primitives/next/image.tsx +91 -0
  158. package/primitives/next/index.ts +7 -0
  159. package/primitives/next/inline-icon.tsx +36 -0
  160. package/primitives/next/link-element.tsx +109 -0
  161. package/primitives/next/mdx-link.tsx +22 -0
  162. package/primitives/next/media-stack.tsx +52 -0
  163. package/primitives/next/nav-items.tsx +45 -0
  164. package/primitives/next/youtube-embed.tsx +83 -0
  165. package/primitives/pagination.tsx +117 -0
  166. package/primitives/popover.tsx +34 -0
  167. package/primitives/pretty-json-print.tsx +28 -0
  168. package/primitives/progress.tsx +27 -0
  169. package/primitives/prompt-textarea.tsx +72 -0
  170. package/primitives/qr-code.tsx +112 -0
  171. package/primitives/radio-group.tsx +42 -0
  172. package/primitives/resizable.tsx +47 -0
  173. package/primitives/scroll-area.tsx +57 -0
  174. package/primitives/search-input.tsx +66 -0
  175. package/primitives/select.tsx +122 -0
  176. package/primitives/separator.tsx +26 -0
  177. package/primitives/sheet.tsx +139 -0
  178. package/primitives/skeleton.tsx +18 -0
  179. package/primitives/slider.tsx +63 -0
  180. package/primitives/sonner.tsx +35 -0
  181. package/primitives/step-indicator.tsx +69 -0
  182. package/primitives/stepper.tsx +272 -0
  183. package/primitives/switch.tsx +27 -0
  184. package/primitives/table.tsx +105 -0
  185. package/primitives/tabs.tsx +50 -0
  186. package/primitives/text-area.tsx +26 -0
  187. package/primitives/text-link.tsx +25 -0
  188. package/primitives/textarea.tsx +62 -0
  189. package/primitives/textfield.tsx +76 -0
  190. package/primitives/toast.tsx +30 -0
  191. package/primitives/toggle-group.tsx +63 -0
  192. package/primitives/toggle.tsx +44 -0
  193. package/primitives/tooltip.tsx +47 -0
  194. package/primitives/video-player.tsx +23 -0
  195. package/src/button.ts +1 -0
  196. package/src/hooks/index.ts +7 -0
  197. package/src/hooks/use-click-away.ts +31 -0
  198. package/src/hooks/use-combined-refs.ts +22 -0
  199. package/src/hooks/use-copy-clipboard.ts +30 -0
  200. package/src/hooks/use-debounce.ts +17 -0
  201. package/src/hooks/use-fill-ids.ts +25 -0
  202. package/src/hooks/use-map.ts +26 -0
  203. package/src/hooks/use-measure.ts +42 -0
  204. package/src/hooks/use-reverse-video-playback.ts +43 -0
  205. package/src/hooks/use-scroll-restoration.ts +50 -0
  206. package/src/index-lean.ts +87 -0
  207. package/src/index.ts +54 -0
  208. package/src/mcp/README.md +141 -0
  209. package/src/mcp/enhanced-server.ts +1208 -0
  210. package/src/mcp/index.ts +518 -0
  211. package/src/mcp/package.json +10 -0
  212. package/src/registry/api.ts +164 -0
  213. package/src/registry/index.ts +60 -0
  214. package/src/registry/package.json +10 -0
  215. package/src/utils.ts +19 -0
  216. package/tailwind/colors.tailwind.js +53 -0
  217. package/tailwind/fontFamily.tailwind.ts +7 -0
  218. package/tailwind/fontSize.tailwind.ts +13 -0
  219. package/tailwind/index.ts +7 -0
  220. package/tailwind/safelist.tailwind.js +26 -0
  221. package/tailwind/screens.tailwind.js +8 -0
  222. package/tailwind/spacing.tailwind.js +65 -0
  223. package/tailwind/tailwind.config.hanzo-preset.d.ts +5 -0
  224. package/tailwind/tailwind.config.hanzo-preset.js +915 -0
  225. package/tailwind/tw-font-desc.ts +15 -0
  226. package/tailwind/typo-plugin/get-plugin-styles.js +679 -0
  227. package/tailwind/typo-plugin/index.d.ts +9 -0
  228. package/tailwind/typo-plugin/index.js +141 -0
  229. package/tailwind/typo-plugin/utils.js +60 -0
  230. package/tailwind/typography-test.mdx +35 -0
  231. package/tailwind/z-index.tailwind.js +71 -0
  232. package/types/animation-def.ts +3 -0
  233. package/types/breakpoints.ts +11 -0
  234. package/types/bullet-item.ts +10 -0
  235. package/types/button-def.ts +39 -0
  236. package/types/dimensions.ts +8 -0
  237. package/types/grid-def.ts +56 -0
  238. package/types/image-def.ts +32 -0
  239. package/types/index.ts +30 -0
  240. package/types/link-def.ts +56 -0
  241. package/types/media-stack-def.ts +31 -0
  242. package/types/t-shirt-size.ts +5 -0
  243. package/types/tshirt-dimensions.ts +20 -0
  244. package/types/video-def.ts +25 -0
  245. package/util/blob.ts +33 -0
  246. package/util/copy-to-clipboard.ts +17 -0
  247. package/util/create-shadow-root.ts +22 -0
  248. package/util/date.ts +84 -0
  249. package/util/debounce.ts +11 -0
  250. package/util/file.ts +15 -0
  251. package/util/format-and-abbreviate-as-currency.ts +125 -0
  252. package/util/format-text.ts +34 -0
  253. package/util/format-to-max-char.ts +68 -0
  254. package/util/index-client.ts +3 -0
  255. package/util/index.ts +112 -0
  256. package/util/number-abbreviate.ts +49 -0
  257. package/util/specifier.ts +43 -0
  258. package/util/spread-to-transform.ts +25 -0
  259. package/util/step-animation.ts +90 -0
  260. package/util/timing.ts +3 -0
  261. package/util/toasts.tsx +17 -0
  262. package/util/two-way-map.ts +19 -0
  263. package/dist/index.d.mts +0 -16
  264. package/dist/index.d.ts +0 -16
  265. package/dist/lib/utils.d.mts +0 -2
  266. package/dist/lib/utils.d.ts +0 -2
  267. package/dist/src/utils.d.mts +0 -7
  268. package/dist/src/utils.d.ts +0 -7
  269. package/dist/tailwind/index.d.mts +0 -2
  270. package/dist/tailwind/index.d.ts +0 -2
  271. package/dist/types/index.d.mts +0 -12
  272. package/dist/types/index.d.ts +0 -12
@@ -0,0 +1,206 @@
1
+ import * as ContextMenuPrimitive from '@radix-ui/react-context-menu';
2
+ import { Check, ChevronRight, Circle } from 'lucide-react';
3
+ import React from 'react';
4
+
5
+ import { cn } from '../src/utils';
6
+
7
+ const ContextMenu = ContextMenuPrimitive.Root;
8
+
9
+ const ContextMenuTrigger = ContextMenuPrimitive.Trigger;
10
+
11
+ const ContextMenuGroup = ContextMenuPrimitive.Group;
12
+
13
+ const ContextMenuPortal = ContextMenuPrimitive.Portal;
14
+
15
+ const ContextMenuSub = ContextMenuPrimitive.Sub;
16
+
17
+ const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
18
+
19
+ type ContextMenuSubTriggerProps = React.ComponentPropsWithoutRef<
20
+ typeof ContextMenuPrimitive.SubTrigger
21
+ > & {
22
+ inset?: boolean;
23
+ ref?: React.RefObject<
24
+ React.ComponentRef<typeof ContextMenuPrimitive.SubTrigger>
25
+ >;
26
+ };
27
+
28
+ const ContextMenuSubTrigger = ({
29
+ className,
30
+ inset,
31
+ children,
32
+ ref,
33
+ ...props
34
+ }: ContextMenuSubTriggerProps) => (
35
+ <ContextMenuPrimitive.SubTrigger
36
+ className={cn(
37
+ 'focus:bg-accent data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-xs px-2 py-1.5 text-sm outline-hidden select-none focus:text-white',
38
+ inset && 'pl-8',
39
+ className,
40
+ )}
41
+ ref={ref}
42
+ {...props}
43
+ >
44
+ {children}
45
+ <ChevronRight className="ml-auto h-4 w-4" />
46
+ </ContextMenuPrimitive.SubTrigger>
47
+ );
48
+ ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
49
+
50
+ const ContextMenuSubContent = ({
51
+ className,
52
+ ...props
53
+ }: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) => (
54
+ <ContextMenuPrimitive.SubContent
55
+ className={cn(
56
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-gray-300 p-1 text-white shadow-md',
57
+ className,
58
+ )}
59
+ {...props}
60
+ />
61
+ );
62
+ ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
63
+
64
+ const ContextMenuContent = ({
65
+ className,
66
+ ...props
67
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Content>) => (
68
+ <ContextMenuPrimitive.Portal>
69
+ <ContextMenuPrimitive.Content
70
+ className={cn(
71
+ 'animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-600 bg-gray-300 p-1 text-gray-50 shadow-md',
72
+ className,
73
+ )}
74
+ {...props}
75
+ />
76
+ </ContextMenuPrimitive.Portal>
77
+ );
78
+ ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
79
+
80
+ const ContextMenuItem = ({
81
+ className,
82
+ inset,
83
+ ...props
84
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {
85
+ inset?: boolean;
86
+ }) => (
87
+ <ContextMenuPrimitive.Item
88
+ className={cn(
89
+ 'relative flex cursor-default items-center rounded-xs px-2 py-1.5 text-sm outline-hidden select-none focus:bg-gray-200 focus:text-white data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
90
+ inset && 'pl-8',
91
+ className,
92
+ )}
93
+ {...props}
94
+ />
95
+ );
96
+ ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
97
+
98
+ const ContextMenuCheckboxItem = ({
99
+ className,
100
+ children,
101
+ checked,
102
+ ...props
103
+ }: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) => (
104
+ <ContextMenuPrimitive.CheckboxItem
105
+ checked={checked}
106
+ className={cn(
107
+ 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
108
+ className,
109
+ )}
110
+ {...props}
111
+ >
112
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
113
+ <ContextMenuPrimitive.ItemIndicator>
114
+ <Check className="h-4 w-4" />
115
+ </ContextMenuPrimitive.ItemIndicator>
116
+ </span>
117
+ {children}
118
+ </ContextMenuPrimitive.CheckboxItem>
119
+ );
120
+ ContextMenuCheckboxItem.displayName =
121
+ ContextMenuPrimitive.CheckboxItem.displayName;
122
+
123
+ const ContextMenuRadioItem = ({
124
+ className,
125
+ children,
126
+ ...props
127
+ }: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem>) => (
128
+ <ContextMenuPrimitive.RadioItem
129
+ className={cn(
130
+ 'focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center rounded-xs py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
131
+ className,
132
+ )}
133
+ {...props}
134
+ >
135
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
136
+ <ContextMenuPrimitive.ItemIndicator>
137
+ <Circle className="h-2 w-2 fill-current" />
138
+ </ContextMenuPrimitive.ItemIndicator>
139
+ </span>
140
+ {children}
141
+ </ContextMenuPrimitive.RadioItem>
142
+ );
143
+ ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
144
+
145
+ const ContextMenuLabel = ({
146
+ className,
147
+ inset,
148
+ ...props
149
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {
150
+ inset?: boolean;
151
+ }) => (
152
+ <ContextMenuPrimitive.Label
153
+ className={cn(
154
+ 'text-text-default px-2 py-1.5 text-sm font-semibold',
155
+ inset && 'pl-8',
156
+ className,
157
+ )}
158
+ {...props}
159
+ />
160
+ );
161
+ ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
162
+
163
+ const ContextMenuSeparator = ({
164
+ className,
165
+ ...props
166
+ }: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) => (
167
+ <ContextMenuPrimitive.Separator
168
+ className={cn('bg-border -mx-1 my-1 h-px', className)}
169
+ {...props}
170
+ />
171
+ );
172
+ ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;
173
+
174
+ const ContextMenuShortcut = ({
175
+ className,
176
+ ...props
177
+ }: React.HTMLAttributes<HTMLSpanElement>) => {
178
+ return (
179
+ <span
180
+ className={cn(
181
+ 'text-text-secondary ml-auto text-xs tracking-widest',
182
+ className,
183
+ )}
184
+ {...props}
185
+ />
186
+ );
187
+ };
188
+ ContextMenuShortcut.displayName = 'ContextMenuShortcut';
189
+
190
+ export {
191
+ ContextMenu,
192
+ ContextMenuTrigger,
193
+ ContextMenuContent,
194
+ ContextMenuItem,
195
+ ContextMenuCheckboxItem,
196
+ ContextMenuRadioItem,
197
+ ContextMenuLabel,
198
+ ContextMenuSeparator,
199
+ ContextMenuShortcut,
200
+ ContextMenuGroup,
201
+ ContextMenuPortal,
202
+ ContextMenuSub,
203
+ ContextMenuSubContent,
204
+ ContextMenuSubTrigger,
205
+ ContextMenuRadioGroup,
206
+ };
@@ -0,0 +1,60 @@
1
+ import { CheckCircle2, CopyIcon } from 'lucide-react';
2
+ import React, { cloneElement, type ReactElement } from 'react';
3
+
4
+ import { useCopyClipboard } from '../src/hooks';
5
+ import { cn } from '../src/utils';
6
+ import { Button } from './button';
7
+
8
+ type CopyToClipboardIconProps = {
9
+ string?: string;
10
+ children?: ReactElement<{
11
+ className?: string;
12
+ onClick?: () => void;
13
+ }>;
14
+ className?: string;
15
+ onCopyClipboard?: () => void;
16
+ asChild?: boolean;
17
+ };
18
+
19
+ const CopyToClipboardIcon = ({
20
+ string,
21
+ children,
22
+ className,
23
+ onCopyClipboard,
24
+ asChild = false,
25
+ }: CopyToClipboardIconProps) => {
26
+ const { isCopied, onCopy } = useCopyClipboard({
27
+ string,
28
+ onCopyClipboard,
29
+ });
30
+
31
+ const ClipboardIcon = isCopied ? CheckCircle2 : CopyIcon;
32
+
33
+ if (asChild && children) {
34
+ return cloneElement(children, {
35
+ onClick: onCopy,
36
+ className: cn(children.props?.className, className),
37
+ });
38
+ }
39
+
40
+ return (
41
+ <Button
42
+ className={cn(
43
+ 'text-text-secondary hover:bg-bg-tertiary bg-bg-tertiary flex h-8 w-8 gap-2 rounded-lg text-xs font-normal transition-colors hover:text-white',
44
+ className,
45
+ )}
46
+ disabled={!string}
47
+ onClick={onCopy}
48
+ size={'icon'}
49
+ type="button"
50
+ variant="tertiary"
51
+ >
52
+ <ClipboardIcon
53
+ className={cn('h-3.5 w-3.5', isCopied && 'text-green-500')}
54
+ />
55
+ {children}
56
+ </Button>
57
+ );
58
+ };
59
+
60
+ export { CopyToClipboardIcon, useCopyClipboard };
@@ -0,0 +1,38 @@
1
+ 'use client'
2
+
3
+ import React, { PropsWithChildren, useState } from 'react'
4
+
5
+ const DialogVideoController: React.FC<PropsWithChildren> = ({
6
+ children,
7
+ }) => {
8
+
9
+ const [open, setOpen] = useState<boolean>(false)
10
+
11
+ const onOpenChange = (b: boolean) => {
12
+ setOpen(b)
13
+ const videos = document.getElementsByTagName('video')
14
+ const videoArray = Array.from(videos)
15
+ videoArray.forEach((v) => {
16
+ if (b) {
17
+ v.pause()
18
+ }
19
+ else {
20
+ v.play()
21
+ }
22
+ })
23
+ }
24
+
25
+ // https://stackoverflow.com/a/49052730/11645689
26
+ const updatedChildren = React.Children.map(
27
+ children,
28
+ (child) => (React.cloneElement(
29
+ child as any, { open, onOpenChange }
30
+ ))
31
+ )
32
+
33
+ return (<>
34
+ {updatedChildren}
35
+ </>)
36
+ }
37
+
38
+ export default DialogVideoController
@@ -0,0 +1,128 @@
1
+ 'use client';
2
+
3
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
4
+ import { X } from 'lucide-react';
5
+ import React from 'react';
6
+
7
+ import { cn } from '../src/utils';
8
+
9
+ const Dialog = DialogPrimitive.Root;
10
+
11
+ const DialogTrigger = DialogPrimitive.Trigger;
12
+
13
+ const DialogPortal = DialogPrimitive.Portal;
14
+
15
+ const DialogClose = DialogPrimitive.Close;
16
+
17
+ const DialogOverlay = ({
18
+ className,
19
+ ...props
20
+ }: React.ComponentProps<typeof DialogPrimitive.Overlay>) => (
21
+ <DialogPrimitive.Overlay
22
+ className={cn(
23
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50',
24
+ 'bg-bg-dark/90',
25
+ className,
26
+ )}
27
+ {...props}
28
+ />
29
+ );
30
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
31
+
32
+ const DialogContent = ({
33
+ className,
34
+ children,
35
+ showCloseButton = false,
36
+ ...props
37
+ }: React.ComponentProps<typeof DialogPrimitive.Content> & {
38
+ showCloseButton?: boolean;
39
+ }) => (
40
+ <DialogPortal>
41
+ <DialogOverlay />
42
+ <DialogPrimitive.Content
43
+ className={cn(
44
+ 'bg-bg-default data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 border-divider fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:rounded-lg md:w-full',
45
+ className,
46
+ )}
47
+ {...props}
48
+ >
49
+ {children}
50
+ <DialogPrimitive.Close
51
+ className={cn(
52
+ 'ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-text-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none',
53
+ !showCloseButton && 'hidden',
54
+ )}
55
+ >
56
+ <X className="h-4 w-4" />
57
+ <span className="sr-only">Close</span>
58
+ </DialogPrimitive.Close>
59
+ </DialogPrimitive.Content>
60
+ </DialogPortal>
61
+ );
62
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
63
+
64
+ const DialogHeader = ({
65
+ className,
66
+ ...props
67
+ }: React.HTMLAttributes<HTMLDivElement>) => (
68
+ <div
69
+ className={cn(
70
+ 'flex flex-col space-y-1.5 text-center sm:text-left',
71
+ className,
72
+ )}
73
+ {...props}
74
+ />
75
+ );
76
+ DialogHeader.displayName = 'DialogHeader';
77
+
78
+ const DialogFooter = ({
79
+ className,
80
+ ...props
81
+ }: React.HTMLAttributes<HTMLDivElement>) => (
82
+ <div
83
+ className={cn(
84
+ 'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',
85
+ className,
86
+ )}
87
+ {...props}
88
+ />
89
+ );
90
+ DialogFooter.displayName = 'DialogFooter';
91
+
92
+ const DialogTitle = ({
93
+ className,
94
+ ...props
95
+ }: React.ComponentProps<typeof DialogPrimitive.Title>) => (
96
+ <DialogPrimitive.Title
97
+ className={cn(
98
+ 'text-lg leading-none font-semibold tracking-tight',
99
+ className,
100
+ )}
101
+ {...props}
102
+ />
103
+ );
104
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
105
+
106
+ const DialogDescription = ({
107
+ className,
108
+ ...props
109
+ }: React.ComponentProps<typeof DialogPrimitive.Description>) => (
110
+ <DialogPrimitive.Description
111
+ className={cn('text-text-secondary text-sm', className)}
112
+ {...props}
113
+ />
114
+ );
115
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
116
+
117
+ export {
118
+ Dialog,
119
+ DialogPortal,
120
+ DialogOverlay,
121
+ DialogClose,
122
+ DialogTrigger,
123
+ DialogContent,
124
+ DialogHeader,
125
+ DialogFooter,
126
+ DialogTitle,
127
+ DialogDescription,
128
+ };
@@ -0,0 +1,57 @@
1
+ import { useId } from 'react';
2
+
3
+ import { cn } from '../src/utils';
4
+
5
+ interface DotPatternProps {
6
+ width?: any;
7
+ height?: any;
8
+ x?: any;
9
+ y?: any;
10
+ cx?: any;
11
+ cy?: any;
12
+ cr?: any;
13
+ className?: string;
14
+ [key: string]: any;
15
+ }
16
+
17
+ function DotPattern({
18
+ width = 16,
19
+ height = 16,
20
+ x = 0,
21
+ y = 0,
22
+ cx = 1,
23
+ cy = 1,
24
+ cr = 1,
25
+ className,
26
+ ...props
27
+ }: DotPatternProps) {
28
+ const id = useId();
29
+
30
+ return (
31
+ <svg
32
+ aria-hidden="true"
33
+ className={cn(
34
+ 'pointer-events-none absolute inset-0 h-full w-full fill-neutral-400/80',
35
+ className,
36
+ )}
37
+ {...props}
38
+ >
39
+ <defs>
40
+ <pattern
41
+ height={height}
42
+ id={id}
43
+ patternContentUnits="userSpaceOnUse"
44
+ patternUnits="userSpaceOnUse"
45
+ width={width}
46
+ x={x}
47
+ y={y}
48
+ >
49
+ <circle cx={cx} cy={cy} id="pattern-circle" r={cr} />
50
+ </pattern>
51
+ </defs>
52
+ <rect fill={`url(#${id})`} height="100%" strokeWidth={0} width="100%" />
53
+ </svg>
54
+ );
55
+ }
56
+
57
+ export { DotPattern };
@@ -0,0 +1,13 @@
1
+ const DotsLoader = ({ className }: { className?: string }) => {
2
+ return (
3
+ <div className={className}>
4
+ <div className="flex h-4 space-x-1.5">
5
+ <div className="h-2 w-2 animate-[loaderDots_0.6s_0s_infinite_alternate] rounded-full bg-slate-100" />
6
+ <div className="h-2 w-2 animate-[loaderDots_0.6s_0.3s_infinite_alternate] rounded-full bg-slate-100" />
7
+ <div className="h-2 w-2 animate-[loaderDots_0.6s_0.6s_infinite_alternate] rounded-full bg-slate-100" />
8
+ </div>
9
+ </div>
10
+ );
11
+ };
12
+
13
+ export { DotsLoader };
@@ -0,0 +1,113 @@
1
+ import React from 'react';
2
+ import { Drawer as DrawerPrimitive } from 'vaul';
3
+
4
+ import { cn } from '../src/utils';
5
+
6
+ const Drawer = ({
7
+ shouldScaleBackground = false,
8
+ ...props
9
+ }: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
10
+ <DrawerPrimitive.Root
11
+ shouldScaleBackground={shouldScaleBackground}
12
+ {...props}
13
+ />
14
+ );
15
+ Drawer.displayName = 'Drawer';
16
+
17
+ const DrawerTrigger = DrawerPrimitive.Trigger;
18
+
19
+ const DrawerPortal = DrawerPrimitive.Portal;
20
+
21
+ const DrawerClose = DrawerPrimitive.Close;
22
+
23
+ const DrawerHandle = DrawerPrimitive.Handle;
24
+
25
+ const DrawerOverlay = ({
26
+ className,
27
+ ...props
28
+ }: React.ComponentProps<typeof DrawerPrimitive.Overlay>) => (
29
+ <DrawerPrimitive.Overlay
30
+ className={cn('fixed inset-0 z-50 bg-black/70', className)}
31
+ {...props}
32
+ />
33
+ );
34
+ DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
35
+
36
+ const DrawerContent = ({
37
+ className,
38
+ children,
39
+ ...props
40
+ }: React.ComponentProps<typeof DrawerPrimitive.Content>) => (
41
+ <DrawerPortal>
42
+ <DrawerOverlay />
43
+ <DrawerPrimitive.Content
44
+ className={cn(
45
+ 'fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-gray-500 px-6 pb-6 focus:outline-hidden',
46
+ className,
47
+ )}
48
+ {...props}
49
+ >
50
+ <div className="mx-auto mt-4 h-2 w-[100px] rounded-full bg-gray-300" />
51
+ {children}
52
+ </DrawerPrimitive.Content>
53
+ </DrawerPortal>
54
+ );
55
+ DrawerContent.displayName = 'DrawerContent';
56
+
57
+ const DrawerHeader = ({
58
+ className,
59
+ ...props
60
+ }: React.HTMLAttributes<HTMLDivElement>) => (
61
+ <div className={cn('pt-5 pb-0', className)} {...props} />
62
+ );
63
+ DrawerHeader.displayName = 'DrawerHeader';
64
+
65
+ const DrawerFooter = ({
66
+ className,
67
+ ...props
68
+ }: React.HTMLAttributes<HTMLDivElement>) => (
69
+ <div
70
+ className={cn('mt-auto flex flex-col gap-2 p-4', className)}
71
+ {...props}
72
+ />
73
+ );
74
+ DrawerFooter.displayName = 'DrawerFooter';
75
+
76
+ const DrawerTitle = ({
77
+ className,
78
+ ...props
79
+ }: React.ComponentProps<typeof DrawerPrimitive.Title>) => (
80
+ <DrawerPrimitive.Title
81
+ className={cn(
82
+ 'text-lg leading-none font-semibold tracking-tight',
83
+ className,
84
+ )}
85
+ {...props}
86
+ />
87
+ );
88
+ DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
89
+
90
+ const DrawerDescription = ({
91
+ className,
92
+ ...props
93
+ }: React.ComponentProps<typeof DrawerPrimitive.Description>) => (
94
+ <DrawerPrimitive.Description
95
+ className={cn('text-text-secondary text-sm', className)}
96
+ {...props}
97
+ />
98
+ );
99
+ DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
100
+
101
+ export {
102
+ Drawer,
103
+ DrawerPortal,
104
+ DrawerOverlay,
105
+ DrawerTrigger,
106
+ DrawerClose,
107
+ DrawerHandle,
108
+ DrawerContent,
109
+ DrawerHeader,
110
+ DrawerFooter,
111
+ DrawerTitle,
112
+ DrawerDescription,
113
+ };