diff --git a/apps/web/public/static.gif b/apps/web/public/static.gif deleted file mode 100644 index 5329fc62c0..0000000000 Binary files a/apps/web/public/static.gif and /dev/null differ diff --git a/apps/web/public/static.webp b/apps/web/public/static.webp new file mode 100644 index 0000000000..7ab543971f Binary files /dev/null and b/apps/web/public/static.webp differ diff --git a/apps/web/src/components/download-button.tsx b/apps/web/src/components/download-button.tsx index 8f5b5d8ba7..854efa9ccf 100644 --- a/apps/web/src/components/download-button.tsx +++ b/apps/web/src/components/download-button.tsx @@ -1,12 +1,12 @@ import { cn } from "@hypr/utils"; import { Icon } from "@iconify-icon/react"; -import { Link } from "@tanstack/react-router"; export function DownloadButton() { return ( - Download for Mac - + ); } diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index 3c60aedfbf..d270caa1bf 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -22,16 +22,17 @@ import { Route as ViewIndexRouteImport } from './routes/_view/index' import { Route as WebhookStripeRouteImport } from './routes/webhook/stripe' import { Route as WebhookNangoRouteImport } from './routes/webhook/nango' import { Route as ViewPricingRouteImport } from './routes/_view/pricing' -import { Route as ViewDownloadRouteImport } from './routes/_view/download' import { Route as ViewDocsRouteRouteImport } from './routes/_view/docs/route' import { Route as ViewAppRouteRouteImport } from './routes/_view/app/route' import { Route as ViewProductIndexRouteImport } from './routes/_view/product/index' import { Route as ViewLegalIndexRouteImport } from './routes/_view/legal/index' +import { Route as ViewDownloadIndexRouteImport } from './routes/_view/download/index' import { Route as ViewDocsIndexRouteImport } from './routes/_view/docs/index' import { Route as ViewChangelogIndexRouteImport } from './routes/_view/changelog/index' import { Route as ViewBlogIndexRouteImport } from './routes/_view/blog/index' import { Route as ViewAppIndexRouteImport } from './routes/_view/app/index' import { Route as ViewLegalSlugRouteImport } from './routes/_view/legal/$slug' +import { Route as ViewDownloadAppleSiliconRouteImport } from './routes/_view/download/apple-silicon' import { Route as ViewDocsSlugRouteImport } from './routes/_view/docs/$slug' import { Route as ViewChangelogSlugRouteImport } from './routes/_view/changelog/$slug' import { Route as ViewCallbackAuthRouteImport } from './routes/_view/callback/auth' @@ -103,11 +104,6 @@ const ViewPricingRoute = ViewPricingRouteImport.update({ path: '/pricing', getParentRoute: () => ViewRouteRoute, } as any) -const ViewDownloadRoute = ViewDownloadRouteImport.update({ - id: '/download', - path: '/download', - getParentRoute: () => ViewRouteRoute, -} as any) const ViewDocsRouteRoute = ViewDocsRouteRouteImport.update({ id: '/docs', path: '/docs', @@ -128,6 +124,11 @@ const ViewLegalIndexRoute = ViewLegalIndexRouteImport.update({ path: '/legal/', getParentRoute: () => ViewRouteRoute, } as any) +const ViewDownloadIndexRoute = ViewDownloadIndexRouteImport.update({ + id: '/download/', + path: '/download/', + getParentRoute: () => ViewRouteRoute, +} as any) const ViewDocsIndexRoute = ViewDocsIndexRouteImport.update({ id: '/', path: '/', @@ -153,6 +154,12 @@ const ViewLegalSlugRoute = ViewLegalSlugRouteImport.update({ path: '/legal/$slug', getParentRoute: () => ViewRouteRoute, } as any) +const ViewDownloadAppleSiliconRoute = + ViewDownloadAppleSiliconRouteImport.update({ + id: '/download/apple-silicon', + path: '/download/apple-silicon', + getParentRoute: () => ViewRouteRoute, + } as any) const ViewDocsSlugRoute = ViewDocsSlugRouteImport.update({ id: '/$slug', path: '/$slug', @@ -195,7 +202,6 @@ export interface FileRoutesByFullPath { '/x': typeof XRoute '/app': typeof ViewAppRouteRouteWithChildren '/docs': typeof ViewDocsRouteRouteWithChildren - '/download': typeof ViewDownloadRoute '/pricing': typeof ViewPricingRoute '/webhook/nango': typeof WebhookNangoRoute '/webhook/stripe': typeof WebhookStripeRoute @@ -206,11 +212,13 @@ export interface FileRoutesByFullPath { '/callback/auth': typeof ViewCallbackAuthRoute '/changelog/$slug': typeof ViewChangelogSlugRoute '/docs/$slug': typeof ViewDocsSlugRoute + '/download/apple-silicon': typeof ViewDownloadAppleSiliconRoute '/legal/$slug': typeof ViewLegalSlugRoute '/app/': typeof ViewAppIndexRoute '/blog': typeof ViewBlogIndexRoute '/changelog': typeof ViewChangelogIndexRoute '/docs/': typeof ViewDocsIndexRoute + '/download': typeof ViewDownloadIndexRoute '/legal': typeof ViewLegalIndexRoute '/product': typeof ViewProductIndexRoute } @@ -223,7 +231,6 @@ export interface FileRoutesByTo { '/join-waitlist': typeof JoinWaitlistRoute '/linkedin': typeof LinkedinRoute '/x': typeof XRoute - '/download': typeof ViewDownloadRoute '/pricing': typeof ViewPricingRoute '/webhook/nango': typeof WebhookNangoRoute '/webhook/stripe': typeof WebhookStripeRoute @@ -234,11 +241,13 @@ export interface FileRoutesByTo { '/callback/auth': typeof ViewCallbackAuthRoute '/changelog/$slug': typeof ViewChangelogSlugRoute '/docs/$slug': typeof ViewDocsSlugRoute + '/download/apple-silicon': typeof ViewDownloadAppleSiliconRoute '/legal/$slug': typeof ViewLegalSlugRoute '/app': typeof ViewAppIndexRoute '/blog': typeof ViewBlogIndexRoute '/changelog': typeof ViewChangelogIndexRoute '/docs': typeof ViewDocsIndexRoute + '/download': typeof ViewDownloadIndexRoute '/legal': typeof ViewLegalIndexRoute '/product': typeof ViewProductIndexRoute } @@ -255,7 +264,6 @@ export interface FileRoutesById { '/x': typeof XRoute '/_view/app': typeof ViewAppRouteRouteWithChildren '/_view/docs': typeof ViewDocsRouteRouteWithChildren - '/_view/download': typeof ViewDownloadRoute '/_view/pricing': typeof ViewPricingRoute '/webhook/nango': typeof WebhookNangoRoute '/webhook/stripe': typeof WebhookStripeRoute @@ -266,11 +274,13 @@ export interface FileRoutesById { '/_view/callback/auth': typeof ViewCallbackAuthRoute '/_view/changelog/$slug': typeof ViewChangelogSlugRoute '/_view/docs/$slug': typeof ViewDocsSlugRoute + '/_view/download/apple-silicon': typeof ViewDownloadAppleSiliconRoute '/_view/legal/$slug': typeof ViewLegalSlugRoute '/_view/app/': typeof ViewAppIndexRoute '/_view/blog/': typeof ViewBlogIndexRoute '/_view/changelog/': typeof ViewChangelogIndexRoute '/_view/docs/': typeof ViewDocsIndexRoute + '/_view/download/': typeof ViewDownloadIndexRoute '/_view/legal/': typeof ViewLegalIndexRoute '/_view/product/': typeof ViewProductIndexRoute } @@ -287,7 +297,6 @@ export interface FileRouteTypes { | '/x' | '/app' | '/docs' - | '/download' | '/pricing' | '/webhook/nango' | '/webhook/stripe' @@ -298,11 +307,13 @@ export interface FileRouteTypes { | '/callback/auth' | '/changelog/$slug' | '/docs/$slug' + | '/download/apple-silicon' | '/legal/$slug' | '/app/' | '/blog' | '/changelog' | '/docs/' + | '/download' | '/legal' | '/product' fileRoutesByTo: FileRoutesByTo @@ -315,7 +326,6 @@ export interface FileRouteTypes { | '/join-waitlist' | '/linkedin' | '/x' - | '/download' | '/pricing' | '/webhook/nango' | '/webhook/stripe' @@ -326,11 +336,13 @@ export interface FileRouteTypes { | '/callback/auth' | '/changelog/$slug' | '/docs/$slug' + | '/download/apple-silicon' | '/legal/$slug' | '/app' | '/blog' | '/changelog' | '/docs' + | '/download' | '/legal' | '/product' id: @@ -346,7 +358,6 @@ export interface FileRouteTypes { | '/x' | '/_view/app' | '/_view/docs' - | '/_view/download' | '/_view/pricing' | '/webhook/nango' | '/webhook/stripe' @@ -357,11 +368,13 @@ export interface FileRouteTypes { | '/_view/callback/auth' | '/_view/changelog/$slug' | '/_view/docs/$slug' + | '/_view/download/apple-silicon' | '/_view/legal/$slug' | '/_view/app/' | '/_view/blog/' | '/_view/changelog/' | '/_view/docs/' + | '/_view/download/' | '/_view/legal/' | '/_view/product/' fileRoutesById: FileRoutesById @@ -473,13 +486,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ViewPricingRouteImport parentRoute: typeof ViewRouteRoute } - '/_view/download': { - id: '/_view/download' - path: '/download' - fullPath: '/download' - preLoaderRoute: typeof ViewDownloadRouteImport - parentRoute: typeof ViewRouteRoute - } '/_view/docs': { id: '/_view/docs' path: '/docs' @@ -508,6 +514,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ViewLegalIndexRouteImport parentRoute: typeof ViewRouteRoute } + '/_view/download/': { + id: '/_view/download/' + path: '/download' + fullPath: '/download' + preLoaderRoute: typeof ViewDownloadIndexRouteImport + parentRoute: typeof ViewRouteRoute + } '/_view/docs/': { id: '/_view/docs/' path: '/' @@ -543,6 +556,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ViewLegalSlugRouteImport parentRoute: typeof ViewRouteRoute } + '/_view/download/apple-silicon': { + id: '/_view/download/apple-silicon' + path: '/download/apple-silicon' + fullPath: '/download/apple-silicon' + preLoaderRoute: typeof ViewDownloadAppleSiliconRouteImport + parentRoute: typeof ViewRouteRoute + } '/_view/docs/$slug': { id: '/_view/docs/$slug' path: '/$slug' @@ -621,15 +641,16 @@ const ViewDocsRouteRouteWithChildren = ViewDocsRouteRoute._addFileChildren( interface ViewRouteRouteChildren { ViewAppRouteRoute: typeof ViewAppRouteRouteWithChildren ViewDocsRouteRoute: typeof ViewDocsRouteRouteWithChildren - ViewDownloadRoute: typeof ViewDownloadRoute ViewPricingRoute: typeof ViewPricingRoute ViewIndexRoute: typeof ViewIndexRoute ViewBlogSlugRoute: typeof ViewBlogSlugRoute ViewCallbackAuthRoute: typeof ViewCallbackAuthRoute ViewChangelogSlugRoute: typeof ViewChangelogSlugRoute + ViewDownloadAppleSiliconRoute: typeof ViewDownloadAppleSiliconRoute ViewLegalSlugRoute: typeof ViewLegalSlugRoute ViewBlogIndexRoute: typeof ViewBlogIndexRoute ViewChangelogIndexRoute: typeof ViewChangelogIndexRoute + ViewDownloadIndexRoute: typeof ViewDownloadIndexRoute ViewLegalIndexRoute: typeof ViewLegalIndexRoute ViewProductIndexRoute: typeof ViewProductIndexRoute } @@ -637,15 +658,16 @@ interface ViewRouteRouteChildren { const ViewRouteRouteChildren: ViewRouteRouteChildren = { ViewAppRouteRoute: ViewAppRouteRouteWithChildren, ViewDocsRouteRoute: ViewDocsRouteRouteWithChildren, - ViewDownloadRoute: ViewDownloadRoute, ViewPricingRoute: ViewPricingRoute, ViewIndexRoute: ViewIndexRoute, ViewBlogSlugRoute: ViewBlogSlugRoute, ViewCallbackAuthRoute: ViewCallbackAuthRoute, ViewChangelogSlugRoute: ViewChangelogSlugRoute, + ViewDownloadAppleSiliconRoute: ViewDownloadAppleSiliconRoute, ViewLegalSlugRoute: ViewLegalSlugRoute, ViewBlogIndexRoute: ViewBlogIndexRoute, ViewChangelogIndexRoute: ViewChangelogIndexRoute, + ViewDownloadIndexRoute: ViewDownloadIndexRoute, ViewLegalIndexRoute: ViewLegalIndexRoute, ViewProductIndexRoute: ViewProductIndexRoute, } diff --git a/apps/web/src/routes/_view/download/apple-silicon.tsx b/apps/web/src/routes/_view/download/apple-silicon.tsx new file mode 100644 index 0000000000..5af2f74d6c --- /dev/null +++ b/apps/web/src/routes/_view/download/apple-silicon.tsx @@ -0,0 +1,9 @@ +import { createFileRoute, redirect } from "@tanstack/react-router"; + +export const Route = createFileRoute("/_view/download/apple-silicon")({ + beforeLoad: async () => { + throw redirect({ + href: "https://desktop.hyprnote.com/download/latest/dmg-aarch64?channel=stable", + }); + }, +}); diff --git a/apps/web/src/routes/_view/download.tsx b/apps/web/src/routes/_view/download/index.tsx similarity index 95% rename from apps/web/src/routes/_view/download.tsx rename to apps/web/src/routes/_view/download/index.tsx index beb9b2337e..6e50914d69 100644 --- a/apps/web/src/routes/_view/download.tsx +++ b/apps/web/src/routes/_view/download/index.tsx @@ -3,9 +3,10 @@ import { cn } from "@hypr/utils"; import { Icon } from "@iconify-icon/react"; import { createFileRoute, Link } from "@tanstack/react-router"; +import { Image } from "@/components/image"; import { SlashSeparator } from "@/components/slash-separator"; -export const Route = createFileRoute("/_view/download")({ +export const Route = createFileRoute("/_view/download/")({ component: Component, }); @@ -47,7 +48,7 @@ function Component() { - - - - @@ -124,6 +121,7 @@ function DownloadCard({ ? ( Download @@ -195,9 +193,11 @@ function CTASection() {
- Hyprnote
diff --git a/apps/web/src/routes/_view/index.tsx b/apps/web/src/routes/_view/index.tsx index 1a412eab94..7ed9f87099 100644 --- a/apps/web/src/routes/_view/index.tsx +++ b/apps/web/src/routes/_view/index.tsx @@ -188,9 +188,11 @@ function YCombinatorBanner() { ])} > Backed by - Y Combinator Y Combinator @@ -594,9 +596,11 @@ function FeaturesIntroSection() {
- Hyprnote
@@ -1220,7 +1224,13 @@ function FeaturesDesktopGrid() {
) - : {`${feature.title}} + : ( + {`${feature.title} + )}
@@ -1311,13 +1321,21 @@ function DetailsMobileCarousel({
- {feature.image && ( - {`${feature.title} - )} + {feature.image + ? ( + {`${feature.title} + ) + : ( + {`${feature.title} + )}
@@ -1397,13 +1415,21 @@ function DetailsTabletView({
- {detailsFeatures[selectedDetail].image && ( - {`${detailsFeatures[selectedDetail].title} - )} + {detailsFeatures[selectedDetail].image + ? ( + {`${detailsFeatures[selectedDetail].title} + ) + : ( + {`${detailsFeatures[selectedDetail].title} + )}
@@ -1455,35 +1481,45 @@ function DetailsDesktopView() { onMouseEnter={() => setHoveredDetail(selectedDetail)} onMouseLeave={() => setHoveredDetail(null)} > - {selectedFeature?.image && ( - <> - {`${selectedFeature.title} -
- -
- + {selectedFeature && ( + selectedFeature.image + ? ( + <> + {`${selectedFeature.title} +
+ +
+ + ) + : ( + {`${selectedFeature.title} + ) )}
@@ -1599,11 +1635,10 @@ function BlogSection() {
{article.coverImage && (
- {article.display_title}
)} @@ -1689,9 +1724,11 @@ function CTASection({ heroInputRef }: { heroInputRef: React.RefObject
- Hyprnote
diff --git a/apps/web/src/routes/_view/pricing.tsx b/apps/web/src/routes/_view/pricing.tsx index 3f9e6078bb..7035ca94b8 100644 --- a/apps/web/src/routes/_view/pricing.tsx +++ b/apps/web/src/routes/_view/pricing.tsx @@ -3,6 +3,7 @@ import { cn } from "@hypr/utils"; import { Icon } from "@iconify-icon/react"; import { createFileRoute, Link } from "@tanstack/react-router"; +import { Image } from "@/components/image"; import { SlashSeparator } from "@/components/slash-separator"; export const Route = createFileRoute("/_view/pricing")({ @@ -303,9 +304,11 @@ function CTASection() {
- Hyprnote
diff --git a/apps/web/src/routes/_view/route.tsx b/apps/web/src/routes/_view/route.tsx index be96ce5ccc..d43c6f8f8d 100644 --- a/apps/web/src/routes/_view/route.tsx +++ b/apps/web/src/routes/_view/route.tsx @@ -111,12 +111,13 @@ function Header() { {platformCTA.action === "download" ? ( - {platformCTA.label} - +
) : (