From 1509fe18a46016e74c8a75e673eb18ddd922bc2c Mon Sep 17 00:00:00 2001 From: adminvns Date: Mon, 26 Jan 2026 15:31:51 +0530 Subject: [PATCH] new UI --- .gitignore | 7 +- assets/css/style.css | 1249 +++++++++++++++++++--- assets/js/main.js | 26 +- assets/vendor/php-email-form/validate.js | 83 -- cypress.config.js | 15 +- cypress/README.md | 161 +++ cypress/e2e/spec.cy.js | 262 ++++- cypress/support/commands.js | 35 - index.html | 580 +++++++--- package-lock.json | 322 +++--- package.json | 10 +- robots.txt | 4 + sitemap.xml | 21 + 13 files changed, 2149 insertions(+), 626 deletions(-) delete mode 100644 assets/vendor/php-email-form/validate.js create mode 100644 cypress/README.md create mode 100644 robots.txt create mode 100644 sitemap.xml diff --git a/.gitignore b/.gitignore index e852446..ebf5fc0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,9 @@ node_modules /node_modules node_modules/ .vscode -/mochawesome-report \ No newline at end of file +/mochawesome-report +mochawesome-report/ +cypress/videos +cypress/screenshots +cypress/downloads +*.log diff --git a/assets/css/style.css b/assets/css/style.css index e533dfe..c0135e5 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -8,18 +8,48 @@ /*-------------------------------------------------------------- # General --------------------------------------------------------------*/ +@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;600;700&display=swap'); + +:root { + --primary-bg: #ffffff; + --secondary-bg: #f8f9fa; + --accent-primary: #20349F; + --accent-hover: #3b50d9; + --text-main: #333333; + --text-muted: #666666; + --glass-bg: rgba(32, 52, 159, 0.05); + --glass-border: rgba(32, 52, 159, 0.1); + --heading-color: #20349F; + --header-bg: #040b14; +} + +body.dark-mode { + --primary-bg: #0a0a0a; + --secondary-bg: #141414; + --accent-primary: #3b50d9; + --accent-hover: #5c6fff; + --text-main: #e0e0e0; + --text-muted: #a0a0a0; + --glass-bg: rgba(255, 255, 255, 0.05); + --glass-border: rgba(255, 255, 255, 0.1); + --heading-color: #ffffff; +} + body { - font-family: "Open Sans", sans-serif; - color: #272829; + font-family: 'Outfit', sans-serif; + color: var(--text-main); + background: var(--primary-bg); + transition: background 0.3s, color 0.3s; } a { - color: #149ddd; + color: var(--accent-primary); text-decoration: none; + transition: 0.3s; } a:hover { - color: #37b3ed; + color: var(--accent-hover); text-decoration: none; } @@ -29,7 +59,9 @@ h3, h4, h5, h6 { - font-family: "Raleway", sans-serif; + font-family: 'Outfit', sans-serif; + font-weight: 700; + color: var(--heading-color); } /*-------------------------------------------------------------- @@ -42,7 +74,7 @@ h6 { right: 15px; bottom: 15px; z-index: 996; - background: #149ddd; + background: var(--accent-primary); width: 40px; height: 40px; border-radius: 50px; @@ -51,13 +83,13 @@ h6 { .back-to-top i { font-size: 28px; - color: #fff; + color: #000; line-height: 0; } .back-to-top:hover { - background: #2eafec; - color: #fff; + background: var(--accent-hover); + color: #000; } .back-to-top.active { @@ -78,7 +110,7 @@ h6 { z-index: 9997; transition: all 0.5s; padding: 0 15px; - background: #040b14; + background: var(--header-bg); overflow-y: auto; } @@ -86,29 +118,30 @@ h6 { margin: 15px auto; display: block; width: 120px; - border: 8px solid #2c2f3f; + border: 4px solid var(--accent-primary); + box-shadow: 0 0 20px rgba(32, 52, 159, 0.3); } #header .profile h1 { font-size: 24px; margin: 0; padding: 0; - font-weight: 600; + font-weight: 700; -moz-text-align-last: center; text-align-last: center; - font-family: "Poppins", sans-serif; + letter-spacing: 1px; } #header .profile h1 a, #header .profile h1 a:hover { - color: #fff; + color: var(--accent-primary); text-decoration: none; } #header .profile .social-links a { font-size: 18px; display: inline-block; - background: #212431; + background: var(--glass-bg); color: #fff; line-height: 1; padding: 8px 0; @@ -118,12 +151,14 @@ h6 { width: 36px; height: 36px; transition: 0.3s; + border: 1px solid var(--glass-border); } #header .profile .social-links a:hover { - background: #149ddd; - color: #fff; + background: var(--accent-primary); + color: #000; text-decoration: none; + transform: translateY(-3px); } #header .profile .social-links a.coffee:hover { @@ -258,7 +293,7 @@ h6 { .nav-menu .active i, .nav-menu .active:focus i, .nav-menu li:hover>a i { - color: #149ddd; + color: var(--accent-primary); } /* Mobile Navigation */ @@ -271,7 +306,7 @@ h6 { font-size: 24px; transition: all 0.4s; outline: none !important; - background-color: #149ddd; + background-color: var(--accent-primary); color: #fff; width: 40px; height: 40px; @@ -297,8 +332,7 @@ h6 { #hero { width: 100%; height: 100vh; - /* background: url("../img/background-shubam.jpg") top center; - background-size: cover; */ + position: relative; overflow: hidden; } @@ -309,14 +343,26 @@ h6 { width: 100%; height: 100%; object-fit: cover; - /* Makes sure the video covers the entire container */ z-index: -1; - /* Sends the video behind other content */ } +#hero::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 30%, var(--accent-primary) 0%, transparent 50%), + radial-gradient(circle at 80% 70%, var(--accent-primary) 0%, transparent 50%); + z-index: 1; +} + + #hero:before { content: ""; - background: rgba(5, 13, 24, 0.3); + background: rgba(5, 13, 24, 0.4); position: absolute; bottom: 0; top: 0; @@ -333,10 +379,13 @@ h6 { #hero h1 { margin: 0 0 10px 0; - font-size: 64px; - font-weight: 700; - line-height: 56px; - color: #fff; + font-size: 80px; + font-weight: 800; + line-height: 1.1; + background: linear-gradient(to right, #ffffff, var(--accent-primary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + /* Hero text always white-ish for visibility */ } #hero p { @@ -347,10 +396,112 @@ h6 { } #hero p span { - color: #fff; + color: #ffffff; padding-bottom: 4px; letter-spacing: 1px; - border-bottom: 3px solid #149ddd; + border-bottom: 3px solid var(--accent-primary); +} + +/* Hero Buttons */ +.hero-buttons { + display: flex !important; + flex-direction: row !important; + align-items: center; + justify-content: center; + gap: 20px; + flex-wrap: nowrap !important; + margin-top: 50px; +} + +.btn-hero-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 64px; + height: 64px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + border: 2px solid rgba(255, 255, 255, 0.2); + color: #fff; + font-size: 28px; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + flex-shrink: 0; +} + +.btn-hero-icon::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: var(--accent-primary); + transition: all 0.4s ease; + transform: translate(-50%, -50%); + z-index: -1; +} + +.btn-hero-icon:hover { + transform: translateY(-5px); + border-color: var(--accent-primary); + box-shadow: 0 10px 30px rgba(59, 80, 217, 0.4); +} + +.btn-hero-icon:hover::before { + width: 100%; + height: 100%; +} + +.btn-hero-icon i { + position: relative; + z-index: 1; +} + +.btn-hero { + display: inline-flex; + align-items: center; + gap: 10px; + padding: 16px 36px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-hover)); + color: #fff; + border-radius: 50px; + font-weight: 600; + font-size: 17px; + border: 2px solid transparent; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + box-shadow: 0 8px 25px rgba(59, 80, 217, 0.3); + flex-shrink: 0; +} + +.btn-hero::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s ease; +} + +.btn-hero:hover::before { + left: 100%; +} + +.btn-hero:hover { + transform: translateY(-3px); + box-shadow: 0 12px 35px rgba(59, 80, 217, 0.5); + color: #fff; +} + +.btn-hero i { + font-size: 22px; } @media (min-width: 1024px) { @@ -361,15 +512,72 @@ h6 { @media (max-width: 768px) { #hero h1 { - font-size: 28px; - line-height: 36px; + font-size: 48px; + line-height: 1.1; } - #hero h2 { - font-size: 18px; - line-height: 24px; + .hero-buttons { + gap: 8px !important; + margin-top: 35px; + flex-wrap: nowrap !important; + flex-direction: row !important; + } + + .btn-hero-icon { + width: 46px; + height: 46px; + font-size: 19px; + } + + .btn-hero { + padding: 11px 18px; + font-size: 13px; + } + + .btn-hero i { + font-size: 17px; + } + + @media (max-width: 575px) { + #hero h1 { + font-size: 32px; + } + + .hero-buttons { + gap: 6px !important; + margin-top: 30px; + flex-direction: row !important; + } + + .btn-hero-icon { + width: 42px; + height: 42px; + font-size: 17px; + } + + .btn-hero { + padding: 9px 14px; + font-size: 12px; + gap: 5px; + } + + .btn-hero i { + font-size: 15px; + } + + .btn-hero span { + display: inline; + } + } + + #hero p { + font-size: 20px; margin-bottom: 30px; } + + .section-title h2 { + font-size: 28px; + } } /*-------------------------------------------------------------- @@ -381,7 +589,7 @@ section { } .section-bg { - background: #f5f8fd; + background: var(--secondary-bg); } .section-title { @@ -394,7 +602,7 @@ section { margin-bottom: 20px; padding-bottom: 20px; position: relative; - color: #173b6c; + color: var(--heading-color); } .section-title h2::after { @@ -403,7 +611,7 @@ section { display: block; width: 50px; height: 3px; - background: #149ddd; + background: var(--accent-primary); bottom: 0; left: 0; } @@ -418,7 +626,7 @@ section { .about .content h3 { font-weight: 700; font-size: 26px; - color: #173b6c; + color: var(--accent-primary); } .about .content ul { @@ -439,7 +647,7 @@ section { .about .content ul i { font-size: 16px; margin-right: 5px; - color: #149ddd; + color: var(--accent-primary); line-height: 0; } @@ -462,40 +670,48 @@ section { .facts .count-box i { display: block; font-size: 44px; - color: #149ddd; + color: var(--accent-primary); float: left; line-height: 0; } .facts .count-box span { - font-size: 48px; - line-height: 40px; - display: block; + font-size: 44px; + line-height: 44px; + display: inline-block; font-weight: 700; - color: #050d18; + color: var(--heading-color); margin-left: 60px; } +.facts .count-box .plus-sign { + font-size: 32px; + margin-left: 2px; + color: var(--accent-primary); + vertical-align: top; + line-height: 44px; +} + .facts .count-box p { padding: 15px 0 0 0; margin: 0 0 0 60px; - font-family: "Raleway", sans-serif; + font-family: 'Outfit', sans-serif; font-size: 14px; - color: #122f57; + color: var(--text-muted); } .facts .count-box a { font-weight: 600; display: block; margin-top: 20px; - color: #122f57; + color: var(--accent-primary); font-size: 15px; - font-family: "Poppins", sans-serif; + font-family: 'Outfit', sans-serif; transition: ease-in-out 0.3s; } .facts .count-box a:hover { - color: #1f5297; + color: var(--accent-hover); } /*-------------------------------------------------------------- @@ -514,8 +730,7 @@ section { text-transform: uppercase; display: block; font-weight: 600; - font-family: "Poppins", sans-serif; - color: #050d18; + color: var(--heading-color); } .skills .progress .skill .val { @@ -524,15 +739,18 @@ section { } .skills .progress-bar-wrap { - background: #dce8f8; + background: var(--glass-bg); height: 10px; + border-radius: 5px; } .skills .progress-bar { width: 1px; height: 10px; transition: 0.9s; - background-color: #149ddd; + background-color: var(--accent-primary); + border-radius: 5px; + box-shadow: 0 0 10px rgba(32, 52, 159, 0.5); } /*-------------------------------------------------------------- @@ -543,13 +761,13 @@ section { font-weight: 700; margin-top: 20px; margin-bottom: 20px; - color: #050d18; + color: var(--accent-primary); } .resume .resume-item { padding: 0 0 20px 20px; margin-top: -2px; - border-left: 2px solid #1f5297; + border-left: 2px solid var(--accent-primary); position: relative; } @@ -558,18 +776,19 @@ section { font-size: 18px; font-weight: 600; text-transform: uppercase; - font-family: "Poppins", sans-serif; - color: #050d18; + color: var(--heading-color); margin-bottom: 10px; } .resume .resume-item h5 { font-size: 16px; - background: #e4edf9; + background: var(--glass-bg); padding: 5px 15px; display: inline-block; font-weight: 600; margin-bottom: 10px; + border: 1px solid var(--glass-border); + color: var(--accent-primary); } .resume .resume-item ul { @@ -592,8 +811,8 @@ section { border-radius: 50px; left: -9px; top: 0; - background: #fff; - border: 2px solid #1f5297; + background: var(--primary-bg); + border: 2px solid var(--accent-primary); } /*-------------------------------------------------------------- @@ -608,7 +827,7 @@ section { margin: 0 auto 35px auto; list-style: none; text-align: center; - background: #fff; + background: var(--secondary-bg); border-radius: 50px; padding: 2px 15px; } @@ -621,14 +840,14 @@ section { font-weight: 600; line-height: 1; text-transform: uppercase; - color: #272829; + color: var(--text-main); margin-bottom: 5px; transition: all 0.3s ease-in-out; } .portfolio #portfolio-flters li:hover, .portfolio #portfolio-flters li.filter-active { - color: #149ddd; + color: var(--accent-primary); } .portfolio #portfolio-flters li:last-child { @@ -671,7 +890,8 @@ section { color: #fff; font-size: 28px; text-align: center; - background: rgba(20, 157, 221, 0.75); + background: var(--accent-primary); + opacity: 0.8; transition: 0.3s; width: 50%; } @@ -681,7 +901,7 @@ section { } .portfolio .portfolio-wrap .portfolio-links a+a { - border-left: 1px solid #37b3ed; + border-left: 1px solid var(--accent-primary); } .portfolio .portfolio-wrap:hover::before { @@ -716,13 +936,13 @@ section { .portfolio-details .portfolio-details-slider .swiper-pagination .swiper-pagination-bullet { width: 12px; height: 12px; - background-color: #fff; + background-color: var(--primary-bg); opacity: 1; - border: 1px solid #149ddd; + border: 1px solid var(--accent-primary); } .portfolio-details .portfolio-details-slider .swiper-pagination .swiper-pagination-bullet-active { - background-color: #149ddd; + background-color: var(--accent-primary); } .portfolio-details .portfolio-info { @@ -735,7 +955,8 @@ section { font-weight: 700; margin-bottom: 20px; padding-bottom: 20px; - border-bottom: 1px solid #eee; + border-bottom: 1px solid var(--glass-border); + color: var(--heading-color); } .portfolio-details .portfolio-info ul { @@ -776,10 +997,10 @@ section { justify-content: center; width: 54px; height: 54px; - background: #149ddd; + background: var(--accent-primary); border-radius: 50%; transition: 0.5s; - border: 1px solid #149ddd; + border: 1px solid var(--accent-primary); } .services .icon i { @@ -789,11 +1010,11 @@ section { } .services .icon-box:hover .icon { - background: #fff; + background: var(--secondary-bg); } .services .icon-box:hover .icon i { - color: #149ddd; + color: var(--accent-primary); } .services .title { @@ -804,11 +1025,11 @@ section { } .services .title a { - color: #343a40; + color: var(--heading-color); } .services .title a:hover { - color: #149ddd; + color: var(--accent-primary); } .services .description { @@ -823,73 +1044,113 @@ section { .testimonials .testimonials-carousel, .testimonials .testimonials-slider { overflow: hidden; + padding: 40px 0; } .testimonials .testimonial-item { - box-sizing: content-box; - text-align: center; - min-height: 320px; + padding: 20px; } -.testimonials .testimonial-item .testimonial-img { - width: 90px; - border-radius: 50%; - margin: 0 auto; +.testimonials .testimonial-card { + background: var(--glass-bg); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 1px solid var(--glass-border); + border-radius: 20px; + padding: 40px 30px; + position: relative; + transition: 0.4s; + height: 100%; + display: flex; + flex-direction: column; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); } -.testimonials .testimonial-item h3 { - font-size: 18px; - font-weight: bold; - margin: 10px 0 5px 0; - color: #111; +.testimonials .testimonial-card:hover { + transform: translateY(-10px); + border-color: var(--accent-primary); + box-shadow: 0 15px 50px rgba(32, 52, 159, 0.3); } -.testimonials .testimonial-item h4 { - font-size: 14px; - color: #999; - margin: 0; +.testimonials .quote-icon { + position: absolute; + top: 30px; + right: 30px; + font-size: 80px; + color: var(--accent-primary); + opacity: 0.1; + pointer-events: none; + transition: 0.3s; } -.testimonials .testimonial-item .quote-icon-left, -.testimonials .testimonial-item .quote-icon-right { - color: #c3e8fa; - font-size: 26px; +.testimonials .testimonial-card:hover .quote-icon { + opacity: 0.25; + transform: rotate(-10deg) scale(1.1); } -.testimonials .testimonial-item .quote-icon-left { - display: inline-block; - left: -5px; - position: relative; +.testimonials .testimonial-text { + font-size: 16px; + line-height: 1.6; + color: var(--text-main); + margin-bottom: 30px; + font-style: italic; + flex-grow: 1; } -.testimonials .testimonial-item .quote-icon-right { - display: inline-block; - right: -5px; - position: relative; - top: 10px; +.testimonials .author-wrapper { + display: flex; + align-items: center; + gap: 15px; + margin-top: auto; + border-top: 1px solid var(--glass-border); + padding-top: 20px; } -.testimonials .testimonial-item p { - font-style: italic; - margin: 0 15px 15px 15px; - padding: 20px; - background: #fff; +.testimonials .testimonial-img { + width: 60px; + height: 60px; + border-radius: 50%; + border: 2px solid var(--accent-primary); + object-fit: cover; + flex-shrink: 0; +} + +.testimonials .author-details { + text-align: left; +} + +.testimonials .author-details h3 { + font-size: 18px; + font-weight: 700; + margin: 0; + color: var(--heading-color); +} + +.testimonials .author-details h4 { + font-size: 13px; + color: var(--text-muted); + margin: 2px 0 0 0; + font-weight: 400; +} + +.testimonials .swiper-pagination { + margin-top: 40px; position: relative; - margin-bottom: 35px; - border-radius: 6px; - box-shadow: 0px 2px 15px rgba(0, 0, 0, 0.1); } -.testimonials .testimonial-item p::after { - content: ""; - width: 0; - height: 0; - border-top: 20px solid #fff; - border-right: 20px solid transparent; - border-left: 20px solid transparent; - position: absolute; - bottom: -20px; - left: calc(50% - 20px); +.testimonials .swiper-pagination .swiper-pagination-bullet { + width: 10px; + height: 10px; + background-color: var(--text-muted); + opacity: 0.3; + transition: 0.3s; +} + +.testimonials .swiper-pagination .swiper-pagination-bullet-active { + background-color: var(--accent-primary); + opacity: 1; + width: 35px; + border-radius: 5px; } .testimonials .swiper-pagination { @@ -900,13 +1161,13 @@ section { .testimonials .swiper-pagination .swiper-pagination-bullet { width: 12px; height: 12px; - background-color: #fff; + background-color: var(--glass-bg); opacity: 1; - border: 1px solid #149ddd; + border: 1px solid var(--accent-primary); } .testimonials .swiper-pagination .swiper-pagination-bullet-active { - background-color: #149ddd; + background-color: var(--accent-primary); } /*-------------------------------------------------------------- @@ -918,18 +1179,20 @@ section { .contact .info { padding: 30px; - background: #fff; + background: var(--glass-bg); + backdrop-filter: blur(10px); width: 100%; - box-shadow: 0 0 24px 0 rgba(0, 0, 0, 0.12); + border: 1px solid var(--glass-border); + border-radius: 15px; } .contact .info i { font-size: 20px; - color: #149ddd; + color: #000; float: left; width: 44px; height: 44px; - background: #dff3fc; + background: var(--accent-primary); display: flex; justify-content: center; align-items: center; @@ -942,14 +1205,14 @@ section { font-size: 22px; font-weight: 600; margin-bottom: 5px; - color: #050d18; + color: var(--heading-color); } .contact .info p { padding: 0 0 10px 60px; margin-bottom: 20px; font-size: 14px; - color: #173b6c; + color: var(--text-muted); } .contact .info .email p { @@ -976,22 +1239,24 @@ section { } .contact .info .social-links a:hover { - background: #149ddd; + background: var(--accent-primary); color: #fff; } .contact .info .email:hover i, .contact .info .address:hover i, .contact .info .phone:hover i { - background: #149ddd; + background: var(--accent-primary); color: #fff; } .contact .php-email-form { width: 100%; padding: 30px; - background: #fff; - box-shadow: 0 0 24px 0 rgba(0, 0, 0, 0.12); + background: var(--glass-bg); + backdrop-filter: blur(10px); + border: 1px solid var(--glass-border); + border-radius: 15px; } .contact .php-email-form .form-group { @@ -1030,7 +1295,7 @@ section { .contact .php-email-form .loading { display: none; - background: #fff; + background: var(--secondary-bg); text-align: center; padding: 15px; } @@ -1054,13 +1319,23 @@ section { .contact .php-email-form label { padding-bottom: 8px; + color: var(--text-main); } .contact .php-email-form input, .contact .php-email-form textarea { - border-radius: 0; + border-radius: 4px; box-shadow: none; font-size: 14px; + background: var(--primary-bg); + border: 1px solid var(--glass-border); + color: var(--text-main); +} + +.contact .php-email-form input:focus, +.contact .php-email-form textarea:focus { + border-color: var(--accent-primary); + outline: none; } .contact .php-email-form input { @@ -1072,16 +1347,16 @@ section { } .contact .php-email-form button[type=submit] { - background: #149ddd; + background: var(--accent-primary); border: 0; padding: 10px 24px; - color: #fff; + color: #000; transition: 0.4s; border-radius: 4px; } .contact .php-email-form button[type=submit]:hover { - background: #37b3ed; + background: var(--accent-hover); } @-webkit-keyframes animate-loading { @@ -1109,12 +1384,13 @@ section { --------------------------------------------------------------*/ .breadcrumbs { padding: 20px 0; - background: #f9f9f9; + background: var(--secondary-bg); } .breadcrumbs h2 { font-size: 26px; - font-weight: 300; + font-weight: 700; + color: var(--heading-color); } .breadcrumbs ol { @@ -1133,7 +1409,7 @@ section { .breadcrumbs ol li+li::before { display: inline-block; padding-right: 10px; - color: #0e2442; + color: var(--text-muted); content: "/"; } @@ -1156,31 +1432,708 @@ section { --------------------------------------------------------------*/ #footer { padding: 15px; - color: #f4f6fd; + color: #eaebf0; font-size: 14px; position: fixed; left: 0; bottom: 0; width: 300px; z-index: 9999; - background: #040b14; + background: var(--header-bg); } #footer .copyright { text-align: center; } +#footer .copyright span { + color: var(--accent-primary); + font-weight: 700; +} + #footer .credits { padding-top: 5px; text-align: center; font-size: 13px; - color: #eaebf0; + color: var(--text-muted); } @media (max-width: 1199px) { #footer { position: static; width: auto; - padding-right: 20px 15px; + padding: 20px 15px; + background: var(--primary-bg); + color: var(--text-muted); + border-top: 1px solid var(--glass-border); + } +} + +@media (max-width: 768px) { + .facts .row { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; + } + + .facts .count-box { + padding: 20px 10px; + text-align: center; + } + + .facts .count-box i { + float: none; + display: block; + margin: 0 auto 15px; + } + + .facts .count-box span, + .facts .count-box p { + margin-left: 0; + } + + .facts .count-box span { + font-size: 36px; + line-height: 36px; + } + + .facts .count-box .plus-sign { + font-size: 28px; + line-height: 36px; + } + + .facts .count-box p { + font-size: 13px; + } +} + +@media (max-width: 575px) { + .glass-container { + padding: 15px; + } + + .resume .resume-item { + padding: 15px !important; + } + + .facts .count-box { + padding: 15px 5px; + } + + .facts .count-box i { + font-size: 36px; + margin-bottom: 10px; + } + + .facts .count-box span { + font-size: 32px; + line-height: 32px; + } + + .facts .count-box .plus-sign { + font-size: 24px; + line-height: 32px; + } + + .facts .count-box p { + font-size: 12px; + padding-top: 10px; + } + + #hero h1 { + font-size: 36px; + } +} + +/* Premium Glassmorphism Utilities */ +.glass-container { + background: var(--glass-bg); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border: 1px solid var(--glass-border); + border-radius: 15px; + padding: 25px; + transition: 0.3s; +} + +.glass-container:hover { + border-color: var(--accent-primary); + transform: translateY(-5px); + box-shadow: 0 10px 30px var(--accent-primary); +} + +.testimonial-item { + background: var(--glass-bg) !important; + backdrop-filter: blur(10px); + border: 1px solid var(--glass-border) !important; + padding: 30px; + border-radius: 15px; +} + +.skills-content .progress { + background: none !important; +} + +.resume-item { + background: var(--glass-bg); + padding: 20px !important; + margin-bottom: 20px !important; + border-radius: 10px; + border: 1px solid var(--glass-border) !important; + border-left: 3px solid var(--accent-primary) !important; +} + +.resume-item::before { + display: none; + /* Remove old bullet circle */ +} + +/* Removed duplicate #hero h1 */ + +/* Theme Switcher Styles */ +.theme-switch-wrapper { + display: flex; + align-items: center; + position: fixed; + top: 20px; + right: 70px; + /* Offset from mobile menu */ + z-index: 10000; +} + +.theme-switch { + display: inline-block; + height: 34px; + position: relative; + width: 60px; +} + +.theme-switch input { + display: none; +} + +.slider { + background-color: #ccc; + bottom: 0; + cursor: pointer; + left: 0; + position: absolute; + right: 0; + top: 0; + transition: .4s; + border-radius: 34px; +} + +.slider:before { + background-color: var(--primary-bg); + bottom: 4px; + content: ""; + height: 26px; + left: 4px; + position: absolute; + transition: .4s; + width: 26px; + border-radius: 50%; +} + +input:checked+.slider { + background-color: var(--accent-primary); +} + +input:checked+.slider:before { + transform: translateX(26px); +} + +.slider i { + position: absolute; + top: 50%; + transform: translateY(-50%); + font-size: 16px; + color: #444; +} + +.slider .fa-sun { + left: 8px; +} + +.slider .fa-moon { + right: 8px; + color: #fff; +} + +@media (max-width: 1199px) { + .theme-switch-wrapper { + right: 70px; + top: 15px; + } +} + +/* LinkedIn Premium Button Animation */ +.linkedin-btn-premium { + display: inline-block; + padding: 4px 12px; + background: var(--accent-primary); + color: #fff !important; + border-radius: 4px; + font-weight: 600; + transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); + box-shadow: 0 4px 15px rgba(32, 52, 159, 0.3); + position: relative; + overflow: hidden; + z-index: 1; +} + +.linkedin-btn-premium:hover { + transform: scale(1.1) translateY(-2px); + background: var(--accent-hover); + box-shadow: 0 8px 25px rgba(32, 52, 159, 0.5); + color: #fff !important; +} + +.linkedin-btn-premium::before { + content: ""; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(120deg, transparent, rgba(255, 255, 255, 0.3), transparent); + transition: all 0.5s; +} + +.linkedin-btn-premium:hover::before { + left: 100%; +} + +@keyframes pulse-gold { + 0% { + box-shadow: 0 0 0 0 var(--accent-primary); + } + + 70% { + box-shadow: 0 0 0 10px rgba(32, 52, 159, 0); + } + + 100% { + box-shadow: 0 0 0 0 rgba(32, 52, 159, 0); + } +} + +.linkedin-btn-premium { + animation: pulse-gold 2s infinite; +} + +/* Hero Buttons */ +.hero-buttons { + display: flex; + gap: 15px; + justify-content: center; +} + +.btn-hero { + background: var(--accent-primary); + color: #fff !important; + padding: 10px 30px; + border-radius: 50px; + font-weight: 600; + transition: 0.3s; + border: 2px solid var(--accent-primary); + text-decoration: none; +} + +.btn-hero:hover { + background: var(--accent-hover); + border-color: var(--accent-hover); + transform: translateY(-3px); + box-shadow: 0 5px 15px rgba(32, 52, 159, 0.4); +} + +.btn-hero-outline { + background: transparent; + color: #fff !important; + padding: 10px 30px; + border-radius: 50px; + font-weight: 600; + transition: 0.3s; + border: 2px solid #fff; + text-decoration: none; +} + +.btn-hero-outline:hover { + background: #fff; + color: var(--accent-primary) !important; + transform: translateY(-3px); + box-shadow: 0 5px 15px rgba(255, 255, 255, 0.2); +} + +@media (max-width: 575px) { + .hero-buttons { + flex-direction: column; + align-items: center; + gap: 10px; + } +} + +/* ======= Modern Skills Section ======= */ +.skills-category { + margin-bottom: 50px; +} + +.category-title { + font-size: 22px; + font-weight: 700; + color: var(--accent-primary); + margin-bottom: 25px; + display: flex; + align-items: center; + gap: 10px; +} + +.category-title i { + font-size: 28px; +} + +.skills-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 20px; +} + +.skill-card { + background: var(--glass-bg); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border: 1px solid var(--glass-border); + border-radius: 15px; + padding: 25px 15px; + text-align: center; + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.skill-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, var(--accent-primary), transparent); + transform: scaleX(0); + transition: transform 0.3s ease; +} + +.skill-card:hover::before { + transform: scaleX(1); +} + +.skill-card:hover { + transform: translateY(-10px); + border-color: var(--accent-primary); + box-shadow: 0 15px 40px rgba(32, 52, 159, 0.3); +} + +.skill-logo { + width: 60px; + height: 60px; + object-fit: contain; + margin-bottom: 15px; + transition: transform 0.3s ease; +} + +.skill-card:hover .skill-logo { + transform: scale(1.1) rotate(5deg); +} + +.skill-card h4 { + font-size: 16px; + font-weight: 600; + color: var(--heading-color); + margin-bottom: 10px; +} + +.skill-badge { + display: inline-block; + padding: 4px 12px; + border-radius: 20px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.skill-badge.expert { + background: linear-gradient(135deg, #20349f, #4158d0); + color: #fff; + box-shadow: 0 4px 15px rgba(32, 52, 159, 0.3); +} + +.skill-badge.advanced { + background: linear-gradient(135deg, #667eea, #764ba2); + color: #fff; +} + +.skill-badge.intermediate { + background: linear-gradient(135deg, #f093fb, #f5576c); + color: #fff; +} + +/* Mobile Responsiveness for Skills */ +@media (max-width: 768px) { + .skills-grid { + grid-template-columns: repeat(3, 1fr); + gap: 15px; + } + + .skill-card { + padding: 20px 10px; + } + + .skill-logo { + width: 50px; + height: 50px; + } + + .skill-card h4 { + font-size: 14px; + } + + .category-title { + font-size: 18px; + } +} + +@media (max-width: 575px) { + .skills-grid { + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + + .skill-card { + padding: 15px 8px; + } + + .skill-logo { + width: 40px; + height: 40px; + } + + .skill-card h4 { + font-size: 13px; + } + + .skill-badge { + font-size: 9px; + padding: 3px 8px; + } +} + +/* ======= Skills Tabs System ======= */ +.skills-tabs { + margin-top: 30px; +} + +.tab-buttons { + display: flex; + justify-content: center; + gap: 15px; + margin-bottom: 30px; + flex-wrap: wrap; +} + +.tab-btn { + background: var(--glass-bg); + border: 2px solid var(--glass-border); + color: var(--text-main); + padding: 12px 25px; + border-radius: 50px; + font-weight: 600; + font-size: 15px; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 8px; +} + +.tab-btn i { + font-size: 18px; +} + +.tab-btn:hover { + border-color: var(--accent-primary); + transform: translateY(-2px); +} + +.tab-btn.active { + background: var(--accent-primary); + color: #fff; + border-color: var(--accent-primary); + box-shadow: 0 5px 20px rgba(32, 52, 159, 0.4); +} + +.tab-content { + display: none; + animation: fadeIn 0.5s ease; +} + +.tab-content.active { + display: block; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* Mobile Tab Buttons */ +@media (max-width: 768px) { + .tab-buttons { + gap: 10px; + } + + .tab-btn { + padding: 10px 20px; + font-size: 14px; + } + + .tab-btn span { + display: inline; + } +} + +@media (max-width: 575px) { + .tab-btn { + padding: 8px 15px; + font-size: 13px; + } + + .tab-btn i { + font-size: 16px; + } +} + +/* Download Resume Button */ +.btn-download-resume { + display: inline-flex; + align-items: center; + gap: 10px; + background: linear-gradient(135deg, var(--accent-primary), #4158d0); + color: #fff !important; + padding: 15px 35px; + border-radius: 50px; + font-weight: 700; + font-size: 16px; + text-decoration: none; + transition: all 0.3s ease; + box-shadow: 0 8px 25px rgba(32, 52, 159, 0.3); + border: 2px solid transparent; +} + +.btn-download-resume i { + font-size: 20px; + animation: bounce 2s infinite; +} + +.btn-download-resume:hover { + transform: translateY(-5px); + box-shadow: 0 15px 40px rgba(32, 52, 159, 0.5); + background: linear-gradient(135deg, #4158d0, var(--accent-primary)); +} + +@keyframes bounce { + + 0%, + 100% { + transform: translateY(0); + } + + 50% { + transform: translateY(-5px); + } +} + +@media (max-width: 575px) { + .btn-download-resume { + padding: 12px 25px; + font-size: 14px; + } +} + +/* Text-based Tosca Logo */ +.skill-logo-text { + width: 60px; + height: 60px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 0 auto 15px; + transition: transform 0.3s ease; +} + +.skill-card:hover .skill-logo-text { + transform: scale(1.1) rotate(5deg); +} + +.tosca-logo { + background: linear-gradient(135deg, #00b4d8, #0077b6); + border-radius: 10px; + padding: 8px; +} + +.tosca-logo .logo-brand { + font-size: 9px; + font-weight: 700; + color: #fff; + letter-spacing: 1px; + display: block; + line-height: 1; +} + +.tosca-logo .logo-product { + font-size: 18px; + font-weight: 800; + color: #fff; + display: block; + margin-top: 2px; + line-height: 1; +} + +@media (max-width: 768px) { + .skill-logo-text { + width: 50px; + height: 50px; + } + + .tosca-logo .logo-brand { + font-size: 8px; + } + + .tosca-logo .logo-product { + font-size: 16px; + } +} + +@media (max-width: 575px) { + .skill-logo-text { + width: 40px; + height: 40px; + } + + .tosca-logo .logo-brand { + font-size: 7px; + } + + .tosca-logo .logo-product { + font-size: 13px; } } \ No newline at end of file diff --git a/assets/js/main.js b/assets/js/main.js index d069e92..698d260 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,10 +1,4 @@ -/** -* Template Name: iPortfolio - v3.7.0 -* Template URL: https://bootstrapmade.com/iportfolio-bootstrap-portfolio-websites-template/ -* Author: BootstrapMade.com -* License: https://bootstrapmade.com/license/ -*/ -(function() { +(function () { "use strict"; /** @@ -90,7 +84,7 @@ /** * Mobile nav toggle */ - on('click', '.mobile-nav-toggle', function(e) { + on('click', '.mobile-nav-toggle', function (e) { select('body').classList.toggle('mobile-nav-active') this.classList.toggle('bi-list') this.classList.toggle('bi-x') @@ -99,7 +93,7 @@ /** * Scrool with ofset on links with a class name .scrollto */ - on('click', '.scrollto', function(e) { + on('click', '.scrollto', function (e) { if (select(this.hash)) { e.preventDefault() @@ -149,7 +143,7 @@ new Waypoint({ element: skilsContent, offset: '80%', - handler: function(direction) { + handler: function (direction) { let progress = select('.progress .progress-bar', true); progress.forEach((el) => { el.style.width = el.getAttribute('aria-valuenow') + '%' @@ -170,9 +164,9 @@ let portfolioFilters = select('#portfolio-flters li', true); - on('click', '#portfolio-flters li', function(e) { + on('click', '#portfolio-flters li', function (e) { e.preventDefault(); - portfolioFilters.forEach(function(el) { + portfolioFilters.forEach(function (el) { el.classList.remove('filter-active'); }); this.classList.add('filter-active'); @@ -180,7 +174,7 @@ portfolioIsotope.arrange({ filter: this.getAttribute('data-filter') }); - portfolioIsotope.on('arrangeComplete', function() { + portfolioIsotope.on('arrangeComplete', function () { AOS.refresh() }); }, true); @@ -234,7 +228,11 @@ spaceBetween: 20 }, - 1200: { + 768: { + slidesPerView: 2, + spaceBetween: 20 + }, + 992: { slidesPerView: 3, spaceBetween: 20 } diff --git a/assets/vendor/php-email-form/validate.js b/assets/vendor/php-email-form/validate.js deleted file mode 100644 index 5d33c02..0000000 --- a/assets/vendor/php-email-form/validate.js +++ /dev/null @@ -1,83 +0,0 @@ - -(function () { - "use strict"; - - let forms = document.querySelectorAll('.php-email-form'); - - forms.forEach( function(e) { - e.addEventListener('submit', function(event) { - event.preventDefault(); - - // file deepcode ignore UseArrowFunction: - let thisForm = this; - - let action = thisForm.getAttribute('action'); - let recaptcha = thisForm.getAttribute('data-recaptcha-site-key'); - - if( ! action ) { - displayError(thisForm, 'The form action property is not set!') - return; - } - thisForm.querySelector('.loading').classList.add('d-block'); - thisForm.querySelector('.error-message').classList.remove('d-block'); - thisForm.querySelector('.sent-message').classList.remove('d-block'); - - let formData = new FormData( thisForm ); - - if ( recaptcha ) { - if(typeof grecaptcha !== "undefined" ) { - grecaptcha.ready(function() { - try { - grecaptcha.execute(recaptcha, {action: 'php_email_form_submit'}) - .then(token => { - formData.set('recaptcha-response', token); - php_email_form_submit(thisForm, action, formData); - }) - } catch(error) { - displayError(thisForm, error) - } - }); - } else { - displayError(thisForm, 'The reCaptcha javascript API url is not loaded!') - } - } else { - php_email_form_submit(thisForm, action, formData); - } - }); - }); - - function php_email_form_submit(thisForm, action, formData) { - fetch(action, { - method: 'POST', - body: formData, - headers: {'X-Requested-With': 'XMLHttpRequest'} - }) - .then(response => { - if( response.ok ) { - return response.text() - } else { - throw new Error(`${response.status} ${response.statusText} ${response.url}`); - } - }) - .then(data => { - thisForm.querySelector('.loading').classList.remove('d-block'); - if (data.trim() == 'OK') { - thisForm.querySelector('.sent-message').classList.add('d-block'); - thisForm.reset(); - } else { - throw new Error(data ? data : 'Form submission failed and no error message returned from: ' + action); - } - }) - .catch((error) => { - displayError(thisForm, error); - }); - } - - function displayError(thisForm, error) { - thisForm.querySelector('.loading').classList.remove('d-block'); - // file deepcode ignore DOMXSS: - thisForm.querySelector('.error-message').innerHTML = error; - thisForm.querySelector('.error-message').classList.add('d-block'); - } - -})(); diff --git a/cypress.config.js b/cypress.config.js index cc740ac..3f07b62 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -6,11 +6,24 @@ module.exports = defineConfig({ setupNodeEvents(on, config) { // implement node event listeners here }, + baseUrl: 'https://adminvns.github.io', + // baseUrl: 'http://localhost:5500', + viewportWidth: 1280, + viewportHeight: 720, + video: true, + screenshotOnRunFailure: true, + defaultCommandTimeout: 10000, + pageLoadTimeout: 30000, }, "reporter": "mochawesome", "reporterOptions": { + "reportDir": "mochawesome-report", "overwrite": true, "html": true, - "json": false + "json": false, + "charts": true, + "reportPageTitle": "Shubham Portfolio - Cypress Test Report", + "embeddedScreenshots": true, + "inlineAssets": true } }); diff --git a/cypress/README.md b/cypress/README.md new file mode 100644 index 0000000..f2cb444 --- /dev/null +++ b/cypress/README.md @@ -0,0 +1,161 @@ +# Cypress Testing Documentation + +## Overview +This project uses Cypress for end-to-end testing of the portfolio website. The tests verify functionality, UI components, navigation, and user interactions. + +## Test Structure + +### Test Suites +1. **Website Availability Check** - Verifies site is accessible and loads correctly +2. **Header and Navigation Check** - Tests navigation menu, social links, and profile display +3. **Theme Toggle Functionality** - Validates dark/light mode switching +4. **Skills Section Check** - Tests skill tabs and content switching +5. **Hero Section Check** - Verifies hero content and call-to-action buttons +6. **Facts Section Check** - Tests counter displays +7. **Resume Section Check** - Validates resume content and download functionality +8. **Testimonials Section Check** - Tests testimonial slider +9. **Footer Check** - Verifies footer content and links + +## Running Tests + +### Local Testing + +#### Interactive Mode (Recommended for Development) +```bash +npm run test:open +``` +Opens the Cypress Test Runner for interactive test execution and debugging. + +#### Headless Mode +```bash +npm run test:headless +``` +Runs all tests in headless mode with mochawesome reporting. + +#### Headed Mode +```bash +npm run test:headed +``` +Runs tests with the browser visible (useful for debugging). + +### CI/CD Testing +Tests automatically run in GitHub Actions after successful page deployment: +```bash +npm test +``` +This command includes Cypress Dashboard recording for test analytics. + +## Test Configuration + +### Cypress Config (`cypress.config.js`) +- **Base URL**: https://adminvns.github.io +- **Viewport**: 1280x720 (Desktop) +- **Video Recording**: Enabled +- **Screenshots**: Enabled on failure +- **Command Timeout**: 10 seconds +- **Page Load Timeout**: 30 seconds + +### Reporter +- **Reporter**: Mochawesome +- **Report Directory**: `mochawesome-report/` +- **Features**: Charts, embedded screenshots, inline assets + +## Test Coverage + +### Current Coverage +- ✅ Site availability (HTTP 200 response) +- ✅ Page title and meta information +- ✅ Main section rendering (Hero, About, Resume, Testimonials) +- ✅ Navigation menu functionality +- ✅ Social media links validation +- ✅ Theme toggle (dark/light mode) +- ✅ Skills section tabs and content +- ✅ Resume download functionality +- ✅ Testimonials slider +- ✅ Footer content and links + +### Future Enhancements +- [ ] Mobile viewport testing +- [ ] Accessibility (a11y) testing +- [ ] Performance metrics +- [ ] Form validation (if contact form is added) +- [ ] Cross-browser testing (Firefox, Edge) +- [ ] Visual regression testing + +## Writing New Tests + +### Best Practices +1. Use descriptive test names that explain what is being tested +2. Group related tests in `describe` blocks +3. Use `beforeEach` for common setup +4. Prefer data attributes or IDs over CSS classes for selectors +5. Keep tests independent and isolated +6. Use custom commands for repeated actions + +### Example Test +```javascript +describe('New Feature Test', () => { + beforeEach(() => { + cy.visit('/') + }) + + it('Should display the new feature', () => { + cy.get('#new-feature').should('be.visible') + cy.get('#new-feature').should('contain', 'Expected Text') + }) +}) +``` + +## Debugging Tests + +### Using Cypress Test Runner +1. Run `npm run test:open` +2. Click on the test file to run +3. Use the time-travel feature to inspect each step +4. Check the browser console for errors + +### Screenshots and Videos +- Screenshots are automatically captured on test failures +- Videos are recorded for all test runs +- Find them in `cypress/screenshots/` and `cypress/videos/` + +## CI/CD Integration + +### GitHub Actions Workflow +The Cypress tests run automatically after successful GitHub Pages deployment: +- Triggered by: `pages-build-deployment` workflow completion +- Runner: Windows Latest +- Browser: Chrome +- Reporting: Mochawesome + Cypress Dashboard + +### Viewing Test Results +1. **GitHub Actions**: Check the workflow run for test status +2. **Cypress Dashboard**: View detailed test analytics (requires Cypress Cloud) +3. **Artifacts**: Download mochawesome reports from GitHub Actions artifacts + +## Troubleshooting + +### Common Issues + +#### Tests timing out +- Increase timeout in `cypress.config.js` +- Check network connectivity +- Verify site is accessible + +#### Element not found +- Verify selector is correct +- Check if element is hidden or not rendered +- Use `cy.wait()` if element loads asynchronously + +#### Flaky tests +- Add explicit waits for dynamic content +- Use `cy.intercept()` to stub network requests +- Ensure tests are independent + +## Dependencies +- `cypress`: ^13.10.0 +- `cypress-xpath`: ^1.8.0 +- `mochawesome`: ^7.1.3 + +## Support +For issues or questions about the tests, please open an issue on GitHub. diff --git a/cypress/e2e/spec.cy.js b/cypress/e2e/spec.cy.js index bb63e85..8b549e5 100644 --- a/cypress/e2e/spec.cy.js +++ b/cypress/e2e/spec.cy.js @@ -1,71 +1,247 @@ require('cypress-xpath') -//site-avaialblity testing - - -// describe('Website Availibilty ', function () { -// it('Should test API response', function () { -// // Make an HTTP request to the API -// cy.request({ -// method: 'GET', -// url: 'https://adminvns.github.io/', // Replace with your API URL -// }).then((response) => { -// // Assertions on the response -// expect(response.status).to.eq(200); - -// // Add more assertions as needed based on the API response structure -// }); -// }); -// }); - -//Checking Title of the website - -describe('Website Component Check', () => { - it('Site availability Test', async function () { + +// Website Availability and Component Testing +describe('Website Availability Check', () => { + it('Should return 200 status code', async function () { try { - // Make an HTTP request to the API using await const response = await cy.request({ method: 'GET', - url: 'https://adminvns.github.io/', // Replace with your API URL + url: '/', }); - // Assertions on the response + // Verify successful response expect(response.status).to.eq(200); - // expect(response.body).to.have.property('data'); - // Add more assertions as needed based on the API response structure } catch (error) { - // Handle any errors that may occur during the request - throw new Error(`Failed to fetch API: ${error.message}`); + throw new Error(`Failed to fetch website: ${error.message}`); } - - // Add more assertions as needed based on the API response structure + }) + + it('Should have correct page title', () => { + cy.visit('/') + cy.title().should('include', 'Shubham Singh') + cy.title().should('include', 'Senior QA Automation') + }) + + it('Should load main sections', () => { + cy.visit('/') + cy.get('#hero').should('be.visible') + cy.get('#about').should('exist') + cy.get('#resume').should('exist') + cy.get('#testimonials').should('exist') + }) +}) + +// Header and Navigation Testing +describe('Header and Navigation Check', () => { + beforeEach(() => { + cy.visit('/') + }) + + it('Should display profile information', () => { + cy.get('#header .profile').should('be.visible') + cy.get('#header .profile img').should('have.attr', 'src', 'assets/img/profile-pic.png') + cy.get('#header .profile h1').should('contain', 'Shubham Singh') + }) + + it('Should have working social links', () => { + // LinkedIn link + cy.xpath(`//header[@id="header"]//a[@class='linkedin']`) + .should('have.attr', 'href', 'https://www.linkedin.com/in/adminvns/') + .should('have.attr', 'target', '_blank') + + // GitHub link + cy.xpath(`//header[@id="header"]//a[@class='twitter']`) + .should('have.attr', 'href', 'https://github.com/adminvns') + .should('have.attr', 'target', '_blank') + + // Buy me a coffee link + cy.get('#header .social-links a.coffee') + .should('have.attr', 'href', 'https://buymeacoffee.com/adminvns') + .should('have.attr', 'target', '_blank') + }) + + it('Should have all navigation menu items', () => { + cy.get('#navbar .nav-link').should('have.length.at.least', 5) + cy.get('#navbar').should('contain', 'Home') + cy.get('#navbar').should('contain', 'About') + cy.get('#navbar').should('contain', 'Live Resume') + cy.get('#navbar').should('contain', 'Recommendations') + cy.get('#navbar').should('contain', 'Download Resume') + }) + + it('Should have download resume link', () => { + cy.get('#navbar a[href*="Shubham_Automation_QA.pdf"]') + .should('exist') + .should('have.attr', 'href') + .and('include', 'Shubham_Automation_QA.pdf') + }) +}) + +// Theme Toggle Testing +describe('Theme Toggle Functionality', () => { + beforeEach(() => { + cy.visit('/') + }) + + it('Should have theme toggle switch', () => { + cy.get('.theme-switch-wrapper').should('be.visible') + cy.get('.theme-switch input[type="checkbox"]').should('exist') + }) + + it('Should toggle dark mode', () => { + cy.get('body').then($body => { + const initialHasDarkMode = $body.hasClass('dark-mode') + + // Click the toggle + cy.get('.theme-switch input[type="checkbox"]').click({ force: true }) + + // Verify the class changed + cy.get('body').should($newBody => { + const nowHasDarkMode = $newBody.hasClass('dark-mode') + expect(nowHasDarkMode).to.not.equal(initialHasDarkMode) + }) }) + }) +}) + +// Skills Section Testing +describe('Skills Section Check', () => { + beforeEach(() => { + cy.visit('/') + }) + it('Should display skills tabs', () => { + cy.get('#skills .tab-btn').should('have.length', 3) + cy.get('#skills .tab-btn[data-tab="automation"]').should('contain', 'Automation') + cy.get('#skills .tab-btn[data-tab="devops"]').should('contain', 'CI/CD') + cy.get('#skills .tab-btn[data-tab="cloud"]').should('contain', 'Cloud') + }) + + it('Should switch between skill tabs', () => { + // Click on DevOps tab + cy.get('#skills .tab-btn[data-tab="devops"]').click() + cy.get('#skills .tab-btn[data-tab="devops"]').should('have.class', 'active') + cy.get('#devops').should('have.class', 'active') + + // Click on Cloud tab + cy.get('#skills .tab-btn[data-tab="cloud"]').click() + cy.get('#skills .tab-btn[data-tab="cloud"]').should('have.class', 'active') + cy.get('#cloud').should('have.class', 'active') + }) + + it('Should display skill cards in automation tab', () => { + cy.get('#automation .skill-card').should('have.length.at.least', 4) + cy.get('#automation').should('contain', 'Cypress') + cy.get('#automation').should('contain', 'Tosca') + cy.get('#automation').should('contain', 'Playwright') + cy.get('#automation').should('contain', 'Selenium') + }) +}) + +// Hero Section Testing +describe('Hero Section Check', () => { + beforeEach(() => { + cy.visit('/') + }) + + it('Should display hero content', () => { + cy.get('#hero .hero-container').should('be.visible') + cy.get('#hero h1').should('contain', 'Shubham') + }) - it('Title Check', () => { - cy.visit('https://adminvns.github.io/') - cy.title().should('include', 'Resume') + it('Should have hero buttons with icons', () => { + // LinkedIn icon button + cy.get('#hero .btn-hero-icon').eq(0) + .should('have.attr', 'href', 'https://www.linkedin.com/in/adminvns/') + .should('have.attr', 'target', '_blank') + .should('have.attr', 'title', 'LinkedIn Profile') + + // GitHub icon button + cy.get('#hero .btn-hero-icon').eq(1) + .should('have.attr', 'href', 'https://github.com/adminvns') + .should('have.attr', 'target', '_blank') + .should('have.attr', 'title', 'GitHub Profile') + + // View Resume button + cy.get('#hero .btn-hero').should('contain', 'View Resume') + .should('have.attr', 'href', '#resume') + }) +}) + +// Facts Section Testing +describe('Facts Section Check', () => { + beforeEach(() => { + cy.visit('/') }) - + it('Should display fact counters', () => { + cy.get('#facts .count-box').should('have.length', 4) + cy.get('#facts').should('contain', 'Positive Reviews') + cy.get('#facts').should('contain', 'Robust Projects') + cy.get('#facts').should('contain', 'Frameworks Built') + cy.get('#facts').should('contain', 'Expert Certifications') + }) }) +// Resume Section Testing +describe('Resume Section Check', () => { + beforeEach(() => { + cy.visit('/') + }) + + it('Should display resume sections', () => { + cy.get('#resume .resume-title').should('have.length.at.least', 3) + cy.get('#resume').should('contain', 'Summary') + cy.get('#resume').should('contain', 'Education') + cy.get('#resume').should('contain', 'Professional Experience') + }) + + it('Should have download resume button', () => { + cy.get('#resume .btn-download-resume') + .should('exist') + .should('have.attr', 'href') + .and('include', 'Shubham_Automation_QA.pdf') + }) + it('Should display work experience', () => { + cy.get('#resume').should('contain', 'GlobalLogic') + cy.get('#resume').should('contain', 'Cloud Analogy') + cy.get('#resume').should('contain', 'Senior Automation Developer') + }) +}) -//Side-menu link testing -describe('SideMenu Check', () => { +// Testimonials Section Testing +describe('Testimonials Section Check', () => { beforeEach(() => { - cy.visit('https://adminvns.github.io/') - // Perform any common setup tasks needed before each test + cy.visit('/') + }) + + it('Should display testimonials slider', () => { + cy.get('#testimonials .testimonials-slider').should('exist') + cy.get('#testimonials .swiper-slide').should('have.length.at.least', 3) + }) + + it('Should have testimonial content', () => { + cy.get('#testimonials .testimonial-item').should('exist') + cy.get('#testimonials .testimonial-img').should('exist') }) +}) - it('LinkedIn link Check', () => { - cy.xpath(`//header[@id="header"]//a[@class='linkedin']`).should('have.attr', 'href', 'https://www.linkedin.com/in/adminvns/') +// Footer Testing +describe('Footer Check', () => { + beforeEach(() => { + cy.visit('/') }) - it('Github link Check', () => { - cy.xpath(`//header[@id="header"]//a[@class='twitter']`).should('have.attr', 'href', 'https://github.com/adminvns') + it('Should display footer content', () => { + cy.get('#footer').should('be.visible') + cy.get('#footer').should('contain', 'Github') + cy.get('#footer a[href*="buymeacoffee"]').should('exist') }) + it('Should have back to top button', () => { + cy.get('.back-to-top').should('exist') + }) }) diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 353c9f5..e69de29 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -1,35 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) - -Cypress.Commands.add('loginUser',(username,password)=>{ - - cy.visit('https://practicetestautomation.com/practice-test-login/') - cy.get('input[name="username"]').type(username) - cy.get('input[name="password"]').type(password) - cy.get('button#submit.btn').click() - -}) - diff --git a/index.html b/index.html index d424319..0b0e10d 100644 --- a/index.html +++ b/index.html @@ -5,9 +5,53 @@ - Shubham Singh | Resume - - + Shubham Singh | Senior QA Automation & DevOps Engineer + + + + + + + + + + + + + + + + + + + + + + @@ -17,6 +61,7 @@ + @@ -46,6 +91,16 @@ +
+ +
+ @@ -57,8 +112,9 @@

