verification.tsx 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import Head from "next/head"
  2. import Image from "next/legacy/image"
  3. import Hero from "../components/Hero"
  4. import Layout from "../components/Layout"
  5. import { withDefaultStaticProps } from "../utils/defaultStaticProps"
  6. import { IconCard } from "../components/IconCard"
  7. import LinkButton from "../components/LinkButton"
  8. import { useIntl, FormattedMessage } from "react-intl"
  9. import verified from "../data/verified"
  10. import illoProfile from "../public/illustrations/verification_profile.png"
  11. import illoEdit from "../public/illustrations/verification_edit.png"
  12. const Account = ({ name, username, url, image }) => (
  13. <a
  14. href={url}
  15. rel="noopener"
  16. className="group flex rounded-lg bg-white p-8 text-gray-0 hover:text-blurple-500"
  17. >
  18. <div className="relative h-14 w-14 flex-shrink-0 rounded-[50%]">
  19. {image && (
  20. <Image src={image} alt="" layout="fill" className="rounded-[50%] " />
  21. )}
  22. </div>
  23. <div className="truncate px-4">
  24. <span className="b1 block truncate !font-bold">{name}</span>
  25. <span className="b2 !font-semibold text-blurple-600 group-hover:text-blurple-500">
  26. @{username}
  27. </span>
  28. </div>
  29. </a>
  30. )
  31. const Verification = () => {
  32. const intl = useIntl()
  33. return (
  34. <Layout>
  35. <div dir="ltr" className="[unicode-bidi:plaintext]">
  36. <Hero homepage>
  37. <div className="b2 mb-4 pt-8 !font-bold uppercase text-nightshade-100">
  38. <FormattedMessage
  39. id="verification.feature_highlight"
  40. defaultMessage="Feature Highlight"
  41. />
  42. </div>
  43. <h1 className="h1 mb-4">
  44. <FormattedMessage
  45. id="verification.title"
  46. defaultMessage="Verification on Mastodon"
  47. />
  48. </h1>
  49. <p className="sh1 mb-11 max-w-[40ch]">
  50. <FormattedMessage
  51. id="verification.lead"
  52. defaultMessage="Verifying your identity on Mastodon is for everyone. Based on open web standards, now and forever free."
  53. />
  54. </p>
  55. <div className="flex justify-center gap-12">
  56. <LinkButton size="large" href="/apps">
  57. <FormattedMessage
  58. id="home.get_the_app"
  59. defaultMessage="Get the app"
  60. />
  61. </LinkButton>
  62. <LinkButton size="large" href="/servers" light borderless>
  63. <FormattedMessage
  64. id="home.create_account"
  65. defaultMessage="Create account"
  66. />
  67. </LinkButton>
  68. </div>
  69. </Hero>
  70. <div className="full-width-bg">
  71. <div className="full-width-bg__inner">
  72. <section className="grid grid-cols-12 gap-gutter pb-20">
  73. <div className="col-span-12 grid gap-gutter md:grid-cols-3 xl:col-span-10 xl:col-start-2">
  74. <IconCard
  75. title={
  76. <FormattedMessage
  77. id="verification.why.privacy.title"
  78. defaultMessage="Privacy-friendly"
  79. />
  80. }
  81. icon="privacy"
  82. copy={
  83. <FormattedMessage
  84. id="verification.why.privacy.body"
  85. defaultMessage="You do not need to submit your documents anywhere, so there is no chance of them being leaked."
  86. />
  87. }
  88. />
  89. <IconCard
  90. title={
  91. <FormattedMessage
  92. id="verification.why.equality.title"
  93. defaultMessage="For everyone"
  94. />
  95. }
  96. icon="safe"
  97. copy={
  98. <FormattedMessage
  99. id="verification.why.equality.body"
  100. defaultMessage="You do not have to be a celebrity to verify your identity. You just need to have a website or web page."
  101. />
  102. }
  103. />
  104. <IconCard
  105. title={
  106. <FormattedMessage
  107. id="verification.why.decentralization.title"
  108. defaultMessage="Decentralized"
  109. />
  110. }
  111. icon="decentralized"
  112. copy={
  113. <FormattedMessage
  114. id="verification.why.decentralization.body"
  115. defaultMessage="There is no need to trust a central authority. The verification can be manually confirmed anytime."
  116. />
  117. }
  118. />
  119. </div>
  120. </section>
  121. </div>
  122. </div>
  123. <div className="full-width-bg bg-gray-5">
  124. <div className="full-width-bg__inner">
  125. <section className="pt-14 pb-[4.5rem] md:grid md:grid-cols-2 md:items-center md:gap-gutter xl:grid-cols-12">
  126. <div className="order-2 row-span-full xl:col-span-5 xl:col-start-8">
  127. <Image src={illoProfile} alt="" />
  128. </div>
  129. <div className="row-span-full xl:col-span-5 xl:col-start-2">
  130. <h2 className="h4 md:h3 mb-2 md:mb-5">
  131. <FormattedMessage
  132. id="verification.features.no_badge.title"
  133. defaultMessage="There is no blue badge"
  134. />
  135. </h2>
  136. <p className="sh1 mb-8 text-gray-1">
  137. <FormattedMessage
  138. id="verification.features.no_badge.body"
  139. defaultMessage={`Identity is not a yes or no question. There are few truly unique names in the world, so why should only the famous ones get a "yes"? At Mastodon, we don't rely on legal names and blue badges. Instead, we rely on the fact that people can be identified by their official websites.`}
  140. />
  141. </p>
  142. </div>
  143. </section>
  144. </div>
  145. </div>
  146. <div className="full-width-bg">
  147. <div className="full-width-bg__inner">
  148. <section className="pt-14 pb-[4.5rem] md:grid md:grid-cols-2 md:items-center md:gap-gutter xl:grid-cols-12">
  149. <div className="row-span-full xl:col-span-5 xl:col-start-2">
  150. <Image src={illoEdit} alt="" />
  151. </div>
  152. <div className="row-span-full xl:col-span-5 xl:col-start-8">
  153. <h2 className="h4 md:h3 mb-2 md:mb-5">
  154. <FormattedMessage
  155. id="verification.features.how_to.title"
  156. defaultMessage="Here's how"
  157. />
  158. </h2>
  159. <p className="sh1 mb-8 text-gray-1">
  160. <FormattedMessage
  161. id="verification.features.how_to.body"
  162. defaultMessage={`Put a link to your Mastodon profile on your website or webpage. The important part is that the link has to have a <code>rel="me"</code> attribute on it. Then edit your Mastodon profile and put the address of your website or web page in one of your four profile fields. Save your profile, that's it!`}
  163. values={{
  164. code: (text) => (
  165. <code className="font-mono font-medium text-blurple-600">
  166. {text}
  167. </code>
  168. ),
  169. }}
  170. />
  171. </p>
  172. </div>
  173. </section>
  174. </div>
  175. </div>
  176. <div className="full-width-bg -mb-footer-offset bg-gray-5 pb-footer-offset">
  177. <div className="full-width-bg__inner">
  178. <section className="grid grid-cols-12 gap-gutter py-20">
  179. <div className="col-span-12 lg:col-span-10 lg:col-start-2">
  180. <h3 className="h3 pb-6 text-center">
  181. <FormattedMessage
  182. id="verification.examples.title"
  183. defaultMessage="In the wild"
  184. />
  185. </h3>
  186. <p className="b1 mb-16 text-center ">
  187. <FormattedMessage
  188. id="verification.examples.lead"
  189. defaultMessage="Anyone can use verification on Mastodon, but here are just some of the most recognizable names that do…"
  190. />
  191. </p>
  192. <div className="grid grid-cols-[repeat(auto-fill,minmax(20rem,1fr))] gap-1">
  193. {verified.map(({ url, ...other }) => (
  194. <Account key={url} url={url} {...other} />
  195. ))}
  196. </div>
  197. </div>
  198. </section>
  199. </div>
  200. </div>
  201. </div>
  202. <Head>
  203. <title>
  204. {`${intl.formatMessage({
  205. id: "verification.page_title",
  206. defaultMessage: "Verification",
  207. })} - Mastodon`}
  208. </title>
  209. <meta
  210. property="og:title"
  211. content={intl.formatMessage({
  212. id: "verification.page_title",
  213. defaultMessage: "Verification",
  214. })}
  215. />
  216. <meta
  217. name="description"
  218. content={intl.formatMessage({
  219. id: "verification.page_description",
  220. defaultMessage: "Learn how to get verified on Mastodon",
  221. })}
  222. />
  223. <meta
  224. name="og:description"
  225. content={intl.formatMessage({
  226. id: "verification.page_description",
  227. defaultMessage: "Learn how to get verified on Mastodon",
  228. })}
  229. />
  230. </Head>
  231. </Layout>
  232. )
  233. }
  234. export default Verification
  235. export const getStaticProps = withDefaultStaticProps()