-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrepomix-output.xml
More file actions
3654 lines (3186 loc) · 166 KB
/
repomix-output.xml
File metadata and controls
3654 lines (3186 loc) · 166 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
This file is a merged representation of the entire codebase, combined into a single document by Repomix.
<file_summary>
This section contains a summary of this file.
<purpose>
This file contains a packed representation of the entire repository's contents.
It is designed to be easily consumable by AI systems for analysis, code review,
or other automated processes.
</purpose>
<file_format>
The content is organized as follows:
1. This summary section
2. Repository information
3. Directory structure
4. Repository files (if enabled)
4. Repository files, each consisting of:
- File path as an attribute
- Full contents of the file
</file_format>
<usage_guidelines>
- This file should be treated as read-only. Any changes should be made to the
original repository files, not this packed version.
- When processing this file, use the file path to distinguish
between different files in the repository.
- Be aware that this file may contain sensitive information. Handle it with
the same level of security as you would the original repository.
</usage_guidelines>
<notes>
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
- Files matching patterns in .gitignore are excluded
- Files matching default ignore patterns are excluded
- Files are sorted by Git change count (files with more changes are at the bottom)
</notes>
<additional_info>
</additional_info>
</file_summary>
<directory_structure>
.claude/
settings.local.json
public/
gin.svg
kin.svg
tsc-horizontal.svg
vite.svg
scripts/
generate-news.js
src/
assets/
react.svg
components/
common/
Logo.tsx
NewsCard.tsx
SectionTitle.tsx
Sponsors.tsx
home/
GridItem.tsx
PrizeItem.tsx
WinnerItem.tsx
layout/
Footer.tsx
Layout.tsx
Navigation.tsx
index.js
content/
news/
2025-entry-start.md
2025-site-open.md
data/
newsData.ts
siteContent.js
hooks/
useNews.ts
pages/
2024/
Gallery.tsx
Results.tsx
2025/
FAQ.tsx
Home.tsx
News.tsx
NewsDetail.tsx
Schedule.tsx
styles/
news.css
tailwind.css
utils/
markdoc.ts
App.tsx
main.tsx
.gitignore
CLAUDE.md
eslint.config.js
index.html
MAINTENANCE_GUIDE.md
OPERATION_PROPOSAL.md
package.json
README.md
tailwind.config.js
tsconfig.json
tsconfig.node.json
vite.config.ts
</directory_structure>
<files>
This section contains the contents of the repository's files.
<file path="public/gin.svg">
<svg id="SvgjsSvg1708" width="288" height="288" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs"><defs id="SvgjsDefs1709"></defs><g id="SvgjsG1710"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 173.456" width="288" height="288"><path d="M4843.032,1680.193l-51.9-94.872-51.9,94.878-48.1-72.563v151.142h200V1607.636Zm-27.5,61.662h-49.2v-44.4H4799.6v-14.274h-33.668v-15.8h49.472v45.887h-33.273v12.8h33.415Z" transform="translate(-4691.135 -1585.321)" fill="#dcdbdb" class="svgShape color000000-0 selectable"></path></svg></g></svg>
</file>
<file path="public/kin.svg">
<svg id="SvgjsSvg1698" width="288" height="288" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs"><defs id="SvgjsDefs1699"></defs><g id="SvgjsG1700"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 173.451" width="288" height="288"><path d="M3392.782,1720.335l-51.9-94.869-51.9,94.875L3240.9,1647.78v151.137h200V1647.78Zm-36.151,61.727h-22.124V1729.57h-10.215v-22.124h32.339Z" transform="translate(-3240.899 -1625.466)" fill="#e6e42f" class="svgShape color000000-0 selectable"></path></svg></g></svg>
</file>
<file path="public/tsc-horizontal.svg">
<svg id="SvgjsSvg1001" width="288" height="288" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs"><defs id="SvgjsDefs1002"></defs><g id="SvgjsG1008"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3259.843 1133.858" width="288" height="288"><polygon fill="#181818" points="955.158 567.919 954.512 568.564 954.512 567.919 955.158 567.919" class="svgShape color181818-0 selectable"></polygon><polygon fill="#181818" points="954.512 961.74 955.158 966.233 954.512 964.309 954.512 961.74" class="svgShape color181818-1 selectable"></polygon><polygon fill="#181818" points="954.512 964.309 955.158 966.233 954.512 965.17 954.512 964.309" class="svgShape color181818-2 selectable"></polygon><polygon fill="#181818" points="954.512 965.17 955.158 966.233 954.512 965.601 954.512 965.17" class="svgShape color181818-3 selectable"></polygon><polygon fill="#181818" points="955.158 567.919 954.512 567.919 954.512 567.273 955.158 567.919" class="svgShape color181818-4 selectable"></polygon><polygon fill="#181818" points="955.158 966.233 954.512 966.233 954.512 966.153 955.158 966.233" class="svgShape color181818-5 selectable"></polygon><polygon fill="#181818" points="955.158 966.233 954.512 966.153 954.512 966.018 955.158 966.233" class="svgShape color181818-6 selectable"></polygon><polygon fill="#181818" points="955.158 966.233 954.512 966.018 954.512 965.857 955.158 966.233" class="svgShape color181818-7 selectable"></polygon><polygon fill="#181818" points="955.158 966.233 954.512 965.857 954.512 965.601 955.158 966.233" class="svgShape color181818-8 selectable"></polygon><polygon fill="#181818" points="954.512 966.153 954.512 966.233 555.525 966.233 605.573 916.346 954.512 966.153" class="svgShape color181818-9 selectable"></polygon><polygon fill="#303030" points="954.512 966.018 954.512 966.153 605.573 916.346 655.608 866.5 954.512 966.018" class="svgShape color303030-10 selectable"></polygon><polygon fill="#474747" points="954.512 965.857 954.512 966.018 655.608 866.5 705.535 816.721 954.512 965.857" class="svgShape color474747-11 selectable"></polygon><polygon fill="#5f5f5f" points="954.512 965.601 954.512 965.857 705.535 816.721 755.516 766.915 954.512 965.601" class="svgShape color5f5f5f-12 selectable"></polygon><polygon fill="#777777" points="954.512 965.17 954.512 965.601 755.516 766.915 805.161 717.431 954.512 965.17" class="svgShape color777777-13 selectable"></polygon><polygon fill="#8f8f8f" points="954.512 964.309 954.512 965.17 805.161 717.431 855.169 667.571 954.512 964.309" class="svgShape color8f8f8f-14 selectable"></polygon><polygon fill="#a7a7a7" points="954.512 961.74 954.512 964.309 855.169 667.571 905.298 617.617 954.512 961.74" class="svgShape colora7a7a7-15 selectable"></polygon><polygon fill="#bebebe" points="954.512 568.564 954.512 961.74 905.298 617.617 954.512 568.564" class="svgShape colorbebebe-16 selectable"></polygon><polygon fill="#e4e4e4" points="954.512 567.919 954.512 568.564 905.298 617.617 898.181 567.865 954.512 567.919" class="svgShape colore4e4e4-17 selectable"></polygon><polygon fill="#d6d6d6" points="954.512 567.273 954.512 567.919 898.181 567.865 888.682 501.43 954.512 567.273" class="svgShape colord6d6d6-18 selectable"></polygon><polygon fill="#bebebe" points="954.512 167.626 954.512 567.273 888.682 501.43 855.142 266.983 954.512 167.626" class="svgShape colorbebebe-19 selectable"></polygon><polygon fill="#181818" points="954.512 167.626 855.142 266.983 621.22 233.967 555.525 168.259 555.525 167.936 954.512 167.626" class="svgShape color181818-20 selectable"></polygon><polygon fill="#e0e0e0" points="898.181 567.865 905.298 617.617 855.169 667.571 831.921 598.109 854.644 567.838 898.181 567.865" class="svgShape colore0e0e0-21 selectable"></polygon><polygon fill="#cbcaca" points="888.682 501.43 898.181 567.865 854.644 567.838 795.205 488.433 754.695 367.443 888.682 501.43" class="svgShape colorcbcaca-22 selectable"></polygon><polygon fill="#a7a7a7" points="855.142 266.983 888.682 501.43 754.695 367.443 855.142 266.983" class="svgShape colora7a7a7-23 selectable"></polygon><polygon fill="#dbdbdb" points="831.921 598.109 855.169 667.571 805.161 717.431 777.177 671.015 831.921 598.109" class="svgShape colordbdbdb-24 selectable"></polygon><polygon fill="#303030" points="855.142 266.983 754.695 367.443 621.22 233.967 855.142 266.983" class="svgShape color303030-25 selectable"></polygon><polygon fill="#c3c3c3" points="795.205 488.433 854.644 567.838 821.776 567.811 795.205 488.433" class="svgShape colorc3c3c3-26 selectable"></polygon><polygon fill="#d9d9d9" points="854.644 567.838 831.921 598.109 821.776 567.811 854.644 567.838" class="svgShape colord9d9d9-27 selectable"></polygon><polygon fill="#d2d1d1" points="821.776 567.811 831.921 598.109 777.177 671.015 736.748 603.962 754.776 567.919 754.695 567.757 821.776 567.811" class="svgShape colord2d1d1-28 selectable"></polygon><polygon fill="#b5b5b5" points="795.205 488.433 821.776 567.811 754.695 567.757 688.058 434.08 726.066 396.073 795.205 488.433" class="svgShape colorb5b5b5-29 selectable"></polygon><polygon fill="#d6d6d6" points="777.177 671.015 805.161 717.431 755.516 766.915 726.738 738.191 777.177 671.015" class="svgShape colord6d6d6-30 selectable"></polygon><polygon fill="#bfbebe" points="754.695 367.443 795.205 488.433 726.066 396.073 754.695 367.443" class="svgShape colorbfbebe-31 selectable"></polygon><polygon fill="#cacaca" points="736.748 603.962 777.177 671.015 726.738 738.191 688.637 700.143 736.748 603.962" class="svgShape colorcacaca-32 selectable"></polygon><polygon fill="#d1d1d1" points="755.516 766.915 705.535 816.721 679.502 801.114 726.738 738.191 755.516 766.915" class="svgShape colord1d1d1-33 selectable"></polygon><polygon fill="#c8c8c8" points="754.695 567.757 754.776 567.919 736.748 603.962 714.899 567.717 754.695 567.757" class="svgShape colorc8c8c8-34 selectable"></polygon><polygon fill="#9b9a9a" points="754.695 367.443 726.066 396.073 688.032 345.271 754.695 367.443" class="svgShape color9b9a9a-35 selectable"></polygon><polygon fill="#acabab" points="688.058 434.08 754.695 567.757 714.899 567.717 654.545 467.593 688.058 434.08" class="svgShape coloracabab-36 selectable"></polygon><polygon fill="#8f8f8f" points="754.695 367.443 688.032 345.271 602.761 231.357 621.22 233.967 754.695 367.443" class="svgShape color8f8f8f-37 selectable"></polygon><polygon fill="#bebebe" points="714.899 567.717 736.748 603.962 688.637 700.143 635.292 646.879 655.07 567.663 714.899 567.717" class="svgShape colorbebebe-38 selectable"></polygon><polygon fill="#c3c3c3" points="726.738 738.191 679.502 801.114 647.67 782.05 688.637 700.143 726.738 738.191" class="svgShape colorc3c3c3-39 selectable"></polygon><polygon fill="#8a8a8a" points="688.032 345.271 726.066 396.073 688.058 434.08 634.97 327.619 688.032 345.271" class="svgShape color8a8a8a-40 selectable"></polygon><polygon fill="#9b9b9b" points="654.545 467.593 714.899 567.717 655.07 567.663 634.996 487.128 654.545 467.593" class="svgShape color9b9b9b-41 selectable"></polygon><polygon fill="#cdcdcd" points="705.535 816.721 655.608 866.5 635.454 859.786 679.502 801.114 705.535 816.721" class="svgShape colorcdcdcd-42 selectable"></polygon><polygon fill="#b5b5b5" points="688.637 700.143 647.67 782.05 607.537 758.008 635.292 646.879 688.637 700.143" class="svgShape colorb5b5b5-43 selectable"></polygon><polygon fill="#797979" points="634.97 327.619 688.058 434.08 654.545 467.593 625.834 450.372 591.648 313.21 634.97 327.619" class="svgShape color797979-44 selectable"></polygon><polygon fill="#7c7c7c" points="602.761 231.357 688.032 345.271 634.97 327.619 585.782 228.962 602.761 231.357" class="svgShape color7c7c7c-45 selectable"></polygon><polygon fill="#bcbcbc" points="679.502 801.114 635.454 859.786 612.582 852.172 647.67 782.05 679.502 801.114" class="svgShape colorbcbcbc-46 selectable"></polygon><polygon fill="#c8c8c8" points="655.608 866.5 605.573 916.346 594.204 914.732 635.454 859.786 655.608 866.5" class="svgShape colorc8c8c8-47 selectable"></polygon><polygon fill="#8f8f8f" points="634.996 487.128 655.07 567.663 555.861 567.582 555.525 567.246 555.525 566.614 634.996 487.128" class="svgShape color8f8f8f-48 selectable"></polygon><polygon fill="#838383" points="655.07 567.663 635.292 646.879 555.861 567.582 655.07 567.663" class="svgShape color838383-49 selectable"></polygon><polygon fill="#8a8a8a" points="654.545 467.593 634.996 487.128 625.834 450.372 654.545 467.593" class="svgShape color8a8a8a-50 selectable"></polygon><polygon fill="#ababab" points="647.67 782.05 612.582 852.172 586.213 843.386 607.537 758.008 647.67 782.05" class="svgShape colorababab-51 selectable"></polygon><polygon fill="#b5b5b5" points="635.454 859.786 594.204 914.732 582.15 913.01 612.582 852.172 635.454 859.786" class="svgShape colorb5b5b5-52 selectable"></polygon><polygon fill="#6d6d6d" points="635.292 646.879 607.537 758.008 555.525 726.862 555.525 567.582 555.861 567.582 635.292 646.879" class="svgShape color6d6d6d-53 selectable"></polygon><polygon fill="#7c7c7c" points="625.834 450.372 634.996 487.128 555.525 566.614 555.525 408.154 625.834 450.372" class="svgShape color7c7c7c-54 selectable"></polygon><polygon fill="#696969" points="585.782 228.962 634.97 327.619 591.648 313.21 570.109 226.742 585.782 228.962" class="svgShape color696969-55 selectable"></polygon><polygon fill="#686868" points="591.648 313.21 625.834 450.372 555.525 408.154 555.525 301.196 591.648 313.21" class="svgShape color686868-56 selectable"></polygon><polygon fill="#838383" points="555.525 168.259 621.22 233.967 602.761 231.357 555.525 168.259" class="svgShape color838383-57 selectable"></polygon><polygon fill="#a2a2a2" points="612.582 852.172 582.15 913.01 569.288 911.167 586.213 843.386 612.582 852.172" class="svgShape colora2a2a2-58 selectable"></polygon><polygon fill="#585858" points="607.537 758.008 586.213 843.386 555.525 833.175 555.525 726.862 607.537 758.008" class="svgShape color585858-59 selectable"></polygon><polygon fill="#c3c3c3" points="605.573 916.346 555.525 966.233 594.204 914.732 605.573 916.346" class="svgShape colorc3c3c3-60 selectable"></polygon><polygon fill="#6e6e6e" points="555.525 168.259 602.761 231.357 585.782 228.962 555.525 168.259" class="svgShape color6e6e6e-61 selectable"></polygon><polygon fill="#aeaeae" points="594.204 914.732 555.525 966.233 582.15 913.01 594.204 914.732" class="svgShape coloraeaeae-62 selectable"></polygon><polygon fill="#565656" points="570.109 226.742 591.648 313.21 555.525 301.196 555.525 224.684 570.109 226.742" class="svgShape color565656-63 selectable"></polygon><polygon fill="#434343" points="586.213 843.386 569.288 911.167 555.525 909.202 555.525 833.175 586.213 843.386" class="svgShape color434343-64 selectable"></polygon><polygon fill="#585858" points="555.525 168.259 585.782 228.962 570.109 226.742 555.525 168.259" class="svgShape color585858-65 selectable"></polygon><polygon fill="#989898" points="582.15 913.01 555.525 966.233 569.288 911.167 582.15 913.01" class="svgShape color989898-66 selectable"></polygon><polygon fill="#434343" points="555.525 168.259 570.109 226.742 555.525 224.684 555.525 168.259" class="svgShape color434343-67 selectable"></polygon><polygon fill="#2d2d2d" points="569.288 911.167 555.525 966.233 555.525 909.202 569.288 911.167" class="svgShape color2d2d2d-68 selectable"></polygon><polygon fill="#181818" points="555.861 567.582 555.525 567.582 555.525 567.246 555.861 567.582" class="svgShape color181818-69 selectable"></polygon><polygon fill="#434343" points="555.525 909.202 555.525 966.233 540.739 907.104 555.525 909.202" class="svgShape color434343-70 selectable"></polygon><polygon fill="#565656" points="555.525 833.175 555.525 909.202 540.739 907.104 519.213 821.08 555.525 833.175" class="svgShape color565656-71 selectable"></polygon><polygon fill="#686868" points="555.525 726.862 555.525 833.175 519.213 821.08 485.094 684.671 555.525 726.862" class="svgShape color686868-72 selectable"></polygon><polygon fill="#7c7c7c" points="555.525 567.582 555.525 726.862 485.094 684.671 475.568 646.57 554.556 567.582 555.525 567.582" class="svgShape color7c7c7c-73 selectable"></polygon><polygon fill="#181818" points="555.525 567.246 555.525 567.582 554.556 567.582 555.202 566.923 555.525 567.246" class="svgShape color181818-74 selectable"></polygon><polygon fill="#181818" points="555.525 566.614 555.525 567.246 555.202 566.923 555.525 566.614" class="svgShape color181818-75 selectable"></polygon><polygon fill="#6d6d6d" points="555.525 408.154 555.525 566.614 555.202 566.923 475.743 487.599 503.404 376.874 555.525 408.154" class="svgShape color6d6d6d-76 selectable"></polygon><polygon fill="#585858" points="555.525 301.196 555.525 408.154 503.404 376.874 524.863 290.998 555.525 301.196" class="svgShape color585858-77 selectable"></polygon><polygon fill="#434343" points="555.525 224.684 555.525 301.196 524.863 290.998 541.909 222.76 555.525 224.684" class="svgShape color434343-78 selectable"></polygon><polygon fill="#2d2d2d" points="555.525 168.259 555.525 224.684 541.909 222.76 555.525 168.259" class="svgShape color2d2d2d-79 selectable"></polygon><polygon fill="#181818" points="555.525 167.936 555.525 168.259 506.014 217.701 155.891 168.259 555.525 167.936" class="svgShape color181818-80 selectable"></polygon><polygon fill="#989898" points="555.525 168.259 541.909 222.76 529.142 220.957 555.525 168.259" class="svgShape color989898-81 selectable"></polygon><polygon fill="#aeaeae" points="555.525 168.259 529.142 220.957 517.289 219.289 555.525 168.259" class="svgShape coloraeaeae-82 selectable"></polygon><polygon fill="#c3c3c3" points="555.525 168.259 517.289 219.289 506.014 217.701 555.525 168.259" class="svgShape colorc3c3c3-83 selectable"></polygon><polygon fill="#585858" points="540.739 907.104 555.525 966.233 524.742 904.817 540.739 907.104" class="svgShape color585858-84 selectable"></polygon><polygon fill="#6e6e6e" points="524.742 904.817 555.525 966.233 507.656 902.381 524.742 904.817" class="svgShape color6e6e6e-85 selectable"></polygon><polygon fill="#838383" points="507.656 902.381 555.525 966.233 488.874 899.704 507.656 902.381" class="svgShape color838383-86 selectable"></polygon><polygon fill="#181818" points="555.525 966.233 155.891 966.233 255.706 866.419 488.874 899.704 555.525 966.233" class="svgShape color181818-87 selectable"></polygon><polygon fill="#838383" points="555.202 566.923 554.556 567.582 455.778 567.502 475.743 487.599 555.202 566.923" class="svgShape color838383-88 selectable"></polygon><polygon fill="#8f8f8f" points="554.556 567.582 475.568 646.57 455.778 567.502 554.556 567.582" class="svgShape color8f8f8f-89 selectable"></polygon><polygon fill="#a2a2a2" points="541.909 222.76 524.863 290.998 498.467 282.213 529.142 220.957 541.909 222.76" class="svgShape colora2a2a2-90 selectable"></polygon><polygon fill="#696969" points="519.213 821.08 540.739 907.104 524.742 904.817 475.488 806.523 519.213 821.08" class="svgShape color696969-91 selectable"></polygon><polygon fill="#b5b5b5" points="529.142 220.957 498.467 282.213 475.797 274.665 517.289 219.289 529.142 220.957" class="svgShape colorb5b5b5-92 selectable"></polygon><polygon fill="#ababab" points="524.863 290.998 503.404 376.874 463.164 352.711 498.467 282.213 524.863 290.998" class="svgShape colorababab-93 selectable"></polygon><polygon fill="#7c7c7c" points="475.488 806.523 524.742 904.817 507.656 902.381 422.601 788.912 475.488 806.523" class="svgShape color7c7c7c-94 selectable"></polygon><polygon fill="#797979" points="485.094 684.671 519.213 821.08 475.488 806.523 422.116 700.022 455.307 666.831 485.094 684.671" class="svgShape color797979-95 selectable"></polygon><polygon fill="#c8c8c8" points="517.289 219.289 475.797 274.665 455.657 267.978 506.014 217.701 517.289 219.289" class="svgShape colorc8c8c8-96 selectable"></polygon><polygon fill="#8f8f8f" points="422.601 788.912 507.656 902.381 488.874 899.704 355.547 766.578 422.601 788.912" class="svgShape color8f8f8f-97 selectable"></polygon><polygon fill="#303030" points="506.014 217.701 455.657 267.978 155.891 168.259 506.014 217.701" class="svgShape color303030-98 selectable"></polygon><polygon fill="#b5b5b5" points="503.404 376.874 475.743 487.599 422.331 434.268 463.164 352.711 503.404 376.874" class="svgShape colorb5b5b5-99 selectable"></polygon><polygon fill="#bcbcbc" points="498.467 282.213 463.164 352.711 431.547 333.727 475.797 274.665 498.467 282.213" class="svgShape colorbcbcbc-100 selectable"></polygon><polygon fill="#303030" points="488.874 899.704 255.706 866.419 355.547 766.578 488.874 899.704" class="svgShape color303030-101 selectable"></polygon><polygon fill="#8a8a8a" points="475.568 646.57 485.094 684.671 455.307 666.831 475.568 646.57" class="svgShape color8a8a8a-102 selectable"></polygon><polygon fill="#cdcdcd" points="475.797 274.665 431.547 333.727 405.474 318.081 455.657 267.978 475.797 274.665" class="svgShape colorcdcdcd-103 selectable"></polygon><polygon fill="#bebebe" points="475.743 487.599 455.778 567.502 395.626 567.448 373.83 531.149 422.331 434.268 475.743 487.599" class="svgShape colorbebebe-104 selectable"></polygon><polygon fill="#9b9b9b" points="455.778 567.502 475.568 646.57 455.307 666.831 395.626 567.448 455.778 567.502" class="svgShape color9b9b9b-105 selectable"></polygon><polygon fill="#8a8a8a" points="422.116 700.022 475.488 806.523 422.601 788.912 384.311 737.827 422.116 700.022" class="svgShape color8a8a8a-106 selectable"></polygon><polygon fill="#c3c3c3" points="463.164 352.711 422.331 434.268 384.513 396.503 431.547 333.727 463.164 352.711" class="svgShape colorc3c3c3-107 selectable"></polygon><polygon fill="#474747" points="455.657 267.978 405.474 318.081 155.891 168.259 455.657 267.978" class="svgShape color474747-108 selectable"></polygon><polygon fill="#acabab" points="395.626 567.448 455.307 666.831 422.116 700.022 355.668 567.421 395.626 567.448" class="svgShape coloracabab-109 selectable"></polygon><polygon fill="#d1d1d1" points="431.547 333.727 384.513 396.503 355.708 367.752 405.474 318.081 431.547 333.727" class="svgShape colord1d1d1-110 selectable"></polygon><polygon fill="#9b9a9a" points="384.311 737.827 422.601 788.912 355.547 766.578 384.311 737.827" class="svgShape color9b9a9a-111 selectable"></polygon><polygon fill="#cacaca" points="422.331 434.268 373.83 531.149 333.698 464.324 384.513 396.503 422.331 434.268" class="svgShape colorcacaca-112 selectable"></polygon><polygon fill="#b5b5b5" points="355.668 567.421 422.116 700.022 384.311 737.827 315.185 645.615 289.071 567.367 355.668 567.421" class="svgShape colorb5b5b5-113 selectable"></polygon><polygon fill="#5f5f5f" points="405.474 318.081 355.708 367.752 155.891 168.259 405.474 318.081" class="svgShape color5f5f5f-114 selectable"></polygon><polygon fill="#c8c8c8" points="373.83 531.149 395.626 567.448 355.668 567.421 373.83 531.149" class="svgShape colorc8c8c8-115 selectable"></polygon><polygon fill="#d6d6d6" points="384.513 396.503 333.698 464.324 305.687 417.693 355.708 367.752 384.513 396.503" class="svgShape colord6d6d6-116 selectable"></polygon><polygon fill="#bfbebe" points="315.185 645.615 384.311 737.827 355.547 766.578 315.185 645.615" class="svgShape colorbfbebe-117 selectable"></polygon><polygon fill="#d2d1d1" points="333.698 464.324 373.83 531.149 355.668 567.421 289.071 567.367 279.035 537.271 333.698 464.324" class="svgShape colord2d1d1-118 selectable"></polygon><polygon fill="#777777" points="355.708 367.752 305.687 417.693 155.891 168.259 355.708 367.752" class="svgShape color777777-119 selectable"></polygon><polygon fill="#cbcaca" points="315.185 645.615 355.547 766.578 222.434 633.681 212.949 567.3 256.499 567.34 315.185 645.615" class="svgShape colorcbcaca-120 selectable"></polygon><polygon fill="#a7a7a7" points="355.547 766.578 255.706 866.419 222.434 633.681 355.547 766.578" class="svgShape colora7a7a7-121 selectable"></polygon><polygon fill="#dbdbdb" points="305.687 417.693 333.698 464.324 279.035 537.271 255.759 467.539 305.687 417.693" class="svgShape colordbdbdb-122 selectable"></polygon><polygon fill="#c3c3c3" points="289.071 567.367 315.185 645.615 256.499 567.34 289.071 567.367" class="svgShape colorc3c3c3-123 selectable"></polygon><polygon fill="#8f8f8f" points="155.891 168.259 305.687 417.693 255.759 467.539 155.891 168.259" class="svgShape color8f8f8f-124 selectable"></polygon><polygon fill="#d9d9d9" points="279.035 537.271 289.071 567.367 256.499 567.34 279.035 537.271" class="svgShape colord9d9d9-125 selectable"></polygon><polygon fill="#e0e0e0" points="255.759 467.539 279.035 537.271 256.499 567.34 212.949 567.3 205.819 517.413 255.759 467.539" class="svgShape colore0e0e0-126 selectable"></polygon><polygon fill="#a7a7a7" points="155.891 168.259 255.759 467.539 205.819 517.413 155.891 168.259" class="svgShape colora7a7a7-127 selectable"></polygon><polygon fill="#bebebe" points="222.434 633.681 255.706 866.419 155.891 966.233 155.891 567.246 222.434 633.681" class="svgShape colorbebebe-128 selectable"></polygon><polygon fill="#d6d6d6" points="212.949 567.3 222.434 633.681 155.891 567.246 212.949 567.3" class="svgShape colord6d6d6-129 selectable"></polygon><polygon fill="#e4e4e4" points="205.819 517.413 212.949 567.3 155.891 567.246 205.819 517.413" class="svgShape colore4e4e4-130 selectable"></polygon><polygon fill="#bebebe" points="155.891 168.259 205.819 517.413 155.891 567.246 155.891 168.259" class="svgShape colorbebebe-131 selectable"></polygon><path d="M1129.11273 245.43079h-41.30078v-51.45117h151.90234v51.45117h-40.9502v232.05371h-69.65137v-232.05371zM1250.91253 417.28333v-81.90137c0-40.60059 30.45117-64.05078 73.15137-64.05078 43.05078 0 70.35156 20.65039 70.35156 61.60059v47.60059h-81.55176v38.50098c0 13.30078 5.25 17.85059 11.2002 17.85059s12.9502-2.4502 12.9502-15.75v-24.15039h57.40137v23.4502c0 40.9502-28 60.90039-70.35156 60.90039-42.7002 0-73.15137-23.4502-73.15137-64.05078zM1337.01409 352.18275v-20.65039c0-13.65039-7-15.75098-12.9502-15.75098-5.59961 0-11.2002 3.85059-11.2002 17.50098v18.90039h24.15039zM1420.31097 417.28333v-82.25098c0-40.60059 30.45117-63.70117 73.15137-63.70117s72.10156 19.59961 72.10156 60.20117v24.15039h-61.25098v-26.25098c0-13.2998-4.90039-15.75-10.85059-15.75-5.59961 0-10.14941 4.2002-10.14941 17.5v89.95215c0 13.2998 4.5498 17.5 10.14941 17.5 5.9502 0 10.85059-2.4502 10.85059-15.75v-29.75098h61.25098v27.65039c0 40.60059-29.75 60.55078-72.10156 60.55078-42.7002 0-73.15137-23.4502-73.15137-64.05078zM1594.25531 193.97962h62.65137v98.35156c15.40039-15.75 31.50098-21 49.00098-21 24.5 0 39.2002 19.9502 39.2002 49.00098v157.15234h-62.30078v-149.80273c0-8.40039-2.4502-12.59961-10.15039-12.59961-3.84961 0-9.4502 1.75-15.75 5.59961v156.80273h-62.65137V193.97962zM1777.30609 420.08314h58.80176v57.40137h-58.80176v-57.40137zM1099.36175 809.98255l58.80176-7.69922c.34961 38.5 9.09961 47.25 20.2998 47.25 10.85059 0 11.55078-10.5 11.55078-16.7998 0-23.10059-11.55078-37.10059-31.50098-53.90137l-17.85059-15.0498c-22.40039-18.90039-41.30078-41.30078-41.30078-77.35156 0-49.70117 32.20117-76.65137 83.30176-76.65137 65.10156 0 70.00098 54.25098 70.35156 82.60156l-60.20117 5.9502c0-24.50098-.34961-38.50098-12.60059-38.50098-9.4502 0-12.9502 12.9502-12.9502 19.60059 0 22.0498 12.60059 33.60059 30.10059 49.00098l16.4502 14.34961c25.20117 21.70117 44.80078 46.55078 44.80078 86.80176 0 39.55078-29.0498 72.45117-75.95117 72.45117-54.95117 0-81.55078-24.85059-83.30176-92.05176zM1283.80706 852.33412v-157.15332h62.65137v151.90332c0 8.39941 3.14941 12.9502 10.5 12.9502 3.84961 0 8.40039-1.75098 14-4.55078v-160.30273h62.65137v202.30371h-62.65137v-18.2002c-15.0498 14-30.80078 22.0498-47.60059 22.0498-24.85059 0-39.55078-19.9502-39.55078-49zM1468.60296 695.18079h62.30176v15.40039c15.0498-14.35059 31.15039-19.25 47.9502-19.25 16.4502 0 28.70117 8.75 35.00098 23.4502 16.4502-17.85059 34.30078-23.4502 52.15039-23.4502 24.85059 0 39.90137 19.59961 39.90137 49.35059v156.80273h-62.30176v-149.80273c0-8.75-2.7998-12.9502-10.14941-12.9502-3.5 0-9.80078 1.75-15.05078 4.5498v158.20312h-61.60059v-149.80273c0-8.75-3.5-12.9502-10.85059-12.9502-3.5 0-9.4502 1.75-15.0498 4.90039v157.85254h-62.30176v-202.30371zM1739.49847 695.18079h62.30176v15.40039c15.0498-14.35059 31.15039-19.25 47.9502-19.25 16.4502 0 28.70117 8.75 35.00098 23.4502 16.4502-17.85059 34.30078-23.4502 52.15039-23.4502 24.85059 0 39.90137 19.59961 39.90137 49.35059v156.80273h-62.30176v-149.80273c0-8.75-2.7998-12.9502-10.14941-12.9502-3.5 0-9.80078 1.75-15.05078 4.5498v158.20312h-61.60059v-149.80273c0-8.75-3.5-12.9502-10.85059-12.9502-3.5 0-9.4502 1.75-15.0498 4.90039v157.85254h-62.30176v-202.30371zM2006.19378 837.28333v-81.90137c0-40.60059 30.45117-64.05078 73.15137-64.05078 43.05078 0 70.35156 20.65039 70.35156 61.60059v47.60059h-81.55176v38.50098c0 13.30078 5.25 17.85059 11.2002 17.85059s12.9502-2.4502 12.9502-15.75v-24.15039h57.40137v23.4502c0 40.9502-28 60.90039-70.35156 60.90039-42.7002 0-73.15137-23.4502-73.15137-64.05078zM2092.29534 772.18275v-20.65039c0-13.65039-7-15.75098-12.9502-15.75098-5.59961 0-11.2002 3.85059-11.2002 17.50098v18.90039h24.15039zM2180.49163 695.18079h62.65137v35.00098c12.25-22.75098 23.10059-37.45117 43.05078-37.45117 3.84961 0 7 .35059 9.4502 1.05078v61.60059c-5.25-2.4502-10.85059-4.2002-17.85059-4.2002-14 0-25.55078 8.40039-34.65039 19.60059v126.70215h-62.65137v-202.30371zM2319.78656 807.18275v-102.55176c0-59.15039 21.7002-94.85156 87.50098-94.85156s84.70215 34.65039 84.70215 81.90137v25.2002h-68.25098v-30.7998c0-12.25098-.35059-28.35059-16.45117-28.35059-16.09961 0-17.14941 16.09961-17.14941 28.35059v139.30176c0 12.60059 1.39941 28.35059 17.14941 28.35059 16.10059 0 16.45117-16.09961 16.45117-28.35059v-32.2002h68.25098v25.2002c0 47.25098-18.90039 83.65137-84.70215 83.65137s-87.50098-36.05078-87.50098-94.85156zM2516.4848 851.28333c0-50.40039 47.9502-66.50098 84.35156-78.75098v-22.05078c0-6.2998-2.10059-12.59961-9.4502-12.59961-8.05078 0-9.4502 5.9502-10.15039 12.59961l-1.75 16.10059-57.75098-2.4502c2.4502-49.7002 26.60059-72.80078 75.60156-72.80078 41.30078 0 63.00098 26.25 63.00098 60.20117v94.85156c0 27.2998 2.09961 42.35059 3.5 51.10059h-55.65137c-1.75-11.90039-4.2002-28-4.5498-28.35059-4.90039 17.15039-17.5 32.2002-38.15039 32.2002-32.90039 0-49.00098-26.59961-49.00098-50.05078zM2600.83636 852.68372v-54.95117c-17.50098 10.15039-28.70117 22.75098-28.70117 42.35059 0 12.9502 5.60059 20.65039 15.05078 20.65039 5.9502 0 9.7998-2.7998 13.65039-8.0498zM2693.93402 695.18079h62.30176v15.40039c15.0498-14.35059 31.15039-19.25 47.9502-19.25 16.4502 0 28.70117 8.75 35.00098 23.4502 16.4502-17.85059 34.30078-23.4502 52.15039-23.4502 24.85059 0 39.90137 19.59961 39.90137 49.35059v156.80273h-62.30176v-149.80273c0-8.75-2.7998-12.9502-10.14941-12.9502-3.5 0-9.80078 1.75-15.05078 4.5498v158.20312h-61.60059v-149.80273c0-8.75-3.5-12.9502-10.85059-12.9502-3.5 0-9.4502 1.75-15.0498 4.90039v157.85254h-62.30176v-202.30371zM2964.82952 695.18079h62.65137v14.35059c15.40039-12.9502 32.2002-18.2002 45.50098-18.2002 27.30078.34961 42.35059 19.59961 42.35059 54.9502v98.35254c0 36.0498-16.7998 56.7002-42.35059 56.7002-14.7002 0-30.80078-7-45.50098-19.25v81.90137h-62.65137v-268.80469zM3052.68109 848.48353v-107.80176c0-7.7002-4.5498-13.65039-11.90039-13.65039-4.5498 0-9.09961 2.4502-13.2998 5.9502v125.30176c4.2002 2.4502 8.40039 3.85059 11.90039 3.85059 8.0498 0 13.2998-5.9502 13.2998-13.65039z" fill="#ffffff" class="svgShape color000000-132 selectable"></path></svg></g></svg>
</file>
<file path="public/vite.svg">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
</file>
<file path="src/assets/react.svg">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
</file>
<file path="src/components/common/SectionTitle.tsx">
import { ReactNode } from 'react';
interface SectionTitleProps {
children: ReactNode;
glitch?: boolean;
}
const SectionTitle = ({ children, glitch = true }: SectionTitleProps) => {
return (
<h2 className="text-center mb-16 md:mb-8 text-[clamp(2rem,4vw,3rem)] md:text-[clamp(1.6rem,5vw,2.2rem)] max-[480px]:text-[clamp(1.6rem,6.5vw,2.2rem)] text-terminal-green font-mono shadow-[0_0_15px_rgba(0,255,65,0.3)] md:px-4 max-[480px]:px-2">
{glitch ? (
<span className="relative inline-block hover:before:content-[attr(data-text)] hover:after:content-[attr(data-text)] hover:before:absolute hover:after:absolute hover:before:top-0 hover:after:top-0 hover:before:left-0 hover:after:left-0 hover:before:w-full hover:after:w-full hover:before:h-full hover:after:h-full hover:before:animate-[section-glitch-1_0.3s_infinite] hover:after:animate-[section-glitch-2_0.3s_infinite] hover:before:text-white hover:after:text-terminal-green hover:before:z-[-1] hover:after:z-[-2]" data-text={children}>
{children}
</span>
) : (
children
)}
</h2>
);
};
export default SectionTitle;
</file>
<file path="src/components/home/PrizeItem.tsx">
interface PrizeItemProps {
rank: string;
amount: number;
iconSrc: string;
type?: 'first' | 'second';
}
const PrizeItem = ({ rank, amount, iconSrc, type = 'first' }: PrizeItemProps) => {
const baseStyles = "text-center py-12 px-16 border-2 relative overflow-hidden transition-all duration-300 hover:scale-105";
const firstStyles = "border-[#FFD700] hover:border-[#FFA500] hover:shadow-[0_10px_30px_rgba(255,215,0,0.3)]";
const secondStyles = "border-[#C0C0C0] hover:border-[#A8A8A8] hover:shadow-[0_10px_30px_rgba(192,192,192,0.3)]";
const defaultHover = "hover:border-terminal-green";
const typeStyles = type === 'first' ? firstStyles : type === 'second' ? secondStyles : defaultHover;
return (
<div className={`
${baseStyles} ${typeStyles} border-white
max-md:p-6 max-md:max-w-[280px] max-md:w-full
max-sm:p-6 max-sm:max-w-[250px]
`}>
<img
src={iconSrc}
alt={`${rank} Place`}
className="w-8 h-8 mb-4 opacity-80"
/>
<h3 className="font-mono text-[1.5rem] mb-4 tracking-[0.1em] max-md:text-[1.2rem]">
{rank} PLACE
</h3>
<p className="text-[3rem] font-bold text-terminal-green mb-0 max-md:text-[2.8rem] max-sm:text-[2.5rem]">
¥{amount.toLocaleString()}
</p>
</div>
);
};
export default PrizeItem;
</file>
<file path="src/components/home/WinnerItem.tsx">
interface WinnerItemProps {
year: string;
award: string;
title: string;
description: string;
}
const WinnerItem = ({ year, award, title, description }: WinnerItemProps) => {
return (
<div className="p-8 bg-gray-900 border-l-4 border-terminal-green max-md:p-[1.2rem] max-md:text-center max-sm:p-4">
<h3 className="font-mono text-base uppercase tracking-[0.1em] mb-2 text-terminal-green max-md:text-[0.9rem]">
{year}年度 {award}
</h3>
<h4 className="text-[1.5rem] mb-4 max-md:text-[1.1rem] max-md:mb-3 max-sm:text-[1.2rem]">
「{title}」
</h4>
<p className="text-base leading-[1.6] mb-0 opacity-90 max-md:text-[0.85rem] max-md:leading-[1.5] max-sm:text-[0.9rem]">
{description}
</p>
</div>
);
};
export default WinnerItem;
</file>
<file path="src/components/index.js">
// Layout components
export { default as Layout } from './layout/Layout';
export { default as Navigation } from './layout/Navigation';
export { default as Footer } from './layout/Footer';
// Common components
export { default as Logo } from './common/Logo';
export { default as NewsCard } from './common/NewsCard';
export { default as SectionTitle } from './common/SectionTitle';
// Home page components
export { default as GridItem } from './home/GridItem';
export { default as PrizeItem } from './home/PrizeItem';
export { default as WinnerItem } from './home/WinnerItem';
</file>
<file path="src/content/news/2025-entry-start.md">
---
title: エントリー受付開始!
date: 2025-07-16
author: TSC運営チーム
category: announcement
---
# エントリー受付開始!
お待たせしました!Tech.SummerCamp 2025のエントリー受付を開始しました。
## 参加条件
学生かつ以下のいずれかに該当する方:
- エンジニア歴2年以上
- ハッカソン参加経験が複数回
- ハッカソン受賞経験が1回以上
- インターン内定/参加経験あり
- プロダクトのリリース経験あり
- 勉強会・カンファレンス登壇経験あり
- 技術力でチームを牽引できる自信がある
## エントリー方法
[エントリーページ](https://nxtend.connpass.com/event/356366/)から必要事項を記入してお申し込みください。
**締切**: 2025年9月19日(月) 23:59
皆様のご応募をお待ちしています!
</file>
<file path="src/content/news/2025-site-open.md">
---
title: Tech.SummerCamp 2025 サイトオープン
date: 2025-07-15
author: TSC運営チーム
category: announcement
---
# Tech.SummerCamp 2025 サイトオープン
Tech.SummerCamp 2025の公式サイトをオープンしました!
今年も「学生エンジニアが得られる体験の最高峰」をコンセプトに、全国の中・上級者学生エンジニアが集まる4日間のハッカソンを開催します。
## 開催概要
- **日程**: 2025年9月20日(土)〜23日(火・祝)
- **場所**: 大阪会場
- **参加者**: 全国の中・上級者学生エンジニア 60〜80名
- **賞金**: 最優秀賞30万円、優秀賞10万円
## 今後のスケジュール
詳細は順次公開していきますので、お楽しみに!
</file>
<file path="src/data/siteContent.js">
// サイトのコンテンツを一元管理するファイル
// 非エンジニアでも編集しやすいように設計
export const siteContent = {
// ========== 基本情報 ==========
eventInfo: {
name: "Tech.SummerCamp",
year: 2025,
tagline: "学生エンジニアが得られる体験の最高峰",
dates: "2025年9月20日(土) - 23日(火・祝)",
location: "大阪市内会場 + オンライン(ハイブリッド)",
participants: "60-80名",
prize: {
first: "¥300,000",
second: "¥100,000",
total: "¥400,000"
}
},
// ========== スポンサー情報 ==========
sponsors: {
platinum: [
// { name: "企業名", logo: "/images/sponsors/company1.png", url: "https://example.com" }
],
gold: [
// 追加例
],
silver: [
// 追加例
]
},
// ========== ニュース記事 ==========
news: [
{
id: 'news-001',
date: '2025.01.15',
category: 'ANNOUNCEMENT',
title: 'Tech.SummerCamp 2025 開催決定',
content: '2025年度のTech.SummerCampの開催が正式に決定しました。今年も最高峰の学生エンジニア体験をお届けします。',
important: true
},
{
id: 'news-002',
date: '2025.01.15',
category: 'WEBSITE',
title: '公式サイトオープン',
content: 'Tech.SummerCamp 2025の公式サイトがオープンしました。最新情報をチェックして、エントリーに備えましょう。'
},
// 新しいニュースはここに追加
],
// ========== FAQ ==========
faq: {
participation: [
{
question: "参加条件は?",
answer: "エンジニア歴2年以上、ハッカソン経験者、インターン経験者など、中・上級者の学生が対象です。"
},
{
question: "選考はありますか?",
answer: "はい、応募多数の場合は選考を行います。技術力とチーム貢献度を重視します。"
}
],
event: [
{
question: "オンライン参加は可能?",
answer: "はい、ハイブリッド開催のため、オンライン参加も可能です。"
},
{
question: "食事は提供されますか?",
answer: "会場参加者には食事を提供します。オンライン参加者は各自でご用意ください。"
}
],
technical: [
{
question: "使用言語・技術の制限は?",
answer: "特に制限はありません。チームで自由に技術選定してください。"
}
]
},
// ========== メタ情報(SEO用) ==========
meta: {
title: "Tech.SummerCamp 2025 - 学生エンジニアが得られる体験の最高峰",
description: "全国から選ばれた中・上級者の学生エンジニアが集まる、日本最高峰の学生ハッカソン。48時間の開発で技術力の限界に挑戦。最優秀賞30万円。",
keywords: "学生ハッカソン,Tech.SummerCamp,学生エンジニア,プログラミングコンテスト,大阪",
ogImage: "/images/og-image.png"
},
// ========== お問い合わせ ==========
contact: {
email: "info@tech-summercamp.jp",
twitter: "@TechSummerCamp",
// フォームのURLなど
}
};
// カテゴリー定義
export const categories = {
ANNOUNCEMENT: '開催情報',
ENTRY: 'エントリー',
WEBSITE: 'サイト更新',
SPONSOR: 'スポンサー',
EVENT: 'イベント',
RESULT: '結果発表'
};
// ========== 更新方法 ==========
// 1. このファイルを開く
// 2. 該当する箇所を編集(例:newsに新しい記事を追加)
// 3. 保存すると自動的にサイトに反映される
//
// 注意:
// - 日付は 'YYYY.MM.DD' 形式で記入
// - IDは重複しないように注意
// - importantをtrueにすると重要なお知らせとして表示
</file>
<file path="src/hooks/useNews.ts">
import { useState, useEffect } from 'react';
import { newsArticles, type NewsArticle } from '../data/newsData';
export function useNews() {
const [articles, setArticles] = useState<NewsArticle[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
// Load articles from static data
setArticles(newsArticles);
setLoading(false);
}, []);
return { articles, loading };
}
export function useNewsArticle(slug: string) {
const [article, setArticle] = useState<NewsArticle | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// Find article by slug from static data
const foundArticle = newsArticles.find(a => a.slug === slug);
setArticle(foundArticle || null);
setLoading(false);
}, [slug]);
return { article, loading };
}
</file>
<file path="src/pages/2024/Gallery.tsx">
import { Link } from 'react-router-dom';
interface GalleryImage {
id: number;
title: string;
description: string;
category: string;
}
const Gallery = () => {
const galleryImages: GalleryImage[] = [
{
id: 1,
title: 'オープニングセレモニー',
description: '48時間の開発がスタート',
category: 'event'
},
{
id: 2,
title: '開発風景',
description: '集中して開発に取り組む参加者たち',
category: 'development'
},
{
id: 3,
title: 'チームミーティング',
description: '戦略を練るチームメンバー',
category: 'team'
},
{
id: 4,
title: '深夜の開発',
description: '夜を徹して開発を続ける',
category: 'development'
},
{
id: 5,
title: '最終発表会',
description: '48時間の成果を発表',
category: 'presentation'
},
{
id: 6,
title: '表彰式',
description: '優秀な作品が表彰される',
category: 'award'
}
];
const highlights: string[] = [
'48時間連続開発',
'11チームが参加',
'革新的なアイデア',
'技術の可能性',
'仲間との絆',
'忘れられない体験'
];
return (
<div className="pt-8">
<section className="py-16 md:py-20">
<div className="container mx-auto px-6">
<h1 className="text-5xl md:text-6xl font-mono font-bold text-center mb-12 md:mb-16">
<span className="glitch" data-text="GALLERY 2024">GALLERY 2024</span>
</h1>
<div className="max-w-2xl mx-auto mb-16 text-center text-lg terminal-box">
<p className="text-green-400 mb-2">{'> '} Tech.SummerCamp 2024 Memories</p>
<p className="text-green-400">{'> '} 48時間の軌跡</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 mb-20">
{galleryImages.map((image) => (
<div key={image.id} className="bg-gray-900 border border-gray-700 overflow-hidden transition-all duration-300 hover:border-green-400 hover:-translate-y-1 hover:shadow-[0_10px_30px_rgba(0,255,65,0.2)]">
<div className="aspect-video bg-gradient-to-br from-gray-900 to-black flex items-center justify-center relative overflow-hidden before:absolute before:inset-0 before:bg-[repeating-linear-gradient(45deg,transparent,transparent_10px,rgba(255,255,255,0.05)_10px,rgba(255,255,255,0.05)_20px)]">
<div className="text-center z-10 relative">
<div className="text-5xl mb-4 opacity-30">📸</div>
<div className="font-mono text-lg text-green-400 opacity-50">IMAGE</div>
</div>
</div>
<div className="p-6">
<h3 className="text-lg mb-2">{image.title}</h3>
<p className="text-sm leading-relaxed mb-4 opacity-90">{image.description}</p>
<span className="font-mono text-xs text-green-400 uppercase px-2 py-1 border border-green-400 bg-green-400/10">[{image.category}]</span>
</div>
</div>
))}
</div>
<div className="mb-20">
<h2 className="font-mono text-3xl mb-12 text-green-400 text-center">// HIGHLIGHTS</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{highlights.map((highlight, index) => (
<div key={index} className="flex items-center gap-4 p-6 bg-gray-900 border border-gray-700 transition-all duration-300 hover:border-green-400 hover:translate-x-2">
<span className="font-mono text-3xl font-bold text-green-400 opacity-30">{String(index + 1).padStart(2, '0')}</span>
<span className="text-lg font-medium">{highlight}</span>
</div>
))}
</div>
</div>
<div className="grid grid-cols-2 md:grid-cols-4 gap-8 max-w-4xl mx-auto mb-20">
<div className="text-center p-8 bg-gray-900 border border-gray-700 transition-all duration-300 hover:border-green-400 hover:scale-105">
<div className="font-mono text-3xl md:text-4xl lg:text-5xl font-bold text-green-400 mb-2">2,500+</div>
<div className="text-base opacity-90">写真撮影</div>
</div>
<div className="text-center p-8 bg-gray-900 border border-gray-700 transition-all duration-300 hover:border-green-400 hover:scale-105">
<div className="font-mono text-3xl md:text-4xl lg:text-5xl font-bold text-green-400 mb-2">48</div>
<div className="text-base opacity-90">開発時間</div>
</div>
<div className="text-center p-8 bg-gray-900 border border-gray-700 transition-all duration-300 hover:border-green-400 hover:scale-105">
<div className="font-mono text-3xl md:text-4xl lg:text-5xl font-bold text-green-400 mb-2">11</div>
<div className="text-base opacity-90">チーム</div>
</div>
<div className="text-center p-8 bg-gray-900 border border-gray-700 transition-all duration-300 hover:border-green-400 hover:scale-105">
<div className="font-mono text-3xl md:text-4xl lg:text-5xl font-bold text-green-400 mb-2">∞</div>
<div className="text-base opacity-90">思い出</div>
</div>
</div>
<div className="mb-20">
<h2 className="font-mono text-3xl mb-12 text-green-400 text-center">// TESTIMONIALS</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
<div className="p-8 bg-gray-900 border-l-4 border-l-green-400 relative">
<span className="absolute top-4 left-4 text-5xl text-green-400 opacity-30 font-serif">"</span>
<blockquote className="text-base leading-relaxed mb-4 pl-8 italic opacity-90">
「48時間という短い時間でここまでのものが作れるとは思いませんでした。
全国から集まった仲間と一緒に開発できて、本当に貴重な経験でした。」
</blockquote>
<cite className="font-mono text-sm text-green-400 not-italic">- 参加者 A</cite>
</div>
<div className="p-8 bg-gray-900 border-l-4 border-l-green-400 relative">
<span className="absolute top-4 left-4 text-5xl text-green-400 opacity-30 font-serif">"</span>
<blockquote className="text-base leading-relaxed mb-4 pl-8 italic opacity-90">
「技術的なレベルの高さに驚きました。他のチームの作品を見て、
もっと頑張らなければと強く感じました。来年も絶対参加したいです。」
</blockquote>
<cite className="font-mono text-sm text-green-400 not-italic">- 参加者 B</cite>
</div>
<div className="p-8 bg-gray-900 border-l-4 border-l-green-400 relative">
<span className="absolute top-4 left-4 text-5xl text-green-400 opacity-30 font-serif">"</span>
<blockquote className="text-base leading-relaxed mb-4 pl-8 italic opacity-90">
「チームメンバーとの協力の大切さを学びました。
一人では絶対に作れなかったものを、みんなで作り上げることができました。」
</blockquote>
<cite className="font-mono text-sm text-green-400 not-italic">- 参加者 C</cite>
</div>
</div>
</div>
<div className="text-center flex justify-center gap-12 flex-wrap">
<Link to="/2024/results" className="font-mono text-lg px-8 py-4 border border-gray-600 transition-all duration-300 inline-block hover:border-green-400 hover:bg-green-400/10 hover:-translate-y-0.5">
{'> '} View Results
</Link>
<Link to="/2025" className="font-mono text-lg px-8 py-4 bg-green-400 text-black border border-green-400 transition-all duration-300 inline-block hover:bg-white hover:text-black">
{'> '} Join 2025
</Link>
</div>
</div>
</section>
</div>
);
};
export default Gallery;
</file>
<file path="src/pages/2024/Results.tsx">
import { Link } from 'react-router-dom';
interface Winner {
rank: number;
title: string;
team: string;
description: string;
tech: string[];
prize: string;
}
interface Project {
team: string;
title: string;
description: string;
tech: string[];
}
interface Stat {
label: string;
value: string;
}
const Results = () => {
const winners: Winner[] = [
{
rank: 1,
title: 'ALL IN',
team: 'Team Alpha',
description: '全てのチャットアプリの通知を統合するサービス。Slack、Discord、Teams等の通知を一元管理し、AIが重要度を判定して最適なタイミングで通知。',
tech: ['React', 'Node.js', 'AI/ML', 'WebSocket'],
prize: '¥300,000'
},
{
rank: 2,
title: 'CallJourney',
team: 'Team Beta',
description: '飲食店の電話予約を完全自動化するサービス。音声認識と自然言語処理により、人間と遜色ない自然な会話で予約対応を実現。',
tech: ['Python', 'Speech API', 'NLP', 'FastAPI'],
prize: '¥100,000'
}
];
const allProjects: Project[] = [
{
team: 'Team Gamma',
title: 'EcoTracker',
description: 'IoTセンサーとAIを活用した家庭用省エネシステム',
tech: ['IoT', 'Python', 'TensorFlow', 'React']
},
{
team: 'Team Delta',
title: 'StudyBuddy',
description: 'AR技術を使った革新的な学習支援アプリケーション',
tech: ['Unity', 'AR Foundation', 'C#', 'Firebase']
},
{
team: 'Team Epsilon',
title: 'HealthSync',
description: 'ウェアラブルデバイス連携による健康管理プラットフォーム',
tech: ['Flutter', 'Dart', 'GraphQL', 'PostgreSQL']
}
];
const stats: Stat[] = [
{ label: '参加者数', value: '48名' },
{ label: 'チーム数', value: '11チーム' },
{ label: '開発時間', value: '48時間' },
{ label: '提出作品', value: '11作品' }
];
return (
<div className="pt-8">
<section className="py-16 md:py-20">
<div className="container mx-auto px-6">
<h1 className="text-5xl md:text-6xl font-mono font-bold text-center mb-12 md:mb-16">
<span className="glitch" data-text="RESULTS 2024">RESULTS 2024</span>
</h1>
<div className="max-w-2xl mx-auto mb-16 text-center text-lg terminal-box">
<p className="text-green-400 mb-2">{'> '} Tech.SummerCamp 2024 Results</p>
<p className="text-green-400">{'> '} 2024年9月21日-24日開催</p>
</div>
<div className="grid grid-cols-2 md:grid-cols-4 gap-8 max-w-4xl mx-auto mb-20">
{stats.map((stat, index) => (
<div key={index} className="text-center p-8 border border-gray-600 bg-white/2 transition-all duration-300 hover:border-green-400 hover:-translate-y-1 hover:bg-green-400/5">
<div className="font-mono text-3xl md:text-4xl lg:text-5xl font-bold text-green-400 mb-2">{stat.value}</div>
<div className="text-base opacity-90">{stat.label}</div>
</div>
))}
</div>
<div className="mb-20">
<h2 className="font-mono text-3xl mb-12 text-green-400 text-center">// WINNERS</h2>
{winners.map((winner, index) => (
<div key={index} className="mb-12 p-12 bg-gray-900 border-2 border-gray-700 relative overflow-hidden transition-all duration-300 hover:border-green-400 hover:-translate-y-1 hover:shadow-[0_20px_40px_rgba(0,255,65,0.2)] before:absolute before:top-0 before:left-0 before:right-0 before:h-1 before:bg-gradient-to-r before:from-green-400 before:to-white before:scale-x-0 hover:before:scale-x-100 before:transition-transform before:duration-300">
<div className="flex justify-between items-center mb-8 flex-wrap gap-4">
<div className="font-mono text-lg font-bold text-green-400">
{winner.rank === 1 ? '🥇' : '🥈'}
{winner.rank === 1 ? 'WINNER' : '2ND PLACE'}
</div>
<div className="font-mono text-2xl font-bold text-white">{winner.prize}</div>
</div>
<h3 className="text-3xl md:text-4xl mb-2">「{winner.title}」</h3>
<div className="font-mono text-green-400 mb-8 text-lg">by {winner.team}</div>
<p className="text-lg leading-relaxed mb-8 opacity-90">{winner.description}</p>
<div className="flex items-center gap-4 flex-wrap">
<span className="font-mono text-green-400 text-sm">Tech Stack:</span>
<div className="flex gap-2 flex-wrap">
{winner.tech.map((tech, techIndex) => (
<span key={techIndex} className="font-mono text-xs px-3 py-1 bg-white/10 border border-gray-600 rounded transition-all duration-200 hover:border-green-400 hover:bg-green-400/10">{tech}</span>
))}
</div>
</div>
</div>
))}
</div>
<div className="mb-20">
<h2 className="font-mono text-3xl mb-12 text-green-400 text-center">// ALL PROJECTS</h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{allProjects.map((project, index) => (
<div key={index} className="p-8 bg-gray-900 border border-gray-700 transition-all duration-300 hover:border-green-400 hover:-translate-y-1">
<h3 className="text-xl mb-2">{project.title}</h3>
<div className="font-mono text-green-400 text-sm mb-4">{project.team}</div>
<p className="text-sm leading-relaxed mb-6 opacity-90">{project.description}</p>
<div className="flex gap-2 flex-wrap">
{project.tech.map((tech, techIndex) => (
<span key={techIndex} className="font-mono text-xs px-2 py-1 bg-white/10 border border-gray-600 rounded transition-all duration-200 hover:border-green-400 hover:bg-green-400/10">{tech}</span>
))}
</div>
</div>
))}
</div>
</div>
<div className="text-center flex justify-center gap-12 flex-wrap">
<Link to="/2024/gallery" className="font-mono text-lg px-8 py-4 border border-gray-600 transition-all duration-300 inline-block hover:border-green-400 hover:bg-green-400/10 hover:-translate-y-0.5">
{'> '} View Gallery
</Link>
<Link to="/2025" className="font-mono text-lg px-8 py-4 bg-green-400 text-black border border-green-400 transition-all duration-300 inline-block hover:bg-white hover:text-black">
{'> '} Tech.SummerCamp 2025
</Link>
</div>
</div>
</section>
</div>
);
};
export default Results;
</file>
<file path="src/pages/2025/NewsDetail.tsx">
import { useParams, Link } from 'react-router-dom';
import { useNewsArticle } from '../../hooks/useNews';
import '../../styles/news.css';
const NewsDetail = () => {
const { slug } = useParams<{ slug: string }>();
const { article, loading } = useNewsArticle(slug || '');
if (loading) {
return (
<div className="pt-8">
<section className="min-h-screen">
<div className="container mx-auto px-6 py-8">
<div className="flex justify-center items-center min-h-[300px]">
<div className="text-white font-mono">Loading...</div>
</div>
</div>
</section>
</div>
);
}
if (!article) {
return (
<div className="pt-8">
<section className="min-h-screen">
<div className="container mx-auto px-6 py-8">
<div className="text-center">
<h1 className="text-4xl font-mono font-bold mb-4">404</h1>
<p className="text-gray-400 mb-8">記事が見つかりませんでした</p>
<Link
to="/2025/news"
className="inline-block bg-white text-black px-6 py-3 font-mono hover:bg-[#00FF41] hover:text-black transition-colors"
>
ニュース一覧に戻る
</Link>
</div>
</div>
</section>
</div>
);
}
return (
<div className="pt-8">
<section className="min-h-screen">
<div className="container mx-auto px-6 py-8">
<div className="max-w-4xl mx-auto">
{/* パンくずリスト */}
<nav className="mb-8">
<ol className="flex items-center space-x-2 text-sm font-mono text-gray-400">
<li>
<Link to="/2025" className="hover:text-white transition-colors">
HOME
</Link>
</li>
<li className="before:content-['/'] before:mx-2">
<Link to="/2025/news" className="hover:text-white transition-colors">
NEWS
</Link>
</li>
<li className="before:content-['/'] before:mx-2 text-white">
{article.title}
</li>
</ol>
</nav>
{/* 記事ヘッダー */}
<header className="mb-12 pb-8 border-b border-gray-800">
<div className="flex items-center gap-4 mb-4">
<span className={`
inline-block px-3 py-1 text-xs font-mono uppercase
${article.category === 'announcement' ? 'bg-[#00FF41] text-black' : 'bg-gray-700 text-white'}
`}>
{article.category}
</span>
<time className="text-gray-400 font-mono text-sm">
{new Date(article.date).toLocaleDateString('ja-JP', {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</time>
</div>
<p className="text-gray-400 text-sm font-mono">by {article.author}</p>
</header>
{/* 記事本文 */}
<article>
<div
className="news-content"
dangerouslySetInnerHTML={{ __html: article.content }}
/>
</article>
{/* 記事フッター */}
<footer className="mt-16 pt-8 border-t border-gray-800">
<Link
to="/2025/news"
className="inline-flex items-center gap-2 text-gray-400 hover:text-white font-mono transition-colors group"
>
<span className="group-hover:-translate-x-1 transition-transform">←</span>
ニュース一覧に戻る
</Link>
</footer>
</div>
</div>
</section>
</div>
);
};
export default NewsDetail;
</file>
<file path="src/styles/news.css">
/* News Article Styles */
.news-content {
color: #e5e7eb;
line-height: 1.8;
}
/* Headings */
.news-content h1 {
font-size: 2.25rem;
font-family: 'JetBrains Mono', monospace;
font-weight: 700;
color: white;
margin-bottom: 1.5rem;
margin-top: 3rem;
border-bottom: 1px solid #1f2937;
padding-bottom: 1rem;
position: relative;
}
.news-content h1:first-child {
margin-top: 0;
}
.news-content h2 {
font-size: 1.5rem;
font-family: 'JetBrains Mono', monospace;
font-weight: 700;
color: white;
margin-bottom: 1rem;
margin-top: 2.5rem;
position: relative;
}
.news-content h3 {
font-size: 1.25rem;
font-family: 'JetBrains Mono', monospace;
font-weight: 700;
color: white;
margin-bottom: 0.75rem;
margin-top: 2rem;
}
/* Paragraphs */
.news-content p {
color: #d1d5db;
margin-bottom: 1.5rem;
line-height: 1.75;
}
/* Links */
.news-content a {
color: #00FF41;
text-decoration: none;
position: relative;
transition: all 0.2s ease;
}
.news-content a:hover {
text-decoration: underline;
color: white;
}
.news-content a::after {
content: ' ↗';
font-size: 0.75rem;
display: inline-block;
transition: transform 0.2s ease;
}
.news-content a:hover::after {
transform: translate(2px, -2px);
}
/* Lists */
.news-content ul {
margin-bottom: 1.5rem;
padding-left: 1.5rem;
}
.news-content ul li {
color: #d1d5db;
margin-bottom: 0.5rem;
position: relative;
list-style: none;
}
.news-content ul li::before {
content: '▸ ';
color: #00FF41;
position: absolute;
left: -1.5rem;
font-family: 'JetBrains Mono', monospace;
}
.news-content ol {
margin-bottom: 1.5rem;
padding-left: 1.5rem;