Shubham Singh

@@ -90,9 +146,22 @@

Shubham Singh

Hello, I'm

-

Shubham!

-

I'm

+

I'm +

+
@@ -104,21 +173,21 @@

Shubham!

About

-

A passionate professional with more than 5 years of experience in IT industry with expertise in Scripting, - DevOps and QA Automation knowledge, moved multiple projects from manual to automation in E-Commerce, Banking - and Cybersecurity domain. +

Senior QA Automation & DevOps Engineer with 5.5+ years of experience in architecting robust automation + ecosystems. I specialize in migrating complex legacy projects from manual to fully automated CI/CD + pipelines, with deep expertise in E-Commerce (Salesforce Commerce Cloud), Fintech (FIS), and Cybersecurity.

-
+
- +
-

QA-Automation Developer & DevOps Engineer.

+

Senior Automation Architect & DevOps Specialist

- To secure a career in IT industry where I can utilize me skills and knowledge for the Organization's - growth as well as growth of my technical and interpersonal skills. + Transforming software quality through intelligent automation and seamless DevOps integration. Expert in + Cypress, Playwright, Jenkins, and AWS cloud migrations.

@@ -154,13 +223,13 @@

Quick Facts

I love to listen music & play Guitar.

-
+
+ class="purecounter">+

Positive Reviews

