openfree commited on
Commit
86fdb32
·
verified ·
1 Parent(s): a494367

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +445 -560
index.html CHANGED
@@ -1,566 +1,451 @@
1
  <!DOCTYPE html>
2
- <html lang="ko">
3
  <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>프로젝트 뷰어 (자동 분류 및 URL 변환)</title>
7
- <style>
8
- body {
9
- font-family: Arial, sans-serif;
10
- margin: 0;
11
- padding: 0;
12
- background-color: #f4f4f9;
13
- color: #333;
14
- }
15
- .github-link {
16
- text-align: center;
17
- padding: 8px;
18
- background-color: #24292e;
19
- color: #fff;
20
- font-size: 14px;
21
- }
22
- .github-link a {
23
- color: #fff;
24
- text-decoration: none;
25
- }
26
- .filter-group {
27
- padding: 10px;
28
- background-color: #fff;
29
- border-bottom: 1px solid #eee;
30
- text-align: center;
31
- overflow-x: auto;
32
- white-space: nowrap;
33
- }
34
- .filter-group .toggle-button {
35
- padding: 6px 12px;
36
- margin: 5px;
37
- border: 1px solid #ddd;
38
- border-radius: 15px;
39
- background-color: #fff;
40
- font-size: 13px;
41
- cursor: pointer;
42
- display: inline-block;
43
- }
44
- .filter-group .toggle-button.active {
45
- background-color: #2196f3;
46
- border-color: #2196f3;
47
- color: #fff;
48
- }
49
- .main-container {
50
- display: flex;
51
- height: calc(100vh - 100px); /* 상단 영역 제외 전체 높이 */
52
- }
53
- #sidebar {
54
- width: 25%;
55
- border-right: 1px solid #ccc;
56
- overflow-y: auto;
57
- padding: 10px;
58
- }
59
- #sidebar ul {
60
- list-style: none;
61
- padding: 0;
62
- margin: 0;
63
- }
64
- #sidebar li {
65
- margin: 5px 0;
66
- padding: 8px;
67
- background-color: #fff;
68
- border: 1px solid #ddd;
69
- border-radius: 4px;
70
- cursor: pointer;
71
- display: flex;
72
- align-items: center;
73
- justify-content: space-between;
74
- }
75
- #sidebar li:hover {
76
- background-color: #f0f0f0;
77
- }
78
- #sidebar li button {
79
- margin-left: 8px;
80
- padding: 4px 8px;
81
- cursor: pointer;
82
- font-size: 12px;
83
- border-radius: 4px;
84
- border: 1px solid #ccc;
85
- background-color: #fafafa;
86
- }
87
- #embed-container {
88
- flex: 1;
89
- padding: 0;
90
- margin: 0;
91
- background-color: #fff;
92
- }
93
- #embed-container iframe {
94
- width: 100%;
95
- height: 100%;
96
- border: none;
97
- display: block;
98
- }
99
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  </head>
101
  <body>
