From 94d5d7e16e13e93907f784aa60fa7445d2beadc2 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:49:11 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .commitlintrc.json | 3 + .editorconfig | 10 + .eslintignore | 8 + .eslintrc.json | 32 + .gitignore | 51 + .kodiak.toml | 18 + .prettierignore | 7 + CONTRIBUTING.md | 143 + LICENSE.md | 21 + README.md | 205 + README.wehub.md | 7 + apps/www/.env.example | 10 + apps/www/.gitignore | 48 + apps/www/.prettierignore | 7 + apps/www/app/(app)/(root)/page.tsx | 220 + .../app/(app)/blocks/[...categories]/page.tsx | 30 + apps/www/app/(app)/blocks/layout.tsx | 71 + apps/www/app/(app)/blocks/page.tsx | 23 + apps/www/app/(app)/docs/[[...slug]]/page.tsx | 212 + apps/www/app/(app)/docs/layout.tsx | 18 + apps/www/app/(app)/layout.tsx | 12 + apps/www/app/(app)/llm/[[...slug]]/route.ts | 29 + apps/www/app/(view)/view/[name]/page.tsx | 103 + apps/www/app/api/r/[name]/route.ts | 87 + apps/www/app/layout.tsx | 107 + apps/www/app/llms.txt/route.ts | 140 + apps/www/app/og/geist-regular-otf.json | 1 + apps/www/app/og/geist-semibold-otf.json | 1 + apps/www/app/og/geistmono-regular-otf.json | 1 + apps/www/app/og/route.tsx | 97 + apps/www/components.json | 21 + apps/www/components/active-theme.tsx | 56 + apps/www/components/analytics.tsx | 80 + apps/www/components/announcement.tsx | 14 + apps/www/components/block-display.tsx | 63 + apps/www/components/block-image.tsx | 36 + apps/www/components/block-viewer.tsx | 560 + apps/www/components/blocks-nav.tsx | 58 + apps/www/components/blur-vignette.tsx | 101 + apps/www/components/callout.tsx | 30 + apps/www/components/cards/activity-goal.tsx | 132 + apps/www/components/cards/calendar.tsx | 26 + apps/www/components/cards/cookie-settings.tsx | 51 + apps/www/components/cards/create-account.tsx | 73 + apps/www/components/cards/forms.tsx | 127 + apps/www/components/cards/index.tsx | 15 + apps/www/components/cards/payment-method.tsx | 134 + apps/www/components/cards/payments.tsx | 297 + apps/www/components/cards/report-issue.tsx | 97 + apps/www/components/cards/share.tsx | 116 + .../components/cards/software-purchase.tsx | 99 + apps/www/components/chart-code-viewer.tsx | 120 + apps/www/components/chart-copy-button.tsx | 63 + apps/www/components/chart-display.tsx | 54 + apps/www/components/chart-toolbar.tsx | 107 + apps/www/components/charts-nav.tsx | 70 + apps/www/components/code-block-command.tsx | 135 + .../components/code-collapsible-wrapper.tsx | 51 + apps/www/components/code-tabs.tsx | 26 + apps/www/components/command-menu.tsx | 341 + .../www/components/component-preview-tabs.tsx | 85 + apps/www/components/component-preview.tsx | 75 + apps/www/components/component-source.tsx | 101 + apps/www/components/component-wrapper.tsx | 66 + apps/www/components/components-list.tsx | 31 + apps/www/components/copy-button.tsx | 77 + apps/www/components/docs-breadcrumb.tsx | 65 + apps/www/components/docs-copy-page.tsx | 156 + apps/www/components/docs-sidebar-cta.tsx | 37 + apps/www/components/docs-sidebar.tsx | 157 + apps/www/components/docs-toc.tsx | 126 + apps/www/components/examples-nav.tsx | 23 + apps/www/components/examples-preview.tsx | 469 + apps/www/components/github-link.tsx | 41 + apps/www/components/icons.tsx | 220 + apps/www/components/main-nav.tsx | 33 + apps/www/components/mobile-nav.tsx | 142 + apps/www/components/mode-switcher.tsx | 51 + apps/www/components/nav-header.tsx | 37 + apps/www/components/nav-user.tsx | 114 + apps/www/components/open-in-v0-button.tsx | 28 + apps/www/components/page-header.tsx | 61 + apps/www/components/page-nav.tsx | 15 + apps/www/components/showcase-masonry.tsx | 547 + apps/www/components/site-config.tsx | 33 + apps/www/components/site-footer.tsx | 37 + apps/www/components/site-header.tsx | 75 + apps/www/components/tailwind-indicator.tsx | 21 + apps/www/components/testimonials-section.tsx | 178 + apps/www/components/theme-provider.tsx | 22 + apps/www/components/theme-selector.tsx | 109 + apps/www/components/ui/accordion.tsx | 66 + apps/www/components/ui/alert-dialog.tsx | 157 + apps/www/components/ui/alert.tsx | 66 + apps/www/components/ui/aspect-ratio.tsx | 11 + apps/www/components/ui/avatar.tsx | 53 + apps/www/components/ui/badge.tsx | 46 + apps/www/components/ui/breadcrumb.tsx | 109 + apps/www/components/ui/button.tsx | 58 + apps/www/components/ui/calendar.tsx | 213 + apps/www/components/ui/card.tsx | 92 + apps/www/components/ui/carousel.tsx | 241 + apps/www/components/ui/chart.tsx | 357 + apps/www/components/ui/checkbox.tsx | 32 + apps/www/components/ui/collapsible.tsx | 33 + apps/www/components/ui/command.tsx | 184 + apps/www/components/ui/context-menu.tsx | 252 + apps/www/components/ui/dialog.tsx | 143 + apps/www/components/ui/drawer.tsx | 135 + apps/www/components/ui/dropdown-menu.tsx | 257 + apps/www/components/ui/form.tsx | 167 + apps/www/components/ui/hover-card.tsx | 44 + apps/www/components/ui/input-otp.tsx | 77 + apps/www/components/ui/input.tsx | 21 + apps/www/components/ui/label.tsx | 24 + apps/www/components/ui/menubar.tsx | 276 + apps/www/components/ui/navigation-menu.tsx | 168 + apps/www/components/ui/pagination.tsx | 127 + apps/www/components/ui/popover.tsx | 48 + apps/www/components/ui/progress.tsx | 31 + apps/www/components/ui/radio-group.tsx | 45 + apps/www/components/ui/resizable.tsx | 56 + apps/www/components/ui/scroll-area.tsx | 58 + apps/www/components/ui/select.tsx | 185 + apps/www/components/ui/separator.tsx | 28 + apps/www/components/ui/sheet.tsx | 139 + apps/www/components/ui/sidebar.tsx | 726 + apps/www/components/ui/skeleton.tsx | 13 + apps/www/components/ui/slider.tsx | 63 + .../components/ui/software-purchase-card.tsx | 99 + apps/www/components/ui/sonner.tsx | 25 + apps/www/components/ui/switch.tsx | 31 + apps/www/components/ui/table.tsx | 116 + apps/www/components/ui/tabs.tsx | 66 + apps/www/components/ui/textarea.tsx | 18 + apps/www/components/ui/toggle-group.tsx | 73 + apps/www/components/ui/toggle.tsx | 47 + apps/www/components/ui/tooltip.tsx | 61 + apps/www/content/docs/(root)/components.mdx | 47 + apps/www/content/docs/(root)/debug-logs.mdx | 47 + apps/www/content/docs/(root)/how-it-works.mdx | 35 + apps/www/content/docs/(root)/index.mdx | 79 + apps/www/content/docs/(root)/meta.json | 10 + apps/www/content/docs/(root)/registry.mdx | 79 + apps/www/content/docs/components/card.mdx | 270 + apps/www/content/docs/components/index.mdx | 6 + .../components/software-purchase-card.mdx | 236 + apps/www/content/docs/meta.json | 7 + apps/www/docs/private-registry.md | 136 + apps/www/eslint.config.mjs | 21 + apps/www/hooks/use-config.ts | 18 + apps/www/hooks/use-copy-to-clipboard.ts | 37 + apps/www/hooks/use-is-mac.ts | 11 + apps/www/hooks/use-layout.tsx | 160 + apps/www/hooks/use-media-query.tsx | 19 + apps/www/hooks/use-meta-color.ts | 28 + apps/www/hooks/use-mobile.ts | 17 + apps/www/hooks/use-mounted.ts | 11 + apps/www/hooks/use-mutation-observer.ts | 20 + apps/www/lib/analytics.ts | 37 + apps/www/lib/auth.ts | 49 + apps/www/lib/blocks.ts | 35 + apps/www/lib/config.ts | 35 + apps/www/lib/events.ts | 33 + apps/www/lib/fonts.ts | 43 + apps/www/lib/highlight-code.ts | 83 + apps/www/lib/registry.ts | 263 + apps/www/lib/rehype.ts | 166 + apps/www/lib/session.ts | 14 + apps/www/lib/source.ts | 7 + apps/www/lib/themes.ts | 31 + apps/www/lib/utils.ts | 10 + apps/www/mdx-components.tsx | 364 + apps/www/middleware.ts | 37 + apps/www/next.config.mjs | 108 + apps/www/package.json | 169 + apps/www/postcss.config.mjs | 6 + apps/www/public/android-chrome-192x192.png | Bin 0 -> 3528 bytes apps/www/public/android-chrome-512x512.png | Bin 0 -> 9762 bytes apps/www/public/apple-touch-icon-square.jpg | Bin 0 -> 2631 bytes apps/www/public/apple-touch-icon.png | Bin 0 -> 3363 bytes apps/www/public/elevenlabs.svg | 14 + apps/www/public/eugen.jpg | Bin 0 -> 15359 bytes apps/www/public/favicon-16x16.png | Bin 0 -> 370 bytes apps/www/public/favicon-32x32.png | Bin 0 -> 709 bytes apps/www/public/favicon.ico | Bin 0 -> 1680 bytes apps/www/public/file.svg | 1 + apps/www/public/freddy.jpg | Bin 0 -> 15925 bytes apps/www/public/globe.svg | 1 + apps/www/public/logo-bolt.png | Bin 0 -> 2580 bytes apps/www/public/logo-claude.png | Bin 0 -> 8261 bytes apps/www/public/logo-lovable.png | Bin 0 -> 6247 bytes apps/www/public/logo-open-ai.png | Bin 0 -> 5039 bytes apps/www/public/logo-replit.png | Bin 0 -> 3173 bytes apps/www/public/logo-v0.png | Bin 0 -> 1012 bytes apps/www/public/next.svg | 1 + apps/www/public/opengraph-image.png | Bin 0 -> 223407 bytes apps/www/public/placeholder.svg | 1 + apps/www/public/r/accordion.json | 15 + apps/www/public/r/account-2fa-01.json | 30 + .../public/r/account-avatar-upload-01.json | 26 + apps/www/public/r/account-basic-info-01.json | 34 + .../public/r/account-change-password-01.json | 28 + .../www/public/r/account-integrations-01.json | 27 + .../public/r/account-notifications-01.json | 27 + apps/www/public/r/account-sessions-01.json | 26 + apps/www/public/r/ai-chat-streaming-01.json | 32 + apps/www/public/r/ai-image-generator-01.json | 33 + apps/www/public/r/ai-video-generator-01.json | 33 + apps/www/public/r/alert-dialog.json | 18 + apps/www/public/r/alert.json | 12 + apps/www/public/r/all.json | 1074 + apps/www/public/r/aspect-ratio.json | 15 + apps/www/public/r/avatar.json | 15 + apps/www/public/r/badge.json | 12 + apps/www/public/r/billing-information-01.json | 27 + apps/www/public/r/blocks.json | 702 + apps/www/public/r/blog-cards-layout-01.json | 28 + .../public/r/blog-post-preview-tags-01.json | 26 + .../public/r/blog-rectangular-images-01.json | 26 + apps/www/public/r/breadcrumb.json | 12 + apps/www/public/r/button.json | 15 + apps/www/public/r/calendar.json | 19 + apps/www/public/r/card-blog.json | 19 + apps/www/public/r/card-demo.json | 20 + apps/www/public/r/card-display-01.json | 26 + apps/www/public/r/card-ecommerce.json | 20 + apps/www/public/r/card-plain.json | 15 + apps/www/public/r/card-with-button.json | 16 + apps/www/public/r/card.json | 12 + apps/www/public/r/carousel.json | 18 + apps/www/public/r/chart.json | 19 + apps/www/public/r/checkbox.json | 15 + apps/www/public/r/checkout-01.json | 30 + apps/www/public/r/collapsible.json | 15 + apps/www/public/r/command.json | 18 + .../r/complex-product-description-01.json | 26 + apps/www/public/r/contact-sections-01.json | 30 + apps/www/public/r/contact-sections-02.json | 29 + apps/www/public/r/contact-sections-03.json | 29 + apps/www/public/r/contact-sections-04.json | 25 + apps/www/public/r/contact-sections-05.json | 29 + apps/www/public/r/contact-sections-06.json | 23 + apps/www/public/r/contact-sections-07.json | 30 + apps/www/public/r/contact-sections-08.json | 30 + apps/www/public/r/contact-sections-09.json | 30 + apps/www/public/r/contact-sections-10.json | 29 + apps/www/public/r/contact-sections-11.json | 28 + apps/www/public/r/contact-sections-12.json | 28 + apps/www/public/r/contact-sections-13.json | 29 + apps/www/public/r/contact-sections-14.json | 28 + apps/www/public/r/contact-sections-15.json | 28 + apps/www/public/r/context-menu.json | 15 + apps/www/public/r/cruds-01.json | 30 + apps/www/public/r/cruds-02.json | 28 + apps/www/public/r/cruds-03.json | 29 + .../public/r/dark-product-overview-01.json | 27 + apps/www/public/r/dialog.json | 15 + .../public/r/digital-product-overview-01.json | 28 + apps/www/public/r/drawer.json | 15 + apps/www/public/r/dropdown-menu.json | 15 + apps/www/public/r/ecommerce-sections-01.json | 27 + apps/www/public/r/ecommerce-sections-02.json | 26 + apps/www/public/r/empty-shopping-cart-01.json | 25 + apps/www/public/r/faq-left-title-01.json | 25 + apps/www/public/r/faqs-cards-icons-01.json | 26 + apps/www/public/r/faqs-grid-01.json | 25 + apps/www/public/r/faqs-grid-cta-01.json | 26 + apps/www/public/r/faqs-list-01.json | 25 + apps/www/public/r/footers-01.json | 25 + apps/www/public/r/footers-02.json | 28 + apps/www/public/r/footers-03.json | 25 + apps/www/public/r/footers-04.json | 27 + apps/www/public/r/footers-05.json | 28 + apps/www/public/r/footers-06.json | 25 + apps/www/public/r/footers-07.json | 26 + apps/www/public/r/footers-08.json | 26 + apps/www/public/r/footers-09.json | 25 + apps/www/public/r/footers-10.json | 23 + apps/www/public/r/footers-11.json | 23 + apps/www/public/r/footers-12.json | 23 + apps/www/public/r/footers-13.json | 25 + apps/www/public/r/footers-14.json | 25 + apps/www/public/r/footers-15.json | 25 + apps/www/public/r/form-card-demo.json | 18 + apps/www/public/r/form.json | 21 + apps/www/public/r/grid-ecommerce-01.json | 27 + .../public/r/highlighted-blog-posts-01.json | 26 + apps/www/public/r/hover-card.json | 15 + apps/www/public/r/index.json | 17 + apps/www/public/r/input-otp.json | 18 + apps/www/public/r/input.json | 12 + .../r/interactive-product-preview-01.json | 26 + apps/www/public/r/invoices-01.json | 28 + apps/www/public/r/label.json | 15 + apps/www/public/r/large-blog-preview-01.json | 25 + apps/www/public/r/menubar.json | 15 + apps/www/public/r/modals-01.json | 28 + apps/www/public/r/modals-02.json | 31 + apps/www/public/r/modals-03.json | 29 + apps/www/public/r/modals-04.json | 30 + apps/www/public/r/modals-05.json | 27 + apps/www/public/r/modals-06.json | 27 + apps/www/public/r/modals-07.json | 26 + apps/www/public/r/modals-08.json | 27 + apps/www/public/r/modals-09.json | 30 + apps/www/public/r/modals-10.json | 27 + apps/www/public/r/modals-11.json | 28 + apps/www/public/r/navigation-menu.json | 15 + apps/www/public/r/order-details-01.json | 28 + apps/www/public/r/order-history-01.json | 27 + apps/www/public/r/pagination.json | 15 + apps/www/public/r/payment-method-01.json | 28 + apps/www/public/r/popover.json | 15 + apps/www/public/r/product-description-01.json | 25 + apps/www/public/r/product-details-01.json | 26 + .../public/r/product-listing-filters-01.json | 27 + apps/www/public/r/progress.json | 15 + apps/www/public/r/promotional-cards-01.json | 26 + apps/www/public/r/radio-group.json | 15 + apps/www/public/r/registry.json | 3572 ++++ apps/www/public/r/resizable.json | 15 + apps/www/public/r/scroll-area.json | 15 + apps/www/public/r/select.json | 15 + apps/www/public/r/separator.json | 15 + apps/www/public/r/sheet.json | 15 + apps/www/public/r/shopping-cart-01.json | 30 + apps/www/public/r/sidebar.json | 22 + apps/www/public/r/simple-blog-content-01.json | 27 + apps/www/public/r/simple-faq-01.json | 23 + .../public/r/simple-product-details-01.json | 28 + apps/www/public/r/skeleton.json | 12 + apps/www/public/r/slider.json | 15 + apps/www/public/r/software-purchase-01.json | 27 + .../public/r/software-purchase-card-demo.json | 15 + apps/www/public/r/software-purchase-card.json | 20 + apps/www/public/r/sonner.json | 15 + apps/www/public/r/style.json | 17 + .../r/styles/creative-tim/registry.json | 3572 ++++ apps/www/public/r/switch.json | 15 + apps/www/public/r/table.json | 12 + apps/www/public/r/tabs.json | 15 + apps/www/public/r/testimonials-01.json | 27 + apps/www/public/r/testimonials-02.json | 26 + apps/www/public/r/testimonials-03.json | 26 + apps/www/public/r/testimonials-04.json | 26 + apps/www/public/r/testimonials-05.json | 26 + apps/www/public/r/testimonials-06.json | 26 + apps/www/public/r/testimonials-07.json | 25 + apps/www/public/r/testimonials-08.json | 26 + apps/www/public/r/testimonials-09.json | 26 + apps/www/public/r/testimonials-10.json | 27 + apps/www/public/r/testimonials-11.json | 26 + apps/www/public/r/testimonials-12.json | 25 + apps/www/public/r/testimonials-13.json | 26 + apps/www/public/r/testimonials-14.json | 26 + apps/www/public/r/testimonials-15.json | 25 + apps/www/public/r/testimonials-16.json | 26 + apps/www/public/r/testimonials-17.json | 26 + apps/www/public/r/textarea.json | 12 + apps/www/public/r/toggle-group.json | 15 + apps/www/public/r/toggle.json | 15 + apps/www/public/r/tooltip.json | 15 + apps/www/public/r/transaction-history-01.json | 32 + apps/www/public/r/ui.json | 379 + apps/www/public/r/use-mobile.json | 12 + apps/www/public/r/web3-01.json | 26 + apps/www/public/r/web3-02.json | 28 + apps/www/public/r/web3-03.json | 29 + apps/www/public/r/web3-04.json | 29 + apps/www/public/r/web3-05.json | 27 + apps/www/public/rares.jpg | Bin 0 -> 13685 bytes apps/www/public/robert.jpg | Bin 0 -> 12293 bytes apps/www/public/schema.json | 98 + apps/www/public/schema/registry-item.json | 215 + apps/www/public/schema/registry.json | 22 + apps/www/public/site.webmanifest | 17 + apps/www/public/vercel.svg | 1 + apps/www/public/window.svg | 1 + apps/www/registry.json | 2878 +++ apps/www/registry/__blocks__.json | 557 + apps/www/registry/__index__.tsx | 3017 +++ .../blocks/account-2fa-01/page.tsx | 156 + .../blocks/account-avatar-upload-01/page.tsx | 157 + .../blocks/account-basic-info-01/page.tsx | 305 + .../account-change-password-01/page.tsx | 188 + .../blocks/account-integrations-01/page.tsx | 253 + .../blocks/account-notifications-01/page.tsx | 182 + .../blocks/account-sessions-01/page.tsx | 151 + .../blocks/ai-chat-streaming-01/page.tsx | 268 + .../blocks/ai-image-generator-01/page.tsx | 346 + .../blocks/ai-video-generator-01/page.tsx | 391 + .../blocks/billing-information-01/page.tsx | 109 + .../blocks/blog-cards-layout-01/page.tsx | 138 + .../blocks/blog-post-preview-tags-01/page.tsx | 73 + .../blog-rectangular-images-01/page.tsx | 86 + .../blocks/card-display-01/page.tsx | 101 + .../creative-tim/blocks/checkout-01/page.tsx | 265 + .../complex-product-description-01/page.tsx | 245 + .../blocks/contact-sections-01/page.tsx | 92 + .../blocks/contact-sections-02/page.tsx | 74 + .../blocks/contact-sections-03/page.tsx | 137 + .../blocks/contact-sections-04/page.tsx | 59 + .../blocks/contact-sections-05/page.tsx | 88 + .../blocks/contact-sections-06/page.tsx | 56 + .../blocks/contact-sections-07/page.tsx | 95 + .../blocks/contact-sections-08/page.tsx | 135 + .../blocks/contact-sections-09/page.tsx | 97 + .../blocks/contact-sections-10/page.tsx | 92 + .../blocks/contact-sections-11/page.tsx | 88 + .../blocks/contact-sections-12/page.tsx | 64 + .../blocks/contact-sections-13/page.tsx | 83 + .../blocks/contact-sections-14/page.tsx | 71 + .../blocks/contact-sections-15/page.tsx | 91 + .../creative-tim/blocks/cruds-01/page.tsx | 96 + .../creative-tim/blocks/cruds-02/page.tsx | 63 + .../creative-tim/blocks/cruds-03/page.tsx | 158 + .../blocks/dark-product-overview-01/page.tsx | 167 + .../digital-product-overview-01/page.tsx | 150 + .../blocks/ecommerce-sections-01/page.tsx | 177 + .../blocks/ecommerce-sections-02/page.tsx | 241 + .../blocks/empty-shopping-cart-01/page.tsx | 24 + .../blocks/faq-left-title-01/page.tsx | 51 + .../blocks/faqs-cards-icons-01/page.tsx | 63 + .../creative-tim/blocks/faqs-grid-01/page.tsx | 80 + .../blocks/faqs-grid-cta-01/page.tsx | 67 + .../creative-tim/blocks/faqs-list-01/page.tsx | 65 + .../creative-tim/blocks/footers-01/page.tsx | 43 + .../creative-tim/blocks/footers-02/page.tsx | 104 + .../creative-tim/blocks/footers-03/page.tsx | 36 + .../creative-tim/blocks/footers-04/page.tsx | 83 + .../creative-tim/blocks/footers-05/page.tsx | 138 + .../creative-tim/blocks/footers-06/page.tsx | 105 + .../creative-tim/blocks/footers-07/page.tsx | 79 + .../creative-tim/blocks/footers-08/page.tsx | 30 + .../creative-tim/blocks/footers-09/page.tsx | 47 + .../creative-tim/blocks/footers-10/page.tsx | 34 + .../creative-tim/blocks/footers-11/page.tsx | 69 + .../creative-tim/blocks/footers-12/page.tsx | 37 + .../creative-tim/blocks/footers-13/page.tsx | 60 + .../creative-tim/blocks/footers-14/page.tsx | 153 + .../creative-tim/blocks/footers-15/page.tsx | 74 + .../blocks/grid-ecommerce-01/page.tsx | 82 + .../blocks/highlighted-blog-posts-01/page.tsx | 105 + .../interactive-product-preview-01/page.tsx | 174 + .../creative-tim/blocks/invoices-01/page.tsx | 97 + .../blocks/large-blog-preview-01/page.tsx | 46 + .../creative-tim/blocks/modals-01/page.tsx | 74 + .../creative-tim/blocks/modals-02/page.tsx | 138 + .../creative-tim/blocks/modals-03/page.tsx | 130 + .../creative-tim/blocks/modals-04/page.tsx | 157 + .../creative-tim/blocks/modals-05/page.tsx | 113 + .../creative-tim/blocks/modals-06/page.tsx | 81 + .../creative-tim/blocks/modals-07/page.tsx | 56 + .../creative-tim/blocks/modals-08/page.tsx | 90 + .../creative-tim/blocks/modals-09/page.tsx | 105 + .../creative-tim/blocks/modals-10/page.tsx | 90 + .../creative-tim/blocks/modals-11/page.tsx | 69 + .../blocks/order-details-01/page.tsx | 272 + .../blocks/order-history-01/page.tsx | 123 + .../blocks/payment-method-01/page.tsx | 115 + .../blocks/product-description-01/page.tsx | 272 + .../blocks/product-details-01/page.tsx | 134 + .../product-listing-filters-01/page.tsx | 194 + .../blocks/promotional-cards-01/page.tsx | 83 + .../blocks/shopping-cart-01/page.tsx | 240 + .../blocks/simple-blog-content-01/page.tsx | 87 + .../blocks/simple-faq-01/page.tsx | 49 + .../blocks/simple-product-details-01/page.tsx | 238 + .../blocks/software-purchase-01/page.tsx | 145 + .../blocks/testimonials-01/page.tsx | 76 + .../blocks/testimonials-02/page.tsx | 117 + .../blocks/testimonials-03/page.tsx | 120 + .../blocks/testimonials-04/page.tsx | 94 + .../blocks/testimonials-05/page.tsx | 100 + .../blocks/testimonials-06/page.tsx | 52 + .../blocks/testimonials-07/page.tsx | 83 + .../blocks/testimonials-08/page.tsx | 99 + .../blocks/testimonials-09/page.tsx | 53 + .../blocks/testimonials-10/page.tsx | 77 + .../blocks/testimonials-11/page.tsx | 112 + .../blocks/testimonials-12/page.tsx | 87 + .../blocks/testimonials-13/page.tsx | 43 + .../blocks/testimonials-14/page.tsx | 71 + .../blocks/testimonials-15/page.tsx | 96 + .../blocks/testimonials-16/page.tsx | 107 + .../blocks/testimonials-17/page.tsx | 108 + .../blocks/transaction-history-01/page.tsx | 172 + .../creative-tim/blocks/web3-01/page.tsx | 86 + .../creative-tim/blocks/web3-02/page.tsx | 118 + .../creative-tim/blocks/web3-03/page.tsx | 133 + .../creative-tim/blocks/web3-04/page.tsx | 126 + .../creative-tim/blocks/web3-05/page.tsx | 121 + .../creative-tim/examples/card-blog.tsx | 36 + .../creative-tim/examples/card-demo.tsx | 111 + .../creative-tim/examples/card-ecommerce.tsx | 55 + .../creative-tim/examples/card-plain.tsx | 16 + .../examples/card-with-button.tsx | 32 + .../creative-tim/examples/form-card-demo.tsx | 43 + .../examples/software-purchase-card-demo.tsx | 27 + .../registry/creative-tim/hooks/use-mobile.ts | 19 + apps/www/registry/creative-tim/lib/utils.ts | 6 + .../registry/creative-tim/ui/accordion.tsx | 66 + .../registry/creative-tim/ui/alert-dialog.tsx | 157 + apps/www/registry/creative-tim/ui/alert.tsx | 66 + .../registry/creative-tim/ui/aspect-ratio.tsx | 11 + apps/www/registry/creative-tim/ui/avatar.tsx | 53 + apps/www/registry/creative-tim/ui/badge.tsx | 46 + .../registry/creative-tim/ui/breadcrumb.tsx | 109 + .../registry/creative-tim/ui/button-group.tsx | 88 + apps/www/registry/creative-tim/ui/button.tsx | 58 + .../www/registry/creative-tim/ui/calendar.tsx | 213 + apps/www/registry/creative-tim/ui/card.tsx | 92 + .../www/registry/creative-tim/ui/carousel.tsx | 241 + apps/www/registry/creative-tim/ui/chart.tsx | 357 + .../www/registry/creative-tim/ui/checkbox.tsx | 32 + apps/www/registry/creative-tim/ui/chip.tsx | 57 + .../www/registry/creative-tim/ui/collapse.tsx | 41 + .../registry/creative-tim/ui/collapsible.tsx | 33 + apps/www/registry/creative-tim/ui/command.tsx | 184 + .../registry/creative-tim/ui/context-menu.tsx | 252 + apps/www/registry/creative-tim/ui/dialog.tsx | 143 + apps/www/registry/creative-tim/ui/drawer.tsx | 135 + .../creative-tim/ui/dropdown-menu.tsx | 257 + apps/www/registry/creative-tim/ui/form.tsx | 167 + .../registry/creative-tim/ui/hover-card.tsx | 44 + .../registry/creative-tim/ui/input-otp.tsx | 77 + apps/www/registry/creative-tim/ui/input.tsx | 21 + apps/www/registry/creative-tim/ui/label.tsx | 24 + apps/www/registry/creative-tim/ui/list.tsx | 69 + apps/www/registry/creative-tim/ui/map.tsx | 1097 + apps/www/registry/creative-tim/ui/menubar.tsx | 276 + .../creative-tim/ui/navigation-menu.tsx | 168 + .../registry/creative-tim/ui/pagination.tsx | 127 + apps/www/registry/creative-tim/ui/popover.tsx | 55 + .../www/registry/creative-tim/ui/progress.tsx | 31 + .../registry/creative-tim/ui/radio-group.tsx | 45 + apps/www/registry/creative-tim/ui/rating.tsx | 100 + .../registry/creative-tim/ui/resizable.tsx | 56 + .../registry/creative-tim/ui/scroll-area.tsx | 58 + apps/www/registry/creative-tim/ui/select.tsx | 185 + .../registry/creative-tim/ui/separator.tsx | 28 + apps/www/registry/creative-tim/ui/sheet.tsx | 139 + apps/www/registry/creative-tim/ui/sidebar.tsx | 726 + .../www/registry/creative-tim/ui/skeleton.tsx | 13 + apps/www/registry/creative-tim/ui/slider.tsx | 63 + .../ui/software-purchase-card.tsx | 99 + apps/www/registry/creative-tim/ui/sonner.tsx | 50 + apps/www/registry/creative-tim/ui/spinner.tsx | 41 + apps/www/registry/creative-tim/ui/stepper.tsx | 136 + apps/www/registry/creative-tim/ui/switch.tsx | 31 + apps/www/registry/creative-tim/ui/table.tsx | 116 + apps/www/registry/creative-tim/ui/tabs.tsx | 66 + .../www/registry/creative-tim/ui/textarea.tsx | 18 + .../www/registry/creative-tim/ui/timeline.tsx | 145 + .../registry/creative-tim/ui/toggle-group.tsx | 73 + apps/www/registry/creative-tim/ui/toggle.tsx | 47 + apps/www/registry/creative-tim/ui/tooltip.tsx | 61 + apps/www/registry/index.ts | 64 + apps/www/registry/registry-blocks.ts | 2318 +++ apps/www/registry/registry-categories.ts | 62 + apps/www/registry/registry-examples.ts | 15 + apps/www/registry/registry-hooks.ts | 14 + apps/www/registry/registry-lib.ts | 15 + apps/www/registry/registry-ui.ts | 597 + apps/www/scripts/build-registry.mts | 484 + apps/www/scripts/capture-registry.mts | 94 + apps/www/scripts/validate-registries.mts | 58 + apps/www/source.config.ts | 45 + apps/www/styles/globals.css | 445 + apps/www/styles/themes.css | 334 + apps/www/tsconfig.json | 36 + apps/www/tsconfig.scripts.json | 14 + e2e/auth.login.spec.ts | 26 + e2e/auth.logout.spec.ts | 17 + e2e/auth.password.spec.ts | 36 + e2e/auth.redirects.spec.ts | 19 + e2e/auth.refresh-singleton.spec.ts | 28 + e2e/auth.register.spec.ts | 17 + e2e/helpers.ts | 46 + mock-api/.env | 6 + mock-api/db.json | 107 + mock-api/package.json | 23 + mock-api/routes.json | 11 + mock-api/server.js | 383 + package.json | 81 + playwright.config.ts | 14 + pnpm-lock.yaml | 17141 ++++++++++++++++ pnpm-workspace.yaml | 7 + postcss.config.cjs | 6 + prettier.config.cjs | 36 + skills/README.md | 41 + skills/creative-tim-ui/AGENTS.md | 542 + skills/creative-tim-ui/SKILL.md | 208 + .../creative-tim-ui/rules/brand-philosophy.md | 143 + .../rules/component-patterns.md | 109 + skills/creative-tim-ui/rules/design-brand.md | 61 + .../creative-tim-ui/rules/hydration-safety.md | 80 + .../creative-tim-ui/rules/install-blocks.md | 64 + skills/creative-tim-ui/rules/pro-api-key.md | 62 + .../creative-tim-ui/rules/tailwind-rules.md | 72 + tsconfig.json | 20 + turbo.json | 74 + vitest.config.ts | 19 + vitest.workspace.ts | 6 + 605 files changed, 80879 insertions(+) create mode 100644 .commitlintrc.json create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .kodiak.toml create mode 100644 .prettierignore create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 apps/www/.env.example create mode 100644 apps/www/.gitignore create mode 100644 apps/www/.prettierignore create mode 100644 apps/www/app/(app)/(root)/page.tsx create mode 100644 apps/www/app/(app)/blocks/[...categories]/page.tsx create mode 100644 apps/www/app/(app)/blocks/layout.tsx create mode 100644 apps/www/app/(app)/blocks/page.tsx create mode 100644 apps/www/app/(app)/docs/[[...slug]]/page.tsx create mode 100644 apps/www/app/(app)/docs/layout.tsx create mode 100644 apps/www/app/(app)/layout.tsx create mode 100644 apps/www/app/(app)/llm/[[...slug]]/route.ts create mode 100644 apps/www/app/(view)/view/[name]/page.tsx create mode 100644 apps/www/app/api/r/[name]/route.ts create mode 100644 apps/www/app/layout.tsx create mode 100644 apps/www/app/llms.txt/route.ts create mode 100644 apps/www/app/og/geist-regular-otf.json create mode 100644 apps/www/app/og/geist-semibold-otf.json create mode 100644 apps/www/app/og/geistmono-regular-otf.json create mode 100644 apps/www/app/og/route.tsx create mode 100644 apps/www/components.json create mode 100644 apps/www/components/active-theme.tsx create mode 100644 apps/www/components/analytics.tsx create mode 100644 apps/www/components/announcement.tsx create mode 100644 apps/www/components/block-display.tsx create mode 100644 apps/www/components/block-image.tsx create mode 100644 apps/www/components/block-viewer.tsx create mode 100644 apps/www/components/blocks-nav.tsx create mode 100644 apps/www/components/blur-vignette.tsx create mode 100644 apps/www/components/callout.tsx create mode 100644 apps/www/components/cards/activity-goal.tsx create mode 100644 apps/www/components/cards/calendar.tsx create mode 100644 apps/www/components/cards/cookie-settings.tsx create mode 100644 apps/www/components/cards/create-account.tsx create mode 100644 apps/www/components/cards/forms.tsx create mode 100644 apps/www/components/cards/index.tsx create mode 100644 apps/www/components/cards/payment-method.tsx create mode 100644 apps/www/components/cards/payments.tsx create mode 100644 apps/www/components/cards/report-issue.tsx create mode 100644 apps/www/components/cards/share.tsx create mode 100644 apps/www/components/cards/software-purchase.tsx create mode 100644 apps/www/components/chart-code-viewer.tsx create mode 100644 apps/www/components/chart-copy-button.tsx create mode 100644 apps/www/components/chart-display.tsx create mode 100644 apps/www/components/chart-toolbar.tsx create mode 100644 apps/www/components/charts-nav.tsx create mode 100644 apps/www/components/code-block-command.tsx create mode 100644 apps/www/components/code-collapsible-wrapper.tsx create mode 100644 apps/www/components/code-tabs.tsx create mode 100644 apps/www/components/command-menu.tsx create mode 100644 apps/www/components/component-preview-tabs.tsx create mode 100644 apps/www/components/component-preview.tsx create mode 100644 apps/www/components/component-source.tsx create mode 100644 apps/www/components/component-wrapper.tsx create mode 100644 apps/www/components/components-list.tsx create mode 100644 apps/www/components/copy-button.tsx create mode 100644 apps/www/components/docs-breadcrumb.tsx create mode 100644 apps/www/components/docs-copy-page.tsx create mode 100644 apps/www/components/docs-sidebar-cta.tsx create mode 100644 apps/www/components/docs-sidebar.tsx create mode 100644 apps/www/components/docs-toc.tsx create mode 100644 apps/www/components/examples-nav.tsx create mode 100644 apps/www/components/examples-preview.tsx create mode 100644 apps/www/components/github-link.tsx create mode 100644 apps/www/components/icons.tsx create mode 100644 apps/www/components/main-nav.tsx create mode 100644 apps/www/components/mobile-nav.tsx create mode 100644 apps/www/components/mode-switcher.tsx create mode 100644 apps/www/components/nav-header.tsx create mode 100644 apps/www/components/nav-user.tsx create mode 100644 apps/www/components/open-in-v0-button.tsx create mode 100644 apps/www/components/page-header.tsx create mode 100644 apps/www/components/page-nav.tsx create mode 100644 apps/www/components/showcase-masonry.tsx create mode 100644 apps/www/components/site-config.tsx create mode 100644 apps/www/components/site-footer.tsx create mode 100644 apps/www/components/site-header.tsx create mode 100644 apps/www/components/tailwind-indicator.tsx create mode 100644 apps/www/components/testimonials-section.tsx create mode 100644 apps/www/components/theme-provider.tsx create mode 100644 apps/www/components/theme-selector.tsx create mode 100644 apps/www/components/ui/accordion.tsx create mode 100644 apps/www/components/ui/alert-dialog.tsx create mode 100644 apps/www/components/ui/alert.tsx create mode 100644 apps/www/components/ui/aspect-ratio.tsx create mode 100644 apps/www/components/ui/avatar.tsx create mode 100644 apps/www/components/ui/badge.tsx create mode 100644 apps/www/components/ui/breadcrumb.tsx create mode 100644 apps/www/components/ui/button.tsx create mode 100644 apps/www/components/ui/calendar.tsx create mode 100644 apps/www/components/ui/card.tsx create mode 100644 apps/www/components/ui/carousel.tsx create mode 100644 apps/www/components/ui/chart.tsx create mode 100644 apps/www/components/ui/checkbox.tsx create mode 100644 apps/www/components/ui/collapsible.tsx create mode 100644 apps/www/components/ui/command.tsx create mode 100644 apps/www/components/ui/context-menu.tsx create mode 100644 apps/www/components/ui/dialog.tsx create mode 100644 apps/www/components/ui/drawer.tsx create mode 100644 apps/www/components/ui/dropdown-menu.tsx create mode 100644 apps/www/components/ui/form.tsx create mode 100644 apps/www/components/ui/hover-card.tsx create mode 100644 apps/www/components/ui/input-otp.tsx create mode 100644 apps/www/components/ui/input.tsx create mode 100644 apps/www/components/ui/label.tsx create mode 100644 apps/www/components/ui/menubar.tsx create mode 100644 apps/www/components/ui/navigation-menu.tsx create mode 100644 apps/www/components/ui/pagination.tsx create mode 100644 apps/www/components/ui/popover.tsx create mode 100644 apps/www/components/ui/progress.tsx create mode 100644 apps/www/components/ui/radio-group.tsx create mode 100644 apps/www/components/ui/resizable.tsx create mode 100644 apps/www/components/ui/scroll-area.tsx create mode 100644 apps/www/components/ui/select.tsx create mode 100644 apps/www/components/ui/separator.tsx create mode 100644 apps/www/components/ui/sheet.tsx create mode 100644 apps/www/components/ui/sidebar.tsx create mode 100644 apps/www/components/ui/skeleton.tsx create mode 100644 apps/www/components/ui/slider.tsx create mode 100644 apps/www/components/ui/software-purchase-card.tsx create mode 100644 apps/www/components/ui/sonner.tsx create mode 100644 apps/www/components/ui/switch.tsx create mode 100644 apps/www/components/ui/table.tsx create mode 100644 apps/www/components/ui/tabs.tsx create mode 100644 apps/www/components/ui/textarea.tsx create mode 100644 apps/www/components/ui/toggle-group.tsx create mode 100644 apps/www/components/ui/toggle.tsx create mode 100644 apps/www/components/ui/tooltip.tsx create mode 100644 apps/www/content/docs/(root)/components.mdx create mode 100644 apps/www/content/docs/(root)/debug-logs.mdx create mode 100644 apps/www/content/docs/(root)/how-it-works.mdx create mode 100644 apps/www/content/docs/(root)/index.mdx create mode 100644 apps/www/content/docs/(root)/meta.json create mode 100644 apps/www/content/docs/(root)/registry.mdx create mode 100644 apps/www/content/docs/components/card.mdx create mode 100644 apps/www/content/docs/components/index.mdx create mode 100644 apps/www/content/docs/components/software-purchase-card.mdx create mode 100644 apps/www/content/docs/meta.json create mode 100644 apps/www/docs/private-registry.md create mode 100644 apps/www/eslint.config.mjs create mode 100644 apps/www/hooks/use-config.ts create mode 100644 apps/www/hooks/use-copy-to-clipboard.ts create mode 100644 apps/www/hooks/use-is-mac.ts create mode 100644 apps/www/hooks/use-layout.tsx create mode 100644 apps/www/hooks/use-media-query.tsx create mode 100644 apps/www/hooks/use-meta-color.ts create mode 100644 apps/www/hooks/use-mobile.ts create mode 100644 apps/www/hooks/use-mounted.ts create mode 100644 apps/www/hooks/use-mutation-observer.ts create mode 100644 apps/www/lib/analytics.ts create mode 100644 apps/www/lib/auth.ts create mode 100644 apps/www/lib/blocks.ts create mode 100644 apps/www/lib/config.ts create mode 100644 apps/www/lib/events.ts create mode 100644 apps/www/lib/fonts.ts create mode 100644 apps/www/lib/highlight-code.ts create mode 100644 apps/www/lib/registry.ts create mode 100644 apps/www/lib/rehype.ts create mode 100644 apps/www/lib/session.ts create mode 100644 apps/www/lib/source.ts create mode 100644 apps/www/lib/themes.ts create mode 100644 apps/www/lib/utils.ts create mode 100644 apps/www/mdx-components.tsx create mode 100644 apps/www/middleware.ts create mode 100644 apps/www/next.config.mjs create mode 100644 apps/www/package.json create mode 100644 apps/www/postcss.config.mjs create mode 100644 apps/www/public/android-chrome-192x192.png create mode 100644 apps/www/public/android-chrome-512x512.png create mode 100644 apps/www/public/apple-touch-icon-square.jpg create mode 100644 apps/www/public/apple-touch-icon.png create mode 100644 apps/www/public/elevenlabs.svg create mode 100644 apps/www/public/eugen.jpg create mode 100644 apps/www/public/favicon-16x16.png create mode 100644 apps/www/public/favicon-32x32.png create mode 100644 apps/www/public/favicon.ico create mode 100644 apps/www/public/file.svg create mode 100644 apps/www/public/freddy.jpg create mode 100644 apps/www/public/globe.svg create mode 100644 apps/www/public/logo-bolt.png create mode 100644 apps/www/public/logo-claude.png create mode 100644 apps/www/public/logo-lovable.png create mode 100644 apps/www/public/logo-open-ai.png create mode 100644 apps/www/public/logo-replit.png create mode 100644 apps/www/public/logo-v0.png create mode 100644 apps/www/public/next.svg create mode 100644 apps/www/public/opengraph-image.png create mode 100644 apps/www/public/placeholder.svg create mode 100644 apps/www/public/r/accordion.json create mode 100644 apps/www/public/r/account-2fa-01.json create mode 100644 apps/www/public/r/account-avatar-upload-01.json create mode 100644 apps/www/public/r/account-basic-info-01.json create mode 100644 apps/www/public/r/account-change-password-01.json create mode 100644 apps/www/public/r/account-integrations-01.json create mode 100644 apps/www/public/r/account-notifications-01.json create mode 100644 apps/www/public/r/account-sessions-01.json create mode 100644 apps/www/public/r/ai-chat-streaming-01.json create mode 100644 apps/www/public/r/ai-image-generator-01.json create mode 100644 apps/www/public/r/ai-video-generator-01.json create mode 100644 apps/www/public/r/alert-dialog.json create mode 100644 apps/www/public/r/alert.json create mode 100644 apps/www/public/r/all.json create mode 100644 apps/www/public/r/aspect-ratio.json create mode 100644 apps/www/public/r/avatar.json create mode 100644 apps/www/public/r/badge.json create mode 100644 apps/www/public/r/billing-information-01.json create mode 100644 apps/www/public/r/blocks.json create mode 100644 apps/www/public/r/blog-cards-layout-01.json create mode 100644 apps/www/public/r/blog-post-preview-tags-01.json create mode 100644 apps/www/public/r/blog-rectangular-images-01.json create mode 100644 apps/www/public/r/breadcrumb.json create mode 100644 apps/www/public/r/button.json create mode 100644 apps/www/public/r/calendar.json create mode 100644 apps/www/public/r/card-blog.json create mode 100644 apps/www/public/r/card-demo.json create mode 100644 apps/www/public/r/card-display-01.json create mode 100644 apps/www/public/r/card-ecommerce.json create mode 100644 apps/www/public/r/card-plain.json create mode 100644 apps/www/public/r/card-with-button.json create mode 100644 apps/www/public/r/card.json create mode 100644 apps/www/public/r/carousel.json create mode 100644 apps/www/public/r/chart.json create mode 100644 apps/www/public/r/checkbox.json create mode 100644 apps/www/public/r/checkout-01.json create mode 100644 apps/www/public/r/collapsible.json create mode 100644 apps/www/public/r/command.json create mode 100644 apps/www/public/r/complex-product-description-01.json create mode 100644 apps/www/public/r/contact-sections-01.json create mode 100644 apps/www/public/r/contact-sections-02.json create mode 100644 apps/www/public/r/contact-sections-03.json create mode 100644 apps/www/public/r/contact-sections-04.json create mode 100644 apps/www/public/r/contact-sections-05.json create mode 100644 apps/www/public/r/contact-sections-06.json create mode 100644 apps/www/public/r/contact-sections-07.json create mode 100644 apps/www/public/r/contact-sections-08.json create mode 100644 apps/www/public/r/contact-sections-09.json create mode 100644 apps/www/public/r/contact-sections-10.json create mode 100644 apps/www/public/r/contact-sections-11.json create mode 100644 apps/www/public/r/contact-sections-12.json create mode 100644 apps/www/public/r/contact-sections-13.json create mode 100644 apps/www/public/r/contact-sections-14.json create mode 100644 apps/www/public/r/contact-sections-15.json create mode 100644 apps/www/public/r/context-menu.json create mode 100644 apps/www/public/r/cruds-01.json create mode 100644 apps/www/public/r/cruds-02.json create mode 100644 apps/www/public/r/cruds-03.json create mode 100644 apps/www/public/r/dark-product-overview-01.json create mode 100644 apps/www/public/r/dialog.json create mode 100644 apps/www/public/r/digital-product-overview-01.json create mode 100644 apps/www/public/r/drawer.json create mode 100644 apps/www/public/r/dropdown-menu.json create mode 100644 apps/www/public/r/ecommerce-sections-01.json create mode 100644 apps/www/public/r/ecommerce-sections-02.json create mode 100644 apps/www/public/r/empty-shopping-cart-01.json create mode 100644 apps/www/public/r/faq-left-title-01.json create mode 100644 apps/www/public/r/faqs-cards-icons-01.json create mode 100644 apps/www/public/r/faqs-grid-01.json create mode 100644 apps/www/public/r/faqs-grid-cta-01.json create mode 100644 apps/www/public/r/faqs-list-01.json create mode 100644 apps/www/public/r/footers-01.json create mode 100644 apps/www/public/r/footers-02.json create mode 100644 apps/www/public/r/footers-03.json create mode 100644 apps/www/public/r/footers-04.json create mode 100644 apps/www/public/r/footers-05.json create mode 100644 apps/www/public/r/footers-06.json create mode 100644 apps/www/public/r/footers-07.json create mode 100644 apps/www/public/r/footers-08.json create mode 100644 apps/www/public/r/footers-09.json create mode 100644 apps/www/public/r/footers-10.json create mode 100644 apps/www/public/r/footers-11.json create mode 100644 apps/www/public/r/footers-12.json create mode 100644 apps/www/public/r/footers-13.json create mode 100644 apps/www/public/r/footers-14.json create mode 100644 apps/www/public/r/footers-15.json create mode 100644 apps/www/public/r/form-card-demo.json create mode 100644 apps/www/public/r/form.json create mode 100644 apps/www/public/r/grid-ecommerce-01.json create mode 100644 apps/www/public/r/highlighted-blog-posts-01.json create mode 100644 apps/www/public/r/hover-card.json create mode 100644 apps/www/public/r/index.json create mode 100644 apps/www/public/r/input-otp.json create mode 100644 apps/www/public/r/input.json create mode 100644 apps/www/public/r/interactive-product-preview-01.json create mode 100644 apps/www/public/r/invoices-01.json create mode 100644 apps/www/public/r/label.json create mode 100644 apps/www/public/r/large-blog-preview-01.json create mode 100644 apps/www/public/r/menubar.json create mode 100644 apps/www/public/r/modals-01.json create mode 100644 apps/www/public/r/modals-02.json create mode 100644 apps/www/public/r/modals-03.json create mode 100644 apps/www/public/r/modals-04.json create mode 100644 apps/www/public/r/modals-05.json create mode 100644 apps/www/public/r/modals-06.json create mode 100644 apps/www/public/r/modals-07.json create mode 100644 apps/www/public/r/modals-08.json create mode 100644 apps/www/public/r/modals-09.json create mode 100644 apps/www/public/r/modals-10.json create mode 100644 apps/www/public/r/modals-11.json create mode 100644 apps/www/public/r/navigation-menu.json create mode 100644 apps/www/public/r/order-details-01.json create mode 100644 apps/www/public/r/order-history-01.json create mode 100644 apps/www/public/r/pagination.json create mode 100644 apps/www/public/r/payment-method-01.json create mode 100644 apps/www/public/r/popover.json create mode 100644 apps/www/public/r/product-description-01.json create mode 100644 apps/www/public/r/product-details-01.json create mode 100644 apps/www/public/r/product-listing-filters-01.json create mode 100644 apps/www/public/r/progress.json create mode 100644 apps/www/public/r/promotional-cards-01.json create mode 100644 apps/www/public/r/radio-group.json create mode 100644 apps/www/public/r/registry.json create mode 100644 apps/www/public/r/resizable.json create mode 100644 apps/www/public/r/scroll-area.json create mode 100644 apps/www/public/r/select.json create mode 100644 apps/www/public/r/separator.json create mode 100644 apps/www/public/r/sheet.json create mode 100644 apps/www/public/r/shopping-cart-01.json create mode 100644 apps/www/public/r/sidebar.json create mode 100644 apps/www/public/r/simple-blog-content-01.json create mode 100644 apps/www/public/r/simple-faq-01.json create mode 100644 apps/www/public/r/simple-product-details-01.json create mode 100644 apps/www/public/r/skeleton.json create mode 100644 apps/www/public/r/slider.json create mode 100644 apps/www/public/r/software-purchase-01.json create mode 100644 apps/www/public/r/software-purchase-card-demo.json create mode 100644 apps/www/public/r/software-purchase-card.json create mode 100644 apps/www/public/r/sonner.json create mode 100644 apps/www/public/r/style.json create mode 100644 apps/www/public/r/styles/creative-tim/registry.json create mode 100644 apps/www/public/r/switch.json create mode 100644 apps/www/public/r/table.json create mode 100644 apps/www/public/r/tabs.json create mode 100644 apps/www/public/r/testimonials-01.json create mode 100644 apps/www/public/r/testimonials-02.json create mode 100644 apps/www/public/r/testimonials-03.json create mode 100644 apps/www/public/r/testimonials-04.json create mode 100644 apps/www/public/r/testimonials-05.json create mode 100644 apps/www/public/r/testimonials-06.json create mode 100644 apps/www/public/r/testimonials-07.json create mode 100644 apps/www/public/r/testimonials-08.json create mode 100644 apps/www/public/r/testimonials-09.json create mode 100644 apps/www/public/r/testimonials-10.json create mode 100644 apps/www/public/r/testimonials-11.json create mode 100644 apps/www/public/r/testimonials-12.json create mode 100644 apps/www/public/r/testimonials-13.json create mode 100644 apps/www/public/r/testimonials-14.json create mode 100644 apps/www/public/r/testimonials-15.json create mode 100644 apps/www/public/r/testimonials-16.json create mode 100644 apps/www/public/r/testimonials-17.json create mode 100644 apps/www/public/r/textarea.json create mode 100644 apps/www/public/r/toggle-group.json create mode 100644 apps/www/public/r/toggle.json create mode 100644 apps/www/public/r/tooltip.json create mode 100644 apps/www/public/r/transaction-history-01.json create mode 100644 apps/www/public/r/ui.json create mode 100644 apps/www/public/r/use-mobile.json create mode 100644 apps/www/public/r/web3-01.json create mode 100644 apps/www/public/r/web3-02.json create mode 100644 apps/www/public/r/web3-03.json create mode 100644 apps/www/public/r/web3-04.json create mode 100644 apps/www/public/r/web3-05.json create mode 100644 apps/www/public/rares.jpg create mode 100644 apps/www/public/robert.jpg create mode 100644 apps/www/public/schema.json create mode 100644 apps/www/public/schema/registry-item.json create mode 100644 apps/www/public/schema/registry.json create mode 100644 apps/www/public/site.webmanifest create mode 100644 apps/www/public/vercel.svg create mode 100644 apps/www/public/window.svg create mode 100644 apps/www/registry.json create mode 100644 apps/www/registry/__blocks__.json create mode 100644 apps/www/registry/__index__.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-2fa-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-avatar-upload-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-basic-info-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-change-password-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-integrations-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-notifications-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/account-sessions-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/ai-chat-streaming-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/ai-image-generator-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/ai-video-generator-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/billing-information-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/blog-cards-layout-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/blog-post-preview-tags-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/blog-rectangular-images-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/card-display-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/checkout-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/complex-product-description-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-03/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-04/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-05/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-06/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-07/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-08/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-09/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-10/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-11/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-12/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-13/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-14/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/contact-sections-15/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/cruds-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/cruds-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/cruds-03/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/dark-product-overview-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/digital-product-overview-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/ecommerce-sections-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/ecommerce-sections-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/empty-shopping-cart-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/faq-left-title-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/faqs-cards-icons-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/faqs-grid-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/faqs-grid-cta-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/faqs-list-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-03/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-04/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-05/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-06/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-07/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-08/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-09/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-10/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-11/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-12/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-13/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-14/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/footers-15/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/grid-ecommerce-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/highlighted-blog-posts-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/interactive-product-preview-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/invoices-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/large-blog-preview-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-03/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-04/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-05/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-06/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-07/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-08/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-09/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-10/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/modals-11/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/order-details-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/order-history-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/payment-method-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/product-description-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/product-details-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/product-listing-filters-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/promotional-cards-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/shopping-cart-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/simple-blog-content-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/simple-faq-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/simple-product-details-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/software-purchase-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-03/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-04/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-05/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-06/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-07/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-08/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-09/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-10/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-11/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-12/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-13/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-14/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-15/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-16/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/testimonials-17/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/transaction-history-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/web3-01/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/web3-02/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/web3-03/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/web3-04/page.tsx create mode 100644 apps/www/registry/creative-tim/blocks/web3-05/page.tsx create mode 100644 apps/www/registry/creative-tim/examples/card-blog.tsx create mode 100644 apps/www/registry/creative-tim/examples/card-demo.tsx create mode 100644 apps/www/registry/creative-tim/examples/card-ecommerce.tsx create mode 100644 apps/www/registry/creative-tim/examples/card-plain.tsx create mode 100644 apps/www/registry/creative-tim/examples/card-with-button.tsx create mode 100644 apps/www/registry/creative-tim/examples/form-card-demo.tsx create mode 100644 apps/www/registry/creative-tim/examples/software-purchase-card-demo.tsx create mode 100644 apps/www/registry/creative-tim/hooks/use-mobile.ts create mode 100644 apps/www/registry/creative-tim/lib/utils.ts create mode 100644 apps/www/registry/creative-tim/ui/accordion.tsx create mode 100644 apps/www/registry/creative-tim/ui/alert-dialog.tsx create mode 100644 apps/www/registry/creative-tim/ui/alert.tsx create mode 100644 apps/www/registry/creative-tim/ui/aspect-ratio.tsx create mode 100644 apps/www/registry/creative-tim/ui/avatar.tsx create mode 100644 apps/www/registry/creative-tim/ui/badge.tsx create mode 100644 apps/www/registry/creative-tim/ui/breadcrumb.tsx create mode 100644 apps/www/registry/creative-tim/ui/button-group.tsx create mode 100644 apps/www/registry/creative-tim/ui/button.tsx create mode 100644 apps/www/registry/creative-tim/ui/calendar.tsx create mode 100644 apps/www/registry/creative-tim/ui/card.tsx create mode 100644 apps/www/registry/creative-tim/ui/carousel.tsx create mode 100644 apps/www/registry/creative-tim/ui/chart.tsx create mode 100644 apps/www/registry/creative-tim/ui/checkbox.tsx create mode 100644 apps/www/registry/creative-tim/ui/chip.tsx create mode 100644 apps/www/registry/creative-tim/ui/collapse.tsx create mode 100644 apps/www/registry/creative-tim/ui/collapsible.tsx create mode 100644 apps/www/registry/creative-tim/ui/command.tsx create mode 100644 apps/www/registry/creative-tim/ui/context-menu.tsx create mode 100644 apps/www/registry/creative-tim/ui/dialog.tsx create mode 100644 apps/www/registry/creative-tim/ui/drawer.tsx create mode 100644 apps/www/registry/creative-tim/ui/dropdown-menu.tsx create mode 100644 apps/www/registry/creative-tim/ui/form.tsx create mode 100644 apps/www/registry/creative-tim/ui/hover-card.tsx create mode 100644 apps/www/registry/creative-tim/ui/input-otp.tsx create mode 100644 apps/www/registry/creative-tim/ui/input.tsx create mode 100644 apps/www/registry/creative-tim/ui/label.tsx create mode 100644 apps/www/registry/creative-tim/ui/list.tsx create mode 100644 apps/www/registry/creative-tim/ui/map.tsx create mode 100644 apps/www/registry/creative-tim/ui/menubar.tsx create mode 100644 apps/www/registry/creative-tim/ui/navigation-menu.tsx create mode 100644 apps/www/registry/creative-tim/ui/pagination.tsx create mode 100644 apps/www/registry/creative-tim/ui/popover.tsx create mode 100644 apps/www/registry/creative-tim/ui/progress.tsx create mode 100644 apps/www/registry/creative-tim/ui/radio-group.tsx create mode 100644 apps/www/registry/creative-tim/ui/rating.tsx create mode 100644 apps/www/registry/creative-tim/ui/resizable.tsx create mode 100644 apps/www/registry/creative-tim/ui/scroll-area.tsx create mode 100644 apps/www/registry/creative-tim/ui/select.tsx create mode 100644 apps/www/registry/creative-tim/ui/separator.tsx create mode 100644 apps/www/registry/creative-tim/ui/sheet.tsx create mode 100644 apps/www/registry/creative-tim/ui/sidebar.tsx create mode 100644 apps/www/registry/creative-tim/ui/skeleton.tsx create mode 100644 apps/www/registry/creative-tim/ui/slider.tsx create mode 100644 apps/www/registry/creative-tim/ui/software-purchase-card.tsx create mode 100644 apps/www/registry/creative-tim/ui/sonner.tsx create mode 100644 apps/www/registry/creative-tim/ui/spinner.tsx create mode 100644 apps/www/registry/creative-tim/ui/stepper.tsx create mode 100644 apps/www/registry/creative-tim/ui/switch.tsx create mode 100644 apps/www/registry/creative-tim/ui/table.tsx create mode 100644 apps/www/registry/creative-tim/ui/tabs.tsx create mode 100644 apps/www/registry/creative-tim/ui/textarea.tsx create mode 100644 apps/www/registry/creative-tim/ui/timeline.tsx create mode 100644 apps/www/registry/creative-tim/ui/toggle-group.tsx create mode 100644 apps/www/registry/creative-tim/ui/toggle.tsx create mode 100644 apps/www/registry/creative-tim/ui/tooltip.tsx create mode 100644 apps/www/registry/index.ts create mode 100644 apps/www/registry/registry-blocks.ts create mode 100644 apps/www/registry/registry-categories.ts create mode 100644 apps/www/registry/registry-examples.ts create mode 100644 apps/www/registry/registry-hooks.ts create mode 100644 apps/www/registry/registry-lib.ts create mode 100644 apps/www/registry/registry-ui.ts create mode 100644 apps/www/scripts/build-registry.mts create mode 100644 apps/www/scripts/capture-registry.mts create mode 100644 apps/www/scripts/validate-registries.mts create mode 100644 apps/www/source.config.ts create mode 100644 apps/www/styles/globals.css create mode 100644 apps/www/styles/themes.css create mode 100644 apps/www/tsconfig.json create mode 100644 apps/www/tsconfig.scripts.json create mode 100644 e2e/auth.login.spec.ts create mode 100644 e2e/auth.logout.spec.ts create mode 100644 e2e/auth.password.spec.ts create mode 100644 e2e/auth.redirects.spec.ts create mode 100644 e2e/auth.refresh-singleton.spec.ts create mode 100644 e2e/auth.register.spec.ts create mode 100644 e2e/helpers.ts create mode 100644 mock-api/.env create mode 100644 mock-api/db.json create mode 100644 mock-api/package.json create mode 100644 mock-api/routes.json create mode 100644 mock-api/server.js create mode 100644 package.json create mode 100644 playwright.config.ts create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 postcss.config.cjs create mode 100644 prettier.config.cjs create mode 100644 skills/README.md create mode 100644 skills/creative-tim-ui/AGENTS.md create mode 100644 skills/creative-tim-ui/SKILL.md create mode 100644 skills/creative-tim-ui/rules/brand-philosophy.md create mode 100644 skills/creative-tim-ui/rules/component-patterns.md create mode 100644 skills/creative-tim-ui/rules/design-brand.md create mode 100644 skills/creative-tim-ui/rules/hydration-safety.md create mode 100644 skills/creative-tim-ui/rules/install-blocks.md create mode 100644 skills/creative-tim-ui/rules/pro-api-key.md create mode 100644 skills/creative-tim-ui/rules/tailwind-rules.md create mode 100644 tsconfig.json create mode 100644 turbo.json create mode 100644 vitest.config.ts create mode 100644 vitest.workspace.ts diff --git a/.commitlintrc.json b/.commitlintrc.json new file mode 100644 index 0000000..c30e5a9 --- /dev/null +++ b/.commitlintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["@commitlint/config-conventional"] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ae10a5c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..9e4646c --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +node_modules/ +target/ +.next/ +build/ +dist/ + +/templates/ +/fixtures/ diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..94fcc14 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/eslintrc", + "root": true, + "extends": [ + "next/core-web-vitals", + "turbo", + "prettier", + "plugin:tailwindcss/recommended" + ], + "plugins": ["tailwindcss"], + "ignorePatterns": ["**/fixtures/**"], + "rules": { + "@next/next/no-html-link-for-pages": "off", + "tailwindcss/no-custom-classname": "off", + "tailwindcss/classnames-order": "error" + }, + "settings": { + "tailwindcss": { + "callees": ["cn", "cva"], + "config": "tailwind.config.cjs" + }, + "next": { + "rootDir": ["apps/*/"] + } + }, + "overrides": [ + { + "files": ["*.ts", "*.tsx"], + "parser": "@typescript-eslint/parser" + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8438b08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules +.pnpm-store +.pnp +.pnp.js + +# testing +coverage + +# next.js +.next/ +out/ +build + +# misc +.DS_Store +*.pem +.bmad-core/ +.claude/ +.cursor/ +web-bundles/ +.replit +replit.md + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# turbo +.turbo + +.contentlayer +tsconfig.tsbuildinfo + +# ide +.idea +.fleet +.vscode + +REGISTRY_STRUCTURE.md +packages/* diff --git a/.kodiak.toml b/.kodiak.toml new file mode 100644 index 0000000..bbfdb22 --- /dev/null +++ b/.kodiak.toml @@ -0,0 +1,18 @@ +# .kodiak.toml +version = 1 + +[merge] +automerge_label = "automerge" +require_automerge_label = true +method = "squash" +delete_branch_on_merge = true +optimistic_updates = false +prioritize_ready_to_merge = true +notify_on_conflict = true + +[merge.message] +title = "pull_request_title" +body = "pull_request_body" +include_pr_number = true +body_type = "markdown" +strip_html_comments = true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..41cd3d3 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,7 @@ +dist +node_modules +.next +build +.contentlayer +apps/www/pages/api/registry.json +**/fixtures diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..bac4808 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,143 @@ +# Contributing + +Thanks for your interest in contributing to ui.creative-tim.com. + +Please take a moment to review this document before submitting your first pull request. We also strongly recommend that you check for open issues and pull requests to see if someone else is working on something similar. + +If you need any help, feel free to reach out to [Creative Tim](https://creative-tim.com/contact). + +## About this repository + +This repository is a monorepo. + +- We use [pnpm](https://pnpm.io) and [`workspaces`](https://pnpm.io/workspaces) for development. +- We use [Turborepo](https://turbo.build/repo) as our build system. + +## Structure + +This repository is structured as follows: + +``` +apps +└── www + ├── app + ├── components + ├── content + └── registry + └── creative-tim-ui + ├── example + └── ui +``` + +| Path | Description | +| --------------------- | ---------------------------------------- | +| `apps/www/app` | The Next.js application for the website. | +| `apps/www/components` | The React components for the website. | +| `apps/www/content` | The content for the website. | +| `apps/www/registry` | The registry for the components. | + +## Development + +### Fork this repo + +You can fork this repo by clicking the fork button in the top right corner of this page. + +### Clone on your local machine + +```bash +git clone https://github.com/creative-tim/ui.git +``` + +### Navigate to project directory + +```bash +cd ui +``` + +### Create a new Branch + +```bash +git checkout -b my-new-branch +``` + +### Install dependencies + +```bash +pnpm install +``` + +### Run a workspace + +You can use the `pnpm --filter=[WORKSPACE]` command to start the development process for a workspace. + +#### Examples + +1. To run the `creative-tim.com/ui` website: + +```bash +pnpm dev +``` +## Documentation + +The documentation for this project is located in the `www` workspace. You can run the documentation locally by running the following command: + +```bash +pnpm dev +``` + +Documentation is written using [MDX](https://mdxjs.com). You can find the documentation files in the `apps/www/content/docs` directory. + +## Components + +We use a registry system for developing components. You can find the source code for the components under `apps/www/registry`. The components are organized by styles. + +```bash +apps +└── www + └── registry + └── creative-tim + ├── blocks + └── ui +``` + +When adding or modifying components, please ensure that: + +1. You make the changes for every style. +2. You update the documentation. +3. You run `pnpm build:registry` to update the registry. + +## Commit Convention + +Before you create a Pull Request, please check whether your commits comply with +the commit conventions used in this repository. + +When you create a commit we kindly ask you to follow the convention +`category(scope or module): message` in your commit message while using one of +the following categories: + +- `feat / feature`: all changes that introduce completely new code or new + features +- `fix`: changes that fix a bug (ideally you will additionally reference an + issue if present) +- `refactor`: any code related change that is not a fix nor a feature +- `docs`: changing existing or creating new documentation (i.e. README, docs for + usage of a lib or cli usage) +- `build`: all changes regarding the build of the software, changes to + dependencies or the addition of new dependencies +- `test`: all changes regarding tests (adding new tests or changing existing + ones) +- `ci`: all changes regarding the configuration of continuous integration (i.e. + github actions, ci system) +- `chore`: all changes to the repository that do not fit into any of the above + categories + + e.g. `feat(components): add new prop to the avatar component` + +If you are interested in the detailed specification you can visit +https://www.conventionalcommits.org/ or check out the +[Angular Commit Message Guidelines](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines). + +## Requests for new components + +If you have a request for a new component, please open a discussion on GitHub. We'll be happy to help you out. +Please ensure that the tests are passing when submitting a pull request. If you're adding new features, please include tests. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..d50a823 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 [Creative Tim](https://www.creative-tim.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software "), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7c7e8ef --- /dev/null +++ b/README.md @@ -0,0 +1,205 @@ +[![Creative Tim UI](https://raw.githubusercontent.com/creativetimofficial/ui/refs/heads/main/apps/www/public/opengraph-image.png)](https://creative-tim.com/ui) + +# Creative Tim UI + +[Creative Tim UI](https://creative-tim.com/ui) is a comprehensive component library built on top of [shadcn/ui](https://ui.shadcn.com/) to help you build modern web applications faster. + +## Overview + +Creative Tim UI provides pre-built, customizable React components and blocks designed for building beautiful, production-ready web applications. +The CLI makes it easy to add these components to your Next.js project. + +## Installation +You can use the Creative Tim UI CLI directly with npx, or install it globally: +```bash +# Use directly (recommended) +npx @creative-tim/ui@latest add + +# Or using shadcn cli +npx shadcn@latest add https://creative-tim.com/ui/r/all.json +``` + +## Prerequisites +Before using Creative Tim UI, ensure your Next.js project meets these requirements: +- **Node.js 18** or later +- **shadcn/ui** initialized in your project (npx shadcn@latest init) +- **Tailwind CSS** configured + +## Usage + +### Install All Components +Install all available Creative Tim UI components at once: +```bash +npx @creative-tim/ui@latest add all +``` +This command will: +- Set up shadcn/ui if not already configured +- Install all Creative Tim UI components to your configured components directory +- Add necessary dependencies to your project + +### Install Specific Components +Install individual components using the `components add` command: +```bash +npx @creative-tim/ui@latest add +``` +Examples: +```bash +# Install the orb component +npx @creative-tim/ui@latest add card +``` + +### Alternative: Use with shadcn CLI +You can also install components using the standard shadcn/ui CLI: +```bash +# Install all components +npx shadcn@latest add https://creative-tim.com/ui/r/all.json + +# Install a specific component +npx shadcn@latest add https://creative-tim.com/ui/r/button.json +``` + +All available components can be found [here](https://creative-tim.com/ui/docs/components) or explore a list of example blocks [here](https://creative-tim.com/ui/blocks). + +## Blocks + +Explore our collection of ready-to-use blocks organized by category. Each block is fully customizable and can be added to your project with a single command. + +### Application UI + + + + + + + +
+ +Modals +
+Modals
+5 Blocks +
+
+ +Account +
+Account
+7 Blocks +
+
+ +Billing +
+Billing
+5 Blocks +
+
+ +### Marketing + + + + + + + + + + + +
+ +Testimonial Sections +
+Testimonial Sections
+17 Blocks +
+
+ +Contact Sections +
+Contact Sections
+15 Blocks +
+
+ +Footers +
+Footers
+16 Blocks +
+
+ +FAQs +
+FAQs
+6 Blocks +
+
+ +Blog +
+Blog
+15 Blocks +
+
+ +### Ecommerce UI +Ready-to-use blocks for product listings, shopping carts, and checkout flows. + + + + + +
+ +Ecommerce Sections +
+Ecommerce Sections
+14 Blocks +
+
+ +### Web 3.0 +Innovative sections built for decentralized applications, blockchain projects, and crypto platforms. + + + + + +
+ +Web 3.0 Cards +
+Web 3.0 Cards
+5 Blocks +
+
+ +## Contributing + +If you'd like to contribute to Creative Tim UI, please follow these steps: + +1. Fork the repository +2. Create a new branch +3. Make your changes to the components in the registry. +4. Open a PR to the main branch. + +Please read the [contributing guide](/CONTRIBUTING.md). + +## Copyrights and Licenses + +Creative Tim UI is built upon the incredible work of the open source community: + +- **[shadcn/ui](https://ui.shadcn.com/)** - The documentation structure, registry system, and foundational (atomic) components are from the open source work in shadcn/ui. [MIT License](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md) +- **[Material Tailwind](https://material-tailwind.com/v3)** by Creative Tim - The blocks and component designs are inspired by and based on Material Tailwind Framework. [MIT License](https://github.com/creativetimofficial/material-tailwind/blob/main/LICENSE.md) +- **[Eleven Labs UI](https://github.com/elevenlabs/elevenlabs-ui)** - General inspiration for the documentation structure and approach of blocks. [MIT License](https://github.com/elevenlabs/ui/blob/main/LICENSE.md) +- **[Geist Font](https://vercel.com/font)** by Vercel - The beautiful typeface used throughout the interface. [SIL Open Font License 1.1](https://github.com/vercel/geist-font/blob/main/LICENSE.txt) + +We are grateful to these projects for making their work available under open source licenses. + +## License + +Licensed under the [MIT license](https://github.com/creativetimofficial/ui/blob/main/LICENSE.md). + +Made with love by [Creative Tim](https://creative-tim.com). diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..51c9d97 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`creativetimofficial/ui` +- 原始仓库:https://github.com/creativetimofficial/ui +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/apps/www/.env.example b/apps/www/.env.example new file mode 100644 index 0000000..1071231 --- /dev/null +++ b/apps/www/.env.example @@ -0,0 +1,10 @@ +# Private Registry Authentication +# Set your API key to access private components (testimonials-03, testimonials-04) +# Get your API key from: https://creative-tim.com/ui +API_KEY=your_api_key_here + +NEXT_PUBLIC_V0_URL=https://v0.app +NEXT_PUBLIC_APP_URL=http://localhost:5000 + +NEXT_PUBLIC_ASSET_PREFIX = "/ui" +NEXT_PUBLIC_VIEW_PATH = "/ui/view" \ No newline at end of file diff --git a/apps/www/.gitignore b/apps/www/.gitignore new file mode 100644 index 0000000..db9ea2f --- /dev/null +++ b/apps/www/.gitignore @@ -0,0 +1,48 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* +!.env.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + + +# generated content +.contentlayer +.content-collections +.source diff --git a/apps/www/.prettierignore b/apps/www/.prettierignore new file mode 100644 index 0000000..1a1509a --- /dev/null +++ b/apps/www/.prettierignore @@ -0,0 +1,7 @@ +dist +node_modules +.next +build +.contentlayer +registry/__index__.tsx +content/docs/components/calendar.mdx diff --git a/apps/www/app/(app)/(root)/page.tsx b/apps/www/app/(app)/(root)/page.tsx new file mode 100644 index 0000000..c7ccbda --- /dev/null +++ b/apps/www/app/(app)/(root)/page.tsx @@ -0,0 +1,220 @@ +import { Metadata } from "next" +import Link from "next/link" +import { Download, Package, Star, Users } from "lucide-react" + +import { ExamplesNav } from "@/components/examples-nav" +import { ExamplesPreview } from "@/components/examples-preview" +import { ShowcaseMasonry } from "@/components/showcase-masonry" +import { TestimonialsSection } from "@/components/testimonials-section" +import { + PageActions, + PageHeader, + PageHeaderDescription, + PageHeaderHeading, +} from "@/components/page-header" +import { PageNav } from "@/components/page-nav" +import { ThemeSelector } from "@/components/theme-selector" +import { Button } from "@/components/ui/button" +import { Card } from "@/components/ui/card" + +const title = "Creative Tim UI" +const description = + "Open-source components, blocks, and AI agents designed to speed up your workflow. Import them seamlessly into your favorite tools through Registry and MCPs." + +export const dynamic = "force-static" +export const revalidate = false + +export const metadata: Metadata = { + title, + description, + openGraph: { + images: [ + { + url: `/og?title=${encodeURIComponent( + title + )}&description=${encodeURIComponent(description)}`, + }, + ], + }, + twitter: { + card: "summary_large_image", + images: [ + { + url: `/og?title=${encodeURIComponent( + title + )}&description=${encodeURIComponent(description)}`, + }, + ], + }, +} + +export default function IndexPage() { + + const assetPrefix = process.env.NEXT_PUBLIC_ASSET_PREFIX + + return ( +
+
+
+ + + + + Creative Tim + + + UI + + + + {description} + + + + + + {/* Logo Section */} +
+
+ {/* OpenAI */} +
+ OpenAI +
+ + {/* Claude */} +
+ Claude +
+ + {/* v0 */} +
+ v0 +
+ + {/* Replit */} +
+ Replit +
+ + {/* Bolt */} +
+ Bolt +
+ + {/* Lovable */} +
+ Lovable +
+
+
+
+
+ + + + + {/* Achievements Section */} +
+
+

+ Remarkable Achievements +

+

+ Discover how our UI Tools have transformed web development. These + achievements showcase our dedication to innovation and our + community's growth. +

+ +
+ + +
2.6M+
+
Community Members
+

+ Join our community of developers and designers +

+
+ + + +
8.6M+
+
+ Cumulative Downloads +
+

+ Based on Material Tailwind and Creative Tim Products +

+
+ + + +
48,000+
+
+ Github Cumulative Stars +
+

+ On 100+ Open Source Repositories and Projects +

+
+ + + +
280,000+
+
+ Monthly NPM Downloads +
+

+ Including React, HTML, Tailwind CSS and more. +

+
+
+
+
+ + {/* Examples Preview Section */} + + + {/* Testimonials Section */} + + + + + + +
+ ) +} diff --git a/apps/www/app/(app)/blocks/[...categories]/page.tsx b/apps/www/app/(app)/blocks/[...categories]/page.tsx new file mode 100644 index 0000000..9c3b9f2 --- /dev/null +++ b/apps/www/app/(app)/blocks/[...categories]/page.tsx @@ -0,0 +1,30 @@ +import { getAllBlockIds } from "@/lib/blocks" +import { BlockDisplay } from "@/components/block-display" +import { registryCategories } from "@/registry/registry-categories" + +export const revalidate = false +export const dynamic = "force-static" +export const dynamicParams = false + +export async function generateStaticParams() { + return registryCategories.map((category) => ({ + categories: [category.slug], + })) +} + +export default async function BlocksPage({ + params, +}: { + params: Promise<{ categories?: string[] }> +}) { + const { categories = [] } = await params + const blocks = await getAllBlockIds(["registry:block"], categories) + + return ( +
+ {blocks.map((name) => ( + + ))} +
+ ) +} diff --git a/apps/www/app/(app)/blocks/layout.tsx b/apps/www/app/(app)/blocks/layout.tsx new file mode 100644 index 0000000..f5dd30f --- /dev/null +++ b/apps/www/app/(app)/blocks/layout.tsx @@ -0,0 +1,71 @@ +import { Metadata } from "next" +import Link from "next/link" + +import { BlocksNav } from "@/components/blocks-nav" +import { + PageActions, + PageHeader, + PageHeaderDescription, + PageHeaderHeading, +} from "@/components/page-header" +import { PageNav } from "@/components/page-nav" +import { Button } from "@/components/ui/button" + +const title = "Blocks" +const description = + "A collection of building blocks and components made by Creative Tim on top of shadcn/ui." + +export const metadata: Metadata = { + title, + description, + openGraph: { + images: [ + { + url: `/og?title=${encodeURIComponent( + title + )}&description=${encodeURIComponent(description)}`, + }, + ], + }, + twitter: { + card: "summary_large_image", + images: [ + { + url: `/og?title=${encodeURIComponent( + title + )}&description=${encodeURIComponent(description)}`, + }, + ], + }, +} + +export default function BlocksLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + <> + + {title} + {description} + + + + + + + + +
+
{children}
+
+ + ) +} diff --git a/apps/www/app/(app)/blocks/page.tsx b/apps/www/app/(app)/blocks/page.tsx new file mode 100644 index 0000000..555e9fe --- /dev/null +++ b/apps/www/app/(app)/blocks/page.tsx @@ -0,0 +1,23 @@ +import { BlockDisplay } from "@/components/block-display" + +export const dynamic = "force-static" +export const revalidate = false + +const FEATURED_BLOCKS = [ + "software-purchase-01", + "dark-product-overview-01", + "web3-04", + "account-basic-info-01", + "cruds-01", + "testimonials-03", +] + +export default async function BlocksPage() { + return ( +
+ {FEATURED_BLOCKS.map((name) => ( + + ))} +
+ ) +} diff --git a/apps/www/app/(app)/docs/[[...slug]]/page.tsx b/apps/www/app/(app)/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..cbfc7bc --- /dev/null +++ b/apps/www/app/(app)/docs/[[...slug]]/page.tsx @@ -0,0 +1,212 @@ +import Link from "next/link" +import { notFound } from "next/navigation" +import { mdxComponents } from "@/mdx-components" +import { + IconArrowLeft, + IconArrowRight, + IconArrowUpRight, +} from "@tabler/icons-react" +import { findNeighbour } from "fumadocs-core/server" + +import { source } from "@/lib/source" +import { absoluteUrl } from "@/lib/utils" +import { DocsCopyPage } from "@/components/docs-copy-page" +import { DocsSidebarCta } from "@/components/docs-sidebar-cta" +import { DocsTableOfContents } from "@/components/docs-toc" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" + +export const revalidate = false +export const dynamic = "force-static" +export const dynamicParams = false + +export function generateStaticParams() { + return source.generateParams() +} + +export async function generateMetadata(props: { + params: Promise<{ slug?: string[] }> +}) { + const params = await props.params + const page = source.getPage(params.slug) + + if (!page) { + notFound() + } + + const doc = page.data + + if (!doc.title || !doc.description) { + notFound() + } + + return { + title: doc.title, + description: doc.description, + openGraph: { + title: doc.title, + description: doc.description, + type: "article", + url: absoluteUrl(page.url), + images: [ + { + url: `/og?title=${encodeURIComponent( + doc.title + )}&description=${encodeURIComponent(doc.description)}`, + }, + ], + }, + twitter: { + card: "summary_large_image", + title: doc.title, + description: doc.description, + images: [ + { + url: `/og?title=${encodeURIComponent( + doc.title + )}&description=${encodeURIComponent(doc.description)}`, + }, + ], + creator: "@creativetim", + }, + } +} + +export default async function Page(props: { + params: Promise<{ slug?: string[] }> +}) { + const params = await props.params + const page = source.getPage(params.slug) + if (!page) { + notFound() + } + + const doc = page.data + // @ts-expect-error - revisit fumadocs types. + const MDX = doc.body + const neighbours = await findNeighbour(source.pageTree, page.url) + + // @ts-expect-error - revisit fumadocs types. + const links = doc.links + + return ( +
+
+
+
+
+
+
+