@@ -168,27 +237,27 @@

Quick Facts

- -

Projects Completed

+ + +

Robust Projects

- - -

On Going Projects

+ + + +

Frameworks Built

- - -

Team Members Managed

+ + + +

Expert Certifications

@@ -202,70 +271,141 @@

Quick Facts

-

Skills

-

"I am a Certified Advanced Cypress Engineer, proficient in Jenkins, Docker, AWS, and various other tools. - Additionally, I hold the title of 8x Tosca Certified Automation Specialist, ensuring smooth QA to release - transitions."

+

Technical Arsenal

+

"Mastering the art of test automation with a tool-agnostic approach. Certified Advanced Cypress Engineer + and 8x Tosca Automation Specialist, dedicated to building impenetrable Quality Gates in CI/CD pipelines." +

-
- -
+ +
+
+ + + +
-
- JavaScript 70% -
-
-
+ +
+
+
+ +

Cypress

+ Expert
-
- -
- Cypress 90% -
-
+
+ +

Tosca

+ 8x Certified
-
- -
- Selenium/Rest Assured 60% -
-
-
+
+ +

Playwright

+ Advanced +
+
+ +

Selenium

+ Advanced +
+
+ +

Rest Assured

+ Intermediate +
+
+ +

Puppeteer

+ Intermediate
-
-
- -
- Tosca 60% -
-
-
+
+
+
+ +

