@hanzo/ui 4.7.0 → 4.8.3

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 (278) 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 +1408 -1514
  77. package/dist/index.mjs +1364 -1472
  78. package/dist/lib/utils.js +1 -0
  79. package/dist/lib/utils.mjs +1 -0
  80. package/dist/src/utils.js +1 -0
  81. package/dist/src/utils.mjs +1 -0
  82. package/dist/tailwind/index.js +4 -1
  83. package/dist/tailwind/index.mjs +4 -1
  84. package/dist/types/index.js +1 -0
  85. package/dist/types/index.mjs +2 -0
  86. package/dist/util/format-text.js +52 -0
  87. package/dist/util/format-text.mjs +33 -0
  88. package/dist/util/index.js +385 -0
  89. package/dist/util/index.mjs +364 -0
  90. package/frameworks/core/index.ts +6 -0
  91. package/frameworks/core/utils/index.ts +64 -0
  92. package/frameworks/react/components/button.tsx +26 -0
  93. package/frameworks/react/components/index.ts +5 -0
  94. package/frameworks/react/hooks/index.ts +5 -0
  95. package/frameworks/react/index.ts +9 -0
  96. package/frameworks/react/package.json +8 -0
  97. package/frameworks/react/utils/index.ts +2 -0
  98. package/frameworks/react-native/index.ts +9 -0
  99. package/frameworks/react-native/package.json +8 -0
  100. package/frameworks/registry.json +371 -0
  101. package/frameworks/setup.sh +69 -0
  102. package/frameworks/svelte/index.ts +9 -0
  103. package/frameworks/svelte/package.json +8 -0
  104. package/frameworks/tracker.json +1854 -0
  105. package/frameworks/vue/index.ts +9 -0
  106. package/frameworks/vue/package.json +8 -0
  107. package/helpers/file.ts +33 -0
  108. package/helpers/memoization.ts +40 -0
  109. package/package.json +49 -11
  110. package/primitives/accordion.tsx +74 -0
  111. package/primitives/action-button.tsx +42 -0
  112. package/primitives/alert-dialog.tsx +185 -0
  113. package/primitives/alert.tsx +74 -0
  114. package/primitives/apply-typography.tsx +55 -0
  115. package/primitives/aspect-ratio.tsx +5 -0
  116. package/primitives/avatar.tsx +57 -0
  117. package/primitives/background-beams.tsx +142 -0
  118. package/primitives/badge.tsx +45 -0
  119. package/primitives/breadcrumb.tsx +130 -0
  120. package/primitives/breakpoint-indicator.tsx +19 -0
  121. package/primitives/button.tsx +72 -0
  122. package/primitives/calendar.tsx +72 -0
  123. package/primitives/card.tsx +97 -0
  124. package/primitives/carousel.tsx +238 -0
  125. package/primitives/chat/chat-input-area.tsx +88 -0
  126. package/primitives/chat/chat-input.tsx +71 -0
  127. package/primitives/chat/files-preview.tsx +331 -0
  128. package/primitives/chat/index.ts +6 -0
  129. package/primitives/chat/json-form.tsx +8 -0
  130. package/primitives/chat/message-list.tsx +308 -0
  131. package/primitives/chat/message.tsx +569 -0
  132. package/primitives/chat/sqlite-preview.tsx +215 -0
  133. package/primitives/checkbox.tsx +32 -0
  134. package/primitives/collapsible.tsx +9 -0
  135. package/primitives/combobox.tsx +239 -0
  136. package/primitives/command.tsx +151 -0
  137. package/primitives/context-menu.tsx +206 -0
  138. package/primitives/copy-to-clipboard-icon.tsx +60 -0
  139. package/primitives/dialog-video-controller.tsx +38 -0
  140. package/primitives/dialog.tsx +128 -0
  141. package/primitives/dot-pattern.tsx +57 -0
  142. package/primitives/dots-loader.tsx +13 -0
  143. package/primitives/drawer.tsx +113 -0
  144. package/primitives/dropdown-menu.tsx +199 -0
  145. package/primitives/error-message.tsx +19 -0
  146. package/primitives/file-uploader.tsx +202 -0
  147. package/primitives/form.tsx +185 -0
  148. package/primitives/hover-card.tsx +28 -0
  149. package/primitives/icons/github.tsx +14 -0
  150. package/primitives/icons/index.ts +18 -0
  151. package/primitives/icons/youtube-logo.tsx +59 -0
  152. package/primitives/index-common.ts +304 -0
  153. package/primitives/index-next.ts +4 -0
  154. package/primitives/input-otp.tsx +65 -0
  155. package/primitives/input.tsx +128 -0
  156. package/primitives/label.tsx +21 -0
  157. package/primitives/list-adaptor.ts +12 -0
  158. package/primitives/list-box.tsx +74 -0
  159. package/primitives/loading-spinner.tsx +33 -0
  160. package/primitives/markdown-preview.tsx +612 -0
  161. package/primitives/mermaid.tsx +191 -0
  162. package/primitives/navigation-menu.tsx +147 -0
  163. package/primitives/next/image.tsx +91 -0
  164. package/primitives/next/index.ts +7 -0
  165. package/primitives/next/inline-icon.tsx +36 -0
  166. package/primitives/next/link-element.tsx +109 -0
  167. package/primitives/next/mdx-link.tsx +22 -0
  168. package/primitives/next/media-stack.tsx +52 -0
  169. package/primitives/next/nav-items.tsx +45 -0
  170. package/primitives/next/youtube-embed.tsx +83 -0
  171. package/primitives/pagination.tsx +117 -0
  172. package/primitives/popover.tsx +34 -0
  173. package/primitives/pretty-json-print.tsx +28 -0
  174. package/primitives/progress.tsx +27 -0
  175. package/primitives/prompt-textarea.tsx +72 -0
  176. package/primitives/qr-code.tsx +112 -0
  177. package/primitives/radio-group.tsx +42 -0
  178. package/primitives/resizable.tsx +47 -0
  179. package/primitives/scroll-area.tsx +57 -0
  180. package/primitives/search-input.tsx +66 -0
  181. package/primitives/select.tsx +122 -0
  182. package/primitives/separator.tsx +26 -0
  183. package/primitives/sheet.tsx +139 -0
  184. package/primitives/skeleton.tsx +18 -0
  185. package/primitives/slider.tsx +63 -0
  186. package/primitives/sonner.tsx +35 -0
  187. package/primitives/step-indicator.tsx +69 -0
  188. package/primitives/stepper.tsx +272 -0
  189. package/primitives/switch.tsx +27 -0
  190. package/primitives/table.tsx +105 -0
  191. package/primitives/tabs.tsx +50 -0
  192. package/primitives/text-area.tsx +26 -0
  193. package/primitives/text-link.tsx +25 -0
  194. package/primitives/textarea.tsx +64 -0
  195. package/primitives/textfield.tsx +78 -0
  196. package/primitives/toast.tsx +30 -0
  197. package/primitives/toggle-group.tsx +63 -0
  198. package/primitives/toggle.tsx +44 -0
  199. package/primitives/tooltip.tsx +47 -0
  200. package/primitives/video-player.tsx +23 -0
  201. package/src/button.ts +1 -0
  202. package/src/hooks/index.ts +7 -0
  203. package/src/hooks/use-click-away.ts +31 -0
  204. package/src/hooks/use-combined-refs.ts +22 -0
  205. package/src/hooks/use-copy-clipboard.ts +30 -0
  206. package/src/hooks/use-debounce.ts +17 -0
  207. package/src/hooks/use-fill-ids.ts +25 -0
  208. package/src/hooks/use-map.ts +26 -0
  209. package/src/hooks/use-measure.ts +42 -0
  210. package/src/hooks/use-reverse-video-playback.ts +43 -0
  211. package/src/hooks/use-scroll-restoration.ts +50 -0
  212. package/src/index-lean.ts +87 -0
  213. package/src/index.ts +54 -0
  214. package/src/mcp/README.md +141 -0
  215. package/src/mcp/enhanced-server.ts +1208 -0
  216. package/src/mcp/index.ts +518 -0
  217. package/src/mcp/package.json +10 -0
  218. package/src/registry/api.ts +164 -0
  219. package/src/registry/index.ts +60 -0
  220. package/src/registry/package.json +10 -0
  221. package/src/utils.ts +19 -0
  222. package/tailwind/colors.tailwind.js +53 -0
  223. package/tailwind/fontFamily.tailwind.ts +7 -0
  224. package/tailwind/fontSize.tailwind.ts +13 -0
  225. package/tailwind/index.ts +7 -0
  226. package/tailwind/safelist.tailwind.js +26 -0
  227. package/tailwind/screens.tailwind.js +8 -0
  228. package/tailwind/spacing.tailwind.js +65 -0
  229. package/tailwind/tailwind.config.hanzo-preset.d.ts +5 -0
  230. package/tailwind/tailwind.config.hanzo-preset.js +915 -0
  231. package/tailwind/tw-font-desc.ts +15 -0
  232. package/tailwind/typo-plugin/get-plugin-styles.js +679 -0
  233. package/tailwind/typo-plugin/index.d.ts +9 -0
  234. package/tailwind/typo-plugin/index.js +141 -0
  235. package/tailwind/typo-plugin/utils.js +60 -0
  236. package/tailwind/typography-test.mdx +35 -0
  237. package/tailwind/z-index.tailwind.js +71 -0
  238. package/types/animation-def.ts +3 -0
  239. package/types/breakpoints.ts +11 -0
  240. package/types/bullet-item.ts +10 -0
  241. package/types/button-def.ts +39 -0
  242. package/types/dimensions.ts +8 -0
  243. package/types/grid-def.ts +56 -0
  244. package/types/image-def.ts +32 -0
  245. package/types/index.ts +30 -0
  246. package/types/link-def.ts +56 -0
  247. package/types/media-stack-def.ts +31 -0
  248. package/types/t-shirt-size.ts +5 -0
  249. package/types/tshirt-dimensions.ts +20 -0
  250. package/types/video-def.ts +25 -0
  251. package/util/blob.ts +33 -0
  252. package/util/copy-to-clipboard.ts +17 -0
  253. package/util/create-shadow-root.ts +22 -0
  254. package/util/date.ts +84 -0
  255. package/util/debounce.ts +11 -0
  256. package/util/file.ts +15 -0
  257. package/util/format-and-abbreviate-as-currency.ts +125 -0
  258. package/util/format-text.ts +34 -0
  259. package/util/format-to-max-char.ts +68 -0
  260. package/util/index-client.ts +3 -0
  261. package/util/index.ts +112 -0
  262. package/util/number-abbreviate.ts +49 -0
  263. package/util/specifier.ts +43 -0
  264. package/util/spread-to-transform.ts +25 -0
  265. package/util/step-animation.ts +90 -0
  266. package/util/timing.ts +3 -0
  267. package/util/toasts.tsx +17 -0
  268. package/util/two-way-map.ts +19 -0
  269. package/dist/index.d.mts +0 -16
  270. package/dist/index.d.ts +0 -16
  271. package/dist/lib/utils.d.mts +0 -2
  272. package/dist/lib/utils.d.ts +0 -2
  273. package/dist/src/utils.d.mts +0 -7
  274. package/dist/src/utils.d.ts +0 -7
  275. package/dist/tailwind/index.d.mts +0 -2
  276. package/dist/tailwind/index.d.ts +0 -2
  277. package/dist/types/index.d.mts +0 -12
  278. package/dist/types/index.d.ts +0 -12
