styles.css 27 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373
  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. --button-bg-success: linear-gradient(to right, #31b647, #26be3f);
  21. --button-bg-success-box-shadow-color: rgba(25, 221, 51, 50%);
  22. --features-bg: hsl(230, 15%, 92%);
  23. --extensions-bg: hsl(230, 15%, 20%);
  24. --send-icon-hover-color: #673ab7;
  25. --send-spinner-icon-color: hsl(200, 15%, 70%);
  26. --success-icon-color: hsl(144, 40%, 57%);
  27. --error-icon-color: #f24f4f;
  28. --copy-icon-color: hsl(144, 40%, 57%);
  29. --copy-icon-bg-color: hsl(144, 100%, 96%);
  30. --keyframe-slidey-offset: 0;
  31. }
  32. /* ANIMATIONS */
  33. @keyframes spin {
  34. from { transform: rotate(0deg); }
  35. to { transform: rotate(360deg); }
  36. }
  37. @keyframes fadein {
  38. from { opacity: 0 }
  39. to { opacity: 1 }
  40. }
  41. @keyframes slidey {
  42. from { transform: translateY(var(--keyframe-slidey-offset)) }
  43. to { transform: translateY(0) }
  44. }
  45. /* GENERAL */
  46. body {
  47. margin: 0;
  48. padding: 0;
  49. background-color: var(--bg-color);
  50. font: 16px/1.45 'Nunito', sans-serif;
  51. overflow-x: hidden;
  52. color: var(--text-color);
  53. }
  54. * {
  55. box-sizing: border-box;
  56. outline-color: var(--outline-color);
  57. }
  58. *::-moz-focus-inner {
  59. border: none;
  60. }
  61. a {
  62. color: var(--color-primary);
  63. border-bottom: 1px dotted transparent;
  64. text-decoration: none;
  65. transition: all 0.2s ease-out;
  66. }
  67. a:hover {
  68. border-bottom-color: var(--color-primary);
  69. }
  70. a.nav {
  71. color: inherit;
  72. padding-bottom: 2px;
  73. }
  74. a.nav:hover {
  75. color: var(--color-primary);
  76. }
  77. a.button,
  78. button {
  79. position: relative;
  80. width: auto;
  81. height: 40px;
  82. display: flex;
  83. align-items: center;
  84. justify-content: center;
  85. padding: 0 32px;
  86. font-size: 13px;
  87. font-weight: normal;
  88. text-align: center;
  89. line-height: 1;
  90. word-break: keep-all;
  91. color: #444;
  92. border: none;
  93. border-radius: 100px;
  94. transition: all 0.4s ease-out;
  95. cursor: pointer;
  96. overflow: hidden;
  97. background: var(--button-bg);
  98. box-shadow: 0 5px 6px var(--button-bg-box-shadow-color);
  99. }
  100. a.button.primary,
  101. button.primary {
  102. color: white;
  103. background: var(--button-bg-primary);
  104. box-shadow: 0 5px 6px var(--button-bg-primary-box-shadow-color);
  105. }
  106. a.button.secondary,
  107. button.secondary {
  108. color: white;
  109. background: var(--button-bg-secondary);
  110. box-shadow: 0 5px 6px var(--button-bg-secondary-box-shadow-color);
  111. }
  112. a.button.danger,
  113. button.danger {
  114. color: white;
  115. background: var(--button-bg-danger);
  116. box-shadow: 0 5px 6px var(--button-bg-danger-box-shadow-color);
  117. }
  118. a.button.success,
  119. button.success {
  120. color: white;
  121. background: var(--button-bg-success);
  122. box-shadow: 0 5px 6px var(--button-bg-success-box-shadow-color);
  123. }
  124. a.button:focus,
  125. a.button:hover,
  126. button:focus,
  127. button:hover {
  128. box-shadow: 0 6px 15px var(--button-bg-box-shadow-color);
  129. transform: translateY(-2px) scale(1.02, 1.02);
  130. }
  131. a.button.primary:focus,
  132. a.button.primary:hover,
  133. button.primary:focus,
  134. button.primary:hover {
  135. box-shadow: 0 6px 15px var(--button-bg-primary-box-shadow-color);
  136. }
  137. a.button.secondary:focus,
  138. a.button.secondary:hover,
  139. button.secondary:focus,
  140. button.secondary:hover {
  141. box-shadow: 0 6px 15px var(--button-bg-secondary-box-shadow-color);
  142. }
  143. a.button.danger:focus,
  144. a.button.danger:hover,
  145. button.danger:focus,
  146. button.danger:hover {
  147. box-shadow: 0 6px 15px var(--button-bg-danger-box-shadow-color);
  148. }
  149. a.button.success:focus,
  150. a.button.success:hover,
  151. button.success:focus,
  152. button.success:hover {
  153. box-shadow: 0 6px 15px var(--button-bg-success-box-shadow-color);
  154. }
  155. button svg.with-text,
  156. button span.icon svg {
  157. width: 16px;
  158. height: auto;
  159. margin-right: 0.5rem;
  160. stroke: white;
  161. stroke-width: 2;
  162. }
  163. button.action {
  164. padding: 5px;
  165. width: 24px;
  166. height: 24px;
  167. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  168. }
  169. button.action svg {
  170. width: 100%;
  171. margin-right: 0;
  172. }
  173. button.action.delete {
  174. background: hsl(0, 100%, 96%);
  175. }
  176. button.action.delete svg {
  177. stroke-width: 2;
  178. stroke: hsl(0, 100%, 69%);
  179. }
  180. button.action.edit {
  181. background: hsl(46, 100%, 94%);
  182. }
  183. button.action.edit svg {
  184. stroke-width: 2.5;
  185. stroke: hsl(46, 90%, 50%);
  186. }
  187. button.action.stats {
  188. background: hsl(260, 100%, 96%);
  189. }
  190. button.action.stats svg {
  191. stroke-width: 2.5;
  192. stroke: hsl(260, 100%, 69%);
  193. }
  194. button.table-nav {
  195. box-sizing: border-box;
  196. width: auto;
  197. height: 28px;
  198. display: flex;
  199. flex: 0 0 auto;
  200. align-items: center;
  201. justify-content: center;
  202. padding: 0 8px;
  203. border: none;
  204. border-radius: 4px;
  205. box-shadow: 0 0px 10px rgba(100, 100, 100, 0.1);
  206. background: none;
  207. background-color: white;
  208. transition: all 0.2s ease-in-out;
  209. font-size: 12px;
  210. cursor: pointer;
  211. }
  212. button.table-nav:disabled {
  213. background-color: #f6f6f6;
  214. box-shadow: 0 0px 5px rgba(150, 150, 150, 0.1);
  215. opacity: 0.9;
  216. color: #bbb;
  217. cursor: default;
  218. }
  219. button.table-nav svg {
  220. width: 14px;
  221. height: auto;
  222. }
  223. button.table-nav svg { stroke-width: 2.5; }
  224. button.table-nav:hover { transform: translateY(-2px); }
  225. button.table-nav:disabled:hover { transform: none; }
  226. svg.spinner {
  227. animation: spin 1s linear infinite, fadein 0.3s ease-in-out;
  228. }
  229. input {
  230. filter: none;
  231. }
  232. input[type="text"],
  233. input[type="email"],
  234. input[type="password"] {
  235. box-sizing: border-box;
  236. width: 240px;
  237. height: 44px;
  238. padding: 0 24px;
  239. font-size: 15px;
  240. letter-spacing: 0.05em;
  241. color: #444;
  242. background-color: white;
  243. border: none;
  244. border-radius: 100px;
  245. border-bottom: 5px solid #f5f5f5;
  246. border-bottom-width: 5px;
  247. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  248. transition: all 0.5s ease-out;
  249. }
  250. input[type="text"]:focus,
  251. input[type="email"]:focus,
  252. input[type="password"]:focus {
  253. outline: none;
  254. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  255. }
  256. input[type="text"]::placeholder,
  257. input[type="email"]::placeholder,
  258. input[type="password"]::placeholder {
  259. font-size: 14px;
  260. letter-spacing: 0.05em;
  261. color: #888;
  262. }
  263. .error input[type="text"],
  264. .error input[type="email"],
  265. .error input[type="password"] {
  266. border-bottom-color: rgba(250, 10, 10, 0.8);
  267. box-shadow: 0 10px 15px hsla(0, 100%, 75%, 0.2);
  268. }
  269. select {
  270. position: relative;
  271. width: 240px;
  272. height: 44px;
  273. padding: 0 24px;
  274. font-size: 15px;
  275. box-sizing: border-box;
  276. letter-spacing: 0.05em;
  277. color: #444;
  278. background-color: white;
  279. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  280. border: none;
  281. border-radius: 100px;
  282. border-bottom: 5px solid #f5f5f5;
  283. border-bottom-width: 5px;
  284. transition: all 0.5s ease-out;
  285. appearance: none;
  286. background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 24 24' fill='none' stroke='%235c666b' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  287. background-repeat: no-repeat, repeat;
  288. background-position: right 1.2em top 50%, 0 0;
  289. background-size: 1em auto, 100%;
  290. }
  291. select:focus {
  292. outline: none;
  293. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  294. }
  295. .error select {
  296. border-bottom-color: rgba(250, 10, 10, 0.8);
  297. box-shadow: 0 10px 15px hsla(0, 100%, 75%, 0.2);
  298. }
  299. input[type="checkbox"] {
  300. position: relative;
  301. width: 1rem;
  302. height: 1rem;
  303. display: flex;
  304. align-items: center;
  305. justify-content: center;
  306. border-radius: 4px;
  307. background-color: white;
  308. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  309. margin: 0;
  310. -webkit-appearance: none;
  311. appearance: none;
  312. cursor: pointer;
  313. }
  314. input[type="checkbox"]:focus {
  315. outline: 3px solid rgba(65, 164, 245, 0.5);
  316. }
  317. input[type="checkbox"]::after {
  318. content: "";
  319. position: absolute;
  320. top: 50%;
  321. left: 50%;
  322. width: 80%;
  323. height: 80%;
  324. display: block;
  325. border-radius: 2px;
  326. background-color: #9575cd;
  327. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  328. cursor: pointer;
  329. opacity: 0;
  330. transform: translate(-50%, -50%) scale(0);
  331. transition: all 0.1s ease-in-out;
  332. }
  333. input[type="checkbox"]:checked:after {
  334. opacity: 1;
  335. transform: translate(-50%, -50%) scale(1);
  336. }
  337. label {
  338. display: flex;
  339. color: #555;
  340. font-size: 15px;
  341. flex-direction: column;
  342. align-items: flex-start;
  343. font-weight: bold;
  344. }
  345. label input {
  346. margin-top: 0.5rem;
  347. }
  348. label.checkbox {
  349. flex-direction: row;
  350. align-items: center;
  351. cursor: pointer;
  352. font-weight: normal;
  353. }
  354. label.checkbox input[type="checkbox"] {
  355. margin: 0 0.75rem 2px 0;
  356. }
  357. p.error,
  358. p.success {
  359. font-weight: normal;
  360. animation: fadein 0.3s ease-in-out;
  361. }
  362. p.error { color: red; }
  363. p.success { color: #0ea30e; }
  364. table {
  365. width: 100%;
  366. display: flex;
  367. flex-direction: column;
  368. background-color: white;
  369. border-radius: 12px;
  370. box-shadow: 0 6px 15px hsla(200, 20%, 70%, 0.3);
  371. text-align: center;
  372. overflow: auto;
  373. }
  374. table tr {
  375. flex: 1 1 auto;
  376. }
  377. table tr,
  378. table th,
  379. table td,
  380. table tbody,
  381. table thead,
  382. table tfoot {
  383. display: flex;
  384. overflow: hidden;
  385. }
  386. table tbody,
  387. table thead,
  388. table tfoot {
  389. flex-direction: column;
  390. }
  391. table tr {
  392. border-bottom: 1px solid hsl(200, 14%, 94%);
  393. }
  394. table tbody {
  395. border-bottom-right-radius: 12px;
  396. border-bottom-left-radius: 12px;
  397. overflow: hidden;
  398. animation: fadein 0.3s ease-in-out;
  399. }
  400. table tbody + tfoot {
  401. border: none;
  402. }
  403. table thead {
  404. background-color: hsl(200, 12%, 95%);
  405. border-top-right-radius: 12px;
  406. border-top-left-radius: 12px;
  407. font-weight: bold;
  408. }
  409. table thead tr {
  410. border-bottom: 1px solid hsl(200, 14%, 90%);
  411. }
  412. table tfoot {
  413. background-color: hsl(200, 12%, 95%);
  414. border-bottom-right-radius: 12px;
  415. border-bottom-left-radius: 12px;
  416. }
  417. table tr.loading-placeholder {
  418. flex: 1 1 auto;
  419. justify-content: center;
  420. animation: fadein 0.3s ease-in-out;
  421. }
  422. table tr.loading-placeholder td {
  423. flex: 0 0 auto;
  424. font-size: 18px;
  425. font-weight: 300;
  426. }
  427. .dialog {
  428. position: fixed;
  429. width: 100%;
  430. height: 100%;
  431. top: 0;
  432. left: 0;
  433. display: none;
  434. justify-content: center;
  435. align-items: center;
  436. background-color: rgba(50, 50, 50, 0.8);
  437. z-index: 1000;
  438. animation: fadein 0.2s ease-in-out;
  439. }
  440. .dialog.open { display: flex; }
  441. .dialog .box {
  442. min-width: 450px;
  443. max-width: 90%;
  444. display: flex;
  445. flex-direction: column;
  446. align-items: center;
  447. padding: 3rem 2rem;
  448. background-color: white;
  449. border-radius: 8px;
  450. --keyframe-slidey-offset: -30px;
  451. animation: slidey 0.2s ease-in-out;
  452. }
  453. .dialog .content-wrapper {
  454. display: flex;
  455. flex-direction: column;
  456. }
  457. .dialog .loading {
  458. display: none;
  459. width: 24px;
  460. height: 24px;
  461. margin: 3rem 0;
  462. animation: fadein 0.2s ease-in-out;
  463. }
  464. .dialog.htmx-request .loading {
  465. display: block;
  466. }
  467. .dialog.htmx-request .content-wrapper {
  468. display: none;
  469. }
  470. .dialog .loading svg {
  471. animation: spin 1s linear infinite;
  472. }
  473. .dialog .content {
  474. display: flex;
  475. flex-direction: column;
  476. animation: fadein 0.2s ease-in-out;
  477. }
  478. .dialog .content h2 {
  479. font-weight: bold !important;
  480. margin-bottom: 0.5rem !important;
  481. margin-top: 0;
  482. }
  483. .dialog .content .link-to-delete { font-weight: bold; }
  484. .dialog .content .buttons {
  485. display: flex;
  486. align-items: center;
  487. margin-top: 1.5rem;
  488. }
  489. .dialog .content .buttons button { margin-right: 2rem; }
  490. .dialog .content .buttons button:last-child { margin-right: 0; }
  491. .dialog .content {
  492. align-items: center;
  493. }
  494. .dialog .content #dialog-error {
  495. margin-top: 1rem;
  496. margin-bottom: -1rem;
  497. }
  498. .dialog .content .icon {
  499. width: 48px;
  500. height: 48px;
  501. border-radius: 100%;
  502. padding: 5px;
  503. margin-bottom: 1.5rem;
  504. border: 2px solid;
  505. }
  506. .dialog .content .icon svg {
  507. width: 100%;
  508. height: auto;
  509. }
  510. .dialog .content .icon.success {
  511. border-color: var(--success-icon-color);
  512. }
  513. .dialog .content .icon.success svg {
  514. stroke-width: 2;
  515. stroke: var(--success-icon-color);
  516. }
  517. .dialog .content .icon.error {
  518. border-color: var(--error-icon-color);
  519. }
  520. .dialog .content .icon.error svg {
  521. stroke-width: 1.5;
  522. stroke: var(--error-icon-color);
  523. }
  524. .dialog .content svg.spinner {
  525. display: none;
  526. width: 24px;
  527. margin: 0.5rem 0;
  528. }
  529. .dialog .content.htmx-request svg.spinner { display: block; }
  530. .dialog .content.htmx-request button { display: none; }
  531. /* DISTINCT */
  532. .main-wrapper {
  533. min-height: 100vh;
  534. width: 100%;
  535. display: flex;
  536. flex: 0 0 auto;
  537. align-items: center;
  538. flex-direction: column;
  539. }
  540. /* LOGIN & SIGNUP */
  541. form#login-signup {
  542. max-width: 100%;
  543. flex: 1 1 auto;
  544. display: flex;
  545. flex-direction: column;
  546. width: 400px;
  547. margin: 3rem 0 0;
  548. }
  549. form#login-signup label {
  550. font-size: 16px;
  551. margin-bottom: 2rem;
  552. }
  553. form#login-signup input {
  554. width: 100%;
  555. height: 72px;
  556. margin-top: 1rem;
  557. padding: 0 3rem;
  558. font-size: 16px;
  559. }
  560. form#login-signup .buttons-wrapper {
  561. display: flex;
  562. align-items: center;
  563. margin-bottom: 1.5rem;
  564. }
  565. form#login-signup .buttons-wrapper button {
  566. height: 56px;
  567. flex: 1 1 auto;
  568. padding: 0 1rem 2px;
  569. margin-right: 1rem;
  570. }
  571. form#login-signup .buttons-wrapper button:last-child { margin-right: 0; }
  572. form#login-signup a.forgot-password {
  573. align-self: flex-start;
  574. font-size: 14px;
  575. }
  576. form#login-signup svg.spinner { display: none; }
  577. form#login-signup.htmx-request:not(.signup) .login svg.spinner { display: block; }
  578. form#login-signup.htmx-request:not(.signup) .login svg.icon { display: none; }
  579. form#login-signup.htmx-request.signup .signup svg.spinner { display: block; }
  580. form#login-signup.htmx-request.signup .signup svg.icon { display: none; }
  581. form#login-signup.htmx-request .error { opacity: 0; }
  582. form#login-signup p.error {
  583. margin-bottom: 0;
  584. }
  585. .login-signup-message {
  586. flex: 1 1 auto;
  587. margin-top: 3rem;
  588. }
  589. .login-signup-message h1 {
  590. font-weight: 300;
  591. font-size: 24px;
  592. }
  593. /* HEADER */
  594. header {
  595. box-sizing: border-box;
  596. margin: 0;
  597. width: 1232px;
  598. max-width: 100%;
  599. padding: 0 32px;
  600. height: 102px;
  601. justify-content: space-between;
  602. align-items: center;
  603. display: flex;
  604. }
  605. header .logo-wrapper {
  606. display: flex;
  607. align-items: center;
  608. }
  609. header a.logo {
  610. position: relative;
  611. display: flex;
  612. align-items: center;
  613. font-size: 22px;
  614. font-weight: bold;
  615. text-decoration: none;
  616. border: none;
  617. margin: 0;
  618. padding: 0;
  619. }
  620. header a.logo:hover { border: none; color: inherit; }
  621. header .logo img {
  622. margin: 0 12px 0 0;
  623. padding: 0;
  624. }
  625. header ul.logo-links {
  626. list-style: none;
  627. display: flex;
  628. align-items: flex-end;
  629. margin: 0 0 0 0.5rem;
  630. padding: 0;
  631. }
  632. header ul.logo-links li {
  633. padding: 2px 0 0;
  634. margin: 0 0 0 32px;
  635. }
  636. header ul.logo-links li a {
  637. font-size: 16px;
  638. }
  639. header nav ul {
  640. display: flex;
  641. flex-direction: row-reverse;
  642. align-items: center;
  643. list-style: none;
  644. margin: 0;
  645. padding: 0;
  646. }
  647. header nav ul li {
  648. margin: 0 0 0 32px;
  649. padding: 0;
  650. }
  651. header nav ul li:last-child { margin-left: 0; }
  652. /* SHORTENER */
  653. main {
  654. width: 800px;
  655. max-width: 100%;
  656. flex: 0 0 auto;
  657. display: flex;
  658. flex-direction: column;
  659. align-items: center;
  660. padding: 0 1rem;
  661. margin-top: 1rem;
  662. }
  663. main #shorturl {
  664. display: flex;
  665. align-items: center;
  666. margin: 1rem 0 3rem;
  667. }
  668. main #shorturl h1 {
  669. margin: 0;
  670. border-bottom: 2px dotted transparent;
  671. font-weight: 300;
  672. font-size: 2rem;
  673. }
  674. main #shorturl h1.link {
  675. cursor: pointer;
  676. border-bottom-color: hsl(200, 35%, 65%);
  677. transition: opacity 0.3s ease-in-out;
  678. --keyframe-slidey-offset: -10px;
  679. animation: fadein 0.2s ease-in-out, slidey 0.2s ease-in-out;
  680. }
  681. main #shorturl h1.link:hover {
  682. opacity: 0.8;
  683. }
  684. main #shorturl .clipboard {
  685. width: 35px;
  686. height: 35px;
  687. display: flex;
  688. margin-right: 1rem;
  689. }
  690. main #shorturl button {
  691. width: 100%;
  692. height: 100%;
  693. display: flex;
  694. margin: 0;
  695. padding: 7px;
  696. box-shadow: none;
  697. outline: none;
  698. border: none;
  699. background: none;
  700. border-radius: 100%;
  701. background-color: var(--copy-icon-bg-color);
  702. transition: transform 0.4s ease-out;
  703. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  704. cursor: pointer;
  705. --keyframe-slidey-offset: -10px;
  706. animation: slidey 0.2s ease-in-out;
  707. }
  708. main #shorturl button:hover,
  709. main #shorturl button:focus {
  710. transform: translateY(-2px) scale(1.02, 1.02);
  711. }
  712. main #shorturl button:focus {
  713. outline: 3px solid rgba(65, 164, 245, 0.5);
  714. }
  715. main #shorturl svg {
  716. stroke: var(--copy-icon-color);
  717. width: 100%;
  718. height: auto;
  719. }
  720. main #shorturl svg.copy {
  721. stroke-width: 2.5;
  722. }
  723. main #shorturl svg.check {
  724. display: none;
  725. padding: 3px;
  726. stroke-width: 3;
  727. --keyframe-slidey-offset: -10px;
  728. animation: slidey 0.2s ease-in-out;
  729. }
  730. main #shorturl.copied button {
  731. background-color: transparent;
  732. box-shadow: none;
  733. }
  734. main #shorturl.copied button { display: none; }
  735. main #shorturl.copied svg.check { display: block; }
  736. main #shorturl h1 span {
  737. border-bottom: 1px dotted #999;
  738. }
  739. main form {
  740. position: relative;
  741. width: 100%;
  742. display: flex;
  743. flex-direction: column;
  744. }
  745. main form input#target {
  746. position: relative;
  747. width: 100%;
  748. height: 72px;
  749. display: flex;
  750. padding: 0 84px 0 40px;
  751. font-size: 20px;
  752. }
  753. main form input#target::placeholder {
  754. font-size: 17px;
  755. }
  756. main form p.error {
  757. font-size: 13px;
  758. margin-left: 0.5rem;
  759. }
  760. main form .target-wrapper p.error {
  761. font-size: 15px;
  762. margin-left: 1rem;
  763. }
  764. main form .target-wrapper {
  765. position: relative;
  766. width: 100%;
  767. height: auto;
  768. }
  769. main form button.submit {
  770. box-sizing: content-box;
  771. position: absolute;
  772. cursor: pointer;
  773. width: 28px;
  774. height: auto;
  775. right: 0;
  776. top: 16px;
  777. padding: 4px;
  778. margin: 0 2rem 0;
  779. background: none;
  780. box-shadow: none;
  781. outline: none;
  782. border: none;
  783. }
  784. main form button.submit:focus,
  785. main form button.submit:hover {
  786. outline: none;
  787. }
  788. main form button.submit svg.send {
  789. fill: #aaa;
  790. animation: fadein 0.3s ease-in-out;
  791. transition: fill 0.2s ease-in-out;
  792. }
  793. main form button.submit:hover svg.send {
  794. fill: var(--send-icon-hover-color);
  795. }
  796. main form button.submit svg.spinner {
  797. display: none;
  798. fill: none;
  799. stroke: var(--send-spinner-icon-color);
  800. stroke-width: 2;
  801. }
  802. main form.htmx-request button.submit svg.send { display: none; }
  803. main form.htmx-request button.submit svg.spinner { display: block; }
  804. main form label#advanced {
  805. margin-top: 2rem;
  806. align-self: flex-start;
  807. }
  808. main form label#advanced input {
  809. width: 1.1rem;
  810. height: 1.1rem;
  811. margin-bottom: 2px;
  812. }
  813. #advanced-options {
  814. display: flex;
  815. flex-direction: column;
  816. margin-top: 1.5rem;
  817. }
  818. #advanced-options.hidden { display: none; }
  819. .advanced-input-wrapper {
  820. width: 100%;
  821. display: flex;
  822. align-items: flex-start;
  823. margin-bottom: 1rem;
  824. }
  825. .advanced-input-wrapper label {
  826. flex: 1 1 0;
  827. padding-right: 1rem;
  828. }
  829. .advanced-input-wrapper label.expire-in { flex: 1 1 34%; }
  830. .advanced-input-wrapper label.description { flex: 1 1 65%; }
  831. .advanced-input-wrapper label:last-child { padding-right: 0; }
  832. .advanced-input-wrapper label input,
  833. .advanced-input-wrapper label select {
  834. width: 100%;
  835. margin-top: 0.5rem;
  836. }
  837. /* LINKS TABLE */
  838. #links-table-wrapper {
  839. width: 1200px;
  840. max-width: 95%;
  841. display: flex;
  842. flex-direction: column;
  843. flex: 1 1 auto;
  844. align-items: flex-start;
  845. margin: 7rem 0 7.5rem;
  846. }
  847. #links-table-wrapper h2 {
  848. font-weight: 300;
  849. margin-bottom: 1rem;
  850. }
  851. #links-table-wrapper table thead,
  852. #links-table-wrapper table tbody,
  853. #links-table-wrapper table tfoot {
  854. min-width: 1000px;
  855. }
  856. #links-table-wrapper tr {
  857. padding: 0 0.5rem;
  858. }
  859. #links-table-wrapper th,
  860. #links-table-wrapper td {
  861. flex-basis: 0;
  862. padding: 1rem;
  863. }
  864. #links-table-wrapper td {
  865. white-space: nowrap;
  866. font-size: 16px;
  867. align-items: center;
  868. }
  869. #links-table-wrapper table .original-url { flex: 7 7 0; }
  870. #links-table-wrapper table .created-at { flex: 2.5 2.5 0; }
  871. #links-table-wrapper table .short-link { flex: 3 3 0; }
  872. #links-table-wrapper table .views { flex: 1 1 0; justify-content: flex-end; }
  873. #links-table-wrapper table .actions { flex: 3 3 0; justify-content: flex-end; }
  874. #links-table-wrapper table .actions button { margin-right: 0.5rem; }
  875. #links-table-wrapper table .actions button:last-child { margin-right: 0; }
  876. #links-table-wrapper table td.original-url,
  877. #links-table-wrapper table td.created-at {
  878. flex-direction: column;
  879. align-items: flex-start;
  880. justify-content: center;
  881. }
  882. #links-table-wrapper table td.original-url p.description,
  883. #links-table-wrapper table td.created-at p.expire-in {
  884. margin: 0;
  885. font-size: 14px;
  886. color: #888;
  887. }
  888. #links-table-wrapper table tr.no-links {
  889. flex: 1 1 auto;
  890. justify-content: center;
  891. animation: fadein 0.3s ease-in-out;
  892. }
  893. #links-table-wrapper table.htmx-request tbody tr { opacity: 0.5; }
  894. #links-table-wrapper table tr.loading-placeholder { opacity: 0.6 !important; }
  895. #links-table-wrapper table tr.loading-placeholder td,
  896. #links-table-wrapper table tr.no-links td {
  897. flex: 0 0 auto;
  898. font-size: 18px;
  899. font-weight: 300;
  900. }
  901. #links-table-wrapper table tr.loading-placeholder svg.spinner {
  902. width: 1rem;
  903. height: auto;
  904. margin-right: 0.5rem;
  905. stroke-width: 1.5;
  906. }
  907. #links-table-wrapper table tr.links-controls { justify-content: space-between; }
  908. #links-table-wrapper table tfoot tr.links-controls { justify-content: flex-end; }
  909. #links-table-wrapper table th.search,
  910. #links-table-wrapper table th.nav {
  911. flex: 0 0 auto;
  912. align-items: center;
  913. }
  914. #links-table-wrapper table [name="search"] {
  915. width: auto;
  916. height: 32px;
  917. font-size: 14px;
  918. padding: 0 1.5rem;
  919. border-radius: 3px;
  920. border-bottom-width: 2px;
  921. }
  922. #links-table-wrapper table [name="search"]::placeholder {
  923. font-size: 13px;
  924. }
  925. #links-table-wrapper table tr.links-controls .checkbox {
  926. margin-left: 1rem;
  927. font-size: 15px;
  928. }
  929. #links-table-wrapper table .limit,
  930. #links-table-wrapper table .pagination {
  931. display: flex;
  932. align-items: center;
  933. }
  934. #links-table-wrapper table button.table-nav { margin-right: 0.75rem; }
  935. #links-table-wrapper table button.table-nav:last-child { margin-right: 0; }
  936. #links-table-wrapper table .table-nav-divider {
  937. height: 20px;
  938. width: 1px;
  939. opacity: 0.4;
  940. background-color: #888;
  941. margin: 0 1.5rem;
  942. }
  943. #links-table-wrapper table tr.edit {
  944. border-bottom: 1px solid hsl(200, 14%, 98%);
  945. background-color: #fafafa;
  946. }
  947. #links-table-wrapper table tr.edit td {
  948. width: 100%;
  949. padding: 2rem 1.5rem;
  950. flex-basis: auto;
  951. }
  952. #links-table-wrapper table tr.edit td form {
  953. width: 100;
  954. display: flex;
  955. flex-direction: column;
  956. align-items: flex-start;
  957. }
  958. #links-table-wrapper table tr.edit td form > div {
  959. width: 100%;
  960. display: flex;
  961. align-items: start;
  962. }
  963. #links-table-wrapper table tr.edit label { margin: 0 0.5rem 1rem; }
  964. #links-table-wrapper table tr.edit label:first-child { margin-left: 0; }
  965. #links-table-wrapper table tr.edit label:last-child { margin-right: 0; }
  966. #links-table-wrapper table tr.edit input {
  967. height: 44px;
  968. padding: 0 1.5rem;
  969. font-size: 15px;
  970. }
  971. #links-table-wrapper table tr.edit input,
  972. #links-table-wrapper table tr.edit input + p {
  973. width: 240px;
  974. max-width: 100%;
  975. font-size: 14px;
  976. text-wrap: wrap;
  977. text-align: left;
  978. }
  979. #links-table-wrapper table tr.edit input[name="target"],
  980. #links-table-wrapper table tr.edit input[name="description"],
  981. #links-table-wrapper table tr.edit input[name="target"] + p,
  982. #links-table-wrapper table tr.edit input[name="description"] + p {
  983. width: 420px;
  984. }
  985. #links-table-wrapper table tr.edit button {
  986. height: 38px;
  987. margin-right: 1rem;
  988. }
  989. #links-table-wrapper table tr.edit button:last-child { margin-right: 0; }
  990. #links-table-wrapper table tr.edit form {
  991. --keyframe-slidey-offset: -5px;
  992. animation: fadein 0.3s ease-in-out, slidey 0.32s ease-in-out;
  993. }
  994. #links-table-wrapper table tr.edit form.no-animation { animation: none; }
  995. #links-table-wrapper table tr.edit { display: none; }
  996. #links-table-wrapper table tr.edit.show { display: flex; }
  997. #links-table-wrapper table tr.edit td.loading { display: none; }
  998. #links-table-wrapper table tr.edit.htmx-request td.loading { display: block; }
  999. #links-table-wrapper table tr.edit td.loading svg { width: 16px; height: 16px; }
  1000. #links-table-wrapper table tr.edit form.htmx-request button .reload { display: none; }
  1001. #links-table-wrapper table tr.edit form button .loader { display: none; }
  1002. #links-table-wrapper table tr.edit form.htmx-request button .loader { display: inline-block; }
  1003. #links-table-wrapper table tr.edit form .response p { margin: 2rem 0 0; }
  1004. /* INTRO */
  1005. .introduction {
  1006. width: 1200px;
  1007. max-width: 98%;
  1008. display: flex;
  1009. align-items: center;
  1010. margin: 150px 0 0;
  1011. }
  1012. .introduction .text-wrapper {
  1013. display: flex;
  1014. flex: 1 1 auto;
  1015. flex-direction: column;
  1016. align-items: flex-start;
  1017. margin-top: -32px;
  1018. }
  1019. .introduction h2 {
  1020. font-weight: 300;
  1021. font-size: 28px;
  1022. padding-right: 2rem;
  1023. margin-bottom: 2.5rem
  1024. }
  1025. .introduction img {
  1026. width: 60%;
  1027. flex: 0 0 60%;
  1028. max-width: 100%;
  1029. height: auto;
  1030. }
  1031. /* FEATURES */
  1032. .features {
  1033. display: flex;
  1034. flex-direction: column;
  1035. align-items: center;
  1036. width: 100%;
  1037. flex: 0 0 auto;
  1038. padding: 5rem 0;
  1039. margin: 0;
  1040. background-color: var(--features-bg);
  1041. }
  1042. .features h3 {
  1043. font-weight: 300;
  1044. font-size: 28px;
  1045. margin-bottom: 72px;
  1046. }
  1047. .features ul {
  1048. width: 1200px;
  1049. max-width: 100%;
  1050. flex: 1 1 auto;
  1051. justify-content: center;
  1052. flex-wrap: nowrap;
  1053. display: flex;
  1054. margin: 0;
  1055. padding: 0;
  1056. list-style: none;
  1057. }
  1058. .features ul li {
  1059. max-width: 25%;
  1060. display: flex;
  1061. flex-direction: column;
  1062. align-items: center;
  1063. padding: 0 1.5rem;
  1064. margin: 0;
  1065. }
  1066. .features ul li .icon {
  1067. width: 48px;
  1068. height: 48px;
  1069. display: flex;
  1070. align-items: center;
  1071. justify-content: center;
  1072. border-radius: 100%;
  1073. background-color: var(--color-primary);
  1074. }
  1075. .features ul li .icon svg {
  1076. width: 16px;
  1077. height: auto;
  1078. stroke: white;
  1079. stroke-width: 2px;
  1080. }
  1081. .features ul li h4 {
  1082. margin: 1rem;
  1083. padding: 0;
  1084. font-size: 15px;
  1085. }
  1086. .features ul li p {
  1087. margin: 0;
  1088. padding: 0;
  1089. font-size: 14px;
  1090. font-weight: 300;
  1091. text-align: center;
  1092. }
  1093. /* EXTENSIONS */
  1094. .extensions {
  1095. width: 100%;
  1096. display: flex;
  1097. flex-direction: column;
  1098. align-items: center;
  1099. flex: 0 0 auto;
  1100. flex-wrap: nowrap;
  1101. padding: 5rem 0;
  1102. background-color: var(--extensions-bg);
  1103. color: white;
  1104. }
  1105. .extensions h3 {
  1106. font-size: 28px;
  1107. font-weight: 300;
  1108. margin-bottom: 4rem;
  1109. }
  1110. .extensions .extenstions-wrapper {
  1111. width: 1200px;
  1112. max-width: 100%;
  1113. display: flex;
  1114. flex: 1 1 auto;
  1115. justify-content: center;
  1116. flex-wrap: nowrap;
  1117. }
  1118. .extensions a.extension-button {
  1119. display: flex;
  1120. align-items: center;
  1121. justify-content: center;
  1122. margin: 0 1rem;
  1123. padding: 0.75rem 1.75rem;
  1124. background-color: #eee;
  1125. border: 1px solid #aaa;
  1126. font-size: 14px;
  1127. font-weight: bold;
  1128. text-decoration: none;
  1129. border-radius: 4px;
  1130. outline: none;
  1131. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  1132. transition: transform 0.3s ease-out;
  1133. cursor: pointer;
  1134. }
  1135. .extensions a.extension-button:hover {
  1136. transform: translateY(-2px);
  1137. }
  1138. .extensions a.extension-button.chrome { color: #4285f4; }
  1139. .extensions a.extension-button.firefox { color: #e0890f; }
  1140. .extensions a.extension-button svg {
  1141. width: 18px;
  1142. height: auto;
  1143. margin: 0 1rem 2px 0;
  1144. }
  1145. .extensions a.extension-button.chrome svg { fill: #4285f4; }
  1146. .extensions a.extension-button.firefox svg { fill: #e0890f; }
  1147. /* FOOTER */
  1148. footer {
  1149. width: 100%;
  1150. display: flex;
  1151. justify-content: center;
  1152. padding: 1rem 0;
  1153. font-size: 13px;
  1154. text-align: center;
  1155. }