// ============================================================
// pages-other.jsx — Products, Research, Mission, Contact
// ============================================================

// ------------------------------------------------------------
// ProductsPage — catalogue + spec drawer
// ------------------------------------------------------------
const PRODUCTS = [
{ id: "fl-mha", code: "FL-MHA / L", title: "Miniaturised modular hairpin assembly line",
  blurb: "Reconfigurable cell layout. Per-drawing, per-line.",
  power: "—", lead: "as appropriate", rev: "B",
  long: "Reconfigurable automated hairpin generation cell. Wire gauge and cassette geometry are selected at commissioning. Delivered as a complete line." },
{ id: "fl-clm", code: "FL-CLM / S", title: "Closed-loop req-output mfg sim",
  blurb: "Bidirectional. Process observed by process.",
  power: "—", lead: "to be confirmed", rev: "A",
  long: "Closed-loop requirement-to-output simulator. Provided as a packaged software artefact under separate cover." },
{ id: "fl-chp", code: "FL-CHP / R", title: "CHP winding rapid prototype set",
  blurb: "Continuous-hairpin winding development bench.",
  power: "—", lead: "upon agreement", rev: "B",
  long: "Continuous-hairpin winding development bench. Sample rate and head selection are made at order. Acceptance criteria are agreed with the operator up front." },
{ id: "fl-amb", code: "FL-AMB / B", title: "Bifilar AMB coils",
  blurb: "Active magnetic bearing — bifilar topology. Per shaft.",
  power: "—", lead: "subject to scope", rev: "A",
  long: "Bifilar active-magnetic-bearing coil set. Wound per drawing, against a specified shaft geometry." }];


function ProductsPage({ onRoute }) {
  const [selected, setSelected] = React.useState(null);
  return (
    <div className="page">
      <section style={{ borderBottom: "1px solid var(--border-default)", padding: "56px 0 32px", background: "var(--black-100)" }}>
        <div className="wrap-wide">
          <div className="rule">
            <span className="tick"></span>
            <span>Catalogue</span>
            <span className="line"></span>
            <span>4 PRODUCTS</span>
          </div>

          <div className="section-head">
            <h2>Our catalogue.</h2>
            <p className="lede">
              Each product is configured to your specification. Nothing is
              stocked off the shelf.
            </p>
          </div>

          <div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 16 }}>
            {PRODUCTS.map((p) =>
            <ProductCard key={p.id} p={p} onClick={() => setSelected(p)} />
            )}
          </div>
        </div>
      </section>

      {selected && <SpecDrawer p={selected} onClose={() => setSelected(null)} />}
    </div>);

}

function ProductCard({ p, onClick }) {
  const restricted = p.restricted;
  return (
    <a onClick={onClick}
    className={"card-frame" + (restricted ? " glitch anom" : "")}
    style={{ padding: 0, cursor: "pointer", display: "block",
      borderColor: restricted ? "var(--offspec-900)" : "var(--border-default)" }}>
      <span className="corner tl" /><span className="corner tr" />
      <span className="corner bl" /><span className="corner br" />

      <div style={{
        height: 160, background: restricted ? "var(--black-050)" : "var(--black-050)",
        borderBottom: "1px solid var(--border-default)",
        display: "flex", alignItems: "center", justifyContent: "center",
        color: restricted ? "var(--offspec-500)" : "var(--phosphor-500)",
        position: "relative", overflow: "hidden"
      }}>
        {!restricted ?
        <img src="assets/illustrations/motor-cross-section.svg" alt=""
        style={{ width: "76%", height: "auto", opacity: 0.85,
          filter: "drop-shadow(0 0 6px #33ff6644)" }} /> :

        <>
            <img src="assets/illustrations/motor-cross-section.svg" alt=""
          style={{ width: "76%", height: "auto", opacity: 0.10 }} />
            <div className="glitch-text" style={{
            position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center",
            fontFamily: "VT323, monospace", fontSize: 32, color: "var(--offspec-500)",
            textShadow: "0 0 8px #ff2bd388", letterSpacing: "0.18em"
          }}>//  · § 4.4</div>
            <div style={{
            position: "absolute", top: 8, left: 8
          }}>
              <span className="pill anom"><span className="dot" />OFF-SPEC</span>
            </div>
          </>
        }
      </div>

      <div style={{ padding: 18 }}>
        <div style={{ display: "flex", justifyContent: "space-between", marginBottom: 8 }}>
          <span className="eyebrow" style={{ color: restricted ? "var(--offspec-500)" : "var(--phosphor-500)" }}>{p.code}</span>
          <span className="eyebrow">REV {p.rev}</span>
        </div>
        <div style={{ fontFamily: "var(--font-display)", fontWeight: 600,
          fontSize: 19, letterSpacing: "0.06em", textTransform: "uppercase",
          color: "var(--bone-100)", marginBottom: 10 }}>
          {p.title || "—"}
        </div>
        <p style={{ margin: 0, fontSize: 13, lineHeight: 1.55,
          color: restricted ? "var(--fg-muted)" : "var(--steel-100)",
          fontStyle: restricted ? "italic" : "normal", minHeight: 38 }}>
          {p.blurb}
        </p>
        <div style={{ marginTop: 16, paddingTop: 10, borderTop: "1px dotted var(--border-faint)",
          fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--fg-muted)",
          display: "flex", justifyContent: "space-between" }}>
          <span>{p.power}</span>
          <span>{p.lead}</span>
        </div>
      </div>
    </a>);

}

