styles.css 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969
  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. @keyframes tooltip {
  46. to { opacity: 0.9; transform: translate(-50%, 0); }
  47. }
  48. /* GENERAL */
  49. body {
  50. margin: 0;
  51. padding: 0;
  52. background-color: var(--bg-color);
  53. font: 16px/1.45 'Nunito', sans-serif;
  54. overflow-x: hidden;
  55. color: var(--text-color);
  56. }
  57. * {
  58. box-sizing: border-box;
  59. outline-color: var(--outline-color);
  60. }
  61. *::-moz-focus-inner {
  62. border: none;
  63. }
  64. .hidden {
  65. display: none;
  66. }
  67. hr {
  68. width: 100%;
  69. height: 2px;
  70. outline: none;
  71. border: none;
  72. background-color: hsl(200, 20%, 92%);
  73. }
  74. span.bold { font-weight: bold; }
  75. span.underline { border-bottom: 2px dotted #999; }
  76. a,
  77. button.link {
  78. color: var(--color-primary);
  79. border-bottom: 1px dotted transparent;
  80. text-decoration: none;
  81. transition: all 0.2s ease-out;
  82. }
  83. a:hover,
  84. button.link:hover {
  85. border-bottom-color: var(--color-primary);
  86. }
  87. a.nav {
  88. color: inherit;
  89. padding-bottom: 2px;
  90. }
  91. a.nav:hover {
  92. color: var(--color-primary);
  93. }
  94. a.button,
  95. button {
  96. position: relative;
  97. width: auto;
  98. height: 40px;
  99. display: flex;
  100. align-items: center;
  101. justify-content: center;
  102. padding: 0 32px;
  103. font-size: 13px;
  104. font-weight: normal;
  105. text-align: center;
  106. line-height: 1;
  107. word-break: keep-all;
  108. color: #444;
  109. border: none;
  110. border-radius: 100px;
  111. transition: all 0.4s ease-out;
  112. cursor: pointer;
  113. overflow: hidden;
  114. background: var(--button-bg);
  115. box-shadow: 0 5px 6px var(--button-bg-box-shadow-color);
  116. }
  117. a.button.primary,
  118. button.primary {
  119. color: white;
  120. background: var(--button-bg-primary);
  121. box-shadow: 0 5px 6px var(--button-bg-primary-box-shadow-color);
  122. }
  123. a.button.secondary,
  124. button.secondary {
  125. color: white;
  126. background: var(--button-bg-secondary);
  127. box-shadow: 0 5px 6px var(--button-bg-secondary-box-shadow-color);
  128. }
  129. a.button.danger,
  130. button.danger {
  131. color: white;
  132. background: var(--button-bg-danger);
  133. box-shadow: 0 5px 6px var(--button-bg-danger-box-shadow-color);
  134. }
  135. a.button.success,
  136. button.success {
  137. color: white;
  138. background: var(--button-bg-success);
  139. box-shadow: 0 5px 6px var(--button-bg-success-box-shadow-color);
  140. }
  141. a.button:focus,
  142. a.button:hover,
  143. button:focus,
  144. button:hover {
  145. box-shadow: 0 6px 15px var(--button-bg-box-shadow-color);
  146. transform: translateY(-2px) scale(1.02, 1.02);
  147. }
  148. a.button.primary:focus,
  149. a.button.primary:hover,
  150. button.primary:focus,
  151. button.primary:hover {
  152. box-shadow: 0 6px 15px var(--button-bg-primary-box-shadow-color);
  153. }
  154. a.button.secondary:focus,
  155. a.button.secondary:hover,
  156. button.secondary:focus,
  157. button.secondary:hover {
  158. box-shadow: 0 6px 15px var(--button-bg-secondary-box-shadow-color);
  159. }
  160. a.button.danger:focus,
  161. a.button.danger:hover,
  162. button.danger:focus,
  163. button.danger:hover {
  164. box-shadow: 0 6px 15px var(--button-bg-danger-box-shadow-color);
  165. }
  166. a.button.success:focus,
  167. a.button.success:hover,
  168. button.success:focus,
  169. button.success:hover {
  170. box-shadow: 0 6px 15px var(--button-bg-success-box-shadow-color);
  171. }
  172. a.button:disabled,
  173. button:disabled { cursor: default; }
  174. a.button:disabled:hover,
  175. button:disabled:hover { transform: none; }
  176. a.button svg.with-text,
  177. a.button span svg,
  178. button svg.with-text,
  179. button span svg {
  180. width: 16px;
  181. height: auto;
  182. margin-right: 0.5rem;
  183. stroke: white;
  184. stroke-width: 2;
  185. }
  186. a.button.action,
  187. button.action {
  188. padding: 5px;
  189. width: 24px;
  190. height: 24px;
  191. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  192. }
  193. a.button.action:disabled,
  194. button.action:disabled {
  195. background: none;
  196. box-shadow: none;
  197. }
  198. a.button.action svg,
  199. button.action svg {
  200. width: 100%;
  201. margin-right: 0;
  202. }
  203. a.button.action.delete,
  204. button.action.delete {
  205. background: hsl(0, 100%, 96%);
  206. }
  207. a.button.action.delete svg,
  208. button.action.delete svg {
  209. stroke-width: 2;
  210. stroke: hsl(0, 100%, 69%);
  211. }
  212. a.button.action.edit,
  213. button.action.edit {
  214. background: hsl(46, 100%, 94%);
  215. }
  216. a.button.action.edit svg,
  217. button.action.edit svg {
  218. stroke-width: 2.5;
  219. stroke: hsl(46, 90%, 50%);
  220. }
  221. a.button.action.qrcode,
  222. button.action.qrcode {
  223. background: hsl(0, 0%, 94%);
  224. }
  225. a.button.action.qrcode svg,
  226. button.action.qrcode svg {
  227. fill: hsl(0, 0%, 35%);
  228. stroke: none;
  229. }
  230. a.button.action.stats,
  231. button.action.stats {
  232. background: hsl(260, 100%, 96%);
  233. }
  234. a.button.action.stats svg,
  235. button.action.stats svg {
  236. stroke-width: 2.5;
  237. stroke: hsl(260, 100%, 69%);
  238. }
  239. a.button.action.ban,
  240. button.action.ban {
  241. background: hsl(10, 100%, 96%);
  242. }
  243. a.button.action.ban svg,
  244. button.action.ban svg {
  245. stroke-width: 2;
  246. stroke: hsl(10, 100%, 40%);
  247. }
  248. a.button.action.password sv,
  249. button.action.password svg,
  250. a.button.action.banned svg,
  251. button.action.banned svg {
  252. stroke-width: 2.5;
  253. stroke: #bbb;
  254. }
  255. button.nav {
  256. box-sizing: border-box;
  257. width: auto;
  258. height: 28px;
  259. display: flex;
  260. flex: 0 0 auto;
  261. align-items: center;
  262. justify-content: center;
  263. padding: 0 8px;
  264. border: none;
  265. border-radius: 4px;
  266. box-shadow: 0 0px 10px rgba(100, 100, 100, 0.1);
  267. background: none;
  268. background-color: white;
  269. transition: all 0.2s ease-in-out;
  270. font-size: 12px;
  271. cursor: pointer;
  272. }
  273. button.nav:disabled {
  274. background-color: #f6f6f6;
  275. box-shadow: 0 0px 5px rgba(150, 150, 150, 0.1);
  276. opacity: 0.9;
  277. color: #bbb;
  278. cursor: default;
  279. }
  280. button.nav svg {
  281. width: 14px;
  282. height: auto;
  283. }
  284. button.nav svg { stroke-width: 2.5; }
  285. button.nav:hover { transform: translateY(-2px); }
  286. button.nav:disabled:hover { transform: none; }
  287. button.link {
  288. position: relative;
  289. width: auto;
  290. height: auto;
  291. display: flex;
  292. align-items: center;
  293. justify-content: flex-start;
  294. padding: 0 0 2px 0;
  295. font-size: 1rem;
  296. font-weight: normal;
  297. border-radius: 0;
  298. text-align: left;
  299. line-height: normal;
  300. word-break: normal;
  301. cursor: pointer;
  302. background: none;
  303. box-shadow: none;
  304. }
  305. button.link:hover {
  306. box-shadow: none;
  307. transform: none;
  308. }
  309. button.link span {
  310. height: 1rem;
  311. }
  312. button.link svg {
  313. stroke: var(--color-primary);
  314. }
  315. svg.spinner {
  316. animation: spin 1s linear infinite, fadein 0.3s ease-in-out;
  317. }
  318. input {
  319. filter: none;
  320. }
  321. input[type="text"],
  322. input[type="email"],
  323. input[type="password"] {
  324. box-sizing: border-box;
  325. width: 240px;
  326. height: 44px;
  327. padding: 0 24px;
  328. font-size: 15px;
  329. letter-spacing: 0.05em;
  330. color: #444;
  331. background-color: white;
  332. border: none;
  333. border-radius: 100px;
  334. border-bottom: 5px solid #f5f5f5;
  335. border-bottom-width: 5px;
  336. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  337. transition: all 0.5s ease-out;
  338. }
  339. input[type="text"]:focus,
  340. input[type="email"]:focus,
  341. input[type="password"]:focus {
  342. outline: none;
  343. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  344. }
  345. input[type="text"]::placeholder,
  346. input[type="email"]::placeholder,
  347. input[type="password"]::placeholder {
  348. font-size: 14px;
  349. letter-spacing: 0.05em;
  350. color: #888;
  351. }
  352. .error input[type="text"],
  353. .error input[type="email"],
  354. .error input[type="password"] {
  355. border-bottom-color: rgba(250, 10, 10, 0.8);
  356. box-shadow: 0 10px 15px hsla(0, 100%, 75%, 0.2);
  357. }
  358. select {
  359. position: relative;
  360. width: 240px;
  361. height: 44px;
  362. padding: 0 24px;
  363. font-size: 15px;
  364. box-sizing: border-box;
  365. letter-spacing: 0.05em;
  366. color: #444;
  367. background-color: white;
  368. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  369. border: none;
  370. border-radius: 100px;
  371. border-bottom: 5px solid #f5f5f5;
  372. border-bottom-width: 5px;
  373. transition: all 0.5s ease-out;
  374. appearance: none;
  375. 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");
  376. background-repeat: no-repeat, repeat;
  377. background-position: right 1.2em top 50%, 0 0;
  378. background-size: 1em auto, 100%;
  379. }
  380. select:focus {
  381. outline: none;
  382. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  383. }
  384. .error select {
  385. border-bottom-color: rgba(250, 10, 10, 0.8);
  386. box-shadow: 0 10px 15px hsla(0, 100%, 75%, 0.2);
  387. }
  388. input[type="checkbox"] {
  389. position: relative;
  390. width: 1rem;
  391. height: 1rem;
  392. display: flex;
  393. align-items: center;
  394. justify-content: center;
  395. border-radius: 4px;
  396. background-color: white;
  397. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  398. margin: 0;
  399. -webkit-appearance: none;
  400. appearance: none;
  401. cursor: pointer;
  402. }
  403. input[type="checkbox"]:focus {
  404. outline: 3px solid rgba(65, 164, 245, 0.5);
  405. }
  406. input[type="checkbox"]::after {
  407. content: "";
  408. position: absolute;
  409. top: 50%;
  410. left: 50%;
  411. width: 80%;
  412. height: 80%;
  413. display: block;
  414. border-radius: 2px;
  415. background-color: #9575cd;
  416. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  417. cursor: pointer;
  418. opacity: 0;
  419. transform: translate(-50%, -50%) scale(0);
  420. transition: all 0.1s ease-in-out;
  421. }
  422. input[type="checkbox"]:checked:after {
  423. opacity: 1;
  424. transform: translate(-50%, -50%) scale(1);
  425. }
  426. label {
  427. display: flex;
  428. color: rgb(41, 71, 86);
  429. font-size: 1rem;
  430. flex-direction: column;
  431. align-items: flex-start;
  432. font-weight: bold;
  433. }
  434. label input {
  435. margin-top: 0.5rem;
  436. }
  437. label.checkbox {
  438. flex-direction: row;
  439. align-items: center;
  440. cursor: pointer;
  441. font-weight: normal;
  442. }
  443. label.checkbox input[type="checkbox"] {
  444. margin: 0 0.75rem 2px 0;
  445. }
  446. p.error,
  447. p.success {
  448. display: flex;
  449. align-items: center;
  450. font-weight: normal;
  451. animation: fadein 0.3s ease-in-out;
  452. }
  453. p.error { color: red; }
  454. p.success { color: #0ea30e; }
  455. table {
  456. width: 100%;
  457. display: flex;
  458. flex-direction: column;
  459. background-color: white;
  460. border-radius: 12px;
  461. box-shadow: 0 6px 15px hsla(200, 20%, 70%, 0.3);
  462. text-align: center;
  463. overflow: auto;
  464. }
  465. table tr {
  466. flex: 1 1 auto;
  467. }
  468. table tr,
  469. table th,
  470. table td,
  471. table thead,
  472. table tfoot {
  473. display: flex;
  474. overflow: hidden;
  475. }
  476. table tbody,
  477. table tr {
  478. overflow: visible;
  479. }
  480. table tbody,
  481. table thead,
  482. table tfoot {
  483. flex-direction: column;
  484. }
  485. table tr {
  486. padding: 0 0.5rem;
  487. border-bottom: 1px solid hsl(200, 14%, 94%);
  488. }
  489. table th,
  490. table td {
  491. flex-basis: 0;
  492. padding: 0.75rem;
  493. }
  494. table td {
  495. position: relative;
  496. white-space: nowrap;
  497. font-size: 15px;
  498. align-items: center;
  499. }
  500. table tbody {
  501. border-bottom-right-radius: 12px;
  502. border-bottom-left-radius: 12px;
  503. animation: fadein 0.3s ease-in-out;
  504. }
  505. table tbody + tfoot {
  506. border: none;
  507. }
  508. table thead {
  509. background-color: hsl(200, 12%, 95%);
  510. border-top-right-radius: 12px;
  511. border-top-left-radius: 12px;
  512. font-weight: bold;
  513. }
  514. table thead tr {
  515. border-bottom: 1px solid hsl(200, 14%, 90%);
  516. }
  517. table tfoot {
  518. background-color: hsl(200, 12%, 95%);
  519. border-bottom-right-radius: 12px;
  520. border-bottom-left-radius: 12px;
  521. }
  522. table tr.loading-placeholder {
  523. flex: 1 1 auto;
  524. justify-content: center;
  525. animation: fadein 0.3s ease-in-out;
  526. }
  527. table tr.loading-placeholder td {
  528. flex: 0 0 auto;
  529. font-size: 18px;
  530. font-weight: 300;
  531. }
  532. .dialog {
  533. position: fixed;
  534. width: 100%;
  535. height: 100%;
  536. top: 0;
  537. left: 0;
  538. display: none;
  539. justify-content: center;
  540. align-items: center;
  541. background-color: rgba(50, 50, 50, 0.8);
  542. z-index: 1000;
  543. animation: fadein 0.2s ease-in-out;
  544. }
  545. .dialog.open { display: flex; }
  546. .dialog .box {
  547. min-width: 450px;
  548. max-width: 90%;
  549. display: flex;
  550. flex-direction: column;
  551. align-items: center;
  552. padding: 3rem 2rem;
  553. background-color: white;
  554. border-radius: 8px;
  555. --keyframe-slidey-offset: -30px;
  556. animation: slidey 0.2s ease-in-out;
  557. }
  558. .dialog.qrcode .box {
  559. min-width: auto;
  560. padding: 2rem;
  561. }
  562. .dialog .content-wrapper {
  563. display: flex;
  564. flex-direction: column;
  565. }
  566. .dialog .loading {
  567. display: none;
  568. width: 24px;
  569. height: 24px;
  570. margin: 3rem 0;
  571. animation: fadein 0.2s ease-in-out;
  572. }
  573. .dialog.htmx-request .loading {
  574. display: block;
  575. }
  576. .dialog.htmx-request .content-wrapper {
  577. display: none;
  578. }
  579. .dialog .loading svg {
  580. animation: spin 1s linear infinite;
  581. }
  582. .dialog .content {
  583. display: flex;
  584. flex-direction: column;
  585. animation: fadein 0.2s ease-in-out;
  586. }
  587. .dialog .content h2 {
  588. font-weight: bold !important;
  589. margin-bottom: 0.5rem !important;
  590. margin-top: 0;
  591. }
  592. .dialog .content .buttons {
  593. display: flex;
  594. align-items: center;
  595. margin-top: 1.5rem;
  596. }
  597. .dialog .content .buttons button { margin-right: 2rem; }
  598. .dialog .content .buttons button:last-child { margin-right: 0; }
  599. .dialog .content {
  600. align-items: center;
  601. }
  602. .dialog .content #dialog-error {
  603. margin-top: 1rem;
  604. margin-bottom: -1rem;
  605. }
  606. .dialog .content .icon {
  607. width: 48px;
  608. height: 48px;
  609. border-radius: 100%;
  610. padding: 5px;
  611. margin-bottom: 1.5rem;
  612. border: 2px solid;
  613. }
  614. .dialog .content .icon svg {
  615. width: 100%;
  616. height: auto;
  617. }
  618. .dialog .content .icon.success {
  619. border-color: var(--success-icon-color);
  620. }
  621. .dialog .content .icon.success svg {
  622. stroke-width: 2;
  623. stroke: var(--success-icon-color);
  624. }
  625. .dialog .content .icon.error {
  626. border-color: var(--error-icon-color);
  627. }
  628. .dialog .content .icon.error svg {
  629. stroke-width: 1.5;
  630. stroke: var(--error-icon-color);
  631. }
  632. .dialog .content svg.spinner {
  633. display: none;
  634. width: 24px;
  635. margin: 0.5rem 0;
  636. }
  637. .dialog .content.htmx-request svg.spinner { display: block; }
  638. .dialog .content.htmx-request button { display: none; }
  639. .inputs { display: flex; align-items: flex-start; margin-bottom: 1rem; }
  640. .inputs label { flex: 0 0 0; margin-right: 1rem; }
  641. .inputs label:last-child { margin-right: 0; }
  642. [data-tooltip] {
  643. position: relative;
  644. overflow: visible;
  645. }
  646. [data-tooltip]:before,
  647. [data-tooltip]:after {
  648. position: absolute;
  649. left: 50%;
  650. display: none;
  651. font-size: 11px;
  652. line-height: 1;
  653. opacity: 0;
  654. transform: translate(-50%, -0.5rem);
  655. }
  656. [data-tooltip]:before {
  657. content: "";
  658. border: 4px solid transparent;
  659. top: -4px;
  660. border-bottom-width: 0;
  661. border-top-color: #333;
  662. z-index: 1001;
  663. }
  664. [data-tooltip]:after {
  665. content: attr(data-tooltip);
  666. top: -25px;
  667. text-align: center;
  668. min-width: 1rem;
  669. white-space: nowrap;
  670. overflow: hidden;
  671. text-overflow: ellipsis;
  672. padding: 5px 7px;
  673. border-radius: 4px;
  674. box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.35);
  675. background: #333;
  676. color: #fff;
  677. z-index: 1000;
  678. }
  679. [data-tooltip]:hover:before,
  680. [data-tooltip]:hover:after {
  681. display: block;
  682. }
  683. [data-tooltip]:before,
  684. [data-tooltip]:after,
  685. [data-tooltip]:hover:before,
  686. [data-tooltip]:hover:after {
  687. animation: tooltip 300ms ease-out forwards;
  688. }
  689. /* DISTINCT */
  690. .main-wrapper {
  691. min-height: 100vh;
  692. width: 100%;
  693. display: flex;
  694. flex: 0 0 auto;
  695. align-items: center;
  696. flex-direction: column;
  697. }
  698. .section-container {
  699. max-width: 90%;
  700. flex: 1 1 auto;
  701. display: flex;
  702. flex-direction: column;
  703. align-items: flex-start;
  704. margin-top: 1rem;
  705. }
  706. /* LOGIN & SIGNUP */
  707. form#login-signup {
  708. max-width: 100%;
  709. flex: 1 1 auto;
  710. display: flex;
  711. flex-direction: column;
  712. width: 400px;
  713. margin: 3rem 0 0;
  714. }
  715. form#login-signup label { margin-bottom: 2rem; }
  716. form#login-signup input {
  717. width: 100%;
  718. height: 72px;
  719. margin-top: 1rem;
  720. padding: 0 3rem;
  721. font-size: 16px;
  722. }
  723. form#login-signup .buttons-wrapper {
  724. display: flex;
  725. align-items: center;
  726. margin-bottom: 1.5rem;
  727. }
  728. form#login-signup .buttons-wrapper button {
  729. height: 56px;
  730. flex: 1 1 auto;
  731. padding: 0 1rem 2px;
  732. margin-right: 1rem;
  733. }
  734. form#login-signup .buttons-wrapper button:last-child { margin-right: 0; }
  735. form#login-signup a.forgot-password {
  736. align-self: flex-start;
  737. font-size: 14px;
  738. }
  739. form#login-signup svg.spinner { display: none; }
  740. form#login-signup.htmx-request:not(.signup) .login svg { display: none; }
  741. form#login-signup.htmx-request:not(.signup) .login svg.spinner { display: block; }
  742. form#login-signup.htmx-request.signup .signup svg.spinner { display: block; }
  743. form#login-signup.htmx-request.signup .signup svg.icon { display: none; }
  744. form#login-signup.htmx-request .error { opacity: 0; }
  745. form#login-signup p.error {
  746. margin-bottom: 0;
  747. }
  748. .login-signup-message {
  749. flex: 1 1 auto;
  750. margin-top: 3rem;
  751. }
  752. .login-signup-message h1 {
  753. font-weight: 300;
  754. font-size: 24px;
  755. }
  756. /* HEADER */
  757. header {
  758. box-sizing: border-box;
  759. margin: 0;
  760. width: 1232px;
  761. max-width: 100%;
  762. padding: 0 32px;
  763. height: 102px;
  764. justify-content: space-between;
  765. align-items: center;
  766. display: flex;
  767. }
  768. header .logo-wrapper {
  769. display: flex;
  770. align-items: center;
  771. }
  772. header a.logo {
  773. position: relative;
  774. display: flex;
  775. align-items: center;
  776. font-size: 22px;
  777. font-weight: bold;
  778. text-decoration: none;
  779. border: none;
  780. margin: 0;
  781. padding: 0;
  782. }
  783. header a.logo:hover { border: none; color: inherit; }
  784. header .logo img {
  785. margin: 0 12px 0 0;
  786. padding: 0;
  787. }
  788. header ul.logo-links {
  789. list-style: none;
  790. display: flex;
  791. align-items: flex-end;
  792. margin: 0 0 0 0.5rem;
  793. padding: 0;
  794. }
  795. header ul.logo-links li {
  796. padding: 2px 0 0;
  797. margin: 0 0 0 32px;
  798. }
  799. header ul.logo-links li a {
  800. font-size: 16px;
  801. }
  802. header nav ul {
  803. display: flex;
  804. flex-direction: row-reverse;
  805. align-items: center;
  806. list-style: none;
  807. margin: 0;
  808. padding: 0;
  809. }
  810. header nav ul li {
  811. margin: 0 0 0 32px;
  812. padding: 0;
  813. }
  814. header nav ul li:last-child { margin-left: 0; }
  815. /* SHORTENER */
  816. main {
  817. width: 800px;
  818. max-width: 100%;
  819. flex: 0 0 auto;
  820. display: flex;
  821. flex-direction: column;
  822. align-items: center;
  823. padding: 0 1rem;
  824. margin-top: 1rem;
  825. }
  826. main #shorturl {
  827. display: flex;
  828. align-items: center;
  829. margin: 1rem 0 3rem;
  830. }
  831. main #shorturl h1 {
  832. margin: 0;
  833. border-bottom: 2px dotted transparent;
  834. font-weight: 300;
  835. font-size: 2rem;
  836. }
  837. main #shorturl h1.link {
  838. cursor: pointer;
  839. border-bottom-color: hsl(200, 35%, 65%);
  840. transition: opacity 0.3s ease-in-out;
  841. --keyframe-slidey-offset: -10px;
  842. animation: fadein 0.2s ease-in-out, slidey 0.2s ease-in-out;
  843. }
  844. main #shorturl h1.link:hover {
  845. opacity: 0.8;
  846. }
  847. .clipboard {
  848. width: 35px;
  849. height: 35px;
  850. display: flex;
  851. margin-right: 1rem;
  852. }
  853. .clipboard button {
  854. width: 100%;
  855. height: 100%;
  856. display: flex;
  857. margin: 0;
  858. padding: 7px;
  859. box-shadow: none;
  860. outline: none;
  861. border: none;
  862. background: none;
  863. border-radius: 100%;
  864. background-color: var(--copy-icon-bg-color);
  865. transition: transform 0.4s ease-out;
  866. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  867. cursor: pointer;
  868. --keyframe-slidey-offset: -10px;
  869. animation: slidey 0.2s ease-in-out;
  870. }
  871. .clipboard.small { width: 24px; height: 24px; }
  872. .clipboard.small button { width: 24px; height: 24px; padding: 5px; }
  873. .clipboard button:hover,
  874. .clipboard button:focus {
  875. transform: translateY(-2px) scale(1.02, 1.02);
  876. }
  877. .clipboard button:focus {
  878. outline: 3px solid rgba(65, 164, 245, 0.5);
  879. }
  880. .clipboard svg {
  881. stroke: var(--copy-icon-color);
  882. width: 100%;
  883. height: auto;
  884. }
  885. .clipboard svg.copy {
  886. stroke-width: 2.5;
  887. }
  888. .clipboard svg.check {
  889. display: none;
  890. padding: 3px;
  891. stroke-width: 3;
  892. --keyframe-slidey-offset: -10px;
  893. animation: slidey 0.2s ease-in-out;
  894. }
  895. .clipboard.copied button {
  896. background-color: transparent;
  897. box-shadow: none;
  898. }
  899. .clipboard.copied button { display: none; }
  900. .clipboard.copied svg.check { display: block; }
  901. main #shorturl h1 span {
  902. border-bottom: 1px dotted #999;
  903. }
  904. main form {
  905. position: relative;
  906. width: 100%;
  907. display: flex;
  908. flex-direction: column;
  909. }
  910. main form input#target {
  911. position: relative;
  912. width: 100%;
  913. height: 72px;
  914. display: flex;
  915. padding: 0 84px 0 40px;
  916. font-size: 20px;
  917. }
  918. main form input#target::placeholder {
  919. font-size: 17px;
  920. }
  921. main form p.error {
  922. font-size: 13px;
  923. margin-left: 0.5rem;
  924. }
  925. main form .target-wrapper p.error {
  926. font-size: 15px;
  927. margin-left: 1rem;
  928. }
  929. main form .target-wrapper {
  930. position: relative;
  931. width: 100%;
  932. height: auto;
  933. }
  934. main form button.submit {
  935. box-sizing: content-box;
  936. position: absolute;
  937. cursor: pointer;
  938. width: 28px;
  939. height: auto;
  940. right: 0;
  941. top: 16px;
  942. padding: 4px;
  943. margin: 0 2rem 0;
  944. background: none;
  945. box-shadow: none;
  946. outline: none;
  947. border: none;
  948. }
  949. main form button.submit:focus,
  950. main form button.submit:hover {
  951. outline: none;
  952. }
  953. main form button.submit svg.send {
  954. fill: #aaa;
  955. animation: fadein 0.3s ease-in-out;
  956. transition: fill 0.2s ease-in-out;
  957. }
  958. main form button.submit:hover svg.send {
  959. fill: var(--send-icon-hover-color);
  960. }
  961. main form button.submit svg.spinner {
  962. display: none;
  963. fill: none;
  964. stroke: var(--send-spinner-icon-color);
  965. stroke-width: 2;
  966. }
  967. main form.htmx-request button.submit svg.send { display: none; }
  968. main form.htmx-request button.submit svg.spinner { display: block; }
  969. main form label#advanced {
  970. margin-top: 2rem;
  971. align-self: flex-start;
  972. }
  973. main form label#advanced input {
  974. width: 1.1rem;
  975. height: 1.1rem;
  976. margin-bottom: 2px;
  977. }
  978. #advanced-options {
  979. display: flex;
  980. flex-direction: column;
  981. margin-top: 1.5rem;
  982. }
  983. #advanced-options.hidden { display: none; }
  984. .advanced-input-wrapper {
  985. width: 100%;
  986. display: flex;
  987. align-items: flex-start;
  988. margin-bottom: 1rem;
  989. }
  990. .advanced-input-wrapper label {
  991. flex: 1 1 0;
  992. padding-right: 1rem;
  993. }
  994. .advanced-input-wrapper label.expire-in { flex: 1 1 34%; }
  995. .advanced-input-wrapper label.description { flex: 1 1 65%; }
  996. .advanced-input-wrapper label:last-child { padding-right: 0; }
  997. .advanced-input-wrapper label input,
  998. .advanced-input-wrapper label select {
  999. width: 100%;
  1000. margin-top: 0.5rem;
  1001. }
  1002. /* LINKS TABLE */
  1003. #links-table-wrapper {
  1004. width: 1200px;
  1005. max-width: 95%;
  1006. display: flex;
  1007. flex-direction: column;
  1008. flex: 1 1 auto;
  1009. align-items: flex-start;
  1010. margin: 7rem 0 7.5rem;
  1011. }
  1012. #links-table-wrapper h2 {
  1013. font-weight: 300;
  1014. margin-bottom: 1rem;
  1015. }
  1016. #links-table-wrapper table thead,
  1017. #links-table-wrapper table tbody,
  1018. #links-table-wrapper table tfoot {
  1019. min-width: 1000px;
  1020. }
  1021. #links-table-wrapper tr {
  1022. padding: 0 0.5rem;
  1023. }
  1024. #links-table-wrapper th,
  1025. #links-table-wrapper td {
  1026. padding: 1rem;
  1027. }
  1028. #links-table-wrapper td {
  1029. font-size: 16px;
  1030. }
  1031. #links-table-wrapper table .original-url { flex: 7 7 0; }
  1032. #links-table-wrapper table .created-at { flex: 2.5 2.5 0; }
  1033. #links-table-wrapper table .short-link { flex: 3 3 0; }
  1034. #links-table-wrapper table .views { flex: 1 1 0; justify-content: flex-end; }
  1035. #links-table-wrapper table .actions { flex: 3 3 0; justify-content: flex-end; overflow: visible; }
  1036. #links-table-wrapper table .actions a.button,
  1037. #links-table-wrapper table .actions button { margin-right: 0.5rem; }
  1038. #links-table-wrapper table .actions a.button:last-child,
  1039. #links-table-wrapper table .actions button:last-child { margin-right: 0; }
  1040. #links-table-wrapper table td.original-url,
  1041. #links-table-wrapper table td.created-at {
  1042. flex-direction: column;
  1043. align-items: flex-start;
  1044. justify-content: center;
  1045. }
  1046. #links-table-wrapper table td.original-url p.description,
  1047. #links-table-wrapper table td.created-at p.expire-in {
  1048. margin: 0;
  1049. font-size: 14px;
  1050. color: #888;
  1051. }
  1052. #links-table-wrapper table tr.no-links {
  1053. flex: 1 1 auto;
  1054. justify-content: center;
  1055. animation: fadein 0.3s ease-in-out;
  1056. }
  1057. #links-table-wrapper table.htmx-request tbody tr { opacity: 0.5; }
  1058. #links-table-wrapper table tr.loading-placeholder { opacity: 0.6 !important; }
  1059. #links-table-wrapper table tr.loading-placeholder td,
  1060. #links-table-wrapper table tr.no-links td {
  1061. flex: 0 0 auto;
  1062. font-size: 18px;
  1063. font-weight: 300;
  1064. }
  1065. #links-table-wrapper table tr.loading-placeholder svg.spinner {
  1066. width: 1rem;
  1067. height: auto;
  1068. margin-right: 0.5rem;
  1069. stroke-width: 1.5;
  1070. }
  1071. #links-table-wrapper table tr.links-controls { justify-content: space-between; }
  1072. #links-table-wrapper table tfoot tr.links-controls { justify-content: flex-end; }
  1073. #links-table-wrapper table th.search,
  1074. #links-table-wrapper table th.nav {
  1075. flex: 0 0 auto;
  1076. align-items: center;
  1077. }
  1078. #links-table-wrapper table [name="search"] {
  1079. width: auto;
  1080. height: 32px;
  1081. font-size: 14px;
  1082. padding: 0 1.5rem;
  1083. border-radius: 3px;
  1084. border-bottom-width: 2px;
  1085. }
  1086. #links-table-wrapper table [name="search"]::placeholder {
  1087. font-size: 13px;
  1088. }
  1089. #links-table-wrapper table tr.links-controls .checkbox {
  1090. margin-left: 1rem;
  1091. font-size: 15px;
  1092. }
  1093. #links-table-wrapper table .limit,
  1094. #links-table-wrapper table .pagination {
  1095. display: flex;
  1096. align-items: center;
  1097. }
  1098. #links-table-wrapper table button.nav { margin-right: 0.75rem; }
  1099. #links-table-wrapper table button.nav:last-child { margin-right: 0; }
  1100. #links-table-wrapper table .nav-divider {
  1101. height: 20px;
  1102. width: 1px;
  1103. opacity: 0.4;
  1104. background-color: #888;
  1105. margin: 0 1.5rem;
  1106. }
  1107. #links-table-wrapper table tbody tr:hover {
  1108. background-color: hsl(200, 14%, 98%);
  1109. }
  1110. #links-table-wrapper table tbody td.right-fade:after {
  1111. content: "";
  1112. position: absolute;
  1113. right: 0;
  1114. top: 0;
  1115. height: 100%;
  1116. width: 16px;
  1117. background: linear-gradient(to left, white, rgba(255, 255, 255, 0.001));
  1118. }
  1119. #links-table-wrapper table tbody tr:hover td.right-fade:after {
  1120. background: linear-gradient(to left, hsl(200, 14%, 98%), rgba(255, 255, 255, 0.001));
  1121. }
  1122. #links-table-wrapper table .clipboard { margin-right: 0.5rem; }
  1123. #links-table-wrapper table .clipboard svg.check { width: 24px; }
  1124. #links-table-wrapper table tr.edit {
  1125. background-color: #fafafa;
  1126. }
  1127. #links-table-wrapper table tr.edit td {
  1128. width: 100%;
  1129. padding: 2rem 1.5rem;
  1130. flex-basis: auto;
  1131. }
  1132. #links-table-wrapper table tr.edit td form {
  1133. width: 100;
  1134. display: flex;
  1135. flex-direction: column;
  1136. align-items: flex-start;
  1137. }
  1138. #links-table-wrapper table tr.edit td form > div {
  1139. width: 100%;
  1140. display: flex;
  1141. align-items: start;
  1142. }
  1143. #links-table-wrapper table tr.edit label { margin: 0 0.5rem 1rem; }
  1144. #links-table-wrapper table tr.edit label:first-child { margin-left: 0; }
  1145. #links-table-wrapper table tr.edit label:last-child { margin-right: 0; }
  1146. #links-table-wrapper table tr.edit input {
  1147. height: 44px;
  1148. padding: 0 1.5rem;
  1149. font-size: 15px;
  1150. }
  1151. #links-table-wrapper table tr.edit input,
  1152. #links-table-wrapper table tr.edit input + p {
  1153. width: 240px;
  1154. max-width: 100%;
  1155. font-size: 14px;
  1156. text-wrap: wrap;
  1157. text-align: left;
  1158. }
  1159. #links-table-wrapper table tr.edit input[name="target"],
  1160. #links-table-wrapper table tr.edit input[name="description"],
  1161. #links-table-wrapper table tr.edit input[name="target"] + p,
  1162. #links-table-wrapper table tr.edit input[name="description"] + p {
  1163. width: 420px;
  1164. }
  1165. #links-table-wrapper table tr.edit button {
  1166. height: 38px;
  1167. margin-right: 1rem;
  1168. }
  1169. #links-table-wrapper table tr.edit button:last-child { margin-right: 0; }
  1170. #links-table-wrapper table tr.edit form {
  1171. --keyframe-slidey-offset: -5px;
  1172. animation: fadein 0.3s ease-in-out, slidey 0.32s ease-in-out;
  1173. }
  1174. #links-table-wrapper table tr.edit form.no-animation { animation: none; }
  1175. #links-table-wrapper table tr.edit { display: none; }
  1176. #links-table-wrapper table tr.edit.show { display: flex; }
  1177. #links-table-wrapper table tr.edit td.loading { display: none; }
  1178. #links-table-wrapper table tr.edit.htmx-request td.loading { display: block; }
  1179. #links-table-wrapper table tr.edit td.loading svg { width: 16px; height: 16px; }
  1180. #links-table-wrapper table tr.edit form.htmx-request button .reload { display: none; }
  1181. #links-table-wrapper table tr.edit form button .loader { display: none; }
  1182. #links-table-wrapper table tr.edit form.htmx-request button .loader { display: inline-block; }
  1183. #links-table-wrapper table tr.edit form .response p { margin: 2rem 0 0; }
  1184. .dialog .ban-checklist {
  1185. display: flex;
  1186. align-items: center;
  1187. }
  1188. .dialog .ban-checklist label { margin: 1rem 1.5rem 1rem 0; }
  1189. .dialog .ban-checklist label:last-child { margin-right: 0; }
  1190. /* INTRO */
  1191. .introduction {
  1192. width: 1200px;
  1193. max-width: 98%;
  1194. display: flex;
  1195. align-items: center;
  1196. margin: 150px 0 0;
  1197. }
  1198. .introduction .text-wrapper {
  1199. display: flex;
  1200. flex: 1 1 auto;
  1201. flex-direction: column;
  1202. align-items: flex-start;
  1203. margin-top: -32px;
  1204. }
  1205. .introduction h2 {
  1206. font-weight: 300;
  1207. font-size: 28px;
  1208. padding-right: 2rem;
  1209. margin-bottom: 2.5rem
  1210. }
  1211. .introduction img {
  1212. width: 60%;
  1213. flex: 0 0 60%;
  1214. max-width: 100%;
  1215. height: auto;
  1216. }
  1217. /* FEATURES */
  1218. .features {
  1219. display: flex;
  1220. flex-direction: column;
  1221. align-items: center;
  1222. width: 100%;
  1223. flex: 0 0 auto;
  1224. padding: 5rem 0;
  1225. margin: 0;
  1226. background-color: var(--features-bg);
  1227. }
  1228. .features h3 {
  1229. font-weight: 300;
  1230. font-size: 28px;
  1231. margin-bottom: 72px;
  1232. }
  1233. .features ul {
  1234. width: 1200px;
  1235. max-width: 100%;
  1236. flex: 1 1 auto;
  1237. justify-content: center;
  1238. flex-wrap: nowrap;
  1239. display: flex;
  1240. margin: 0;
  1241. padding: 0;
  1242. list-style: none;
  1243. }
  1244. .features ul li {
  1245. max-width: 25%;
  1246. display: flex;
  1247. flex-direction: column;
  1248. align-items: center;
  1249. padding: 0 1.5rem;
  1250. margin: 0;
  1251. }
  1252. .features ul li .icon {
  1253. width: 48px;
  1254. height: 48px;
  1255. display: flex;
  1256. align-items: center;
  1257. justify-content: center;
  1258. border-radius: 100%;
  1259. background-color: var(--color-primary);
  1260. }
  1261. .features ul li .icon svg {
  1262. width: 16px;
  1263. height: auto;
  1264. stroke: white;
  1265. stroke-width: 2px;
  1266. }
  1267. .features ul li h4 {
  1268. margin: 1rem;
  1269. padding: 0;
  1270. font-size: 15px;
  1271. }
  1272. .features ul li p {
  1273. margin: 0;
  1274. padding: 0;
  1275. font-size: 14px;
  1276. font-weight: 300;
  1277. text-align: center;
  1278. }
  1279. /* EXTENSIONS */
  1280. .extensions {
  1281. width: 100%;
  1282. display: flex;
  1283. flex-direction: column;
  1284. align-items: center;
  1285. flex: 0 0 auto;
  1286. flex-wrap: nowrap;
  1287. padding: 5rem 0;
  1288. background-color: var(--extensions-bg);
  1289. color: white;
  1290. }
  1291. .extensions h3 {
  1292. font-size: 28px;
  1293. font-weight: 300;
  1294. margin-bottom: 4rem;
  1295. }
  1296. .extensions .extenstions-wrapper {
  1297. width: 1200px;
  1298. max-width: 100%;
  1299. display: flex;
  1300. flex: 1 1 auto;
  1301. justify-content: center;
  1302. flex-wrap: nowrap;
  1303. }
  1304. .extensions a.extension-button {
  1305. display: flex;
  1306. align-items: center;
  1307. justify-content: center;
  1308. margin: 0 1rem;
  1309. padding: 0.75rem 1.75rem;
  1310. background-color: #eee;
  1311. border: 1px solid #aaa;
  1312. font-size: 14px;
  1313. font-weight: bold;
  1314. text-decoration: none;
  1315. border-radius: 4px;
  1316. outline: none;
  1317. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  1318. transition: transform 0.3s ease-out;
  1319. cursor: pointer;
  1320. }
  1321. .extensions a.extension-button:hover {
  1322. transform: translateY(-2px);
  1323. }
  1324. .extensions a.extension-button.chrome { color: #4285f4; }
  1325. .extensions a.extension-button.firefox { color: #e0890f; }
  1326. .extensions a.extension-button svg {
  1327. width: 18px;
  1328. height: auto;
  1329. margin: 0 1rem 2px 0;
  1330. }
  1331. .extensions a.extension-button.chrome svg { fill: #4285f4; }
  1332. .extensions a.extension-button.firefox svg { fill: #e0890f; }
  1333. /* FOOTER */
  1334. footer {
  1335. width: 100%;
  1336. display: flex;
  1337. justify-content: center;
  1338. padding: 1rem 0;
  1339. font-size: 13px;
  1340. text-align: center;
  1341. }
  1342. /* SETTINGS */
  1343. #settings {
  1344. width: 600px;
  1345. max-width: 90%;
  1346. }
  1347. h1.settings-welcome {
  1348. font-size: 28px;
  1349. font-weight: 300;
  1350. }
  1351. h1.settings-welcome span {
  1352. border-bottom: 2px dotted #999;
  1353. padding-bottom: 2px;
  1354. font-weight: normal;
  1355. }
  1356. /* SETTINGS - DOMAIN */
  1357. #domains-table { margin-top: 1rem; }
  1358. #domains-table .domain { flex: 2 2 0; }
  1359. #domains-table .homepage { flex: 2 2 0; }
  1360. #domains-table .actions { flex: 1 1 0; justify-content: flex-end; padding-right: 1rem; }
  1361. #domains-table .no-entry { flex: 1 1 0; opacity: 0.8; }
  1362. .add-domain-wrapper {
  1363. width: 100%;
  1364. display: flex;
  1365. flex-direction: column;
  1366. align-items: flex-start;
  1367. margin: 1.5rem 0 2rem;
  1368. }
  1369. .add-domain-wrapper > .spinner {
  1370. width: 20px;
  1371. display: none;
  1372. margin: 1rem 0 0 1rem;
  1373. }
  1374. .add-domain-wrapper.htmx-request > button { display: none; }
  1375. .add-domain-wrapper.htmx-request > .spinner { display: block; }
  1376. form#add-domain { margin-top: 1rem; }
  1377. form#add-domain .buttons-wrapper { display: flex; }
  1378. form#add-domain button { margin-right: 1rem }
  1379. form#add-domain .spinner { width: 20px; display: none; }
  1380. form#add-domain.htmx-request .buttons-wrapper { display: none; }
  1381. form#add-domain.htmx-request .spinner { display: block; }
  1382. form#add-domain .error { font-size: 0.85rem; }
  1383. /* SETTINGS - API */
  1384. #apikey-wrapper { margin-bottom: 1.5rem; }
  1385. #apikey {
  1386. display: flex;
  1387. align-items: center;
  1388. margin-bottom: 1rem;
  1389. }
  1390. #apikey p {
  1391. font-weight: bold;
  1392. border-bottom: 1px dotted #999;
  1393. transition: opacity 0.2s ease-in-out;
  1394. cursor: pointer;
  1395. }
  1396. #apikey p:hover {
  1397. opacity: 0.8;
  1398. }
  1399. form#generate-apikey .spinner { display: none; }
  1400. form#generate-apikey.htmx-request svg { display: none; }
  1401. form#generate-apikey.htmx-request .spinner { display: block; }
  1402. /* SETTINGS - CHANGE PASSWORD */
  1403. #change-password-wrapper { margin-bottom: 1.5rem; }
  1404. form#change-password { margin-top: 1.5rem; }
  1405. form#change-password button { margin-top: 1rem; }
  1406. form#change-password .spinner { display: none; }
  1407. form#change-password.htmx-request svg { display: none; }
  1408. form#change-password.htmx-request .spinner { display: block; }
  1409. /* SETTINGS - CHANGE EMAIL */
  1410. #change-email-wrapper { margin-bottom: 1.5rem; }
  1411. form#change-email { margin-top: 1.5rem; }
  1412. form#change-email button { margin-top: 1rem; }
  1413. form#change-email .spinner { display: none; }
  1414. form#change-email.htmx-request svg { display: none; }
  1415. form#change-email.htmx-request .spinner { display: block; }
  1416. /* SETTINGS - DELETE ACCOUNT */
  1417. #delete-account-wrapper { margin-bottom: 1.5rem; }
  1418. form#delete-account { margin-top: 1.5rem; }
  1419. form#delete-account button { margin-top: 1rem; }
  1420. form#delete-account .spinner { display: none; }
  1421. form#delete-account.htmx-request svg { display: none; }
  1422. form#delete-account.htmx-request .spinner { display: block; }
  1423. /* STATS */
  1424. #stats-section {
  1425. width: 1200px;
  1426. max-width: 95%;
  1427. }
  1428. .loading-stats {
  1429. width: 100%;
  1430. flex: 1 1 0;
  1431. margin-top: -5rem;
  1432. display: flex;
  1433. align-items: center;
  1434. justify-content: center;
  1435. }
  1436. .loading-stats .spinner {
  1437. width: 1.25rem;
  1438. margin-right: 0.5rem;
  1439. }
  1440. .stats-info {
  1441. width: 100%;
  1442. display: flex;
  1443. align-items: flex-end;
  1444. justify-content: space-between;
  1445. }
  1446. .stats-info h2 { font-weight: 300; font-size: 24px; }
  1447. .stats-info p { font-size: 14px; }
  1448. .stats-info h2,
  1449. .stats-info p { margin: 0 }
  1450. #stats {
  1451. width: 100%;
  1452. display: flex;
  1453. flex-direction: column;
  1454. align-items: stretch;
  1455. background-color: white;
  1456. border-radius: 12px;
  1457. box-shadow: 0 6px 15px hsla(200, 20%, 70%, 0.3);
  1458. overflow: hidden;
  1459. padding: 0;
  1460. }
  1461. .stats-head {
  1462. width: 100%;
  1463. display: flex;
  1464. align-items: center;
  1465. background-color: hsl(200, 12%, 95%);
  1466. justify-content: space-between;
  1467. padding: 0.75rem 1.5rem;
  1468. }
  1469. .total-number { font-weight: bold; }
  1470. .stats-nav { display: flex; align-items: center; }
  1471. .stats-nav button { margin-right: 0.75rem; }
  1472. .stats-nav button:last-child { margin-right: 0; }
  1473. .stats-period {
  1474. display: flex;
  1475. flex-direction: column;
  1476. align-items: stretch;
  1477. padding: 0.75rem 1.5rem;
  1478. }
  1479. .stats-period h2 {
  1480. font-size: 24px;
  1481. font-weight: 300;
  1482. margin: 1rem 0 0;
  1483. }
  1484. .stats-period span.total-in-period {
  1485. font-weight: bold;
  1486. border-bottom: 1px dotted hsl(200, 35%, 65%);
  1487. }
  1488. p.last-update {
  1489. font-size: 14px;
  1490. color: hsl(200, 14%, 60%);
  1491. margin: 0.75rem 0 0;
  1492. }
  1493. #stats canvas {
  1494. width: 100%;
  1495. margin: 2rem 0;
  1496. }
  1497. .stats-columns-wrapper {
  1498. display: flex;
  1499. align-items: flex-start;
  1500. }
  1501. .stats-columns-wrapper > div {
  1502. flex: 1 1 50%;
  1503. }
  1504. svg.map path {
  1505. fill: hsl(200, 15%, 92%);
  1506. stroke: #fff;
  1507. transition: all 0.1s ease-in-out;
  1508. }
  1509. svg.map path.color-1 { fill: hsl(261, 46%, 90%); }
  1510. svg.map path.color-2 { fill: hsl(261, 46%, 86%); }
  1511. svg.map path.color-3 { fill: hsl(261, 46%, 82%); }
  1512. svg.map path.color-4 { fill: hsl(261, 46%, 76%); }
  1513. svg.map path.color-5 { fill: hsl(261, 46%, 72%); }
  1514. svg.map path.color-6 { fill: hsl(261, 46%, 68%); }
  1515. svg.map path.active { stroke: hsl(261, 46%, 50%); stroke-width: 1.5; }
  1516. #map-tooltip {
  1517. position: fixed;
  1518. }
  1519. #map-tooltip.visible::before,
  1520. #map-tooltip.visible::after {
  1521. display: block !important;
  1522. }
  1523. #map-tooltip:before {
  1524. border-top-color: rgba(255, 255, 255, 0.95);
  1525. }
  1526. #map-tooltip:after {
  1527. box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.15);
  1528. background: rgba(255, 255, 255, 0.95);
  1529. color: #333;
  1530. }
  1531. .stats-back-to-home {
  1532. width: 100%;
  1533. display: flex;
  1534. justify-content: center;
  1535. margin: 2rem 0;
  1536. }
  1537. .stats-error {
  1538. width: 100%;
  1539. flex: 1 1 auto;
  1540. display: flex;
  1541. flex-direction: column;
  1542. align-items: center;
  1543. justify-content: center;
  1544. text-align: center;
  1545. }
  1546. .stats-error p { margin-top: -3rem; display: flex; align-items: center; }
  1547. .stats-error p svg { width: 1.2rem; margin: 0 0.5rem 0.1rem 0; }
  1548. .stats-error .stats-back-to-home { margin-top: 0 }
  1549. /* 404 - NOT FOUND */
  1550. #notfound {
  1551. width: 800px;
  1552. align-items: center;
  1553. }
  1554. #notfound h2 {
  1555. font-size: 28px;
  1556. font-weight: 300;
  1557. }
  1558. /* BANNED */
  1559. #banned { width: 1200px; align-items: center; }
  1560. #banned h2 { font-weight: normal; }
  1561. #banned h4 { font-weight: normal; margin: 0; }
  1562. /* REPORT */
  1563. #report { width: 600px; }
  1564. #report form {
  1565. display: flex;
  1566. flex-direction: column;
  1567. margin-top: 2rem;
  1568. }
  1569. #report form .inputs-wrapper {
  1570. display: flex;
  1571. align-items: flex-end;
  1572. }
  1573. #report form button { margin: 0 0 0.2rem 1rem; }
  1574. #report form .spinner { display: none; }
  1575. #report form.htmx-request svg { display: none; }
  1576. #report form.htmx-request .spinner { display: block; }
  1577. #report-email .spinner { display: none; }
  1578. #report-email .htmx-request svg { display: none; }
  1579. #report-email .htmx-request .spinner { display: block; }
  1580. .eye-icon svg { stroke-width: 0.5; }
  1581. /* RESET PASSWORD */
  1582. #reset-password form {
  1583. width: 100%;
  1584. display: flex;
  1585. flex-direction: column;
  1586. }
  1587. #reset-password form .inputs-wrapper {
  1588. display: flex;
  1589. align-items: flex-end;
  1590. margin-top: 2rem;
  1591. }
  1592. #reset-password form label { flex: 0 0 280px; }
  1593. #reset-password form label input { width: 100%; }
  1594. #reset-password form button { margin: 0 0 0.2rem 1rem; }
  1595. #reset-password .spinner { display: none; }
  1596. #reset-password .htmx-request svg { display: none; }
  1597. #reset-password .htmx-request .spinner { display: block; }
  1598. /* VERIFY USER */
  1599. /* VERIFY CHANGE EMAIL */
  1600. /* RESET PASSWORD TOKEN */
  1601. .verify-page {
  1602. width: 600px;
  1603. align-items: center;
  1604. }
  1605. .verify-page h2,
  1606. .verify-page h3 {
  1607. display: flex;
  1608. align-items: center;
  1609. text-align: center;
  1610. font-weight: normal;
  1611. }
  1612. .verify-page h2 svg,
  1613. .verify-page h3 svg {
  1614. width: 1.15em;
  1615. height: auto;
  1616. margin-right: 0.5rem;
  1617. }
  1618. /* URL INFO */
  1619. #url-info {
  1620. width: 1200px;
  1621. align-items: center;
  1622. text-align: center;
  1623. }
  1624. #url-info h3 { font-weight: normal; margin: 0; }
  1625. /* PROTECTED */
  1626. #protected { width: 600px; }
  1627. #protected form { width: 100%; margin-top: 1rem; }
  1628. #protected form .inputs-wrapper { width: 100%; display: flex; align-items: flex-end; }
  1629. #protected form label { flex: 0 0 280px; }
  1630. #protected form label input { width: 100%; }
  1631. #protected form button { margin: 0 0 0.2rem 1rem; }
  1632. #protected form .spinner { display: none; }
  1633. #protected form.htmx-request svg { display: none; }
  1634. #protected form.htmx-request .spinner { display: block; }
  1635. /* TERMS */
  1636. #terms { width: 600px; }