|
3 | 3 | <head>
|
4 | 4 | <meta charset="UTF-8">
|
5 | 5 | <title>Chat Nio Blob Service</title>
|
| 6 | + <link rel="icon" href="/favicon.ico"> |
| 7 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| 8 | + <meta name="description" content="Chat Nio Blob Service"> |
| 9 | + <meta name="author" content="Deeptrain Community"> |
| 10 | + <meta name="keywords" content="Chat Nio Blob Service"> |
| 11 | + <meta name="theme-color" content="#ffffff"> |
| 12 | + <meta itemprop="image" content="/favicon.ico"> |
6 | 13 | <link href="https://open.lightxi.com/fonts/Open-Sans" rel="stylesheet">
|
7 | 14 | <style>
|
8 | 15 | html, body {
|
|
13 | 20 | overflow-x: hidden;
|
14 | 21 | overflow-y: auto;
|
15 | 22 | background: hsl(var(--background));
|
| 23 | + scrollbar-width: none; |
| 24 | + } |
| 25 | + |
| 26 | + ::-webkit-scrollbar { |
| 27 | + width: 0; |
16 | 28 | }
|
17 | 29 |
|
18 | 30 | * {
|
|
97 | 109 | color: hsl(var(--text-secondary));
|
98 | 110 | }
|
99 | 111 |
|
| 112 | + .drop-label { |
| 113 | + display: flex; |
| 114 | + flex-direction: row; |
| 115 | + align-items: center; |
| 116 | + justify-content: center; |
| 117 | + } |
| 118 | + |
100 | 119 | .output-text {
|
101 | 120 | width: 100%;
|
| 121 | + min-height: 60px; |
102 | 122 | border: 1px solid hsl(var(--border));
|
103 | 123 | border-radius: var(--radius);
|
104 | 124 | padding: 1rem;
|
|
108 | 128 | word-break: break-all;
|
109 | 129 | word-wrap: break-word;
|
110 | 130 | }
|
| 131 | + |
| 132 | + .loading { |
| 133 | + width: 0.75rem; |
| 134 | + height: 0.75rem; |
| 135 | + border-radius: 50%; |
| 136 | + border: 0.1rem solid hsl(var(--text-secondary)); |
| 137 | + border-top-color: hsl(var(--background)); |
| 138 | + animation: spin 1s linear infinite; |
| 139 | + margin-right: 0.5rem; |
| 140 | + display: inline-block; |
| 141 | + } |
| 142 | + |
| 143 | + .link { |
| 144 | + position: absolute; |
| 145 | + top: 0; |
| 146 | + right: 0; |
| 147 | + margin: 1.5rem; |
| 148 | + cursor: pointer; |
| 149 | + outline: none; |
| 150 | + text-decoration: none; |
| 151 | + } |
| 152 | + |
| 153 | + .link svg { |
| 154 | + width: 1.25rem; |
| 155 | + height: 1.25rem; |
| 156 | + color: hsl(var(--text)); |
| 157 | + } |
| 158 | + |
| 159 | + .hidden { |
| 160 | + display: none; |
| 161 | + } |
| 162 | + |
| 163 | + @keyframes spin { |
| 164 | + to { |
| 165 | + transform: rotate(360deg); |
| 166 | + } |
| 167 | + } |
111 | 168 | </style>
|
112 | 169 | </head>
|
113 | 170 | <body>
|
| 171 | +<a href="https://github.com/Deeptrain-Community/chatnio-blob-service" target="_blank" class="link"> |
| 172 | + <svg viewBox="0 0 438.549 438.549"> |
| 173 | + <path fill="currentColor" d="M409.132 114.573c-19.608-33.596-46.205-60.194-79.798-79.8-33.598-19.607-70.277-29.408-110.063-29.408-39.781 0-76.472 9.804-110.063 29.408-33.596 19.605-60.192 46.204-79.8 79.8C9.803 148.168 0 184.854 0 224.63c0 47.78 13.94 90.745 41.827 128.906 27.884 38.164 63.906 64.572 108.063 79.227 5.14.954 8.945.283 11.419-1.996 2.475-2.282 3.711-5.14 3.711-8.562 0-.571-.049-5.708-.144-15.417a2549.81 2549.81 0 01-.144-25.406l-6.567 1.136c-4.187.767-9.469 1.092-15.846 1-6.374-.089-12.991-.757-19.842-1.999-6.854-1.231-13.229-4.086-19.13-8.559-5.898-4.473-10.085-10.328-12.56-17.556l-2.855-6.57c-1.903-4.374-4.899-9.233-8.992-14.559-4.093-5.331-8.232-8.945-12.419-10.848l-1.999-1.431c-1.332-.951-2.568-2.098-3.711-3.429-1.142-1.331-1.997-2.663-2.568-3.997-.572-1.335-.098-2.43 1.427-3.289 1.525-.859 4.281-1.276 8.28-1.276l5.708.853c3.807.763 8.516 3.042 14.133 6.851 5.614 3.806 10.229 8.754 13.846 14.842 4.38 7.806 9.657 13.754 15.846 17.847 6.184 4.093 12.419 6.136 18.699 6.136 6.28 0 11.704-.476 16.274-1.423 4.565-.952 8.848-2.383 12.847-4.285 1.713-12.758 6.377-22.559 13.988-29.41-10.848-1.14-20.601-2.857-29.264-5.14-8.658-2.286-17.605-5.996-26.835-11.14-9.235-5.137-16.896-11.516-22.985-19.126-6.09-7.614-11.088-17.61-14.987-29.979-3.901-12.374-5.852-26.648-5.852-42.826 0-23.035 7.52-42.637 22.557-58.817-7.044-17.318-6.379-36.732 1.997-58.24 5.52-1.715 13.706-.428 24.554 3.853 10.85 4.283 18.794 7.952 23.84 10.994 5.046 3.041 9.089 5.618 12.135 7.708 17.705-4.947 35.976-7.421 54.818-7.421s37.117 2.474 54.823 7.421l10.849-6.849c7.419-4.57 16.18-8.758 26.262-12.565 10.088-3.805 17.802-4.853 23.134-3.138 8.562 21.509 9.325 40.922 2.279 58.24 15.036 16.18 22.559 35.787 22.559 58.817 0 16.178-1.958 30.497-5.853 42.966-3.9 12.471-8.941 22.457-15.125 29.979-6.191 7.521-13.901 13.85-23.131 18.986-9.232 5.14-18.182 8.85-26.84 11.136-8.662 2.286-18.415 4.004-29.263 5.146 9.894 8.562 14.842 22.077 14.842 40.539v60.237c0 3.422 1.19 6.279 3.572 8.562 2.379 2.279 6.136 2.95 11.276 1.995 44.163-14.653 80.185-41.062 108.068-79.226 27.88-38.161 41.825-81.126 41.825-128.906-.01-39.771-9.818-76.454-29.414-110.049z"></path> |
| 174 | + </svg> |
| 175 | +</a> |
114 | 176 | <div class="wrapper">
|
115 | 177 | <label for="file" class="drop-window">
|
116 | 178 | <input type="file" id="file" style="display: none">
|
117 |
| - <span>Click to upload a file</span> |
| 179 | + <span class="drop-label"> |
| 180 | + <span class="loading hidden"></span> |
| 181 | + Click to upload a file |
| 182 | + </span> |
118 | 183 | </label>
|
119 | 184 | <div id="output" class="output-text"></div>
|
120 | 185 | </div>
|
|
140 | 205 | }
|
141 | 206 | }
|
142 | 207 |
|
143 |
| - input.addEventListener('change', async (e) => { |
144 |
| - const file = e.target.files[0]; |
| 208 | + async function handler(file) { |
| 209 | + const loading = document.querySelector('.loading'); |
| 210 | + loading.classList.remove('hidden'); |
145 | 211 | const content = await post(file);
|
146 | 212 | let raw = content.replace(/\\n/g, '\n');
|
147 | 213 | if (raw.startsWith("data:image") && raw.length > 1000) {
|
148 | 214 | raw = `${raw.slice(0, 1000)}... (truncated ${raw.length - 1000} characters)`;
|
149 | 215 | }
|
150 | 216 |
|
151 | 217 | output.innerText = raw;
|
| 218 | + loading.classList.add('hidden'); |
| 219 | + } |
| 220 | + |
| 221 | + input.addEventListener('change', async e => { |
| 222 | + const file = e.target.files[0]; |
| 223 | + if (!file) return; |
| 224 | + |
| 225 | + await handler(file); |
| 226 | + input.value = ''; |
152 | 227 | });
|
153 | 228 | </script>
|
154 | 229 | </body>
|
|
0 commit comments