{"id":1682,"date":"2026-10-12T05:05:27","date_gmt":"2026-10-12T05:05:27","guid":{"rendered":"https:\/\/web.annulartechnologies.com\/staging\/quality-engineering\/"},"modified":"2026-10-20T12:30:55","modified_gmt":"2026-10-20T12:30:55","slug":"quality-engineering","status":"publish","type":"page","link":"https:\/\/web.annulartechnologies.com\/staging\/quality-engineering\/","title":{"rendered":"Quality Engineering"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-margin-top:0px;--awb-margin-bottom:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-flex-start\" style=\"--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800;850&display=swap');\n\n\/* ==========================================================================\n   THE QUALITY ASSURANCE LAB - QUALITY ENGINEERING SERVICE PAGE\n   Annular Technologies - Dedicated Enterprise QA Experience\n   ========================================================================== *\/\n\n\/* Page Wrapper & Typography *\/\n.qe-page-wrapper {\n  font-family: 'Plus Jakarta Sans', 'Inter', system-ui, -apple-system, sans-serif;\n  color: #334155;\n  background-color: #ffffff;\n  line-height: 1.65;\n  -webkit-font-smoothing: antialiased;\n  box-sizing: border-box;\n}\n\n.qe-page-wrapper *,\n.qe-page-wrapper *::before,\n.qe-page-wrapper *::after {\n  box-sizing: border-box;\n}\n\n.qe-container {\n  max-width: 1240px;\n  margin: 0 auto;\n  padding: 0 24px;\n}\n\n.qe-section-header {\n  text-align: center;\n  max-width: 800px;\n  margin: 0 auto 52px;\n}\n\n.qe-section-header h2 {\n  font-size: 38px;\n  font-weight: 800;\n  color: #0f172a;\n  line-height: 1.22;\n  letter-spacing: -0.025em;\n  margin: 0 0 16px;\n}\n\n.qe-section-header p {\n  font-size: 16.5px;\n  color: #64748b;\n  margin: 0;\n  line-height: 1.65;\n}\n\n\/* Primary & Secondary Buttons *\/\n.qe-btn-group {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 16px;\n  margin-top: 32px;\n}\n\n.qe-btn-primary {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  padding: 14px 28px;\n  font-size: 15px;\n  font-weight: 700;\n  color: #ffffff !important;\n  background: #0284c7 !important;\n  border: 1px solid #0369a1 !important;\n  border-radius: 10px;\n  text-decoration: none !important;\n  transition: all 0.2s ease;\n  box-shadow: 0 4px 14px -2px rgba(37, 99, 235, 0.35);\n}\n\n.qe-btn-primary:hover {\n  background: #0369a1 !important;\n  transform: translateY(-2px);\n  box-shadow: 0 6px 20px -2px rgba(37, 99, 235, 0.45);\n}\n\n.qe-btn-secondary {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  padding: 14px 28px;\n  font-size: 15px;\n  font-weight: 700;\n  color: #0f172a !important;\n  background: #ffffff !important;\n  border: 1.5px solid #cbd5e1 !important;\n  border-radius: 10px;\n  text-decoration: none !important;\n  transition: all 0.2s ease;\n}\n\n.qe-btn-secondary:hover {\n  background: #f8fafc !important;\n  border-color: #94a3b8 !important;\n  color: #2563eb !important;\n  transform: translateY(-2px);\n}\n\n\/* ==========================================================================\n   SECTION 1: HERO - THE QUALITY CONTROL ROOM\n   ========================================================================== *\/\n.qe-hero-section {\n  padding: 95px 0;\n  background: linear-gradient(180deg, #f0f7ff 0%, #ffffff 100%);\n  border-bottom: 1px solid #f1f5f9;\n  position: relative;\n  overflow: hidden;\n}\n\n.qe-hero-grid {\n  display: grid;\n  grid-template-columns: 1.1fr 0.9fr;\n  gap: 56px;\n  align-items: center;\n}\n\n.qe-hero-content h1 {\n  font-size: 44px;\n  font-weight: 850;\n  color: #0f172a;\n  line-height: 1.15;\n  letter-spacing: -0.03em;\n  margin: 0 0 20px;\n}\n\n.qe-hero-content p {\n  font-size: 17px;\n  line-height: 1.65;\n  color: #475569;\n  margin: 0;\n  max-width: 580px;\n}\n\n.qe-hero-badges {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 18px;\n  margin-top: 36px;\n  padding-top: 24px;\n  border-top: 1px solid #e2e8f0;\n}\n\n.qe-hero-badge-item {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 13px;\n  font-weight: 600;\n  color: #334155;\n}\n\n.qe-hero-badge-check {\n  color: #10b981;\n  font-weight: 800;\n  font-size: 15px;\n}\n\n.qe-hero-visual-wrapper {\n  position: relative;\n}\n\n.qe-hero-image-frame {\n  position: relative;\n  border-radius: 20px;\n  overflow: hidden;\n  box-shadow: 0 24px 50px -12px rgba(15, 23, 42, 0.15), 0 0 0 1px rgba(15, 23, 42, 0.06);\n  border: 1.5px solid #e2e8f0;\n  background: #ffffff;\n}\n\n.qe-hero-image-frame img {\n  width: 100%;\n  height: auto;\n  display: block;\n  object-fit: cover;\n}\n\n.qe-floating-chip-top {\n  position: absolute;\n  top: 20px;\n  right: -15px;\n  background: #ffffff;\n  padding: 10px 18px;\n  border-radius: 12px;\n  box-shadow: 0 12px 28px -6px rgba(15, 23, 42, 0.16), 0 0 0 1px rgba(15, 23, 42, 0.06);\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  z-index: 2;\n  border: 1px solid #f1f5f9;\n}\n\n.qe-chip-dot {\n  width: 10px;\n  height: 10px;\n  border-radius: 50%;\n  background: #10b981;\n  box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.25);\n}\n\n.qe-chip-text {\n  font-size: 12.5px;\n  font-weight: 700;\n  color: #0f172a;\n}\n\n.qe-chip-sub {\n  font-size: 11px;\n  color: #64748b;\n}\n\n.qe-floating-chip-bottom {\n  position: absolute;\n  bottom: 24px;\n  left: -20px;\n  background: #ffffff;\n  padding: 12px 20px;\n  border-radius: 14px;\n  box-shadow: 0 14px 30px -8px rgba(15, 23, 42, 0.18), 0 0 0 1px rgba(15, 23, 42, 0.06);\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  z-index: 2;\n  border: 1px solid #f1f5f9;\n}\n\n.qe-chip-icon-box {\n  width: 36px;\n  height: 36px;\n  border-radius: 10px;\n  background: #eff6ff;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #2563eb;\n  font-size: 18px;\n}\n\n\/* ==========================================================================\n   SECTION 2: OVERVIEW - QUALITY THROUGHOUT THE LIFECYCLE\n   ========================================================================== *\/\n.qe-overview-section {\n  padding: 95px 0;\n  background: #ffffff;\n  border-bottom: 1px solid #f1f5f9;\n}\n\n.qe-lifecycle-track {\n  display: grid;\n  grid-template-columns: repeat(6, 1fr);\n  gap: 18px;\n  margin-top: 48px;\n  position: relative;\n}\n\n.qe-lifecycle-track::before {\n  content: '';\n  position: absolute;\n  top: 36px;\n  left: 30px;\n  right: 30px;\n  height: 2px;\n  background: linear-gradient(90deg, #bfdbfe 0%, #3b82f6 50%, #10b981 100%);\n  z-index: 1;\n}\n\n.qe-lifecycle-card {\n  position: relative;\n  z-index: 2;\n  background: #ffffff;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 18px;\n  padding: 24px 18px;\n  text-align: center;\n  box-shadow: 0 4px 12px -2px rgba(15, 23, 42, 0.04);\n  transition: all 0.25s ease;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.qe-lifecycle-card:hover {\n  transform: translateY(-5px);\n  border-color: #93c5fd;\n  box-shadow: 0 16px 30px -8px rgba(37, 99, 235, 0.12);\n}\n\n.qe-lifecycle-step-num {\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  background: #eff6ff;\n  border: 2px solid #3b82f6;\n  color: #1d4ed8;\n  font-size: 13px;\n  font-weight: 800;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 14px;\n}\n\n.qe-lifecycle-icon {\n  width: 44px;\n  height: 44px;\n  border-radius: 12px;\n  background: #f8fafc;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #2563eb;\n  margin-bottom: 14px;\n}\n\n.qe-lifecycle-card h3 {\n  font-size: 15px;\n  font-weight: 750;\n  color: #0f172a;\n  margin: 0 0 8px;\n  line-height: 1.3;\n}\n\n.qe-lifecycle-card p {\n  font-size: 12.5px;\n  color: #64748b;\n  margin: 0;\n  line-height: 1.45;\n}\n\n\/* ==========================================================================\n   SECTION 3: THE TESTING WORKBENCH (SIGNATURE INTERACTIVE)\n   ========================================================================== *\/\n.qe-workbench-section {\n  padding: 100px 0;\n  background: #f8fafc;\n  border-bottom: 1px solid #f1f5f9;\n}\n\n.qe-workbench-nav {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 16px;\n  margin-bottom: 40px;\n}\n\n.qe-discipline-tab {\n  background: #ffffff;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 14px;\n  padding: 20px 22px;\n  cursor: pointer;\n  text-align: left;\n  transition: all 0.22s ease;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n}\n\n.qe-discipline-tab:hover {\n  border-color: #93c5fd;\n  background: #ffffff;\n  transform: translateY(-2px);\n}\n\n.qe-discipline-tab.active {\n  border-color: #2563eb;\n  background: #ffffff;\n  box-shadow: 0 12px 28px -6px rgba(37, 99, 235, 0.16), 0 0 0 1px #2563eb;\n}\n\n.qe-discipline-badge {\n  font-size: 11px;\n  font-weight: 800;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n  color: #2563eb;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.qe-discipline-tab.active .qe-discipline-badge {\n  color: #1d4ed8;\n}\n\n.qe-discipline-tab h3 {\n  font-size: 16px;\n  font-weight: 800;\n  color: #0f172a;\n  margin: 0;\n  line-height: 1.3;\n}\n\n.qe-discipline-sub {\n  font-size: 12.5px;\n  color: #64748b;\n  margin: 0;\n  line-height: 1.4;\n}\n\n.qe-workbench-panel {\n  display: none;\n  animation: qeFadeIn 0.3s ease forwards;\n}\n\n.qe-workbench-panel.active {\n  display: block;\n}\n\n@keyframes qeFadeIn {\n  from { opacity: 0; transform: translateY(6px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n\n.qe-services-grid-4 {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  gap: 24px;\n}\n\n.qe-services-grid-3 {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 24px;\n}\n\n.qe-services-grid-2 {\n  display: grid;\n  grid-template-columns: repeat(2, 1fr);\n  gap: 28px;\n}\n\n.qe-service-card {\n  background: #ffffff;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 18px;\n  padding: 28px 30px;\n  box-shadow: 0 4px 16px -2px rgba(15, 23, 42, 0.04);\n  transition: all 0.22s ease;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.qe-service-card:hover {\n  border-color: #93c5fd;\n  transform: translateY(-3px);\n  box-shadow: 0 16px 32px -8px rgba(15, 23, 42, 0.09);\n}\n\n.qe-service-card-header {\n  display: flex;\n  align-items: center;\n  gap: 14px;\n}\n\n.qe-service-icon {\n  width: 44px;\n  height: 44px;\n  border-radius: 12px;\n  background: #eff6ff;\n  border: 1px solid #dbeafe;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #2563eb;\n  flex-shrink: 0;\n}\n\n.qe-service-card h4 {\n  font-size: 18px;\n  font-weight: 800;\n  color: #0f172a;\n  margin: 0;\n  line-height: 1.3;\n}\n\n.qe-service-card p {\n  font-size: 14.5px;\n  color: #475569;\n  line-height: 1.6;\n  margin: 0;\n}\n\n\/* ==========================================================================\n   SECTION 4: OUR APPROACH - THE RELEASE READINESS JOURNEY\n   ========================================================================== *\/\n.qe-approach-section {\n  padding: 100px 0;\n  background: #ffffff;\n  border-bottom: 1px solid #f1f5f9;\n}\n\n.qe-journey-pathway {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 28px;\n  margin-top: 50px;\n}\n\n.qe-journey-step {\n  background: #ffffff;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 18px;\n  padding: 32px 28px;\n  position: relative;\n  transition: all 0.25s ease;\n  display: flex;\n  flex-direction: column;\n}\n\n.qe-journey-step:hover {\n  border-color: #3b82f6;\n  transform: translateY(-4px);\n  box-shadow: 0 18px 36px -10px rgba(37, 99, 235, 0.12);\n}\n\n.qe-journey-step.highlighted {\n  border-color: #93c5fd;\n  background: #f0f7ff;\n}\n\n.qe-step-top {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 18px;\n}\n\n.qe-step-num-badge {\n  font-size: 14px;\n  font-weight: 900;\n  color: #2563eb;\n  background: #eff6ff;\n  border: 1px solid #bfdbfe;\n  padding: 4px 14px;\n  border-radius: 9999px;\n  letter-spacing: 0.05em;\n}\n\n.qe-step-tag {\n  font-size: 11px;\n  font-weight: 700;\n  color: #64748b;\n  text-transform: uppercase;\n  letter-spacing: 0.08em;\n}\n\n.qe-journey-step h3 {\n  font-size: 20px;\n  font-weight: 800;\n  color: #0f172a;\n  margin: 0 0 10px;\n}\n\n.qe-journey-step p {\n  font-size: 14.5px;\n  color: #475569;\n  line-height: 1.6;\n  margin: 0;\n}\n\n\/* ==========================================================================\n   SECTION 5: BUSINESS BENEFITS - THE QUALITY SCORECARD\n   ========================================================================== *\/\n.qe-benefits-section {\n  padding: 100px 0;\n  background: #f0f7ff;\n  border-bottom: 1px solid #e2e8f0;\n}\n\n.qe-scorecard-board {\n  max-width: 980px;\n  margin: 0 auto;\n  background: #ffffff;\n  border: 1px solid #cbd5e1;\n  border-radius: 20px;\n  padding: 36px 42px;\n  box-shadow: 0 20px 45px -12px rgba(15, 23, 42, 0.09);\n}\n\n.qe-scorecard-header-bar {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding-bottom: 22px;\n  border-bottom: 2px solid #e2e8f0;\n  margin-bottom: 24px;\n}\n\n.qe-scorecard-title {\n  font-size: 14px;\n  font-weight: 800;\n  text-transform: uppercase;\n  letter-spacing: 0.09em;\n  color: #0f172a;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.qe-scorecard-badge {\n  font-size: 12px;\n  font-weight: 700;\n  color: #10b981;\n  background: #ecfdf5;\n  border: 1px solid #a7f3d0;\n  padding: 4px 12px;\n  border-radius: 9999px;\n}\n\n.qe-scorecard-list {\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n\n.qe-scorecard-row {\n  display: grid;\n  grid-template-columns: 44px 1fr auto;\n  align-items: center;\n  gap: 20px;\n  padding: 18px 20px;\n  background: #f8fafc;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 12px;\n  transition: all 0.2s ease;\n}\n\n.qe-scorecard-row:hover {\n  background: #ffffff;\n  border-color: #93c5fd;\n  box-shadow: 0 8px 20px -6px rgba(37, 99, 235, 0.1);\n  transform: translateX(4px);\n}\n\n.qe-scorecard-check {\n  width: 36px;\n  height: 36px;\n  border-radius: 10px;\n  background: #ecfdf5;\n  border: 1px solid #a7f3d0;\n  color: #10b981;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 16px;\n  font-weight: 800;\n}\n\n.qe-scorecard-content h3 {\n  font-size: 16px;\n  font-weight: 750;\n  color: #0f172a;\n  margin: 0;\n  line-height: 1.4;\n}\n\n.qe-scorecard-status {\n  font-size: 12px;\n  font-weight: 700;\n  color: #2563eb;\n  background: #eff6ff;\n  border: 1px solid #bfdbfe;\n  padding: 4px 12px;\n  border-radius: 6px;\n  letter-spacing: 0.04em;\n  white-space: nowrap;\n}\n\n\/* ==========================================================================\n   SECTION 6: INDUSTRIES WE TEST FOR\n   ========================================================================== *\/\n.qe-industries-section {\n  padding: 100px 0;\n  background: #ffffff;\n  border-bottom: 1px solid #f1f5f9;\n}\n\n.qe-industries-strip {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 24px;\n  margin-top: 48px;\n}\n\n.qe-industry-card {\n  background: #ffffff;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 18px;\n  padding: 28px 24px;\n  text-align: left;\n  transition: all 0.22s ease;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.qe-industry-card:hover {\n  border-color: #3b82f6;\n  transform: translateY(-4px);\n  box-shadow: 0 16px 32px -8px rgba(15, 23, 42, 0.08);\n}\n\n.qe-industry-icon {\n  width: 48px;\n  height: 48px;\n  border-radius: 12px;\n  background: #eff6ff;\n  border: 1px solid #dbeafe;\n  color: #2563eb;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.qe-industry-card h3 {\n  font-size: 18px;\n  font-weight: 800;\n  color: #0f172a;\n  margin: 0;\n}\n\n.qe-industry-card p {\n  font-size: 14px;\n  color: #64748b;\n  line-height: 1.55;\n  margin: 0;\n}\n\n\/* ==========================================================================\n   SECTION 7: WHY ANNULAR\n   ========================================================================== *\/\n.qe-why-section {\n  padding: 100px 0;\n  background: #f8fafc;\n  border-bottom: 1px solid #e2e8f0;\n}\n\n.qe-why-grid {\n  display: grid;\n  grid-template-columns: 1.15fr 0.85fr;\n  gap: 56px;\n  align-items: center;\n}\n\n.qe-why-content h2 {\n  font-size: 38px;\n  font-weight: 800;\n  color: #0f172a;\n  line-height: 1.22;\n  margin: 0 0 18px;\n  letter-spacing: -0.025em;\n}\n\n.qe-why-lead {\n  font-size: 16.5px;\n  line-height: 1.7;\n  color: #475569;\n  margin-bottom: 32px;\n}\n\n.qe-why-pillars {\n  display: flex;\n  flex-direction: column;\n  gap: 18px;\n}\n\n.qe-pillar-item {\n  display: flex;\n  align-items: flex-start;\n  gap: 16px;\n  background: #ffffff;\n  border: 1.5px solid #e2e8f0;\n  border-radius: 14px;\n  padding: 20px 22px;\n  transition: all 0.2s ease;\n}\n\n.qe-pillar-item:hover {\n  border-color: #93c5fd;\n  transform: translateX(4px);\n  box-shadow: 0 8px 20px -6px rgba(15, 23, 42, 0.06);\n}\n\n.qe-pillar-icon {\n  width: 38px;\n  height: 38px;\n  border-radius: 10px;\n  background: #eff6ff;\n  border: 1px solid #bfdbfe;\n  color: #2563eb;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  font-size: 16px;\n  font-weight: 800;\n}\n\n.qe-pillar-item h3 {\n  font-size: 16px;\n  font-weight: 800;\n  color: #0f172a;\n  margin: 0 0 4px;\n}\n\n.qe-pillar-item p {\n  font-size: 13.5px;\n  color: #64748b;\n  margin: 0;\n  line-height: 1.5;\n}\n\n.qe-why-visual-frame {\n  border-radius: 20px;\n  overflow: hidden;\n  box-shadow: 0 24px 50px -12px rgba(15, 23, 42, 0.15), 0 0 0 1px rgba(15, 23, 42, 0.06);\n  border: 1.5px solid #e2e8f0;\n  background: #ffffff;\n}\n\n.qe-why-visual-frame img {\n  width: 100%;\n  height: auto;\n  display: block;\n}\n\n\/* ==========================================================================\n   SECTION 8: FAQ ACCORDION\n   ========================================================================== *\/\n.qe-faq-section {\n  padding: 100px 0;\n  background: #ffffff;\n  border-bottom: 1px solid #f1f5f9;\n}\n\n.qe-faq-accordion {\n  max-width: 860px;\n  margin: 0 auto;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n\n.qe-faq-item {\n  border: 1.5px solid #e2e8f0;\n  border-radius: 14px;\n  overflow: hidden;\n  background: #ffffff;\n  transition: all 0.22s ease;\n}\n\n.qe-faq-item:hover {\n  border-color: #cbd5e1;\n}\n\n.qe-faq-item.active {\n  border-color: #93c5fd;\n  box-shadow: 0 10px 25px -8px rgba(37, 99, 235, 0.12);\n}\n\n.qe-faq-question {\n  width: 100%;\n  padding: 22px 26px;\n  background: transparent;\n  border: none;\n  text-align: left;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  cursor: pointer;\n  gap: 16px;\n}\n\n.qe-faq-question h3 {\n  font-size: 17px;\n  font-weight: 750;\n  color: #0f172a;\n  margin: 0;\n  line-height: 1.4;\n  transition: color 0.18s ease;\n}\n\n.qe-faq-item.active .qe-faq-question h3 {\n  color: #2563eb;\n}\n\n.qe-faq-icon {\n  width: 30px;\n  height: 30px;\n  border-radius: 50%;\n  background: #f1f5f9;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #475569;\n  flex-shrink: 0;\n  transition: all 0.22s ease;\n  font-size: 18px;\n  font-weight: 700;\n  line-height: 1;\n}\n\n.qe-faq-item.active .qe-faq-icon {\n  background: #2563eb;\n  color: #ffffff;\n  transform: rotate(45deg);\n}\n\n.qe-faq-answer {\n  max-height: 0;\n  overflow: hidden;\n  transition: max-height 0.3s ease, padding 0.3s ease;\n  padding: 0 26px;\n  background: #ffffff;\n}\n\n.qe-faq-item.active .qe-faq-answer {\n  max-height: 250px;\n  padding: 0 26px 24px;\n}\n\n.qe-faq-answer p {\n  font-size: 15px;\n  color: #475569;\n  line-height: 1.65;\n  margin: 0;\n  border-top: 1px solid #f1f5f9;\n  padding-top: 16px;\n}\n\n\/* ==========================================================================\n   SECTION 9: FINAL CTA\n   ========================================================================== *\/\n.qe-cta-section {\n  padding: 100px 0;\n  background: linear-gradient(135deg, #eff6ff 0%, #f0fdf4 100%);\n  border-top: 1px solid #e2e8f0;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n\n.qe-cta-inner {\n  max-width: 780px;\n  margin: 0 auto;\n  position: relative;\n  z-index: 2;\n}\n\n.qe-cta-inner h2 {\n  font-size: 40px;\n  font-weight: 850;\n  color: #0f172a;\n  line-height: 1.2;\n  margin: 0 0 16px;\n  letter-spacing: -0.025em;\n}\n\n.qe-cta-inner p {\n  font-size: 17px;\n  color: #475569;\n  line-height: 1.65;\n  margin: 0 0 32px;\n}\n\n.qe-cta-inner .qe-btn-group {\n  justify-content: center;\n  margin-top: 0;\n}\n\n\/* ==========================================================================\n   RESPONSIVE DESIGN (TABLET & MOBILE)\n   ========================================================================== *\/\n@media (max-width: 1024px) {\n  .qe-hero-grid {\n    grid-template-columns: 1fr;\n    gap: 40px;\n  }\n  .qe-lifecycle-track {\n    grid-template-columns: repeat(3, 1fr);\n  }\n  .qe-lifecycle-track::before {\n    display: none;\n  }\n  .qe-workbench-nav {\n    grid-template-columns: repeat(2, 1fr);\n  }\n  .qe-services-grid-3 {\n    grid-template-columns: repeat(2, 1fr);\n  }\n  .qe-journey-pathway {\n    grid-template-columns: repeat(2, 1fr);\n  }\n  .qe-industries-strip {\n    grid-template-columns: repeat(2, 1fr);\n  }\n  .qe-why-grid {\n    grid-template-columns: 1fr;\n    gap: 40px;\n  }\n}\n\n@media (max-width: 768px) {\n  .qe-hero-content h1 {\n    font-size: 32px;\n  }\n  .qe-section-header h2,\n  .qe-why-content h2,\n  .qe-cta-inner h2 {\n    font-size: 28px;\n  }\n  .qe-lifecycle-track {\n    grid-template-columns: 1fr;\n    gap: 14px;\n  }\n  .qe-workbench-nav {\n    grid-template-columns: 1fr;\n    gap: 12px;\n  }\n  .qe-services-grid-4,\n  .qe-services-grid-3,\n  .qe-services-grid-2 {\n    grid-template-columns: 1fr;\n    gap: 16px;\n  }\n  .qe-journey-pathway {\n    grid-template-columns: 1fr;\n    gap: 16px;\n  }\n  .qe-scorecard-board {\n    padding: 24px 18px;\n  }\n  .qe-scorecard-row {\n    grid-template-columns: 36px 1fr;\n    gap: 14px;\n  }\n  .qe-scorecard-status {\n    grid-column: 2 \/ -1;\n    justify-self: start;\n    margin-top: 4px;\n  }\n  .qe-industries-strip {\n    grid-template-columns: 1fr;\n    gap: 16px;\n  }\n  .qe-floating-chip-top,\n  .qe-floating-chip-bottom {\n    display: none;\n  }\n}\n\n\/* ==========================================================================\n   STANDARDIZED PRIMARY & SECONDARY BUTTON SYSTEM\n   Primary:\n     Background: var(--adm-blue-primary) -> #0052FF\n     Button text: var(--adm-white) -> #FFFFFF\n     Hover background: var(--adm-blue-deep) -> #003087\n     Border: rgba(255, 255, 255, 0.3)\n     Hover shadow: rgba(0, 82, 255, 0.42)\n   Secondary:\n     Background: #FFFFFF | Text: #0F172A | Border: #CBD5E1\n     Hover background: #F8FAFC | Hover text: #2563EB\n   ========================================================================== *\/\n.qe-btn-primary {\n  background: #0052ff !important;\n  color: #ffffff !important;\n  border: 1px solid rgba(255, 255, 255, 0.3) !important;\n  box-shadow: 0 8px 24px -2px rgba(0, 82, 255, 0.28) !important;\n  transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1) !important;\n  text-decoration: none !important;\n}\n\n.qe-btn-primary:hover {\n  background: #003087 !important;\n  color: #ffffff !important;\n  border-color: rgba(255, 255, 255, 0.3) !important;\n  transform: translateY(-2px) !important;\n  box-shadow: 0 12px 30px -2px rgba(0, 82, 255, 0.42) !important;\n  text-decoration: none !important;\n}\n\n.qe-btn-primary svg, .qe-btn-primary span {\n  color: #ffffff !important;\n  -webkit-text-fill-color: #ffffff !important;\n}\n\n.qe-btn-secondary {\n  background: #ffffff !important;\n  color: #0f172a !important;\n  border: 1.5px solid #cbd5e1 !important;\n  border-color: #cbd5e1 !important;\n  transition: all 0.2s ease !important;\n  text-decoration: none !important;\n}\n\n.qe-btn-secondary:hover {\n  background: #f8fafc !important;\n  color: #2563eb !important;\n  border-color: #cbd5e1 !important;\n  transform: translateY(-2px) !important;\n  text-decoration: none !important;\n}\n\n.qe-btn-secondary svg, .qe-btn-secondary span {\n  color: #0f172a !important;\n  -webkit-text-fill-color: #0f172a !important;\n}\n\n.qe-btn-secondary:hover svg, .qe-btn-secondary:hover span {\n  color: #2563eb !important;\n  -webkit-text-fill-color: #2563eb !important;\n}\n\n\/* ==========================================================================\n   STANDARDIZED HEADINGS ACCENT TEXT GRADIENT\n   Starting blue: #0052FF | Ending deep blue: #002B80 | Angle: 135deg\n   ========================================================================== *\/\n.qe-section-wrap h1 span,\n.qe-section-wrap h2 span,\n.qe-hero-content h1 span,\n.qe-section-header h2 span {\n  background: linear-gradient(135deg, #0052ff 0%, #002b80 100%) !important;\n  -webkit-background-clip: text !important;\n  -webkit-text-fill-color: transparent !important;\n  background-clip: text !important;\n  color: transparent !important;\n  display: inline-block !important;\n}\n\n<\/style>\n\n<div class=\"qe-page-wrapper\">\n\n  <!-- ========================================================\n       SECTION 1: HERO - THE QUALITY CONTROL ROOM\n       ======================================================== -->\n  <section class=\"qe-hero-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-hero-grid\">\n        <div class=\"qe-hero-content\">\n          <h1>Improve Software Quality at <span>Every Stage<\/span><\/h1>\n          <p>Release with confidence. Annular is a software testing company in India offering manual testing, test automation, API testing and AI-powered software testing. We help teams find defects earlier, validate critical workflows and deliver software more consistently.<\/p>\n          <div class=\"qe-btn-group\">\n            <a href=\"#lets-talk\" class=\"qe-btn-primary\">\n              Improve Your Testing Process\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"><\/line><polyline points=\"12 5 19 12 12 19\"><\/polyline><\/svg>\n            <\/a>\n            <a href=\"#lets-talk\" class=\"qe-btn-secondary\">\n              Talk to Our QA Team\n            <\/a>\n          <\/div>\n          <div class=\"qe-hero-badges\">\n            <div class=\"qe-hero-badge-item\">\n              <span class=\"qe-hero-badge-check\">\u2713<\/span>\n              <span>Multi-Platform QA<\/span>\n            <\/div>\n            <div class=\"qe-hero-badge-item\">\n              <span class=\"qe-hero-badge-check\">\u2713<\/span>\n              <span>Shift-Left Validation<\/span>\n            <\/div>\n            <div class=\"qe-hero-badge-item\">\n              <span class=\"qe-hero-badge-check\">\u2713<\/span>\n              <span>Continuous Delivery Ready<\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n        <div class=\"qe-hero-visual-wrapper\">\n          <div class=\"qe-floating-chip-top\">\n            <span class=\"qe-chip-dot\"><\/span>\n            <div>\n              <div class=\"qe-chip-text\">Automated Validation<\/div>\n              <div class=\"qe-chip-sub\">Continuous Test Runner Active<\/div>\n            <\/div>\n          <\/div>\n          <div class=\"qe-hero-image-frame\">\n            <img decoding=\"async\" src=\"https:\/\/web.annulartechnologies.com\/staging\/wp-content\/uploads\/2026\/10\/quality-engineering-control-room.jpg\" alt=\"Software Quality Engineering and Testing Control Room\" width=\"600\" height=\"450\" \/>\n          <\/div>\n          <div class=\"qe-floating-chip-bottom\">\n            <div class=\"qe-chip-icon-box\">\n              <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"><\/path><\/svg>\n            <\/div>\n            <div>\n              <div class=\"qe-chip-text\">Defect Discovery<\/div>\n              <div class=\"qe-chip-sub\">Early Lifecycle Verification<\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 2: OVERVIEW - QUALITY THROUGHOUT THE LIFECYCLE\n       ======================================================== -->\n  <section class=\"qe-overview-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-section-header\">\n        <h2>Quality Is Built Into <span>Every Stage<\/span><\/h2>\n        <p>Quality engineering brings testing into the whole software development lifecycle. By combining structured test planning, the right level of automation and continuous validation, teams can reduce avoidable release risk and stay confident as their applications change. Our QA services in India work as an extension of your team, whether you need an outsourced QA partner or support for an in-house group.<\/p>\n      <\/div>\n\n      <div class=\"qe-lifecycle-track\">\n        <div class=\"qe-lifecycle-card\">\n          <div class=\"qe-lifecycle-step-num\">01<\/div>\n          <div class=\"qe-lifecycle-icon\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 11l3 3L22 4\"><\/path><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"><\/path><\/svg>\n          <\/div>\n          <h3>Test Planning<\/h3>\n          <p>Scope, acceptance criteria, test environments & priorities<\/p>\n        <\/div>\n\n        <div class=\"qe-lifecycle-card\">\n          <div class=\"qe-lifecycle-step-num\">02<\/div>\n          <div class=\"qe-lifecycle-icon\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"><\/line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"><\/line><\/svg>\n          <\/div>\n          <h3>Application Validation<\/h3>\n          <p>Structured verification of core business rules and flows<\/p>\n        <\/div>\n\n        <div class=\"qe-lifecycle-card\">\n          <div class=\"qe-lifecycle-step-num\">03<\/div>\n          <div class=\"qe-lifecycle-icon\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"><\/line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"><\/line><\/svg>\n          <\/div>\n          <h3>Defect Identification<\/h3>\n          <p>Root-cause analysis, reproducible steps & clear evidence<\/p>\n        <\/div>\n\n        <div class=\"qe-lifecycle-card\">\n          <div class=\"qe-lifecycle-step-num\">04<\/div>\n          <div class=\"qe-lifecycle-icon\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 4 23 10 17 10\"><\/polyline><polyline points=\"1 20 1 14 7 14\"><\/polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"><\/path><\/svg>\n          <\/div>\n          <h3>Regression Checks<\/h3>\n          <p>Automated verification that updates do not break features<\/p>\n        <\/div>\n\n        <div class=\"qe-lifecycle-card\">\n          <div class=\"qe-lifecycle-step-num\">05<\/div>\n          <div class=\"qe-lifecycle-icon\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"><\/path><polyline points=\"22 4 12 14.01 9 11.01\"><\/polyline><\/svg>\n          <\/div>\n          <h3>Release Readiness<\/h3>\n          <p>Comprehensive coverage sign-off for confident delivery<\/p>\n        <\/div>\n\n        <div class=\"qe-lifecycle-card\">\n          <div class=\"qe-lifecycle-step-num\">06<\/div>\n          <div class=\"qe-lifecycle-icon\">\n            <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"><\/polyline><polyline points=\"17 6 23 6 23 12\"><\/polyline><\/svg>\n          <\/div>\n          <h3>Continuous Improvement<\/h3>\n          <p>Reviewing recurring issues and refining test coverage<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 3: THE TESTING WORKBENCH (SIGNATURE INTERACTIVE)\n       ======================================================== -->\n  <section class=\"qe-workbench-section\" id=\"testing-workbench\">\n    <div class=\"qe-container\">\n      <div class=\"qe-section-header\">\n        <h2>Testing Capabilities for <span>Your Application<\/span><\/h2>\n        <p>Explore our four dedicated testing disciplines organized to support your applications from initial build to production scale.<\/p>\n      <\/div>\n\n      <!-- Interactive Discipline Tabs -->\n      <div class=\"qe-workbench-nav\" role=\"tablist\">\n        <button type=\"button\" class=\"qe-discipline-tab active\" data-discipline=\"0\" role=\"tab\" aria-selected=\"true\">\n          <span class=\"qe-discipline-badge\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"><\/path><polyline points=\"14 2 14 8 20 8\"><\/polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"><\/line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"><\/line><polyline points=\"10 9 9 9 8 9\"><\/polyline><\/svg>\n            Discipline A\n          <\/span>\n          <h3>Functional Testing<\/h3>\n          <p class=\"qe-discipline-sub\">Manual, Web, Mobile & Regression<\/p>\n        <\/button>\n\n        <button type=\"button\" class=\"qe-discipline-tab\" data-discipline=\"1\" role=\"tab\" aria-selected=\"false\">\n          <span class=\"qe-discipline-badge\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"16 18 22 12 16 6\"><\/polyline><polyline points=\"8 6 2 12 8 18\"><\/polyline><\/svg>\n            Discipline B\n          <\/span>\n          <h3>Automation & Continuous Testing<\/h3>\n          <p class=\"qe-discipline-sub\">Automation, Frameworks & CI\/CD<\/p>\n        <\/button>\n\n        <button type=\"button\" class=\"qe-discipline-tab\" data-discipline=\"2\" role=\"tab\" aria-selected=\"false\">\n          <span class=\"qe-discipline-badge\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"><\/rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"><\/line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"><\/line><\/svg>\n            Discipline C\n          <\/span>\n          <h3>Technical Validation<\/h3>\n          <p class=\"qe-discipline-sub\">API & Performance Testing<\/p>\n        <\/button>\n\n        <button type=\"button\" class=\"qe-discipline-tab\" data-discipline=\"3\" role=\"tab\" aria-selected=\"false\">\n          <span class=\"qe-discipline-badge\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2a10 10 0 1 0 10 10H12V2z\"><\/path><path d=\"M12 12L2.1 12.5\"><\/path><\/svg>\n            Discipline D\n          <\/span>\n          <h3>Intelligent Testing & Management<\/h3>\n          <p class=\"qe-discipline-sub\">AI-Assisted & Test Governance<\/p>\n        <\/button>\n      <\/div>\n\n      <!-- Panel 0: Functional Testing (4 services) -->\n      <div class=\"qe-workbench-panel active\" id=\"discipline-panel-0\" role=\"tabpanel\">\n        <div class=\"qe-services-grid-4\">\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"><\/path><polyline points=\"14 2 14 8 20 8\"><\/polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"><\/line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"><\/line><\/svg>\n              <\/div>\n              <h4>Manual Testing<\/h4>\n            <\/div>\n            <p><strong>Manual Testing:<\/strong> Structured testing of application behavior, business rules and user workflows.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"><\/line><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"><\/path><\/svg>\n              <\/div>\n              <h4>Web Application Testing<\/h4>\n            <\/div>\n            <p><strong>Web Application Testing:<\/strong> Checks for functionality, usability, compatibility and key browser workflows.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"><\/line><\/svg>\n              <\/div>\n              <h4>Mobile Application Testing<\/h4>\n            <\/div>\n            <p><strong>Mobile Application Testing:<\/strong> Validation of mobile app behavior across relevant devices, operating systems and scenarios.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 4 23 10 17 10\"><\/polyline><polyline points=\"1 20 1 14 7 14\"><\/polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"><\/path><\/svg>\n              <\/div>\n              <h4>Regression Testing<\/h4>\n            <\/div>\n            <p><strong>Regression Testing:<\/strong> Confirmation that changes have not broken existing functionality.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Panel 1: Automation & Continuous Testing (3 services) -->\n      <div class=\"qe-workbench-panel\" id=\"discipline-panel-1\" role=\"tabpanel\">\n        <div class=\"qe-services-grid-3\">\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"16 18 22 12 16 6\"><\/polyline><polyline points=\"8 6 2 12 8 18\"><\/polyline><\/svg>\n              <\/div>\n              <h4>Test Automation<\/h4>\n            <\/div>\n            <p><strong>Test Automation:<\/strong> Automated tests for repeatable checks that support regression testing and frequent releases, using tools such as Selenium, Playwright and Cypress.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"12 2 2 7 12 12 22 7 12 2\"><\/polygon><polyline points=\"2 17 12 22 22 17\"><\/polyline><polyline points=\"2 12 12 17 22 12\"><\/polyline><\/svg>\n              <\/div>\n              <h4>Test Automation Frameworks<\/h4>\n            <\/div>\n            <p><strong>Test Automation Frameworks:<\/strong> Reusable automation frameworks designed or improved to suit your application and team.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><polyline points=\"12 6 12 12 16 14\"><\/polyline><\/svg>\n              <\/div>\n              <h4>Continuous Testing<\/h4>\n            <\/div>\n            <p><strong>Continuous Testing:<\/strong> Appropriate tests built into your development and release workflows.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Panel 2: Technical Validation (2 services) -->\n      <div class=\"qe-workbench-panel\" id=\"discipline-panel-2\" role=\"tabpanel\">\n        <div class=\"qe-services-grid-2\">\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"><\/rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"><\/line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"><\/line><\/svg>\n              <\/div>\n              <h4>API Testing<\/h4>\n            <\/div>\n            <p><strong>API Testing:<\/strong> Validation of API responses, data, error handling, authentication and integration behavior.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 20V10\"><\/path><path d=\"M12 20V4\"><\/path><path d=\"M6 20v-6\"><\/path><\/svg>\n              <\/div>\n              <h4>Performance Testing<\/h4>\n            <\/div>\n            <p><strong>Performance Testing:<\/strong> Evaluation of response times, stability and behavior under defined workloads.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Panel 3: Intelligent Testing & Test Management (2 services) -->\n      <div class=\"qe-workbench-panel\" id=\"discipline-panel-3\" role=\"tabpanel\">\n        <div class=\"qe-services-grid-2\">\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2a10 10 0 1 0 10 10H12V2z\"><\/path><path d=\"M12 12L2.1 12.5\"><\/path><\/svg>\n              <\/div>\n              <h4>AI-Assisted Testing<\/h4>\n            <\/div>\n            <p><strong>AI-Assisted Testing:<\/strong> AI-supported methods for selected test design, test case generation and testing activities.<\/p>\n          <\/div>\n\n          <div class=\"qe-service-card\">\n            <div class=\"qe-service-card-header\">\n              <div class=\"qe-service-icon\">\n                <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"><\/path><polyline points=\"14 2 14 8 20 8\"><\/polyline><line x1=\"9\" y1=\"15\" x2=\"15\" y2=\"15\"><\/line><\/svg>\n              <\/div>\n              <h4>Test Case Management<\/h4>\n            <\/div>\n            <p><strong>Test Case Management:<\/strong> Organized test cases, execution status, coverage and test evidence.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 4: OUR APPROACH - THE RELEASE READINESS JOURNEY\n       ======================================================== -->\n  <section class=\"qe-approach-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-section-header\">\n        <h2>From Understanding Requirements to <span>Continuous Improvement<\/span><\/h2>\n        <p>A structured, end-to-end testing lifecycle designed for thorough defect detection, transparent reporting, and continuous quality refinement.<\/p>\n      <\/div>\n\n      <div class=\"qe-journey-pathway\">\n        <div class=\"qe-journey-step\">\n          <div class=\"qe-step-top\">\n            <span class=\"qe-step-num-badge\">STEP 01<\/span>\n            <span class=\"qe-step-tag\">Discovery<\/span>\n          <\/div>\n          <h3>1. Understand<\/h3>\n          <p>Review the application, business-critical workflows and release process.<\/p>\n        <\/div>\n\n        <div class=\"qe-journey-step\">\n          <div class=\"qe-step-top\">\n            <span class=\"qe-step-num-badge\">STEP 02<\/span>\n            <span class=\"qe-step-tag\">Strategy<\/span>\n          <\/div>\n          <h3>2. Plan<\/h3>\n          <p>Define test scope, priorities, environments and acceptance criteria.<\/p>\n        <\/div>\n\n        <div class=\"qe-journey-step\">\n          <div class=\"qe-step-top\">\n            <span class=\"qe-step-num-badge\">STEP 03<\/span>\n            <span class=\"qe-step-tag\">Preparation<\/span>\n          <\/div>\n          <h3>3. Design<\/h3>\n          <p>Prepare test cases and identify where automation will help most.<\/p>\n        <\/div>\n\n        <div class=\"qe-journey-step highlighted\">\n          <div class=\"qe-step-top\">\n            <span class=\"qe-step-num-badge\">STEP 04<\/span>\n            <span class=\"qe-step-tag\" style=\"color: #2563eb;\">Core Action<\/span>\n          <\/div>\n          <h3>4. Execute<\/h3>\n          <p>Run manual, automated, API or performance tests as required.<\/p>\n        <\/div>\n\n        <div class=\"qe-journey-step highlighted\">\n          <div class=\"qe-step-top\">\n            <span class=\"qe-step-num-badge\">STEP 05<\/span>\n            <span class=\"qe-step-tag\" style=\"color: #2563eb;\">Governance<\/span>\n          <\/div>\n          <h3>5. Report<\/h3>\n          <p>Record defects, evidence, risk and test coverage clearly.<\/p>\n        <\/div>\n\n        <div class=\"qe-journey-step highlighted\">\n          <div class=\"qe-step-top\">\n            <span class=\"qe-step-num-badge\">STEP 06<\/span>\n            <span class=\"qe-step-tag\" style=\"color: #2563eb;\">Optimization<\/span>\n          <\/div>\n          <h3>6. Improve<\/h3>\n          <p>Review recurring issues and refine test coverage and automation.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 5: BUSINESS BENEFITS - THE QUALITY SCORECARD\n       ======================================================== -->\n  <section class=\"qe-benefits-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-section-header\">\n        <h2>Better Visibility. <span>More Confident Releases.<\/span><\/h2>\n        <p>Tangible operational benefits designed to improve development flow, mitigate deployment risk, and ensure dependable application behavior.<\/p>\n      <\/div>\n\n      <div class=\"qe-scorecard-board\">\n        <div class=\"qe-scorecard-header-bar\">\n          <div class=\"qe-scorecard-title\">\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#2563eb\" stroke-width=\"2.2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"><\/path><\/svg>\n            Enterprise Quality Assurance Scorecard\n          <\/div>\n          <span class=\"qe-scorecard-badge\">VERIFIED QA PRACTICES<\/span>\n        <\/div>\n\n        <div class=\"qe-scorecard-list\">\n          <div class=\"qe-scorecard-row\">\n            <div class=\"qe-scorecard-check\">\u2713<\/div>\n            <div class=\"qe-scorecard-content\">\n              <h3>Earlier visibility into defects and release risks<\/h3>\n            <\/div>\n            <span class=\"qe-scorecard-status\">Shift-Left Detection<\/span>\n          <\/div>\n\n          <div class=\"qe-scorecard-row\">\n            <div class=\"qe-scorecard-check\">\u2713<\/div>\n            <div class=\"qe-scorecard-content\">\n              <h3>Repeatable regression checks<\/h3>\n            <\/div>\n            <span class=\"qe-scorecard-status\">Automated Stability<\/span>\n          <\/div>\n\n          <div class=\"qe-scorecard-row\">\n            <div class=\"qe-scorecard-check\">\u2713<\/div>\n            <div class=\"qe-scorecard-content\">\n              <h3>Better coverage of important workflows<\/h3>\n            <\/div>\n            <span class=\"qe-scorecard-status\">Critical Path Assurance<\/span>\n          <\/div>\n\n          <div class=\"qe-scorecard-row\">\n            <div class=\"qe-scorecard-check\">\u2713<\/div>\n            <div class=\"qe-scorecard-content\">\n              <h3>Clearer reporting on testing status<\/h3>\n            <\/div>\n            <span class=\"qe-scorecard-status\">Transparent Governance<\/span>\n          <\/div>\n\n          <div class=\"qe-scorecard-row\">\n            <div class=\"qe-scorecard-check\">\u2713<\/div>\n            <div class=\"qe-scorecard-content\">\n              <h3>Testing practices aligned with how you deliver<\/h3>\n            <\/div>\n            <span class=\"qe-scorecard-status\">Delivery Sync<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 6: INDUSTRIES WE TEST FOR\n       ======================================================== -->\n  <section class=\"qe-industries-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-section-header\">\n        <h2>Quality Engineering for <span>Critical Business Applications<\/span><\/h2>\n        <p>Our QA and test automation services support FinTech and banking platforms, healthcare applications, ecommerce systems and SaaS products.<\/p>\n      <\/div>\n\n      <div class=\"qe-industries-strip\">\n        <div class=\"qe-industry-card\">\n          <div class=\"qe-industry-icon\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\"><\/rect><line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\"><\/line><\/svg>\n          <\/div>\n          <h3>FinTech and Banking<\/h3>\n          <p>Transaction validation, regulatory calculations, secure payment gateways, and data integrity checks across high-volume financial workflows.<\/p>\n        <\/div>\n\n        <div class=\"qe-industry-card\">\n          <div class=\"qe-industry-icon\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 12h-4l-3 9L9 3l-3 9H2\"><\/path><\/svg>\n          <\/div>\n          <h3>Healthcare Applications<\/h3>\n          <p>Patient record accuracy, permission hierarchies, telehealth integrations, and critical compliance checks for medical systems.<\/p>\n        <\/div>\n\n        <div class=\"qe-industry-card\">\n          <div class=\"qe-industry-icon\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"9\" cy=\"21\" r=\"1\"><\/circle><circle cx=\"20\" cy=\"21\" r=\"1\"><\/circle><path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"><\/path><\/svg>\n          <\/div>\n          <h3>Ecommerce Systems<\/h3>\n          <p>Catalog browsing, checkout funnels, inventory syncing, promo engine rules, and peak-traffic load stability across browser environments.<\/p>\n        <\/div>\n\n        <div class=\"qe-industry-card\">\n          <div class=\"qe-industry-icon\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"><\/rect><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"><\/line><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"><\/line><\/svg>\n          <\/div>\n          <h3>SaaS Products<\/h3>\n          <p>Multi-tenant permission validation, continuous deployment smoke testing, feature flag checks, and third-party API integration stability.<\/p>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 7: WHY ANNULAR\n       ======================================================== -->\n  <section class=\"qe-why-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-why-grid\">\n        <div class=\"qe-why-content\">\n          <h2>Testing That Fits Your Application and <span>Release Process<\/span><\/h2>\n          <p class=\"qe-why-lead\">Annular combines software engineering knowledge with manual, automated and AI-assisted testing. Testing scope and automation priorities are set by your application, business risk and expected release frequency.<\/p>\n          \n          <div class=\"qe-why-pillars\">\n            <div class=\"qe-pillar-item\">\n              <div class=\"qe-pillar-icon\">\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"><polyline points=\"16 18 22 12 16 6\"><\/polyline><polyline points=\"8 6 2 12 8 18\"><\/polyline><\/svg>\n              <\/div>\n              <div>\n                <h3>Software engineering knowledge<\/h3>\n                <p>Testing strategies built by engineers who understand code architecture, database transactions, API contracts, and edge cases.<\/p>\n              <\/div>\n            <\/div>\n\n            <div class=\"qe-pillar-item\">\n              <div class=\"qe-pillar-icon\">\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"><\/path><\/svg>\n              <\/div>\n              <div>\n                <h3>Risk-based testing priorities<\/h3>\n                <p>Test coverage focused intentionally on high-impact business flows, sensitive user data, and high-volume critical paths.<\/p>\n              <\/div>\n            <\/div>\n\n            <div class=\"qe-pillar-item\">\n              <div class=\"qe-pillar-icon\">\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"><circle cx=\"12\" cy=\"12\" r=\"10\"><\/circle><polyline points=\"12 6 12 12 16 14\"><\/polyline><\/svg>\n              <\/div>\n              <div>\n                <h3>Testing aligned with release frequency<\/h3>\n                <p>Automated and exploratory test cycles calibrated to match your continuous delivery rhythms and agile sprint cadence.<\/p>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"qe-why-visual-frame\">\n          <img decoding=\"async\" src=\"https:\/\/web.annulartechnologies.com\/staging\/wp-content\/uploads\/2026\/10\/quality-engineering-architecture.jpg\" alt=\"Software Engineering and Testing Architecture\" width=\"550\" height=\"420\" \/>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 8: FREQUENTLY ASKED QUESTIONS (FAQ)\n       ======================================================== -->\n  <section class=\"qe-faq-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-section-header\">\n        <h2>Frequently Asked Questions About Quality Engineering<\/h2>\n        <p>Clear answers to common questions about software testing methods, automation tools, and outsourced QA engagements.<\/p>\n      <\/div>\n\n      <div class=\"qe-faq-accordion\">\n        <div class=\"qe-faq-item active\">\n          <button type=\"button\" class=\"qe-faq-question\" aria-expanded=\"true\">\n            <h3>Q1. What is AI-powered software testing?<\/h3>\n            <span class=\"qe-faq-icon\">+<\/span>\n          <\/button>\n          <div class=\"qe-faq-answer\">\n            <p>AI-powered software testing uses AI to support activities such as test case generation, test maintenance and regression analysis. It works alongside test automation and human testers to improve coverage and efficiency.<\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"qe-faq-item\">\n          <button type=\"button\" class=\"qe-faq-question\" aria-expanded=\"false\">\n            <h3>Q2. What is the difference between AI testing and test automation?<\/h3>\n            <span class=\"qe-faq-icon\">+<\/span>\n          <\/button>\n          <div class=\"qe-faq-answer\">\n            <p>Test automation runs predefined scripted tests. AI testing adds capabilities such as generating test ideas, adapting to application changes and prioritizing what to test, so the two work best together.<\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"qe-faq-item\">\n          <button type=\"button\" class=\"qe-faq-question\" aria-expanded=\"false\">\n            <h3>Q3. How does outsourced QA testing work?<\/h3>\n            <span class=\"qe-faq-icon\">+<\/span>\n          <\/button>\n          <div class=\"qe-faq-answer\">\n            <p>You share your application, release process and quality goals. The QA team plans the scope, designs and runs tests, and reports defects and coverage regularly, so your developers can focus on building.<\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"qe-faq-item\">\n          <button type=\"button\" class=\"qe-faq-question\" aria-expanded=\"false\">\n            <h3>Q4. What should I look for in a QA automation company?<\/h3>\n            <span class=\"qe-faq-icon\">+<\/span>\n          <\/button>\n          <div class=\"qe-faq-answer\">\n            <p>Look for clear test planning, reusable frameworks, the right tools for your stack, transparent reporting and an automation approach driven by business risk, not by test counts.<\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"qe-faq-item\">\n          <button type=\"button\" class=\"qe-faq-question\" aria-expanded=\"false\">\n            <h3>Q5. How can SaaS companies automate software testing?<\/h3>\n            <span class=\"qe-faq-icon\">+<\/span>\n          <\/button>\n          <div class=\"qe-faq-answer\">\n            <p>Start by automating stable, repeatable regression and API tests, and run them within your release pipeline. Add UI and performance tests as the product matures.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- ========================================================\n       SECTION 9: FINAL CTA\n       ======================================================== -->\n  <section class=\"qe-cta-section\">\n    <div class=\"qe-container\">\n      <div class=\"qe-cta-inner\">\n        <h2>Ready to Strengthen <span>Your QA Process?<\/span><\/h2>\n        <p>Need to strengthen your QA process or expand test automation? Talk to Annular about your application and testing goals.<\/p>\n        <div class=\"qe-btn-group\">\n          <a href=\"#lets-talk\" class=\"qe-btn-primary\">\n            Improve Your Testing Process\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"><\/line><polyline points=\"12 5 19 12 12 19\"><\/polyline><\/svg>\n          <\/a>\n          <a href=\"#lets-talk\" class=\"qe-btn-secondary\">\n            Talk to Our QA Team\n          <\/a>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/section>\n\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n  \/\/ SEO Metadata Injection into Head\n  if (document.title.indexOf('Software Testing Company India') === -1) {\n    document.title = 'Software Testing Company India | QA Services | Annular';\n  }\n  let metaDesc = document.querySelector('meta[name=\"description\"]');\n  if (!metaDesc) {\n    metaDesc = document.createElement('meta');\n    metaDesc.name = 'description';\n    document.head.appendChild(metaDesc);\n  }\n  metaDesc.content = 'Annular is a software testing company in India offering QA services, test automation, API testing and AI-powered testing for reliable releases.';\n\n  let metaKw = document.querySelector('meta[name=\"keywords\"]');\n  if (!metaKw) {\n    metaKw = document.createElement('meta');\n    metaKw.name = 'keywords';\n    document.head.appendChild(metaKw);\n  }\n  metaKw.content = 'software testing company India, software testing services India, QA automation company India, test automation services India, AI software testing, AI testing services, API testing services India, performance testing services India, software testing outsourcing India, software testing company Chennai';\n\n  \/\/ Testing Workbench Tab Interaction\n  const tabs = document.querySelectorAll('.qe-discipline-tab');\n  const panels = document.querySelectorAll('.qe-workbench-panel');\n\n  tabs.forEach(tab => {\n    tab.addEventListener('click', function() {\n      const targetIndex = this.getAttribute('data-discipline');\n      tabs.forEach(t => {\n        t.classList.remove('active');\n        t.setAttribute('aria-selected', 'false');\n      });\n      panels.forEach(p => p.classList.remove('active'));\n\n      this.classList.add('active');\n      this.setAttribute('aria-selected', 'true');\n      const targetPanel = document.getElementById('discipline-panel-' + targetIndex);\n      if (targetPanel) {\n        targetPanel.classList.add('active');\n      }\n    });\n\n    \/\/ Keyboard navigation (Enter \/ Space)\n    tab.addEventListener('keydown', function(e) {\n      if (e.key === 'Enter' || e.key === ' ') {\n        e.preventDefault();\n        this.click();\n      }\n    });\n  });\n\n  \/\/ FAQ Accordion Interaction\n  const faqItems = document.querySelectorAll('.qe-faq-item');\n  faqItems.forEach(item => {\n    const question = item.querySelector('.qe-faq-question');\n    if (question) {\n      question.addEventListener('click', function() {\n        const isOpen = item.classList.contains('active');\n        faqItems.forEach(i => {\n          i.classList.remove('active');\n          const qBtn = i.querySelector('.qe-faq-question');\n          if (qBtn) qBtn.setAttribute('aria-expanded', 'false');\n        });\n        if (!isOpen) {\n          item.classList.add('active');\n          question.setAttribute('aria-expanded', 'true');\n        }\n      });\n    }\n  });\n});\n<\/script><\/div><\/div><\/div><\/div><br \/>\n<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-margin-top:0px;--awb-margin-bottom:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-top:0px;--awb-padding-right:0px;--awb-padding-bottom:0px;--awb-padding-left:0px;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column\"><!-- =====================================================\n ANNULAR TECHNOLOGIES | TWO-STEP CONSULTATION POPUP\n WordPress \/ Avada + EmailJS + Email OTP\n Responsive Form + PODS \/ Annular Domain Detection\n===================================================== -->\n\n<style>\n#annular-open {\n  display:inline-flex;align-items:center;justify-content:center;\n  min-height:48px;padding:13px 25px;border:0;border-radius:30px;\n  max-width: 40%;\n  background:#175cff;color:#fff;font-family:inherit;font-size:14px;\n  font-weight:600;cursor:pointer;transition:.2s;\n}\n#annular-open:hover {background:#1048d8;transform:translateY(-1px)}\n\nhtml.annular-popup-open,body.annular-popup-open {\n  overflow:hidden!important;\n}\n\n#annular-modal,#annular-thankyou-modal {\n  display:none;position:fixed!important;inset:0!important;\n  z-index:2147483647!important;width:100%!important;height:100vh!important;\n  height:100dvh!important;box-sizing:border-box!important;padding:16px!important;\n  align-items:center!important;justify-content:center!important;\n  overflow-y:auto!important;background:rgba(15,23,42,.68);\n}\n#annular-modal.is-open,#annular-thankyou-modal.is-open {\n  display:flex!important;\n}\n\n#annular-modal .annular-card {\n  position:relative;width:100%;max-width:480px;\n  max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);\n  box-sizing:border-box;margin:auto;padding:27px;\n  overflow-y:auto;overscroll-behavior:contain;\n  border:1px solid #eaecf0;border-radius:20px;\n  background:#fff;color:#171717;box-shadow:0 20px 70px #0003;\n}\n\n#annular-modal h3 {\n  margin:0 42px 8px 0;color:#171717;font-size:25px;\n  font-weight:700;line-height:1.3;\n}\n#annular-modal .annular-description {\n  margin:0 0 20px;color:#667085;font-size:13px;line-height:1.7;\n}\n\n#annular-close,#annular-thankyou-close {\n  position:absolute;top:12px;right:12px;display:flex;\n  align-items:center;justify-content:center;width:34px;height:34px;\n  padding:0;border:0;border-radius:50%;background:#f3f4f6;\n  color:#4b5563;font-size:24px;cursor:pointer;\n}\n#annular-close:hover,#annular-thankyou-close:hover {\n  background:#e5e7eb;\n}\n\n#annular-modal .annular-progress {\n  display:flex;align-items:center;gap:10px;margin:0 0 20px;\n}\n#annular-modal .annular-progress-line {\n  flex:1;height:3px;border-radius:5px;background:#e5e7eb;\n}\n#annular-modal .annular-progress-line.active {\n  background:#175cff;\n}\n#annular-modal .annular-step-label {\n  margin-bottom:8px;color:#175cff;font-size:11px;font-weight:700;\n  letter-spacing:1px;text-transform:uppercase;\n}\n#annular-modal #annular-form {\n  width:100%;margin:0;\n}\n#annular-modal .annular-screen[hidden],\n#annular-modal #annular-otp-area[hidden] {\n  display:none!important;\n}\n#annular-modal .annular-field {\n  width:100%;min-width:0;margin:0 0 16px;\n}\n#annular-modal label {\n  display:block;margin-bottom:7px;color:#344054;font-size:13px;\n  font-weight:600;line-height:1.4;\n}\n#annular-modal input,#annular-modal textarea {\n  display:block;width:100%;min-width:0;min-height:46px;\n  box-sizing:border-box;margin:0;padding:12px 14px;\n  border:1px solid #d0d5dd;border-radius:11px;background:#fff;\n  color:#171717;font-family:inherit;font-size:14px;line-height:1.5;\n  box-shadow:none;transition:border-color .2s,box-shadow .2s;\n}\n#annular-modal textarea {\n  min-height:105px;resize:vertical;\n}\n#annular-modal input::placeholder,\n#annular-modal textarea::placeholder {\n  color:#98a2b3;\n}\n#annular-modal input:focus,#annular-modal textarea:focus {\n  border-color:#175cff;outline:none;box-shadow:0 0 0 3px #175cff1f;\n}\n#annular-modal button,#annular-thankyou-modal button {\n  font-family:inherit;\n}\n\n#annular-modal .annular-inline-row {\n  display:flex;align-items:stretch;gap:8px;width:100%;\n}\n#annular-modal .annular-inline-row input {\n  flex:1 1 auto;width:100%;\n}\n#annular-send-otp,#annular-verify {\n  display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;\n  min-height:46px;padding:10px 14px;border:0;border-radius:25px;\n  background:#eaf0ff;color:#175cff;font-size:12px;font-weight:700;\n  white-space:nowrap;cursor:pointer;\n}\n#annular-send-otp:hover:not(:disabled),\n#annular-verify:hover:not(:disabled) {\n  background:#d9e5ff;\n}\n#annular-send-otp:disabled,#annular-verify:disabled {\n  opacity:.5;cursor:not-allowed;\n}\n#annular-otp-area {\n  margin:0 0 16px;padding:15px;border:1px solid #e4e9f2;\n  border-radius:14px;background:#f8faff;\n}\n#annular-modal #annular-otp {\n  letter-spacing:5px;font-size:17px;font-weight:700;\n}\n\n#annular-next,#annular-submit,#annular-back {\n  display:inline-flex;align-items:center;justify-content:center;\n  min-height:47px;box-sizing:border-box;padding:12px 18px;\n  border:0;border-radius:28px;font-size:14px;font-weight:700;\n  cursor:pointer;transition:background .2s,opacity .2s;\n}\n#annular-next,#annular-submit {\n  width:100%;background:#175cff;color:#fff;\n}\n#annular-next:hover:not(:disabled),\n#annular-submit:hover:not(:disabled) {\n  background:#1048d8;\n}\n#annular-next:disabled,#annular-submit:disabled {\n  opacity:.5;cursor:not-allowed;\n}\n#annular-back {\n  flex:0 0 auto;background:#f2f4f7;color:#344054;\n}\n#annular-back:hover {\n  background:#e4e7ec;\n}\n#annular-step2-actions {\n  display:flex;gap:10px;margin-top:8px;\n}\n#annular-step2-actions #annular-submit {\n  flex:1;\n}\n#annular-status {\n  margin-top:12px;color:#475569;font-size:12px;line-height:1.6;\n  overflow-wrap:anywhere;\n}\n#annular-status:empty {\n  display:none;\n}\n#annular-status.success {\n  color:#087443;\n}\n#annular-status.error {\n  color:#b42318;\n}\n\n#annular-thankyou-modal .annular-thankyou-card {\n  position:relative;width:100%;max-width:420px;box-sizing:border-box;\n  margin:auto;padding:40px 30px 30px;border:1px solid #eaecf0;\n  border-radius:22px;background:#fff;color:#171717;text-align:center;\n  box-shadow:0 24px 80px #0005;animation:annular-thankyou-in .25s ease-out;\n}\n#annular-thankyou-modal .annular-success-icon {\n  display:flex;align-items:center;justify-content:center;width:66px;height:66px;\n  margin:0 auto 20px;border:1px solid #b7ebcf;border-radius:50%;\n  background:#ecfdf3;color:#087443;font-size:34px;font-weight:700;\n}\n#annular-thankyou-modal h3 {\n  margin:0 0 12px;font-size:25px;font-weight:700;\n}\n#annular-thankyou-modal .annular-thankyou-message {\n  margin:0 auto 24px;max-width:320px;color:#667085;font-size:14px;line-height:1.8;\n}\n#annular-thankyou-modal .annular-thankyou-button {\n  width:100%;min-height:46px;padding:12px 20px;border:0;border-radius:28px;\n  background:#175cff;color:#fff;font-size:14px;font-weight:700;cursor:pointer;\n}\n#annular-thankyou-modal .annular-thankyou-button:hover {\n  background:#1048d8;\n}\n@keyframes annular-thankyou-in {\n  from {opacity:0;transform:translateY(12px) scale(.98)}\n  to {opacity:1;transform:translateY(0) scale(1)}\n}\n\n@media(max-width:600px) {\n  #annular-modal {padding:10px!important}\n  #annular-modal .annular-card {\n    max-height:calc(100vh - 20px);max-height:calc(100dvh - 20px);\n    padding:22px 17px;border-radius:17px;\n  }\n  #annular-modal h3 {font-size:22px}\n  #annular-modal .annular-description {margin-bottom:16px}\n  #annular-modal input,#annular-modal textarea {font-size:16px}\n  #annular-modal .annular-inline-row {gap:6px}\n  #annular-send-otp,#annular-verify {padding:9px 10px;font-size:11px}\n  #annular-thankyou-modal .annular-thankyou-card {padding:36px 22px 24px}\n}\n@media(max-height:650px) {\n  #annular-modal {align-items:flex-start!important;padding:10px!important}\n  #annular-modal .annular-card {\n    max-height:calc(100vh - 20px);max-height:calc(100dvh - 20px);\n    margin:0 auto;padding-top:18px;padding-bottom:18px;\n  }\n  #annular-modal .annular-field {margin-bottom:12px}\n}\n<\/style>\n\n<!-- OPEN BUTTON -->\n\n\n<!-- CONSULTATION POPUP -->\n<div id=\"annular-modal\" role=\"dialog\" aria-modal=\"true\"\n     aria-labelledby=\"annular-title\" aria-hidden=\"true\">\n  <div class=\"annular-card\">\n    <button id=\"annular-close\" type=\"button\" aria-label=\"Close form\">\u00d7<\/button>\n\n    <h3 id=\"annular-title\">Improve Your Testing Process<\/h3>\n    <p class=\"annular-description\">\n      Share your requirements and our team will get in touch.\n    <\/p>\n\n    <div class=\"annular-progress\" aria-label=\"Form progress\">\n      <div id=\"annular-progress-1\" class=\"annular-progress-line active\"><\/div>\n      <div id=\"annular-progress-2\" class=\"annular-progress-line\"><\/div>\n    <\/div>\n\n    <form id=\"annular-form\">\n      <!-- STEP 1 -->\n      <section id=\"annular-screen-1\" class=\"annular-screen\">\n        <div class=\"annular-step-label\">Step 1 of 2<\/div>\n\n        <div class=\"annular-field\">\n          <label for=\"annular-name\">Full Name *<\/label>\n          <input id=\"annular-name\" name=\"user_name\" type=\"text\"\n                 placeholder=\"Enter your full name\" autocomplete=\"name\"\n                 maxlength=\"120\" required>\n        <\/div>\n\n        <div class=\"annular-field\">\n          <label for=\"annular-email\">Email *<\/label>\n          <div class=\"annular-inline-row\">\n            <input id=\"annular-email\" name=\"user_email\" type=\"email\"\n                   placeholder=\"Enter your email address\" autocomplete=\"email\"\n                   maxlength=\"254\" required>\n            <button id=\"annular-send-otp\" type=\"button\" disabled>Send OTP<\/button>\n          <\/div>\n        <\/div>\n\n        <div id=\"annular-otp-area\" hidden>\n          <div class=\"annular-field\">\n            <label for=\"annular-otp\">Enter Email OTP *<\/label>\n            <div class=\"annular-inline-row\">\n              <input id=\"annular-otp\" name=\"otp\" type=\"text\"\n                     inputmode=\"numeric\" autocomplete=\"one-time-code\"\n                     maxlength=\"6\" pattern=\"[0-9]{6}\" placeholder=\"6-digit OTP\">\n              <button id=\"annular-verify\" type=\"button\">Verify<\/button>\n            <\/div>\n          <\/div>\n          <p style=\"margin:0;color:#667085;font-size:12px;line-height:1.6\">\n            Check your inbox and spam folder for the verification code.\n          <\/p>\n        <\/div>\n\n        <button id=\"annular-next\" type=\"button\" disabled style=\"margin-top:8px\">\n          Continue \u2192\n        <\/button>\n      <\/section>\n\n      <!-- STEP 2 -->\n      <section id=\"annular-screen-2\" class=\"annular-screen\" hidden>\n        <div class=\"annular-step-label\">Step 2 of 2<\/div>\n        <p style=\"margin:0 0 17px;color:#667085;font-size:13px;line-height:1.6\">\n          Your email is verified. Tell us a little more about your requirements.\n        <\/p>\n\n        <div class=\"annular-field\">\n          <label for=\"annular-mobile\">Mobile Number *<\/label>\n          <input id=\"annular-mobile\" name=\"user_mobile\" type=\"tel\"\n                 placeholder=\"Enter your mobile number\" autocomplete=\"tel\"\n                 maxlength=\"20\" pattern=\"[+]?[0-9 ()-]{7,20}\"\n                 title=\"Enter a valid mobile number.\" required>\n        <\/div>\n\n        <div class=\"annular-field\">\n          <label for=\"annular-help\">How Can We Help? *<\/label>\n          <textarea id=\"annular-help\" name=\"message\"\n                    placeholder=\"Tell us about your project or requirements\"\n                    maxlength=\"4000\" required><\/textarea>\n        <\/div>\n\n        <div id=\"annular-step2-actions\">\n          <button id=\"annular-back\" type=\"button\">\u2190 Back<\/button>\n          <button id=\"annular-submit\" type=\"submit\" disabled>Submit Enquiry<\/button>\n        <\/div>\n      <\/section>\n\n      <div id=\"annular-status\" role=\"status\" aria-live=\"polite\"><\/div>\n    <\/form>\n  <\/div>\n<\/div>\n\n<!-- THANK-YOU POPUP -->\n<div id=\"annular-thankyou-modal\" role=\"dialog\" aria-modal=\"true\"\n     aria-labelledby=\"annular-thankyou-title\"\n     aria-describedby=\"annular-thankyou-description\" aria-hidden=\"true\">\n  <div class=\"annular-thankyou-card\">\n    <button id=\"annular-thankyou-close\" type=\"button\"\n            aria-label=\"Close thank-you message\">\u00d7<\/button>\n\n    <div class=\"annular-success-icon\" aria-hidden=\"true\">\u2713<\/div>\n    <h3 id=\"annular-thankyou-title\">Thank You!<\/h3>\n    <p id=\"annular-thankyou-description\" class=\"annular-thankyou-message\">\n      Your consultation request has been submitted successfully.\n      Our team will review your requirements and get in touch with you soon.\n    <\/p>\n    <button id=\"annular-thankyou-done\" type=\"button\"\n            class=\"annular-thankyou-button\">Done<\/button>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/@emailjs\/browser@4\/dist\/email.min.js\"><\/script>\n\n<script>\n(() => {\n  \"use strict\";\n\n  \/* EMAILJS SETTINGS *\/\n  const SERVICE_ID = \"service_56m8mns\";\n  const PUBLIC_KEY = \"7krsXzZ1B4qnPrCGC\";\n  const OTP_TEMPLATE_ID = \"template_6r4w7s6\";\n  const ENQUIRY_TEMPLATE_ID = \"template_ol5pw49\";\n\n  \/* WEBSITE DETECTION *\/\n  const hostname = window.location.hostname.toLowerCase().replace(\/\\.$\/, \"\");\n\n  const isPods = [\n    \"pods.annulartechnologies.com\",\n    \"www.pods.annulartechnologies.com\"\n  ].includes(hostname);\n\n  const isAnnular = [\n    \"annulartechnologies.com\",\n    \"www.annulartechnologies.com\",\n    \"web.annulartechnologies.com\"\n  ].includes(hostname);\n\n  const $ = id => document.getElementById(id);\n\n  const openButton = $(\"annular-open\") || { addEventListener: () => {}, focus: () => {} };\n  let currentServiceContext = \"Quality Assurance\";\n  let currentTitleContext = \"Improve Your Testing Process\";\n  const modal = $(\"annular-modal\");\n  const thankyouModal = $(\"annular-thankyou-modal\");\n  const form = $(\"annular-form\");\n\n  const nameInput = $(\"annular-name\");\n  const emailInput = $(\"annular-email\");\n  const mobileInput = $(\"annular-mobile\");\n  const helpInput = $(\"annular-help\");\n  const otpArea = $(\"annular-otp-area\");\n  const otpInput = $(\"annular-otp\");\n\n  const sendButton = $(\"annular-send-otp\");\n  const verifyButton = $(\"annular-verify\");\n  const nextButton = $(\"annular-next\");\n  const backButton = $(\"annular-back\");\n  const submitButton = $(\"annular-submit\");\n  const status = $(\"annular-status\");\n\n  let currentOTP = \"\";\n  let verifiedEmail = \"\";\n  let otpExpiresAt = 0;\n  let otpAttempts = 0;\n  let resendAvailableAt = 0;\n  let resendTimer = null;\n  let sendingOTP = false;\n  let sendingEnquiry = false;\n  let requestVersion = 0;\n  let previousFocus = null;\n  let previousBodyOverflow = \"\";\n  let previousHtmlOverflow = \"\";\n\n  \/* Move popups outside Avada containers *\/\n  document.body.appendChild(modal);\n  document.body.appendChild(thankyouModal);\n\n  function setStatus(message, type = \"\") {\n    status.textContent = message;\n    status.className = type;\n  }\n\n  function getEmail() {\n    return emailInput.value.trim().toLowerCase();\n  }\n\n  function emailJSReady() {\n    return Boolean(window.emailjs &&\n      typeof window.emailjs.send === \"function\");\n  }\n\n  if (emailJSReady()) {\n    window.emailjs.init({ publicKey: PUBLIC_KEY });\n  } else {\n    setStatus(\"Email service failed to load. Refresh the page and try again.\", \"error\");\n  }\n\n  \/* Enable OTP only when the email is valid *\/\n  function updateSendButton() {\n    const validEmail =\n      emailInput.value.trim() !== \"\" && emailInput.checkValidity();\n\n    const coolingDown = Date.now() < resendAvailableAt;\n\n    sendButton.disabled =\n      !validEmail || sendingOTP || sendingEnquiry || coolingDown;\n  }\n\n  \/* Enable Continue only when name and verified email are valid *\/\n  function updateContinueButton() {\n    const nameValid = nameInput.value.trim().length > 0;\n\n    const verificationValid =\n      verifiedEmail !== \"\" &&\n      verifiedEmail === getEmail() &&\n      Date.now() < otpExpiresAt;\n\n    nextButton.disabled = !(\n      nameValid && verificationValid && !sendingEnquiry\n    );\n  }\n\n  \/*\n   * IMPORTANT FIX:\n   * Submit is enabled only when:\n   * 1. Email has been verified and OTP is not expired.\n   * 2. Mobile number is valid.\n   * 3. Message is not empty.\n   * 4. No enquiry is currently being submitted.\n   *\/\n  function updateSubmitButton() {\n    const verificationValid =\n      verifiedEmail !== \"\" &&\n      verifiedEmail === getEmail() &&\n      currentOTP !== \"\" &&\n      Date.now() < otpExpiresAt;\n\n    const mobileValid =\n      mobileInput.value.trim() !== \"\" &&\n      mobileInput.checkValidity();\n\n    const messageValid =\n      helpInput.value.trim().length > 0;\n\n    submitButton.disabled = !(\n      verificationValid &&\n      mobileValid &&\n      messageValid &&\n      !sendingEnquiry\n    );\n  }\n\n  function lockPageScroll() {\n    previousBodyOverflow = document.body.style.overflow;\n    previousHtmlOverflow = document.documentElement.style.overflow;\n\n    document.documentElement.classList.add(\"annular-popup-open\");\n    document.body.classList.add(\"annular-popup-open\");\n\n    document.documentElement.style.overflow = \"hidden\";\n    document.body.style.overflow = \"hidden\";\n  }\n\n  function unlockPageScroll() {\n    document.documentElement.classList.remove(\"annular-popup-open\");\n    document.body.classList.remove(\"annular-popup-open\");\n\n    document.documentElement.style.overflow = previousHtmlOverflow;\n    document.body.style.overflow = previousBodyOverflow;\n  }\n\n  function openModal() {\n    previousFocus = document.activeElement;\n    lockPageScroll();\n\n    modal.classList.add(\"is-open\");\n    modal.setAttribute(\"aria-hidden\", \"false\");\n\n    requestAnimationFrame(() =>\n      nameInput.focus({ preventScroll: true })\n    );\n  }\n\n  function closeModal() {\n    modal.classList.remove(\"is-open\");\n    modal.setAttribute(\"aria-hidden\", \"true\");\n\n    if (!thankyouModal.classList.contains(\"is-open\")) {\n      unlockPageScroll();\n    }\n\n    if (previousFocus && typeof previousFocus.focus === \"function\") {\n      previousFocus.focus({ preventScroll: true });\n    }\n  }\n\n  \n  function openModalWithConfig(title, service) {\n    if (title) {\n      currentTitleContext = title;\n      const titleEl = $(\"annular-title\");\n      if (titleEl) titleEl.textContent = title;\n    }\n    if (service) {\n      currentServiceContext = service;\n    }\n    openModal();\n  }\n\n  \/\/ Attach global click listener for trigger buttons\n  const triggerList = [\".qe-btn-primary\",\"a[href=\\\"#lets-talk\\\"]\",\".qe-btn-secondary\",\"a[href*=\\\"\/contact\/\\\"]\"];\n  document.addEventListener(\"click\", function(event) {\n    const selectorStr = triggerList.join(\", \");\n    if (!selectorStr) return;\n    const trigger = event.target.closest(selectorStr);\n    if (trigger) {\n      event.preventDefault();\n      \/\/ Extract clean text from clicked button (stripping arrow icons like \u2192, \u2197)\n      const rawText = (trigger.innerText || \"\").replace(\/[\\u2190-\\u21FF\\u27F0-\\u27FF\\u2900-\\u297F\u2192\u2197\u2190\u25ba]\/g, \"\").trim();\n      const customTitle = trigger.getAttribute(\"data-modal-title\") || \n                          (rawText.length >= 3 && rawText.length <= 60 ? rawText : \"Improve Your Testing Process\");\n      const customService = trigger.getAttribute(\"data-service\") || \"Quality Assurance\";\n      openModalWithConfig(customTitle, customService);\n    }\n  });\n\n  openButton.addEventListener(\"click\", openModal);\n  $(\"annular-close\").addEventListener(\"click\", closeModal);\n\n  modal.addEventListener(\"click\", event => {\n    if (event.target === modal) closeModal();\n  });\n\n  function showThankYou() {\n    modal.classList.remove(\"is-open\");\n    modal.setAttribute(\"aria-hidden\", \"true\");\n\n    thankyouModal.classList.add(\"is-open\");\n    thankyouModal.setAttribute(\"aria-hidden\", \"false\");\n\n    requestAnimationFrame(() =>\n      $(\"annular-thankyou-done\").focus({ preventScroll: true })\n    );\n  }\n\n  function closeThankYou() {\n    thankyouModal.classList.remove(\"is-open\");\n    thankyouModal.setAttribute(\"aria-hidden\", \"true\");\n\n    unlockPageScroll();\n    openButton.focus({ preventScroll: true });\n  }\n\n  $(\"annular-thankyou-close\").addEventListener(\"click\", closeThankYou);\n  $(\"annular-thankyou-done\").addEventListener(\"click\", closeThankYou);\n\n  thankyouModal.addEventListener(\"click\", event => {\n    if (event.target === thankyouModal) closeThankYou();\n  });\n\n  document.addEventListener(\"keydown\", event => {\n    if (event.key !== \"Escape\") return;\n\n    if (thankyouModal.classList.contains(\"is-open\")) {\n      closeThankYou();\n    } else if (modal.classList.contains(\"is-open\")) {\n      closeModal();\n    }\n  });\n\n  function clearResendTimer() {\n    if (resendTimer) {\n      clearInterval(resendTimer);\n      resendTimer = null;\n    }\n  }\n\n  function resetVerification(message = \"\", type = \"\") {\n    requestVersion++;\n\n    currentOTP = \"\";\n    verifiedEmail = \"\";\n    otpExpiresAt = 0;\n    otpAttempts = 0;\n\n    otpArea.hidden = true;\n    otpInput.value = \"\";\n\n    verifyButton.disabled = false;\n\n    clearResendTimer();\n\n    updateSendButton();\n    updateContinueButton();\n    updateSubmitButton();\n\n    setStatus(message, type);\n  }\n\n  \/* Email edits invalidate the previous verification *\/\n  emailInput.addEventListener(\"input\", () => {\n    if (currentOTP || verifiedEmail || !otpArea.hidden) {\n      resetVerification(\n        \"Email changed. Please request a new OTP.\",\n        \"error\"\n      );\n    } else {\n      updateSendButton();\n      updateContinueButton();\n      updateSubmitButton();\n    }\n  });\n\n  nameInput.addEventListener(\"input\", updateContinueButton);\n\n  \/* CRITICAL FIX: update Submit whenever these fields change *\/\n  mobileInput.addEventListener(\"input\", updateSubmitButton);\n  mobileInput.addEventListener(\"change\", updateSubmitButton);\n  helpInput.addEventListener(\"input\", updateSubmitButton);\n  helpInput.addEventListener(\"change\", updateSubmitButton);\n\n  function generateOTP() {\n    if (!window.crypto || !window.crypto.getRandomValues) {\n      throw new Error(\"Secure random number generation is unavailable.\");\n    }\n\n    const values = new Uint32Array(1);\n    window.crypto.getRandomValues(values);\n\n    return String(values[0] % 1000000).padStart(6, \"0\");\n  }\n\n  \/* SEND OTP *\/\n  sendButton.addEventListener(\"click\", async () => {\n    if (!emailJSReady()) {\n      setStatus(\"Email service is unavailable. Please refresh and try again.\", \"error\");\n      return;\n    }\n\n    if (!emailInput.checkValidity()) {\n      emailInput.reportValidity();\n      updateSendButton();\n      return;\n    }\n\n    if (sendingOTP || sendingEnquiry) return;\n\n    if (Date.now() < resendAvailableAt) {\n      setStatus(\n        \"Please wait \" +\n        Math.ceil((resendAvailableAt - Date.now()) \/ 1000) +\n        \" seconds before requesting another OTP.\",\n        \"error\"\n      );\n\n      updateSendButton();\n      return;\n    }\n\n    const email = getEmail();\n    const version = ++requestVersion;\n\n    sendingOTP = true;\n    updateSendButton();\n\n    currentOTP = \"\";\n    verifiedEmail = \"\";\n    otpExpiresAt = 0;\n    otpAttempts = 0;\n\n    otpArea.hidden = true;\n    otpInput.value = \"\";\n\n    updateContinueButton();\n    updateSubmitButton();\n\n    setStatus(\"Sending OTP...\");\n\n    try {\n      const otp = generateOTP();\n\n      await window.emailjs.send(\n        SERVICE_ID,\n        OTP_TEMPLATE_ID,\n        {\n          email: email,\n          passcode: otp,\n          time: new Date(Date.now() + 5 * 60 * 1000)\n            .toLocaleTimeString()\n        }\n      );\n\n      if (version !== requestVersion) return;\n\n      if (getEmail() !== email) {\n        setStatus(\"Email changed. Please request a new OTP.\", \"error\");\n        return;\n      }\n\n      currentOTP = otp;\n      otpExpiresAt = Date.now() + 5 * 60 * 1000;\n      resendAvailableAt = Date.now() + 60000;\n\n      otpArea.hidden = false;\n\n      otpInput.focus({ preventScroll: true });\n\n      setStatus(\"OTP sent. Please check your email.\", \"success\");\n\n      clearResendTimer();\n\n      \/*\n       * Also refresh validation periodically so an expired OTP\n       * cannot leave the Submit button enabled.\n       *\/\n      resendTimer = setInterval(() => {\n        updateSendButton();\n        updateContinueButton();\n        updateSubmitButton();\n\n        if (Date.now() >= resendAvailableAt) {\n          resendAvailableAt = 0;\n          updateSendButton();\n        }\n\n        if (Date.now() >= otpExpiresAt) {\n          clearResendTimer();\n\n          if (verifiedEmail) {\n            verifiedEmail = \"\";\n            updateContinueButton();\n            updateSubmitButton();\n\n            setStatus(\n              \"OTP expired. Please request a new OTP to continue.\",\n              \"error\"\n            );\n          } else {\n            updateSubmitButton();\n          }\n        }\n      }, 1000);\n\n    } catch (error) {\n      console.error(\"OTP EmailJS error:\", error);\n\n      setStatus(\n        \"Unable to send OTP. Check your EmailJS service and OTP template.\",\n        \"error\"\n      );\n\n    } finally {\n      sendingOTP = false;\n      updateSendButton();\n      updateContinueButton();\n      updateSubmitButton();\n    }\n  });\n\n  \/* VERIFY OTP *\/\n  verifyButton.addEventListener(\"click\", () => {\n    const email = getEmail();\n    const enteredOTP = otpInput.value.trim();\n\n    if (!currentOTP || Date.now() >= otpExpiresAt) {\n      resetVerification(\"OTP expired. Please request a new OTP.\", \"error\");\n      return;\n    }\n\n    if (otpAttempts >= 5) {\n      resetVerification(\"Too many attempts. Please request a new OTP.\", \"error\");\n      return;\n    }\n\n    otpAttempts++;\n\n    if (!\/^\\d{6}$\/.test(enteredOTP) || enteredOTP !== currentOTP) {\n      verifiedEmail = \"\";\n\n      updateContinueButton();\n      updateSubmitButton();\n\n      if (otpAttempts >= 5) {\n        resetVerification(\n          \"Too many attempts. Please request a new OTP.\",\n          \"error\"\n        );\n      } else {\n        setStatus(\"Incorrect OTP. Please try again.\", \"error\");\n      }\n\n      return;\n    }\n\n    verifiedEmail = email;\n    verifyButton.disabled = true;\n\n    updateContinueButton();\n    updateSubmitButton();\n\n    setStatus(\"Email verified successfully.\", \"success\");\n  });\n\n  \/* STEP NAVIGATION *\/\n  nextButton.addEventListener(\"click\", () => {\n    if (!nameInput.checkValidity()) {\n      nameInput.reportValidity();\n      return;\n    }\n\n    if (!verifiedEmail || verifiedEmail !== getEmail()) {\n      setStatus(\"Please verify your email before continuing.\", \"error\");\n      return;\n    }\n\n    if (Date.now() >= otpExpiresAt) {\n      resetVerification(\"OTP expired. Please request a new OTP.\", \"error\");\n      return;\n    }\n\n    $(\"annular-screen-1\").hidden = true;\n    $(\"annular-screen-2\").hidden = false;\n\n    $(\"annular-progress-2\").classList.add(\"active\");\n\n    setStatus(\"\");\n\n    updateSubmitButton();\n\n    mobileInput.focus({ preventScroll: true });\n  });\n\n  backButton.addEventListener(\"click\", () => {\n    $(\"annular-screen-2\").hidden = true;\n    $(\"annular-screen-1\").hidden = false;\n\n    $(\"annular-progress-2\").classList.remove(\"active\");\n\n    setStatus(\"\");\n\n    updateContinueButton();\n    updateSubmitButton();\n  });\n\n  \/* SUBMIT ENQUIRY *\/\n  form.addEventListener(\"submit\", async event => {\n    event.preventDefault();\n\n    if (sendingEnquiry) return;\n\n    \/*\n     * Revalidate at submission time instead of trusting\n     * the button's disabled state alone.\n     *\/\n    updateSubmitButton();\n\n    if (!form.checkValidity()) {\n      form.reportValidity();\n      return;\n    }\n\n    const name = nameInput.value.trim();\n    const email = getEmail();\n    const mobile = mobileInput.value.trim();\n    const message = helpInput.value.trim();\n\n    if (!name || !email || !mobile || !message) {\n      setStatus(\n        \"Name, email, mobile number, and message are required.\",\n        \"error\"\n      );\n      return;\n    }\n\n    if (\n      !verifiedEmail ||\n      verifiedEmail !== email ||\n      !currentOTP ||\n      Date.now() >= otpExpiresAt\n    ) {\n      resetVerification(\n        \"Please verify your email before submitting.\",\n        \"error\"\n      );\n\n      $(\"annular-screen-2\").hidden = true;\n      $(\"annular-screen-1\").hidden = false;\n      $(\"annular-progress-2\").classList.remove(\"active\");\n\n      return;\n    }\n\n    if (!mobileInput.checkValidity()) {\n      mobileInput.reportValidity();\n      return;\n    }\n\n    if (!emailJSReady()) {\n      setStatus(\"Email service is unavailable. Please try again.\", \"error\");\n      return;\n    }\n\n    sendingEnquiry = true;\n\n    updateSubmitButton();\n    updateSendButton();\n\n    setStatus(\"Submitting your enquiry...\");\n\n    try {\n      await window.emailjs.send(\n        SERVICE_ID,\n        ENQUIRY_TEMPLATE_ID,\n        {\n          \/*\n           * Annular domain: company fields are populated.\n           * PODS domain: company fields are blank.\n           *\/\n          website_name: isAnnular ? \"Annular Technologies\" : \"\",\n          company_name: isAnnular ? \"Annular Technologies\" : \"\",\n\n          user_name: name,\n          user_email: email,\n          user_mobile: mobile,\n          service_name: currentServiceContext,\n          service_title: currentTitleContext,\n          message: \"[Service: \" + currentServiceContext + \" | \" + currentTitleContext + \"]\\n\" + message\n        }\n      );\n\n      form.reset();\n\n      clearResendTimer();\n\n      currentOTP = \"\";\n      verifiedEmail = \"\";\n      otpExpiresAt = 0;\n      otpAttempts = 0;\n      resendAvailableAt = 0;\n\n      $(\"annular-screen-1\").hidden = false;\n      $(\"annular-screen-2\").hidden = true;\n\n      $(\"annular-progress-1\").classList.add(\"active\");\n      $(\"annular-progress-2\").classList.remove(\"active\");\n\n      otpArea.hidden = true;\n      verifyButton.disabled = false;\n\n      updateSendButton();\n      updateContinueButton();\n      updateSubmitButton();\n\n      setStatus(\"\");\n\n      showThankYou();\n\n    } catch (error) {\n      console.error(\"Consultation EmailJS error:\", error);\n\n      setStatus(\n        \"Unable to submit your enquiry. Check your EmailJS template settings and try again.\",\n        \"error\"\n      );\n\n    } finally {\n      sendingEnquiry = false;\n\n      updateSendButton();\n      updateContinueButton();\n      updateSubmitButton();\n    }\n  });\n\n  \/* INITIAL STATE *\/\n  updateSendButton();\n  updateContinueButton();\n  updateSubmitButton();\n\n})();\n<\/script>\n<\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"100-width.php","meta":{"_acf_changed":false,"om_disable_all_campaigns":false,"footnotes":""},"class_list":["post-1682","page","type-page","status-publish","hentry"],"acf":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/pages\/1682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/comments?post=1682"}],"version-history":[{"count":14,"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/pages\/1682\/revisions"}],"predecessor-version":[{"id":2604,"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/pages\/1682\/revisions\/2604"}],"wp:attachment":[{"href":"https:\/\/web.annulartechnologies.com\/staging\/wp-json\/wp\/v2\/media?parent=1682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}