Files changed (4) hide show
  1. .gitignore +33 -0
  2. gitattributes +35 -0
  3. package-lock.json +943 -0
  4. style.css +1013 -324
.gitignore ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dependencies
2
+ node_modules/
3
+ npm-debug.log*
4
+ yarn-debug.log*
5
+ yarn-error.log*
6
+
7
+ # Environment variables
8
+ .env
9
+ .env.local
10
+ .env.development.local
11
+ .env.test.local
12
+ .env.production.local
13
+
14
+ # IDE
15
+ .vscode/
16
+ .idea/
17
+ *.swp
18
+ *.swo
19
+ *~
20
+ .DS_Store
21
+
22
+ # Build output
23
+ dist/
24
+ build/
25
+ *.log
26
+
27
+ # Docker
28
+ .dockerignore
29
+
30
+ # Misc
31
+ *.pid
32
+ *.seed
33
+ *.pid.lock
gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
package-lock.json ADDED
@@ -0,0 +1,943 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "banana-pro-ai",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "banana-pro-ai",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "cookie-parser": "^1.4.6",
12
+ "dotenv": "^16.3.1",
13
+ "express": "^4.18.2"
14
+ }
15
+ },
16
+ "node_modules/accepts": {
17
+ "version": "1.3.8",
18
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
19
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "mime-types": "~2.1.34",
23
+ "negotiator": "0.6.3"
24
+ },
25
+ "engines": {
26
+ "node": ">= 0.6"
27
+ }
28
+ },
29
+ "node_modules/array-flatten": {
30
+ "version": "1.1.1",
31
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
32
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
33
+ "license": "MIT"
34
+ },
35
+ "node_modules/body-parser": {
36
+ "version": "1.20.4",
37
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
38
+ "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
39
+ "license": "MIT",
40
+ "dependencies": {
41
+ "bytes": "~3.1.2",
42
+ "content-type": "~1.0.5",
43
+ "debug": "2.6.9",
44
+ "depd": "2.0.0",
45
+ "destroy": "~1.2.0",
46
+ "http-errors": "~2.0.1",
47
+ "iconv-lite": "~0.4.24",
48
+ "on-finished": "~2.4.1",
49
+ "qs": "~6.14.0",
50
+ "raw-body": "~2.5.3",
51
+ "type-is": "~1.6.18",
52
+ "unpipe": "~1.0.0"
53
+ },
54
+ "engines": {
55
+ "node": ">= 0.8",
56
+ "npm": "1.2.8000 || >= 1.4.16"
57
+ }
58
+ },
59
+ "node_modules/bytes": {
60
+ "version": "3.1.2",
61
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
62
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
63
+ "license": "MIT",
64
+ "engines": {
65
+ "node": ">= 0.8"
66
+ }
67
+ },
68
+ "node_modules/call-bind-apply-helpers": {
69
+ "version": "1.0.2",
70
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
71
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
72
+ "license": "MIT",
73
+ "dependencies": {
74
+ "es-errors": "^1.3.0",
75
+ "function-bind": "^1.1.2"
76
+ },
77
+ "engines": {
78
+ "node": ">= 0.4"
79
+ }
80
+ },
81
+ "node_modules/call-bound": {
82
+ "version": "1.0.4",
83
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
84
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
85
+ "license": "MIT",
86
+ "dependencies": {
87
+ "call-bind-apply-helpers": "^1.0.2",
88
+ "get-intrinsic": "^1.3.0"
89
+ },
90
+ "engines": {
91
+ "node": ">= 0.4"
92
+ },
93
+ "funding": {
94
+ "url": "https://github.com/sponsors/ljharb"
95
+ }
96
+ },
97
+ "node_modules/content-disposition": {
98
+ "version": "0.5.4",
99
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
100
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
101
+ "license": "MIT",
102
+ "dependencies": {
103
+ "safe-buffer": "5.2.1"
104
+ },
105
+ "engines": {
106
+ "node": ">= 0.6"
107
+ }
108
+ },
109
+ "node_modules/content-type": {
110
+ "version": "1.0.5",
111
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
112
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
113
+ "license": "MIT",
114
+ "engines": {
115
+ "node": ">= 0.6"
116
+ }
117
+ },
118
+ "node_modules/cookie": {
119
+ "version": "0.7.2",
120
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
121
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
122
+ "license": "MIT",
123
+ "engines": {
124
+ "node": ">= 0.6"
125
+ }
126
+ },
127
+ "node_modules/cookie-parser": {
128
+ "version": "1.4.7",
129
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
130
+ "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
131
+ "license": "MIT",
132
+ "dependencies": {
133
+ "cookie": "0.7.2",
134
+ "cookie-signature": "1.0.6"
135
+ },
136
+ "engines": {
137
+ "node": ">= 0.8.0"
138
+ }
139
+ },
140
+ "node_modules/cookie-signature": {
141
+ "version": "1.0.6",
142
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
143
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
144
+ "license": "MIT"
145
+ },
146
+ "node_modules/debug": {
147
+ "version": "2.6.9",
148
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
149
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
150
+ "license": "MIT",
151
+ "dependencies": {
152
+ "ms": "2.0.0"
153
+ }
154
+ },
155
+ "node_modules/depd": {
156
+ "version": "2.0.0",
157
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
158
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
159
+ "license": "MIT",
160
+ "engines": {
161
+ "node": ">= 0.8"
162
+ }
163
+ },
164
+ "node_modules/destroy": {
165
+ "version": "1.2.0",
166
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
167
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
168
+ "license": "MIT",
169
+ "engines": {
170
+ "node": ">= 0.8",
171
+ "npm": "1.2.8000 || >= 1.4.16"
172
+ }
173
+ },
174
+ "node_modules/dotenv": {
175
+ "version": "16.6.1",
176
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
177
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
178
+ "license": "BSD-2-Clause",
179
+ "engines": {
180
+ "node": ">=12"
181
+ },
182
+ "funding": {
183
+ "url": "https://dotenvx.com"
184
+ }
185
+ },
186
+ "node_modules/dunder-proto": {
187
+ "version": "1.0.1",
188
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
189
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
190
+ "license": "MIT",
191
+ "dependencies": {
192
+ "call-bind-apply-helpers": "^1.0.1",
193
+ "es-errors": "^1.3.0",
194
+ "gopd": "^1.2.0"
195
+ },
196
+ "engines": {
197
+ "node": ">= 0.4"
198
+ }
199
+ },
200
+ "node_modules/ee-first": {
201
+ "version": "1.1.1",
202
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
203
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
204
+ "license": "MIT"
205
+ },
206
+ "node_modules/encodeurl": {
207
+ "version": "2.0.0",
208
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
209
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
210
+ "license": "MIT",
211
+ "engines": {
212
+ "node": ">= 0.8"
213
+ }
214
+ },
215
+ "node_modules/es-define-property": {
216
+ "version": "1.0.1",
217
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
218
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
219
+ "license": "MIT",
220
+ "engines": {
221
+ "node": ">= 0.4"
222
+ }
223
+ },
224
+ "node_modules/es-errors": {
225
+ "version": "1.3.0",
226
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
227
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
228
+ "license": "MIT",
229
+ "engines": {
230
+ "node": ">= 0.4"
231
+ }
232
+ },
233
+ "node_modules/es-object-atoms": {
234
+ "version": "1.1.1",
235
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
236
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
237
+ "license": "MIT",
238
+ "dependencies": {
239
+ "es-errors": "^1.3.0"
240
+ },
241
+ "engines": {
242
+ "node": ">= 0.4"
243
+ }
244
+ },
245
+ "node_modules/escape-html": {
246
+ "version": "1.0.3",
247
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
248
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
249
+ "license": "MIT"
250
+ },
251
+ "node_modules/etag": {
252
+ "version": "1.8.1",
253
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
254
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
255
+ "license": "MIT",
256
+ "engines": {
257
+ "node": ">= 0.6"
258
+ }
259
+ },
260
+ "node_modules/express": {
261
+ "version": "4.22.1",
262
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
263
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
264
+ "license": "MIT",
265
+ "dependencies": {
266
+ "accepts": "~1.3.8",
267
+ "array-flatten": "1.1.1",
268
+ "body-parser": "~1.20.3",
269
+ "content-disposition": "~0.5.4",
270
+ "content-type": "~1.0.4",
271
+ "cookie": "~0.7.1",
272
+ "cookie-signature": "~1.0.6",
273
+ "debug": "2.6.9",
274
+ "depd": "2.0.0",
275
+ "encodeurl": "~2.0.0",
276
+ "escape-html": "~1.0.3",
277
+ "etag": "~1.8.1",
278
+ "finalhandler": "~1.3.1",
279
+ "fresh": "~0.5.2",
280
+ "http-errors": "~2.0.0",
281
+ "merge-descriptors": "1.0.3",
282
+ "methods": "~1.1.2",
283
+ "on-finished": "~2.4.1",
284
+ "parseurl": "~1.3.3",
285
+ "path-to-regexp": "~0.1.12",
286
+ "proxy-addr": "~2.0.7",
287
+ "qs": "~6.14.0",
288
+ "range-parser": "~1.2.1",
289
+ "safe-buffer": "5.2.1",
290
+ "send": "~0.19.0",
291
+ "serve-static": "~1.16.2",
292
+ "setprototypeof": "1.2.0",
293
+ "statuses": "~2.0.1",
294
+ "type-is": "~1.6.18",
295
+ "utils-merge": "1.0.1",
296
+ "vary": "~1.1.2"
297
+ },
298
+ "engines": {
299
+ "node": ">= 0.10.0"
300
+ },
301
+ "funding": {
302
+ "type": "opencollective",
303
+ "url": "https://opencollective.com/express"
304
+ }
305
+ },
306
+ "node_modules/finalhandler": {
307
+ "version": "1.3.2",
308
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
309
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
310
+ "license": "MIT",
311
+ "dependencies": {
312
+ "debug": "2.6.9",
313
+ "encodeurl": "~2.0.0",
314
+ "escape-html": "~1.0.3",
315
+ "on-finished": "~2.4.1",
316
+ "parseurl": "~1.3.3",
317
+ "statuses": "~2.0.2",
318
+ "unpipe": "~1.0.0"
319
+ },
320
+ "engines": {
321
+ "node": ">= 0.8"
322
+ }
323
+ },
324
+ "node_modules/forwarded": {
325
+ "version": "0.2.0",
326
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
327
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
328
+ "license": "MIT",
329
+ "engines": {
330
+ "node": ">= 0.6"
331
+ }
332
+ },
333
+ "node_modules/fresh": {
334
+ "version": "0.5.2",
335
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
336
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
337
+ "license": "MIT",
338
+ "engines": {
339
+ "node": ">= 0.6"
340
+ }
341
+ },
342
+ "node_modules/function-bind": {
343
+ "version": "1.1.2",
344
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
345
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
346
+ "license": "MIT",
347
+ "funding": {
348
+ "url": "https://github.com/sponsors/ljharb"
349
+ }
350
+ },
351
+ "node_modules/get-intrinsic": {
352
+ "version": "1.3.0",
353
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
354
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
355
+ "license": "MIT",
356
+ "dependencies": {
357
+ "call-bind-apply-helpers": "^1.0.2",
358
+ "es-define-property": "^1.0.1",
359
+ "es-errors": "^1.3.0",
360
+ "es-object-atoms": "^1.1.1",
361
+ "function-bind": "^1.1.2",
362
+ "get-proto": "^1.0.1",
363
+ "gopd": "^1.2.0",
364
+ "has-symbols": "^1.1.0",
365
+ "hasown": "^2.0.2",
366
+ "math-intrinsics": "^1.1.0"
367
+ },
368
+ "engines": {
369
+ "node": ">= 0.4"
370
+ },
371
+ "funding": {
372
+ "url": "https://github.com/sponsors/ljharb"
373
+ }
374
+ },
375
+ "node_modules/get-proto": {
376
+ "version": "1.0.1",
377
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
378
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
379
+ "license": "MIT",
380
+ "dependencies": {
381
+ "dunder-proto": "^1.0.1",
382
+ "es-object-atoms": "^1.0.0"
383
+ },
384
+ "engines": {
385
+ "node": ">= 0.4"
386
+ }
387
+ },
388
+ "node_modules/gopd": {
389
+ "version": "1.2.0",
390
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
391
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
392
+ "license": "MIT",
393
+ "engines": {
394
+ "node": ">= 0.4"
395
+ },
396
+ "funding": {
397
+ "url": "https://github.com/sponsors/ljharb"
398
+ }
399
+ },
400
+ "node_modules/has-symbols": {
401
+ "version": "1.1.0",
402
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
403
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
404
+ "license": "MIT",
405
+ "engines": {
406
+ "node": ">= 0.4"
407
+ },
408
+ "funding": {
409
+ "url": "https://github.com/sponsors/ljharb"
410
+ }
411
+ },
412
+ "node_modules/hasown": {
413
+ "version": "2.0.2",
414
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
415
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
416
+ "license": "MIT",
417
+ "dependencies": {
418
+ "function-bind": "^1.1.2"
419
+ },
420
+ "engines": {
421
+ "node": ">= 0.4"
422
+ }
423
+ },
424
+ "node_modules/http-errors": {
425
+ "version": "2.0.1",
426
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
427
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
428
+ "license": "MIT",
429
+ "dependencies": {
430
+ "depd": "~2.0.0",
431
+ "inherits": "~2.0.4",
432
+ "setprototypeof": "~1.2.0",
433
+ "statuses": "~2.0.2",
434
+ "toidentifier": "~1.0.1"
435
+ },
436
+ "engines": {
437
+ "node": ">= 0.8"
438
+ },
439
+ "funding": {
440
+ "type": "opencollective",
441
+ "url": "https://opencollective.com/express"
442
+ }
443
+ },
444
+ "node_modules/iconv-lite": {
445
+ "version": "0.4.24",
446
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
447
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
448
+ "license": "MIT",
449
+ "dependencies": {
450
+ "safer-buffer": ">= 2.1.2 < 3"
451
+ },
452
+ "engines": {
453
+ "node": ">=0.10.0"
454
+ }
455
+ },
456
+ "node_modules/inherits": {
457
+ "version": "2.0.4",
458
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
459
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
460
+ "license": "ISC"
461
+ },
462
+ "node_modules/ipaddr.js": {
463
+ "version": "1.9.1",
464
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
465
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
466
+ "license": "MIT",
467
+ "engines": {
468
+ "node": ">= 0.10"
469
+ }
470
+ },
471
+ "node_modules/math-intrinsics": {
472
+ "version": "1.1.0",
473
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
474
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
475
+ "license": "MIT",
476
+ "engines": {
477
+ "node": ">= 0.4"
478
+ }
479
+ },
480
+ "node_modules/media-typer": {
481
+ "version": "0.3.0",
482
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
483
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
484
+ "license": "MIT",
485
+ "engines": {
486
+ "node": ">= 0.6"
487
+ }
488
+ },
489
+ "node_modules/merge-descriptors": {
490
+ "version": "1.0.3",
491
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
492
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
493
+ "license": "MIT",
494
+ "funding": {
495
+ "url": "https://github.com/sponsors/sindresorhus"
496
+ }
497
+ },
498
+ "node_modules/methods": {
499
+ "version": "1.1.2",
500
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
501
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
502
+ "license": "MIT",
503
+ "engines": {
504
+ "node": ">= 0.6"
505
+ }
506
+ },
507
+ "node_modules/mime": {
508
+ "version": "1.6.0",
509
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
510
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
511
+ "license": "MIT",
512
+ "bin": {
513
+ "mime": "cli.js"
514
+ },
515
+ "engines": {
516
+ "node": ">=4"
517
+ }
518
+ },
519
+ "node_modules/mime-db": {
520
+ "version": "1.52.0",
521
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
522
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
523
+ "license": "MIT",
524
+ "engines": {
525
+ "node": ">= 0.6"
526
+ }
527
+ },
528
+ "node_modules/mime-types": {
529
+ "version": "2.1.35",
530
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
531
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
532
+ "license": "MIT",
533
+ "dependencies": {
534
+ "mime-db": "1.52.0"
535
+ },
536
+ "engines": {
537
+ "node": ">= 0.6"
538
+ }
539
+ },
540
+ "node_modules/ms": {
541
+ "version": "2.0.0",
542
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
543
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
544
+ "license": "MIT"
545
+ },
546
+ "node_modules/negotiator": {
547
+ "version": "0.6.3",
548
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
549
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
550
+ "license": "MIT",
551
+ "engines": {
552
+ "node": ">= 0.6"
553
+ }
554
+ },
555
+ "node_modules/object-inspect": {
556
+ "version": "1.13.4",
557
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
558
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
559
+ "license": "MIT",
560
+ "engines": {
561
+ "node": ">= 0.4"
562
+ },
563
+ "funding": {
564
+ "url": "https://github.com/sponsors/ljharb"
565
+ }
566
+ },
567
+ "node_modules/on-finished": {
568
+ "version": "2.4.1",
569
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
570
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
571
+ "license": "MIT",
572
+ "dependencies": {
573
+ "ee-first": "1.1.1"
574
+ },
575
+ "engines": {
576
+ "node": ">= 0.8"
577
+ }
578
+ },
579
+ "node_modules/parseurl": {
580
+ "version": "1.3.3",
581
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
582
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
583
+ "license": "MIT",
584
+ "engines": {
585
+ "node": ">= 0.8"
586
+ }
587
+ },
588
+ "node_modules/path-to-regexp": {
589
+ "version": "0.1.12",
590
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
591
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
592
+ "license": "MIT"
593
+ },
594
+ "node_modules/proxy-addr": {
595
+ "version": "2.0.7",
596
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
597
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
598
+ "license": "MIT",
599
+ "dependencies": {
600
+ "forwarded": "0.2.0",
601
+ "ipaddr.js": "1.9.1"
602
+ },
603
+ "engines": {
604
+ "node": ">= 0.10"
605
+ }
606
+ },
607
+ "node_modules/qs": {
608
+ "version": "6.14.0",
609
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
610
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
611
+ "license": "BSD-3-Clause",
612
+ "dependencies": {
613
+ "side-channel": "^1.1.0"
614
+ },
615
+ "engines": {
616
+ "node": ">=0.6"
617
+ },
618
+ "funding": {
619
+ "url": "https://github.com/sponsors/ljharb"
620
+ }
621
+ },
622
+ "node_modules/range-parser": {
623
+ "version": "1.2.1",
624
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
625
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
626
+ "license": "MIT",
627
+ "engines": {
628
+ "node": ">= 0.6"
629
+ }
630
+ },
631
+ "node_modules/raw-body": {
632
+ "version": "2.5.3",
633
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
634
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
635
+ "license": "MIT",
636
+ "dependencies": {
637
+ "bytes": "~3.1.2",
638
+ "http-errors": "~2.0.1",
639
+ "iconv-lite": "~0.4.24",
640
+ "unpipe": "~1.0.0"
641
+ },
642
+ "engines": {
643
+ "node": ">= 0.8"
644
+ }
645
+ },
646
+ "node_modules/safe-buffer": {
647
+ "version": "5.2.1",
648
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
649
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
650
+ "funding": [
651
+ {
652
+ "type": "github",
653
+ "url": "https://github.com/sponsors/feross"
654
+ },
655
+ {
656
+ "type": "patreon",
657
+ "url": "https://www.patreon.com/feross"
658
+ },
659
+ {
660
+ "type": "consulting",
661
+ "url": "https://feross.org/support"
662
+ }
663
+ ],
664
+ "license": "MIT"
665
+ },
666
+ "node_modules/safer-buffer": {
667
+ "version": "2.1.2",
668
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
669
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
670
+ "license": "MIT"
671
+ },
672
+ "node_modules/send": {
673
+ "version": "0.19.1",
674
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz",
675
+ "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==",
676
+ "license": "MIT",
677
+ "dependencies": {
678
+ "debug": "2.6.9",
679
+ "depd": "2.0.0",
680
+ "destroy": "1.2.0",
681
+ "encodeurl": "~2.0.0",
682
+ "escape-html": "~1.0.3",
683
+ "etag": "~1.8.1",
684
+ "fresh": "0.5.2",
685
+ "http-errors": "2.0.0",
686
+ "mime": "1.6.0",
687
+ "ms": "2.1.3",
688
+ "on-finished": "2.4.1",
689
+ "range-parser": "~1.2.1",
690
+ "statuses": "2.0.1"
691
+ },
692
+ "engines": {
693
+ "node": ">= 0.8.0"
694
+ }
695
+ },
696
+ "node_modules/send/node_modules/http-errors": {
697
+ "version": "2.0.0",
698
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
699
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
700
+ "license": "MIT",
701
+ "dependencies": {
702
+ "depd": "2.0.0",
703
+ "inherits": "2.0.4",
704
+ "setprototypeof": "1.2.0",
705
+ "statuses": "2.0.1",
706
+ "toidentifier": "1.0.1"
707
+ },
708
+ "engines": {
709
+ "node": ">= 0.8"
710
+ }
711
+ },
712
+ "node_modules/send/node_modules/ms": {
713
+ "version": "2.1.3",
714
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
715
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
716
+ "license": "MIT"
717
+ },
718
+ "node_modules/send/node_modules/statuses": {
719
+ "version": "2.0.1",
720
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
721
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
722
+ "license": "MIT",
723
+ "engines": {
724
+ "node": ">= 0.8"
725
+ }
726
+ },
727
+ "node_modules/serve-static": {
728
+ "version": "1.16.2",
729
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
730
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
731
+ "license": "MIT",
732
+ "dependencies": {
733
+ "encodeurl": "~2.0.0",
734
+ "escape-html": "~1.0.3",
735
+ "parseurl": "~1.3.3",
736
+ "send": "0.19.0"
737
+ },
738
+ "engines": {
739
+ "node": ">= 0.8.0"
740
+ }
741
+ },
742
+ "node_modules/serve-static/node_modules/http-errors": {
743
+ "version": "2.0.0",
744
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
745
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
746
+ "license": "MIT",
747
+ "dependencies": {
748
+ "depd": "2.0.0",
749
+ "inherits": "2.0.4",
750
+ "setprototypeof": "1.2.0",
751
+ "statuses": "2.0.1",
752
+ "toidentifier": "1.0.1"
753
+ },
754
+ "engines": {
755
+ "node": ">= 0.8"
756
+ }
757
+ },
758
+ "node_modules/serve-static/node_modules/ms": {
759
+ "version": "2.1.3",
760
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
761
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
762
+ "license": "MIT"
763
+ },
764
+ "node_modules/serve-static/node_modules/send": {
765
+ "version": "0.19.0",
766
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
767
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
768
+ "license": "MIT",
769
+ "dependencies": {
770
+ "debug": "2.6.9",
771
+ "depd": "2.0.0",
772
+ "destroy": "1.2.0",
773
+ "encodeurl": "~1.0.2",
774
+ "escape-html": "~1.0.3",
775
+ "etag": "~1.8.1",
776
+ "fresh": "0.5.2",
777
+ "http-errors": "2.0.0",
778
+ "mime": "1.6.0",
779
+ "ms": "2.1.3",
780
+ "on-finished": "2.4.1",
781
+ "range-parser": "~1.2.1",
782
+ "statuses": "2.0.1"
783
+ },
784
+ "engines": {
785
+ "node": ">= 0.8.0"
786
+ }
787
+ },
788
+ "node_modules/serve-static/node_modules/send/node_modules/encodeurl": {
789
+ "version": "1.0.2",
790
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
791
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
792
+ "license": "MIT",
793
+ "engines": {
794
+ "node": ">= 0.8"
795
+ }
796
+ },
797
+ "node_modules/serve-static/node_modules/statuses": {
798
+ "version": "2.0.1",
799
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
800
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
801
+ "license": "MIT",
802
+ "engines": {
803
+ "node": ">= 0.8"
804
+ }
805
+ },
806
+ "node_modules/setprototypeof": {
807
+ "version": "1.2.0",
808
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
809
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
810
+ "license": "ISC"
811
+ },
812
+ "node_modules/side-channel": {
813
+ "version": "1.1.0",
814
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
815
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
816
+ "license": "MIT",
817
+ "dependencies": {
818
+ "es-errors": "^1.3.0",
819
+ "object-inspect": "^1.13.3",
820
+ "side-channel-list": "^1.0.0",
821
+ "side-channel-map": "^1.0.1",
822
+ "side-channel-weakmap": "^1.0.2"
823
+ },
824
+ "engines": {
825
+ "node": ">= 0.4"
826
+ },
827
+ "funding": {
828
+ "url": "https://github.com/sponsors/ljharb"
829
+ }
830
+ },
831
+ "node_modules/side-channel-list": {
832
+ "version": "1.0.0",
833
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
834
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
835
+ "license": "MIT",
836
+ "dependencies": {
837
+ "es-errors": "^1.3.0",
838
+ "object-inspect": "^1.13.3"
839
+ },
840
+ "engines": {
841
+ "node": ">= 0.4"
842
+ },
843
+ "funding": {
844
+ "url": "https://github.com/sponsors/ljharb"
845
+ }
846
+ },
847
+ "node_modules/side-channel-map": {
848
+ "version": "1.0.1",
849
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
850
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
851
+ "license": "MIT",
852
+ "dependencies": {
853
+ "call-bound": "^1.0.2",
854
+ "es-errors": "^1.3.0",
855
+ "get-intrinsic": "^1.2.5",
856
+ "object-inspect": "^1.13.3"
857
+ },
858
+ "engines": {
859
+ "node": ">= 0.4"
860
+ },
861
+ "funding": {
862
+ "url": "https://github.com/sponsors/ljharb"
863
+ }
864
+ },
865
+ "node_modules/side-channel-weakmap": {
866
+ "version": "1.0.2",
867
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
868
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
869
+ "license": "MIT",
870
+ "dependencies": {
871
+ "call-bound": "^1.0.2",
872
+ "es-errors": "^1.3.0",
873
+ "get-intrinsic": "^1.2.5",
874
+ "object-inspect": "^1.13.3",
875
+ "side-channel-map": "^1.0.1"
876
+ },
877
+ "engines": {
878
+ "node": ">= 0.4"
879
+ },
880
+ "funding": {
881
+ "url": "https://github.com/sponsors/ljharb"
882
+ }
883
+ },
884
+ "node_modules/statuses": {
885
+ "version": "2.0.2",
886
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
887
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
888
+ "license": "MIT",
889
+ "engines": {
890
+ "node": ">= 0.8"
891
+ }
892
+ },
893
+ "node_modules/toidentifier": {
894
+ "version": "1.0.1",
895
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
896
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
897
+ "license": "MIT",
898
+ "engines": {
899
+ "node": ">=0.6"
900
+ }
901
+ },
902
+ "node_modules/type-is": {
903
+ "version": "1.6.18",
904
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
905
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
906
+ "license": "MIT",
907
+ "dependencies": {
908
+ "media-typer": "0.3.0",
909
+ "mime-types": "~2.1.24"
910
+ },
911
+ "engines": {
912
+ "node": ">= 0.6"
913
+ }
914
+ },
915
+ "node_modules/unpipe": {
916
+ "version": "1.0.0",
917
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
918
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
919
+ "license": "MIT",
920
+ "engines": {
921
+ "node": ">= 0.8"
922
+ }
923
+ },
924
+ "node_modules/utils-merge": {
925
+ "version": "1.0.1",
926
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
927
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
928
+ "license": "MIT",
929
+ "engines": {
930
+ "node": ">= 0.4.0"
931
+ }
932
+ },
933
+ "node_modules/vary": {
934
+ "version": "1.1.2",
935
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
936
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
937
+ "license": "MIT",
938
+ "engines": {
939
+ "node": ">= 0.8"
940
+ }
941
+ }
942
+ }
943
+ }
style.css CHANGED
@@ -1,324 +1,1013 @@
1
- /* style.css */
2
- :root {
3
- --bg-color: #0f172a;
4
- --panel-bg: rgba(30, 41, 59, 0.75);
5
- --panel-border: rgba(148, 163, 184, 0.15);
6
- --accent-color: #3b82f6;
7
- --text-main: #f1f5f9;
8
- --text-sub: #94a3b8;
9
- --btn-shadow: #1e3a8a;
10
- }
11
-
12
- * { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
13
- body {
14
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
15
- background: var(--bg-color) radial-gradient(circle at 50% 0%, #1e293b 0%, var(--bg-color) 70%);
16
- color: var(--text-main);
17
- height: 100vh;
18
- display: flex;
19
- flex-direction: column;
20
- overflow: hidden;
21
- }
22
-
23
- /* --- 通用组件 --- */
24
- .glass-panel {
25
- background: var(--panel-bg);
26
- backdrop-filter: blur(16px);
27
- -webkit-backdrop-filter: blur(16px);
28
- border: 1px solid var(--panel-border);
29
- }
30
-
31
- .btn-3d {
32
- background: var(--accent-color);
33
- color: white;
34
- border: none;
35
- border-radius: 12px;
36
- font-weight: 600;
37
- box-shadow: 0 4px 0 var(--btn-shadow), 0 5px 10px rgba(0,0,0,0.2);
38
- transition: transform 0.1s, box-shadow 0.1s;
39
- cursor: pointer;
40
- display: inline-flex;
41
- align-items: center;
42
- justify-content: center;
43
- }
44
- .btn-3d:active { transform: translateY(4px); box-shadow: 0 0 0 var(--btn-shadow); }
45
- .btn-3d:disabled { background: #475569; box-shadow: none; transform: none; opacity: 0.7; }
46
-
47
- /* --- 布局 --- */
48
- .app-container {
49
- max-width: 1200px;
50
- margin: 0 auto;
51
- width: 100%;
52
- height: 100%;
53
- display: flex;
54
- flex-direction: column;
55
- position: relative;
56
- }
57
-
58
- header {
59
- padding: 15px 20px;
60
- display: flex;
61
- justify-content: space-between;
62
- align-items: center;
63
- flex-shrink: 0;
64
- margin-top: 70px; /* 为顶部固定输入区留空间 */
65
- transition: margin-top 0.3s ease;
66
- }
67
- header h2 { font-size: 1.2rem; font-weight: 700; letter-spacing: 0.5px; }
68
-
69
- /* 当有预览图时增加顶部间距 */
70
- body.has-preview header {
71
- margin-top: 170px;
72
- }
73
-
74
- /* --- 历史记录区域 --- */
75
- .history-container {
76
- flex: 1;
77
- overflow-y: auto;
78
- padding: 10px 20px;
79
- padding-bottom: 20px; /* 顶部布局不需要底部留空 */
80
- }
81
-
82
- .grid-layout {
83
- display: grid;
84
- grid-template-columns: repeat(2, 1fr); /* 默认两列 */
85
- gap: 16px;
86
- }
87
-
88
- .history-item {
89
- position: relative;
90
- aspect-ratio: 16 / 9;
91
- border-radius: 12px;
92
- overflow: hidden;
93
- border: 1px solid var(--panel-border);
94
- background: rgba(0,0,0,0.2);
95
- cursor: pointer;
96
- }
97
- .history-item img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s; }
98
- .history-item:hover img { transform: scale(1.05); }
99
-
100
- .item-badge {
101
- position: absolute;
102
- top: 8px; left: 8px;
103
- background: rgba(59, 130, 246, 0.9);
104
- font-size: 10px; padding: 2px 6px;
105
- border-radius: 4px; z-index: 2;
106
- }
107
-
108
- .item-actions {
109
- position: absolute;
110
- bottom: 0; right: 0; left: 0;
111
- padding: 10px;
112
- background: linear-gradient(transparent, rgba(0,0,0,0.8));
113
- display: flex;
114
- justify-content: flex-end;
115
- gap: 8px;
116
- opacity: 0;
117
- transition: opacity 0.2s;
118
- }
119
- .history-item:hover .item-actions { opacity: 1; }
120
- /* 移动端默认显示操作栏 */
121
- @media (hover: none) { .item-actions { opacity: 1; } }
122
-
123
- .icon-btn {
124
- width: 32px; height: 32px;
125
- border-radius: 8px;
126
- background: rgba(255,255,255,0.15);
127
- color: white;
128
- border: none;
129
- display: flex; align-items: center; justify-content: center;
130
- backdrop-filter: blur(4px);
131
- }
132
-
133
- /* --- 输入区域 (顶部固定设计) --- */
134
- .input-section {
135
- position: fixed; /* 固定在顶部 */
136
- top: 0;
137
- left: 0;
138
- right: 0;
139
- width: 100%;
140
- display: flex;
141
- flex-direction: column;
142
- border-radius: 0;
143
- box-shadow: 0 2px 20px rgba(0,0,0,0.3);
144
- z-index: 100;
145
- border-bottom: 1px solid var(--panel-border);
146
- }
147
-
148
- /* 1. 预览层 (位于输入框上方) */
149
- .preview-bar {
150
- padding: 0;
151
- max-height: 0;
152
- overflow-x: auto;
153
- overflow-y: hidden;
154
- background: rgba(15, 23, 42, 0.4);
155
- display: flex;
156
- gap: 8px;
157
- transition: all 0.3s ease;
158
- white-space: nowrap;
159
- max-width: 1200px;
160
- margin: 0 auto;
161
- width: 100%;
162
- }
163
- .preview-bar.visible {
164
- padding: 12px 20px;
165
- max-height: 100px; /* 展开 */
166
- }
167
-
168
- .thumb-wrapper {
169
- position: relative;
170
- width: 64px; height: 64px;
171
- flex-shrink: 0;
172
- border-radius: 8px;
173
- border: 1px solid rgba(255,255,255,0.1);
174
- overflow: hidden;
175
- }
176
- .thumb-wrapper img { width: 100%; height: 100%; object-fit: cover; }
177
- .thumb-remove {
178
- position: absolute; top: 2px; right: 2px;
179
- width: 16px; height: 16px;
180
- background: rgba(239,68,68,0.9);
181
- border-radius: 50%;
182
- display: flex; align-items: center; justify-content: center;
183
- font-size: 12px; cursor: pointer;
184
- }
185
-
186
- /* 2. 控制层 (按钮+输入框) */
187
- .control-bar {
188
- display: flex;
189
- align-items: flex-end;
190
- padding: 12px 20px;
191
- gap: 10px;
192
- max-width: 1200px;
193
- margin: 0 auto;
194
- width: 100%;
195
- }
196
-
197
- .upload-trigger {
198
- width: 44px; height: 44px;
199
- border-radius: 12px;
200
- background: rgba(255,255,255,0.05);
201
- border: 1px dashed rgba(255,255,255,0.3);
202
- color: var(--text-sub);
203
- display: flex; align-items: center; justify-content: center;
204
- font-size: 20px;
205
- flex-shrink: 0;
206
- transition: all 0.2s;
207
- }
208
- .upload-trigger:hover, .upload-trigger.active {
209
- background: rgba(59, 130, 246, 0.2);
210
- border-color: var(--accent-color);
211
- color: var(--accent-color);
212
- }
213
-
214
- .main-input {
215
- flex: 1;
216
- background: transparent;
217
- border: none;
218
- color: white;
219
- font-size: 16px;
220
- padding: 10px 5px;
221
- resize: none;
222
- max-height: 120px;
223
- outline: none;
224
- line-height: 1.5;
225
- }
226
- .main-input::placeholder { color: rgba(255,255,255,0.3); }
227
-
228
- .send-btn {
229
- height: 44px;
230
- padding: 0 20px;
231
- font-size: 15px;
232
- flex-shrink: 0;
233
- }
234
-
235
- /* 加载动画 */
236
- .loader {
237
- width: 18px; height: 18px;
238
- border: 2px solid rgba(255,255,255,0.3);
239
- border-top-color: white;
240
- border-radius: 50%;
241
- animation: spin 0.8s linear infinite;
242
- display: none;
243
- }
244
- .loading .loader { display: block; }
245
- .loading span { display: none; }
246
- @keyframes spin { to { transform: rotate(360deg); } }
247
-
248
- /* --- 弹窗 --- */
249
- .modal {
250
- display: none;
251
- position: fixed; top: 0; left: 0; width: 100%; height: 100%;
252
- background: rgba(0,0,0,0.9);
253
- z-index: 1000;
254
- justify-content: center; align-items: center;
255
- backdrop-filter: blur(5px);
256
- }
257
- .modal-content {
258
- background: #1e293b;
259
- width: 95%; max-width: 1000px; height: 90%;
260
- border-radius: 16px;
261
- display: flex; flex-direction: column;
262
- position: relative;
263
- border: 1px solid var(--panel-border);
264
- }
265
- .close-modal {
266
- position: absolute; top: 15px; right: 15px;
267
- width: 36px; height: 36px;
268
- border-radius: 50%; background: rgba(0,0,0,0.5);
269
- color: white; border: 1px solid rgba(255,255,255,0.2);
270
- z-index: 10; font-size: 20px;
271
- }
272
- .modal-img-area { flex: 1; display: flex; justify-content: center; align-items: center; background: #000; overflow: hidden; border-radius: 16px 16px 0 0; }
273
- .modal-img-area img { max-width: 100%; max-height: 100%; object-fit: contain; }
274
- .modal-footer { padding: 15px; background: #1e293b; border-top: 1px solid var(--panel-border); display: flex; flex-direction: column; gap: 10px; }
275
- .input-refs { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 5px; }
276
- .ref-thumb { width: 40px; height: 40px; border-radius: 6px; border: 1px solid rgba(255,255,255,0.2); cursor: pointer; }
277
- .prompt-display { background: rgba(0,0,0,0.2); padding: 10px; border-radius: 8px; color: #cbd5e1; font-size: 0.9rem; max-height: 80px; overflow-y: auto; }
278
-
279
- /* --- 手机响应式设计 --- */
280
- @media (max-width: 768px) {
281
- .app-container { padding: 0; }
282
- .history-container { padding: 10px; padding-bottom: 10px; }
283
-
284
- /* 移动端顶部间距调整 */
285
- header {
286
- margin-top: 60px;
287
- }
288
-
289
- body.has-preview header {
290
- margin-top: 140px;
291
- }
292
-
293
- /* 历史记录一行一个 */
294
- .grid-layout {
295
- grid-template-columns: 1fr;
296
- gap: 20px;
297
- }
298
-
299
- /* 输入区样式调整 */
300
- .control-bar {
301
- padding: 10px;
302
- }
303
-
304
- .preview-bar.visible {
305
- max-height: 80px;
306
- padding: 10px;
307
- }
308
-
309
- /* 调整按钮点击区域 */
310
- .send-btn { padding: 0 15px; min-width: 80px; }
311
- .thumb-wrapper { width: 50px; height: 50px; }
312
- }
313
-
314
- /* --- 大屏幕优化 --- */
315
- @media (min-width: 1200px) {
316
- .grid-layout {
317
- grid-template-columns: repeat(3, 1fr); /* 大屏幕显示三列 */
318
- }
319
- }
320
-
321
- /* 登录层 */
322
- #login-overlay { position: fixed; inset: 0; z-index: 5000; display: flex; justify-content: center; align-items: center; background: #0f172a; }
323
- .login-card { width: 300px; padding: 30px; text-align: center; }
324
- .login-card input { width: 100%; padding: 12px; margin: 15px 0; background: rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.1); color: white; border-radius: 8px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* style.css - Enhanced Glass Design with Animations */
2
+ :root {
3
+ --bg-color: #0f172a;
4
+ --panel-bg: rgba(30, 41, 59, 0.65);
5
+ --panel-bg-strong: rgba(30, 41, 59, 0.85);
6
+ --panel-border: rgba(148, 163, 184, 0.15);
7
+ --panel-border-strong: rgba(148, 163, 184, 0.3);
8
+ --accent-color: #3b82f6;
9
+ --accent-hover: #2563eb;
10
+ --text-main: #f1f5f9;
11
+ --text-sub: #94a3b8;
12
+ --btn-shadow: #1e3a8a;
13
+ --glass-shine: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, rgba(255,255,255,0) 100%);
14
+ --transition-fast: 0.2s ease;
15
+ --transition-normal: 0.3s ease;
16
+ --transition-slow: 0.5s ease;
17
+ }
18
+
19
+ * {
20
+ box-sizing: border-box;
21
+ margin: 0;
22
+ padding: 0;
23
+ -webkit-tap-highlight-color: transparent;
24
+ }
25
+
26
+ body {
27
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
28
+ background: var(--bg-color) radial-gradient(circle at 50% 0%, #1e293b 0%, var(--bg-color) 70%);
29
+ color: var(--text-main);
30
+ height: 100vh;
31
+ display: flex;
32
+ flex-direction: column;
33
+ overflow: hidden;
34
+ animation: fadeIn 0.6s ease-out;
35
+ }
36
+
37
+ @keyframes fadeIn {
38
+ from { opacity: 0; }
39
+ to { opacity: 1; }
40
+ }
41
+
42
+ /* --- Enhanced Glass Components --- */
43
+ .glass-panel {
44
+ background: var(--panel-bg);
45
+ backdrop-filter: blur(20px) saturate(180%);
46
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
47
+ border: 1px solid var(--panel-border);
48
+ position: relative;
49
+ transition: all var(--transition-normal);
50
+ }
51
+
52
+ .glass-panel::before {
53
+ content: '';
54
+ position: absolute;
55
+ top: 0;
56
+ left: 0;
57
+ right: 0;
58
+ height: 1px;
59
+ background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.1) 50%, transparent 100%);
60
+ opacity: 0.5;
61
+ }
62
+
63
+ .glass-panel:hover {
64
+ border-color: var(--panel-border-strong);
65
+ transform: translateY(-1px);
66
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
67
+ }
68
+
69
+ /* --- Enhanced 3D Buttons --- */
70
+ .btn-3d {
71
+ background: linear-gradient(135deg, var(--accent-color) 0%, #2563eb 100%);
72
+ color: white;
73
+ border: none;
74
+ border-radius: 12px;
75
+ font-weight: 600;
76
+ box-shadow:
77
+ 0 4px 0 var(--btn-shadow),
78
+ 0 5px 15px rgba(59, 130, 246, 0.3),
79
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
80
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
81
+ cursor: pointer;
82
+ display: inline-flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ position: relative;
86
+ overflow: hidden;
87
+ }
88
+
89
+ .btn-3d::before {
90
+ content: '';
91
+ position: absolute;
92
+ top: 0;
93
+ left: -100%;
94
+ width: 100%;
95
+ height: 100%;
96
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
97
+ transition: left 0.5s;
98
+ }
99
+
100
+ .btn-3d:hover {
101
+ transform: translateY(-2px);
102
+ box-shadow:
103
+ 0 6px 0 var(--btn-shadow),
104
+ 0 8px 20px rgba(59, 130, 246, 0.4),
105
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
106
+ }
107
+
108
+ .btn-3d:hover::before {
109
+ left: 100%;
110
+ }
111
+
112
+ .btn-3d:active {
113
+ transform: translateY(4px);
114
+ box-shadow:
115
+ 0 0 0 var(--btn-shadow),
116
+ 0 2px 5px rgba(59, 130, 246, 0.3);
117
+ }
118
+
119
+ .btn-3d:disabled {
120
+ background: linear-gradient(135deg, #475569 0%, #334155 100%);
121
+ box-shadow: none;
122
+ transform: none;
123
+ opacity: 0.7;
124
+ cursor: not-allowed;
125
+ }
126
+
127
+ /* --- Layout --- */
128
+ .app-container {
129
+ max-width: 1200px;
130
+ margin: 0 auto;
131
+ width: 100%;
132
+ height: 100%;
133
+ display: flex;
134
+ flex-direction: column;
135
+ position: relative;
136
+ animation: slideUp 0.6s ease-out;
137
+ }
138
+
139
+ @keyframes slideUp {
140
+ from {
141
+ opacity: 0;
142
+ transform: translateY(20px);
143
+ }
144
+ to {
145
+ opacity: 1;
146
+ transform: translateY(0);
147
+ }
148
+ }
149
+
150
+ header {
151
+ padding: 15px 20px;
152
+ display: flex;
153
+ justify-content: space-between;
154
+ align-items: center;
155
+ flex-shrink: 0;
156
+ margin-top: 70px;
157
+ transition: margin-top var(--transition-normal);
158
+ }
159
+
160
+ header h2 {
161
+ font-size: 1.2rem;
162
+ font-weight: 700;
163
+ letter-spacing: 0.5px;
164
+ background: linear-gradient(135deg, var(--text-main) 0%, var(--text-sub) 100%);
165
+ -webkit-background-clip: text;
166
+ -webkit-text-fill-color: transparent;
167
+ background-clip: text;
168
+ }
169
+
170
+ body.has-preview header {
171
+ margin-top: 170px;
172
+ }
173
+
174
+ /* --- History Gallery --- */
175
+ .history-container {
176
+ flex: 1;
177
+ overflow-y: auto;
178
+ padding: 10px 20px;
179
+ padding-bottom: 20px;
180
+ scroll-behavior: smooth;
181
+ }
182
+
183
+ .history-container::-webkit-scrollbar {
184
+ width: 8px;
185
+ }
186
+
187
+ .history-container::-webkit-scrollbar-track {
188
+ background: rgba(0, 0, 0, 0.2);
189
+ border-radius: 4px;
190
+ }
191
+
192
+ .history-container::-webkit-scrollbar-thumb {
193
+ background: var(--panel-bg);
194
+ border-radius: 4px;
195
+ transition: background var(--transition-fast);
196
+ }
197
+
198
+ .history-container::-webkit-scrollbar-thumb:hover {
199
+ background: var(--panel-bg-strong);
200
+ }
201
+
202
+ .grid-layout {
203
+ display: grid;
204
+ grid-template-columns: repeat(2, 1fr);
205
+ gap: 16px;
206
+ }
207
+
208
+ .history-item {
209
+ position: relative;
210
+ aspect-ratio: 16 / 9;
211
+ border-radius: 12px;
212
+ overflow: hidden;
213
+ border: 1px solid var(--panel-border);
214
+ background: rgba(0,0,0,0.2);
215
+ cursor: pointer;
216
+ transition: all var(--transition-normal);
217
+ animation: scaleIn 0.4s ease-out backwards;
218
+ }
219
+
220
+ @keyframes scaleIn {
221
+ from {
222
+ opacity: 0;
223
+ transform: scale(0.9);
224
+ }
225
+ to {
226
+ opacity: 1;
227
+ transform: scale(1);
228
+ }
229
+ }
230
+
231
+ .history-item:nth-child(1) { animation-delay: 0.05s; }
232
+ .history-item:nth-child(2) { animation-delay: 0.1s; }
233
+ .history-item:nth-child(3) { animation-delay: 0.15s; }
234
+ .history-item:nth-child(4) { animation-delay: 0.2s; }
235
+ .history-item:nth-child(5) { animation-delay: 0.25s; }
236
+ .history-item:nth-child(6) { animation-delay: 0.3s; }
237
+
238
+ .history-item img {
239
+ width: 100%;
240
+ height: 100%;
241
+ object-fit: cover;
242
+ transition: transform var(--transition-normal);
243
+ }
244
+
245
+ .history-item:hover {
246
+ border-color: var(--panel-border-strong);
247
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
248
+ transform: translateY(-4px);
249
+ }
250
+
251
+ .history-item:hover img {
252
+ transform: scale(1.08);
253
+ }
254
+
255
+ .item-badge {
256
+ position: absolute;
257
+ top: 8px;
258
+ left: 8px;
259
+ background: linear-gradient(135deg, rgba(59, 130, 246, 0.95) 0%, rgba(37, 99, 235, 0.95) 100%);
260
+ font-size: 10px;
261
+ padding: 4px 8px;
262
+ border-radius: 6px;
263
+ z-index: 2;
264
+ backdrop-filter: blur(8px);
265
+ border: 1px solid rgba(255, 255, 255, 0.2);
266
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
267
+ transition: all var(--transition-fast);
268
+ }
269
+
270
+ .item-badge:hover {
271
+ transform: scale(1.05);
272
+ }
273
+
274
+ .item-actions {
275
+ position: absolute;
276
+ bottom: 0;
277
+ right: 0;
278
+ left: 0;
279
+ padding: 12px;
280
+ background: linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.4) 50%, transparent 100%);
281
+ backdrop-filter: blur(8px);
282
+ display: flex;
283
+ justify-content: flex-end;
284
+ gap: 8px;
285
+ opacity: 0;
286
+ transition: opacity var(--transition-normal);
287
+ }
288
+
289
+ .history-item:hover .item-actions {
290
+ opacity: 1;
291
+ }
292
+
293
+ @media (hover: none) {
294
+ .item-actions { opacity: 1; }
295
+ }
296
+
297
+ .icon-btn {
298
+ width: 36px;
299
+ height: 36px;
300
+ border-radius: 8px;
301
+ background: rgba(255,255,255,0.15);
302
+ color: white;
303
+ border: 1px solid rgba(255,255,255,0.2);
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ backdrop-filter: blur(8px);
308
+ cursor: pointer;
309
+ transition: all var(--transition-fast);
310
+ font-size: 16px;
311
+ }
312
+
313
+ .icon-btn:hover {
314
+ background: rgba(255,255,255,0.25);
315
+ transform: scale(1.1);
316
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
317
+ }
318
+
319
+ .icon-btn:active {
320
+ transform: scale(0.95);
321
+ }
322
+
323
+ /* --- Fixed Input Section (Top) --- */
324
+ .input-section {
325
+ position: fixed;
326
+ top: 0;
327
+ left: 0;
328
+ right: 0;
329
+ width: 100%;
330
+ display: flex;
331
+ flex-direction: column;
332
+ border-radius: 0;
333
+ box-shadow: 0 4px 24px rgba(0,0,0,0.4);
334
+ z-index: 100;
335
+ border-bottom: 1px solid var(--panel-border);
336
+ transition: box-shadow var(--transition-normal);
337
+ }
338
+
339
+ .input-section:hover {
340
+ box-shadow: 0 6px 32px rgba(0,0,0,0.5);
341
+ }
342
+
343
+ /* Preview Bar */
344
+ .preview-bar {
345
+ padding: 0;
346
+ max-height: 0;
347
+ overflow-x: auto;
348
+ overflow-y: hidden;
349
+ background: rgba(15, 23, 42, 0.6);
350
+ backdrop-filter: blur(12px);
351
+ display: flex;
352
+ gap: 8px;
353
+ transition: all var(--transition-normal) cubic-bezier(0.4, 0, 0.2, 1);
354
+ white-space: nowrap;
355
+ max-width: 1200px;
356
+ margin: 0 auto;
357
+ width: 100%;
358
+ scroll-behavior: smooth;
359
+ }
360
+
361
+ .preview-bar::-webkit-scrollbar {
362
+ height: 4px;
363
+ }
364
+
365
+ .preview-bar::-webkit-scrollbar-track {
366
+ background: rgba(0, 0, 0, 0.2);
367
+ }
368
+
369
+ .preview-bar::-webkit-scrollbar-thumb {
370
+ background: var(--accent-color);
371
+ border-radius: 2px;
372
+ }
373
+
374
+ .preview-bar.visible {
375
+ padding: 12px 20px;
376
+ max-height: 100px;
377
+ }
378
+
379
+ .thumb-wrapper {
380
+ position: relative;
381
+ width: 64px;
382
+ height: 64px;
383
+ flex-shrink: 0;
384
+ border-radius: 8px;
385
+ border: 2px solid rgba(255,255,255,0.1);
386
+ overflow: hidden;
387
+ transition: all var(--transition-fast);
388
+ animation: slideInThumb 0.3s ease-out;
389
+ }
390
+
391
+ @keyframes slideInThumb {
392
+ from {
393
+ opacity: 0;
394
+ transform: scale(0.8) translateY(-10px);
395
+ }
396
+ to {
397
+ opacity: 1;
398
+ transform: scale(1) translateY(0);
399
+ }
400
+ }
401
+
402
+ .thumb-wrapper:hover {
403
+ border-color: var(--accent-color);
404
+ transform: scale(1.05);
405
+ }
406
+
407
+ .thumb-wrapper img {
408
+ width: 100%;
409
+ height: 100%;
410
+ object-fit: cover;
411
+ }
412
+
413
+ .thumb-remove {
414
+ position: absolute;
415
+ top: 2px;
416
+ right: 2px;
417
+ width: 18px;
418
+ height: 18px;
419
+ background: linear-gradient(135deg, rgba(239,68,68,0.95) 0%, rgba(220,38,38,0.95) 100%);
420
+ border-radius: 50%;
421
+ display: flex;
422
+ align-items: center;
423
+ justify-content: center;
424
+ font-size: 12px;
425
+ cursor: pointer;
426
+ border: 1px solid rgba(255,255,255,0.3);
427
+ transition: all var(--transition-fast);
428
+ box-shadow: 0 2px 6px rgba(0,0,0,0.3);
429
+ }
430
+
431
+ .thumb-remove:hover {
432
+ transform: scale(1.2);
433
+ background: linear-gradient(135deg, rgba(220,38,38,1) 0%, rgba(185,28,28,1) 100%);
434
+ }
435
+
436
+ .thumb-remove:active {
437
+ transform: scale(0.9);
438
+ }
439
+
440
+ /* Control Bar */
441
+ .control-bar {
442
+ display: flex;
443
+ align-items: flex-end;
444
+ padding: 12px 20px;
445
+ gap: 10px;
446
+ max-width: 1200px;
447
+ margin: 0 auto;
448
+ width: 100%;
449
+ }
450
+
451
+ .upload-trigger {
452
+ width: 44px;
453
+ height: 44px;
454
+ border-radius: 12px;
455
+ background: rgba(255,255,255,0.05);
456
+ border: 2px dashed rgba(255,255,255,0.3);
457
+ color: var(--text-sub);
458
+ display: flex;
459
+ align-items: center;
460
+ justify-content: center;
461
+ font-size: 20px;
462
+ flex-shrink: 0;
463
+ transition: all var(--transition-normal);
464
+ cursor: pointer;
465
+ position: relative;
466
+ overflow: hidden;
467
+ }
468
+
469
+ .upload-trigger::before {
470
+ content: '';
471
+ position: absolute;
472
+ inset: 0;
473
+ background: radial-gradient(circle, rgba(59, 130, 246, 0.2) 0%, transparent 70%);
474
+ opacity: 0;
475
+ transition: opacity var(--transition-fast);
476
+ }
477
+
478
+ .upload-trigger:hover, .upload-trigger.active {
479
+ background: rgba(59, 130, 246, 0.15);
480
+ border-color: var(--accent-color);
481
+ border-style: solid;
482
+ color: var(--accent-color);
483
+ transform: scale(1.05);
484
+ }
485
+
486
+ .upload-trigger:hover::before, .upload-trigger.active::before {
487
+ opacity: 1;
488
+ }
489
+
490
+ .upload-trigger:active {
491
+ transform: scale(0.95);
492
+ }
493
+
494
+ /* Drag Active State */
495
+ .input-section.drag-active {
496
+ background: rgba(59, 130, 246, 0.1);
497
+ border-color: var(--accent-color);
498
+ box-shadow:
499
+ 0 6px 32px rgba(59, 130, 246, 0.4),
500
+ inset 0 0 0 2px var(--accent-color);
501
+ animation: pulse 1s ease-in-out infinite;
502
+ }
503
+
504
+ @keyframes pulse {
505
+ 0%, 100% {
506
+ box-shadow:
507
+ 0 6px 32px rgba(59, 130, 246, 0.4),
508
+ inset 0 0 0 2px var(--accent-color);
509
+ }
510
+ 50% {
511
+ box-shadow:
512
+ 0 8px 40px rgba(59, 130, 246, 0.6),
513
+ inset 0 0 0 3px var(--accent-color);
514
+ }
515
+ }
516
+
517
+ .main-input {
518
+ flex: 1;
519
+ background: transparent;
520
+ border: none;
521
+ color: white;
522
+ font-size: 16px;
523
+ padding: 10px 5px;
524
+ resize: none;
525
+ max-height: 120px;
526
+ outline: none;
527
+ line-height: 1.5;
528
+ transition: all var(--transition-fast);
529
+ }
530
+
531
+ .main-input::placeholder {
532
+ color: rgba(255,255,255,0.3);
533
+ transition: color var(--transition-fast);
534
+ }
535
+
536
+ .main-input:focus::placeholder {
537
+ color: rgba(255,255,255,0.5);
538
+ }
539
+
540
+ .send-btn {
541
+ height: 44px;
542
+ padding: 0 20px;
543
+ font-size: 15px;
544
+ flex-shrink: 0;
545
+ min-width: 90px;
546
+ }
547
+
548
+ /* Enhanced Loading Animation */
549
+ .loader {
550
+ width: 18px;
551
+ height: 18px;
552
+ border: 2px solid rgba(255,255,255,0.2);
553
+ border-top-color: white;
554
+ border-radius: 50%;
555
+ animation: spin 0.8s cubic-bezier(0.5, 0.2, 0.5, 0.8) infinite;
556
+ display: none;
557
+ }
558
+
559
+ .loading .loader { display: block; }
560
+ .loading span { display: none; }
561
+
562
+ @keyframes spin {
563
+ to { transform: rotate(360deg); }
564
+ }
565
+
566
+ /* --- Enhanced Modal --- */
567
+ .modal {
568
+ display: none;
569
+ position: fixed;
570
+ top: 0;
571
+ left: 0;
572
+ width: 100%;
573
+ height: 100%;
574
+ background: rgba(0,0,0,0.85);
575
+ z-index: 1000;
576
+ justify-content: center;
577
+ align-items: center;
578
+ backdrop-filter: blur(8px);
579
+ animation: fadeIn var(--transition-normal);
580
+ }
581
+
582
+ .modal.show {
583
+ display: flex;
584
+ }
585
+
586
+ .modal-content {
587
+ background: var(--panel-bg-strong);
588
+ backdrop-filter: blur(24px) saturate(180%);
589
+ width: 95%;
590
+ max-width: 1000px;
591
+ height: 90%;
592
+ max-height: 900px;
593
+ border-radius: 20px;
594
+ display: flex;
595
+ flex-direction: column;
596
+ position: relative;
597
+ border: 1px solid var(--panel-border-strong);
598
+ box-shadow:
599
+ 0 20px 60px rgba(0, 0, 0, 0.6),
600
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
601
+ animation: modalSlideIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
602
+ }
603
+
604
+ @keyframes modalSlideIn {
605
+ from {
606
+ opacity: 0;
607
+ transform: scale(0.9) translateY(20px);
608
+ }
609
+ to {
610
+ opacity: 1;
611
+ transform: scale(1) translateY(0);
612
+ }
613
+ }
614
+
615
+ .close-modal {
616
+ position: absolute;
617
+ top: 15px;
618
+ right: 15px;
619
+ width: 40px;
620
+ height: 40px;
621
+ border-radius: 50%;
622
+ background: rgba(0,0,0,0.7);
623
+ backdrop-filter: blur(8px);
624
+ color: white;
625
+ border: 1px solid rgba(255,255,255,0.2);
626
+ z-index: 10;
627
+ font-size: 24px;
628
+ cursor: pointer;
629
+ display: flex;
630
+ align-items: center;
631
+ justify-content: center;
632
+ transition: all var(--transition-fast);
633
+ }
634
+
635
+ .close-modal:hover {
636
+ background: rgba(239,68,68,0.9);
637
+ transform: rotate(90deg) scale(1.1);
638
+ border-color: rgba(255,255,255,0.4);
639
+ }
640
+
641
+ .close-modal:active {
642
+ transform: rotate(90deg) scale(0.95);
643
+ }
644
+
645
+ .modal-img-area {
646
+ flex: 1;
647
+ display: flex;
648
+ justify-content: center;
649
+ align-items: center;
650
+ background: rgba(0,0,0,0.5);
651
+ overflow: hidden;
652
+ border-radius: 20px 20px 0 0;
653
+ position: relative;
654
+ }
655
+
656
+ .modal-img-area::before {
657
+ content: '';
658
+ position: absolute;
659
+ inset: 0;
660
+ background: radial-gradient(circle at center, transparent 0%, rgba(0,0,0,0.3) 100%);
661
+ pointer-events: none;
662
+ }
663
+
664
+ .modal-img-area img {
665
+ max-width: 100%;
666
+ max-height: 100%;
667
+ object-fit: contain;
668
+ animation: imageZoomIn 0.5s ease-out;
669
+ }
670
+
671
+ @keyframes imageZoomIn {
672
+ from {
673
+ opacity: 0;
674
+ transform: scale(0.95);
675
+ }
676
+ to {
677
+ opacity: 1;
678
+ transform: scale(1);
679
+ }
680
+ }
681
+
682
+ .modal-footer {
683
+ padding: 20px;
684
+ background: rgba(30, 41, 59, 0.95);
685
+ backdrop-filter: blur(16px);
686
+ border-top: 1px solid var(--panel-border-strong);
687
+ display: flex;
688
+ flex-direction: column;
689
+ gap: 12px;
690
+ border-radius: 0 0 20px 20px;
691
+ }
692
+
693
+ .input-refs {
694
+ display: flex;
695
+ gap: 8px;
696
+ overflow-x: auto;
697
+ padding-bottom: 5px;
698
+ scroll-behavior: smooth;
699
+ }
700
+
701
+ .input-refs::-webkit-scrollbar {
702
+ height: 4px;
703
+ }
704
+
705
+ .input-refs::-webkit-scrollbar-track {
706
+ background: rgba(0, 0, 0, 0.2);
707
+ border-radius: 2px;
708
+ }
709
+
710
+ .input-refs::-webkit-scrollbar-thumb {
711
+ background: var(--accent-color);
712
+ border-radius: 2px;
713
+ }
714
+
715
+ .ref-thumb {
716
+ width: 44px;
717
+ height: 44px;
718
+ border-radius: 8px;
719
+ border: 2px solid rgba(255,255,255,0.2);
720
+ cursor: pointer;
721
+ transition: all var(--transition-fast);
722
+ object-fit: cover;
723
+ }
724
+
725
+ .ref-thumb:hover {
726
+ border-color: var(--accent-color);
727
+ transform: scale(1.1);
728
+ }
729
+
730
+ .prompt-display {
731
+ background: rgba(0,0,0,0.3);
732
+ padding: 12px;
733
+ border-radius: 10px;
734
+ color: #cbd5e1;
735
+ font-size: 0.9rem;
736
+ max-height: 100px;
737
+ overflow-y: auto;
738
+ line-height: 1.5;
739
+ border: 1px solid rgba(255,255,255,0.05);
740
+ }
741
+
742
+ .prompt-display::-webkit-scrollbar {
743
+ width: 6px;
744
+ }
745
+
746
+ .prompt-display::-webkit-scrollbar-track {
747
+ background: rgba(0, 0, 0, 0.2);
748
+ border-radius: 3px;
749
+ }
750
+
751
+ .prompt-display::-webkit-scrollbar-thumb {
752
+ background: var(--accent-color);
753
+ border-radius: 3px;
754
+ }
755
+
756
+ /* --- Login Overlay --- */
757
+ #login-overlay {
758
+ position: fixed;
759
+ inset: 0;
760
+ z-index: 5000;
761
+ display: flex;
762
+ justify-content: center;
763
+ align-items: center;
764
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
765
+ animation: fadeIn 0.5s ease-out;
766
+ }
767
+
768
+ .login-card {
769
+ width: 340px;
770
+ padding: 40px;
771
+ text-align: center;
772
+ border-radius: 20px;
773
+ box-shadow:
774
+ 0 20px 60px rgba(0, 0, 0, 0.5),
775
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
776
+ animation: modalSlideIn 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
777
+ }
778
+
779
+ .login-card h1 {
780
+ font-size: 3rem;
781
+ margin-bottom: 10px;
782
+ animation: bounce 1s ease-in-out infinite;
783
+ }
784
+
785
+ @keyframes bounce {
786
+ 0%, 100% { transform: translateY(0); }
787
+ 50% { transform: translateY(-10px); }
788
+ }
789
+
790
+ .login-card h3 {
791
+ margin: 15px 0;
792
+ color: #cbd5e1;
793
+ font-weight: 600;
794
+ }
795
+
796
+ .login-card input {
797
+ width: 100%;
798
+ padding: 14px;
799
+ margin: 20px 0;
800
+ background: rgba(0,0,0,0.4);
801
+ border: 2px solid rgba(255,255,255,0.1);
802
+ color: white;
803
+ border-radius: 10px;
804
+ font-size: 15px;
805
+ transition: all var(--transition-normal);
806
+ outline: none;
807
+ }
808
+
809
+ .login-card input:focus {
810
+ border-color: var(--accent-color);
811
+ background: rgba(0,0,0,0.5);
812
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
813
+ }
814
+
815
+ .login-card .btn-3d {
816
+ width: 100%;
817
+ padding: 14px;
818
+ font-size: 16px;
819
+ }
820
+
821
+ /* --- Mobile Responsive Design --- */
822
+ @media (max-width: 768px) {
823
+ .app-container {
824
+ padding: 0;
825
+ }
826
+
827
+ .history-container {
828
+ padding: 10px;
829
+ padding-bottom: 10px;
830
+ }
831
+
832
+ header {
833
+ margin-top: 60px;
834
+ padding: 12px 15px;
835
+ }
836
+
837
+ header h2 {
838
+ font-size: 1.1rem;
839
+ }
840
+
841
+ body.has-preview header {
842
+ margin-top: 140px;
843
+ }
844
+
845
+ .grid-layout {
846
+ grid-template-columns: 1fr;
847
+ gap: 15px;
848
+ }
849
+
850
+ .control-bar {
851
+ padding: 10px;
852
+ gap: 8px;
853
+ }
854
+
855
+ .preview-bar.visible {
856
+ max-height: 80px;
857
+ padding: 10px;
858
+ }
859
+
860
+ .send-btn {
861
+ padding: 0 15px;
862
+ min-width: 70px;
863
+ font-size: 14px;
864
+ }
865
+
866
+ .thumb-wrapper {
867
+ width: 50px;
868
+ height: 50px;
869
+ }
870
+
871
+ .upload-trigger {
872
+ width: 40px;
873
+ height: 40px;
874
+ font-size: 18px;
875
+ }
876
+
877
+ .main-input {
878
+ font-size: 15px;
879
+ padding: 8px 5px;
880
+ }
881
+
882
+ .modal-content {
883
+ width: 98%;
884
+ height: 95%;
885
+ border-radius: 16px;
886
+ }
887
+
888
+ .modal-footer {
889
+ padding: 15px;
890
+ gap: 10px;
891
+ }
892
+
893
+ .close-modal {
894
+ width: 36px;
895
+ height: 36px;
896
+ font-size: 20px;
897
+ top: 10px;
898
+ right: 10px;
899
+ }
900
+
901
+ .login-card {
902
+ width: 90%;
903
+ max-width: 320px;
904
+ padding: 30px 25px;
905
+ }
906
+
907
+ .login-card h1 {
908
+ font-size: 2.5rem;
909
+ }
910
+
911
+ /* Reduce glass effects on mobile for performance */
912
+ .glass-panel {
913
+ backdrop-filter: blur(12px) saturate(150%);
914
+ -webkit-backdrop-filter: blur(12px) saturate(150%);
915
+ }
916
+
917
+ /* Better touch targets */
918
+ .icon-btn {
919
+ width: 40px;
920
+ height: 40px;
921
+ font-size: 18px;
922
+ }
923
+
924
+ .item-badge {
925
+ font-size: 9px;
926
+ padding: 3px 6px;
927
+ }
928
+ }
929
+
930
+ /* --- Tablet Responsive Design --- */
931
+ @media (min-width: 768px) and (max-width: 1024px) {
932
+ .grid-layout {
933
+ grid-template-columns: repeat(2, 1fr);
934
+ gap: 16px;
935
+ }
936
+
937
+ .modal-content {
938
+ width: 90%;
939
+ height: 85%;
940
+ }
941
+
942
+ header {
943
+ margin-top: 75px;
944
+ }
945
+
946
+ body.has-preview header {
947
+ margin-top: 160px;
948
+ }
949
+ }
950
+
951
+ /* --- Large Screen Optimization --- */
952
+ @media (min-width: 1200px) {
953
+ .grid-layout {
954
+ grid-template-columns: repeat(3, 1fr);
955
+ gap: 20px;
956
+ }
957
+
958
+ .history-container {
959
+ padding: 15px 30px;
960
+ padding-bottom: 30px;
961
+ }
962
+
963
+ header {
964
+ padding: 20px 30px;
965
+ }
966
+
967
+ .control-bar {
968
+ padding: 14px 30px;
969
+ }
970
+
971
+ .preview-bar.visible {
972
+ padding: 14px 30px;
973
+ }
974
+ }
975
+
976
+ /* --- Accessibility & Reduced Motion --- */
977
+ @media (prefers-reduced-motion: reduce) {
978
+ *,
979
+ *::before,
980
+ *::after {
981
+ animation-duration: 0.01ms !important;
982
+ animation-iteration-count: 1 !important;
983
+ transition-duration: 0.01ms !important;
984
+ }
985
+ }
986
+
987
+ /* --- Focus Styles for Accessibility --- */
988
+ button:focus-visible,
989
+ input:focus-visible,
990
+ textarea:focus-visible {
991
+ outline: 2px solid var(--accent-color);
992
+ outline-offset: 2px;
993
+ }
994
+
995
+ /* --- Print Styles --- */
996
+ @media print {
997
+ .input-section,
998
+ .item-actions,
999
+ header,
1000
+ .modal {
1001
+ display: none !important;
1002
+ }
1003
+
1004
+ .history-container {
1005
+ overflow: visible;
1006
+ padding: 0;
1007
+ }
1008
+
1009
+ body {
1010
+ background: white;
1011
+ color: black;
1012
+ }
1013
+ }