Add HyperFrames skills
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011h6NB8JQtfPc6eRCefEzBB
This commit is contained in:
964 files changed
+142321
No files matched your search
@@ -0,0 +1,92 @@
|
||||
<!--
|
||||
Frame: clean — no decoration. Raw video edge.
|
||||
─────────────────────────────────────────────────────────────────────
|
||||
When to use
|
||||
- Default; safest.
|
||||
- Pairs with any layout and any style.
|
||||
- Required over the `overlay` layout (decorative frames clash with full-bleed video).
|
||||
|
||||
How to apply in the composition
|
||||
No extra HTML — just leave #video-wrap without the `framed` class.
|
||||
|
||||
.video-wrapper { border-radius: 0; box-shadow: none; }
|
||||
|
||||
How to apply on PiP layouts
|
||||
Even with `clean`, PiPs benefit from a 14px border-radius + soft shadow
|
||||
(see layouts/pip.html). That's a layout-level treatment, not a frame.
|
||||
|
||||
Placement
|
||||
None. This reference exists as documentation of the "no-frame" option.
|
||||
-->
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>frame · clean (no decoration)</title>
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: #0a0c12;
|
||||
color: #fff;
|
||||
font-family: ui-sans-serif, system-ui, sans-serif;
|
||||
}
|
||||
.stage {
|
||||
position: relative;
|
||||
width: 1920px;
|
||||
height: 1080px;
|
||||
transform-origin: top left;
|
||||
transform: scale(0.5);
|
||||
background: #0a0c12;
|
||||
overflow: hidden;
|
||||
}
|
||||
.video-wrap {
|
||||
position: absolute;
|
||||
left: 240px;
|
||||
top: 140px;
|
||||
width: 1440px;
|
||||
height: 810px;
|
||||
background: #1a1f2e;
|
||||
background-image: repeating-linear-gradient(
|
||||
45deg,
|
||||
transparent 0 12px,
|
||||
rgba(255, 255, 255, 0.05) 12px 13px
|
||||
);
|
||||
}
|
||||
.v-label {
|
||||
position: absolute;
|
||||
left: 24px;
|
||||
top: 24px;
|
||||
padding: 8px 14px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.45);
|
||||
border-radius: 3px;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font:
|
||||
600 16px/1 ui-monospace,
|
||||
monospace;
|
||||
letter-spacing: 0.14em;
|
||||
}
|
||||
.note {
|
||||
position: absolute;
|
||||
left: 240px;
|
||||
bottom: 60px;
|
||||
right: 240px;
|
||||
text-align: center;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
font:
|
||||
14px/1.4 ui-monospace,
|
||||
monospace;
|
||||
letter-spacing: 0.12em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="stage">
|
||||
<div class="video-wrap">
|
||||
<span class="v-label">VIDEO · no chrome</span>
|
||||
</div>
|
||||
<div class="note">CLEAN — let the video speak for itself.</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,171 @@
|
||||
<!--
|
||||
Frame: hairline — double stroke + four-corner viewfinder ticks
|
||||
─────────────────────────────────────────────────────────────────────
|
||||
When to use
|
||||
- Professional / cinematographic feel without going full polaroid.
|
||||
- Pairs well with: split, stack, pip layouts.
|
||||
- Pairs well with: academic, audit, swiss, terminal styles.
|
||||
- Skip on overlay layout — the decorative chrome clashes with full-bleed video.
|
||||
|
||||
How to apply in the composition
|
||||
Add ONE decorative div as a sibling of #video-wrap (not a child — the
|
||||
video element keeps its sound (data-has-audio="true") and plays inline,
|
||||
and the decorative div should sit above it). The accent color is configurable per scene.
|
||||
|
||||
<div class="video-wrapper" id="video-wrap">
|
||||
<video src="input-video.mp4" ...></video>
|
||||
</div>
|
||||
<div class="frame-deco frame-deco--hairline"
|
||||
style="left:240px; top:140px; width:1440px; height:810px;
|
||||
--frame-accent: #2557a7;">
|
||||
<span class="tick tl"></span>
|
||||
<span class="tick tr"></span>
|
||||
<span class="tick bl"></span>
|
||||
<span class="tick br"></span>
|
||||
</div>
|
||||
|
||||
CSS (4 corners via explicit spans — preferred over ::before/::after
|
||||
because pseudo-elements give you at most 2 corners cleanly):
|
||||
|
||||
.frame-deco { position: absolute; pointer-events: none; z-index: 3; }
|
||||
.frame-deco--hairline {
|
||||
box-shadow:
|
||||
inset 0 0 0 2px var(--frame-accent),
|
||||
inset 0 0 0 6px color-mix(in srgb, var(--frame-accent) 13%, transparent),
|
||||
0 0 0 1px rgba(0,0,0,.1);
|
||||
}
|
||||
.frame-deco .tick { position: absolute; width: 24px; height: 24px; }
|
||||
.frame-deco .tick.tl { top: -3px; left: -3px; border-top: 4px solid var(--frame-accent); border-left: 4px solid var(--frame-accent); }
|
||||
.frame-deco .tick.tr { top: -3px; right: -3px; border-top: 4px solid var(--frame-accent); border-right: 4px solid var(--frame-accent); }
|
||||
.frame-deco .tick.bl { bottom: -3px; left: -3px; border-bottom: 4px solid var(--frame-accent); border-left: 4px solid var(--frame-accent); }
|
||||
.frame-deco .tick.br { bottom: -3px; right: -3px; border-bottom: 4px solid var(--frame-accent); border-right: 4px solid var(--frame-accent); }
|
||||
|
||||
When the layout changes mid-composition
|
||||
Move + resize the frame-deco div together with #video-wrap using GSAP:
|
||||
tl.to('#video-wrap, .frame-deco', { left:, top:, width:, height:, ... }, T);
|
||||
Or fade out the deco entirely before transitioning to a clean PiP.
|
||||
-->
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>frame · hairline (double stroke + viewfinder ticks)</title>
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: #0a0c12;
|
||||
color: #fff;
|
||||
font-family: ui-sans-serif, system-ui, sans-serif;
|
||||
}
|
||||
.stage {
|
||||
position: relative;
|
||||
width: 1920px;
|
||||
height: 1080px;
|
||||
transform-origin: top left;
|
||||
transform: scale(0.5);
|
||||
background: #0a0c12;
|
||||
overflow: hidden;
|
||||
}
|
||||
.video-wrap {
|
||||
position: absolute;
|
||||
left: 240px;
|
||||
top: 140px;
|
||||
width: 1440px;
|
||||
height: 810px;
|
||||
background: #1a1f2e;
|
||||
background-image: repeating-linear-gradient(
|
||||
45deg,
|
||||
transparent 0 12px,
|
||||
rgba(255, 255, 255, 0.05) 12px 13px
|
||||
);
|
||||
}
|
||||
.v-label {
|
||||
position: absolute;
|
||||
left: 24px;
|
||||
top: 24px;
|
||||
padding: 8px 14px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.45);
|
||||
border-radius: 3px;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font:
|
||||
600 16px/1 ui-monospace,
|
||||
monospace;
|
||||
letter-spacing: 0.14em;
|
||||
}
|
||||
.frame-deco {
|
||||
position: absolute;
|
||||
left: 240px;
|
||||
top: 140px;
|
||||
width: 1440px;
|
||||
height: 810px;
|
||||
pointer-events: none;
|
||||
z-index: 3;
|
||||
--frame-accent: #2557a7;
|
||||
box-shadow:
|
||||
inset 0 0 0 2px var(--frame-accent),
|
||||
inset 0 0 0 6px rgba(37, 87, 167, 0.13),
|
||||
0 0 0 1px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.tick {
|
||||
position: absolute;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
.tick.tl {
|
||||
top: -3px;
|
||||
left: -3px;
|
||||
border-top: 4px solid var(--frame-accent, #2557a7);
|
||||
border-left: 4px solid var(--frame-accent, #2557a7);
|
||||
}
|
||||
.tick.tr {
|
||||
top: -3px;
|
||||
right: -3px;
|
||||
border-top: 4px solid var(--frame-accent, #2557a7);
|
||||
border-right: 4px solid var(--frame-accent, #2557a7);
|
||||
}
|
||||
.tick.bl {
|
||||
bottom: -3px;
|
||||
left: -3px;
|
||||
border-bottom: 4px solid var(--frame-accent, #2557a7);
|
||||
border-left: 4px solid var(--frame-accent, #2557a7);
|
||||
}
|
||||
.tick.br {
|
||||
bottom: -3px;
|
||||
right: -3px;
|
||||
border-bottom: 4px solid var(--frame-accent, #2557a7);
|
||||
border-right: 4px solid var(--frame-accent, #2557a7);
|
||||
}
|
||||
.note {
|
||||
position: absolute;
|
||||
left: 240px;
|
||||
bottom: 60px;
|
||||
right: 240px;
|
||||
text-align: center;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
font:
|
||||
14px/1.4 ui-monospace,
|
||||
monospace;
|
||||
letter-spacing: 0.12em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="stage">
|
||||
<div class="video-wrap">
|
||||
<span class="v-label">VIDEO</span>
|
||||
</div>
|
||||
<div class="frame-deco">
|
||||
<span class="tick tl"></span>
|
||||
<span class="tick tr"></span>
|
||||
<span class="tick bl"></span>
|
||||
<span class="tick br"></span>
|
||||
</div>
|
||||
<div class="note">
|
||||
HAIRLINE — double stroke (2px inner + soft 6px halo) + four-corner viewfinder ticks. Accent
|
||||
color matches the card style.
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,131 @@
|
||||
<!--
|
||||
Frame: polaroid — white photo frame + Caveat label + blue washi tape (no tilt)
|
||||
─────────────────────────────────────────────────────────────────────
|
||||
When to use
|
||||
- Casual, personal, warm feel. Looks great for interviews, memoirs, vlogs.
|
||||
- Pairs well with: split, stack, pip layouts.
|
||||
- Pairs well with: academic, whiteboard, editorial, xhs styles.
|
||||
- Skip on overlay layout (clashes with full-bleed).
|
||||
- In portrait PiP (narrow video bubble), polaroid gets cramped — prefer hairline.
|
||||
|
||||
IMPORTANT — NO TILT
|
||||
Earlier iterations of the design tilted the polaroid by -1.4° / 5°. User
|
||||
explicitly removed the tilt (chat L770–790). Keep the polaroid card,
|
||||
label, and washi tape all UPRIGHT.
|
||||
|
||||
How to apply in the composition
|
||||
Replace the bare #video-wrap with a wrapper div that draws the polaroid
|
||||
around it. The polaroid card has its own background + padding; the video
|
||||
sits inside a sub-region.
|
||||
|
||||
HTML pattern (use absolute positioning to fit the layout's video bounds):
|
||||
<div class="frame-deco frame-deco--polaroid"
|
||||
style="left:240px; top:140px; width:1440px; height:990px;">
|
||||
<div class="polaroid-card">
|
||||
<div class="polaroid-photo">
|
||||
<!-- the actual #video-wrap element, sized to fill -->
|
||||
<div class="video-wrapper" id="video-wrap">
|
||||
<video src="input-video.mp4" ...></video>
|
||||
</div>
|
||||
</div>
|
||||
<div class="polaroid-caption">speaker · 2026</div>
|
||||
</div>
|
||||
<div class="washi"></div>
|
||||
</div>
|
||||
|
||||
The video bounds in storyboard.json should be the OUTER polaroid bounds.
|
||||
The CSS inset values below carve out the inner photo area.
|
||||
|
||||
Suggested CSS
|
||||
.frame-deco--polaroid { position: absolute; }
|
||||
.polaroid-card {
|
||||
position: absolute; inset: 24px;
|
||||
background: #fefefe; padding: 14px 14px 64px;
|
||||
box-shadow: 0 28px 60px -18px rgba(0,0,0,.55),
|
||||
0 4px 12px rgba(0,0,0,.12);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.polaroid-photo {
|
||||
position: relative; width: 100%; height: calc(100% - 50px);
|
||||
overflow: hidden; background: #000;
|
||||
}
|
||||
.polaroid-photo .video-wrapper {
|
||||
position: absolute; inset: 0; width: 100%; height: 100%; border-radius: 0;
|
||||
}
|
||||
.polaroid-caption {
|
||||
position: absolute; bottom: 18px; left: 0; right: 0;
|
||||
text-align: center;
|
||||
font: 700 32px/1 "Caveat", ui-serif, cursive;
|
||||
color: #1d1c1a;
|
||||
}
|
||||
.washi {
|
||||
position: absolute; top: 12px; left: 20%;
|
||||
width: 120px; height: 28px;
|
||||
background: rgba(180,210,235,.85);
|
||||
background-image: repeating-linear-gradient(90deg,
|
||||
transparent 0 6px, rgba(255,255,255,.3) 6px 7px);
|
||||
box-shadow: 0 3px 8px rgba(0,0,0,.15);
|
||||
}
|
||||
-->
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>frame · polaroid (white photo frame + caveat label, no tilt)</title>
|
||||
<style>
|
||||
html, body { margin: 0; padding: 0; background: #0a0c12; color: #fff;
|
||||
font-family: ui-sans-serif, system-ui, sans-serif; }
|
||||
.stage { position: relative; width: 1920px; height: 1080px;
|
||||
transform-origin: top left; transform: scale(0.5);
|
||||
background: #0a0c12; overflow: hidden; }
|
||||
.frame-deco { position: absolute; left: 240px; top: 70px; width: 1440px; height: 940px; }
|
||||
.polaroid-card {
|
||||
position: absolute; inset: 24px;
|
||||
background: #fefefe; padding: 14px 14px 64px;
|
||||
box-shadow: 0 28px 60px -18px rgba(0,0,0,.55), 0 4px 12px rgba(0,0,0,.12);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.polaroid-photo {
|
||||
position: relative; width: 100%; height: calc(100% - 50px);
|
||||
overflow: hidden; background: #1a1f2e;
|
||||
background-image: repeating-linear-gradient(45deg,
|
||||
transparent 0 12px, rgba(255,255,255,.05) 12px 13px);
|
||||
}
|
||||
.v-label { position: absolute; left: 24px; top: 24px;
|
||||
padding: 8px 14px; border: 1px solid rgba(255,255,255,.45);
|
||||
border-radius: 3px; color: rgba(255,255,255,.7);
|
||||
font: 600 16px/1 ui-monospace, monospace; letter-spacing: .14em; }
|
||||
.polaroid-caption {
|
||||
position: absolute; bottom: 18px; left: 0; right: 0;
|
||||
text-align: center;
|
||||
font: 700 32px/1 "Caveat", ui-serif, cursive;
|
||||
color: #1d1c1a;
|
||||
}
|
||||
.washi {
|
||||
position: absolute; top: 12px; left: 20%;
|
||||
width: 120px; height: 28px;
|
||||
background: rgba(180,210,235,.85);
|
||||
background-image: repeating-linear-gradient(90deg,
|
||||
transparent 0 6px, rgba(255,255,255,.3) 6px 7px);
|
||||
box-shadow: 0 3px 8px rgba(0,0,0,.15);
|
||||
}
|
||||
.note { position: absolute; left: 240px; bottom: 18px; right: 240px;
|
||||
text-align: center; color: rgba(255,255,255,.5);
|
||||
font: 14px/1.4 ui-monospace, monospace; letter-spacing: .12em; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="stage">
|
||||
<div class="frame-deco">
|
||||
<div class="polaroid-card">
|
||||
<div class="polaroid-photo">
|
||||
<span class="v-label">VIDEO</span>
|
||||
</div>
|
||||
<div class="polaroid-caption">speaker · 2026</div>
|
||||
</div>
|
||||
<div class="washi"></div>
|
||||
</div>
|
||||
<div class="note">POLAROID — white frame, Caveat handwritten caption, blue washi tape on top. Upright (no tilt).</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user