File Organization
Keep schemas separate from TSX files.
This makes schemas easier to review, test, reuse, and generate with AI tools.
Recommended structure
TXT
app/
users/
page.tsx
schemas/
user.form.schema.ts
user.table.schema.ts
user.actions.schema.ts
user.schema.ts
lib/
vibeflui/
registry.tsSchema 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.