feature/branding
tsx 274 lines 10.8 KB
Raw
1 import type { Metadata } from "next";
2 import Link from "next/link";
3 import { StructuredData } from "@/components/structured-data";
4 import siteMetadata from "@/content/siteMetadata";
5 import { absoluteUrl, genPageMetadata } from "../seo";
6
7 const services = [
8 {
9 name: "Deploy",
10 eyebrow: "Ship apps",
11 description:
12 "Deploy NodeJS, Swift, and Ruby apps with one command. No YAML maze. No container busywork just to get something online.",
13 bullets: [
14 "SSH-based deploys from the smb CLI",
15 "NodeJS, Swift, and Ruby support out of the box",
16 "Release history and rollback-friendly workflow",
17 ],
18 },
19 {
20 name: "Auth",
21 eyebrow: "Accounts and access",
22 description:
23 "Handle sign-in, signup, sessions, and hosted auth flows without bolting together three different vendors first.",
24 bullets: [
25 "Console account signup and sign-in",
26 "Hosted auth apps for end users",
27 "User and access management across projects",
28 ],
29 },
30 {
31 name: "Mail",
32 eyebrow: "Domain mail routing",
33 description:
34 "Set up one Mail app per project, add inbox routes for the domain, keep forwarding on, and start keeping a real record of what came in.",
35 bullets: [
36 "One Mail app per project",
37 "Many inbox routes under one domain",
38 "Forwarding plus stored inbound messages",
39 ],
40 },
41 {
42 name: "GresIQ",
43 eyebrow: "Data layer",
44 description:
45 "Run the database side of your product inside the same platform instead of scattering app logic, auth, and data across disconnected tools.",
46 bullets: [
47 "Database-oriented service setup",
48 "Connection and service management in one place",
49 "Built to live alongside Deploy, Auth, and Mail",
50 ],
51 },
52 ];
53
54 export const metadata: Metadata = {
55 ...genPageMetadata({
56 title: "Services",
57 description:
58 "Explore smbCloud Platform for deploys, auth, mail, and GresIQ. One platform for shipping apps, handling accounts, routing email, and managing the data layer.",
59 path: "/services",
60 }),
61 keywords: [
62 "smbCloud Platform",
63 "app deployment platform",
64 "hosted auth",
65 "mail routing",
66 "developer database platform",
67 "NodeJS deployment",
68 "Swift deployment",
69 "Ruby deployment",
70 "email forwarding platform",
71 "authentication service",
72 "GresIQ",
73 ],
74 alternates: {
75 canonical: `${siteMetadata.siteUrl}/services`,
76 },
77 openGraph: {
78 title: `Services | ${siteMetadata.title}`,
79 description:
80 "Deploy, Auth, Mail, and GresIQ live under one smbCloud platform instead of four disconnected products.",
81 url: `${siteMetadata.siteUrl}/services`,
82 siteName: siteMetadata.title,
83 locale: "en_US",
84 type: "website",
85 },
86 };
87
88 export default function ServicesPage() {
89 const servicesStructuredData = {
90 "@context": "https://schema.org",
91 "@graph": [
92 {
93 "@type": "CollectionPage",
94 "@id": absoluteUrl("/services#webpage"),
95 url: absoluteUrl("/services"),
96 name: "smbCloud Platform",
97 description:
98 "Deploy, Auth, Mail, and GresIQ live under one smbCloud platform instead of four disconnected tools.",
99 isPartOf: {
100 "@id": absoluteUrl("/#website"),
101 },
102 },
103 {
104 "@type": "BreadcrumbList",
105 itemListElement: [
106 {
107 "@type": "ListItem",
108 position: 1,
109 name: "Home",
110 item: absoluteUrl("/"),
111 },
112 {
113 "@type": "ListItem",
114 position: 2,
115 name: "Services",
116 item: absoluteUrl("/services"),
117 },
118 ],
119 },
120 {
121 "@type": "ItemList",
122 name: "smbCloud Platform",
123 itemListElement: services.map((service, index) => ({
124 "@type": "ListItem",
125 position: index + 1,
126 name: service.name,
127 description: service.description,
128 })),
129 },
130 ],
131 };
132
133 return (
134 <div>
135 <StructuredData data={servicesStructuredData} />
136 <section className="relative overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20 lg:px-8">
137 <div className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[520px] bg-[radial-gradient(ellipse_75%_50%_at_50%_0%,rgba(99,102,241,0.18),transparent)] dark:bg-[radial-gradient(ellipse_75%_50%_at_50%_0%,rgba(99,102,241,0.12),transparent)]" />
138
139 <div className="mx-auto max-w-4xl">
140 <h1 className="max-w-3xl text-4xl font-bold tracking-tight text-slate-900 dark:text-white sm:text-6xl leading-[1.05]">
141 Four services. One platform.
142 </h1>
143
144 <p className="mt-6 max-w-2xl text-lg leading-8 text-slate-600 dark:text-slate-400">
145 Deploy apps, handle auth, manage business email, and keep the data
146 layer close to the rest of your stack without stitching together
147 four disconnected vendors.
148 </p>
149
150 <div className="mt-8 flex flex-col gap-4 sm:flex-row">
151 <Link
152 href="https://console.smbcloud.xyz"
153 target="_blank"
154 className="inline-flex items-center justify-center rounded-lg bg-indigo-600 px-8 py-3.5 text-sm font-semibold text-white shadow-lg shadow-indigo-500/20 transition-all hover:bg-indigo-500 hover:shadow-indigo-500/30 active:scale-[0.98]"
155 >
156 Open Console
157 </Link>
158 <Link
159 href="/"
160 className="inline-flex items-center justify-center rounded-lg border border-slate-300 dark:border-white/[0.12] px-8 py-3.5 text-sm font-semibold text-slate-700 dark:text-slate-200 transition-colors hover:bg-slate-50 dark:hover:bg-white/[0.04]"
161 >
162 Back to home
163 </Link>
164 </div>
165 </div>
166 </section>
167
168 <section className="px-6 pb-24 lg:px-8">
169 <div className="mx-auto max-w-5xl space-y-6">
170 {services.map((service) => (
171 <div
172 key={service.name}
173 className="rounded-2xl border border-slate-200 dark:border-white/[0.06] bg-white dark:bg-white/[0.02] p-6 sm:p-8"
174 >
175 <div className="grid gap-8 lg:grid-cols-[0.9fr_1.1fr] lg:items-start">
176 <div>
177 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
178 {service.eyebrow}
179 </p>
180 <h2 className="mt-3 text-2xl font-semibold tracking-tight text-slate-900 dark:text-white">
181 {service.name}
182 </h2>
183 </div>
184
185 <div>
186 <p className="text-base leading-7 text-slate-600 dark:text-slate-400">
187 {service.description}
188 </p>
189 <ul className="mt-5 space-y-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
190 {service.bullets.map((bullet) => (
191 <li key={bullet} className="flex gap-3">
192 <span className="mt-2 h-1.5 w-1.5 shrink-0 rounded-full bg-indigo-500" />
193 <span>{bullet}</span>
194 </li>
195 ))}
196 </ul>
197 </div>
198 </div>
199 </div>
200 ))}
201 </div>
202 </section>
203
204 <section className="border-t border-slate-200 dark:border-white/[0.06] px-6 py-24 lg:px-8">
205 <div className="mx-auto max-w-5xl grid gap-10 lg:grid-cols-[1.1fr_0.9fr] lg:items-start">
206 <div>
207 <p className="text-xs font-bold uppercase tracking-[0.2em] text-slate-400 dark:text-slate-600">
208 Why this matters
209 </p>
210 <h2 className="mt-4 text-3xl font-bold tracking-tight text-slate-900 dark:text-white">
211 Most teams do not need more tools. They need fewer seams.
212 </h2>
213 <p className="mt-5 max-w-2xl text-base leading-8 text-slate-600 dark:text-slate-400">
214 Deploy, Auth, Mail, and GresIQ solve different problems. Still,
215 they are all part of the same application stack. smbCloud keeps
216 them close, so you spend less time stitching products together and
217 more time shipping.
218 </p>
219 </div>
220
221 <div className="rounded-2xl border border-slate-200 dark:border-white/[0.06] bg-slate-50 dark:bg-white/[0.02] p-6">
222 <h3 className="text-lg font-semibold text-slate-900 dark:text-white">
223 A simple stack
224 </h3>
225 <dl className="mt-5 space-y-4 text-sm">
226 <div className="flex items-start justify-between gap-4 border-b border-slate-200 dark:border-white/[0.06] pb-4">
227 <dt className="text-slate-500 dark:text-slate-400">Deploy</dt>
228 <dd className="text-right font-medium text-slate-900 dark:text-white">
229 ship the app
230 </dd>
231 </div>
232 <div className="flex items-start justify-between gap-4 border-b border-slate-200 dark:border-white/[0.06] pb-4">
233 <dt className="text-slate-500 dark:text-slate-400">Auth</dt>
234 <dd className="text-right font-medium text-slate-900 dark:text-white">
235 handle accounts
236 </dd>
237 </div>
238 <div className="flex items-start justify-between gap-4 border-b border-slate-200 dark:border-white/[0.06] pb-4">
239 <dt className="text-slate-500 dark:text-slate-400">Mail</dt>
240 <dd className="text-right font-medium text-slate-900 dark:text-white">
241 route domain email
242 </dd>
243 </div>
244 <div className="flex items-start justify-between gap-4">
245 <dt className="text-slate-500 dark:text-slate-400">GresIQ</dt>
246 <dd className="text-right font-medium text-slate-900 dark:text-white">
247 run the data layer
248 </dd>
249 </div>
250 </dl>
251 </div>
252 </div>
253 </section>
254
255 <section className="px-6 pb-20 lg:px-8">
256 <div className="mx-auto max-w-2xl">
257 <div className="relative overflow-hidden rounded-2xl bg-indigo-600 px-8 py-14 text-center shadow-2xl shadow-indigo-500/20">
258 <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_at_top,rgba(255,255,255,0.1),transparent)]" />
259 <h2 className="relative text-3xl font-bold tracking-tight text-white">
260 Start with one service. Add the rest when you need them.
261 </h2>
262 <Link
263 href="https://console.smbcloud.xyz"
264 target="_blank"
265 className="relative mt-8 inline-block rounded-lg bg-white px-8 py-3.5 text-sm font-semibold text-indigo-700 shadow-sm transition-colors hover:bg-indigo-50"
266 >
267 Create free account
268 </Link>
269 </div>
270 </div>
271 </section>
272 </div>
273 );
274 }