├── .gitignore
├── .prettierignore
├── .prettierrc
├── LICENCE.md
├── README.md
├── apps
└── www
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── LICENCE.md
│ ├── README.md
│ ├── app
│ ├── (categories)
│ │ └── [...slug]
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ ├── examples
│ │ ├── about
│ │ │ └── one
│ │ │ │ └── page.tsx
│ │ ├── contact
│ │ │ └── one
│ │ │ │ └── page.tsx
│ │ ├── home
│ │ │ └── one
│ │ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ └── pricing
│ │ │ └── one
│ │ │ └── page.tsx
│ ├── globals.css
│ ├── icon.svg
│ ├── layout.tsx
│ ├── mist
│ │ ├── opengraph-image.png
│ │ ├── page.tsx
│ │ └── twitter-image.png
│ ├── og
│ │ └── route.tsx
│ ├── opengraph-image.png
│ ├── page.tsx
│ ├── preview
│ │ └── [[...slug]]
│ │ │ ├── block-renderer.tsx
│ │ │ └── page.tsx
│ ├── robots.ts
│ ├── sitemap.ts
│ ├── snippets
│ │ ├── button
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ └── twitter-image.png
│ ├── components.json
│ ├── components
│ ├── active-category-links.tsx
│ ├── block-preview
│ │ ├── iframe-renderer.tsx
│ │ ├── index.tsx
│ │ ├── loading-spinner.tsx
│ │ ├── mcp-logo.tsx
│ │ ├── open-in-v0.tsx
│ │ ├── state.ts
│ │ ├── toolbar.tsx
│ │ ├── tooltip-button.tsx
│ │ └── useOptimizedIframe.ts
│ ├── blocks-nav.tsx
│ ├── category-not-found.tsx
│ ├── category-scroll-manager.tsx
│ ├── code-block.tsx
│ ├── code-editor.tsx
│ ├── dev
│ │ └── CacheControl.tsx
│ ├── ex-features.tsx
│ ├── ex-footer.tsx
│ ├── ex-header.tsx
│ ├── kit-switcher.tsx
│ ├── logo.tsx
│ ├── service-worker-init.tsx
│ ├── site-footer.tsx
│ ├── site-header.tsx
│ ├── snippet-preview.tsx
│ ├── snippets
│ │ └── buttons
│ │ │ └── button.tsx
│ ├── theme-provider.tsx
│ ├── theme-toggle.tsx
│ └── toolbar.tsx
│ ├── data
│ └── blocks.ts
│ ├── eslint.config.mjs
│ ├── hooks
│ └── useClipboard.ts
│ ├── lib
│ ├── get-kits.ts
│ ├── get-og-url.ts
│ ├── serviceWorker.ts
│ └── utils.ts
│ ├── middleware.ts
│ ├── mist-registry.json
│ ├── next.config.ts
│ ├── package.json
│ ├── postcss.config.mjs
│ ├── public
│ ├── card.png
│ ├── charts-light.png
│ ├── charts.png
│ ├── dark-card.webp
│ ├── exercice-dark.png
│ ├── exercice.png
│ ├── mail-back-light.png
│ ├── mail-back.png
│ ├── mail-upper.png
│ ├── mail2-light.png
│ ├── mail2.png
│ ├── mist
│ │ ├── tailark-2.png
│ │ ├── tailark-3.png
│ │ └── tailark.png
│ ├── music-light.png
│ ├── music.png
│ ├── origin-cal-dark.png
│ ├── origin-cal.png
│ ├── payments-light.png
│ ├── payments.png
│ ├── r
│ │ ├── call-to-action-1.json
│ │ ├── call-to-action-2.json
│ │ ├── call-to-action-3.json
│ │ ├── comparator-1.json
│ │ ├── contact-1.json
│ │ ├── contact-2.json
│ │ ├── content-1.json
│ │ ├── content-2.json
│ │ ├── content-3.json
│ │ ├── content-4.json
│ │ ├── content-5.json
│ │ ├── content-6.json
│ │ ├── content-7.json
│ │ ├── faqs-1.json
│ │ ├── faqs-2.json
│ │ ├── faqs-3.json
│ │ ├── faqs-4.json
│ │ ├── features-1.json
│ │ ├── features-10.json
│ │ ├── features-11.json
│ │ ├── features-12.json
│ │ ├── features-2.json
│ │ ├── features-3.json
│ │ ├── features-4.json
│ │ ├── features-5.json
│ │ ├── features-6.json
│ │ ├── features-7.json
│ │ ├── features-8.json
│ │ ├── features-9.json
│ │ ├── footer-1.json
│ │ ├── footer-2.json
│ │ ├── footer-3.json
│ │ ├── footer-4.json
│ │ ├── footer-5.json
│ │ ├── forgot-password-1.json
│ │ ├── forgot-password-2.json
│ │ ├── hero-section-1.json
│ │ ├── hero-section-2.json
│ │ ├── hero-section-3.json
│ │ ├── hero-section-4.json
│ │ ├── hero-section-5.json
│ │ ├── hero-section-6.json
│ │ ├── hero-section-7.json
│ │ ├── hero-section-8.json
│ │ ├── hero-section-9.json
│ │ ├── integrations-1.json
│ │ ├── integrations-2.json
│ │ ├── integrations-3.json
│ │ ├── integrations-4.json
│ │ ├── integrations-5.json
│ │ ├── integrations-6.json
│ │ ├── integrations-7.json
│ │ ├── integrations-8.json
│ │ ├── login-1.json
│ │ ├── login-2.json
│ │ ├── login-3.json
│ │ ├── logo-cloud-1.json
│ │ ├── logo-cloud-2.json
│ │ ├── logo-cloud-3.json
│ │ ├── mist-call-to-action-1.json
│ │ ├── mist-call-to-action-2.json
│ │ ├── mist-call-to-action-3.json
│ │ ├── mist-comparator-1.json
│ │ ├── mist-contact-1.json
│ │ ├── mist-content-1.json
│ │ ├── mist-content-2.json
│ │ ├── mist-content-3.json
│ │ ├── mist-content-4.json
│ │ ├── mist-faqs-1.json
│ │ ├── mist-faqs-2.json
│ │ ├── mist-faqs-3.json
│ │ ├── mist-features-1.json
│ │ ├── mist-features-10.json
│ │ ├── mist-features-11.json
│ │ ├── mist-features-2.json
│ │ ├── mist-features-3.json
│ │ ├── mist-features-4.json
│ │ ├── mist-features-5.json
│ │ ├── mist-features-6.json
│ │ ├── mist-features-7.json
│ │ ├── mist-features-8.json
│ │ ├── mist-features-9.json
│ │ ├── mist-footer-1.json
│ │ ├── mist-footer-2.json
│ │ ├── mist-footer-3.json
│ │ ├── mist-footer-4.json
│ │ ├── mist-forgot-password-1.json
│ │ ├── mist-hero-section-1.json
│ │ ├── mist-hero-section-2.json
│ │ ├── mist-hero-section-3.json
│ │ ├── mist-hero-section-4.json
│ │ ├── mist-hero-section-5.json
│ │ ├── mist-hero-section-6.json
│ │ ├── mist-integrations-1.json
│ │ ├── mist-integrations-2.json
│ │ ├── mist-integrations-3.json
│ │ ├── mist-login-1.json
│ │ ├── mist-logo-cloud-1.json
│ │ ├── mist-logo-cloud-2.json
│ │ ├── mist-pricing-1.json
│ │ ├── mist-pricing-2.json
│ │ ├── mist-sign-up-1.json
│ │ ├── mist-stats-1.json
│ │ ├── mist-stats-2.json
│ │ ├── mist-stats-3.json
│ │ ├── mist-stats-4.json
│ │ ├── mist-team-1.json
│ │ ├── mist-team-2.json
│ │ ├── mist-testimonials-1.json
│ │ ├── mist-testimonials-2.json
│ │ ├── mist-testimonials-3.json
│ │ ├── mist-testimonials-4.json
│ │ ├── mist-testimonials-5.json
│ │ ├── pricing-1.json
│ │ ├── pricing-2.json
│ │ ├── pricing-3.json
│ │ ├── pricing-4.json
│ │ ├── pricing-5.json
│ │ ├── sign-up-1.json
│ │ ├── sign-up-2.json
│ │ ├── sign-up-3.json
│ │ ├── stats-1.json
│ │ ├── stats-2.json
│ │ ├── stats-3.json
│ │ ├── stats-4.json
│ │ ├── team-1.json
│ │ ├── team-2.json
│ │ ├── testimonials-1.json
│ │ ├── testimonials-2.json
│ │ ├── testimonials-3.json
│ │ ├── testimonials-4.json
│ │ ├── testimonials-5.json
│ │ └── testimonials-6.json
│ └── sw.js
│ ├── registry.json
│ └── tsconfig.json
├── package.json
├── packages
├── core
│ ├── .gitignore
│ ├── README.md
│ ├── components.json
│ ├── eslint.config.js
│ ├── index.html
│ ├── package.json
│ ├── src
│ │ ├── App.tsx
│ │ ├── components
│ │ │ ├── logo.tsx
│ │ │ └── logos
│ │ │ │ ├── Gemini.tsx
│ │ │ │ ├── GooglePaLM.tsx
│ │ │ │ ├── MagicUI.tsx
│ │ │ │ ├── MediaWiki.tsx
│ │ │ │ ├── Replit.tsx
│ │ │ │ ├── VSCodium.tsx
│ │ │ │ └── index.ts
│ │ ├── index.css
│ │ ├── lib
│ │ │ └── utils.ts
│ │ ├── magicui
│ │ │ └── border-beam.tsx
│ │ ├── main.tsx
│ │ ├── motion-primitives
│ │ │ ├── animated-group.tsx
│ │ │ ├── infinite-slider.tsx
│ │ │ ├── progressive-blur.tsx
│ │ │ └── text-effect.tsx
│ │ ├── ui
│ │ │ ├── accordion.tsx
│ │ │ ├── avatar.tsx
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ ├── chart.tsx
│ │ │ ├── dialog.tsx
│ │ │ ├── input.tsx
│ │ │ ├── label.tsx
│ │ │ ├── radio-group.tsx
│ │ │ ├── scroll-area.tsx
│ │ │ ├── select.tsx
│ │ │ ├── separator.tsx
│ │ │ ├── textarea.tsx
│ │ │ ├── toggle-group.tsx
│ │ │ ├── toggle.tsx
│ │ │ └── tooltip.tsx
│ │ └── vite-env.d.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.ts
├── dusk-kit
│ ├── .gitignore
│ ├── README.md
│ ├── app
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── blocks
│ │ ├── call-to-action
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── comparator
│ │ │ └── one
│ │ │ │ └── index.tsx
│ │ ├── contact
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── content
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── seven
│ │ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── faqs
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── features
│ │ │ ├── eight
│ │ │ │ └── index.tsx
│ │ │ ├── eleven
│ │ │ │ └── index.tsx
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── nine
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── seven
│ │ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ │ └── index.tsx
│ │ │ ├── ten
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ ├── twelve
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── footer
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── forgot-password
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── hero-section
│ │ │ ├── eight
│ │ │ │ └── index.tsx
│ │ │ ├── five
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── nine
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── seven
│ │ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ ├── header.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── logo-cloud.tsx
│ │ │ └── two
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ ├── index.ts
│ │ ├── integrations
│ │ │ ├── eight
│ │ │ │ └── index.tsx
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── seven
│ │ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── login
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── logo-cloud
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── pricing
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── sign-up
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── stats
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── team
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ └── testimonials
│ │ │ ├── five
│ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ └── index.tsx
│ │ │ └── two
│ │ │ └── index.tsx
│ ├── components.json
│ ├── eslint.config.mjs
│ ├── next.config.js
│ ├── package.json
│ ├── postcss.config.mjs
│ └── tsconfig.json
├── mist-kit
│ ├── .gitignore
│ ├── README.md
│ ├── app
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── blocks
│ │ ├── call-to-action
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── comparator
│ │ │ └── one
│ │ │ │ └── index.tsx
│ │ ├── contact
│ │ │ └── one
│ │ │ │ └── index.tsx
│ │ ├── content
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── faqs
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── features
│ │ │ ├── eight
│ │ │ │ └── index.tsx
│ │ │ ├── eleven
│ │ │ │ └── index.tsx
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── nine
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ ├── index.tsx
│ │ │ │ └── table.tsx
│ │ │ ├── seven
│ │ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ │ └── index.tsx
│ │ │ ├── ten
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── footer
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── forgot-password
│ │ │ └── one
│ │ │ │ └── index.tsx
│ │ ├── hero-section
│ │ │ ├── five
│ │ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── six
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ ├── header.tsx
│ │ │ │ └── index.tsx
│ │ ├── index.ts
│ │ ├── integrations
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── login
│ │ │ └── one
│ │ │ │ └── index.tsx
│ │ ├── logo-cloud
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── pricing
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── sign-up
│ │ │ └── one
│ │ │ │ └── index.tsx
│ │ ├── stats
│ │ │ ├── four
│ │ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ ├── team
│ │ │ ├── one
│ │ │ │ └── index.tsx
│ │ │ └── two
│ │ │ │ └── index.tsx
│ │ └── testimonials
│ │ │ ├── five
│ │ │ └── index.tsx
│ │ │ ├── four
│ │ │ └── index.tsx
│ │ │ ├── one
│ │ │ └── index.tsx
│ │ │ ├── three
│ │ │ └── index.tsx
│ │ │ └── two
│ │ │ └── index.tsx
│ ├── components.json
│ ├── components
│ │ └── ui
│ │ │ ├── button.tsx
│ │ │ ├── card.tsx
│ │ │ └── hover-card.tsx
│ ├── eslint.config.mjs
│ ├── next.config.ts
│ ├── package.json
│ ├── postcss.config.mjs
│ └── tsconfig.json
└── ts-config
│ ├── base.json
│ └── package.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
└── turbo.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 | .turbo
20 |
21 | # production
22 | /build
23 |
24 | # misc
25 | .DS_Store
26 | *.pem
27 |
28 | # debug
29 | npm-debug.log*
30 | yarn-debug.log*
31 | yarn-error.log*
32 | .pnpm-debug.log*
33 |
34 | # env files (can opt-in for committing if needed)
35 | .env*
36 |
37 | # vercel
38 | .vercel
39 |
40 | # typescript
41 | *.tsbuildinfo
42 | next-env.d.ts
43 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore artifacts:
2 | build
3 | coverage
4 | pnpm-workspace.yaml
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 500,
3 | "semi": false,
4 | "tabWidth": 4,
5 | "parser": "babel",
6 | "singleQuote": true,
7 | "trailingComma": "es5",
8 | "jsxBracketSameLine": true,
9 | "quoteProps": "as-needed",
10 | "jsxSingleQuote": false,
11 | "bracketSpacing": true,
12 | "bracketSameLine": false,
13 | "useTabs": false,
14 | "singleAttributePerLine": true,
15 | "plugins": [
16 | "prettier-plugin-tailwindcss"
17 | ],
18 | "tailwindStylesheet": "./app/global.css",
19 | "overrides": [
20 | {
21 | "files": "*.tsx",
22 | "options": {
23 | "parser": "babel-ts"
24 | }
25 | }
26 | ]
27 | }
--------------------------------------------------------------------------------
/LICENCE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Irung
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Tailark
2 |
3 | Speed up your workflow with responsive, pre-built shadcn-UI and Tailwindcss blocks designed for marketing websites.
4 |
5 | [Tailark](https://tailark.com)
6 |
7 | 
8 |
9 |
10 | ## Getting Started
11 |
12 | First, run the development server:
13 |
14 | ```bash
15 | pnpm dev
16 | ```
17 |
18 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
--------------------------------------------------------------------------------
/apps/www/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals",
3 | "rules": {
4 | "@next/next/no-html-link-for-pages": "off"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/apps/www/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 | .turbo
20 |
21 | # production
22 | /build
23 |
24 | # misc
25 | .DS_Store
26 | *.pem
27 |
28 | # debug
29 | npm-debug.log*
30 | yarn-debug.log*
31 | yarn-error.log*
32 | .pnpm-debug.log*
33 |
34 | # env files (can opt-in for committing if needed)
35 | .env*
36 |
37 | # vercel
38 | .vercel
39 |
40 | # typescript
41 | *.tsbuildinfo
42 | next-env.d.ts
43 |
--------------------------------------------------------------------------------
/apps/www/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore artifacts:
2 | build
3 | coverage
4 | pnpm-workspace.yaml
--------------------------------------------------------------------------------
/apps/www/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 500,
3 | "semi": false,
4 | "tabWidth": 4,
5 | "parser": "babel",
6 | "singleQuote": true,
7 | "trailingComma": "es5",
8 | "jsxBracketSameLine": true,
9 | "quoteProps": "as-needed",
10 | "jsxSingleQuote": false,
11 | "bracketSpacing": true,
12 | "bracketSameLine": false,
13 | "useTabs": false,
14 | "singleAttributePerLine": true,
15 | "plugins": [
16 | "prettier-plugin-tailwindcss"
17 | ],
18 | "tailwindStylesheet": "./app/global.css",
19 | "overrides": [
20 | {
21 | "files": "*.tsx",
22 | "options": {
23 | "parser": "babel-ts"
24 | }
25 | }
26 | ]
27 | }
--------------------------------------------------------------------------------
/apps/www/LICENCE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Irung
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/apps/www/README.md:
--------------------------------------------------------------------------------
1 | # Tailark
2 |
3 | Speed up your workflow with responsive, pre-built shadcn-UI and Tailwindcss blocks designed for marketing websites.
4 |
5 | [Tailark](https://tailark.com)
6 |
7 | 
8 |
9 |
10 | ## Getting Started
11 |
12 | First, run the development server:
13 |
14 | ```bash
15 | pnpm dev
16 | ```
17 |
18 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
--------------------------------------------------------------------------------
/apps/www/app/(categories)/[...slug]/layout.tsx:
--------------------------------------------------------------------------------
1 | import React, { use } from 'react'
2 | import { blocks, categories } from '@/data/blocks'
3 | import BlocksNav from '@/components/blocks-nav'
4 | import { SiteFooter } from '@/components/site-footer'
5 | import { SiteHeader } from '@/components/site-header'
6 |
7 | interface LayoutProps {
8 | children: React.ReactNode
9 | params: Promise<{ slug: string[] }>
10 | }
11 |
12 | function getKitDetailsFromSlug(slug: string[]): { kitShortName: string; kitFullName: string } {
13 | let kitShortName: string
14 | let kitFullName: string
15 |
16 | if (!slug || slug.length === 0) {
17 | kitShortName = 'default'
18 | kitFullName = 'dusk-kit'
19 | } else if (slug.length === 1) {
20 | kitShortName = 'default'
21 | kitFullName = 'dusk-kit'
22 | } else {
23 | kitShortName = slug[0]
24 | kitFullName = `${kitShortName}-kit`
25 | }
26 | return { kitShortName, kitFullName }
27 | }
28 |
29 | export default function CategoryLayout({ children, params }: LayoutProps) {
30 | const { slug } = use(params)
31 | const { kitShortName, kitFullName } = getKitDetailsFromSlug(slug)
32 |
33 | const allCategories = categories
34 |
35 | return (
36 | <>
37 |
38 |
44 | {children}
45 |
46 | >
47 | )
48 | }
49 |
--------------------------------------------------------------------------------
/apps/www/app/examples/layout.tsx:
--------------------------------------------------------------------------------
1 | import { ExampleFooter } from '@/components/ex-footer'
2 | import { ExampleHeeader } from '@/components/ex-header'
3 |
4 | export default function CategoryLayout({
5 | children,
6 | }: Readonly<{
7 | children: React.ReactNode
8 | }>) {
9 | return (
10 | <>
11 |
12 | <>{children}>
13 |
14 |
15 | >
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/apps/www/app/icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/apps/www/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from 'next'
2 | import { Geist, Geist_Mono } from 'next/font/google'
3 | import './globals.css'
4 | import { ThemeProvider } from '@/components/theme-provider'
5 | import { GoogleAnalytics } from '@next/third-parties/google'
6 | import ServiceWorkerInit from '@/components/service-worker-init'
7 |
8 | const geistSans = Geist({
9 | variable: '--font-geist-sans',
10 | subsets: ['latin'],
11 | })
12 |
13 | const geistMono = Geist_Mono({
14 | variable: '--font-geist-mono',
15 | subsets: ['latin'],
16 | })
17 |
18 | export const metadata: Metadata = {
19 | title: 'Shadcn Marketing Blocks | Tailark',
20 | description: 'Speed up your workflow with responsive, pre-built UI blocks designed for marketing websites.',
21 | keywords: 'shadcn, ui, blocks, marketing, components, tailwind, react, nextjs, tailark, responsive, design system, templates, template, hero section, features, footers, contact forms, Bento, Call To Action, Testimonials, logo cloud, integrations, content, team, pricing, login, sign in, logout, stats FAQ sections',
22 | }
23 |
24 | export default function RootLayout({
25 | children,
26 | }: Readonly<{
27 | children: React.ReactNode
28 | }>) {
29 | return (
30 |
33 |
34 |
39 | {children}
40 |
41 |
42 |
43 |
44 |
45 | )
46 | }
47 |
--------------------------------------------------------------------------------
/apps/www/app/mist/opengraph-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/app/mist/opengraph-image.png
--------------------------------------------------------------------------------
/apps/www/app/mist/twitter-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/app/mist/twitter-image.png
--------------------------------------------------------------------------------
/apps/www/app/opengraph-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/app/opengraph-image.png
--------------------------------------------------------------------------------
/apps/www/app/preview/[[...slug]]/block-renderer.tsx:
--------------------------------------------------------------------------------
1 | import dynamic from 'next/dynamic'
2 | import { duskKitBlockMap } from '@tailark/dusk/blocks'
3 | import { mistKitBlockMap } from '@tailark/mist/blocks'
4 | import React from 'react'
5 | import { Suspense } from 'react'
6 |
7 | interface BlockRendererProps {
8 | kitShortName: string
9 | category: string
10 | variant: string
11 | }
12 |
13 | type SpecificBlockLoaderComponentType = React.ComponentType>
14 | type BlockLoaderFunctionType = () => Promise
15 |
16 | const kitBlockMaps = {
17 | dusk: duskKitBlockMap,
18 | mist: mistKitBlockMap,
19 | }
20 |
21 | const BlockRenderer: React.FC = ({ kitShortName, category, variant }) => {
22 | const kitMapKey = kitShortName as keyof typeof kitBlockMaps
23 |
24 | if (!(kitMapKey in kitBlockMaps)) {
25 | console.error(`Unknown kit: ${kitShortName}`)
26 | return Error: Unknown kit.
27 | }
28 |
29 | const kitBlockMap = kitBlockMaps[kitMapKey]
30 |
31 | const categoryKey = category as keyof typeof kitBlockMap
32 | if (!(categoryKey in kitBlockMap)) {
33 | console.error(`Block not found: ${kitShortName}/${category}/${variant} (category '${category}' not found in kit '${kitShortName}')`)
34 | return Error: Category not found in {kitShortName}.
35 | }
36 |
37 | const variantsMap = kitBlockMap[categoryKey]!
38 | const variantKey = variant as keyof typeof variantsMap
39 | if (!(variantKey in variantsMap)) {
40 | console.error(`Block not found: ${kitShortName}/${category}/${variant} (variant '${variant}' not found in category '${category}' of kit '${kitShortName}')`)
41 | return Error: Variant not found in {kitShortName}.
42 | }
43 |
44 | const blockLoader: BlockLoaderFunctionType = variantsMap[variantKey]! as BlockLoaderFunctionType
45 |
46 | const LazyBlock = dynamic(blockLoader, {
47 | loading: () => Loading block...
,
48 | })
49 |
50 | return (
51 | Loading block...}>
52 |
53 |
54 | )
55 | }
56 |
57 | export default BlockRenderer
58 |
--------------------------------------------------------------------------------
/apps/www/app/preview/[[...slug]]/page.tsx:
--------------------------------------------------------------------------------
1 | import BlockRenderer from './block-renderer'
2 | import { cn } from '@tailark/core/lib/utils'
3 | import { use } from 'react'
4 | import { Metadata } from 'next'
5 |
6 | export async function generateMetadata({ params }: { params: Promise<{ slug: string[] }> }): Promise {
7 | const { slug } = await params
8 |
9 | if (!slug || slug.length < 3) {
10 | return { title: 'Preview | Tailark' }
11 | }
12 |
13 | const [kitShortName, category, variant] = slug
14 | const categoryDisplay = category
15 | .split('-')
16 | .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
17 | .join(' ')
18 | const variantDisplay = variant
19 | .split('-')
20 | .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
21 | .join(' ')
22 |
23 | return {
24 | title: `${categoryDisplay} ${variantDisplay} | Tailark ${kitShortName.charAt(0).toUpperCase() + kitShortName.slice(1)}`,
25 | metadataBase: new URL(process.env.NEXT_PUBLIC_APP_URL || 'https://tailark.com'),
26 | openGraph: {
27 | title: `${kitShortName} - ${category} ${variant}`,
28 | images: [`/og?type=preview&slug=${slug.join(',')}`],
29 | },
30 | twitter: {
31 | card: 'summary_large_image',
32 | images: [`/og?type=preview&slug=${slug.join(',')}`],
33 | },
34 | }
35 | }
36 |
37 | export default function PreviewPage({ params }: { params: Promise<{ slug: string[] }> }) {
38 | const { slug } = use(params)
39 |
40 | if (!slug || slug.length < 3) {
41 | return Invalid path. Please use the format /preview/kit-name/category/variant.
42 | }
43 |
44 | const [kitShortName, category, variant] = slug
45 |
46 | return (
47 |
50 |
55 |
56 | )
57 | }
58 |
--------------------------------------------------------------------------------
/apps/www/app/robots.ts:
--------------------------------------------------------------------------------
1 | import { MetadataRoute } from 'next'
2 |
3 | export default function robots(): MetadataRoute.Robots {
4 | return {
5 | rules: {
6 | userAgent: '*',
7 | allow: '/',
8 | disallow: ['/api/'],
9 | },
10 | sitemap: 'https://tailark.com/sitemap.xml',
11 | }
12 | }
--------------------------------------------------------------------------------
/apps/www/app/sitemap.ts:
--------------------------------------------------------------------------------
1 | import { MetadataRoute } from 'next'
2 | import { blocks, categories } from '@/data/blocks'
3 |
4 | export default function sitemap(): MetadataRoute.Sitemap {
5 | const baseUrl = 'https://tailark.com'
6 |
7 | const routes = [
8 | {
9 | url: baseUrl,
10 | lastModified: new Date(),
11 | changefrequency: 'daily',
12 | priority: 1,
13 | },
14 | ]
15 |
16 | const categoryRoutes = categories.map((category) => ({
17 | url: `${baseUrl}/${category}`,
18 | lastModified: new Date(),
19 | changefrequency: 'weekly',
20 | priority: 0.8,
21 | }))
22 |
23 | const blockRoutes = blocks.map((block) => ({
24 | url: `${baseUrl}/preview/${block.category}/${block.title}`,
25 | lastModified: new Date(),
26 | changefrequency: 'monthly',
27 | priority: 0.5,
28 | }))
29 |
30 | return [...routes, ...categoryRoutes, ...blockRoutes]
31 | }
--------------------------------------------------------------------------------
/apps/www/app/snippets/layout.tsx:
--------------------------------------------------------------------------------
1 | import { SiteFooter } from '@/components/site-footer'
2 | import { SiteHeader } from '@/components/site-header'
3 |
4 | export default function CategoryLayout({
5 | children,
6 | }: Readonly<{
7 | children: React.ReactNode
8 | }>) {
9 | return (
10 | <>
11 |
12 | {children}
13 |
14 |
15 | >
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/apps/www/app/twitter-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/app/twitter-image.png
--------------------------------------------------------------------------------
/apps/www/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "app/globals.css",
9 | "baseColor": "zinc",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@tailark/core/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks",
19 | "data": "@/data"
20 | },
21 | "iconLibrary": "lucide"
22 | }
--------------------------------------------------------------------------------
/apps/www/components/active-category-links.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import Link from 'next/link'
4 | import { usePathname } from 'next/navigation'
5 | import { cn } from '@tailark/core/lib/utils'
6 | import type { Block } from '@/data/blocks'
7 |
8 | interface ActiveCategoryLinksProps {
9 | currentKitFullName: string
10 | currentKitShortName: string
11 | allCategories: string[]
12 | blocks: Block[]
13 | }
14 |
15 | export function ActiveCategoryLinks({ currentKitFullName, currentKitShortName, allCategories, blocks }: ActiveCategoryLinksProps) {
16 | const pathname = usePathname()
17 |
18 | return (
19 |
22 | {allCategories.map((category) => {
23 | const hasBlocksInKit = blocks.some((block) => block.kit === currentKitFullName && block.category === category)
24 |
25 | const href = currentKitShortName === 'default' ? `/${category}` : `/${currentKitShortName}/${category}`
26 |
27 | const isActive = pathname === href
28 |
29 | return (
30 |
33 | !hasBlocksInKit && e.preventDefault()}>
43 | {category.replace(/-/g, ' ')}
44 |
45 |
46 | )
47 | })}
48 |
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/apps/www/components/block-preview/iframe-renderer.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import React, { CSSProperties, RefObject, useMemo } from 'react'
3 | import { cn } from '@tailark/core/lib/utils'
4 | import { clearIframeCache } from '@/lib/serviceWorker'
5 |
6 | interface IframeRendererProps {
7 | src: string
8 | title: string
9 | ariaLabel?: string
10 | id: string
11 | iframeRef: RefObject
12 | height: number
13 | isCached: boolean
14 | className?: string
15 | style?: React.CSSProperties
16 | }
17 |
18 | const IframeRenderer: React.FC = ({ src, title, ariaLabel, id, iframeRef, height, isCached, className, style }) => {
19 | const handleLoad = () => {
20 | clearIframeCache(src)
21 | }
22 |
23 | const urlWithCacheBusting = useMemo(() => {
24 | try {
25 | const url = new URL(src, window.location.origin)
26 | url.searchParams.set('_', Date.now().toString())
27 | return url.toString()
28 | } catch {
29 | return src
30 | }
31 | }, [src])
32 |
33 | return (
34 |
56 | )
57 | }
58 |
59 | export default IframeRenderer
60 |
--------------------------------------------------------------------------------
/apps/www/components/block-preview/loading-spinner.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const LoadingSpinner: React.FC = () => {
4 | return (
5 |
8 | )
9 | }
10 |
11 | export default LoadingSpinner
12 |
--------------------------------------------------------------------------------
/apps/www/components/block-preview/mcp-logo.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { cn } from '@tailark/core/lib/utils'
3 |
4 | export const MCPLogo = ({ className }: { className?: string }) => (
5 |
13 | ModelContextProtocol
14 |
15 |
16 |
17 | )
18 |
--------------------------------------------------------------------------------
/apps/www/components/block-preview/tooltip-button.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { Button, ButtonProps } from '@tailark/core/ui/button'
3 | import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@tailark/core/ui/tooltip'
4 | import Link from 'next/link'
5 |
6 | export interface TooltipButtonProps extends Omit {
7 | tooltip: string
8 | icon?: React.ReactNode
9 | asLink?: {
10 | href: string
11 | target?: string
12 | }
13 | onClick?: (e: React.MouseEvent) => void
14 | className?: string
15 | children?: React.ReactNode
16 | }
17 |
18 | export const TooltipButton: React.FC = ({ onClick, tooltip, icon, asChild = false, variant = 'ghost', size = 'sm', className, children, asLink, ...props }) => {
19 | const content = (
20 |
27 | {asLink ? (
28 |
32 | {icon}
33 | {children}
34 |
35 | ) : (
36 | <>
37 | {icon}
38 | {children}
39 | >
40 | )}
41 |
42 | )
43 |
44 | return (
45 |
46 |
47 | {content}
48 |
49 | {tooltip}
50 |
51 |
52 |
53 | )
54 | }
55 |
56 | export default TooltipButton
57 |
--------------------------------------------------------------------------------
/apps/www/components/blocks-nav.tsx:
--------------------------------------------------------------------------------
1 | import { ScrollArea, ScrollBar } from '@tailark/core/ui/scroll-area'
2 | import { CategoryScrollManager } from './category-scroll-manager'
3 | import { ActiveCategoryLinks } from './active-category-links'
4 | import type { Block } from '@/data/blocks'
5 |
6 | interface BlocksNavProps {
7 | currentKitFullName: string
8 | currentKitShortName: string
9 | allCategories: string[]
10 | blocks: Block[]
11 | }
12 |
13 | const BlocksNav = ({
14 | currentKitFullName,
15 | currentKitShortName,
16 | allCategories,
17 | blocks
18 | }: BlocksNavProps) => {
19 | return (
20 |
21 |
22 |
23 |
26 |
29 |
32 |
33 |
34 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | )
47 | }
48 |
49 | export default BlocksNav
50 |
--------------------------------------------------------------------------------
/apps/www/components/category-scroll-manager.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { usePathname } from 'next/navigation'
4 | import { useLayoutEffect, useRef, ReactNode } from 'react'
5 |
6 | export function CategoryScrollManager({ children }: { children: ReactNode }) {
7 | const pathname = usePathname()
8 | const scrollRef = useRef(null)
9 |
10 | useLayoutEffect(() => {
11 | const element = scrollRef.current
12 | if (!element) return
13 |
14 | const activeLink = element.querySelector('[aria-current="page"]') as HTMLAnchorElement
15 | if (!activeLink) return
16 |
17 | if ('scrollIntoViewIfNeeded' in activeLink) {
18 | // @ts-expect-error - scrollIntoViewIfNeeded is a non-standard method not in TypeScript's DOM types
19 | ;(activeLink as HTMLAnchorElement).scrollIntoViewIfNeeded()
20 | } else {
21 | activeLink.scrollIntoView()
22 | }
23 | }, [pathname])
24 |
25 | return {children}
26 | }
27 |
--------------------------------------------------------------------------------
/apps/www/components/code-block.tsx:
--------------------------------------------------------------------------------
1 | // This code is adapted from Origin UI
2 | // Source: https://github.com/origin-space/originui/blob/main/components/code-block.tsx
3 | 'use client'
4 |
5 | import { cn } from '@tailark/core/lib/utils'
6 | import { toJsxRuntime } from 'hast-util-to-jsx-runtime'
7 | import { JSX, useLayoutEffect, useState } from 'react'
8 | import { Fragment, jsx, jsxs } from 'react/jsx-runtime'
9 | import type { BundledLanguage } from 'shiki/bundle/web'
10 | import { codeToHast } from 'shiki/bundle/web'
11 |
12 | export async function highlight(code: string, lang: BundledLanguage) {
13 | const hast = await codeToHast(code, {
14 | lang,
15 | theme: 'github-dark',
16 | })
17 |
18 | return toJsxRuntime(hast, {
19 | Fragment,
20 | jsx,
21 | jsxs,
22 | }) as JSX.Element
23 | }
24 |
25 | export interface CodeBlockProps {
26 | code: string | null
27 | lang: BundledLanguage
28 | initial?: JSX.Element
29 | preHighlighted?: JSX.Element | null
30 | maxHeight?: number
31 | className?: string
32 | }
33 |
34 | export default function CodeBlock({ code, lang, initial, maxHeight, preHighlighted, className }: CodeBlockProps) {
35 | const [content, setContent] = useState(preHighlighted || initial || null)
36 |
37 | useLayoutEffect(() => {
38 | if (preHighlighted) {
39 | setContent(preHighlighted)
40 | return
41 | }
42 |
43 | let isMounted = true
44 |
45 | if (code) {
46 | highlight(code, lang).then((result) => {
47 | if (isMounted) setContent(result)
48 | })
49 | } else {
50 | setContent(No code available )
51 | }
52 |
53 | return () => {
54 | isMounted = false
55 | }
56 | }, [code, lang, preHighlighted])
57 |
58 | return content ? (
59 |
62 | {content}
63 |
64 | ) : (
65 | Loading...
66 | )
67 | }
68 |
--------------------------------------------------------------------------------
/apps/www/components/dev/CacheControl.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { useState } from 'react'
4 | import { clearIframeCache, updateServiceWorker } from '@/lib/serviceWorker'
5 | import { Button } from '@tailark/core/ui/button'
6 | import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@tailark/core/ui/card'
7 |
8 | export function CacheControl() {
9 | const [isClearing, setIsClearing] = useState(false)
10 |
11 | const handleClearCache = () => {
12 | setIsClearing(true)
13 | try {
14 | for (let i = 0; i < localStorage.length; i++) {
15 | const key = localStorage.key(i)
16 | if (key && key.startsWith('iframe-cache-')) {
17 | localStorage.removeItem(key)
18 | }
19 | }
20 |
21 | clearIframeCache()
22 |
23 | updateServiceWorker()
24 |
25 | setTimeout(() => {
26 | setIsClearing(false)
27 | }, 1000)
28 | } catch (error) {
29 | console.error('Error clearing cache:', error)
30 | setIsClearing(false)
31 | }
32 | }
33 |
34 | return (
35 |
36 |
37 | Developer Controls
38 | Manage iframe caching
39 |
40 |
41 | Clear iframe caches to see the latest content. This will remove both browser and service worker caches.
42 |
43 |
44 |
49 | {isClearing ? 'Clearing...' : 'Clear All Iframe Caches'}
50 |
51 |
52 |
53 | )
54 | }
55 |
--------------------------------------------------------------------------------
/apps/www/components/service-worker-init.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import { useEffect } from 'react'
4 | import { registerServiceWorker } from '@/lib/serviceWorker'
5 |
6 | export default function ServiceWorkerInit() {
7 | useEffect(() => {
8 | registerServiceWorker()
9 | }, [])
10 |
11 | // This is a hidden component that just handles service worker registration
12 | return null
13 | }
14 |
--------------------------------------------------------------------------------
/apps/www/components/site-footer.tsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 | import { LogoIcon } from '@tailark/core/components/logo'
3 | import { Button } from '@tailark/core/ui/button'
4 | import { ArrowUpRight } from 'lucide-react'
5 | import { ThemeToggle } from './theme-toggle'
6 |
7 | export const SiteFooter = () => (
8 |
33 | )
34 |
--------------------------------------------------------------------------------
/apps/www/components/snippet-preview.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@tailark/core/ui/dialog'
3 | import { Check, Code2, Copy } from 'lucide-react'
4 | import { Button } from '@tailark/core/ui/button'
5 | import CodeBlock from './code-block'
6 |
7 | import { useCopyToClipboard } from '@/hooks/useClipboard'
8 |
9 | export default function SnippetPreview({ displayedCode, codeToCopy, description }: { codeToCopy: string; displayedCode: string; description: string }) {
10 | const { copied, copy } = useCopyToClipboard({ code: codeToCopy, eventName: 'snippet_copy' })
11 |
12 | return (
13 |
14 |
15 |
19 |
20 |
21 |
22 |
23 |
24 | Snippet Code
25 | {description}
26 |
27 |
28 |
29 |
35 | {copied ? : }
36 |
37 |
42 |
43 |
44 |
45 | )
46 | }
47 |
--------------------------------------------------------------------------------
/apps/www/components/snippets/buttons/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 | import { Slot } from '@radix-ui/react-slot'
3 | import { cva, type VariantProps } from 'class-variance-authority'
4 |
5 | import { cn } from '@/lib/utils'
6 |
7 | const buttonVariants = cva('inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', {
8 | variants: {
9 | variant: {
10 | default: '',
11 | destructive: '',
12 | outline: '',
13 | secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
14 | ghost: 'hover:bg-accent hover:text-accent-foreground',
15 | link: 'text-primary underline-offset-4 hover:underline',
16 | },
17 | size: {
18 | default: 'h-9 px-4 py-2',
19 | sm: 'h-8 px-3 text-xs',
20 | lg: 'h-10 px-8',
21 | icon: 'size-9',
22 | },
23 | },
24 | defaultVariants: {
25 | variant: 'default',
26 | size: 'default',
27 | },
28 | })
29 |
30 | export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps {
31 | asChild?: boolean
32 | }
33 |
34 | const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
35 | const Comp = asChild ? Slot : 'button'
36 | return
37 | })
38 | Button.displayName = 'Button'
39 |
40 | export { Button, buttonVariants }
41 |
--------------------------------------------------------------------------------
/apps/www/components/theme-provider.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import { ThemeProvider as NextThemesProvider } from "next-themes"
5 |
6 | export function ThemeProvider({
7 | children,
8 | ...props
9 | }: React.ComponentProps) {
10 | return {children}
11 | }
12 |
--------------------------------------------------------------------------------
/apps/www/components/theme-toggle.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import { MoonStar, SunDim } from 'lucide-react'
5 | import { useTheme } from 'next-themes'
6 |
7 | import { Button } from '@tailark/core/ui/button'
8 |
9 | export const ThemeToggle = () => {
10 | const [mounted, setMounted] = React.useState(false)
11 | const { theme, setTheme } = useTheme()
12 |
13 | React.useEffect(() => {
14 | setMounted(true)
15 | }, [])
16 |
17 | if (!mounted) {
18 | return (
19 |
22 |
23 |
24 | )
25 | }
26 |
27 | return (
28 | setTheme(theme === 'dark' ? 'light' : 'dark')}
30 | variant="ghost"
31 | className="size-8 rounded-full">
32 | {theme === 'dark' ? : }
33 |
34 | )
35 | }
36 |
--------------------------------------------------------------------------------
/apps/www/components/toolbar.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import { RotateCw } from 'lucide-react'
3 | import { ThemeToggle } from './theme-toggle'
4 | import { Button } from '@tailark/core/ui/button'
5 |
6 | export const DevToolbar = () => {
7 | const handleReload = () => {
8 | window.location.reload()
9 | }
10 |
11 | return (
12 |
13 |
14 |
15 |
16 |
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
--------------------------------------------------------------------------------
/apps/www/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from 'path'
2 | import { fileURLToPath } from 'url'
3 | import { FlatCompat } from '@eslint/eslintrc'
4 |
5 | const __filename = fileURLToPath(import.meta.url)
6 | const __dirname = dirname(__filename)
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | })
11 |
12 | const eslintConfig = [
13 | ...compat.config({
14 | extends: ['next/core-web-vitals', 'next', 'next/typescript'],
15 | rules: {
16 | 'react/no-unescaped-entities': 'off',
17 | '@next/next/no-page-custom-font': 'off',
18 | },
19 | }),
20 | ]
21 |
22 | export default eslintConfig
23 |
--------------------------------------------------------------------------------
/apps/www/hooks/useClipboard.ts:
--------------------------------------------------------------------------------
1 | import { useState } from 'react';
2 | import { sendGAEvent } from '@next/third-parties/google'
3 |
4 | type EventName = 'block_copy' | 'block_cli_copy' | 'snippet_copy' | 'block_registry_copy';
5 |
6 | interface BlockProps {
7 | title?: string;
8 | category?: string;
9 | code: string;
10 | eventName: EventName;
11 | }
12 |
13 | export const useCopyToClipboard = (block:BlockProps) => {
14 |
15 | const { title, category, code, eventName } = block;
16 |
17 | const [copied, setCopied] = useState(false);
18 |
19 | const copy = (e: React.MouseEvent) => {
20 | e.preventDefault();
21 | navigator.clipboard.writeText(code);
22 | setCopied(true);
23 |
24 | sendGAEvent('event', eventName, {
25 | block_title: title,
26 | block_category: category,
27 | })
28 | setTimeout(() => {
29 | setCopied(false);
30 | }, 1500);
31 | };
32 |
33 | return { copied, copy };
34 | };
--------------------------------------------------------------------------------
/apps/www/lib/get-kits.ts:
--------------------------------------------------------------------------------
1 | export interface Kit {
2 | id: string
3 | name: string
4 | }
5 |
6 | /**
7 | * Gets all available kits from the packages directory
8 | * Looks for directories ending with '-kit'
9 | * This is a server-side function and should only be used in server components or data fetching functions
10 | */
11 | export async function getKits(): Promise {
12 | const kits: Kit[] = [
13 | { id: 'dusk-ki', name: 'Dusk' },
14 | { id: 'mist-kit', name: 'Mist' },
15 | ]
16 |
17 | return kits
18 | }
19 |
20 | /**
21 | * Client-side version that doesn't rely on file system operations
22 | * In a real implementation, this would fetch the kits from an API endpoint
23 | */
24 | export function getClientKits(): Kit[] {
25 | return [
26 | { id: 'dusk-kit', name: 'Dusk' },
27 | { id: 'mist-kit', name: "Mist" },
28 | ]
29 | }
30 |
31 | export type Kits = "dusk" | "mist";
32 |
--------------------------------------------------------------------------------
/apps/www/lib/get-og-url.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Helper to generate OpenGraph image URLs for categories and previews
3 | */
4 | export function getOgUrl(options: {
5 | type: 'category' | 'preview' | 'default'
6 | kit?: string
7 | category?: string
8 | variant?: string
9 | }) {
10 | const { type, kit, category, variant } = options
11 | const params = new URLSearchParams()
12 |
13 | params.set('type', type)
14 |
15 | if (kit) params.set('kit', kit)
16 | if (category) params.set('category', category)
17 | if (variant) params.set('variant', variant)
18 |
19 | return `/api/og?${params.toString()}`
20 | }
21 |
--------------------------------------------------------------------------------
/apps/www/lib/serviceWorker.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Service worker registration and management utilities
3 | */
4 |
5 | // Register the service worker
6 | export function registerServiceWorker() {
7 | if (typeof window !== 'undefined' && 'serviceWorker' in navigator) {
8 | window.addEventListener('load', () => {
9 | navigator.serviceWorker
10 | .register('/sw.js')
11 | .then(registration => {
12 | console.log('SW registered: ', registration);
13 | })
14 | .catch(registrationError => {
15 | console.log('SW registration failed: ', registrationError);
16 | });
17 | });
18 | }
19 | }
20 |
21 | // Send a message to the service worker
22 | type SWMessage = {
23 | type: string;
24 | url?: string;
25 | };
26 |
27 | export function sendMessageToSW(message: SWMessage) {
28 | if (typeof window !== 'undefined' && 'serviceWorker' in navigator && navigator.serviceWorker.controller) {
29 | navigator.serviceWorker.controller.postMessage(message);
30 | }
31 | }
32 |
33 | // Clear iframe cache for a specific URL or all iframe caches if no URL provided
34 | export function clearIframeCache(url?: string) {
35 | sendMessageToSW({
36 | type: 'CLEAR_IFRAME_CACHE',
37 | url
38 | });
39 | }
40 |
41 | // Update the service worker
42 | export function updateServiceWorker() {
43 | if (typeof window !== 'undefined' && 'serviceWorker' in navigator) {
44 | navigator.serviceWorker.ready.then(registration => {
45 | registration.update();
46 | });
47 | }
48 | }
49 |
50 | // Check if a URL is already cached by the service worker
51 | export async function isUrlCached(url: string): Promise {
52 | if (typeof window === 'undefined' || !('caches' in window)) {
53 | return false;
54 | }
55 |
56 | try {
57 | const cache = await caches.open('cnblocks-iframe-cache-v1');
58 | const cachedResponse = await cache.match(url);
59 | return cachedResponse !== undefined;
60 | } catch (error) {
61 | console.error('Error checking cache:', error);
62 | return false;
63 | }
64 | }
--------------------------------------------------------------------------------
/apps/www/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
8 | export const titleToNumber = (title: string): number => {
9 | const titles = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"];
10 | return titles.indexOf(title.toLowerCase()) + 1;
11 | };
12 |
13 | export const formatComponentName = (category: string, variant: string): string => {
14 | const categoryFormatted = category
15 | .split('-')
16 | .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
17 | .join('')
18 | const variantFormatted = variant
19 | .split('-')
20 | .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
21 | .join('')
22 | return `${categoryFormatted}${variantFormatted}`
23 | }
--------------------------------------------------------------------------------
/apps/www/middleware.ts:
--------------------------------------------------------------------------------
1 | import { NextRequest, NextResponse } from 'next/server'
2 |
3 | export const config = {
4 | matcher: [
5 | /*
6 | * Match all request paths except for the ones starting with:
7 | * - _next/static (static files)
8 | * - _next/image (image optimization files)
9 | * - favicon.ico (favicon file)
10 | * - public folder
11 | * - assets folder
12 | */
13 | '/((?!_next/static|_next/image|favicon.ico|public/|assets/).*)',
14 | ],
15 | }
16 |
17 | export function middleware(request: NextRequest) {
18 | const isStaticAsset = request.nextUrl.pathname.match(
19 | /\.(js|mjs|css|json|png|jpg|jpeg|gif|webp|ico|svg|map)$/
20 | )
21 |
22 | if (isStaticAsset) {
23 | const response = NextResponse.next()
24 | response.headers.set('x-middleware-static', '1')
25 | return response
26 | }
27 |
28 | if (request.nextUrl.pathname.startsWith('/preview/')) {
29 | const response = NextResponse.next()
30 | response.headers.set('Cache-Control', 'public, max-age=3600, s-maxage=86400')
31 | response.headers.set('CDN-Cache-Control', 'public, max-age=3600')
32 | return response
33 | }
34 |
35 | return NextResponse.next()
36 | }
--------------------------------------------------------------------------------
/apps/www/next.config.ts:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 |
3 | const nextConfig = {
4 | productionBrowserSourceMaps: true,
5 | images: {
6 | remotePatterns: [
7 | {
8 | protocol: 'https',
9 | hostname: 'res.cloudinary.com',
10 | },
11 | {
12 | protocol: 'https',
13 | hostname: 'ik.imagekit.io',
14 | },
15 | ],
16 | },
17 | }
18 |
19 | export default nextConfig
20 |
--------------------------------------------------------------------------------
/apps/www/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@tailark/www",
3 | "version": "0.1.0",
4 | "private": true,
5 | "author": {
6 | "name": "Méschac Irung",
7 | "email": "meschacirung@gmail.com",
8 | "url": "https://x.com/MeschacIrung"
9 | },
10 | "packageManager": "pnpm@9.10.0",
11 | "workspaces": [
12 | "apps/*",
13 | "packages/*"
14 | ],
15 | "scripts": {
16 | "dev": "next dev --turbopack",
17 | "build": "next build",
18 | "start": "next start",
19 | "lint": "next lint",
20 | "registry:build": "shadcn build"
21 | },
22 | "dependencies": {
23 | "@next/third-parties": "^15.1.7",
24 | "@radix-ui/react-accordion": "^1.2.3",
25 | "@radix-ui/react-avatar": "^1.1.3",
26 | "@radix-ui/react-dialog": "^1.1.6",
27 | "@radix-ui/react-label": "^2.1.2",
28 | "@radix-ui/react-radio-group": "^1.2.3",
29 | "@radix-ui/react-scroll-area": "^1.2.4",
30 | "@radix-ui/react-select": "^2.1.6",
31 | "@radix-ui/react-separator": "^1.1.2",
32 | "@radix-ui/react-slot": "^1.1.2",
33 | "@radix-ui/react-tooltip": "^1.1.8",
34 | "class-variance-authority": "^0.7.1",
35 | "clsx": "^2.1.1",
36 | "dotted-map": "^2.2.3",
37 | "fs": "0.0.1-security",
38 | "google": "link:@next/third-parties/google",
39 | "hast-util-to-jsx-runtime": "^2.3.2",
40 | "lucide-react": "^0.475.0",
41 | "motion": "^12.4.3",
42 | "next": "15.3.2",
43 | "next-themes": "^0.4.4",
44 | "path": "^0.12.7",
45 | "react": "^19.1.0",
46 | "react-dom": "^19.1.0",
47 | "react-resizable-panels": "^2.1.7",
48 | "react-use-measure": "^2.1.7",
49 | "recharts": "^2.15.1",
50 | "shadcn": "2.4.0-canary.10",
51 | "swiper": "^11.2.4",
52 | "tailwind-merge": "^3.0.1",
53 | "tailwindcss-animate": "^1.0.7",
54 | "third-parties": "link:@next/third-parties",
55 | "use-media": "^1.5.0"
56 | },
57 | "devDependencies": {
58 | "@eslint/eslintrc": "^3",
59 | "@tailark/core": "workspace:*",
60 | "@tailark/dusk": "workspace:*",
61 | "@tailark/mist": "workspace:*",
62 | "@tailark/ts-config": "workspace:*",
63 | "@tailwindcss/postcss": "^4.1.6",
64 | "@types/node": "^20",
65 | "@types/react": "^19",
66 | "@types/react-dom": "^19",
67 | "eslint": "^9",
68 | "eslint-config-next": "15.3.2",
69 | "postcss": "^8",
70 | "prettier": "3.5.1",
71 | "prettier-plugin-tailwindcss": "0.6.11",
72 | "shiki": "^2.4.1",
73 | "tailwindcss": "^4.1.6",
74 | "typescript": "latest"
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/apps/www/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('postcss-load-config').Config} */
2 | const config = {
3 | plugins: {
4 | '@tailwindcss/postcss': {},
5 | },
6 | };
7 |
8 | export default config;
9 |
--------------------------------------------------------------------------------
/apps/www/public/card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/card.png
--------------------------------------------------------------------------------
/apps/www/public/charts-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/charts-light.png
--------------------------------------------------------------------------------
/apps/www/public/charts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/charts.png
--------------------------------------------------------------------------------
/apps/www/public/dark-card.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/dark-card.webp
--------------------------------------------------------------------------------
/apps/www/public/exercice-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/exercice-dark.png
--------------------------------------------------------------------------------
/apps/www/public/exercice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/exercice.png
--------------------------------------------------------------------------------
/apps/www/public/mail-back-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mail-back-light.png
--------------------------------------------------------------------------------
/apps/www/public/mail-back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mail-back.png
--------------------------------------------------------------------------------
/apps/www/public/mail-upper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mail-upper.png
--------------------------------------------------------------------------------
/apps/www/public/mail2-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mail2-light.png
--------------------------------------------------------------------------------
/apps/www/public/mail2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mail2.png
--------------------------------------------------------------------------------
/apps/www/public/mist/tailark-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mist/tailark-2.png
--------------------------------------------------------------------------------
/apps/www/public/mist/tailark-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mist/tailark-3.png
--------------------------------------------------------------------------------
/apps/www/public/mist/tailark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/mist/tailark.png
--------------------------------------------------------------------------------
/apps/www/public/music-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/music-light.png
--------------------------------------------------------------------------------
/apps/www/public/music.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/music.png
--------------------------------------------------------------------------------
/apps/www/public/origin-cal-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/origin-cal-dark.png
--------------------------------------------------------------------------------
/apps/www/public/origin-cal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/origin-cal.png
--------------------------------------------------------------------------------
/apps/www/public/payments-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/payments-light.png
--------------------------------------------------------------------------------
/apps/www/public/payments.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tailark/blocks/400ffc53437acad8023e39aaac8a2d9da9aa86a2/apps/www/public/payments.png
--------------------------------------------------------------------------------
/apps/www/public/r/call-to-action-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "call-to-action-1",
4 | "type": "registry:block",
5 | "title": "Call To Action 1",
6 | "description": "Shadcn/ui call to action block",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/dusk-kit/blocks/call-to-action/one/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport Link from 'next/link'\n\nexport default function CallToAction() {\n return (\n \n \n
\n
Start Building \n
Libero sapiente aliquam quibusdam aspernatur.
\n\n
\n \n \n Get Started \n \n \n\n \n \n Book Demo \n \n \n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/call-to-action.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/call-to-action-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "call-to-action-2",
4 | "type": "registry:block",
5 | "title": "Call To Action 2",
6 | "description": "Shadcn/ui call to action block",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/dusk-kit/blocks/call-to-action/two/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport Link from 'next/link'\n\nexport default function CallToAction() {\n return (\n \n \n
\n
Start Building \n
Libero sapiente aliquam quibusdam aspernatur.
\n\n
\n \n \n Get Started \n \n \n\n \n \n Book Demo \n \n \n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/call-to-action.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/call-to-action-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "call-to-action-3",
4 | "type": "registry:block",
5 | "title": "Call To Action 3",
6 | "description": "Shadcn/ui call to action block",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/dusk-kit/blocks/call-to-action/three/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport { Mail, SendHorizonal } from 'lucide-react'\n\nexport default function CallToAction() {\n return (\n \n \n
\n
Start Building \n
Libero sapiente aliquam quibusdam aspernatur.
\n\n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/call-to-action.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/content-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "content-3",
4 | "type": "registry:block",
5 | "title": "Content Block 3",
6 | "description": "Shadcn/ui website content block",
7 | "files": [
8 | {
9 | "path": "../../packages/dusk-kit/blocks/content/three/index.tsx",
10 | "content": "import { Button } from '@/components/ui/button'\nimport { ChevronRight } from 'lucide-react'\nimport Link from 'next/link'\n\nexport default function ContentSection() {\n return (\n \n \n
\n\n
\n
The Lyra ecosystem brings together our models, products and platforms. \n
\n
Lyra is evolving to be more than just the models. It supports an entire ecosystem — from products to the APIs and platforms helping developers and businesses innovate.
\n\n
\n \n Learn More \n \n \n \n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/content-3.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/content-4.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "content-4",
4 | "type": "registry:block",
5 | "title": "Content Block 4",
6 | "description": "Shadcn/ui website content block",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/dusk-kit/blocks/content/four/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport { ChevronRight } from 'lucide-react'\nimport Link from 'next/link'\n\nexport default function ContentSection() {\n return (\n \n \n
\n
The Lyra ecosystem brings together our models, products and platforms. \n
\n
Lyra is evolving to be more than just the models. It supports an entire ecosystem — from products to the APIs and platforms helping developers and businesses innovate.
\n
\n Tailark. It supports an entire ecosystem — from products innovate. Sit minus, quod debitis autem quia aspernatur delectus impedit modi, neque non id ad dignissimos? Saepe deleniti perferendis beatae.\n
\n
\n \n Learn More \n \n \n \n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/content-4.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-call-to-action-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-call-to-action-1",
4 | "type": "registry:block",
5 | "title": "Call To Action 1",
6 | "description": "Mist Kit Call To Action block, variant 1",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/mist-kit/blocks/call-to-action/one/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport Link from 'next/link'\n\nexport default function StatsSection() {\n return (\n \n \n
\n
\n
Build 10x Faster with Mist \n
\n \n Get Started\n \n \n Get a Demo\n \n
\n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/call-to-action-one.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-call-to-action-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-call-to-action-2",
4 | "type": "registry:block",
5 | "title": "Call To Action 2",
6 | "description": "Mist Kit Call To Action block, variant 2",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/mist-kit/blocks/call-to-action/two/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport Link from 'next/link'\n\nexport default function StatsSection() {\n return (\n \n \n
\n
\n
\n
Build 10x Faster with Mist \n \n
\n \n Get a Demo\n \n \n Get Started\n \n
\n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/call-to-action-two.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-call-to-action-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-call-to-action-3",
4 | "type": "registry:block",
5 | "title": "Call To Action 3",
6 | "description": "Mist Kit Call To Action block, variant 3",
7 | "registryDependencies": [
8 | "button"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/mist-kit/blocks/call-to-action/three/index.tsx",
13 | "content": "import { Button } from '@/components/ui/button'\nimport { Calendar, ChevronRight } from 'lucide-react'\nimport Link from 'next/link'\n\nexport default function StatsSection() {\n return (\n \n \n
\n
\n Build Modern Websites. Drive Results\n \n
Libero sapiente aliquam quibusdam aspernatur, praesentium iusto repellendus.
\n
\n \n \n Try Mist for Free\n \n \n \n \n \n \n Request a Demo\n \n \n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/call-to-action-three.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-content-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-content-3",
4 | "type": "registry:block",
5 | "title": "Content Three",
6 | "description": "Mist Kit Content block, variant three",
7 | "files": [
8 | {
9 | "path": "../../packages/mist-kit/blocks/content/three/index.tsx",
10 | "content": "import Image from 'next/image'\n\nexport default function ContentSection() {\n return (\n \n \n
\n
\n
\n
🦊 \n
Create Content with AI Assistance \n
Our AI assistant helps you create better content faster. Generate ideas, improve your writing, and design layouts with simple prompts.
\n
\n\n
\n
\n\n
\n \n
\n
\n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/content-three.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-stats-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-stats-1",
4 | "type": "registry:block",
5 | "title": "Stats block",
6 | "description": "Mist Kit Stats block, variant one",
7 | "registryDependencies": [
8 | "card"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/mist-kit/blocks/stats/one/index.tsx",
13 | "content": "import { Card } from '@/components/ui/card'\n\nexport default function StatsSection() {\n return (\n \n \n
\n \n
+1200
\n
Stars on GitHub
\n
\n \n
56%
\n
Conversion rate
\n
\n \n \n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/stats-one.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-stats-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-stats-2",
4 | "type": "registry:block",
5 | "title": "Stats block",
6 | "description": "Mist Kit Stats block, variant two",
7 | "files": [
8 | {
9 | "path": "../../packages/mist-kit/blocks/stats/two/index.tsx",
10 | "content": "export default function StatsSection() {\n return (\n \n \n
\n
\n
Tailark in numbers \n
Our platform continues to grow with developers and businesses using our tools to create innovative solutions and enhance productivity.
\n
\n
\n
\n
\n
56%
\n
Productivity Boost
\n
\n
\n
24/7
\n
Customer Support
\n
\n
\n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/stats-two.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-stats-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-stats-3",
4 | "type": "registry:block",
5 | "title": "Stats block",
6 | "description": "Mist Kit Stats block, variant three",
7 | "files": [
8 | {
9 | "path": "../../packages/mist-kit/blocks/stats/three/index.tsx",
10 | "content": "import { ArrowRight } from 'lucide-react'\n\nexport default function StatsSection() {\n return (\n \n \n
\n
\n
Tailark in numbers \n
Our platform continues to grow with developers and businesses using our tools to create innovative solutions and enhance productivity.
\n
\n
\n {[\n { value: '90+', label: 'Integrations' },\n { value: '56%', label: 'Productivity Boost' },\n { value: '24/7', label: 'Customer Support' },\n { value: '10k+', label: 'Active Users' },\n ].map((stat, index) => (\n \n \n {stat.value} {stat.label}\n \n ))}\n \n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/stats-three.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-stats-4.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-stats-4",
4 | "type": "registry:block",
5 | "title": "Stats block",
6 | "description": "Mist Kit Stats block, variant four",
7 | "files": [
8 | {
9 | "path": "../../packages/mist-kit/blocks/stats/four/index.tsx",
10 | "content": "export default function StatsSection() {\n return (\n \n \n
\n
Tailark in stats \n
\n
\n
\n
56%
\n
Productivity Boost
\n
\n
\n
Our platform continues to grow with developers and businesses using productivity.
\n
\n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/stats-four.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-testimonials-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-testimonials-1",
4 | "type": "registry:block",
5 | "title": "Testimonials One",
6 | "description": "Mist Kit Testimonials block, variant one",
7 | "files": [
8 | {
9 | "path": "../../packages/mist-kit/blocks/testimonials/one/index.tsx",
10 | "content": "export default function TestimonialSection() {\n return (\n \n \n
\n
\n Using Tailark has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
\n \n John Doe \n \n Product Designer \n \n \n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/testimonials-one.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-testimonials-4.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-testimonials-4",
4 | "type": "registry:block",
5 | "title": "Testimonials Four",
6 | "description": "Mist Kit Testimonials block, variant four",
7 | "registryDependencies": [
8 | "avatar"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/mist-kit/blocks/testimonials/four/index.tsx",
13 | "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\n\nexport default function TestimonialSection() {\n return (\n \n \n
\n
\n Using Tailark has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
\n \n \n \n T \n \n Théo Balick \n \n Product Designer \n \n \n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/testimonials-four.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/mist-testimonials-5.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "mist-testimonials-5",
4 | "type": "registry:block",
5 | "title": "Testimonials Five",
6 | "description": "Mist Kit Testimonials block, variant five",
7 | "registryDependencies": [
8 | "avatar"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/mist-kit/blocks/testimonials/five/index.tsx",
13 | "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\nimport { Quote } from 'lucide-react'\n\nexport default function TestimonialSection() {\n return (\n \n \n
\n
\n
\n
\n Using Tailark has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
\n \n \n \n T \n \n Théo Balick \n @theo_b \n \n \n
\n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/testimonials-five.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/public/r/stats-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "stats-1",
4 | "type": "registry:block",
5 | "title": "Stats Block 1",
6 | "description": "Shadcn/ui website stats block",
7 | "files": [
8 | {
9 | "path": "../../packages/dusk-kit/blocks/stats/one/index.tsx",
10 | "content": "export default function StatsSection() {\n return (\n \n \n
\n
Tailark in numbers \n
Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.
\n
\n\n
\n
\n
+1200
\n
Stars on GitHub
\n
\n
\n
22 Million
\n
Active Users
\n
\n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/stats.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/stats-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "stats-2",
4 | "type": "registry:block",
5 | "title": "Stats Block 2",
6 | "description": "Shadcn/ui website stats block",
7 | "files": [
8 | {
9 | "path": "../../packages/dusk-kit/blocks/stats/two/index.tsx",
10 | "content": "export default function StatsSection() {\n return (\n \n \n
\n
Tailark in numbers \n
Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.
\n
\n\n
\n
\n
+1200
\n
Stars on GitHub
\n
\n
\n
56%
\n
Conversion rate
\n
\n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/stats-2.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/stats-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "stats-3",
4 | "type": "registry:block",
5 | "title": "Stats Block 3",
6 | "description": "Shadcn/ui website stats block",
7 | "files": [
8 | {
9 | "path": "../../packages/dusk-kit/blocks/stats/three/index.tsx",
10 | "content": "export default function StatsSection() {\n return (\n \n \n
\n
Tailark in numbers \n
Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.
\n
\n\n
\n
\n
+1200
\n
Stars on GitHub
\n
\n
\n
56%
\n
Conversion rate
\n
\n
\n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/stats-3.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/testimonials-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "testimonials-3",
4 | "type": "registry:block",
5 | "title": "Testimonials Section 3",
6 | "description": "Shadcn/ui website testimonials section",
7 | "files": [
8 | {
9 | "path": "../../packages/dusk-kit/blocks/testimonials/three/index.tsx",
10 | "content": "export default function TestimonialsSection() {\n return (\n \n \n
\n
\n Using TailsUI has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
\n\n \n
\n
\n John Doe \n CEO, Nvidia \n
\n
\n \n
\n
\n \n )\n}\n",
11 | "type": "registry:component",
12 | "target": "components/testimonials.tsx"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/apps/www/public/r/testimonials-4.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3 | "name": "testimonials-4",
4 | "type": "registry:block",
5 | "title": "Testimonials Section 4",
6 | "description": "Shadcn/ui website testimonials section",
7 | "registryDependencies": [
8 | "avatar"
9 | ],
10 | "files": [
11 | {
12 | "path": "../../packages/dusk-kit/blocks/testimonials/four/index.tsx",
13 | "content": "import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\n\nexport default function TestimonialsSection() {\n return (\n \n \n
\n
\n Using TailsUI has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
\n\n \n
\n \n ST \n \n\n
\n John Doe \n CEO, Nvidia \n
\n
\n \n
\n
\n \n )\n}\n",
14 | "type": "registry:component",
15 | "target": "components/testimonials.tsx"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/apps/www/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tailark/ts-config/base.json",
3 | "compilerOptions": {
4 | "baseUrl": "./",
5 | "paths": {
6 | "@/*": ["./*"],
7 | "@tailark/core/*" : ["../../packages/core/src/*"],
8 | "@tailark/mist/*" : ["../../packages/mist-kit/*"],
9 | "@tailark/dusk/*" : ["../../packages/dusk-kit/*"],
10 | "@mist/*" : ["../../packages/mist-kit/*"]
11 | }
12 | },
13 | "include": [
14 | "./next-env.d.ts",
15 | "./**/*.ts",
16 | "./**/*.tsx",
17 | ".next/types/**/*.ts"
18 | ],
19 | "exclude": ["node_modules", "dist"]
20 | }
21 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "tailark",
3 | "version": "0.1.0",
4 | "private": true,
5 | "author": {
6 | "name": "Méschac Irung",
7 | "email": "meschacirung@gmail.com",
8 | "url": "https://x.com/MeschacIrung"
9 | },
10 | "packageManager": "pnpm@9.10.0",
11 | "workspaces": [
12 | "apps/*",
13 | "packages/*"
14 | ],
15 | "scripts": {
16 | "dev": "next dev --turbopack",
17 | "build": "next build",
18 | "start": "next start",
19 | "lint": "next lint",
20 | "registry:build": "shadcn build"
21 | },
22 | "devDependencies": {
23 | "prettier": "3.5.1",
24 | "prettier-plugin-tailwindcss": "0.6.11",
25 | "typescript": "^5"
26 | },
27 | "dependencies": {
28 | "turbo": "^2.5.3"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/packages/core/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/packages/core/README.md:
--------------------------------------------------------------------------------
1 | # React + TypeScript + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
10 | ## Expanding the ESLint configuration
11 |
12 | If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
13 |
14 | ```js
15 | export default tseslint.config({
16 | extends: [
17 | // Remove ...tseslint.configs.recommended and replace with this
18 | ...tseslint.configs.recommendedTypeChecked,
19 | // Alternatively, use this for stricter rules
20 | ...tseslint.configs.strictTypeChecked,
21 | // Optionally, add this for stylistic rules
22 | ...tseslint.configs.stylisticTypeChecked,
23 | ],
24 | languageOptions: {
25 | // other options...
26 | parserOptions: {
27 | project: ['./tsconfig.node.json', './tsconfig.app.json'],
28 | tsconfigRootDir: import.meta.dirname,
29 | },
30 | },
31 | })
32 | ```
33 |
34 | You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
35 |
36 | ```js
37 | // eslint.config.js
38 | import reactX from 'eslint-plugin-react-x'
39 | import reactDom from 'eslint-plugin-react-dom'
40 |
41 | export default tseslint.config({
42 | plugins: {
43 | // Add the react-x and react-dom plugins
44 | 'react-x': reactX,
45 | 'react-dom': reactDom,
46 | },
47 | rules: {
48 | // other rules...
49 | // Enable its recommended typescript rules
50 | ...reactX.configs['recommended-typescript'].rules,
51 | ...reactDom.configs.recommended.rules,
52 | },
53 | })
54 | ```
55 |
--------------------------------------------------------------------------------
/packages/core/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "app/globals.css",
9 | "baseColor": "zinc",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
--------------------------------------------------------------------------------
/packages/core/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js'
2 | import globals from 'globals'
3 | import reactHooks from 'eslint-plugin-react-hooks'
4 | import reactRefresh from 'eslint-plugin-react-refresh'
5 | import tseslint from 'typescript-eslint'
6 |
7 | export default tseslint.config(
8 | { ignores: ['dist'] },
9 | {
10 | extends: [js.configs.recommended, ...tseslint.configs.recommended],
11 | files: ['**/*.{ts,tsx}'],
12 | languageOptions: {
13 | ecmaVersion: 2020,
14 | globals: globals.browser,
15 | },
16 | plugins: {
17 | 'react-hooks': reactHooks,
18 | 'react-refresh': reactRefresh,
19 | },
20 | rules: {
21 | ...reactHooks.configs.recommended.rules,
22 | 'react-refresh/only-export-components': [
23 | 'warn',
24 | { allowConstantExport: true },
25 | ],
26 | },
27 | },
28 | )
29 |
--------------------------------------------------------------------------------
/packages/core/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/packages/core/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@tailark/core",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc -b && vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@radix-ui/react-accordion": "^1.2.3",
14 | "@radix-ui/react-avatar": "^1.1.3",
15 | "@radix-ui/react-dialog": "^1.1.6",
16 | "@radix-ui/react-label": "^2.1.2",
17 | "@radix-ui/react-radio-group": "^1.2.3",
18 | "@radix-ui/react-scroll-area": "^1.2.4",
19 | "@radix-ui/react-select": "^2.1.6",
20 | "@radix-ui/react-separator": "^1.1.2",
21 | "@radix-ui/react-slot": "^1.1.2",
22 | "@radix-ui/react-toggle": "^1.1.8",
23 | "@radix-ui/react-toggle-group": "^1.1.9",
24 | "@radix-ui/react-tooltip": "^1.1.8",
25 | "@tailwindcss/vite": "^4.1.6",
26 | "class-variance-authority": "^0.7.1",
27 | "clsx": "^2.1.1",
28 | "lucide-react": "^0.475.0",
29 | "motion": "^12.4.3",
30 | "react": "^19.1.0",
31 | "react-dom": "^19.1.0",
32 | "react-use-measure": "^2.1.7",
33 | "recharts": "^2.15.1",
34 | "tailwind-merge": "^3.0.1",
35 | "tailwindcss": "^4.1.6"
36 | },
37 | "devDependencies": {
38 | "@eslint/js": "^9.25.0",
39 | "@types/node": "^20",
40 | "@types/react": "^19.1.2",
41 | "@types/react-dom": "^19.1.2",
42 | "@vitejs/plugin-react": "^4.4.1",
43 | "eslint": "^9.25.0",
44 | "eslint-plugin-react-hooks": "^5.2.0",
45 | "eslint-plugin-react-refresh": "^0.4.19",
46 | "globals": "^16.0.0",
47 | "typescript": "~5.8.3",
48 | "typescript-eslint": "^8.30.1",
49 | "vite": "^6.3.5"
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/packages/core/src/App.tsx:
--------------------------------------------------------------------------------
1 | function App() {
2 | return <>>
3 | }
4 |
5 | export default App
6 |
--------------------------------------------------------------------------------
/packages/core/src/components/logos/Gemini.tsx:
--------------------------------------------------------------------------------
1 | import { type SVGProps } from 'react'
2 |
3 | export default function Gemini(props: SVGProps) {
4 | return (
5 |
15 | {'Gemini'}
16 |
17 |
23 |
27 |
31 |
35 |
36 |
37 |
42 |
43 | )
44 | }
45 |
--------------------------------------------------------------------------------
/packages/core/src/components/logos/GooglePaLM.tsx:
--------------------------------------------------------------------------------
1 | import type { SVGProps } from 'react'
2 |
3 | export default function GooglePaLM(props: SVGProps) {
4 | return (
5 |
12 |
16 |
20 |
24 |
28 |
32 |
36 |
40 |
41 | )
42 | }
43 |
--------------------------------------------------------------------------------
/packages/core/src/components/logos/Replit.tsx:
--------------------------------------------------------------------------------
1 | import { type SVGProps } from 'react'
2 |
3 | export default function Replit(props: SVGProps) {
4 | return (
5 |
12 |
16 |
20 |
24 |
25 | )
26 | }
27 |
--------------------------------------------------------------------------------
/packages/core/src/components/logos/VSCodium.tsx:
--------------------------------------------------------------------------------
1 | import { type SVGProps } from 'react'
2 |
3 | export default function VSCodium(props: SVGProps) {
4 | return (
5 |
11 |
12 |
20 |
24 |
28 |
29 |
30 |
34 |
35 | )
36 | }
37 |
--------------------------------------------------------------------------------
/packages/core/src/components/logos/index.ts:
--------------------------------------------------------------------------------
1 | export { default as Gemini } from './Gemini'
2 | export { default as Replit } from './Replit'
3 | export { default as MagicUI } from './MagicUI'
4 | export { default as VSCodium } from './VSCodium'
5 | export { default as MediaWiki } from './MediaWiki'
6 | export { default as GooglePaLM } from './GooglePaLM'
7 |
--------------------------------------------------------------------------------
/packages/core/src/index.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
--------------------------------------------------------------------------------
/packages/core/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
8 | export const stringToNumber = (title: string): number => {
9 | const titles = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"];
10 | return titles.indexOf(title.toLowerCase()) + 1;
11 | };
--------------------------------------------------------------------------------
/packages/core/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react'
2 | import { createRoot } from 'react-dom/client'
3 | import './index.css'
4 | import App from './App.tsx'
5 |
6 | createRoot(document.getElementById('root')!).render(
7 |
8 |
9 | ,
10 | )
11 |
--------------------------------------------------------------------------------
/packages/core/src/motion-primitives/progressive-blur.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 | import { cn } from '../lib/utils'
3 | import { type HTMLMotionProps, motion } from 'motion/react'
4 |
5 | export const GRADIENT_ANGLES = {
6 | top: 0,
7 | right: 90,
8 | bottom: 180,
9 | left: 270,
10 | }
11 |
12 | export type ProgressiveBlurProps = {
13 | direction?: keyof typeof GRADIENT_ANGLES
14 | blurLayers?: number
15 | className?: string
16 | blurIntensity?: number
17 | } & HTMLMotionProps<'div'>
18 |
19 | export function ProgressiveBlur({ direction = 'bottom', blurLayers = 8, className, blurIntensity = 0.25, ...props }: ProgressiveBlurProps) {
20 | const layers = Math.max(blurLayers, 2)
21 | const segmentSize = 1 / (blurLayers + 1)
22 |
23 | return (
24 |
25 | {Array.from({ length: layers }).map((_, index) => {
26 | const angle = GRADIENT_ANGLES[direction]
27 | const gradientStops = [index * segmentSize, (index + 1) * segmentSize, (index + 2) * segmentSize, (index + 3) * segmentSize].map((pos, posIndex) => `rgba(255, 255, 255, ${posIndex === 1 || posIndex === 2 ? 1 : 0}) ${pos * 100}%`)
28 |
29 | const gradient = `linear-gradient(${angle}deg, ${gradientStops.join(', ')})`
30 |
31 | return (
32 |
42 | )
43 | })}
44 |
45 | )
46 | }
47 |
--------------------------------------------------------------------------------
/packages/core/src/ui/accordion.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as AccordionPrimitive from '@radix-ui/react-accordion'
5 | import { ChevronDownIcon } from 'lucide-react'
6 | import { cn } from '../lib/utils'
7 |
8 | function Accordion({ ...props }: React.ComponentProps) {
9 | return (
10 |
14 | )
15 | }
16 |
17 | function AccordionItem({ className, ...props }: React.ComponentProps) {
18 | return (
19 |
24 | )
25 | }
26 |
27 | function AccordionTrigger({ className, children, ...props }: React.ComponentProps) {
28 | return (
29 |
30 | svg]:rotate-180', className)}
33 | {...props}>
34 | {children}
35 |
36 |
37 |
38 | )
39 | }
40 |
41 | function AccordionContent({ className, children, ...props }: React.ComponentProps) {
42 | return (
43 |
47 | {children}
48 |
49 | )
50 | }
51 |
52 | export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
53 |
--------------------------------------------------------------------------------
/packages/core/src/ui/avatar.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as AvatarPrimitive from '@radix-ui/react-avatar'
5 |
6 | import { cn } from '../lib/utils'
7 |
8 | function Avatar({ className, ...props }: React.ComponentProps) {
9 | return (
10 |
15 | )
16 | }
17 |
18 | function AvatarImage({ className, ...props }: React.ComponentProps) {
19 | return (
20 |
25 | )
26 | }
27 |
28 | function AvatarFallback({ className, ...props }: React.ComponentProps) {
29 | return (
30 |
35 | )
36 | }
37 |
38 | export { Avatar, AvatarImage, AvatarFallback }
39 |
--------------------------------------------------------------------------------
/packages/core/src/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 | import { Slot } from '@radix-ui/react-slot'
3 | import { cva, type VariantProps } from 'class-variance-authority'
4 |
5 | import { cn } from '../lib/utils'
6 |
7 | const buttonVariants = cva('cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', {
8 | variants: {
9 | variant: {
10 | default: 'shadow-sm shadow-black/20 bg-primary text-primary-foreground hover:bg-primary/90',
11 | destructive: 'bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90',
12 | outline: 'shadow-sm shadow-black/15 border border-transparent bg-background ring-1 ring-foreground/10 duration-200 hover:bg-muted/50 dark:ring-foreground/15 dark:hover:bg-muted/50',
13 | secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
14 | ghost: 'hover:bg-accent hover:text-accent-foreground',
15 | link: 'text-primary underline-offset-4 hover:underline',
16 | },
17 | size: {
18 | default: 'h-9 px-4 py-2',
19 | sm: 'h-8 rounded-md px-3 text-xs',
20 | lg: 'h-10 rounded-md px-8',
21 | icon: 'h-9 w-9',
22 | },
23 | },
24 | defaultVariants: {
25 | variant: 'default',
26 | size: 'default',
27 | },
28 | })
29 |
30 | export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps {
31 | asChild?: boolean
32 | }
33 |
34 | const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
35 | const Comp = asChild ? Slot : 'button'
36 | return (
37 |
42 | )
43 | })
44 | Button.displayName = 'Button'
45 |
46 | export { Button, buttonVariants }
47 |
--------------------------------------------------------------------------------
/packages/core/src/ui/card.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | import { cn } from '../lib/utils'
4 |
5 | function Card({ className, ...props }: React.ComponentProps<'div'>) {
6 | return (
7 |
12 | )
13 | }
14 |
15 | function CardHeader({ className, ...props }: React.ComponentProps<'div'>) {
16 | return (
17 |
22 | )
23 | }
24 |
25 | function CardTitle({ className, ...props }: React.ComponentProps<'div'>) {
26 | return (
27 |
32 | )
33 | }
34 |
35 | function CardDescription({ className, ...props }: React.ComponentProps<'div'>) {
36 | return (
37 |
42 | )
43 | }
44 |
45 | function CardContent({ className, ...props }: React.ComponentProps<'div'>) {
46 | return (
47 |
52 | )
53 | }
54 |
55 | function CardFooter({ className, ...props }: React.ComponentProps<'div'>) {
56 | return (
57 |
62 | )
63 | }
64 |
65 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
66 |
--------------------------------------------------------------------------------
/packages/core/src/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | import { cn } from '../lib/utils'
4 |
5 | function Input({ className, type, ...props }: React.ComponentProps<'input'>) {
6 | return (
7 |
18 | )
19 | }
20 |
21 | export { Input }
22 |
--------------------------------------------------------------------------------
/packages/core/src/ui/label.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as LabelPrimitive from '@radix-ui/react-label'
5 |
6 | import { cn } from '../lib/utils'
7 |
8 | function Label({ className, ...props }: React.ComponentProps) {
9 | return (
10 |
15 | )
16 | }
17 |
18 | export { Label }
19 |
--------------------------------------------------------------------------------
/packages/core/src/ui/radio-group.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'
5 | import { CircleIcon } from 'lucide-react'
6 |
7 | import { cn } from '../lib/utils'
8 |
9 | function RadioGroup({ className, ...props }: React.ComponentProps) {
10 | return (
11 |
16 | )
17 | }
18 |
19 | function RadioGroupItem({ className, ...props }: React.ComponentProps) {
20 | return (
21 |
25 |
28 |
29 |
30 |
31 | )
32 | }
33 |
34 | export { RadioGroup, RadioGroupItem }
35 |
--------------------------------------------------------------------------------
/packages/core/src/ui/scroll-area.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'
5 |
6 | import { cn } from '../lib/utils'
7 |
8 | function ScrollArea({ className, children, ...props }: React.ComponentProps) {
9 | return (
10 |
14 |
17 | {children}
18 |
19 |
20 |
21 |
22 | )
23 | }
24 |
25 | function ScrollBar({ className, orientation = 'vertical', ...props }: React.ComponentProps) {
26 | return (
27 |
32 |
36 |
37 | )
38 | }
39 |
40 | export { ScrollArea, ScrollBar }
41 |
--------------------------------------------------------------------------------
/packages/core/src/ui/separator.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as SeparatorPrimitive from '@radix-ui/react-separator'
5 |
6 | import { cn } from '../lib/utils'
7 |
8 | function Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps) {
9 | return (
10 |
17 | )
18 | }
19 |
20 | export { Separator }
21 |
--------------------------------------------------------------------------------
/packages/core/src/ui/textarea.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 |
3 | import { cn } from '../lib/utils'
4 |
5 | function Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {
6 | return (
7 |
12 | )
13 | }
14 |
15 | export { Textarea }
16 |
--------------------------------------------------------------------------------
/packages/core/src/ui/toggle-group.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'
5 | import { type VariantProps } from 'class-variance-authority'
6 |
7 | import { cn } from '../lib/utils'
8 | import { toggleVariants } from './toggle'
9 |
10 | const ToggleGroupContext = React.createContext>({
11 | size: 'default',
12 | variant: 'default',
13 | })
14 |
15 | function ToggleGroup({ className, variant, size, children, ...props }: React.ComponentProps & VariantProps) {
16 | return (
17 |
23 | {children}
24 |
25 | )
26 | }
27 |
28 | function ToggleGroupItem({ className, children, variant, size, ...props }: React.ComponentProps & VariantProps) {
29 | const context = React.useContext(ToggleGroupContext)
30 |
31 | return (
32 |
45 | {children}
46 |
47 | )
48 | }
49 |
50 | export { ToggleGroup, ToggleGroupItem }
51 |
--------------------------------------------------------------------------------
/packages/core/src/ui/toggle.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as TogglePrimitive from '@radix-ui/react-toggle'
5 | import { cva, type VariantProps } from 'class-variance-authority'
6 |
7 | import { cn } from '../lib/utils'
8 |
9 | const toggleVariants = cva(
10 | "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
11 | {
12 | variants: {
13 | variant: {
14 | default: 'bg-transparent',
15 | outline: 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',
16 | },
17 | size: {
18 | default: 'h-9 px-2 min-w-9',
19 | sm: 'h-8 px-1.5 min-w-8',
20 | lg: 'h-10 px-2.5 min-w-10',
21 | },
22 | },
23 | defaultVariants: {
24 | variant: 'default',
25 | size: 'default',
26 | },
27 | }
28 | )
29 |
30 | function Toggle({ className, variant, size, ...props }: React.ComponentProps & VariantProps) {
31 | return (
32 |
37 | )
38 | }
39 |
40 | export { Toggle, toggleVariants }
41 |
--------------------------------------------------------------------------------
/packages/core/src/ui/tooltip.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as TooltipPrimitive from '@radix-ui/react-tooltip'
5 |
6 | import { cn } from '../lib/utils'
7 |
8 | function TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps) {
9 | return (
10 |
15 | )
16 | }
17 |
18 | function Tooltip({ ...props }: React.ComponentProps) {
19 | return (
20 |
21 |
25 |
26 | )
27 | }
28 |
29 | function TooltipTrigger({ ...props }: React.ComponentProps) {
30 | return (
31 |
35 | )
36 | }
37 |
38 | function TooltipContent({ className, sideOffset = 4, children, ...props }: React.ComponentProps) {
39 | return (
40 |
41 |
46 | {children}
47 |
48 |
49 | )
50 | }
51 |
52 | export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
53 |
--------------------------------------------------------------------------------
/packages/core/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/packages/core/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4 | "target": "ES2020",
5 | "useDefineForClassFields": true,
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "module": "ESNext",
8 | "skipLibCheck": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "bundler",
12 | "allowImportingTsExtensions": true,
13 | "verbatimModuleSyntax": true,
14 | "moduleDetection": "force",
15 | "noEmit": true,
16 | "jsx": "react-jsx",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "erasableSyntaxOnly": true,
23 | "noFallthroughCasesInSwitch": true,
24 | "noUncheckedSideEffectImports": true,
25 |
26 | "baseUrl": ".",
27 | "paths": {
28 | "@/*": [
29 | "./src/*"
30 | ]
31 | }
32 | },
33 | "include": ["src"]
34 | }
35 |
--------------------------------------------------------------------------------
/packages/core/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ],
7 | "compilerOptions": {
8 | "baseUrl": ".",
9 | "paths": {
10 | "@/*": ["./src/*"]
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/packages/core/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4 | "target": "ES2022",
5 | "lib": ["ES2023"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "verbatimModuleSyntax": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 |
16 | /* Linting */
17 | "strict": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "erasableSyntaxOnly": true,
21 | "noFallthroughCasesInSwitch": true,
22 | "noUncheckedSideEffectImports": true
23 | },
24 | "include": ["vite.config.ts"]
25 | }
26 |
--------------------------------------------------------------------------------
/packages/core/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 | import path from 'path'
4 |
5 | // https://vite.dev/config/
6 | export default defineConfig({
7 | plugins: [react()],
8 | resolve: {
9 | alias: {
10 | '@': path.resolve(__dirname, './src'),
11 | },
12 | },
13 | })
14 |
--------------------------------------------------------------------------------
/packages/dusk-kit/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env*
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
--------------------------------------------------------------------------------
/packages/dusk-kit/README.md:
--------------------------------------------------------------------------------
1 | Tailark Dusk Kit
--------------------------------------------------------------------------------
/packages/dusk-kit/app/layout.tsx:
--------------------------------------------------------------------------------
1 | export default function RootLayout({
2 | children,
3 | }: Readonly<{
4 | children: React.ReactNode
5 | }>) {
6 | return (
7 |
8 | {children}
9 |
10 | )
11 | }
12 |
--------------------------------------------------------------------------------
/packages/dusk-kit/app/page.tsx:
--------------------------------------------------------------------------------
1 | export default function Home() {
2 | return <>>
3 | }
4 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/call-to-action/one/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@tailark/core/ui/button'
2 | import Link from 'next/link'
3 |
4 | export default function CallToAction() {
5 | return (
6 |
7 |
8 |
9 |
Start Building
10 |
Libero sapiente aliquam quibusdam aspernatur.
11 |
12 |
13 |
16 |
17 | Get Started
18 |
19 |
20 |
21 |
25 |
26 | Book Demo
27 |
28 |
29 |
30 |
31 |
32 |
33 | )
34 | }
35 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/call-to-action/three/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@tailark/core/ui/button'
2 | import { Mail, SendHorizonal } from 'lucide-react'
3 |
4 | export default function CallToAction() {
5 | return (
6 |
7 |
8 |
9 |
Start Building
10 |
Libero sapiente aliquam quibusdam aspernatur.
11 |
12 |
37 |
38 |
39 |
40 | )
41 | }
42 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/call-to-action/two/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@tailark/core/ui/button'
2 | import Link from 'next/link'
3 |
4 | export default function CallToAction() {
5 | return (
6 |
7 |
8 |
9 |
Start Building
10 |
Libero sapiente aliquam quibusdam aspernatur.
11 |
12 |
13 |
16 |
17 | Get Started
18 |
19 |
20 |
21 |
25 |
26 | Book Demo
27 |
28 |
29 |
30 |
31 |
32 |
33 | )
34 | }
35 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/content/four/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@tailark/core/ui/button'
2 | import { ChevronRight } from 'lucide-react'
3 | import Link from 'next/link'
4 |
5 | export default function ContentSection() {
6 | return (
7 |
8 |
9 |
10 |
The Lyra ecosystem brings together our models, products and platforms.
11 |
12 |
Lyra is evolving to be more than just the models. It supports an entire ecosystem — from products to the APIs and platforms helping developers and businesses innovate.
13 |
14 | Tailark. It supports an entire ecosystem — from products innovate. Sit minus, quod debitis autem quia aspernatur delectus impedit modi, neque non id ad dignissimos? Saepe deleniti perferendis beatae.
15 |
16 |
21 |
22 | Learn More
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | )
31 | }
32 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/content/one/index.tsx:
--------------------------------------------------------------------------------
1 | import Image from 'next/image'
2 |
3 | export default function ContentSection() {
4 | return (
5 |
6 |
7 |
The Lyra ecosystem brings together our models.
8 |
9 |
15 |
16 |
17 |
18 | Gemini is evolving to be more than just the models. It supports an entire ecosystem — from products innovate.
19 |
20 |
It supports an entire ecosystem — from products to the APIs and platforms helping developers and businesses innovate
21 |
22 |
23 |
24 | Using TailsUI has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
25 |
26 |
27 |
John Doe, CEO
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | )
37 | }
38 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/content/three/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@tailark/core/ui/button'
2 | import { ChevronRight } from 'lucide-react'
3 | import Link from 'next/link'
4 |
5 | export default function ContentSection() {
6 | return (
7 |
8 |
9 |
17 |
18 |
19 |
The Lyra ecosystem brings together our models, products and platforms.
20 |
21 |
Lyra is evolving to be more than just the models. It supports an entire ecosystem — from products to the APIs and platforms helping developers and businesses innovate.
22 |
23 |
28 |
29 | Learn More
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | )
38 | }
39 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/features/five/index.tsx:
--------------------------------------------------------------------------------
1 | import { Activity, DraftingCompass, Mail, Zap } from 'lucide-react'
2 | import Image from 'next/image'
3 |
4 | export default function FeaturesSection() {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
Built for Scaling teams
12 |
Orrupti aut temporibus assumenda atque ab, accusamus sit, molestiae veniam laboriosam pariatur.
13 |
14 |
15 |
16 |
17 | Email and web support
18 |
19 |
20 |
21 | Fast response time
22 |
23 |
24 |
25 | Menitoring and analytics
26 |
27 |
28 |
29 | Architectural review
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 | )
43 | }
44 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/footer/four/index.tsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 |
3 | const links = [
4 | {
5 | title: 'Features',
6 | href: '#',
7 | },
8 | {
9 | title: 'Solution',
10 | href: '#',
11 | },
12 | {
13 | title: 'Customers',
14 | href: '#',
15 | },
16 | {
17 | title: 'Pricing',
18 | href: '#',
19 | },
20 | {
21 | title: 'Help',
22 | href: '#',
23 | },
24 | {
25 | title: 'About',
26 | href: '#',
27 | },
28 | ]
29 |
30 | export default function FooterSection() {
31 | return (
32 |
33 |
34 |
35 |
© {new Date().getFullYear()} Tailark, All rights reserved
36 |
37 | {links.map((link, index) => (
38 |
42 | {link.title}
43 |
44 | ))}
45 |
46 |
47 |
48 |
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/logo-cloud/one/index.tsx:
--------------------------------------------------------------------------------
1 | export default function LogoCloud() {
2 | return (
3 |
4 |
5 |
Your favorite companies are our partners.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/stats/one/index.tsx:
--------------------------------------------------------------------------------
1 | export default function StatsSection() {
2 | return (
3 |
4 |
5 |
6 |
Tailark in numbers
7 |
Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.
8 |
9 |
10 |
11 |
12 |
+1200
13 |
Stars on GitHub
14 |
15 |
16 |
22 Million
17 |
Active Users
18 |
19 |
20 |
+500
21 |
Powered Apps
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/stats/three/index.tsx:
--------------------------------------------------------------------------------
1 | export default function StatsSection() {
2 | return (
3 |
4 |
5 |
6 |
Tailark in numbers
7 |
Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.
8 |
9 |
10 |
11 |
12 |
+1200
13 |
Stars on GitHub
14 |
15 |
16 |
56%
17 |
Conversion rate
18 |
19 |
20 |
+500
21 |
Powered Apps
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/stats/two/index.tsx:
--------------------------------------------------------------------------------
1 | export default function StatsSection() {
2 | return (
3 |
4 |
5 |
6 |
Tailark in numbers
7 |
Gemini is evolving to be more than just the models. It supports an entire to the APIs and platforms helping developers and businesses innovate.
8 |
9 |
10 |
11 |
12 |
+1200
13 |
Stars on GitHub
14 |
15 |
16 |
56%
17 |
Conversion rate
18 |
19 |
20 |
+500
21 |
Powered Apps
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/testimonials/four/index.tsx:
--------------------------------------------------------------------------------
1 | import { Avatar, AvatarFallback, AvatarImage } from '@tailark/core/ui/avatar'
2 |
3 | export default function TestimonialsSection() {
4 | return (
5 |
6 |
7 |
8 |
9 | Using TailsUI has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
10 |
11 |
12 |
13 |
20 | ST
21 |
22 |
23 |
24 | John Doe
25 | CEO, Nvidia
26 |
27 |
28 |
29 |
30 |
31 |
32 | )
33 | }
34 |
--------------------------------------------------------------------------------
/packages/dusk-kit/blocks/testimonials/three/index.tsx:
--------------------------------------------------------------------------------
1 | export default function TestimonialsSection() {
2 | return (
3 |
4 |
5 |
6 |
7 | Using TailsUI has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
8 |
9 |
10 |
11 |
12 | John Doe
13 | CEO, Nvidia
14 |
15 |
16 |
17 |
18 |
19 |
20 | )
21 | }
22 |
--------------------------------------------------------------------------------
/packages/dusk-kit/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "app/globals.css",
9 | "baseColor": "zinc",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@tailark/core/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
--------------------------------------------------------------------------------
/packages/dusk-kit/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [
13 | ...compat.extends("next/core-web-vitals", "next/typescript"),
14 | ];
15 |
16 | export default eslintConfig;
17 |
--------------------------------------------------------------------------------
/packages/dusk-kit/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | productionBrowserSourceMaps: true,
4 | images: {
5 | remotePatterns: [
6 | {
7 | protocol: 'https',
8 | hostname: 'ik.imagekit.io',
9 | },
10 | ],
11 | },
12 | }
13 |
14 | module.exports = nextConfig
15 |
--------------------------------------------------------------------------------
/packages/dusk-kit/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@tailark/dusk",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev --turbopack",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "imports": {
12 | "#*": "./*",
13 | "#components/*":[
14 | "./components/*.ts",
15 | "./components/*.tsx"
16 | ]
17 | },
18 | "dependencies": {
19 | "@tailark/core": "workspace:*",
20 | "@tailark/ts-config": "workspace:*",
21 | "class-variance-authority": "^0.7.1",
22 | "clsx": "^2.1.1",
23 | "dotted-map": "^2.2.3",
24 | "lucide-react": "^0.475.0",
25 | "motion": "^12.4.3",
26 | "next": "15.3.2",
27 | "react": "^19.0.0",
28 | "react-dom": "^19.0.0",
29 | "recharts": "^2.15.1",
30 | "swiper": "^11.2.4",
31 | "tailwind-merge": "^3.0.1"
32 | },
33 | "devDependencies": {
34 | "@eslint/eslintrc": "^3",
35 | "@tailwindcss/postcss": "^4",
36 | "@types/node": "^20",
37 | "@types/react": "^19",
38 | "@types/react-dom": "^19",
39 | "eslint": "^9",
40 | "eslint-config-next": "15.3.2",
41 | "tailwindcss": "^4",
42 | "tw-animate-css": "^1.2.9",
43 | "typescript": "latest"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/packages/dusk-kit/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/packages/dusk-kit/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tailark/ts-config/base.json",
3 | "compilerOptions": {
4 | "plugins": [
5 | {"name": "next"}
6 | ]
7 | },
8 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
9 | "exclude": ["node_modules"]
10 | }
11 |
--------------------------------------------------------------------------------
/packages/mist-kit/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.*
7 | .yarn/*
8 | !.yarn/patches
9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/versions
12 |
13 | # testing
14 | /coverage
15 |
16 | # next.js
17 | /.next/
18 | /out/
19 |
20 | # production
21 | /build
22 |
23 | # misc
24 | .DS_Store
25 | *.pem
26 |
27 | # debug
28 | npm-debug.log*
29 | yarn-debug.log*
30 | yarn-error.log*
31 | .pnpm-debug.log*
32 |
33 | # env files (can opt-in for committing if needed)
34 | .env*
35 |
36 | # vercel
37 | .vercel
38 |
39 | # typescript
40 | *.tsbuildinfo
41 | next-env.d.ts
42 |
--------------------------------------------------------------------------------
/packages/mist-kit/app/layout.tsx:
--------------------------------------------------------------------------------
1 | export default function RootLayout({
2 | children,
3 | }: Readonly<{
4 | children: React.ReactNode
5 | }>) {
6 | return (
7 |
8 | {children}
9 |
10 | )
11 | }
12 |
--------------------------------------------------------------------------------
/packages/mist-kit/app/page.tsx:
--------------------------------------------------------------------------------
1 | export default function Home() {
2 | return <>>
3 | }
4 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/call-to-action/one/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@mist/components/ui/button'
2 | import Link from 'next/link'
3 |
4 | export default function StatsSection() {
5 | return (
6 |
7 |
8 |
9 |
10 |
Build 10x Faster with Mist
11 |
12 |
15 | Get Started
16 |
17 |
21 | Get a Demo
22 |
23 |
24 |
25 |
26 |
27 |
28 | )
29 | }
30 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/call-to-action/three/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@mist/components/ui/button'
2 | import { Calendar, ChevronRight } from 'lucide-react'
3 | import Link from 'next/link'
4 |
5 | export default function StatsSection() {
6 | return (
7 |
8 |
9 |
10 |
11 | Build Modern Websites. Drive Results
12 |
13 |
Libero sapiente aliquam quibusdam aspernatur, praesentium iusto repellendus.
14 |
15 |
18 |
19 | Try Mist for Free
20 |
24 |
25 |
26 |
30 |
31 |
35 | Request a Demo
36 |
37 |
38 |
39 |
40 |
41 |
42 | )
43 | }
44 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/call-to-action/two/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@mist/components/ui/button'
2 | import Link from 'next/link'
3 |
4 | export default function StatsSection() {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
Build 10x Faster with Mist
12 |
13 |
14 |
18 | Get a Demo
19 |
20 |
23 | Get Started
24 |
25 |
26 |
27 |
28 |
29 |
30 | )
31 | }
32 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/content/three/index.tsx:
--------------------------------------------------------------------------------
1 | import Image from 'next/image'
2 |
3 | export default function ContentSection() {
4 | return (
5 |
6 |
7 |
8 |
9 |
10 |
🦊
11 |
Create Content with AI Assistance
12 |
Our AI assistant helps you create better content faster. Generate ideas, improve your writing, and design layouts with simple prompts.
13 |
14 |
15 |
16 |
21 |
22 |
23 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | )
37 | }
38 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/footer/four/index.tsx:
--------------------------------------------------------------------------------
1 | import { LogoIcon } from '@tailark/core/components/logo'
2 | import Link from 'next/link'
3 |
4 | const links = [
5 | {
6 | title: 'Features',
7 | href: '#',
8 | },
9 | {
10 | title: 'Solution',
11 | href: '#',
12 | },
13 | {
14 | title: 'Customers',
15 | href: '#',
16 | },
17 | {
18 | title: 'Pricing',
19 | href: '#',
20 | },
21 | {
22 | title: 'Help',
23 | href: '#',
24 | },
25 | {
26 | title: 'About',
27 | href: '#',
28 | },
29 | ]
30 |
31 | export default function FooterSection() {
32 | return (
33 |
34 |
35 |
36 |
37 |
40 |
41 |
42 | © {new Date().getFullYear()} Tailark Mist, All rights reserved
43 |
44 |
45 |
46 | {links.map((link, index) => (
47 |
51 | {link.title}
52 |
53 | ))}
54 |
55 |
56 |
57 |
58 | )
59 | }
60 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/integrations/one/index.tsx:
--------------------------------------------------------------------------------
1 | import { Gemini, GooglePaLM, Replit, MediaWiki, MagicUI, VSCodium } from '@tailark/core/components/logos'
2 |
3 | export default function Integrations() {
4 | return (
5 |
6 |
7 |
8 |
Integrate with :
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | )
33 | }
34 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/integrations/two/index.tsx:
--------------------------------------------------------------------------------
1 | import { Button } from '@mist/components/ui/button'
2 | import { Gemini, GooglePaLM, Replit, MediaWiki, MagicUI, VSCodium } from '@tailark/core/components/logos'
3 | import Link from 'next/link'
4 |
5 | export default function Integrations() {
6 | return (
7 |
8 |
9 |
10 |
Integrate with your favorite tools :
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
34 | More Integrations
35 |
36 |
37 |
38 |
39 | )
40 | }
41 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/logo-cloud/one/index.tsx:
--------------------------------------------------------------------------------
1 | export default function LogoCloud() {
2 | return (
3 |
4 |
5 |
6 |
Trusted by teams at :
7 |
8 |
9 |
16 |
17 |
18 |
19 |
26 |
27 |
28 |
35 |
36 |
37 |
44 |
45 |
46 |
47 |
48 |
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/logo-cloud/two/index.tsx:
--------------------------------------------------------------------------------
1 | export default function LogoCloud() {
2 | return (
3 |
4 |
5 |
6 |
Trusted by teams at :
7 |
8 |
9 |
16 |
17 |
18 |
19 |
26 |
27 |
28 |
35 |
36 |
37 |
44 |
45 |
46 |
47 |
48 |
49 | )
50 | }
51 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/stats/four/index.tsx:
--------------------------------------------------------------------------------
1 | export default function StatsSection() {
2 | return (
3 |
4 |
5 |
6 |
Tailark in stats
7 |
8 |
9 |
90+
10 |
Integrations
11 |
12 |
13 |
56%
14 |
Productivity Boost
15 |
16 |
17 |
Our platform continues to grow with developers and businesses using productivity.
18 |
19 |
20 |
21 |
22 |
23 | )
24 | }
25 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/stats/one/index.tsx:
--------------------------------------------------------------------------------
1 | import { Card } from '@mist/components/ui/card'
2 |
3 | export default function StatsSection() {
4 | return (
5 |
6 |
7 |
8 |
9 |
+1200
10 |
Stars on GitHub
11 |
12 |
13 |
56%
14 |
Conversion rate
15 |
16 |
17 |
+500
18 |
Powered Apps
19 |
20 |
21 |
22 |
23 | )
24 | }
25 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/stats/three/index.tsx:
--------------------------------------------------------------------------------
1 | import { ArrowRight } from 'lucide-react'
2 |
3 | export default function StatsSection() {
4 | return (
5 |
6 |
7 |
8 |
9 |
Tailark in numbers
10 |
Our platform continues to grow with developers and businesses using our tools to create innovative solutions and enhance productivity.
11 |
12 |
15 | {[
16 | { value: '90+', label: 'Integrations' },
17 | { value: '56%', label: 'Productivity Boost' },
18 | { value: '24/7', label: 'Customer Support' },
19 | { value: '10k+', label: 'Active Users' },
20 | ].map((stat, index) => (
21 |
24 |
25 | {stat.value} {stat.label}
26 |
27 | ))}
28 |
29 |
30 |
31 |
32 | )
33 | }
34 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/stats/two/index.tsx:
--------------------------------------------------------------------------------
1 | export default function StatsSection() {
2 | return (
3 |
4 |
5 |
6 |
7 |
Tailark in numbers
8 |
Our platform continues to grow with developers and businesses using our tools to create innovative solutions and enhance productivity.
9 |
10 |
11 |
12 |
90+
13 |
Integrations
14 |
15 |
16 |
56%
17 |
Productivity Boost
18 |
19 |
20 |
24/7
21 |
Customer Support
22 |
23 |
24 |
10k+
25 |
Active Users
26 |
27 |
28 |
29 |
30 |
31 | )
32 | }
33 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/testimonials/five/index.tsx:
--------------------------------------------------------------------------------
1 | import { Avatar, AvatarFallback, AvatarImage } from '@tailark/core/ui/avatar'
2 | import { Quote } from 'lucide-react'
3 |
4 | export default function TestimonialSection() {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 | Using Tailark has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
13 |
14 |
15 |
19 | T
20 |
21 | Théo Balick
22 | @theo_b
23 |
24 |
25 |
26 |
27 |
28 |
29 | )
30 | }
31 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/testimonials/four/index.tsx:
--------------------------------------------------------------------------------
1 | import { Avatar, AvatarFallback, AvatarImage } from '@tailark/core/ui/avatar'
2 |
3 | export default function TestimonialSection() {
4 | return (
5 |
6 |
7 |
8 |
9 | Using Tailark has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
10 |
11 |
12 |
16 | T
17 |
18 | Théo Balick
19 |
22 | Product Designer
23 |
24 |
25 |
26 |
27 |
28 | )
29 | }
30 |
--------------------------------------------------------------------------------
/packages/mist-kit/blocks/testimonials/one/index.tsx:
--------------------------------------------------------------------------------
1 | export default function TestimonialSection() {
2 | return (
3 |
4 |
5 |
6 |
7 | Using Tailark has been like unlocking a secret design superpower. It's the perfect fusion of simplicity and versatility, enabling us to create UIs that are as stunning as they are user-friendly.
8 |
9 | John Doe
10 |
13 | Product Designer
14 |
15 |
16 |
17 |
18 |
19 | )
20 | }
21 |
--------------------------------------------------------------------------------
/packages/mist-kit/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "app/globals.css",
9 | "baseColor": "zinc",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/components/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
--------------------------------------------------------------------------------
/packages/mist-kit/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react'
2 | import { Slot } from '@radix-ui/react-slot'
3 | import { cva, type VariantProps } from 'class-variance-authority'
4 | import { cn } from '@tailark/core/lib/utils'
5 |
6 | const buttonVariants = cva('cursor-pointer font-medium inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', {
7 | variants: {
8 | variant: {
9 | default: 'bg-primary text-primary-foreground hover:brightness-95',
10 | neutral: 'bg-foreground text-background hover:brightness-95',
11 | destructive: 'bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90',
12 | outline: 'shadow-sm text-foreground shadow-black/15 border border-transparent bg-background ring-1 ring-foreground/10 duration-200 hover:bg-muted/50',
13 | secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
14 | ghost: 'hover:bg-foreground/5 text-foreground/75 hover:text-foreground',
15 | link: 'text-primary underline-offset-4 hover:underline',
16 | },
17 | size: {
18 | default: 'h-9 px-4 py-2 rounded-md',
19 | sm: 'h-8 px-3 rounded-full text-sm',
20 | lg: 'h-11 px-6 font-medium text-base',
21 | icon: 'size-9',
22 | },
23 | },
24 | defaultVariants: {
25 | variant: 'default',
26 | size: 'sm',
27 | },
28 | })
29 |
30 | export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps {
31 | asChild?: boolean
32 | }
33 |
34 | const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
35 | const Comp = asChild ? Slot : 'button'
36 | return (
37 |
42 | )
43 | })
44 | Button.displayName = 'Button'
45 |
46 | export { Button, buttonVariants }
47 |
--------------------------------------------------------------------------------
/packages/mist-kit/components/ui/hover-card.tsx:
--------------------------------------------------------------------------------
1 | 'use client'
2 |
3 | import * as React from 'react'
4 | import * as HoverCardPrimitive from '@radix-ui/react-hover-card'
5 |
6 | import { cn } from '@tailark/core/lib/utils'
7 |
8 | function HoverCard({ ...props }: React.ComponentProps) {
9 | return (
10 |
14 | )
15 | }
16 |
17 | function HoverCardTrigger({ ...props }: React.ComponentProps) {
18 | return (
19 |
23 | )
24 | }
25 |
26 | function HoverCardContent({ className, align = 'center', sideOffset = 4, ...props }: React.ComponentProps) {
27 | return (
28 |
29 |
39 |
40 | )
41 | }
42 |
43 | export { HoverCard, HoverCardTrigger, HoverCardContent }
44 |
--------------------------------------------------------------------------------
/packages/mist-kit/eslint.config.mjs:
--------------------------------------------------------------------------------
1 | import { dirname } from "path";
2 | import { fileURLToPath } from "url";
3 | import { FlatCompat } from "@eslint/eslintrc";
4 |
5 | const __filename = fileURLToPath(import.meta.url);
6 | const __dirname = dirname(__filename);
7 |
8 | const compat = new FlatCompat({
9 | baseDirectory: __dirname,
10 | });
11 |
12 | const eslintConfig = [
13 | ...compat.extends("next/core-web-vitals", "next/typescript"),
14 | ];
15 |
16 | export default eslintConfig;
17 |
--------------------------------------------------------------------------------
/packages/mist-kit/next.config.ts:
--------------------------------------------------------------------------------
1 | import type { NextConfig } from "next";
2 |
3 | const nextConfig: NextConfig = {
4 | productionBrowserSourceMaps: true,
5 | images: {
6 | remotePatterns: [
7 | {
8 | protocol: 'https',
9 | hostname: 'ik.imagekit.io',
10 | },
11 | ],
12 | },
13 | };
14 |
15 | export default nextConfig;
16 |
--------------------------------------------------------------------------------
/packages/mist-kit/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@tailark/mist",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev --turbopack",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "imports": {
12 | "#*": "./*",
13 | "#components/*":[
14 | "./components/*.ts",
15 | "./components/*.tsx"
16 | ]
17 | },
18 | "dependencies": {
19 | "@radix-ui/react-hover-card": "^1.1.13",
20 | "@radix-ui/react-slot": "^1.1.2",
21 | "@radix-ui/react-toggle": "^1.1.8",
22 | "@radix-ui/react-toggle-group": "^1.1.9",
23 | "class-variance-authority": "^0.7.1",
24 | "clsx": "^2.1.1",
25 | "lucide-react": "^0.475.0",
26 | "motion": "^12.4.3",
27 | "next": "15.3.1",
28 | "react": "^19.0.0",
29 | "react-dom": "^19.0.0",
30 | "tailwind-merge": "^3.0.1"
31 | },
32 | "devDependencies": {
33 | "@eslint/eslintrc": "^3",
34 | "@tailark/core": "workspace:*",
35 | "@tailark/ts-config" : "workspace:*",
36 | "@tailwindcss/postcss": "^4.1.6",
37 | "@types/node": "^20",
38 | "@types/react": "^19",
39 | "@types/react-dom": "^19",
40 | "eslint": "^9",
41 | "eslint-config-next": "15.3.1",
42 | "tailwindcss": "^4.1.6",
43 | "tw-animate-css": "^1.2.9",
44 | "typescript": "latest"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/packages/mist-kit/postcss.config.mjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | plugins: ["@tailwindcss/postcss"],
3 | };
4 |
5 | export default config;
6 |
--------------------------------------------------------------------------------
/packages/mist-kit/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tailark/ts-config/base.json",
3 | "compilerOptions": {
4 | "baseUrl": "./",
5 | "paths": {
6 | "@tailark/core/*": ["./../core/src/*"],
7 | "@mist/*" : ["./*"]
8 | }
9 | },
10 | "exclude": [
11 | "node_modules"
12 | ],
13 | "include": [
14 | "next-env.d.ts",
15 | ".next/types/**/*.ts",
16 | "**/*.ts",
17 | "**/*.tsx"
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/packages/ts-config/base.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "sourceMap": true,
9 | "noEmit": false,
10 | "declaration": true,
11 | "declarationMap": true,
12 | "esModuleInterop": true,
13 | "module": "esnext",
14 | "moduleResolution": "bundler",
15 | "resolveJsonModule": true,
16 | "isolatedModules": true,
17 | "jsx": "preserve",
18 | "incremental": true,
19 | "plugins": [
20 | {
21 | "name": "next"
22 | }
23 | ],
24 | "baseUrl": ".",
25 | "paths": {
26 | "@/*": ["./*"],
27 | "@tailark/core/*" : ["../core/src/*"],
28 | "@mist/*" : ["../mist-kit/*"]
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/packages/ts-config/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@tailark/ts-config",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC"
12 | }
13 |
--------------------------------------------------------------------------------
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - "packages/*"
3 | - "apps/*"
--------------------------------------------------------------------------------
/turbo.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://turbo.build/schema.json",
3 | "tasks": {
4 | "build": {
5 | "dependsOn": ["^build"],
6 | "outputs": ["dist/**", ".next/**"]
7 | },
8 | "start": {
9 | "dependsOn": ["^build"]
10 | },
11 | "lint": {
12 | "cache": false,
13 | "outputs": []
14 | },
15 | "dev": {
16 | "cache": false
17 | },
18 | "registry:build": {
19 | "cache": false,
20 | "outputs": []
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------