loading.html 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <style data-app-loading="inject-css">
  2. @keyframes logo-breath {
  3. 0%,
  4. 100% {
  5. filter: drop-shadow(0 18px 36px rgb(137 1 69 / 16%))
  6. drop-shadow(0 0 0 rgb(187 48 118 / 0%));
  7. opacity: 0.8;
  8. transform: scale(0.98);
  9. }
  10. 50% {
  11. filter: drop-shadow(0 18px 42px rgb(137 1 69 / 24%))
  12. drop-shadow(0 0 26px rgb(187 48 118 / 34%));
  13. opacity: 1;
  14. transform: scale(1.03);
  15. }
  16. }
  17. @keyframes ring-breath {
  18. 0%,
  19. 100% {
  20. box-shadow: 0 0 0 rgb(187 48 118 / 0%);
  21. opacity: 0.24;
  22. }
  23. 50% {
  24. box-shadow: 0 0 22px rgb(187 48 118 / 18%);
  25. opacity: 0.68;
  26. }
  27. }
  28. @keyframes shadow-breath {
  29. 0%,
  30. 100% {
  31. opacity: 0.22;
  32. transform: scaleX(0.96);
  33. }
  34. 50% {
  35. opacity: 0.34;
  36. transform: scaleX(1.02);
  37. }
  38. }
  39. @keyframes text-breath {
  40. 0%,
  41. 100% {
  42. opacity: 0.9;
  43. }
  44. 50% {
  45. opacity: 1;
  46. }
  47. }
  48. @keyframes dot-blink {
  49. 0%,
  50. 80%,
  51. 100% {
  52. opacity: 0.2;
  53. }
  54. 40% {
  55. opacity: 1;
  56. }
  57. }
  58. @keyframes halo-breath {
  59. 0%,
  60. 100% {
  61. opacity: 0.56;
  62. transform: scale(0.94);
  63. }
  64. 50% {
  65. opacity: 0.9;
  66. transform: scale(1.08);
  67. }
  68. }
  69. @keyframes halo-floor {
  70. 0%,
  71. 100% {
  72. opacity: 0.34;
  73. transform: scaleX(0.92);
  74. }
  75. 50% {
  76. opacity: 0.56;
  77. transform: scaleX(1.04);
  78. }
  79. }
  80. @media (max-width: 640px) {
  81. .title {
  82. margin-top: 2px;
  83. letter-spacing: 0.05em;
  84. }
  85. .loading-text {
  86. margin-top: 0;
  87. font-size: 12px;
  88. letter-spacing: 0.22em;
  89. }
  90. }
  91. @media (prefers-reduced-motion: reduce) {
  92. .loading::before,
  93. .loading::after,
  94. .loader::before,
  95. .loader::after,
  96. .loader-image,
  97. .title,
  98. .dots span {
  99. animation: none;
  100. }
  101. }
  102. html {
  103. /* same as antdv-next/dist/reset.css setting, avoid the title line-height changed */
  104. line-height: 1.15;
  105. }
  106. .loading {
  107. position: fixed;
  108. inset: 0;
  109. z-index: 9999;
  110. display: flex;
  111. align-items: center;
  112. justify-content: center;
  113. overflow: hidden;
  114. background: radial-gradient(
  115. circle at top,
  116. rgb(187 48 118 / 16%),
  117. transparent 36%
  118. ),
  119. linear-gradient(180deg, #fbfcfd 0%, #f4f7f9 55%, #eef2f5 100%);
  120. }
  121. .loading::before,
  122. .loading::after {
  123. position: absolute;
  124. pointer-events: none;
  125. content: '';
  126. filter: blur(8px);
  127. border-radius: 999px;
  128. }
  129. /* .loading::before {
  130. width: 320px;
  131. height: 320px;
  132. background: rgb(137 1 69 / 10%);
  133. animation: halo-breath 3.2s ease-in-out infinite;
  134. } */
  135. .loading::after {
  136. bottom: 12%;
  137. width: 520px;
  138. height: 120px;
  139. background: rgb(137 1 69 / 6%);
  140. filter: blur(28px);
  141. animation: halo-floor 3.2s ease-in-out infinite;
  142. }
  143. .loading.hidden {
  144. pointer-events: none;
  145. visibility: hidden;
  146. opacity: 0;
  147. transition: all 0.8s ease-out;
  148. }
  149. .dark .loading {
  150. background: radial-gradient(
  151. circle at top,
  152. rgb(187 48 118 / 24%),
  153. transparent 34%
  154. ),
  155. linear-gradient(180deg, #1b1217 0%, #120c11 48%, #0d0d10 100%);
  156. }
  157. .dark .loading::before {
  158. background: rgb(187 48 118 / 16%);
  159. }
  160. .dark .loading::after {
  161. background: rgb(255 255 255 / 6%);
  162. }
  163. .loading-shell {
  164. position: relative;
  165. z-index: 1;
  166. display: flex;
  167. flex-direction: column;
  168. align-items: center;
  169. justify-content: center;
  170. width: min(88vw, 420px);
  171. text-align: center;
  172. }
  173. .loader {
  174. position: relative;
  175. display: flex;
  176. align-items: center;
  177. justify-content: center;
  178. width: min(60vw, 260px);
  179. height: min(48vw, 220px);
  180. margin-bottom: 30px;
  181. isolation: isolate;
  182. }
  183. /* .loader::before {
  184. position: absolute;
  185. inset: 18% 14%;
  186. border: 1px solid rgb(137 1 69 / 14%);
  187. border-radius: 50%;
  188. content: '';
  189. animation: ring-breath 2.6s ease-in-out infinite;
  190. } */
  191. .loader::after {
  192. position: absolute;
  193. bottom: 12px;
  194. width: 62%;
  195. height: 18px;
  196. content: '';
  197. background: rgb(102 13 52 / 16%);
  198. filter: blur(10px);
  199. border-radius: 999px;
  200. animation: shadow-breath 2.6s ease-in-out infinite;
  201. }
  202. .dark .loader::before {
  203. border-color: rgb(255 255 255 / 12%);
  204. }
  205. .dark .loader::after {
  206. background: rgb(255 255 255 / 10%);
  207. }
  208. .loader-image {
  209. position: relative;
  210. z-index: 1;
  211. width: min(220px, 48vw);
  212. max-width: 220px;
  213. height: auto;
  214. filter: drop-shadow(0 18px 36px rgb(137 1 69 / 18%))
  215. drop-shadow(0 0 0 rgb(187 48 118 / 0%));
  216. transform-origin: center;
  217. animation: logo-breath 2.6s ease-in-out infinite;
  218. }
  219. .title {
  220. margin-top: 8px;
  221. font-size: clamp(24px, 3vw, 30px);
  222. font-weight: 700;
  223. color: #890145;
  224. letter-spacing: 0.08em;
  225. animation: text-breath 2.6s ease-in-out infinite;
  226. }
  227. .dark .title {
  228. color: #fff;
  229. }
  230. .loading-text {
  231. display: inline-flex;
  232. gap: 4px;
  233. align-items: center;
  234. margin-top: -50px;
  235. margin-left: 30px;
  236. font-size: 13px;
  237. font-weight: 600;
  238. color: rgb(137 1 69 / 74%);
  239. text-transform: uppercase;
  240. letter-spacing: 0.28em;
  241. }
  242. .dark .loading-text {
  243. color: rgb(255 255 255 / 72%);
  244. }
  245. .dots {
  246. display: inline-flex;
  247. align-items: center;
  248. min-width: 24px;
  249. }
  250. .dots span {
  251. opacity: 0.2;
  252. animation: dot-blink 1.4s infinite;
  253. }
  254. .dots span:nth-child(2) {
  255. animation-delay: 0.2s;
  256. }
  257. .dots span:nth-child(3) {
  258. animation-delay: 0.4s;
  259. }
  260. </style>
  261. <div class="loading" id="__app-loading__">
  262. <div class="loading-shell">
  263. <div class="loader" aria-hidden="true">
  264. <img class="loader-image" src="./loading.png" alt="Loading" />
  265. </div>
  266. <div class="loading-text" aria-label="Loading">
  267. <span>Loading</span>
  268. <span class="dots" aria-hidden="true">
  269. <span>.</span>
  270. <span>.</span>
  271. <span>.</span>
  272. </span>
  273. </div>
  274. </div>
  275. </div>