@@ -0,0 +1,9 @@
1
+ // Vue components entry point
2
+ // Export all Vue components for @hanzo/ui
3
+
4
+ export * from './components'
5
+ export * from './composables'
6
+ export * from './utils'
7
+
8
+ // Re-export core utilities
9
+ export { cn } from '../core/utils'
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "@hanzo/ui-vue",
3
+ "version": "1.0.0",
4
+ "exports": {
5
+ ".": "./index.ts",
6
+ "./components": "./components/index.ts"
7
+ }
8
+ }
@@ -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.7.0",
3
+ "version": "4.8.3",
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": "./dist/assets/index.d.ts",
73
- "import": "./dist/assets/index.mjs",
74
- "require": "./dist/assets/index.js"
82
+ "types": "./assets/index.ts",
83
+ "import": "./assets/index.ts",
84
+ "require": "./assets/index.ts"
75
85
  },
76
- "./assets/*": {
77
- "types": "./dist/assets/*.d.ts",
78
- "import": "./dist/assets/*.mjs",
79
- "require": "./dist/assets/*.js"
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": "^4.1.0",
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
+ }
@@ -0,0 +1,5 @@
1
+ "use client"
2
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
3
+ const AspectRatio = AspectRatioPrimitive.Root
4
+
5
+ export default AspectRatio