1 estrella en GitHub = 1 componente nuevo.

Dar una estrella
Contacto & Soporte

Contact Glass Form

Sección de contacto completa con formulario en tarjeta de cristal, campos interactivos y soporte directo.

contactformsupportchannelsinquiry
Vista Previa en Vivo
Get In Touch

Let's Build Something Exceptional Together

Have a question, custom component inquiry, or need enterprise support? Our team is here to assist.

Average response time: under 2 hours

Send us a message

Fill in the details below and we will get back to you promptly.

Uso

Copia y pega este código directamente en tu componente React:

tsx
import { ContactGlassForm } from 'react-component-kit-ui/sections';

<ContactGlassForm />

Instalación Manual

Si no estás usando el paquete npm, crea un archivo nuevo y pega el siguiente código: src/components/sections/ContactGlassForm.tsx + ContactGlassForm.css:

ContactGlassForm.tsx
'use client';

import './ContactGlassForm.css';
// TODO(port): inline handler onSubmit="event.preventDefault(); alert('Message s"

/**
 * ContactGlassForm — Full-page interactive contact and support section with glassmorphism form and live channel indicators.
 * 
 * @param {string} badge - Eyebrow badge text.
 * @param {string} title - Section main heading.
 * @param {string} subtitle - Description text.
 */
export interface ContactGlassFormProps {
  badge?: string;
  title?: string;
  subtitle?: string;
  className?: string;
}

export function ContactGlassForm({
  badge = "Get In Touch",
  title = "Let's Build Something Exceptional Together",
  subtitle = "Have a question, custom component inquiry, or need enterprise support? Our team is here to assist.",
  className = ""
}: ContactGlassFormProps) {
  return (
    <>
      <div className="cq-contact-glass-form-cq" data-rk-6b0fee="">
      <section className={`contact-section ${className}`} aria-labelledby="contact-title" data-rk-6b0fee="">
        <div className="contact-bg" aria-hidden="true" data-rk-6b0fee="">
          <div className="contact-glow" data-rk-6b0fee=""></div>
        </div>
      
        <div className="container" data-rk-6b0fee="">
          <div className="contact-grid" data-rk-6b0fee="">
            {/* Left Column: Info & Channels */}
            <div className="contact-info" data-rk-6b0fee="">
              {badge && <span className="contact-badge" data-rk-6b0fee="">{badge}</span>}
              <h2 id="contact-title" className="contact-title" data-rk-6b0fee="">{title}</h2>
              <p className="contact-subtitle" data-rk-6b0fee="">{subtitle}</p>
      
              {/* Response SLA Badge */}
              <div className="sla-badge" data-rk-6b0fee="">
                <span className="sla-dot" data-rk-6b0fee=""></span>
                <span data-rk-6b0fee="">Average response time: <strong data-rk-6b0fee="">under 2 hours</strong></span>
              </div>
      
              {/* Channels List */}
              <div className="channels-list" data-rk-6b0fee="">
                <div className="channel-card" data-rk-6b0fee="">
                  <div className="channel-icon" data-rk-6b0fee="">
                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" data-rk-6b0fee=""><rect width="20" height="16" x="2" y="4" rx="2" data-rk-6b0fee="" /><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" data-rk-6b0fee="" /></svg>
                  </div>
                  <div className="channel-details" data-rk-6b0fee="">
                    <span className="channel-label" data-rk-6b0fee="">Direct Email</span>
                    <a href="mailto:support@astrocomponents.dev" className="channel-link" data-rk-6b0fee="">support@astrocomponents.dev</a>
                  </div>
                </div>
      
                <div className="channel-card" data-rk-6b0fee="">
                  <div className="channel-icon" data-rk-6b0fee="">
                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" data-rk-6b0fee=""><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4" data-rk-6b0fee="" /><path d="M9 18c-4.51 2-5-2-7-2" data-rk-6b0fee="" /></svg>
                  </div>
                  <div className="channel-details" data-rk-6b0fee="">
                    <span className="channel-label" data-rk-6b0fee="">Open Source GitHub</span>
                    <a href="https://github.com" target="_blank" rel="noopener" className="channel-link" data-rk-6b0fee="">github.com/astro-components</a>
                  </div>
                </div>
      
                <div className="channel-card" data-rk-6b0fee="">
                  <div className="channel-icon" data-rk-6b0fee="">
                    <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" data-rk-6b0fee=""><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" data-rk-6b0fee="" /></svg>
                  </div>
                  <div className="channel-details" data-rk-6b0fee="">
                    <span className="channel-label" data-rk-6b0fee="">Community Discord</span>
                    <a href="https://discord.com" target="_blank" rel="noopener" className="channel-link" data-rk-6b0fee="">discord.gg/astro-components</a>
                  </div>
                </div>
              </div>
            </div>
      
            {/* Right Column: Interactive Glass Form */}
            <div className="contact-form-wrap" data-rk-6b0fee="">
              <form className="contact-form" data-rk-6b0fee="">
                <h3 className="form-title" data-rk-6b0fee="">Send us a message</h3>
                <p className="form-desc" data-rk-6b0fee="">Fill in the details below and we will get back to you promptly.</p>
      
                <div className="form-row" data-rk-6b0fee="">
                  <div className="form-group" data-rk-6b0fee="">
                    <label htmlFor="c-name" data-rk-6b0fee="">Full Name</label>
                    <input type="text" id="c-name" required placeholder="Alex Morgan" className="form-input" data-rk-6b0fee="" />
                  </div>
                  <div className="form-group" data-rk-6b0fee="">
                    <label htmlFor="c-email" data-rk-6b0fee="">Work Email</label>
                    <input type="email" id="c-email" required placeholder="alex@company.com" className="form-input" data-rk-6b0fee="" />
                  </div>
                </div>
      
                <div className="form-group" data-rk-6b0fee="">
                  <label htmlFor="c-subject" data-rk-6b0fee="">Subject / Inquiry Type</label>
                  <select id="c-subject" className="form-select" data-rk-6b0fee="">
                    <option value="general" data-rk-6b0fee="">General Question</option>
                    <option value="enterprise" data-rk-6b0fee="">Enterprise Custom Components</option>
                    <option value="bug" data-rk-6b0fee="">Bug Report / Issue</option>
                    <option value="partnership" data-rk-6b0fee="">Partnership & Sponsorship</option>
                  </select>
                </div>
      
                <div className="form-group" data-rk-6b0fee="">
                  <label htmlFor="c-message" data-rk-6b0fee="">Your Message</label>
                  <textarea id="c-message" required rows={4} placeholder="Tell us how we can help..." className="form-textarea" data-rk-6b0fee=""></textarea>
                </div>
      
                <button type="submit" className="submit-btn" data-rk-6b0fee="">
                  <span data-rk-6b0fee="">Send Message</span>
                  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" data-rk-6b0fee=""><path d="m22 2-7 20-4-9-9-4Z" data-rk-6b0fee="" /><path d="M22 2 11 13" data-rk-6b0fee="" /></svg>
                </button>
              </form>
            </div>
          </div>
        </div>
      </section>
      </div>
    </>
  );
}

