Your Smile, Our Priority

Experience premium dental care with cutting-edge technology and compassionate service

WhatsApp Now
Smiling Dentist

5.0 Rating

500+ Happy Patients

500+

Happy Patients

15+

Years Experience

8+

Expert Dentists

100%

Safe & Sterile

Modern Dental Clinic
ISO Certified

About Denticare

Leading Dental Excellence in Karachi

At Denticare, we believe that a beautiful smile is a gateway to confidence and success. With over 15 years of experience, our team of expert dentists is committed to providing world-class dental care using the latest technology and techniques.

  • State-of-the-art equipment
  • Experienced & certified dentists
  • Painless treatment procedures
  • Affordable pricing plans
  • Hygienic & sterile environment

Our Services

Comprehensive dental solutions for your entire family

Why Choose Denticare?

Excellence in every aspect of dental care

Expert Dentists

Highly qualified and experienced professionals with international certifications

Modern Equipment

Latest dental technology for accurate diagnosis and effective treatment

Painless Treatment

Advanced techniques ensuring comfortable and pain-free dental procedures

Sterile Environment

Highest hygiene standards with complete sterilization protocols

Affordable Prices

Transparent pricing with flexible payment options for all budgets

24/7 Support

Always available for emergency consultations and patient support

Patient Testimonials

What our happy patients say about us

Book Your Appointment

Schedule your visit at your convenience

  • Quick & Easy Booking
  • Instant Confirmation
  • Flexible Time Slots
  • No Hidden Charges

We'll send confirmation via WhatsApp & SMS

Frequently Asked Questions

Find answers to common dental questions