// ------------------------------------------------------------
// SpecDrawer — full-screen sheet with the spec sheet
// ------------------------------------------------------------
function SpecDrawer({ p, onClose }) {
  const restricted = p.restricted;
  const accent = restricted ? "var(--offspec-500)" : "var(--phosphor-500)";

  React.useEffect(() => {
    const k = (e) => {if (e.key === "Escape") onClose();};
    window.addEventListener("keydown", k);
    return () => window.removeEventListener("keydown", k);
  }, [onClose]);

  return (
    <div style={{
      position: "fixed", inset: 0, zIndex: 5000,
      background: "rgba(10,14,10,0.92)", padding: 32,
      animation: "pagefade 220ms linear", overflowY: "auto"
    }} onClick={onClose}>
      <div className={"card-frame" + (restricted ? " anom" : "")}
      onClick={(e) => e.stopPropagation()}
      style={{ maxWidth: 1080, margin: "0 auto", padding: 0,
        borderColor: restricted ? "var(--offspec-900)" : "var(--phosphor-700)",
        boxShadow: restricted ? "0 0 40px #ff2bd333" : "0 0 40px #33ff6633" }}>
        <span className="corner tl" /><span className="corner tr" />
        <span className="corner bl" /><span className="corner br" />

        {/* header */}
        <div style={{
          padding: "20px 28px", borderBottom: "1px solid var(--border-default)",
          display: "flex", justifyContent: "space-between", alignItems: "center",
          background: "var(--black-200)"
        }}>
          <div>
            <span className="eyebrow" style={{ color: accent }}>{p.code} · REV {p.rev}</span>
            <div style={{ fontFamily: "var(--font-display)", fontSize: 24, fontWeight: 700,
              letterSpacing: "0.04em", textTransform: "uppercase",
              color: restricted ? "var(--offspec-500)" : "var(--bone-100)", marginTop: 4 }}>
              {p.title || <span style={{ opacity: 0.4 }}>· catalogue entry withheld ·</span>}
            </div>
          </div>
          <div style={{ display: "flex", gap: 10, alignItems: "center" }}>
            {restricted ?
            <span className="pill anom"><span className="dot" />SEALED-BID ONLY</span> :
            <span className="pill nominal"><span className="dot" />AVAILABLE</span>}
            <button className="btn ghost" onClick={onClose}>Close ✕</button>
          </div>
        </div>

        {/* body: two-column */}
        <div style={{ display: "grid", gridTemplateColumns: "200px 1fr", minHeight: 480 }}>

          {/* left rail — metadata */}
          <div style={{ borderRight: "1px solid var(--border-default)", background: "var(--black-100)", padding: 22 }}>
            <RailItem k="REVISION" v={p.rev} />
            <RailItem k="ISSUED" v="2025" />
            <RailItem k="REGISTRY" v="FL-2025-A" />
            <div style={{ marginTop: 24 }}>
              <img src="assets/illustrations/nameplate.svg" alt=""
              style={{ width: "100%", filter: "invert(0.9) sepia(0.3) hue-rotate(60deg)" }} />
            </div>
          </div>

          {/* right: spec rows */}
          <div style={{ padding: 28 }}>
            <div className="eyebrow" style={{ marginBottom: 12, color: accent }}>Overview</div>
            <p style={{ margin: "0 0 28px", fontFamily: "var(--font-sans)", fontSize: 14, lineHeight: 1.6, color: "var(--bone-100)", textWrap: "pretty" }}>
              {restricted ?
              <span style={{ fontStyle: "italic", color: "var(--steel-100)" }}>{p.long}</span> :
              p.long}
            </p>

            <div className="eyebrow" style={{ marginBottom: 12, color: accent }}>Specifications</div>
            <table style={{ width: "100%", borderCollapse: "collapse",
              fontFamily: "var(--font-mono)", fontSize: 12 }}>
              <tbody>
                {restricted ?
                <>
                    <SpecRow k="Configuration" v={<span>see <span className="redact dark">§ 4.4</span></span>} />
                    <SpecRow k="Output bound" v="█████" />
                    <SpecRow k="Footprint" v="████ · unit" />
                    <SpecRow k="Interface" v={<span><span className="redact dark">redacted</span> · sealed</span>} />
                    <SpecRow k="Lead time" v="—" />
                    <SpecRow k="Authorisation" v="By referral only" anom />
                    <SpecRow k="Sample serial" v="FL-00-2025-A0061" anom />
                    <SpecRow k="Last returned" v="██.██.2026 ██:██ LOC" anom />
                    <SpecRow k="Recovery state" v="Intact" anom />
                  </> :
                <>
                    <SpecRow k="Configuration" v="By specification" />
                    <SpecRow k="Output" v="By specification" />
                    <SpecRow k="Footprint" v="As required" />
                    <SpecRow k="Interface" v="By drawing" />
                    <SpecRow k="Power" v="—" />
                    <SpecRow k="Acceptance" v="Per engagement" />
                    <SpecRow k="Lead time" v={p.lead} />
                    <SpecRow k="Mass" v="—" />
                    <SpecRow k="Warranty" v="Subject to scope" />
                    <SpecRow k="Registry" v="FL-2025-A" />
                  </>
                }
              </tbody>
            </table>

            <div style={{ marginTop: 28, display: "flex", gap: 10 }}>
              <a className="btn ghost">Save</a>
              <a className="btn ghost">Close</a>
            </div>
          </div>
        </div>
      </div>
    </div>);

}