Jenkins

+ Expert
-
- -
- Playwright70% -
-
-
+
+ +

GitHub Actions

+ Advanced +
+
+ +

Docker

+ Advanced +
+
+ +

Kubernetes

+ Intermediate +
+
+ +

Git

+ Expert
+
-
- SQL65% -
-
-
+
+
+
+ +

AWS

+ Advanced +
+
+ +

Azure

+ Intermediate +
+
+ +

JavaScript

+ Advanced +
+
+ +

Python

+ Intermediate +
+
+ +

SQL

+ Advanced
-
-
@@ -287,9 +427,9 @@

Resume

Summary

Shubham Singh

-

Innovative and deadline-driven Engineer with 5 + years of experience in IT industry with expertise - in Scripting, DevOps and QA-Automation knowledge, moved multiple projects from manual to - automation in Banking,E-commerce and Security domain.

+

Passionate Senior QA Automation Architect with 5.5+ years of experience in architecting robust + automation ecosystems. Specialized in building scalable, self-healing test frameworks and streamlining + CI/CD pipelines across Fintech, E-Commerce, and Cybersecurity domains.

  • New Delhi,India
  • +81 8743######
  • @@ -333,20 +473,30 @@

    Senior Automation Engineer

    July 2021 - September 2023

    Cloud Analogy, Noida,India

      -
    • Automation Lead with Salesforce Commerce Cloud Administration and Automation scrpting knowledge. +
    • Automation Lead with Salesforce Commerce Cloud Administration and Automation scripting knowledge.
    • -
    • Automation testing using Tricentis Tosca(7X Certified Tosca Engineer)
    • +
    • Automation testing using Tricentis Tosca (8x Certified Tosca Expert)
    • Well versed with other Automation Tools like Puppeteer and Cypress
    • Created and executed automated software test plans, cases and scripts to uncover, identify and document software problems and their causes
    • -
    • I have also worked with
      FIS & Wipro, for more details, here is my LinkedIn URL
      +
    • I have also worked with FIS & Wipro, for more details, here is my LinkedIn + URL