``` --- ### **2. css/style.css** (Main Styles) ```css /* ==================== ROOT VARIABLES ==================== */ :root { --primary: #667eea; --primary-dark: #764ba2; --secondary: #4facfe; --accent: #43e97b; --success: #43e97b; --warning: #fa709a; --danger: #ff6b6b; --light: #f8f9fa; --lighter: #f0f2f5; --dark: #2d3748; --text: #4a5568; --border: #e2e8f0; --shadow: 0 10px 30px rgba(0, 0, 0, 0.1); --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.15); --font-primary: 'Poppins', sans-serif; --font-secondary: 'Playfair Display', serif; --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* ==================== GLOBAL STYLES ==================== */ * { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; } body { font-family: var(--font-primary); color: var(--text); background-color: #fff; line-height: 1.6; overflow-x: hidden; } .container { max-width: 1200px; margin: 0 auto; padding: 0 20px; } /* ==================== LOADER ==================== */ .loader { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.95); display: flex; align-items: center; justify-content: center; z-index: 9999; opacity: 1; visibility: visible; transition: opacity 0.5s, visibility 0.5s; } .loader.hidden { opacity: 0; visibility: hidden; } .loader-spinner { width: 50px; height: 50px; border: 4px solid var(--lighter); border-top-color: var(--primary); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ==================== TYPOGRAPHY ==================== */ h1, h2, h3, h4, h5, h6 { font-family: var(--font-secondary); color: var(--dark); line-height: 1.2; margin-bottom: 1rem; } h1 { font-size: 3.5rem; font-weight: 700; } h2 { font-size: 2.5rem; font-weight: 700; } h3 { font-size: 1.75rem; font-weight: 600; } h4 { font-size: 1.5rem; font-weight: 600; } h5 { font-size: 1.25rem; font-weight: 600; } h6 { font-size: 1rem; font-weight: 600; } p { margin-bottom: 1rem; color: var(--text); } a { color: var(--primary); text-decoration: none; transition: var(--transition); } a:hover { color: var(--primary-dark); } /* ==================== BUTTONS ==================== */ .btn-primary, .btn-secondary { padding: 12px 28px; border: none; border-radius: 8px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: var(--transition); display: inline-flex; align-items: center; gap: 8px; font-family: var(--font-primary); } .btn-primary { background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); color: white; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4); } .btn-secondary { background: white; color: var(--primary); border: 2px solid var(--primary); } .btn-secondary:hover { background: var(--primary); color: white; } .btn-lg { padding: 16px 36px; font-size: 1.1rem; } .btn-block { width: 100%; } .btn-call, .btn-whatsapp { width: 44px; height: 44px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.2rem; color: white; border: none; cursor: pointer; transition: var(--transition); } .btn-call { background: var(--primary); } .btn-whatsapp { background: #25d366; } .btn-call:hover, .btn-whatsapp:hover { transform: scale(1.1); } .btn-appointment { background: var(--accent); color: var(--dark); } .btn-appointment:hover { background: #2dd96f; } /* ==================== NAVBAR ==================== */ .navbar { background: white; padding: 1rem 0; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); position: relative; z-index: 100; transition: var(--transition); } .navbar.sticky-navbar { position: sticky; top: 0; box-shadow: var(--shadow); } .nav-wrapper { display: flex; align-items: center; justify-content: space-between; } .logo { display: flex; align-items: center; gap: 12px; font-size: 1.5rem; font-weight: 700; color: var(--dark); } .logo-img { width: 40px; height: 40px; border-radius: 50%; object-fit: cover; } .nav-menu { display: flex; list-style: none; gap: 2rem; align-items: center; } .nav-link { color: var(--text); font-weight: 500; position: relative; transition: var(--transition); } .nav-link::after { content: ''; position: absolute; bottom: -5px; left: 0; width: 0; height: 2px; background: var(--primary); transition: var(--transition); } .nav-link:hover::after, .nav-link.active::after { width: 100%; } .nav-cta { display: flex; align-items: center; gap: 1rem; } .menu-toggle { display: none; flex-direction: column; gap: 5px; cursor: pointer; } .menu-toggle span { width: 25px; height: 3px; background: var(--dark); border-radius: 2px; transition: var(--transition); } /* ==================== HERO SECTION ==================== */ .hero { background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%); padding: 80px 0; position: relative; overflow: hidden; } .hero::before { content: ''; position: absolute; top: 0; right: -100px; width: 400px; height: 400px; background: radial-gradient(circle, rgba(67, 233, 123, 0.1) 0%, transparent 70%); border-radius: 50%; } .hero-wrapper { display: grid; grid-template-columns: 1fr 1fr; gap: 3rem; align-items: center; } .hero-text h1 { font-size: 3.5rem; margin-bottom: 1rem; background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .hero-subtitle { font-size: 1.2rem; color: var(--text); margin-bottom: 2rem; line-height: 1.8; } .hero-buttons { display: flex; gap: 1rem; flex-wrap: wrap; } .hero-image { position: relative; } .hero-img { width: 100%; max-width: 500px; border-radius: 20px; box-shadow: var(--shadow-lg); animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-20px); } } .hero-badge { position: absolute; bottom: 30px; left: 30px; background: white; padding: 20px; border-radius: 15px; box-shadow: var(--shadow); display: flex; align-items: center; gap: 15px; animation: slideUp 0.8s ease-out; } .badge-icon { font-size: 2rem; } .badge-title { font-weight: 700; color: var(--dark); margin: 0; } .badge-subtitle { font-size: 0.9rem; color: var(--text); margin: 0; } .hero-wave { position: absolute; bottom: -1px; left: 0; width: 100%; height: 100px; background: url('data:image/svg+xml,') repeat-x; background-size: 600px 120px; animation: wave 15s linear infinite; } @keyframes wave { 0% { background-position: 0 0; } 100% { background-position: 600px 0; } } /* ==================== QUICK STATS ==================== */ .quick-stats { padding: 60px 0; background: white; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 2rem; } .stat-card { text-align: center; padding: 2rem; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); border-radius: 15px; transition: var(--transition); border: 1px solid rgba(102, 126, 234, 0.1); } .stat-card:hover { transform: translateY(-10px); box-shadow: var(--shadow); } .stat-icon { font-size: 3rem; color: var(--primary); margin-bottom: 1rem; } .stat-number { font-size: 2.5rem; color: var(--dark); margin-bottom: 0.5rem; } .stat-label { color: var(--text); font-size: 1rem; } /* ==================== SECTION HEADERS ==================== */ .section-header { text-align: center; margin-bottom: 3rem; } .section-title { font-size: 2.5rem; color: var(--dark); margin-bottom: 0.5rem; } .section-subtitle { font-size: 1.1rem; color: var(--text); } /* ==================== ABOUT SECTION ==================== */ .about-section { padding: 80px 0; background: white; } .about-wrapper { display: grid; grid-template-columns: 1fr 1fr; gap: 3rem; align-items: center; } .about-image { position: relative; } .about-image img { width: 100%; border-radius: 15px; box-shadow: var(--shadow-lg); } .about-badge { position: absolute; top: 20px; right: 20px; background: white; padding: 15px 20px; border-radius: 10px; box-shadow: var(--shadow); display: flex; align-items: center; gap: 10px; font-weight: 600; color: var(--primary); } .about-badge i { font-size: 1.5rem; } .about-content h2 { margin-bottom: 0.5rem; } .about-text { color: var(--text); line-height: 1.8; margin-bottom: 1.5rem; } .about-features { list-style: none; margin-bottom: 2rem; } .about-features li { padding: 0.75rem 0; display: flex; align-items: center; gap: 10px; color: var(--text); } .about-features i { color: var(--accent); font-size: 1.2rem; } /* ==================== SERVICES SECTION ==================== */ .services-section { padding: 80px 0; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); } .services-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; margin-bottom: 2rem; } .service-card { background: white; padding: 2rem; border-radius: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); transition: var(--transition); border: 1px solid var(--border); cursor: pointer; } .service-card:hover { transform: translateY(-10px); box-shadow: var(--shadow); border-color: var(--primary); } .service-icon { font-size: 3rem; color: var(--primary); margin-bottom: 1rem; } .service-card h3 { margin-bottom: 1rem; color: var(--dark); } .service-card p { color: var(--text); margin-bottom: 1.5rem; } .service-card a { color: var(--primary); font-weight: 600; display: inline-flex; align-items: center; gap: 5px; transition: var(--transition); } .service-card a:hover { gap: 10px; } .section-cta { text-align: center; } /* ==================== WHY CHOOSE US ==================== */ .why-choose-us { padding: 80px 0; background: white; } .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; } .feature-card { text-align: center; padding: 2rem; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); border-radius: 15px; transition: var(--transition); border: 1px solid rgba(102, 126, 234, 0.1); } .feature-card:hover { transform: translateY(-10px); box-shadow: var(--shadow); } .feature-icon { font-size: 3rem; color: var(--primary); margin-bottom: 1rem; } .feature-card h3 { margin-bottom: 1rem; color: var(--dark); } .feature-card p { color: var(--text); line-height: 1.6; } /* ==================== TESTIMONIALS SECTION ==================== */ .testimonials-section { padding: 80px 0; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); } .testimonials-slider { position: relative; } .testimonial-card { background: white; padding: 2rem; border-radius: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); border: 1px solid var(--border); text-align: center; } .testimonial-stars { color: #ffc107; font-size: 1.2rem; margin-bottom: 1rem; } .testimonial-text { color: var(--text); margin-bottom: 1.5rem; font-style: italic; line-height: 1.8; } .testimonial-author { display: flex; align-items: center; justify-content: center; gap: 1rem; } .testimonial-avatar { width: 50px; height: 50px; border-radius: 50%; object-fit: cover; } .testimonial-info h4 { margin: 0; color: var(--dark); } .testimonial-info p { margin: 0; font-size: 0.9rem; color: var(--text); } /* ==================== APPOINTMENT SECTION ==================== */ .appointment-section { padding: 80px 0; background: white; } .appointment-wrapper { display: grid; grid-template-columns: 1fr 1fr; gap: 3rem; align-items: center; } .appointment-content h2 { margin-bottom: 0.5rem; } .appointment-benefits { list-style: none; margin: 2rem 0; } .appointment-benefits li { padding: 0.75rem 0; display: flex; align-items: center; gap: 10px; color: var(--text); } .appointment-benefits i { color: var(--accent); font-size: 1.2rem; } /* ==================== FORMS ==================== */ .appointment-form, .contact-form, .modal-form { display: flex; flex-direction: column; gap: 1.5rem; } .form-group { position: relative; display: flex; flex-direction: column; } .form-group label { margin-bottom: 0.5rem; font-weight: 500; color: var(--dark); } .form-group input, .form-group select, .form-group textarea { padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; font-family: var(--font-primary); font-size: 1rem; transition: var(--transition); background: white; } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); } .form-group i { position: absolute; right: 15px; top: 40px; color: var(--text); pointer-events: none; } .form-note { font-size: 0.9rem; color: var(--text); text-align: center; margin: 0; } /* ==================== GALLERY SECTION ==================== */ .gallery-section { padding: 80px 0; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); } .gallery-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; } .gallery-item { position: relative; border-radius: 12px; overflow: hidden; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); cursor: pointer; transition: var(--transition); } .gallery-item:hover { transform: scale(1.05); } .gallery-item img { width: 100%; height: 250px; object-fit: cover; transition: var(--transition); } .gallery-item:hover img { transform: scale(1.1); } .gallery-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(102, 126, 234, 0.8); display: flex; align-items: center; justify-content: center; opacity: 0; transition: var(--transition); } .gallery-item:hover .gallery-overlay { opacity: 1; } .gallery-overlay i { font-size: 2rem; color: white; } /* ==================== FAQ SECTION ==================== */ .faq-section { padding: 80px 0; background: white; } .faq-container { max-width: 800px; margin: 0 auto; } .faq-item { margin-bottom: 1.5rem; border: 1px solid var(--border); border-radius: 10px; overflow: hidden; transition: var(--transition); } .faq-item:hover { border-color: var(--primary); box-shadow: 0 5px 15px rgba(102, 126, 234, 0.1); } .faq-question { padding: 1.5rem; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); cursor: pointer; display: flex; align-items: center; justify-content: space-between; font-weight: 600; color: var(--dark); transition: var(--transition); } .faq-question:hover { background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%); } .faq-icon { font-size: 1.2rem; color: var(--primary); transition: var(--transition); } .faq-item.active .faq-icon { transform: rotate(180deg); } .faq-answer { padding: 0 1.5rem; max-height: 0; overflow: hidden; transition: var(--transition); color: var(--text); line-height: 1.8; } .faq-item.active .faq-answer { padding: 1.5rem; max-height: 500px; } /* ==================== FLOATING BUTTONS (Continued) ==================== */ .fab-button { width: 60px; height: 60px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; color: white; border: none; cursor: pointer; transition: var(--transition); box-shadow: var(--shadow); text-decoration: none; } .fab-call { background: var(--primary); } .fab-whatsapp { background: #25d366; } .fab-appointment { background: var(--accent); color: var(--dark); } .fab-scroll { background: var(--primary-dark); opacity: 0; visibility: hidden; transition: var(--transition); } .fab-scroll.show { opacity: 1; visibility: visible; } .fab-button:hover { transform: scale(1.1); box-shadow: var(--shadow-lg); } /* ==================== MODAL ==================== */ .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.6); display: flex; align-items: center; justify-content: center; z-index: 1000; opacity: 0; visibility: hidden; transition: var(--transition); } .modal.show { opacity: 1; visibility: visible; } .modal-content { background: white; padding: 2rem; border-radius: 15px; max-width: 500px; width: 90%; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-lg); animation: slideUp 0.3s ease-out; } .modal-close { position: absolute; top: 15px; right: 15px; background: none; border: none; font-size: 2rem; cursor: pointer; color: var(--text); transition: var(--transition); } .modal-close:hover { color: var(--primary); } .modal-content h2 { margin-bottom: 1.5rem; } /* ==================== TOAST NOTIFICATION ==================== */ .toast { position: fixed; bottom: 30px; left: 30px; background: white; padding: 1.5rem 2rem; border-radius: 10px; box-shadow: var(--shadow-lg); max-width: 400px; opacity: 0; visibility: hidden; transition: var(--transition); z-index: 2000; border-left: 4px solid var(--primary); } .toast.show { opacity: 1; visibility: visible; animation: slideIn 0.3s ease-out; } .toast.success { border-left-color: var(--success); } .toast.error { border-left-color: var(--danger); } .toast.warning { border-left-color: var(--warning); } @keyframes slideIn { from { transform: translateX(-100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes slideUp { from { transform: translateY(30px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } /* ==================== FOOTER ==================== */ .footer { background: linear-gradient(135deg, var(--dark) 0%, #1a202c 100%); color: #cbd5e0; padding: 60px 0 20px; } .footer-content { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 2rem; margin-bottom: 2rem; } .footer-section h3, .footer-section h4 { color: white; margin-bottom: 1rem; } .footer-section p { color: #cbd5e0; margin-bottom: 0.5rem; } .footer-section ul { list-style: none; } .footer-section ul li { margin-bottom: 0.75rem; } .footer-section a { color: #cbd5e0; transition: var(--transition); } .footer-section a:hover { color: white; } .social-links { display: flex; gap: 1rem; margin-top: 1rem; } .social-links a { width: 40px; height: 40px; border-radius: 50%; background: rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: center; transition: var(--transition); } .social-links a:hover { background: var(--primary); transform: translateY(-5px); } .footer-bottom { border-top: 1px solid rgba(255, 255, 255, 0.1); padding-top: 2rem; text-align: center; color: #cbd5e0; } .footer-bottom a { color: #cbd5e0; } .footer-bottom a:hover { color: white; } /* ==================== PAGE STYLES ==================== */ .page { min-height: 100vh; animation: fadeIn 0.5s ease-out; } .page-header { padding: 60px 0; color: white; text-align: center; } .page-title { font-size: 3rem; margin-bottom: 0.5rem; } .page-subtitle { font-size: 1.2rem; opacity: 0.9; } .page-content { padding: 60px 0; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* ==================== ABOUT PAGE ==================== */ .about-full { margin-bottom: 3rem; } .about-section-full h2 { color: var(--primary); margin-bottom: 1rem; } .about-section-full p { color: var(--text); line-height: 1.8; margin-bottom: 1rem; } .values-list { list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; margin: 2rem 0; } .values-list li { padding: 1.5rem; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); border-radius: 10px; border-left: 4px solid var(--primary); } .values-list strong { color: var(--primary); } .team-section { margin-top: 3rem; } .team-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2rem; margin-top: 2rem; } .team-card { background: white; border-radius: 15px; overflow: hidden; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); transition: var(--transition); } .team-card:hover { transform: translateY(-10px); box-shadow: var(--shadow); } .team-image { width: 100%; height: 300px; object-fit: cover; } .team-info { padding: 1.5rem; text-align: center; } .team-info h3 { margin-bottom: 0.5rem; } .team-position { color: var(--primary); font-weight: 600; margin-bottom: 1rem; } .team-bio { color: var(--text); font-size: 0.95rem; line-height: 1.6; } /* ==================== SERVICES PAGE ==================== */ .services-full { display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 2rem; } .service-detail { background: white; padding: 2rem; border-radius: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); border: 1px solid var(--border); transition: var(--transition); } .service-detail:hover { transform: translateY(-10px); box-shadow: var(--shadow); border-color: var(--primary); } .service-detail-icon { font-size: 3rem; color: var(--primary); margin-bottom: 1rem; } .service-detail h3 { margin-bottom: 1rem; } .service-detail p { color: var(--text); line-height: 1.8; margin-bottom: 1.5rem; } .service-features { list-style: none; margin-bottom: 1.5rem; } .service-features li { padding: 0.5rem 0; display: flex; align-items: center; gap: 10px; color: var(--text); } .service-features i { color: var(--accent); } .service-price { font-size: 1.3rem; color: var(--primary); font-weight: 700; margin-bottom: 1rem; } .service-cta { display: flex; gap: 1rem; } /* ==================== DOCTORS PAGE ==================== */ .doctors-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 2rem; } .doctor-card { background: white; border-radius: 15px; overflow: hidden; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08); transition: var(--transition); } .doctor-card:hover { transform: translateY(-10px); box-shadow: var(--shadow); } .doctor-image { width: 100%; height: 350px; object-fit: cover; position: relative; overflow: hidden; } .doctor-image::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, rgba(102, 126, 234, 0.3) 0%, rgba(118, 75, 162, 0.3) 100%); opacity: 0; transition: var(--transition); } .doctor-card:hover .doctor-image::after { opacity: 1; } .doctor-info { padding: 2rem; text-align: center; } .doctor-name { font-size: 1.5rem; color: var(--dark); margin-bottom: 0.5rem; } .doctor-specialty { color: var(--primary); font-weight: 600; margin-bottom: 1rem; } .doctor-qualifications { color: var(--text); font-size: 0.9rem; margin-bottom: 1rem; } .doctor-experience { color: var(--text); margin-bottom: 1.5rem; font-size: 0.95rem; } .doctor-bio { color: var(--text); line-height: 1.6; margin-bottom: 1.5rem; font-size: 0.95rem; } .doctor-social { display: flex; justify-content: center; gap: 1rem; margin-bottom: 1.5rem; } .doctor-social a { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%); display: flex; align-items: center; justify-content: center; color: var(--primary); transition: var(--transition); } .doctor-social a:hover { background: var(--primary); color: white; transform: translateY(-5px); } .doctor-cta { display: flex; gap: 1rem; } /* ==================== GALLERY PAGE ==================== */ .gallery-filters { display: flex; justify-content: center; gap: 1rem; margin-bottom: 3rem; flex-wrap: wrap; } .filter-btn { padding: 10px 20px; border: 2px solid var(--border); background: white; border-radius: 25px; cursor: pointer; font-weight: 600; color: var(--text); transition: var(--transition); } .filter-btn:hover, .filter-btn.active { border-color: var(--primary); background: var(--primary); color: white; } .gallery-full { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; } /* ==================== CONTACT PAGE ==================== */ .contact-wrapper { display: grid; grid-template-columns: 1fr 1fr; gap: 3rem; margin-bottom: 3rem; } .contact-info { display: flex; flex-direction: column; gap: 1.5rem; } .info-card { padding: 1.5rem; background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); border-radius: 10px; border-left: 4px solid var(--primary); transition: var(--transition); } .info-card:hover { transform: translateX(10px); } .info-icon { font-size: 2rem; color: var(--primary); margin-bottom: 1rem; } .info-card h3 { margin-bottom: 0.5rem; color: var(--dark); } .info-card p { color: var(--text); margin: 0; } .info-card a { color: var(--primary); font-weight: 600; } .map-container { border-radius: 15px; overflow: hidden; box-shadow: var(--shadow); } /* ==================== ANIMATIONS ==================== */ @keyframes slideDown { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideRight { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideLeft { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } } @keyframes zoomIn { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } /* ==================== UTILITY CLASSES ==================== */ .text-center { text-align: center; } .text-primary { color: var(--primary); } .text-dark { color: var(--dark); } .text-muted { color: var(--text); } .mt-1 { margin-top: 0.5rem; } .mt-2 { margin-top: 1rem; } .mt-3 { margin-top: 1.5rem; } .mt-4 { margin-top: 2rem; } .mb-1 { margin-bottom: 0.5rem; } .mb-2 { margin-bottom: 1rem; } .mb-3 { margin-bottom: 1.5rem; } .mb-4 { margin-bottom: 2rem; } .p-1 { padding: 0.5rem; } .p-2 { padding: 1rem; } .p-3 { padding: 1.5rem; } .p-4 { padding: 2rem; } .hidden { display: none !important; } .visible { display: block !important; } ``` --- ### **3. css/animations.css** ```css /* ==================== SCROLL ANIMATIONS ==================== */ [data-aos] { opacity: 0; } [data-aos].aos-animate { opacity: 1; } /* ==================== CUSTOM ANIMATIONS ==================== */ .fade-in { animation: fadeIn 0.6s ease-out forwards; } .slide-in-left { animation: slideLeft 0.6s ease-out forwards; } .slide-in-right { animation: slideRight 0.6s ease-out forwards; } .slide-in-up { animation: slideUp 0.6s ease-out forwards; } .zoom-in { animation: zoomIn 0.6s ease-out forwards; } .bounce { animation: bounce 0.6s ease-out forwards; } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } /* ==================== HOVER ANIMATIONS ==================== */ .hover-lift:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15); } .hover-scale:hover { transform: scale(1.05); } .hover-glow:hover { box-shadow: 0 0 20px rgba(102, 126, 234, 0.5); } /* ==================== LOADING ANIMATION ==================== */ .loading { display: inline-block; width: 20px; height: 20px; border: 3px solid rgba(102, 126, 234, 0.3); border-radius: 50%; border-top-color: var(--primary); animation: spin 1s ease-in-out infinite; } /* ==================== PULSE ANIMATION ==================== */ .pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } /* ==================== GRADIENT ANIMATION ==================== */ .gradient-animate { background: linear-gradient( -45deg, #667eea, #764ba2, #667eea, #764ba2 ); background-size: 400% 400%; animation: gradient 15s ease infinite; } @keyframes gradient { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* ==================== SHIMMER EFFECT ==================== */ .shimmer { background: linear-gradient( 90deg, rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, 0.2) 20%, rgba(255, 255, 255, 0.5) 60%, rgba(255, 255, 255, 0) ); background-size: 200% 100%; animation: shimmer 2s infinite; } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: calc(200% + 100px) 0; } } ``` --- ### **4. css/responsive.css** ```css /* ==================== TABLET (768px and below) ==================== */ @media (max-width: 768px) { /* Typography */ h1 { font-size: 2.5rem; } h2 { font-size: 1.8rem; } h3 { font-size: 1.5rem; } /* Navbar */ .menu-toggle { display: flex; } .nav-menu { position: absolute; top: 100%; left: 0; width: 100%; background: white; flex-direction: column; gap: 0; max-height: 0; overflow: hidden; transition: max-height 0.3s ease; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } .nav-menu.active { max-height: 500px; } .nav-menu li { border-bottom: 1px solid var(--border); } .nav-menu li a { display: block; padding: 1rem; } .nav-cta { flex-direction: column; gap: 0.5rem; } .btn-appointment { display: none; } /* Hero Section */ .hero-wrapper { grid-template-columns: 1fr; gap: 2rem; } .hero-text h1 { font-size: 2.5rem; } .hero-buttons { flex-direction: column; } .hero-buttons button, .hero-buttons a { width: 100%; } .hero-img { max-width: 100%; } /* Stats Grid */ .stats-grid { grid-template-columns: repeat(2, 1fr); } /* About Section */ .about-wrapper { grid-template-columns: 1fr; } /* Services Grid */ .services-grid { grid-template-columns: 1fr; } /* Features Grid */ .features-grid { grid-template-columns: 1fr; } /* Appointment Section */ .appointment-wrapper { grid-template-columns: 1fr; } .appointment-form { order: -1; } /* Gallery Grid */ .gallery-grid { grid-template-columns: repeat(2, 1fr); } /* Contact Section */ .contact-wrapper { grid-template-columns: 1fr; } /* Floating Buttons */ .floating-buttons { bottom: 20px; right: 20px; gap: 10px; } .fab-button { width: 50px; height: 50px; font-size: 1.2rem; } /* Modal */ .modal-content { width: 95%; padding: 1.5rem; } /* Footer */ .footer-content { grid-template-columns: 1fr; } } /* ==================== MOBILE (480px and below) ==================== */ @media (max-width: 480px) { /* Container */ .container { padding: 0 15px; } /* Typography */ h1 { font-size: 2rem; } h2 { font-size: 1.5rem; } h3 { font-size: 1.25rem; } /* Navbar */ .logo-text { display: none; } .logo-img { width: 35px; height: 35px; } .nav-cta { gap: 0.5rem; } .btn-call, .btn-whatsapp { width: 40px; height: 40px; font-size: 1rem; } /* Hero Section */ .hero { padding: 40px 0; } .hero-text h1 { font-size: 1.8rem; } .hero-subtitle { font-size: 1rem; } .hero-buttons { flex-direction: column; gap: 0.75rem; } .btn-lg { padding: 12px 20px; font-size: 0.95rem; } .hero-badge { bottom: 15px; left: 15px; padding: 12px; } .badge-icon { font-size: 1.5rem; } .badge-title { font-size: 0.85rem; } .badge-subtitle { font-size: 0.75rem; } /* Stats Grid */ .stats-grid { grid-template-columns: 1fr; } .stat-card { padding: 1.5rem; } /* Section Headers */ .section-header { margin-bottom: 2rem; } .section-title { font-size: 1.8rem; } .section-subtitle { font-size: 1rem; } /* Service Cards */ .service-card { padding: 1.5rem; } .service-icon { font-size: 2.5rem; } /* Feature Cards */ .feature-card { padding: 1.5rem; } .feature-icon { font-size: 2.5rem; } /* Appointment Section */ .appointment-section { padding: 40px 0; } .appointment-form { gap: 1rem; } .form-group input, .form-group select, .form-group textarea { padding: 10px 12px; font-size: 16px; /* Prevents zoom on iOS */ } /* Gallery Grid */ .gallery-grid { grid-template-columns: 1fr; } .gallery-item img { height: 200px; } /* FAQ */ .faq-container { max-width: 100%; } .faq-question { padding: 1rem; font-size: 0.95rem; } /* Floating Buttons */ .floating-buttons { bottom: 15px; right: 15px; gap: 8px; } .fab-button { width: 45px; height: 45px; font-size: 1rem; } /* Toast */ .toast { bottom: 15px; left: 15px; right: 15px; max-width: none; padding: 1rem; } /* Modal */ .modal-content { width: 95%; padding: 1.25rem; border-radius: 12px; } .modal-close { font-size: 1.5rem; } /* Page Header */ .page-header { padding: 40px 0; } .page-title { font-size: 2rem; } .page-subtitle { font-size: 1rem; } /* Team/Doctor Grid */ .team-grid, .doctors-grid { grid-template-columns: 1fr; } /* Services Full */ .services-full { grid-template-columns: 1fr; } /* Gallery Filters */ .gallery-filters { gap: 0.5rem; } .filter-btn { padding: 8px 16px; font-size: 0.9rem; } /* Footer */ .footer { padding: 40px 0 15px; } .footer-content { gap: 1.5rem; } .footer-section { text-align: center; } .social-links { justify-content: center; } } /* ==================== SMALL MOBILE (360px and below) ==================== */ @media (max-width: 360px) { h1 { font-size: 1.5rem; } h2 { font-size: 1.25rem; } h3 { font-size: 1.1rem; } .hero-text h1 { font-size: 1.5rem; } .btn-primary, .btn-secondary { padding: 10px 20px; font-size: 0.9rem; } .stat-number { font-size: 2rem; } .stat-label { font-size: 0.85rem; } } /* ==================== LANDSCAPE MODE ==================== */ @media (max-height: 600px) and (orientation: landscape) { .hero { padding: 30px 0; } .hero-text h1 { font-size: 1.8rem; margin-bottom: 0.5rem; } .hero-subtitle { font-size: 0.95rem; margin-bottom: 1rem; } .hero-buttons { gap: 0.5rem; } .btn-lg { padding: 10px 20px; font-size: 0.9rem; } } /* ==================== PRINT STYLES ==================== */ @media print { .navbar, .floating-buttons, .footer { display: none; } body { background: white; } .page { box-shadow: none; } } /* ==================== HIGH DPI SCREENS ==================== */ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { .logo-img { image-rendering: crisp-edges; } } ``` --- ### **5. js/app.js** (Main Application Logic) ```javascript // ==================== GLOBAL STATE ==================== const appState = { currentPage: 'home', services: [], doctors: [], testimonials: [], faqs: [], gallery: [], isLoading: false, isMenuOpen: false }; // ==================== INITIALIZATION ==================== document.addEventListener('DOMContentLoaded', () => { initializeApp(); }); async function initializeApp() { try { // Show loader showLoader(); // Load data await loadData(); // Initialize components initializeNavigation(); initializeEventListeners(); initializeAOS(); initializeSwiper(); // Render home page navigateTo('home'); // Hide loader hideLoader(); } catch (error) { console.error('Initialization error:', error); hideLoader(); showToast('Error loading application', 'error'); } } // ==================== DATA LOADING ==================== async function loadData() { try { // Load services appState.services = getServices(); // Load doctors appState.doctors = getDoctors(); // Load testimonials appState.testimonials = getTestimonials(); // Load FAQs appState.faqs = getFAQs(); // Load gallery appState.gallery = getGallery(); } catch (error) { console.error('Error loading data:', error); } } // ==================== DATA SOURCES ==================== function getServices() { return [ { id: 1, name: 'Dental Checkup', icon: '🦷', description: 'Comprehensive oral examination and professional cleaning', features: ['Oral examination', 'Plaque removal', 'Fluoride treatment', 'Consultation'], price: 'Rs. 1,500', image: 'https://images.unsplash.com/photo-1606811841689-23db3c005acc?w=400&h=300&fit=crop' }, { id: 2, name: 'Teeth Whitening', icon: '✨', description: 'Professional teeth whitening for a brighter smile', features: ['Professional bleaching', 'Shade matching', 'Sensitivity care', 'Results last 6-12 months'], price: 'Rs. 5,000', image: 'https://images.unsplash.com/photo-1609840114035-0c100b093dac?w=400&h=300&fit=crop' }, { id: 3, name: 'Braces & Orthodontics', icon: '😁', description: 'Straighten your teeth with modern orthodontic solutions', features: ['Metal braces', 'Ceramic braces', 'Invisible aligners', 'Regular adjustments'], price: 'Rs. 50,000+', image: 'https://images.unsplash.com/photo-1631217314830-4af42480bc90?w=400&h=300&fit=crop' }, { id: 4, name: 'Root Canal Treatment', icon: '⚕️', description: 'Save your tooth with advanced root canal therapy', features: ['Pain relief', 'Infection removal', 'Tooth preservation', 'Follow-up care'], price: 'Rs. 8,000', image: 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=400&h=300&fit=crop' }, { id: 5, name: 'Dental Implants', icon: '🦷', description: 'Permanent solution for missing teeth', features: ['Titanium implants', 'Natural appearance', 'Durable', 'Improves functionality'], price: 'Rs. 30,000+', image: 'https://images.unsplash.com/photo-1579154204601-01d82b27c9d1?w=400&h=300&fit=crop' }, { id: 6, name: 'Smile Designing', icon: '😊', description: 'Create your perfect smile with cosmetic dentistry', features: ['Digital smile design', 'Veneers', 'Bonding', 'Color matching'], price: 'Rs. 15,000+', image: 'https://images.unsplash.com/photo-1588776694971-81342708e5d9?w=400&h=300&fit=crop' } ]; } function getDoctors() { return [ { id: 1, name: 'Dr. Ahmed Hassan', specialty: 'General Dentistry', qualifications: 'BDS, MSc Prosthodontics', experience: '15+ years', bio: 'Experienced dentist specializing in general dentistry and cosmetic procedures', image: 'https://images.unsplash.com/photo-1612349317150-e88e6ff1fcc1?w=400&h=400&fit=crop', social: { facebook: '#', instagram: '#', linkedin: '#' } }, { id: 2, name: 'Dr. Fatima Khan', specialty: 'Orthodontics', qualifications: 'BDS, MDS Orthodontics', experience: '12+ years', bio: 'Specialist in braces and smile correction with modern techniques', image: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop', social: { facebook: '#', instagram: '#', linkedin: '#' } }, { id: 3, name: 'Dr. Muhammad Ali', specialty: 'Endodontics', qualifications: 'BDS, MSc Endodontics', experience: '10+ years', bio: 'Expert in root canal treatment and endodontic procedures', image: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop', social: { facebook: '#', instagram: '#', linkedin: '#' } } ]; } function getTestimonials() { return [ { id: 1, name: 'Sarah Ahmed', text: 'Excellent service! Dr. Hassan made me feel comfortable and my teeth look amazing after the whitening treatment.', rating: 5, avatar: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=100&h=100&fit=crop' }, { id: 2, name: 'Hassan Khan', text: 'Professional team, modern equipment, and affordable prices. Highly recommended!', rating: 5, avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop' }, { id: 3, name: 'Ayesha Malik', text: 'My braces journey was smooth and painless. Dr. Fatima is very knowledgeable and caring.', rating: 5, avatar: 'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop' }, { id: 4, name: 'Ali Raza', text: 'Best dental clinic in Karachi. The staff is friendly and the facilities are top-notch.', rating: 5, avatar: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=100&h=100&fit=crop' } ]; } function getFAQs() { return [ { id: 1, question: 'How often should I visit the dentist?', answer: 'It is recommended to visit the dentist every 6 months for regular checkups and cleanings. However, if you have specific dental issues, more frequent visits may be necessary.' }, { id: 2, question: 'Is teeth whitening safe?', answer: 'Yes, professional teeth whitening is safe when done by qualified dentists. We use approved bleaching agents and take precautions to protect your gums and enamel.' }, { id: 3, question: 'How long does a root canal treatment take?', answer: 'A typical root canal treatment takes 1-2 hours depending on the complexity. Some cases may require multiple appointments.' }, { id: 4, question: 'What is the cost of dental implants?', answer: 'Dental implant costs vary depending on the number of implants and additional procedures needed. Please schedule a consultation for an accurate quote.' }, { id: 5, question: 'Do you offer payment plans?', answer: 'Yes, we offer flexible payment plans to make dental care affordable. Please discuss with our staff for available options.' }, { id: 6, question: 'Is the clinic equipped for emergency treatment?', answer: 'Yes, we are equipped to handle dental emergencies. We offer 24/7 emergency support for urgent cases.' } ]; } function getGallery() { return [ { id: 1, title: 'Before & After - Smile Design', image: 'https://images.unsplash.com/photo-1609840114035-0c100b093dac?w=400&h=300&fit=crop', category: 'before-after' }, { id: 2, title: 'Clinic Reception', image: 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=400&h=300&fit=crop', category: 'clinic' }, { id: 3, title: 'Treatment Room', image: 'https://images.unsplash.com/photo-1631217314830-4af42480bc90?w=400&h=300&fit=crop', category: 'clinic' }, { id: 4, title: 'Teeth Whitening Result', image: 'https://images.unsplash.com/photo-1588776694971-81342708e5d9?w=400&h=300&fit=crop', category: 'before-after' }, { id: 5, title: 'Orthodontic Treatment', image: 'https://images.unsplash.com/photo-1606811841689-23db3c005acc?w=400&h=300&fit=crop', category: 'procedures' }, { id: 6, title: 'Dental Equipment', image: 'https://images.unsplash.com/photo-1576091160399-112ba8d25d1d?w=400&h=300&fit=crop', category: 'clinic' } ]; } // ==================== NAVIGATION ==================== function initializeNavigation() { // Menu toggle const menuToggle = document.getElementById('menuToggle'); const navMenu = document.getElementById('navMenu'); menuToggle.addEventListener('click', () => { navMenu.classList.toggle('active'); appState.isMenuOpen = !appState.isMenuOpen; }); // Close menu on link click navMenu.querySelectorAll('.nav-link').forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); const page = link.getAttribute('data-page'); navigateTo(page); navMenu.classList.remove('active'); appState.isMenuOpen = false; }); }); } function navigateTo(page) { // Hide all pages document.querySelectorAll('.page').forEach(p => { p.style.display = 'none'; }); // Show selected page const selectedPage = document.getElementById(page); if (selectedPage) { selectedPage.style.display = 'block'; } // Update active nav link document.querySelectorAll('.nav-link').forEach(link => { link.classList.remove('active'); if (link.getAttribute('data-page') === page) { link.classList.add('active'); } }); // Update state appState.currentPage = page; // Render page content renderPage(page); // Scroll to top window.scrollTo(0, 0); // Refresh animations setTimeout(() => { AOS.refresh(); }, 100); } function renderPage(page) { switch(page) { case 'home': renderHome(); break; case 'about': renderAbout(); break; case 'services': renderServices(); break; case 'doctors': renderDoctors(); break; case 'gallery': renderGallery(); break; case 'contact': renderContact(); break; } } // ==================== PAGE RENDERING ==================== function renderHome() { // Render services const homeServices = document.getElementById('homeServices'); homeServices.innerHTML = appState.services.slice(0, 3).map(service => `
${service.icon}

${service.name}

${service.description}

Learn More →
`).join(''); // Render testimonials renderTestimonials(); // Render gallery const homeGallery = document.getElementById('homeGallery'); homeGallery.innerHTML = appState.gallery.slice(0, 6).map(item => ` `).join(''); // Render FAQs renderFAQs(); } function renderAbout() { const teamGrid = document.getElementById('teamGrid'); teamGrid.innerHTML = appState.doctors.map(doctor => `
${doctor.name}

${doctor.name}

${doctor.specialty}

${doctor.bio}

`).join(''); } function renderServices() { const servicesFullList = document.getElementById('servicesFullList'); servicesFullList.innerHTML = appState.services.map(service => `
${service.icon}

${service.name}

${service.description}

${service.price}
WhatsApp
`).join(''); } function renderDoctors() { const doctorsGrid = document.getElementById('doctorsGrid'); doctorsGrid.innerHTML = appState.doctors.map(doctor => `
${doctor.name}

${doctor.name}

${doctor.specialty}

${doctor.qualifications}

Experience: ${doctor.experience}

${doctor.bio}

Call
`).join(''); } function renderGallery() { const galleryFull = document.getElementById('galleryFull'); galleryFull.innerHTML = appState.gallery.map(item => ` `).join(''); // Add filter functionality initializeGalleryFilters(); } function renderContact() { // Contact page is already in HTML } function renderTestimonials() { const testimonialsSlider = document.getElementById('testimonialsSlider'); testimonialsSlider.innerHTML = appState.testimonials.map(testimonial => `
${'⭐'.repeat(testimonial.rating)}

"${testimonial.text}"

${testimonial.name}

${testimonial.name}

Verified Patient

`).join(''); // Initialize Swiper for testimonials setTimeout(() => { initializeTestimonialSwiper(); }, 100); } function renderFAQs() { const faqContainer = document.getElementById('faqContainer'); faqContainer.innerHTML = appState.faqs.map((faq, index) => `
${faq.question}
${faq.answer}
`).join(''); } // ==================== EVENT LISTENERS ==================== function initializeEventListeners() { // Appointment buttons document.getElementById('appointmentBtn').addEventListener('click', openAppointmentModal); document.getElementById('heroAppointmentBtn').addEventListener('click', openAppointmentModal); document.getElementById('fabAppointment').addEventListener('click', openAppointmentModal); // Appointment form document.getElementById('appointmentForm').addEventListener('submit', handleAppointmentSubmit); document.getElementById('modalAppointmentForm').addEventListener('submit', handleModalAppointmentSubmit); // Contact form document.getElementById('contactForm').addEventListener('submit', handleContactSubmit); // Modal close document.getElementById('closeModal').addEventListener('click', closeAppointmentModal); document.getElementById('appointmentModal').addEventListener('click', (e) => { if (e.target.id === 'appointmentModal') { closeAppointmentModal(); } }); // Scroll to top document.getElementById('scrollTop').addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); // Scroll event for floating buttons window.addEventListener('scroll', () => { const scrollTop = document.getElementById('scrollTop'); if (window.scrollY > 300) { scrollTop.classList.add('show'); } else { scrollTop.classList.remove('show'); } }); } // ==================== MODAL FUNCTIONS ==================== function openAppointmentModal() { document.getElementById('appointmentModal').classList.add('show'); document.body.style.overflow = 'hidden'; } function closeAppointmentModal() { document.getElementById('appointmentModal').classList.remove('show'); document.body.style.overflow = 'auto'; } // ==================== FORM HANDLERS ==================== function handleAppointmentSubmit(e) { e.preventDefault(); const name = document.getElementById('appointmentName').value; const phone = document.getElementById('appointmentPhone').value; const service = document.getElementById('appointmentService').value; const date = document.getElementById('appointmentDate').value; const time = document.getElementById('appointmentTime').value; if (!name || !phone || !service || !date || !time) { showToast('Please fill all fields', 'error'); return; } // Send to WhatsApp const message = `Hello! I would like to book an appointment:\n\nName: ${name}\nPhone: ${phone}\nService: ${service}\nDate: ${date}\nTime: ${time}`; const whatsappUrl = `https://wa.me/923064140206?text=${encodeURIComponent(message)}`; window.open(whatsappUrl, '_blank'); // Reset form e.target.reset(); showToast('Appointment request sent! We will confirm via WhatsApp', 'success'); } function handleModalAppointmentSubmit(e) { e.preventDefault(); const name = document.getElementById('modalName').value; const phone = document.getElementById('modalPhone').value; const service = document.getElementById('modalService').value; const date = document.getElementById('modalDate').value; const time = document.getElementById('modalTime').value; if (!name || !phone || !service || !date || !time) { showToast('Please fill all required fields', 'error'); return; } // Send to WhatsApp const message = `Hello! I would like to book an appointment:\n\nName: ${name}\nPhone: ${phone}\nService: ${service}\nDate: ${date}\nTime: ${time}`; const whatsappUrl = `https://wa.me/923064140206?text=${encodeURIComponent(message)}`; window.open(whatsappUrl, '_blank'); // Reset form and close modal e.target.reset(); closeAppointmentModal(); showToast('Appointment request sent! We will confirm via WhatsApp', 'success'); } function handleContactSubmit(e) { e.preventDefault(); const name = document.getElementById('contactName').value; const email = document.getElementById('contactEmail').value; const phone = document.getElementById('contactPhone').value; const subject = document.getElementById('contactSubject').value; const message = document.getElementById('contactMessage').value; if (!name || !email || !phone || !subject || !message) { showToast('Please fill all fields', 'error'); return; } // Send to WhatsApp const whatsappMessage = `Contact Form Submission:\n\nName: ${name}\nEmail: ${email}\nPhone: ${phone}\nSubject: ${subject}\n\nMessage:\n${message}`; const whatsappUrl = `https://wa.me/923064140206?text=${encodeURIComponent(whatsappMessage)}`; window.open(whatsappUrl, '_blank'); // Reset form e.target.reset(); showToast('Message sent! We will get back to you soon', 'success'); } // ==================== UTILITY FUNCTIONS ==================== function toggleFAQ(element) { const faqItem = element.parentElement; faqItem.classList.toggle('active'); } function initializeGalleryFilters() { const filterBtns = document.querySelectorAll('.filter-btn'); const galleryItems = document.querySelectorAll('.gallery-item'); filterBtns.forEach(btn => { btn.addEventListener('click', () => { // Update active button filterBtns.forEach(b => b.classList.remove('active')); btn.classList.add('active'); // Filter gallery const filter = btn.getAttribute('data-filter'); galleryItems.forEach(item => { if (filter === 'all' || item.getAttribute('data-category') === filter) { item.style.display = 'block'; } else { item.style.display = 'none'; } }); }); }); } function showLoader() { document.getElementById('loader').classList.remove('hidden'); } function hideLoader() { document.getElementById('loader').classList.add('hidden'); } function showToast(message, type = 'success') { const toast = document.getElementById('toast'); toast.textContent = message; toast.className = `toast show ${type}`; setTimeout(() => { toast.classList.remove('show'); }, 3000); } // ==================== AOS INITIALIZATION ==================== function initializeAOS() { AOS.init({ duration: 800, easing: 'ease-in-out', once: true, offset: 100 }); } // ==================== SWIPER INITIALIZATION ==================== function initializeSwiper() { // Initialize on demand } function initializeTestimonialSwiper() { new Swiper('#testimonialsSlider', { slidesPerView: 1, spaceBetween: 20, autoplay: { delay: 5000, disableOnInteraction: false }, pagination: { el: '.swiper-pagination', clickable: true }, navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' }, breakpoints: { 768: { slidesPerView: 2 }, 1024: { slidesPerView: 3 } } }); } ``` --- ### **6. js/router.js** (Routing Logic) ```javascript // ==================== ROUTER ==================== class Router { constructor() { this.routes = new Map(); this.currentRoute = null; } register(path, callback) { this.routes.set(path, callback); } navigate(path) { if (this.routes.has(path)) { this.currentRoute = path; this.routes.get(path)(); } else { console.warn(`Route not found: ${path}`); } } getCurrentRoute() { return this.currentRoute; } } // Initialize router const router = new Router(); // Register routes router.register('home', () => { navigateTo('home'); }); router.register('about', () => { navigateTo('about'); }); router.register('services', () => { navigateTo('services'); }); router.register('doctors', () => { navigateTo('doctors'); }); router.register('gallery', () => { navigateTo('gallery'); }); router.register('contact', () => { navigateTo('contact'); }); // Handle browser back/forward buttons window.addEventListener('popstate', (event) => { if (event.state && event.state.page) { navigateTo(event.state.page); } }); // Update browser history on navigation function updateHistory(page) { window.history.pushState({ page: page }, '', `#${page}`); } ``` --- ### **7. js/components.js** (Reusable Components) ```javascript // ==================== COMPONENT LIBRARY ==================== // Button Component class Button { constructor(text, onClick, type = 'primary', icon = null) { this.text = text; this.onClick = onClick; this.type = type; this.icon = icon; } render() { return ` `; } } // Card Component class Card { constructor(title, description, image = null, icon = null) { this.title = title; this.description = description; this.image = image; this.icon = icon; } render() { return `
${this.image ? `${this.title}` : ''} ${this.icon ? `
${this.icon}
` : ''}

${this.title}

${this.description}

`; } } // Badge Component class Badge { constructor(text, type = 'primary') { this.text = text; this.type = type; } render() { return `${this.text}`; } } // Alert Component class Alert { constructor(message, type = 'info') { this.message = message; this.type = type; } render() { return `
${this.message}
`; } getIcon() { const icons = { 'success': 'check-circle', 'error': 'exclamation-circle', 'warning': 'exclamation-triangle', 'info': 'info-circle' }; return icons[this.type] || 'info-circle'; } } // Form Component class Form { constructor(fields, onSubmit) { this.fields = fields; this.onSubmit = onSubmit; } render() { let html = '
'; this.fields.forEach(field => { html += `
${this.renderField(field)}
`; }); html += `
`; return html; } renderField(field) { switch(field.type) { case 'text': case 'email': case 'tel': case 'date': return ``; case 'textarea': return ``; case 'select': return ` `; default: return ''; } } } // Modal Component class Modal { constructor(title, content, buttons = []) { this.title = title; this.content = content; this.buttons = buttons; } render() { return ` `; } show() { document.body.insertAdjacentHTML('beforeend', this.render()); } } // Carousel Component class Carousel { constructor(items, autoplay = true, interval = 5000) { this.items = items; this.autoplay = autoplay; this.interval = interval; this.currentIndex = 0; } render() { return ` `; } next() { this.currentIndex = (this.currentIndex + 1) % this.items.length; this.update(); } prev() { this.currentIndex = (this.currentIndex - 1 + this.items.length) % this.items.length; this.update(); } update() { const items = document.querySelectorAll('.carousel-item'); items.forEach((item, index) => { item.classList.toggle('active', index === this.currentIndex); }); } } // Pagination Component class Pagination { constructor(totalPages, currentPage = 1, onPageChange) { this.totalPages = totalPages; this.currentPage = currentPage; this.onPageChange = onPageChange; } render() { let html = ''; return html; } goToPage(page) { if (page >= 1 && page <= this.totalPages) { this.currentPage = page; this.onPageChange(page); } } } // Rating Component class Rating { constructor(value = 0, maxValue = 5, onChange = null) { this.value = value; this.maxValue = maxValue; this.onChange = onChange; } render() { let html = '
'; for (let i = 1; i <= this.maxValue; i++) { html += ` `; } html += '
'; return html; } setValue(value) { this.value = value; if (this.onChange) { this.onChange(value); } } } // Progress Bar Component class ProgressBar { constructor(value = 0, maxValue = 100, label = '') { this.value = value; this.maxValue = maxValue; this.label = label; } render() { const percentage = (this.value / this.maxValue) * 100; return `
${this.label ? `` : ''}
${percentage.toFixed(0)}%
`; } } // Timeline Component class Timeline { constructor(events) { this.events = events; } render() { return `
${this.events.map((event, index) => `

${event.title}

${event.description}

${event.date}
`).join('')}
`; } } // Accordion Component class Accordion { constructor(items) { this.items = items; } render() { return `
${this.items.map((item, index) => `
${item.content}
`).join('')}
`; } toggle(index) { const items = document.querySelectorAll('.accordion-item'); items[index].classList.toggle('active'); } } // Tabs Component class Tabs { constructor(tabs) { this.tabs = tabs; this.activeTab = 0; } render() { return `
${this.tabs.map((tab, index) => ` `).join('')}
${this.tabs.map((tab, index) => `
${tab.content}
`).join('')}
`; } switchTab(index) { this.activeTab = index; // Re-render or update UI } } // Tooltip Component class Tooltip { constructor(text, position = 'top') { this.text = text; this.position = position; } render() { return `
`; } } // Spinner Component class Spinner { constructor(size = 'md', color = 'primary') { this.size = size; this.color = color; } render() { return `
`; } } // Breadcrumb Component class Breadcrumb { constructor(items) { this.items = items; } render() { return ` `; } } ``` --- ### **8. js/utils.js** (Utility Functions) ```javascript // ==================== UTILITY FUNCTIONS ==================== // ==================== STRING UTILITIES ==================== const StringUtils = { // Capitalize first letter capitalize(str) { return str.charAt(0).toUpperCase() + str.slice(1); }, // Truncate string truncate(str, length = 100) { return str.length > length ? str.substring(0, length) + '...' : str; }, // Slug generation slug(str) { return str .toLowerCase() .trim() .replace(/[^\w\s-]/g, '') .replace(/[\s_]+/g, '-') .replace(/^-+|-+$/g, ''); }, // Email validation isValidEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }, // Phone validation isValidPhone(phone) { const phoneRegex = /^[\d\s\-\+\(\)]{10,}$/; return phoneRegex.test(phone); } }; // ==================== ARRAY UTILITIES ==================== const ArrayUtils = { // Remove duplicates unique(arr) { return [...new Set(arr)]; }, // Flatten array flatten(arr) { return arr.reduce((flat, item) => { return flat.concat(Array.isArray(item) ? ArrayUtils.flatten(item) : item); }, []); }, // Group by property groupBy(arr, key) { return arr.reduce((groups, item) => { const group = item[key]; groups[group] = groups[group] || []; groups[group].push(item); return groups; }, {}); }, // Sort by property sortBy(arr, key, order = 'asc') { return arr.sort((a, b) => { if (order === 'asc') { return a[key] > b[key] ? 1 : -1; } else { return a[key] < b[key] ? 1 : -1; } }); }, // Filter by property filterBy(arr, key, value) { return arr.filter(item => item[key] === value); }, // Chunk array chunk(arr, size) { const chunks = []; for (let i = 0; i < arr.length; i += size) { chunks.push(arr.slice(i, i + size)); } return chunks; } }; // ==================== OBJECT UTILITIES ==================== const ObjectUtils = { // Deep clone deepClone(obj) { return JSON.parse(JSON.stringify(obj)); }, // Merge objects merge(obj1, obj2) { return { ...obj1, ...obj2 }; }, // Get nested value getNestedValue(obj, path) { return path.split('.').reduce((current, prop) => current?.[prop], obj); }, // Set nested value setNestedValue(obj, path, value) { const keys = path.split('.'); let current = obj; for (let i = 0; i < keys.length - 1; i++) { current[keys[i]] = current[keys[i]] || {}; current = current[keys[i]]; } current[keys[keys.length - 1]] = value; } }; // ==================== DATE UTILITIES ==================== const DateUtils = { // Format date format(date, format = 'YYYY-MM-DD') { const d = new Date(date); const year = d.getFullYear(); const month = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); const hours = String(d.getHours()).padStart(2, '0'); const minutes = String(d.getMinutes()).padStart(2, '0'); const seconds = String(d.getSeconds()).padStart(2, '0'); return format .replace('YYYY', year) .replace('MM', month) .replace('DD', day) .replace('HH', hours) .replace('mm', minutes) .replace('ss', seconds); }, // Add days addDays(date, days) { const d = new Date(date); d.setDate(d.getDate() + days); return d; }, // Get difference in days daysBetween(date1, date2) { const d1 = new Date(date1); const d2 = new Date(date2); const diffTime = Math.abs(d2 - d1); return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); }, // Is past date isPastDate(date) { return new Date(date) < new Date(); }, // Is future date isFutureDate(date) { return new Date(date) > new Date(); } }; // ==================== STORAGE UTILITIES ==================== const StorageUtils = { // Set item set(key, value) { try { localStorage.setItem(key, JSON.stringify(value)); return true; } catch (error) { console.error('Storage error:', error); return false; } }, // Get item get(key) { try { const item = localStorage.getItem(key); return item ? JSON.parse(item) : null; } catch (error) { console.error('Storage error:', error); return null; } }, // Remove item remove(key) { try { localStorage.removeItem(key); return true; } catch (error) { console.error('Storage error:', error); return false; } }, // Clear all clear() { try { localStorage.clear(); return true; } catch (error) { console.error('Storage error:', error); return false; } } }; // ==================== API UTILITIES ==================== const APIUtils = { // GET request async get(url, options = {}) { try { const response = await fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json', ...options.headers } }); return await response.json(); } catch (error) { console.error('API error:', error); throw error; } }, // POST request async post(url, data, options = {}) { try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', ...options.headers }, body: JSON.stringify(data) }); return await response.json(); } catch (error) { console.error('API error:', error); throw error; } }, // PUT request async put(url, data, options = {}) { try { const response = await fetch(url, { method: 'PUT', headers: { 'Content-Type': 'application/json', ...options.headers }, body: JSON.stringify(data) }); return await response.json(); } catch (error) { console.error('API error:', error); throw error; } }, // DELETE request async delete(url, options = {}) { try { const response = await fetch(url, { method: 'DELETE', headers: { 'Content-Type': 'application/json', ...options.headers } }); return await response.json(); } catch (error) { console.error('API error:', error); throw error; } } }; // ==================== DOM UTILITIES ==================== const DOMUtils = { // Query selector query(selector) { return document.querySelector(selector); }, // Query all queryAll(selector) { return document.querySelectorAll(selector); }, // Create element createElement(tag, attributes = {}, content = '') { const element = document.createElement(tag); Object.keys(attributes).forEach(key => { element.setAttribute(key, attributes[key]); }); if (content) { element.innerHTML = content; } return element; }, // Add class addClass(element, className) { element.classList.add(className); }, // Remove class removeClass(element, className) { element.classList.remove(className); }, // Toggle class toggleClass(element, className) { element.classList.toggle(className); }, // Has class hasClass(element, className) { return element.classList.contains(className); }, // Set attribute setAttribute(element, key, value) { element.setAttribute(key, value); }, // Get attribute getAttribute(element, key) { return element.getAttribute(key); }, // Set style setStyle(element, styles) { Object.keys(styles).forEach(key => { element.style[key] = styles[key]; }); }, // Get computed style getComputedStyle(element, property) { return window.getComputedStyle(element).getPropertyValue(property); } }; // ==================== VALIDATION UTILITIES ==================== const ValidationUtils = { // Validate email validateEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }, // Validate phone validatePhone(phone) { const phoneRegex = /^[\d\s\-\+\(\)]{10,}$/; return phoneRegex.test(phone); }, // Validate URL validateURL(url) { try { new URL(url); return true; } catch (error) { return false; } }, // Validate password strength validatePasswordStrength(password) { const hasUpperCase = /[A-Z]/.test(password); const hasLowerCase = /[a-z]/.test(password); const hasNumbers = /\d/.test(password); const hasSpecialChar = /[!@#$%^&*]/.test(password); const isLengthValid = password.length >= 8; return hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar && isLengthValid; }, // Validate credit card validateCreditCard(cardNumber) { const regex = /^[0-9]{13,19}$/; return regex.test(cardNumber.replace(/\s/g, '')); } }; // ==================== MATH UTILITIES ==================== const MathUtils = { // Random number random(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }, // Round to decimal places round(num, decimals = 2) { return Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals); }, // Calculate percentage percentage(value, total) { return (value / total) * 100; }, // Calculate average average(arr) { return arr.reduce((sum, val) => sum + val, 0) / arr.length; }, // Find max max(arr) { return Math.max(...arr); }, // Find min min(arr) { return Math.min(...arr); } }; // ==================== ANIMATION UTILITIES ==================== const AnimationUtils = { // Fade in fadeIn(element, duration = 300) { element.style.opacity = '0'; element.style.transition = `opacity ${duration}ms`; setTimeout(() => { element.style.opacity = '1'; }, 10); }, // Fade out fadeOut(element, duration = 300) { element.style.transition = `opacity ${duration}ms`; element.style.opacity = '0'; }, // Slide in slideIn(element, direction = 'left', duration = 300) { const startPos = direction === 'left' ? '-100%' : '100%'; element.style.transform = `translateX(${startPos})`; element.style.transition = `transform ${duration}ms`; setTimeout(() => { element.style.transform = 'translateX(0)'; }, 10); }, // Slide out slideOut(element, direction = 'left', duration = 300) { const endPos = direction === 'left' ? '-100%' : '100%'; element.style.transition = `transform ${duration}ms`; element.style.transform = `translateX(${endPos})`; }, // Scale scale(element, scale = 1.1, duration = 300) { element.style.transition = `transform ${duration}ms`; element.style.transform = `scale(${scale})`; } }; // ==================== NOTIFICATION UTILITIES ==================== const NotificationUtils = { // Show notification show(message, type = 'info', duration = 3000) { const notification = document.createElement('div'); notification.className = `notification notification-${type}`; notification.textContent = message; document.body.appendChild(notification); setTimeout(() => { notification.remove(); }, duration); }, // Show success success(message, duration = 3000) { this.show(message, 'success', duration); }, // Show error error(message, duration = 3000) { this.show(message, 'error', duration); }, // Show warning warning(message, duration = 3000) { this.show(message, 'warning', duration); } }; // ==================== DEBOUNCE & THROTTLE ==================== function debounce(func, delay = 300) { let timeoutId; return function(...args) { clearTimeout(timeoutId); timeoutId = setTimeout(() => func(...args), delay); }; } function throttle(func, delay = 300) { let lastCall = 0; return function(...args) { const now = Date.now(); if (now - lastCall >= delay) { func(...args); lastCall = now; } }; } // ==================== PROMISE UTILITIES ==================== async function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function retry(func, retries = 3, delay = 1000) { for (let i = 0; i < retries; i++) { try { return await func(); } catch (error) { if (i === retries - 1) throw error; await new Promise(resolve => setTimeout(resolve, delay)); } } } // ==================== EXPORT UTILITIES ==================== window.StringUtils = StringUtils; window.ArrayUtils = ArrayUtils; window.ObjectUtils = ObjectUtils; window.DateUtils = DateUtils; window.StorageUtils = StorageUtils; window.APIUtils = APIUtils; window.DOMUtils = DOMUtils; window.ValidationUtils = ValidationUtils; window.MathUtils = MathUtils; window.AnimationUtils = AnimationUtils; window.NotificationUtils = NotificationUtils; window.debounce = debounce; window.throttle = throttle; window.delay = delay; window.retry = retry; ``` --- ### **9. data/services.json** (Service Data) ```json { "services": [ { "id": 1, "name": "Dental Checkup", "icon": "🦷", "description": "Comprehensive oral examination and professional cleaning", "fullDescription": "Our comprehensive dental checkup includes a thorough examination of your teeth, gums, and mouth. We use advanced diagnostic tools to detect any issues early and provide professional cleaning to maintain your oral health.", "features": [ "Oral examination", "Plaque removal", "Fluoride treatment", "Consultation", "X-ray imaging", "Personalized care plan" ], "price": "Rs. 1,500", "duration": "30-45 minutes", "image": "https://images.unsplash.com/photo-1606811841689-23db3c005acc?w=400&h=300&fit=crop" }, { "id": 2, "name": "Teeth Whitening", "icon": "✨", "description": "Professional teeth whitening for a brighter smile", "fullDescription": "Achieve a brighter, whiter smile with our professional teeth whitening treatment. Using safe and effective bleaching agents, we can lighten your teeth by several shades in just one session.", "features": [ "Professional bleaching", "Shade matching", "Sensitivity care", "Results last 6-12 months", "Safe for enamel", "Instant results" ], "price": "Rs. 5,000", "duration": "60 minutes", "image": "https://images.unsplash.com/photo-1609840114035-0c100b093dac?w=400&h=300&fit=crop" }, { "id": 3, "name": "Braces & Orthodontics", "icon": "😁", "description": "Straighten your teeth with modern orthodontic solutions", "fullDescription": "Transform your smile with our advanced orthodontic treatments. We offer multiple options including traditional metal braces, ceramic braces, and invisible aligners to suit your preferences.", "features": [ "Metal braces", "Ceramic braces", "Invisible aligners", "Regular adjustments", "Customized treatment plan", "Comfortable brackets" ], "price": "Rs. 50,000+", "duration": "18-24 months", "image": "https://images.unsplash.com/photo-1631217314830-4af42480bc90?w=400&h=300&fit=crop" }, { "id": 4, "name": "Root Canal Treatment", "icon": "⚕️", "description": "Save your tooth with advanced root canal therapy", "fullDescription": "Root canal treatment is a procedure to remove infected or damaged pulp from inside your tooth. Our experienced endodontists use advanced techniques to save your natural tooth.", "features": [ "Pain relief", "Infection removal", "Tooth preservation", "Follow-up care", "Advanced equipment", "Painless procedure" ], "price": "Rs. 8,000", "duration": "60-90 minutes", "image": "https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=400&h=300&fit=crop" }, { "id": 5, "name": "Dental Implants", "icon": "🦷", "description": "Permanent solution for missing teeth", "fullDescription": "Dental implants are a permanent solution for missing teeth. They look and function like natural teeth, providing excellent durability and comfort.", "features": [ "Titanium implants", "Natural appearance", "Durable", "Improves functionality", "Bone preservation", "Long-lasting solution" ], "price": "Rs. 30,000+", "duration": "Multiple appointments", "image": "https://images.unsplash.com/photo-1579154204601-01d82b27c9d1?w=400&h=300&fit=crop" }, { "id": 6, "name": "Smile Designing", "icon": "😊", "description": "Create your perfect smile with cosmetic dentistry", "fullDescription": "Our smile design service uses digital technology to create your ideal smile. We combine veneers, bonding, and other cosmetic procedures to achieve your dream smile.", "features": [ "Digital smile design", "Veneers", "Bonding", "Color matching", "Shape correction", "Personalized design" ], "price": "Rs. 15,000+", "duration": "Varies", "image": "https://images.unsplash.com/photo-1588776694971-81342708e5d9?w=400&h=300&fit=crop" } ] } ``` --- ### **10. data/doctors.json** (Doctor Data) ```json { "doctors": [ { "id": 1, "name": "Dr. Ahmed Hassan", "specialty": "General Dentistry", "qualifications": "BDS, MSc Prosthodontics", "experience": "15+ years", "bio": "Experienced dentist specializing in general dentistry and cosmetic procedures with a passion for patient care", "image": "https://images.unsplash.com/photo-1612349317150-e88e6ff1fcc1?w=400&h=400&fit=crop", "email": "ahmed@denticare.pk", "phone": "0300-1234567", "social": { "facebook": "https://facebook.com", "instagram": "https://instagram.com", "linkedin": "https://linkedin.com" }, "availability": "Mon-Fri: 9AM-5PM, Sat: 10AM-2PM" }, { "id": 2, "name": "Dr. Fatima Khan", "specialty": "Orthodontics", "qualifications": "BDS, MDS Orthodontics", "experience": "12+ years", "bio": "Specialist in braces and smile correction with modern techniques and patient-friendly approach", "image": "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=400&h=400&fit=crop", "email": "fatima@denticare.pk", "phone": "0300-1234568", "social": { "facebook": "https://facebook.com", "instagram": "https://instagram.com", "linkedin": "https://linkedin.com" }, "availability": "Mon-Thu: 10AM-6PM, Fri: 2PM-8PM" }, { "id": 3, "name": "Dr. Muhammad Ali", "specialty": "Endodontics", "qualifications": "BDS, MSc Endodontics", "experience": "10+ years", "bio": "Expert in root canal treatment and endodontic procedures with advanced techniques", "image": "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=400&h=400&fit=crop", "email": "ali@denticare.pk", "phone": "0300-1234569", "social": { "facebook": "https://facebook.com", "instagram": "https://instagram.com", "linkedin": "https://linkedin.com" }, "availability": "Tue-Sat: 9AM-5PM" } ] } ``` --- ### **11. data/testimonials.json** (Testimonials Data) ```json { "testimonials": [ { "id": 1, "name": "Sarah Ahmed", "text": "Excellent service! Dr. Hassan made me feel comfortable and my teeth look amazing after the whitening treatment. Highly recommended!", "rating": 5, "avatar": "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=100&h=100&fit=crop", "date": "2024-01-15" }, { "id": 2, "name": "Hassan Khan", "text": "Professional team, modern equipment, and affordable prices. Highly recommended! Best dental clinic in Karachi.", "rating": 5, "avatar": "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop", "date": "2024-01-20" }, { "id": 3, "name": "Ayesha Malik", "text": "My braces journey was smooth and painless. Dr. Fatima is very knowledgeable and caring. The staff is friendly and supportive.", "rating": 5, "avatar": "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?w=100&h=100&fit=crop", "date": "2024-02-01" }, { "id": 4, "name": "Ali Raza", "text": "Best dental clinic in Karachi. The staff is friendly and the facilities are top-notch. I trust them with my family's dental care.", "rating": 5, "avatar": "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=100&h=100&fit=crop", "date": "2024-02-10" } ] } ``` --- ### **12. data/faqs.json** (FAQ Data) ```json { "faqs": [ { "id": 1, "question": "How often should I visit the dentist?", "answer": "It is recommended to visit the dentist every 6 months for regular checkups and cleanings. However, if you have specific dental issues or gum disease, more frequent visits may be necessary. Our dentists will advise you based on your individual needs." }, { "id": 2, "question": "Is teeth whitening safe?", "answer": "Yes, professional teeth whitening is safe when done by qualified dentists. We use approved bleaching agents and take precautions to protect your gums and enamel. Some sensitivity may occur temporarily, but we provide care instructions to minimize discomfort." }, { "id": 3, "question": "How long does a root canal treatment take?", "answer": "A typical root canal treatment takes 1-2 hours depending on the complexity of the case. Some cases may require multiple appointments spread over several weeks. Our endodontists will discuss the timeline with you during your consultation." }, { "id": 4, "question": "What is the cost of dental implants?", "answer": "Dental implant costs vary depending on the number of implants and additional procedures needed such as bone grafting. Please schedule a consultation for an accurate quote. We offer flexible payment plans to make implants affordable." }, { "id": 5, "question": "Do you offer payment plans?", "answer": "Yes, we offer flexible payment plans to make dental care affordable. We accept cash, credit cards, and can arrange installment plans for major procedures. Please discuss with our staff for available options." }, { "id": 6, "question": "Is the clinic equipped for emergency treatment?", "answer": "Yes, we are equipped to handle dental emergencies. We offer 24/7 emergency support for urgent cases such as severe pain, broken teeth, or infections. Call us immediately if you have a dental emergency." }, { "id": 7, "question": "What should I do if I have dental anxiety?", "answer": "We understand dental anxiety is common. Our team is trained to work with anxious patients. We offer sedation options, take time to explain procedures, and create a comfortable environment. Please inform us about your anxiety during booking." }, { "id": 8, "question": "Are your dentists qualified and experienced?", "answer": "Yes, all our dentists are highly qualified with international certifications and years of experience. They regularly attend professional development courses to stay updated with the latest techniques and technologies." } ] } ``` --- ### **13. .htaccess** (For Apache Servers) ```apache # Enable GZIP Compression AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json # Set Expires Headers ExpiresActive On ExpiresByType text/html "access plus 1 hour" ExpiresByType text/css "access plus 1 month" ExpiresByType text/javascript "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/webp "access plus 1 year" ExpiresByType application/font-woff "access plus 1 year" ExpiresByType font/ttf "access plus 1 year" # Enable Browser Caching Header set Cache-Control "max-age=2592000, public" Header set Cache-Control "max-age=31536000, public" # Redirect HTTP to HTTPS RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Remove .html extension RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.html [NC,L] # Deny access to sensitive files Order allow,deny Deny from all ``` --- ### **14. robots.txt** (SEO) ``` User-agent: * Allow: / Disallow: /admin/ Disallow: /private/ Disallow: /temp/ Sitemap: https://denticare.myquetta.pk/sitemap.xml # Crawl delay Crawl-delay: 1 ``` --- ### **15. sitemap.xml** (SEO) ```xml https://denticare.myquetta.pk/ 2026-05-03 weekly 1.0 https://denticare.myquetta.pk/#about 2026-05-03 monthly 0.8 https://denticare.myquetta.pk/#services 2026-05-03 monthly 0.8 https://denticare.myquetta.pk/#doctors 2026-05-03 monthly 0.7 https://denticare.myquetta.pk/#gallery 2026-05-03 monthly 0.7 https://denticare.myquetta.pk/#contact 2026-05-03 monthly 0.7 ``` --- ### **16. manifest.json** (PWA Support) ```json { "name": "Denticare - Premium Dental Clinic", "short_name": "Denticare", "description": "Your trusted partner in dental health and smile transformation", "start_url": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#667eea", "orientation": "portrait-primary", "icons": [ { "src": "https://iili.io/fUxX68B.jpg", "sizes": "192x192", "type": "image/jpeg", "purpose": "any" }, { "src": "https://iili.io/fUxX68B.jpg", "sizes": "512x512", "type": "image/jpeg", "purpose": "any" } ], "categories": ["medical", "health"], "screenshots": [ { "src": "https://images.unsplash.com/photo-1606811841689-23db3c005acc?w=540&h=720&fit=crop", "sizes": "540x720", "type": "image/jpeg" } ] } ```