@hanzo/ui 5.0.0 → 5.0.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/README.md +192 -185
- 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/bin/cli.js +100 -0
- package/bin/create-registry.js +108 -0
- package/bin/mcp.js +403 -0
- package/bin/npx-registry-mcp.js +15 -0
- package/bin/registry-mcp-wrapper.sh +19 -0
- package/bin/registry-mcp.js +100 -0
- package/bin/start-mcp-server.sh +22 -0
- package/bin/test-mcp.sh +52 -0
- package/bin/update-registry.js +196 -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 +9072 -1089
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8698 -45
- package/dist/index.mjs.map +1 -1
- package/dist/tailwind.js +2025 -0
- package/dist/tailwind.js.map +1 -0
- package/dist/tailwind.mjs +2013 -0
- package/dist/tailwind.mjs.map +1 -0
- package/dist/types.js +59 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +53 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.js +30 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +26 -0
- package/dist/utils.mjs.map +1 -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 +272 -153
- 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 +203 -0
- package/primitives/form.tsx +185 -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-client.ts +4 -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 +128 -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 +196 -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 +27 -0
- package/primitives/textarea.tsx +64 -0
- package/primitives/textfield.tsx +78 -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/style/drawer.css +163 -0
- package/style/globals.css +13 -0
- package/style/hanzo-common.css +31 -0
- package/style/hanzo-default-colors.css +82 -0
- package/style/theme-provider.tsx +20 -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/CHANGELOG.md +0 -184
- package/LICENSE +0 -21
- package/dist/ai/index.js +0 -53
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/index.mjs +0 -4
- package/dist/ai/index.mjs.map +0 -1
- package/dist/blocks/index.js +0 -983
- package/dist/blocks/index.js.map +0 -1
- package/dist/blocks/index.mjs +0 -945
- package/dist/blocks/index.mjs.map +0 -1
- package/dist/calendar/index.js +0 -14
- package/dist/calendar/index.js.map +0 -1
- package/dist/calendar/index.mjs +0 -5
- package/dist/calendar/index.mjs.map +0 -1
- package/dist/carousel/index.js +0 -220
- package/dist/carousel/index.js.map +0 -1
- package/dist/carousel/index.mjs +0 -191
- package/dist/carousel/index.mjs.map +0 -1
- package/dist/charts/index.js +0 -945
- package/dist/charts/index.js.map +0 -1
- package/dist/charts/index.mjs +0 -901
- package/dist/charts/index.mjs.map +0 -1
- package/dist/chunk-26T4V5QU.mjs +0 -111
- package/dist/chunk-26T4V5QU.mjs.map +0 -1
- package/dist/chunk-2A5KXDLJ.js +0 -22
- package/dist/chunk-2A5KXDLJ.js.map +0 -1
- package/dist/chunk-2CJ4HMF4.js +0 -79
- package/dist/chunk-2CJ4HMF4.js.map +0 -1
- package/dist/chunk-2OIQKC5E.js +0 -236
- package/dist/chunk-2OIQKC5E.js.map +0 -1
- package/dist/chunk-2X3KSYBN.js +0 -44
- package/dist/chunk-2X3KSYBN.js.map +0 -1
- package/dist/chunk-3PBQGYR7.mjs +0 -100
- package/dist/chunk-3PBQGYR7.mjs.map +0 -1
- package/dist/chunk-3POQQ6L7.js +0 -62
- package/dist/chunk-3POQQ6L7.js.map +0 -1
- package/dist/chunk-4B47GITH.mjs +0 -28
- package/dist/chunk-4B47GITH.mjs.map +0 -1
- package/dist/chunk-4BC2OH6B.js +0 -129
- package/dist/chunk-4BC2OH6B.js.map +0 -1
- package/dist/chunk-5AQSGH4R.js +0 -130
- package/dist/chunk-5AQSGH4R.js.map +0 -1
- package/dist/chunk-5IHRJFOO.mjs +0 -102
- package/dist/chunk-5IHRJFOO.mjs.map +0 -1
- package/dist/chunk-5LDGR7YN.mjs +0 -28
- package/dist/chunk-5LDGR7YN.mjs.map +0 -1
- package/dist/chunk-5MCN3VYM.mjs +0 -23
- package/dist/chunk-5MCN3VYM.mjs.map +0 -1
- package/dist/chunk-6AVAMRMB.mjs +0 -47
- package/dist/chunk-6AVAMRMB.mjs.map +0 -1
- package/dist/chunk-6H62JRNM.mjs +0 -120
- package/dist/chunk-6H62JRNM.mjs.map +0 -1
- package/dist/chunk-6KCII3F6.mjs +0 -126
- package/dist/chunk-6KCII3F6.mjs.map +0 -1
- package/dist/chunk-7EHB43BJ.js +0 -155
- package/dist/chunk-7EHB43BJ.js.map +0 -1
- package/dist/chunk-7LRD23Q5.js +0 -191
- package/dist/chunk-7LRD23Q5.js.map +0 -1
- package/dist/chunk-7SAHKOJG.mjs +0 -45
- package/dist/chunk-7SAHKOJG.mjs.map +0 -1
- package/dist/chunk-A3D2YZK3.js +0 -50
- package/dist/chunk-A3D2YZK3.js.map +0 -1
- package/dist/chunk-AL4QFH7V.js +0 -63
- package/dist/chunk-AL4QFH7V.js.map +0 -1
- package/dist/chunk-B3WFEG6U.js +0 -69
- package/dist/chunk-B3WFEG6U.js.map +0 -1
- package/dist/chunk-BDZQJ6GK.js +0 -242
- package/dist/chunk-BDZQJ6GK.js.map +0 -1
- package/dist/chunk-BRWFYRGX.js +0 -61
- package/dist/chunk-BRWFYRGX.js.map +0 -1
- package/dist/chunk-C5DNTLBO.js +0 -53
- package/dist/chunk-C5DNTLBO.js.map +0 -1
- package/dist/chunk-CRALRACO.js +0 -54
- package/dist/chunk-CRALRACO.js.map +0 -1
- package/dist/chunk-CVACQJRM.js +0 -149
- package/dist/chunk-CVACQJRM.js.map +0 -1
- package/dist/chunk-DEIUKFPZ.mjs +0 -63
- package/dist/chunk-DEIUKFPZ.mjs.map +0 -1
- package/dist/chunk-DN2AEEA2.js +0 -13
- package/dist/chunk-DN2AEEA2.js.map +0 -1
- package/dist/chunk-DTNRWU4B.mjs +0 -35
- package/dist/chunk-DTNRWU4B.mjs.map +0 -1
- package/dist/chunk-DXIUEWRJ.mjs +0 -31
- package/dist/chunk-DXIUEWRJ.mjs.map +0 -1
- package/dist/chunk-DYFV66JX.mjs +0 -54
- package/dist/chunk-DYFV66JX.mjs.map +0 -1
- package/dist/chunk-F3WMAHXV.mjs +0 -86
- package/dist/chunk-F3WMAHXV.mjs.map +0 -1
- package/dist/chunk-F4RWPBBB.js +0 -79
- package/dist/chunk-F4RWPBBB.js.map +0 -1
- package/dist/chunk-FEGAPM6U.js +0 -194
- package/dist/chunk-FEGAPM6U.js.map +0 -1
- package/dist/chunk-G5TS56PW.mjs +0 -160
- package/dist/chunk-G5TS56PW.mjs.map +0 -1
- package/dist/chunk-GG6VGOEN.mjs +0 -590
- package/dist/chunk-GG6VGOEN.mjs.map +0 -1
- package/dist/chunk-GLAMGK32.mjs +0 -54
- package/dist/chunk-GLAMGK32.mjs.map +0 -1
- package/dist/chunk-GNMMUJXD.mjs +0 -200
- package/dist/chunk-GNMMUJXD.mjs.map +0 -1
- package/dist/chunk-GNPBULLS.mjs +0 -600
- package/dist/chunk-GNPBULLS.mjs.map +0 -1
- package/dist/chunk-GTE2DELE.js +0 -65
- package/dist/chunk-GTE2DELE.js.map +0 -1
- package/dist/chunk-GUQAFFTH.js +0 -94
- package/dist/chunk-GUQAFFTH.js.map +0 -1
- package/dist/chunk-H5VOYZHT.mjs +0 -34
- package/dist/chunk-H5VOYZHT.mjs.map +0 -1
- package/dist/chunk-HR6PBOGG.mjs +0 -59
- package/dist/chunk-HR6PBOGG.mjs.map +0 -1
- package/dist/chunk-HROONQS3.js +0 -55
- package/dist/chunk-HROONQS3.js.map +0 -1
- package/dist/chunk-IAO7SOQ3.mjs +0 -56
- package/dist/chunk-IAO7SOQ3.mjs.map +0 -1
- package/dist/chunk-K2QKU3K6.mjs +0 -40
- package/dist/chunk-K2QKU3K6.mjs.map +0 -1
- package/dist/chunk-KEUZZCCP.js +0 -53
- package/dist/chunk-KEUZZCCP.js.map +0 -1
- package/dist/chunk-KJXSLTG7.mjs +0 -73
- package/dist/chunk-KJXSLTG7.mjs.map +0 -1
- package/dist/chunk-L5AFUCVH.mjs +0 -26
- package/dist/chunk-L5AFUCVH.mjs.map +0 -1
- package/dist/chunk-LB3I52KZ.mjs +0 -42
- package/dist/chunk-LB3I52KZ.mjs.map +0 -1
- package/dist/chunk-LN75MJQ2.js +0 -71
- package/dist/chunk-LN75MJQ2.js.map +0 -1
- package/dist/chunk-LRBOFJUV.js +0 -60
- package/dist/chunk-LRBOFJUV.js.map +0 -1
- package/dist/chunk-MMNYRBOU.js +0 -157
- package/dist/chunk-MMNYRBOU.js.map +0 -1
- package/dist/chunk-MO65YF6P.js +0 -236
- package/dist/chunk-MO65YF6P.js.map +0 -1
- package/dist/chunk-N4KHP5FC.mjs +0 -33
- package/dist/chunk-N4KHP5FC.mjs.map +0 -1
- package/dist/chunk-NP2J7AB7.mjs +0 -121
- package/dist/chunk-NP2J7AB7.mjs.map +0 -1
- package/dist/chunk-OLR6SGYO.js +0 -57
- package/dist/chunk-OLR6SGYO.js.map +0 -1
- package/dist/chunk-ON7NQ4DY.js +0 -21
- package/dist/chunk-ON7NQ4DY.js.map +0 -1
- package/dist/chunk-PE3VFRLV.mjs +0 -198
- package/dist/chunk-PE3VFRLV.mjs.map +0 -1
- package/dist/chunk-Q7LOOIE5.mjs +0 -8
- package/dist/chunk-Q7LOOIE5.mjs.map +0 -1
- package/dist/chunk-QFA6U75G.mjs +0 -51
- package/dist/chunk-QFA6U75G.mjs.map +0 -1
- package/dist/chunk-QJQPT4WX.js +0 -638
- package/dist/chunk-QJQPT4WX.js.map +0 -1
- package/dist/chunk-QKHQPBSR.mjs +0 -20
- package/dist/chunk-QKHQPBSR.mjs.map +0 -1
- package/dist/chunk-SJD4XRFJ.mjs +0 -141
- package/dist/chunk-SJD4XRFJ.mjs.map +0 -1
- package/dist/chunk-SOOJLU4C.mjs +0 -19
- package/dist/chunk-SOOJLU4C.mjs.map +0 -1
- package/dist/chunk-T66B5IM5.js +0 -51
- package/dist/chunk-T66B5IM5.js.map +0 -1
- package/dist/chunk-T7RPZDO4.js +0 -645
- package/dist/chunk-T7RPZDO4.js.map +0 -1
- package/dist/chunk-TGRMDGTV.mjs +0 -38
- package/dist/chunk-TGRMDGTV.mjs.map +0 -1
- package/dist/chunk-TH2UKMCO.mjs +0 -11
- package/dist/chunk-TH2UKMCO.mjs.map +0 -1
- package/dist/chunk-TMV45OKE.mjs +0 -113
- package/dist/chunk-TMV45OKE.mjs.map +0 -1
- package/dist/chunk-TUJ7EVEK.js +0 -171
- package/dist/chunk-TUJ7EVEK.js.map +0 -1
- package/dist/chunk-ULNWDOI7.js +0 -122
- package/dist/chunk-ULNWDOI7.js.map +0 -1
- package/dist/chunk-UNUTTHCH.mjs +0 -210
- package/dist/chunk-UNUTTHCH.mjs.map +0 -1
- package/dist/chunk-VJMI6BG4.mjs +0 -10
- package/dist/chunk-VJMI6BG4.mjs.map +0 -1
- package/dist/chunk-VZVOB5MG.mjs +0 -26
- package/dist/chunk-VZVOB5MG.mjs.map +0 -1
- package/dist/chunk-WD67O22C.js +0 -50
- package/dist/chunk-WD67O22C.js.map +0 -1
- package/dist/chunk-WYPMLIJN.js +0 -53
- package/dist/chunk-WYPMLIJN.js.map +0 -1
- package/dist/chunk-X32I34NH.js +0 -109
- package/dist/chunk-X32I34NH.js.map +0 -1
- package/dist/chunk-X5MOZ3YL.js +0 -65
- package/dist/chunk-X5MOZ3YL.js.map +0 -1
- package/dist/chunk-Y4JVIPQZ.mjs +0 -31
- package/dist/chunk-Y4JVIPQZ.mjs.map +0 -1
- package/dist/chunk-Y6WOV2LZ.js +0 -95
- package/dist/chunk-Y6WOV2LZ.js.map +0 -1
- package/dist/chunk-YAEN5SCU.mjs +0 -41
- package/dist/chunk-YAEN5SCU.mjs.map +0 -1
- package/dist/chunk-YH6XDF3N.js +0 -121
- package/dist/chunk-YH6XDF3N.js.map +0 -1
- package/dist/chunk-YJKA4D75.mjs +0 -124
- package/dist/chunk-YJKA4D75.mjs.map +0 -1
- package/dist/chunk-ZANAF7WB.js +0 -88
- package/dist/chunk-ZANAF7WB.js.map +0 -1
- package/dist/chunk-ZDBWNPLO.js +0 -30
- package/dist/chunk-ZDBWNPLO.js.map +0 -1
- package/dist/chunk-ZDT2IOK2.js +0 -56
- package/dist/chunk-ZDT2IOK2.js.map +0 -1
- package/dist/chunk-ZKGVLTSI.js +0 -25
- package/dist/chunk-ZKGVLTSI.js.map +0 -1
- package/dist/chunk-ZLELESO7.js +0 -34
- package/dist/chunk-ZLELESO7.js.map +0 -1
- package/dist/chunk-ZUFUEQTX.mjs +0 -157
- package/dist/chunk-ZUFUEQTX.mjs.map +0 -1
- package/dist/chunk-ZZZWRQQE.mjs +0 -42
- package/dist/chunk-ZZZWRQQE.mjs.map +0 -1
- package/dist/command/index.js +0 -138
- package/dist/command/index.js.map +0 -1
- package/dist/command/index.mjs +0 -128
- package/dist/command/index.mjs.map +0 -1
- package/dist/components/accordion.js +0 -25
- package/dist/components/accordion.js.map +0 -1
- package/dist/components/accordion.mjs +0 -4
- package/dist/components/accordion.mjs.map +0 -1
- package/dist/components/alert.js +0 -21
- package/dist/components/alert.js.map +0 -1
- package/dist/components/alert.mjs +0 -4
- package/dist/components/alert.mjs.map +0 -1
- package/dist/components/aspect-ratio.js +0 -12
- package/dist/components/aspect-ratio.js.map +0 -1
- package/dist/components/aspect-ratio.mjs +0 -3
- package/dist/components/aspect-ratio.mjs.map +0 -1
- package/dist/components/avatar.js +0 -21
- package/dist/components/avatar.js.map +0 -1
- package/dist/components/avatar.mjs +0 -4
- package/dist/components/avatar.mjs.map +0 -1
- package/dist/components/badge.js +0 -17
- package/dist/components/badge.js.map +0 -1
- package/dist/components/badge.mjs +0 -4
- package/dist/components/badge.mjs.map +0 -1
- package/dist/components/breadcrumb.js +0 -37
- package/dist/components/breadcrumb.js.map +0 -1
- package/dist/components/breadcrumb.mjs +0 -4
- package/dist/components/breadcrumb.mjs.map +0 -1
- package/dist/components/button.js +0 -17
- package/dist/components/button.js.map +0 -1
- package/dist/components/button.mjs +0 -4
- package/dist/components/button.mjs.map +0 -1
- package/dist/components/card.js +0 -37
- package/dist/components/card.js.map +0 -1
- package/dist/components/card.mjs +0 -4
- package/dist/components/card.mjs.map +0 -1
- package/dist/components/checkbox.js +0 -13
- package/dist/components/checkbox.js.map +0 -1
- package/dist/components/checkbox.mjs +0 -4
- package/dist/components/checkbox.mjs.map +0 -1
- package/dist/components/collapsible.js +0 -20
- package/dist/components/collapsible.js.map +0 -1
- package/dist/components/collapsible.mjs +0 -3
- package/dist/components/collapsible.mjs.map +0 -1
- package/dist/components/context-menu.js +0 -69
- package/dist/components/context-menu.js.map +0 -1
- package/dist/components/context-menu.mjs +0 -4
- package/dist/components/context-menu.mjs.map +0 -1
- package/dist/components/dialog.js +0 -49
- package/dist/components/dialog.js.map +0 -1
- package/dist/components/dialog.mjs +0 -4
- package/dist/components/dialog.mjs.map +0 -1
- package/dist/components/drawer.js +0 -49
- package/dist/components/drawer.js.map +0 -1
- package/dist/components/drawer.mjs +0 -4
- package/dist/components/drawer.mjs.map +0 -1
- package/dist/components/dropdown-menu.js +0 -69
- package/dist/components/dropdown-menu.js.map +0 -1
- package/dist/components/dropdown-menu.mjs +0 -4
- package/dist/components/dropdown-menu.mjs.map +0 -1
- package/dist/components/form.js +0 -42
- package/dist/components/form.js.map +0 -1
- package/dist/components/form.mjs +0 -5
- package/dist/components/form.mjs.map +0 -1
- package/dist/components/hover-card.js +0 -21
- package/dist/components/hover-card.js.map +0 -1
- package/dist/components/hover-card.mjs +0 -4
- package/dist/components/hover-card.mjs.map +0 -1
- package/dist/components/index.js +0 -1047
- package/dist/components/index.js.map +0 -1
- package/dist/components/index.mjs +0 -46
- package/dist/components/index.mjs.map +0 -1
- package/dist/components/input-otp.js +0 -25
- package/dist/components/input-otp.js.map +0 -1
- package/dist/components/input-otp.mjs +0 -4
- package/dist/components/input-otp.mjs.map +0 -1
- package/dist/components/input.js +0 -13
- package/dist/components/input.js.map +0 -1
- package/dist/components/input.mjs +0 -4
- package/dist/components/input.mjs.map +0 -1
- package/dist/components/label.js +0 -13
- package/dist/components/label.js.map +0 -1
- package/dist/components/label.mjs +0 -4
- package/dist/components/label.mjs.map +0 -1
- package/dist/components/menubar.js +0 -73
- package/dist/components/menubar.js.map +0 -1
- package/dist/components/menubar.mjs +0 -4
- package/dist/components/menubar.mjs.map +0 -1
- package/dist/components/navigation-menu.js +0 -45
- package/dist/components/navigation-menu.js.map +0 -1
- package/dist/components/navigation-menu.mjs +0 -4
- package/dist/components/navigation-menu.mjs.map +0 -1
- package/dist/components/pagination.js +0 -38
- package/dist/components/pagination.js.map +0 -1
- package/dist/components/pagination.mjs +0 -5
- package/dist/components/pagination.mjs.map +0 -1
- package/dist/components/popover.js +0 -25
- package/dist/components/popover.js.map +0 -1
- package/dist/components/popover.mjs +0 -4
- package/dist/components/popover.mjs.map +0 -1
- package/dist/components/progress.js +0 -13
- package/dist/components/progress.js.map +0 -1
- package/dist/components/progress.mjs +0 -4
- package/dist/components/progress.mjs.map +0 -1
- package/dist/components/radio-group.js +0 -17
- package/dist/components/radio-group.js.map +0 -1
- package/dist/components/radio-group.mjs +0 -4
- package/dist/components/radio-group.mjs.map +0 -1
- package/dist/components/resizable.js +0 -21
- package/dist/components/resizable.js.map +0 -1
- package/dist/components/resizable.mjs +0 -4
- package/dist/components/resizable.mjs.map +0 -1
- package/dist/components/scroll-area.js +0 -17
- package/dist/components/scroll-area.js.map +0 -1
- package/dist/components/scroll-area.mjs +0 -4
- package/dist/components/scroll-area.mjs.map +0 -1
- package/dist/components/select.js +0 -49
- package/dist/components/select.js.map +0 -1
- package/dist/components/select.mjs +0 -4
- package/dist/components/select.mjs.map +0 -1
- package/dist/components/separator.js +0 -13
- package/dist/components/separator.js.map +0 -1
- package/dist/components/separator.mjs +0 -4
- package/dist/components/separator.mjs.map +0 -1
- package/dist/components/sheet.js +0 -49
- package/dist/components/sheet.js.map +0 -1
- package/dist/components/sheet.mjs +0 -4
- package/dist/components/sheet.mjs.map +0 -1
- package/dist/components/sidebar.js +0 -111
- package/dist/components/sidebar.js.map +0 -1
- package/dist/components/sidebar.mjs +0 -10
- package/dist/components/sidebar.mjs.map +0 -1
- package/dist/components/skeleton.js +0 -13
- package/dist/components/skeleton.js.map +0 -1
- package/dist/components/skeleton.mjs +0 -4
- package/dist/components/skeleton.mjs.map +0 -1
- package/dist/components/slider.js +0 -13
- package/dist/components/slider.js.map +0 -1
- package/dist/components/slider.mjs +0 -4
- package/dist/components/slider.mjs.map +0 -1
- package/dist/components/switch.js +0 -13
- package/dist/components/switch.js.map +0 -1
- package/dist/components/switch.mjs +0 -4
- package/dist/components/switch.mjs.map +0 -1
- package/dist/components/table.js +0 -41
- package/dist/components/table.js.map +0 -1
- package/dist/components/table.mjs +0 -4
- package/dist/components/table.mjs.map +0 -1
- package/dist/components/tabs.js +0 -25
- package/dist/components/tabs.js.map +0 -1
- package/dist/components/tabs.mjs +0 -4
- package/dist/components/tabs.mjs.map +0 -1
- package/dist/components/textarea.js +0 -13
- package/dist/components/textarea.js.map +0 -1
- package/dist/components/textarea.mjs +0 -4
- package/dist/components/textarea.mjs.map +0 -1
- package/dist/components/toast.js +0 -37
- package/dist/components/toast.js.map +0 -1
- package/dist/components/toast.mjs +0 -4
- package/dist/components/toast.mjs.map +0 -1
- package/dist/components/toggle-group.js +0 -18
- package/dist/components/toggle-group.js.map +0 -1
- package/dist/components/toggle-group.mjs +0 -5
- package/dist/components/toggle-group.mjs.map +0 -1
- package/dist/components/toggle.js +0 -17
- package/dist/components/toggle.js.map +0 -1
- package/dist/components/toggle.mjs +0 -4
- package/dist/components/toggle.mjs.map +0 -1
- package/dist/components/tooltip.js +0 -25
- package/dist/components/tooltip.js.map +0 -1
- package/dist/components/tooltip.mjs +0 -4
- package/dist/components/tooltip.mjs.map +0 -1
- package/dist/effects/index.js +0 -162
- package/dist/effects/index.js.map +0 -1
- package/dist/effects/index.mjs +0 -156
- package/dist/effects/index.mjs.map +0 -1
- package/dist/lib/utils.js +0 -12
- package/dist/lib/utils.js.map +0 -1
- package/dist/lib/utils.mjs +0 -3
- package/dist/lib/utils.mjs.map +0 -1
- package/dist/markdown/index.js +0 -669
- package/dist/markdown/index.js.map +0 -1
- package/dist/markdown/index.mjs +0 -635
- package/dist/markdown/index.mjs.map +0 -1
- package/dist/qr/index.js +0 -101
- package/dist/qr/index.js.map +0 -1
- package/dist/qr/index.mjs +0 -98
- package/dist/qr/index.mjs.map +0 -1
- package/dist/upload/index.js +0 -166
- package/dist/upload/index.js.map +0 -1
- package/dist/upload/index.mjs +0 -163
- package/dist/upload/index.mjs.map +0 -1
- package/publish.sh +0 -27
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// This is the main entry point for the MCP server
|
|
4
|
+
// It should be runnable directly with npx @hanzo/ui registry:mcp
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This script starts the MCP server for Hanzo UI
|
|
8
|
+
* It can be run with npx @hanzo/ui registry:mcp
|
|
9
|
+
*/
|
|
10
|
+
const { StdioServerTransport } = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
11
|
+
|
|
12
|
+
// Import the server dynamically based on where it's available
|
|
13
|
+
async function loadServer() {
|
|
14
|
+
try {
|
|
15
|
+
// Try loading from dist directory (published package)
|
|
16
|
+
return require("../dist/mcp/index.js").server;
|
|
17
|
+
} catch (error) {
|
|
18
|
+
try {
|
|
19
|
+
// Fallback to direct import (development)
|
|
20
|
+
return require("../mcp/index.js").server;
|
|
21
|
+
} catch (innerError) {
|
|
22
|
+
console.error("Failed to load the MCP server implementation:", innerError);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Start HTTP server if requested
|
|
29
|
+
async function startHttpServer(server) {
|
|
30
|
+
try {
|
|
31
|
+
// Dynamically import the HTTP transport - we don't want to require
|
|
32
|
+
// this dependency if we're not using HTTP mode
|
|
33
|
+
const { HttpServerTransport } = require("@modelcontextprotocol/sdk/server/http.js");
|
|
34
|
+
|
|
35
|
+
// Get port from environment or use default
|
|
36
|
+
const port = process.env.MCP_PORT || 3333;
|
|
37
|
+
|
|
38
|
+
// Create HTTP transport
|
|
39
|
+
const transport = new HttpServerTransport({
|
|
40
|
+
port: parseInt(port, 10),
|
|
41
|
+
cors: {
|
|
42
|
+
origin: "*", // Allow any origin
|
|
43
|
+
methods: ["GET", "POST"],
|
|
44
|
+
allowedHeaders: ["Content-Type"],
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Connect the server to the transport
|
|
49
|
+
await server.connect(transport);
|
|
50
|
+
|
|
51
|
+
console.error(`MCP HTTP server listening on port ${port}`);
|
|
52
|
+
console.error(`You can access the server at http://localhost:${port}`);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error("Failed to start HTTP server:", error);
|
|
55
|
+
console.error("Falling back to STDIO mode...");
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function main() {
|
|
63
|
+
try {
|
|
64
|
+
console.error("Loading Hanzo UI MCP server...");
|
|
65
|
+
|
|
66
|
+
// Default registry URL if not set
|
|
67
|
+
if (!process.env.REGISTRY_URL) {
|
|
68
|
+
process.env.REGISTRY_URL = "https://ui.hanzo.ai/registry/registry.json";
|
|
69
|
+
console.error(`Using default registry URL: ${process.env.REGISTRY_URL}`);
|
|
70
|
+
console.error("You can set a custom registry URL with the REGISTRY_URL environment variable.");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Load the server
|
|
74
|
+
const server = await loadServer();
|
|
75
|
+
|
|
76
|
+
// Check if we should use HTTP mode
|
|
77
|
+
const useHttp = process.env.MCP_HTTP_MODE === "true";
|
|
78
|
+
|
|
79
|
+
if (useHttp) {
|
|
80
|
+
// Try to start HTTP server, fall back to stdio if it fails
|
|
81
|
+
const httpStarted = await startHttpServer(server);
|
|
82
|
+
if (!httpStarted) {
|
|
83
|
+
// Fall back to stdio
|
|
84
|
+
const transport = new StdioServerTransport();
|
|
85
|
+
await server.connect(transport);
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
// Use stdio mode
|
|
89
|
+
const transport = new StdioServerTransport();
|
|
90
|
+
await server.connect(transport);
|
|
91
|
+
console.error("MCP server running in stdio mode");
|
|
92
|
+
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error("Error starting MCP server:", error);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Start the server
|
|
100
|
+
main();
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Set the registry URL
|
|
4
|
+
export REGISTRY_URL=${REGISTRY_URL:-"https://ui.hanzo.ai/registry/registry.json"}
|
|
5
|
+
|
|
6
|
+
echo "Starting Hanzo UI MCP server with registry URL: $REGISTRY_URL"
|
|
7
|
+
echo "This server enables AI assistants to interact with the Hanzo UI component library."
|
|
8
|
+
echo "Use this as the URL for 'npx @hanzo/ui registry:mcp' in your MCP configuration."
|
|
9
|
+
echo ""
|
|
10
|
+
echo "Press Ctrl+C to stop the server."
|
|
11
|
+
|
|
12
|
+
# Find the CLI script
|
|
13
|
+
if [ -f "./bin/cli.js" ]; then
|
|
14
|
+
# In development directory structure
|
|
15
|
+
node ./bin/cli.js registry:mcp
|
|
16
|
+
elif [ -f "./node_modules/@hanzo/ui/bin/cli.js" ]; then
|
|
17
|
+
# Installed as dependency
|
|
18
|
+
node ./node_modules/@hanzo/ui/bin/cli.js registry:mcp
|
|
19
|
+
else
|
|
20
|
+
# Use npx as fallback
|
|
21
|
+
npx @hanzo/ui registry:mcp
|
|
22
|
+
fi
|
package/bin/test-mcp.sh
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Test script for verifying the Hanzo UI MCP functionality
|
|
4
|
+
|
|
5
|
+
# Set a test registry URL
|
|
6
|
+
export REGISTRY_URL="https://ui.hanzo.com/registry/registry.json"
|
|
7
|
+
|
|
8
|
+
echo "Testing Hanzo UI MCP Server"
|
|
9
|
+
echo "============================"
|
|
10
|
+
echo ""
|
|
11
|
+
echo "This script will test the following functionalities:"
|
|
12
|
+
echo "1. Loading the server from NPX"
|
|
13
|
+
echo "2. Server startup with custom registry URL"
|
|
14
|
+
echo ""
|
|
15
|
+
|
|
16
|
+
# First test: Simple command check
|
|
17
|
+
echo "Test 1: Check if the NPX command is recognized"
|
|
18
|
+
# Just check if the command exists without running it
|
|
19
|
+
which npx > /dev/null 2>&1
|
|
20
|
+
if [ $? -eq 0 ]; then
|
|
21
|
+
echo "✅ NPX is available"
|
|
22
|
+
else
|
|
23
|
+
echo "❌ NPX is not installed"
|
|
24
|
+
exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Second test: Server startup check
|
|
28
|
+
echo ""
|
|
29
|
+
echo "Test 2: Server startup (will exit automatically after 3 seconds)"
|
|
30
|
+
echo "Running: REGISTRY_URL=$REGISTRY_URL timeout 3 npx @hanzo/ui registry:mcp"
|
|
31
|
+
echo ""
|
|
32
|
+
echo "Expected output: You should see the server startup message"
|
|
33
|
+
echo ""
|
|
34
|
+
|
|
35
|
+
# Run with timeout to automatically kill after 3 seconds
|
|
36
|
+
# This works because the MCP server doesn't terminate on its own
|
|
37
|
+
timeout 3 npx @hanzo/ui registry:mcp 2>&1 | grep "Starting Hanzo UI MCP server"
|
|
38
|
+
|
|
39
|
+
if [ $? -eq 0 ]; then
|
|
40
|
+
echo ""
|
|
41
|
+
echo "✅ Server startup message detected"
|
|
42
|
+
else
|
|
43
|
+
echo ""
|
|
44
|
+
echo "❌ Server failed to start properly"
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
echo ""
|
|
49
|
+
echo "All tests completed successfully!"
|
|
50
|
+
echo ""
|
|
51
|
+
echo "The Hanzo UI MCP server is ready to be used in your MCP configuration with:"
|
|
52
|
+
echo "npx @hanzo/ui registry:mcp"
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This script updates the registry.json file based on components
|
|
5
|
+
* found in the registry directory. It's similar to the approach used by hanzo/ui.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const glob = require('glob');
|
|
11
|
+
|
|
12
|
+
// Configuration
|
|
13
|
+
const REGISTRY_DIR = path.resolve(__dirname, '../registry');
|
|
14
|
+
const PUBLIC_DIR = path.resolve(__dirname, '../public');
|
|
15
|
+
const OUTPUT_FILE = path.resolve(__dirname, '../registry.json');
|
|
16
|
+
const REGISTRY_STYLES = ['default', 'new-york']; // Add other styles as needed
|
|
17
|
+
|
|
18
|
+
// Schema for registry.json
|
|
19
|
+
const registrySchema = {
|
|
20
|
+
"$schema": "https://ui.hanzo.com/schema/registry.json",
|
|
21
|
+
"name": "hanzo",
|
|
22
|
+
"homepage": "https://ui.hanzo.ai",
|
|
23
|
+
"items": []
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Main function to update the registry
|
|
28
|
+
*/
|
|
29
|
+
async function updateRegistry() {
|
|
30
|
+
try {
|
|
31
|
+
console.log('Updating registry.json...');
|
|
32
|
+
|
|
33
|
+
// Find all registry components
|
|
34
|
+
const items = [];
|
|
35
|
+
|
|
36
|
+
// Process each style directory
|
|
37
|
+
for (const style of REGISTRY_STYLES) {
|
|
38
|
+
const styleDir = path.join(REGISTRY_DIR, style);
|
|
39
|
+
|
|
40
|
+
// Skip if style directory doesn't exist
|
|
41
|
+
if (!fs.existsSync(styleDir)) {
|
|
42
|
+
console.log(`Style directory not found: ${style}`);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Process UI components
|
|
47
|
+
const uiDir = path.join(styleDir, 'ui');
|
|
48
|
+
if (fs.existsSync(uiDir)) {
|
|
49
|
+
const uiComponents = glob.sync(`${uiDir}/**/!(*.test|*.spec).{ts,tsx,js,jsx}`);
|
|
50
|
+
|
|
51
|
+
for (const filePath of uiComponents) {
|
|
52
|
+
const relativePath = path.relative(REGISTRY_DIR, filePath);
|
|
53
|
+
const dirName = path.basename(path.dirname(filePath));
|
|
54
|
+
const fileName = path.basename(filePath);
|
|
55
|
+
|
|
56
|
+
// Skip index files and non-component files
|
|
57
|
+
if (fileName === 'index.ts' || fileName === 'index.tsx') continue;
|
|
58
|
+
|
|
59
|
+
// Component name is usually the directory name
|
|
60
|
+
const name = dirName;
|
|
61
|
+
|
|
62
|
+
// Check if component already exists in the registry
|
|
63
|
+
if (!items.find(item => item.name === name && item.type === 'registry:component')) {
|
|
64
|
+
const componentMeta = {
|
|
65
|
+
name,
|
|
66
|
+
type: 'registry:component',
|
|
67
|
+
description: `A ${name} component for your UI.`,
|
|
68
|
+
files: [
|
|
69
|
+
{
|
|
70
|
+
path: relativePath,
|
|
71
|
+
type: 'registry:component'
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
registryDependencies: []
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Try to parse dependencies from the file content
|
|
78
|
+
try {
|
|
79
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
80
|
+
|
|
81
|
+
// Find import statements for other components
|
|
82
|
+
const dependencies = [];
|
|
83
|
+
const importRegex = /import.*from ['"]@\/components\/ui\/([^'"]+)['"]/g;
|
|
84
|
+
let match;
|
|
85
|
+
|
|
86
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
87
|
+
const dependency = match[1];
|
|
88
|
+
if (!dependencies.includes(dependency)) {
|
|
89
|
+
dependencies.push(dependency);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (dependencies.length > 0) {
|
|
94
|
+
componentMeta.registryDependencies = dependencies;
|
|
95
|
+
}
|
|
96
|
+
} catch (error) {
|
|
97
|
+
console.warn(`Error parsing dependencies for ${name}:`, error.message);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
items.push(componentMeta);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Process other component types (blocks, etc.)
|
|
106
|
+
const blockDir = path.join(styleDir, 'block');
|
|
107
|
+
if (fs.existsSync(blockDir)) {
|
|
108
|
+
const blocks = glob.sync(`${blockDir}/**/!(*.test|*.spec).{ts,tsx,js,jsx}`);
|
|
109
|
+
|
|
110
|
+
for (const filePath of blocks) {
|
|
111
|
+
const relativePath = path.relative(REGISTRY_DIR, filePath);
|
|
112
|
+
const dirName = path.basename(path.dirname(filePath));
|
|
113
|
+
|
|
114
|
+
// Skip helper files
|
|
115
|
+
if (dirName === 'utils' || dirName === 'helpers') continue;
|
|
116
|
+
|
|
117
|
+
// Block name is usually the directory name
|
|
118
|
+
const name = dirName;
|
|
119
|
+
|
|
120
|
+
// Check if block already exists in the registry
|
|
121
|
+
if (!items.find(item => item.name === name && item.type === 'registry:block')) {
|
|
122
|
+
items.push({
|
|
123
|
+
name,
|
|
124
|
+
type: 'registry:block',
|
|
125
|
+
description: `A ${name} block for your UI.`,
|
|
126
|
+
files: [
|
|
127
|
+
{
|
|
128
|
+
path: relativePath,
|
|
129
|
+
type: 'registry:block'
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Add style definition
|
|
139
|
+
for (const style of REGISTRY_STYLES) {
|
|
140
|
+
items.push({
|
|
141
|
+
name: style,
|
|
142
|
+
type: 'registry:style',
|
|
143
|
+
description: `The ${style} style for Hanzo UI components.`,
|
|
144
|
+
files: []
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Update registry.json
|
|
149
|
+
registrySchema.items = items;
|
|
150
|
+
|
|
151
|
+
// Create output directory if it doesn't exist
|
|
152
|
+
const outputDir = path.dirname(OUTPUT_FILE);
|
|
153
|
+
if (!fs.existsSync(outputDir)) {
|
|
154
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Write registry.json
|
|
158
|
+
fs.writeFileSync(OUTPUT_FILE, JSON.stringify(registrySchema, null, 2), 'utf8');
|
|
159
|
+
console.log(`Registry updated with ${items.length} items.`);
|
|
160
|
+
|
|
161
|
+
// Create public/r directory if it doesn't exist
|
|
162
|
+
const publicRDir = path.join(PUBLIC_DIR, 'r');
|
|
163
|
+
if (!fs.existsSync(publicRDir)) {
|
|
164
|
+
fs.mkdirSync(publicRDir, { recursive: true });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Generate individual component JSON files
|
|
168
|
+
console.log('Generating individual component JSON files...');
|
|
169
|
+
for (const item of items) {
|
|
170
|
+
const componentFile = path.join(publicRDir, `${item.name}.json`);
|
|
171
|
+
|
|
172
|
+
// Add content to files if they exist
|
|
173
|
+
if (item.files && item.files.length > 0) {
|
|
174
|
+
for (const file of item.files) {
|
|
175
|
+
const filePath = path.join(REGISTRY_DIR, file.path);
|
|
176
|
+
if (fs.existsSync(filePath)) {
|
|
177
|
+
file.content = fs.readFileSync(filePath, 'utf8');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Write component JSON file
|
|
183
|
+
fs.writeFileSync(componentFile, JSON.stringify(item, null, 2), 'utf8');
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
console.log(`Generated ${items.length} component JSON files.`);
|
|
187
|
+
console.log('Registry update complete!');
|
|
188
|
+
|
|
189
|
+
} catch (error) {
|
|
190
|
+
console.error('Error updating registry:', error);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Run the update
|
|
196
|
+
updateRegistry();
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useState } from 'react'
|
|
4
|
+
import { cn } from '@hanzo/ui/util'
|
|
5
|
+
import { Button } from '@hanzo/ui/primitives'
|
|
6
|
+
import {
|
|
7
|
+
Card,
|
|
8
|
+
CardContent,
|
|
9
|
+
CardDescription,
|
|
10
|
+
CardHeader,
|
|
11
|
+
CardTitle,
|
|
12
|
+
} from '@hanzo/ui/primitives'
|
|
13
|
+
import { Input } from '@hanzo/ui/primitives'
|
|
14
|
+
import { Label } from '@hanzo/ui/primitives'
|
|
15
|
+
import {
|
|
16
|
+
InputOTP,
|
|
17
|
+
InputOTPGroup,
|
|
18
|
+
InputOTPSeparator,
|
|
19
|
+
InputOTPSlot,
|
|
20
|
+
} from '@hanzo/ui/primitives'
|
|
21
|
+
|
|
22
|
+
interface Login2FAProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
23
|
+
onSubmit?: (email: string, password: string, code?: string) => void
|
|
24
|
+
onResendCode?: () => void
|
|
25
|
+
onForgotPassword?: () => void
|
|
26
|
+
onSignUp?: () => void
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function Login2FA({
|
|
30
|
+
className,
|
|
31
|
+
onSubmit,
|
|
32
|
+
onResendCode,
|
|
33
|
+
onForgotPassword,
|
|
34
|
+
onSignUp,
|
|
35
|
+
...props
|
|
36
|
+
}: Login2FAProps) {
|
|
37
|
+
const [step, setStep] = useState<'credentials' | '2fa'>('credentials')
|
|
38
|
+
const [credentials, setCredentials] = useState({ email: '', password: '' })
|
|
39
|
+
const [otpValue, setOtpValue] = useState('')
|
|
40
|
+
|
|
41
|
+
const handleCredentialsSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
42
|
+
e.preventDefault()
|
|
43
|
+
const formData = new FormData(e.currentTarget)
|
|
44
|
+
const email = formData.get('email') as string
|
|
45
|
+
const password = formData.get('password') as string
|
|
46
|
+
setCredentials({ email, password })
|
|
47
|
+
setStep('2fa')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const handleOTPSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
51
|
+
e.preventDefault()
|
|
52
|
+
onSubmit?.(credentials.email, credentials.password, otpValue)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div className={cn('flex flex-col gap-6', className)} {...props}>
|
|
57
|
+
<Card>
|
|
58
|
+
<CardHeader>
|
|
59
|
+
<CardTitle className="text-2xl">
|
|
60
|
+
{step === 'credentials' ? 'Login' : 'Two-factor authentication'}
|
|
61
|
+
</CardTitle>
|
|
62
|
+
<CardDescription>
|
|
63
|
+
{step === 'credentials'
|
|
64
|
+
? 'Enter your email and password to login'
|
|
65
|
+
: 'Enter the 6-digit code from your authenticator app'}
|
|
66
|
+
</CardDescription>
|
|
67
|
+
</CardHeader>
|
|
68
|
+
<CardContent>
|
|
69
|
+
{step === 'credentials' ? (
|
|
70
|
+
<form onSubmit={handleCredentialsSubmit}>
|
|
71
|
+
<div className="flex flex-col gap-6">
|
|
72
|
+
<div className="grid gap-2">
|
|
73
|
+
<Label htmlFor="email">Email</Label>
|
|
74
|
+
<Input
|
|
75
|
+
id="email"
|
|
76
|
+
name="email"
|
|
77
|
+
type="email"
|
|
78
|
+
placeholder="m@example.com"
|
|
79
|
+
required
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
82
|
+
<div className="grid gap-2">
|
|
83
|
+
<div className="flex items-center">
|
|
84
|
+
<Label htmlFor="password">Password</Label>
|
|
85
|
+
{onForgotPassword && (
|
|
86
|
+
<button
|
|
87
|
+
type="button"
|
|
88
|
+
onClick={onForgotPassword}
|
|
89
|
+
className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
|
|
90
|
+
>
|
|
91
|
+
Forgot your password?
|
|
92
|
+
</button>
|
|
93
|
+
)}
|
|
94
|
+
</div>
|
|
95
|
+
<Input id="password" name="password" type="password" required />
|
|
96
|
+
</div>
|
|
97
|
+
<Button type="submit" className="w-full">
|
|
98
|
+
Continue
|
|
99
|
+
</Button>
|
|
100
|
+
</div>
|
|
101
|
+
{onSignUp && (
|
|
102
|
+
<div className="mt-4 text-center text-sm">
|
|
103
|
+
Don't have an account?{' '}
|
|
104
|
+
<button
|
|
105
|
+
type="button"
|
|
106
|
+
onClick={onSignUp}
|
|
107
|
+
className="underline underline-offset-4"
|
|
108
|
+
>
|
|
109
|
+
Sign up
|
|
110
|
+
</button>
|
|
111
|
+
</div>
|
|
112
|
+
)}
|
|
113
|
+
</form>
|
|
114
|
+
) : (
|
|
115
|
+
<form onSubmit={handleOTPSubmit}>
|
|
116
|
+
<div className="flex flex-col gap-6">
|
|
117
|
+
<div className="flex justify-center">
|
|
118
|
+
<InputOTP
|
|
119
|
+
maxLength={6}
|
|
120
|
+
value={otpValue}
|
|
121
|
+
onChange={(value) => setOtpValue(value)}
|
|
122
|
+
>
|
|
123
|
+
<InputOTPGroup>
|
|
124
|
+
<InputOTPSlot index={0} />
|
|
125
|
+
<InputOTPSlot index={1} />
|
|
126
|
+
<InputOTPSlot index={2} />
|
|
127
|
+
</InputOTPGroup>
|
|
128
|
+
<InputOTPSeparator />
|
|
129
|
+
<InputOTPGroup>
|
|
130
|
+
<InputOTPSlot index={3} />
|
|
131
|
+
<InputOTPSlot index={4} />
|
|
132
|
+
<InputOTPSlot index={5} />
|
|
133
|
+
</InputOTPGroup>
|
|
134
|
+
</InputOTP>
|
|
135
|
+
</div>
|
|
136
|
+
<Button type="submit" className="w-full" disabled={otpValue.length !== 6}>
|
|
137
|
+
Verify
|
|
138
|
+
</Button>
|
|
139
|
+
<div className="flex flex-col gap-2">
|
|
140
|
+
<Button
|
|
141
|
+
type="button"
|
|
142
|
+
variant="outline"
|
|
143
|
+
className="w-full"
|
|
144
|
+
onClick={() => setStep('credentials')}
|
|
145
|
+
>
|
|
146
|
+
Back to login
|
|
147
|
+
</Button>
|
|
148
|
+
{onResendCode && (
|
|
149
|
+
<button
|
|
150
|
+
type="button"
|
|
151
|
+
onClick={onResendCode}
|
|
152
|
+
className="text-center text-sm underline underline-offset-4"
|
|
153
|
+
>
|
|
154
|
+
Didn't receive a code? Resend
|
|
155
|
+
</button>
|
|
156
|
+
)}
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</form>
|
|
160
|
+
)}
|
|
161
|
+
</CardContent>
|
|
162
|
+
</Card>
|
|
163
|
+
</div>
|
|
164
|
+
)
|
|
165
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { cn } from '@hanzo/ui/util'
|
|
4
|
+
import { Button } from '@hanzo/ui/primitives'
|
|
5
|
+
import {
|
|
6
|
+
Card,
|
|
7
|
+
CardContent,
|
|
8
|
+
CardDescription,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardTitle,
|
|
11
|
+
} from '@hanzo/ui/primitives'
|
|
12
|
+
import { Input } from '@hanzo/ui/primitives'
|
|
13
|
+
import { Label } from '@hanzo/ui/primitives'
|
|
14
|
+
|
|
15
|
+
interface LoginBasicProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
16
|
+
onSubmit?: (email: string, password: string) => void
|
|
17
|
+
onForgotPassword?: () => void
|
|
18
|
+
onSignUp?: () => void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function LoginBasic({
|
|
22
|
+
className,
|
|
23
|
+
onSubmit,
|
|
24
|
+
onForgotPassword,
|
|
25
|
+
onSignUp,
|
|
26
|
+
...props
|
|
27
|
+
}: LoginBasicProps) {
|
|
28
|
+
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
|
29
|
+
e.preventDefault()
|
|
30
|
+
const formData = new FormData(e.currentTarget)
|
|
31
|
+
const email = formData.get('email') as string
|
|
32
|
+
const password = formData.get('password') as string
|
|
33
|
+
onSubmit?.(email, password)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<div className={cn('flex flex-col gap-6', className)} {...props}>
|
|
38
|
+
<Card>
|
|
39
|
+
<CardHeader>
|
|
40
|
+
<CardTitle className="text-2xl">Login</CardTitle>
|
|
41
|
+
<CardDescription>
|
|
42
|
+
Enter your email below to login to your account
|
|
43
|
+
</CardDescription>
|
|
44
|
+
</CardHeader>
|
|
45
|
+
<CardContent>
|
|
46
|
+
<form onSubmit={handleSubmit}>
|
|
47
|
+
<div className="flex flex-col gap-6">
|
|
48
|
+
<div className="grid gap-2">
|
|
49
|
+
<Label htmlFor="email">Email</Label>
|
|
50
|
+
<Input
|
|
51
|
+
id="email"
|
|
52
|
+
name="email"
|
|
53
|
+
type="email"
|
|
54
|
+
placeholder="m@example.com"
|
|
55
|
+
required
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
<div className="grid gap-2">
|
|
59
|
+
<div className="flex items-center">
|
|
60
|
+
<Label htmlFor="password">Password</Label>
|
|
61
|
+
{onForgotPassword && (
|
|
62
|
+
<button
|
|
63
|
+
type="button"
|
|
64
|
+
onClick={onForgotPassword}
|
|
65
|
+
className="ml-auto inline-block text-sm underline-offset-4 hover:underline"
|
|
66
|
+
>
|
|
67
|
+
Forgot your password?
|
|
68
|
+
</button>
|
|
69
|
+
)}
|
|
70
|
+
</div>
|
|
71
|
+
<Input id="password" name="password" type="password" required />
|
|
72
|
+
</div>
|
|
73
|
+
<Button type="submit" className="w-full">
|
|
74
|
+
Login
|
|
75
|
+
</Button>
|
|
76
|
+
</div>
|
|
77
|
+
{onSignUp && (
|
|
78
|
+
<div className="mt-4 text-center text-sm">
|
|
79
|
+
Don't have an account?{' '}
|
|
80
|
+
<button
|
|
81
|
+
type="button"
|
|
82
|
+
onClick={onSignUp}
|
|
83
|
+
className="underline underline-offset-4"
|
|
84
|
+
>
|
|
85
|
+
Sign up
|
|
86
|
+
</button>
|
|
87
|
+
</div>
|
|
88
|
+
)}
|
|
89
|
+
</form>
|
|
90
|
+
</CardContent>
|
|
91
|
+
</Card>
|
|
92
|
+
</div>
|
|
93
|
+
)
|
|
94
|
+
}
|