+ + +
@@ -358,126 +508,161 @@
July 2021 - September 2023

Recommendations

Here are some of the Recommendations which I received on LinkedIn.I am really thankful to the team and my team leaders who have provided their immense support and shared their valuable knowledge.See more - Recommendations on my LinkedIn

+ Recommendations on my LinkedIn

-
-

- - Shubham has worked with me at FIS in his initial career days. A reliable employee is the best gift a - leader can ask for, Thank you for being someone I can rely on. Shubham is a good team player, a quick - learner, and adaptive to the new corporate environment. He had demonstrated an excellent technical - skill during his tenure at FIS. Good Luck - -

- Amarjeet Singh -

Amarjeet Singh

-

Senior Manager,Accenture

+
+
+ +

+ Shubham has worked with me at FIS in his initial career days. A reliable employee is the best gift a + leader can ask for, Thank you for being someone I can rely on. Shubham is a good team player, a + quick + learner, and adaptive to the new corporate environment. He had demonstrated an excellent technical + skill during his tenure at FIS. Good Luck +

+
+ + Amarjeet Singh + +
+

Amarjeet Singh

+

Senior Manager, Accenture

+
+
+
+
-
-

- - There is no better colleauge than Shubham. He is one of the most dedicated professionals I have worked - with and is ready to provide extra support whenever you need it. His expertise as a developer is - immense, Shubham is an excellent resource, and a master's in embedded programming has been a real gem - and helped our team to come up with more efficient solutions on various projects. His contribution is - valuable to the team, and I highly recommend Shubham and would love to work with him again. He is a - professional, helpful and positive person. It is a pleasure and an honor to recommend Shubham to - anyone who wants to hire him. He really is a gem. - -