102
- <div class="github-link">
103
- <a href="https://discord.gg/openfreeai" target="_blank">Community</a>
104
- </div>
105
-
106
- <!-- 필터 버튼 영역 -->
107
- <div class="filter-group" id="filter-group">
108
- <!-- JavaScript로 동적으로 버튼 생성 -->
109
- </div>
110
-
111
- <div class="main-container">
112
- <div id="sidebar"></div>
113
- <div id="embed-container">
114
- <iframe id="embed-frame" src=""></iframe>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  </div>
116
- </div>
117
-
118
- <script>
119
- // 1. 프로젝트 URL 목록: 프로젝트 이름 -> URL
120
- const projectList = {
121
- "fantos/Panorama": "https://huggingface.co/spaces/fantos/Panorama",
122
- "ginigen/Multi-LoRAgen": "https://huggingface.co/spaces/ginigen/Multi-LoRAgen",
123
- "ginigen/canvas-studio": "https://huggingface.co/spaces/ginigen/canvas-studio",
124
- "ginipick/Fashion-Stylegen": "https://huggingface.co/spaces/ginipick/Fashion-Style",
125
- "ginipick/Time-Stream": "https://huggingface.co/spaces/ginipick/Time-Stream",
126
- "ginipick/AccuVision-Diffusion": "https://huggingface.co/spaces/ginipick/AccuVision-Diffusion",
127
- "fantos/Magic-Drawings": "https://huggingface.co/spaces/fantos/Magic-Drawings",
128
- "ginigen/Lumina-Image-PLUS": "https://huggingface.co/spaces/ginigen/Lumina-Image-PLUS",
129
- "fantaxy/fantasy-novel": "https://huggingface.co/spaces/fantaxy/fantasy-novel",
130
- "fantaxy/eros": "https://huggingface.co/spaces/fantaxy/eros",
131
- "fantaxy/adult-novel": "https://huggingface.co/spaces/fantaxy/adult-novel",
132
- "fantaxy/kungfu-novel": "https://huggingface.co/spaces/fantaxy/kungfu-novel",
133
- "fantaxy/love-novel": "https://huggingface.co/spaces/fantaxy/love-novel",
134
- "VIDraft/mouse-webgen": "https://huggingface.co/spaces/VIDraft/mouse-webgen",
135
- "immunobiotech/MUSIC-Jukebox": "https://huggingface.co/spaces/immunobiotech/MUSIC-Jukebox",
136
- "seawolf2357/Flowise-AI": "https://huggingface.co/spaces/seawolf2357/Flowise-AI",
137
- "ginigen/Flux-LayerDiffuse": "https://huggingface.co/spaces/ginigen/Flux-LayerDiffuse",
138
- "VIDraft/Portrait-Animation": "https://huggingface.co/spaces/VIDraft/Portrait-Animation",
139
- "VIDraft/Deepseek-Multimodal": "https://huggingface.co/spaces/VIDraft/Deepseek-Multimodal",
140
- "VIDraft/BLIP2": "https://huggingface.co/spaces/VIDraft/BLIP2",
141
- "ginigen/text3d-r1": "https://huggingface.co/spaces/ginigen/text3d-r1",
142
- "immunobiotech/drug-discovery": "https://huggingface.co/spaces/immunobiotech/drug-discovery",
143
- "openfree/VisionOCR-Chat": "https://huggingface.co/spaces/openfree/VisionOCR-Chat",
144
- "immunobiotech/MICHELIN": "https://huggingface.co/spaces/immunobiotech/MICHELIN",
145
- "immunobiotech/MICHELIN-korea": "https://huggingface.co/spaces/immunobiotech/MICHELIN-korea",
146
- "immunobiotech/MICHELIN-japan": "https://huggingface.co/spaces/immunobiotech/MICHELIN-japan",
147
- "immunobiotech/MICHELIN-china": "https://huggingface.co/spaces/immunobiotech/MICHELIN-china",
148
- "VIDraft/money-radar-korea": "https://huggingface.co/spaces/VIDraft/money-radar-korea",
149
- "VIDraft/money-radar": "https://huggingface.co/spaces/VIDraft/money-radar",
150
- "ginipick/PharmAI-Korea": "https://huggingface.co/spaces/ginipick/PharmAI-Korea",
151
- "ginigen/MagicFace-V3": "https://huggingface.co/spaces/ginigen/MagicFace-V3",
152
- "aiqcamp/MindMap": "https://huggingface.co/spaces/aiqcamp/MindMap",
153
- "ginigen/3D-LLAMA": "https://huggingface.co/spaces/ginigen/3D-LLAMA",
154
- "openfree/VectorFlow": "https://huggingface.co/spaces/openfree/VectorFlow",
155
- "openfree/webtoon-gen": "https://huggingface.co/spaces/openfree/webtoon-gen",
156
- "VIDraft/topic-prediction": "https://huggingface.co/spaces/VIDraft/topic-prediction",
157
- "VIDraft/PapersImpact": "https://huggingface.co/spaces/VIDraft/PapersImpact",
158
- "VIDraft/EveryRAG": "https://huggingface.co/spaces/VIDraft/EveryRAG",
159
- "VIDraft/korea-president-DJ": "https://huggingface.co/spaces/VIDraft/korea-president-DJ",
160
- "VIDraft/korea-president-PARK": "https://huggingface.co/spaces/VIDraft/korea-president-PARK",
161
- "openfree/image-to-vector": "https://huggingface.co/spaces/openfree/image-to-vector",
162
- "ginipick/QR-Canvas-plus": "https://huggingface.co/spaces/ginipick/QR-Canvas-plus",
163
- "ginigen/text3d-R1": "https://huggingface.co/spaces/ginigen/text3d-R1",
164
- "openfree/MagicFace-V3": "https://huggingface.co/spaces/openfree/MagicFace-V3",
165
- "ginipick/DeepSeekR1-LIVE": "https://huggingface.co/spaces/ginipick/DeepSeekR1-LIVE",
166
- "ginigen/ColPali-multi": "https://huggingface.co/spaces/ginigen/ColPali-multi",
167
- "ginigen/Janus-Pro-7B": "https://huggingface.co/spaces/ginigen/Janus-Pro-7B",
168
- "ginigen/Animagine": "https://huggingface.co/spaces/ginigen/Animagine",
169
- "openfree/PDF-RAG": "https://huggingface.co/spaces/openfree/PDF-RAG",
170
- "fantos/Ranking-Tracker": "https://huggingface.co/spaces/fantos/Ranking-Tracker",
171
- "aiqcamp/Multilingual-Images": "https://huggingface.co/spaces/aiqcamp/Multilingual-Images",
172
- "aiqcamp/Gemini2-Flash-Thinking": "https://huggingface.co/spaces/aiqcamp/Gemini2-Flash-Thinking",
173
- "openfree/pepe": "https://huggingface.co/spaces/openfree/pepe",
174
- "openfree/korea-president-yoon": "https://huggingface.co/spaces/openfree/korea-president-yoon",
175
- "openfree/CryptoVision": "https://huggingface.co/spaces/openfree/CryptoVision",
176
- "fantos/VoiceClone": "https://huggingface.co/spaces/fantos/VoiceClone",
177
- "seawolf2357/ocrlatex": "https://huggingface.co/spaces/seawolf2357/ocrlatex",
178
- "seawolf2357/img2vid": "https://huggingface.co/spaces/seawolf2357/img2vid",
179
- "seawolf2357/sd-prompt-gen": "https://huggingface.co/spaces/seawolf2357/sd-prompt-gen",
180
- "openfree/tarotcard": "https://huggingface.co/spaces/openfree/tarotcard",
181
- "aiqcamp/Polaroid": "https://huggingface.co/spaces/aiqcamp/Polaroid",
182
- "ginigen/cartoon": "https://huggingface.co/spaces/ginigen/cartoon",
183
- "ginigen/Book-Cover": "https://huggingface.co/spaces/ginigen/Book-Cover",
184
- "aiqcamp/fash": "https://huggingface.co/spaces/aiqcamp/fash",
185
- "gunship999/Korea-Daily-News": "https://huggingface.co/spaces/gunship999/Korea-Daily-News",
186
- "immunobiotech/ChicagoGallery": "https://huggingface.co/spaces/immunobiotech/ChicagoGallery",
187
- "immunobiotech/MetropolitanMuseum": "https://huggingface.co/spaces/immunobiotech/MetropolitanMuseum",
188
- "immunobiotech/opensky": "https://huggingface.co/spaces/immunobiotech/opensky",
189
- "aiqtech/FLUX-military": "https://huggingface.co/spaces/aiqtech/FLUX-military",
190
- "fantaxy/Rolls-Royce": "https://huggingface.co/spaces/fantaxy/Rolls-Royce",
191
- "seawolf2357/flux-korea-hanbok-lora": "https://huggingface.co/spaces/seawolf2357/flux-korea-hanbok-lora",
192
- "seawolf2357/flux-korea-palace-lora": "https://huggingface.co/spaces/seawolf2357/flux-korea-palace-lora",
193
- "aiqcamp/flux-cat-lora": "https://huggingface.co/spaces/aiqcamp/flux-cat-lora",
194
- "gunship999/SexyImages": "https://huggingface.co/spaces/gunship999/SexyImages",
195
- "aiqtech/flux-claude-monet-lora": "https://huggingface.co/spaces/aiqtech/flux-claude-monet-lora",
196
- "seawolf2357/3D-Avatar-Generator": "https://huggingface.co/spaces/seawolf2357/3D-Avatar-Generator",
197
- "fantaxy/playground25": "https://huggingface.co/spaces/fantaxy/playground25",
198
- "openfree/ultpixgen": "https://huggingface.co/spaces/openfree/ultpixgen",
199
- "seawolf2357/REALVISXL-V5": "https://huggingface.co/spaces/seawolf2357/REALVISXL-V5",
200
- "fantos/flxcontrol": "https://huggingface.co/spaces/fantos/flxcontrol",
201
- "fantos/textcutobject": "https://huggingface.co/spaces/fantos/textcutobject",
202
- "ginipick/FLUX-Prompt-Generator": "https://huggingface.co/spaces/ginipick/FLUX-Prompt-Generator",
203
- "fantaxy/flxloraexp": "https://huggingface.co/spaces/fantaxy/flxloraexp",
204
- "fantos/flxloraexp": "https://huggingface.co/spaces/fantos/flxloraexp",
205
- "seawolf2357/flxloraexp": "https://huggingface.co/spaces/seawolf2357/flxloraexp",
206
- "ginipick/flxloraexp": "https://huggingface.co/spaces/ginipick/flxloraexp",
207
- "aiqcamp/imagemagic": "https://huggingface.co/spaces/aiqcamp/imagemagic",
208
- "openfree/ColorRevive": "https://huggingface.co/spaces/openfree/ColorRevive",
209
- "VIDraft/RAGOndevice": "https://huggingface.co/spaces/VIDraft/RAGOndevice",
210
- "aiqcamp/AudioLlama": "https://huggingface.co/spaces/aiqcamp/AudioLlama",
211
- "ginigen/FLUXllama-Multilingual": "https://huggingface.co/spaces/ginigen/FLUXllama-Multilingual",
212
- "ginipick/FitGen": "https://huggingface.co/spaces/ginipick/FitGen",
213
- "fantaxy/FLUX-Animations": "https://huggingface.co/spaces/fantaxy/FLUX-Animations",
214
- "fantaxy/Remove-Video-Background": "https://huggingface.co/spaces/fantaxy/Remove-Video-Background",
215
- "fantaxy/ofai-flx-logo": "https://huggingface.co/spaces/fantaxy/ofai-flx-logo",
216
- "fantaxy/flx-pulid": "https://huggingface.co/spaces/fantaxy/flx-pulid",
217
- "fantaxy/flx-upscale": "https://huggingface.co/spaces/fantaxy/flx-upscale",
218
- "aiqcamp/Fashion-FLUX": "https://huggingface.co/spaces/aiqcamp/Fashion-FLUX",
219
- "fantos/x-mas": "https://huggingface.co/spaces/fantos/x-mas",
220
- "openfree/Korean-Leaderboard": "https://huggingface.co/spaces/openfree/Korean-Leaderboard",
221
- "ginipick/FLUXllama": "https://huggingface.co/spaces/ginipick/FLUXllama",
222
- "fantaxy/Sound-AI-SFX": "https://huggingface.co/spaces/fantaxy/Sound-AI-SFX",
223
- "fantos/flx8lora": "https://huggingface.co/spaces/fantos/flx8lora",
224
- "openfree/trending-board": "https://huggingface.co/spaces/openfree/trending-board",
225
- "ginipick/Realtime-FLUX": "https://huggingface.co/spaces/ginipick/Realtime-FLUX",
226
- "aiqtech/kofaceid": "https://huggingface.co/spaces/aiqtech/kofaceid",
227
- "fantaxy/fastvideogena": "https://huggingface.co/spaces/fantaxy/fastvideogen",
228
- "fantos/flxfashmodel": "https://huggingface.co/spaces/fantos/flxfashmodel",
229
- "fantos/kolcontrl": "https://huggingface.co/spaces/fantos/kolcontrl",
230
- "aiqtech/cinevid": "https://huggingface.co/spaces/aiqtech/cinevid",
231
- "aiqtech/FLUX-Ghibli-Studio-LoRA": "https://huggingface.co/spaces/aiqtech/FLUX-Ghibli-Studio-LoRA",
232
- "aiqtech/flxgif": "https://huggingface.co/spaces/aiqtech/flxgif",
233
- "aiqtech/imaginpaint": "https://huggingface.co/spaces/aiqtech/imaginpaint"
234
- };
235
-
236
- // 2. 별도 객체: 프로젝트의 개별 카테고리 지정 (없으면 기본값 "Image Gen" 사용)
237
- const customCategories = {
238
- "fantos/Panorama": "Image Gen",
239
- "ginigen/Multi-LoRAgen": "Image Gen",
240
- "ginigen/canvas-studio": "Image Edit",
241
- "ginipick/Fashion-Stylegen": "Productivity",
242
- "ginipick/Time-Stream": "Video",
243
- "ginipick/AccuVision-Diffusion": "Image Gen",
244
- "fantos/Magic-Drawings": "Image Edit",
245
- "ginigen/Lumina-Image-PLUS": "Image Gen",
246
- "fantaxy/fantasy-novel": "Text",
247
- "fantaxy/eros": "Text",
248
- "fantaxy/adult-novel": "Text",
249
- "fantaxy/kungfu-novel": "Text",
250
- "fantaxy/love-novel": "Text",
251
- "VIDraft/mouse-webgen": "Productivity",
252
- "immunobiotech/MUSIC-Jukebox": "Audio",
253
- "seawolf2357/Flowise-AI": "Productivity",
254
- "ginigen/Flux-LayerDiffuse": "Image Gen",
255
- "VIDraft/Portrait-Animation": "Video",
256
- "VIDraft/Deepseek-Multimodal": "Vision",
257
- "VIDraft/BLIP2": "Image Gen",
258
- "ginigen/text3d-r1": "Image Gen",
259
- "immunobiotech/drug-discovery": "Productivity",
260
- "openfree/VisionOCR-Chat": "Vision",
261
- "immunobiotech/MICHELIN": "Productivity",
262
- "immunobiotech/MICHELIN-korea": "Productivity",
263
- "immunobiotech/MICHELIN-japan": "Productivity",
264
- "immunobiotech/MICHELIN-china": "Productivity",
265
- "VIDraft/money-radar-korea": "Productivity",
266
- "VIDraft/money-radar": "Productivity",
267
- "ginipick/PharmAI-Korea": "Productivity",
268
- "ginigen/MagicFace-V3": "Image Gen",
269
- "aiqcamp/MindMap": "Image Gen",
270
- "ginigen/3D-LLAMA": "Productivity",
271
- "openfree/VectorFlow": "Image Edit",
272
- "openfree/webtoon-gen": "Image Gen",
273
- "VIDraft/topic-prediction": "Text",
274
- "VIDraft/PapersImpact": "Productivity",
275
- "VIDraft/EveryRAG": "Text",
276
- "VIDraft/korea-president-DJ": "Image Gen",
277
- "VIDraft/korea-president-PARK": "Image Gen",
278
- "openfree/image-to-vector": "Image Edit",
279
- "ginipick/QR-Canvas-plus": "Productivity",
280
- "ginigen/text3d-R1": "Image Gen",
281
- "openfree/MagicFace-V3": "Image Edit",
282
- "ginipick/DeepSeekR1-LIVE": "Text",
283
- "ginigen/ColPali-multi": "Text",
284
- "ginigen/Janus-Pro-7B": "Vision",
285
- "ginigen/Animagine": "Image Gen",
286
- "openfree/PDF-RAG": "Productivity",
287
- "fantos/Ranking-Tracker": "Utility",
288
- "aiqcamp/Multilingual-Images": "Image Gen",
289
- "aiqcamp/Gemini2-Flash-Thinking": "Text",
290
- "openfree/pepe": "Image Gen",
291
- "openfree/korea-president-yoon": "Image Gen",
292
- "openfree/CryptoVision": "Utility",
293
- "fantos/VoiceClone": "Audio",
294
- "seawolf2357/ocrlatex": "Utility",
295
- "seawolf2357/img2vid": "Video",
296
- "seawolf2357/sd-prompt-gen": "Text",
297
- "openfree/tarotcard": "Utility",
298
- "aiqcamp/Polaroid": "Image Gen",
299
- "ginigen/cartoon": "Image Gen",
300
- "ginigen/Book-Cover": "Image Gen",
301
- "aiqcamp/fash": "Productivity",
302
- "gunship999/Korea-Daily-News": "Utility",
303
- "immunobiotech/ChicagoGallery": "Utility",
304
- "immunobiotech/MetropolitanMuseum": "Utility",
305
- "immunobiotech/opensky": "Utility",
306
- "VIDraft/eum": "Text",
307
- "aiqtech/FLUX-military": "Image Gen",
308
- "fantaxy/Rolls-Royce": "Image Gen",
309
- "seawolf2357/flux-korea-hanbok-lora": "Image Gen",
310
- "seawolf2357/flux-korea-palace-lora": "Image Gen",
311
- "aiqcamp/flux-cat-lora": "Image Gen",
312
- "gunship999/SexyImages": "Image Gen",
313
- "aiqtech/flux-claude-monet-lora": "Image Gen",
314
- "seawolf2357/3D-Avatar-Generator": "Utility",
315
- "fantaxy/playground25": "Image Gen",
316
- "openfree/ultpixgen": "Image Gen",
317
- "seawolf2357/REALVISXL-V5": "Image Gen",
318
- "fantos/flxcontrol": "Image Edit",
319
- "fantos/textcutobject": "Image Edit",
320
- "ginipick/FLUX-Prompt-Generator": "Text",
321
- "fantaxy/flxloraexp": "Image Gen",
322
- "fantos/flxloraexp": "Image Gen",
323
- "seawolf2357/flxloraexp": "Image Gen",
324
- "ginipick/flxloraexp": "Image Gen",
325
- "aiqcamp/imagemagic": "Image Edit",
326
- "openfree/ColorRevive": "Image Edit",
327
- "VIDraft/RAGOndevice": "Productivity",
328
- "aiqcamp/AudioLlama": "Audio",
329
- "ginigen/FLUXllama-Multilingual": "Image Gen",
330
- "ginipick/FitGen": "Image Gen",
331
- "fantaxy/FLUX-Animations": "Image Gen",
332
- "fantaxy/Remove-Video-Background": "Image Edit",
333
- "fantaxy/ofai-flx-logo": "Image Gen",
334
- "fantaxy/flx-pulid": "Image Gen",
335
- "fantaxy/flx-upscale": "Image Edit",
336
- "aiqcamp/Fashion-FLUX": "Image Gen",
337
- "fantos/x-mas": "Image Gen",
338
- "openfree/Korean-Leaderboard": "Utility",
339
- "ginipick/FLUXllama": "Image Gen",
340
- "fantaxy/Sound-AI-SFX": "Audio",
341
- "fantos/flx8lora": "Image Gen",
342
- "openfree/trending-board": "Utility",
343
- "ginipick/Realtime-FLUX": "Image Gen",
344
- "aiqtech/kofaceid": "Image Gen",
345
- "fantaxy/fastvideogena": "Video",
346
- "fantos/cogvidx": "Video",
347
- "fantos/flxfashmodel": "Image Gen",
348
- "fantos/kolcontrl": "Image Edit",
349
- "aiqtech/cinevid": "Video",
350
- "aiqtech/FLUX-Ghibli-Studio-LoRA": "Image Gen",
351
- "aiqtech/flxgif": "Image Gen",
352
- "aiqtech/imaginpaint": "Image Edit"
353
-
354
-
355
- };
356
-
357
- const newProjects = [
358
- "fantos/Panorama",
359
- "ginigen/Multi-LoRAgen",
360
- "ginigen/canvas-studio",
361
- "ginipick/Fashion-Stylegen",
362
- "ginipick/Time-Stream",
363
- "ginipick/AccuVision-Diffusion",
364
- "fantos/Magic-Drawings",
365
- "ginigen/Lumina-Image-PLUS",
366
- "fantaxy/fantasy-novel",
367
- "fantaxy/eros",
368
- "fantaxy/adult-novel",
369
- "fantaxy/kungfu-novel",
370
- "fantaxy/love-novel",
371
- "VIDraft/mouse-webgen",
372
- "immunobiotech/MUSIC-Jukebox",
373
- "seawolf2357/Flowise-AI",
374
- "ginigen/Flux-LayerDiffuse",
375
- "VIDraft/Portrait-Animation",
376
- "VIDraft/Deepseek-Multimodal",
377
- "VIDraft/BLIP2",
378
- "ginigen/text3d-r1",
379
- "immunobiotech/drug-discovery",
380
- "openfree/VisionOCR-Chat",
381
- "immunobiotech/MICHELIN",
382
- "immunobiotech/MICHELIN-korea",
383
- "immunobiotech/MICHELIN-japan",
384
- "immunobiotech/MICHELIN-china",
385
- "VIDraft/money-radar-korea",
386
- "VIDraft/money-radar",
387
- "ginipick/PharmAI-Korea",
388
- "ginigen/MagicFace-V3",
389
- "aiqcamp/MindMap",
390
- "ginigen/3D-LLAMA",
391
- "openfree/VectorFlow",
392
- "openfree/webtoon-gen",
393
- "VIDraft/topic-prediction",
394
- "VIDraft/PapersImpact",
395
- "VIDraft/EveryRAG",
396
- "VIDraft/korea-president-DJ",
397
- "VIDraft/korea-president-PARK",
398
- "openfree/image-to-vector",
399
- "ginipick/QR-Canvas-plus",
400
- "openfree/MagicFace-V3",
401
- "ginipick/DeepSeekR1-LIVE",
402
- "ginigen/ColPali-multi",
403
- "ginigen/Janus-Pro-7B",
404
- "ginigen/Animagine",
405
- "openfree/PDF-RAG",
406
- "fantos/Ranking-Tracker",
407
- "aiqcamp/Multilingual-Images",
408
- "aiqcamp/Gemini2-Flash-Thinking",
409
- "openfree/pepe",
410
- "openfree/korea-president-yoon",
411
- "openfree/CryptoVision",
412
- "fantos/VoiceClone",
413
- "seawolf2357/ocrlatex",
414
- "seawolf2357/img2vid",
415
- "seawolf2357/sd-prompt-gen",
416
- "openfree/tarotcard",
417
- "aiqcamp/Polaroid",
418
- "ginigen/cartoon",
419
- "ginigen/Book-Cover"
420
- ];
421
-
422
- const bestProjects = [
423
- "openfree/VisionOCR-Chat",
424
- "ginigen/3D-LLAMA",
425
- "fantos/Ranking-Tracker",
426
- "openfree/trending-board",
427
- "openfree/Korean-Leaderboard",
428
- "fantos/Panorama",
429
- "ginigen/Multi-LoRAgen",
430
- "ginigen/canvas-studio",
431
- "fantaxy/adult-novel",
432
- "VIDraft/mouse-webgen",
433
- "ginigen/text3d-r1",
434
- "immunobiotech/MICHELIN-korea",
435
- "VIDraft/money-radar-korea",
436
- "ginipick/PharmAI-Korea",
437
- "VIDraft/PapersImpact",
438
- "aiqcamp/MindMap",
439
- "VIDraft/EveryRAG",
440
- "openfree/MagicFace-V3",
441
- "ginigen/Animagine",
442
- "openfree/PDF-RAG",
443
- "aiqcamp/Multilingual-Images",
444
- "aiqcamp/Gemini2-Flash-Thinking",
445
- "openfree/CryptoVision",
446
- "fantos/VoiceClone",
447
- "seawolf2357/ocrlatex",
448
- "ginigen/cartoon",
449
- "ginigen/Book-Cover",
450
- "aiqcamp/fash",
451
- "seawolf2357/REALVISXL-V5",
452
- "aiqcamp/AudioLlama",
453
- "ginigen/FLUXllama-Multilingual",
454
- "ginipick/FitGen"
455
- ];
456
-
457
-
458
- // 4. URL 변환 함수
459
- function transformUrl(url) {
460
- const prefix = "https://huggingface.co/spaces/";
461
- if (url.startsWith(prefix)) {
462
- const rest = url.substring(prefix.length);
463
- return "https://" + rest.replace("/", "-") + ".hf.space";
464
- }
465
- return url;
466
- }
467
-
468
- // 5. 프로젝트 배열 생성
469
- const keys = Object.keys(projectList);
470
- const projects = keys.map(key => {
471
- const primaryCategory = customCategories[key] || "Image Gen";
472
- let categories = [primaryCategory];
473
-
474
- if (newProjects.includes(key)) categories.push("NEW");
475
- if (bestProjects.includes(key)) categories.push("BEST");
476
-
477
- return {
478
- name: primaryCategory + "/" + key.split("/")[1],
479
- url: transformUrl(projectList[key]),
480
- categories: categories
481
- };
482
- });
483
-
484
- // 6. 카테고리별 그룹화
485
- const grouped = {};
486
- projects.forEach(proj => {
487
- proj.categories.forEach(cat => {
488
- if (!grouped[cat]) grouped[cat] = [];
489
- grouped[cat].push(proj);
490
- });
491
- });
492
-
493
- // 7. 필터 버튼 생성
494
- const fixedGroups = ["NEW", "BEST", "Text", "Image Gen", "Image Edit", "Audio", "Video", "Productivity", "Utility", "Vision"];
495
- const filterGroupDiv = document.getElementById("filter-group");
496
-
497
- const allButton = document.createElement("button");
498
- allButton.className = "toggle-button active";
499
- allButton.setAttribute("data-filter", "all");
500
- allButton.textContent = "All";
501
- filterGroupDiv.appendChild(allButton);
502
-
503
- fixedGroups.forEach(category => {
504
- const btn = document.createElement("button");
505
- btn.className = "toggle-button";
506
- btn.setAttribute("data-filter", category);
507
- btn.textContent = category;
508
- filterGroupDiv.appendChild(btn);
509
- });
510
-
511
- // 8. 사이드바 갱신 함수
512
- function updateSidebar(filter) {
513
- const sidebar = document.getElementById("sidebar");
514
- sidebar.innerHTML = "";
515
- let items = (filter === "all")
516
- ? projects
517
- : projects.filter(p => p.categories.includes(filter));
518
-
519
- const ul = document.createElement("ul");
520
- items.forEach(item => {
521
- const li = document.createElement("li");
522
-
523
- // 이름 표시
524
- const nameSpan = document.createElement("span");
525
- nameSpan.textContent = item.name;
526
- li.appendChild(nameSpan);
527
-
528
- // "링크 클릭" 버튼
529
- const linkButton = document.createElement("button");
530
- linkButton.textContent = "링크 클릭";
531
- linkButton.addEventListener("click", (event) => {
532
- event.stopPropagation(); // li 클릭 이벤트와 구분
533
- window.open(item.url, "_blank"); // 새 탭(창) 열기
534
- });
535
- li.appendChild(linkButton);
536
-
537
- // li 자체 클릭하면 iframe 변경
538
- li.addEventListener("click", () => {
539
- document.getElementById("embed-frame").src = item.url;
540
- });
541
-
542
- ul.appendChild(li);
543
- });
544
- sidebar.appendChild(ul);
545
-
546
- if (items.length > 0) {
547
- document.getElementById("embed-frame").src = items[0].url;
548
- } else {
549
- document.getElementById("embed-frame").src = "";
550
- }
551
- }
552
-
553
- // 9. 버튼 클릭 이벤트
554
- document.querySelectorAll(".toggle-button").forEach(button => {
555
- button.addEventListener("click", function() {
556
- document.querySelectorAll(".toggle-button").forEach(b => b.classList.remove("active"));
557
- this.classList.add("active");
558
- updateSidebar(this.getAttribute("data-filter"));
559
- });
560
- });
561
-
562
- // 10. 페이지 로드 시 All 필터
563
- updateSidebar("all");
564
- </script>
565
  </body>
