diff --git a/.github/workflows/quality.yaml b/.github/workflows/quality.yaml index decde502..6d2ce14d 100644 --- a/.github/workflows/quality.yaml +++ b/.github/workflows/quality.yaml @@ -6,6 +6,7 @@ concurrency: group: ${{github.workflow }}-${{github.event_pull_request.nummber || github.ref }} cancel-in-progress: true + permissions: read-all jobs: diff --git a/safelist.txt b/safelist.txt index fb304999..1157ba52 100644 --- a/safelist.txt +++ b/safelist.txt @@ -256,6 +256,7 @@ text-.primary-0 text-.primary-100 text-.primary-200 text-.primary-300 +text-.primary-400 text-.primary-500 text-.primary-700 text-.primary-900 @@ -546,6 +547,7 @@ bg-.primary-0 bg-.primary-100 bg-.primary-200 bg-.primary-300 +bg-.primary-400 bg-.primary-500 bg-.primary-700 bg-.primary-900 @@ -836,6 +838,7 @@ dark:bg-.primary-0 dark:bg-.primary-100 dark:bg-.primary-200 dark:bg-.primary-300 +dark:bg-.primary-400 dark:bg-.primary-500 dark:bg-.primary-700 dark:bg-.primary-900 @@ -1126,6 +1129,7 @@ dark:hover:bg-.primary-0 dark:hover:bg-.primary-100 dark:hover:bg-.primary-200 dark:hover:bg-.primary-300 +dark:hover:bg-.primary-400 dark:hover:bg-.primary-500 dark:hover:bg-.primary-700 dark:hover:bg-.primary-900 @@ -1416,6 +1420,7 @@ dark:active:bg-.primary-0 dark:active:bg-.primary-100 dark:active:bg-.primary-200 dark:active:bg-.primary-300 +dark:active:bg-.primary-400 dark:active:bg-.primary-500 dark:active:bg-.primary-700 dark:active:bg-.primary-900 @@ -1706,6 +1711,7 @@ hover:text-.primary-0 hover:text-.primary-100 hover:text-.primary-200 hover:text-.primary-300 +hover:text-.primary-400 hover:text-.primary-500 hover:text-.primary-700 hover:text-.primary-900 @@ -1996,6 +2002,7 @@ hover:bg-.primary-0 hover:bg-.primary-100 hover:bg-.primary-200 hover:bg-.primary-300 +hover:bg-.primary-400 hover:bg-.primary-500 hover:bg-.primary-700 hover:bg-.primary-900 @@ -2286,6 +2293,7 @@ active:bg-.primary-0 active:bg-.primary-100 active:bg-.primary-200 active:bg-.primary-300 +active:bg-.primary-400 active:bg-.primary-500 active:bg-.primary-700 active:bg-.primary-900 @@ -2576,6 +2584,7 @@ ring-.primary-0 ring-.primary-100 ring-.primary-200 ring-.primary-300 +ring-.primary-400 ring-.primary-500 ring-.primary-700 ring-.primary-900 @@ -2866,6 +2875,7 @@ hover:ring-.primary-0 hover:ring-.primary-100 hover:ring-.primary-200 hover:ring-.primary-300 +hover:ring-.primary-400 hover:ring-.primary-500 hover:ring-.primary-700 hover:ring-.primary-900 @@ -3156,6 +3166,7 @@ focus:ring-.primary-0 focus:ring-.primary-100 focus:ring-.primary-200 focus:ring-.primary-300 +focus:ring-.primary-400 focus:ring-.primary-500 focus:ring-.primary-700 focus:ring-.primary-900 @@ -3446,6 +3457,7 @@ focus-within:ring-.primary-0 focus-within:ring-.primary-100 focus-within:ring-.primary-200 focus-within:ring-.primary-300 +focus-within:ring-.primary-400 focus-within:ring-.primary-500 focus-within:ring-.primary-700 focus-within:ring-.primary-900 @@ -3736,6 +3748,7 @@ border-.primary-0 border-.primary-100 border-.primary-200 border-.primary-300 +border-.primary-400 border-.primary-500 border-.primary-700 border-.primary-900 @@ -4026,6 +4039,7 @@ focus:border-.primary-0 focus:border-.primary-100 focus:border-.primary-200 focus:border-.primary-300 +focus:border-.primary-400 focus:border-.primary-500 focus:border-.primary-700 focus:border-.primary-900 @@ -4316,6 +4330,7 @@ focus-within:border-.primary-0 focus-within:border-.primary-100 focus-within:border-.primary-200 focus-within:border-.primary-300 +focus-within:border-.primary-400 focus-within:border-.primary-500 focus-within:border-.primary-700 focus-within:border-.primary-900 @@ -4606,6 +4621,7 @@ dark:text-.primary-0 dark:text-.primary-100 dark:text-.primary-200 dark:text-.primary-300 +dark:text-.primary-400 dark:text-.primary-500 dark:text-.primary-700 dark:text-.primary-900 @@ -4896,6 +4912,7 @@ dark:hover:text-.primary-0 dark:hover:text-.primary-100 dark:hover:text-.primary-200 dark:hover:text-.primary-300 +dark:hover:text-.primary-400 dark:hover:text-.primary-500 dark:hover:text-.primary-700 dark:hover:text-.primary-900 diff --git a/web/package.json b/web/package.json index c44c879d..07633773 100644 --- a/web/package.json +++ b/web/package.json @@ -73,6 +73,7 @@ "react-github-login": "^1.0.3", "react-hook-form": "^7.49.3", "react-icons": "^5.0.1", + "react-intersection-observer": "^9.10.2", "react-qr-code": "^2.0.12", "react-qrcode-logo": "^2.9.0", "react-redux": "^9.1.0", diff --git a/web/public/images/bulb.png.png b/web/public/images/bulb.png.png new file mode 100644 index 00000000..6da4c19d Binary files /dev/null and b/web/public/images/bulb.png.png differ diff --git a/web/public/images/circle.png b/web/public/images/circle.png new file mode 100644 index 00000000..0a29e34d Binary files /dev/null and b/web/public/images/circle.png differ diff --git a/web/public/images/dashboard.svg.png b/web/public/images/dashboard.svg.png new file mode 100644 index 00000000..e011e088 Binary files /dev/null and b/web/public/images/dashboard.svg.png differ diff --git a/web/public/images/fb.png b/web/public/images/fb.png new file mode 100644 index 00000000..f36dfe4d Binary files /dev/null and b/web/public/images/fb.png differ diff --git a/web/public/images/folder.png.png b/web/public/images/folder.png.png new file mode 100644 index 00000000..5e66a5f2 Binary files /dev/null and b/web/public/images/folder.png.png differ diff --git a/web/public/images/frame.png b/web/public/images/frame.png new file mode 100644 index 00000000..5dd8ab08 Binary files /dev/null and b/web/public/images/frame.png differ diff --git a/web/public/images/graph.png b/web/public/images/graph.png new file mode 100644 index 00000000..f92386a6 Binary files /dev/null and b/web/public/images/graph.png differ diff --git a/web/public/images/instagram.png b/web/public/images/instagram.png new file mode 100644 index 00000000..1a269cd1 Binary files /dev/null and b/web/public/images/instagram.png differ diff --git a/web/public/images/mailchimp.png b/web/public/images/mailchimp.png new file mode 100644 index 00000000..33b423b9 Binary files /dev/null and b/web/public/images/mailchimp.png differ diff --git a/web/public/images/paper.png.png b/web/public/images/paper.png.png new file mode 100644 index 00000000..2b88326f Binary files /dev/null and b/web/public/images/paper.png.png differ diff --git a/web/public/images/rate.png b/web/public/images/rate.png new file mode 100644 index 00000000..7b86c802 Binary files /dev/null and b/web/public/images/rate.png differ diff --git a/web/public/images/shtcut-logo.png b/web/public/images/shtcut-logo.png new file mode 100644 index 00000000..3120a0d5 Binary files /dev/null and b/web/public/images/shtcut-logo.png differ diff --git a/web/public/images/text-arrow.svg.png b/web/public/images/text-arrow.svg.png new file mode 100644 index 00000000..6e1af004 Binary files /dev/null and b/web/public/images/text-arrow.svg.png differ diff --git a/web/public/images/twitter.png b/web/public/images/twitter.png new file mode 100644 index 00000000..8f1c12eb Binary files /dev/null and b/web/public/images/twitter.png differ diff --git a/web/public/images/user.png.png b/web/public/images/user.png.png new file mode 100644 index 00000000..c6e65d27 Binary files /dev/null and b/web/public/images/user.png.png differ diff --git a/web/public/images/whitelogo.png b/web/public/images/whitelogo.png new file mode 100644 index 00000000..3ff5da1b Binary files /dev/null and b/web/public/images/whitelogo.png differ diff --git a/web/public/mark-line.png b/web/public/mark-line.png new file mode 100644 index 00000000..b70eb77d Binary files /dev/null and b/web/public/mark-line.png differ diff --git a/web/safelist.txt b/web/safelist.txt index fb304999..1157ba52 100644 --- a/web/safelist.txt +++ b/web/safelist.txt @@ -256,6 +256,7 @@ text-.primary-0 text-.primary-100 text-.primary-200 text-.primary-300 +text-.primary-400 text-.primary-500 text-.primary-700 text-.primary-900 @@ -546,6 +547,7 @@ bg-.primary-0 bg-.primary-100 bg-.primary-200 bg-.primary-300 +bg-.primary-400 bg-.primary-500 bg-.primary-700 bg-.primary-900 @@ -836,6 +838,7 @@ dark:bg-.primary-0 dark:bg-.primary-100 dark:bg-.primary-200 dark:bg-.primary-300 +dark:bg-.primary-400 dark:bg-.primary-500 dark:bg-.primary-700 dark:bg-.primary-900 @@ -1126,6 +1129,7 @@ dark:hover:bg-.primary-0 dark:hover:bg-.primary-100 dark:hover:bg-.primary-200 dark:hover:bg-.primary-300 +dark:hover:bg-.primary-400 dark:hover:bg-.primary-500 dark:hover:bg-.primary-700 dark:hover:bg-.primary-900 @@ -1416,6 +1420,7 @@ dark:active:bg-.primary-0 dark:active:bg-.primary-100 dark:active:bg-.primary-200 dark:active:bg-.primary-300 +dark:active:bg-.primary-400 dark:active:bg-.primary-500 dark:active:bg-.primary-700 dark:active:bg-.primary-900 @@ -1706,6 +1711,7 @@ hover:text-.primary-0 hover:text-.primary-100 hover:text-.primary-200 hover:text-.primary-300 +hover:text-.primary-400 hover:text-.primary-500 hover:text-.primary-700 hover:text-.primary-900 @@ -1996,6 +2002,7 @@ hover:bg-.primary-0 hover:bg-.primary-100 hover:bg-.primary-200 hover:bg-.primary-300 +hover:bg-.primary-400 hover:bg-.primary-500 hover:bg-.primary-700 hover:bg-.primary-900 @@ -2286,6 +2293,7 @@ active:bg-.primary-0 active:bg-.primary-100 active:bg-.primary-200 active:bg-.primary-300 +active:bg-.primary-400 active:bg-.primary-500 active:bg-.primary-700 active:bg-.primary-900 @@ -2576,6 +2584,7 @@ ring-.primary-0 ring-.primary-100 ring-.primary-200 ring-.primary-300 +ring-.primary-400 ring-.primary-500 ring-.primary-700 ring-.primary-900 @@ -2866,6 +2875,7 @@ hover:ring-.primary-0 hover:ring-.primary-100 hover:ring-.primary-200 hover:ring-.primary-300 +hover:ring-.primary-400 hover:ring-.primary-500 hover:ring-.primary-700 hover:ring-.primary-900 @@ -3156,6 +3166,7 @@ focus:ring-.primary-0 focus:ring-.primary-100 focus:ring-.primary-200 focus:ring-.primary-300 +focus:ring-.primary-400 focus:ring-.primary-500 focus:ring-.primary-700 focus:ring-.primary-900 @@ -3446,6 +3457,7 @@ focus-within:ring-.primary-0 focus-within:ring-.primary-100 focus-within:ring-.primary-200 focus-within:ring-.primary-300 +focus-within:ring-.primary-400 focus-within:ring-.primary-500 focus-within:ring-.primary-700 focus-within:ring-.primary-900 @@ -3736,6 +3748,7 @@ border-.primary-0 border-.primary-100 border-.primary-200 border-.primary-300 +border-.primary-400 border-.primary-500 border-.primary-700 border-.primary-900 @@ -4026,6 +4039,7 @@ focus:border-.primary-0 focus:border-.primary-100 focus:border-.primary-200 focus:border-.primary-300 +focus:border-.primary-400 focus:border-.primary-500 focus:border-.primary-700 focus:border-.primary-900 @@ -4316,6 +4330,7 @@ focus-within:border-.primary-0 focus-within:border-.primary-100 focus-within:border-.primary-200 focus-within:border-.primary-300 +focus-within:border-.primary-400 focus-within:border-.primary-500 focus-within:border-.primary-700 focus-within:border-.primary-900 @@ -4606,6 +4621,7 @@ dark:text-.primary-0 dark:text-.primary-100 dark:text-.primary-200 dark:text-.primary-300 +dark:text-.primary-400 dark:text-.primary-500 dark:text-.primary-700 dark:text-.primary-900 @@ -4896,6 +4912,7 @@ dark:hover:text-.primary-0 dark:hover:text-.primary-100 dark:hover:text-.primary-200 dark:hover:text-.primary-300 +dark:hover:text-.primary-400 dark:hover:text-.primary-500 dark:hover:text-.primary-700 dark:hover:text-.primary-900 diff --git a/web/src/_shared/data/index.ts b/web/src/_shared/data/index.ts index 8c4be0fb..ad2e3b24 100644 --- a/web/src/_shared/data/index.ts +++ b/web/src/_shared/data/index.ts @@ -119,3 +119,123 @@ export const PLANS: Plan[] = [ ] } ]; + + +export const featureData = [ + { + id: 1, + title: 'Link Management', + text: 'Users can shorten long url links, customize links with branded domains, edit and options to set expiration dates', + img: '/images/user.png.png' + }, + { + id: 2, + title: 'QR Codes', + text: 'Automatically generate QR codes for shortened links, customize and also track. ', + img: '/images/folder.png.png' + }, + { + id: 3, + title: 'Custom Domains', + text: 'Set up payroll and bonuses for all your employees, and never be late on salaries.', + img: '/images/bulb.png.png' + }, + { + id: 4, + title: 'Analytics', + text: 'Get real-time visibility into every expense and payment, with a neat dashboard.', + img: '/images/paper.png.png' + } +]; + +export const integrationData: IntegrationSectionType[] = [ + { + id: '01.', + title: 'Social Media Platforms', + text: ' Integrate with social media platforms for seamless sharing of shortened links.', + img: ['/images/twitter.png', '/images/instagram.png', '/images/fb.png'] + }, + { + id: '02.', + title: 'Email Marketing Tools', + text: ' Provide integrations with email marketing platforms for link tracking and campaign optimization.', + img: ['/images/mailchimp.png', '/images/rate.png'] + }, + { + id: '03.', + title: 'Analytics Platforms', + text: 'Support integration with analytics platforms for comprehensive performance tracking and reporting.', + img: ['/images/circle.png', '/images/graph.png'] + } +]; + +export const PlanInfo = [ + { + id: 1, + + title: 'Free', + text: 'Ideal for individuals who need quick access to basic features. ', + amt: '$0', + plan: 'Month', + btnText: 'Get Started', + plans: [ + 'Users', + 'Custom domains', + 'Branded links total', + 'Link automation', + 'Redirects', + 'Tracked clicks', + 'Folders', + 'Folders' + ] + }, + { + id: 2, + title: 'Professional', + text: 'Accelerate link creation seamlessly with our features ', + amt: '$20', + plan: 'per user / Month', + btnText: 'Start free trial', + plans: [ + 'All features of free plan', + 'Country targeting', + 'Region targeting', + 'Link expiration by Date', + 'Export raw click data to S3,', + 'Unlimited Sharing', + 'Create teams to collaborate on designs', + 'Unlimited Sharing' + ] + }, + { + id: 3, + + title: 'Enterprise', + text: 'Accelerate link creation seamlessly with our features ', + amt: 'Custom', + plan: '', + btnText: 'Start Free Trial', + plans: [ + 'All features of Pro plan', + 'Multiple teams', + 'SLA of 99.9% uptime', + 'Mobile targeting', + 'Tags for links', + 'SAML Single-Sign-On (SSO)', + 'QR code', + 'Tools & Extensions' + ] + } +]; + +export const manageData = [ + { + name: 'No hidden fees.' + }, + { + name: '100% security. Guaranteed.' + }, + { + name: 'Team Collaboration' + } +]; \ No newline at end of file diff --git a/web/src/app/(app)/url-shorten-er/layout.tsx b/web/src/app/(app)/url-shorten/layout.tsx similarity index 100% rename from web/src/app/(app)/url-shorten-er/layout.tsx rename to web/src/app/(app)/url-shorten/layout.tsx diff --git a/web/src/app/(app)/url-shorten-er/page.tsx b/web/src/app/(app)/url-shorten/page.tsx similarity index 55% rename from web/src/app/(app)/url-shorten-er/page.tsx rename to web/src/app/(app)/url-shorten/page.tsx index e83a9745..73272c8b 100644 --- a/web/src/app/(app)/url-shorten-er/page.tsx +++ b/web/src/app/(app)/url-shorten/page.tsx @@ -1,6 +1,9 @@ 'use client'; -import { ShortNerPageContainer } from '@shtcut/containers/url-shorten-er'; +import ShortNerPageContainer from "@shtcut/containers/url-shorten-er"; + + + export default function Shortener() { return ; diff --git a/web/src/components/framer/animate-div/index.tsx b/web/src/components/framer/animate-div/index.tsx new file mode 100644 index 00000000..a688614d --- /dev/null +++ b/web/src/components/framer/animate-div/index.tsx @@ -0,0 +1,39 @@ +'use client'; + +import React, { useEffect } from 'react'; +import { motion, useAnimation } from 'framer-motion'; +import { useInView } from 'react-intersection-observer'; + +interface AnimatedContainerProps { + children: React.ReactNode; + className?: string; +} + +const AnimatedContainer = ({ children, className }: AnimatedContainerProps) => { + const controls = useAnimation(); + const [ref, inView] = useInView({ triggerOnce: true, threshold: 0.1 }); + + useEffect(() => { + if (inView) { + controls.start('visible'); + } + }, [controls, inView]); + + return ( + + {children} + + ); +}; + +export default AnimatedContainer; diff --git a/web/src/components/framer/swing-div/index.tsx b/web/src/components/framer/swing-div/index.tsx new file mode 100644 index 00000000..ccd204e2 --- /dev/null +++ b/web/src/components/framer/swing-div/index.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import { motion } from 'framer-motion'; + +interface SwingingTextProps { + text: string; + spanClassName?: string; +} + +const SwingingText = ({ text, spanClassName }: SwingingTextProps) => { + const letters = text.split(''); + + const container = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.1 + } + } + }; + + const child = { + hidden: { + opacity: 0, + rotate: -90 + }, + visible: { + opacity: 1, + rotate: 0, + transition: { + type: 'spring', + damping: 12, + stiffness: 100 + } + } + }; + + return ( + + {letters.map((letter, index) => ( + + {letter} + + ))} + + ); +}; + +export default SwingingText; diff --git a/web/src/components/ui/footer/index.tsx b/web/src/components/ui/footer/index.tsx index d74987e1..1cc9bdd3 100644 --- a/web/src/components/ui/footer/index.tsx +++ b/web/src/components/ui/footer/index.tsx @@ -3,12 +3,48 @@ import { Dict } from '@shtcut-ui/react'; import Link from 'next/link'; import { FaGithub } from 'react-icons/fa'; +import { Logo } from '../logo'; +import { FaFacebookF } from 'react-icons/fa'; +import { FaTwitter } from 'react-icons/fa'; +import { AiFillInstagram } from 'react-icons/ai'; +import { FaLinkedinIn } from 'react-icons/fa'; +import { FaYoutube } from 'react-icons/fa'; +import { Mail } from 'lucide-react'; +import { MapPin } from 'lucide-react'; +import { Phone } from 'lucide-react'; type FooterProps = { navs?: Dict[]; }; export const Footer = (props: FooterProps) => { + const iconLink = [ + { + name: 'Facebook', + href: '#', + icon: + }, + { + name: 'Twitter', + href: '#', + icon: + }, + { + name: 'Facebook', + href: '#', + icon: + }, + { + name: 'Facebook', + href: '#', + icon: + }, + { + name: 'Facebook', + href: '#', + icon: + } + ]; const navigation = { product: [ { name: 'Shortener', href: '#' }, @@ -18,80 +54,132 @@ export const Footer = (props: FooterProps) => { { name: 'Roadmap', href: 'https://github.com/Shtcut/shtcut/issues' } ], company: [ - { name: 'Blog', href: '/' }, - { name: 'Security', href: '/' } + { name: 'About', href: '/' }, + { name: 'Contact us', href: '/' }, + { name: 'Careers', href: '/' }, + { name: 'Culture', href: '/' }, + { name: 'Blog', href: '/' } ], - legal: [ - { name: 'Privacy', href: '/privacy' }, - { name: 'Terms', href: '/terms' }, - { name: 'Cookies', href: '/cookies' } + support: [ + { name: 'Getting started', href: '/' }, + { name: 'Help center', href: '/' }, + { name: 'Server status', href: '/' }, + { name: 'Report a bug', href: '/' }, + { name: 'Chat support', href: '/' } + ], + contact: [ + { name: 'contact@company.com', href: '/', icon: }, + { name: '(414) 687 - 5892', href: '/', icon: }, + { name: '794 Mcallister StSan Francisco, 94102', href: '/', icon: } ] }; return ( -