-
-
-
- {config.userPrefix}
- {author}
-
- {config.subtitle && (
-
{config.subtitle}
+ {initials}
+
+ );
+}
+
+const platformConfig = {
+ reddit: {
+ iconColor: "text-orange-600",
+ iconPath:
+ "M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547-.8 3.747c1.824.07 3.48.632 4.674 1.488.308-.309.73-.491 1.207-.491.968 0 1.754.786 1.754 1.754 0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87-3.874 0-7.004-2.176-7.004-4.87 0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754.463 0 .898.196 1.207.49 1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248.687 0 1.248-.561 1.248-1.249 0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25 0 .687.561 1.248 1.249 1.248.688 0 1.249-.561 1.249-1.249 0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z",
+ },
+ linkedin: {
+ iconColor: "text-blue-700",
+ iconPath:
+ "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z",
+ },
+ twitter: {
+ iconColor: "text-fg",
+ iconPath:
+ "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z",
+ },
+};
+
+function getSubtitle(props: SocialCardProps): string {
+ if (props.platform === "reddit" && props.subreddit)
+ return `r/${props.subreddit}`;
+ if (props.platform === "linkedin" && props.role && props.company)
+ return `${props.role} at ${props.company}`;
+ if (props.platform === "twitter" && props.username)
+ return `@${props.username}`;
+ return "";
+}
+
+const TAIL_R = 12;
+const tailMask = `radial-gradient(${TAIL_R}px at 100% 0, #0000 98%, #000 101%)`;
+
+export function SocialCard(props: SocialCardProps) {
+ const { platform, author, body, url, className, avatar } = props;
+ const config = platformConfig[platform];
+ const subtitle = getSubtitle(props);
+
+ return (
+
);
diff --git a/apps/web/src/lib/brand-noise.ts b/apps/web/src/lib/brand-noise.ts
new file mode 100644
index 0000000000..0d0b26fc9b
--- /dev/null
+++ b/apps/web/src/lib/brand-noise.ts
@@ -0,0 +1 @@
+export const brandPageNoiseBackgroundImage = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E")`;
diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts
index 049addb272..b1173887cf 100644
--- a/apps/web/src/routeTree.gen.ts
+++ b/apps/web/src/routeTree.gen.ts
@@ -68,22 +68,9 @@ import { Route as ApiTweetIdRouteImport } from './routes/api/tweet.$id'
import { Route as ApiImagesSplatRouteImport } from './routes/api/images.$'
import { Route as ViewVsSlugRouteImport } from './routes/_view/vs/$slug'
import { Route as ViewUpdatesSlugRouteImport } from './routes/_view/updates/$slug'
-import { Route as ViewSolutionSalesRouteImport } from './routes/_view/solution/sales'
-import { Route as ViewSolutionResearchRouteImport } from './routes/_view/solution/research'
-import { Route as ViewSolutionRecruitingRouteImport } from './routes/_view/solution/recruiting'
-import { Route as ViewSolutionProjectManagementRouteImport } from './routes/_view/solution/project-management'
import { Route as ViewSolutionMeetingRouteImport } from './routes/_view/solution/meeting'
-import { Route as ViewSolutionMediaRouteImport } from './routes/_view/solution/media'
-import { Route as ViewSolutionLegalRouteImport } from './routes/_view/solution/legal'
-import { Route as ViewSolutionKnowledgeWorkersRouteImport } from './routes/_view/solution/knowledge-workers'
-import { Route as ViewSolutionJournalismRouteImport } from './routes/_view/solution/journalism'
-import { Route as ViewSolutionHealthcareRouteImport } from './routes/_view/solution/healthcare'
-import { Route as ViewSolutionGovernmentRouteImport } from './routes/_view/solution/government'
-import { Route as ViewSolutionFieldEngineeringRouteImport } from './routes/_view/solution/field-engineering'
import { Route as ViewSolutionEngineeringRouteImport } from './routes/_view/solution/engineering'
-import { Route as ViewSolutionCustomerSuccessRouteImport } from './routes/_view/solution/customer-success'
-import { Route as ViewSolutionConsultingRouteImport } from './routes/_view/solution/consulting'
-import { Route as ViewSolutionCoachingRouteImport } from './routes/_view/solution/coaching'
+import { Route as ViewSolutionSlugRouteImport } from './routes/_view/solution/$slug'
import { Route as ViewRoadmapSlugRouteImport } from './routes/_view/roadmap/$slug'
import { Route as ViewProductSelfHostingRouteImport } from './routes/_view/product/self-hosting'
import { Route as ViewProductSearchRouteImport } from './routes/_view/product/search'
@@ -452,88 +439,19 @@ const ViewUpdatesSlugRoute = ViewUpdatesSlugRouteImport.update({
path: '/updates/$slug',
getParentRoute: () => ViewRouteRoute,
} as any)
-const ViewSolutionSalesRoute = ViewSolutionSalesRouteImport.update({
- id: '/solution/sales',
- path: '/solution/sales',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionResearchRoute = ViewSolutionResearchRouteImport.update({
- id: '/solution/research',
- path: '/solution/research',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionRecruitingRoute = ViewSolutionRecruitingRouteImport.update({
- id: '/solution/recruiting',
- path: '/solution/recruiting',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionProjectManagementRoute =
- ViewSolutionProjectManagementRouteImport.update({
- id: '/solution/project-management',
- path: '/solution/project-management',
- getParentRoute: () => ViewRouteRoute,
- } as any)
const ViewSolutionMeetingRoute = ViewSolutionMeetingRouteImport.update({
id: '/solution/meeting',
path: '/solution/meeting',
getParentRoute: () => ViewRouteRoute,
} as any)
-const ViewSolutionMediaRoute = ViewSolutionMediaRouteImport.update({
- id: '/solution/media',
- path: '/solution/media',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionLegalRoute = ViewSolutionLegalRouteImport.update({
- id: '/solution/legal',
- path: '/solution/legal',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionKnowledgeWorkersRoute =
- ViewSolutionKnowledgeWorkersRouteImport.update({
- id: '/solution/knowledge-workers',
- path: '/solution/knowledge-workers',
- getParentRoute: () => ViewRouteRoute,
- } as any)
-const ViewSolutionJournalismRoute = ViewSolutionJournalismRouteImport.update({
- id: '/solution/journalism',
- path: '/solution/journalism',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionHealthcareRoute = ViewSolutionHealthcareRouteImport.update({
- id: '/solution/healthcare',
- path: '/solution/healthcare',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionGovernmentRoute = ViewSolutionGovernmentRouteImport.update({
- id: '/solution/government',
- path: '/solution/government',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionFieldEngineeringRoute =
- ViewSolutionFieldEngineeringRouteImport.update({
- id: '/solution/field-engineering',
- path: '/solution/field-engineering',
- getParentRoute: () => ViewRouteRoute,
- } as any)
const ViewSolutionEngineeringRoute = ViewSolutionEngineeringRouteImport.update({
id: '/solution/engineering',
path: '/solution/engineering',
getParentRoute: () => ViewRouteRoute,
} as any)
-const ViewSolutionCustomerSuccessRoute =
- ViewSolutionCustomerSuccessRouteImport.update({
- id: '/solution/customer-success',
- path: '/solution/customer-success',
- getParentRoute: () => ViewRouteRoute,
- } as any)
-const ViewSolutionConsultingRoute = ViewSolutionConsultingRouteImport.update({
- id: '/solution/consulting',
- path: '/solution/consulting',
- getParentRoute: () => ViewRouteRoute,
-} as any)
-const ViewSolutionCoachingRoute = ViewSolutionCoachingRouteImport.update({
- id: '/solution/coaching',
- path: '/solution/coaching',
+const ViewSolutionSlugRoute = ViewSolutionSlugRouteImport.update({
+ id: '/solution/$slug',
+ path: '/solution/$slug',
getParentRoute: () => ViewRouteRoute,
} as any)
const ViewRoadmapSlugRoute = ViewRoadmapSlugRouteImport.update({
@@ -974,22 +892,9 @@ export interface FileRoutesByFullPath {
'/product/search': typeof ViewProductSearchRoute
'/product/self-hosting': typeof ViewProductSelfHostingRoute
'/roadmap/$slug': typeof ViewRoadmapSlugRoute
- '/solution/coaching': typeof ViewSolutionCoachingRoute
- '/solution/consulting': typeof ViewSolutionConsultingRoute
- '/solution/customer-success': typeof ViewSolutionCustomerSuccessRoute
+ '/solution/$slug': typeof ViewSolutionSlugRoute
'/solution/engineering': typeof ViewSolutionEngineeringRoute
- '/solution/field-engineering': typeof ViewSolutionFieldEngineeringRoute
- '/solution/government': typeof ViewSolutionGovernmentRoute
- '/solution/healthcare': typeof ViewSolutionHealthcareRoute
- '/solution/journalism': typeof ViewSolutionJournalismRoute
- '/solution/knowledge-workers': typeof ViewSolutionKnowledgeWorkersRoute
- '/solution/legal': typeof ViewSolutionLegalRoute
- '/solution/media': typeof ViewSolutionMediaRoute
'/solution/meeting': typeof ViewSolutionMeetingRoute
- '/solution/project-management': typeof ViewSolutionProjectManagementRoute
- '/solution/recruiting': typeof ViewSolutionRecruitingRoute
- '/solution/research': typeof ViewSolutionResearchRoute
- '/solution/sales': typeof ViewSolutionSalesRoute
'/updates/$slug': typeof ViewUpdatesSlugRoute
'/vs/$slug': typeof ViewVsSlugRoute
'/api/images/$': typeof ApiImagesSplatRoute
@@ -1116,22 +1021,9 @@ export interface FileRoutesByTo {
'/product/search': typeof ViewProductSearchRoute
'/product/self-hosting': typeof ViewProductSelfHostingRoute
'/roadmap/$slug': typeof ViewRoadmapSlugRoute
- '/solution/coaching': typeof ViewSolutionCoachingRoute
- '/solution/consulting': typeof ViewSolutionConsultingRoute
- '/solution/customer-success': typeof ViewSolutionCustomerSuccessRoute
+ '/solution/$slug': typeof ViewSolutionSlugRoute
'/solution/engineering': typeof ViewSolutionEngineeringRoute
- '/solution/field-engineering': typeof ViewSolutionFieldEngineeringRoute
- '/solution/government': typeof ViewSolutionGovernmentRoute
- '/solution/healthcare': typeof ViewSolutionHealthcareRoute
- '/solution/journalism': typeof ViewSolutionJournalismRoute
- '/solution/knowledge-workers': typeof ViewSolutionKnowledgeWorkersRoute
- '/solution/legal': typeof ViewSolutionLegalRoute
- '/solution/media': typeof ViewSolutionMediaRoute
'/solution/meeting': typeof ViewSolutionMeetingRoute
- '/solution/project-management': typeof ViewSolutionProjectManagementRoute
- '/solution/recruiting': typeof ViewSolutionRecruitingRoute
- '/solution/research': typeof ViewSolutionResearchRoute
- '/solution/sales': typeof ViewSolutionSalesRoute
'/updates/$slug': typeof ViewUpdatesSlugRoute
'/vs/$slug': typeof ViewVsSlugRoute
'/api/images/$': typeof ApiImagesSplatRoute
@@ -1264,22 +1156,9 @@ export interface FileRoutesById {
'/_view/product/search': typeof ViewProductSearchRoute
'/_view/product/self-hosting': typeof ViewProductSelfHostingRoute
'/_view/roadmap/$slug': typeof ViewRoadmapSlugRoute
- '/_view/solution/coaching': typeof ViewSolutionCoachingRoute
- '/_view/solution/consulting': typeof ViewSolutionConsultingRoute
- '/_view/solution/customer-success': typeof ViewSolutionCustomerSuccessRoute
+ '/_view/solution/$slug': typeof ViewSolutionSlugRoute
'/_view/solution/engineering': typeof ViewSolutionEngineeringRoute
- '/_view/solution/field-engineering': typeof ViewSolutionFieldEngineeringRoute
- '/_view/solution/government': typeof ViewSolutionGovernmentRoute
- '/_view/solution/healthcare': typeof ViewSolutionHealthcareRoute
- '/_view/solution/journalism': typeof ViewSolutionJournalismRoute
- '/_view/solution/knowledge-workers': typeof ViewSolutionKnowledgeWorkersRoute
- '/_view/solution/legal': typeof ViewSolutionLegalRoute
- '/_view/solution/media': typeof ViewSolutionMediaRoute
'/_view/solution/meeting': typeof ViewSolutionMeetingRoute
- '/_view/solution/project-management': typeof ViewSolutionProjectManagementRoute
- '/_view/solution/recruiting': typeof ViewSolutionRecruitingRoute
- '/_view/solution/research': typeof ViewSolutionResearchRoute
- '/_view/solution/sales': typeof ViewSolutionSalesRoute
'/_view/updates/$slug': typeof ViewUpdatesSlugRoute
'/_view/vs/$slug': typeof ViewVsSlugRoute
'/api/images/$': typeof ApiImagesSplatRoute
@@ -1412,22 +1291,9 @@ export interface FileRouteTypes {
| '/product/search'
| '/product/self-hosting'
| '/roadmap/$slug'
- | '/solution/coaching'
- | '/solution/consulting'
- | '/solution/customer-success'
+ | '/solution/$slug'
| '/solution/engineering'
- | '/solution/field-engineering'
- | '/solution/government'
- | '/solution/healthcare'
- | '/solution/journalism'
- | '/solution/knowledge-workers'
- | '/solution/legal'
- | '/solution/media'
| '/solution/meeting'
- | '/solution/project-management'
- | '/solution/recruiting'
- | '/solution/research'
- | '/solution/sales'
| '/updates/$slug'
| '/vs/$slug'
| '/api/images/$'
@@ -1554,22 +1420,9 @@ export interface FileRouteTypes {
| '/product/search'
| '/product/self-hosting'
| '/roadmap/$slug'
- | '/solution/coaching'
- | '/solution/consulting'
- | '/solution/customer-success'
+ | '/solution/$slug'
| '/solution/engineering'
- | '/solution/field-engineering'
- | '/solution/government'
- | '/solution/healthcare'
- | '/solution/journalism'
- | '/solution/knowledge-workers'
- | '/solution/legal'
- | '/solution/media'
| '/solution/meeting'
- | '/solution/project-management'
- | '/solution/recruiting'
- | '/solution/research'
- | '/solution/sales'
| '/updates/$slug'
| '/vs/$slug'
| '/api/images/$'
@@ -1701,22 +1554,9 @@ export interface FileRouteTypes {
| '/_view/product/search'
| '/_view/product/self-hosting'
| '/_view/roadmap/$slug'
- | '/_view/solution/coaching'
- | '/_view/solution/consulting'
- | '/_view/solution/customer-success'
+ | '/_view/solution/$slug'
| '/_view/solution/engineering'
- | '/_view/solution/field-engineering'
- | '/_view/solution/government'
- | '/_view/solution/healthcare'
- | '/_view/solution/journalism'
- | '/_view/solution/knowledge-workers'
- | '/_view/solution/legal'
- | '/_view/solution/media'
| '/_view/solution/meeting'
- | '/_view/solution/project-management'
- | '/_view/solution/recruiting'
- | '/_view/solution/research'
- | '/_view/solution/sales'
| '/_view/updates/$slug'
| '/_view/vs/$slug'
| '/api/images/$'
@@ -2243,34 +2083,6 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ViewUpdatesSlugRouteImport
parentRoute: typeof ViewRouteRoute
}
- '/_view/solution/sales': {
- id: '/_view/solution/sales'
- path: '/solution/sales'
- fullPath: '/solution/sales'
- preLoaderRoute: typeof ViewSolutionSalesRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/research': {
- id: '/_view/solution/research'
- path: '/solution/research'
- fullPath: '/solution/research'
- preLoaderRoute: typeof ViewSolutionResearchRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/recruiting': {
- id: '/_view/solution/recruiting'
- path: '/solution/recruiting'
- fullPath: '/solution/recruiting'
- preLoaderRoute: typeof ViewSolutionRecruitingRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/project-management': {
- id: '/_view/solution/project-management'
- path: '/solution/project-management'
- fullPath: '/solution/project-management'
- preLoaderRoute: typeof ViewSolutionProjectManagementRouteImport
- parentRoute: typeof ViewRouteRoute
- }
'/_view/solution/meeting': {
id: '/_view/solution/meeting'
path: '/solution/meeting'
@@ -2278,55 +2090,6 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ViewSolutionMeetingRouteImport
parentRoute: typeof ViewRouteRoute
}
- '/_view/solution/media': {
- id: '/_view/solution/media'
- path: '/solution/media'
- fullPath: '/solution/media'
- preLoaderRoute: typeof ViewSolutionMediaRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/legal': {
- id: '/_view/solution/legal'
- path: '/solution/legal'
- fullPath: '/solution/legal'
- preLoaderRoute: typeof ViewSolutionLegalRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/knowledge-workers': {
- id: '/_view/solution/knowledge-workers'
- path: '/solution/knowledge-workers'
- fullPath: '/solution/knowledge-workers'
- preLoaderRoute: typeof ViewSolutionKnowledgeWorkersRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/journalism': {
- id: '/_view/solution/journalism'
- path: '/solution/journalism'
- fullPath: '/solution/journalism'
- preLoaderRoute: typeof ViewSolutionJournalismRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/healthcare': {
- id: '/_view/solution/healthcare'
- path: '/solution/healthcare'
- fullPath: '/solution/healthcare'
- preLoaderRoute: typeof ViewSolutionHealthcareRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/government': {
- id: '/_view/solution/government'
- path: '/solution/government'
- fullPath: '/solution/government'
- preLoaderRoute: typeof ViewSolutionGovernmentRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/field-engineering': {
- id: '/_view/solution/field-engineering'
- path: '/solution/field-engineering'
- fullPath: '/solution/field-engineering'
- preLoaderRoute: typeof ViewSolutionFieldEngineeringRouteImport
- parentRoute: typeof ViewRouteRoute
- }
'/_view/solution/engineering': {
id: '/_view/solution/engineering'
path: '/solution/engineering'
@@ -2334,25 +2097,11 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ViewSolutionEngineeringRouteImport
parentRoute: typeof ViewRouteRoute
}
- '/_view/solution/customer-success': {
- id: '/_view/solution/customer-success'
- path: '/solution/customer-success'
- fullPath: '/solution/customer-success'
- preLoaderRoute: typeof ViewSolutionCustomerSuccessRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/consulting': {
- id: '/_view/solution/consulting'
- path: '/solution/consulting'
- fullPath: '/solution/consulting'
- preLoaderRoute: typeof ViewSolutionConsultingRouteImport
- parentRoute: typeof ViewRouteRoute
- }
- '/_view/solution/coaching': {
- id: '/_view/solution/coaching'
- path: '/solution/coaching'
- fullPath: '/solution/coaching'
- preLoaderRoute: typeof ViewSolutionCoachingRouteImport
+ '/_view/solution/$slug': {
+ id: '/_view/solution/$slug'
+ path: '/solution/$slug'
+ fullPath: '/solution/$slug'
+ preLoaderRoute: typeof ViewSolutionSlugRouteImport
parentRoute: typeof ViewRouteRoute
}
'/_view/roadmap/$slug': {
@@ -2944,22 +2693,9 @@ interface ViewRouteRouteChildren {
ViewProductSearchRoute: typeof ViewProductSearchRoute
ViewProductSelfHostingRoute: typeof ViewProductSelfHostingRoute
ViewRoadmapSlugRoute: typeof ViewRoadmapSlugRoute
- ViewSolutionCoachingRoute: typeof ViewSolutionCoachingRoute
- ViewSolutionConsultingRoute: typeof ViewSolutionConsultingRoute
- ViewSolutionCustomerSuccessRoute: typeof ViewSolutionCustomerSuccessRoute
+ ViewSolutionSlugRoute: typeof ViewSolutionSlugRoute
ViewSolutionEngineeringRoute: typeof ViewSolutionEngineeringRoute
- ViewSolutionFieldEngineeringRoute: typeof ViewSolutionFieldEngineeringRoute
- ViewSolutionGovernmentRoute: typeof ViewSolutionGovernmentRoute
- ViewSolutionHealthcareRoute: typeof ViewSolutionHealthcareRoute
- ViewSolutionJournalismRoute: typeof ViewSolutionJournalismRoute
- ViewSolutionKnowledgeWorkersRoute: typeof ViewSolutionKnowledgeWorkersRoute
- ViewSolutionLegalRoute: typeof ViewSolutionLegalRoute
- ViewSolutionMediaRoute: typeof ViewSolutionMediaRoute
ViewSolutionMeetingRoute: typeof ViewSolutionMeetingRoute
- ViewSolutionProjectManagementRoute: typeof ViewSolutionProjectManagementRoute
- ViewSolutionRecruitingRoute: typeof ViewSolutionRecruitingRoute
- ViewSolutionResearchRoute: typeof ViewSolutionResearchRoute
- ViewSolutionSalesRoute: typeof ViewSolutionSalesRoute
ViewUpdatesSlugRoute: typeof ViewUpdatesSlugRoute
ViewVsSlugRoute: typeof ViewVsSlugRoute
ViewBlogIndexRoute: typeof ViewBlogIndexRoute
@@ -3030,22 +2766,9 @@ const ViewRouteRouteChildren: ViewRouteRouteChildren = {
ViewProductSearchRoute: ViewProductSearchRoute,
ViewProductSelfHostingRoute: ViewProductSelfHostingRoute,
ViewRoadmapSlugRoute: ViewRoadmapSlugRoute,
- ViewSolutionCoachingRoute: ViewSolutionCoachingRoute,
- ViewSolutionConsultingRoute: ViewSolutionConsultingRoute,
- ViewSolutionCustomerSuccessRoute: ViewSolutionCustomerSuccessRoute,
+ ViewSolutionSlugRoute: ViewSolutionSlugRoute,
ViewSolutionEngineeringRoute: ViewSolutionEngineeringRoute,
- ViewSolutionFieldEngineeringRoute: ViewSolutionFieldEngineeringRoute,
- ViewSolutionGovernmentRoute: ViewSolutionGovernmentRoute,
- ViewSolutionHealthcareRoute: ViewSolutionHealthcareRoute,
- ViewSolutionJournalismRoute: ViewSolutionJournalismRoute,
- ViewSolutionKnowledgeWorkersRoute: ViewSolutionKnowledgeWorkersRoute,
- ViewSolutionLegalRoute: ViewSolutionLegalRoute,
- ViewSolutionMediaRoute: ViewSolutionMediaRoute,
ViewSolutionMeetingRoute: ViewSolutionMeetingRoute,
- ViewSolutionProjectManagementRoute: ViewSolutionProjectManagementRoute,
- ViewSolutionRecruitingRoute: ViewSolutionRecruitingRoute,
- ViewSolutionResearchRoute: ViewSolutionResearchRoute,
- ViewSolutionSalesRoute: ViewSolutionSalesRoute,
ViewUpdatesSlugRoute: ViewUpdatesSlugRoute,
ViewVsSlugRoute: ViewVsSlugRoute,
ViewBlogIndexRoute: ViewBlogIndexRoute,
diff --git a/apps/web/src/routes/_view/about.tsx b/apps/web/src/routes/_view/about.tsx
index d486b36a67..b92cfe2dd9 100644
--- a/apps/web/src/routes/_view/about.tsx
+++ b/apps/web/src/routes/_view/about.tsx
@@ -97,11 +97,8 @@ function Component() {
};
return (
-
-
+
+
-
-
+
+
About
@@ -215,7 +212,7 @@ function OurStoryGrid({
setSelectedItem({ type: "story" })}
- className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-center transition-colors hover:bg-stone-50"
+ className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-left transition-colors hover:bg-stone-50"
>
setSelectedItem({ type: "photo", data: photo })}
- className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-center transition-colors hover:bg-stone-50"
+ className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-left transition-colors hover:bg-stone-50"
>
void }) {
-
+
How We Landed on Char
@@ -690,7 +687,7 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
focused point of view.
-
+
Our manifesto
@@ -710,7 +707,7 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
We stand with those who value real connection and purposeful work.
-
+
Where we are now
@@ -729,7 +726,7 @@ function StoryDetail({ onClose }: { onClose: () => void }) {
-
+
Char
John Jeong, Yujong Lee
@@ -802,7 +799,7 @@ function FounderDetail({
-
+
{founder.name}
diff --git a/apps/web/src/routes/_view/app/-integration-ui.tsx b/apps/web/src/routes/_view/app/-integration-ui.tsx
index b0de1fdcb3..f6b059b17a 100644
--- a/apps/web/src/routes/_view/app/-integration-ui.tsx
+++ b/apps/web/src/routes/_view/app/-integration-ui.tsx
@@ -47,7 +47,7 @@ export function IntegrationButton({
export function IntegrationPageLayout({ children }: { children: ReactNode }) {
return (
-
+
{children}
diff --git a/apps/web/src/routes/_view/blog/$slug.tsx b/apps/web/src/routes/_view/blog/$slug.tsx
index 9e57fa15ed..8c4cf5b5e2 100644
--- a/apps/web/src/routes/_view/blog/$slug.tsx
+++ b/apps/web/src/routes/_view/blog/$slug.tsx
@@ -9,7 +9,6 @@ import { cn } from "@hypr/utils";
import { DownloadButton } from "@/components/download-button";
import { Image } from "@/components/image";
import { defaultMDXComponents } from "@/components/mdx";
-import { SlashSeparator } from "@/components/slash-separator";
import { useBlogToc } from "@/hooks/use-blog-toc";
import { getPlatformCTA, usePlatform } from "@/hooks/use-platform";
import { AUTHOR_AVATARS } from "@/lib/team";
@@ -101,20 +100,14 @@ function Component() {
const { article, relatedArticles } = Route.useLoaderData();
return (
-
+
-
+
-
-
@@ -123,31 +116,31 @@ function Component() {
function HeroSection({ article }: { article: any }) {
return (
-
+
←
Back to Blog
{article.category && (
-
+
{article.category}
)}
-
+
{article.title}
{article.author.length > 0 && (
-
+
{article.author.map((name: string) => {
const avatarUrl = AUTHOR_AVATARS[name];
return (
-
+
{avatarUrl && (
)}
-
{name}
+
{name}
);
})}
)}
-
+
{new Date(article.date).toLocaleDateString("en-US", {
year: "numeric",
month: "long",
@@ -178,8 +168,10 @@ function HeroSection({ article }: { article: any }) {
function ArticleContent({ article }: { article: any }) {
return (
-
-
+
+
+
+
);
}
@@ -196,7 +188,7 @@ function RelatedArticlesSection({
return (
-
More articles
+
More articles
-
+
-
+
Try Char for yourself
@@ -469,7 +461,7 @@ function RelatedArticleCard({ article }: { article: any }) {
/>
-
+
{title}
diff --git a/apps/web/src/routes/_view/blog/index.tsx b/apps/web/src/routes/_view/blog/index.tsx
index 73554837d1..05ecf9e68d 100644
--- a/apps/web/src/routes/_view/blog/index.tsx
+++ b/apps/web/src/routes/_view/blog/index.tsx
@@ -4,7 +4,6 @@ import { useMemo, useState } from "react";
import { cn } from "@hypr/utils";
-import { SlashSeparator } from "@/components/slash-separator";
import { AUTHOR_AVATARS } from "@/lib/team";
const CATEGORIES = [
@@ -95,16 +94,12 @@ function Component() {
);
return (
-
-
+
+
{featuredArticles.length > 0 && (
)}
-
-
- Blog
-
-
- Insights, updates, and stories from the Char team
-
+
);
}
@@ -222,7 +217,7 @@ function DesktopSidebar({
return (
-
+
Categories
@@ -231,12 +226,12 @@ function DesktopSidebar({
className={cn([
"w-full cursor-pointer rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors",
selectedCategory === null
- ? "bg-stone-100 text-stone-800"
- : "text-stone-600 hover:bg-stone-50",
+ ? "bg-surface text-fg"
+ : "text-fg hover:bg-surface-subtle",
])}
>
All Articles
-
+
({totalArticles})
@@ -246,8 +241,8 @@ function DesktopSidebar({
className={cn([
"w-full cursor-pointer rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors",
selectedCategory === "featured"
- ? "bg-stone-100 text-stone-800"
- : "text-stone-600 hover:bg-stone-50",
+ ? "bg-surface text-fg"
+ : "text-fg hover:bg-surface-subtle",
])}
>
Featured
@@ -263,8 +258,8 @@ function DesktopSidebar({
className={cn([
"w-full cursor-pointer rounded-lg px-3 py-2 text-left text-sm font-medium transition-colors",
selectedCategory === category
- ? "bg-stone-100 text-stone-800"
- : "text-stone-600 hover:bg-stone-50",
+ ? "text-fg bg-stone-100"
+ : "text-fg hover:bg-surface-subtle",
])}
>
{category}
@@ -328,7 +323,7 @@ function AllArticlesSection({
}) {
if (articles.length === 0) {
return (
-
+
No articles yet. Check back soon!
);
@@ -352,7 +347,7 @@ function AllArticlesSection({
function SectionHeader({ title }: { title: string }) {
return (
);
@@ -399,7 +394,7 @@ function MostRecentFeaturedCard({ article }: { article: Article }) {
)}
@@ -571,7 +566,7 @@ function ArticleListItem({ article }: { article: Article }) {
{article.category}
)}
-
+
{article.title}
diff --git a/apps/web/src/routes/_view/brand.tsx b/apps/web/src/routes/_view/brand.tsx
index 52ef68cf0d..f8fd2c0e0c 100644
--- a/apps/web/src/routes/_view/brand.tsx
+++ b/apps/web/src/routes/_view/brand.tsx
@@ -190,11 +190,8 @@ function Component() {
};
return (
-
-
+
+
-
-
+
+
Brand
@@ -310,7 +307,7 @@ function VisualAssetsGrid({
setSelectedItem({ type: "visual", data: asset })}
- className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-center transition-colors hover:bg-stone-50"
+ className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-left transition-colors hover:bg-stone-50"
>
setSelectedItem({ type: "typography", data: font })}
- className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-center transition-colors hover:bg-stone-50"
+ className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-left transition-colors hover:bg-stone-50"
>
setSelectedItem({ type: "color", data: color })}
- className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-center transition-colors hover:bg-stone-50"
+ className="group flex h-fit cursor-pointer flex-col items-center rounded-lg p-4 text-left transition-colors hover:bg-stone-50"
>
+
@@ -233,7 +233,7 @@ function Component() {
const hasTokens = search.access_token && search.refresh_token;
return (
-
+
diff --git a/apps/web/src/routes/_view/callback/integration.tsx b/apps/web/src/routes/_view/callback/integration.tsx
index 5283b0d0c2..35c1f6e6ef 100644
--- a/apps/web/src/routes/_view/callback/integration.tsx
+++ b/apps/web/src/routes/_view/callback/integration.tsx
@@ -106,7 +106,7 @@ function Component() {
if (search.flow === "desktop") {
return (
-
+
diff --git a/apps/web/src/routes/_view/changelog/$slug.tsx b/apps/web/src/routes/_view/changelog/$slug.tsx
index b78e46a140..2db2424428 100644
--- a/apps/web/src/routes/_view/changelog/$slug.tsx
+++ b/apps/web/src/routes/_view/changelog/$slug.tsx
@@ -82,11 +82,8 @@ function Component() {
);
return (
-
-
+
+
@@ -119,7 +116,7 @@ function Component() {
-
+
-
+
-
-
+
+
View the Code
@@ -248,7 +245,7 @@ function DownloadLinksHeroMobile({ version }: { version: string }) {
])}
>
-
+
{link.platform}
@@ -293,8 +290,8 @@ function RelatedReleases({
return (
-
-
+
+
Other Releases
Explore more versions of Char
@@ -362,7 +359,7 @@ function RelatedReleases({
})}
-
+
-
-
+
+
+
{changelogs.map((changelog, index) => (
-
+
{index < changelogs.length - 1 && (
@@ -58,7 +55,7 @@ function Component() {
))}
-
+
);
@@ -66,11 +63,11 @@ function Component() {
function HeroSection() {
return (
-
-
+
+
Changelog
-
+
Track every update, improvement, and fix to Char
@@ -131,7 +128,7 @@ function ChangelogSection({ changelog }: { changelog: ChangelogWithMeta }) {
-
+
diff --git a/apps/web/src/routes/_view/choose.tsx b/apps/web/src/routes/_view/choose.tsx
index 6125e01d71..241d30772b 100644
--- a/apps/web/src/routes/_view/choose.tsx
+++ b/apps/web/src/routes/_view/choose.tsx
@@ -4,8 +4,6 @@ import { useState } from "react";
import { cn } from "@hypr/utils";
-import { SlashSeparator } from "@/components/slash-separator";
-
export const Route = createFileRoute("/_view/choose")({
component: Component,
head: () => ({
@@ -181,11 +179,8 @@ function Component() {
if (step === "reveal") {
return (
-
-