VVibeFlui

File Organization

Keep schemas separate from TSX files.

This makes schemas easier to review, test, reuse, and generate with AI tools.

TXT
app/
  users/
    page.tsx
schemas/
  user.form.schema.ts
  user.table.schema.ts
  user.actions.schema.ts
  user.schema.ts
lib/
  vibeflui/
    registry.ts

Schema file

schemas/user.schema.ts

TS
export const userSchema = {
  version: "1.0.0",
  resource: "users",
  endpoint: "/api/users",
  table: {
    columns: ["name", "email", "status"]
  },
  form: {
    mode: "modal",
    fields: [
      { name: "name", label: "Name", type: "text", required: true },
      { name: "email", label: "Email", type: "email", required: true },
      { name: "status", label: "Status", type: "select", optionLoader: "users.statusOptions" }
    ]
  },
  actions: {
    create: { enabled: true, label: "Create user", handler: "users.create" }
  }
} as const;

Registry file

lib/vibeflui/registry.tsx

TSX
import { createRegistry } from "@vibeflui/core";

export const registry = createRegistry({
  optionLoaders: {
    "users.statusOptions": async () => [
      { label: "Active", value: "active" },
      { label: "Suspended", value: "suspended" }
    ]
  },
  actionHandlers: {
    "users.create": async ({ values }) => {
      const name = String(values?.name ?? "User");

      return {
        status: true,
        code: 200,
        message: `${name} created`
      };
    }
  }
});

Page file

app/users/page.tsx

TSX
"use client";

import { FluiKit, FluiKitProvider } from "@vibeflui/core";
import { registry } from "@/lib/vibeflui/registry";
import { userSchema } from "@/schemas/user.schema";

export default function UsersPage() {
  return (
    <FluiKitProvider registry={registry}>
      <FluiKit schema={userSchema} />
    </FluiKitProvider>
  );
}

Why this structure works

  • Schema files stay declarative.
  • TSX pages stay small.
  • Registry runtime logic is centralized.
  • AI tools can generate schemas without touching page components.
  • Examples can be reused by rendered demos.