styles.css 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493
  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. .space-between {
  77. display: flex;
  78. justify-content: space-between;
  79. align-items: center;
  80. }
  81. .align-center {
  82. display: flex;
  83. align-items: center;
  84. }
  85. a,
  86. button.link {
  87. color: var(--color-primary);
  88. border-bottom: 1px dotted transparent;
  89. text-decoration: none;
  90. transition: all 0.2s ease-out;
  91. cursor: pointer;
  92. }
  93. a:hover,
  94. button.link:hover {
  95. border-bottom-color: var(--color-primary);
  96. }
  97. a.wrapper-only {
  98. color: inherit;
  99. }
  100. a.nav {
  101. color: inherit;
  102. padding-bottom: 2px;
  103. }
  104. a.nav:hover {
  105. color: var(--color-primary);
  106. }
  107. a.button,
  108. button {
  109. position: relative;
  110. width: auto;
  111. height: 40px;
  112. display: flex;
  113. align-items: center;
  114. justify-content: center;
  115. padding: 0 32px;
  116. font-size: 13px;
  117. font-weight: normal;
  118. text-align: center;
  119. line-height: 1;
  120. word-break: keep-all;
  121. color: #444;
  122. border: none;
  123. border-radius: 100px;
  124. transition: all 0.4s ease-out;
  125. cursor: pointer;
  126. overflow: hidden;
  127. background: var(--button-bg);
  128. box-shadow: 0 5px 6px var(--button-bg-box-shadow-color);
  129. }
  130. a.button.primary,
  131. button.primary {
  132. color: white;
  133. background: var(--button-bg-primary);
  134. box-shadow: 0 5px 6px var(--button-bg-primary-box-shadow-color);
  135. }
  136. a.button.secondary,
  137. button.secondary {
  138. color: white;
  139. background: var(--button-bg-secondary);
  140. box-shadow: 0 5px 6px var(--button-bg-secondary-box-shadow-color);
  141. }
  142. a.button.danger,
  143. button.danger {
  144. color: white;
  145. background: var(--button-bg-danger);
  146. box-shadow: 0 5px 6px var(--button-bg-danger-box-shadow-color);
  147. }
  148. a.button.success,
  149. button.success {
  150. color: white;
  151. background: var(--button-bg-success);
  152. box-shadow: 0 5px 6px var(--button-bg-success-box-shadow-color);
  153. }
  154. a.button:focus,
  155. a.button:hover,
  156. button:focus,
  157. button:hover {
  158. box-shadow: 0 6px 15px var(--button-bg-box-shadow-color);
  159. transform: translateY(-2px) scale(1.02, 1.02);
  160. }
  161. a.button.primary:focus,
  162. a.button.primary:hover,
  163. button.primary:focus,
  164. button.primary:hover {
  165. box-shadow: 0 6px 15px var(--button-bg-primary-box-shadow-color);
  166. }
  167. a.button.secondary:focus,
  168. a.button.secondary:hover,
  169. button.secondary:focus,
  170. button.secondary:hover {
  171. box-shadow: 0 6px 15px var(--button-bg-secondary-box-shadow-color);
  172. }
  173. a.button.danger:focus,
  174. a.button.danger:hover,
  175. button.danger:focus,
  176. button.danger:hover {
  177. box-shadow: 0 6px 15px var(--button-bg-danger-box-shadow-color);
  178. }
  179. a.button.success:focus,
  180. a.button.success:hover,
  181. button.success:focus,
  182. button.success:hover {
  183. box-shadow: 0 6px 15px var(--button-bg-success-box-shadow-color);
  184. }
  185. a.button:disabled,
  186. button:disabled { cursor: default; }
  187. a.button:disabled:hover,
  188. button:disabled:hover { transform: none; }
  189. a.button svg.with-text,
  190. a.button span svg,
  191. button svg.with-text,
  192. button span svg {
  193. width: 1.1em;
  194. height: auto;
  195. margin-right: 0.5rem;
  196. stroke: white;
  197. stroke-width: 2;
  198. }
  199. a.button.action,
  200. button.action {
  201. padding: 5px;
  202. width: 24px;
  203. height: 24px;
  204. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  205. }
  206. a.button.action:disabled,
  207. button.action:disabled {
  208. background: none;
  209. box-shadow: none;
  210. }
  211. a.button.action svg,
  212. button.action svg {
  213. width: 100%;
  214. margin-right: 0;
  215. }
  216. a.button.action.delete,
  217. button.action.delete {
  218. background: hsl(0, 100%, 96%);
  219. }
  220. a.button.action.delete svg,
  221. button.action.delete svg {
  222. stroke-width: 2;
  223. stroke: hsl(0, 100%, 69%);
  224. }
  225. a.button.action.edit,
  226. button.action.edit {
  227. background: hsl(46, 100%, 94%);
  228. }
  229. a.button.action.edit svg,
  230. button.action.edit svg {
  231. stroke-width: 2.5;
  232. stroke: hsl(46, 90%, 50%);
  233. }
  234. a.button.action.qrcode,
  235. button.action.qrcode {
  236. background: hsl(0, 0%, 94%);
  237. }
  238. a.button.action.qrcode svg,
  239. button.action.qrcode svg {
  240. fill: hsl(0, 0%, 35%);
  241. stroke: none;
  242. }
  243. a.button.action.stats,
  244. button.action.stats {
  245. background: hsl(260, 100%, 96%);
  246. }
  247. a.button.action.stats svg,
  248. button.action.stats svg {
  249. stroke-width: 2.5;
  250. stroke: hsl(260, 100%, 69%);
  251. }
  252. a.button.action.ban,
  253. button.action.ban {
  254. background: hsl(10, 100%, 96%);
  255. }
  256. a.button.action.ban svg,
  257. button.action.ban svg {
  258. stroke-width: 2;
  259. stroke: hsl(10, 100%, 40%);
  260. }
  261. a.button.action.password sv,
  262. button.action.password svg,
  263. a.button.action.banned svg,
  264. button.action.banned svg {
  265. stroke-width: 2.5;
  266. stroke: #bbb;
  267. }
  268. button.nav {
  269. box-sizing: border-box;
  270. width: auto;
  271. height: 28px;
  272. display: flex;
  273. flex: 0 0 auto;
  274. align-items: center;
  275. justify-content: center;
  276. padding: 0 8px;
  277. border: none;
  278. border-radius: 4px;
  279. box-shadow: 0 0px 10px rgba(100, 100, 100, 0.1);
  280. background: none;
  281. background-color: white;
  282. transition: all 0.2s ease-in-out;
  283. font-size: 12px;
  284. cursor: pointer;
  285. }
  286. button.nav:disabled {
  287. background-color: #f6f6f6;
  288. box-shadow: 0 0px 5px rgba(150, 150, 150, 0.1);
  289. opacity: 0.9;
  290. color: #bbb;
  291. cursor: default;
  292. }
  293. button.nav svg {
  294. width: 14px;
  295. height: auto;
  296. }
  297. button.nav svg { stroke-width: 2.5; }
  298. button.nav:hover { transform: translateY(-2px); }
  299. button.nav:disabled:hover { transform: none; }
  300. button.table {
  301. height: 32px;
  302. padding: 0 1rem;
  303. font-size: 12px;
  304. border-radius: 3px;
  305. transition: all 0.2s ease-in-out;
  306. box-shadow: 0 1px 2px var(--button-bg-box-shadow-color);
  307. }
  308. button.table:hover {
  309. transform: translateY(-2px);
  310. box-shadow: 0 1px 2px var(--button-bg-box-shadow-color);
  311. }
  312. button.table.primary,
  313. button.primary:focus,
  314. button.primary:hover {
  315. box-shadow: 0 1px 2px var(--button-bg-primary-box-shadow-color);
  316. }
  317. button.table.secondary,
  318. button.secondary:focus,
  319. button.secondary:hover {
  320. box-shadow: 0 1px 2px var(--button-bg-secondary-box-shadow-color);
  321. }
  322. button.table.danger,
  323. button.danger:focus,
  324. button.danger:hover {
  325. box-shadow: 0 1px 2px var(--button-bg-danger-box-shadow-color);
  326. }
  327. button.table.success,
  328. button.success:focus,
  329. button.success:hover {
  330. box-shadow: 0 1px 2px var(--button-bg-success-box-shadow-color);
  331. }
  332. button.link {
  333. position: relative;
  334. width: auto;
  335. height: auto;
  336. display: flex;
  337. align-items: center;
  338. justify-content: flex-start;
  339. padding: 0 0 2px 0;
  340. font-size: 1rem;
  341. font-weight: normal;
  342. border-radius: 0;
  343. text-align: left;
  344. line-height: normal;
  345. word-break: normal;
  346. cursor: pointer;
  347. background: none;
  348. box-shadow: none;
  349. }
  350. button.link:hover {
  351. box-shadow: none;
  352. transform: none;
  353. }
  354. button.link span {
  355. height: 1rem;
  356. }
  357. button.link svg {
  358. stroke: var(--color-primary);
  359. }
  360. svg.spinner {
  361. animation: spin 1s linear infinite, fadein 0.3s ease-in-out;
  362. }
  363. input {
  364. filter: none;
  365. }
  366. input[type="text"],
  367. input[type="email"],
  368. input[type="password"] {
  369. box-sizing: border-box;
  370. width: 240px;
  371. height: 44px;
  372. padding: 0 24px;
  373. font-size: 15px;
  374. letter-spacing: 0.05em;
  375. color: #444;
  376. background-color: white;
  377. border: none;
  378. border-radius: 100px;
  379. border-bottom: 5px solid #f5f5f5;
  380. border-bottom-width: 5px;
  381. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  382. transition: all 0.5s ease-out;
  383. }
  384. input[type="text"]:focus,
  385. input[type="email"]:focus,
  386. input[type="password"]:focus {
  387. outline: none;
  388. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  389. }
  390. input[type="text"]::placeholder,
  391. input[type="email"]::placeholder,
  392. input[type="password"]::placeholder {
  393. font-size: 14px;
  394. letter-spacing: 0.05em;
  395. color: #888;
  396. }
  397. .error input[type="text"],
  398. .error input[type="email"],
  399. .error input[type="password"] {
  400. border-bottom-color: rgba(250, 10, 10, 0.8);
  401. box-shadow: 0 10px 15px hsla(0, 100%, 75%, 0.2);
  402. }
  403. select {
  404. position: relative;
  405. width: 240px;
  406. height: 44px;
  407. padding: 0 24px;
  408. font-size: 15px;
  409. box-sizing: border-box;
  410. letter-spacing: 0.05em;
  411. color: #444;
  412. background-color: white;
  413. box-shadow: 0 10px 35px hsla(200, 15%, 70%, 0.2);
  414. border: none;
  415. border-radius: 100px;
  416. border-bottom: 5px solid #f5f5f5;
  417. border-bottom-width: 5px;
  418. transition: all 0.5s ease-out;
  419. appearance: none;
  420. 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");
  421. background-repeat: no-repeat, repeat;
  422. background-position: right 1.2em top 50%, 0 0;
  423. background-size: 1em auto, 100%;
  424. }
  425. select:focus {
  426. outline: none;
  427. box-shadow: 0 20px 35px hsla(200, 15%, 70%, 0.4);
  428. }
  429. .error select {
  430. border-bottom-color: rgba(250, 10, 10, 0.8);
  431. box-shadow: 0 10px 15px hsla(0, 100%, 75%, 0.2);
  432. }
  433. input[type="checkbox"] {
  434. position: relative;
  435. width: 1rem;
  436. height: 1rem;
  437. display: flex;
  438. align-items: center;
  439. justify-content: center;
  440. border-radius: 4px;
  441. background-color: white;
  442. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  443. margin: 0;
  444. -webkit-appearance: none;
  445. appearance: none;
  446. cursor: pointer;
  447. }
  448. input[type="checkbox"]:focus {
  449. outline: 3px solid rgba(65, 164, 245, 0.5);
  450. }
  451. input[type="checkbox"]::after {
  452. content: "";
  453. position: absolute;
  454. top: 50%;
  455. left: 50%;
  456. width: 80%;
  457. height: 80%;
  458. display: block;
  459. border-radius: 2px;
  460. background-color: #9575cd;
  461. box-shadow: 0 2px 4px rgba(50, 50, 50, 0.2);
  462. cursor: pointer;
  463. opacity: 0;
  464. transform: translate(-50%, -50%) scale(0);
  465. transition: all 0.1s ease-in-out;
  466. }
  467. input[type="checkbox"]:checked:after {
  468. opacity: 1;
  469. transform: translate(-50%, -50%) scale(1);
  470. }
  471. input.table-input,
  472. select.table-input {
  473. width: auto;
  474. height: 32px;
  475. font-size: 13px;
  476. padding: 0 1.5rem;
  477. border-radius: 3px;
  478. border-bottom-width: 2px;
  479. }
  480. select.table-input {
  481. width: 150px;
  482. }
  483. input.table-input::placeholder {
  484. font-size: 13px;
  485. }
  486. select:has(option[value=""]:checked) {
  487. letter-spacing: 0.05em;
  488. color: #888;
  489. }
  490. label {
  491. display: flex;
  492. color: rgb(41, 71, 86);
  493. font-size: 1rem;
  494. flex-direction: column;
  495. align-items: flex-start;
  496. font-weight: bold;
  497. }
  498. label input {
  499. margin-top: 0.5rem;
  500. }
  501. label.checkbox {
  502. flex-direction: row;
  503. align-items: center;
  504. cursor: pointer;
  505. font-weight: normal;
  506. }
  507. label.checkbox input[type="checkbox"] {
  508. margin: 0 0.75rem 2px 0;
  509. }
  510. p.error,
  511. p.success {
  512. display: flex;
  513. align-items: center;
  514. font-weight: normal;
  515. animation: fadein 0.3s ease-in-out;
  516. }
  517. p.error { color: red; }
  518. p.success { color: #0ea30e; }
  519. table {
  520. width: 100%;
  521. display: flex;
  522. flex-direction: column;
  523. background-color: white;
  524. border-radius: 12px;
  525. box-shadow: 0 6px 15px hsla(200, 20%, 70%, 0.3);
  526. text-align: center;
  527. overflow: auto;
  528. }
  529. table tr {
  530. flex: 1 1 auto;
  531. }
  532. table tr,
  533. table th,
  534. table td,
  535. table thead,
  536. table tfoot {
  537. display: flex;
  538. overflow: hidden;
  539. }
  540. table tbody,
  541. table tr {
  542. overflow: visible;
  543. }
  544. table tbody,
  545. table thead,
  546. table tfoot {
  547. flex-direction: column;
  548. }
  549. table tr {
  550. padding: 0 0.5rem;
  551. border-bottom: 1px solid hsl(200, 14%, 94%);
  552. }
  553. table th,
  554. table td {
  555. flex-basis: 0;
  556. padding: 0.75rem;
  557. }
  558. table td {
  559. position: relative;
  560. white-space: nowrap;
  561. font-size: 15px;
  562. align-items: center;
  563. }
  564. table tbody {
  565. border-bottom-right-radius: 12px;
  566. border-bottom-left-radius: 12px;
  567. animation: fadein 0.3s ease-in-out;
  568. }
  569. table tbody + tfoot {
  570. border: none;
  571. }
  572. table thead {
  573. background-color: hsl(200, 12%, 95%);
  574. border-top-right-radius: 12px;
  575. border-top-left-radius: 12px;
  576. font-weight: bold;
  577. }
  578. table thead tr {
  579. border-bottom: 1px solid hsl(200, 14%, 90%);
  580. }
  581. table tfoot {
  582. background-color: hsl(200, 12%, 95%);
  583. border-bottom-right-radius: 12px;
  584. border-bottom-left-radius: 12px;
  585. }
  586. table tr.loading-placeholder {
  587. flex: 1 1 auto;
  588. justify-content: center;
  589. animation: fadein 0.3s ease-in-out;
  590. }
  591. table tr.loading-placeholder td {
  592. flex: 0 0 auto;
  593. font-size: 18px;
  594. font-weight: 300;
  595. }
  596. table select {
  597. margin-right: 1rem;
  598. }
  599. table .tab {
  600. display: flex;
  601. align-items: center;
  602. }
  603. table .tab a {
  604. position: relative;
  605. display: flex;
  606. align-items: center;
  607. justify-content: center;
  608. padding: 0.4rem 1rem;
  609. margin: 0 0.5rem;
  610. font-size: 12px;
  611. color: var(--text-color);
  612. border: none;
  613. border-radius: 4px;
  614. background-color: white;
  615. cursor: pointer;
  616. box-shadow: 0 0px 10px rgba(100, 100, 100, 0.1);
  617. font-weight: normal;
  618. transition: all 0.2s ease-in-out;
  619. }
  620. table .tab a:first-child { margin-left: 0}
  621. table .tab a.active {
  622. background-color: #f6f6f6;
  623. box-shadow: 0 0px 5px rgba(150, 150, 150, 0.1);
  624. color: #aaa;
  625. font-weight: bold;
  626. opacity: 0.9;
  627. cursor: default;
  628. }
  629. table .tab a:not(.active):hover {
  630. transform: translateY(-2px);
  631. }
  632. .dialog {
  633. position: fixed;
  634. width: 100%;
  635. height: 100%;
  636. top: 0;
  637. left: 0;
  638. display: none;
  639. justify-content: center;
  640. align-items: center;
  641. background-color: rgba(50, 50, 50, 0.8);
  642. z-index: 1000;
  643. animation: fadein 0.2s ease-in-out;
  644. }
  645. .dialog.open { display: flex; }
  646. .dialog .box {
  647. min-width: 450px;
  648. max-width: 90%;
  649. display: flex;
  650. flex-direction: column;
  651. align-items: center;
  652. text-align: center;
  653. padding: 3rem 2rem;
  654. background-color: white;
  655. border-radius: 8px;
  656. --keyframe-slidey-offset: -30px;
  657. animation: slidey 0.2s ease-in-out;
  658. }
  659. .dialog.qrcode .box {
  660. min-width: auto;
  661. padding: 2rem;
  662. }
  663. .dialog .content-wrapper {
  664. display: flex;
  665. flex-direction: column;
  666. }
  667. .dialog .loading {
  668. display: none;
  669. width: 24px;
  670. height: 24px;
  671. margin: 3rem 0;
  672. animation: fadein 0.2s ease-in-out;
  673. }
  674. .dialog.htmx-request .loading {
  675. display: block;
  676. }
  677. .dialog.htmx-request .content-wrapper {
  678. display: none;
  679. }
  680. .dialog .loading svg {
  681. animation: spin 1s linear infinite;
  682. }
  683. .dialog .content {
  684. display: flex;
  685. flex-direction: column;
  686. animation: fadein 0.2s ease-in-out;
  687. }
  688. .dialog .content h2 {
  689. font-weight: bold !important;
  690. margin-bottom: 0.5rem !important;
  691. margin-top: 0;
  692. }
  693. .dialog .content .buttons {
  694. display: flex;
  695. align-items: center;
  696. margin-top: 1.5rem;
  697. }
  698. .dialog .content .buttons button { margin-right: 2rem; }
  699. .dialog .content .buttons button:last-of-type { margin-right: 0; }
  700. .dialog .content {
  701. align-items: center;
  702. }
  703. .dialog .content #dialog-error {
  704. margin-top: 1rem;
  705. margin-bottom: -1rem;
  706. }
  707. .dialog .content .icon {
  708. width: 48px;
  709. height: 48px;
  710. border-radius: 100%;
  711. padding: 5px;
  712. margin-bottom: 1.5rem;
  713. border: 2px solid;
  714. }
  715. .dialog .content .icon svg {
  716. width: 100%;
  717. height: auto;
  718. }
  719. .dialog .content .icon.success {
  720. border-color: var(--success-icon-color);
  721. }
  722. .dialog .content .icon.success svg {
  723. stroke-width: 2;
  724. stroke: var(--success-icon-color);
  725. }
  726. .dialog .content .icon.error {
  727. border-color: var(--error-icon-color);
  728. }
  729. .dialog .content .icon.error svg {
  730. stroke-width: 1.5;
  731. stroke: var(--error-icon-color);
  732. }
  733. .dialog .content svg.spinner {
  734. display: none;
  735. width: 24px;
  736. margin: 0.5rem 0;
  737. }
  738. .dialog .content.htmx-request svg.spinner { display: block; }
  739. .dialog .content.htmx-request button { display: none; }
  740. .dialog .content label { margin: 0.5rem 0; }
  741. .dialog .content input[type="text"],
  742. .dialog .content input[type="password"],
  743. .dialog .content input[type="email"],
  744. .dialog .content select {
  745. width: 320px;
  746. height: 48px;
  747. }
  748. .inputs { display: flex; align-items: flex-start; margin-bottom: 1rem; }
  749. .inputs label { flex: 0 0 0; margin-right: 1rem; }
  750. .inputs label:last-child { margin-right: 0; }
  751. .search-input-wrapper {
  752. position: relative;
  753. }
  754. .search-input-wrapper button {
  755. position: absolute;
  756. display: none;
  757. right: 0;
  758. top: 50%;
  759. width: auto;
  760. height: auto;
  761. padding: 3px;
  762. margin: 0;
  763. background-color: transparent;
  764. background: none;
  765. box-shadow: none;
  766. transform: translateY(-50%);
  767. cursor: pointer;
  768. margin-right: 0.25rem;
  769. transition: all 0.2s ease-in-out;
  770. }
  771. .search-input-wrapper button:hover {
  772. transform: translateY(-55%);
  773. }
  774. .search-input-wrapper svg {
  775. width: 0.9rem;
  776. height: auto;
  777. stroke-width: 2;
  778. stroke: #888;
  779. }
  780. [data-tooltip] {
  781. position: relative;
  782. overflow: visible;
  783. }
  784. [data-tooltip]:before,
  785. [data-tooltip]:after {
  786. position: absolute;
  787. left: 50%;
  788. display: none;
  789. font-size: 11px;
  790. line-height: 1;
  791. opacity: 0;
  792. transform: translate(-50%, -0.5rem);
  793. }
  794. [data-tooltip]:before {
  795. content: "";
  796. border: 4px solid transparent;
  797. top: -4px;
  798. border-bottom-width: 0;
  799. border-top-color: #333;
  800. z-index: 1001;
  801. }
  802. [data-tooltip]:after {
  803. content: attr(data-tooltip);
  804. top: -25px;
  805. text-align: center;
  806. min-width: 1rem;
  807. white-space: nowrap;
  808. overflow: hidden;
  809. text-overflow: ellipsis;
  810. padding: 5px 7px;
  811. border-radius: 4px;
  812. box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.35);
  813. background: #333;
  814. color: #fff;
  815. z-index: 1000;
  816. }
  817. [data-tooltip]:hover:before,
  818. [data-tooltip]:hover:after {
  819. display: block;
  820. }
  821. [data-tooltip]:before,
  822. [data-tooltip]:after,
  823. [data-tooltip]:hover:before,
  824. [data-tooltip]:hover:after {
  825. animation: tooltip 300ms ease-out forwards;
  826. }
  827. /* DISTINCT */
  828. .main-wrapper {
  829. min-height: 100vh;
  830. width: 100%;
  831. display: flex;
  832. flex: 0 0 auto;
  833. align-items: center;
  834. flex-direction: column;
  835. }
  836. .section-container {
  837. max-width: 90%;
  838. flex: 1 1 auto;
  839. display: flex;
  840. flex-direction: column;
  841. align-items: flex-start;
  842. margin-top: 1rem;
  843. }
  844. .htmx-spinner .spinner { display: none; }
  845. .htmx-spinner.htmx-request button svg { display: none; }
  846. .htmx-spinner.htmx-request .spinner { display: block; }
  847. /* LOGIN & SIGNUP */
  848. form#login-signup {
  849. width: 420px;
  850. max-width: 100%;
  851. flex: 1 1 auto;
  852. display: flex;
  853. padding: 0 16px;
  854. flex-direction: column;
  855. margin: 3rem 0 0;
  856. }
  857. form#login-signup label { margin-bottom: 2rem; }
  858. form#login-signup input {
  859. width: 100%;
  860. height: 72px;
  861. margin-top: 1rem;
  862. padding: 0 3rem;
  863. font-size: 16px;
  864. }
  865. form#login-signup .buttons-wrapper {
  866. display: flex;
  867. align-items: center;
  868. justify-content: space-between;
  869. margin-bottom: 1.5rem;
  870. }
  871. form#login-signup .buttons-wrapper button {
  872. height: 56px;
  873. flex: 0 0 48%;
  874. padding: 0 1rem 2px;
  875. margin: 0;
  876. }
  877. form#login-signup .buttons-wrapper button.full { flex-basis: 100%; }
  878. form#login-signup a.forgot-password {
  879. align-self: flex-start;
  880. font-size: 14px;
  881. }
  882. form#login-signup svg.spinner { display: none; }
  883. form#login-signup.htmx-request:not(.signup) .login svg { display: none; }
  884. form#login-signup.htmx-request:not(.signup) .login svg.spinner { display: block; }
  885. form#login-signup.htmx-request.signup .signup svg.spinner { display: block; }
  886. form#login-signup.htmx-request.signup .signup svg.icon { display: none; }
  887. form#login-signup.htmx-request .error { opacity: 0; }
  888. form#login-signup p.error {
  889. margin-bottom: 0;
  890. }
  891. .admin-form-title {
  892. font-size: 26px;
  893. font-weight: 300;
  894. margin: 0 0 3rem;
  895. text-align: center;
  896. }
  897. .login-signup-message {
  898. flex: 1 1 auto;
  899. margin-top: 3rem;
  900. }
  901. .login-signup-message h1 {
  902. font-weight: 300;
  903. font-size: 24px;
  904. }
  905. /* HEADER */
  906. header {
  907. box-sizing: border-box;
  908. margin: 0;
  909. width: 1232px;
  910. max-width: 100%;
  911. padding: 0 32px;
  912. height: 102px;
  913. justify-content: space-between;
  914. align-items: center;
  915. display: flex;
  916. }
  917. header .logo-wrapper {
  918. display: flex;
  919. align-items: center;
  920. }
  921. header a.logo {
  922. position: relative;
  923. display: flex;
  924. align-items: center;
  925. font-size: 22px;
  926. font-weight: bold;
  927. text-decoration: none;
  928. border: none;
  929. margin: 0;
  930. padding: 0;
  931. }
  932. header a.logo:hover { border: none; color: inherit; }
  933. header .logo img {
  934. margin: 0 12px 0 0;
  935. padding: 0;
  936. }
  937. header ul.logo-links {
  938. list-style: none;
  939. display: flex;
  940. align-items: flex-end;
  941. margin: 0 0 0 0.5rem;
  942. padding: 0;
  943. }
  944. header ul.logo-links li {
  945. padding: 2px 0 0;
  946. margin: 0 0 0 32px;
  947. }
  948. header ul.logo-links li a {
  949. font-size: 1rem;
  950. }
  951. header nav ul {
  952. display: flex;
  953. flex-direction: row-reverse;
  954. align-items: center;
  955. list-style: none;
  956. margin: 0;
  957. padding: 0;
  958. }
  959. header nav ul li {
  960. margin: 0 0 0 2rem;
  961. padding: 0;
  962. }
  963. header nav ul li:last-child { margin-left: 0; }
  964. /* SHORTENER */
  965. main {
  966. width: 800px;
  967. max-width: 100%;
  968. flex: 0 0 auto;
  969. display: flex;
  970. flex-direction: column;
  971. align-items: center;
  972. padding: 0 1rem;
  973. margin-top: 1rem;
  974. }
  975. main #shorturl {
  976. display: flex;
  977. align-items: center;
  978. margin: 1rem 0 3rem;
  979. }
  980. main #shorturl h1 {
  981. margin: 0;
  982. border-bottom: 2px dotted transparent;
  983. font-weight: 300;
  984. font-size: 2rem;
  985. }
  986. main #shorturl h1.link {
  987. cursor: pointer;
  988. border-bottom-color: hsl(200, 35%, 65%);
  989. transition: opacity 0.3s ease-in-out;
  990. --keyframe-slidey-offset: -10px;
  991. animation: fadein 0.2s ease-in-out, slidey 0.2s ease-in-out;
  992. }
  993. main #shorturl h1.link:hover {
  994. opacity: 0.8;
  995. }
  996. .clipboard {
  997. width: 35px;
  998. height: 35px;
  999. display: flex;
  1000. margin-right: 1rem;
  1001. }
  1002. .clipboard button {
  1003. width: 100%;
  1004. height: 100%;
  1005. display: flex;
  1006. margin: 0;
  1007. padding: 7px;
  1008. box-shadow: none;
  1009. outline: none;
  1010. border: none;
  1011. background: none;
  1012. border-radius: 100%;
  1013. background-color: var(--copy-icon-bg-color);
  1014. transition: transform 0.4s ease-out;
  1015. box-shadow: 0 2px 1px hsla(200, 15%, 60%, 0.12);
  1016. cursor: pointer;
  1017. --keyframe-slidey-offset: -10px;
  1018. animation: slidey 0.2s ease-in-out;
  1019. }
  1020. .clipboard.small { width: 24px; height: 24px; }
  1021. .clipboard.small button { width: 24px; height: 24px; padding: 5px; }
  1022. .clipboard button:hover,
  1023. .clipboard button:focus {
  1024. transform: translateY(-2px) scale(1.02, 1.02);
  1025. }
  1026. .clipboard button:focus {
  1027. outline: 3px solid rgba(65, 164, 245, 0.5);
  1028. }
  1029. .clipboard svg {
  1030. stroke: var(--copy-icon-color);
  1031. width: 100%;
  1032. height: auto;
  1033. }
  1034. .clipboard svg.copy {
  1035. stroke-width: 2.5;
  1036. }
  1037. .clipboard svg.check {
  1038. display: none;
  1039. padding: 3px;
  1040. stroke-width: 3;
  1041. --keyframe-slidey-offset: -10px;
  1042. animation: slidey 0.2s ease-in-out;
  1043. }
  1044. .clipboard.copied button {
  1045. background-color: transparent;
  1046. box-shadow: none;
  1047. }
  1048. .clipboard.copied button { display: none; }
  1049. .clipboard.copied svg.check { display: block; }
  1050. main #shorturl h1 span {
  1051. border-bottom: 1px dotted #999;
  1052. }
  1053. main form {
  1054. position: relative;
  1055. width: 100%;
  1056. display: flex;
  1057. flex-direction: column;
  1058. }
  1059. main form input#target {
  1060. position: relative;
  1061. width: 100%;
  1062. height: 72px;
  1063. display: flex;
  1064. padding: 0 84px 0 40px;
  1065. font-size: 20px;
  1066. }
  1067. main form input#target::placeholder {
  1068. font-size: 17px;
  1069. }
  1070. main form p.error {
  1071. font-size: 13px;
  1072. margin-left: 0.5rem;
  1073. }
  1074. main form .target-wrapper p.error {
  1075. font-size: 15px;
  1076. margin-left: 1rem;
  1077. margin-bottom: 0;
  1078. }
  1079. main form .target-wrapper {
  1080. position: relative;
  1081. width: 100%;
  1082. height: auto;
  1083. }
  1084. main form button.submit {
  1085. box-sizing: content-box;
  1086. position: absolute;
  1087. cursor: pointer;
  1088. width: 28px;
  1089. height: auto;
  1090. right: 0;
  1091. top: 16px;
  1092. padding: 4px;
  1093. margin: 0 2rem 0;
  1094. background: none;
  1095. box-shadow: none;
  1096. outline: none;
  1097. border: none;
  1098. }
  1099. main form button.submit:focus,
  1100. main form button.submit:hover {
  1101. outline: none;
  1102. }
  1103. main form button.submit svg.send {
  1104. fill: #aaa;
  1105. animation: fadein 0.3s ease-in-out;
  1106. transition: fill 0.2s ease-in-out;
  1107. }
  1108. main form button.submit:hover svg.send {
  1109. fill: var(--send-icon-hover-color);
  1110. }
  1111. main form button.submit svg.spinner {
  1112. display: none;
  1113. fill: none;
  1114. stroke: var(--send-spinner-icon-color);
  1115. stroke-width: 2;
  1116. }
  1117. main form.htmx-request button.submit svg.send { display: none; }
  1118. main form.htmx-request button.submit svg.spinner { display: block; }
  1119. main form label#advanced {
  1120. margin-top: 2rem;
  1121. align-self: flex-start;
  1122. }
  1123. main form label#advanced input {
  1124. width: 1.1rem;
  1125. height: 1.1rem;
  1126. margin-bottom: 2px;
  1127. }
  1128. #advanced-options {
  1129. display: flex;
  1130. flex-direction: column;
  1131. margin-top: 1.5rem;
  1132. }
  1133. #advanced-options.hidden { display: none; }
  1134. .advanced-input-wrapper {
  1135. width: 100%;
  1136. display: flex;
  1137. align-items: flex-start;
  1138. margin-bottom: 1rem;
  1139. }
  1140. .advanced-input-wrapper label {
  1141. flex: 1 1 0;
  1142. padding-right: 1rem;
  1143. }
  1144. .advanced-input-wrapper label.expire-in { flex: 1 1 34%; }
  1145. .advanced-input-wrapper label.description { flex: 1 1 65%; }
  1146. .advanced-input-wrapper label:last-child { padding-right: 0; }
  1147. .advanced-input-wrapper label input,
  1148. .advanced-input-wrapper label select {
  1149. width: 100%;
  1150. margin-top: 0.5rem;
  1151. }
  1152. /* MAIN TABLE */
  1153. #main-table-wrapper {
  1154. width: 1200px;
  1155. max-width: 100%;
  1156. display: flex;
  1157. flex-direction: column;
  1158. flex: 1 1 auto;
  1159. align-items: flex-start;
  1160. padding: 0 1rem;
  1161. margin: 7rem 0 7.5rem;
  1162. }
  1163. #main-table-wrapper h2 {
  1164. font-weight: 300;
  1165. margin-bottom: 1rem;
  1166. }
  1167. #main-table-wrapper table thead,
  1168. #main-table-wrapper table tbody,
  1169. #main-table-wrapper table tfoot {
  1170. min-width: 1000px;
  1171. }
  1172. #main-table-wrapper tr {
  1173. padding: 0 0.5rem;
  1174. }
  1175. #main-table-wrapper th,
  1176. #main-table-wrapper td {
  1177. padding: 1rem;
  1178. }
  1179. #main-table-wrapper td {
  1180. font-size: 1rem;
  1181. }
  1182. #main-table-wrapper table .original-url { flex: 7 7 0; }
  1183. #main-table-wrapper table .created-at { flex: 2.5 2.5 0; }
  1184. #main-table-wrapper table .short-link { flex: 3 3 0; }
  1185. #main-table-wrapper.admin-table-wrapper table .short-link { overflow: visible; }
  1186. #main-table-wrapper table .views { flex: 1 1 0; justify-content: flex-end; }
  1187. #main-table-wrapper table .actions { flex: 3 3 0; justify-content: flex-end; overflow: visible; }
  1188. #main-table-wrapper table .actions a.button,
  1189. #main-table-wrapper table .actions button { margin-right: 0.5rem; }
  1190. #main-table-wrapper table .actions a.button:last-child,
  1191. #main-table-wrapper table .actions button:last-child { margin-right: 0; }
  1192. #main-table-wrapper table .users-id { flex: 3 3 0; justify-content: flex-end; }
  1193. #main-table-wrapper table .users-email { flex: 9 9 0; }
  1194. #main-table-wrapper table .users-created-at { flex: 4 4 0; }
  1195. #main-table-wrapper table .users-updated-at { flex: 4 4 0; }
  1196. #main-table-wrapper table .users-verified { flex: 3 3 0; overflow: visible; }
  1197. #main-table-wrapper table .users-role { flex: 2 2 0; overflow: visible; }
  1198. #main-table-wrapper table .users-links-count { flex: 3 3 0; justify-content: flex-end; overflow: visible; }
  1199. #main-table-wrapper table .users-actions { flex: 2 2 0; }
  1200. #main-table-wrapper table .domains-id { flex: 2 2 0; justify-content: flex-end; }
  1201. #main-table-wrapper table .domains-address { flex: 7 7 0; }
  1202. #main-table-wrapper table .domains-homepage { flex: 5 5 0; }
  1203. #main-table-wrapper table .domains-created-at { flex: 3 3 0; }
  1204. #main-table-wrapper table .domains-links-count { flex: 3 3 0; justify-content: flex-end; overflow: visible; }
  1205. #main-table-wrapper table .domains-actions { flex: 2 2 0; }
  1206. #main-table-wrapper table td.original-url,
  1207. #main-table-wrapper table td.created-at,
  1208. #main-table-wrapper.admin-table-wrapper table td.short-link,
  1209. #main-table-wrapper table td.users-email,
  1210. #main-table-wrapper table td.domains-address,
  1211. #main-table-wrapper table td.users-created-at,
  1212. #main-table-wrapper table td.users-verified {
  1213. flex-direction: column;
  1214. align-items: flex-start;
  1215. justify-content: center;
  1216. }
  1217. table .short-link-wrapper { display: flex; align-items: center; }
  1218. #main-table-wrapper table td .description {
  1219. display: flex;
  1220. align-items: center;
  1221. margin: 0;
  1222. font-size: 14px;
  1223. color: #888;
  1224. }
  1225. #main-table-wrapper table td .description a {
  1226. color: #aaa;
  1227. border-bottom-color: #aaa;
  1228. }
  1229. #main-table-wrapper table td .description svg {
  1230. stroke: #aaa;
  1231. stroke-width: 2;
  1232. width: 0.85em;
  1233. margin-right: 0.25rem;
  1234. }
  1235. #main-table-wrapper table td .description span { color: #aaa; }
  1236. #main-table-wrapper table td .description a:hover { border-bottom-color: transparent; }
  1237. #main-table-wrapper table .status {
  1238. font-size: 11px;
  1239. font-weight: bold;
  1240. padding: 4px 12px;
  1241. border-radius: 12px;
  1242. margin-top: 0.25rem;
  1243. }
  1244. #main-table-wrapper table .status:first-child {
  1245. margin-top: 0;
  1246. }
  1247. #main-table-wrapper table .status.gray { background-color: hsl(200, 12%, 95%); }
  1248. #main-table-wrapper table .status.green { background-color: hsl(102.4, 100%, 93.3%); }
  1249. #main-table-wrapper table .status.red { background-color: hsl(0, 100%, 96.7%); }
  1250. #main-table-wrapper table tr.no-data {
  1251. flex: 1 1 auto;
  1252. justify-content: center;
  1253. animation: fadein 0.3s ease-in-out;
  1254. }
  1255. #main-table-wrapper table.htmx-request tbody tr { opacity: 0.5; }
  1256. #main-table-wrapper table tr.loading-placeholder { opacity: 0.6 !important; }
  1257. #main-table-wrapper table tr.loading-placeholder td,
  1258. #main-table-wrapper table tr.no-data td {
  1259. flex: 0 0 auto;
  1260. font-size: 18px;
  1261. font-weight: 300;
  1262. }
  1263. #main-table-wrapper table tr.loading-placeholder svg.spinner {
  1264. width: 1rem;
  1265. height: auto;
  1266. margin-right: 0.5rem;
  1267. stroke-width: 1.5;
  1268. }
  1269. #main-table-wrapper table thead tr.controls { justify-content: space-between; }
  1270. #main-table-wrapper table thead tr.controls.with-filters { align-items: flex-end; }
  1271. #main-table-wrapper table tfoot tr.controls { justify-content: flex-end; }
  1272. #main-table-wrapper table th.search {
  1273. flex: 1 1 auto;
  1274. align-items: center;
  1275. }
  1276. #main-table-wrapper table th.filters {
  1277. flex: 1 1 auto;
  1278. flex-direction: column;
  1279. align-items: start;
  1280. }
  1281. #main-table-wrapper table th.filters > div {
  1282. display: flex;
  1283. align-items: center;
  1284. margin-bottom: 1rem;
  1285. }
  1286. #main-table-wrapper table th.filters > div:last-child { margin-bottom: 0; }
  1287. #main-table-wrapper table th.nav {
  1288. flex: 0 0 auto;
  1289. align-items: center;
  1290. }
  1291. #main-table-wrapper table tr.controls .checkbox {
  1292. margin-left: 1rem;
  1293. font-size: 15px;
  1294. }
  1295. #main-table-wrapper table .limit,
  1296. #main-table-wrapper table .pagination {
  1297. display: flex;
  1298. align-items: center;
  1299. }
  1300. #main-table-wrapper table button.nav { margin-right: 0.75rem; }
  1301. #main-table-wrapper table button.nav:last-child { margin-right: 0; }
  1302. #main-table-wrapper table .nav-divider {
  1303. height: 20px;
  1304. width: 1px;
  1305. opacity: 0.4;
  1306. background-color: #888;
  1307. margin: 0 1.5rem;
  1308. }
  1309. #main-table-wrapper table tbody tr:hover {
  1310. background-color: hsl(200, 14%, 98%);
  1311. }
  1312. #main-table-wrapper table tbody td.right-fade:after {
  1313. content: "";
  1314. position: absolute;
  1315. right: 0;
  1316. top: 0;
  1317. height: 100%;
  1318. width: 16px;
  1319. background: linear-gradient(to left, white, rgba(255, 255, 255, 0.001));
  1320. }
  1321. #main-table-wrapper table tbody tr:hover td.right-fade:after {
  1322. background: linear-gradient(to left, hsl(200, 14%, 98%), rgba(255, 255, 255, 0.001));
  1323. }
  1324. #main-table-wrapper table .clipboard { margin-right: 0.5rem; }
  1325. #main-table-wrapper table .clipboard svg.check { width: 24px; }
  1326. #main-table-wrapper table tr.edit {
  1327. background-color: #fafafa;
  1328. }
  1329. #main-table-wrapper table tr.edit td {
  1330. width: 100%;
  1331. padding: 2rem 1.5rem;
  1332. flex-basis: auto;
  1333. }
  1334. #main-table-wrapper table tr.edit td form {
  1335. width: 100;
  1336. display: flex;
  1337. flex-direction: column;
  1338. align-items: flex-start;
  1339. }
  1340. #main-table-wrapper table tr.edit td form > div {
  1341. width: 100%;
  1342. display: flex;
  1343. align-items: start;
  1344. }
  1345. #main-table-wrapper table tr.edit label { margin: 0 0.5rem 1rem; }
  1346. #main-table-wrapper table tr.edit label:first-child { margin-left: 0; }
  1347. #main-table-wrapper table tr.edit label:last-child { margin-right: 0; }
  1348. #main-table-wrapper table tr.edit input {
  1349. height: 44px;
  1350. padding: 0 1.5rem;
  1351. font-size: 15px;
  1352. }
  1353. #main-table-wrapper table tr.edit input,
  1354. #main-table-wrapper table tr.edit input + p {
  1355. width: 240px;
  1356. max-width: 100%;
  1357. font-size: 14px;
  1358. text-wrap: wrap;
  1359. text-align: left;
  1360. }
  1361. #main-table-wrapper table tr.edit input[name="target"],
  1362. #main-table-wrapper table tr.edit input[name="description"],
  1363. #main-table-wrapper table tr.edit input[name="target"] + p,
  1364. #main-table-wrapper table tr.edit input[name="description"] + p {
  1365. width: 420px;
  1366. }
  1367. #main-table-wrapper table tr.edit button {
  1368. height: 38px;
  1369. margin-right: 1rem;
  1370. }
  1371. #main-table-wrapper table tr.edit button:last-child { margin-right: 0; }
  1372. #main-table-wrapper table tr.edit form {
  1373. --keyframe-slidey-offset: -5px;
  1374. animation: fadein 0.3s ease-in-out, slidey 0.32s ease-in-out;
  1375. }
  1376. #main-table-wrapper table tr.edit form.no-animation { animation: none; }
  1377. #main-table-wrapper table tr.edit { display: none; }
  1378. #main-table-wrapper table tr.edit.show { display: flex; }
  1379. #main-table-wrapper table tr.edit td.loading { display: none; }
  1380. #main-table-wrapper table tr.edit.htmx-request td.loading { display: block; }
  1381. #main-table-wrapper table tr.edit td.loading svg { width: 16px; height: 16px; }
  1382. #main-table-wrapper table tr.edit form.htmx-request button .reload { display: none; }
  1383. #main-table-wrapper table tr.edit form button .loader { display: none; }
  1384. #main-table-wrapper table tr.edit form.htmx-request button .loader { display: inline-block; }
  1385. #main-table-wrapper table tr.edit form .response p { margin: 2rem 0 0; }
  1386. #main-table-wrapper table tr.edit p.no-data {
  1387. width: 100%;
  1388. text-align: center;
  1389. }
  1390. .dialog .ban-checklist {
  1391. display: flex;
  1392. align-items: center;
  1393. }
  1394. .dialog .ban-checklist label { margin: 1rem 1.5rem 1rem 0; }
  1395. .dialog .ban-checklist label:last-child { margin-right: 0; }
  1396. #main-table-wrapper tr.category { justify-content: space-between; align-items: center; }
  1397. #main-table-wrapper th.category-total { flex: 1 1 auto; }
  1398. #main-table-wrapper th.category-total p { margin: 0; font-size: 15px; font-weight: normal }
  1399. #main-table-wrapper th.category-tab { flex: 2 2 auto; justify-content: flex-end; }
  1400. /* ADMIN */
  1401. table .search-input-wrapper {
  1402. margin-right: 1rem;
  1403. }
  1404. input.search.admin {
  1405. max-width: 200px;
  1406. }
  1407. .content.admin-create form {
  1408. display: flex;
  1409. flex-direction: column;
  1410. }
  1411. .content.admin-create .checkbox-wrapper {
  1412. display: flex;
  1413. align-items: center;
  1414. }
  1415. .content.admin-create .checkbox-wrapper label { margin-right: 1rem; }
  1416. .content.admin-create .buttons { justify-content: center; }
  1417. .content.admin-create .buttons button { flex: 1 1 auto; }
  1418. /* INTRO */
  1419. .introduction {
  1420. width: 1200px;
  1421. max-width: 98%;
  1422. display: flex;
  1423. align-items: center;
  1424. margin: 150px 0 0;
  1425. }
  1426. .introduction .text-wrapper {
  1427. display: flex;
  1428. flex: 1 1 auto;
  1429. flex-direction: column;
  1430. align-items: flex-start;
  1431. margin-top: -32px;
  1432. }
  1433. .introduction h2 {
  1434. font-weight: 300;
  1435. font-size: 28px;
  1436. padding-right: 2rem;
  1437. margin-bottom: 2.5rem;
  1438. }
  1439. .introduction img {
  1440. width: 60%;
  1441. flex: 0 0 60%;
  1442. max-width: 100%;
  1443. height: auto;
  1444. }
  1445. /* FEATURES */
  1446. .features {
  1447. display: flex;
  1448. flex-direction: column;
  1449. align-items: center;
  1450. width: 100%;
  1451. flex: 0 0 auto;
  1452. padding: 5rem 0;
  1453. margin: 0;
  1454. background-color: var(--features-bg);
  1455. }
  1456. .features h3 {
  1457. font-weight: 300;
  1458. font-size: 28px;
  1459. margin-bottom: 72px;
  1460. }
  1461. .features ul {
  1462. width: 1200px;
  1463. max-width: 100%;
  1464. flex: 1 1 auto;
  1465. justify-content: center;
  1466. flex-wrap: nowrap;
  1467. display: flex;
  1468. margin: 0;
  1469. padding: 0;
  1470. list-style: none;
  1471. }
  1472. .features ul li {
  1473. max-width: 25%;
  1474. display: flex;
  1475. flex-direction: column;
  1476. align-items: center;
  1477. padding: 0 1.5rem;
  1478. margin: 0;
  1479. }
  1480. .features ul li .icon {
  1481. width: 48px;
  1482. height: 48px;
  1483. display: flex;
  1484. align-items: center;
  1485. justify-content: center;
  1486. border-radius: 100%;
  1487. background-color: var(--color-primary);
  1488. }
  1489. .features ul li .icon svg {
  1490. width: 16px;
  1491. height: auto;
  1492. stroke: white;
  1493. stroke-width: 2px;
  1494. }
  1495. .features ul li h4 {
  1496. margin: 1rem;
  1497. padding: 0;
  1498. font-size: 15px;
  1499. }
  1500. .features ul li p {
  1501. margin: 0;
  1502. padding: 0;
  1503. font-size: 14px;
  1504. font-weight: 300;
  1505. text-align: center;
  1506. }
  1507. /* EXTENSIONS */
  1508. .extensions {
  1509. width: 100%;
  1510. display: flex;
  1511. flex-direction: column;
  1512. align-items: center;
  1513. flex: 0 0 auto;
  1514. flex-wrap: nowrap;
  1515. padding: 5rem 0;
  1516. background-color: var(--extensions-bg);
  1517. color: white;
  1518. }
  1519. .extensions h3 {
  1520. font-size: 28px;
  1521. font-weight: 300;
  1522. margin-bottom: 4rem;
  1523. }
  1524. .extensions .extenstions-wrapper {
  1525. width: 1200px;
  1526. max-width: 100%;
  1527. display: flex;
  1528. flex: 1 1 auto;
  1529. justify-content: center;
  1530. flex-wrap: nowrap;
  1531. }
  1532. .extensions a.extension-button {
  1533. display: flex;
  1534. align-items: center;
  1535. justify-content: center;
  1536. margin: 0 1rem;
  1537. padding: 0.75rem 1.75rem;
  1538. background-color: #eee;
  1539. border: 1px solid #aaa;
  1540. font-size: 14px;
  1541. font-weight: bold;
  1542. text-decoration: none;
  1543. border-radius: 4px;
  1544. outline: none;
  1545. box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
  1546. transition: transform 0.3s ease-out;
  1547. cursor: pointer;
  1548. }
  1549. .extensions a.extension-button:hover {
  1550. transform: translateY(-2px);
  1551. }
  1552. .extensions a.extension-button.chrome { color: #4285f4; }
  1553. .extensions a.extension-button.firefox { color: #e0890f; }
  1554. .extensions a.extension-button svg {
  1555. width: 18px;
  1556. height: auto;
  1557. margin: 0 1rem 2px 0;
  1558. }
  1559. .extensions a.extension-button.chrome svg { fill: #4285f4; }
  1560. .extensions a.extension-button.firefox svg { fill: #e0890f; }
  1561. /* FOOTER */
  1562. footer {
  1563. width: 100%;
  1564. display: flex;
  1565. justify-content: center;
  1566. padding: 1rem 0;
  1567. font-size: 13px;
  1568. text-align: center;
  1569. }
  1570. footer button.link {
  1571. display: inline-block;
  1572. font-size: 13px;
  1573. }
  1574. footer button.link .spinner {
  1575. display: none;
  1576. width: 1em;
  1577. margin: 0 0 -2px;
  1578. }
  1579. footer button.link.htmx-request .spinner { display: inline; }
  1580. /* SETTINGS */
  1581. #settings {
  1582. width: 600px;
  1583. max-width: 100%;
  1584. padding: 0 16px;
  1585. overflow: hidden;
  1586. }
  1587. h1.settings-welcome {
  1588. font-size: 28px;
  1589. font-weight: 300;
  1590. }
  1591. h1.settings-welcome span {
  1592. border-bottom: 2px dotted #999;
  1593. padding-bottom: 2px;
  1594. font-weight: normal;
  1595. }
  1596. /* SETTINGS - DOMAIN */
  1597. #domains-table { margin-top: 1rem; }
  1598. #domains-table .domain { flex: 2 2 0; }
  1599. #domains-table .homepage { flex: 2 2 0; }
  1600. #domains-table .actions { flex: 1 1 0; justify-content: flex-end; padding-right: 1rem; }
  1601. #domains-table .no-entry { flex: 1 1 0; opacity: 0.8; }
  1602. .add-domain-wrapper {
  1603. width: 100%;
  1604. display: flex;
  1605. flex-direction: column;
  1606. align-items: flex-start;
  1607. margin: 1.5rem 0 2rem;
  1608. }
  1609. .add-domain-wrapper > .spinner {
  1610. width: 20px;
  1611. display: none;
  1612. margin: 1rem 0 0 1rem;
  1613. }
  1614. .add-domain-wrapper.htmx-request > button { display: none; }
  1615. .add-domain-wrapper.htmx-request > .spinner { display: block; }
  1616. form#add-domain { margin-top: 1rem; }
  1617. form#add-domain .buttons-wrapper { display: flex; }
  1618. form#add-domain button { margin-right: 1rem }
  1619. form#add-domain .spinner { width: 20px; display: none; }
  1620. form#add-domain.htmx-request .buttons-wrapper { display: none; }
  1621. form#add-domain.htmx-request .spinner { display: block; }
  1622. form#add-domain .error { font-size: 0.85rem; }
  1623. /* SETTINGS - API */
  1624. #apikey-wrapper { margin-bottom: 1.5rem; }
  1625. #apikey {
  1626. display: flex;
  1627. align-items: center;
  1628. margin-bottom: 1rem;
  1629. }
  1630. #apikey p {
  1631. font-weight: bold;
  1632. border-bottom: 1px dotted #999;
  1633. transition: opacity 0.2s ease-in-out;
  1634. cursor: pointer;
  1635. line-break: anywhere;
  1636. }
  1637. #apikey p:hover {
  1638. opacity: 0.8;
  1639. }
  1640. form#generate-apikey .spinner { display: none; }
  1641. form#generate-apikey.htmx-request svg { display: none; }
  1642. form#generate-apikey.htmx-request .spinner { display: block; }
  1643. /* SETTINGS - CHANGE PASSWORD */
  1644. #change-password-wrapper { margin-bottom: 1.5rem; }
  1645. form#change-password { margin-top: 1.5rem; }
  1646. form#change-password button { margin-top: 1rem; }
  1647. form#change-password .spinner { display: none; }
  1648. form#change-password.htmx-request svg { display: none; }
  1649. form#change-password.htmx-request .spinner { display: block; }
  1650. /* SETTINGS - CHANGE EMAIL */
  1651. #change-email-wrapper { margin-bottom: 1.5rem; }
  1652. form#change-email { margin-top: 1.5rem; }
  1653. form#change-email button { margin-top: 1rem; }
  1654. form#change-email .spinner { display: none; }
  1655. form#change-email.htmx-request svg { display: none; }
  1656. form#change-email.htmx-request .spinner { display: block; }
  1657. /* SETTINGS - DELETE ACCOUNT */
  1658. #delete-account-wrapper { margin-bottom: 1.5rem; }
  1659. form#delete-account { margin-top: 1.5rem; }
  1660. form#delete-account button { margin-top: 1rem; }
  1661. form#delete-account .spinner { display: none; }
  1662. form#delete-account.htmx-request svg { display: none; }
  1663. form#delete-account.htmx-request .spinner { display: block; }
  1664. /* STATS */
  1665. #stats-section {
  1666. width: 1200px;
  1667. max-width: 100%;
  1668. padding: 0 16px;
  1669. }
  1670. .loading-stats {
  1671. width: 100%;
  1672. flex: 1 1 0;
  1673. margin-top: -5rem;
  1674. display: flex;
  1675. align-items: center;
  1676. justify-content: center;
  1677. }
  1678. .loading-stats .spinner {
  1679. width: 1.25rem;
  1680. margin-right: 0.5rem;
  1681. }
  1682. .stats-info {
  1683. width: 100%;
  1684. display: flex;
  1685. align-items: flex-end;
  1686. justify-content: space-between;
  1687. }
  1688. .stats-info h2 { font-weight: 300; font-size: 24px; }
  1689. .stats-info p { font-size: 14px; }
  1690. .stats-info h2,
  1691. .stats-info p { margin: 0 }
  1692. #stats {
  1693. width: 100%;
  1694. display: flex;
  1695. flex-direction: column;
  1696. align-items: stretch;
  1697. background-color: white;
  1698. border-radius: 12px;
  1699. box-shadow: 0 6px 15px hsla(200, 20%, 70%, 0.3);
  1700. overflow: hidden;
  1701. padding: 0;
  1702. }
  1703. .stats-head {
  1704. width: 100%;
  1705. display: flex;
  1706. align-items: center;
  1707. background-color: hsl(200, 12%, 95%);
  1708. justify-content: space-between;
  1709. padding: 0.75rem 1.5rem;
  1710. }
  1711. .total-number { font-weight: bold; }
  1712. .stats-nav { display: flex; align-items: center; }
  1713. .stats-nav button { margin-right: 0.75rem; }
  1714. .stats-nav button:last-child { margin-right: 0; }
  1715. .stats-period {
  1716. display: flex;
  1717. flex-direction: column;
  1718. align-items: stretch;
  1719. padding: 0.75rem 1.5rem;
  1720. }
  1721. .stats-period h2 {
  1722. font-size: 24px;
  1723. font-weight: 300;
  1724. margin: 1rem 0 0;
  1725. }
  1726. .stats-period span.total-in-period {
  1727. font-weight: bold;
  1728. border-bottom: 1px dotted hsl(200, 35%, 65%);
  1729. }
  1730. p.last-update {
  1731. font-size: 14px;
  1732. color: hsl(200, 14%, 60%);
  1733. margin: 0.75rem 0 0;
  1734. }
  1735. #stats canvas {
  1736. width: 100%;
  1737. margin: 2rem 0;
  1738. }
  1739. .stats-columns-wrapper {
  1740. display: flex;
  1741. align-items: flex-start;
  1742. }
  1743. .stats-columns-wrapper > div {
  1744. flex: 1 1 50%;
  1745. }
  1746. svg.map { width: 100%; }
  1747. svg.map path {
  1748. fill: hsl(200, 15%, 92%);
  1749. stroke: #fff;
  1750. transition: all 0.1s ease-in-out;
  1751. }
  1752. svg.map path.color-1 { fill: hsl(261, 46%, 90%); }
  1753. svg.map path.color-2 { fill: hsl(261, 46%, 86%); }
  1754. svg.map path.color-3 { fill: hsl(261, 46%, 82%); }
  1755. svg.map path.color-4 { fill: hsl(261, 46%, 76%); }
  1756. svg.map path.color-5 { fill: hsl(261, 46%, 72%); }
  1757. svg.map path.color-6 { fill: hsl(261, 46%, 68%); }
  1758. svg.map path.active { stroke: hsl(261, 46%, 50%); stroke-width: 1.5; }
  1759. #map-tooltip {
  1760. position: fixed;
  1761. }
  1762. #map-tooltip.visible::before,
  1763. #map-tooltip.visible::after {
  1764. display: block !important;
  1765. }
  1766. #map-tooltip:before {
  1767. border-top-color: rgba(255, 255, 255, 0.95);
  1768. }
  1769. #map-tooltip:after {
  1770. box-shadow: 0 1em 2em -0.5em rgba(0, 0, 0, 0.15);
  1771. background: rgba(255, 255, 255, 0.95);
  1772. color: #333;
  1773. }
  1774. .stats-back-to-home {
  1775. width: 100%;
  1776. display: flex;
  1777. justify-content: center;
  1778. margin: 2rem 0;
  1779. }
  1780. .stats-error {
  1781. width: 100%;
  1782. flex: 1 1 auto;
  1783. display: flex;
  1784. flex-direction: column;
  1785. align-items: center;
  1786. justify-content: center;
  1787. text-align: center;
  1788. }
  1789. .stats-error p { margin-top: -3rem; display: flex; align-items: center; }
  1790. .stats-error p svg { width: 1.2rem; margin: 0 0.5rem 0.1rem 0; }
  1791. .stats-error .stats-back-to-home { margin-top: 0 }
  1792. /* 404 - NOT FOUND */
  1793. #notfound {
  1794. width: 800px;
  1795. align-items: center;
  1796. }
  1797. #notfound h2 {
  1798. font-size: 28px;
  1799. font-weight: 300;
  1800. text-align: center;
  1801. }
  1802. /* BANNED */
  1803. #banned { width: 1200px; align-items: center; text-align: center }
  1804. #banned h2 { font-weight: normal; }
  1805. #banned h4 { font-weight: normal; margin: 0; }
  1806. /* REPORT */
  1807. #report { width: 600px; }
  1808. #report form {
  1809. display: flex;
  1810. flex-direction: column;
  1811. margin-top: 2rem;
  1812. }
  1813. #report form .inputs-wrapper {
  1814. display: flex;
  1815. align-items: flex-end;
  1816. }
  1817. #report form button { margin: 0 0 0.2rem 1rem; }
  1818. #report form .spinner { display: none; }
  1819. #report form.htmx-request svg { display: none; }
  1820. #report form.htmx-request .spinner { display: block; }
  1821. #report-email .spinner { display: none; }
  1822. #report-email .htmx-request svg { display: none; }
  1823. #report-email .htmx-request .spinner { display: block; }
  1824. .eye-icon svg { stroke-width: 0.5; }
  1825. /* RESET PASSWORD */
  1826. #reset-password form {
  1827. width: 100%;
  1828. display: flex;
  1829. flex-direction: column;
  1830. }
  1831. #reset-password form .inputs-wrapper {
  1832. display: flex;
  1833. align-items: flex-end;
  1834. margin-top: 2rem;
  1835. }
  1836. #reset-password form label { flex: 0 0 280px; }
  1837. #reset-password form label input { width: 100%; }
  1838. #reset-password form button { margin: 0 0 0.2rem 1rem; }
  1839. #new-password h2 { margin-bottom: 0.5rem; }
  1840. #new-password p { margin-bottom: 1.5rem; }
  1841. #new-password-form label { margin-bottom: 1.5rem; }
  1842. #new-password-form label input { width: 280px; }
  1843. #new-password form {
  1844. width: 420px;
  1845. max-width: 100%;
  1846. flex: 1 1 auto;
  1847. display: flex;
  1848. padding: 0 16px;
  1849. flex-direction: column;
  1850. }
  1851. #new-password form label { margin-bottom: 2rem; }
  1852. #new-password form input {
  1853. width: 100%;
  1854. height: 72px;
  1855. margin-top: 1rem;
  1856. padding: 0 3rem;
  1857. font-size: 16px;
  1858. }
  1859. #new-password form button {
  1860. height: 56px;
  1861. padding: 0 1rem 2px;
  1862. margin: 0;
  1863. }
  1864. /* VERIFY USER */
  1865. /* VERIFY CHANGE EMAIL */
  1866. /* RESET PASSWORD TOKEN */
  1867. .verify-page {
  1868. width: 600px;
  1869. align-items: center;
  1870. }
  1871. .verify-page h2,
  1872. .verify-page h3 {
  1873. display: flex;
  1874. align-items: center;
  1875. text-align: center;
  1876. font-weight: normal;
  1877. }
  1878. .verify-page h2 svg,
  1879. .verify-page h3 svg {
  1880. width: 1.15em;
  1881. height: auto;
  1882. margin-right: 0.5rem;
  1883. }
  1884. /* URL INFO */
  1885. #url-info {
  1886. width: 1200px;
  1887. align-items: center;
  1888. text-align: center;
  1889. padding: 0 16px;
  1890. }
  1891. #url-info h3 { font-weight: normal; margin: 0; }
  1892. #url-info p { line-break: anywhere; }
  1893. /* PROTECTED */
  1894. #protected { width: 600px; }
  1895. #protected form { width: 100%; margin-top: 1rem; }
  1896. #protected form .inputs-wrapper { width: 100%; display: flex; align-items: flex-end; }
  1897. #protected form label { flex: 0 0 280px; }
  1898. #protected form label input { width: 100%; }
  1899. #protected form button { margin: 0 0 0.2rem 1rem; }
  1900. #protected form .spinner { display: none; }
  1901. #protected form.htmx-request svg { display: none; }
  1902. #protected form.htmx-request .spinner { display: block; }
  1903. /* TERMS */
  1904. #terms { width: 600px; }
  1905. /* ERROR PAGE */
  1906. #error-page { align-items: center; text-align: center; }
  1907. #error-page h2 { margin: 0; }
  1908. #error-page .back-to-home { margin-top: 2rem; }
  1909. /* RESPONSIVE STYLES */
  1910. @media only screen and (max-width: 768px) {
  1911. html, body { font-size: 14px; }
  1912. input[type="text"],
  1913. input[type="email"],
  1914. input[type="password"],
  1915. select {
  1916. font-size: 14px;
  1917. padding: 0 16px;
  1918. height: 38px;
  1919. letter-spacing: 0.04em;
  1920. border-bottom-width: 4px;
  1921. }
  1922. label input { margin-top: 0.25rem; }
  1923. input[type="text"]::placeholder,
  1924. input[type="email"]::placeholder,
  1925. input[type="password"]::placeholder { font-size: 13px; letter-spacing: 0.04em; }
  1926. table tr { padding: 0 0.25rem; }
  1927. table th,
  1928. table td { padding: 0.5rem; }
  1929. table td { font-size: 14px; }
  1930. table tr.loading-placeholder td { font-size: 16px; }
  1931. a.button,
  1932. button { height: 32px; padding: 0 22px; font-size: 12px; }
  1933. a.button.action,
  1934. button.action { padding: 4px; width: 20px; height: 20px; }
  1935. button.nav { height: 26px; padding: 0 7px; font-size: 11px; }
  1936. .dialog .box { min-width: 300px; padding: 2rem 1.25rem; }
  1937. .dialog.qrcode .box { padding: 1.5rem; }
  1938. .dialog .loading { width: 20px; height: 20px; margin: 2rem 0; }
  1939. .dialog .content .buttons { margin-top: 1rem; }
  1940. header { padding: 16px 16px 0; height: 72px; }
  1941. header a.logo { font-size: 20px; }
  1942. header ul.logo-links { display: none; }
  1943. header .logo img { margin-right: 8px; }
  1944. header nav ul li { margin-left: 0.75rem }
  1945. header nav ul li a.button { height: 28px; padding: 0 1rem; font-size: 11px; }
  1946. form#login-signup label { margin-bottom: 1.5rem; }
  1947. form#login-signup input {
  1948. height: 58px;
  1949. margin-top: 0.75rem;
  1950. padding: 0 2rem;
  1951. font-size: 15px;
  1952. }
  1953. form#login-signup .buttons-wrapper { margin-bottom: 1rem; }
  1954. form#login-signup .buttons-wrapper button { height: 44px; }
  1955. form#login-signup a.forgot-password { font-size: 13px; }
  1956. .login-signup-message { margin-top: 1.5rem; }
  1957. .login-signup-message h1 { font-size: 20px; }
  1958. main #shorturl { margin-bottom: 1.5rem; }
  1959. main #shorturl h1 { font-size: 1.6rem; }
  1960. .clipboard { width: 30px; height: 30px; margin-right: 0.5rem; }
  1961. .clipboard svg.check { padding: 2px; }
  1962. main form input#target { height: 58px; padding: 0 58px 0 26px; font-size: 15px; }
  1963. main form input#target::placeholder { font-size: 14px; }
  1964. main form p.error { font-size: 12px; margin-left: 0.25rem; }
  1965. main form .target-wrapper p.error { font-size: 13px; margin-left: 0.5rem; }
  1966. main form button.submit { width: 22px; top: 13px; margin: 0 1rem 0; }
  1967. main form label#advanced { margin-top: 1.5rem; }
  1968. main form label#advanced input { margin-bottom: 3px; }
  1969. #main-table-wrapper { margin: 4rem 0 4.5rem;}
  1970. #main-table-wrapper h2 { margin-bottom: 0.5rem; }
  1971. #main-table-wrapper table thead,
  1972. #main-table-wrapper table tbody,
  1973. #main-table-wrapper table tfoot { min-width: 800px; }
  1974. #main-table-wrapper tr { padding: 0 0.25rem; }
  1975. #main-table-wrapper th,
  1976. #main-table-wrapper td { padding: 0.75rem; }
  1977. #main-table-wrapper table .actions a.button,
  1978. #main-table-wrapper table .actions button { margin-right: 0.3rem; }
  1979. #main-table-wrapper table td p.description { font-size: 12px; }
  1980. #main-table-wrapper table tr.no-data td { font-size: 16px; }
  1981. #main-table-wrapper.admin-table-wrapper table th.nav { flex-direction: column; align-items: flex-end; }
  1982. #main-table-wrapper.admin-table-wrapper table th .nav-divider { display: none; }
  1983. #main-table-wrapper.admin-table-wrapper table th .limit { margin-bottom: 1rem; }
  1984. table .tab a { padding: 0.3rem 0.9rem; }
  1985. #main-table-wrapper th.category-total p { font-size: 13px; }
  1986. #main-table-wrapper table thead tr.controls.with-filters { align-items: flex-start; }
  1987. #main-table-wrapper table th select, input.table-input { height: 28px; font-size: 12px; padding: 0 1rem; }
  1988. #main-table-wrapper table th select { background-position: right 0.7em top 50%, 0 0; }
  1989. .search-input-wrapper button { padding: 2px; margin-right: 0.15rem; }
  1990. #main-table-wrapper table th input.search.admin { max-width: 150px; padding: 0 1.5rem 0 1rem; }
  1991. #main-table-wrapper table th select.table-input { max-width: 120px; }
  1992. #main-table-wrapper table th button.table { height: 28px; }
  1993. #main-table-wrapper table th input::placeholder { font-size: 12px; }
  1994. #main-table-wrapper table tr.controls .checkbox { font-size: 13px; }
  1995. #main-table-wrapper table button.nav { margin-right: 0.5rem; }
  1996. #main-table-wrapper table .nav-divider { height: 18px; margin: 0 1rem; }
  1997. #main-table-wrapper table tbody td.right-fade:after { width: 14px; }
  1998. #main-table-wrapper table tr.edit td { padding: 1.25rem 1rem; }
  1999. #main-table-wrapper table tr.edit label { margin: 0 0.25rem 0.5rem; }
  2000. #main-table-wrapper table tr.edit input { height: 38px; padding: 0 1rem; font-size: 13px; }
  2001. #main-table-wrapper table tr.edit input,
  2002. #main-table-wrapper table tr.edit input + p { width: 200px; }
  2003. #main-table-wrapper table tr.edit input[name="target"],
  2004. #main-table-wrapper table tr.edit input[name="description"],
  2005. #main-table-wrapper table tr.edit input[name="target"] + p,
  2006. #main-table-wrapper table tr.edit input[name="description"] + p { width: 320px; }
  2007. #main-table-wrapper table tr.edit button { height: 32px; margin-right: 0.5rem; }
  2008. #main-table-wrapper table tr.edit td.loading svg { width: 14px; height: 14px; }
  2009. #main-table-wrapper table tr.edit form .response p { margin: 1rem 0 0; }
  2010. .dialog .ban-checklist label { margin: 0.5rem 1rem 0.5rem 0; }
  2011. .introduction img { width: 90%; margin-top: 2rem; }
  2012. .introduction { margin: 100px 0 0; flex-direction: column; }
  2013. .introduction .text-wrapper { align-items: center; text-align: center; }
  2014. .introduction h2 { font-size: 22px; padding: 0 1rem; margin-bottom: 1.5rem; }
  2015. .features { padding: 2rem 0; }
  2016. .features h3 { font-size: 22px; margin-bottom: 2.5rem; }
  2017. .features ul { flex-wrap: wrap; }
  2018. .features ul li { max-width: 100%; padding: 0 2.5rem; margin-bottom: 2rem; }
  2019. .features ul li .icon { width: 40px; height: 40px; }
  2020. .features ul li .icon svg { width: 14px; }
  2021. .features ul li h4 { margin: 0.75rem; }
  2022. .extensions { padding: 2rem 0; }
  2023. .extensions h3 { font-size: 22px; margin-bottom: 2rem; }
  2024. .extensions .extenstions-wrapper { flex-direction: column; align-items: center }
  2025. .extensions a.extension-button { width: 225px; margin: 0 0 1rem; padding: 0.6rem 1.25rem; font-size: 13px; }
  2026. .extensions a.extension-button svg { width: 16px; margin: 0 0.75rem 3px 0; }
  2027. footer { padding: 0.75rem 0; font-size: 12px; }
  2028. footer button.link { font-size: 12px; }
  2029. h1.settings-welcome { font-size: 18px; }
  2030. .add-domain-wrapper { margin: 1rem 0 1rem; }
  2031. .add-domain-wrapper > .spinner { width: 18px; margin: 0.5rem 0 0 0.5rem; }
  2032. form#add-domain { margin-top: 0.75rem; }
  2033. form#add-domain button { margin-right: 0.5rem }
  2034. .stats-info { flex-direction: column; align-items: flex-start; justify-content: flex-start; }
  2035. .stats-info h2 { font-size: 18px; margin-bottom: 0.25rem; }
  2036. .stats-info p { font-size: 11px; line-break: anywhere; }
  2037. .stats-head { padding: 0rem 1rem; }
  2038. .stats-head p { font-size: 0.9rem; }
  2039. .stats-nav button { margin-right: 0.5rem; }
  2040. .stats-period { padding: 0.5rem 1rem; }
  2041. .stats-period h2 { font-size: 18px; margin: 0.5rem 0 0; }
  2042. p.last-update { font-size: 12px; }
  2043. #stats canvas { margin: 1rem 0; }
  2044. .stats-columns-wrapper { flex-direction: column; }
  2045. .stats-columns-wrapper > div { flex-basis: 100%; }
  2046. #notfound h2 { font-size: 20px; }
  2047. #report form { margin-top: 1.5rem; }
  2048. #report form .inputs-wrapper { flex-direction: column; align-items: flex-start; }
  2049. #report form button { margin: 0.75rem 0 0.2rem 0; }
  2050. #reset-password form .inputs-wrapper { flex-direction: column; align-items: flex-start; margin-top: 1rem; }
  2051. #reset-password form label { flex-basis: 0; width: 280px; }
  2052. #reset-password form button { margin: 0.75rem 0 0.2rem 0; }
  2053. #new-password form label { margin-bottom: 1.5rem; }
  2054. #new-password form input {
  2055. height: 58px;
  2056. margin-top: 0.75rem;
  2057. padding: 0 2rem;
  2058. font-size: 15px;
  2059. }
  2060. #new-password form button { height: 44px; }
  2061. .verify-page h2,
  2062. .verify-page h3 { display: flex; flex-direction: column; }
  2063. #protected form { margin-top: 0.5rem; }
  2064. #protected form .inputs-wrapper { flex-direction: column; align-items: flex-start; }
  2065. #protected form label { flex-basis: 0; width: 280px; }
  2066. #protected form button { margin: 0.75rem 0 0.2rem 0; }
  2067. }
  2068. @media only screen and (max-width: 640px) {
  2069. table tr.loading-placeholder { justify-content: flex-start; }
  2070. .inputs { flex-direction: column; margin-bottom: 0.75rem; }
  2071. .inputs label { margin: 0 0 0.75rem; }
  2072. .inputs label:last-child { margin: 0; }
  2073. .advanced-input-wrapper { flex-direction: column; margin-bottom: 0; }
  2074. .advanced-input-wrapper label { width: 100%; margin-bottom: 0.75rem; padding-right: 0; }
  2075. .advanced-input-wrapper label input,
  2076. .advanced-input-wrapper label select { margin-top: 0.5rem; }
  2077. form#add-domain .spinner { width: 18px; }
  2078. #apikey-wrapper { max-width: 100%; }
  2079. #apikey p { font-size: 0.85rem; }
  2080. #apikey .clipboard { width: 22px; height: 22px; }
  2081. }