- Vishal Adsule -

Vishal Adsule

-

Assistant Manager,FIS

+
+
+ +

+ There is no better colleauge than Shubham. He is one of the most dedicated professionals I have + worked + with and is ready to provide extra support whenever you need it. His expertise as a developer is + immense, Shubham is an excellent resource, and a master's in embedded programming has been a real + gem + and helped our team to come up with more efficient solutions on various projects. His contribution + is + valuable to the team, and I highly recommend Shubham. +

+
+ + Vishal Adsule + +
+

Vishal Adsule

+

Assistant Manager, FIS

+
+
+
-
+
+
-
-

- - I highly recommend Shubham Singh, who used to be Senior Automation Engineer at Cloud Analogy. - Shubham has exceptional expertise in Cypress, Selenium, Playwright, Tosca, DevOps, and AWS services. - His technical skills, attention to detail, and collaborative spirit made him an invaluable asset to - our team. - Shubham consistently delivered high-quality work and has been dedicated to continuous improvement. - I am confident in his future success. - -

- Ria Arora -

Ria Arora

-

Technical Manager,Cloud Analogy

+
+
+ +

+ I highly recommend Shubham Singh. Shubham has exceptional expertise in Cypress, Selenium, + Playwright, Tosca, DevOps, and AWS services. His technical skills, attention to detail, and + collaborative spirit made him an invaluable asset to our team. Shubham consistently delivered + high-quality work and has been dedicated to continuous improvement. +

