Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions frontend/src/components/ProductHuntBadge.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useTheme } from '../context/ThemeContext'
import { PRODUCT_HUNT } from '../constants/brand'

function ProductHuntBadge({ className = '' }) {
const { theme } = useTheme()
const badgeTheme = theme === 'light' ? 'light' : 'dark'
const badgeSrc = `https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=${PRODUCT_HUNT.postId}&theme=${badgeTheme}&t=${PRODUCT_HUNT.cacheKey}`

return (
<a
href={PRODUCT_HUNT.url}
target="_blank"
rel="noopener noreferrer"
className={`inline-flex shrink-0 rounded-md transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--color-bg-primary)] ${className}`}
aria-label="View PortlifyAi on Product Hunt"
>
<img
src={badgeSrc}
alt={PRODUCT_HUNT.alt}
width={250}
height={54}
className="h-auto w-[min(100%,13.5rem)] sm:w-[250px]"
loading="lazy"
decoding="async"
/>
</a>
)
}

export default ProductHuntBadge
7 changes: 7 additions & 0 deletions frontend/src/constants/brand.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ export const BRAND_SOCIAL = [
'https://twitter.com/techycsr',
]

export const PRODUCT_HUNT = {
url: 'https://www.producthunt.com/products/portlifyai?embed=true&utm_source=badge-featured&utm_medium=badge&utm_campaign=badge-portlifyai',
postId: '1167150',
cacheKey: '1780997225343',
alt: 'PortlifyAi on Product Hunt — Dead Resume to Live Portfolio in Just 10 Seconds',
}

export const DEFAULT_SITE_URL = 'https://portlifyai.app'
export const OG_IMAGE_PATH = '/og-image.png'
export const OG_IMAGE_VERSION = '6'
Expand Down
16 changes: 13 additions & 3 deletions frontend/src/pages/Landing.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
Zap,
} from 'lucide-react'
import BrandLogo from '../components/BrandLogo'
import ProductHuntBadge from '../components/ProductHuntBadge'
import { IconTile, ICON_STROKE } from '../components/IconTile'
import { BRAND_NAME_DISPLAY } from '../constants/brand'
import { LANDING_FAQ } from '../constants/faq'
Expand Down Expand Up @@ -164,15 +165,15 @@ function Landing() {
transition={{ delay: 0.25, duration: 0.4 }}
className="text-sm sm:text-lg md:text-xl text-secondary max-w-2xl mx-auto mb-5 sm:mb-10 leading-relaxed px-1 sm:px-2"
>
Turn your resume into a professional portfolio in under 30 seconds.
Free to use — upload PDF, DOC, or DOCX and get a shareable URL instantly.
Upload your resume as a PDF, DOC, or DOCX and get a shareable portfolio
link in seconds. Free to use, no credit card required.
</motion.p>

<motion.div
initial={{ opacity: 0, y: 12 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.35, duration: 0.4 }}
className="flex flex-col sm:flex-row items-stretch sm:items-center justify-center gap-3 sm:gap-4 mb-6 sm:mb-16 w-full max-w-sm sm:max-w-none mx-auto"
className="flex flex-col sm:flex-row items-stretch sm:items-center justify-center gap-3 sm:gap-4 mb-4 sm:mb-5 w-full max-w-sm sm:max-w-none mx-auto"
>
<SignedOut>
<Link
Expand Down Expand Up @@ -200,6 +201,15 @@ function Landing() {
</SignedIn>
</motion.div>

<motion.div
initial={{ opacity: 0, y: 8 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.45, duration: 0.4 }}
className="flex justify-center mb-6 sm:mb-12"
>
<ProductHuntBadge />
</motion.div>

<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
Expand Down
Loading