→ Routing & Layout
Protected Layout
Knock Codes shaped for a full-page shell — header/footer stay visible even while locked.
Best used for A Next.js layout.tsx or app root where the header/footer must survive the locked state.
Built for a Next.js layout.tsx or any app root where the gate should wrap the page content but not the
site chrome around it.
- components
- knock-codes
- core
- react
"use client";
import type { ReactNode } from "react";
import { KnockCodes, type KnockCodesProps } from "./KnockCodes.tsx";
export interface ProtectedLayoutProps extends KnockCodesProps {
/** Rendered above the PIN prompt even while locked — e.g. a persistent site header/logo. */
header?: ReactNode;
/** Rendered below the PIN prompt even while locked. */
footer?: ReactNode;
}
/**
* `<KnockCodes>` shaped for a full-page shell (a Next.js `layout.tsx`, an
* app root): `header`/`footer` render unconditionally, so persistent site
* chrome (logo, footer links) survives the gate instead of disappearing
* behind it while locked.
*/
export function ProtectedLayout({ header, footer, children, ...props }: ProtectedLayoutProps) {
return (
<>
{header}
<KnockCodes {...props}>{children}</KnockCodes>
{footer}
</>
);
}
Add this block to your project
CLI
npx shadcn@latest add http://localhost:3000/r/react/protected-layout.jsonRunning this site somewhere other than localhost? Set NEXT_PUBLIC_SITE_URL and this command switches to that host automatically.
Also installs
- Knock Codes Core
- Knock Codes Types
- useKnockCodes
- cx (classname helper)
- Gate Wrapper
- PIN Input
- Knock Codes
Files created (11)
- components/knock-codes/core/hash.ts
- components/knock-codes/core/verify.ts
- components/knock-codes/core/session.ts
- components/knock-codes/core/storage.ts
- components/knock-codes/react/types.ts
- components/knock-codes/react/useKnockCodes.ts
- components/knock-codes/react/cx.ts
- components/knock-codes/react/GateWrapper.tsx
- components/knock-codes/react/PinInput.tsx
- components/knock-codes/react/KnockCodes.tsx
- components/knock-codes/react/ProtectedLayout.tsx
No CLI? Copy the files by hand
- Open the Code tab in the preview above.
- Create each path listed below in your project and paste its contents in.
- Do the same for anything listed under “Also installs”, if present.
→ Props
API reference
| Prop | Type | Default | Description |
|---|---|---|---|
| expectedHash | string | — | SHA-256 hex hash to verify against, for local mode. |
| verify | VerifyFn | — | Custom async verification function, for server mode. |
| children * | ReactNode | — | Rendered once unlocked. |
| header | ReactNode | — | Rendered above the access-code prompt even while locked. |
| footer | ReactNode | — | Rendered below the access-code prompt even while locked. |
Accessibility
Header and footer are always in the document, in source order, whether or not the gate is unlocked — so a persistent nav landmark stays reachable by screen reader users at every state, not just once unlocked.
Customization
Pass `header`/`footer` for chrome that should survive the gate — a logo, a footer with legal links. Everything else (labels, storage, timeout) is identical to Knock Codes.
→ Compose with
Blocks that pair well with this one
These combine naturally with this block, whether as a shared shell, a shared session, or a common fallback.