@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.
- package/assets/ai-icons.tsx +207 -0
- package/assets/crypto.tsx +33 -0
- package/assets/file-type-icon.tsx +66 -0
- package/assets/file.tsx +45 -0
- package/assets/general.tsx +2318 -0
- package/assets/hanzo-logo.svg +9 -0
- package/assets/hanzo-logo.tsx +17 -0
- package/assets/index.ts +122 -0
- package/assets/index.tsx +4 -0
- package/assets/llm-provider.tsx +1094 -0
- package/blocks/auth/index.ts +6 -0
- package/blocks/auth/login-2fa.tsx +165 -0
- package/blocks/auth/login-basic.tsx +94 -0
- package/blocks/auth/login-social.tsx +148 -0
- package/blocks/auth/magic-link.tsx +129 -0
- package/blocks/auth/password-reset.tsx +97 -0
- package/blocks/auth/signup.tsx +157 -0
- package/blocks/components/accordian-block.tsx +48 -0
- package/blocks/components/block-component-props.ts +11 -0
- package/blocks/components/bullet-cards-block.tsx +46 -0
- package/blocks/components/card-block/index.tsx +171 -0
- package/blocks/components/card-block/link-out-button.tsx +20 -0
- package/blocks/components/card-block/util.ts +28 -0
- package/blocks/components/carte-blanche-block/index.tsx +127 -0
- package/blocks/components/carte-blanche-block/variant-content-left.tsx +49 -0
- package/blocks/components/content.tsx +70 -0
- package/blocks/components/cta-block.tsx +115 -0
- package/blocks/components/enh-heading-block.tsx +204 -0
- package/blocks/components/grid-block/grid-block-mutator.ts +12 -0
- package/blocks/components/grid-block/index.tsx +83 -0
- package/blocks/components/grid-block/mutator-registry.ts +10 -0
- package/blocks/components/grid-block/table-borders.mutator.ts +47 -0
- package/blocks/components/group-block.tsx +83 -0
- package/blocks/components/heading-block.tsx +88 -0
- package/blocks/components/image-block.tsx +111 -0
- package/blocks/components/index.ts +30 -0
- package/blocks/components/screenful-block/content.tsx +123 -0
- package/blocks/components/screenful-block/index.tsx +107 -0
- package/blocks/components/screenful-block/poster-background.tsx +34 -0
- package/blocks/components/screenful-block/video-background.tsx +45 -0
- package/blocks/components/space-block.tsx +66 -0
- package/blocks/components/video-block.tsx +138 -0
- package/blocks/data-display/activity-feed.tsx +242 -0
- package/blocks/data-display/data-table.tsx +235 -0
- package/blocks/data-display/stats-grid.tsx +194 -0
- package/blocks/def/accordian-block.ts +14 -0
- package/blocks/def/block.ts +7 -0
- package/blocks/def/bullet-cards-block.ts +22 -0
- package/blocks/def/card-block.ts +22 -0
- package/blocks/def/carte-blanche-block.ts +21 -0
- package/blocks/def/cta-block.ts +19 -0
- package/blocks/def/element-block.ts +11 -0
- package/blocks/def/enh-heading-block.ts +44 -0
- package/blocks/def/grid-block.ts +16 -0
- package/blocks/def/group-block.ts +11 -0
- package/blocks/def/heading-block.ts +15 -0
- package/blocks/def/image-block.ts +31 -0
- package/blocks/def/index.ts +35 -0
- package/blocks/def/screenful-block.ts +54 -0
- package/blocks/def/space-block.ts +64 -0
- package/blocks/def/video-block.ts +9 -0
- package/blocks/ecommerce/checkout.tsx +242 -0
- package/blocks/ecommerce/index.ts +7 -0
- package/blocks/ecommerce/product-detail.tsx +257 -0
- package/blocks/ecommerce/product-grid.tsx +148 -0
- package/blocks/ecommerce/shopping-cart.tsx +181 -0
- package/blocks/index.ts +2 -0
- package/blocks/marketing/cta-section.tsx +207 -0
- package/blocks/marketing/faq.tsx +159 -0
- package/blocks/marketing/features-grid.tsx +156 -0
- package/blocks/marketing/hero-section.tsx +192 -0
- package/blocks/marketing/index.ts +6 -0
- package/blocks/marketing/pricing-table.tsx +121 -0
- package/blocks/marketing/testimonials.tsx +196 -0
- package/components/index.ts +9 -0
- package/dist/index.js +1407 -1514
- package/dist/index.mjs +1363 -1472
- package/dist/tailwind/index.js +3 -1
- package/dist/tailwind/index.mjs +3 -1
- package/dist/util/format-text.js +51 -0
- package/dist/util/format-text.mjs +32 -0
- package/dist/util/index.js +384 -0
- package/dist/util/index.mjs +363 -0
- package/frameworks/core/index.ts +6 -0
- package/frameworks/core/utils/index.ts +64 -0
- package/frameworks/react/components/button.tsx +26 -0
- package/frameworks/react/components/index.ts +5 -0
- package/frameworks/react/hooks/index.ts +5 -0
- package/frameworks/react/index.ts +9 -0
- package/frameworks/react/package.json +8 -0
- package/frameworks/react/utils/index.ts +2 -0
- package/frameworks/react-native/index.ts +9 -0
- package/frameworks/react-native/package.json +8 -0
- package/frameworks/registry.json +371 -0
- package/frameworks/setup.sh +69 -0
- package/frameworks/svelte/index.ts +9 -0
- package/frameworks/svelte/package.json +8 -0
- package/frameworks/tracker.json +1854 -0
- package/frameworks/vue/index.ts +9 -0
- package/frameworks/vue/package.json +8 -0
- package/helpers/file.ts +33 -0
- package/helpers/memoization.ts +40 -0
- package/package.json +49 -11
- package/primitives/accordion.tsx +74 -0
- package/primitives/action-button.tsx +42 -0
- package/primitives/alert-dialog.tsx +185 -0
- package/primitives/alert.tsx +74 -0
- package/primitives/apply-typography.tsx +55 -0
- package/primitives/aspect-ratio.tsx +5 -0
- package/primitives/avatar.tsx +57 -0
- package/primitives/background-beams.tsx +142 -0
- package/primitives/badge.tsx +45 -0
- package/primitives/breadcrumb.tsx +130 -0
- package/primitives/breakpoint-indicator.tsx +19 -0
- package/primitives/button.tsx +72 -0
- package/primitives/calendar.tsx +72 -0
- package/primitives/card.tsx +97 -0
- package/primitives/carousel.tsx +238 -0
- package/primitives/chat/chat-input-area.tsx +88 -0
- package/primitives/chat/chat-input.tsx +71 -0
- package/primitives/chat/files-preview.tsx +331 -0
- package/primitives/chat/index.ts +6 -0
- package/primitives/chat/json-form.tsx +8 -0
- package/primitives/chat/message-list.tsx +308 -0
- package/primitives/chat/message.tsx +569 -0
- package/primitives/chat/sqlite-preview.tsx +215 -0
- package/primitives/checkbox.tsx +32 -0
- package/primitives/collapsible.tsx +9 -0
- package/primitives/combobox.tsx +239 -0
- package/primitives/command.tsx +151 -0
- package/primitives/context-menu.tsx +206 -0
- package/primitives/copy-to-clipboard-icon.tsx +60 -0
- package/primitives/dialog-video-controller.tsx +38 -0
- package/primitives/dialog.tsx +128 -0
- package/primitives/dot-pattern.tsx +57 -0
- package/primitives/dots-loader.tsx +13 -0
- package/primitives/drawer.tsx +113 -0
- package/primitives/dropdown-menu.tsx +199 -0
- package/primitives/error-message.tsx +19 -0
- package/primitives/file-uploader.tsx +202 -0
- package/primitives/form.tsx +183 -0
- package/primitives/hover-card.tsx +28 -0
- package/primitives/icons/github.tsx +14 -0
- package/primitives/icons/index.ts +18 -0
- package/primitives/icons/youtube-logo.tsx +59 -0
- package/primitives/index-common.ts +304 -0
- package/primitives/index-next.ts +4 -0
- package/primitives/input-otp.tsx +65 -0
- package/primitives/input.tsx +126 -0
- package/primitives/label.tsx +21 -0
- package/primitives/list-adaptor.ts +12 -0
- package/primitives/list-box.tsx +74 -0
- package/primitives/loading-spinner.tsx +33 -0
- package/primitives/markdown-preview.tsx +612 -0
- package/primitives/mermaid.tsx +191 -0
- package/primitives/navigation-menu.tsx +147 -0
- package/primitives/next/image.tsx +91 -0
- package/primitives/next/index.ts +7 -0
- package/primitives/next/inline-icon.tsx +36 -0
- package/primitives/next/link-element.tsx +109 -0
- package/primitives/next/mdx-link.tsx +22 -0
- package/primitives/next/media-stack.tsx +52 -0
- package/primitives/next/nav-items.tsx +45 -0
- package/primitives/next/youtube-embed.tsx +83 -0
- package/primitives/pagination.tsx +117 -0
- package/primitives/popover.tsx +34 -0
- package/primitives/pretty-json-print.tsx +28 -0
- package/primitives/progress.tsx +27 -0
- package/primitives/prompt-textarea.tsx +72 -0
- package/primitives/qr-code.tsx +112 -0
- package/primitives/radio-group.tsx +42 -0
- package/primitives/resizable.tsx +47 -0
- package/primitives/scroll-area.tsx +57 -0
- package/primitives/search-input.tsx +66 -0
- package/primitives/select.tsx +122 -0
- package/primitives/separator.tsx +26 -0
- package/primitives/sheet.tsx +139 -0
- package/primitives/skeleton.tsx +18 -0
- package/primitives/slider.tsx +63 -0
- package/primitives/sonner.tsx +35 -0
- package/primitives/step-indicator.tsx +69 -0
- package/primitives/stepper.tsx +272 -0
- package/primitives/switch.tsx +27 -0
- package/primitives/table.tsx +105 -0
- package/primitives/tabs.tsx +50 -0
- package/primitives/text-area.tsx +26 -0
- package/primitives/text-link.tsx +25 -0
- package/primitives/textarea.tsx +62 -0
- package/primitives/textfield.tsx +76 -0
- package/primitives/toast.tsx +30 -0
- package/primitives/toggle-group.tsx +63 -0
- package/primitives/toggle.tsx +44 -0
- package/primitives/tooltip.tsx +47 -0
- package/primitives/video-player.tsx +23 -0
- package/src/button.ts +1 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/use-click-away.ts +31 -0
- package/src/hooks/use-combined-refs.ts +22 -0
- package/src/hooks/use-copy-clipboard.ts +30 -0
- package/src/hooks/use-debounce.ts +17 -0
- package/src/hooks/use-fill-ids.ts +25 -0
- package/src/hooks/use-map.ts +26 -0
- package/src/hooks/use-measure.ts +42 -0
- package/src/hooks/use-reverse-video-playback.ts +43 -0
- package/src/hooks/use-scroll-restoration.ts +50 -0
- package/src/index-lean.ts +87 -0
- package/src/index.ts +54 -0
- package/src/mcp/README.md +141 -0
- package/src/mcp/enhanced-server.ts +1208 -0
- package/src/mcp/index.ts +518 -0
- package/src/mcp/package.json +10 -0
- package/src/registry/api.ts +164 -0
- package/src/registry/index.ts +60 -0
- package/src/registry/package.json +10 -0
- package/src/utils.ts +19 -0
- package/tailwind/colors.tailwind.js +53 -0
- package/tailwind/fontFamily.tailwind.ts +7 -0
- package/tailwind/fontSize.tailwind.ts +13 -0
- package/tailwind/index.ts +7 -0
- package/tailwind/safelist.tailwind.js +26 -0
- package/tailwind/screens.tailwind.js +8 -0
- package/tailwind/spacing.tailwind.js +65 -0
- package/tailwind/tailwind.config.hanzo-preset.d.ts +5 -0
- package/tailwind/tailwind.config.hanzo-preset.js +915 -0
- package/tailwind/tw-font-desc.ts +15 -0
- package/tailwind/typo-plugin/get-plugin-styles.js +679 -0
- package/tailwind/typo-plugin/index.d.ts +9 -0
- package/tailwind/typo-plugin/index.js +141 -0
- package/tailwind/typo-plugin/utils.js +60 -0
- package/tailwind/typography-test.mdx +35 -0
- package/tailwind/z-index.tailwind.js +71 -0
- package/types/animation-def.ts +3 -0
- package/types/breakpoints.ts +11 -0
- package/types/bullet-item.ts +10 -0
- package/types/button-def.ts +39 -0
- package/types/dimensions.ts +8 -0
- package/types/grid-def.ts +56 -0
- package/types/image-def.ts +32 -0
- package/types/index.ts +30 -0
- package/types/link-def.ts +56 -0
- package/types/media-stack-def.ts +31 -0
- package/types/t-shirt-size.ts +5 -0
- package/types/tshirt-dimensions.ts +20 -0
- package/types/video-def.ts +25 -0
- package/util/blob.ts +33 -0
- package/util/copy-to-clipboard.ts +17 -0
- package/util/create-shadow-root.ts +22 -0
- package/util/date.ts +84 -0
- package/util/debounce.ts +11 -0
- package/util/file.ts +15 -0
- package/util/format-and-abbreviate-as-currency.ts +125 -0
- package/util/format-text.ts +34 -0
- package/util/format-to-max-char.ts +68 -0
- package/util/index-client.ts +3 -0
- package/util/index.ts +112 -0
- package/util/number-abbreviate.ts +49 -0
- package/util/specifier.ts +43 -0
- package/util/spread-to-transform.ts +25 -0
- package/util/step-animation.ts +90 -0
- package/util/timing.ts +3 -0
- package/util/toasts.tsx +17 -0
- package/util/two-way-map.ts +19 -0
- package/dist/index.d.mts +0 -16
- package/dist/index.d.ts +0 -16
- package/dist/lib/utils.d.mts +0 -2
- package/dist/lib/utils.d.ts +0 -2
- package/dist/src/utils.d.mts +0 -7
- package/dist/src/utils.d.ts +0 -7
- package/dist/tailwind/index.d.mts +0 -2
- package/dist/tailwind/index.d.ts +0 -2
- package/dist/types/index.d.mts +0 -12
- 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
|
+
};
|