--- name: code-block-source-usage description: Guidelines and rules for using the CodeBlockSource component, specifically handling how source files and code are read from the system in the Sona-UI repository. --- # CodeBlockSource Component Guidelines This skill details how `CodeBlockSource` actually reads files from the system and outlines the strict rules you must observe when integrating it into the project. The `CodeBlockSource` relies on `readFileContent` (located in `src/lib/file-utils.ts`), which dynamically reads content from the disk using `fs` and `path`. ## Rules & Constraints When using `CodeBlockSource` or `readFileContent`, you must adhere to the following rules: ### 1. Server Components Only `CodeBlockSource` is an asynchronous React Server Component that strictly uses the Node.js `fs` module to load file data. - **Rule:** You CANNOT import or use `CodeBlockSource` inside a component marked with `"use client"`. - **Reason:** The `fs` module does not exist in the browser context and will cause bundling or runtime crashes. - **Workaround:** If you need code blocks in a client component, you must read the file in a parent server component, then pass the raw text string down to the basic `CodeBlock` component via the `code` prop. ### 2. File Path Resolution All file paths passed into `filePath` are resolved relative to the absolute root directory of the project. - **Rule:** Always use paths originating from the root directory (e.g., `src/components/...` or `public/...`). - **Rule:** DO NOT use relative standard dot paths like `./my-file.tsx` or `../components/my-file.tsx` because `readFileContent` uses `path.join(process.cwd(), filePath)`. ✅ **Correct Example:** ```tsx ``` ❌ **Incorrect Example:** ```tsx // This will fail because it's relative to the current file, not process.cwd() ``` ### 3. Graceful Error Handling If a file cannot be found (e.g., typo in the path, or a file was moved but the documentation wasn't updated), the application will not crash. - **Behavior:** `readFileContent` catches read exceptions, logs the exact error to the server console, and gracefully degrades by returning a string like: `// Error reading file: `. - **Rule:** During development, if you see a crash comment in your UI code blocks, check the server terminal logs to identify the `fs` failure. ### 4. Build Output Limits (Deployments) In platforms like Vercel (Next.js serverless functions), raw source files (like `.tsx` under `src/`) aren't always shipped to the production server runtime by default unless explicitly tracked. - **Rule:** If you find that `CodeBlockSource` works in local development but fails with missing file errors in production, you may need to enable `experimental.outputFileTracingIncludes` in your `next.config.ts`, or verify `fs.readFile` static analysis. ## Usage Example ```tsx import { CodeBlockSource } from "@/components/code-block/code-block-source"; import { CodeBlockPre, CodeBlockCode } from "@/components/code-block/code-block"; // This file must NOT have "use client"; export default function DocumentationPage() { return (

Button Component Reference

{/* File read relative to project root */}
); } ```