with one click
ui-component
Use when creating new UI components under apps/web/src/components/
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Use when creating new UI components under apps/web/src/components/
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | ui-component |
| description | Use when creating new UI components under apps/web/src/components/ |
*.stories.tsx for Storybookpnpm --filter @mf-dashboard/web storybookcomponents/charts/ or components/ui/)Data-agnostic, reusable components. Receive all data via props.
// components/charts/my-chart.tsx
"use client";
interface MyChartProps {
data: Array<{ label: string; value: number }>;
// ... props only, no data fetching
}
export function MyChart({ data }: MyChartProps) {
return (/* pure rendering */);
}
components/info/)| File | Purpose |
|---|---|
foo.tsx | Server Component - fetches data via lib/queries |
foo.client.tsx | Client Component - handles interactivity (ONLY if needed) |
foo.stories.tsx | Storybook - uses mock data |
IMPORTANT: Only create .client.tsx when interactivity is required (useState, useEffect, event handlers, etc.). If the component only displays data, keep it as a Server Component.
// components/info/my-info.tsx
import { getMyData } from "../../lib/queries";
export function MyInfo() {
const data = getMyData();
return (
<Card>
<CardHeader>
<CardTitle>My Info</CardTitle>
</CardHeader>
<CardContent>{/* render data */}</CardContent>
</Card>
);
}
// components/info/my-info.tsx
import { getMyData } from "../../lib/queries";
import { MyInfoClient } from "./my-info.client";
export function MyInfo() {
const data = getMyData();
return <MyInfoClient data={data} />;
}
// components/info/my-info.client.tsx
"use client";
interface MyInfoClientProps {
data: MyData;
}
export function MyInfoClient({ data }: MyInfoClientProps) {
const [state, setState] = useState(/* ... */);
return (/* interactive UI */);
}
apps/web/src/components/charts/apps/web/src/components/ui/apps/web/src/components/info/apps/web/src/lib/queries.ts// components/info/my-info.stories.tsx
import type { Meta, StoryObj } from "@storybook/react";
import { MyInfoClient } from "./my-info.client";
const meta = {
component: MyInfoClient,
} satisfies Meta<typeof MyInfoClient>;
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {
args: {
data: {
// mock data here
},
},
};
| Purpose | Class |
|---|---|
| Income amount | text-income |
| Expense amount | text-expense |
| Positive balance | text-balance-positive |
| Negative balance | text-balance-negative |
Use when adding new scraping targets to the crawler
Use when adding/modifying database tables or columns in Drizzle ORM schema
Use when needing to visualize database schema, generate ERD diagrams from Drizzle ORM schemas, or understand table relationships