export default ContactGlassForm;
ContactGlassForm.css
/* ContactGlassForm — ported from astro-component-kit (sections/ContactGlassForm.astro) */

.cq-contact-glass-form-cq:where([data-rk-6b0fee]) { container-type: inline-size; }
.contact-section:where([data-rk-6b0fee]) {
  position: relative;
  padding: var(--sp-20, 5rem) var(--sp-6, 1.5rem);
  background: var(--c-bg-primary, #030712);
  overflow: hidden;
}

.contact-bg:where([data-rk-6b0fee]) {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}

.contact-glow:where([data-rk-6b0fee]) {
  position: absolute;
  top: 30%;
  right: 15%;
  width: 550px;
  height: 550px;
  background: radial-gradient(circle, rgba(99, 102, 241, 0.12), transparent 70%);
  filter: blur(120px);
}

.container:where([data-rk-6b0fee]) {
  position: relative;
  z-index: 1;
  max-width: 1200px;
  margin: 0 auto;
}

.contact-grid:where([data-rk-6b0fee]) {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 4rem;
  align-items: center;
}

.contact-badge:where([data-rk-6b0fee]) {
  display: inline-flex;
  padding: 0.35rem 0.9rem;
  border-radius: 9999px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  background: color-mix(in srgb, var(--c-primary, #b8860b) 12%, transparent);
  color: #eab308;
  border: 1px solid rgba(234, 179, 8, 0.25);
  margin-bottom: var(--sp-4, 1rem);
}

.contact-title:where([data-rk-6b0fee]) {
  font-size: clamp(2rem, 4vw, 2.8rem);
  font-weight: 900;
  color: #fff;
  line-height: 1.2;
  letter-spacing: -0.02em;
  margin: 0 0 1rem;
}

.contact-subtitle:where([data-rk-6b0fee]) {
  font-size: 1.05rem;
  color: #94a3b8;
  line-height: 1.6;
  margin: 0 0 2rem;
}

.sla-badge:where([data-rk-6b0fee]) {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.5rem 1rem;
  background: rgba(16, 185, 129, 0.1);
  border: 1px solid rgba(16, 185, 129, 0.25);
  border-radius: 9999px;
  font-size: 0.82rem;
  color: #cbd5e1;
  margin-bottom: 2.5rem;
}

.sla-dot:where([data-rk-6b0fee]) {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #10b981;
  box-shadow: 0 0 8px #10b981;
}

.channels-list:where([data-rk-6b0fee]) {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.channel-card:where([data-rk-6b0fee]) {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem 1.25rem;
  background: rgba(15, 23, 42, 0.5);
  border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
  border-radius: 14px;
  backdrop-filter: blur(10px);
}

.channel-icon:where([data-rk-6b0fee]) {
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background: rgb(var(--ink-rgb, 255 255 255) / 0.05);
  color: #eab308;
  display: flex;
  align-items: center;
  justify-content: center;
}

.channel-details:where([data-rk-6b0fee]) {
  display: flex;
  flex-direction: column;
}

.channel-label:where([data-rk-6b0fee]) {
  font-size: 0.75rem;
  color: #64748b;
  font-weight: 600;
}

.channel-link:where([data-rk-6b0fee]) {
  font-size: 0.92rem;
  color: #cbd5e1;
  text-decoration: none;
  font-weight: 600;
  transition: color 0.2s ease;
}

.channel-link:hover:where([data-rk-6b0fee]) {
  color: #fff;
}

/* Form */
.contact-form:where([data-rk-6b0fee]) {
  background: rgba(15, 23, 42, 0.7);
  backdrop-filter: blur(24px);
  border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
  border-radius: var(--r-2xl, 24px);
  padding: clamp(1.75rem, 4vw, 2.5rem);
  box-shadow: 0 25px 50px -15px rgba(0, 0, 0, 0.7);
}

.form-title:where([data-rk-6b0fee]) {
  font-size: 1.4rem;
  font-weight: 800;
  color: #fff;
  margin: 0 0 0.4rem;
}

.form-desc:where([data-rk-6b0fee]) {
  font-size: 0.88rem;
  color: #94a3b8;
  margin: 0 0 1.75rem;
}

.form-row:where([data-rk-6b0fee]) {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1rem;
}

.form-group:where([data-rk-6b0fee]) {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin-bottom: 1.25rem;
}

.form-group:where([data-rk-6b0fee]) label:where([data-rk-6b0fee]) {
  font-size: 0.82rem;
  font-weight: 600;
  color: #cbd5e1;
}

.form-input:where([data-rk-6b0fee]), .form-select:where([data-rk-6b0fee]), .form-textarea:where([data-rk-6b0fee]) {
  width: 100%;
  padding: 0.75rem 1rem;
  background: rgba(0, 0, 0, 0.35);
  border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
  border-radius: 10px;
  color: #fff;
  font-size: 0.92rem;
  font-family: inherit;
  outline: none;
  box-sizing: border-box;
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.form-input:focus:where([data-rk-6b0fee]), .form-select:focus:where([data-rk-6b0fee]), .form-textarea:focus:where([data-rk-6b0fee]) {
  border-color: #eab308;
  box-shadow: 0 0 0 3px rgba(234, 179, 8, 0.15);
}

.form-select:where([data-rk-6b0fee]) option:where([data-rk-6b0fee]) {
  background: #0f172a;
  color: #fff;
}

.submit-btn:where([data-rk-6b0fee]) {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.85rem 1.5rem;
  background: linear-gradient(135deg, #eab308, #d97706);
  border: none;
  border-radius: 10px;
  color: #000;
  font-size: 0.95rem;
  font-weight: 700;
  cursor: pointer;
  transition: all 0.25s ease;
  box-shadow: 0 4px 15px rgba(234, 179, 8, 0.3);
}

.submit-btn:hover:where([data-rk-6b0fee]) {
  filter: brightness(1.1);
  box-shadow: 0 6px 20px rgba(234, 179, 8, 0.45);
}

@container (max-width: 960px) {
  .contact-grid:where([data-rk-6b0fee]) {
    grid-template-columns: 1fr;
    gap: 3rem;
  }
}

@container (max-width: 640px) {
  .form-row:where([data-rk-6b0fee]) {
    grid-template-columns: 1fr;
  }
}