What can cross the line
When a Server Component passes props to a Client Component, the data must serialize. The boundary is roughly "JSON-shaped, plus a few React extras."
| Allowed ✅ | Blocked ❌ |
|---|---|
| Strings, numbers, booleans | Functions |
| Arrays, plain objects | Class instances |
| Dates (serialized as strings) | Symbols |
null / undefined | DOM nodes / streams |
FormData | Circular references |
| React elements (JSX) and Promises |
The big consequence
You can't pass a function from server to client. If you want the client to call back into server logic, define a Server Action and pass that down (the framework wraps it in a serialized POST endpoint reference).
The composition trick
JSX elements serialize. That means a Server Component can pass other Server Components as children to a Client Component — the Client Component renders them but doesn't import them. This is the cleanest way to wrap a server-rendered subtree in client-side interactivity.