566
- </html>
 
1
  <!DOCTYPE html>
2
+ <html lang="en">
3
  <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Perceptron Passive Radar</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ font-family: monospace;
13
+ }
14
+
15
+ body {
16
+ background: #001;
17
+ color: #0f8;
18
+ min-height: 100vh;
19
+ overflow: hidden;
20
+ }
21
+
22
+ .main-container {
23
+ display: grid;
24
+ grid-template-columns: 1fr 400px;
25
+ gap: 10px;
26
+ padding: 10px;
27
+ height: 100vh;
28
+ }
29
+
30
+ .radar-container {
31
+ position: relative;
32
+ border: 2px solid #0f8;
33
+ border-radius: 50%;
34
+ background: radial-gradient(circle, rgba(0,255,136,0.05) 0%, rgba(0,0,0,0.9) 100%);
35
+ overflow: hidden;
36
+ }
37
+
38
+ .sweep-line {
39
+ position: absolute;
40
+ top: 50%;
41
+ left: 50%;
42
+ width: 50%;
43
+ height: 2px;
44
+ background: linear-gradient(90deg, #0f8, transparent);
45
+ transform-origin: left;
46
+ animation: radar-sweep 4s linear infinite;
47
+ }
48
+
49
+ .grid-overlay {
50
+ position: absolute;
51
+ width: 100%;
52
+ height: 100%;
53
+ background:
54
+ linear-gradient(#0f81 1px, transparent 1px),
55
+ linear-gradient(90deg, #0f81 1px, transparent 1px);
56
+ background-size: 50px 50px;
57
+ }
58
+
59
+ @keyframes radar-sweep {
60
+ from { transform: rotate(0deg); }
61
+ to { transform: rotate(360deg); }
62
+ }
63
+
64
+ .control-panel {
65
+ display: flex;
66
+ flex-direction: column;
67
+ gap: 10px;
68
+ }
69
+
70
+ .panel {
71
+ background: rgba(0,255,136,0.1);
72
+ border: 1px solid #0f8;
73
+ padding: 10px;
74
+ }
75
+
76
+ .perceptron-layer {
77
+ display: flex;
78
+ justify-content: space-between;
79
+ align-items: center;
80
+ height: 200px;
81
+ margin: 10px 0;
82
+ position: relative;
83
+ }
84
+
85
+ .layer {
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 4px;
89
+ }
90
+
91
+ .neuron {
92
+ width: 12px;
93
+ height: 12px;
94
+ background: #0f8;
95
+ border-radius: 50%;
96
+ position: relative;
97
+ opacity: 0.3;
98
+ transition: all 0.2s;
99
+ }
100
+
101
+ .neuron.active {
102
+ opacity: 1;
103
+ box-shadow: 0 0 10px #0f8;
104
+ }
105
+
106
+ .connections {
107
+ position: absolute;
108
+ width: 100%;
109
+ height: 100%;
110
+ pointer-events: none;
111
+ }
112
+
113
+ .spectrum {
114
+ height: 120px;
115
+ display: flex;
116
+ align-items: flex-end;
117
+ gap: 2px;
118
+ }
119
+
120
+ .bar {
121
+ flex: 1;
122
+ background: #0f8;
123
+ transition: height 0.1s;
124
+ }
125
+
126
+ .signal {
127
+ position: absolute;
128
+ width: 8px;
129
+ height: 8px;
130
+ background: #0f8;
131
+ border-radius: 50%;
132
+ transform: translate(-50%, -50%);
133
+ }
134
+
135
+ .signal-echo {
136
+ position: absolute;
137
+ border: 1px solid #0f8;
138
+ border-radius: 50%;
139
+ transform: translate(-50%, -50%);
140
+ animation: echo 2s ease-out forwards;
141
+ }
142
+
143
+ @keyframes echo {
144
+ 0% {
145
+ width: 8px;
146
+ height: 8px;
147
+ opacity: 1;
148
+ }
149
+ 100% {
150
+ width: 60px;
151
+ height: 60px;
152
+ opacity: 0;
153
+ }
154
+ }
155
+
156
+ button {
157
+ background: transparent;
158
+ border: 1px solid #0f8;
159
+ color: #0f8;
160
+ padding: 8px;
161
+ cursor: pointer;
162
+ transition: 0.3s;
163
+ }
164
+
165
+ button:hover {
166
+ background: #0f8;
167
+ color: #001;
168
+ }
169
+
170
+ .stats {
171
+ font-size: 12px;
172
+ line-height: 1.5;
173
+ }
174
+
175
+ canvas {
176
+ margin-top: 10px;
177
+ border: 1px solid #0f8;
178
+ }
179
+ </style>
180
  </head>
181
  <body>
182
+ <div class="main-container">
183
+ <div class="radar-container">
184
+ <div class="grid-overlay"></div>
185
+ <div class="sweep-line"></div>
186
+ <div id="signals"></div>
187
+ </div>
188
+
189
+ <div class="control-panel">
190
+ <div class="panel">
191
+ <h3>Perceptron Network</h3>
192
+ <div class="perceptron-layer">
193
+ <canvas id="networkCanvas"></canvas>
194
+ </div>
195
+ <div class="stats" id="networkStats">
196
+ Accuracy: 0%<br>
197
+ Detections: 0<br>
198
+ Signal Strength: 0
199
+ </div>
200
+ </div>
201
+
202
+ <div class="panel">
203
+ <h3>Frequency Analysis</h3>
204
+ <div class="spectrum" id="spectrum"></div>
205
+ </div>
206
+
207
+ <div class="panel">
208
+ <button onclick="startRadar()">Start Detection</button>
209
+ <button onclick="stopRadar()">Stop</button>
210
+ <button onclick="trainPerceptrons()">Train Network</button>
211
+ <button onclick="toggleLearning()">Toggle Learning</button>
212
+ </div>
213
+ </div>
214
  </div>
215
+
216
+ <script>
217
+ class Perceptron {
218
+ constructor(inputs) {
219
+ this.weights = new Array(inputs).fill(0).map(() => Math.random() * 2 - 1);
220
+ this.bias = Math.random() * 2 - 1;
221
+ this.learningRate = 0.1;
222
+ }
223
+
224
+ activate(sum) {
225
+ return sum > 0 ? 1 : 0;
226
+ }
227
+
228
+ predict(inputs) {
229
+ const sum = inputs.reduce((sum, input, i) => sum + input * this.weights[i], 0) + this.bias;
230
+ return this.activate(sum);
231
+ }
232
+
233
+ train(inputs, target) {
234
+ const prediction = this.predict(inputs);
235
+ const error = target - prediction;
236
+
237
+ for(let i = 0; i < this.weights.length; i++) {
238
+ this.weights[i] += error * inputs[i] * this.learningRate;
239
+ }
240
+ this.bias += error * this.learningRate;
241
+
242
+ return Math.abs(error);
243
+ }
244
+ }
245
+
246
+ class PerceptronNetwork {
247
+ constructor(inputSize, hiddenSize, outputSize) {
248
+ this.inputLayer = new Array(hiddenSize)
249
+ .fill(0)
250
+ .map(() => new Perceptron(inputSize));
251
+
252
+ this.outputLayer = new Array(outputSize)
253
+ .fill(0)
254
+ .map(() => new Perceptron(hiddenSize));
255
+ }
256
+
257
+ predict(inputs) {
258
+ const hiddenOutputs = this.inputLayer.map(p => p.predict(inputs));
259
+ return this.outputLayer.map(p => p.predict(hiddenOutputs));
260
+ }
261
+
262
+ train(inputs, targets) {
263
+ const hiddenOutputs = this.inputLayer.map(p => p.predict(inputs));
264
+ const finalOutputs = this.outputLayer.map(p => p.predict(hiddenOutputs));
265
+
266
+ let error = 0;
267
+ this.outputLayer.forEach((p, i) => {
268
+ error += p.train(hiddenOutputs, targets[i]);
269
+ });
270
+ this.inputLayer.forEach(p => {
271
+ error += p.train(inputs, 1);
272
+ });
273
+
274
+ return error / (this.inputLayer.length + this.outputLayer.length);
275
+ }
276
+ }
277
+
278
+ // Initialize system
279
+ const INPUT_SIZE = 32;
280
+ const HIDDEN_SIZE = 16;
281
+ const OUTPUT_SIZE = 4;
282
+
283
+ let isRunning = false;
284
+ let isLearning = false;
285
+ let network = new PerceptronNetwork(INPUT_SIZE, HIDDEN_SIZE, OUTPUT_SIZE);
286
+ let audioContext, analyser, dataArray;
287
+
288
+ // Setup UI
289
+ const spectrum = document.getElementById('spectrum');
290
+ for(let i = 0; i < INPUT_SIZE; i++) {
291
+ const bar = document.createElement('div');
292
+ bar.className = 'bar';
293
+ spectrum.appendChild(bar);
294
+ }
295
+
296
+ // Setup canvas
297
+ const canvas = document.getElementById('networkCanvas');
298
+ canvas.width = 350;
299
+ canvas.height = 180;
300
+ const ctx = canvas.getContext('2d');
301
+
302
+ function drawNetwork(inputs, hiddenOutputs, finalOutputs) {
303
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
304
+ ctx.strokeStyle = '#0f8';
305
+ ctx.lineWidth = 0.5;
306
+
307
+ const drawLayer = (nodes, x, active) => {
308
+ const spacing = canvas.height / (nodes.length + 1);
309
+ return nodes.map((value, i) => {
310
+ const y = spacing * (i + 1);
311
+ ctx.beginPath();
312
+ ctx.arc(x, y, 4, 0, Math.PI * 2);
313
+ ctx.fillStyle = `rgba(0,255,136,${active ? value : 0.3})`;
314
+ ctx.fill();
315
+ return {x, y};
316
+ });
317
+ };
318
+
319
+ const inputNodes = drawLayer(inputs, 30, true);
320
+ const hiddenNodes = drawLayer(hiddenOutputs, canvas.width/2, true);
321
+ const outputNodes = drawLayer(finalOutputs, canvas.width - 30, true);
322
+
323
+ // Draw connections
324
+ ctx.beginPath();
325
+ inputNodes.forEach(input => {
326
+ hiddenNodes.forEach(hidden => {
327
+ ctx.moveTo(input.x, input.y);
328
+ ctx.lineTo(hidden.x, hidden.y);
329
+ });
330
+ });
331
+ hiddenNodes.forEach(hidden => {
332
+ outputNodes.forEach(output => {
333
+ ctx.moveTo(hidden.x, hidden.y);
334
+ ctx.lineTo(output.x, output.y);
335
+ });
336
+ });
337
+ ctx.stroke();
338
+ }
339
+
340
+ async function startRadar() {
341
+ try {
342
+ if(!audioContext) {
343
+ audioContext = new (window.AudioContext || window.webkitAudioContext)();
344
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
345
+ const source = audioContext.createMediaStreamSource(stream);
346
+ analyser = audioContext.createAnalyser();
347
+ analyser.fftSize = 64;
348
+ source.connect(analyser);
349
+ dataArray = new Uint8Array(analyser.frequencyBinCount);
350
+ }
351
+
352
+ isRunning = true;
353
+ updateRadar();
354
+ } catch(err) {
355
+ console.error('Error accessing microphone:', err);
356
+ }
357
+ }
358
+
359
+ function stopRadar() {
360
+ isRunning = false;
361
+ }
362
+
363
+ function updateRadar() {
364
+ if(!isRunning) return;
365
+
366
+ analyser.getByteFrequencyData(dataArray);
367
+
368
+ // Update spectrum
369
+ const bars = spectrum.children;
370
+ for(let i = 0; i < bars.length; i++) {
371
+ const height = (dataArray[i] / 255) * 120;
372
+ bars[i].style.height = height + 'px';
373
+ }
374
+
375
+ // Normalize input data
376
+ const inputs = Array.from(dataArray).map(x => x / 255);
377
+
378
+ // Get network predictions
379
+ const hiddenOutputs = network.inputLayer.map(p => p.predict(inputs));
380
+ const outputs = network.outputLayer.map(p => p.predict(hiddenOutputs));
381
+
382
+ // Draw network state
383
+ drawNetwork(inputs, hiddenOutputs, outputs);
384
+
385
+ // Create signals for strong predictions
386
+ outputs.forEach((output, i) => {
387
+ if(output > 0.7) {
388
+ createSignal(i);
389
+ }
390
+ });
391
+
392
+ // Update stats
393
+ const avgOutput = outputs.reduce((a,b) => a+b) / outputs.length;
394
+ document.getElementById('networkStats').innerHTML =
395
+ `Accuracy: ${Math.round(avgOutput * 100)}%<br>` +
396
+ `Detections: ${outputs.filter(x => x > 0.7).length}<br>` +
397
+ `Signal Strength: ${Math.round(inputs.reduce((a,b) => a+b) / inputs.length * 100)}`;
398
+
399
+ if(isLearning) {
400
+ const target = Array(OUTPUT_SIZE).fill(0);
401
+ target[Math.floor(Math.random() * OUTPUT_SIZE)] = 1;
402
+ network.train(inputs, target);
403
+ }
404
+
405
+ requestAnimationFrame(updateRadar);
406
+ }
407
+
408
+ function createSignal(type) {
409
+ const radar = document.querySelector('.radar-container');
410
+ const angle = Math.random() * Math.PI * 2;
411
+ const distance = Math.random() * (radar.offsetWidth / 3);
412
+
413
+ const x = Math.cos(angle) * distance + radar.offsetWidth / 2;
414
+ const y = Math.sin(angle) * distance + radar.offsetHeight / 2;
415
+
416
+ const signal = document.createElement('div');
417
+ signal.className = 'signal';
418
+ signal.style.left = x + 'px';
419
+ signal.style.top = y + 'px';
420
+ radar.appendChild(signal);
421
+
422
+ const echo = document.createElement('div');
423
+ echo.className = 'signal-echo';
424
+ echo.style.left = x + 'px';
425
+ echo.style.top = y + 'px';
426
+ radar.appendChild(echo);
427
+
428
+ setTimeout(() => {
429
+ signal.remove();
430
+ echo.remove();
431
+ }, 2000);
432
+ }
433
+
434
+ function trainPerceptrons() {
435
+ let error = 0;
436
+ for(let i = 0; i < 100; i++) {
437
+ const inputs = Array(INPUT_SIZE).fill(0).map(() => Math.random());
438
+ const targets = Array(OUTPUT_SIZE).fill(0);
439
+ targets[Math.floor(Math.random() * OUTPUT_SIZE)] = 1;
440
+ error += network.train(inputs, targets);
441
+ }
442
+ document.getElementById('networkStats').innerHTML =
443
+ `Training complete<br>Error: ${Math.round(error * 100) / 100}<br>Network ready`;
444
+ }
445
+
446
+ function toggleLearning() {
447
+ isLearning = !isLearning;
448
+ }
449
+ </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
  </body>
451
+ </html>