+
+ + Ria Arora + +
+

Ria Arora

+

Technical Manager, Cloud Analogy

+
+
+
+
-
-

- - Shubham is one of the exceptionally talented and hardworking person I have ever worked with , he is - very passionate about coding and has hunger to learn new era technologies. I referred him many times - for different IT roles that I came across and he was able to get through all of them, the kind of - determination he has shown in all his projects is remarkable . The best thing about him is he always - keep himself updated with the technologies that are in demand in market and always ready for the new - challenging role . He has crafted his skills and expertise in best possible way anybody can and his - growth is really exemplary. - " All the Best" you have a long way to go....keep shining and keep motivating others with your work. - -

- Siddharth Yadav -

Siddharth Yadav

-

Senior Technical Recruiter,Altrimetrik

+
+
+ +

+ Shubham is one of the exceptionally talented and hardworking person I have ever worked with, he is + very passionate about coding and has hunger to learn new era technologies. He always keep himself + updated with the technologies that are in demand in market and always ready for the new challenging + role. +

+
+ + Siddharth Yadav + +
+

Siddharth Yadav

+

Senior Technical Recruiter, Altrimetrik

+
+
+
-
+
+ +
-
-

- - I wholeheartedly recommend Shubham for his exceptional contributions as an automation engineer.His - strong problem-solving abilities, combined with a passion for innovation, consistently resulted in - solutions that elevated our projects and exceeded expectations. - His proficiency in optimizing processes and knack for fostering collaboration make him an - indispensable asset to any team. - -

