About

A blank canvas frame with no application chrome. Use this frame when prototyping customer-facing pages, public forms, landing pages, login screens, or any experience that exists outside of the main Skedulo application shell. The frame is intentionally minimal — a bordered white container at a fixed height with no sidebar, header, or navigation. This gives you complete control over the page layout and visual design.

Import
import { PublicPageFrame } from "@/components/frames/PublicPageFrame";

Usage Guidance

When to use

  • +Prototyping customer-facing or public pages outside the app shell.
  • +Designing login, signup, or onboarding flows.
  • +Building landing pages, booking confirmations, or status pages.
  • +Any prototype that needs a completely blank canvas.

When not to use

  • For pages within the Skedulo app — use FullPageApplicationFrame instead.
  • For admin or settings pages — use AdminFrame instead.
  • For side panel prototypes — use ContextPanelFrame instead.

Code Samples

Blank canvas

An empty frame ready for any content.

import { PublicPageFrame } from "@/components/frames/PublicPageFrame";

export default function MyPublicPagePrototype() {
  return (
    <PublicPageFrame>
      <div className="flex items-center justify-center h-full">
        <p className="text-gray-400">Your prototype here</p>
      </div>
    </PublicPageFrame>
  );
}

Customer booking page

A public-facing booking confirmation page with a logo header.

<PublicPageFrame>
  <div className="h-full flex flex-col">
    <header className="px-6 py-4 border-b border-gray-200">
      <div className="flex items-center gap-2">
        <div className="w-6 h-6 bg-blue-500 rounded" />
        <span className="text-sm font-semibold">Acme Services</span>
      </div>
    </header>
    <div className="flex-1 flex items-center justify-center p-8">
      <div className="text-center max-w-md">
        <h1 className="text-xl font-bold mb-2">Booking Confirmed</h1>
        <p className="text-sm text-gray-500">
          Your appointment is scheduled for March 15 at 10:00 AM.
        </p>
      </div>
    </div>
  </div>
</PublicPageFrame>

Login form

A standalone login page with centered form.

<PublicPageFrame>
  <div className="h-full flex items-center justify-center bg-gray-50 p-8">
    <div className="w-full max-w-sm bg-white rounded-lg border p-6">
      <h1 className="text-lg font-bold text-center mb-6">Sign In</h1>
      <div className="space-y-4">
        <input
          type="email"
          placeholder="Email"
          className="w-full border rounded-md px-3 py-2 text-sm"
        />
        <input
          type="password"
          placeholder="Password"
          className="w-full border rounded-md px-3 py-2 text-sm"
        />
        <button className="w-full bg-blue-600 text-white rounded-md py-2 text-sm font-medium">
          Sign In
        </button>
      </div>
    </div>
  </div>
</PublicPageFrame>

API Reference

PropTypeDefaultDescription
children*React.ReactNodeThe prototype content to render inside the frame.
heightstring"600px"Height of the frame container. Use a fixed value for documentation previews, or "100vh" for full-screen prototypes.