React RFQ Builder

Industrial buyers do not check out — they request a quote, for several parts at once, at quantities and prices they have already been budgeted for. This is that flow: search the catalog, build a multi-line request with quantities and optional target pricing, then attach contact details and send.

  • AES-256-P-G-D-I

    AES-256 GCM Core

    Pipelined, DOM-masked, industrial grade

    $32.6 eaMOQ 100Lead 6 wks

  • SHA3-512-R-C

    SHA-3 Hash Engine

    Round-rolled Keccak-f[1600]

    $14.2 eaMOQ 250Lead 4 wks

  • MLKEM-768-A-I

    ML-KEM Accelerator

    FIPS 203, level 3 parameter set

    $58 eaMOQ 50Lead 10 wks

  • TRNG-90B-C

    True RNG

    SP 800-90B entropy source + conditioner

    $8.75 eaMOQ 500Lead 3 wks

  • HSM-PCIE-2U

    PCIe HSM Card

    FIPS 140-3 level 3, 40k ops/s

    $4,200 eaMOQ 1Lead 12 wks

Quote request

Add parts to build your request.

Installation

npx shadcn@latest add "https://kelvinui.com/registry/rfq-builder.json"

Props

PropTypeDescription
catalogRfqPart[]Parts available to add
currencystringCurrency symbol (default "$")
onSubmit(payload: RfqPayload) => voidReceives the full request; wire to your endpoint

RfqPart is { id, partNumber, name, description?, unitPrice?, moq?, leadTime? }. When moq is set, the quantity stepper clamps to it and adding an existing line increments by the MOQ rather than by one.

Wiring it up

The component is transport-agnostic — it hands you a plain object:

tsx
<RfqBuilder
catalog={catalog}
onSubmit={async (payload) => {
  await fetch("https://api.web3forms.com/submit", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      access_key: process.env.NEXT_PUBLIC_FORMS_KEY,
      subject: `RFQ — ${payload.contact.company}`,
      ...payload.contact,
      lines: payload.lines
        .map((l) => `${l.partNumber} ×${l.quantity}`)
        .join("\n"),
    }),
  });
}}
/>

The indicative total uses each line's target price when given and the catalog price otherwise. It is a sanity check for the buyer, not a quote — say so in your own copy, because the number they see is the number they will remember.

Add a Selection Guide upstream so undecided visitors arrive here already knowing which part to request.

New components every week

Get the week's new Kelvin UI components and templates in one short email. No spam, unsubscribe anytime.