1
0

dev.index.html 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>{app_title}</title>
  5. <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <meta charset="UTF-8">
  8. <style>
  9. /* Inter Font */
  10. @import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap') layer;
  11. #dx-toast-template {
  12. display: none;
  13. visibility: hidden;
  14. }
  15. .dx-toast {
  16. position: absolute;
  17. top: 10px;
  18. right: 0;
  19. padding-right: 10px;
  20. user-select: none;
  21. /* transition: transform 0.2s ease; */
  22. z-index: 2147483647;
  23. }
  24. .dx-toast .dx-toast-inner {
  25. /* transition: right 0.2s ease-out; */
  26. position: fixed;
  27. background-color: #181B20;
  28. color: #ffffff;
  29. font-family: "Inter", sans-serif;
  30. display: grid;
  31. grid-template-columns: auto auto;
  32. max-width: 400px;
  33. min-height: 56px;
  34. border-radius: 5px;
  35. }
  36. .dx-toast .dx-toast-inner {
  37. cursor: pointer;
  38. margin-right: 10px;
  39. }
  40. .dx-toast .dx-toast-level-bar-container {
  41. height: 100%;
  42. width: 6px;
  43. }
  44. .dx-toast .dx-toast-level-bar-container .dx-toast-level-bar {
  45. width: 100%;
  46. height: 100%;
  47. border-radius: 5px 0px 0px 5px;
  48. }
  49. .dx-toast .dx-toast-content {
  50. padding: 8px;
  51. }
  52. .dx-toast .dx-toast-header {
  53. display: flex;
  54. flex-direction: row;
  55. justify-content: start;
  56. align-items: end;
  57. margin-bottom: 10px;
  58. }
  59. .dx-toast .dx-toast-header>svg {
  60. height: 18px;
  61. margin-right: 5px;
  62. }
  63. .dx-toast .dx-toast-header .dx-toast-header-text {
  64. font-size: 14px;
  65. font-weight: 700;
  66. padding: 0;
  67. margin: 0;
  68. }
  69. .dx-toast .dx-toast-msg {
  70. font-size: 11px;
  71. font-weight: 400;
  72. padding: 0;
  73. margin: 0;
  74. }
  75. .dx-toast-level-bar.info {
  76. background-color: #428EFF;
  77. }
  78. .dx-toast-level-bar.success {
  79. background-color: #42FF65;
  80. }
  81. .dx-toast-level-bar.error {
  82. background-color: #FF4242;
  83. }
  84. </style>
  85. <script>
  86. const STORAGE_KEY = "SCHEDULED-DX-TOAST";
  87. let currentTimeout = null;
  88. let currentToastId = 0;
  89. // Show a toast, removing the previous one.
  90. function showDXToast(headerText, message, progressLevel, durationMs) {
  91. document.getElementById("__dx-toast-decor").className = `dx-toast-level-bar ${progressLevel}`;
  92. document.getElementById("__dx-toast-text").innerText = headerText;
  93. document.getElementById("__dx-toast-msg").innerText = message;
  94. document.getElementById("__dx-toast-inner").style.right = "0";
  95. document.getElementById("__dx-toast").addEventListener("click", closeDXToast);
  96. // Wait a bit of time so animation plays correctly.
  97. setTimeout(
  98. () => {
  99. let ourToastId = currentToastId;
  100. currentTimeout = setTimeout(() => {
  101. if (ourToastId == currentToastId) {
  102. closeDXToast();
  103. }
  104. }, durationMs);
  105. },
  106. 100
  107. );
  108. currentToastId += 1;
  109. }
  110. // Schedule a toast to be displayed after reload.
  111. function scheduleDXToast(headerText, message, level, durationMs) {
  112. let data = {
  113. headerText,
  114. message,
  115. level,
  116. durationMs,
  117. };
  118. let jsonData = JSON.stringify(data);
  119. sessionStorage.setItem(STORAGE_KEY, jsonData);
  120. }
  121. // Close the current toast.
  122. function closeDXToast() {
  123. document.getElementById("__dx-toast-inner").style.right = "-1000px";
  124. clearTimeout(currentTimeout);
  125. }
  126. // Handle any scheduled toasts after reload.
  127. let potentialData = sessionStorage.getItem(STORAGE_KEY);
  128. if (potentialData) {
  129. sessionStorage.removeItem(STORAGE_KEY);
  130. let data = JSON.parse(potentialData);
  131. showDXToast(data.headerText, data.message, data.level, data.durationMs);
  132. }
  133. window.scheduleDXToast = scheduleDXToast;
  134. window.showDXToast = showDXToast;
  135. window.closeDXToast = closeDXToast;
  136. </script>
  137. </head>
  138. <body>
  139. <div id="__dx-toast" class="dx-toast">
  140. <div id="__dx-toast-inner" class="dx-toast-inner" style="right:-1000px;">
  141. <div class="dx-toast-level-bar-container">
  142. <div id="__dx-toast-decor" class="dx-toast-level-bar __info"></div>
  143. </div>
  144. <div class="dx-toast-content">
  145. <div class="dx-toast-header">
  146. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" preserveAspectRatio="none">
  147. <path d="M22.158 1.783c0 3.077-.851 5.482-2.215 7.377s-3.32 3.557-5.447 5.33-4.425 3.657-6.252 6.195-3.102 5.515-3.102 9.532h4.699c0-3.077.853-5.377 2.217-7.272s3.32-3.557 5.447-5.33 4.425-3.657 6.252-6.195 3.102-5.62 3.102-9.637z" fill="#e96020"/>
  148. <path d="M9.531 25.927c-.635 0-1.021.515-1.02 1.15s.385 1.151 1.02 1.15H22.47a1.151 1.151 0 1 0 0-2.301zm1.361-4.076c-.608 0-.954.558-.953 1.166s.346 1.035.953 1.035h10.217a1.101 1.101 0 1 0 0-2.201zm0-13.594a1.101 1.101 0 1 0 0 2.201h10.217c.607 0 .953-.598.953-1.205s-.345-.996-.953-.996zM9.531 4.021A1.15 1.15 0 0 0 8.38 5.17a1.15 1.15 0 0 0 1.15 1.15h12.94c.635 0 1.021-.498 1.02-1.133s-.386-1.166-1.02-1.166z" fill="#2d323b"/>
  149. <path d="M5.142 1.783c0 4.016 1.275 7.099 3.102 9.637s4.125 4.422 6.252 6.195 4.083 3.656 5.447 5.551 2.215 3.974 2.215 7.051h4.701c0-4.016-1.275-7.038-3.102-9.576s-4.125-4.422-6.252-6.195-4.083-3.435-5.447-5.33S9.841 4.86 9.841 1.783z" fill="#00a8d6"/>
  150. </svg>
  151. <h3 id="__dx-toast-text" class="dx-toast-header-text">Your app is being rebuilt.</h3>
  152. </div>
  153. <p id="__dx-toast-msg" class="dx-toast-msg">A non-hot-reloadable change occurred and we must rebuild.</p>
  154. </div>
  155. </div>
  156. </div>
  157. <div id="main"></div>
  158. </body>
  159. </html>