black.css 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  1. ::view-transition-group(*) {
  2. animation-duration: 250ms;
  3. animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  4. }
  5. ::view-transition-old(root),
  6. ::view-transition-new(root) {
  7. animation-duration: 250ms;
  8. animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  9. }
  10. ::view-transition-image-pair(root) {
  11. isolation: isolate;
  12. }
  13. ::view-transition-old(root) {
  14. animation: none;
  15. mix-blend-mode: normal;
  16. }
  17. ::view-transition-new(root) {
  18. animation: none;
  19. mix-blend-mode: normal;
  20. }
  21. @keyframes fade-in {
  22. from {
  23. opacity: 0;
  24. }
  25. to {
  26. opacity: 1;
  27. }
  28. }
  29. @keyframes fade-out {
  30. from {
  31. opacity: 1;
  32. }
  33. to {
  34. opacity: 0;
  35. }
  36. }
  37. @keyframes fade-in-up {
  38. from {
  39. opacity: 0;
  40. transform: translateY(8px);
  41. }
  42. to {
  43. opacity: 1;
  44. transform: translateY(0);
  45. }
  46. }
  47. @keyframes reveal-terms {
  48. from {
  49. mask-position: 0% 200%;
  50. }
  51. to {
  52. mask-position: 0% 50%;
  53. }
  54. }
  55. @keyframes hide-terms {
  56. from {
  57. mask-position: 0% 50%;
  58. }
  59. to {
  60. mask-position: 0% 200%;
  61. }
  62. }
  63. ::view-transition-old(terms-20),
  64. ::view-transition-old(terms-100),
  65. ::view-transition-old(terms-200) {
  66. mask-image: linear-gradient(to bottom, transparent, black 25% 75%, transparent);
  67. mask-repeat: no-repeat;
  68. mask-size: 100% 200%;
  69. animation: hide-terms 200ms cubic-bezier(0.25, 0, 0.5, 1) forwards;
  70. }
  71. ::view-transition-new(terms-20),
  72. ::view-transition-new(terms-100),
  73. ::view-transition-new(terms-200) {
  74. mask-image: linear-gradient(to bottom, transparent, black 25% 75%, transparent);
  75. mask-repeat: no-repeat;
  76. mask-position: 0% 200%;
  77. mask-size: 100% 200%;
  78. animation: reveal-terms 300ms cubic-bezier(0.25, 0, 0.5, 1) 50ms forwards;
  79. }
  80. ::view-transition-old(actions-20),
  81. ::view-transition-old(actions-100),
  82. ::view-transition-old(actions-200) {
  83. animation: fade-out 80ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
  84. }
  85. ::view-transition-new(actions-20),
  86. ::view-transition-new(actions-100),
  87. ::view-transition-new(actions-200) {
  88. animation: fade-in-up 300ms cubic-bezier(0.16, 1, 0.3, 1) 300ms forwards;
  89. opacity: 0;
  90. }
  91. ::view-transition-group(card-20),
  92. ::view-transition-group(card-100),
  93. ::view-transition-group(card-200) {
  94. animation-duration: 250ms;
  95. animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  96. }
  97. [data-page="black"] {
  98. background: #000;
  99. min-height: 100vh;
  100. display: flex;
  101. flex-direction: column;
  102. align-items: center;
  103. justify-content: stretch;
  104. font-family: var(--font-mono);
  105. color: #fff;
  106. [data-component="header-logo"] {
  107. filter: drop-shadow(0 8px 24px rgba(0, 0, 0, 0.25)) drop-shadow(0 4px 16px rgba(0, 0, 0, 0.1));
  108. position: relative;
  109. z-index: 1;
  110. }
  111. .header-light-rays {
  112. position: absolute;
  113. inset: 0 0 auto 0;
  114. height: 30dvh;
  115. pointer-events: none;
  116. z-index: 0;
  117. }
  118. [data-component="header"] {
  119. display: flex;
  120. flex-direction: column;
  121. align-items: center;
  122. justify-content: center;
  123. padding-top: 40px;
  124. flex-shrink: 0;
  125. }
  126. [data-component="content"] {
  127. display: flex;
  128. flex-direction: column;
  129. align-items: center;
  130. width: 100%;
  131. flex-grow: 1;
  132. [data-slot="hero"] {
  133. display: flex;
  134. flex-direction: column;
  135. align-items: center;
  136. text-align: center;
  137. gap: 8px;
  138. margin-top: 40px;
  139. padding: 0 20px;
  140. @media (min-width: 768px) {
  141. margin-top: 60px;
  142. }
  143. h1 {
  144. color: rgba(255, 255, 255, 0.92);
  145. font-size: 16px;
  146. font-style: normal;
  147. font-weight: 400;
  148. line-height: 1.45;
  149. margin: 0;
  150. @media (min-width: 768px) {
  151. font-size: 20px;
  152. }
  153. @media (max-width: 480px) {
  154. font-size: 14px;
  155. }
  156. }
  157. p {
  158. color: rgba(255, 255, 255, 0.59);
  159. font-size: 16px;
  160. font-style: normal;
  161. font-weight: 400;
  162. line-height: 1.45;
  163. margin: 0;
  164. @media (min-width: 768px) {
  165. font-size: 20px;
  166. }
  167. @media (max-width: 480px) {
  168. font-size: 14px;
  169. }
  170. }
  171. }
  172. [data-slot="hero-black"] {
  173. margin-top: 40px;
  174. padding: 0 20px;
  175. position: relative;
  176. @media (min-width: 768px) {
  177. margin-top: 60px;
  178. }
  179. svg {
  180. width: 100%;
  181. max-width: 590px;
  182. height: auto;
  183. overflow: visible;
  184. filter: drop-shadow(0 0 20px rgba(255, 255, 255, calc(0.1 + var(--hero-black-glow-intensity, 0) * 0.15)))
  185. drop-shadow(0 -5px 30px rgba(255, 255, 255, calc(var(--hero-black-glow-intensity, 0) * 0.2)));
  186. mask-image: linear-gradient(to bottom, black, transparent);
  187. stroke-width: 1.5;
  188. [data-slot="black-base"] {
  189. fill: url(#hero-black-fill-gradient);
  190. stroke: url(#hero-black-stroke-gradient);
  191. }
  192. [data-slot="black-glow"] {
  193. fill: url(#hero-black-top-glow);
  194. pointer-events: none;
  195. }
  196. [data-slot="black-shimmer"] {
  197. fill: url(#hero-black-shimmer-gradient);
  198. pointer-events: none;
  199. mix-blend-mode: overlay;
  200. }
  201. }
  202. }
  203. [data-slot="cta"] {
  204. display: flex;
  205. flex-direction: column;
  206. gap: 16px;
  207. align-items: center;
  208. text-align: center;
  209. margin-top: -40px;
  210. width: 100%;
  211. @media (min-width: 768px) {
  212. margin-top: -20px;
  213. }
  214. [data-slot="heading"] {
  215. color: rgba(255, 255, 255, 0.92);
  216. text-align: center;
  217. font-size: 18px;
  218. font-style: normal;
  219. font-weight: 400;
  220. line-height: 160%;
  221. span {
  222. display: inline-block;
  223. }
  224. }
  225. [data-slot="subheading"] {
  226. color: rgba(255, 255, 255, 0.59);
  227. font-size: 15px;
  228. font-style: normal;
  229. font-weight: 400;
  230. line-height: 160%;
  231. @media (min-width: 768px) {
  232. font-size: 18px;
  233. line-height: 160%;
  234. }
  235. }
  236. [data-slot="button"] {
  237. display: inline-flex;
  238. height: 40px;
  239. padding: 0 12px;
  240. justify-content: center;
  241. align-items: center;
  242. gap: 8px;
  243. border-radius: 4px;
  244. background: rgba(255, 255, 255, 0.92);
  245. text-decoration: none;
  246. color: #000;
  247. font-family: "JetBrains Mono Nerd Font";
  248. font-size: 16px;
  249. font-style: normal;
  250. font-weight: 500;
  251. line-height: normal;
  252. &:hover {
  253. background: #e0e0e0;
  254. }
  255. &:active {
  256. transform: scale(0.98);
  257. }
  258. }
  259. [data-slot="back-soon"] {
  260. color: rgba(255, 255, 255, 0.59);
  261. text-align: center;
  262. font-size: 13px;
  263. font-style: normal;
  264. font-weight: 400;
  265. line-height: 160%; /* 20.8px */
  266. }
  267. [data-slot="follow-us"] {
  268. display: inline-flex;
  269. height: 40px;
  270. padding: 0 12px;
  271. justify-content: center;
  272. align-items: center;
  273. gap: 8px;
  274. border-radius: 4px;
  275. border: 1px solid rgba(255, 255, 255, 0.17);
  276. color: rgba(255, 255, 255, 0.59);
  277. font-family: var(--font-mono);
  278. font-size: 14px;
  279. font-style: normal;
  280. font-weight: 400;
  281. line-height: normal;
  282. text-decoration: none;
  283. }
  284. [data-slot="pricing"] {
  285. display: flex;
  286. flex-direction: column;
  287. gap: 16px;
  288. width: 100%;
  289. max-width: 660px;
  290. padding: 0 20px;
  291. @media (min-width: 768px) {
  292. padding: 0;
  293. }
  294. }
  295. [data-slot="paused"] {
  296. flex: 1;
  297. display: flex;
  298. align-items: center;
  299. justify-content: center;
  300. color: rgba(255, 255, 255, 0.59);
  301. font-size: 18px;
  302. font-style: normal;
  303. font-weight: 400;
  304. line-height: 160%;
  305. padding: 120px 20px;
  306. }
  307. [data-slot="pricing-card"] {
  308. display: flex;
  309. flex-direction: column;
  310. gap: 12px;
  311. padding: 24px;
  312. border: 1px solid rgba(255, 255, 255, 0.17);
  313. background: black;
  314. background-clip: padding-box;
  315. border-radius: 4px;
  316. text-decoration: none;
  317. transition: border-color 0.15s ease;
  318. cursor: pointer;
  319. text-align: left;
  320. @media (max-width: 480px) {
  321. padding: 16px;
  322. }
  323. &:hover:not(:active) {
  324. border-color: rgba(255, 255, 255, 0.35);
  325. }
  326. [data-slot="icon"] {
  327. color: rgba(255, 255, 255, 0.59);
  328. }
  329. [data-slot="price"] {
  330. display: flex;
  331. flex-wrap: wrap;
  332. align-items: baseline;
  333. gap: 8px;
  334. }
  335. [data-slot="amount"] {
  336. color: rgba(255, 255, 255, 0.92);
  337. font-size: 24px;
  338. font-weight: 500;
  339. }
  340. [data-slot="period"] {
  341. color: rgba(255, 255, 255, 0.59);
  342. font-size: 14px;
  343. }
  344. [data-slot="multiplier"] {
  345. color: rgba(255, 255, 255, 0.39);
  346. font-size: 14px;
  347. &::before {
  348. content: "·";
  349. margin-right: 8px;
  350. }
  351. }
  352. }
  353. [data-slot="selected-plan"] {
  354. display: flex;
  355. flex-direction: column;
  356. gap: 32px;
  357. width: 100%;
  358. max-width: 660px;
  359. margin: 0 auto;
  360. position: relative;
  361. background-color: rgba(0, 0, 0, 0.75);
  362. z-index: 1;
  363. @media (max-width: 480px) {
  364. margin: 0 20px;
  365. width: calc(100% - 40px);
  366. }
  367. }
  368. [data-slot="selected-card"] {
  369. display: flex;
  370. flex-direction: column;
  371. gap: 12px;
  372. padding: 24px;
  373. border: 1px solid rgba(255, 255, 255, 0.17);
  374. border-radius: 4px;
  375. width: 100%;
  376. [data-slot="icon"] {
  377. color: rgba(255, 255, 255, 0.59);
  378. }
  379. [data-slot="price"] {
  380. display: flex;
  381. flex-wrap: wrap;
  382. align-items: baseline;
  383. gap: 8px;
  384. }
  385. [data-slot="amount"] {
  386. color: rgba(255, 255, 255, 0.92);
  387. font-size: 24px;
  388. font-weight: 500;
  389. }
  390. [data-slot="period"] {
  391. color: rgba(255, 255, 255, 0.59);
  392. font-size: 14px;
  393. }
  394. [data-slot="multiplier"] {
  395. color: rgba(255, 255, 255, 0.39);
  396. font-size: 14px;
  397. &::before {
  398. content: "·";
  399. margin-right: 8px;
  400. }
  401. }
  402. [data-slot="terms"] {
  403. list-style: none;
  404. padding: 0;
  405. margin: 0;
  406. display: flex;
  407. flex-direction: column;
  408. gap: 8px;
  409. text-align: left;
  410. li {
  411. color: rgba(255, 255, 255, 0.59);
  412. font-size: 14px;
  413. line-height: 1.5;
  414. padding-left: 16px;
  415. position: relative;
  416. &::before {
  417. content: "▪";
  418. position: absolute;
  419. left: 0;
  420. color: rgba(255, 255, 255, 0.39);
  421. }
  422. @media (max-width: 768px) {
  423. font-size: 12px;
  424. }
  425. }
  426. }
  427. [data-slot="actions"] {
  428. display: flex;
  429. gap: 16px;
  430. margin-top: 8px;
  431. button,
  432. a {
  433. flex: 1;
  434. display: inline-flex;
  435. height: 48px;
  436. padding: 0 16px;
  437. justify-content: center;
  438. align-items: center;
  439. border-radius: 4px;
  440. font-family: var(--font-mono);
  441. font-size: 16px;
  442. font-weight: 400;
  443. text-decoration: none;
  444. cursor: pointer;
  445. }
  446. [data-slot="cancel"] {
  447. background: rgba(255, 255, 255, 0.05);
  448. border: 1px solid rgba(255, 255, 255, 0.17);
  449. color: rgba(255, 255, 255, 0.92);
  450. transition-property: background-color, border-color;
  451. transition-duration: 150ms;
  452. transition-timing-function: cubic-bezier(0.25, 0, 0.5, 1);
  453. &:hover {
  454. background-color: rgba(255, 255, 255, 0.08);
  455. border-color: rgba(255, 255, 255, 0.25);
  456. }
  457. }
  458. [data-slot="continue"] {
  459. background: rgb(255, 255, 255);
  460. color: rgb(0, 0, 0);
  461. transition: background-color 150ms cubic-bezier(0.25, 0, 0.5, 1);
  462. &:hover {
  463. background: rgba(255, 255, 255, 0.9);
  464. }
  465. }
  466. }
  467. }
  468. [data-slot="fine-print"] {
  469. color: rgba(255, 255, 255, 0.39);
  470. text-align: center;
  471. font-size: 13px;
  472. font-style: normal;
  473. font-weight: 400;
  474. line-height: 160%; /* 20.8px */
  475. font-style: italic;
  476. a {
  477. color: rgba(255, 255, 255, 0.39);
  478. text-decoration: underline;
  479. }
  480. }
  481. }
  482. /* Subscribe page styles */
  483. [data-slot="subscribe-form"] {
  484. display: flex;
  485. flex-direction: column;
  486. gap: 32px;
  487. align-items: center;
  488. margin-top: -18px;
  489. width: 100%;
  490. max-width: 660px;
  491. padding: 0 20px;
  492. @media (min-width: 768px) {
  493. margin-top: 40px;
  494. padding: 0;
  495. }
  496. [data-slot="form-card"] {
  497. width: 100%;
  498. border: 1px solid rgba(255, 255, 255, 0.17);
  499. border-radius: 4px;
  500. padding: 24px;
  501. display: flex;
  502. flex-direction: column;
  503. gap: 20px;
  504. }
  505. [data-slot="plan-header"] {
  506. display: flex;
  507. flex-direction: column;
  508. gap: 8px;
  509. }
  510. [data-slot="title"] {
  511. color: rgba(255, 255, 255, 0.92);
  512. font-size: 16px;
  513. font-weight: 400;
  514. margin-bottom: 8px;
  515. }
  516. [data-slot="icon"] {
  517. color: rgba(255, 255, 255, 0.59);
  518. isolation: isolate;
  519. transform: translateZ(0);
  520. }
  521. [data-slot="price"] {
  522. display: flex;
  523. flex-wrap: wrap;
  524. align-items: baseline;
  525. gap: 8px;
  526. }
  527. [data-slot="amount"] {
  528. color: rgba(255, 255, 255, 0.92);
  529. font-size: 24px;
  530. font-weight: 500;
  531. }
  532. [data-slot="period"] {
  533. color: rgba(255, 255, 255, 0.59);
  534. font-size: 14px;
  535. }
  536. [data-slot="multiplier"] {
  537. color: rgba(255, 255, 255, 0.39);
  538. font-size: 14px;
  539. &::before {
  540. content: "·";
  541. margin: 0 8px;
  542. }
  543. }
  544. [data-slot="divider"] {
  545. height: 1px;
  546. background: rgba(255, 255, 255, 0.17);
  547. }
  548. [data-slot="section-title"] {
  549. color: rgba(255, 255, 255, 0.92);
  550. font-size: 16px;
  551. font-weight: 400;
  552. }
  553. [data-slot="checkout-form"] {
  554. display: flex;
  555. flex-direction: column;
  556. gap: 20px;
  557. }
  558. [data-slot="error"] {
  559. color: #ff6b6b;
  560. font-size: 14px;
  561. }
  562. [data-slot="submit-button"] {
  563. width: 100%;
  564. height: 48px;
  565. background: rgba(255, 255, 255, 0.92);
  566. border: none;
  567. border-radius: 4px;
  568. color: #000;
  569. font-family: var(--font-mono);
  570. font-size: 16px;
  571. font-weight: 500;
  572. cursor: pointer;
  573. transition: background 0.15s ease;
  574. &:hover:not(:disabled) {
  575. background: #e0e0e0;
  576. }
  577. &:disabled {
  578. opacity: 0.5;
  579. cursor: not-allowed;
  580. }
  581. }
  582. [data-slot="charge-notice"] {
  583. color: #d4a500;
  584. font-size: 14px;
  585. text-align: center;
  586. }
  587. [data-slot="loading"] {
  588. display: flex;
  589. justify-content: center;
  590. padding: 40px 0;
  591. p {
  592. color: rgba(255, 255, 255, 0.59);
  593. font-size: 14px;
  594. }
  595. }
  596. [data-slot="fine-print"] {
  597. color: rgba(255, 255, 255, 0.39);
  598. text-align: center;
  599. font-size: 13px;
  600. font-style: italic;
  601. view-transition-name: fine-print;
  602. a {
  603. color: rgba(255, 255, 255, 0.39);
  604. text-decoration: underline;
  605. }
  606. }
  607. }
  608. }
  609. [data-component="footer"] {
  610. display: flex;
  611. flex-direction: column;
  612. width: 100%;
  613. justify-content: center;
  614. align-items: center;
  615. gap: 24px;
  616. flex-shrink: 0;
  617. @media (min-width: 768px) {
  618. height: 120px;
  619. }
  620. [data-slot="footer-content"] {
  621. display: flex;
  622. gap: 24px;
  623. align-items: center;
  624. justify-content: center;
  625. @media (min-width: 768px) {
  626. gap: 40px;
  627. }
  628. span,
  629. a {
  630. color: rgba(255, 255, 255, 0.39);
  631. font-family: "JetBrains Mono Nerd Font";
  632. font-size: 16px;
  633. font-style: normal;
  634. font-weight: 400;
  635. line-height: normal;
  636. text-decoration: none;
  637. }
  638. [data-slot="github-stars"] {
  639. color: rgba(255, 255, 255, 0.25);
  640. font-family: "JetBrains Mono Nerd Font";
  641. font-size: 16px;
  642. font-style: normal;
  643. font-weight: 400;
  644. line-height: normal;
  645. }
  646. [data-slot="anomaly"] {
  647. display: none;
  648. @media (min-width: 768px) {
  649. display: block;
  650. }
  651. }
  652. }
  653. [data-slot="anomaly-alt"] {
  654. color: rgba(255, 255, 255, 0.39);
  655. font-family: "JetBrains Mono Nerd Font";
  656. font-size: 16px;
  657. font-style: normal;
  658. font-weight: 400;
  659. line-height: normal;
  660. text-decoration: none;
  661. margin-bottom: 24px;
  662. a {
  663. color: rgba(255, 255, 255, 0.39);
  664. font-family: "JetBrains Mono Nerd Font";
  665. font-size: 16px;
  666. font-style: normal;
  667. font-weight: 400;
  668. line-height: normal;
  669. text-decoration: none;
  670. }
  671. @media (min-width: 768px) {
  672. display: none;
  673. }
  674. }
  675. }
  676. }
  677. [data-component="black-workspace-picker-modal"] {
  678. font-family: var(--font-mono);
  679. [data-slot="workspace-list"] {
  680. width: 100%;
  681. padding: 0;
  682. margin: 0;
  683. list-style: none;
  684. display: flex;
  685. flex-direction: column;
  686. align-items: flex-start;
  687. gap: 8px;
  688. align-self: stretch;
  689. outline: none;
  690. overflow-y: auto;
  691. max-height: 240px;
  692. scrollbar-width: none;
  693. &::-webkit-scrollbar {
  694. display: none;
  695. }
  696. }
  697. [data-slot="workspace-item"] {
  698. width: 100%;
  699. display: flex;
  700. padding: 8px 12px;
  701. align-items: center;
  702. gap: 8px;
  703. align-self: stretch;
  704. cursor: pointer;
  705. [data-slot="selected-icon"] {
  706. visibility: hidden;
  707. color: rgba(255, 255, 255, 0.39);
  708. font-family: "IBM Plex Mono", monospace;
  709. font-size: 16px;
  710. font-style: normal;
  711. font-weight: 400;
  712. line-height: 160%;
  713. }
  714. span:last-child {
  715. color: rgba(255, 255, 255, 0.92);
  716. font-size: 16px;
  717. font-style: normal;
  718. font-weight: 400;
  719. line-height: 160%;
  720. }
  721. &:hover,
  722. &[data-active="true"] {
  723. background: #161616;
  724. [data-slot="selected-icon"] {
  725. visibility: visible;
  726. }
  727. }
  728. }
  729. }