@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,17 @@
|
|
|
1
|
+
export async function copyToClipboard(text: string) {
|
|
2
|
+
try {
|
|
3
|
+
await navigator.clipboard.writeText(text);
|
|
4
|
+
} catch {
|
|
5
|
+
// Fallback for browsers where the Clipboard API is not supported
|
|
6
|
+
const textarea = document.createElement('textarea');
|
|
7
|
+
textarea.style.position = 'fixed';
|
|
8
|
+
textarea.style.top = '-9999px';
|
|
9
|
+
textarea.style.left = '-9999px';
|
|
10
|
+
textarea.innerText = text;
|
|
11
|
+
document.body.appendChild(textarea);
|
|
12
|
+
textarea.focus();
|
|
13
|
+
textarea.select();
|
|
14
|
+
document.execCommand('copy');
|
|
15
|
+
textarea.remove();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createRoot } from 'react-dom/client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a shadow root with the specified styles and returns a React root in it.
|
|
5
|
+
* @param {string} tagName - Node name to be applied to the shadow root.
|
|
6
|
+
* @param {string} styles - CSS styles to be applied to the shadow root.
|
|
7
|
+
* @returns {ReactRoot} - React root rendered inside the shadow root.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export function createShadowRoot(tagName: string, styles: string) {
|
|
11
|
+
const container = document.createElement(tagName);
|
|
12
|
+
const shadow = container.attachShadow({ mode: 'open' });
|
|
13
|
+
|
|
14
|
+
// Create a new CSS style sheet and apply the specified styles and apply the style sheet to the shadow root
|
|
15
|
+
const globalStyleSheet = new CSSStyleSheet();
|
|
16
|
+
globalStyleSheet.replaceSync(styles);
|
|
17
|
+
shadow.adoptedStyleSheets = [globalStyleSheet];
|
|
18
|
+
|
|
19
|
+
const html = document.querySelector('html') as HTMLHtmlElement;
|
|
20
|
+
html.prepend(container);
|
|
21
|
+
return createRoot(shadow);
|
|
22
|
+
}
|
package/util/date.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// import { FormattedMessage } from '@hanzo_network/hanzo-node-state/v2/queries/getChatConversation/types';
|
|
2
|
+
type FormattedMessage = any;
|
|
3
|
+
|
|
4
|
+
export type ChatConversationMessage = {
|
|
5
|
+
hash: string;
|
|
6
|
+
parentHash: string;
|
|
7
|
+
inboxId: string;
|
|
8
|
+
scheduledTime: string | undefined;
|
|
9
|
+
content: string;
|
|
10
|
+
isLocal: boolean;
|
|
11
|
+
sender: {
|
|
12
|
+
avatar: string;
|
|
13
|
+
};
|
|
14
|
+
fileInbox?: {
|
|
15
|
+
id: string;
|
|
16
|
+
files: {
|
|
17
|
+
name: string;
|
|
18
|
+
preview?: string;
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export type GetChatConversationOutput = ChatConversationMessage[];
|
|
23
|
+
|
|
24
|
+
export const formatDateToUSLocaleString = (date: Date | undefined) => {
|
|
25
|
+
if (!date) return '-';
|
|
26
|
+
return new Date(date).toLocaleDateString('en-US', {
|
|
27
|
+
year: 'numeric',
|
|
28
|
+
month: 'numeric',
|
|
29
|
+
day: 'numeric',
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
export const formatDateToLocaleStringWithTime = (date: Date | undefined) => {
|
|
33
|
+
if (!date) return '-';
|
|
34
|
+
return new Date(date).toLocaleDateString('en-US', {
|
|
35
|
+
year: 'numeric',
|
|
36
|
+
month: 'numeric',
|
|
37
|
+
day: 'numeric',
|
|
38
|
+
hour: 'numeric',
|
|
39
|
+
minute: 'numeric',
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const getRelativeDateLabel = (date: Date): string => {
|
|
44
|
+
const today = new Date();
|
|
45
|
+
const yesterday = new Date();
|
|
46
|
+
yesterday.setDate(today.getDate() - 1);
|
|
47
|
+
if (date.toDateString() === today.toDateString()) {
|
|
48
|
+
return 'today';
|
|
49
|
+
} else if (date.toDateString() === yesterday.toDateString()) {
|
|
50
|
+
return 'yesterday';
|
|
51
|
+
} else {
|
|
52
|
+
return date.toDateString();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const groupMessagesByDate = (messages: FormattedMessage[]) => {
|
|
57
|
+
const groupedMessages: Record<string, FormattedMessage[]> = {};
|
|
58
|
+
for (const message of messages) {
|
|
59
|
+
const date = new Date(message.createdAt ?? '').toDateString();
|
|
60
|
+
if (!groupedMessages[date]) {
|
|
61
|
+
groupedMessages[date] = [];
|
|
62
|
+
}
|
|
63
|
+
groupedMessages[date].push(message);
|
|
64
|
+
}
|
|
65
|
+
return groupedMessages;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const formatDateToMonthAndDay = (date: Date): string => {
|
|
69
|
+
const today = new Date();
|
|
70
|
+
if (
|
|
71
|
+
date.getDate() === today.getDate() &&
|
|
72
|
+
date.getMonth() === today.getMonth() &&
|
|
73
|
+
date.getFullYear() === today.getFullYear()
|
|
74
|
+
) {
|
|
75
|
+
return date.toLocaleTimeString('en-US', {
|
|
76
|
+
hour: 'numeric',
|
|
77
|
+
minute: 'numeric',
|
|
78
|
+
hour12: true,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
const month = date.getMonth() + 1;
|
|
82
|
+
const day = date.getDate();
|
|
83
|
+
return `${month}/${day}`;
|
|
84
|
+
};
|
package/util/debounce.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const debounce = (func: Function, delay: number) => {
|
|
2
|
+
let timeoutId: NodeJS.Timeout | null = null;
|
|
3
|
+
return (...args: any[]) => {
|
|
4
|
+
if (timeoutId) {
|
|
5
|
+
clearTimeout(timeoutId);
|
|
6
|
+
}
|
|
7
|
+
timeoutId = setTimeout(() => {
|
|
8
|
+
func(...args);
|
|
9
|
+
}, delay);
|
|
10
|
+
};
|
|
11
|
+
};
|
package/util/file.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const getFileName = (fileName: string): string => {
|
|
2
|
+
const nameParts = fileName.split('.');
|
|
3
|
+
return nameParts.slice(0, -1).join('.');
|
|
4
|
+
};
|
|
5
|
+
export const getFileExt = (fileName: string): string => {
|
|
6
|
+
const nameParts = fileName.split('.');
|
|
7
|
+
return nameParts.pop() || '';
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const isFileTypeImageOrPdf = (file: File): boolean => {
|
|
11
|
+
if (!file) return false;
|
|
12
|
+
return (
|
|
13
|
+
file?.type.startsWith('image/') || file?.type.startsWith('application/pdf')
|
|
14
|
+
);
|
|
15
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import Abbr, { QuantityAbbrSymbol, ABBR_SYMBOLS_ARRAY } from './number-abbreviate'
|
|
2
|
+
|
|
3
|
+
interface FormatThreshold {
|
|
4
|
+
from: number
|
|
5
|
+
use: QuantityAbbrSymbol
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const usdFormatter = Intl.NumberFormat('en-US', {
|
|
9
|
+
style: 'currency',
|
|
10
|
+
currency: 'USD',
|
|
11
|
+
minimumFractionDigits: 2,
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const formatAsUSCurrency = (n: number) => {
|
|
15
|
+
let result = usdFormatter.format(n)
|
|
16
|
+
return result.endsWith('.00') ? result.slice(0, -3) : result
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const formatAndAbbreviateAsCurrency = (
|
|
20
|
+
n: number | null,
|
|
21
|
+
thresholds: FormatThreshold[] = [{
|
|
22
|
+
from: 1000000000,
|
|
23
|
+
use: 'M'
|
|
24
|
+
}],
|
|
25
|
+
/**
|
|
26
|
+
* Chars that will be added by ui if the number is rounded.
|
|
27
|
+
* For example, if the desired output for 10.15 is "~10.1",
|
|
28
|
+
* the tilda counts as 1 char.
|
|
29
|
+
*/
|
|
30
|
+
roundingAdds: number = 1,
|
|
31
|
+
maxDecimal: number = 2
|
|
32
|
+
): {
|
|
33
|
+
full: string
|
|
34
|
+
result: string
|
|
35
|
+
change: 'rounded' | 'none' | 'abbr' | 'empty'
|
|
36
|
+
} => {
|
|
37
|
+
if (n === null) {
|
|
38
|
+
return {
|
|
39
|
+
full: '',
|
|
40
|
+
result: '',
|
|
41
|
+
change: 'empty'
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const formatted = formatAsUSCurrency(n)
|
|
46
|
+
|
|
47
|
+
if (n < thresholds[0].from) {
|
|
48
|
+
return {
|
|
49
|
+
full: formatted,
|
|
50
|
+
result: formatted,
|
|
51
|
+
change: 'none'
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Get operative FormatThreshold pair...
|
|
56
|
+
let threshold: FormatThreshold
|
|
57
|
+
for (
|
|
58
|
+
let i = 0;
|
|
59
|
+
i < thresholds.length && n >= thresholds[i].from;
|
|
60
|
+
threshold = thresholds[i], i++
|
|
61
|
+
) {}
|
|
62
|
+
|
|
63
|
+
// Build up units array to all units
|
|
64
|
+
// up to threshold.use
|
|
65
|
+
const units: QuantityAbbrSymbol[] = []
|
|
66
|
+
for (let i = 0; i < ABBR_SYMBOLS_ARRAY.length; i++) {
|
|
67
|
+
const current = ABBR_SYMBOLS_ARRAY[i]
|
|
68
|
+
units.push(current)
|
|
69
|
+
if (current === threshold!.use) {
|
|
70
|
+
break
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const abbreviator = new Abbr(units)
|
|
75
|
+
|
|
76
|
+
// Use threshold.from as a guide to how many chars are available:
|
|
77
|
+
// first digit + comma = 2
|
|
78
|
+
// Possible trailing cents: '.xx'.length = 3
|
|
79
|
+
// 3 - 2 = 1
|
|
80
|
+
const charsAvail = formatAsUSCurrency(threshold!.from).length + 1
|
|
81
|
+
const abbr = abbreviator.abbreviate(n, charsAvail) // arbitrary, but good approx
|
|
82
|
+
const numStr = abbr.slice(0, -1)
|
|
83
|
+
const abbreviation = abbr.slice(-1)
|
|
84
|
+
const numerical = parseFloat(numStr)
|
|
85
|
+
|
|
86
|
+
const integral = Math.floor(numerical)
|
|
87
|
+
const integralString = formatAsUSCurrency(integral)
|
|
88
|
+
const commas = integralString.split(',').length - 1
|
|
89
|
+
|
|
90
|
+
// minus abbr, dec point, dollar sign, and roundingAdds / tilda,
|
|
91
|
+
// (1 + 1 + 1 + roundingAdds)
|
|
92
|
+
// ("precision" does NOT include the decimal point itself,
|
|
93
|
+
// so we have to explicitly factor it in.)
|
|
94
|
+
const roundedString = numerical.toPrecision(charsAvail - commas - (3 + roundingAdds))
|
|
95
|
+
// remove trailing zeros, if any
|
|
96
|
+
const roundedNumerical = parseFloat(roundedString)
|
|
97
|
+
const roundedIntegral = Math.trunc(roundedNumerical)
|
|
98
|
+
const roundedIntegralString = formatAsUSCurrency(roundedIntegral)
|
|
99
|
+
|
|
100
|
+
let decimalPortion = roundedNumerical - roundedIntegral
|
|
101
|
+
let result
|
|
102
|
+
if (decimalPortion !== 0) {
|
|
103
|
+
// remove trailing zeros if any
|
|
104
|
+
decimalPortion = parseFloat(decimalPortion.toFixed(maxDecimal))
|
|
105
|
+
const decimalPortionString = decimalPortion.toString()
|
|
106
|
+
const afterDecimalString = decimalPortionString.slice(decimalPortionString.indexOf('.') + 1)
|
|
107
|
+
result = roundedIntegralString + '.' + afterDecimalString + abbreviation
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
result = roundedIntegralString + abbreviation
|
|
111
|
+
}
|
|
112
|
+
// Did we lose any precision?
|
|
113
|
+
const rounded = (roundedIntegral + decimalPortion !== n)
|
|
114
|
+
return {
|
|
115
|
+
full: formatted,
|
|
116
|
+
result,
|
|
117
|
+
change: rounded ? 'rounded' : 'abbr'
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
formatAndAbbreviateAsCurrency as default,
|
|
123
|
+
type FormatThreshold,
|
|
124
|
+
type QuantityAbbrSymbol
|
|
125
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// import { HanzoToolHeader } from '@hanzo_network/hanzo-message-ts/api/tools/types';
|
|
2
|
+
type HanzoToolHeader = any;
|
|
3
|
+
|
|
4
|
+
export const formatText = (text: string) => {
|
|
5
|
+
const camelToSpaces = text.replace(/([a-z])([A-Z])/g, '$1 $2');
|
|
6
|
+
const snakeToSpaces = camelToSpaces.replace(/_/g, ' ');
|
|
7
|
+
return snakeToSpaces
|
|
8
|
+
.split(' ')
|
|
9
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
10
|
+
.join(' ');
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const formatCamelCaseText = (text: string) => {
|
|
14
|
+
const words = text.split(/(?=[A-Z])/);
|
|
15
|
+
|
|
16
|
+
const formattedWords = words.map((word) => {
|
|
17
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const result = formattedWords.join(' ');
|
|
21
|
+
|
|
22
|
+
return result.charAt(0).toUpperCase() + result.slice(1);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const getVersionFromTool = (toolRouterKey: HanzoToolHeader) => {
|
|
26
|
+
if (toolRouterKey.version) {
|
|
27
|
+
return toolRouterKey.version;
|
|
28
|
+
}
|
|
29
|
+
const parts = toolRouterKey.name.split(':::');
|
|
30
|
+
if (parts.length === 4) {
|
|
31
|
+
return parts[3];
|
|
32
|
+
}
|
|
33
|
+
return 'latest';
|
|
34
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import Abbr from './number-abbreviate'
|
|
2
|
+
|
|
3
|
+
const abbr = new Abbr(['K', 'M', 'B', 'T'])
|
|
4
|
+
|
|
5
|
+
const formatToMaxChar = (
|
|
6
|
+
n: number | null,
|
|
7
|
+
maxChars: number,
|
|
8
|
+
/**
|
|
9
|
+
* Chars that will be added by ui if the number is rounded.
|
|
10
|
+
* For example, if the desired output for 10.15 is "~10.1",
|
|
11
|
+
* the tilda counts as 1 char.
|
|
12
|
+
*/
|
|
13
|
+
roundingAdds: number = 1
|
|
14
|
+
): {
|
|
15
|
+
result: string
|
|
16
|
+
change: 'rounded' | 'none' | 'abbr' | 'empty'
|
|
17
|
+
} => {
|
|
18
|
+
if (n === null) {
|
|
19
|
+
return {
|
|
20
|
+
result: '',
|
|
21
|
+
change: 'empty'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const s = n.toString()
|
|
25
|
+
if (s.length > maxChars) {
|
|
26
|
+
// Highest number that can be rounded down to an
|
|
27
|
+
// acceptable string.
|
|
28
|
+
// Decimal point, plus one decimal place = 2 chars
|
|
29
|
+
const cuttoff = Math.pow(10, maxChars - 2 - roundingAdds) - 0.05
|
|
30
|
+
if (n < cuttoff) {
|
|
31
|
+
const intPortion = Math.floor(n)
|
|
32
|
+
const len = intPortion.toString().length
|
|
33
|
+
// 1 is for dec point itself
|
|
34
|
+
const availDecimals = maxChars - len - 1 - roundingAdds
|
|
35
|
+
// removes trailing zeros, if any
|
|
36
|
+
const roundedNumerical = parseFloat(n.toFixed(availDecimals))
|
|
37
|
+
return {
|
|
38
|
+
result: roundedNumerical.toString(),
|
|
39
|
+
change: 'rounded'
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
|
|
44
|
+
const str = abbr.abbreviate(n, maxChars)
|
|
45
|
+
const numStr = str.slice(0, -1)
|
|
46
|
+
const abbreviation = str.slice(-1)
|
|
47
|
+
const numerical = parseFloat(numStr)
|
|
48
|
+
|
|
49
|
+
// minus abbr, dec point, and roundingAdds / tilda,
|
|
50
|
+
// (1 + 1 + roundingAdds)
|
|
51
|
+
// ("precision" does NOT include the decimal point itself,
|
|
52
|
+
// so we have to explicitly factor it in.)
|
|
53
|
+
const roundedString = numerical.toPrecision(maxChars - (2 + roundingAdds))
|
|
54
|
+
// remove trailing zeros, if any
|
|
55
|
+
const roundedNumerical = parseFloat(roundedString)
|
|
56
|
+
return {
|
|
57
|
+
result: roundedNumerical.toString() + abbreviation,
|
|
58
|
+
change: roundedNumerical === numerical ? 'abbr' : 'rounded'
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
result: s,
|
|
64
|
+
change: 'none'
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export default formatToMaxChar
|
package/util/index.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Export all utilities
|
|
2
|
+
export * from './date';
|
|
3
|
+
export * from './file';
|
|
4
|
+
export * from './create-shadow-root';
|
|
5
|
+
export * from './timing';
|
|
6
|
+
export * from './blob';
|
|
7
|
+
export * from './copy-to-clipboard';
|
|
8
|
+
export * from './format-text';
|
|
9
|
+
export * from './toasts';
|
|
10
|
+
export * from './debounce';
|
|
11
|
+
export { default as spreadToTransform } from './spread-to-transform';
|
|
12
|
+
export * from './specifier';
|
|
13
|
+
export * from './number-abbreviate';
|
|
14
|
+
export * from './format-to-max-char';
|
|
15
|
+
export * from './format-and-abbreviate-as-currency';
|
|
16
|
+
export * from './two-way-map';
|
|
17
|
+
|
|
18
|
+
// Import and re-export cn utility and other common functions
|
|
19
|
+
import { type ClassValue, clsx } from 'clsx';
|
|
20
|
+
import { twMerge } from 'tailwind-merge';
|
|
21
|
+
|
|
22
|
+
export function cn(...inputs: ClassValue[]) {
|
|
23
|
+
return twMerge(clsx(inputs));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function formatDate(input: string | number): string {
|
|
27
|
+
const date = new Date(input);
|
|
28
|
+
return date.toLocaleDateString('en-US', {
|
|
29
|
+
month: 'long',
|
|
30
|
+
day: 'numeric',
|
|
31
|
+
year: 'numeric',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function absoluteUrl(path: string): string {
|
|
36
|
+
if (typeof window !== 'undefined') return path;
|
|
37
|
+
if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}${path}`;
|
|
38
|
+
return `http://localhost:${process.env.PORT ?? 3000}${path}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Export VariantProps type from class-variance-authority
|
|
42
|
+
export type { VariantProps } from 'class-variance-authority';
|
|
43
|
+
|
|
44
|
+
// For backward compatibility with components importing from util
|
|
45
|
+
export function constrain(value: number, min: number, max: number): number;
|
|
46
|
+
export function constrain(dim: { w: number; h: number }, constrainTo: { w: number; h: number }): { w: number; h: number };
|
|
47
|
+
export function constrain(
|
|
48
|
+
value: number | { w: number; h: number },
|
|
49
|
+
minOrConstrainTo: number | { w: number; h: number },
|
|
50
|
+
max?: number
|
|
51
|
+
): number | { w: number; h: number } {
|
|
52
|
+
if (typeof value === 'number' && typeof minOrConstrainTo === 'number' && typeof max === 'number') {
|
|
53
|
+
return Math.min(Math.max(value, minOrConstrainTo), max);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (typeof value === 'object' && typeof minOrConstrainTo === 'object') {
|
|
57
|
+
const dim = value;
|
|
58
|
+
const constrainTo = minOrConstrainTo;
|
|
59
|
+
const aspectRatio = dim.w / dim.h;
|
|
60
|
+
const constrainAspectRatio = constrainTo.w / constrainTo.h;
|
|
61
|
+
|
|
62
|
+
if (aspectRatio > constrainAspectRatio) {
|
|
63
|
+
// constrain by width
|
|
64
|
+
return {
|
|
65
|
+
w: constrainTo.w,
|
|
66
|
+
h: constrainTo.w / aspectRatio
|
|
67
|
+
};
|
|
68
|
+
} else {
|
|
69
|
+
// constrain by height
|
|
70
|
+
return {
|
|
71
|
+
w: constrainTo.h * aspectRatio,
|
|
72
|
+
h: constrainTo.h
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
throw new Error('Invalid parameters for constrain function');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Export round, pxToRem, pxToEm for tailwind plugin
|
|
81
|
+
export function round(value: number): number {
|
|
82
|
+
return Math.round(value * 100) / 100;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function pxToRem(px: number, base = 16): string {
|
|
86
|
+
return `${px / base}rem`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function pxToEm(px: number, base = 16): string {
|
|
90
|
+
return `${px / base}em`;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Missing utility functions
|
|
94
|
+
export function containsToken(text: string, token: string): boolean {
|
|
95
|
+
return text.toLowerCase().includes(token.toLowerCase());
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function ldMerge(...objects: any[]): any {
|
|
99
|
+
// Simple merge function for lodash compatibility
|
|
100
|
+
const result = {};
|
|
101
|
+
for (const obj of objects) {
|
|
102
|
+
if (obj && typeof obj === 'object') {
|
|
103
|
+
Object.assign(result, obj);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function asNum(value: any, defaultValue = 0): number {
|
|
110
|
+
const num = Number(value);
|
|
111
|
+
return isNaN(num) ? defaultValue : num;
|
|
112
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// cf: https://github.com/domharrington/js-number-abbreviate/blob/master/index.js
|
|
2
|
+
|
|
3
|
+
type QuantityAbbrSymbol = 'K' | 'M' | 'B' | 'T'
|
|
4
|
+
const ABBR_SYMBOLS_ARRAY = ['K', 'M', 'B', 'T'] satisfies QuantityAbbrSymbol[]
|
|
5
|
+
|
|
6
|
+
class NumberAbbreviator {
|
|
7
|
+
|
|
8
|
+
private _units: QuantityAbbrSymbol[]
|
|
9
|
+
|
|
10
|
+
constructor(units?: QuantityAbbrSymbol[]) {
|
|
11
|
+
this._units = units ?? ABBR_SYMBOLS_ARRAY
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
private _abbreviate = (
|
|
15
|
+
n: number,
|
|
16
|
+
decPlaces: number,
|
|
17
|
+
log: boolean = false
|
|
18
|
+
): string => {
|
|
19
|
+
|
|
20
|
+
const _decPlaces = Math.pow(10, decPlaces)
|
|
21
|
+
let _n = n
|
|
22
|
+
|
|
23
|
+
let _unit
|
|
24
|
+
for (let i = this._units.length - 1; i >= 0; i--) {
|
|
25
|
+
const size = Math.pow(10, (i + 1) * 3)
|
|
26
|
+
if (size <= _n) {
|
|
27
|
+
_n = Math.round(_n * _decPlaces / size) / _decPlaces
|
|
28
|
+
if ((_n === 1000) && (i < this._units.length - 1)) {
|
|
29
|
+
_n = 1
|
|
30
|
+
i++
|
|
31
|
+
}
|
|
32
|
+
_unit = this._units[i]
|
|
33
|
+
break
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return _n.toString() + (_unit ?? '')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
abbreviate = (n: number, decPlaces: number, log: boolean = false) => {
|
|
40
|
+
const abbreviatedNumber = this._abbreviate(Math.abs(n), decPlaces, log)
|
|
41
|
+
return n < 0 ? '-' + abbreviatedNumber : abbreviatedNumber
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
type QuantityAbbrSymbol,
|
|
47
|
+
ABBR_SYMBOLS_ARRAY,
|
|
48
|
+
NumberAbbreviator as default
|
|
49
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Dimensions, TShirtSize } from '../types'
|
|
2
|
+
import type { TypographySize } from '../primitives/apply-typography'
|
|
3
|
+
|
|
4
|
+
export const getPrimaryStartingWith = (s: string, toFind: string) => {
|
|
5
|
+
const tokenArray = s.split(' ')
|
|
6
|
+
return tokenArray.find((tok) => (tok.startsWith(`${toFind}-`)))
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const getTShirtSize = (s: string): TShirtSize | undefined => {
|
|
10
|
+
const subTokenArray = s.split('-')
|
|
11
|
+
return subTokenArray[subTokenArray.length - 1] as TShirtSize
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const getTypographySize = (s: string): TypographySize | undefined => {
|
|
15
|
+
const subTokenArray = s.split('-')
|
|
16
|
+
return subTokenArray[subTokenArray.length - 1] as TypographySize
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const getDim = (s: string): Dimensions | undefined => {
|
|
20
|
+
const subTokenArray = s.split('-')
|
|
21
|
+
const dimStr = subTokenArray[subTokenArray.length - 1]
|
|
22
|
+
if (dimStr) {
|
|
23
|
+
const dimTokenArray = s.split('x')
|
|
24
|
+
return dimTokenArray ? {
|
|
25
|
+
w: Number(dimTokenArray[0]),
|
|
26
|
+
h: Number(dimTokenArray[1])
|
|
27
|
+
} : undefined
|
|
28
|
+
}
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function getSpecifierData<T>(
|
|
33
|
+
main: string,
|
|
34
|
+
getPrimary: (s: string) => string | undefined,
|
|
35
|
+
getData: (s: string) => T | undefined,
|
|
36
|
+
def?: T
|
|
37
|
+
): T | undefined {
|
|
38
|
+
const primary = getPrimary(main)
|
|
39
|
+
if (primary) {
|
|
40
|
+
return getData(primary) ?? def
|
|
41
|
+
}
|
|
42
|
+
return def ?? undefined
|
|
43
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MediaTransform } from '../types'
|
|
2
|
+
|
|
3
|
+
export function spreadToTransform(t: MediaTransform) {
|
|
4
|
+
let transformStrings: string[] = []
|
|
5
|
+
const scaleVal = 'scale' in t ? t.scale : undefined
|
|
6
|
+
if (scaleVal) {
|
|
7
|
+
if (typeof scaleVal === 'number') {
|
|
8
|
+
transformStrings.push(`scale(${scaleVal})`)
|
|
9
|
+
}
|
|
10
|
+
else if (
|
|
11
|
+
Array.isArray(scaleVal) &&
|
|
12
|
+
scaleVal.length == 2 &&
|
|
13
|
+
typeof scaleVal[0] === 'number'
|
|
14
|
+
) {
|
|
15
|
+
transformStrings.push(`scale(${scaleVal[0]}, ${scaleVal[1]})`)
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
throw new Error("parsing MediaTransform: Unrecognized value for 'scale'!")
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return transformStrings.length > 0 ? { transform: transformStrings.join(' ') } : {}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default spreadToTransform
|