Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .fallowrc.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -893,7 +893,6 @@
"packages/studio/src/components/sidebar/BlocksTab.tsx",
"packages/studio/src/components/sidebar/CompositionsTab.tsx",
"packages/studio/src/components/sidebar/LeftSidebar.tsx",
"packages/studio/src/components/storyboard/StoryboardLoaded.tsx",
"packages/studio/src/components/StudioRightPanel.tsx",
"packages/studio/src/components/StudioToast.tsx",
"packages/studio/src/components/ui/Tooltip.tsx",
Expand Down
8 changes: 0 additions & 8 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,7 @@
{
"group": "Start in Studio",
"pages": [
"studio/index",
"studio/storyboard"
"studio/index"
]
},
{
Expand Down
4 changes: 1 addition & 3 deletions docs/guides/faceless-explainer.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ The visuals share one coherent language and develop with the explanation. A diag
- The ending lands the sentence you wanted the viewer to remember.

Ask the agent when the teaching sequence or evidence must change. Use
[Storyboard](/studio/storyboard) to inspect the sequence directly, or Studio
for a precise visual, timing, or animation correction.
Studio for a precise visual, timing, or animation correction.

<Card title="Finish and share" icon="circle-check" href="/guides/export-and-share">
Check the final project, render through your preferred surface, and review the file.
Expand All @@ -68,5 +67,4 @@ for a precise visual, timing, or animation correction.
## Related topics

- [Prompt for explainers](/prompting/explainers)
- [Review the storyboard](/studio/storyboard)
- [Create a product video from real screens](/guides/product-launch-video)
1 change: 0 additions & 1 deletion docs/guides/general-video.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -69,5 +69,4 @@ Before export, confirm:
## Related topics

- [Choose a focused workflow](/workflows)
- [Review the story before polishing](/studio/storyboard)
- [Edit the built project in Studio](/studio)
5 changes: 2 additions & 3 deletions docs/guides/pr-to-video.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ The video should explain the change, not read the pull request description aloud
- Tests and refactoring are not presented as product features.
- Contributor names and release details are accurate.

Ask the agent when the explanation or evidence must change. Use Storyboard to
inspect the sequence directly, or Studio for a precise timing, code-framing, or
Ask the agent when the explanation or evidence must change. Use
Studio for a precise timing, code-framing, or
caption correction.

<Card title="Finish and share" icon="circle-check" href="/guides/export-and-share">
Expand All @@ -68,5 +68,4 @@ caption correction.
## Related topics

- [Prompt for code changes and pull requests](/prompting/code-and-prs)
- [Review the storyboard](/studio/storyboard)
- [Create a custom video from several sources](/guides/general-video)
4 changes: 1 addition & 3 deletions docs/help.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ If the command cannot find a project, check that you are inside the project fold
## Preview is wrong or stale

A change is missing, playback looks old, or the preview is blank. Preview's Code
editor and visual controls save automatically. Storyboard drafts show a Save
action when they still need one. If you edited the project in another
editor and visual controls save automatically. If you edited the project in another
application, save that file first.

1. Wait for the project refresh, then reload Studio once.
Expand All @@ -40,7 +39,6 @@ npx hyperframes check
Selection, canvas controls, timing, or an Inspector field is unavailable.

- Open **Layers** and select the element there when clicking the canvas is difficult.
- Confirm you are in **Preview**, not Storyboard.
- Scrub to a time where the element is actually visible.
- Check whether the visual lives inside a nested composition.
- Ask the agent when the change affects source structure rather than one visible element.
Expand Down
2 changes: 0 additions & 2 deletions docs/studio/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ npx hyperframes preview
/>
</Frame>

- **Storyboard** shows the planned sequence, direction, voiceover, status, and
comments. Use it to review the story.
- **Preview** shows the built project. The live frame is in the middle, the
timeline is below, project tools are on the left, and the Inspector is on the
right.
Expand Down
65 changes: 0 additions & 65 deletions docs/studio/storyboard.mdx

This file was deleted.

3 changes: 1 addition & 2 deletions docs/studio/troubleshooting.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ Undo, zoom in, place the playhead more precisely, and retry. Check whether snapp

## The preview did not update

- Preview's Code editor and visual controls save automatically. Storyboard
narration and feedback drafts show their own Save action. If the change came
- Preview's Code editor and visual controls save automatically. If the change came
from another editor or an agent, confirm that the external file was saved.
- Wait for the project refresh.
- Check the terminal running `hyperframes preview`.
Expand Down
62 changes: 8 additions & 54 deletions packages/cli/src/commands/preview.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import * as clack from "@clack/prompts";
Expand All @@ -17,7 +17,6 @@ import {
reportPreviewShutdown,
studioReadyUrl,
studioDeepLink,
studioLandingSearch,
studioSummaryUrls,
waitForStudioChildClose,
} from "./preview.js";
Expand All @@ -30,70 +29,25 @@ afterEach(() => {
process.exitCode = undefined;
});

function projectWith(storyboard: string | null, frameFiles: string[] = []): string {
const dir = mkdtempSync(join(tmpdir(), "hf-preview-landing-"));
function tempProject(): string {
const dir = mkdtempSync(join(tmpdir(), "hf-preview-"));
tempDirs.push(dir);
if (storyboard !== null) writeFileSync(join(dir, "STORYBOARD.md"), storyboard);
for (const file of frameFiles) {
mkdirSync(join(dir, file, ".."), { recursive: true });
writeFileSync(join(dir, file), "<div></div>");
}
return dir;
}

const FRAME = (n: number, status: string) =>
`## Frame ${n} — F${n}\n- status: ${status}\n- src: compositions/frames/0${n}.html\n\nBeat.\n`;

describe("studioLandingSearch", () => {
it("returns no search without a storyboard", () => {
expect(studioLandingSearch(projectWith(null))).toBe("");
});

it("lands on the board while sketches are under review (any built frame)", () => {
const dir = projectWith(`${FRAME(1, "built")}${FRAME(2, "outline")}`, [
"compositions/frames/01.html",
]);
expect(studioLandingSearch(dir)).toBe("?view=storyboard");
});

it("lands on the board during pure planning (srcs declared, none exist)", () => {
const dir = projectWith(`${FRAME(1, "outline")}${FRAME(2, "outline")}`);
expect(studioLandingSearch(dir)).toBe("?view=storyboard");
});

it("lands on the timeline once frames exist without a built status", () => {
const dir = projectWith(`${FRAME(1, "outline")}`, ["compositions/frames/01.html"]);
expect(studioLandingSearch(dir)).toBe("");
});

it("lands on the timeline for fully animated boards", () => {
const dir = projectWith(`${FRAME(1, "animated")}`, ["compositions/frames/01.html"]);
expect(studioLandingSearch(dir)).toBe("");
});
});

describe("Studio handoff URLs", () => {
it("hands off the exact timeline project route", () => {
const dir = projectWith(null);
expect(studioDeepLink("http://127.0.0.1:3002", "demo", dir)).toBe(
expect(studioDeepLink("http://127.0.0.1:3002", "demo")).toBe(
"http://127.0.0.1:3002/#project/demo",
);
expect(studioSummaryUrls("demo", "http://127.0.0.1:3002", dir)).toEqual({
expect(studioSummaryUrls("demo", "http://127.0.0.1:3002")).toEqual({
serverUrl: "http://127.0.0.1:3002",
studioUrl: "http://127.0.0.1:3002/#project/demo",
});
});

it("hands off the exact storyboard route while a project is still planning", () => {
const dir = projectWith(FRAME(1, "outline"));
expect(studioDeepLink("http://127.0.0.1:3002", "demo", dir)).toBe(
"http://127.0.0.1:3002/?view=storyboard#project/demo",
);
});

it("URL-encodes project names that have hash-route metacharacters", () => {
const dir = projectWith(null);
expect(studioDeepLink("http://127.0.0.1:3002", "Launch #1? 50%", dir)).toBe(
expect(studioDeepLink("http://127.0.0.1:3002", "Launch #1? 50%")).toBe(
"http://127.0.0.1:3002/#project/Launch%20%231%3F%2050%25",
);
});
Expand Down Expand Up @@ -365,7 +319,7 @@ describe("preview lifecycle JSON failures", () => {
});

it("wraps managed-start validation failures in one JSON document", async () => {
const dir = projectWith(null);
const dir = tempProject();
writeFileSync(join(dir, "index.html"), "<html></html>");
const log = vi.spyOn(console, "log").mockImplementation(() => {});

Expand Down Expand Up @@ -423,7 +377,7 @@ describe("preview lifecycle JSON failures", () => {

describe("foreground preview JSON", () => {
it("emits the same ready session contract before remaining attached", () => {
const dir = projectWith(null);
const dir = tempProject();
expect(foregroundPreviewReadyPayload("Launch #1", "http://localhost:4567", dir, 4321)).toEqual({
schemaVersion: 1,
operation: "start",
Expand Down
Loading
Loading