Integrations

Rafty UI + Fibr

Fibr equips developers to build their forms 10x faster by simplifying form structure, generation, validation, theming, submission, error handling, and more. Check out Fibr.

import f from "@fibr/core";
import raftyFibrPlugin, { FieldWrapper } from "@fibr/rafty";
import { FibrForm, FibrProvider, FieldProps, Fields } from "@fibr/react";
import { zodResolver } from "@hookform/resolvers/zod";
import { Button, InputField, Toast } from "@rafty/ui";
import toast from "react-hot-toast";
import z from "zod";
import { useFormContext } from "react-hook-form";

const validation = z.object({
  name: z.string().min(4).max(30),
  email: z.string().min(8).max(50),
});

export default function FibrForm() {
  return (
    <FibrProvider plugins={[raftyFibrPlugin, ...]}>
      <FibrForm
        blueprint={f.form<z.infer<typeof validation>, Resolver<FieldValues>>({
          validation: zodResolver(validation),
          fields: {
            name: f.string({ label: "Name", required: true }),
            email: f.custom({ type: "email", label: "Email", required: true }),
          },
        })}
        onSubmit={({ values }) => console.log(values)}
        onError={(errors) => {
          console.error(errors);
          toast.custom((t) => (
            <Toast
              visible={t.visible}
              severity="error"
              title="Credentials are invalid"
            />
          ));
        }}
        className="space-y-3"
      >
        <Fields />
        <Button colorScheme="primary" type="submit">
          Submit
        </Button>
      </FibrForm>
    </FibrProvider>
  );
}

const customPlugin = {
  email: EmailField,
};

function EmailField(props: FieldProps) {
  const { register } = useFormContext();
  return (
    <FieldWrapper
      name={props.name}
      label={props.field.label}
      description={props.field.description}
      required={props.field.required as boolean}
    >
      <InputField {...register(props.name)} type="email" />
    </FieldWrapper>
  );
}

© 2025 rhinobase, Inc. All rights reserved.

We only collect analytics essential to ensuring smooth operation of our services.