It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: https://Www.genshinfans.cc/

  1. <!DOCTYPE html>
  2.  
  3. <html lang="en">
  4. <head>
  5. <meta charset="utf-8"/>
  6. <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
  7. <title>GenshinFans | Genshin Impact Game Blog</title>
  8. <meta content="GenshinFans is a professional Genshin Impact fan site, offering the latest guides, character builds, weapon recommendations, in-depth exploration, and version previews. Your one-stop platform for all Genshin Impact news and strategies!" name="description"/>
  9. <meta content=",game guides,Genshin Impact guide,character builds,weapon builds,miHoYo,game news,GenshinFans,Genshin Impact tips,Genshin Impact walkthrough,game strategies" name="keywords"/>
  10. <link href="https://www.genshinfans.cc/" rel="canonical"/>
  11. <style>
  12.        /* Global Styles */
  13.        * {
  14.            margin: 0;
  15.            padding: 0;
  16.            box-sizing: border-box;
  17.            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  18.        }
  19.  
  20.        :root {
  21.            --primary: #5e94e6;
  22.            --secondary: #f9c22e;
  23.            --accent: #ff6e6e;
  24.            --dark: #2c3e50;
  25.            --light: #f5f5f5;
  26.            --anemo: #74c2a8;
  27.            --geo: #fab632;
  28.            --electro: #af8eb5;
  29.            --dendro: #a5c83b;
  30.            --hydro: #21e1eb;
  31.            --pyro: #f85f5f;
  32.            --cryo: #9fd6e3;
  33.        }
  34.  
  35.        body {
  36.            background-color: var(--light);
  37.            color: var(--dark);
  38.            background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.7)),
  39.                              url('/images/common/ffef88b063a9741a780991a12a6269f0.jpg');
  40.            background-attachment: fixed;
  41.            background-size: cover;
  42.        }
  43.  
  44.        /* Header Section */
  45.        header {
  46.            background: linear-gradient(135deg, var(--anemo), var(--geo), var(--electro), var(--dendro), var(--hydro), var(--pyro), var(--cryo));
  47.            color: white;
  48.            padding: 1rem 0;
  49.            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  50.            position: relative;
  51.            overflow: hidden;
  52.        }
  53.  
  54.        header::before {
  55.            content: '';
  56.            position: absolute;
  57.            top: 0;
  58.            left: 0;
  59.            width: 100%;
  60.            height: 100%;
  61.            background-size: 40px;
  62.            opacity: 0.1;
  63.            z-index: 0;
  64.        }
  65.  
  66.        .nav-container {
  67.            max-width: 1200px;
  68.            margin: 0 auto;
  69.            display: flex;
  70.            justify-content: space-between;
  71.            align-items: center;
  72.            padding: 0 2rem;
  73.            position: relative;
  74.            z-index: 1;
  75.        }
  76.  
  77.        .logo {
  78.            display: flex;
  79.            align-items: center;
  80.        }
  81.  
  82.        .logo img {
  83.            width: 50px;
  84.            height: 50px;
  85.            margin-right: 10px;
  86.        }
  87.  
  88.        .logo h1 {
  89.            font-size: 1.8rem;
  90.            font-weight: 700;
  91.            text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
  92.        }
  93.  
  94.        nav ul {
  95.            display: flex;
  96.            list-style: none;
  97.        }
  98.  
  99.        nav ul li {
  100.            margin-left: 2rem;
  101.        }
  102.  
  103.        nav ul li a {
  104.            color: white;
  105.            text-decoration: none;
  106.            font-weight: 500;
  107.            font-size: 1.1rem;
  108.            position: relative;
  109.            padding: 5px 0;
  110.        }
  111.        
  112.        nav ul li a.active::after,
  113.        nav ul li a:hover::after {
  114.            width: 100%;
  115.        }
  116.  
  117.        nav ul li a::after {
  118.            content: '';
  119.            position: absolute;
  120.            width: 0;
  121.            height: 2px;
  122.            bottom: 0;
  123.            left: 0;
  124.            background-color: white;
  125.            transition: width 0.3s ease;
  126.        }
  127.  
  128.        /* Hero Section */
  129.        .hero {
  130.            height: 70vh;
  131.            display: flex;
  132.            align-items: center;
  133.            justify-content: center;
  134.            position: relative;
  135.            background-size: cover;
  136.            background-position: center;
  137.            color: white;
  138.        }
  139.  
  140.        .hero::before {
  141.            content: '';
  142.            position: absolute;
  143.            top: 0;
  144.            left: 0;
  145.            width: 100%;
  146.            height: 100%;
  147.            background: linear-gradient(to bottom, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.7));
  148.        }
  149.  
  150.        .hero-content {
  151.            text-align: center;
  152.            max-width: 800px;
  153.            padding: 0 2rem;
  154.            position: relative;
  155.            z-index: 1;
  156.        }
  157.  
  158.        .hero h2 {
  159.            font-size: 3.5rem;
  160.            margin-bottom: 1rem;
  161.            font-weight: 800;
  162.            text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
  163.        }
  164.  
  165.        .hero p {
  166.            font-size: 1.3rem;
  167.            margin-bottom: 2rem;
  168.            line-height: 1.6;
  169.        }
  170.  
  171.        .hero-buttons {
  172.            display: flex;
  173.            justify-content: center;
  174.            gap: 1rem;
  175.        }
  176.  
  177.        .btn {
  178.            padding: 12px 24px;
  179.            border: none;
  180.            border-radius: 50px;
  181.            font-size: 1rem;
  182.            font-weight: 600;
  183.            cursor: pointer;
  184.            transition: all 0.3s ease;
  185.            text-decoration: none;
  186.        }
  187.        
  188.        .btn-primary {
  189.            background-color: var(--anemo);
  190.            color: white;
  191.            box-shadow: 0 4px 10px rgba(116, 194, 168, 0.3);
  192.        }
  193.  
  194.        .btn-secondary {
  195.            background-color: transparent;
  196.            color: white;
  197.            border: 2px solid white;
  198.        }
  199.  
  200.        .btn:hover {
  201.            transform: translateY(-3px);
  202.            box-shadow: 0 6px 15px rgba(0, 0, 0, 0.2);
  203.        }
  204.  
  205.        /* Main Content */
  206.        .container {
  207.            max-width: 1200px;
  208.            margin: 0 auto;
  209.            padding: 3rem 2rem;
  210.        }
  211.  
  212.        .section-title {
  213.            text-align: center;
  214.            margin-bottom: 3rem;
  215.            position: relative;
  216.        }
  217.  
  218.        .section-title h2 {
  219.            font-size: 2.5rem;
  220.            color: var(--dark);
  221.            display: inline-block;
  222.            padding: 0 1rem;
  223.            position: relative;
  224.            z-index: 1;
  225.        }
  226.  
  227.        .section-title::after {
  228.            content: '';
  229.            position: absolute;
  230.            width: 100%;
  231.            height: 2px;
  232.            top: 50%;
  233.            left: 0;
  234.            z-index: 0;
  235.        }
  236.  
  237.        /* Featured Articles */
  238.        .featured-articles {
  239.            margin-bottom: 5rem;
  240.        }
  241.  
  242.        .featured-grid {
  243.            display: grid;
  244.            grid-template-columns: repeat(12, 1fr);
  245.            gap: 1.5rem;
  246.        }
  247.        
  248.        .featured-main {
  249.            grid-column: span 8;
  250.            position: relative;
  251.            border-radius: 12px;
  252.            overflow: hidden;
  253.            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
  254.            height: 500px;
  255.        }
  256.  
  257.        .featured-main img {
  258.            width: 100%;
  259.            height: 100%;
  260.            object-fit: cover;
  261.            transition: transform 0.3s ease;
  262.        }
  263.  
  264.        .featured-main a:hover img {
  265.            transform: scale(1.05);
  266.        }
  267.  
  268.        .featured-content {
  269.            position: absolute;
  270.            bottom: 0;
  271.            left: 0;
  272.            width: 100%;
  273.            padding: 2rem;
  274.            background: linear-gradient(to top, rgba(0, 0, 0, 0.9), rgba(0, 0, 0, 0));
  275.            color: white;
  276.        }
  277.  
  278.        .featured-content h3 {
  279.            font-size: 2rem;
  280.            margin-bottom: 1rem;
  281.        }
  282.  
  283.        .featured-content p {
  284.            font-size: 1.1rem;
  285.            margin-bottom: 1rem;
  286.            opacity: 0.9;
  287.        }
  288.  
  289.        .featured-content .meta {
  290.            display: flex;
  291.            align-items: center;
  292.            gap: 1rem;
  293.            font-size: 0.9rem;
  294.            opacity: 0.7;
  295.        }
  296.  
  297.        .featured-content .tag {
  298.            background-color: var(--pyro);
  299.            color: white;
  300.            padding: 4px 10px;
  301.            border-radius: 20px;
  302.            font-size: 0.8rem;
  303.            font-weight: 600;
  304.        }
  305.  
  306.        .featured-side {
  307.            grid-column: span 4;
  308.            display: flex;
  309.            flex-direction: column;
  310.            gap: 1.5rem;
  311.        }
  312.  
  313.        .side-article {
  314.            background-color: white;
  315.            border-radius: 12px;
  316.            overflow: hidden;
  317.            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08);
  318.            display: flex;
  319.            flex-direction: column;
  320.            height: calc(50% - 0.75rem);
  321.            transition: transform 0.3s ease, box-shadow 0.3s ease;
  322.        }
  323.        
  324.        .side-article:hover {
  325.            transform: translateY(-5px);
  326.            box-shadow: 0 12px 20px rgba(0, 0, 0, 0.12);
  327.        }
  328.        
  329.        .side-article-image-link {
  330.            display: block;
  331.            height: 160px;
  332.            overflow: hidden;
  333.        }
  334.  
  335.        .side-article img {
  336.            width: 100%;
  337.            height: 100%;
  338.            object-fit: cover;
  339.            transition: transform 0.3s ease;
  340.        }
  341.  
  342.        .side-article a:hover img {
  343.            transform: scale(1.05);
  344.        }
  345.  
  346.        .side-content {
  347.            padding: 1.2rem;
  348.            flex-grow: 1;
  349.        }
  350.  
  351.        .side-content h3 {
  352.            font-size: 1.2rem;
  353.            margin-bottom: 0.7rem;
  354.            color: var(--dark);
  355.        }
  356.  
  357.        .side-content p {
  358.            font-size: 0.9rem;
  359.            color: #666;
  360.            margin-bottom: 0.5rem;
  361.            line-height: 1.4;
  362.        }
  363.  
  364.        .side-content .meta {
  365.            display: flex;
  366.            align-items: center;
  367.            justify-content: space-between;
  368.            font-size: 0.8rem;
  369.            color: #888;
  370.        }
  371.  
  372.        /* Recent Posts */
  373.        .recent-posts {
  374.            margin-bottom: 5rem;
  375.        }
  376.  
  377.        .posts-grid {
  378.            display: grid;
  379.            grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
  380.            gap: 2rem;
  381.        }
  382.  
  383.        .post-card {
  384.            background-color: white;
  385.            border-radius: 12px;
  386.            overflow: hidden;
  387.            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
  388.            transition: transform 0.3s ease, box-shadow 0.3s ease;
  389.        }
  390.  
  391.        .post-card:hover {
  392.            transform: translateY(-5px);
  393.            box-shadow: 0 12px 20px rgba(0, 0, 0, 0.12);
  394.        }
  395.  
  396.        .post-card-image-link {
  397.            display: block;
  398.            width: 100%;
  399.            height: 200px;
  400.            overflow: hidden;
  401.        }
  402.        
  403.        .post-card img {
  404.            width: 100%;
  405.            height: 100%;
  406.            object-fit: cover;
  407.            transition: transform 0.3s ease;
  408.        }
  409.  
  410.        .post-card a:hover img {
  411.            transform: scale(1.05);
  412.        }
  413.  
  414.        .post-content {
  415.            padding: 1.5rem;
  416.        }
  417.  
  418.        .post-element {
  419.            display: inline-block;
  420.            padding: 3px 12px;
  421.            border-radius: 20px;
  422.            font-size: 0.75rem;
  423.            font-weight: 600;
  424.            margin-bottom: 0.8rem;
  425.            color: white;
  426.            background-color: var(--primary);
  427.        }
  428.  
  429.        .post-content h3 {
  430.            font-size: 1.4rem;
  431.            margin-bottom: 0.8rem;
  432.            color: var(--dark);
  433.        }
  434.  
  435.        .post-content p {
  436.            font-size: 0.95rem;
  437.            color: #666;
  438.            line-height: 1.6;
  439.            margin-bottom: 1.2rem;
  440.        }
  441.  
  442.        .post-meta {
  443.            display: flex;
  444.            justify-content: space-between;
  445.            align-items: center;
  446.            font-size: 0.85rem;
  447.            color: #888;
  448.            border-top: 1px solid #eee;
  449.            padding-top: 1rem;
  450.        }
  451.  
  452.        .post-meta .author {
  453.            display: flex;
  454.            align-items: center;
  455.        }
  456.  
  457.        .post-meta .author-name {
  458.            margin-left: 8px;
  459.        }
  460.  
  461.        /* News & Updates */
  462.        .news-updates {
  463.            position: relative;
  464.            padding: 3rem;
  465.            background-color: white;
  466.            border-radius: 12px;
  467.            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
  468.            margin-bottom: 5rem;
  469.        }
  470.  
  471.        .news-updates::before {
  472.            content: '';
  473.            position: absolute;
  474.            top: 0;
  475.            left: 0;
  476.            width: 100%;
  477.            height: 10px;
  478.            background: linear-gradient(to right, var(--anemo), var(--geo), var(--electro), var(--dendro), var(--hydro), var(--pyro), var(--cryo));
  479.            border-radius: 12px 12px 0 0;
  480.        }
  481.  
  482.        .news-grid {
  483.            display: grid;
  484.            grid-template-columns: 2fr 1fr;
  485.            gap: 2.5rem;
  486.        }
  487.  
  488.        .news-main h3, .updates-sidebar h3 {
  489.            font-size: 1.8rem;
  490.            margin-bottom: 1.5rem;
  491.            color: var(--dark);
  492.            border-bottom: 2px solid #f0f0f0;
  493.            padding-bottom: 1rem;
  494.        }
  495.  
  496.        .news-list {
  497.            display: flex;
  498.            flex-direction: column;
  499.            gap: 1.5rem;
  500.        }
  501.  
  502.        .news-item {
  503.            display: flex;
  504.            gap: 1.5rem;
  505.            padding-bottom: 1.5rem;
  506.            border-bottom: 1px solid #f0f0f0;
  507.        }
  508.        
  509.        .news-item:last-child {
  510.            border-bottom: none;
  511.        }
  512.  
  513.        .news-item-image-link {
  514.            width: 120px;
  515.            height: 80px;
  516.            flex-shrink: 0;
  517.            overflow: hidden;
  518.            border-radius: 8px;
  519.        }
  520.  
  521.        .news-item img {
  522.            width: 100%;
  523.            height: 100%;
  524.            object-fit: cover;
  525.            transition: transform 0.3s ease;
  526.        }
  527.        
  528.        .news-item a:hover img {
  529.            transform: scale(1.05);
  530.        }
  531.  
  532.        .news-item-content h4 {
  533.            font-size: 1.2rem;
  534.            margin-bottom: 0.5rem;
  535.            color: var(--dark);
  536.        }
  537.  
  538.        .news-item-content p {
  539.            font-size: 0.9rem;
  540.            color: #666;
  541.            line-height: 1.5;
  542.            margin-bottom: 0.5rem;
  543.        }
  544.  
  545.        .news-date {
  546.            font-size: 0.85rem;
  547.            color: #888;
  548.        }
  549.  
  550.        .hot-articles-list .hot-article-item {
  551.            background-color: #f9f9f9;
  552.            padding: 1rem 1.5rem;
  553.            border-radius: 10px;
  554.            margin-bottom: 1.5rem;
  555.            border-left: 4px solid var(--primary);
  556.            transition: all 0.3s ease;
  557.        }
  558.        
  559.        .hot-articles-list .hot-article-item:hover {
  560.             transform: translateX(5px);
  561.             box-shadow: 2px 2px 10px rgba(0,0,0,0.05);
  562.        }
  563.        
  564.        .hot-articles-list .hot-article-item a {
  565.            text-decoration: none;
  566.        }
  567.  
  568.        .hot-articles-list h4 {
  569.            font-size: 1.1rem;
  570.            margin-bottom: 0.5rem;
  571.            color: var(--dark);
  572.        }
  573.        
  574.        .hot-articles-list p {
  575.            font-size: 0.85rem;
  576.            color: #666;
  577.            line-height: 1.4;
  578.        }
  579.        
  580.        /* Popular Tags */
  581.        .popular-tags {
  582.            margin-bottom: 5rem;
  583.        }
  584.        .tags-container {
  585.            display: flex;
  586.            flex-wrap: wrap;
  587.            gap: 1rem;
  588.            justify-content: center;
  589.            background-color: white;
  590.            padding: 2rem;
  591.            border-radius: 12px;
  592.            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
  593.        }
  594.        .tag-link {
  595.            background-color: var(--light);
  596.            color: var(--dark);
  597.            padding: 8px 16px;
  598.            border-radius: 20px;
  599.            text-decoration: none;
  600.            font-weight: 500;
  601.            transition: all 0.3s ease;
  602.            border: 1px solid #ddd;
  603.        }
  604.        .tag-link:hover {
  605.            background-color: var(--primary);
  606.            color: white;
  607.            border-color: var(--primary);
  608.            transform: translateY(-2px);
  609.            box-shadow: 0 4px 8px rgba(0,0,0,0.1);
  610.        }
  611.  
  612.        /* Newsletter */
  613.        .newsletter {
  614.            background-color: var(--dark);
  615.            color: white;
  616.            padding: 4rem 0;
  617.            text-align: center;
  618.            margin-bottom: 4rem;
  619.            position: relative;
  620.            overflow: hidden;
  621.        }
  622.  
  623.        .newsletter::before {
  624.            content: '';
  625.            position: absolute;
  626.            top: 0;
  627.            left: 0;
  628.            width: 100%;
  629.            height: 100%;
  630.            background-size: 80px;
  631.            opacity: 0.05;
  632.            z-index: 0;
  633.        }
  634.  
  635.        .newsletter-content {
  636.            position: relative;
  637.            max-width: 700px;
  638.            margin: 0 auto;
  639.            z-index: 1;
  640.            padding: 0 1rem;
  641.        }
  642.  
  643.        .newsletter h2 {
  644.            font-size: 2.2rem;
  645.            margin-bottom: 1rem;
  646.        }
  647.  
  648.        .newsletter p {
  649.            font-size: 1.1rem;
  650.            margin-bottom: 2rem;
  651.            opacity: 0.8;
  652.        }
  653.  
  654.        .newsletter form {
  655.            display: flex;
  656.            gap: 1rem;
  657.            max-width: 500px;
  658.            margin: 0 auto;
  659.        }
  660.  
  661.        .newsletter input {
  662.            flex-grow: 1;
  663.            padding: 0.8rem 1.5rem;
  664.            border: none;
  665.            border-radius: 50px;
  666.            font-size: 1rem;
  667.            background-color: rgba(255, 255, 255, 0.9);
  668.        }
  669.  
  670.        .newsletter button {
  671.            padding: 0.8rem 1.8rem;
  672.            background-color: var(--secondary);
  673.            color: var(--dark);
  674.            border: none;
  675.            border-radius: 50px;
  676.            font-size: 1rem;
  677.            font-weight: 600;
  678.            cursor: pointer;
  679.            transition: all 0.3s ease;
  680.        }
  681.  
  682.        .newsletter button:hover {
  683.            background-color: white;
  684.            transform: translateY(-3px);
  685.        }
  686.        
  687.        .toast-notification {
  688.            position: fixed;
  689.            top: 20px;
  690.            right: 20px;
  691.            background-color: var(--anemo);
  692.            color: white;
  693.            padding: 15px 25px;
  694.            border-radius: 8px;
  695.            box-shadow: 0 4px 15px rgba(0,0,0,0.2);
  696.            z-index: 10000;
  697.            opacity: 0;
  698.            transform: translateY(-20px);
  699.            transition: opacity 0.5s ease, transform 0.5s ease;
  700.        }
  701.        
  702.        .toast-notification.show {
  703.            opacity: 1;
  704.            transform: translateY(0);
  705.        }
  706.  
  707.        /* Footer */
  708.        footer {
  709.            background-color: var(--dark);
  710.            color: white;
  711.            padding: 3rem 0 1rem;
  712.        }
  713.  
  714.        .footer-container {
  715.            max-width: 1200px;
  716.            margin: 0 auto;
  717.            padding: 0 2rem;
  718.        }
  719.  
  720.        .footer-grid {
  721.            display: grid;
  722.            grid-template-columns: repeat(3, 1fr);
  723.            gap: 2rem;
  724.            margin-bottom: 3rem;
  725.        }
  726.  
  727.        .footer-col h4 {
  728.            font-size: 1.3rem;
  729.            margin-bottom: 1.5rem;
  730.            position: relative;
  731.            padding-bottom: 0.5rem;
  732.        }
  733.  
  734.        .footer-col h4::after {
  735.            content: '';
  736.            position: absolute;
  737.            bottom: 0;
  738.            left: 0;
  739.            width: 40px;
  740.            height: 3px;
  741.            background-color: var(--secondary);
  742.        }
  743.  
  744.        .footer-col ul {
  745.            list-style: none;
  746.        }
  747.  
  748.        .footer-col ul li {
  749.            margin-bottom: 0.8rem;
  750.            color: #ddd;
  751.            font-size: 0.95rem;
  752.        }
  753.  
  754.        .footer-bottom {
  755.            text-align: center;
  756.            padding-top: 2rem;
  757.            border-top: 1px solid #3a4a5d;
  758.            font-size: 0.9rem;
  759.            color: #bbb;
  760.        }
  761.  
  762.        /* Responsive Styles */
  763.        @media (max-width: 1024px) {
  764.            .featured-grid {
  765.                grid-template-columns: 1fr;
  766.            }
  767.  
  768.            .featured-main, .featured-side {
  769.                grid-column: 1 / -1;
  770.            }
  771.  
  772.            .featured-main {
  773.                height: 400px;
  774.            }
  775.  
  776.            .featured-side {
  777.                flex-direction: row;
  778.            }
  779.  
  780.            .side-article {
  781.                width: 50%;
  782.                height: auto;
  783.            }
  784.  
  785.            .news-grid {
  786.                grid-template-columns: 1fr;
  787.            }
  788.        }
  789.  
  790.        @media (max-width: 768px) {
  791.            .nav-container {
  792.                flex-direction: column;
  793.                gap: 1rem;
  794.            }
  795.  
  796.            nav ul {
  797.                flex-wrap: wrap;
  798.                justify-content: center;
  799.            }
  800.  
  801.            nav ul li {
  802.                margin: 0.5rem;
  803.            }
  804.  
  805.            .hero h2 {
  806.                font-size: 2.5rem;
  807.            }
  808.  
  809.            .featured-side {
  810.                flex-direction: column;
  811.            }
  812.  
  813.            .side-article {
  814.                width: 100%;
  815.            }
  816.  
  817.            .footer-grid {
  818.                grid-template-columns: repeat(2, 1fr);
  819.            }
  820.  
  821.            .newsletter form {
  822.                flex-direction: column;
  823.            }
  824.        }
  825.  
  826.        @media (max-width: 576px) {
  827.            .posts-grid {
  828.                grid-template-columns: 1fr;
  829.            }
  830.            .hero h2 {
  831.                font-size: 2rem;
  832.            }
  833.  
  834.            .hero p {
  835.                font-size: 1rem;
  836.            }
  837.  
  838.            .btn {
  839.                padding: 10px 20px;
  840.                font-size: 0.9rem;
  841.            }
  842.  
  843.            .footer-grid {
  844.                grid-template-columns: 1fr;
  845.            }
  846.        }
  847.    </style>
  848. <script type="application/ld+json">{
  849.  "@context": "https://schema.org",
  850.  "@type": "WebSite",
  851.  "name": "GenshinFans",
  852.  "url": "https://www.genshinfans.cc",
  853.  "publisher": {
  854.    "@type": "Organization",
  855.    "@id": "https://www.genshinfans.cc/#website",
  856.    "name": "GenshinFans",
  857.    "url": "https://www.genshinfans.cc",
  858.    "description": "GenshinFans is a professional Genshin Impact fan site, offering the latest guides, character builds, weapon recommendations, in-depth exploration, and version previews. Your one-stop platform for all Genshin Impact news and strategies!",
  859.    "foundingDate": "2023",
  860.    "logo": {
  861.      "@type": "ImageObject",
  862.      "url": "https://www.genshinfans.cc/game_logo.png",
  863.      "caption": "GenshinFans Logo"
  864.    }
  865.  }
  866. }</script></head>
  867. <body>
  868. <header>
  869. <div class="nav-container">
  870. <div class="logo">
  871. <img alt="GenshinFans" src="/game_logo.png"/>
  872. <h1>GenshinFans</h1>
  873. </div>
  874. <nav>
  875. <ul id="nav-menu">
  876. <!-- Navigation items will be loaded here by JavaScript -->
  877. </ul>
  878. </nav>
  879. </div>
  880. </header>
  881. <section class="hero">
  882. <div class="hero-content">
  883. <h2>Adventure Awaits in Teyvat</h2>
  884. <p>Explore the latest Genshin Impact strategies, character builds, lore theories, and community creations. Your ultimate guide to mastering the world of Teyvat.</p>
  885. <div class="hero-buttons">
  886. <a class="btn btn-secondary" href="#first-content-section" id="latest-content-btn">Latest Content</a>
  887. </div>
  888. </div>
  889. </section>
  890. <div class="container">
  891. <section class="featured-articles" id="first-content-section">
  892. <div class="section-title">
  893. <h2>Featured Guides</h2>
  894. </div>
  895. <div class="featured-grid" id="featured-guides-container">
  896. <!-- Featured Guides content will be loaded here by JavaScript -->
  897. </div>
  898. </section>
  899. <section class="recent-posts">
  900. <div class="section-title">
  901. <h2>Popular Contents</h2>
  902. </div>
  903. <div class="posts-grid" id="popular-contents-grid">
  904. <!-- Popular Contents will be loaded here by JavaScript -->
  905. </div>
  906. </section>
  907. <section class="news-updates">
  908. <div class="news-grid">
  909. <div class="news-main" id="latest-news-container">
  910. <h3>Latest News</h3>
  911. <div class="news-list">
  912. <!-- Latest News content will be loaded here by JavaScript -->
  913. </div>
  914. </div>
  915. <div class="updates-sidebar" id="hot-articles-container">
  916. <h3>Hot Articles</h3>
  917. <div class="hot-articles-list">
  918. <!-- Hot Articles content will be loaded here by JavaScript -->
  919. </div>
  920. </div>
  921. </div>
  922. </section>
  923. <section class="popular-tags">
  924. <div class="section-title">
  925. <h2>Popular Tags</h2>
  926. </div>
  927. <div class="tags-container" id="popular-tags-container">
  928. <!-- Popular Tags will be loaded here by JavaScript -->
  929. </div>
  930. </section>
  931. <section class="newsletter">
  932. <div class="newsletter-content">
  933. <h2>Stay Updated on Teyvat's Latest</h2>
  934. <p>Subscribe to our newsletter for guides, news, and exclusive content delivered directly to your inbox.</p>
  935. <form id="newsletter-form">
  936. <input placeholder="Your email address" required="" type="email"/>
  937. <button type="submit">Subscribe</button>
  938. </form>
  939. </div>
  940. </section>
  941. </div>
  942. <footer>
  943. <div class="footer-container">
  944. <div class="footer-grid" id="footer-grid-container">
  945. <!-- Footer content will be loaded here by JavaScript -->
  946. </div>
  947. <div class="footer-bottom">
  948. <p id="copyright-text"><!-- Copyright text will be loaded here by JavaScript --></p>
  949. </div>
  950. </div>
  951. </footer>
  952. <script>
  953.    document.addEventListener('DOMContentLoaded', function() {
  954.        
  955.        const fetchData = async () => {
  956.            try {
  957.                const response = await fetch('/data/index.json');
  958.                if (!response.ok) {
  959.                    throw new Error(`HTTP error! status: ${response.status}`);
  960.                }
  961.                const data = await response.json();
  962.                
  963.                // Populate all dynamic sections
  964.                populateNavigation(data.navigation);
  965.                populateFeaturedGuides(data.latest_guides);
  966.                populatePopularContents(data.latest_all);
  967.                populateLatestNews(data.latest_news);
  968.                populateHotArticles(data.latest_articles);
  969.                populateTags(data.tag);
  970.                populateFooter(data.footer, data.copyright);
  971.                
  972.                highlightActiveNav();
  973.                setupEventListeners();
  974.  
  975.            } catch (error) {
  976.                console.error("Failed to load page data:", error);
  977.            }
  978.        };
  979.  
  980.        const populateNavigation = (navItems) => {
  981.            const navMenu = document.getElementById('nav-menu');
  982.            if (!navMenu) return;
  983.            navMenu.innerHTML = '';
  984.            navItems.forEach(item => {
  985.                const link = item.label.toLowerCase() === 'home' ? '/' : item.link;
  986.                navMenu.innerHTML += `<li><a href="${link}">${item.label}</a></li>`;
  987.            });
  988.        };
  989.        
  990.        const populateFeaturedGuides = (guides) => {
  991.            const container = document.getElementById('featured-guides-container');
  992.            if (!container || !guides || guides.length === 0) return;
  993.            container.innerHTML = '';
  994.  
  995.            let mainArticleHtml = '';
  996.            let sideArticlesHtml = '';
  997.            
  998.            // Main article (first item)
  999.            if (guides[0]) {
  1000.                const main = guides[0];
  1001.                mainArticleHtml = `
  1002.                    <div class="featured-main">
  1003.                        <a href="${main.link}">
  1004.                            <img src="${main.image}" alt="${main.title}">
  1005.                        </a>
  1006.                        <div class="featured-content">
  1007.                            <span class="tag">${main.game}</span>
  1008.                            <h3>${main.title}</h3>
  1009.                            <p>${main.excerpt}</p>
  1010.                            <div class="meta">
  1011.                                <span>By ${main.author}</span>
  1012.                                <span>•</span>
  1013.                                <span>${main.date}</span>
  1014.                            </div>
  1015.                        </div>
  1016.                    </div>
  1017.                `;
  1018.            }
  1019.  
  1020.            // Side articles (next two items)
  1021.            if (guides.length > 1) {
  1022.                const sideArticles = guides.slice(1, 3);
  1023.                sideArticlesHtml = sideArticles.map(side => `
  1024.                    <div class="side-article">
  1025.                        <a href="${side.link}" class="side-article-image-link">
  1026.                            <img src="${side.image}" alt="${side.title}">
  1027.                        </a>
  1028.                        <div class="side-content">
  1029.                            <h3>${side.title}</h3>
  1030.                            <p>${side.excerpt}</p>
  1031.                            <div class="meta">
  1032.                                <span>By ${side.author}</span>
  1033.                                <span>${side.date}</span>
  1034.                            </div>
  1035.                        </div>
  1036.                    </div>
  1037.                `).join('');
  1038.            }
  1039.            
  1040.            container.innerHTML = mainArticleHtml + `<div class="featured-side">${sideArticlesHtml}</div>`;
  1041.        };
  1042.  
  1043.        const createPostCard = (post) => {
  1044.            return `
  1045.                <div class="post-card">
  1046.                    <a href="${post.link}" class="post-card-image-link">
  1047.                        <img src="${post.image}" alt="${post.title}">
  1048.                    </a>
  1049.                    <div class="post-content">
  1050.                        <span class="post-element">${post.game}</span>
  1051.                        <h3>${post.title}</h3>
  1052.                        <p>${post.excerpt}</p>
  1053.                        <div class="post-meta">
  1054.                            <div class="author">
  1055.                                <span class="author-name">${post.author}</span>
  1056.                            </div>
  1057.                            <span>${post.date}</span>
  1058.                        </div>
  1059.                    </div>
  1060.                </div>
  1061.            `;
  1062.        };
  1063.  
  1064.        const populatePopularContents = (posts) => {
  1065.            const grid = document.getElementById('popular-contents-grid');
  1066.            if (!grid || !posts) return;
  1067.            grid.innerHTML = posts.map(createPostCard).join('');
  1068.        };
  1069.        
  1070.        const populateLatestNews = (newsItems) => {
  1071.            const list = document.querySelector('#latest-news-container .news-list');
  1072.            if (!list || !newsItems) return;
  1073.            list.innerHTML = newsItems.map(item => `
  1074.                <div class="news-item">
  1075.                    <a href="${item.link}" class="news-item-image-link">
  1076.                        <img src="${item.image}" alt="${item.title}">
  1077.                    </a>
  1078.                    <div class="news-item-content">
  1079.                        <h4>${item.title}</h4>
  1080.                        <p>${item.excerpt}</p>
  1081.                        <span class="news-date">${item.date}</span>
  1082.                    </div>
  1083.                </div>
  1084.            `).join('');
  1085.        };
  1086.        
  1087.        const populateHotArticles = (articles) => {
  1088.            const list = document.querySelector('#hot-articles-container .hot-articles-list');
  1089.            if (!list || !articles) return;
  1090.            list.innerHTML = articles.map(item => `
  1091.                <div class="hot-article-item">
  1092.                    <a href="${item.link}">
  1093.                        <h4>${item.title}</h4>
  1094.                        <p>By ${item.author} - ${item.date}</p>
  1095.                    </a>
  1096.                </div>
  1097.            `).join('');
  1098.        };
  1099.  
  1100.        const populateTags = (tags) => {
  1101.            const container = document.getElementById('popular-tags-container');
  1102.            if (!container || !tags) return;
  1103.            container.innerHTML = tags.map(tag => `<a href="${tag.link}" class="tag-link">${tag.name}</a>`).join('');
  1104.        };
  1105.  
  1106.        const populateFooter = (footerItems, copyright) => {
  1107.            const grid = document.getElementById('footer-grid-container');
  1108.            const copyrightEl = document.getElementById('copyright-text');
  1109.            if (grid && footerItems) {
  1110.                grid.innerHTML = footerItems.map(col => `
  1111.                    <div class="footer-col">
  1112.                        <h4>${col.title}</h4>
  1113.                        <ul>
  1114.                            ${col.contents.map(item => `<li>${item}</li>`).join('')}
  1115.                        </ul>
  1116.                    </div>
  1117.                `).join('');
  1118.            }
  1119.            if (copyrightEl && copyright) {
  1120.                copyrightEl.textContent = copyright;
  1121.            }
  1122.        };
  1123.  
  1124.        const highlightActiveNav = () => {
  1125.            const navLinks = document.querySelectorAll('#nav-menu a');
  1126.            const currentPath = window.location.pathname;
  1127.            navLinks.forEach(link => {
  1128.                const linkPath = new URL(link.href).pathname;
  1129.                if (linkPath === currentPath) {
  1130.                    link.classList.add('active');
  1131.                }
  1132.            });
  1133.        };
  1134.        
  1135.        const showToast = (message) => {
  1136.            const existingToast = document.querySelector('.toast-notification');
  1137.            if (existingToast) {
  1138.                existingToast.remove();
  1139.            }
  1140.            
  1141.            const toast = document.createElement('div');
  1142.            toast.className = 'toast-notification';
  1143.            toast.textContent = message;
  1144.            document.body.appendChild(toast);
  1145.            
  1146.            setTimeout(() => {
  1147.                toast.classList.add('show');
  1148.            }, 10);
  1149.            
  1150.            setTimeout(() => {
  1151.                toast.classList.remove('show');
  1152.                setTimeout(() => {
  1153.                    toast.remove();
  1154.                }, 500);
  1155.            }, 3000);
  1156.        };
  1157.  
  1158.        const setupEventListeners = () => {
  1159.            // Smooth scroll for "Latest Content" button
  1160.            const latestContentBtn = document.getElementById('latest-content-btn');
  1161.            if (latestContentBtn) {
  1162.                latestContentBtn.addEventListener('click', function (e) {
  1163.                    e.preventDefault();
  1164.                    document.querySelector(this.getAttribute('href')).scrollIntoView({
  1165.                        behavior: 'smooth'
  1166.                    });
  1167.                });
  1168.            }
  1169.  
  1170.            // Newsletter form submission
  1171.            const newsletterForm = document.getElementById('newsletter-form');
  1172.            if (newsletterForm) {
  1173.                newsletterForm.addEventListener('submit', function(e) {
  1174.                    e.preventDefault();
  1175.                    const emailInput = this.querySelector('input[type="email"]');
  1176.                    if (emailInput.value.trim() !== '') {
  1177.                        showToast('Subscribe successful!');
  1178.                        emailInput.value = '';
  1179.                    }
  1180.                });
  1181.            }
  1182.        };
  1183.  
  1184.        // Initial load
  1185.        fetchData();
  1186.    });
  1187.    </script>
  1188. </body>
  1189. </html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda