diff --git a/apps/web/src/components/header.tsx b/apps/web/src/components/header.tsx index f4baa6e2f2..92796c776d 100644 --- a/apps/web/src/components/header.tsx +++ b/apps/web/src/components/header.tsx @@ -32,7 +32,7 @@ function getMaxWidthClass(pathname: string): string { const featuresList = [ { to: "/product/ai-notetaking", label: "AI Notetaking" }, { to: "/product/search", label: "Searchable Notes" }, - { to: "/gallery/templates", label: "Custom Templates" }, + { to: "/product/templates", label: "Custom Templates" }, { to: "/product/markdown", label: "Markdown Files" }, { to: "/product/flexible-ai", label: "Flexible AI" }, { to: "/opensource", label: "Open Source" }, @@ -46,7 +46,7 @@ const solutionsList = [ const resourcesList = [ { to: "/blog/", label: "Blog" }, - { to: "/gallery/templates", label: "Meeting Templates" }, + { to: "/product/templates", label: "Meeting Templates" }, { to: "/changelog/", label: "Changelog" }, { to: "/roadmap/", label: "Roadmap" }, { to: "/company-handbook/", label: "Company Handbook" }, diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index 297434c920..c7666eb88c 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -84,6 +84,7 @@ import { Route as ViewSolutionConsultingRouteImport } from './routes/_view/solut import { Route as ViewSolutionCoachingRouteImport } from './routes/_view/solution/coaching' import { Route as ViewShortcutsSlugRouteImport } from './routes/_view/shortcuts/$slug' import { Route as ViewRoadmapSlugRouteImport } from './routes/_view/roadmap/$slug' +import { Route as ViewProductTemplatesRouteImport } from './routes/_view/product/templates' import { Route as ViewProductSelfHostingRouteImport } from './routes/_view/product/self-hosting' import { Route as ViewProductSearchRouteImport } from './routes/_view/product/search' import { Route as ViewProductNotepadRouteImport } from './routes/_view/product/notepad' @@ -524,6 +525,11 @@ const ViewRoadmapSlugRoute = ViewRoadmapSlugRouteImport.update({ path: '/roadmap/$slug', getParentRoute: () => ViewRouteRoute, } as any) +const ViewProductTemplatesRoute = ViewProductTemplatesRouteImport.update({ + id: '/product/templates', + path: '/product/templates', + getParentRoute: () => ViewRouteRoute, +} as any) const ViewProductSelfHostingRoute = ViewProductSelfHostingRouteImport.update({ id: '/product/self-hosting', path: '/product/self-hosting', @@ -894,6 +900,7 @@ export interface FileRoutesByFullPath { '/product/notepad': typeof ViewProductNotepadRoute '/product/search': typeof ViewProductSearchRoute '/product/self-hosting': typeof ViewProductSelfHostingRoute + '/product/templates': typeof ViewProductTemplatesRoute '/roadmap/$slug': typeof ViewRoadmapSlugRoute '/shortcuts/$slug': typeof ViewShortcutsSlugRoute '/solution/coaching': typeof ViewSolutionCoachingRoute @@ -1024,6 +1031,7 @@ export interface FileRoutesByTo { '/product/notepad': typeof ViewProductNotepadRoute '/product/search': typeof ViewProductSearchRoute '/product/self-hosting': typeof ViewProductSelfHostingRoute + '/product/templates': typeof ViewProductTemplatesRoute '/roadmap/$slug': typeof ViewRoadmapSlugRoute '/shortcuts/$slug': typeof ViewShortcutsSlugRoute '/solution/coaching': typeof ViewSolutionCoachingRoute @@ -1160,6 +1168,7 @@ export interface FileRoutesById { '/_view/product/notepad': typeof ViewProductNotepadRoute '/_view/product/search': typeof ViewProductSearchRoute '/_view/product/self-hosting': typeof ViewProductSelfHostingRoute + '/_view/product/templates': typeof ViewProductTemplatesRoute '/_view/roadmap/$slug': typeof ViewRoadmapSlugRoute '/_view/shortcuts/$slug': typeof ViewShortcutsSlugRoute '/_view/solution/coaching': typeof ViewSolutionCoachingRoute @@ -1296,6 +1305,7 @@ export interface FileRouteTypes { | '/product/notepad' | '/product/search' | '/product/self-hosting' + | '/product/templates' | '/roadmap/$slug' | '/shortcuts/$slug' | '/solution/coaching' @@ -1426,6 +1436,7 @@ export interface FileRouteTypes { | '/product/notepad' | '/product/search' | '/product/self-hosting' + | '/product/templates' | '/roadmap/$slug' | '/shortcuts/$slug' | '/solution/coaching' @@ -1561,6 +1572,7 @@ export interface FileRouteTypes { | '/_view/product/notepad' | '/_view/product/search' | '/_view/product/self-hosting' + | '/_view/product/templates' | '/_view/roadmap/$slug' | '/_view/shortcuts/$slug' | '/_view/solution/coaching' @@ -2203,6 +2215,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ViewRoadmapSlugRouteImport parentRoute: typeof ViewRouteRoute } + '/_view/product/templates': { + id: '/_view/product/templates' + path: '/product/templates' + fullPath: '/product/templates' + preLoaderRoute: typeof ViewProductTemplatesRouteImport + parentRoute: typeof ViewRouteRoute + } '/_view/product/self-hosting': { id: '/_view/product/self-hosting' path: '/product/self-hosting' @@ -2705,6 +2724,7 @@ interface ViewRouteRouteChildren { ViewProductNotepadRoute: typeof ViewProductNotepadRoute ViewProductSearchRoute: typeof ViewProductSearchRoute ViewProductSelfHostingRoute: typeof ViewProductSelfHostingRoute + ViewProductTemplatesRoute: typeof ViewProductTemplatesRoute ViewRoadmapSlugRoute: typeof ViewRoadmapSlugRoute ViewShortcutsSlugRoute: typeof ViewShortcutsSlugRoute ViewSolutionCoachingRoute: typeof ViewSolutionCoachingRoute @@ -2784,6 +2804,7 @@ const ViewRouteRouteChildren: ViewRouteRouteChildren = { ViewProductNotepadRoute: ViewProductNotepadRoute, ViewProductSearchRoute: ViewProductSearchRoute, ViewProductSelfHostingRoute: ViewProductSelfHostingRoute, + ViewProductTemplatesRoute: ViewProductTemplatesRoute, ViewRoadmapSlugRoute: ViewRoadmapSlugRoute, ViewShortcutsSlugRoute: ViewShortcutsSlugRoute, ViewSolutionCoachingRoute: ViewSolutionCoachingRoute, diff --git a/apps/web/src/routes/_view/product/templates.tsx b/apps/web/src/routes/_view/product/templates.tsx new file mode 100644 index 0000000000..895216fb17 --- /dev/null +++ b/apps/web/src/routes/_view/product/templates.tsx @@ -0,0 +1,203 @@ +import { createFileRoute, Link } from "@tanstack/react-router"; +import { allTemplates } from "content-collections"; + +import { cn } from "@hypr/utils"; + +import { DownloadButton } from "@/components/download-button"; +import { SlashSeparator } from "@/components/slash-separator"; + +export const Route = createFileRoute("/_view/product/templates")({ + component: Component, + head: () => ({ + meta: [ + { title: "Custom Templates - Hyprnote" }, + { + name: "description", + content: + "Pick or build a template for your recurring meetings and get perfectly formatted notes automatically. Pre-built and custom templates for every meeting type.", + }, + { + property: "og:title", + content: "Custom Templates - Hyprnote", + }, + { + property: "og:description", + content: + "Pick or build a template for your recurring meetings and get perfectly formatted notes automatically.", + }, + { property: "og:type", content: "website" }, + { + property: "og:url", + content: "https://hyprnote.com/product/templates", + }, + ], + }), +}); + +function Component() { + return ( +
+ Pick (or build) a template for your recurring meetings and get + perfectly formatted notes automatically. +
++ You can pick a template before your meeting or try different formats + later. +
+ ++ Pre-built templates for common meeting types. Discovery calls, + sprint planning, 1-on-1s, technical reviews — just pick one and + use it. +
++ {template.category} +
++ Build templates that match your exact workflow. Store them + locally. Use them whenever you need. +
++ Download Hyprnote and set up your first template in 30 seconds. +
++ Free to use. No credit card required. +
+