styles.css 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. @font-face {
  2. font-family: 'Nunito';
  3. font-style: normal;
  4. font-weight: 200 1000;
  5. src: url(/fonts/nunito-variable.woff2) format('woff2');
  6. }
  7. :root {
  8. --bg-color: hsl(206, 12%, 95%);
  9. --text-color: hsl(200, 35%, 25%);
  10. --color-primary: #2196f3;
  11. --outline-color: #14e0ff;
  12. --button-bg: linear-gradient(to right, #e0e0e0, #bdbdbd);
  13. --button-bg-box-shadow-color: rgba(160, 160, 160, 0.5);
  14. --button-bg-primary: linear-gradient(to right, #42a5f5, #2979ff);
  15. --button-bg-primary-box-shadow-color: rgba(66, 165, 245, 0.5);
  16. --button-bg-secondary: linear-gradient(to right, #7e57c2, #6200ea);
  17. --button-bg-secondary-box-shadow-color: rgba(81, 45, 168, 0.5);
  18. --button-bg-danger: linear-gradient(to right, #ee3b3b, #e11c1c);
  19. --button-bg-danger-box-shadow-color: rgba(168, 45, 45, 0.5);
  20. --features-bg: hsl(230, 15%, 92%);
  21. --extensions-bg: hsl(230, 15%, 20%);
  22. --send-icon-hover-color: #673ab7;
  23. --send-spinner-icon-color: hsl(200, 15%, 70%);
  24. --copy-icon-color: hsl(144, 40%, 57%);
  25. --copy-icon-bg-color: hsl(144, 100%, 96%);
  26. --keyframe-slidey-offset: 0;
  27. }
  28. /* ANIMATIONS */
  29. @keyframes spin {
  30. from { transform: rotate(0deg); }
  31. to { transform: rotate(360deg); }
  32. }
  33. @keyframes fadein {
  34. from { opacity: 0 }
  35. to { opacity: 1 }
  36. }
  37. @keyframes slidey {
  38. from { transform: translateY(var(--keyframe-slidey-offset)) }
  39. to { transform: translateY(0) }
  40. }
  41. /* GENERAL */
  42. body {
  43. margin: 0;
  44. padding: 0;
  45. background-color: var(--bg-color);
  46. font: 16px/1.45 'Nunito', sans-serif;
  47. overflow-x: hidden;
  48. color: var(--text-color);
  49. }
  50. * {
  51. box-sizing: border-box;
  52. outline-color: var(--outline-color);
  53. }
  54. *::-moz-focus-inner {
  55. border: none;
  56. }
  57. a {
  58. color: var(--color-primary);
  59. border-bottom: 1px dotted transparent;
  60. text-decoration: none;
  61. transition: all 0.2s ease-out;
  62. }
  63. a:hover {
  64. border-bottom-color: var(--color-primary);
  65. }
  66. a.nav {
  67. color: inherit;
  68. padding-bottom: 2px;
  69. }
  70. a.nav:hover {
  71. color: var(--color-primary);
  72. }
  73. a.button,
  74. button {
  75. position: relative;
  76. width: auto;
  77. height: 40px;
  78. display: flex;
  79. align-items: center;
  80. justify-content: center;
  81. padding: 0 32px;
  82. font-size: 13px;
  83. font-weight: normal;
  84. text-align: center;
  85. line-height: 1;
  86. word-break: keep-all;
  87. color: #444;
  88. border: none;
  89. border-radius: 100px;
  90. transition: all 0.4s ease-out;
  91. cursor: pointer;
  92. overflow: hidden;
  93. background: var(--button-bg);
  94. box-shadow: 0 5px 6px var(--button-bg-box-shadow-color);
  95. }
  96. a.button.primary,
  97. button.primary {
  98. color: white;
  99. background: var(--button-bg-primary);
  100. box-shadow: 0 5px 6px var(--button-bg-primary-box-shadow-color);
  101. }
  102. a.button.secondary,
  103. button.secondary {
  104. color: white;
  105. background: var(--button-bg-secondary);
  106. box-shadow: 0 5px 6px var(--button-bg-secondary-box-shadow-color);
  107. }
  108. a.button.danger,
  109. button.danger {
  110. color: white;
  111. background: var(--button-bg-danger);
  112. box-shadow: 0 5px 6px var(--button-bg-danger-box-shadow-color);
  113. }
  114. a.button:focus,
  115. a.button:hover,
  116. button:focus,
  117. button:hover {
  118. box-shadow: 0 6px 15px var(--button-bg-box-shadow-color);
  119. transform: translateY(-2px) scale(1.02, 1.02);
  120. }
  121. a.button.primary:focus,
  122. a.button.primary:hover,
  123. button.primary:focus,
  124. button.primary:hover {
  125. box-shadow: 0 6px 15px var(--button-bg-primary-box-shadow-color);
  126. }
  127. a.button.secondary:focus,
  128. a.button.secondary:hover,
  129. button.secondary:focus,
  130. button.secondary:hover {
  131. box-shadow: 0 6px 15px var(--button-bg-secondary-box-shadow-color);
  132. }
  133. a.button.danger:focus,
  134. a.button.danger:hover,
  135. button.danger:focus,
  136. button.danger:hover {
  137. box-shadow: 0 6px 15px var(--button-bg-danger-box-shadow-color);
  138. }
  139. input {
  140. filter: none;
  141. }
  142. input[type="text"],
  143. input[type="email"],
  144. input[type="password"] {
  145. box-sizing: border-box;
  146. height: 40px;
  147. padding: 0 24px;
  148. font-size: 15px;
  149. letter-spacing: 0.05em;
  150. color: #444;
  151. background-color: white;
  152. border: none;
  153. border-radius: 100px;
  154. border-bottom: 5px solid #f5f5f5;
  155. border-bottom-width: 5px;
  156. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  157. transition: all 0.5s ease-out;
  158. }
  159. input[type="text"]:focus,
  160. input[type="email"]:focus,
  161. input[type="password"]:focus {
  162. outline: none;
  163. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  164. }
  165. input[type="text"]::placeholder,
  166. input[type="email"]::placeholder,
  167. input[type="password"]::placeholder {
  168. font-size: 14px;
  169. letter-spacing: 0.05em;
  170. color: #888;
  171. }
  172. input[type="checkbox"] {
  173. position: relative;
  174. width: 1rem;
  175. height: 1rem;
  176. display: flex;
  177. align-items: center;
  178. justify-content: center;
  179. border-radius: 4px;
  180. background-color: white;
  181. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  182. margin: 0;
  183. -webkit-appearance: none;
  184. appearance: none;
  185. cursor: pointer;
  186. }
  187. input[type="checkbox"]:focus {
  188. outline: 3px solid rgba(65, 164, 245, 0.5);
  189. }
  190. input[type="checkbox"]::after {
  191. content: "";
  192. position: absolute;
  193. top: 50%;
  194. left: 50%;
  195. width: 80%;
  196. height: 80%;
  197. display: block;
  198. border-radius: 2px;
  199. background-color: #9575cd;
  200. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  201. cursor: pointer;
  202. opacity: 0;
  203. transform: translate(-50%, -50%) scale(0);
  204. transition: all 0.1s ease-in-out;
  205. }
  206. input[type="checkbox"]:checked:after {
  207. opacity: 1;
  208. transform: translate(-50%, -50%) scale(1);
  209. }
  210. label.checkbox {
  211. display: flex;
  212. align-items: center;
  213. cursor: pointer;
  214. }
  215. label.checkbox input[type="checkbox"] {
  216. margin: 0 0.75rem 2px 0;
  217. }
  218. label {
  219. color: #555;
  220. }
  221. /* DISTINCT */
  222. .main-wrapper {
  223. min-height: 100vh;
  224. width: 100%;
  225. display: flex;
  226. flex: 0 0 auto;
  227. align-items: center;
  228. flex-direction: column;
  229. }
  230. /* HEADER */
  231. header {
  232. box-sizing: border-box;
  233. margin: 0;
  234. width: 1232px;
  235. max-width: 100%;
  236. padding: 0 32px;
  237. height: 102px;
  238. justify-content: space-between;
  239. align-items: center;
  240. display: flex;
  241. }
  242. header .logo-wrapper {
  243. display: flex;
  244. align-items: center;
  245. }
  246. header a.logo {
  247. position: relative;
  248. display: flex;
  249. align-items: center;
  250. font-size: 22px;
  251. font-weight: bold;
  252. text-decoration: none;
  253. border: none;
  254. margin: 0;
  255. padding: 0;
  256. }
  257. header a.logo:hover { border: none; color: inherit; }
  258. header .logo img {
  259. margin: 0 12px 0 0;
  260. padding: 0;
  261. }
  262. header ul.logo-links {
  263. list-style: none;
  264. display: flex;
  265. align-items: flex-end;
  266. margin: 0 0 0 0.5rem;
  267. padding: 0;
  268. }
  269. header ul.logo-links li {
  270. padding: 2px 0 0;
  271. margin: 0 0 0 32px;
  272. }
  273. header ul.logo-links li a {
  274. font-size: 16px;
  275. }
  276. header nav ul {
  277. display: flex;
  278. flex-direction: row-reverse;
  279. align-items: center;
  280. list-style: none;
  281. margin: 0;
  282. padding: 0;
  283. }
  284. header nav ul li {
  285. margin: 0 0 0 32px;
  286. padding: 0;
  287. }
  288. header nav ul li:last-child { margin-left: 0; }
  289. /* SHORTENER */
  290. main {
  291. width: 800px;
  292. max-width: 100%;
  293. flex: 0 0 auto;
  294. display: flex;
  295. flex-direction: column;
  296. align-items: center;
  297. padding: 0 1rem;
  298. margin-top: 1rem;
  299. }
  300. main #shorturl {
  301. display: flex;
  302. align-items: center;
  303. margin-bottom: 3rem;
  304. }
  305. main #shorturl h1 {
  306. border-bottom: 1px dotted transparent;
  307. font-weight: 300;
  308. font-size: 2rem;
  309. }
  310. main #shorturl h1.link {
  311. cursor: pointer;
  312. border-bottom-color: hsl(200, 35%, 65%);
  313. transition: opacity 0.2s ease-in-out;
  314. }
  315. main #shorturl h1.link:hover {
  316. opacity: 0.8;
  317. }
  318. main #shorturl .clipboard {
  319. width: 35px;
  320. display: flex;
  321. margin-right: 1rem;
  322. }
  323. main #shorturl button {
  324. width: 100%;
  325. display: flex;
  326. margin: 0;
  327. padding: 7px;
  328. box-shadow: none;
  329. outline: none;
  330. border: none;
  331. background: none;
  332. border-radius: 100%;
  333. background-color: var(--copy-icon-bg-color);
  334. transition: transform 0.4s ease-out;
  335. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  336. cursor: pointer;
  337. --keyframe-slidey-offset: 10px;
  338. animation: slidey 0.2s ease-in-out;
  339. }
  340. main #shorturl button:hover,
  341. main #shorturl button:focus {
  342. transform: translateY(-2px) scale(1.02, 1.02);
  343. }
  344. main #shorturl button:focus {
  345. outline: 3px solid rgba(65, 164, 245, 0.5);
  346. }
  347. main #shorturl svg {
  348. stroke: var(--copy-icon-color);
  349. width: 100%;
  350. height: auto;
  351. }
  352. main #shorturl svg.copy {
  353. stroke-width: 2.5;
  354. }
  355. main #shorturl svg.check {
  356. display: none;
  357. padding: 3px;
  358. stroke-width: 3;
  359. --keyframe-slidey-offset: -10px;
  360. animation: slidey 0.2s ease-in-out;
  361. }
  362. main #shorturl.copied button {
  363. background-color: transparent;
  364. box-shadow: none;
  365. }
  366. main #shorturl.copied button { display: none; }
  367. main #shorturl.copied svg.check { display: block; }
  368. main #shorturl h1 span {
  369. border-bottom: 1px dotted #999;
  370. }
  371. main form {
  372. position: relative;
  373. width: 100%;
  374. display: flex;
  375. flex-direction: column;
  376. }
  377. main form input#target {
  378. position: relative;
  379. width: 100%;
  380. height: 72px;
  381. display: flex;
  382. padding: 0 84px 0 40px;
  383. font-size: 20px;
  384. }
  385. main form input#target::placeholder {
  386. font-size: 17px;
  387. }
  388. main form .target-wrapper {
  389. position: relative;
  390. width: 100%;
  391. height: auto;
  392. }
  393. main form button.submit {
  394. box-sizing: content-box;
  395. position: absolute;
  396. cursor: pointer;
  397. width: 28px;
  398. height: auto;
  399. right: 0;
  400. top: 50%;
  401. padding: 4px;
  402. margin: 0 2rem 0;
  403. background: none;
  404. box-shadow: none;
  405. outline: none;
  406. border: none;
  407. transform: translateY(-52%);
  408. }
  409. main form button.submit:focus,
  410. main form button.submit:hover {
  411. outline: none;
  412. }
  413. main form button.submit svg.send {
  414. fill: #aaa;
  415. animation: fadein 0.3s ease-in-out;
  416. transition: fill 0.2s ease-in-out;
  417. }
  418. main form button.submit:hover svg.send {
  419. fill: var(--send-icon-hover-color);
  420. }
  421. main form button.submit svg.spinner {
  422. display: none;
  423. fill: none;
  424. stroke: var(--send-spinner-icon-color);
  425. stroke-width: 2;
  426. animation: spin 1s linear infinite, fadein 0.3s ease-in-out;
  427. }
  428. main form.htmx-request button.submit svg.send {
  429. display: none;
  430. }
  431. main form.htmx-request button.submit svg.spinner {
  432. display: block;
  433. }
  434. main form label#advanced {
  435. margin-top: 2rem;
  436. }
  437. /* INTRO */
  438. .introduction {
  439. width: 1200px;
  440. max-width: 98%;
  441. display: flex;
  442. align-items: center;
  443. margin: 150px 0 0;
  444. }
  445. .introduction .text-wrapper {
  446. display: flex;
  447. flex: 1 1 auto;
  448. flex-direction: column;
  449. align-items: flex-start;
  450. margin-top: -32px;
  451. }
  452. .introduction h2 {
  453. font-weight: 300;
  454. font-size: 28px;
  455. padding-right: 2rem;
  456. margin-bottom: 2.5rem
  457. }
  458. .introduction img {
  459. width: 60%;
  460. flex: 0 0 60%;
  461. max-width: 100%;
  462. height: auto;
  463. }
  464. /* FEATURES */
  465. .features {
  466. display: flex;
  467. flex-direction: column;
  468. align-items: center;
  469. width: 100%;
  470. flex: 0 0 auto;
  471. padding: 5rem 0;
  472. margin: 0;
  473. background-color: var(--features-bg);
  474. }
  475. .features h3 {
  476. font-weight: 300;
  477. font-size: 28px;
  478. margin-bottom: 72px;
  479. }
  480. .features ul {
  481. width: 1200px;
  482. max-width: 100%;
  483. flex: 1 1 auto;
  484. justify-content: center;
  485. flex-wrap: nowrap;
  486. display: flex;
  487. margin: 0;
  488. padding: 0;
  489. list-style: none;
  490. }
  491. .features ul li {
  492. max-width: 25%;
  493. display: flex;
  494. flex-direction: column;
  495. align-items: center;
  496. padding: 0 1.5rem;
  497. margin: 0;
  498. }
  499. .features ul li .icon {
  500. width: 48px;
  501. height: 48px;
  502. display: flex;
  503. align-items: center;
  504. justify-content: center;
  505. border-radius: 100%;
  506. background-color: var(--color-primary);
  507. }
  508. .features ul li .icon svg {
  509. width: 16px;
  510. height: auto;
  511. stroke: white;
  512. stroke-width: 2px;
  513. }
  514. .features ul li h4 {
  515. margin: 1rem;
  516. padding: 0;
  517. font-size: 15px;
  518. }
  519. .features ul li p {
  520. margin: 0;
  521. padding: 0;
  522. font-size: 14px;
  523. font-weight: 300;
  524. text-align: center;
  525. }
  526. /* EXTENSIONS */
  527. .extensions {
  528. width: 100%;
  529. display: flex;
  530. flex-direction: column;
  531. align-items: center;
  532. flex: 0 0 auto;
  533. flex-wrap: nowrap;
  534. padding: 5rem 0;
  535. background-color: var(--extensions-bg);
  536. color: white;
  537. }
  538. .extensions h3 {
  539. font-size: 28px;
  540. font-weight: 300;
  541. margin-bottom: 4rem;
  542. }
  543. .extensions .extenstions-wrapper {
  544. width: 1200px;
  545. max-width: 100%;
  546. display: flex;
  547. flex: 1 1 auto;
  548. justify-content: center;
  549. flex-wrap: nowrap;
  550. }
  551. .extensions a.extension-button {
  552. display: flex;
  553. align-items: center;
  554. justify-content: center;
  555. margin: 0 1rem;
  556. padding: 0.75rem 1.75rem;
  557. background-color: #eee;
  558. border: 1px solid #aaa;
  559. font-size: 14px;
  560. font-weight: bold;
  561. text-decoration: none;
  562. border-radius: 4px;
  563. outline: none;
  564. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  565. transition: transform 0.3s ease-out;
  566. cursor: pointer;
  567. }
  568. .extensions a.extension-button:hover {
  569. transform: translateY(-2px);
  570. }
  571. .extensions a.extension-button.chrome { color: #4285f4; }
  572. .extensions a.extension-button.firefox { color: #e0890f; }
  573. .extensions a.extension-button svg {
  574. width: 18px;
  575. height: auto;
  576. margin: 0 1rem 2px 0;
  577. }
  578. .extensions a.extension-button.chrome svg { fill: #4285f4; }
  579. .extensions a.extension-button.firefox svg { fill: #e0890f; }
  580. /* LOGIN & SIGNUP */
  581. form#login-signup {
  582. max-width: 100%;
  583. flex: 1 1 auto;
  584. display: flex;
  585. flex-direction: column;
  586. width: 400px;
  587. margin: 3rem 0 0;
  588. }
  589. form#login-signup label {
  590. display: flex;
  591. flex-direction: column;
  592. font-size: 16px;
  593. font-weight: bold;
  594. margin-bottom: 2rem;
  595. }
  596. form#login-signup input {
  597. width: 100%;
  598. height: 72px;
  599. margin-top: 1rem;
  600. padding: 0 3rem;
  601. font-size: 16px;
  602. }
  603. form#login-signup .buttons-wrapper {
  604. display: flex;
  605. align-items: center;
  606. margin-bottom: 1.5rem;
  607. }
  608. form#login-signup .buttons-wrapper button {
  609. height: 56px;
  610. flex: 1 1 auto;
  611. padding: 0 1rem 2px;
  612. margin-right: 1rem;
  613. }
  614. form#login-signup .buttons-wrapper button:last-child { margin-right: 0; }
  615. form#login-signup .buttons-wrapper button svg {
  616. width: 16px;
  617. height: auto;
  618. margin-right: 0.5rem;
  619. stroke: white;
  620. stroke-width: 2;
  621. }
  622. form#login-signup a.forgot-password {
  623. align-self: flex-start;
  624. font-size: 14px;
  625. }
  626. form#login-signup svg.spinner {
  627. display: none;
  628. animation: fadein 0.3s ease-in-out, spin 1s linear infinite;
  629. }
  630. form#login-signup.htmx-request:not(.signup) .login svg.spinner { display: block; }
  631. form#login-signup.htmx-request:not(.signup) .login svg.icon { display: none; }
  632. form#login-signup.htmx-request.signup .signup svg.spinner { display: block; }
  633. form#login-signup.htmx-request.signup .signup svg.icon { display: none; }
  634. form#login-signup.htmx-request .error { opacity: 0; }
  635. form#login-signup .error {
  636. color: red;
  637. animation: fadein 0.3s ease-in-out;
  638. }
  639. .login-signup-message {
  640. flex: 1 1 auto;
  641. margin-top: 3rem;
  642. }
  643. .login-signup-message h1 {
  644. font-weight: 300;
  645. font-size: 24px;
  646. }
  647. /* FOOTER */
  648. footer {
  649. width: 100%;
  650. display: flex;
  651. justify-content: center;
  652. padding: 1rem 0;
  653. font-size: 13px;
  654. text-align: center;
  655. }