@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
package/helpers/file.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const getFileExt = (fileName: string): string => {
|
|
2
|
+
if (!fileName) return '';
|
|
3
|
+
const parts = fileName.split('.');
|
|
4
|
+
return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : '';
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const formatFileSize = (bytes: number): string => {
|
|
8
|
+
if (bytes === 0) return '0 Bytes';
|
|
9
|
+
const k = 1024;
|
|
10
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
|
11
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
12
|
+
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const isImageFile = (fileName: string): boolean => {
|
|
16
|
+
const ext = getFileExt(fileName);
|
|
17
|
+
return ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp'].includes(ext);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const isPdfFile = (fileName: string): boolean => {
|
|
21
|
+
const ext = getFileExt(fileName);
|
|
22
|
+
return ext === 'pdf';
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const isVideoFile = (fileName: string): boolean => {
|
|
26
|
+
const ext = getFileExt(fileName);
|
|
27
|
+
return ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv', 'webm'].includes(ext);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const isAudioFile = (fileName: string): boolean => {
|
|
31
|
+
const ext = getFileExt(fileName);
|
|
32
|
+
return ['mp3', 'wav', 'ogg', 'aac', 'flac', 'wma'].includes(ext);
|
|
33
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
// Memoization helpers for markdown components
|
|
4
|
+
export const memoCompareNodes = (
|
|
5
|
+
prevProps: { children?: React.ReactNode },
|
|
6
|
+
nextProps: { children?: React.ReactNode }
|
|
7
|
+
): boolean => {
|
|
8
|
+
return prevProps.children === nextProps.children;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const memoizeMarkdownComponents = <T extends Record<string, React.ComponentType<any>>>(
|
|
12
|
+
components: T
|
|
13
|
+
): T => {
|
|
14
|
+
const memoized: any = {};
|
|
15
|
+
|
|
16
|
+
for (const key in components) {
|
|
17
|
+
if (components.hasOwnProperty(key)) {
|
|
18
|
+
memoized[key] = React.memo(components[key]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return memoized as T;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Helper to check if props are equal for memoization
|
|
26
|
+
export const arePropsEqual = <T extends Record<string, any>>(
|
|
27
|
+
prevProps: T,
|
|
28
|
+
nextProps: T,
|
|
29
|
+
keys?: string[]
|
|
30
|
+
): boolean => {
|
|
31
|
+
const keysToCheck = keys || Object.keys(prevProps);
|
|
32
|
+
|
|
33
|
+
for (const key of keysToCheck) {
|
|
34
|
+
if (prevProps[key] !== nextProps[key]) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return true;
|
|
40
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanzo/ui",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.8.2",
|
|
4
4
|
"description": "Multi-framework UI library with React, Vue, Svelte, and React Native support. Based on shadcn/ui with comprehensive framework coverage.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/",
|
|
@@ -17,6 +17,16 @@
|
|
|
17
17
|
"dist",
|
|
18
18
|
"style",
|
|
19
19
|
"bin",
|
|
20
|
+
"primitives",
|
|
21
|
+
"blocks",
|
|
22
|
+
"components",
|
|
23
|
+
"assets",
|
|
24
|
+
"frameworks",
|
|
25
|
+
"helpers",
|
|
26
|
+
"types",
|
|
27
|
+
"util",
|
|
28
|
+
"src",
|
|
29
|
+
"tailwind",
|
|
20
30
|
"README.md",
|
|
21
31
|
"LICENSE"
|
|
22
32
|
],
|
|
@@ -69,14 +79,14 @@
|
|
|
69
79
|
"require": "./dist/index.js"
|
|
70
80
|
},
|
|
71
81
|
"./assets": {
|
|
72
|
-
"types": "./
|
|
73
|
-
"import": "./
|
|
74
|
-
"require": "./
|
|
82
|
+
"types": "./assets/index.ts",
|
|
83
|
+
"import": "./assets/index.ts",
|
|
84
|
+
"require": "./assets/index.ts"
|
|
75
85
|
},
|
|
76
|
-
"./
|
|
77
|
-
"types": "./
|
|
78
|
-
"import": "./
|
|
79
|
-
"require": "./
|
|
86
|
+
"./helpers": {
|
|
87
|
+
"types": "./helpers/index.ts",
|
|
88
|
+
"import": "./helpers/index.ts",
|
|
89
|
+
"require": "./helpers/index.ts"
|
|
80
90
|
},
|
|
81
91
|
"./blocks": {
|
|
82
92
|
"types": "./dist/blocks/index.d.ts",
|
|
@@ -118,6 +128,12 @@
|
|
|
118
128
|
"import": "./dist/src/registry/index.mjs",
|
|
119
129
|
"require": "./dist/src/registry/index.js"
|
|
120
130
|
},
|
|
131
|
+
"./hooks": {
|
|
132
|
+
"types": "./dist/src/hooks/index.d.ts",
|
|
133
|
+
"import": "./dist/src/hooks/index.mjs",
|
|
134
|
+
"require": "./dist/src/hooks/index.js"
|
|
135
|
+
},
|
|
136
|
+
"./style": "./style",
|
|
121
137
|
"./style/*": "./style/*",
|
|
122
138
|
"./tailwind": {
|
|
123
139
|
"types": "./dist/tailwind/index.d.ts",
|
|
@@ -129,6 +145,11 @@
|
|
|
129
145
|
"import": "./dist/tailwind/*.mjs",
|
|
130
146
|
"require": "./dist/tailwind/*.js"
|
|
131
147
|
},
|
|
148
|
+
"./tailwind/config": {
|
|
149
|
+
"types": "./dist/tailwind/tailwind.config.hanzo-preset.d.ts",
|
|
150
|
+
"import": "./tailwind/tailwind.config.hanzo-preset.js",
|
|
151
|
+
"require": "./tailwind/tailwind.config.hanzo-preset.js"
|
|
152
|
+
},
|
|
132
153
|
"./types": {
|
|
133
154
|
"types": "./dist/types/index.d.ts",
|
|
134
155
|
"import": "./dist/types/index.mjs",
|
|
@@ -149,6 +170,11 @@
|
|
|
149
170
|
"import": "./dist/util/*.mjs",
|
|
150
171
|
"require": "./dist/util/*.js"
|
|
151
172
|
},
|
|
173
|
+
"./util/format-text": {
|
|
174
|
+
"types": "./dist/util/format-text.d.ts",
|
|
175
|
+
"import": "./dist/util/format-text.mjs",
|
|
176
|
+
"require": "./dist/util/format-text.js"
|
|
177
|
+
},
|
|
152
178
|
"./util-client": {
|
|
153
179
|
"types": "./dist/util/index-client.d.ts",
|
|
154
180
|
"import": "./dist/util/index-client.mjs",
|
|
@@ -169,6 +195,11 @@
|
|
|
169
195
|
"import": "./dist/src/mcp/index.mjs",
|
|
170
196
|
"require": "./dist/src/mcp/index.js"
|
|
171
197
|
},
|
|
198
|
+
"./theme-provider": {
|
|
199
|
+
"types": "./dist/style/theme-provider.d.ts",
|
|
200
|
+
"import": "./dist/style/theme-provider.mjs",
|
|
201
|
+
"require": "./dist/style/theme-provider.js"
|
|
202
|
+
},
|
|
172
203
|
"./react": {
|
|
173
204
|
"types": "./dist/frameworks/react/index.d.ts",
|
|
174
205
|
"import": "./dist/frameworks/react/index.mjs",
|
|
@@ -224,26 +255,33 @@
|
|
|
224
255
|
"@radix-ui/react-toggle-group": "^1.0.4",
|
|
225
256
|
"@radix-ui/react-tooltip": "^1.0.6",
|
|
226
257
|
"@radix-ui/react-use-callback-ref": "^1.1.1",
|
|
227
|
-
"@splinetool/react-spline": "^4.0.0",
|
|
228
|
-
"@splinetool/runtime": "^1.9.35",
|
|
229
258
|
"@tailwindcss/container-queries": "^0.1.1",
|
|
230
259
|
"class-variance-authority": "^0.7.1",
|
|
231
260
|
"clsx": "^2.1.1",
|
|
232
261
|
"cmdk": "^0.2.0",
|
|
233
262
|
"commander": "^12.1.0",
|
|
234
|
-
"date-fns": "^
|
|
263
|
+
"date-fns": "^3.6.0",
|
|
235
264
|
"embla-carousel-react": "8.5.1",
|
|
265
|
+
"filesize": "^11.0.2",
|
|
266
|
+
"framer-motion": "^11.15.0",
|
|
236
267
|
"input-otp": "^1.0.1",
|
|
237
268
|
"lodash.castarray": "^4.4.0",
|
|
238
269
|
"lodash.isplainobject": "^4.0.6",
|
|
239
270
|
"lodash.merge": "^4.6.2",
|
|
271
|
+
"lucide-react": "0.456.0",
|
|
240
272
|
"markdown-to-jsx": "^7.7.13",
|
|
241
273
|
"mermaid": "^11.12.0",
|
|
242
274
|
"postcss-selector-parser": "^6.0.16",
|
|
243
275
|
"qrcode.react": "^4.2.0",
|
|
244
276
|
"react-day-picker": "^8.10.1",
|
|
277
|
+
"react-dropzone": "^14.3.5",
|
|
245
278
|
"react-intersection-observer": "^9.8.2",
|
|
279
|
+
"react-markdown": "^9.0.3",
|
|
246
280
|
"react-resizable-panels": "^3.0.6",
|
|
281
|
+
"react-syntax-highlighter": "^15.6.1",
|
|
282
|
+
"rehype-katex": "^7.0.1",
|
|
283
|
+
"remark-gfm": "^4.0.0",
|
|
284
|
+
"remark-math": "^6.0.0",
|
|
247
285
|
"sonner": "^1.4.41",
|
|
248
286
|
"sql.js": "^1.13.0",
|
|
249
287
|
"svg-pan-zoom": "^3.6.2",
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as AccordionPrimitive from '@radix-ui/react-accordion';
|
|
2
|
+
import { ChevronDown } from 'lucide-react';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
import { cn } from '../src/utils';
|
|
6
|
+
|
|
7
|
+
const Accordion = AccordionPrimitive.Root;
|
|
8
|
+
|
|
9
|
+
type AccordionItemProps = React.ComponentPropsWithoutRef<
|
|
10
|
+
typeof AccordionPrimitive.Item
|
|
11
|
+
> & {
|
|
12
|
+
ref?: React.RefObject<React.ComponentRef<typeof AccordionPrimitive.Item>>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const AccordionItem = ({ className, ref, ...props }: AccordionItemProps) => (
|
|
16
|
+
<AccordionPrimitive.Item className={cn('', className)} ref={ref} {...props} />
|
|
17
|
+
);
|
|
18
|
+
AccordionItem.displayName = 'AccordionItem';
|
|
19
|
+
|
|
20
|
+
type AccordionTriggerProps = React.ComponentPropsWithoutRef<
|
|
21
|
+
typeof AccordionPrimitive.Trigger
|
|
22
|
+
> & {
|
|
23
|
+
hideArrow?: boolean;
|
|
24
|
+
ref?: React.RefObject<React.ComponentRef<typeof AccordionPrimitive.Trigger>>;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const AccordionTrigger = ({
|
|
28
|
+
className,
|
|
29
|
+
children,
|
|
30
|
+
hideArrow = false,
|
|
31
|
+
ref,
|
|
32
|
+
...props
|
|
33
|
+
}: AccordionTriggerProps) => (
|
|
34
|
+
<AccordionPrimitive.Header className="flex">
|
|
35
|
+
<AccordionPrimitive.Trigger
|
|
36
|
+
className={cn(
|
|
37
|
+
'flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180',
|
|
38
|
+
className,
|
|
39
|
+
)}
|
|
40
|
+
ref={ref}
|
|
41
|
+
{...props}
|
|
42
|
+
>
|
|
43
|
+
{children}
|
|
44
|
+
{hideArrow ? null : (
|
|
45
|
+
<ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
|
|
46
|
+
)}
|
|
47
|
+
</AccordionPrimitive.Trigger>
|
|
48
|
+
</AccordionPrimitive.Header>
|
|
49
|
+
);
|
|
50
|
+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
|
|
51
|
+
|
|
52
|
+
type AccordionContentProps = React.ComponentPropsWithoutRef<
|
|
53
|
+
typeof AccordionPrimitive.Content
|
|
54
|
+
> & {
|
|
55
|
+
ref?: React.RefObject<React.ComponentRef<typeof AccordionPrimitive.Content>>;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const AccordionContent = ({
|
|
59
|
+
className,
|
|
60
|
+
children,
|
|
61
|
+
ref,
|
|
62
|
+
...props
|
|
63
|
+
}: AccordionContentProps) => (
|
|
64
|
+
<AccordionPrimitive.Content
|
|
65
|
+
className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down w-full overflow-hidden text-sm transition-all"
|
|
66
|
+
ref={ref}
|
|
67
|
+
{...props}
|
|
68
|
+
>
|
|
69
|
+
<div className={cn('pt-0 pb-4', className)}>{children}</div>
|
|
70
|
+
</AccordionPrimitive.Content>
|
|
71
|
+
);
|
|
72
|
+
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
|
|
73
|
+
|
|
74
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
|
|
4
|
+
import { cn, type VariantProps } from '../util'
|
|
5
|
+
|
|
6
|
+
import type { ButtonDef, ButtonModalDef } from '../types'
|
|
7
|
+
import type { buttonVariants } from './button'
|
|
8
|
+
import DVC from './dialog-video-controller'
|
|
9
|
+
|
|
10
|
+
const ActionButton: React.FC<
|
|
11
|
+
VariantProps<typeof buttonVariants> &
|
|
12
|
+
{
|
|
13
|
+
def: ButtonDef
|
|
14
|
+
className?: string
|
|
15
|
+
}
|
|
16
|
+
> = ({
|
|
17
|
+
def,
|
|
18
|
+
className='',
|
|
19
|
+
...rest
|
|
20
|
+
}) => {
|
|
21
|
+
if (def.action.type === 'modal') {
|
|
22
|
+
const m = def.action.def as ButtonModalDef
|
|
23
|
+
const Modal = m.Comp
|
|
24
|
+
return (
|
|
25
|
+
<DVC>
|
|
26
|
+
<Modal
|
|
27
|
+
title={m.title}
|
|
28
|
+
byline={m.byline}
|
|
29
|
+
buttonText={def.text}
|
|
30
|
+
buttonProps={{...def.props, ...rest, className: cn((def.props?.className ?? ''), className)}}
|
|
31
|
+
action={m.action}
|
|
32
|
+
actionEnclosure={m.actionEnclosure}
|
|
33
|
+
{...m.props}
|
|
34
|
+
/>
|
|
35
|
+
</DVC>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
// no other types supported yet
|
|
39
|
+
return <></>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default ActionButton
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import { cn } from '../src/utils';
|
|
5
|
+
import { buttonVariants } from './button';
|
|
6
|
+
|
|
7
|
+
const AlertDialog = AlertDialogPrimitive.Root;
|
|
8
|
+
|
|
9
|
+
const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
10
|
+
|
|
11
|
+
const AlertDialogPortal = AlertDialogPrimitive.Portal;
|
|
12
|
+
|
|
13
|
+
type AlertDialogOverlayProps = React.ComponentPropsWithoutRef<
|
|
14
|
+
typeof AlertDialogPrimitive.Overlay
|
|
15
|
+
> & {
|
|
16
|
+
ref?: React.RefObject<
|
|
17
|
+
React.ComponentRef<typeof AlertDialogPrimitive.Overlay>
|
|
18
|
+
>;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const AlertDialogOverlay = ({
|
|
22
|
+
className,
|
|
23
|
+
children,
|
|
24
|
+
ref,
|
|
25
|
+
...props
|
|
26
|
+
}: AlertDialogOverlayProps) => (
|
|
27
|
+
<AlertDialogPrimitive.Overlay
|
|
28
|
+
className={cn(
|
|
29
|
+
'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 backdrop-blur-sm',
|
|
30
|
+
'bg-bg-dark/90',
|
|
31
|
+
className,
|
|
32
|
+
)}
|
|
33
|
+
{...props}
|
|
34
|
+
ref={ref}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
|
|
38
|
+
|
|
39
|
+
type AlertDialogContentProps = React.ComponentPropsWithoutRef<
|
|
40
|
+
typeof AlertDialogPrimitive.Content
|
|
41
|
+
> & {
|
|
42
|
+
ref?: React.RefObject<
|
|
43
|
+
React.ComponentRef<typeof AlertDialogPrimitive.Content>
|
|
44
|
+
>;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const AlertDialogContent = ({
|
|
48
|
+
className,
|
|
49
|
+
ref,
|
|
50
|
+
...props
|
|
51
|
+
}: AlertDialogContentProps) => (
|
|
52
|
+
<AlertDialogPortal>
|
|
53
|
+
<AlertDialogOverlay />
|
|
54
|
+
<AlertDialogPrimitive.Content
|
|
55
|
+
className={cn(
|
|
56
|
+
'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)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
|
|
57
|
+
className,
|
|
58
|
+
)}
|
|
59
|
+
ref={ref}
|
|
60
|
+
{...props}
|
|
61
|
+
/>
|
|
62
|
+
</AlertDialogPortal>
|
|
63
|
+
);
|
|
64
|
+
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
|
|
65
|
+
|
|
66
|
+
const AlertDialogHeader = ({
|
|
67
|
+
className,
|
|
68
|
+
...props
|
|
69
|
+
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
70
|
+
<div
|
|
71
|
+
className={cn(
|
|
72
|
+
'flex flex-col space-y-2 text-center sm:text-left',
|
|
73
|
+
className,
|
|
74
|
+
)}
|
|
75
|
+
{...props}
|
|
76
|
+
/>
|
|
77
|
+
);
|
|
78
|
+
AlertDialogHeader.displayName = 'AlertDialogHeader';
|
|
79
|
+
|
|
80
|
+
const AlertDialogFooter = ({
|
|
81
|
+
className,
|
|
82
|
+
...props
|
|
83
|
+
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
84
|
+
<div className={cn('flex', className)} {...props} />
|
|
85
|
+
);
|
|
86
|
+
AlertDialogFooter.displayName = 'AlertDialogFooter';
|
|
87
|
+
|
|
88
|
+
type AlertDialogTitleProps = React.ComponentPropsWithoutRef<
|
|
89
|
+
typeof AlertDialogPrimitive.Title
|
|
90
|
+
> & {
|
|
91
|
+
ref?: React.RefObject<React.ComponentRef<typeof AlertDialogPrimitive.Title>>;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const AlertDialogTitle = ({
|
|
95
|
+
className,
|
|
96
|
+
ref,
|
|
97
|
+
...props
|
|
98
|
+
}: AlertDialogTitleProps) => (
|
|
99
|
+
<AlertDialogPrimitive.Title
|
|
100
|
+
className={cn('text-lg font-semibold', className)}
|
|
101
|
+
ref={ref}
|
|
102
|
+
{...props}
|
|
103
|
+
/>
|
|
104
|
+
);
|
|
105
|
+
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
|
|
106
|
+
|
|
107
|
+
type AlertDialogDescriptionProps = React.ComponentPropsWithoutRef<
|
|
108
|
+
typeof AlertDialogPrimitive.Description
|
|
109
|
+
> & {
|
|
110
|
+
ref?: React.RefObject<
|
|
111
|
+
React.ComponentRef<typeof AlertDialogPrimitive.Description>
|
|
112
|
+
>;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const AlertDialogDescription = ({
|
|
116
|
+
className,
|
|
117
|
+
ref,
|
|
118
|
+
...props
|
|
119
|
+
}: AlertDialogDescriptionProps) => (
|
|
120
|
+
<AlertDialogPrimitive.Description
|
|
121
|
+
className={cn('text-text-secondary text-sm', className)}
|
|
122
|
+
ref={ref}
|
|
123
|
+
{...props}
|
|
124
|
+
/>
|
|
125
|
+
);
|
|
126
|
+
AlertDialogDescription.displayName =
|
|
127
|
+
AlertDialogPrimitive.Description.displayName;
|
|
128
|
+
|
|
129
|
+
type AlertDialogActionProps = React.ComponentPropsWithoutRef<
|
|
130
|
+
typeof AlertDialogPrimitive.Action
|
|
131
|
+
> & {
|
|
132
|
+
ref?: React.RefObject<React.ComponentRef<typeof AlertDialogPrimitive.Action>>;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const AlertDialogAction = ({
|
|
136
|
+
className,
|
|
137
|
+
ref,
|
|
138
|
+
...props
|
|
139
|
+
}: AlertDialogActionProps) => (
|
|
140
|
+
<AlertDialogPrimitive.Action
|
|
141
|
+
className={cn(
|
|
142
|
+
buttonVariants({ variant: 'default', size: 'sm' }),
|
|
143
|
+
className,
|
|
144
|
+
)}
|
|
145
|
+
ref={ref}
|
|
146
|
+
{...props}
|
|
147
|
+
/>
|
|
148
|
+
);
|
|
149
|
+
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
|
|
150
|
+
|
|
151
|
+
type AlertDialogCancelProps = React.ComponentPropsWithoutRef<
|
|
152
|
+
typeof AlertDialogPrimitive.Cancel
|
|
153
|
+
> & {
|
|
154
|
+
ref?: React.RefObject<React.ComponentRef<typeof AlertDialogPrimitive.Cancel>>;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const AlertDialogCancel = ({
|
|
158
|
+
className,
|
|
159
|
+
ref,
|
|
160
|
+
...props
|
|
161
|
+
}: AlertDialogCancelProps) => (
|
|
162
|
+
<AlertDialogPrimitive.Cancel
|
|
163
|
+
className={cn(
|
|
164
|
+
buttonVariants({ variant: 'outline', size: 'sm' }),
|
|
165
|
+
className,
|
|
166
|
+
)}
|
|
167
|
+
ref={ref}
|
|
168
|
+
{...props}
|
|
169
|
+
/>
|
|
170
|
+
);
|
|
171
|
+
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
|
|
172
|
+
|
|
173
|
+
export {
|
|
174
|
+
AlertDialog,
|
|
175
|
+
AlertDialogPortal,
|
|
176
|
+
AlertDialogOverlay,
|
|
177
|
+
AlertDialogTrigger,
|
|
178
|
+
AlertDialogContent,
|
|
179
|
+
AlertDialogHeader,
|
|
180
|
+
AlertDialogFooter,
|
|
181
|
+
AlertDialogTitle,
|
|
182
|
+
AlertDialogDescription,
|
|
183
|
+
AlertDialogAction,
|
|
184
|
+
AlertDialogCancel,
|
|
185
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import { cn } from '../src/utils';
|
|
5
|
+
|
|
6
|
+
const alertVariants = cva(
|
|
7
|
+
'[&>svg]:text-text-default relative w-full rounded-lg border p-4 [&>svg]:absolute [&>svg]:top-4 [&>svg]:left-4 [&>svg+div]:translate-y-[-3px] [&>svg~*]:pl-7',
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
default: 'bg-bg-tertiary text-text-default',
|
|
12
|
+
info: 'text-text-secondary [&>svg]:text-text-secondary bg-gray-250 border-gray-100 border-gray-200',
|
|
13
|
+
destructive:
|
|
14
|
+
'border-[#4d0408] bg-[#2d0607] text-[#ff9ea1] [&>svg]:text-[#ff9ea1]',
|
|
15
|
+
warning:
|
|
16
|
+
'border-yellow-800 bg-yellow-900 text-yellow-400 [&>svg]:text-yellow-400',
|
|
17
|
+
success:
|
|
18
|
+
'border-green-800 bg-green-900 text-green-400 [&>svg]:text-green-400',
|
|
19
|
+
download:
|
|
20
|
+
'border-gray-800 bg-gray-900 text-cyan-400 [&>svg]:text-cyan-400',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: {
|
|
24
|
+
variant: 'default',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
type AlertProps = React.HTMLAttributes<HTMLDivElement> &
|
|
30
|
+
VariantProps<typeof alertVariants> & {
|
|
31
|
+
ref?: React.RefObject<HTMLDivElement>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const Alert = ({ className, variant, ref, ...props }: AlertProps) => (
|
|
35
|
+
<div
|
|
36
|
+
className={cn(alertVariants({ variant }), className)}
|
|
37
|
+
ref={ref}
|
|
38
|
+
role="alert"
|
|
39
|
+
{...props}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
Alert.displayName = 'Alert';
|
|
43
|
+
|
|
44
|
+
type AlertTitleProps = React.HTMLAttributes<HTMLHeadingElement> & {
|
|
45
|
+
ref?: React.RefObject<HTMLParagraphElement>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const AlertTitle = ({ className, ref, ...props }: AlertTitleProps) => (
|
|
49
|
+
<h5
|
|
50
|
+
className={cn('mb-1 leading-none font-medium tracking-tight', className)}
|
|
51
|
+
ref={ref}
|
|
52
|
+
{...props}
|
|
53
|
+
/>
|
|
54
|
+
);
|
|
55
|
+
AlertTitle.displayName = 'AlertTitle';
|
|
56
|
+
|
|
57
|
+
type AlertDescriptionProps = React.HTMLAttributes<HTMLParagraphElement> & {
|
|
58
|
+
ref?: React.RefObject<HTMLParagraphElement>;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const AlertDescription = ({
|
|
62
|
+
className,
|
|
63
|
+
ref,
|
|
64
|
+
...props
|
|
65
|
+
}: AlertDescriptionProps) => (
|
|
66
|
+
<div
|
|
67
|
+
className={cn('text-sm [&_p]:leading-relaxed', className)}
|
|
68
|
+
ref={ref}
|
|
69
|
+
{...props}
|
|
70
|
+
/>
|
|
71
|
+
);
|
|
72
|
+
AlertDescription.displayName = 'AlertDescription';
|
|
73
|
+
|
|
74
|
+
export { Alert, AlertTitle, AlertDescription };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React, { PropsWithChildren } from 'react'
|
|
2
|
+
|
|
3
|
+
import { cn } from '../util'
|
|
4
|
+
|
|
5
|
+
type TypographySize = 'responsive' | 'sm' | 'base' | 'lg' | 'xl' // if t-shirt size, do *not* be responsive
|
|
6
|
+
|
|
7
|
+
const ApplyTypography: React.FC<
|
|
8
|
+
React.ComponentProps<'div'> & {
|
|
9
|
+
asTag?: 'div' | 'section' | 'nav' | 'main' | 'article',
|
|
10
|
+
size?: TypographySize
|
|
11
|
+
}
|
|
12
|
+
> = ({
|
|
13
|
+
children,
|
|
14
|
+
className='',
|
|
15
|
+
asTag='div',
|
|
16
|
+
size='responsive',
|
|
17
|
+
...rest
|
|
18
|
+
}) => {
|
|
19
|
+
|
|
20
|
+
// responsive version by default
|
|
21
|
+
let typoClasses =
|
|
22
|
+
'typography gap-3 ' +
|
|
23
|
+
'xs:typography-sm ' +
|
|
24
|
+
'sm:typography sm:gap-4 ' +
|
|
25
|
+
'lg:typography-lg lg:gap-5 ' +
|
|
26
|
+
'xl:typography-xl xl:gap-6 ' +
|
|
27
|
+
'typography-headings:font-heading ' // only effects h1-h3 (in plugin)
|
|
28
|
+
|
|
29
|
+
switch (size) {
|
|
30
|
+
case 'sm': {
|
|
31
|
+
typoClasses = 'typography typography-sm gap-3 typography-headings:font-heading typography-p:text-sm '
|
|
32
|
+
} break
|
|
33
|
+
case 'base': {
|
|
34
|
+
typoClasses = 'typography gap-4 typography-headings:font-heading '
|
|
35
|
+
} break
|
|
36
|
+
case 'lg': {
|
|
37
|
+
typoClasses = 'typography typography-lg gap-5 typography-headings:font-heading typography-p:text-lg '
|
|
38
|
+
} break
|
|
39
|
+
case 'xl': {
|
|
40
|
+
typoClasses = 'typography typography-xl gap-6 typography-headings:font-heading typography-p:text-lg '
|
|
41
|
+
} break
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const Tag = asTag
|
|
45
|
+
return (
|
|
46
|
+
<Tag {...rest} className={cn(typoClasses, className)}>
|
|
47
|
+
{children}
|
|
48
|
+
</Tag>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
type TypographySize,
|
|
54
|
+
ApplyTypography as default
|
|
55
|
+
}
|