Skip to content

Commit 4e627d3

Browse files
clean up
1 parent 4c2fb13 commit 4e627d3

File tree

12 files changed

+159
-171
lines changed

12 files changed

+159
-171
lines changed

apps/web/src/components/download-button.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { cn } from "@hypr/utils";
2+
23
import { Link } from "@tanstack/react-router";
34

45
export function DownloadButton() {
56
return (
67
<Link
7-
to="/downloads"
8+
to="/download"
89
className={cn([
910
"group px-6 h-12 flex items-center justify-center text-base sm:text-lg",
1011
"bg-linear-to-t from-stone-600 to-stone-500 text-white rounded-full",

apps/web/src/components/github-stars.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { cn } from "@hypr/utils";
2+
23
import { Icon } from "@iconify-icon/react";
34
import { useQuery } from "@tanstack/react-query";
45

apps/web/src/components/social-card.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ export interface SocialCardProps {
88
body: string;
99
url: string;
1010
className?: string;
11-
// Platform-specific metadata
1211
username?: string; // for Twitter
1312
subreddit?: string; // for Reddit
1413
role?: string; // for LinkedIn

apps/web/src/components/testimonial-card.tsx

Lines changed: 0 additions & 22 deletions
This file was deleted.

apps/web/src/components/video-modal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { cn } from "@hypr/utils";
2+
23
import { Icon } from "@iconify-icon/react";
34
import MuxPlayer, { type MuxPlayerRefAttributes } from "@mux/mux-player-react";
45
import { useEffect, useRef } from "react";

apps/web/src/components/video-player.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { cn } from "@hypr/utils";
2+
23
import MuxPlayer, { type MuxPlayerRefAttributes } from "@mux/mux-player-react";
34
import { useEffect, useRef, useState } from "react";
45

@@ -24,9 +25,7 @@ export function VideoPlayer({
2425
useEffect(() => {
2526
if (playerRef.current) {
2627
if (isHovered) {
27-
playerRef.current.play().catch(() => {
28-
// Ignore autoplay errors
29-
});
28+
playerRef.current.play().catch(() => {});
3029
setShowControls(true);
3130
} else {
3231
playerRef.current.pause();
@@ -56,7 +55,6 @@ export function VideoPlayer({
5655
} as React.CSSProperties}
5756
/>
5857

59-
{/* Buttons overlay - slide up from bottom */}
6058
{showButtons && showControls && (
6159
<div
6260
className={cn(

apps/web/src/components/video-thumbnail.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { cn } from "@hypr/utils";
2+
23
import { Icon } from "@iconify-icon/react";
34
import MuxPlayer from "@mux/mux-player-react";
45

@@ -15,7 +16,6 @@ export function VideoThumbnail({
1516
}: VideoThumbnailProps) {
1617
return (
1718
<div className={cn(["relative w-full h-full overflow-hidden group cursor-pointer", className])} onClick={onPlay}>
18-
{/* Static thumbnail from Mux */}
1919
<MuxPlayer
2020
playbackId={playbackId}
2121
muted
@@ -27,7 +27,6 @@ export function VideoThumbnail({
2727
} as React.CSSProperties}
2828
/>
2929

30-
{/* Overlay with play button */}
3130
<div className="absolute inset-0 bg-black/20 group-hover:bg-black/30 transition-all duration-200 flex items-center justify-center">
3231
<button
3332
onClick={(e) => {

apps/web/src/routeTree.gen.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { Route as ViewIndexRouteImport } from './routes/_view/index'
1616
import { Route as WebhookStripeRouteImport } from './routes/webhook/stripe'
1717
import { Route as WebhookNangoRouteImport } from './routes/webhook/nango'
1818
import { Route as ViewPricingRouteImport } from './routes/_view/pricing'
19-
import { Route as ViewDownloadsRouteImport } from './routes/_view/downloads'
19+
import { Route as ViewDownloadRouteImport } from './routes/_view/download'
2020
import { Route as ViewAppRouteRouteImport } from './routes/_view/app/route'
2121
import { Route as ViewChangelogIndexRouteImport } from './routes/_view/changelog/index'
2222
import { Route as ViewBlogIndexRouteImport } from './routes/_view/blog/index'
@@ -63,9 +63,9 @@ const ViewPricingRoute = ViewPricingRouteImport.update({
6363
path: '/pricing',
6464
getParentRoute: () => ViewRouteRoute,
6565
} as any)
66-
const ViewDownloadsRoute = ViewDownloadsRouteImport.update({
67-
id: '/downloads',
68-
path: '/downloads',
66+
const ViewDownloadRoute = ViewDownloadRouteImport.update({
67+
id: '/download',
68+
path: '/download',
6969
getParentRoute: () => ViewRouteRoute,
7070
} as any)
7171
const ViewAppRouteRoute = ViewAppRouteRouteImport.update({
@@ -128,7 +128,7 @@ export interface FileRoutesByFullPath {
128128
'/auth': typeof AuthRoute
129129
'/cal': typeof CalRoute
130130
'/app': typeof ViewAppRouteRouteWithChildren
131-
'/downloads': typeof ViewDownloadsRoute
131+
'/download': typeof ViewDownloadRoute
132132
'/pricing': typeof ViewPricingRoute
133133
'/webhook/nango': typeof WebhookNangoRoute
134134
'/webhook/stripe': typeof WebhookStripeRoute
@@ -147,7 +147,7 @@ export interface FileRoutesByFullPath {
147147
export interface FileRoutesByTo {
148148
'/auth': typeof AuthRoute
149149
'/cal': typeof CalRoute
150-
'/downloads': typeof ViewDownloadsRoute
150+
'/download': typeof ViewDownloadRoute
151151
'/pricing': typeof ViewPricingRoute
152152
'/webhook/nango': typeof WebhookNangoRoute
153153
'/webhook/stripe': typeof WebhookStripeRoute
@@ -169,7 +169,7 @@ export interface FileRoutesById {
169169
'/auth': typeof AuthRoute
170170
'/cal': typeof CalRoute
171171
'/_view/app': typeof ViewAppRouteRouteWithChildren
172-
'/_view/downloads': typeof ViewDownloadsRoute
172+
'/_view/download': typeof ViewDownloadRoute
173173
'/_view/pricing': typeof ViewPricingRoute
174174
'/webhook/nango': typeof WebhookNangoRoute
175175
'/webhook/stripe': typeof WebhookStripeRoute
@@ -191,7 +191,7 @@ export interface FileRouteTypes {
191191
| '/auth'
192192
| '/cal'
193193
| '/app'
194-
| '/downloads'
194+
| '/download'
195195
| '/pricing'
196196
| '/webhook/nango'
197197
| '/webhook/stripe'
@@ -210,7 +210,7 @@ export interface FileRouteTypes {
210210
to:
211211
| '/auth'
212212
| '/cal'
213-
| '/downloads'
213+
| '/download'
214214
| '/pricing'
215215
| '/webhook/nango'
216216
| '/webhook/stripe'
@@ -231,7 +231,7 @@ export interface FileRouteTypes {
231231
| '/auth'
232232
| '/cal'
233233
| '/_view/app'
234-
| '/_view/downloads'
234+
| '/_view/download'
235235
| '/_view/pricing'
236236
| '/webhook/nango'
237237
| '/webhook/stripe'
@@ -309,11 +309,11 @@ declare module '@tanstack/react-router' {
309309
preLoaderRoute: typeof ViewPricingRouteImport
310310
parentRoute: typeof ViewRouteRoute
311311
}
312-
'/_view/downloads': {
313-
id: '/_view/downloads'
314-
path: '/downloads'
315-
fullPath: '/downloads'
316-
preLoaderRoute: typeof ViewDownloadsRouteImport
312+
'/_view/download': {
313+
id: '/_view/download'
314+
path: '/download'
315+
fullPath: '/download'
316+
preLoaderRoute: typeof ViewDownloadRouteImport
317317
parentRoute: typeof ViewRouteRoute
318318
}
319319
'/_view/app': {
@@ -414,7 +414,7 @@ const ViewAppRouteRouteWithChildren = ViewAppRouteRoute._addFileChildren(
414414

415415
interface ViewRouteRouteChildren {
416416
ViewAppRouteRoute: typeof ViewAppRouteRouteWithChildren
417-
ViewDownloadsRoute: typeof ViewDownloadsRoute
417+
ViewDownloadRoute: typeof ViewDownloadRoute
418418
ViewPricingRoute: typeof ViewPricingRoute
419419
ViewIndexRoute: typeof ViewIndexRoute
420420
ViewBlogSlugRoute: typeof ViewBlogSlugRoute
@@ -426,7 +426,7 @@ interface ViewRouteRouteChildren {
426426

427427
const ViewRouteRouteChildren: ViewRouteRouteChildren = {
428428
ViewAppRouteRoute: ViewAppRouteRouteWithChildren,
429-
ViewDownloadsRoute: ViewDownloadsRoute,
429+
ViewDownloadRoute: ViewDownloadRoute,
430430
ViewPricingRoute: ViewPricingRoute,
431431
ViewIndexRoute: ViewIndexRoute,
432432
ViewBlogSlugRoute: ViewBlogSlugRoute,

apps/web/src/routes/_view/app/account.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ function Component() {
2323
</div>
2424

2525
<div className="mt-8 space-y-6 px-4 pb-20 max-w-4xl mx-auto">
26-
{/* Profile Info Section */}
2726
<section>
2827
<h2 className="text-lg font-medium mb-4 font-serif">Profile info</h2>
2928
<div className="space-y-2">
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import { cn } from "@hypr/utils";
2+
3+
import { Icon } from "@iconify-icon/react";
4+
import { createFileRoute } from "@tanstack/react-router";
5+
6+
export const Route = createFileRoute("/_view/download")({
7+
component: Component,
8+
});
9+
10+
function Component() {
11+
return (
12+
<div className="bg-linear-to-b from-white via-blue-50/20 to-white min-h-screen">
13+
<div
14+
className={cn([
15+
"flex items-center justify-center gap-2 text-center",
16+
"bg-stone-50/70 border-b border-stone-100",
17+
"py-3 px-4",
18+
"font-serif text-sm text-stone-700",
19+
])}
20+
>
21+
<Icon icon="mdi:information-outline" className="text-base" />
22+
<span>
23+
Mac (Apple Silicon) features on-device speech-to-text. Other platforms coming soon without on-device
24+
processing.
25+
</span>
26+
</div>
27+
28+
<div className="max-w-6xl mx-auto px-4 sm:px-6 py-12">
29+
<section className="py-16">
30+
<div className="space-y-6 max-w-2xl mx-auto text-center mb-16">
31+
<h1 className="text-4xl sm:text-5xl font-serif tracking-tight text-stone-600">
32+
Download Hyprnote
33+
</h1>
34+
<p className="text-lg sm:text-xl text-neutral-600">
35+
Choose your platform to get started with Hyprnote
36+
</p>
37+
</div>
38+
39+
<div className="mb-16">
40+
<h2 className="text-2xl font-serif tracking-tight mb-6 text-center">
41+
Desktop
42+
</h2>
43+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
44+
<DownloadCard
45+
iconName="simple-icons:apple"
46+
spec="macOS 14.2+ (Apple Silicon)"
47+
downloadUrl="#"
48+
available={true}
49+
/>
50+
<DownloadCard
51+
iconName="simple-icons:apple"
52+
spec="macOS 14.2+ (Intel)"
53+
downloadUrl="#"
54+
available={false}
55+
/>
56+
<DownloadCard
57+
iconName="simple-icons:windows"
58+
spec="Windows 10+"
59+
downloadUrl="#"
60+
available={false}
61+
/>
62+
<DownloadCard
63+
iconName="simple-icons:linux"
64+
spec="Ubuntu, Debian"
65+
downloadUrl="#"
66+
available={false}
67+
/>
68+
</div>
69+
</div>
70+
71+
<div>
72+
<h2 className="text-2xl font-serif tracking-tight mb-6 text-center">
73+
Mobile
74+
</h2>
75+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 max-w-2xl mx-auto">
76+
<DownloadCard
77+
iconName="simple-icons:ios"
78+
spec="iOS 15+"
79+
downloadUrl="#"
80+
available={false}
81+
/>
82+
<DownloadCard
83+
iconName="simple-icons:android"
84+
spec="Android 10+"
85+
downloadUrl="#"
86+
available={false}
87+
/>
88+
</div>
89+
</div>
90+
</section>
91+
</div>
92+
</div>
93+
);
94+
}
95+
96+
function DownloadCard({
97+
iconName,
98+
spec,
99+
downloadUrl,
100+
available,
101+
}: {
102+
iconName: string;
103+
spec: string;
104+
downloadUrl: string;
105+
available: boolean;
106+
}) {
107+
return (
108+
<div className="flex flex-col items-center p-6 rounded-xl border border-neutral-100 bg-white hover:bg-stone-50 transition-all duration-200">
109+
<Icon icon={iconName} className="text-5xl text-neutral-700 mb-4" />
110+
<p className="text-sm text-neutral-600 mb-6 text-center">{spec}</p>
111+
112+
{available
113+
? (
114+
<a
115+
href={downloadUrl}
116+
className="group w-full px-4 h-11 flex items-center justify-center bg-linear-to-t from-stone-600 to-stone-500 text-white rounded-full shadow-md hover:shadow-lg hover:scale-[102%] active:scale-[98%] transition-all text-base font-medium"
117+
>
118+
Download
119+
<Icon
120+
icon="ph:arrow-circle-right"
121+
className="text-xl ml-2 group-hover:translate-x-1 transition-transform"
122+
/>
123+
</a>
124+
)
125+
: (
126+
<button
127+
disabled
128+
className="w-full px-4 h-11 bg-neutral-100 text-neutral-400 rounded-full font-medium cursor-not-allowed"
129+
>
130+
Coming Soon
131+
</button>
132+
)}
133+
</div>
134+
);
135+
}

0 commit comments

Comments
 (0)