+ {doc.title} +

+
+ + {neighbours.previous && ( + + )} + {neighbours.next && ( + + )} +
+
+ {doc.description && ( +

+ {doc.description} +

+ )} +
+ {links ? ( +
+ {links?.doc && ( + + + Docs + + + )} + {links?.api && ( + + + API Reference + + + )} +
+ ) : null} +
+
+ +
+
+
+ {neighbours.previous && ( + + )} + {neighbours.next && ( + + )} +
+
+
+
+ {/* @ts-expect-error - revisit fumadocs types. */} + {doc.toc?.length ? ( +
+ {/* @ts-expect-error - revisit fumadocs types. */} + +
+
+ ) : null} +
+ +
+
+
+ ) +} diff --git a/apps/www/app/(app)/docs/layout.tsx b/apps/www/app/(app)/docs/layout.tsx new file mode 100644 index 0000000..d147846 --- /dev/null +++ b/apps/www/app/(app)/docs/layout.tsx @@ -0,0 +1,18 @@ +import { source } from "@/lib/source" +import { DocsSidebar } from "@/components/docs-sidebar" +import { SidebarProvider } from "@/components/ui/sidebar" + +export default function DocsLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( +
+ + +
{children}
+
+
+ ) +} diff --git a/apps/www/app/(app)/layout.tsx b/apps/www/app/(app)/layout.tsx new file mode 100644 index 0000000..e7b67cf --- /dev/null +++ b/apps/www/app/(app)/layout.tsx @@ -0,0 +1,12 @@ +import { SiteFooter } from "@/components/site-footer" +import { SiteHeader } from "@/components/site-header" + +export default function AppLayout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+ +
+ ) +} diff --git a/apps/www/app/(app)/llm/[[...slug]]/route.ts b/apps/www/app/(app)/llm/[[...slug]]/route.ts new file mode 100644 index 0000000..375f035 --- /dev/null +++ b/apps/www/app/(app)/llm/[[...slug]]/route.ts @@ -0,0 +1,29 @@ +import { notFound } from "next/navigation" +import { NextResponse, type NextRequest } from "next/server" + +import { source } from "@/lib/source" + +export const revalidate = false + +export async function GET( + _req: NextRequest, + { params }: { params: Promise<{ slug: string[] }> } +) { + const slug = (await params).slug + const page = source.getPage(slug) + + if (!page) { + notFound() + } + + // @ts-expect-error - revisit fumadocs types. + return new NextResponse(page.data.content, { + headers: { + "Content-Type": "text/markdown; charset=utf-8", + }, + }) +} + +export function generateStaticParams() { + return source.generateParams() +} diff --git a/apps/www/app/(view)/view/[name]/page.tsx b/apps/www/app/(view)/view/[name]/page.tsx new file mode 100644 index 0000000..56054d9 --- /dev/null +++ b/apps/www/app/(view)/view/[name]/page.tsx @@ -0,0 +1,103 @@ +import * as React from "react" +import { Metadata } from "next" +import { notFound } from "next/navigation" +import { registryItemSchema } from "shadcn/schema" +import { z } from "zod" + +import { siteConfig } from "@/lib/config" +import { getRegistryComponent, getRegistryItem } from "@/lib/registry" +import { absoluteUrl, cn } from "@/lib/utils" + +export const revalidate = false +export const dynamic = "force-static" +export const dynamicParams = false + +const getCachedRegistryItem = React.cache(async (name: string) => { + return await getRegistryItem(name) +}) + +export async function generateMetadata({ + params, +}: { + params: Promise<{ + name: string + }> +}): Promise { + const { name } = await params + const item = await getCachedRegistryItem(name) + + if (!item) { + return {} + } + + const title = item.name + const description = item.description + + return { + title: item.description, + description, + openGraph: { + title, + description, + type: "article", + url: absoluteUrl(`/view/${item.name}`), + images: [ + { + url: siteConfig.ogImage, + width: 1200, + height: 630, + alt: siteConfig.name, + }, + ], + }, + twitter: { + card: "summary_large_image", + title, + description, + images: [siteConfig.ogImage], + creator: "@creativetim", + }, + } +} + +export async function generateStaticParams() { + const { Index } = await import("@/registry/__index__") + const index = z.record(registryItemSchema).parse(Index) + + return Object.values(index) + .filter((block) => + [ + "registry:block", + "registry:component", + "registry:example", + "registry:internal", + ].includes(block.type) + ) + .map((block) => ({ + name: block.name, + })) +} + +export default async function BlockPage({ + params, +}: { + params: Promise<{ + name: string + }> +}) { + const { name } = await params + const item = await getCachedRegistryItem(name) + const Component = getRegistryComponent(name) + + if (!item || !Component) { + return notFound() + } + + return ( + <> +
+ +
+ + ) +} diff --git a/apps/www/app/api/r/[name]/route.ts b/apps/www/app/api/r/[name]/route.ts new file mode 100644 index 0000000..9eb5a8f --- /dev/null +++ b/apps/www/app/api/r/[name]/route.ts @@ -0,0 +1,87 @@ +import { existsSync, readFileSync } from "fs" +import path from "path" +import { NextRequest, NextResponse } from "next/server" + +const PRIVATE_COMPONENTS = ["testimonials-03", "testimonials-04"] + +export async function GET( + request: NextRequest, + { params }: { params: Promise<{ name: string }> } +) { + const { name: componentName } = await params + + if (!PRIVATE_COMPONENTS.includes(componentName)) { + return NextResponse.json( + { error: "Component not found or not private" }, + { status: 404 } + ) + } + + const authHeader = request.headers.get("authorization") + const token = authHeader?.replace("Bearer ", "") + + const queryToken = request.nextUrl.searchParams.get("token") + const apiKey = request.headers.get("x-api-key") + + const providedToken = token || queryToken || apiKey + + if (!isValidToken(providedToken)) { + return NextResponse.json( + { + error: "Unauthorized", + message: + "Authentication required for private components. Set API_KEY in your .env.local file or provide it via Authorization header, X-API-Key header, or ?token= query parameter.", + }, + { status: 401 } + ) + } + + try { + const componentPath = path.join( + process.cwd(), + "public", + "r", + `${componentName}.json` + ) + + if (!existsSync(componentPath)) { + return NextResponse.json( + { error: "Component not found" }, + { status: 404 } + ) + } + + const componentData = readFileSync(componentPath, "utf-8") + const component = JSON.parse(componentData) + + return NextResponse.json(component, { + headers: { + "Content-Type": "application/json", + "Cache-Control": "private, max-age=3600", + }, + }) + } catch (error) { + console.error(`Error serving private component ${componentName}:`, error) + return NextResponse.json( + { error: "Internal server error" }, + { status: 500 } + ) + } +} + +function isValidToken(token: string | null): boolean { + if (!token) { + return false + } + + const validApiKey = process.env.API_KEY + + if (!validApiKey) { + console.warn( + "API_KEY not set in environment variables. Private components will be inaccessible." + ) + return false + } + + return token === validApiKey +} diff --git a/apps/www/app/layout.tsx b/apps/www/app/layout.tsx new file mode 100644 index 0000000..3b1cdcc --- /dev/null +++ b/apps/www/app/layout.tsx @@ -0,0 +1,107 @@ +import type { Metadata } from "next" + +import { META_THEME_COLORS, siteConfig } from "@/lib/config" +import { fontVariables } from "@/lib/fonts" +import { cn } from "@/lib/utils" +import { LayoutProvider } from "@/hooks/use-layout" +import { ActiveThemeProvider } from "@/components/active-theme" +import { Analytics } from "@/components/analytics" +import { TailwindIndicator } from "@/components/tailwind-indicator" +import { ThemeProvider } from "@/components/theme-provider" +import { Toaster } from "@/components/ui/sonner" + +import "@/styles/globals.css" + +export const metadata: Metadata = { + title: { + default: siteConfig.name, + template: `%s | ${siteConfig.name}`, + }, + metadataBase: new URL(process.env.NEXT_PUBLIC_APP_URL!), + description: siteConfig.description, + keywords: ["Creative Tim", "UI", "shadcn", "Components", "agents"], + authors: [ + { + name: "Creative Tim", + url: "https://creative-tim.com", + }, + ], + creator: "creative-tim", + openGraph: { + type: "website", + locale: "en_US", + url: + process.env.NEXT_PUBLIC_APP_URL! + process.env.NEXT_PUBLIC_ASSET_PREFIX, + title: siteConfig.name, + description: siteConfig.description, + siteName: siteConfig.name, + images: [ + { + url: `${process.env.NEXT_PUBLIC_APP_URL}${process.env.NEXT_PUBLIC_ASSET_PREFIX}/opengraph-image.png`, + width: 1200, + height: 630, + alt: siteConfig.name, + }, + ], + }, + twitter: { + card: "summary_large_image", + title: siteConfig.name, + description: siteConfig.description, + images: [ + `${process.env.NEXT_PUBLIC_APP_URL}${process.env.NEXT_PUBLIC_ASSET_PREFIX}/opengraph-image.png`, + ], + creator: "@creativetim", + }, + icons: { + icon: `${process.env.NEXT_PUBLIC_APP_URL}${process.env.NEXT_PUBLIC_ASSET_PREFIX}/favicon.ico`, + shortcut: `${process.env.NEXT_PUBLIC_APP_URL}${process.env.NEXT_PUBLIC_ASSET_PREFIX}/favicon-16x16.png`, + apple: `${process.env.NEXT_PUBLIC_APP_URL}${process.env.NEXT_PUBLIC_ASSET_PREFIX}/apple-touch-icon.png`, + }, + manifest: `${process.env.NEXT_PUBLIC_APP_URL}${process.env.NEXT_PUBLIC_ASSET_PREFIX}/site.webmanifest`, +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + + + )} + + {/* If you also want Vercel Analytics, uncomment the import above and + add here. */} + + ) +} diff --git a/apps/www/components/announcement.tsx b/apps/www/components/announcement.tsx new file mode 100644 index 0000000..f8fd9bd --- /dev/null +++ b/apps/www/components/announcement.tsx @@ -0,0 +1,14 @@ +import Link from "next/link" +import { ArrowRightIcon } from "lucide-react" + +import { Badge } from "@/components/ui/badge" + +export function Announcement() { + return ( + + + Insert Announcement here + + + ) +} diff --git a/apps/www/components/block-display.tsx b/apps/www/components/block-display.tsx new file mode 100644 index 0000000..f860cff --- /dev/null +++ b/apps/www/components/block-display.tsx @@ -0,0 +1,63 @@ +import * as React from "react" +import { registryItemFileSchema } from "shadcn/schema" +import { z } from "zod" + +import { highlightCode } from "@/lib/highlight-code" +import { + createFileTreeForRegistryItemFiles, + getRegistryItem, +} from "@/lib/registry" +import { cn } from "@/lib/utils" +import { BlockViewer } from "@/components/block-viewer" +import { ComponentPreview } from "@/components/component-preview" + +export async function BlockDisplay({ name }: { name: string }) { + const item = await getCachedRegistryItem(name) + + if (!item?.files) { + return null + } + + const [tree, highlightedFiles] = await Promise.all([ + getCachedFileTree(item.files), + getCachedHighlightedFiles(item.files), + ]) + + return ( + + .p-6]:p-0", + item.meta?.containerClassName + )} + /> + + ) +} + +const getCachedRegistryItem = React.cache(async (name: string) => { + return await getRegistryItem(name) +}) + +const getCachedFileTree = React.cache( + async (files: Array<{ path: string; target?: string }>) => { + if (!files) { + return null + } + + return await createFileTreeForRegistryItemFiles(files) + } +) + +const getCachedHighlightedFiles = React.cache( + async (files: z.infer[]) => { + return await Promise.all( + files.map(async (file) => ({ + ...file, + highlightedContent: await highlightCode(file.content ?? ""), + })) + ) + } +) diff --git a/apps/www/components/block-image.tsx b/apps/www/components/block-image.tsx new file mode 100644 index 0000000..3c11df2 --- /dev/null +++ b/apps/www/components/block-image.tsx @@ -0,0 +1,36 @@ +import Image from "next/image" + +import { cn } from "@/lib/utils" + +export function BlockImage({ + name, + width = 1440, + height = 900, + className, +}: Omit, "src" | "alt"> & { name: string }) { + return ( +
+ {name} + {name} +
+ ) +} diff --git a/apps/www/components/block-viewer.tsx b/apps/www/components/block-viewer.tsx new file mode 100644 index 0000000..6925dd5 --- /dev/null +++ b/apps/www/components/block-viewer.tsx @@ -0,0 +1,560 @@ +"use client" + +import * as React from "react" +import Image from "next/image" +import Link from "next/link" +import { + Check, + ChevronRight, + Clipboard, + File, + Folder, + Fullscreen, + Monitor, + RotateCw, + Smartphone, + Tablet, + Terminal, +} from "lucide-react" +import { ImperativePanelHandle } from "react-resizable-panels" +import { registryItemFileSchema, registryItemSchema } from "shadcn/schema" +import { z } from "zod" + +import { trackEvent } from "@/lib/events" +import { createFileTreeForRegistryItemFiles, FileTree } from "@/lib/registry" +import { cn } from "@/lib/utils" +import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard" +import { getIconForLanguageExtension } from "@/components/icons" +import { OpenInV0Button } from "@/components/open-in-v0-button" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible" +import { + ResizableHandle, + ResizablePanel, + ResizablePanelGroup, +} from "@/components/ui/resizable" +import { Separator } from "@/components/ui/separator" +import { + Sidebar, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSub, + SidebarProvider, +} from "@/components/ui/sidebar" +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs" +import { + ToggleGroup, + ToggleGroupItem, +} from "@/components/ui/toggle-group" + +type BlockViewerContext = { + item: z.infer + view: "code" | "preview" + setView: (view: "code" | "preview") => void + activeFile: string | null + setActiveFile: (file: string) => void + resizablePanelRef: React.RefObject | null + tree: ReturnType | null + highlightedFiles: + | (z.infer & { + highlightedContent: string + })[] + | null + iframeKey?: number + setIframeKey?: React.Dispatch> +} + +const BlockViewerContext = React.createContext(null) + +function useBlockViewer() { + const context = React.useContext(BlockViewerContext) + if (!context) { + throw new Error("useBlockViewer must be used within a BlockViewerProvider.") + } + return context +} + +function BlockViewerProvider({ + item, + tree, + highlightedFiles, + children, +}: Pick & { + children: React.ReactNode +}) { + const [view, setView] = React.useState("preview") + const [activeFile, setActiveFile] = React.useState< + BlockViewerContext["activeFile"] + >(highlightedFiles?.[0].target ?? null) + const resizablePanelRef = React.useRef(null) + const [iframeKey, setIframeKey] = React.useState(0) + + return ( + +
+ {children} +
+
+ ) +} + +function BlockViewerToolbar() { + const { setView, view, item, resizablePanelRef, setIframeKey } = + useBlockViewer() + const { copyToClipboard, isCopied } = useCopyToClipboard() + // const viewPath = process.env.NEXT_PUBLIC_VIEW_PATH || "/view" + + return ( +
+ {/* Title and Description Section */} +
+ + {item.meta?.details && ( +

+ {item.meta.details} +

+ )} +
+ + {/* Controllers Section */} +
+ {/* {isPro && !hasAccess ? ( + + ) : ( */} + + {/* )} */} + + + +
+
+ { + setView("preview") + if (resizablePanelRef?.current) { + resizablePanelRef.current.resize(parseInt(value)) + } + }} + className="gap-1 *:data-[slot=toggle-group-item]:!size-6 *:data-[slot=toggle-group-item]:!rounded-sm" + > + + + + + + + + + + + + + + +
+ + setView(value as "preview" | "code")} + > + + Preview + {/* */} + + Code + + + + + + +
+
+
+ ) +} + +function BlockViewerIframe({ className }: { className?: string }) { + const { item, iframeKey } = useBlockViewer() + const viewPath = process.env.NEXT_PUBLIC_VIEW_PATH || "/view" + + return ( +