- Megha Rathor -

Megha Rathor

-

Senior HR, CoForge

+
+
+ +

+ I wholeheartedly recommend Shubham for his exceptional contributions as an automation engineer. His + strong problem-solving abilities, combined with a passion for innovation, consistently resulted in + solutions that elevated our projects and exceeded expectations. +

+
+ + Megha Rathor + +
+

Megha Rathor

+

Senior HR, CoForge

+
+
+
-
+
+
-
-

- - Professionalism defines the duration of one's success. - Shubham is highly skilled in his field and their ability to find creative solutions to complex - problems has been a valuable asset to our company. - He is able to work efficiently in a fast-paced environment and handle multiple projects at once. - - -

- Shivani Goyal -

Shivani Goyal

-

HR opertaions,Cloud Analogy

+
+
+ +

+ Professionalism defines the duration of one's success. Shubham is highly skilled in his field and + his ability to find creative solutions to complex problems has been a valuable asset to our company. + He is able to work efficiently in a fast-paced environment and handle multiple projects at once. +

+
+ + Shivani Goyal + +
+

Shivani Goyal

+

HR Operations, Cloud Analogy

+
+
+
@@ -517,11 +702,54 @@

HR opertaions,Cloud Analogy

- + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5f3b7c8..f5ca999 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,33 +1,24 @@ { - "name": "resume_tester", + "name": "shubham_portfolio", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "resume_tester", + "name": "shubham_portfolio", "version": "1.0.0", "license": "ISC", "dependencies": { "axios": "^1.12.0", - "cypress": "^13.10.0", + "cypress": "^15.9.0", "cypress-xpath": "^1.8.0", "mochawesome": "^7.1.3" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@cypress/request": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.9.tgz", - "integrity": "sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.10.tgz", + "integrity": "sha512-hauBrOdvu08vOsagkZ/Aju5XuiZx6ldsLfByg1htFeldhex+PeMrYauANzFsMJeAA0+dyPLbDoX2OYuvVoLDkQ==", "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -43,7 +34,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.14.0", + "qs": "~6.14.1", "safe-buffer": "^5.1.2", "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", @@ -75,6 +66,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", + "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -92,6 +84,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -104,6 +97,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -115,13 +109,15 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", + "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -139,6 +135,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -154,6 +151,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -172,6 +170,7 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">=14" } @@ -195,6 +194,12 @@ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==" }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "license": "MIT" + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -265,6 +270,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", + "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -296,7 +302,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "license": "Python-2.0", + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -324,11 +331,6 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -346,14 +348,16 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", - "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "license": "MIT" }, "node_modules/axios": { "version": "1.12.0", @@ -370,7 +374,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/base64-js": { "version": "1.5.1", @@ -405,6 +410,7 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -427,6 +433,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -436,6 +443,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", + "peer": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -447,7 +455,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/buffer": { "version": "5.7.1", @@ -522,6 +531,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -532,7 +542,8 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0" }, "node_modules/chalk": { "version": "4.1.2", @@ -560,19 +571,12 @@ "node": ">=8" } }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -593,15 +597,16 @@ } }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -626,9 +631,10 @@ } }, "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -636,7 +642,7 @@ "node": "10.* || >= 12.*" }, "optionalDependencies": { - "@colors/colors": "1.5.0" + "colors": "1.4.0" } }, "node_modules/cli-truncate": { @@ -688,6 +694,16 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -736,24 +752,26 @@ } }, "node_modules/cypress": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.10.0.tgz", - "integrity": "sha512-tOhwRlurVOQbMduX+KonoMeQILs2cwR3yHGGENoFvvSoLUBHmJ8b9/n21gFSDqjlOJ+SRVcwuh+fG/JDsHsT6Q==", + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.9.0.tgz", + "integrity": "sha512-Ks6Bdilz3TtkLZtTQyqYaqtL/WT3X3APKaSLhTV96TmTyudzSjc6EJsJCHmBb7DxO+3R12q3Jkbjgm/iPgmwfg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@cypress/request": "^3.0.0", + "@cypress/request": "^3.0.10", "@cypress/xvfb": "^1.2.4", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", + "@types/tmp": "^0.2.3", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", - "check-more-types": "^2.24.0", + "ci-info": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", + "cli-table3": "0.6.1", "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", @@ -765,10 +783,8 @@ "extract-zip": "2.0.1", "figures": "^3.2.0", "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.1", + "hasha": "5.2.2", "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", @@ -778,9 +794,10 @@ "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.5.3", "supports-color": "^8.1.1", - "tmp": "~0.2.1", + "systeminformation": "^5.27.14", + "tmp": "~0.2.4", + "tree-kill": "1.2.2", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, @@ -788,7 +805,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + "node": "^20.1.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/cypress-xpath": { @@ -849,6 +866,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -865,9 +883,10 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -890,7 +909,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/ecc-jsbn": { "version": "0.1.2", @@ -919,7 +939,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "peer": true, "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -1034,7 +1053,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/extract-zip": { "version": "2.0.1", @@ -1091,6 +1111,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", + "peer": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1103,6 +1124,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -1119,6 +1141,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "license": "BSD-3-Clause", + "peer": true, "bin": { "flat": "cli.js" } @@ -1147,6 +1170,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", + "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -1163,6 +1187,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", + "peer": true, "engines": { "node": ">=14" }, @@ -1174,6 +1199,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", "engines": { "node": "*" } @@ -1218,6 +1244,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -1294,14 +1321,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dependencies": { - "async": "^3.2.0" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1316,6 +1335,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", + "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -1336,6 +1356,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1348,6 +1369,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1424,6 +1446,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1440,6 +1487,7 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "license": "MIT", + "peer": true, "bin": { "he": "bin/he" } @@ -1506,6 +1554,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", + "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1513,22 +1562,12 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -1546,6 +1585,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", + "peer": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1573,6 +1613,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.12.0" } @@ -1590,6 +1631,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -1608,7 +1650,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -1629,13 +1672,15 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "license": "MIT" }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -1656,6 +1701,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", + "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -1706,14 +1752,6 @@ "verror": "1.10.0" } }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "engines": { - "node": "> 0.8" - } - }, "node_modules/listr2": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", @@ -1745,6 +1783,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -1756,9 +1795,10 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, "node_modules/lodash.isempty": { "version": "4.4.0", @@ -1861,16 +1901,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "license": "ISC", + "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -1918,6 +1950,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1938,6 +1971,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", + "peer": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -1947,6 +1981,7 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", "license": "MIT", + "peer": true, "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -1982,6 +2017,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -2055,6 +2091,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -2130,6 +2167,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -2145,6 +2183,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -2173,13 +2212,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" + "license": "BlueOak-1.0.0", + "peer": true }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -2197,6 +2238,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -2216,13 +2258,15 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", + "peer": true, "engines": { "node": ">=8.6" }, @@ -2282,9 +2326,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -2301,6 +2345,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -2315,6 +2360,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -2388,22 +2434,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -2561,6 +2597,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2587,6 +2624,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", + "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2607,6 +2645,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -2628,6 +2667,32 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/systeminformation": { + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.6.tgz", + "integrity": "sha512-LEIyK1aEv5P3BhAPW3swdlIyCihxwEq/Gki+kcONieU4PIeRCSLDuGkk0Va/56PSBgjVgEksOM88dmY6YqOyfQ==", + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, "node_modules/tcomb": { "version": "3.2.29", "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", @@ -2686,6 +2751,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", + "peer": true, "dependencies": { "is-number": "^7.0.0" }, @@ -2705,6 +2771,15 @@ "node": ">=16" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -2714,6 +2789,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -2809,7 +2885,8 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -2833,6 +2910,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2888,6 +2966,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "license": "MIT", + "peer": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -2912,6 +2991,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 55c296d..3c2e803 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,21 @@ { - "name": "resume_tester", + "name": "shubham_portfolio", "version": "1.0.0", "description": "", "main": "app.js", "scripts": { "test": "npx cypress run --record --key ${{ secrets.CYPRESS_RECORD_KEY }} --browser chrome", - "testlocal": "npx cypress run --browser chrome --headed --reporter mochawesome" + "test:headless": "npx cypress run --browser chrome --reporter mochawesome", + "test:headed": "npx cypress run --browser chrome --headed --reporter mochawesome", + "test:open": "npx cypress open" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "axios": "^1.12.0", - "cypress": "^13.10.0", + "cypress": "^15.9.0", "cypress-xpath": "^1.8.0", "mochawesome": "^7.1.3" } -} +} \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..f1d113d --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://adminvns.github.io/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..1193da4 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,21 @@ + + + + https://adminvns.github.io/ + 2026-01-26 + monthly + 1.0 + + + https://adminvns.github.io/inner-page.html + 2026-01-26 + monthly + 0.5 + + + https://adminvns.github.io/portfolio-details.html + 2026-01-26 + monthly + 0.8 + +