diff --git a/apps/web/content/templates/board-meeting.mdx b/apps/web/content/templates/board-meeting.mdx new file mode 100644 index 0000000000..6154540bcc --- /dev/null +++ b/apps/web/content/templates/board-meeting.mdx @@ -0,0 +1,41 @@ +--- +title: "Board Meeting" +description: "Comprehensive template for board meetings and governance discussions" +sections: + - title: "Company Performance" + description: "Financial and operational updates" + - title: "Strategic Initiatives" + description: "Progress on key strategic priorities" + - title: "Financial Review" + description: "Budget, runway, and financial health" + - title: "Board Decisions" + description: "Resolutions and governance matters" + - title: "Risk & Compliance" + description: "Risk management and compliance updates" + - title: "Next Steps" + description: "Action items and follow-ups" +--- + +## Company Performance + +Key performance metrics, operational updates, and progress against goals. + +## Strategic Initiatives + +Status of major strategic initiatives, milestones achieved, and upcoming priorities. + +## Financial Review + +Financial performance, budget vs. actuals, runway, and significant financial matters. + +## Board Decisions + +Formal resolutions, governance decisions, and approval items requiring board action. + +## Risk & Compliance + +Risk management updates, compliance matters, and mitigation strategies. + +## Next Steps + +Action items for management team, board committees, and individual board members. diff --git a/apps/web/content/templates/brainstorming-session.mdx b/apps/web/content/templates/brainstorming-session.mdx new file mode 100644 index 0000000000..2c95063d41 --- /dev/null +++ b/apps/web/content/templates/brainstorming-session.mdx @@ -0,0 +1,35 @@ +--- +title: "Brainstorming Session" +description: "Template for creative brainstorming and ideation sessions" +sections: + - title: "Session Goal" + description: "What problem or opportunity are we exploring?" + - title: "Ideas Generated" + description: "All ideas captured during brainstorming" + - title: "Promising Concepts" + description: "Ideas worth exploring further" + - title: "Evaluation Criteria" + description: "How we'll assess ideas" + - title: "Next Steps" + description: "Action items to move forward" +--- + +## Session Goal + +The problem we're solving, opportunity we're exploring, or question we're answering. + +## Ideas Generated + +All ideas captured during the brainstorming session, without judgment or filtering. + +## Promising Concepts + +Ideas that seem most promising, interesting, or worth exploring in more detail. + +## Evaluation Criteria + +Criteria for evaluating and prioritizing ideas (feasibility, impact, effort, etc.). + +## Next Steps + +Action items for validating, prototyping, or further developing promising ideas. diff --git a/apps/web/content/templates/client-kickoff.mdx b/apps/web/content/templates/client-kickoff.mdx new file mode 100644 index 0000000000..a484dd87ff --- /dev/null +++ b/apps/web/content/templates/client-kickoff.mdx @@ -0,0 +1,41 @@ +--- +title: "Client Kickoff Meeting" +description: "Template for starting new client engagements and setting expectations" +sections: + - title: "Project Overview" + description: "Scope, objectives, and deliverables" + - title: "Team Introductions" + description: "Roles and responsibilities" + - title: "Timeline & Milestones" + description: "Project schedule and key dates" + - title: "Communication Plan" + description: "Meeting cadence and updates" + - title: "Success Criteria" + description: "How we measure project success" + - title: "Next Steps" + description: "Immediate action items" +--- + +## Project Overview + +Project scope, objectives, key deliverables, and high-level approach. + +## Team Introductions + +Team members from both sides, their roles, and primary points of contact. + +## Timeline & Milestones + +Project timeline, key milestones, important deadlines, and phase breakdown. + +## Communication Plan + +Meeting cadence, status update frequency, escalation process, and communication channels. + +## Success Criteria + +Clear definition of project success, acceptance criteria, and quality standards. + +## Next Steps + +Immediate action items, required information from client, and next meeting schedule. diff --git a/apps/web/content/templates/customer-discovery.mdx b/apps/web/content/templates/customer-discovery.mdx new file mode 100644 index 0000000000..b0d059f34f --- /dev/null +++ b/apps/web/content/templates/customer-discovery.mdx @@ -0,0 +1,41 @@ +--- +title: "Customer Discovery Interview" +description: "Template for conducting customer discovery and user research interviews" +sections: + - title: "Background" + description: "Customer context and background" + - title: "Current Process" + description: "How they currently solve the problem" + - title: "Pain Points" + description: "Challenges and frustrations" + - title: "Needs & Goals" + description: "What they're trying to achieve" + - title: "Feedback on Solution" + description: "Reactions to proposed solution" + - title: "Key Insights" + description: "Main takeaways and learnings" +--- + +## Background + +Customer role, company, and relevant context about their situation. + +## Current Process + +How they currently solve the problem or perform the task today. + +## Pain Points + +Key challenges, frustrations, and problems they encounter with current solutions. + +## Needs & Goals + +What they're ultimately trying to achieve and success criteria. + +## Feedback on Solution + +Their reactions, thoughts, and feedback on our proposed solution or prototype. + +## Key Insights + +Most important takeaways, quotes, and insights to inform product decisions. diff --git a/apps/web/content/templates/daily-standup.mdx b/apps/web/content/templates/daily-standup.mdx new file mode 100644 index 0000000000..604e6459f8 --- /dev/null +++ b/apps/web/content/templates/daily-standup.mdx @@ -0,0 +1,29 @@ +--- +title: "Daily Standup" +description: "Quick daily sync template for agile teams to share progress and blockers" +sections: + - title: "Yesterday's Accomplishments" + description: "What did you complete yesterday?" + - title: "Today's Plan" + description: "What are you working on today?" + - title: "Blockers" + description: "Any obstacles or help needed?" + - title: "Team Updates" + description: "Important announcements or information" +--- + +## Yesterday's Accomplishments + +What each team member completed yesterday and key progress made. + +## Today's Plan + +What each team member is focusing on today and priorities for the day. + +## Blockers + +Any obstacles, dependencies, or areas where help is needed. + +## Team Updates + +Important announcements, reminders, or information relevant to the team. diff --git a/apps/web/content/templates/executive-briefing.mdx b/apps/web/content/templates/executive-briefing.mdx new file mode 100644 index 0000000000..332f2e3848 --- /dev/null +++ b/apps/web/content/templates/executive-briefing.mdx @@ -0,0 +1,41 @@ +--- +title: "Executive Briefing" +description: "Template for executives to capture high-level strategic discussions and decisions" +sections: + - title: "Strategic Overview" + description: "High-level context and objectives" + - title: "Key Metrics" + description: "Performance indicators and trends" + - title: "Major Decisions" + description: "Strategic decisions and rationale" + - title: "Resource Allocation" + description: "Budget and resource commitments" + - title: "Risks & Opportunities" + description: "Strategic risks and growth opportunities" + - title: "Action Items" + description: "Executive-level follow-ups" +--- + +## Strategic Overview + +High-level context, strategic objectives, and key topics discussed. + +## Key Metrics + +Important performance indicators, business metrics, and trends requiring attention. + +## Major Decisions + +Strategic decisions made, rationale behind them, and expected impact. + +## Resource Allocation + +Budget decisions, headcount plans, and major resource commitments. + +## Risks & Opportunities + +Strategic risks to monitor and growth opportunities to pursue. + +## Action Items + +High-priority action items with executive ownership and expected timelines. diff --git a/apps/web/content/templates/incident-postmortem.mdx b/apps/web/content/templates/incident-postmortem.mdx new file mode 100644 index 0000000000..ecca2cd177 --- /dev/null +++ b/apps/web/content/templates/incident-postmortem.mdx @@ -0,0 +1,47 @@ +--- +title: "Incident Postmortem" +description: "Template for conducting blameless postmortems after incidents or outages" +sections: + - title: "Incident Summary" + description: "What happened and when" + - title: "Timeline of Events" + description: "Chronological sequence of events" + - title: "Root Cause Analysis" + description: "What caused the incident" + - title: "Impact Assessment" + description: "Effect on users and business" + - title: "Response & Resolution" + description: "How the incident was resolved" + - title: "Lessons Learned" + description: "Key takeaways and insights" + - title: "Action Items" + description: "Preventive measures and improvements" +--- + +## Incident Summary + +Brief description of the incident, affected systems, and duration. + +## Timeline of Events + +Chronological sequence of what happened, from detection to resolution. + +## Root Cause Analysis + +Technical root cause, contributing factors, and why detection/prevention failed. + +## Impact Assessment + +User impact, business impact, affected customers, and financial implications. + +## Response & Resolution + +How the incident was detected, escalated, debugged, and ultimately resolved. + +## Lessons Learned + +What went well, what didn't, and key insights from the incident. + +## Action Items + +Specific improvements to prevent recurrence, improve detection, or speed up response. diff --git a/apps/web/content/templates/investor-pitch.mdx b/apps/web/content/templates/investor-pitch.mdx new file mode 100644 index 0000000000..b11ece0c20 --- /dev/null +++ b/apps/web/content/templates/investor-pitch.mdx @@ -0,0 +1,41 @@ +--- +title: "Investor Pitch Meeting" +description: "Template for founders pitching to investors and VCs" +sections: + - title: "Meeting Context" + description: "Investor background and meeting purpose" + - title: "Pitch Summary" + description: "Key points presented" + - title: "Questions Asked" + description: "Investor questions and concerns" + - title: "Feedback Received" + description: "Investor reactions and feedback" + - title: "Investment Interest" + description: "Level of interest and next steps" + - title: "Follow-up Items" + description: "Information requested and action items" +--- + +## Meeting Context + +Investor name, firm, stage focus, and context for the meeting. + +## Pitch Summary + +Key points presented about the problem, solution, market, traction, and ask. + +## Questions Asked + +All questions the investor asked about the business, market, team, or metrics. + +## Feedback Received + +Investor's reactions, concerns, enthusiasm, and specific feedback on the pitch. + +## Investment Interest + +Investor's level of interest, potential fit, and likelihood of investment. + +## Follow-up Items + +Information or materials requested, additional meetings scheduled, and next steps. diff --git a/apps/web/content/templates/lecture-notes.mdx b/apps/web/content/templates/lecture-notes.mdx new file mode 100644 index 0000000000..605e56eba9 --- /dev/null +++ b/apps/web/content/templates/lecture-notes.mdx @@ -0,0 +1,41 @@ +--- +title: "Lecture Notes" +description: "Template for students to capture and organize lecture content" +sections: + - title: "Lecture Information" + description: "Course, date, and topic" + - title: "Key Concepts" + description: "Main ideas and theories covered" + - title: "Important Definitions" + description: "Terms and definitions to remember" + - title: "Examples & Applications" + description: "Examples and real-world applications" + - title: "Questions & Clarifications" + description: "Items to follow up on" + - title: "Action Items" + description: "Homework and next steps" +--- + +## Lecture Information + +Course name, professor, date, lecture number, and main topic covered. + +## Key Concepts + +Main ideas, theories, principles, and concepts discussed in the lecture. + +## Important Definitions + +Key terms, definitions, formulas, and concepts to memorize. + +## Examples & Applications + +Examples given, case studies discussed, and practical applications of concepts. + +## Questions & Clarifications + +Points that need clarification, questions to ask, and areas requiring more study. + +## Action Items + +Assigned homework, readings, projects, and preparation for next lecture. diff --git a/apps/web/content/templates/performance-review.mdx b/apps/web/content/templates/performance-review.mdx new file mode 100644 index 0000000000..0871573cf0 --- /dev/null +++ b/apps/web/content/templates/performance-review.mdx @@ -0,0 +1,41 @@ +--- +title: "Performance Review" +description: "Template for conducting employee performance reviews and career development discussions" +sections: + - title: "Review Period Summary" + description: "Overview of the review period" + - title: "Key Accomplishments" + description: "Major achievements and contributions" + - title: "Areas of Strength" + description: "Skills and behaviors to continue" + - title: "Areas for Development" + description: "Growth opportunities and improvements" + - title: "Career Goals" + description: "Career aspirations and development path" + - title: "Action Plan" + description: "Development goals and next steps" +--- + +## Review Period Summary + +Overview of the review period, role responsibilities, and context for evaluation. + +## Key Accomplishments + +Major achievements, successful projects, and significant contributions during the period. + +## Areas of Strength + +Skills, behaviors, and competencies where the employee excels. + +## Areas for Development + +Opportunities for growth, skills to develop, and areas for improvement. + +## Career Goals + +Employee's career aspirations, interests, and long-term development objectives. + +## Action Plan + +Specific development goals, learning opportunities, and action items with timelines. diff --git a/apps/web/content/templates/product-roadmap-review.mdx b/apps/web/content/templates/product-roadmap-review.mdx new file mode 100644 index 0000000000..70222133c9 --- /dev/null +++ b/apps/web/content/templates/product-roadmap-review.mdx @@ -0,0 +1,41 @@ +--- +title: "Product Roadmap Review" +description: "Template for product managers to review and align on product roadmap priorities" +sections: + - title: "Current Status" + description: "Progress on in-flight initiatives" + - title: "Upcoming Features" + description: "Next quarter priorities and timeline" + - title: "Customer Feedback" + description: "Key insights from users and customers" + - title: "Success Metrics" + description: "KPIs and measurement approach" + - title: "Resource Allocation" + description: "Team assignments and capacity" + - title: "Decisions Made" + description: "Key decisions and trade-offs" +--- + +## Current Status + +Progress update on current initiatives, features in development, and recent launches. + +## Upcoming Features + +Prioritized features for the next quarter with estimated timelines and dependencies. + +## Customer Feedback + +Summary of customer requests, pain points, and feature requests driving prioritization. + +## Success Metrics + +Key performance indicators, success criteria, and how we'll measure impact. + +## Resource Allocation + +Team capacity, resource needs, and allocation across different initiatives. + +## Decisions Made + +Key product decisions, trade-offs considered, and rationale behind priorities. diff --git a/apps/web/content/templates/sales-discovery-call.mdx b/apps/web/content/templates/sales-discovery-call.mdx new file mode 100644 index 0000000000..167eebca24 --- /dev/null +++ b/apps/web/content/templates/sales-discovery-call.mdx @@ -0,0 +1,41 @@ +--- +title: "Sales Discovery Call" +description: "Template for sales teams to qualify leads and understand customer needs" +sections: + - title: "Company Overview" + description: "Background on the prospect" + - title: "Current Situation" + description: "How they operate today" + - title: "Challenges & Pain Points" + description: "Problems they're trying to solve" + - title: "Goals & Success Criteria" + description: "What success looks like" + - title: "Budget & Timeline" + description: "Financial and timing constraints" + - title: "Next Steps" + description: "Follow-up actions and timeline" +--- + +## Company Overview + +Company size, industry, role of participants, and relevant background information. + +## Current Situation + +How they currently handle the problem, what tools they use, and their processes. + +## Challenges & Pain Points + +Specific pain points, problems, and frustrations they're experiencing. + +## Goals & Success Criteria + +What they hope to achieve, their desired outcomes, and how they measure success. + +## Budget & Timeline + +Budget range, decision-making process, timeline for purchase, and key stakeholders. + +## Next Steps + +Agreed upon follow-up actions, who's responsible, and target dates. diff --git a/apps/web/content/templates/sprint-planning.mdx b/apps/web/content/templates/sprint-planning.mdx new file mode 100644 index 0000000000..2b5dbf7ade --- /dev/null +++ b/apps/web/content/templates/sprint-planning.mdx @@ -0,0 +1,35 @@ +--- +title: "Sprint Planning" +description: "Template for planning development sprints and setting team goals" +sections: + - title: "Sprint Goal" + description: "What is the main objective for this sprint?" + - title: "Sprint Backlog" + description: "Stories and tasks committed for the sprint" + - title: "Capacity & Availability" + description: "Team availability and capacity estimates" + - title: "Dependencies & Risks" + description: "External dependencies and potential risks" + - title: "Definition of Done" + description: "Acceptance criteria and completion standards" +--- + +## Sprint Goal + +The overarching objective and what we aim to achieve by the end of this sprint. + +## Sprint Backlog + +User stories, tasks, and work items committed to this sprint with estimates and assignments. + +## Capacity & Availability + +Team member availability, time off, and overall sprint capacity. + +## Dependencies & Risks + +External dependencies, potential blockers, and risk mitigation strategies. + +## Definition of Done + +Clear acceptance criteria and standards that must be met for work to be considered complete. diff --git a/apps/web/content/templates/sprint-retrospective.mdx b/apps/web/content/templates/sprint-retrospective.mdx new file mode 100644 index 0000000000..e7e15403f9 --- /dev/null +++ b/apps/web/content/templates/sprint-retrospective.mdx @@ -0,0 +1,29 @@ +--- +title: "Sprint Retrospective" +description: "Reflect on the sprint to continuously improve team processes and collaboration" +sections: + - title: "What Went Well" + description: "Celebrate wins and positive outcomes" + - title: "What Didn't Go Well" + description: "Identify challenges and problems" + - title: "What We Learned" + description: "Key insights and takeaways" + - title: "Action Items" + description: "Concrete steps for improvement" +--- + +## What Went Well + +Positive outcomes, successful practices, and things to continue doing. + +## What Didn't Go Well + +Challenges faced, bottlenecks encountered, and areas that need improvement. + +## What We Learned + +Key insights, discoveries, and lessons learned during the sprint. + +## Action Items + +Specific, actionable steps the team will take to improve in the next sprint. diff --git a/apps/web/content/templates/technical-design-review.mdx b/apps/web/content/templates/technical-design-review.mdx new file mode 100644 index 0000000000..26675b1949 --- /dev/null +++ b/apps/web/content/templates/technical-design-review.mdx @@ -0,0 +1,47 @@ +--- +title: "Technical Design Review" +description: "Template for engineers to review technical designs and architecture decisions" +sections: + - title: "Problem Statement" + description: "What problem are we solving?" + - title: "Proposed Solution" + description: "Technical approach and architecture" + - title: "Alternatives Considered" + description: "Other options and trade-offs" + - title: "Implementation Plan" + description: "Breakdown of work and timeline" + - title: "Testing Strategy" + description: "How we'll validate the solution" + - title: "Risks & Mitigation" + description: "Potential issues and contingency plans" + - title: "Decisions & Action Items" + description: "Outcomes and next steps" +--- + +## Problem Statement + +Clear description of the technical problem or requirement we're addressing. + +## Proposed Solution + +Detailed technical approach, architecture decisions, and design rationale. + +## Alternatives Considered + +Other solutions evaluated, trade-offs analyzed, and why this approach was chosen. + +## Implementation Plan + +Breakdown of tasks, estimated effort, dependencies, and implementation timeline. + +## Testing Strategy + +Testing approach, edge cases to cover, and validation criteria for the solution. + +## Risks & Mitigation + +Technical risks, potential issues, and strategies to mitigate or address them. + +## Decisions & Action Items + +Key decisions made during the review and action items with owners and deadlines. diff --git a/apps/web/src/components/mock-window.tsx b/apps/web/src/components/mock-window.tsx new file mode 100644 index 0000000000..378a410fa1 --- /dev/null +++ b/apps/web/src/components/mock-window.tsx @@ -0,0 +1,42 @@ +import { DancingSticks } from "@hypr/ui/components/ui/dancing-sticks"; +import { cn } from "@hypr/utils"; + +export function MockWindow({ + showAudioIndicator, + variant = "desktop", + children, +}: { + showAudioIndicator?: boolean; + variant?: "desktop" | "mobile"; + children: React.ReactNode; +}) { + const isMobile = variant === "mobile"; + + return ( +
+
+
+
+
+
+
+ {showAudioIndicator && ( +
+ +
+ )} +
+ {children} +
+ ); +} diff --git a/apps/web/src/hooks/use-platform.ts b/apps/web/src/hooks/use-platform.ts index 84573be08d..4d8e890c2f 100644 --- a/apps/web/src/hooks/use-platform.ts +++ b/apps/web/src/hooks/use-platform.ts @@ -44,6 +44,7 @@ export function getHeroCTA(platform: Platform): { showInput: boolean; inputPlaceholder: string; subtext: string; + subtextLink?: string; } { if (platform === "mac") { return { @@ -51,6 +52,7 @@ export function getHeroCTA(platform: Platform): { showInput: false, inputPlaceholder: "", subtext: "Free and open-source", + subtextLink: "/github", }; } else if (platform === "mobile") { return { diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index 2308d48107..32c3fb126e 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -9,6 +9,7 @@ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. import { Route as rootRouteImport } from './routes/__root' +import { Route as YoutubeRouteImport } from './routes/youtube' import { Route as XRouteImport } from './routes/x' import { Route as LinkedinRouteImport } from './routes/linkedin' import { Route as JoinWaitlistRouteImport } from './routes/join-waitlist' @@ -22,10 +23,14 @@ 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 ApiTemplatesRouteImport } from './routes/api/templates' +import { Route as ViewTeamRouteImport } from './routes/_view/team' +import { Route as ViewRoadmapRouteImport } from './routes/_view/roadmap' import { Route as ViewPricingRouteImport } from './routes/_view/pricing' +import { Route as ViewFaqRouteImport } from './routes/_view/faq' +import { Route as ViewEnterpriseRouteImport } from './routes/_view/enterprise' +import { Route as ViewAboutRouteImport } from './routes/_view/about' 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' @@ -33,6 +38,15 @@ import { Route as ViewChangelogIndexRouteImport } from './routes/_view/changelog import { Route as ViewBlogIndexRouteImport } from './routes/_view/blog/index' import { Route as ViewAppIndexRouteImport } from './routes/_view/app/index' import { Route as ApiTemplatesSlugRouteImport } from './routes/api/templates/$slug' +import { Route as ViewProductTranscriptRouteImport } from './routes/_view/product/transcript' +import { Route as ViewProductTemplatesRouteImport } from './routes/_view/product/templates' +import { Route as ViewProductSummaryRouteImport } from './routes/_view/product/summary' +import { Route as ViewProductNotetakingRouteImport } from './routes/_view/product/notetaking' +import { Route as ViewProductLocalAiRouteImport } from './routes/_view/product/local-ai' +import { Route as ViewProductLocalRouteImport } from './routes/_view/product/local' +import { Route as ViewProductHybridNotetakingRouteImport } from './routes/_view/product/hybrid-notetaking' +import { Route as ViewProductChatRouteImport } from './routes/_view/product/chat' +import { Route as ViewProductAiNotetakingRouteImport } from './routes/_view/product/ai-notetaking' 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' @@ -42,6 +56,11 @@ import { Route as ViewBlogSlugRouteImport } from './routes/_view/blog/$slug' import { Route as ViewAppIntegrationRouteImport } from './routes/_view/app/integration' import { Route as ViewAppAccountRouteImport } from './routes/_view/app/account' +const YoutubeRoute = YoutubeRouteImport.update({ + id: '/youtube', + path: '/youtube', + getParentRoute: () => rootRouteImport, +} as any) const XRoute = XRouteImport.update({ id: '/x', path: '/x', @@ -106,11 +125,36 @@ const ApiTemplatesRoute = ApiTemplatesRouteImport.update({ path: '/api/templates', getParentRoute: () => rootRouteImport, } as any) +const ViewTeamRoute = ViewTeamRouteImport.update({ + id: '/team', + path: '/team', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewRoadmapRoute = ViewRoadmapRouteImport.update({ + id: '/roadmap', + path: '/roadmap', + getParentRoute: () => ViewRouteRoute, +} as any) const ViewPricingRoute = ViewPricingRouteImport.update({ id: '/pricing', path: '/pricing', getParentRoute: () => ViewRouteRoute, } as any) +const ViewFaqRoute = ViewFaqRouteImport.update({ + id: '/faq', + path: '/faq', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewEnterpriseRoute = ViewEnterpriseRouteImport.update({ + id: '/enterprise', + path: '/enterprise', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewAboutRoute = ViewAboutRouteImport.update({ + id: '/about', + path: '/about', + getParentRoute: () => ViewRouteRoute, +} as any) const ViewDocsRouteRoute = ViewDocsRouteRouteImport.update({ id: '/docs', path: '/docs', @@ -121,11 +165,6 @@ const ViewAppRouteRoute = ViewAppRouteRouteImport.update({ path: '/app', getParentRoute: () => ViewRouteRoute, } as any) -const ViewProductIndexRoute = ViewProductIndexRouteImport.update({ - id: '/product/', - path: '/product/', - getParentRoute: () => ViewRouteRoute, -} as any) const ViewLegalIndexRoute = ViewLegalIndexRouteImport.update({ id: '/legal/', path: '/legal/', @@ -161,6 +200,52 @@ const ApiTemplatesSlugRoute = ApiTemplatesSlugRouteImport.update({ path: '/$slug', getParentRoute: () => ApiTemplatesRoute, } as any) +const ViewProductTranscriptRoute = ViewProductTranscriptRouteImport.update({ + id: '/product/transcript', + path: '/product/transcript', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductTemplatesRoute = ViewProductTemplatesRouteImport.update({ + id: '/product/templates', + path: '/product/templates', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductSummaryRoute = ViewProductSummaryRouteImport.update({ + id: '/product/summary', + path: '/product/summary', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductNotetakingRoute = ViewProductNotetakingRouteImport.update({ + id: '/product/notetaking', + path: '/product/notetaking', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductLocalAiRoute = ViewProductLocalAiRouteImport.update({ + id: '/product/local-ai', + path: '/product/local-ai', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductLocalRoute = ViewProductLocalRouteImport.update({ + id: '/product/local', + path: '/product/local', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductHybridNotetakingRoute = + ViewProductHybridNotetakingRouteImport.update({ + id: '/product/hybrid-notetaking', + path: '/product/hybrid-notetaking', + getParentRoute: () => ViewRouteRoute, + } as any) +const ViewProductChatRoute = ViewProductChatRouteImport.update({ + id: '/product/chat', + path: '/product/chat', + getParentRoute: () => ViewRouteRoute, +} as any) +const ViewProductAiNotetakingRoute = ViewProductAiNotetakingRouteImport.update({ + id: '/product/ai-notetaking', + path: '/product/ai-notetaking', + getParentRoute: () => ViewRouteRoute, +} as any) const ViewLegalSlugRoute = ViewLegalSlugRouteImport.update({ id: '/legal/$slug', path: '/legal/$slug', @@ -212,9 +297,15 @@ export interface FileRoutesByFullPath { '/join-waitlist': typeof JoinWaitlistRoute '/linkedin': typeof LinkedinRoute '/x': typeof XRoute + '/youtube': typeof YoutubeRoute '/app': typeof ViewAppRouteRouteWithChildren '/docs': typeof ViewDocsRouteRouteWithChildren + '/about': typeof ViewAboutRoute + '/enterprise': typeof ViewEnterpriseRoute + '/faq': typeof ViewFaqRoute '/pricing': typeof ViewPricingRoute + '/roadmap': typeof ViewRoadmapRoute + '/team': typeof ViewTeamRoute '/api/templates': typeof ApiTemplatesRouteWithChildren '/webhook/nango': typeof WebhookNangoRoute '/webhook/stripe': typeof WebhookStripeRoute @@ -227,6 +318,15 @@ export interface FileRoutesByFullPath { '/docs/$slug': typeof ViewDocsSlugRoute '/download/apple-silicon': typeof ViewDownloadAppleSiliconRoute '/legal/$slug': typeof ViewLegalSlugRoute + '/product/ai-notetaking': typeof ViewProductAiNotetakingRoute + '/product/chat': typeof ViewProductChatRoute + '/product/hybrid-notetaking': typeof ViewProductHybridNotetakingRoute + '/product/local': typeof ViewProductLocalRoute + '/product/local-ai': typeof ViewProductLocalAiRoute + '/product/notetaking': typeof ViewProductNotetakingRoute + '/product/summary': typeof ViewProductSummaryRoute + '/product/templates': typeof ViewProductTemplatesRoute + '/product/transcript': typeof ViewProductTranscriptRoute '/api/templates/$slug': typeof ApiTemplatesSlugRoute '/app/': typeof ViewAppIndexRoute '/blog': typeof ViewBlogIndexRoute @@ -234,7 +334,6 @@ export interface FileRoutesByFullPath { '/docs/': typeof ViewDocsIndexRoute '/download': typeof ViewDownloadIndexRoute '/legal': typeof ViewLegalIndexRoute - '/product': typeof ViewProductIndexRoute } export interface FileRoutesByTo { '/auth': typeof AuthRoute @@ -245,7 +344,13 @@ export interface FileRoutesByTo { '/join-waitlist': typeof JoinWaitlistRoute '/linkedin': typeof LinkedinRoute '/x': typeof XRoute + '/youtube': typeof YoutubeRoute + '/about': typeof ViewAboutRoute + '/enterprise': typeof ViewEnterpriseRoute + '/faq': typeof ViewFaqRoute '/pricing': typeof ViewPricingRoute + '/roadmap': typeof ViewRoadmapRoute + '/team': typeof ViewTeamRoute '/api/templates': typeof ApiTemplatesRouteWithChildren '/webhook/nango': typeof WebhookNangoRoute '/webhook/stripe': typeof WebhookStripeRoute @@ -258,6 +363,15 @@ export interface FileRoutesByTo { '/docs/$slug': typeof ViewDocsSlugRoute '/download/apple-silicon': typeof ViewDownloadAppleSiliconRoute '/legal/$slug': typeof ViewLegalSlugRoute + '/product/ai-notetaking': typeof ViewProductAiNotetakingRoute + '/product/chat': typeof ViewProductChatRoute + '/product/hybrid-notetaking': typeof ViewProductHybridNotetakingRoute + '/product/local': typeof ViewProductLocalRoute + '/product/local-ai': typeof ViewProductLocalAiRoute + '/product/notetaking': typeof ViewProductNotetakingRoute + '/product/summary': typeof ViewProductSummaryRoute + '/product/templates': typeof ViewProductTemplatesRoute + '/product/transcript': typeof ViewProductTranscriptRoute '/api/templates/$slug': typeof ApiTemplatesSlugRoute '/app': typeof ViewAppIndexRoute '/blog': typeof ViewBlogIndexRoute @@ -265,7 +379,6 @@ export interface FileRoutesByTo { '/docs': typeof ViewDocsIndexRoute '/download': typeof ViewDownloadIndexRoute '/legal': typeof ViewLegalIndexRoute - '/product': typeof ViewProductIndexRoute } export interface FileRoutesById { __root__: typeof rootRouteImport @@ -278,9 +391,15 @@ export interface FileRoutesById { '/join-waitlist': typeof JoinWaitlistRoute '/linkedin': typeof LinkedinRoute '/x': typeof XRoute + '/youtube': typeof YoutubeRoute '/_view/app': typeof ViewAppRouteRouteWithChildren '/_view/docs': typeof ViewDocsRouteRouteWithChildren + '/_view/about': typeof ViewAboutRoute + '/_view/enterprise': typeof ViewEnterpriseRoute + '/_view/faq': typeof ViewFaqRoute '/_view/pricing': typeof ViewPricingRoute + '/_view/roadmap': typeof ViewRoadmapRoute + '/_view/team': typeof ViewTeamRoute '/api/templates': typeof ApiTemplatesRouteWithChildren '/webhook/nango': typeof WebhookNangoRoute '/webhook/stripe': typeof WebhookStripeRoute @@ -293,6 +412,15 @@ export interface FileRoutesById { '/_view/docs/$slug': typeof ViewDocsSlugRoute '/_view/download/apple-silicon': typeof ViewDownloadAppleSiliconRoute '/_view/legal/$slug': typeof ViewLegalSlugRoute + '/_view/product/ai-notetaking': typeof ViewProductAiNotetakingRoute + '/_view/product/chat': typeof ViewProductChatRoute + '/_view/product/hybrid-notetaking': typeof ViewProductHybridNotetakingRoute + '/_view/product/local': typeof ViewProductLocalRoute + '/_view/product/local-ai': typeof ViewProductLocalAiRoute + '/_view/product/notetaking': typeof ViewProductNotetakingRoute + '/_view/product/summary': typeof ViewProductSummaryRoute + '/_view/product/templates': typeof ViewProductTemplatesRoute + '/_view/product/transcript': typeof ViewProductTranscriptRoute '/api/templates/$slug': typeof ApiTemplatesSlugRoute '/_view/app/': typeof ViewAppIndexRoute '/_view/blog/': typeof ViewBlogIndexRoute @@ -300,7 +428,6 @@ export interface FileRoutesById { '/_view/docs/': typeof ViewDocsIndexRoute '/_view/download/': typeof ViewDownloadIndexRoute '/_view/legal/': typeof ViewLegalIndexRoute - '/_view/product/': typeof ViewProductIndexRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath @@ -313,9 +440,15 @@ export interface FileRouteTypes { | '/join-waitlist' | '/linkedin' | '/x' + | '/youtube' | '/app' | '/docs' + | '/about' + | '/enterprise' + | '/faq' | '/pricing' + | '/roadmap' + | '/team' | '/api/templates' | '/webhook/nango' | '/webhook/stripe' @@ -328,6 +461,15 @@ export interface FileRouteTypes { | '/docs/$slug' | '/download/apple-silicon' | '/legal/$slug' + | '/product/ai-notetaking' + | '/product/chat' + | '/product/hybrid-notetaking' + | '/product/local' + | '/product/local-ai' + | '/product/notetaking' + | '/product/summary' + | '/product/templates' + | '/product/transcript' | '/api/templates/$slug' | '/app/' | '/blog' @@ -335,7 +477,6 @@ export interface FileRouteTypes { | '/docs/' | '/download' | '/legal' - | '/product' fileRoutesByTo: FileRoutesByTo to: | '/auth' @@ -346,7 +487,13 @@ export interface FileRouteTypes { | '/join-waitlist' | '/linkedin' | '/x' + | '/youtube' + | '/about' + | '/enterprise' + | '/faq' | '/pricing' + | '/roadmap' + | '/team' | '/api/templates' | '/webhook/nango' | '/webhook/stripe' @@ -359,6 +506,15 @@ export interface FileRouteTypes { | '/docs/$slug' | '/download/apple-silicon' | '/legal/$slug' + | '/product/ai-notetaking' + | '/product/chat' + | '/product/hybrid-notetaking' + | '/product/local' + | '/product/local-ai' + | '/product/notetaking' + | '/product/summary' + | '/product/templates' + | '/product/transcript' | '/api/templates/$slug' | '/app' | '/blog' @@ -366,7 +522,6 @@ export interface FileRouteTypes { | '/docs' | '/download' | '/legal' - | '/product' id: | '__root__' | '/_view' @@ -378,9 +533,15 @@ export interface FileRouteTypes { | '/join-waitlist' | '/linkedin' | '/x' + | '/youtube' | '/_view/app' | '/_view/docs' + | '/_view/about' + | '/_view/enterprise' + | '/_view/faq' | '/_view/pricing' + | '/_view/roadmap' + | '/_view/team' | '/api/templates' | '/webhook/nango' | '/webhook/stripe' @@ -393,6 +554,15 @@ export interface FileRouteTypes { | '/_view/docs/$slug' | '/_view/download/apple-silicon' | '/_view/legal/$slug' + | '/_view/product/ai-notetaking' + | '/_view/product/chat' + | '/_view/product/hybrid-notetaking' + | '/_view/product/local' + | '/_view/product/local-ai' + | '/_view/product/notetaking' + | '/_view/product/summary' + | '/_view/product/templates' + | '/_view/product/transcript' | '/api/templates/$slug' | '/_view/app/' | '/_view/blog/' @@ -400,7 +570,6 @@ export interface FileRouteTypes { | '/_view/docs/' | '/_view/download/' | '/_view/legal/' - | '/_view/product/' fileRoutesById: FileRoutesById } export interface RootRouteChildren { @@ -413,6 +582,7 @@ export interface RootRouteChildren { JoinWaitlistRoute: typeof JoinWaitlistRoute LinkedinRoute: typeof LinkedinRoute XRoute: typeof XRoute + YoutubeRoute: typeof YoutubeRoute ApiTemplatesRoute: typeof ApiTemplatesRouteWithChildren WebhookNangoRoute: typeof WebhookNangoRoute WebhookStripeRoute: typeof WebhookStripeRoute @@ -420,6 +590,13 @@ export interface RootRouteChildren { declare module '@tanstack/react-router' { interface FileRoutesByPath { + '/youtube': { + id: '/youtube' + path: '/youtube' + fullPath: '/youtube' + preLoaderRoute: typeof YoutubeRouteImport + parentRoute: typeof rootRouteImport + } '/x': { id: '/x' path: '/x' @@ -511,6 +688,20 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ApiTemplatesRouteImport parentRoute: typeof rootRouteImport } + '/_view/team': { + id: '/_view/team' + path: '/team' + fullPath: '/team' + preLoaderRoute: typeof ViewTeamRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/roadmap': { + id: '/_view/roadmap' + path: '/roadmap' + fullPath: '/roadmap' + preLoaderRoute: typeof ViewRoadmapRouteImport + parentRoute: typeof ViewRouteRoute + } '/_view/pricing': { id: '/_view/pricing' path: '/pricing' @@ -518,6 +709,27 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ViewPricingRouteImport parentRoute: typeof ViewRouteRoute } + '/_view/faq': { + id: '/_view/faq' + path: '/faq' + fullPath: '/faq' + preLoaderRoute: typeof ViewFaqRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/enterprise': { + id: '/_view/enterprise' + path: '/enterprise' + fullPath: '/enterprise' + preLoaderRoute: typeof ViewEnterpriseRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/about': { + id: '/_view/about' + path: '/about' + fullPath: '/about' + preLoaderRoute: typeof ViewAboutRouteImport + parentRoute: typeof ViewRouteRoute + } '/_view/docs': { id: '/_view/docs' path: '/docs' @@ -532,13 +744,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ViewAppRouteRouteImport parentRoute: typeof ViewRouteRoute } - '/_view/product/': { - id: '/_view/product/' - path: '/product' - fullPath: '/product' - preLoaderRoute: typeof ViewProductIndexRouteImport - parentRoute: typeof ViewRouteRoute - } '/_view/legal/': { id: '/_view/legal/' path: '/legal' @@ -588,6 +793,69 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof ApiTemplatesSlugRouteImport parentRoute: typeof ApiTemplatesRoute } + '/_view/product/transcript': { + id: '/_view/product/transcript' + path: '/product/transcript' + fullPath: '/product/transcript' + preLoaderRoute: typeof ViewProductTranscriptRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/templates': { + id: '/_view/product/templates' + path: '/product/templates' + fullPath: '/product/templates' + preLoaderRoute: typeof ViewProductTemplatesRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/summary': { + id: '/_view/product/summary' + path: '/product/summary' + fullPath: '/product/summary' + preLoaderRoute: typeof ViewProductSummaryRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/notetaking': { + id: '/_view/product/notetaking' + path: '/product/notetaking' + fullPath: '/product/notetaking' + preLoaderRoute: typeof ViewProductNotetakingRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/local-ai': { + id: '/_view/product/local-ai' + path: '/product/local-ai' + fullPath: '/product/local-ai' + preLoaderRoute: typeof ViewProductLocalAiRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/local': { + id: '/_view/product/local' + path: '/product/local' + fullPath: '/product/local' + preLoaderRoute: typeof ViewProductLocalRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/hybrid-notetaking': { + id: '/_view/product/hybrid-notetaking' + path: '/product/hybrid-notetaking' + fullPath: '/product/hybrid-notetaking' + preLoaderRoute: typeof ViewProductHybridNotetakingRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/chat': { + id: '/_view/product/chat' + path: '/product/chat' + fullPath: '/product/chat' + preLoaderRoute: typeof ViewProductChatRouteImport + parentRoute: typeof ViewRouteRoute + } + '/_view/product/ai-notetaking': { + id: '/_view/product/ai-notetaking' + path: '/product/ai-notetaking' + fullPath: '/product/ai-notetaking' + preLoaderRoute: typeof ViewProductAiNotetakingRouteImport + parentRoute: typeof ViewRouteRoute + } '/_view/legal/$slug': { id: '/_view/legal/$slug' path: '/legal/$slug' @@ -680,35 +948,61 @@ const ViewDocsRouteRouteWithChildren = ViewDocsRouteRoute._addFileChildren( interface ViewRouteRouteChildren { ViewAppRouteRoute: typeof ViewAppRouteRouteWithChildren ViewDocsRouteRoute: typeof ViewDocsRouteRouteWithChildren + ViewAboutRoute: typeof ViewAboutRoute + ViewEnterpriseRoute: typeof ViewEnterpriseRoute + ViewFaqRoute: typeof ViewFaqRoute ViewPricingRoute: typeof ViewPricingRoute + ViewRoadmapRoute: typeof ViewRoadmapRoute + ViewTeamRoute: typeof ViewTeamRoute ViewIndexRoute: typeof ViewIndexRoute ViewBlogSlugRoute: typeof ViewBlogSlugRoute ViewCallbackAuthRoute: typeof ViewCallbackAuthRoute ViewChangelogSlugRoute: typeof ViewChangelogSlugRoute ViewDownloadAppleSiliconRoute: typeof ViewDownloadAppleSiliconRoute ViewLegalSlugRoute: typeof ViewLegalSlugRoute + ViewProductAiNotetakingRoute: typeof ViewProductAiNotetakingRoute + ViewProductChatRoute: typeof ViewProductChatRoute + ViewProductHybridNotetakingRoute: typeof ViewProductHybridNotetakingRoute + ViewProductLocalRoute: typeof ViewProductLocalRoute + ViewProductLocalAiRoute: typeof ViewProductLocalAiRoute + ViewProductNotetakingRoute: typeof ViewProductNotetakingRoute + ViewProductSummaryRoute: typeof ViewProductSummaryRoute + ViewProductTemplatesRoute: typeof ViewProductTemplatesRoute + ViewProductTranscriptRoute: typeof ViewProductTranscriptRoute ViewBlogIndexRoute: typeof ViewBlogIndexRoute ViewChangelogIndexRoute: typeof ViewChangelogIndexRoute ViewDownloadIndexRoute: typeof ViewDownloadIndexRoute ViewLegalIndexRoute: typeof ViewLegalIndexRoute - ViewProductIndexRoute: typeof ViewProductIndexRoute } const ViewRouteRouteChildren: ViewRouteRouteChildren = { ViewAppRouteRoute: ViewAppRouteRouteWithChildren, ViewDocsRouteRoute: ViewDocsRouteRouteWithChildren, + ViewAboutRoute: ViewAboutRoute, + ViewEnterpriseRoute: ViewEnterpriseRoute, + ViewFaqRoute: ViewFaqRoute, ViewPricingRoute: ViewPricingRoute, + ViewRoadmapRoute: ViewRoadmapRoute, + ViewTeamRoute: ViewTeamRoute, ViewIndexRoute: ViewIndexRoute, ViewBlogSlugRoute: ViewBlogSlugRoute, ViewCallbackAuthRoute: ViewCallbackAuthRoute, ViewChangelogSlugRoute: ViewChangelogSlugRoute, ViewDownloadAppleSiliconRoute: ViewDownloadAppleSiliconRoute, ViewLegalSlugRoute: ViewLegalSlugRoute, + ViewProductAiNotetakingRoute: ViewProductAiNotetakingRoute, + ViewProductChatRoute: ViewProductChatRoute, + ViewProductHybridNotetakingRoute: ViewProductHybridNotetakingRoute, + ViewProductLocalRoute: ViewProductLocalRoute, + ViewProductLocalAiRoute: ViewProductLocalAiRoute, + ViewProductNotetakingRoute: ViewProductNotetakingRoute, + ViewProductSummaryRoute: ViewProductSummaryRoute, + ViewProductTemplatesRoute: ViewProductTemplatesRoute, + ViewProductTranscriptRoute: ViewProductTranscriptRoute, ViewBlogIndexRoute: ViewBlogIndexRoute, ViewChangelogIndexRoute: ViewChangelogIndexRoute, ViewDownloadIndexRoute: ViewDownloadIndexRoute, ViewLegalIndexRoute: ViewLegalIndexRoute, - ViewProductIndexRoute: ViewProductIndexRoute, } const ViewRouteRouteWithChildren = ViewRouteRoute._addFileChildren( @@ -737,6 +1031,7 @@ const rootRouteChildren: RootRouteChildren = { JoinWaitlistRoute: JoinWaitlistRoute, LinkedinRoute: LinkedinRoute, XRoute: XRoute, + YoutubeRoute: YoutubeRoute, ApiTemplatesRoute: ApiTemplatesRouteWithChildren, WebhookNangoRoute: WebhookNangoRoute, WebhookStripeRoute: WebhookStripeRoute, diff --git a/apps/web/src/routes/_view/about.tsx b/apps/web/src/routes/_view/about.tsx new file mode 100644 index 0000000000..cb4005ce14 --- /dev/null +++ b/apps/web/src/routes/_view/about.tsx @@ -0,0 +1,201 @@ +import { cn } from "@hypr/utils"; +import { Icon } from "@iconify-icon/react"; +import { createFileRoute, Link } from "@tanstack/react-router"; + +export const Route = createFileRoute("/_view/about")({ + component: Component, + head: () => ({ + meta: [ + { title: "About Hyprnote - Our Story" }, + { + name: "description", + content: + "Learn about Hyprnote's mission to make notetaking effortless while keeping your data private. Built by Fastrepl.", + }, + ], + }), +}); + +function Component() { + return ( +
+
+
+
+

+ Making notetaking +
+ effortless +

+

+ We believe that capturing and organizing your conversations shouldn't be a chore. That's why we built + Hyprnote - a tool that listens, learns, and helps you remember what matters. +

+
+ +
+

Our Mission

+
+
+ +

Privacy First

+

+ Your conversations are personal. We process everything locally on your device using on-device AI, so + your data never leaves your computer. +

+
+
+ +

Effortless Capture

+

+ Stop worrying about missing important details. Hyprnote captures both your mic and system audio, + giving you complete context for every conversation. +

+
+
+ +

Intelligent Organization

+

+ AI helps you find what matters. Automatic transcription, smart summaries, and searchable notes mean + you'll never lose track of important information. +

+
+
+ +

Built for Everyone

+

+ From remote workers to students, from entrepreneurs to executives - Hyprnote adapts to your workflow + and helps you work smarter. +

+
+
+
+ +
+

Our Story

+
+

+ Hyprnote was born from a simple frustration: trying to take notes while staying engaged in important + conversations. Whether it was a crucial client call, a brainstorming session with the team, or an online + lecture, we found ourselves constantly torn between listening and writing. +

+

+ We looked for solutions, but everything required bots joining meetings, cloud uploads, or compromising + on privacy. We knew there had to be a better way. +

+

+ That's when we started building Hyprnote - a desktop application that captures audio locally, processes + it with on-device AI, and gives you the freedom to be fully present in your conversations while never + missing a detail. +

+
+
+ +
+

What We Stand For

+
+ + + + +
+
+ +
+

+ Built by Fastrepl +

+

+ Hyprnote is developed by Fastrepl, a team dedicated to building productivity tools that respect your + privacy and enhance your workflow. +

+
+ + Meet the team + + + View on GitHub + +
+
+ +
+

+ Ready to transform your notetaking? +

+

+ Join thousands of professionals who trust Hyprnote to capture their most important conversations. +

+ + Download for free + +
+
+
+
+ ); +} + +function ValueItem({ + icon, + title, + description, +}: { + icon: string; + title: string; + description: string; +}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} diff --git a/apps/web/src/routes/_view/blog/$slug.tsx b/apps/web/src/routes/_view/blog/$slug.tsx index e70bb5e007..b17d3391d5 100644 --- a/apps/web/src/routes/_view/blog/$slug.tsx +++ b/apps/web/src/routes/_view/blog/$slug.tsx @@ -72,7 +72,7 @@ function Component() {
-
+
@@ -114,41 +114,103 @@ function MobileHeader() { ); } +interface TocItem { + id: string; + text: string; + level: number; + children: TocItem[]; +} + +function buildTocTree(toc: Array<{ id: string; text: string; level: number }>): TocItem[] { + const tree: TocItem[] = []; + const stack: TocItem[] = []; + + for (const item of toc) { + const node: TocItem = { ...item, children: [] }; + + while (stack.length > 0 && stack[stack.length - 1].level >= node.level) { + stack.pop(); + } + + if (stack.length === 0) { + tree.push(node); + } else { + stack[stack.length - 1].children.push(node); + } + + stack.push(node); + } + + return tree; +} + +function TocNode({ item, depth = 0 }: { item: TocItem; depth?: number }) { + const [isExpanded, setIsExpanded] = useState(true); + const hasChildren = item.children.length > 0; + + return ( +
+
+ {hasChildren && ( + + )} + 0 ? `${depth * 0.5}rem` : 0 }} + > + {item.text} + +
+ {hasChildren && isExpanded && ( +
+ {item.children.map((child) => )} +
+ )} +
+ ); +} + function TableOfContents({ toc, }: { toc: Array<{ id: string; text: string; level: number }>; }) { + const tocTree = buildTocTree(toc); + return (