styles.css 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974
  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. #links-table-wrapper table tr.edit p.no-links {
  1185. width: 100%;
  1186. text-align: center;
  1187. }
  1188. .dialog .ban-checklist {
  1189. display: flex;
  1190. align-items: center;
  1191. }
  1192. .dialog .ban-checklist label { margin: 1rem 1.5rem 1rem 0; }
  1193. .dialog .ban-checklist label:last-child { margin-right: 0; }
  1194. /* INTRO */
  1195. .introduction {
  1196. width: 1200px;
  1197. max-width: 98%;
  1198. display: flex;
  1199. align-items: center;
  1200. margin: 150px 0 0;
  1201. }
  1202. .introduction .text-wrapper {
  1203. display: flex;
  1204. flex: 1 1 auto;
  1205. flex-direction: column;
  1206. align-items: flex-start;
  1207. margin-top: -32px;
  1208. }
  1209. .introduction h2 {
  1210. font-weight: 300;
  1211. font-size: 28px;
  1212. padding-right: 2rem;
  1213. margin-bottom: 2.5rem
  1214. }
  1215. .introduction img {
  1216. width: 60%;
  1217. flex: 0 0 60%;
  1218. max-width: 100%;
  1219. height: auto;
  1220. }
  1221. /* FEATURES */
  1222. .features {
  1223. display: flex;
  1224. flex-direction: column;
  1225. align-items: center;
  1226. width: 100%;
  1227. flex: 0 0 auto;
  1228. padding: 5rem 0;
  1229. margin: 0;
  1230. background-color: var(--features-bg);
  1231. }
  1232. .features h3 {
  1233. font-weight: 300;
  1234. font-size: 28px;
  1235. margin-bottom: 72px;
  1236. }
  1237. .features ul {
  1238. width: 1200px;
  1239. max-width: 100%;
  1240. flex: 1 1 auto;
  1241. justify-content: center;
  1242. flex-wrap: nowrap;
  1243. display: flex;
  1244. margin: 0;
  1245. padding: 0;
  1246. list-style: none;
  1247. }
  1248. .features ul li {
  1249. max-width: 25%;
  1250. display: flex;
  1251. flex-direction: column;
  1252. align-items: center;
  1253. padding: 0 1.5rem;
  1254. margin: 0;
  1255. }
  1256. .features ul li .icon {
  1257. width: 48px;
  1258. height: 48px;
  1259. display: flex;
  1260. align-items: center;
  1261. justify-content: center;
  1262. border-radius: 100%;
  1263. background-color: var(--color-primary);
  1264. }
  1265. .features ul li .icon svg {
  1266. width: 16px;
  1267. height: auto;
  1268. stroke: white;
  1269. stroke-width: 2px;
  1270. }
  1271. .features ul li h4 {
  1272. margin: 1rem;
  1273. padding: 0;
  1274. font-size: 15px;
  1275. }
  1276. .features ul li p {
  1277. margin: 0;
  1278. padding: 0;
  1279. font-size: 14px;
  1280. font-weight: 300;
  1281. text-align: center;
  1282. }
  1283. /* EXTENSIONS */
  1284. .extensions {
  1285. width: 100%;
  1286. display: flex;
  1287. flex-direction: column;
  1288. align-items: center;
  1289. flex: 0 0 auto;
  1290. flex-wrap: nowrap;
  1291. padding: 5rem 0;
  1292. background-color: var(--extensions-bg);
  1293. color: white;
  1294. }
  1295. .extensions h3 {
  1296. font-size: 28px;
  1297. font-weight: 300;
  1298. margin-bottom: 4rem;
  1299. }
  1300. .extensions .extenstions-wrapper {
  1301. width: 1200px;
  1302. max-width: 100%;
  1303. display: flex;
  1304. flex: 1 1 auto;
  1305. justify-content: center;
  1306. flex-wrap: nowrap;
  1307. }
  1308. .extensions a.extension-button {
  1309. display: flex;
  1310. align-items: center;
  1311. justify-content: center;
  1312. margin: 0 1rem;
  1313. padding: 0.75rem 1.75rem;
  1314. background-color: #eee;
  1315. border: 1px solid #aaa;
  1316. font-size: 14px;
  1317. font-weight: bold;
  1318. text-decoration: none;
  1319. border-radius: 4px;
  1320. outline: none;
  1321. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  1322. transition: transform 0.3s ease-out;
  1323. cursor: pointer;
  1324. }
  1325. .extensions a.extension-button:hover {
  1326. transform: translateY(-2px);
  1327. }
  1328. .extensions a.extension-button.chrome { color: #4285f4; }
  1329. .extensions a.extension-button.firefox { color: #e0890f; }
  1330. .extensions a.extension-button svg {
  1331. width: 18px;
  1332. height: auto;
  1333. margin: 0 1rem 2px 0;
  1334. }
  1335. .extensions a.extension-button.chrome svg { fill: #4285f4; }
  1336. .extensions a.extension-button.firefox svg { fill: #e0890f; }
  1337. /* FOOTER */
  1338. footer {
  1339. width: 100%;
  1340. display: flex;
  1341. justify-content: center;
  1342. padding: 1rem 0;
  1343. font-size: 13px;
  1344. text-align: center;
  1345. }
  1346. /* SETTINGS */
  1347. #settings {
  1348. width: 600px;
  1349. max-width: 90%;
  1350. }
  1351. h1.settings-welcome {
  1352. font-size: 28px;
  1353. font-weight: 300;
  1354. }
  1355. h1.settings-welcome span {
  1356. border-bottom: 2px dotted #999;
  1357. padding-bottom: 2px;
  1358. font-weight: normal;
  1359. }
  1360. /* SETTINGS - DOMAIN */
  1361. #domains-table { margin-top: 1rem; }
  1362. #domains-table .domain { flex: 2 2 0; }
  1363. #domains-table .homepage { flex: 2 2 0; }
  1364. #domains-table .actions { flex: 1 1 0; justify-content: flex-end; padding-right: 1rem; }
  1365. #domains-table .no-entry { flex: 1 1 0; opacity: 0.8; }
  1366. .add-domain-wrapper {
  1367. width: 100%;
  1368. display: flex;
  1369. flex-direction: column;
  1370. align-items: flex-start;
  1371. margin: 1.5rem 0 2rem;
  1372. }
  1373. .add-domain-wrapper > .spinner {
  1374. width: 20px;
  1375. display: none;
  1376. margin: 1rem 0 0 1rem;
  1377. }
  1378. .add-domain-wrapper.htmx-request > button { display: none; }
  1379. .add-domain-wrapper.htmx-request > .spinner { display: block; }
  1380. form#add-domain { margin-top: 1rem; }
  1381. form#add-domain .buttons-wrapper { display: flex; }
  1382. form#add-domain button { margin-right: 1rem }
  1383. form#add-domain .spinner { width: 20px; display: none; }
  1384. form#add-domain.htmx-request .buttons-wrapper { display: none; }
  1385. form#add-domain.htmx-request .spinner { display: block; }
  1386. form#add-domain .error { font-size: 0.85rem; }
  1387. /* SETTINGS - API */
  1388. #apikey-wrapper { margin-bottom: 1.5rem; }
  1389. #apikey {
  1390. display: flex;
  1391. align-items: center;
  1392. margin-bottom: 1rem;
  1393. }
  1394. #apikey p {
  1395. font-weight: bold;
  1396. border-bottom: 1px dotted #999;
  1397. transition: opacity 0.2s ease-in-out;
  1398. cursor: pointer;
  1399. }
  1400. #apikey p:hover {
  1401. opacity: 0.8;
  1402. }
  1403. form#generate-apikey .spinner { display: none; }
  1404. form#generate-apikey.htmx-request svg { display: none; }
  1405. form#generate-apikey.htmx-request .spinner { display: block; }
  1406. /* SETTINGS - CHANGE PASSWORD */
  1407. #change-password-wrapper { margin-bottom: 1.5rem; }
  1408. form#change-password { margin-top: 1.5rem; }
  1409. form#change-password button { margin-top: 1rem; }
  1410. form#change-password .spinner { display: none; }
  1411. form#change-password.htmx-request svg { display: none; }
  1412. form#change-password.htmx-request .spinner { display: block; }
  1413. /* SETTINGS - CHANGE EMAIL */
  1414. #change-email-wrapper { margin-bottom: 1.5rem; }
  1415. form#change-email { margin-top: 1.5rem; }
  1416. form#change-email button { margin-top: 1rem; }
  1417. form#change-email .spinner { display: none; }
  1418. form#change-email.htmx-request svg { display: none; }
  1419. form#change-email.htmx-request .spinner { display: block; }
  1420. /* SETTINGS - DELETE ACCOUNT */
  1421. #delete-account-wrapper { margin-bottom: 1.5rem; }
  1422. form#delete-account { margin-top: 1.5rem; }
  1423. form#delete-account button { margin-top: 1rem; }
  1424. form#delete-account .spinner { display: none; }
  1425. form#delete-account.htmx-request svg { display: none; }
  1426. form#delete-account.htmx-request .spinner { display: block; }
  1427. /* STATS */
  1428. #stats-section {
  1429. width: 1200px;
  1430. max-width: 95%;
  1431. }
  1432. .loading-stats {
  1433. width: 100%;
  1434. flex: 1 1 0;
  1435. margin-top: -5rem;
  1436. display: flex;
  1437. align-items: center;
  1438. justify-content: center;
  1439. }
  1440. .loading-stats .spinner {
  1441. width: 1.25rem;
  1442. margin-right: 0.5rem;
  1443. }
  1444. .stats-info {
  1445. width: 100%;
  1446. display: flex;
  1447. align-items: flex-end;
  1448. justify-content: space-between;
  1449. }
  1450. .stats-info h2 { font-weight: 300; font-size: 24px; }
  1451. .stats-info p { font-size: 14px; }
  1452. .stats-info h2,
  1453. .stats-info p { margin: 0 }
  1454. #stats {
  1455. width: 100%;
  1456. display: flex;
  1457. flex-direction: column;
  1458. align-items: stretch;
  1459. background-color: white;
  1460. border-radius: 12px;
  1461. box-shadow: 0 6px 15px hsla(200, 20%, 70%, 0.3);
  1462. overflow: hidden;
  1463. padding: 0;
  1464. }
  1465. .stats-head {
  1466. width: 100%;
  1467. display: flex;
  1468. align-items: center;
  1469. background-color: hsl(200, 12%, 95%);
  1470. justify-content: space-between;
  1471. padding: 0.75rem 1.5rem;
  1472. }
  1473. .total-number { font-weight: bold; }
  1474. .stats-nav { display: flex; align-items: center; }
  1475. .stats-nav button { margin-right: 0.75rem; }
  1476. .stats-nav button:last-child { margin-right: 0; }
  1477. .stats-period {
  1478. display: flex;
  1479. flex-direction: column;
  1480. align-items: stretch;
  1481. padding: 0.75rem 1.5rem;
  1482. }
  1483. .stats-period h2 {
  1484. font-size: 24px;
  1485. font-weight: 300;
  1486. margin: 1rem 0 0;
  1487. }
  1488. .stats-period span.total-in-period {
  1489. font-weight: bold;
  1490. border-bottom: 1px dotted hsl(200, 35%, 65%);
  1491. }
  1492. p.last-update {
  1493. font-size: 14px;
  1494. color: hsl(200, 14%, 60%);
  1495. margin: 0.75rem 0 0;
  1496. }
  1497. #stats canvas {
  1498. width: 100%;
  1499. margin: 2rem 0;
  1500. }
  1501. .stats-columns-wrapper {
  1502. display: flex;
  1503. align-items: flex-start;
  1504. }
  1505. .stats-columns-wrapper > div {
  1506. flex: 1 1 50%;
  1507. }
  1508. svg.map path {
  1509. fill: hsl(200, 15%, 92%);
  1510. stroke: #fff;
  1511. transition: all 0.1s ease-in-out;
  1512. }
  1513. svg.map path.color-1 { fill: hsl(261, 46%, 90%); }
  1514. svg.map path.color-2 { fill: hsl(261, 46%, 86%); }
  1515. svg.map path.color-3 { fill: hsl(261, 46%, 82%); }
  1516. svg.map path.color-4 { fill: hsl(261, 46%, 76%); }
  1517. svg.map path.color-5 { fill: hsl(261, 46%, 72%); }
  1518. svg.map path.color-6 { fill: hsl(261, 46%, 68%); }
  1519. svg.map path.active { stroke: hsl(261, 46%, 50%); stroke-width: 1.5; }
  1520. #map-tooltip {
  1521. position: fixed;
  1522. }
  1523. #map-tooltip.visible::before,
  1524. #map-tooltip.visible::after {
  1525. display: block !important;
  1526. }
  1527. #map-tooltip:before {
  1528. border-top-color: rgba(255, 255, 255, 0.95);
  1529. }
  1530. #map-tooltip:after {
  1531. box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.15);
  1532. background: rgba(255, 255, 255, 0.95);
  1533. color: #333;
  1534. }
  1535. .stats-back-to-home {
  1536. width: 100%;
  1537. display: flex;
  1538. justify-content: center;
  1539. margin: 2rem 0;
  1540. }
  1541. .stats-error {
  1542. width: 100%;
  1543. flex: 1 1 auto;
  1544. display: flex;
  1545. flex-direction: column;
  1546. align-items: center;
  1547. justify-content: center;
  1548. text-align: center;
  1549. }
  1550. .stats-error p { margin-top: -3rem; display: flex; align-items: center; }
  1551. .stats-error p svg { width: 1.2rem; margin: 0 0.5rem 0.1rem 0; }
  1552. .stats-error .stats-back-to-home { margin-top: 0 }
  1553. /* 404 - NOT FOUND */
  1554. #notfound {
  1555. width: 800px;
  1556. align-items: center;
  1557. }
  1558. #notfound h2 {
  1559. font-size: 28px;
  1560. font-weight: 300;
  1561. }
  1562. /* BANNED */
  1563. #banned { width: 1200px; align-items: center; }
  1564. #banned h2 { font-weight: normal; }
  1565. #banned h4 { font-weight: normal; margin: 0; }
  1566. /* REPORT */
  1567. #report { width: 600px; }
  1568. #report form {
  1569. display: flex;
  1570. flex-direction: column;
  1571. margin-top: 2rem;
  1572. }
  1573. #report form .inputs-wrapper {
  1574. display: flex;
  1575. align-items: flex-end;
  1576. }
  1577. #report form button { margin: 0 0 0.2rem 1rem; }
  1578. #report form .spinner { display: none; }
  1579. #report form.htmx-request svg { display: none; }
  1580. #report form.htmx-request .spinner { display: block; }
  1581. #report-email .spinner { display: none; }
  1582. #report-email .htmx-request svg { display: none; }
  1583. #report-email .htmx-request .spinner { display: block; }
  1584. .eye-icon svg { stroke-width: 0.5; }
  1585. /* RESET PASSWORD */
  1586. #reset-password form {
  1587. width: 100%;
  1588. display: flex;
  1589. flex-direction: column;
  1590. }
  1591. #reset-password form .inputs-wrapper {
  1592. display: flex;
  1593. align-items: flex-end;
  1594. margin-top: 2rem;
  1595. }
  1596. #reset-password form label { flex: 0 0 280px; }
  1597. #reset-password form label input { width: 100%; }
  1598. #reset-password form button { margin: 0 0 0.2rem 1rem; }
  1599. #reset-password .spinner { display: none; }
  1600. #reset-password .htmx-request svg { display: none; }
  1601. #reset-password .htmx-request .spinner { display: block; }
  1602. /* VERIFY USER */
  1603. /* VERIFY CHANGE EMAIL */
  1604. /* RESET PASSWORD TOKEN */
  1605. .verify-page {
  1606. width: 600px;
  1607. align-items: center;
  1608. }
  1609. .verify-page h2,
  1610. .verify-page h3 {
  1611. display: flex;
  1612. align-items: center;
  1613. text-align: center;
  1614. font-weight: normal;
  1615. }
  1616. .verify-page h2 svg,
  1617. .verify-page h3 svg {
  1618. width: 1.15em;
  1619. height: auto;
  1620. margin-right: 0.5rem;
  1621. }
  1622. /* URL INFO */
  1623. #url-info {
  1624. width: 1200px;
  1625. align-items: center;
  1626. text-align: center;
  1627. }
  1628. #url-info h3 { font-weight: normal; margin: 0; }
  1629. /* PROTECTED */
  1630. #protected { width: 600px; }
  1631. #protected form { width: 100%; margin-top: 1rem; }
  1632. #protected form .inputs-wrapper { width: 100%; display: flex; align-items: flex-end; }
  1633. #protected form label { flex: 0 0 280px; }
  1634. #protected form label input { width: 100%; }
  1635. #protected form button { margin: 0 0 0.2rem 1rem; }
  1636. #protected form .spinner { display: none; }
  1637. #protected form.htmx-request svg { display: none; }
  1638. #protected form.htmx-request .spinner { display: block; }
  1639. /* TERMS */
  1640. #terms { width: 600px; }