function RailItem({ k, v, anom }) {
  return (
    <div style={{ marginBottom: 14, paddingBottom: 8, borderBottom: "1px dotted var(--border-faint)" }}>
      <div className="eyebrow">{k}</div>
      <div style={{ fontFamily: "var(--font-mono)", fontSize: 12, color: anom ? "var(--offspec-500)" : "var(--bone-100)", marginTop: 4, letterSpacing: "0.04em" }}>{v}</div>
    </div>);

}

function SpecRow({ k, v, anom }) {
  return (
    <tr style={{ borderBottom: "1px dotted var(--border-faint)" }}>
      <td style={{ padding: "10px 0", color: "var(--fg-muted)", letterSpacing: "0.12em",
        textTransform: "uppercase", fontSize: 11, width: "45%" }}>{k}</td>
      <td style={{ padding: "10px 0", color: anom ? "var(--offspec-500)" : "var(--bone-100)",
        fontVariantNumeric: "tabular-nums", textAlign: "right" }}>{v}</td>
    </tr>);

}

// ------------------------------------------------------------
// ResearchPage — biased toward the off-spec
// ------------------------------------------------------------
function ResearchPage() {
  return (
    <div className="page">
      <section style={{ padding: "56px 0 32px", borderBottom: "1px solid var(--border-default)",
        background: "linear-gradient(180deg, var(--black-100) 0%, var(--black-050) 100%)" }}>
        <div className="wrap-wide">
          <div className="rule">
            <span className="tick"></span>
            <span>Research</span>
            <span className="line"></span>
            <span>INTERNAL</span>
          </div>

          <div className="section-head">
            <h2>What our research team works on.</h2>
            <p className="lede">
              A brief look at the areas our internal research group is
              currently focused on.
            </p>
          </div>

          <div style={{ display: "grid", gridTemplateColumns: "1.2fr 0.8fr", gap: 32 }}>
            {/* LEFT — research topics */}
            <div style={{ display: "grid", gap: 16 }}>
              <ResearchTopic n="R-01" title="Design–manufacturing integration"
              body="Coupling product geometry directly to process definition, so that a change in a design propagates into tooling, winding and line configuration without manual re-specification." />
              <ResearchTopic n="R-02" title="Simulation-led process development"
              body="Electromagnetic, thermal and structural models are built ahead of the line and used to establish process windows before the first physical run." />
              <ResearchTopic n="R-03" title="Advanced process control"
              body="Closed-loop control of manufacturing cells against model-based references, with in-line measurement feeding correction back into the running process." />
            </div>

            {/* RIGHT — anomalous data card */}
            <div style={{ display: "grid", gap: 16 }}>
              <div className="card-frame" style={{ padding: 22 }}>
                <span className="corner tl" /><span className="corner tr" />
                <span className="corner bl" /><span className="corner br" />
                <span className="eyebrow" style={{ color: "var(--amber-500)" }}>// SIMULATION MODELS</span>
                <div style={{ marginTop: 14, display: "grid", gap: 10, fontFamily: "var(--font-mono)", fontSize: 12, color: "var(--steel-100)", letterSpacing: "0.04em" }}>
                  <FacilityRow loc="model-em" type="Electromagnetic · FEA" />
                  <FacilityRow loc="model-th" type="Thermal · coupled" />
                  <FacilityRow loc="model-ct" type="Control · hardware-in-loop" />
                </div>
              </div>

              <div className="card-frame amber" style={{ padding: 22, borderColor: "var(--amber-700)" }}>
                <span className="corner tl" /><span className="corner tr" />
                <span className="corner bl" /><span className="corner br" />
                <span className="eyebrow" style={{ color: "var(--amber-500)" }}>// DISCLAIMER</span>
                <p style={{ marginTop: 14, marginBottom: 0, fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--steel-100)", lineHeight: 1.7, letterSpacing: "0.02em" }}>
                  These are summaries only and may change as our research
                  progresses.
                </p>
              </div>
            </div>
          </div>
        </div>
      </section>
    </div>);

}

function ResearchTopic({ n, title, body, anom }) {
  return (
    <div className={"card-frame" + (anom ? " anom" : "")}
    style={{ padding: 22, borderColor: anom ? "var(--offspec-900)" : "var(--border-default)" }}>
      <span className="corner tl" /><span className="corner tr" />
      <span className="corner bl" /><span className="corner br" />
      <div style={{ display: "flex", justifyContent: "space-between", alignItems: "baseline" }}>
        <span className="eyebrow" style={{ color: anom ? "var(--offspec-500)" : "var(--phosphor-500)" }}>{n}</span>
        {anom && <span className="pill anom" style={{ padding: "0 8px" }}><span className="dot" />RESTRICTED</span>}
      </div>
      <div style={{ fontFamily: "var(--font-display)", fontWeight: 600, fontSize: 18,
        letterSpacing: "0.06em", textTransform: "uppercase",
        color: anom ? "var(--offspec-500)" : "var(--bone-100)", marginTop: 8 }}>
        {title}
      </div>
      <p style={{ margin: "10px 0 0", fontSize: 13, color: "var(--steel-100)", lineHeight: 1.55 }}>{body}</p>
    </div>);

}

function FacilityRow({ loc, type, anom }) {
  return (
    <div className="dotted" style={{ display: "flex", justifyContent: "space-between", padding: "6px 0", color: anom ? "var(--offspec-500)" : "inherit" }}>
      <span>{loc}</span>
      <span style={{ color: anom ? "var(--offspec-500)" : "var(--fg-muted)" }}>{type}</span>
    </div>);

}

// ------------------------------------------------------------
// ContactPage — form
// ------------------------------------------------------------
function ContactPage() {
  const [form, setForm] = React.useState({
    name: "", org: "", email: "", phone: "",
    interest: "", power: "", lead: "", message: ""
  });
  const [submitted, setSubmitted] = React.useState(false);
  const [errors, setErrors] = React.useState({});

  const update = (k, v) => setForm((f) => ({ ...f, [k]: v }));

  const submit = (e) => {
    e.preventDefault();
    const err = {};
    if (!form.name.trim()) err.name = "Required.";
    if (!form.org.trim()) err.org = "Required.";
    if (!form.email.includes("@")) err.email = "Required, with @.";
    if (!form.interest) err.interest = "Select one.";
    if (!form.message.trim() || form.message.length < 16) err.message = "Minimum 16 characters.";
    setErrors(err);
    if (Object.keys(err).length === 0) setSubmitted(true);
  };

  if (submitted) {
    return (
      <div className="page">
        <section style={{ padding: "120px 0 200px", borderBottom: "1px solid var(--border-default)", background: "var(--black-050)" }}>
          <div className="wrap" style={{ maxWidth: 760, textAlign: "center" }}>
            <div className="eyebrow" style={{ marginBottom: 16, color: "var(--phosphor-500)" }}>Thank you</div>
            <h1 style={{
              fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 64, lineHeight: 0.96,
              letterSpacing: "0.02em", textTransform: "uppercase", margin: "0 0 24px",
              color: "var(--phosphor-500)", textShadow: "0 0 18px #33ff6644"
            }}>
              Enquiry received.
            </h1>
            <p style={{ color: "var(--steel-100)", fontSize: 16, lineHeight: 1.6 }}>
              Thanks for reaching out — we'll get back to you soon.
            </p>
            <div style={{ marginTop: 32 }}>
              <a className="btn ghost" onClick={() => {setSubmitted(false);setForm({ name: "", org: "", email: "", phone: "", interest: "", power: "", lead: "", message: "" });}}>
                Send another enquiry
              </a>
            </div>
          </div>
        </section>
      </div>);

  }

  return (
    <div className="page">
      <section style={{ padding: "56px 0 80px", borderBottom: "1px solid var(--border-default)" }}>
        <div className="wrap-wide">
          <div className="rule">
            <span className="tick" />
            <span>Contact</span>
            <span className="line" />
            <span>FORM FL-RFQ-04</span>
          </div>
          <div className="section-head">
            <h2>Get in touch.</h2>
            <p className="lede">
              Tell us about your project and we'll follow up.
            </p>
          </div>

          <form onSubmit={submit}
          style={{ display: "grid", gridTemplateColumns: "1fr 320px", gap: 32 }}>

            {/* main form */}
            <div className="card-frame" style={{ padding: 28 }}>
              <span className="corner tl" /><span className="corner tr" />
              <span className="corner bl" /><span className="corner br" />

              <FieldRow>
                <FieldCol>
                  <label className="fieldlabel">Operator / contact<span className="req">*</span></label>
                  <input className="field" value={form.name} onChange={(e) => update("name", e.target.value)} placeholder="Family name, given name" />
                  {errors.name && <FieldErr msg={errors.name} />}
                </FieldCol>
                <FieldCol>
                  <label className="fieldlabel">Organisation<span className="req">*</span></label>
                  <input className="field" value={form.org} onChange={(e) => update("org", e.target.value)} placeholder="Legal entity" />
                  {errors.org && <FieldErr msg={errors.org} />}
                </FieldCol>
              </FieldRow>

              <FieldRow>
                <FieldCol>
                  <label className="fieldlabel">Engineering email<span className="req">*</span></label>
                  <input className="field" value={form.email} onChange={(e) => update("email", e.target.value)} placeholder="engineer@example.eu" type="email" />
                  {errors.email && <FieldErr msg={errors.email} />}
                </FieldCol>
                <FieldCol>
                  <label className="fieldlabel">Telephone (incl. country code)</label>
                  <input className="field" value={form.phone} onChange={(e) => update("phone", e.target.value)} placeholder="+39 02 …" />
                </FieldCol>
              </FieldRow>

              <FieldRow>
                <FieldCol>
                  <label className="fieldlabel">Catalogue interest<span className="req">*</span></label>
                  <select className="field" value={form.interest} onChange={(e) => update("interest", e.target.value)}>
                    <option value="">— select —</option>
                    {PRODUCTS.map((p) => <option key={p.id} value={p.code}>{p.code} · {p.title || "—"}</option>)}
                    <option value="other">Other / unlisted</option>
                  </select>
                  {errors.interest && <FieldErr msg={errors.interest} />}
                </FieldCol>
                <FieldCol>
                  <label className="fieldlabel">Target continuous power</label>
                  <select className="field" value={form.power} onChange={(e) => update("power", e.target.value)}>
                    <option value="">— select —</option>
                    <option>&lt; 100 kW</option>
                    <option>100–300 kW</option>
                    <option>300–600 kW</option>
                    <option>600–1 200 kW</option>
                    <option>&gt; 1 200 kW</option>
                    <option>— not applicable —</option>
                  </select>
                </FieldCol>
              </FieldRow>

              <FieldRow>
                <FieldCol>
                  <label className="fieldlabel">Desired delivery window</label>
                  <input className="field" value={form.lead} onChange={(e) => update("lead", e.target.value)} placeholder="e.g. Q4 2026" />
                </FieldCol>
              </FieldRow>

              <FieldRow>
                <FieldCol style={{ gridColumn: "1 / -1" }}>
                  <label className="fieldlabel">Description of requirement<span className="req">*</span></label>
                  <textarea className="field" rows="6" value={form.message} onChange={(e) => update("message", e.target.value)}
                  placeholder="Application, environment, regulatory framework, anything you can disclose without an NDA." />
                  {errors.message && <FieldErr msg={errors.message} />}
                </FieldCol>
              </FieldRow>

              <div style={{ display: "flex", gap: 12 }}>
                <button type="submit" className="btn solid">Submit enquiry →</button>
                <button type="button" className="btn ghost" onClick={() => setForm({ name: "", org: "", email: "", phone: "", interest: "", power: "", lead: "", message: "" })}>Reset</button>
              </div>
            </div>

            {/* sidebar */}
            <aside style={{ display: "grid", gap: 16, alignContent: "start" }}>
              <div className="card-frame" style={{ padding: 22 }}>
                <span className="corner tl" /><span className="corner tr" />
                <span className="corner bl" /><span className="corner br" />
                <span className="eyebrow" style={{ color: "var(--phosphor-500)" }}>Sustainability</span>
                <p style={{ marginTop: 12, marginBottom: 0, fontSize: 12, color: "var(--steel-100)", lineHeight: 1.65, fontFamily: "var(--font-mono)", letterSpacing: "0.02em" }}>
                  We review our operating practices to manage material and
                  energy use responsibly.
                </p>
              </div>

              <div className="card-frame amber" style={{ padding: 22, borderColor: "var(--amber-700)" }}>
                <span className="corner tl" /><span className="corner tr" />
                <span className="corner bl" /><span className="corner br" />
                <span className="eyebrow" style={{ color: "var(--amber-500)" }}>Response time</span>
                <p style={{ marginTop: 12, fontSize: 12, color: "var(--steel-100)", lineHeight: 1.6, fontFamily: "var(--font-mono)", letterSpacing: "0.02em" }}>
                  We typically reply within a few business days.
                </p>
              </div>

              <div className="card-frame" style={{ padding: 22 }}>
                <span className="corner tl" /><span className="corner tr" />
                <span className="corner bl" /><span className="corner br" />
                <span className="eyebrow" style={{ color: "var(--phosphor-500)" }}>Research inquiries</span>
                <p style={{ marginTop: 12, fontSize: 12, color: "var(--steel-100)", lineHeight: 1.6, fontFamily: "var(--font-mono)", letterSpacing: "0.02em" }}>
                  For research collaborations, mention it in your message
                  and we'll route it accordingly.
                </p>
              </div>
            </aside>
          </form>
        </div>
      </section>
    </div>);

}

function FieldRow({ children }) {
  return <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 18, marginBottom: 18 }}>{children}</div>;
}
function FieldCol({ children, style }) {
  return <div style={style}>{children}</div>;
}
function FieldErr({ msg }) {
  return <div style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--hazard-red)", letterSpacing: "0.16em", textTransform: "uppercase", marginTop: 4 }}>! {msg}</div>;
}

Object.assign(window, {
  ProductsPage, ProductCard, SpecDrawer, SpecRow, RailItem,
  ResearchPage, ResearchTopic, FacilityRow,
  ContactPage
});
