chore: import upstream snapshot with attribution
regression / regression-shards (style-16-prod style-9-prod style-17-prod iframe-render-compat variables-prod mp4-h265-sdr, shard-4) (push) Has been cancelled
regression / regression-shards (style-4-prod style-11-prod style-2-prod animejs-adapter typegpu-adapter parallel-capture-regression, shard-5) (push) Has been cancelled
regression / regression-shards (style-7-prod style-8-prod style-10-prod css-spinner-render-compat webm-transparency mp4-h264-sdr webm-vp9, shard-3) (push) Has been cancelled
regression / regression-shards (sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector, shard-7) (push) Has been cancelled
Windows render verification / Detect changes (push) Has been cancelled
Windows render verification / Preflight (lint + format) (push) Has been cancelled
Windows render verification / Render on windows-latest (push) Has been cancelled
Windows render verification / Tests on windows-latest (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Fallow audit (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Producer: integration tests (push) Has been cancelled
CI / Producer: unit tests (push) Has been cancelled
CI / File size check (push) Has been cancelled
CI / Test: skills (push) Has been cancelled
CI / Skills: manifest in sync (push) Has been cancelled
CI / CLI: npx shim (macos-latest) (push) Has been cancelled
CI / CLI: npx shim (ubuntu-latest) (push) Has been cancelled
CI / CLI: npx shim (windows-latest) (push) Has been cancelled
CI / SDK: unit + contract + smoke (push) Has been cancelled
CI / Test: runtime contract (push) Has been cancelled
CI / Studio: load smoke (push) Has been cancelled
CI / Smoke: global install (push) Has been cancelled
CI / CLI smoke (required) (push) Has been cancelled
CI / Semantic PR title (push) Has been cancelled
Player perf / Detect changes (push) Has been cancelled
Player perf / Preflight (lint + format) (push) Has been cancelled
Player perf / player-perf (push) Has been cancelled
Player perf / Perf: drift (push) Has been cancelled
Player perf / Perf: fps (push) Has been cancelled
Player perf / Perf: parity (push) Has been cancelled
Player perf / Perf: scrub (push) Has been cancelled
Player perf / Perf: load (push) Has been cancelled
preview-regression / Detect changes (push) Has been cancelled
preview-regression / Preflight (lint + format) (push) Has been cancelled
preview-regression / Preview parity (push) Has been cancelled
preview-regression / preview-regression (push) Has been cancelled
regression / regression (push) Has been cancelled
regression / Detect changes (push) Has been cancelled
regression / Preflight (lint + format) (push) Has been cancelled
regression / regression-shards (hdr-regression style-5-prod style-3-prod mov-prores, shard-1) (push) Has been cancelled
regression / regression-shards (overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence portrait-edge-bleed, shard-6) (push) Has been cancelled
regression / regression-shards (style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat audio-mux-parity, shard-8) (push) Has been cancelled
regression / regression-shards (style-15-prod hdr-hlg-regression style-1-prod many-cuts vfr-screen-recording render-symlinked-assets, shard-2) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docs / Validate docs (push) Has been cancelled
Sync skills to ClawHub / Publish changed skills (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 12:58:35 +08:00
commit 85453da49f
4031 changed files with 710987 additions and 0 deletions
+90
View File
@@ -0,0 +1,90 @@
# Airbnb Seed Deck — Design Notes
## Intent
A premium remake of Airbnb's 2009 seed pitch deck using current Airbnb brand language.
The composition should feel warm, human, and tasteful — the opposite of a tech startup
dark-mode deck. White canvas, generous space, soft coral accents. Three.js backgrounds
are elegant mood-setters, never distracting.
## Color Palette
| Token | Value | Use |
| ---------------- | --------- | ------------------------------------ |
| Rausch (primary) | `#FF385C` | CTAs, logo, accent bars, highlights |
| Coral warm | `#FF5A5F` | Gradient partner to Rausch |
| Babu dark | `#E61E4D` | Hover / emphasis gradient endpoint |
| Off-white | `#FFFFFF` | Slide background on light slides |
| Hof dark | `#222222` | Primary text; dramatic dark slide bg |
| Foggy gray | `#717171` | Body copy, captions, secondary text |
| Arches light | `#F7F7F7` | Card backgrounds, subtle panel fills |
| Arches pink | `#FFF1F1` | Soft pink tint for card areas |
Do not introduce blue, purple, or green accents. The palette is warm coral + neutral.
## Typography
**Font**: "Nunito Sans" from Google Fonts — geometric, rounded, friendly.
Fallback stack: `"Nunito Sans", "Montserrat", system-ui, sans-serif`.
| Role | Size (1920×1080) | Weight |
| -------- | ---------------- | ----------------- |
| Headline | 8096px | 800 |
| Subhead | 48px | 400 |
| Body | 4044px | 400600 |
| Eyebrow | 2832px | 700, letterspaced |
| Numbers | 96120px | 900 |
Minimum readable size: 40px. Never go below that for audience-facing text.
## The Bélo Logo
The Bélo is Airbnb's universal belonging mark — a rounded loop that is simultaneously
a heart, a location pin, and a letter A. Reproduce it as inline SVG in Rausch `#FF385C`.
Use on: cover slide (large, centered), corner mark on every slide (48×48px, top-left).
Do NOT stretch or recolor the Bélo. Pair with lowercase "airbnb" wordmark in `#222222`.
## Layout Language
- **Generous whitespace**: 120px top/bottom padding, 160px left/right on 1920px canvas.
- **Rounded corners**: 1624px on all cards and stat blocks.
- **Soft shadows**: `box-shadow: 0 4px 24px rgba(0,0,0,0.08)` for cards.
- White or very light slide backgrounds for most slides (readable and clean).
- Dark background (`#222222`) for: Cover (optional dramatic variant), Team, Ask.
- Keep layouts left-aligned or centered — never right-heavy.
## Three.js Background Moods (per-slide)
Backgrounds run on a persistent WebGL canvas behind all slide content.
All animations use a fixed seed (no `Math.random()`); seeded using a deterministic LCG.
Particle counts, positions, and velocities are computed from seeded values.
| Slide | Mood |
| ------------- | ------------------------------------------------------------------- |
| cover | Soft floating coral particles, slow upward drift, warm pink fog |
| problem | Desaturated gray particles, slower/heavier motion, cooler hue |
| solution | Coral bloom: particles converge inward, warm pulse |
| market | Low-poly globe outline with soft arc routes in coral, gentle rotate |
| product | Clean minimal — very subtle grid of pale dots, nearly static |
| business | Same as product — minimal |
| adoption | Sparse warm nodes with thin connecting lines (network graph feel) |
| competition | Cool gray minimal — positioning matrix backdrop |
| team | Soft bokeh: large blurred coral orbs, slow parallax |
| ask | Coral gradient swell — warm radial from center, slow pulse |
| market-sizing | Same globe as market, camera zoomed in, arcs highlighted |
## Do's
- Large, single-stat slides for numbers ($2.1B, $500K) — let the number breathe.
- Bottom-up math shown explicitly: trips × take-rate = revenue.
- Complete-sentence headlines that make a claim, not a label.
- SVG Bélo mark consistent across slides.
## Don'ts
- No dark purple, electric blue, neon green.
- No hero imagery or stock photos (pure typography + Three.js + SVG).
- No glassmorphism, frosted panels, or gamer-aesthetic effects.
- No unseeded random values — all Three.js positions must be deterministic.
- No font below 40px for any audience-visible text.
+187
View File
@@ -0,0 +1,187 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Airbnb 2009 Seed Deck — Slideshow Demo</title>
<script src="../../../packages/player/dist/hyperframes-player.global.js"></script>
<script src="../../../packages/player/dist/slideshow/hyperframes-slideshow.global.js"></script>
<style>
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
overflow: hidden;
background: #111;
}
</style>
</head>
<body>
<!--
NOTE: The <script type="application/hyperframes-slideshow+json"> island below is a
COPY of the island inside index.html. This duplication is intentional: <hyperframes-slideshow>
reads the island from its OWN innerHTML (not from the composition loaded by
<hyperframes-player>). Keep this copy in sync with the island in index.html whenever
slides, fragments, hotspots, or sequences change.
-->
<hyperframes-slideshow tabindex="0" sound style="display: block; position: relative; width: 100vw; height: 100vh">
<hyperframes-player
style="position: absolute; inset: 0"
src="index.html"
></hyperframes-player>
<script type="application/hyperframes-slideshow+json">
{
"slides": [
{
"sceneId": "cover",
"notes": "Open with the tagline. Let the Bélo breathe. This is the belonging company."
},
{
"sceneId": "problem",
"notes": "Two problems, one at a time. Price first — hotels are expensive. Then connection.",
"fragments": [9.3, 9.6]
},
{
"sceneId": "solution",
"notes": "Platform connects hosts and travelers. Belong anywhere. Three value props."
},
{
"sceneId": "validation",
"notes": "Couchsurfing proves demand: 660k members want this. Craigslist shows supply side."
},
{
"sceneId": "market",
"notes": "Bottom-up: trips × take-rate = $2.1B. Use the hotspot for the drill-down math.",
"hotspots": [
{
"id": "mkt-hotspot",
"label": "Show me the math",
"target": "market-math-detail",
"region": { "x": 70, "y": 80, "w": 25, "h": 12 }
}
]
},
{
"sceneId": "product",
"notes": "Three clicks: Search, Book, Travel. Show the booking flow simplicity."
},
{
"sceneId": "business",
"notes": "10% commission. At 80k transactions × $26 avg nightly take = $2.1M revenue."
},
{
"sceneId": "adoption",
"notes": "Events, conferences, Craigslist cross-posting, partnerships. Grass-roots growth."
},
{
"sceneId": "competition",
"notes": "Matrix: cheapest + online + transaction. Airbnb is the only one that hits all three."
},
{
"sceneId": "team",
"notes": "Brian (CEO/design), Joe (design), Nate (engineering). Domain depth: housing + tech."
},
{
"sceneId": "ask",
"notes": "Raising $500K. 12 months runway. Target: 80K transactions ≈ $2M revenue."
}
],
"slideSequences": [
{
"id": "market-math-detail",
"label": "Market sizing methodology",
"slides": [
{
"sceneId": "market-sizing",
"notes": "Bottom-up drill: global trips × budget share × online booking rate × take-rate = $2.1B."
}
]
}
]
}
</script>
</hyperframes-slideshow>
<!--
Sound effects play HERE, in the parent document. The composition (loaded in the
player's iframe) detects slide/fragment/branch transitions and posts
{ type: 'hf-sfx', name } to the parent. Audio must live in the frame that
receives the user's gesture (the parent) — an iframe without its own user
activation is autoplay-blocked. The mp3s are in sfx/ next to this file.
Mute state is owned by <hyperframes-slideshow sound>. Listen for 'hf-sound'
events (or read slideshow.muted / data-hf-muted) to skip playback when muted.
-->
<script>
(function () {
var clips = {
advance: new Audio("sfx/advance.mp3"),
fragment: new Audio("sfx/fragment.mp3"),
"branch-enter": new Audio("sfx/branch-enter.mp3"),
back: new Audio("sfx/back.mp3"),
};
clips.advance.volume = 0.45;
clips.fragment.volume = 0.4;
clips["branch-enter"].volume = 0.4;
clips.back.volume = 0.4;
for (var k in clips) clips[k].preload = "auto";
// Track mute state: updated via 'hf-sound' events from the slideshow chrome.
var muted = false;
var slideshow = document.querySelector("hyperframes-slideshow");
if (slideshow) {
slideshow.addEventListener("hf-sound", function (e) {
muted = e.detail && e.detail.muted === true;
});
}
var unlocked = false;
function unlock() {
if (unlocked) return;
unlocked = true;
// Prime each clip (play muted then reset) so later plays are instant + allowed.
Object.keys(clips).forEach(function (name) {
var el = clips[name];
var v = el.volume;
el.volume = 0;
el.play()
.then(function () {
el.pause();
el.currentTime = 0;
el.volume = v;
})
.catch(function () {
el.volume = v;
});
});
}
window.addEventListener("keydown", unlock, true);
window.addEventListener("pointerdown", unlock, true);
window.addEventListener("click", unlock, true);
window.addEventListener("message", function (e) {
var d = e.data;
if (!d || d.type !== "hf-sfx") return;
// Skip playback when muted — the component owns mute state.
if (muted) return;
var el = clips[d.name];
if (!el || !unlocked) return;
try {
el.currentTime = 0;
el.play().catch(function () {});
} catch (err) {
/* ignore */
}
});
})();
</script>
</body>
</html>
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+56
View File
@@ -0,0 +1,56 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Decision Tree</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #ffffff;
font-family: "Inter", sans-serif;
}
</style>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=block"
rel="stylesheet"
/>
</head>
<body>
<div
id="root"
data-composition-id="main"
data-start="0"
data-duration="10"
data-width="1920"
data-height="1080"
>
<div
id="decision-tree-comp"
data-composition-id="decision-tree"
data-composition-src="compositions/decision_tree.html"
data-start="0"
data-duration="10"
data-track-index="0"
data-width="1920"
data-height="1080"
></div>
</div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
window.__timelines["main"] = tl;
</script>
</body>
</html>
@@ -0,0 +1,24 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "decision-tree",
"type": "hyperframes:example",
"title": "Decision Tree",
"description": "Animated flowchart with branching paths",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 15,
"files": [
{
"path": "compositions/decision_tree.html",
"target": "compositions/decision_tree.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
+99
View File
@@ -0,0 +1,99 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Kinetic Type</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,700;0,900;1,400&family=Playfair+Display:ital,wght@0,400;0,700;1,400&display=block"
rel="stylesheet"
/>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background-color: #0a0a0f;
font-family: "Inter", sans-serif;
}
</style>
</head>
<body>
<div
id="root"
data-composition-id="main"
data-start="0"
data-duration="15"
data-width="1920"
data-height="1080"
>
<!--
A-Roll video. Media is only seeked/decoded when it is a DIRECT child of
the host root, so the footage lives here (not inside the sub-composition
template) and its per-scene reveal is driven on the main timeline below.
-->
<video
id="a-roll-video"
class="clip"
src="https://gen-os-static.s3.us-east-2.amazonaws.com/astral_assets/uploaded_assets/67cf5a05_e134ec83a57042b38776c952da595870.mp4"
data-start="0"
data-duration="14.72"
data-track-index="0"
data-has-audio="true"
playsinline
style="
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 0;
opacity: 0;
"
></video>
<div
id="graphics-layer"
data-composition-id="main-graphics"
data-composition-src="compositions/main-graphics.html"
data-start="0"
data-duration="15"
data-track-index="1"
data-width="1920"
data-height="1080"
style="position: absolute; inset: 0; z-index: 1"
></div>
</div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
// The A-roll <video> is a host-root element, so the sub-composition
// timeline cannot reach it. Drive its reveal here on the main timeline at
// global time (the graphics sub-comp starts at 0, so scene-local == global).
//
// COUPLING: the reveal/hide times below (2.2 / 11.7 / 13.5) are hand-tuned
// to the graphics-layer sub-composition's scene boundaries and assume it is
// mounted at data-start="0". If you re-time the sub-composition's scenes or
// change its data-start, these absolute times drift out of alignment and
// must be updated to match the new scene boundaries.
tl.set("#a-roll-video", { opacity: 0 }, 0);
tl.set("#a-roll-video", { opacity: 1 }, 2.2); // reveal after the Scene 1 white wipe
tl.to("#a-roll-video", { opacity: 0, duration: 0.4 }, 11.7); // hide for the Wes Anderson scene
tl.set("#a-roll-video", { opacity: 1 }, 13.5); // back for the Vignelli outro
window.__timelines["main"] = tl;
</script>
</body>
</html>
@@ -0,0 +1,24 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "kinetic-type",
"type": "hyperframes:example",
"title": "Kinetic Type",
"description": "Bold kinetic typography promo",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 15,
"files": [
{
"path": "compositions/main-graphics.html",
"target": "compositions/main-graphics.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
+572
View File
@@ -0,0 +1,572 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Motion Blur — Velocity Showcase</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #06060a;
}
#comp {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
font-family: "SF Mono", ui-monospace, monospace;
background: #06060a;
}
.header {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 80px;
display: flex;
align-items: flex-end;
padding: 0 72px 20px;
border-bottom: 1px solid #0f0f18;
}
.header-title {
font-size: 11px;
letter-spacing: 0.4em;
text-transform: uppercase;
color: #1e1e2a;
}
.header-sub {
margin-left: auto;
font-size: 11px;
letter-spacing: 0.25em;
text-transform: uppercase;
color: #14141c;
}
/* Each group = one speed level, containing a shape row + text row */
.group {
position: absolute;
left: 0;
right: 0;
height: 184px; /* 72 + 16 + 72 + 24 bottom */
}
/* Group bottom separator */
.group::after {
content: "";
position: absolute;
bottom: 0;
left: 72px;
right: 72px;
height: 1px;
background: #0d0d15;
}
/* Duration label — left, spanning both rows */
.dur {
position: absolute;
left: 72px;
top: 0;
width: 90px;
height: 160px; /* 72+16+72 */
display: flex;
flex-direction: column;
justify-content: center;
}
.dur-num {
font-size: 28px;
font-weight: 700;
letter-spacing: -0.04em;
color: #fff;
line-height: 1;
}
.dur-unit {
font-size: 9px;
letter-spacing: 0.25em;
text-transform: uppercase;
color: #252532;
margin-top: 5px;
}
/* Row-type hint ("shape" / "text") — right of dur label */
.row-hint {
position: absolute;
left: 176px;
width: 44px;
height: 72px;
display: flex;
align-items: center;
font-size: 8px;
letter-spacing: 0.2em;
text-transform: uppercase;
color: #161620;
}
/* Speed label — right, spanning both rows */
.spd {
position: absolute;
right: 72px;
top: 0;
width: 100px;
height: 160px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-end;
}
.spd-label {
font-size: 10px;
letter-spacing: 0.3em;
text-transform: uppercase;
color: #181822;
}
/* Animated elements — both types live at left:0, GSAP drives x */
.pill {
position: absolute;
left: 0;
top: 0;
width: 200px;
height: 72px;
border-radius: 36px;
will-change: transform, filter;
}
.word {
position: absolute;
left: 0;
top: 88px; /* 72 + 16 gap */
height: 72px;
line-height: 72px;
white-space: nowrap;
font-size: 56px;
font-weight: 800;
letter-spacing: -0.03em;
will-change: transform, filter;
}
/* Inner divider between shape row and text row */
.inner-div {
position: absolute;
left: 220px;
right: 200px;
top: 80px; /* 72 + 8 */
height: 1px;
background: #0a0a12;
}
/* Track guide lines */
.track-a,
.track-b {
position: absolute;
left: 220px;
right: 200px;
height: 1px;
background: #0c0c14;
}
.track-a {
top: 35px;
} /* center of shape row */
.track-b {
top: 123px;
} /* 88 + 35 = center of text row */
</style>
</head>
<body>
<div
id="comp"
data-composition-id="motion-blur-example"
data-width="1920"
data-height="1080"
data-start="0"
data-duration="4"
>
<div class="header" data-layout-ignore>
<span class="header-title">Motion Blur — Velocity Showcase</span>
<span class="header-sub">feGaussianBlur + scaleX · blur ∝ velocity</span>
</div>
<!-- Group 1: 3.0s slow — top: 80 -->
<div class="group" style="top: 80px">
<div class="dur" data-layout-ignore>
<span class="dur-num">3.0</span><span class="dur-unit">seconds</span>
</div>
<div class="row-hint" data-layout-ignore style="top: 0">shape</div>
<div class="row-hint" data-layout-ignore style="top: 88px">text</div>
<div class="track-a"></div>
<div class="inner-div"></div>
<div class="track-b"></div>
<div
class="pill"
id="s1"
style="
background: linear-gradient(135deg, #60a5fa, #2563eb);
box-shadow: 0 0 32px rgba(96, 165, 250, 0.18);
"
></div>
<div
class="word"
id="t1"
style="color: #3b82f6; text-shadow: 0 0 40px rgba(96, 165, 250, 0.3)"
>
DRIFT
</div>
<div class="spd" data-layout-ignore><span class="spd-label">slow</span></div>
</div>
<!-- Group 2: 1.5s medium — top: 264 -->
<div class="group" style="top: 264px">
<div class="dur" data-layout-ignore>
<span class="dur-num">1.5</span><span class="dur-unit">seconds</span>
</div>
<div class="row-hint" data-layout-ignore style="top: 0">shape</div>
<div class="row-hint" data-layout-ignore style="top: 88px">text</div>
<div class="track-a"></div>
<div class="inner-div"></div>
<div class="track-b"></div>
<div
class="pill"
id="s2"
style="
background: linear-gradient(135deg, #34d399, #059669);
box-shadow: 0 0 32px rgba(52, 211, 153, 0.18);
"
></div>
<div
class="word"
id="t2"
style="color: #10b981; text-shadow: 0 0 40px rgba(52, 211, 153, 0.3)"
>
GLIDE
</div>
<div class="spd" data-layout-ignore><span class="spd-label">medium</span></div>
</div>
<!-- Group 3: 0.7s fast — top: 448 -->
<div class="group" style="top: 448px">
<div class="dur" data-layout-ignore>
<span class="dur-num">0.7</span><span class="dur-unit">seconds</span>
</div>
<div class="row-hint" data-layout-ignore style="top: 0">shape</div>
<div class="row-hint" data-layout-ignore style="top: 88px">text</div>
<div class="track-a"></div>
<div class="inner-div"></div>
<div class="track-b"></div>
<div
class="pill"
id="s3"
style="
background: linear-gradient(135deg, #c084fc, #7c3aed);
box-shadow: 0 0 32px rgba(192, 132, 252, 0.18);
"
></div>
<div
class="word"
id="t3"
style="color: #a855f7; text-shadow: 0 0 40px rgba(192, 132, 252, 0.3)"
>
RUSH
</div>
<div class="spd" data-layout-ignore><span class="spd-label">fast</span></div>
</div>
<!-- Group 4: 0.35s faster — top: 632 -->
<div class="group" style="top: 632px">
<div class="dur" data-layout-ignore>
<span class="dur-num">0.35</span><span class="dur-unit">seconds</span>
</div>
<div class="row-hint" data-layout-ignore style="top: 0">shape</div>
<div class="row-hint" data-layout-ignore style="top: 88px">text</div>
<div class="track-a"></div>
<div class="inner-div"></div>
<div class="track-b"></div>
<div
class="pill"
id="s4"
style="
background: linear-gradient(135deg, #fb923c, #ea580c);
box-shadow: 0 0 32px rgba(251, 146, 60, 0.18);
"
></div>
<div
class="word"
id="t4"
style="color: #f97316; text-shadow: 0 0 40px rgba(251, 146, 60, 0.3)"
>
BLAST
</div>
<div class="spd" data-layout-ignore><span class="spd-label">faster</span></div>
</div>
<!-- Group 5: 0.2s extreme — top: 816 -->
<div class="group" style="top: 816px">
<div class="dur" data-layout-ignore>
<span class="dur-num">0.2</span><span class="dur-unit">seconds</span>
</div>
<div class="row-hint" data-layout-ignore style="top: 0">shape</div>
<div class="row-hint" data-layout-ignore style="top: 88px">text</div>
<div class="track-a"></div>
<div class="inner-div"></div>
<div class="track-b"></div>
<div
class="pill"
id="s5"
style="
background: linear-gradient(135deg, #f87171, #dc2626);
box-shadow: 0 0 32px rgba(248, 113, 113, 0.18);
"
></div>
<div
class="word"
id="t5"
style="color: #ef4444; text-shadow: 0 0 40px rgba(248, 113, 113, 0.3)"
>
WARP
</div>
<div class="spd" data-layout-ignore><span class="spd-label">extreme</span></div>
</div>
<script>
(function () {
/* ── attachMotionBlur ─────────────────────────────────────── */
if (!window._hfMbUid) window._hfMbUid = 0;
var ns = "http://www.w3.org/2000/svg";
function attachMotionBlur(selector, tl, opts) {
opts = opts || {};
var blurScale = opts.blurScale !== undefined ? opts.blurScale : 0.008;
var blurMax = opts.blurMax !== undefined ? opts.blurMax : 20;
var stretchScale = opts.stretchScale !== undefined ? opts.stretchScale : 0.0002;
var stretchMax = opts.stretchMax !== undefined ? opts.stretchMax : 0;
var axis = opts.axis || "both";
var items = Array.isArray(selector) ? selector : [selector];
var targets = items.reduce(function (acc, s) {
if (typeof s === "string") {
document.querySelectorAll(s).forEach(function (el) {
acc.push(el);
});
} else if (s instanceof Element) {
acc.push(s);
}
return acc;
}, []);
// Ghost trail: copies placed only behind the element → inherently one-sided.
// Top layer: small Gaussian at current position so element looks blurry, not sharp.
var GHOST_CFG = [
{ frac: 0.25, slope: 0.55 },
{ frac: 0.55, slope: 0.28 },
{ frac: 1.0, slope: 0.1 },
];
var state = targets.map(function (el) {
var uid = "hf-mb-" + window._hfMbUid++;
var svg = document.createElementNS(ns, "svg");
svg.setAttribute("style", "position:absolute;width:0;height:0;overflow:hidden;");
var filter = document.createElementNS(ns, "filter");
filter.id = uid;
filter.setAttribute("x", "-110%");
filter.setAttribute("y", "-25%");
filter.setAttribute("width", "260%");
filter.setAttribute("height", "150%");
var ghosts = GHOST_CFG.map(function (cfg, gi) {
var feOff = document.createElementNS(ns, "feOffset");
feOff.setAttribute("in", "SourceGraphic");
feOff.setAttribute("dx", "0");
feOff.setAttribute("dy", "0");
feOff.setAttribute("result", "go" + gi);
var feGB = document.createElementNS(ns, "feGaussianBlur");
feGB.setAttribute("in", "go" + gi);
feGB.setAttribute("stdDeviation", "0 0");
feGB.setAttribute("result", "gb" + gi);
var feCT = document.createElementNS(ns, "feComponentTransfer");
feCT.setAttribute("in", "gb" + gi);
feCT.setAttribute("result", "gf" + gi);
var feFuncA = document.createElementNS(ns, "feFuncA");
feFuncA.setAttribute("type", "linear");
feFuncA.setAttribute("slope", String(cfg.slope));
feCT.appendChild(feFuncA);
filter.appendChild(feOff);
filter.appendChild(feGB);
filter.appendChild(feCT);
return { feOff: feOff, feGB: feGB, frac: cfg.frac };
});
var feTopBlur = document.createElementNS(ns, "feGaussianBlur");
feTopBlur.setAttribute("in", "SourceGraphic");
feTopBlur.setAttribute("stdDeviation", "0 0");
feTopBlur.setAttribute("result", "top");
filter.appendChild(feTopBlur);
var feMerge = document.createElementNS(ns, "feMerge");
for (var mi = GHOST_CFG.length - 1; mi >= 0; mi--) {
var mn = document.createElementNS(ns, "feMergeNode");
mn.setAttribute("in", "gf" + mi);
feMerge.appendChild(mn);
}
var mnTop = document.createElementNS(ns, "feMergeNode");
mnTop.setAttribute("in", "top");
feMerge.appendChild(mnTop);
filter.appendChild(feMerge);
svg.appendChild(filter);
document.body.appendChild(svg);
return {
el: el,
ghosts: ghosts,
feTopBlur: feTopBlur,
filterId: uid,
prevX: parseFloat(gsap.getProperty(el, "x")) || 0,
prevY: parseFloat(gsap.getProperty(el, "y")) || 0,
prevTime: tl.time(),
};
});
// tl.eventCallback("onUpdate") is not available in the HyperFrames renderer —
// the runtime proxies the timeline. Tween onUpdate fires on every seek instead.
var _proxy = { t: 0 };
tl.to(
_proxy,
{
t: 1,
duration: Math.max(tl.duration(), 0.1),
ease: "none",
onUpdate: function () {
var time = tl.time();
state.forEach(function (s) {
var x = parseFloat(gsap.getProperty(s.el, "x")) || 0;
var y = parseFloat(gsap.getProperty(s.el, "y")) || 0;
var dt = time - s.prevTime;
if (dt > 0.0005) {
var vx = axis !== "y" ? (x - s.prevX) / dt : 0;
var vy = axis !== "x" ? (y - s.prevY) / dt : 0;
var bx = Math.min(Math.abs(vx) * blurScale, blurMax);
var by = Math.min(Math.abs(vy) * blurScale, blurMax);
var bxFinal = axis !== "y" ? bx : Math.max(by * 0.08, 0.4);
var byFinal = axis !== "x" ? by : Math.max(bx * 0.08, 0.4);
var active = bx > 0.3 || by > 0.3;
if (active) {
s.el.style.filter = "url(#" + s.filterId + ")";
s.ghosts.forEach(function (g) {
var dx =
axis !== "y" ? (vx >= 0 ? -bxFinal * g.frac : bxFinal * g.frac) : 0;
var dy =
axis !== "x" ? (vy >= 0 ? -byFinal * g.frac : byFinal * g.frac) : 0;
g.feOff.setAttribute("dx", dx.toFixed(2));
g.feOff.setAttribute("dy", dy.toFixed(2));
var gbx =
axis !== "y"
? (bxFinal * g.frac * 0.5).toFixed(2)
: Math.max(byFinal * g.frac * 0.04, 0.4).toFixed(2);
var gby =
axis !== "x"
? (byFinal * g.frac * 0.5).toFixed(2)
: Math.max(bxFinal * g.frac * 0.04, 0.4).toFixed(2);
g.feGB.setAttribute("stdDeviation", gbx + " " + gby);
});
s.feTopBlur.setAttribute(
"stdDeviation",
(bxFinal * 0.15).toFixed(2) + " " + (byFinal * 0.15).toFixed(2),
);
if (stretchMax > 0) {
var sx = 1 + Math.min(Math.abs(vx) * stretchScale, stretchMax);
var sy = 1 + Math.min(Math.abs(vy) * stretchScale, stretchMax);
var ox = axis !== "y" ? (vx >= 0 ? "100% 50%" : "0% 50%") : "50% 50%";
var oy = axis !== "x" ? (vy >= 0 ? "50% 100%" : "50% 0%") : "50% 50%";
gsap.set(s.el, {
scaleX: axis !== "y" ? sx : 1,
scaleY: axis !== "x" ? sy : 1,
transformOrigin: axis === "x" ? ox : axis === "y" ? oy : "50% 50%",
});
}
} else {
s.el.style.filter = "";
s.ghosts.forEach(function (g) {
g.feOff.setAttribute("dx", "0");
g.feOff.setAttribute("dy", "0");
g.feGB.setAttribute("stdDeviation", "0 0");
});
s.feTopBlur.setAttribute("stdDeviation", "0 0");
if (stretchMax > 0) {
gsap.set(s.el, { scaleX: 1, scaleY: 1, transformOrigin: "50% 50%" });
}
}
s.prevX = x;
s.prevY = y;
s.prevTime = time;
} else if (dt < -0.0005) {
s.el.style.filter = "";
s.ghosts.forEach(function (g) {
g.feOff.setAttribute("dx", "0");
g.feOff.setAttribute("dy", "0");
g.feGB.setAttribute("stdDeviation", "0 0");
});
s.feTopBlur.setAttribute("stdDeviation", "0 0");
if (stretchMax > 0) {
gsap.set(s.el, { scaleX: 1, scaleY: 1, transformOrigin: "50% 50%" });
}
s.prevX = x;
s.prevY = y;
s.prevTime = time;
}
// dt ≈ 0: runtime double-fires — skip.
});
},
},
0,
);
}
/* ── Timeline ─────────────────────────────────────────────── */
var tl = gsap.timeline({ paused: true });
// All elements start at x=-400 (off-screen left), travel to x=1920 (off-screen right).
// Shape + text in each group share the same duration → same velocity → same blur.
gsap.set(["#s1", "#s2", "#s3", "#s4", "#s5", "#t1", "#t2", "#t3", "#t4", "#t5"], {
x: -400,
});
tl.to(["#s1", "#t1"], { x: 1640, duration: 3.0, ease: "power3.inOut" }, 0);
tl.to(["#s2", "#t2"], { x: 1640, duration: 1.5, ease: "power3.inOut" }, 0);
tl.to(["#s3", "#t3"], { x: 1640, duration: 0.7, ease: "power3.inOut" }, 0);
tl.to(["#s4", "#t4"], { x: 1640, duration: 0.35, ease: "power3.inOut" }, 0);
tl.to(["#s5", "#t5"], { x: 1640, duration: 0.2, ease: "power3.inOut" }, 0);
tl.set(document.body, {}, 4);
attachMotionBlur(
["#s1", "#s2", "#s3", "#s4", "#s5", "#t1", "#t2", "#t3", "#t4", "#t5"],
tl,
{ axis: "x", blurMax: 80, stretchMax: 0 },
);
window.__timelines = window.__timelines || {};
window.__timelines["motion-blur-example"] = tl;
})();
</script>
</div>
</body>
</html>
+51
View File
@@ -0,0 +1,51 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>NYT Graph</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background-color: #faf9f6;
}
</style>
</head>
<body>
<div
id="root"
data-composition-id="main"
data-start="0"
data-duration="15"
data-width="1920"
data-height="1080"
>
<div
id="nyt-chart-comp"
data-composition-id="nyt-chart"
data-composition-src="compositions/nyt-chart.html"
data-start="0"
data-duration="15"
data-track-index="0"
data-width="1920"
data-height="1080"
></div>
</div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
window.__timelines["main"] = tl;
</script>
</body>
</html>
@@ -0,0 +1,24 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "nyt-graph",
"type": "hyperframes:example",
"title": "NYT Graph",
"description": "Animated data chart in print editorial style",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 15,
"files": [
{
"path": "compositions/nyt-chart.html",
"target": "compositions/nyt-chart.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
+229
View File
@@ -0,0 +1,229 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Hyperframes - Play Mode</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
body,
html {
margin: 0;
padding: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background-color: #ffffff;
font-family: "Nunito", sans-serif;
}
#main-composition {
width: 1920px;
height: 1080px;
position: relative;
}
#bg-comp,
#aroll-comp,
#intro-comp,
#stats-comp,
#captions-comp {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#bg-comp {
z-index: 1;
}
#aroll-comp {
z-index: 10;
}
#intro-comp {
z-index: 100;
}
#stats-comp {
z-index: 150;
}
#captions-comp {
z-index: 200;
}
#aroll-container {
position: absolute;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
z-index: 0;
}
#short_mag_cut {
border-radius: 16px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
border: 8px solid #ffffff;
}
#background-layer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #ffffff;
z-index: 0;
}
</style>
<link
href="https://fonts.googleapis.com/css2?family=Nunito:wght@900&display=swap"
rel="stylesheet"
/>
</head>
<body>
<div
id="main-composition"
data-composition-id="main-video"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-width="1920"
data-height="1080"
>
<!-- Background Layer Composition -->
<div
id="bg-comp"
data-composition-id="background"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-width="1920"
data-height="1080"
data-track-index="1"
>
<div id="background-layer"></div>
<style>
#background-layer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #ffffff;
}
</style>
<script>
(function () {
const tl = gsap.timeline({ paused: true });
const bg = document.getElementById("background-layer");
// Sync with A-roll framing 3 (4.659s)
tl.to(bg, { backgroundColor: "#0057FF", duration: 0.5 }, 4.659);
// Sync with A-roll framing 4 (8.88s)
tl.to(bg, { backgroundColor: "#FFFFFF", duration: 0.5 }, 8.88);
window.__timelines["background"] = tl;
})();
</script>
</div>
<!-- A-roll Layer Composition -->
<div
id="aroll-comp"
data-composition-id="aroll-layer"
data-duration="__VIDEO_DURATION__"
data-width="1920"
data-height="1080"
data-track-index="10"
>
<div id="aroll-container">
<video
id="short_mag_cut"
src="__VIDEO_SRC__"
muted
playsinline
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="1"
style="width: 100%; height: auto"
></video>
</div>
<audio
id="a-roll-audio"
src="__VIDEO_SRC__"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="5"
data-volume="1"
></audio>
<style>
#aroll-container {
position: absolute;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
#short_mag_cut {
border-radius: 16px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
border: 8px solid #ffffff;
}
</style>
<script>
(function () {
const tl = gsap.timeline({ paused: true });
const container = document.getElementById("aroll-container");
gsap.set(container, { y: -1100, scale: 0.8 });
tl.to(container, { y: 0, duration: 1.2, ease: "elastic.out(1, 0.6)" }, 0);
tl.to(container, { scale: 1.4, x: -300, duration: 1, ease: "back.out(1.7)" }, 1.839);
tl.to(container, { scale: 0.7, x: 400, duration: 1, ease: "back.out(1.7)" }, 4.659);
tl.to(container, { scale: 0.9, x: 0, duration: 1, ease: "back.out(1.7)" }, 8.88);
window.__timelines["aroll-layer"] = tl;
})();
</script>
</div>
<!-- Compositions -->
<div
id="intro-comp"
data-composition-id="intro"
data-composition-src="compositions/intro.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-width="1920"
data-height="1080"
data-track-index="100"
></div>
<div
id="captions-comp"
data-composition-id="captions"
data-composition-src="compositions/captions.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-width="1920"
data-height="1080"
data-track-index="200"
></div>
<div
id="stats-comp"
data-composition-id="stats"
data-composition-src="compositions/stats.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-width="1920"
data-height="1080"
data-track-index="150"
></div>
<script>
window.__timelines = window.__timelines || {};
const tl = gsap.timeline({ paused: true });
window.__timelines["main-video"] = tl;
</script>
</div>
</body>
</html>
@@ -0,0 +1,34 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "play-mode",
"type": "hyperframes:example",
"title": "Play Mode",
"description": "Playful elastic animations",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 10,
"files": [
{
"path": "compositions/captions.html",
"target": "compositions/captions.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/intro.html",
"target": "compositions/intro.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/stats.html",
"target": "compositions/stats.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
@@ -0,0 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" width="1920" height="1080">
<defs>
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="2" stdDeviation="2" flood-opacity="0.2"/>
</filter>
<g id="cursor-arrow">
<path d="M0 0 L 16 16 L 9.5 16 L 6.5 23 L 6.5 16 L 0 16 Z" fill="white" stroke="#000" stroke-width="1.5" stroke-linejoin="round" filter="url(#shadow)"/>
</g>
</defs>
<rect width="1920" height="1080" fill="#f0f0f0" />
<g id="cursor-designer" transform="translate(600, 500)">
<use href="#cursor-arrow" x="0" y="0"/>
<rect x="16" y="20" width="90" height="24" rx="4" fill="#A259FF"/>
<text x="61" y="36" font-family="Inter, sans-serif" font-size="12" fill="white" text-anchor="middle" font-weight="bold">Designer</text>
</g>
<g id="cursor-engineer" transform="translate(900, 400)">
<use href="#cursor-arrow" x="0" y="0"/>
<rect x="16" y="20" width="90" height="24" rx="4" fill="#1ABCFE"/>
<text x="61" y="36" font-family="Inter, sans-serif" font-size="12" fill="white" text-anchor="middle" font-weight="bold">Engineer</text>
</g>
<g id="cursor-pm" transform="translate(1200, 600)">
<use href="#cursor-arrow" x="0" y="0"/>
<rect x="16" y="20" width="50" height="24" rx="4" fill="#F24E1E"/>
<text x="41" y="36" font-family="Inter, sans-serif" font-size="12" fill="white" text-anchor="middle" font-weight="bold">PM</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,15 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" width="1920" height="1080">
<g transform="translate(880, 420)">
<!-- Top-left: rounded square -->
<path id="logo-tl" d="M 40 0 A 40 40 0 0 0 0 40 L 0 80 A 40 40 0 0 0 40 120 A 40 40 0 0 0 80 80 L 80 40 A 40 40 0 0 0 40 0 Z" fill="#F24E1E" />
<!-- Top-right: rounded square -->
<path id="logo-tr" d="M 120 0 A 40 40 0 0 0 80 40 L 80 80 A 40 40 0 0 0 120 120 A 40 40 0 0 0 160 80 L 160 40 A 40 40 0 0 0 120 0 Z" fill="#A259FF" />
<!-- Bottom-left: half-circle -->
<path id="logo-bl" d="M 0 120 A 40 120 0 0 0 80 120 Z" fill="#1ABCFE" />
<!-- Bottom-right: half-circle -->
<path id="logo-br" d="M 80 120 A 40 120 0 0 0 160 120 Z" fill="#0ACF83" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 771 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080" width="1920" height="1080">
<rect id="pill-tl" x="870" y="410" width="80" height="120" rx="40" fill="#F24E1E" />
<rect id="pill-tr" x="970" y="410" width="80" height="120" rx="40" fill="#A259FF" />
<rect id="pill-bl" x="870" y="550" width="80" height="120" rx="40" fill="#1ABCFE" />
<rect id="pill-br" x="970" y="550" width="80" height="120" rx="40" fill="#0ACF83" />
</svg>

After

Width:  |  Height:  |  Size: 446 B

+158
View File
@@ -0,0 +1,158 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Product Promo</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;800&display=block"
rel="stylesheet"
/>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #0a0a0f;
font-family: "Inter", sans-serif;
}
.scene {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.caption-text-wrapper {
position: absolute;
bottom: 150px;
left: 0;
right: 0;
display: flex;
justify-content: center;
pointer-events: none;
overflow: hidden;
padding: 10px 0;
}
.caption-line {
color: white;
font-size: 48px;
font-weight: 600;
letter-spacing: -0.02em;
text-align: center;
text-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
transform: translateY(100%);
opacity: 0;
}
</style>
</head>
<body>
<div
id="root"
data-composition-id="main"
data-start="0"
data-duration="20"
data-width="1920"
data-height="1080"
>
<!-- Scene 1: Logo Intro -->
<div
id="scene-1"
class="scene"
data-composition-id="scene1-logo-intro"
data-composition-src="compositions/scene1-logo-intro.html"
data-start="0"
data-duration="1.5"
data-track-index="1"
data-width="1920"
data-height="1080"
></div>
<!-- Scene 2-4: Continuous Canvas -->
<div
id="scene-2-4"
class="scene"
data-composition-id="scene2-4-canvas"
data-composition-src="compositions/scene2-4-canvas.html"
data-start="1.5"
data-duration="12.5"
data-track-index="1"
data-width="1920"
data-height="1080"
></div>
<!-- Scene 5: Logo Outro -->
<div
id="scene-5"
class="scene"
data-composition-id="scene5-logo-outro"
data-composition-src="compositions/scene5-logo-outro.html"
data-start="14"
data-duration="6"
data-track-index="1"
data-width="1920"
data-height="1080"
></div>
<!-- Captions -->
<div
id="captions-comp"
data-composition-id="captions"
data-start="1.5"
data-duration="12.5"
data-track-index="2"
data-width="1920"
data-height="1080"
>
<div class="caption-text-wrapper">
<div id="caption-text" class="caption-line">Starting with a blank canvas.</div>
</div>
<script>
(function () {
const tl = gsap.timeline({ paused: true });
const text = document.querySelector("#caption-text");
tl.to(text, { opacity: 1, y: 0, duration: 0.8, ease: "power3.out" }, 0);
tl.to(text, { opacity: 0, y: -20, duration: 0.3, ease: "power3.in" }, 3.2);
tl.set(text, { innerText: "Three cursors. One file. Zero meetings.", y: 40 }, 3.5);
tl.to(text, { opacity: 1, y: 0, duration: 0.6, ease: "power3.out" }, 3.5);
tl.to(text, { opacity: 0, y: -20, duration: 0.3, ease: "power3.in" }, 7.7);
tl.set(
text,
{ innerText: "Components in. Feedback resolved. No one waited.", y: 40 },
8.0,
);
tl.to(text, { opacity: 1, y: 0, duration: 0.6, ease: "power3.out" }, 8.0);
tl.to(text, { opacity: 0, y: -20, duration: 0.4, ease: "power3.in" }, 12.1);
window.__timelines = window.__timelines || {};
window.__timelines["captions"] = tl;
})();
</script>
</div>
</div>
<script>
window.__timelines = window.__timelines || {};
const mainTl = gsap.timeline({ paused: true });
mainTl.set("#scene-2-4", { scale: 1, filter: "blur(0px)" }, 1.5);
mainTl.to(
"#scene-2-4",
{ duration: 0.25, scale: 0.94, filter: "blur(6px)", opacity: 0, ease: "power2.in" },
13.75,
);
window.__timelines["main"] = mainTl;
</script>
</body>
</html>
@@ -0,0 +1,49 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "product-promo",
"type": "hyperframes:example",
"title": "Product Promo",
"description": "Multi-scene product showcase with SVG assets",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 20,
"files": [
{
"path": "assets/figma-cursors.svg",
"target": "assets/figma-cursors.svg",
"type": "hyperframes:asset"
},
{
"path": "assets/figma-logo-pieces.svg",
"target": "assets/figma-logo-pieces.svg",
"type": "hyperframes:asset"
},
{
"path": "assets/figma-logo-pills.svg",
"target": "assets/figma-logo-pills.svg",
"type": "hyperframes:asset"
},
{
"path": "compositions/scene1-logo-intro.html",
"target": "compositions/scene1-logo-intro.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/scene2-4-canvas.html",
"target": "compositions/scene2-4-canvas.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/scene5-logo-outro.html",
"target": "compositions/scene5-logo-outro.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
+107
View File
@@ -0,0 +1,107 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FlowDesk Pitch — Slideshow Demo</title>
<script src="../../../packages/player/dist/hyperframes-player.global.js"></script>
<script src="../../../packages/player/dist/slideshow/hyperframes-slideshow.global.js"></script>
<style>
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
overflow: hidden;
background: #000;
}
</style>
</head>
<body>
<!--
NOTE: The <script type="application/hyperframes-slideshow+json"> island
below is a COPY of the island inside index.html. This duplication is a
current workaround: <hyperframes-slideshow> reads the island from its OWN
innerHTML (not from the composition loaded by <hyperframes-player>). In a
future version the component should read the island from the composition
directly. Keep this copy in sync with the one in index.html.
-->
<hyperframes-slideshow tabindex="0" style="display: block; position: relative; width: 100vw; height: 100vh">
<hyperframes-player
style="position: absolute; inset: 0"
src="index.html"
></hyperframes-player>
<script type="application/hyperframes-slideshow+json">
{
"slides": [
{
"sceneId": "cover",
"notes": "Open cold with the tagline. Let it breathe — no build, just the claim."
},
{
"sceneId": "problem",
"notes": "Walk through each pain point one fragment at a time. The 14h/week stat is the anchor.",
"fragments": [8.3, 8.6, 8.9],
"hotspots": []
},
{
"sceneId": "solution",
"notes": "One sentence. The product kills the three pains from the previous slide."
},
{
"sceneId": "why-now",
"notes": "Three macro tailwinds — remote-first freelancing, API economy, AI underwriting."
},
{
"sceneId": "market",
"notes": "Bottom-up math only. 480k agencies × $4,200 ACV = $2.0B SAM. Use hotspot for methodology Q.",
"hotspots": [
{
"id": "mkt-hotspot",
"label": "How did you size this market?",
"target": "market-sizing-drill",
"region": { "x": 55, "y": 60, "w": 40, "h": 28 }
}
]
},
{
"sceneId": "product",
"notes": "Three product pillars — intake, approvals, invoicing. Show the single workflow view."
},
{
"sceneId": "traction",
"notes": "Lead with MRR and NRR — investors pattern-match on those two numbers first."
},
{
"sceneId": "team",
"notes": "Why us: ex-Stripe, ex-Figma, serial founders. Domain depth on both sides."
},
{
"sceneId": "ask",
"notes": "$4M seed to hit 1,000 customers. Show specific use of proceeds."
}
],
"slideSequences": [
{
"id": "market-sizing-drill",
"label": "Market sizing methodology",
"slides": [
{
"sceneId": "market-drill",
"notes": "Step through the bottom-up math: Dun & Bradstreet count → filter → ACV from comparable comps."
}
]
}
]
}
</script>
</hyperframes-slideshow>
</body>
</html>
+859
View File
@@ -0,0 +1,859 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>FlowDesk — Investor Pitch</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
/* ── Shared scene positioning ───────────────────────── */
.scene-frame {
position: absolute;
top: 0;
left: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
opacity: 0;
}
/* ── Content containers ──────────────────────────────── */
.slide-inner {
position: absolute;
inset: 0;
padding: 100px 160px;
display: flex;
flex-direction: column;
justify-content: center;
gap: 32px;
}
.slide-center {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 32px;
padding: 100px 200px;
}
/* ── Typography ─────────────────────────────────────── */
.eyebrow {
font-size: 32px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.headline {
font-size: 80px;
font-weight: 800;
line-height: 1.05;
letter-spacing: -0.025em;
}
.headline-lg {
font-size: 96px;
font-weight: 900;
line-height: 1;
letter-spacing: -0.03em;
text-align: center;
}
.subhead {
font-size: 48px;
font-weight: 400;
line-height: 1.35;
max-width: 1200px;
}
.subhead-center {
font-size: 48px;
font-weight: 400;
line-height: 1.35;
max-width: 1100px;
text-align: center;
}
.stat-row {
display: flex;
gap: 80px;
align-items: flex-end;
}
.stat-block {
display: flex;
flex-direction: column;
gap: 8px;
}
.stat-number {
font-size: 96px;
font-weight: 900;
line-height: 1;
letter-spacing: -0.04em;
}
.stat-label {
font-size: 36px;
font-weight: 500;
opacity: 0.7;
}
/* ── Problem bullets ─────────────────────────────────── */
.pain-item {
display: flex;
align-items: flex-start;
gap: 28px;
/* pain items start hidden; driver reveals them imperatively on fragment */
opacity: 0;
}
.pain-num {
font-size: 56px;
font-weight: 900;
line-height: 1;
flex-shrink: 0;
min-width: 64px;
}
.pain-text {
font-size: 52px;
font-weight: 600;
line-height: 1.2;
}
/* ── Market math ─────────────────────────────────────── */
.math-row {
display: flex;
align-items: center;
gap: 32px;
font-size: 56px;
font-weight: 700;
}
.math-op {
font-size: 56px;
font-weight: 400;
opacity: 0.5;
}
.math-result {
font-size: 80px;
font-weight: 900;
}
/* ── Traction stats ──────────────────────────────────── */
.traction-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 60px;
width: 100%;
max-width: 1500px;
}
.traction-card {
display: flex;
flex-direction: column;
gap: 12px;
padding: 48px;
border-radius: 24px;
}
.traction-number {
font-size: 80px;
font-weight: 900;
line-height: 1;
letter-spacing: -0.03em;
}
.traction-label {
font-size: 36px;
font-weight: 500;
}
/* ── Team cards ──────────────────────────────────────── */
.team-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 60px;
width: 100%;
max-width: 1500px;
}
.team-card {
display: flex;
flex-direction: column;
gap: 12px;
padding: 48px;
border-radius: 24px;
}
.team-name {
font-size: 44px;
font-weight: 800;
}
.team-role {
font-size: 32px;
font-weight: 600;
opacity: 0.7;
}
.team-bio {
font-size: 28px;
font-weight: 400;
line-height: 1.4;
opacity: 0.8;
}
/* ── Ask pill list ──────────────────────────────────── */
.use-list {
display: flex;
flex-direction: column;
gap: 24px;
}
.use-item {
display: flex;
align-items: center;
gap: 24px;
font-size: 44px;
font-weight: 600;
}
.use-pct {
font-size: 44px;
font-weight: 900;
min-width: 120px;
}
/* ── Decorative accent bar ───────────────────────────── */
.accent-bar {
width: 80px;
height: 8px;
border-radius: 4px;
}
</style>
</head>
<body style="margin: 0">
<!--
FlowDesk — Investor Pitch Deck
Startup: FlowDesk — workflow SaaS for freelance creative agencies
automates client intake, approval loops, and invoicing.
Timeline layout (all scenes non-overlapping, contiguous main line):
0008s cover (main slide 1)
0820s problem (main slide 2, 3 fragments at 8.3, 8.6, 8.9s — bunched near start)
2028s solution (main slide 3)
2836s why-now (main slide 4)
3644s market (main slide 5, hotspot → market-drill branch)
4452s product (main slide 6)
5260s traction (main slide 7)
6068s team (main slide 8)
6876s ask (main slide 9)
7684s market-drill (branch slide — market-sizing-drill sequence)
-->
<!-- ── JSON island (source of truth for slide order, fragments, hotspots) ── -->
<script type="application/hyperframes-slideshow+json">
{
"slides": [
{
"sceneId": "cover",
"notes": "Open cold with the tagline. Let it breathe — no build, just the claim."
},
{
"sceneId": "problem",
"notes": "Walk through each pain point one fragment at a time. The 14h/week stat is the anchor.",
"fragments": [8.3, 8.6, 8.9],
"hotspots": []
},
{
"sceneId": "solution",
"notes": "One sentence. The product kills the three pains from the previous slide."
},
{
"sceneId": "why-now",
"notes": "Three macro tailwinds — remote-first freelancing, API economy, AI underwriting."
},
{
"sceneId": "market",
"notes": "Bottom-up math only. 480k agencies × $4,200 ACV = $2.0B SAM. Use hotspot for methodology Q.",
"hotspots": [
{
"id": "mkt-hotspot",
"label": "How did you size this market?",
"target": "market-sizing-drill",
"region": { "x": 55, "y": 60, "w": 40, "h": 28 }
}
]
},
{
"sceneId": "product",
"notes": "Three product pillars — intake, approvals, invoicing. Show the single workflow view."
},
{
"sceneId": "traction",
"notes": "Lead with MRR and NRR — investors pattern-match on those two numbers first."
},
{
"sceneId": "team",
"notes": "Why us: ex-Stripe, ex-Figma, serial founders. Domain depth on both sides."
},
{
"sceneId": "ask",
"notes": "$4M seed to hit 1,000 customers. Show specific use of proceeds."
}
],
"slideSequences": [
{
"id": "market-sizing-drill",
"label": "Market sizing methodology",
"slides": [
{
"sceneId": "market-drill",
"notes": "Step through the bottom-up math: Dun & Bradstreet count → filter → ACV from comparable comps."
}
]
}
]
}
</script>
<!-- Root composition container -->
<div
id="root"
data-composition-id="root"
data-start="0"
data-duration="84"
data-width="1920"
data-height="1080"
style="position: relative; width: 1920px; height: 1080px; overflow: hidden; background: #0b0b0f"
>
<!-- ══════════════════════════════════════════════════════
SLIDE 1 — COVER
"FlowDesk turns creative agency chaos into billable momentum"
Start: 0 Duration: 8 End: 8
Background: deep indigo gradient
═══════════════════════════════════════════════════════════ -->
<div
id="scene-cover"
class="scene-frame clip"
data-composition-id="cover"
data-start="0"
data-duration="8"
data-label="Cover"
data-track-index="1"
style="background: linear-gradient(135deg, #0d0d2b 0%, #1a0a3d 50%, #0d1f4a 100%)"
>
<div class="slide-center">
<div id="cover-eyebrow" class="eyebrow" style="color: #7c6ff7" data-anim>Seed Round 2026</div>
<h1 id="cover-headline" class="headline-lg" style="color: #ffffff" data-anim>
FlowDesk turns creative agency chaos into billable momentum
</h1>
<p id="cover-sub" class="subhead-center" style="color: rgba(255,255,255,0.65)" data-anim>
Workflow automation for freelance creative agencies — intake, approvals, and invoicing in one place
</p>
<div id="cover-bar" class="accent-bar" style="background: #7c6ff7; width: 120px" data-anim></div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 2 — PROBLEM
"Creative agencies haemorrhage 14 hours a week chasing approvals and invoices"
Start: 8 Duration: 12 End: 20
Fragments at 8.3, 8.6, 8.9 (absolute timeline times — bunched near start for snappiness)
Background: dark warm red
═══════════════════════════════════════════════════════════ -->
<div
id="scene-problem"
class="scene-frame clip"
data-composition-id="problem"
data-start="8"
data-duration="12"
data-label="The problem"
data-track-index="1"
style="background: linear-gradient(135deg, #1a0808 0%, #2d0f0f 100%)"
>
<div class="slide-inner">
<div id="prob-eyebrow" class="eyebrow" style="color: #f87171" data-anim>The problem</div>
<h2 id="prob-headline" class="headline" style="color: #ffffff; max-width: 1400px" data-anim>
Creative agencies haemorrhage 14 hours a week chasing approvals and invoices
</h2>
<div id="prob-pain1" class="pain-item">
<span class="pain-num" style="color: #f87171">01</span>
<span class="pain-text" style="color: rgba(255,255,255,0.9)">Client feedback loops take 46 days per project revision</span>
</div>
<div id="prob-pain2" class="pain-item">
<span class="pain-num" style="color: #f87171">02</span>
<span class="pain-text" style="color: rgba(255,255,255,0.9)">Late invoices leave 28% of revenue outstanding 30+ days</span>
</div>
<div id="prob-pain3" class="pain-item">
<span class="pain-num" style="color: #f87171">03</span>
<span class="pain-text" style="color: rgba(255,255,255,0.9)">Intake chaos — email threads, Notion, DMs — kills 3h/week on triage</span>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 3 — SOLUTION
"FlowDesk collapses intake, approvals, and invoicing into one automated workflow — agencies bill faster and work less"
Start: 20 Duration: 8 End: 28
Background: rich teal/green
═══════════════════════════════════════════════════════════ -->
<div
id="scene-solution"
class="scene-frame clip"
data-composition-id="solution"
data-start="20"
data-duration="8"
data-label="Solution"
data-track-index="1"
style="background: linear-gradient(135deg, #071a17 0%, #0a2e26 50%, #06201b 100%)"
>
<div class="slide-center">
<div id="sol-eyebrow" class="eyebrow" style="color: #34d399" data-anim>Our solution</div>
<h2 id="sol-headline" class="headline-lg" style="color: #ffffff; max-width: 1400px" data-anim>
FlowDesk collapses intake, approvals, and invoicing into one automated workflow — agencies bill faster and work less
</h2>
<p id="sol-sub" class="subhead-center" style="color: rgba(255,255,255,0.65)" data-anim>
One link for clients. One dashboard for teams. Zero email follow-ups.
</p>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 4 — WHY NOW
"Three forces converging in 2026 make FlowDesk a category-defining moment"
Start: 28 Duration: 8 End: 36
Background: midnight blue
═══════════════════════════════════════════════════════════ -->
<div
id="scene-why-now"
class="scene-frame clip"
data-composition-id="why-now"
data-start="28"
data-duration="8"
data-label="Why now"
data-track-index="1"
style="background: linear-gradient(135deg, #050d1f 0%, #0a1a3d 100%)"
>
<div class="slide-inner">
<div id="wn-eyebrow" class="eyebrow" style="color: #60a5fa" data-anim>Why now</div>
<h2 id="wn-headline" class="headline" style="color: #ffffff" data-anim>
Three forces converging in 2026 make FlowDesk a category-defining moment
</h2>
<div id="wn-row" class="stat-row" style="gap: 60px; margin-top: 16px" data-anim>
<div class="stat-block">
<span class="stat-number" style="color: #60a5fa">74%</span>
<span class="stat-label" style="color: rgba(255,255,255,0.65)">of US agencies now fully remote — async tooling is table stakes</span>
</div>
<div class="stat-block">
<span class="stat-number" style="color: #60a5fa">3×</span>
<span class="stat-label" style="color: rgba(255,255,255,0.65)">growth in SMB API adoption, enabling no-code automations</span>
</div>
<div class="stat-block">
<span class="stat-number" style="color: #60a5fa">AI</span>
<span class="stat-label" style="color: rgba(255,255,255,0.65)">AI-powered approval routing cuts review cycles by 60%</span>
</div>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 5 — MARKET
"480,000 US creative agencies × $4,200 ACV = $2.0B serviceable market"
Start: 36 Duration: 8 End: 44
Hotspot → market-sizing-drill branch
Background: deep purple
═══════════════════════════════════════════════════════════ -->
<div
id="scene-market"
class="scene-frame clip"
data-composition-id="market"
data-start="36"
data-duration="8"
data-label="Market"
data-track-index="1"
style="background: linear-gradient(135deg, #110824 0%, #1e0a40 100%)"
>
<div class="slide-inner">
<div id="mkt-eyebrow" class="eyebrow" style="color: #a78bfa" data-anim>Market sizing</div>
<h2 id="mkt-headline" class="headline" style="color: #ffffff; max-width: 1300px" data-anim>
480,000 US creative agencies × $4,200 ACV = $2.0B serviceable market
</h2>
<div id="mkt-math" class="math-row" style="color: #ffffff; margin-top: 8px" data-anim>
<span style="color: #a78bfa; font-size: 56px; font-weight: 800">480k</span>
<span class="math-op">agencies</span>
<span class="math-op">×</span>
<span style="color: #a78bfa; font-size: 56px; font-weight: 800">$4,200</span>
<span class="math-op">ACV</span>
<span class="math-op">=</span>
<span id="mkt-result" class="math-result" style="color: #c4b5fd">$2.0B SAM</span>
</div>
<p id="mkt-note" class="subhead" style="color: rgba(255,255,255,0.55); font-size: 36px; margin-top: 8px" data-anim>
Initial wedge: 315 person US agencies billing $250k$2M/yr via Stripe. Expand to EU in year 2.
</p>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 6 — PRODUCT
"FlowDesk's three-module platform cuts the agency ops stack from six tools to one"
Start: 44 Duration: 8 End: 52
Background: slate dark
═══════════════════════════════════════════════════════════ -->
<div
id="scene-product"
class="scene-frame clip"
data-composition-id="product"
data-start="44"
data-duration="8"
data-label="Product"
data-track-index="1"
style="background: linear-gradient(135deg, #0c0f18 0%, #161b2e 100%)"
>
<div class="slide-inner">
<div id="prod-eyebrow" class="eyebrow" style="color: #38bdf8" data-anim>Product</div>
<h2 id="prod-headline" class="headline" style="color: #ffffff; max-width: 1300px" data-anim>
FlowDesk's three-module platform cuts the agency ops stack from six tools to one
</h2>
<div id="prod-modules" style="display: flex; gap: 48px; margin-top: 16px" data-anim>
<div style="flex: 1; padding: 40px; background: rgba(56,189,248,0.08); border-radius: 20px; border: 1px solid rgba(56,189,248,0.2)">
<div style="font-size: 48px; font-weight: 800; color: #38bdf8; margin-bottom: 12px">Intake</div>
<div style="font-size: 36px; color: rgba(255,255,255,0.8); line-height: 1.4">Smart intake forms with file upload, budget qualifier, and auto-brief generation</div>
</div>
<div style="flex: 1; padding: 40px; background: rgba(56,189,248,0.08); border-radius: 20px; border: 1px solid rgba(56,189,248,0.2)">
<div style="font-size: 48px; font-weight: 800; color: #38bdf8; margin-bottom: 12px">Approvals</div>
<div style="font-size: 36px; color: rgba(255,255,255,0.8); line-height: 1.4">AI-routed review links — one URL, unlimited rounds, full audit trail</div>
</div>
<div style="flex: 1; padding: 40px; background: rgba(56,189,248,0.08); border-radius: 20px; border: 1px solid rgba(56,189,248,0.2)">
<div style="font-size: 48px; font-weight: 800; color: #38bdf8; margin-bottom: 12px">Invoicing</div>
<div style="font-size: 36px; color: rgba(255,255,255,0.8); line-height: 1.4">Auto-invoice on approval — Stripe-native, net-terms, retainer billing</div>
</div>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 7 — TRACTION
"We crossed $42k MRR in 14 months with 186 paying agencies and 118% NRR"
Start: 52 Duration: 8 End: 60
Background: emerald dark
═══════════════════════════════════════════════════════════ -->
<div
id="scene-traction"
class="scene-frame clip"
data-composition-id="traction"
data-start="52"
data-duration="8"
data-label="Traction"
data-track-index="1"
style="background: linear-gradient(135deg, #051a10 0%, #0a2e1c 100%)"
>
<div class="slide-inner">
<div id="tr-eyebrow" class="eyebrow" style="color: #4ade80" data-anim>Traction</div>
<h2 id="tr-headline" class="headline" style="color: #ffffff; max-width: 1400px" data-anim>
We crossed $42k MRR in 14 months with 186 paying agencies and 118% NRR
</h2>
<div id="tr-cards" class="traction-grid" style="margin-top: 16px" data-anim>
<div class="traction-card" style="background: rgba(74,222,128,0.08); border: 1px solid rgba(74,222,128,0.2)">
<span class="traction-number" style="color: #4ade80">$42k</span>
<span class="traction-label" style="color: rgba(255,255,255,0.75)">MRR (Apr 2026)</span>
</div>
<div class="traction-card" style="background: rgba(74,222,128,0.08); border: 1px solid rgba(74,222,128,0.2)">
<span class="traction-number" style="color: #4ade80">118%</span>
<span class="traction-label" style="color: rgba(255,255,255,0.75)">Net Revenue Retention</span>
</div>
<div class="traction-card" style="background: rgba(74,222,128,0.08); border: 1px solid rgba(74,222,128,0.2)">
<span class="traction-number" style="color: #4ade80">186</span>
<span class="traction-label" style="color: rgba(255,255,255,0.75)">Paying agencies, 0 churned in 90 days</span>
</div>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 8 — TEAM
"Our three-person founding team has shipped and sold workflow software at Stripe, Figma, and HoneyBook"
Start: 60 Duration: 8 End: 68
Background: warm charcoal
═══════════════════════════════════════════════════════════ -->
<div
id="scene-team"
class="scene-frame clip"
data-composition-id="team"
data-start="60"
data-duration="8"
data-label="Team"
data-track-index="1"
style="background: linear-gradient(135deg, #16100a 0%, #261a0f 100%)"
>
<div class="slide-inner">
<div id="team-eyebrow" class="eyebrow" style="color: #fb923c" data-anim>Team</div>
<h2 id="team-headline" class="headline" style="color: #ffffff; max-width: 1400px" data-anim>
Our three-person founding team has shipped and sold workflow software at Stripe, Figma, and HoneyBook
</h2>
<div id="team-cards" class="team-grid" style="margin-top: 16px" data-anim>
<div class="team-card" style="background: rgba(251,146,60,0.08); border: 1px solid rgba(251,146,60,0.2)">
<span class="team-name" style="color: #fb923c">Sara Okeke</span>
<span class="team-role" style="color: rgba(255,255,255,0.7)">CEO &amp; Co-founder</span>
<span class="team-bio" style="color: rgba(255,255,255,0.7)">Former PM at Stripe Billing. 2× founder (YC S18).</span>
</div>
<div class="team-card" style="background: rgba(251,146,60,0.08); border: 1px solid rgba(251,146,60,0.2)">
<span class="team-name" style="color: #fb923c">Dev Patel</span>
<span class="team-role" style="color: rgba(255,255,255,0.7)">CTO &amp; Co-founder</span>
<span class="team-bio" style="color: rgba(255,255,255,0.7)">Eng lead on Figma Comments. Built async review infra used by 4M teams.</span>
</div>
<div class="team-card" style="background: rgba(251,146,60,0.08); border: 1px solid rgba(251,146,60,0.2)">
<span class="team-name" style="color: #fb923c">Leila Hart</span>
<span class="team-role" style="color: rgba(255,255,255,0.7)">Head of Revenue</span>
<span class="team-bio" style="color: rgba(255,255,255,0.7)">Closed first 200 customers at HoneyBook. Agency market expert.</span>
</div>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
SLIDE 9 — ASK
"We are raising $4M seed to reach 1,000 customers and $200k MRR in 18 months"
Start: 68 Duration: 8 End: 76
Background: strong indigo
═══════════════════════════════════════════════════════════ -->
<div
id="scene-ask"
class="scene-frame clip"
data-composition-id="ask"
data-start="68"
data-duration="8"
data-label="The ask"
data-track-index="1"
style="background: linear-gradient(135deg, #0d0d2b 0%, #1a1060 100%)"
>
<div class="slide-inner">
<div id="ask-eyebrow" class="eyebrow" style="color: #818cf8" data-anim>The ask</div>
<h2 id="ask-headline" class="headline" style="color: #ffffff; max-width: 1400px" data-anim>
We are raising $4M seed to reach 1,000 customers and $200k MRR in 18 months
</h2>
<div id="ask-uses" class="use-list" style="margin-top: 16px" data-anim>
<div class="use-item">
<span class="use-pct" style="color: #818cf8">50%</span>
<span style="color: rgba(255,255,255,0.85); font-size: 44px; font-weight: 600">Eng &amp; product — hire 4 engineers, ship EU data residency + mobile app</span>
</div>
<div class="use-item">
<span class="use-pct" style="color: #818cf8">30%</span>
<span style="color: rgba(255,255,255,0.85); font-size: 44px; font-weight: 600">Sales &amp; CS — 3 AEs + partner channel (agencies tool stack)</span>
</div>
<div class="use-item">
<span class="use-pct" style="color: #818cf8">20%</span>
<span style="color: rgba(255,255,255,0.85); font-size: 44px; font-weight: 600">Marketing — content-led PLG, SEO moat, case study library</span>
</div>
</div>
</div>
</div>
<!-- ══════════════════════════════════════════════════════
BRANCH SLIDE — MARKET-DRILL
Branch: market-sizing-drill / "Market sizing methodology"
Start: 76 Duration: 8 End: 84
NOT in main slides array — only in slideSequences
Background: charcoal purple (visually distinct from market slide)
═══════════════════════════════════════════════════════════ -->
<div
id="scene-market-drill"
class="scene-frame clip"
data-composition-id="market-drill"
data-start="76"
data-duration="8"
data-label="Market math drill-down"
data-track-index="1"
style="background: linear-gradient(135deg, #0f0a20 0%, #1c1035 100%)"
>
<div class="slide-inner">
<div id="drill-eyebrow" class="eyebrow" style="color: #c084fc" data-anim>Market sizing methodology</div>
<h2 id="drill-headline" class="headline" style="color: #ffffff; max-width: 1500px" data-anim>
Bottom-up: Dun &amp; Bradstreet lists 1.1M US "design services" firms — we filter to 480k agencies billing &gt;$250k/yr
</h2>
<div id="drill-steps" style="display: flex; flex-direction: column; gap: 24px; margin-top: 16px" data-anim>
<div style="display: flex; gap: 24px; align-items: center">
<span style="font-size: 48px; font-weight: 900; color: #c084fc; min-width: 72px">1.</span>
<span style="font-size: 44px; color: rgba(255,255,255,0.85); font-weight: 600">1.1M Dun &amp; Bradstreet "design services" — filter to 5+ employee, $250k+ revenue</span>
</div>
<div style="display: flex; gap: 24px; align-items: center">
<span style="font-size: 48px; font-weight: 900; color: #c084fc; min-width: 72px">2.</span>
<span style="font-size: 44px; color: rgba(255,255,255,0.85); font-weight: 600">= 480k addressable agencies × $4,200 ACV (3 seats × $1,400/seat/yr = comparable to HoneyBook)</span>
</div>
<div style="display: flex; gap: 24px; align-items: center">
<span style="font-size: 48px; font-weight: 900; color: #c084fc; min-width: 72px">3.</span>
<span style="font-size: 44px; color: rgba(255,255,255,0.85); font-weight: 600">$2.0B SAM. Expand to EU (est. 600k agencies) in Y2 for $4.5B total SAM.</span>
</div>
</div>
</div>
</div>
<!-- ── Root timeline (spans full 84s composition) ──────── -->
<script>
(function () {
window.__timelines = window.__timelines || {};
var tl = gsap.timeline({ paused: true });
tl.to({}, { duration: 84 });
window.__timelines["root"] = tl;
})();
</script>
</div><!-- end #root -->
<!-- ── Scene visibility controller + imperative animation driver ──────────
Drives each scene's opacity based on playhead (seek-driven visibility).
ALSO fires imperative GSAP entrance animations via GSAP's own ticker
when a scene transitions from inactive→active. Pain items are revealed
imperatively when the playhead crosses their bunched fragment times.
Fragment times for problem: [8.3, 8.6, 8.9] — bunched near scene start
so each ArrowRight advances the playhead to the next reveal within ~300ms.
──────────────────────────────────────────────────────────────────────────── -->
<script>
(function () {
var scenes = [
{ id: "scene-cover", start: 0, end: 8 },
{ id: "scene-problem", start: 8, end: 20 },
{ id: "scene-solution", start: 20, end: 28 },
{ id: "scene-why-now", start: 28, end: 36 },
{ id: "scene-market", start: 36, end: 44 },
{ id: "scene-product", start: 44, end: 52 },
{ id: "scene-traction", start: 52, end: 60 },
{ id: "scene-team", start: 60, end: 68 },
{ id: "scene-ask", start: 68, end: 76 },
{ id: "scene-market-drill", start: 76, end: 84 }
];
// Fragment config for problem slide: pain items revealed at bunched times
var painFragments = [
{ time: 8.3, id: "prob-pain1" },
{ time: 8.6, id: "prob-pain2" },
{ time: 8.9, id: "prob-pain3" }
];
var painRevealed = [false, false, false];
// Track which scene was last active to detect transitions
var lastActiveId = null;
function fireEntranceAnim(scene) {
var animEls = scene.querySelectorAll("[data-anim]");
if (!animEls.length) return;
// Quick crossfade: scene container from 0→1 already handled by visibility controller.
// Stagger-in the data-anim elements from below+transparent via GSAP's own ticker.
gsap.from(animEls, {
opacity: 0,
y: 30,
duration: 0.45,
stagger: 0.08,
ease: "power2.out",
overwrite: true
});
}
function revealPainItem(id) {
var el = document.getElementById(id);
if (!el) return;
gsap.fromTo(el, { opacity: 0, x: -20 }, { opacity: 1, x: 0, duration: 0.4, ease: "power2.out", overwrite: true });
}
function updateVisibility(t) {
for (var i = 0; i < scenes.length; i++) {
var s = scenes[i];
var el = document.getElementById(s.id);
if (!el) continue;
var isActive = t >= s.start && t < s.end;
el.style.opacity = isActive ? "1" : "0";
el.style.pointerEvents = isActive ? "auto" : "none";
// Fire entrance animation when scene BECOMES active
if (isActive && lastActiveId !== s.id) {
// Reset pain items when re-entering problem scene
if (s.id === "scene-problem") {
painRevealed = [false, false, false];
var pains = ["prob-pain1", "prob-pain2", "prob-pain3"];
for (var p = 0; p < pains.length; p++) {
var pEl = document.getElementById(pains[p]);
if (pEl) gsap.set(pEl, { opacity: 0, x: 0, clearProps: "transform" });
}
}
lastActiveId = s.id;
fireEntranceAnim(el);
}
}
// Fragment reveals for problem slide pain items
for (var f = 0; f < painFragments.length; f++) {
if (!painRevealed[f] && t >= painFragments[f].time) {
painRevealed[f] = true;
revealPainItem(painFragments[f].id);
}
}
}
// Expose so the player / slideshow component can drive it directly
window.__hfSetTime = updateVisibility;
// Show the first slide immediately on load so the deck isn't blank
updateVisibility(0);
// Hook into the root timeline's onUpdate so every seek drives scene visibility
function hookRoot() {
var root = window.__timelines && window.__timelines["root"];
if (root) {
root.eventCallback("onUpdate", function () {
updateVisibility(root.time());
});
}
}
hookRoot();
})();
</script>
<!-- ── Bootstrap postMessage for slideshow component ─────
Sends the timeline manifest so <hyperframes-slideshow>
can discover all scenes (main + branch) without relying
on the engine's full runtime injection.
──────────────────────────────────────────────────────── -->
<script>
(function () {
var totalFrames = 84 * 30; // 84s × 30fps = 2520 frames
var scenes = [
{ id: "cover", start: 0, duration: 8 },
{ id: "problem", start: 8, duration: 12 },
{ id: "solution", start: 20, duration: 8 },
{ id: "why-now", start: 28, duration: 8 },
{ id: "market", start: 36, duration: 8 },
{ id: "product", start: 44, duration: 8 },
{ id: "traction", start: 52, duration: 8 },
{ id: "team", start: 60, duration: 8 },
{ id: "ask", start: 68, duration: 8 },
{ id: "market-drill", start: 76, duration: 8 }
];
function postTimeline() {
parent.postMessage({
source: "hf-preview",
type: "timeline",
durationInFrames: totalFrames,
scenes: scenes
}, "*");
}
// Post after a brief delay to let the parent frame settle
if (window.requestAnimationFrame) {
var delayed = function (deadline) {
// ~300ms after load
setTimeout(postTimeline, 300);
};
if (document.readyState === "complete") {
delayed();
} else {
window.addEventListener("load", delayed);
}
} else {
setTimeout(postTimeline, 300);
}
})();
</script>
</body>
</html>
@@ -0,0 +1,116 @@
<svg viewBox="0 0 1920 1080" xmlns="http://www.w3.org/2000/svg">
<rect width="1920" height="1080" fill="#F2F2F2" />
<g id="thin-grid-lines" stroke="#0A1E3D" stroke-width="1" opacity="0.1">
<line id="v-thin-1" x1="60" y1="0" x2="60" y2="1080" />
<line id="v-thin-2" x1="120" y1="0" x2="120" y2="1080" />
<line id="v-thin-3" x1="180" y1="0" x2="180" y2="1080" />
<line id="v-thin-5" x1="300" y1="0" x2="300" y2="1080" />
<line id="v-thin-6" x1="360" y1="0" x2="360" y2="1080" />
<line id="v-thin-7" x1="420" y1="0" x2="420" y2="1080" />
<line id="v-thin-9" x1="540" y1="0" x2="540" y2="1080" />
<line id="v-thin-10" x1="600" y1="0" x2="600" y2="1080" />
<line id="v-thin-11" x1="660" y1="0" x2="660" y2="1080" />
<line id="v-thin-13" x1="780" y1="0" x2="780" y2="1080" />
<line id="v-thin-14" x1="840" y1="0" x2="840" y2="1080" />
<line id="v-thin-15" x1="900" y1="0" x2="900" y2="1080" />
<line id="v-thin-17" x1="1020" y1="0" x2="1020" y2="1080" />
<line id="v-thin-18" x1="1080" y1="0" x2="1080" y2="1080" />
<line id="v-thin-19" x1="1140" y1="0" x2="1140" y2="1080" />
<line id="v-thin-21" x1="1260" y1="0" x2="1260" y2="1080" />
<line id="v-thin-22" x1="1320" y1="0" x2="1320" y2="1080" />
<line id="v-thin-23" x1="1380" y1="0" x2="1380" y2="1080" />
<line id="v-thin-25" x1="1500" y1="0" x2="1500" y2="1080" />
<line id="v-thin-26" x1="1560" y1="0" x2="1560" y2="1080" />
<line id="v-thin-27" x1="1620" y1="0" x2="1620" y2="1080" />
<line id="v-thin-29" x1="1740" y1="0" x2="1740" y2="1080" />
<line id="v-thin-30" x1="1800" y1="0" x2="1800" y2="1080" />
<line id="v-thin-31" x1="1860" y1="0" x2="1860" y2="1080" />
<line id="h-thin-1" x1="0" y1="60" x2="1920" y2="60" />
<line id="h-thin-2" x1="0" y1="120" x2="1920" y2="120" />
<line id="h-thin-3" x1="0" y1="180" x2="1920" y2="180" />
<line id="h-thin-5" x1="0" y1="300" x2="1920" y2="300" />
<line id="h-thin-6" x1="0" y1="360" x2="1920" y2="360" />
<line id="h-thin-7" x1="0" y1="420" x2="1920" y2="420" />
<line id="h-thin-9" x1="0" y1="540" x2="1920" y2="540" />
<line id="h-thin-10" x1="0" y1="600" x2="1920" y2="600" />
<line id="h-thin-11" x1="0" y1="660" x2="1920" y2="660" />
<line id="h-thin-13" x1="0" y1="780" x2="1920" y2="780" />
<line id="h-thin-14" x1="0" y1="840" x2="1920" y2="840" />
<line id="h-thin-15" x1="0" y1="900" x2="1920" y2="900" />
<line id="h-thin-17" x1="0" y1="1020" x2="1920" y2="1020" />
</g>
<g id="thick-grid-lines" stroke="#0A1E3D" stroke-width="3" opacity="0.2">
<line id="v-thick-1" x1="240" y1="0" x2="240" y2="1080" />
<line id="v-thick-2" x1="480" y1="0" x2="480" y2="1080" />
<line id="v-thick-3" x1="720" y1="0" x2="720" y2="1080" />
<line id="v-thick-4" x1="960" y1="0" x2="960" y2="1080" />
<line id="v-thick-5" x1="1200" y1="0" x2="1200" y2="1080" />
<line id="v-thick-6" x1="1440" y1="0" x2="1440" y2="1080" />
<line id="v-thick-7" x1="1680" y1="0" x2="1680" y2="1080" />
<line id="h-thick-1" x1="0" y1="240" x2="1920" y2="240" />
<line id="h-thick-2" x1="0" y1="480" x2="1920" y2="480" />
<line id="h-thick-3" x1="0" y1="720" x2="1920" y2="720" />
<line id="h-thick-4" x1="0" y1="960" x2="1920" y2="960" />
</g>
<g id="intersections" stroke="#0A1E3D" stroke-width="2" opacity="0.3">
<line x1="230" y1="240" x2="250" y2="240" />
<line x1="240" y1="230" x2="240" y2="250" />
<line x1="230" y1="480" x2="250" y2="480" />
<line x1="240" y1="470" x2="240" y2="490" />
<line x1="230" y1="720" x2="250" y2="720" />
<line x1="240" y1="710" x2="240" y2="730" />
<line x1="230" y1="960" x2="250" y2="960" />
<line x1="240" y1="950" x2="240" y2="970" />
<line x1="470" y1="240" x2="490" y2="240" />
<line x1="480" y1="230" x2="480" y2="250" />
<line x1="470" y1="480" x2="490" y2="480" />
<line x1="480" y1="470" x2="480" y2="490" />
<line x1="470" y1="720" x2="490" y2="720" />
<line x1="480" y1="710" x2="480" y2="730" />
<line x1="470" y1="960" x2="490" y2="960" />
<line x1="480" y1="950" x2="480" y2="970" />
<line x1="710" y1="240" x2="730" y2="240" />
<line x1="720" y1="230" x2="720" y2="250" />
<line x1="710" y1="480" x2="730" y2="480" />
<line x1="720" y1="470" x2="720" y2="490" />
<line x1="710" y1="720" x2="730" y2="720" />
<line x1="720" y1="710" x2="720" y2="730" />
<line x1="710" y1="960" x2="730" y2="960" />
<line x1="720" y1="950" x2="720" y2="970" />
<line x1="950" y1="240" x2="970" y2="240" />
<line x1="960" y1="230" x2="960" y2="250" />
<line x1="950" y1="480" x2="970" y2="480" />
<line x1="960" y1="470" x2="960" y2="490" />
<line x1="950" y1="720" x2="970" y2="720" />
<line x1="960" y1="710" x2="960" y2="730" />
<line x1="950" y1="960" x2="970" y2="960" />
<line x1="960" y1="950" x2="960" y2="970" />
<line x1="1190" y1="240" x2="1210" y2="240" />
<line x1="1200" y1="230" x2="1200" y2="250" />
<line x1="1190" y1="480" x2="1210" y2="480" />
<line x1="1200" y1="470" x2="1200" y2="490" />
<line x1="1190" y1="720" x2="1210" y2="720" />
<line x1="1200" y1="710" x2="1200" y2="730" />
<line x1="1190" y1="960" x2="1210" y2="960" />
<line x1="1200" y1="950" x2="1200" y2="970" />
<line x1="1430" y1="240" x2="1450" y2="240" />
<line x1="1440" y1="230" x2="1440" y2="250" />
<line x1="1430" y1="480" x2="1450" y2="480" />
<line x1="1440" y1="470" x2="1440" y2="490" />
<line x1="1430" y1="720" x2="1450" y2="720" />
<line x1="1440" y1="710" x2="1440" y2="730" />
<line x1="1430" y1="960" x2="1450" y2="960" />
<line x1="1440" y1="950" x2="1440" y2="970" />
<line x1="1670" y1="240" x2="1690" y2="240" />
<line x1="1680" y1="230" x2="1680" y2="250" />
<line x1="1670" y1="480" x2="1690" y2="480" />
<line x1="1680" y1="470" x2="1680" y2="490" />
<line x1="1670" y1="720" x2="1690" y2="720" />
<line x1="1680" y1="710" x2="1680" y2="730" />
<line x1="1670" y1="960" x2="1690" y2="960" />
<line x1="1680" y1="950" x2="1680" y2="970" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

+220
View File
@@ -0,0 +1,220 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Swiss Grid - Hyperframes</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
body,
html {
margin: 0;
padding: 0;
width: 1920px;
height: 1080px;
background-color: #f2f2f2;
overflow: hidden;
font-family: "Helvetica", Arial, sans-serif;
}
#master-root {
width: 1920px;
height: 1080px;
position: relative;
}
.background-grid {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
}
/* A-roll styling */
#short_mag_cut_frame {
position: absolute;
border-radius: 8px; /* Required */
z-index: 1;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
overflow: hidden;
background: #000;
}
#short_mag_cut,
#short_mag_cut_frame > img.__render_frame__,
#short_mag_cut_frame > img.__preview_render_frame__ {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
display: block;
}
/* Overlay layers */
.overlay-layer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
#intro-comp {
z-index: 2;
}
#graphics-comp {
z-index: 3;
}
#captions-comp {
z-index: 4;
}
</style>
</head>
<body>
<div
id="master-root"
data-composition-id="master"
data-width="1920"
data-height="1080"
data-start="0"
data-duration="__VIDEO_DURATION__"
>
<!-- Background Grid -->
<img id="bg-grid" class="background-grid" src="assets/swiss-grid.svg" alt="Grid" />
<!-- Intro Sub-composition -->
<div
id="intro-comp"
class="overlay-layer"
data-composition-id="intro"
data-composition-src="compositions/intro.html"
data-start="0"
data-duration="1.86"
data-track-index="2"
></div>
<!-- Graphics Sub-composition -->
<div
id="graphics-comp"
class="overlay-layer"
data-composition-id="graphics"
data-composition-src="compositions/graphics.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="3"
></div>
<!-- Captions Sub-composition -->
<div
id="captions-comp"
class="overlay-layer"
data-composition-id="captions"
data-composition-src="compositions/captions.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="4"
></div>
<script>
window.__timelines = window.__timelines || {};
const masterTL = gsap.timeline({ paused: true });
const v = document.getElementById("short_mag_cut_frame");
// --- A-ROLL MOVEMENT (Structured Swiss Layout) ---
// 1. Entrance (0-1.86s): Slide in from left, settle centered for Intro
masterTL.fromTo(
v,
{ x: -1000, y: 120, width: 960, height: 840 },
{ x: 480, y: 120, width: 960, height: 840, duration: 0.8, ease: "power2.out" },
0,
);
// 2. Stat 1 (1.86s - 4.68s): Move to right side (Graphic is on left)
masterTL.to(
v,
{
x: 1080,
y: 120,
width: 720,
height: 720,
duration: 0.25,
ease: "expo.out",
},
1.86,
);
// 3. Stat 2 (4.68s - 8.88s): Stay right, zoom in slightly
masterTL.to(
v,
{
x: 1080,
y: 60,
width: 780,
height: 780,
duration: 0.25,
ease: "expo.out",
},
4.68,
);
// 4. Stat 3 (8.88s - 14.2s): Move to left side (Graphic is on right)
masterTL.to(
v,
{
x: 120,
y: 120,
width: 720,
height: 720,
duration: 0.25,
ease: "expo.out",
},
8.88,
);
// 5. Conclusion (14.2s - 16.04s): Center large
masterTL.to(
v,
{
x: 240,
y: 60,
width: 1440,
height: 810,
duration: 0.5,
ease: "expo.out",
},
14.2,
);
window.__timelines["master"] = masterTL;
</script>
</div>
<!-- A-roll Video (direct child of body to avoid video_nested_in_timed_element) -->
<div id="short_mag_cut_frame">
<video
id="short_mag_cut"
src="__VIDEO_SRC__"
muted
playsinline
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="1"
></video>
</div>
<audio
id="a-roll-audio"
src="__VIDEO_SRC__"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="5"
data-volume="1"
></audio>
</body>
</html>
@@ -0,0 +1,39 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "swiss-grid",
"type": "hyperframes:example",
"title": "Swiss Grid",
"description": "Structured grid layout",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 10,
"files": [
{
"path": "assets/swiss-grid.svg",
"target": "assets/swiss-grid.svg",
"type": "hyperframes:asset"
},
{
"path": "compositions/captions.html",
"target": "compositions/captions.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/graphics.html",
"target": "compositions/graphics.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/intro.html",
"target": "compositions/intro.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
+194
View File
@@ -0,0 +1,194 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Massimo Vignelli Video</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
body,
html {
margin: 0;
padding: 0;
background: #ffffff;
overflow: hidden;
width: 1080px;
height: 1920px;
font-family: "Helvetica", Arial, sans-serif;
}
/* 6-Column Grid System */
.grid-container {
position: absolute;
top: 0;
left: 0;
width: 1080px;
height: 1920px;
display: grid;
grid-template-columns: repeat(6, 1fr);
pointer-events: none;
z-index: 1000;
opacity: 0; /* Keep grid invisible but present for layout references */
}
.grid-column {
border-right: 1px solid rgba(204, 0, 0, 0.2); /* Vignelli Red accent */
}
#main-composition {
position: relative;
width: 1080px;
height: 1920px;
background: #ffffff;
overflow: hidden;
}
/* Layer Hosts */
#a-roll-wrapper {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 10;
overflow: hidden;
}
#a-roll,
#a-roll-wrapper img.__render_frame__,
#a-roll-wrapper img.__preview_render_frame__ {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
#overlays-comp,
#captions-comp {
position: absolute;
top: 0;
left: 0;
width: 1080px;
height: 1920px;
pointer-events: none;
}
#overlays-comp {
z-index: 20;
}
#captions-comp {
z-index: 30;
}
/* Curtain Transition Layer */
.curtain {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #1a1a1a;
z-index: 25;
pointer-events: none;
}
.curtain.red {
background: #cc0000;
z-index: 26;
}
</style>
</head>
<body>
<div
id="main-composition"
data-composition-id="main-comp"
data-width="1080"
data-height="1920"
data-start="0"
data-duration="__VIDEO_DURATION__"
>
<!-- Transitions -->
<div id="curtain-black" class="curtain"></div>
<div id="curtain-red" class="curtain red"></div>
<!-- Overlays Composition -->
<div
id="overlays-comp"
data-composition-id="overlays"
data-composition-src="compositions/overlays.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="2"
></div>
<!-- Captions Composition -->
<div
id="captions-comp"
data-composition-id="captions"
data-composition-src="compositions/captions.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="3"
></div>
<!-- Grid Visualization -->
<div class="grid-container">
<div class="grid-column"></div>
<div class="grid-column"></div>
<div class="grid-column"></div>
<div class="grid-column"></div>
<div class="grid-column"></div>
<div class="grid-column"></div>
</div>
<script>
const tl = gsap.timeline({ paused: true });
// Curtains rest off-screen left until their wipes begin.
gsap.set("#curtain-black", { xPercent: -100 });
gsap.set("#curtain-red", { xPercent: -100 });
// Transition: Curtain Pull logic
// A-roll leaves the screen at least once.
// Timing: Let's do a curtain pull at 3.7s (transitioning to the 62% stat)
// and return at 7.3s (end of attention stat).
// Curtain Out (A-roll hidden)
tl.to("#curtain-black", { xPercent: 0, duration: 0.2, ease: "power2.inOut" }, 3.5);
tl.to("#a-roll-wrapper", { opacity: 0, duration: 0 }, 3.7);
tl.to("#curtain-black", { xPercent: 100, duration: 0.4, ease: "power2.inOut" }, 3.7);
// Curtain In (A-roll return)
tl.set("#curtain-red", { xPercent: -100 }, 7.1);
tl.to("#curtain-red", { xPercent: 0, duration: 0.2, ease: "power2.inOut" }, 7.1);
tl.to("#a-roll-wrapper", { opacity: 1, duration: 0 }, 7.3);
tl.to("#curtain-red", { xPercent: 100, duration: 0.4, ease: "power2.inOut" }, 7.3);
window.__timelines = window.__timelines || {};
window.__timelines["main-comp"] = tl;
</script>
</div>
<!-- A-Roll (direct child of body to avoid video_nested_in_timed_element) -->
<div id="a-roll-wrapper">
<video
id="a-roll"
src="__VIDEO_SRC__"
muted
playsinline
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="0"
></video>
</div>
<audio
id="a-roll-audio"
src="__VIDEO_SRC__"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="5"
data-volume="1"
></audio>
</body>
</html>
@@ -0,0 +1,29 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "vignelli",
"type": "hyperframes:example",
"title": "Vignelli",
"description": "Bold typography with red accents",
"dimensions": {
"width": 1080,
"height": 1920
},
"duration": 10,
"files": [
{
"path": "compositions/captions.html",
"target": "compositions/captions.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/overlays.html",
"target": "compositions/overlays.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}
@@ -0,0 +1,42 @@
# VS Code Theme Visualizer Design Notes
## Intent
This POC should feel like a real VS Code tutorial capture, not a generic code window. The purpose is to prove that HyperFrames can render code-writing scenes with faithful product context and theme-aware polish.
## Visual Identity
The visual identity is sourced from official VS Code built-in theme JSON files from `microsoft/vscode/extensions/theme-defaults/themes`. Do not invent palette values for the workbench. Colors should flow through the generated theme registry and CSS variables.
## Theme Set
- Light 2026
- Dark 2026
- Dark+
- Dark Modern
- Light+
- Light Modern
- Visual Studio Dark
- Visual Studio Light
- Default High Contrast
- Default High Contrast Light
## Typography
- Workbench UI: `Inter`, then system UI fallbacks.
- Code and terminal: `Menlo`, `Monaco`, `Consolas`, then monospace fallbacks.
- Keep letter spacing at `0`.
## Layout Rules
- Recreate the VS Code workbench proportions: activity bar, explorer sidebar, editor tabs, editor gutter, status bar, and optional terminal panel.
- Use official theme colors for editor, sidebar, tabs, activity bar, panel, terminal, and status bar surfaces.
- Keep the composition full-frame at 1920x1080.
- Cards are allowed only for the theme selector strip because they are repeated selectable items.
- Do not use decorative gradients, glows, or synthetic color accents outside theme-derived colors.
## Motion Rules
- Theme changes should feel like command-palette theme switching: quick, crisp, and functional.
- Code typing is the hero action. UI chrome should support it without becoming theatrical.
- All animation must be deterministic and GSAP-controlled.
Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

@@ -0,0 +1,390 @@
(() => {
const codeLines = [
[{ text: "# A small functional toolkit", token: "comment" }],
[
{ text: "def", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "pluck_deep", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "key", token: "parameter" },
{ text: "):", token: "punctuation" },
],
[
{ text: " ", token: "plain" },
{ text: "return", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "lambda", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "obj", token: "parameter" },
{ text: ": ", token: "punctuation" },
{ text: "reduce", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "lambda", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "acc", token: "parameter" },
{ text: ", ", token: "punctuation" },
{ text: "k", token: "parameter" },
{ text: ": ", token: "punctuation" },
{ text: "acc", token: "variable" },
{ text: "[", token: "punctuation" },
{ text: "k", token: "variable" },
{ text: "]", token: "punctuation" },
{ text: ", ", token: "punctuation" },
{ text: "key", token: "variable" },
{ text: ".split", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "'.'", token: "string" },
{ text: "), ", token: "punctuation" },
{ text: "obj", token: "variable" },
{ text: ")", token: "punctuation" },
],
[],
[
{ text: "def", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "compose", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "*", token: "operator" },
{ text: "fns", token: "parameter" },
{ text: "):", token: "punctuation" },
],
[
{ text: " ", token: "plain" },
{ text: "return", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "lambda", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "res", token: "parameter" },
{ text: ": ", token: "punctuation" },
{ text: "reduce", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "lambda", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "acc", token: "parameter" },
{ text: ", ", token: "punctuation" },
{ text: "fn", token: "parameter" },
{ text: ": ", token: "punctuation" },
{ text: "fn", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "acc", token: "variable" },
{ text: "), ", token: "punctuation" },
{ text: "fns", token: "variable" },
{ text: ", ", token: "punctuation" },
{ text: "res", token: "variable" },
{ text: ")", token: "punctuation" },
],
[],
[
{ text: "def", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "unfold", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "f", token: "parameter" },
{ text: ", ", token: "punctuation" },
{ text: "seed", token: "parameter" },
{ text: "):", token: "punctuation" },
],
[
{ text: " ", token: "plain" },
{ text: '"""Build a list by repeatedly applying f to a seed."""', token: "string" },
],
[
{ text: " acc", token: "variable" },
{ text: " = ", token: "operator" },
{ text: "[]", token: "punctuation" },
],
[
{ text: " while", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "True", token: "className" },
{ text: ":", token: "punctuation" },
],
[
{ text: " result", token: "variable" },
{ text: " = ", token: "operator" },
{ text: "f", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "seed", token: "variable" },
{ text: ")", token: "punctuation" },
],
[
{ text: " if", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "result", token: "variable" },
{ text: " is ", token: "keyword" },
{ text: "None", token: "className" },
{ text: ":", token: "punctuation" },
],
[
{ text: " return", token: "keyword" },
{ text: " ", token: "plain" },
{ text: "acc", token: "variable" },
],
[
{ text: " acc", token: "variable" },
{ text: ".append", token: "function" },
{ text: "(", token: "punctuation" },
{ text: "result", token: "variable" },
{ text: "[", token: "punctuation" },
{ text: "0", token: "number" },
{ text: "])", token: "punctuation" },
],
[
{ text: " seed", token: "variable" },
{ text: " = ", token: "operator" },
{ text: "result", token: "variable" },
{ text: "[", token: "punctuation" },
{ text: "1", token: "number" },
{ text: "]", token: "punctuation" },
],
[],
];
const fallback = {
"activityBar.background": "#181818",
"activityBar.foreground": "#d7d7d7",
"activityBar.inactiveForeground": "#868686",
"activityBar.activeBorder": "#0078d4",
"sideBar.background": "#181818",
"sideBar.foreground": "#cccccc",
"sideBar.border": "#2b2b2b",
"tab.activeBackground": "#1f1f1f",
"tab.activeForeground": "#ffffff",
"tab.inactiveBackground": "#181818",
"tab.inactiveForeground": "#9d9d9d",
"tab.border": "#2b2b2b",
"editor.background": "#1f1f1f",
"editor.foreground": "#cccccc",
"editor.lineHighlightBackground": "#ffffff0a",
"editorLineNumber.foreground": "#6e7681",
"editorLineNumber.activeForeground": "#cccccc",
"panel.background": "#181818",
"panel.border": "#2b2b2b",
"statusBar.background": "#181818",
"statusBar.foreground": "#cccccc",
"statusBar.border": "#2b2b2b",
"titleBar.activeBackground": "#181818",
"titleBar.activeForeground": "#cccccc",
};
function color(theme, key) {
return theme.colors[key] || fallback[key] || theme.colors.foreground || "#cccccc";
}
function solarizedGrey(theme) {
return theme.colors["tab.inactiveForeground"] || theme.colors["editor.foreground"] || "#586E75";
}
function setVar(root, name, value) {
root.style.setProperty(name, value);
}
function applyTheme(root, theme) {
const solarizedUiGrey = theme.id === "solarized-light" ? solarizedGrey(theme) : null;
setVar(root, "--activity-bg", color(theme, "activityBar.background"));
setVar(root, "--activity-fg", solarizedUiGrey || color(theme, "activityBar.foreground"));
setVar(
root,
"--activity-muted",
solarizedUiGrey || color(theme, "activityBar.inactiveForeground"),
);
setVar(root, "--activity-active", color(theme, "activityBar.activeBorder"));
setVar(root, "--sidebar-bg", color(theme, "sideBar.background"));
setVar(root, "--sidebar-fg", solarizedUiGrey || color(theme, "sideBar.foreground"));
setVar(root, "--sidebar-border", color(theme, "sideBar.border"));
setVar(root, "--tab-bg", color(theme, "tab.inactiveBackground"));
setVar(root, "--tab-active-bg", color(theme, "tab.activeBackground"));
setVar(root, "--tab-active-fg", solarizedUiGrey || color(theme, "tab.activeForeground"));
setVar(root, "--tab-inactive-fg", solarizedUiGrey || color(theme, "tab.inactiveForeground"));
setVar(root, "--tab-border", color(theme, "tab.border"));
setVar(root, "--editor-bg", color(theme, "editor.background"));
setVar(root, "--editor-fg", color(theme, "editor.foreground"));
setVar(root, "--editor-line", color(theme, "editor.lineHighlightBackground"));
setVar(root, "--gutter-fg", color(theme, "editorLineNumber.foreground"));
setVar(root, "--gutter-active-fg", color(theme, "editorLineNumber.activeForeground"));
setVar(root, "--panel-bg", color(theme, "panel.background"));
setVar(root, "--panel-border", color(theme, "panel.border"));
setVar(root, "--status-bg", color(theme, "statusBar.background"));
setVar(root, "--status-fg", color(theme, "statusBar.foreground"));
setVar(root, "--status-border", color(theme, "statusBar.border"));
setVar(root, "--status-remote-bg", color(theme, "statusBarItem.remoteBackground"));
setVar(
root,
"--status-remote-fg",
solarizedUiGrey || color(theme, "statusBarItem.remoteForeground"),
);
setVar(root, "--title-bg", color(theme, "titleBar.activeBackground"));
setVar(root, "--title-fg", solarizedUiGrey || color(theme, "titleBar.activeForeground"));
setVar(root, "--token-comment", theme.tokens.comment);
setVar(root, "--token-keyword", theme.tokens.keyword);
setVar(root, "--token-function", theme.tokens.function);
setVar(root, "--token-string", theme.tokens.string);
setVar(root, "--token-number", theme.tokens.number);
setVar(root, "--token-variable", theme.tokens.variable);
setVar(root, "--token-parameter", theme.tokens.parameter);
setVar(root, "--token-operator", theme.tokens.operator);
setVar(root, "--token-punctuation", theme.tokens.punctuation);
setVar(root, "--token-class-name", theme.tokens.className);
}
function renderCode(root) {
const code = root.querySelector(".code");
codeLines.forEach((segments, index) => {
const line = document.createElement("div");
line.className = "line";
line.dataset.lineIndex = String(index);
const lineNumber = document.createElement("span");
lineNumber.className = "line-number";
lineNumber.textContent = String(index + 1);
line.appendChild(lineNumber);
const lineCode = document.createElement("span");
lineCode.className = "line-code";
segments.forEach((segment) => {
[...segment.text].forEach((char) => {
const span = document.createElement("span");
span.className =
segment.token === "plain"
? "char"
: "char tok-" + segment.token.replace(/[A-Z]/g, (match) => "-" + match.toLowerCase());
span.dataset.lineIndex = String(index);
span.textContent = char;
lineCode.appendChild(span);
});
});
line.appendChild(lineCode);
code.appendChild(line);
});
const caret = document.createElement("span");
caret.className = "caret";
root.querySelector(".editor").appendChild(caret);
}
function caretPointForElement(editor, el) {
const editorBox = editor.getBoundingClientRect();
const charBox = el.getBoundingClientRect();
return {
x: charBox.right - editorBox.left + 2,
y: charBox.top - editorBox.top + 3,
};
}
function caretPointForLineStart(editor, line) {
const editorBox = editor.getBoundingClientRect();
const lineBox = line.getBoundingClientRect();
const codeBox = line.querySelector(".line-code").getBoundingClientRect();
return {
x: codeBox.left - editorBox.left,
y: lineBox.top - editorBox.top + 3,
};
}
function lineHighlightY(editor, line) {
const editorBox = editor.getBoundingClientRect();
const lineBox = line.getBoundingClientRect();
return lineBox.top - editorBox.top;
}
function buildTimeline(root, compositionId) {
const tl = gsap.timeline({ paused: true });
const editor = root.querySelector(".editor");
const caret = root.querySelector(".caret");
const activeLine = root.querySelector(".active-line");
const lineEls = gsap.utils.toArray(root.querySelectorAll(".line"));
const lineStartTimes = [];
const charSchedule = [];
let cursorTime = 0.95;
lineEls.forEach((line, lineIndex) => {
const lineChars = gsap.utils.toArray(line.querySelectorAll(".char"));
lineStartTimes[lineIndex] = cursorTime;
lineChars.forEach((char, charIndex) => {
charSchedule.push({ char, time: cursorTime + charIndex * 0.012 });
});
cursorTime += Math.max(lineChars.length * 0.012, 0.08) + 0.045;
});
gsap.set(activeLine, { y: lineHighlightY(editor, lineEls[0]) });
gsap.set(caret, caretPointForLineStart(editor, lineEls[0]));
tl.from(
root.querySelector(".header"),
{ y: 24, opacity: 0, duration: 0.45, ease: "power3.out" },
0,
);
tl.from(
root.querySelector(".workbench"),
{ y: 42, opacity: 0, scale: 0.986, duration: 0.58, ease: "power3.out" },
0.1,
);
tl.from(activeLine, { opacity: 0, duration: 0.22, ease: "power2.out" }, 0.74);
lineStartTimes.forEach((time, lineIndex) => {
const line = lineEls[lineIndex];
tl.set(activeLine, { y: lineHighlightY(editor, line) }, time);
tl.set(caret, caretPointForLineStart(editor, line), time);
tl.call(
() => {
lineEls.forEach((item) => item.classList.toggle("is-active", item === line));
},
[],
time,
);
});
charSchedule.forEach(({ char, time }) => {
tl.set(char, { opacity: 1 }, time);
tl.set(caret, caretPointForElement(editor, char), time + 0.002);
});
tl.to(
root.querySelector(".caret"),
{ opacity: 0, duration: 0.34, repeat: 25, yoyo: true, ease: "steps(1)" },
0.95,
);
tl.from(
root.querySelector(".terminal"),
{ y: 140, opacity: 0, duration: 0.56, ease: "power3.out" },
7.55,
);
tl.from(
root.querySelector(".terminal-body").children,
{ opacity: 0, y: 8, duration: 0.24, stagger: 0.16, ease: "power2.out" },
8.05,
);
tl.to(
root.querySelector(".workbench"),
{ rotateY: -10.5, z: 74, duration: 0.72, ease: "power2.inOut" },
9.35,
);
tl.to(
root.querySelector(".workbench"),
{ rotateY: 0, z: 0, duration: 0.62, ease: "power2.inOut" },
10.08,
);
window.__timelines = window.__timelines || {};
window.__timelines[compositionId] = tl;
const previewTime = new URLSearchParams(window.location.search).get("t");
if (previewTime !== null) {
tl.time(Number(previewTime));
}
}
window.createVSCodeThemeComposition = (compositionId, themeOrId) => {
const root =
document.querySelector('[data-composition-id="' + compositionId + '"] .vscode-theme-scene') ||
document.querySelector('.vscode-theme-scene[data-composition-id="' + compositionId + '"]') ||
document.querySelector('[data-composition-id="' + compositionId + '"]');
const theme =
typeof themeOrId === "string"
? window.VSCODE_THEME_REGISTRY.find((item) => item.id === themeOrId)
: themeOrId;
if (!root || !theme) return;
root.querySelector(".theme-label").textContent = theme.label;
root.querySelector(".theme-source").textContent = theme.sourceFile;
applyTheme(root, theme);
renderCode(root);
buildTimeline(root, compositionId);
};
})();
@@ -0,0 +1,483 @@
* {
box-sizing: border-box;
letter-spacing: 0;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
font-family:
Inter,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
sans-serif;
}
.vscode-theme-scene {
--activity-bg: #181818;
--activity-fg: #d7d7d7;
--activity-muted: #868686;
--activity-active: #0078d4;
--sidebar-bg: #181818;
--sidebar-fg: #cccccc;
--sidebar-border: #2b2b2b;
--tab-bg: #181818;
--tab-active-bg: #1f1f1f;
--tab-active-fg: #ffffff;
--tab-inactive-fg: #9d9d9d;
--tab-border: #2b2b2b;
--editor-bg: #1f1f1f;
--editor-fg: #cccccc;
--editor-line: rgba(255, 255, 255, 0.04);
--gutter-fg: #6e7681;
--gutter-active-fg: #cccccc;
--panel-bg: #181818;
--panel-border: #2b2b2b;
--status-bg: #181818;
--status-fg: #cccccc;
--status-border: #2b2b2b;
--title-bg: #181818;
--title-fg: #cccccc;
--token-comment: #6a9955;
--token-keyword: #c586c0;
--token-function: #dcdcaa;
--token-string: #ce9178;
--token-number: #b5cea8;
--token-variable: #9cdcfe;
--token-parameter: #9cdcfe;
--token-operator: #d4d4d4;
--token-punctuation: #d4d4d4;
--token-class-name: #4ec9b0;
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background:
linear-gradient(180deg, rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 0.32)),
url("../assets/background.jpeg") center / cover no-repeat;
color: var(--editor-fg);
}
.scene-content {
position: relative;
z-index: 1;
width: 100%;
height: 100%;
padding: 54px 70px 92px;
display: flex;
flex-direction: column;
gap: 16px;
perspective: 2200px;
perspective-origin: 56% 52%;
}
.header {
display: flex;
align-items: end;
justify-content: space-between;
min-height: 66px;
text-shadow:
0 2px 12px rgba(0, 0, 0, 0.42),
0 14px 34px rgba(0, 0, 0, 0.32);
}
.kicker {
margin: 0 0 7px;
color: var(--gutter-fg);
font-size: 15px;
font-weight: 650;
text-transform: uppercase;
text-shadow:
0 2px 8px rgba(0, 0, 0, 0.48),
0 10px 26px rgba(0, 0, 0, 0.36);
}
.title {
margin: 0;
color: var(--editor-fg);
font-size: 44px;
line-height: 1;
font-weight: 760;
}
.source-note {
width: 510px;
color: var(--gutter-fg);
font-size: 16px;
line-height: 1.35;
text-align: right;
text-shadow:
0 2px 10px rgba(0, 0, 0, 0.46),
0 12px 30px rgba(0, 0, 0, 0.34);
}
.workbench {
height: 824px;
display: grid;
grid-template-columns: 54px 290px 1fr;
grid-template-rows: 36px 1fr 26px;
overflow: hidden;
border: 1px solid var(--sidebar-border);
border-radius: 8px;
background: var(--editor-bg);
box-shadow: 0 34px 90px rgba(0, 0, 0, 0.42);
transform: translateZ(0);
transform-origin: 82% 50%;
transform-style: preserve-3d;
will-change: transform;
}
.titlebar {
grid-column: 1 / -1;
display: grid;
grid-template-columns: 120px 1fr 210px;
align-items: center;
background: var(--title-bg);
color: var(--title-fg);
border-bottom: 1px solid var(--tab-border);
font-size: 12px;
}
.traffic {
display: flex;
gap: 8px;
padding-left: 18px;
}
.traffic span {
width: 12px;
height: 12px;
border-radius: 999px;
}
.traffic span:nth-child(1) {
background: #ff5f57;
}
.traffic span:nth-child(2) {
background: #ffbd2e;
}
.traffic span:nth-child(3) {
background: #28c840;
}
.window-title {
justify-self: center;
opacity: 0.84;
}
.command-center {
justify-self: end;
width: 176px;
height: 22px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid color-mix(in srgb, var(--title-fg), transparent 78%);
border-radius: 5px;
color: color-mix(in srgb, var(--title-fg), transparent 18%);
}
.activity {
grid-row: 2 / 3;
background: var(--activity-bg);
border-right: 1px solid var(--sidebar-border);
display: flex;
flex-direction: column;
align-items: center;
padding: 10px 0;
gap: 18px;
}
.activity-icon {
width: 28px;
height: 28px;
color: var(--activity-muted);
}
.activity-icon.active {
color: var(--activity-fg);
border-left: 2px solid var(--activity-active);
padding-left: 4px;
}
.sidebar {
grid-row: 2 / 3;
background: var(--sidebar-bg);
color: var(--sidebar-fg);
border-right: 1px solid var(--sidebar-border);
display: flex;
flex-direction: column;
min-width: 0;
}
.sidebar-title {
height: 38px;
display: flex;
align-items: center;
padding: 0 20px;
color: var(--sidebar-fg);
font-size: 11px;
text-transform: uppercase;
}
.section-title {
height: 24px;
display: flex;
align-items: center;
gap: 6px;
padding: 0 14px;
background: color-mix(in srgb, var(--sidebar-bg), var(--sidebar-fg) 5%);
border-top: 1px solid var(--sidebar-border);
border-bottom: 1px solid var(--sidebar-border);
color: var(--sidebar-fg);
font-size: 11px;
font-weight: 700;
}
.tree {
padding: 8px 0;
font-size: 13px;
line-height: 24px;
}
.tree-row {
height: 24px;
display: flex;
align-items: center;
gap: 7px;
padding: 0 10px 0 18px;
color: color-mix(in srgb, var(--sidebar-fg), transparent 8%);
white-space: nowrap;
}
.tree-row.child {
padding-left: 34px;
}
.tree-row.selected {
background: color-mix(in srgb, var(--sidebar-fg), transparent 88%);
color: var(--sidebar-fg);
}
.editor-area {
grid-row: 2 / 3;
display: grid;
grid-template-rows: 36px 30px 1fr 138px;
min-width: 0;
background: var(--editor-bg);
}
.tabs {
display: flex;
background: var(--tab-bg);
border-bottom: 1px solid var(--tab-border);
}
.tab {
width: 205px;
height: 36px;
display: flex;
align-items: center;
gap: 8px;
padding: 0 13px;
border-right: 1px solid var(--tab-border);
background: var(--tab-active-bg);
color: var(--tab-active-fg);
border-top: 2px solid var(--activity-active);
font-size: 13px;
}
.tab.inactive {
background: var(--tab-bg);
color: var(--tab-inactive-fg);
border-top-color: transparent;
}
.breadcrumbs {
display: flex;
align-items: center;
gap: 7px;
padding: 0 18px;
color: var(--gutter-fg);
border-bottom: 1px solid color-mix(in srgb, var(--tab-border), transparent 20%);
font-size: 12px;
}
.editor {
position: relative;
overflow: hidden;
background: var(--editor-bg);
color: var(--editor-fg);
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 18px;
line-height: 1.52;
}
.active-line {
position: absolute;
left: 0;
right: 0;
top: 0;
height: 28px;
background: var(--editor-line);
will-change: transform;
}
.code {
position: relative;
padding: 20px 36px 18px 0;
}
.line {
height: 28px;
display: grid;
grid-template-columns: 72px 1fr;
align-items: center;
}
.line-number {
padding-right: 18px;
color: var(--gutter-fg);
text-align: right;
user-select: none;
}
.line.is-active .line-number {
color: var(--gutter-active-fg);
}
.line-code {
white-space: pre;
}
.char {
opacity: 0;
}
.tok-comment {
color: var(--token-comment);
}
.tok-keyword {
color: var(--token-keyword);
}
.tok-function {
color: var(--token-function);
}
.tok-string {
color: var(--token-string);
}
.tok-number {
color: var(--token-number);
}
.tok-variable {
color: var(--token-variable);
}
.tok-parameter {
color: var(--token-parameter);
}
.tok-operator {
color: var(--token-operator);
}
.tok-punctuation {
color: var(--token-punctuation);
}
.tok-class-name {
color: var(--token-class-name);
}
.caret {
position: absolute;
left: 0;
top: 0;
z-index: 3;
display: block;
width: 2px;
height: 22px;
background: var(--editor-fg);
pointer-events: none;
will-change: transform, opacity;
}
.terminal {
display: grid;
grid-template-rows: 32px 1fr;
background: var(--panel-bg);
border-top: 1px solid var(--panel-border);
color: var(--editor-fg);
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 14px;
}
.panel-tabs {
display: flex;
align-items: center;
gap: 22px;
padding: 0 18px;
border-bottom: 1px solid var(--panel-border);
color: var(--gutter-fg);
font-family:
Inter,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
sans-serif;
font-size: 12px;
text-transform: uppercase;
}
.panel-tabs .active {
color: var(--editor-fg);
border-bottom: 1px solid var(--activity-active);
height: 32px;
display: flex;
align-items: center;
}
.terminal-body {
padding: 12px 20px;
color: var(--editor-fg);
line-height: 1.8;
}
.prompt {
color: var(--token-function);
}
.statusbar {
grid-column: 1 / -1;
display: flex;
align-items: center;
justify-content: space-between;
background: var(--status-bg);
color: var(--status-fg);
border-top: 1px solid var(--status-border);
font-size: 12px;
}
.status-left,
.status-right {
display: flex;
align-items: center;
gap: 18px;
padding: 0 12px;
}
.remote {
align-self: stretch;
display: flex;
align-items: center;
padding: 0 12px;
margin-left: -12px;
background: var(--status-remote-bg, var(--activity-active));
color: var(--status-remote-fg, #ffffff);
}
svg {
display: block;
}
@@ -0,0 +1,478 @@
// Generated by scripts/build-theme-registry.mjs from official VS Code theme JSON.
window.VSCODE_THEME_REGISTRY = [
{
id: "light-2026",
label: "Light 2026",
sourceFile: "2026-light.json",
uiTheme: "vs",
colors: {
"activityBar.activeBorder": "#000000",
"activityBar.background": "#FAFAFD",
"activityBar.border": "#F0F1F2FF",
"activityBar.foreground": "#202020",
"activityBar.inactiveForeground": "#606060",
"editor.background": "#FFFFFF",
"editor.foreground": "#202020",
"editor.lineHighlightBackground": "#EAEAEA40",
"editor.selectionBackground": "#0069CC40",
"editorGroup.border": "#E5E5E5",
"editorGroupHeader.tabsBackground": "#FAFAFD",
"editorGroupHeader.tabsBorder": "#F0F1F2FF",
"editorLineNumber.activeForeground": "#202020",
"editorLineNumber.foreground": "#606060",
foreground: "#202020",
"icon.foreground": "#606060",
"panel.background": "#FAFAFD",
"panel.border": "#F0F1F2FF",
"sideBar.background": "#FAFAFD",
"sideBar.border": "#F0F1F2FF",
"sideBar.foreground": "#202020",
"sideBarSectionHeader.background": "#FAFAFD",
"sideBarSectionHeader.border": "#F0F1F2FF",
"sideBarSectionHeader.foreground": "#202020",
"sideBarTitle.foreground": "#202020",
"statusBar.background": "#FAFAFD",
"statusBar.border": "#F0F1F2FF",
"statusBar.foreground": "#606060",
"statusBarItem.remoteBackground": "#005FB8",
"statusBarItem.remoteForeground": "#FFFFFF",
"tab.activeBackground": "#FFFFFF",
"tab.activeBorder": "#FFFFFF",
"tab.activeBorderTop": "#000000",
"tab.activeForeground": "#202020",
"tab.border": "#F0F1F2FF",
"tab.inactiveBackground": "#FAFAFD",
"tab.inactiveForeground": "#606060",
"terminal.foreground": "#3B3B3B",
"terminalCursor.foreground": "#202020",
"titleBar.activeBackground": "#FAFAFD",
"titleBar.activeForeground": "#606060",
},
tokens: {
comment: "#6e7781",
keyword: "#1f2328",
function: "#0550ae",
string: "#0a3069",
number: "#0550ae",
variable: "#1f2328",
parameter: "#953800",
operator: "#cf222e",
punctuation: "#953800",
className: "#116329",
},
},
{
id: "dark-2026",
label: "Dark 2026",
sourceFile: "2026-dark.json",
uiTheme: "vs-dark",
colors: {
"activityBar.activeBorder": "#bfbfbf",
"activityBar.background": "#191A1B",
"activityBar.border": "#2A2B2CFF",
"activityBar.foreground": "#bfbfbf",
"activityBar.inactiveForeground": "#8C8C8C",
"editor.background": "#121314",
"editor.foreground": "#BBBEBF",
"editor.lineHighlightBackground": "#242526",
"editor.selectionBackground": "#276782dd",
"editorGroup.border": "#FFFFFF17",
"editorGroupHeader.tabsBackground": "#191A1B",
"editorGroupHeader.tabsBorder": "#2A2B2CFF",
"editorLineNumber.activeForeground": "#BBBEBF",
"editorLineNumber.foreground": "#858889",
foreground: "#bfbfbf",
"icon.foreground": "#8C8C8C",
"panel.background": "#191A1B",
"panel.border": "#2A2B2CFF",
"sideBar.background": "#191A1B",
"sideBar.border": "#2A2B2CFF",
"sideBar.foreground": "#bfbfbf",
"sideBarSectionHeader.background": "#191A1B",
"sideBarSectionHeader.border": "#2A2B2CFF",
"sideBarSectionHeader.foreground": "#bfbfbf",
"sideBarTitle.foreground": "#bfbfbf",
"statusBar.background": "#191A1B",
"statusBar.border": "#2A2B2CFF",
"statusBar.foreground": "#8C8C8C",
"statusBarItem.remoteBackground": "#0078D4",
"statusBarItem.remoteForeground": "#FFFFFF",
"tab.activeBackground": "#121314",
"tab.activeBorder": "#121314",
"tab.activeBorderTop": "#3994BC",
"tab.activeForeground": "#bfbfbf",
"tab.border": "#2A2B2CFF",
"tab.inactiveBackground": "#191A1B",
"tab.inactiveForeground": "#8C8C8C",
"terminal.background": "#191A1B",
"terminal.foreground": "#CCCCCC",
"terminalCursor.foreground": "#bfbfbf",
"titleBar.activeBackground": "#191A1B",
"titleBar.activeForeground": "#8C8C8C",
},
tokens: {
comment: "#8b949e",
keyword: "#c9d1d9",
function: "#79c0ff",
string: "#a5d6ff",
number: "#79c0ff",
variable: "#c9d1d9",
parameter: "#ffa657",
operator: "#ff7b72",
punctuation: "#ffa657",
className: "#7ee787",
},
},
{
id: "dark-plus",
label: "Dark+",
sourceFile: "dark_plus.json",
uiTheme: "vs-dark",
colors: {
"editor.background": "#1E1E1E",
"editor.foreground": "#D4D4D4",
"sideBarSectionHeader.background": "#0000",
"sideBarSectionHeader.border": "#ccc3",
"sideBarTitle.foreground": "#BBBBBB",
"statusBarItem.remoteBackground": "#16825D",
"statusBarItem.remoteForeground": "#FFF",
},
tokens: {
comment: "#6A9955",
keyword: "#d7ba7d",
function: "#DCDCAA",
string: "#d16969",
number: "#b5cea8",
variable: "#4FC1FF",
parameter: "#9CDCFE",
operator: "#d7ba7d",
punctuation: "#CE9178",
className: "#4EC9B0",
},
},
{
id: "dark-modern",
label: "Dark Modern",
sourceFile: "dark_modern.json",
uiTheme: "vs-dark",
colors: {
"activityBar.activeBorder": "#0078D4",
"activityBar.background": "#181818",
"activityBar.border": "#2B2B2B",
"activityBar.foreground": "#D7D7D7",
"activityBar.inactiveForeground": "#868686",
"editor.background": "#1F1F1F",
"editor.foreground": "#CCCCCC",
"editorGroup.border": "#FFFFFF17",
"editorGroupHeader.tabsBackground": "#181818",
"editorGroupHeader.tabsBorder": "#2B2B2B",
"editorLineNumber.activeForeground": "#CCCCCC",
"editorLineNumber.foreground": "#6E7681",
foreground: "#CCCCCC",
"icon.foreground": "#CCCCCC",
"panel.background": "#181818",
"panel.border": "#2B2B2B",
"sideBar.background": "#181818",
"sideBar.border": "#2B2B2B",
"sideBar.foreground": "#CCCCCC",
"sideBarSectionHeader.background": "#181818",
"sideBarSectionHeader.border": "#2B2B2B",
"sideBarSectionHeader.foreground": "#CCCCCC",
"sideBarTitle.foreground": "#CCCCCC",
"statusBar.background": "#181818",
"statusBar.border": "#2B2B2B",
"statusBar.foreground": "#CCCCCC",
"statusBarItem.remoteBackground": "#0078D4",
"statusBarItem.remoteForeground": "#FFFFFF",
"tab.activeBackground": "#1F1F1F",
"tab.activeBorder": "#1F1F1F",
"tab.activeBorderTop": "#0078D4",
"tab.activeForeground": "#FFFFFF",
"tab.border": "#2B2B2B",
"tab.inactiveBackground": "#181818",
"tab.inactiveForeground": "#9D9D9D",
"terminal.foreground": "#CCCCCC",
"titleBar.activeBackground": "#181818",
"titleBar.activeForeground": "#CCCCCC",
},
tokens: {
comment: "#6A9955",
keyword: "#d7ba7d",
function: "#DCDCAA",
string: "#d16969",
number: "#b5cea8",
variable: "#4FC1FF",
parameter: "#9CDCFE",
operator: "#d7ba7d",
punctuation: "#CE9178",
className: "#4EC9B0",
},
},
{
id: "light-plus",
label: "Light+",
sourceFile: "light_plus.json",
uiTheme: "vs",
colors: {
"editor.background": "#FFFFFF",
"editor.foreground": "#000000",
"sideBarSectionHeader.background": "#0000",
"sideBarSectionHeader.border": "#61616130",
"sideBarTitle.foreground": "#6F6F6F",
"statusBarItem.remoteBackground": "#16825D",
"statusBarItem.remoteForeground": "#FFF",
},
tokens: {
comment: "#008000",
keyword: "#EE0000",
function: "#795E26",
string: "#811f3f",
number: "#098658",
variable: "#0070C1",
parameter: "#001080",
operator: "#EE0000",
punctuation: "#d16969",
className: "#267f99",
},
},
{
id: "light-modern",
label: "Light Modern",
sourceFile: "light_modern.json",
uiTheme: "vs",
colors: {
"activityBar.activeBorder": "#005FB8",
"activityBar.background": "#F8F8F8",
"activityBar.border": "#E5E5E5",
"activityBar.foreground": "#1F1F1F",
"activityBar.inactiveForeground": "#616161",
"editor.background": "#FFFFFF",
"editor.foreground": "#3B3B3B",
"editorGroup.border": "#E5E5E5",
"editorGroupHeader.tabsBackground": "#F8F8F8",
"editorGroupHeader.tabsBorder": "#E5E5E5",
"editorLineNumber.activeForeground": "#171184",
"editorLineNumber.foreground": "#6E7681",
foreground: "#3B3B3B",
"icon.foreground": "#3B3B3B",
"panel.background": "#F8F8F8",
"panel.border": "#E5E5E5",
"sideBar.background": "#F8F8F8",
"sideBar.border": "#E5E5E5",
"sideBar.foreground": "#3B3B3B",
"sideBarSectionHeader.background": "#F8F8F8",
"sideBarSectionHeader.border": "#E5E5E5",
"sideBarSectionHeader.foreground": "#3B3B3B",
"sideBarTitle.foreground": "#3B3B3B",
"statusBar.background": "#F8F8F8",
"statusBar.border": "#E5E5E5",
"statusBar.foreground": "#3B3B3B",
"statusBarItem.remoteBackground": "#005FB8",
"statusBarItem.remoteForeground": "#FFFFFF",
"tab.activeBackground": "#FFFFFF",
"tab.activeBorder": "#F8F8F8",
"tab.activeBorderTop": "#005FB8",
"tab.activeForeground": "#3B3B3B",
"tab.border": "#E5E5E5",
"tab.inactiveBackground": "#F8F8F8",
"tab.inactiveForeground": "#868686",
"terminal.foreground": "#3B3B3B",
"terminalCursor.foreground": "#005FB8",
"titleBar.activeBackground": "#F8F8F8",
"titleBar.activeForeground": "#1E1E1E",
},
tokens: {
comment: "#008000",
keyword: "#EE0000",
function: "#795E26",
string: "#811f3f",
number: "#098658",
variable: "#0070C1",
parameter: "#001080",
operator: "#EE0000",
punctuation: "#d16969",
className: "#267f99",
},
},
{
id: "visual-studio-dark",
label: "Visual Studio Dark",
sourceFile: "dark_vs.json",
uiTheme: "vs-dark",
colors: {
"editor.background": "#1E1E1E",
"editor.foreground": "#D4D4D4",
"sideBarSectionHeader.background": "#0000",
"sideBarSectionHeader.border": "#ccc3",
"sideBarTitle.foreground": "#BBBBBB",
"statusBarItem.remoteBackground": "#16825D",
"statusBarItem.remoteForeground": "#FFF",
},
tokens: {
comment: "#6A9955",
keyword: "#d4d4d4",
function: "#9cdcfe",
string: "#d16969",
number: "#b5cea8",
variable: "#569cd6",
parameter: "#9CDCFE",
operator: "#569cd6",
punctuation: "#569cd6",
className: "#9cdcfe",
},
},
{
id: "visual-studio-light",
label: "Visual Studio Light",
sourceFile: "light_vs.json",
uiTheme: "vs",
colors: {
"editor.background": "#FFFFFF",
"editor.foreground": "#000000",
"sideBarSectionHeader.background": "#0000",
"sideBarSectionHeader.border": "#61616130",
"sideBarTitle.foreground": "#6F6F6F",
"statusBarItem.remoteBackground": "#16825D",
"statusBarItem.remoteForeground": "#FFF",
},
tokens: {
comment: "#008000",
keyword: "#000000",
function: "#0451a5",
string: "#811f3f",
number: "#098658",
variable: "#0000ff",
parameter: "#9CDCFE",
operator: "#0000ff",
punctuation: "#800000",
className: "#0451a5",
},
},
{
id: "high-contrast",
label: "Default High Contrast",
sourceFile: "hc_black.json",
uiTheme: "vs-dark",
colors: {
"editor.background": "#000000",
"editor.foreground": "#FFFFFF",
"editor.selectionBackground": "#FFFFFF",
"sideBarTitle.foreground": "#FFFFFF",
"statusBarItem.remoteBackground": "#00000000",
},
tokens: {
comment: "#7ca668",
keyword: "#C586C0",
function: "#DCDCAA",
string: "#d16969",
number: "#b5cea8",
variable: "#9CDCFE",
parameter: "#9CDCFE",
operator: "#569cd6",
punctuation: "#4EC9B0",
className: "#4EC9B0",
},
},
{
id: "high-contrast-light",
label: "Default High Contrast Light",
sourceFile: "hc_light.json",
uiTheme: "vs",
colors: {
"statusBarItem.remoteBackground": "#FFFFFF",
"statusBarItem.remoteForeground": "#000000",
},
tokens: {
comment: "#515151",
keyword: "#EE0000",
function: "#5e2cbc",
string: "#811F3F",
number: "#096d48",
variable: "#02715D",
parameter: "#001080",
operator: "#EE0000",
punctuation: "#D16969",
className: "#185E73",
},
},
{
id: "solarized-light",
label: "Solarized Light",
sourceFile: "solarized-light-color-theme.json",
uiTheme: "vs",
colors: {
"activityBar.background": "#DDD6C1",
"activityBar.foreground": "#584c27",
"editor.background": "#FDF6E3",
"editor.foreground": "#657B83",
"editor.lineHighlightBackground": "#EEE8D5",
"editor.selectionBackground": "#EEE8D5",
"editorGroup.border": "#DDD6C1",
"editorGroupHeader.tabsBackground": "#D9D2C2",
"editorLineNumber.activeForeground": "#567983",
"panel.border": "#DDD6C1",
"sideBar.background": "#EEE8D5",
"sideBarTitle.foreground": "#586E75",
"statusBar.background": "#EEE8D5",
"statusBar.foreground": "#586E75",
"statusBarItem.remoteBackground": "#AC9D57",
"tab.activeBackground": "#FDF6E3",
"tab.border": "#DDD6C1",
"tab.inactiveBackground": "#D3CBB7",
"tab.inactiveForeground": "#586E75",
"terminal.background": "#FDF6E3",
"titleBar.activeBackground": "#EEE8D5",
},
tokens: {
comment: "#93A1A1",
keyword: "#CB4B16",
function: "#268BD2",
string: "#DC322F",
number: "#D33682",
variable: "#268BD2",
parameter: "#9CDCFE",
operator: "#859900",
punctuation: "#DC322F",
className: "#CB4B16",
},
},
{
id: "monokai",
label: "Monokai",
sourceFile: "monokai-color-theme.json",
uiTheme: "vs-dark",
colors: {
"activityBar.background": "#272822",
"activityBar.foreground": "#f8f8f2",
"editor.background": "#272822",
"editor.foreground": "#f8f8f2",
"editor.lineHighlightBackground": "#3e3d32",
"editor.selectionBackground": "#878b9180",
"editorGroup.border": "#34352f",
"editorGroupHeader.tabsBackground": "#1e1f1c",
"editorLineNumber.activeForeground": "#c2c2bf",
"editorLineNumber.foreground": "#90908a",
"panel.border": "#414339",
"sideBar.background": "#1e1f1c",
"sideBarSectionHeader.background": "#272822",
"statusBar.background": "#414339",
"statusBarItem.remoteBackground": "#AC6218",
"tab.border": "#1e1f1c",
"tab.inactiveBackground": "#34352f",
"tab.inactiveForeground": "#ccccc7",
"titleBar.activeBackground": "#1e1f1c",
},
tokens: {
comment: "#88846f",
keyword: "#66D9EF",
function: "#66D9EF",
string: "#AE81FF",
number: "#AE81FFA0",
variable: "#FD971F",
parameter: "#FD971F",
operator: "#F92672",
punctuation: "#A6E22E",
className: "#66D9EF",
},
},
];
@@ -0,0 +1,664 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "2026 Dark",
"include": "./dark_modern.json",
"type": "dark",
"colors": {
"foreground": "#bfbfbf",
"disabledForeground": "#555555",
"errorForeground": "#f48771",
"descriptionForeground": "#8C8C8C",
"icon.foreground": "#8C8C8C",
"focusBorder": "#3994BCB3",
"textBlockQuote.background": "#242526",
"textBlockQuote.border": "#2A2B2CFF",
"textCodeBlock.background": "#242526",
"textLink.foreground": "#48A0C7",
"textLink.activeForeground": "#53A5CA",
"textPreformat.background": "#262626",
"textPreformat.foreground": "#8C8C8C",
"textSeparator.foreground": "#2a2a2aFF",
"button.background": "#297AA0",
"button.foreground": "#FFFFFF",
"button.hoverBackground": "#2B7DA3",
"button.border": "#333536FF",
"button.secondaryHoverBackground": "#FFFFFF10",
"checkbox.background": "#242526",
"checkbox.border": "#333536",
"checkbox.foreground": "#8C8C8C",
"dropdown.background": "#191A1B",
"dropdown.border": "#333536",
"dropdown.foreground": "#bfbfbf",
"dropdown.listBackground": "#191A1B",
"input.background": "#191A1B",
"input.border": "#333536FF",
"input.foreground": "#bfbfbf",
"input.placeholderForeground": "#555555",
"inputOption.activeBackground": "#3994BC33",
"inputOption.activeForeground": "#bfbfbf",
"inputOption.activeBorder": "#2A2B2CFF",
"inputValidation.infoBackground": "#1E3A47",
"inputValidation.infoBorder": "#3994BC",
"inputValidation.infoForeground": "#bfbfbf",
"inputValidation.warningBackground": "#352A05",
"inputValidation.warningBorder": "#B89500",
"inputValidation.warningForeground": "#bfbfbf",
"inputValidation.errorBackground": "#3A1D1D",
"inputValidation.errorBorder": "#BE1100",
"inputValidation.errorForeground": "#bfbfbf",
"scrollbar.shadow": "#191B1D4D",
"scrollbarSlider.background": "#83848533",
"scrollbarSlider.hoverBackground": "#83848566",
"scrollbarSlider.activeBackground": "#83848599",
"badge.background": "#3994BCF0",
"badge.foreground": "#FFFFFF",
"progressBar.background": "#878889",
"list.activeSelectionBackground": "#3994BC26",
"list.activeSelectionForeground": "#ededed",
"list.inactiveSelectionBackground": "#2C2D2E",
"list.inactiveSelectionForeground": "#ededed",
"list.hoverBackground": "#FFFFFF0D",
"list.hoverForeground": "#bfbfbf",
"list.dropBackground": "#3994BC1A",
"toolbar.hoverBackground": "#FFFFFF18",
"list.focusBackground": "#3994BC26",
"list.focusForeground": "#bfbfbf",
"list.focusOutline": "#3994BCB3",
"list.highlightForeground": "#48A0C7",
"list.invalidItemForeground": "#444444",
"list.errorForeground": "#f48771",
"list.warningForeground": "#e5ba7d",
"activityBar.background": "#191A1B",
"activityBar.foreground": "#bfbfbf",
"activityBar.inactiveForeground": "#8C8C8C",
"activityBar.border": "#2A2B2CFF",
"activityBar.activeBorder": "#bfbfbf",
"activityBar.activeFocusBorder": "#3994BCB3",
"activityBarBadge.background": "#3994BC",
"activityBarBadge.foreground": "#FFFFFF",
"activityBarTop.activeBorder": "#bfbfbf",
"sideBar.background": "#191A1B",
"sideBar.foreground": "#bfbfbf",
"sideBar.border": "#2A2B2CFF",
"sideBarTitle.foreground": "#bfbfbf",
"sideBarSectionHeader.background": "#191A1B",
"sideBarSectionHeader.foreground": "#bfbfbf",
"sideBarSectionHeader.border": "#2A2B2CFF",
"titleBar.activeBackground": "#191A1B",
"titleBar.activeForeground": "#8C8C8C",
"titleBar.inactiveBackground": "#191A1B",
"titleBar.inactiveForeground": "#8C8C8C",
"titleBar.border": "#2A2B2CFF",
"menubar.selectionBackground": "#242526",
"menubar.selectionForeground": "#bfbfbf",
"menu.background": "#202122",
"menu.foreground": "#bfbfbf",
"menu.selectionBackground": "#3994BC26",
"menu.selectionForeground": "#bfbfbf",
"menu.separatorBackground": "#2A2B2C",
"menu.border": "#2A2B2CFF",
"commandCenter.foreground": "#bfbfbf",
"commandCenter.activeForeground": "#bfbfbf",
"commandCenter.background": "#191A1B",
"commandCenter.activeBackground": "#FFFFFF0F",
"commandCenter.border": "#2E3031",
"editor.background": "#121314",
"editor.foreground": "#BBBEBF",
"editorStickyScroll.background": "#121314",
"editorStickyScrollHover.background": "#202122",
"editorStickyScroll.border": "#2A2B2CFF",
"editorLineNumber.foreground": "#858889",
"editorLineNumber.activeForeground": "#BBBEBF",
"editorCursor.foreground": "#BBBEBF",
"editor.selectionBackground": "#276782dd",
"editor.inactiveSelectionBackground": "#27678260",
"editor.selectionHighlightBackground": "#27678260",
"editor.wordHighlightBackground": "#27678250",
"editor.wordHighlightStrongBackground": "#27678280",
"editor.findMatchBackground": "#27678290",
"editor.findMatchHighlightBackground": "#27678280",
"editor.findRangeHighlightBackground": "#242526",
"editor.hoverHighlightBackground": "#242526",
"editor.lineHighlightBackground": "#242526",
"editor.rangeHighlightBackground": "#242526",
"editorLink.activeForeground": "#3a94bc",
"editorWhitespace.foreground": "#8C8C8C4D",
"editorIndentGuide.background": "#8384854D",
"editorIndentGuide.activeBackground": "#838485",
"editorRuler.foreground": "#848484",
"editorCodeLens.foreground": "#8C8C8C",
"editorBracketMatch.background": "#3994BC55",
"editorBracketMatch.border": "#2A2B2CFF",
"editorWidget.background": "#202122",
"editorWidget.border": "#2A2B2CFF",
"editorWidget.foreground": "#bfbfbf",
"editorSuggestWidget.background": "#202122",
"editorSuggestWidget.border": "#2A2B2CFF",
"editorSuggestWidget.foreground": "#bfbfbf",
"editorSuggestWidget.highlightForeground": "#bfbfbf",
"editorSuggestWidget.selectedBackground": "#3994BC26",
"editorHoverWidget.background": "#202122",
"editorHoverWidget.border": "#2A2B2CFF",
"widget.border": "#2A2B2CFF",
"peekView.border": "#2A2B2CFF",
"peekViewEditor.background": "#191A1B",
"peekViewEditor.matchHighlightBackground": "#3994BC33",
"peekViewResult.background": "#191A1B",
"peekViewResult.fileForeground": "#bfbfbf",
"peekViewResult.lineForeground": "#8C8C8C",
"peekViewResult.matchHighlightBackground": "#3994BC33",
"peekViewResult.selectionBackground": "#3994BC26",
"peekViewResult.selectionForeground": "#bfbfbf",
"peekViewTitle.background": "#242526",
"peekViewTitleDescription.foreground": "#8C8C8C",
"peekViewTitleLabel.foreground": "#bfbfbf",
"editorGutter.background": "#121314",
"editorGutter.addedBackground": "#72C892",
"editorGutter.deletedBackground": "#F28772",
"diffEditor.insertedLineBackground": "#347d3926",
"diffEditor.insertedTextBackground": "#57ab5a4d",
"diffEditor.removedLineBackground": "#c93c3726",
"diffEditor.removedTextBackground": "#f470674d",
"editorOverviewRuler.border": "#2A2B2CFF",
"editorOverviewRuler.findMatchForeground": "#3a94bc99",
"editorOverviewRuler.modifiedForeground": "#6ab890",
"editorOverviewRuler.addedForeground": "#73c991",
"editorOverviewRuler.deletedForeground": "#f48771",
"editorOverviewRuler.errorForeground": "#f48771",
"editorOverviewRuler.warningForeground": "#e5ba7d",
"panel.background": "#191A1B",
"panel.border": "#2A2B2CFF",
"panelTitle.activeBorder": "#3994BC",
"panelTitle.activeForeground": "#bfbfbf",
"panelTitle.inactiveForeground": "#8C8C8C",
"statusBar.background": "#191A1B",
"statusBar.foreground": "#8C8C8C",
"statusBar.border": "#2A2B2CFF",
"statusBar.focusBorder": "#3994BCB3",
"statusBar.debuggingBackground": "#3994BC",
"statusBar.debuggingForeground": "#FFFFFF",
"statusBar.noFolderBackground": "#191A1B",
"statusBar.noFolderForeground": "#8C8C8C",
"statusBarItem.activeBackground": "#4B4C4D",
"statusBarItem.hoverBackground": "#262728",
"statusBarItem.focusBorder": "#3994BCB3",
"statusBarItem.prominentBackground": "#3994BC",
"statusBarItem.prominentForeground": "#FFFFFF",
"statusBarItem.prominentHoverBackground": "#3994BC",
"tab.activeBackground": "#121314",
"tab.activeForeground": "#bfbfbf",
"tab.inactiveBackground": "#191A1B",
"tab.inactiveForeground": "#8C8C8C",
"tab.border": "#2A2B2CFF",
"tab.lastPinnedBorder": "#2A2B2CFF",
"tab.activeBorderTop": "#3994BC",
"tab.hoverBackground": "#121314",
"tab.hoverForeground": "#bfbfbf",
"tab.unfocusedActiveBackground": "#121314",
"tab.unfocusedActiveForeground": "#8C8C8C",
"tab.unfocusedInactiveBackground": "#191A1B",
"tab.unfocusedInactiveForeground": "#444444",
"editorGroupHeader.tabsBackground": "#191A1B",
"tab.activeBorder": "#121314",
"editorGroupHeader.tabsBorder": "#2A2B2CFF",
"breadcrumb.foreground": "#8C8C8C",
"breadcrumb.background": "#121314",
"breadcrumb.focusForeground": "#bfbfbf",
"breadcrumb.activeSelectionForeground": "#bfbfbf",
"breadcrumbPicker.background": "#202122",
"notificationCenter.border": "#2A2B2CFF",
"notificationCenterHeader.foreground": "#bfbfbf",
"notificationCenterHeader.background": "#242526",
"notificationToast.border": "#2A2B2CFF",
"notifications.foreground": "#bfbfbf",
"notifications.background": "#202122",
"notifications.border": "#2A2B2CFF",
"notificationLink.foreground": "#3a94bc",
"notificationsWarningIcon.foreground": "#CCA700",
"notificationsErrorIcon.foreground": "#f48771",
"notificationsInfoIcon.foreground": "#3a94bc",
"activityWarningBadge.foreground": "#202020",
"activityWarningBadge.background": "#CCA700",
"activityErrorBadge.foreground": "#FFFFFF",
"activityErrorBadge.background": "#f48771",
"extensionButton.prominentBackground": "#297AA0",
"extensionButton.prominentForeground": "#FFFFFF",
"extensionButton.prominentHoverBackground": "#2B7DA3",
"pickerGroup.border": "#2A2B2CFF",
"pickerGroup.foreground": "#bfbfbf",
"quickInput.background": "#202122",
"quickInput.foreground": "#bfbfbf",
"quickInputList.focusBackground": "#297AA0",
"quickInputList.focusForeground": "#FFFFFF",
"quickInputList.focusIconForeground": "#FFFFFF",
"quickInputList.focusHighlightForeground": "#FFFFFF",
"quickInputList.hoverBackground": "#262728",
"terminal.selectionBackground": "#3994BC33",
"terminal.background": "#191A1B",
"terminal.border": "#2A2B2CFF",
"terminal.tab.activeBorder": "#3994BC00",
"terminalCursor.foreground": "#bfbfbf",
"terminalCursor.background": "#191A1B",
"gitDecoration.addedResourceForeground": "#73c991",
"gitDecoration.modifiedResourceForeground": "#e5ba7d",
"gitDecoration.deletedResourceForeground": "#f48771",
"gitDecoration.untrackedResourceForeground": "#73c991",
"gitDecoration.ignoredResourceForeground": "#8C8C8C",
"gitDecoration.conflictingResourceForeground": "#f48771",
"gitDecoration.stageModifiedResourceForeground": "#e5ba7d",
"gitDecoration.stageDeletedResourceForeground": "#f48771",
"quickInputTitle.background": "#202122",
"commandCenter.activeBorder": "#333536",
"quickInput.border": "#333536",
"gauge.foreground": "#59a4f9",
"gauge.background": "#58A4F94D",
"gauge.border": "#2A2C2EFF",
"gauge.warningForeground": "#e5ba7d",
"gauge.warningBackground": "#E3B97E4D",
"gauge.errorForeground": "#f48771",
"gauge.errorBackground": "#F287724D",
"chat.requestBubbleBackground": "#ffffff13",
"chat.requestBubbleHoverBackground": "#ffffff22",
"chat.inputWorkingBorderColor1": "#297AA0",
"chat.inputWorkingBorderColor2": "#1C546F",
"chat.inputWorkingBorderColor3": "#5BA8CC",
"editorCommentsWidget.rangeBackground": "#488FAE26",
"editorCommentsWidget.rangeActiveBackground": "#488FAE46",
"charts.foreground": "#CCCCCC",
"charts.lines": "#C8CACC80",
"charts.blue": "#57A3F8",
"charts.red": "#EF8773",
"charts.yellow": "#E0B97F",
"charts.orange": "#CD861A",
"charts.green": "#86CF86",
"charts.purple": "#AD80D7",
"inlineChat.border": "#00000000",
"minimapSlider.background": "#83848533",
"minimapSlider.hoverBackground": "#83848566",
"minimapSlider.activeBackground": "#83848599",
"agents.background": "#121314",
"agentsPanel.background": "#191A1B",
"agentsPanel.foreground": "#bfbfbf",
"agentsPanel.border": "#2A2B2CFF",
"agentsGradient.tintColor": "#297AA0",
"agentsChatInput.background": "#202122",
"agentsChatInput.foreground": "#bfbfbf",
"agentsChatInput.border": "#333536",
"agentsChatInput.focusBorder": "#3994BCB3",
"agentsChatInput.placeholderForeground": "#555555",
"agentsNewSessionButton.background": "#00000000",
"agentsNewSessionButton.foreground": "#bfbfbf",
"agentsNewSessionButton.border": "#333536",
"agentsNewSessionButton.hoverBackground": "#FFFFFF18",
"agentsBadge.background": "#3994BC",
"agentsBadge.foreground": "#FFFFFF",
"agentsUnreadBadge.background": "#3994BC",
"agentsUnreadBadge.foreground": "#FFFFFF"
},
"tokenColors": [
{
"scope": ["comment", "punctuation.definition.comment", "string.comment"],
"settings": {
"foreground": "#8b949e"
}
},
{
"scope": ["constant.other.placeholder", "constant.character"],
"settings": {
"foreground": "#ff7b72"
}
},
{
"scope": [
"constant",
"entity.name.constant",
"variable.other.constant",
"variable.other.enummember",
"variable.language",
"entity"
],
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": ["entity.name", "meta.export.default", "meta.definition.variable"],
"settings": {
"foreground": "#ffa657"
}
},
{
"scope": [
"variable.parameter.function",
"meta.jsx.children",
"meta.block",
"meta.tag.attributes",
"entity.name.constant",
"meta.object.member",
"meta.embedded.expression"
],
"settings": {
"foreground": "#c9d1d9"
}
},
{
"scope": "entity.name.function",
"settings": {
"foreground": "#d2a8ff"
}
},
{
"scope": ["entity.name.tag", "support.class.component"],
"settings": {
"foreground": "#7ee787"
}
},
{
"scope": "keyword",
"settings": {
"foreground": "#ff7b72"
}
},
{
"scope": ["storage", "storage.type"],
"settings": {
"foreground": "#ff7b72"
}
},
{
"scope": ["storage.modifier.package", "storage.modifier.import", "storage.type.java"],
"settings": {
"foreground": "#c9d1d9"
}
},
{
"scope": ["string", "string punctuation.section.embedded source"],
"settings": {
"foreground": "#a5d6ff"
}
},
{
"scope": "support",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": "meta.property-name",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": "variable",
"settings": {
"foreground": "#ffa657"
}
},
{
"scope": "variable.other",
"settings": {
"foreground": "#c9d1d9"
}
},
{
"scope": "invalid.broken",
"settings": {
"foreground": "#ffa198",
"fontStyle": "italic"
}
},
{
"scope": "invalid.deprecated",
"settings": {
"foreground": "#ffa198",
"fontStyle": "italic"
}
},
{
"scope": "invalid.illegal",
"settings": {
"foreground": "#ffa198",
"fontStyle": "italic"
}
},
{
"scope": "invalid.unimplemented",
"settings": {
"foreground": "#ffa198",
"fontStyle": "italic"
}
},
{
"scope": "carriage-return",
"settings": {
"foreground": "#f0f6fc",
"background": "#8b1111",
"fontStyle": "italic underline",
"content": "^M"
}
},
{
"scope": "message.error",
"settings": {
"foreground": "#ffa198"
}
},
{
"scope": "string variable",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": ["source.regexp", "string.regexp"],
"settings": {
"foreground": "#a5d6ff"
}
},
{
"scope": [
"string.regexp.character-class",
"string.regexp constant.character.escape",
"string.regexp source.ruby.embedded",
"string.regexp string.regexp.arbitrary-repitition"
],
"settings": {
"foreground": "#a5d6ff"
}
},
{
"scope": "string.regexp constant.character.escape",
"settings": {
"foreground": "#7ee787",
"fontStyle": "bold"
}
},
{
"scope": "support.constant",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": "support.variable",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": "support.type.property-name.json",
"settings": {
"foreground": "#7ee787"
}
},
{
"scope": "meta.module-reference",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": "punctuation.definition.list.begin.markdown",
"settings": {
"foreground": "#ffa657"
}
},
{
"scope": ["markup.heading", "markup.heading entity.name"],
"settings": {
"foreground": "#79c0ff",
"fontStyle": "bold"
}
},
{
"scope": "markup.quote",
"settings": {
"foreground": "#7ee787"
}
},
{
"scope": "markup.italic",
"settings": {
"foreground": "#c9d1d9",
"fontStyle": "italic"
}
},
{
"scope": "markup.bold",
"settings": {
"foreground": "#c9d1d9",
"fontStyle": "bold"
}
},
{
"scope": ["markup.underline"],
"settings": {
"fontStyle": "underline"
}
},
{
"scope": ["markup.strikethrough"],
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "markup.inline.raw",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": ["markup.deleted", "meta.diff.header.from-file", "punctuation.definition.deleted"],
"settings": {
"foreground": "#ffa198",
"background": "#490202"
}
},
{
"scope": ["punctuation.section.embedded"],
"settings": {
"foreground": "#ff7b72"
}
},
{
"scope": ["markup.inserted", "meta.diff.header.to-file", "punctuation.definition.inserted"],
"settings": {
"foreground": "#7ee787",
"background": "#04260f"
}
},
{
"scope": ["markup.changed", "punctuation.definition.changed"],
"settings": {
"foreground": "#ffa657",
"background": "#5a1e02"
}
},
{
"scope": ["markup.ignored", "markup.untracked"],
"settings": {
"foreground": "#0d1117",
"background": "#79c0ff"
}
},
{
"scope": "meta.diff.range",
"settings": {
"foreground": "#d2a8ff",
"fontStyle": "bold"
}
},
{
"scope": "meta.diff.header",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": "meta.separator",
"settings": {
"foreground": "#79c0ff",
"fontStyle": "bold"
}
},
{
"scope": "meta.output",
"settings": {
"foreground": "#79c0ff"
}
},
{
"scope": [
"brackethighlighter.tag",
"brackethighlighter.curly",
"brackethighlighter.round",
"brackethighlighter.square",
"brackethighlighter.angle",
"brackethighlighter.quote"
],
"settings": {
"foreground": "#8b949e"
}
},
{
"scope": "brackethighlighter.unmatched",
"settings": {
"foreground": "#ffa198"
}
},
{
"scope": ["constant.other.reference.link", "string.other.link"],
"settings": {
"foreground": "#a5d6ff"
}
},
{
"scope": "token.info-token",
"settings": {
"foreground": "#6796E6"
}
},
{
"scope": "token.warn-token",
"settings": {
"foreground": "#CD9731"
}
},
{
"scope": "token.error-token",
"settings": {
"foreground": "#F44747"
}
},
{
"scope": "token.debug-token",
"settings": {
"foreground": "#B267E6"
}
}
],
"semanticHighlighting": true
}
@@ -0,0 +1,646 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "2026 Light",
"include": "./light_modern.json",
"type": "light",
"colors": {
"foreground": "#202020",
"disabledForeground": "#BBBBBB",
"errorForeground": "#ad0707",
"descriptionForeground": "#606060",
"icon.foreground": "#606060",
"focusBorder": "#0069CCFF",
"textBlockQuote.background": "#EAEAEA",
"textBlockQuote.border": "#F0F1F2FF",
"textCodeBlock.background": "#EAEAEA",
"textLink.foreground": "#0069CC",
"textLink.activeForeground": "#0069CC",
"textPreformat.foreground": "#606060",
"textPreformat.background": "#ECECEC",
"textSeparator.foreground": "#EEEEEEFF",
"button.background": "#0069CC",
"button.foreground": "#FFFFFF",
"button.hoverBackground": "#0063C1",
"button.border": "#EEEEF1",
"button.secondaryBackground": "#EAEAEA",
"button.secondaryForeground": "#202020",
"button.secondaryHoverBackground": "#F2F3F4",
"checkbox.background": "#EAEAEA",
"checkbox.border": "#D8D8D8",
"checkbox.foreground": "#606060",
"dropdown.background": "#FFFFFF",
"dropdown.border": "#D8D8D8",
"dropdown.foreground": "#202020",
"dropdown.listBackground": "#FFFFFF",
"input.background": "#FFFFFF",
"input.border": "#D8D8D866",
"input.foreground": "#202020",
"input.placeholderForeground": "#999999",
"inputOption.activeBackground": "#0069CC26",
"inputOption.activeForeground": "#202020",
"inputOption.activeBorder": "#F0F1F2FF",
"inputValidation.infoBackground": "#E6F2FA",
"inputValidation.infoBorder": "#0069CC",
"inputValidation.infoForeground": "#202020",
"inputValidation.warningBackground": "#FDF6E3",
"inputValidation.warningBorder": "#B69500",
"inputValidation.warningForeground": "#202020",
"inputValidation.errorBackground": "#FDEDED",
"inputValidation.errorBorder": "#ad0707",
"inputValidation.errorForeground": "#202020",
"scrollbar.shadow": "#00000000",
"widget.shadow": "#00000000",
"widget.border": "#E2E2E5",
"editorStickyScroll.shadow": "#00000000",
"editorStickyScrollHover.background": "#F0F0F3",
"editorStickyScroll.border": "#F0F1F2FF",
"sideBarStickyScroll.shadow": "#00000000",
"panelStickyScroll.shadow": "#00000000",
"listFilterWidget.shadow": "#00000000",
"scrollbarSlider.background": "#99999926",
"scrollbarSlider.hoverBackground": "#99999940",
"scrollbarSlider.activeBackground": "#99999955",
"badge.background": "#0069CC",
"badge.foreground": "#FFFFFF",
"progressBar.background": "#0069CC",
"list.activeSelectionBackground": "#0069CC1A",
"list.activeSelectionForeground": "#202020",
"list.inactiveSelectionBackground": "#DADADA99",
"list.inactiveSelectionForeground": "#202020",
"list.hoverBackground": "#DADADA4f",
"list.hoverForeground": "#202020",
"list.dropBackground": "#0069CC15",
"list.focusBackground": "#0069CC1A",
"list.focusForeground": "#202020",
"list.focusOutline": "#0069CCFF",
"list.highlightForeground": "#0069CC",
"list.invalidItemForeground": "#BBBBBB",
"list.errorForeground": "#ad0707",
"list.warningForeground": "#667309",
"activityBar.background": "#FAFAFD",
"activityBar.foreground": "#202020",
"activityBar.inactiveForeground": "#606060",
"activityBar.border": "#F0F1F2FF",
"activityBar.activeBorder": "#000000",
"activityBar.activeFocusBorder": "#0069CCFF",
"activityBarBadge.background": "#0069CC",
"activityBarBadge.foreground": "#FFFFFF",
"activityBarTop.activeBorder": "#000000",
"sideBar.background": "#FAFAFD",
"sideBar.foreground": "#202020",
"sideBar.border": "#F0F1F2FF",
"sideBarTitle.foreground": "#202020",
"sideBarSectionHeader.background": "#FAFAFD",
"sideBarSectionHeader.foreground": "#202020",
"sideBarSectionHeader.border": "#F0F1F2FF",
"titleBar.activeBackground": "#FAFAFD",
"titleBar.activeForeground": "#606060",
"titleBar.inactiveBackground": "#FAFAFD",
"titleBar.inactiveForeground": "#606060",
"titleBar.border": "#F0F1F2FF",
"menubar.selectionBackground": "#EAEAEA",
"menubar.selectionForeground": "#202020",
"menu.background": "#FAFAFD",
"menu.foreground": "#202020",
"menu.selectionBackground": "#0069CC1A",
"menu.selectionForeground": "#202020",
"menu.separatorBackground": "#EEEEF1",
"menu.border": "#E4E5E6FF",
"commandCenter.foreground": "#202020",
"commandCenter.activeForeground": "#202020",
"commandCenter.background": "#FFFFFF",
"commandCenter.activeBackground": "#DADADA4f",
"commandCenter.border": "#D8D8D8AA",
"editor.background": "#FFFFFF",
"editor.foreground": "#202020",
"editorLineNumber.foreground": "#606060",
"editorLineNumber.activeForeground": "#202020",
"editorCursor.foreground": "#202020",
"editor.selectionBackground": "#0069CC40",
"editor.inactiveSelectionBackground": "#0069CC1A",
"editor.selectionHighlightBackground": "#0069CC15",
"editor.wordHighlightBackground": "#0069CC26",
"editor.wordHighlightStrongBackground": "#0069CC26",
"editor.findMatchBackground": "#0069CC40",
"editor.findMatchHighlightBackground": "#0069CC1A",
"editor.findRangeHighlightBackground": "#EAEAEA",
"editor.hoverHighlightBackground": "#EAEAEA",
"editor.lineHighlightBackground": "#EAEAEA40",
"editor.rangeHighlightBackground": "#EAEAEA",
"editorLink.activeForeground": "#0069CC",
"editorWhitespace.foreground": "#60606040",
"editorIndentGuide.background": "#F7F7F740",
"editorIndentGuide.activeBackground": "#EEEEEE",
"editorRuler.foreground": "#F7F7F7",
"editorCodeLens.foreground": "#606060",
"editorBracketMatch.background": "#0069CC40",
"editorBracketMatch.border": "#F0F1F2FF",
"editorWidget.background": "#FAFAFD",
"editorWidget.border": "#E4E5E6FF",
"editorWidget.foreground": "#202020",
"editorSuggestWidget.background": "#FAFAFD",
"editorSuggestWidget.border": "#E4E5E6FF",
"editorSuggestWidget.foreground": "#202020",
"editorSuggestWidget.highlightForeground": "#0069CC",
"editorSuggestWidget.selectedBackground": "#0069CC26",
"editorSuggestWidget.selectedForeground": "#202020",
"editorSuggestWidget.selectedIconForeground": "#202020",
"editorHoverWidget.background": "#FAFAFD",
"editorHoverWidget.border": "#E4E5E6FF",
"peekView.border": "#0069CC",
"peekViewEditor.background": "#FAFAFD",
"peekViewEditor.matchHighlightBackground": "#0069CC33",
"peekViewResult.background": "#FAFAFD",
"peekViewResult.fileForeground": "#202020",
"peekViewResult.lineForeground": "#606060",
"peekViewResult.matchHighlightBackground": "#0069CC33",
"peekViewResult.selectionBackground": "#0069CC26",
"peekViewResult.selectionForeground": "#202020",
"peekViewTitle.background": "#FAFAFD",
"peekViewTitleDescription.foreground": "#606060",
"peekViewTitleLabel.foreground": "#202020",
"editorGutter.addedBackground": "#587c0c",
"editorGutter.deletedBackground": "#ad0707",
"diffEditor.insertedTextBackground": "#587c0c26",
"diffEditor.removedTextBackground": "#ad070726",
"editorOverviewRuler.border": "#F0F1F2FF",
"editorOverviewRuler.findMatchForeground": "#0069CC99",
"editorOverviewRuler.modifiedForeground": "#0069CC",
"editorOverviewRuler.addedForeground": "#587c0c",
"editorOverviewRuler.deletedForeground": "#ad0707",
"editorOverviewRuler.errorForeground": "#ad0707",
"editorOverviewRuler.warningForeground": "#667309",
"editorGutter.background": "#FFFFFF",
"panel.background": "#FAFAFD",
"panel.border": "#F0F1F2FF",
"panelTitle.activeBorder": "#000000",
"panelTitle.activeForeground": "#202020",
"panelTitle.inactiveForeground": "#606060",
"statusBar.background": "#FAFAFD",
"statusBar.foreground": "#606060",
"statusBar.border": "#F0F1F2FF",
"statusBar.focusBorder": "#0069CCFF",
"statusBar.debuggingBackground": "#0069CC",
"statusBar.debuggingForeground": "#FFFFFF",
"statusBar.noFolderBackground": "#F0F0F3",
"statusBar.noFolderForeground": "#606060",
"statusBarItem.activeBackground": "#EEEEEE",
"statusBarItem.hoverBackground": "#DADADA4f",
"statusBarItem.focusBorder": "#0069CCFF",
"statusBarItem.prominentBackground": "#0069CCDD",
"statusBarItem.prominentForeground": "#FFFFFF",
"statusBarItem.prominentHoverBackground": "#0069CC",
"toolbar.hoverBackground": "#00000010",
"tab.activeBackground": "#FFFFFF",
"tab.activeForeground": "#202020",
"tab.inactiveBackground": "#FAFAFD",
"tab.inactiveForeground": "#606060",
"tab.border": "#F0F1F2FF",
"tab.lastPinnedBorder": "#F0F1F2FF",
"tab.activeBorderTop": "#000000",
"tab.hoverBackground": "#FFFFFF",
"tab.hoverForeground": "#202020",
"tab.unfocusedActiveBackground": "#FAFAFD",
"tab.unfocusedActiveForeground": "#606060",
"tab.unfocusedInactiveBackground": "#FAFAFD",
"tab.unfocusedInactiveForeground": "#BBBBBB",
"editorGroupHeader.tabsBackground": "#FAFAFD",
"tab.activeBorder": "#FFFFFF",
"editorGroupHeader.tabsBorder": "#F0F1F2FF",
"breadcrumb.foreground": "#606060",
"breadcrumb.background": "#FFFFFF",
"breadcrumb.focusForeground": "#202020",
"breadcrumb.activeSelectionForeground": "#202020",
"breadcrumbPicker.background": "#FAFAFD",
"notificationCenter.border": "#F0F1F2FF",
"notificationCenterHeader.foreground": "#202020",
"notificationCenterHeader.background": "#FAFAFD",
"notificationToast.border": "#F0F1F2FF",
"notifications.foreground": "#202020",
"notifications.background": "#FAFAFD",
"notifications.border": "#F0F1F2FF",
"notificationLink.foreground": "#0069CC",
"notificationsWarningIcon.foreground": "#B69500",
"notificationsErrorIcon.foreground": "#ad0707",
"notificationsInfoIcon.foreground": "#0069CC",
"activityWarningBadge.foreground": "#202020",
"activityWarningBadge.background": "#F2C94C",
"activityErrorBadge.foreground": "#FFFFFF",
"activityErrorBadge.background": "#ad0707",
"extensionButton.prominentBackground": "#0069CC",
"extensionButton.prominentForeground": "#FFFFFF",
"extensionButton.prominentHoverBackground": "#0064CC",
"pickerGroup.border": "#EEEEF1",
"pickerGroup.foreground": "#202020",
"quickInput.background": "#FAFAFD",
"quickInput.foreground": "#202020",
"quickInputList.focusBackground": "#0069CC",
"quickInputList.focusForeground": "#FFFFFF",
"quickInputList.focusIconForeground": "#FFFFFF",
"quickInputList.focusHighlightForeground": "#FFFFFF",
"quickInputList.hoverBackground": "#EDF0F5",
"terminal.selectionBackground": "#0069CC26",
"terminalCursor.foreground": "#202020",
"terminalCursor.background": "#FFFFFF",
"gitDecoration.addedResourceForeground": "#587c0c",
"gitDecoration.modifiedResourceForeground": "#667309",
"gitDecoration.deletedResourceForeground": "#ad0707",
"gitDecoration.untrackedResourceForeground": "#587c0c",
"gitDecoration.ignoredResourceForeground": "#8E8E90",
"gitDecoration.conflictingResourceForeground": "#ad0707",
"gitDecoration.stageModifiedResourceForeground": "#667309",
"gitDecoration.stageDeletedResourceForeground": "#ad0707",
"commandCenter.activeBorder": "#D8D8D8",
"quickInput.border": "#D8D8D8",
"gauge.foreground": "#0069CC",
"gauge.background": "#0069CC40",
"gauge.border": "#F0F1F2FF",
"gauge.warningForeground": "#B69500",
"gauge.warningBackground": "#B6950040",
"gauge.errorForeground": "#ad0707",
"gauge.errorBackground": "#ad070740",
"statusBarItem.prominentHoverForeground": "#FFFFFF",
"quickInputTitle.background": "#FAFAFD",
"chat.requestBubbleBackground": "#EEF4FB",
"chat.requestBubbleHoverBackground": "#E6EDFA",
"chat.thinkingShimmer": "#999999",
"chat.inputWorkingBorderColor1": "#0069CC",
"chat.inputWorkingBorderColor2": "#004A99",
"chat.inputWorkingBorderColor3": "#3399E6",
"editorCommentsWidget.rangeBackground": "#EEF4FB",
"editorCommentsWidget.rangeActiveBackground": "#E6EDFA",
"charts.foreground": "#202020",
"charts.lines": "#20202066",
"charts.blue": "#1A5CFF",
"charts.red": "#ad0707",
"charts.yellow": "#667309",
"charts.orange": "#d18616",
"charts.green": "#388A34",
"charts.purple": "#652D90",
"agentStatusIndicator.background": "#FFFFFF",
"inlineChat.border": "#00000000",
"minimapSlider.background": "#99999926",
"minimapSlider.hoverBackground": "#99999940",
"minimapSlider.activeBackground": "#99999955",
"agents.background": "#FAFAFD",
"agentsPanel.background": "#FFFFFF",
"agentsPanel.foreground": "#202020",
"agentsPanel.border": "#E4E5E6FF",
"agentsGradient.tintColor": "#0069CC",
"agentsChatInput.background": "#F7F7FA",
"agentsChatInput.foreground": "#202020",
"agentsChatInput.border": "#D8D8D8",
"agentsChatInput.focusBorder": "#0069CCFF",
"agentsChatInput.placeholderForeground": "#999999",
"agentsNewSessionButton.background": "#00000000",
"agentsNewSessionButton.foreground": "#202020",
"agentsNewSessionButton.border": "#D8D8D8",
"agentsNewSessionButton.hoverBackground": "#00000010",
"agentsBadge.background": "#0069CC",
"agentsBadge.foreground": "#FFFFFF",
"agentsUnreadBadge.background": "#0069CC",
"agentsUnreadBadge.foreground": "#FFFFFF"
},
"tokenColors": [
{
"scope": ["comment", "punctuation.definition.comment", "string.comment"],
"settings": {
"foreground": "#6e7781"
}
},
{
"scope": ["constant.other.placeholder", "constant.character"],
"settings": {
"foreground": "#cf222e"
}
},
{
"scope": [
"constant",
"entity.name.constant",
"variable.other.constant",
"variable.other.enummember",
"variable.language",
"entity"
],
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": ["entity.name", "meta.export.default", "meta.definition.variable"],
"settings": {
"foreground": "#953800"
}
},
{
"scope": [
"variable.parameter.function",
"meta.jsx.children",
"meta.block",
"meta.tag.attributes",
"entity.name.constant",
"meta.object.member",
"meta.embedded.expression"
],
"settings": {
"foreground": "#1f2328"
}
},
{
"scope": "entity.name.function",
"settings": {
"foreground": "#8250df"
}
},
{
"scope": ["entity.name.tag", "support.class.component"],
"settings": {
"foreground": "#116329"
}
},
{
"scope": "keyword",
"settings": {
"foreground": "#cf222e"
}
},
{
"scope": ["storage", "storage.type"],
"settings": {
"foreground": "#cf222e"
}
},
{
"scope": ["storage.modifier.package", "storage.modifier.import", "storage.type.java"],
"settings": {
"foreground": "#1f2328"
}
},
{
"scope": ["string", "string punctuation.section.embedded source"],
"settings": {
"foreground": "#0a3069"
}
},
{
"scope": "support",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": "meta.property-name",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": "variable",
"settings": {
"foreground": "#953800"
}
},
{
"scope": "variable.other",
"settings": {
"foreground": "#1f2328"
}
},
{
"scope": "invalid.broken",
"settings": {
"fontStyle": "italic",
"foreground": "#82071e"
}
},
{
"scope": "invalid.deprecated",
"settings": {
"fontStyle": "italic",
"foreground": "#82071e"
}
},
{
"scope": "invalid.illegal",
"settings": {
"fontStyle": "italic",
"foreground": "#82071e"
}
},
{
"scope": "invalid.unimplemented",
"settings": {
"fontStyle": "italic",
"foreground": "#82071e"
}
},
{
"scope": "carriage-return",
"settings": {
"fontStyle": "italic underline",
"background": "#cf222e",
"foreground": "#f6f8fa",
"content": "^M"
}
},
{
"scope": "message.error",
"settings": {
"foreground": "#82071e"
}
},
{
"scope": "string variable",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": ["source.regexp", "string.regexp"],
"settings": {
"foreground": "#0a3069"
}
},
{
"scope": [
"string.regexp.character-class",
"string.regexp constant.character.escape",
"string.regexp source.ruby.embedded",
"string.regexp string.regexp.arbitrary-repitition"
],
"settings": {
"foreground": "#0a3069"
}
},
{
"scope": "string.regexp constant.character.escape",
"settings": {
"fontStyle": "bold",
"foreground": "#116329"
}
},
{
"scope": "support.constant",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": "support.variable",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": "support.type.property-name.json",
"settings": {
"foreground": "#116329"
}
},
{
"scope": "meta.module-reference",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": "punctuation.definition.list.begin.markdown",
"settings": {
"foreground": "#953800"
}
},
{
"scope": ["markup.heading", "markup.heading entity.name"],
"settings": {
"fontStyle": "bold",
"foreground": "#0550ae"
}
},
{
"scope": "markup.quote",
"settings": {
"foreground": "#116329"
}
},
{
"scope": "markup.italic",
"settings": {
"fontStyle": "italic",
"foreground": "#1f2328"
}
},
{
"scope": "markup.bold",
"settings": {
"fontStyle": "bold",
"foreground": "#1f2328"
}
},
{
"scope": ["markup.underline"],
"settings": {
"fontStyle": "underline"
}
},
{
"scope": ["markup.strikethrough"],
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "markup.inline.raw",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": ["markup.deleted", "meta.diff.header.from-file", "punctuation.definition.deleted"],
"settings": {
"background": "#ffebe9",
"foreground": "#82071e"
}
},
{
"scope": ["punctuation.section.embedded"],
"settings": {
"foreground": "#cf222e"
}
},
{
"scope": ["markup.inserted", "meta.diff.header.to-file", "punctuation.definition.inserted"],
"settings": {
"background": "#dafbe1",
"foreground": "#116329"
}
},
{
"scope": ["markup.changed", "punctuation.definition.changed"],
"settings": {
"background": "#ffd8b5",
"foreground": "#953800"
}
},
{
"scope": ["markup.ignored", "markup.untracked"],
"settings": {
"foreground": "#eaeef2",
"background": "#0550ae"
}
},
{
"scope": "meta.diff.range",
"settings": {
"foreground": "#8250df",
"fontStyle": "bold"
}
},
{
"scope": "meta.diff.header",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": "meta.separator",
"settings": {
"fontStyle": "bold",
"foreground": "#0550ae"
}
},
{
"scope": "meta.output",
"settings": {
"foreground": "#0550ae"
}
},
{
"scope": [
"brackethighlighter.tag",
"brackethighlighter.curly",
"brackethighlighter.round",
"brackethighlighter.square",
"brackethighlighter.angle",
"brackethighlighter.quote"
],
"settings": {
"foreground": "#57606a"
}
},
{
"scope": "brackethighlighter.unmatched",
"settings": {
"foreground": "#82071e"
}
},
{
"scope": ["constant.other.reference.link", "string.other.link"],
"settings": {
"foreground": "#0a3069"
}
}
],
"semanticHighlighting": true
}
@@ -0,0 +1,40 @@
MIT License
Copyright (c) 2015 - present Microsoft Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
These theme JSON files are vendored from:
https://github.com/microsoft/vscode
Source paths:
extensions/theme-defaults/themes/dark_modern.json
extensions/theme-defaults/themes/dark_plus.json
extensions/theme-defaults/themes/dark_vs.json
extensions/theme-defaults/themes/hc_black.json
extensions/theme-defaults/themes/hc_light.json
extensions/theme-defaults/themes/light_modern.json
extensions/theme-defaults/themes/light_plus.json
extensions/theme-defaults/themes/light_vs.json
extensions/theme-defaults/themes/2026-dark.json
extensions/theme-defaults/themes/2026-light.json
extensions/theme-monokai/themes/monokai-color-theme.json
extensions/theme-solarized-light/themes/solarized-light-color-theme.json
@@ -0,0 +1,133 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Dark Modern",
"include": "./dark_plus.json",
"colors": {
"activityBar.activeBorder": "#0078D4",
"activityBar.background": "#181818",
"activityBar.border": "#2B2B2B",
"activityBar.foreground": "#D7D7D7",
"activityBar.inactiveForeground": "#868686",
"activityBarBadge.background": "#0078D4",
"activityBarBadge.foreground": "#FFFFFF",
"badge.background": "#616161",
"badge.foreground": "#F8F8F8",
"button.background": "#0078D4",
"button.border": "#ffffff1a",
"button.foreground": "#FFFFFF",
"button.hoverBackground": "#026EC1",
"button.secondaryBackground": "#00000000",
"button.secondaryForeground": "#CCCCCC",
"button.secondaryHoverBackground": "#2B2B2B",
"chat.slashCommandBackground": "#26477866",
"chat.slashCommandForeground": "#85B6FF",
"chat.editedFileForeground": "#E2C08D",
"checkbox.background": "#313131",
"checkbox.border": "#3C3C3C",
"debugToolBar.background": "#181818",
"descriptionForeground": "#9D9D9D",
"dropdown.background": "#313131",
"dropdown.border": "#3C3C3C",
"dropdown.foreground": "#CCCCCC",
"dropdown.listBackground": "#1F1F1F",
"editor.background": "#1F1F1F",
"editor.findMatchBackground": "#9E6A03",
"editor.foreground": "#CCCCCC",
"editorGroup.border": "#FFFFFF17",
"editorGroupHeader.tabsBackground": "#181818",
"editorGroupHeader.tabsBorder": "#2B2B2B",
"editorGutter.addedBackground": "#2EA043",
"editorGutter.deletedBackground": "#F85149",
"editorGutter.modifiedBackground": "#0078D4",
"editorLineNumber.activeForeground": "#CCCCCC",
"editorLineNumber.foreground": "#6E7681",
"editorOverviewRuler.border": "#010409",
"editorWidget.background": "#202020",
"errorForeground": "#F85149",
"focusBorder": "#0078D4",
"foreground": "#CCCCCC",
"icon.foreground": "#CCCCCC",
"input.background": "#313131",
"input.border": "#3C3C3C",
"input.foreground": "#CCCCCC",
"input.placeholderForeground": "#989898",
"inputOption.activeBackground": "#2489DB82",
"inputOption.activeBorder": "#2488DB",
"keybindingLabel.foreground": "#CCCCCC",
"menu.background": "#1F1F1F",
"menu.selectionBackground": "#0078d4",
"notificationCenterHeader.background": "#1F1F1F",
"notificationCenterHeader.foreground": "#CCCCCC",
"notifications.background": "#1F1F1F",
"notifications.border": "#2B2B2B",
"notifications.foreground": "#CCCCCC",
"panel.background": "#181818",
"panel.border": "#2B2B2B",
"panelInput.border": "#2B2B2B",
"panelTitle.activeBorder": "#0078D4",
"panelTitle.activeForeground": "#CCCCCC",
"panelTitle.inactiveForeground": "#9D9D9D",
"peekViewEditor.background": "#1F1F1F",
"peekViewEditor.matchHighlightBackground": "#BB800966",
"peekViewResult.background": "#1F1F1F",
"peekViewResult.matchHighlightBackground": "#BB800966",
"pickerGroup.border": "#3C3C3C",
"progressBar.background": "#0078D4",
"quickInput.background": "#222222",
"quickInput.foreground": "#CCCCCC",
"settings.dropdownBackground": "#313131",
"settings.dropdownBorder": "#3C3C3C",
"settings.headerForeground": "#FFFFFF",
"settings.modifiedItemIndicator": "#BB800966",
"sideBar.background": "#181818",
"sideBar.border": "#2B2B2B",
"sideBar.foreground": "#CCCCCC",
"sideBarSectionHeader.background": "#181818",
"sideBarSectionHeader.border": "#2B2B2B",
"sideBarSectionHeader.foreground": "#CCCCCC",
"sideBarTitle.foreground": "#CCCCCC",
"statusBar.background": "#181818",
"statusBar.border": "#2B2B2B",
"statusBarItem.hoverBackground": "#F1F1F133",
"statusBarItem.hoverForeground": "#FFFFFF",
"statusBar.debuggingBackground": "#0078D4",
"statusBar.debuggingForeground": "#FFFFFF",
"statusBar.focusBorder": "#0078D4",
"statusBar.foreground": "#CCCCCC",
"statusBar.noFolderBackground": "#1F1F1F",
"statusBarItem.focusBorder": "#0078D4",
"statusBarItem.prominentBackground": "#6E768166",
"statusBarItem.remoteBackground": "#0078D4",
"statusBarItem.remoteForeground": "#FFFFFF",
"tab.activeBackground": "#1F1F1F",
"tab.activeBorder": "#1F1F1F",
"tab.activeBorderTop": "#0078D4",
"tab.activeForeground": "#FFFFFF",
"tab.selectedBorderTop": "#6caddf",
"tab.border": "#2B2B2B",
"tab.hoverBackground": "#1F1F1F",
"tab.inactiveBackground": "#181818",
"tab.inactiveForeground": "#9D9D9D",
"tab.unfocusedActiveBorder": "#1F1F1F",
"tab.unfocusedActiveBorderTop": "#2B2B2B",
"tab.unfocusedHoverBackground": "#1F1F1F",
"terminal.foreground": "#CCCCCC",
"terminal.tab.activeBorder": "#0078D4",
"textBlockQuote.background": "#2B2B2B",
"textBlockQuote.border": "#616161",
"textCodeBlock.background": "#2B2B2B",
"textLink.activeForeground": "#4daafc",
"textLink.foreground": "#4daafc",
"textPreformat.foreground": "#D0D0D0",
"textPreformat.background": "#3C3C3C",
"textSeparator.foreground": "#21262D",
"titleBar.activeBackground": "#181818",
"titleBar.activeForeground": "#CCCCCC",
"titleBar.border": "#2B2B2B",
"titleBar.inactiveBackground": "#1F1F1F",
"titleBar.inactiveForeground": "#9D9D9D",
"welcomePage.tileBackground": "#2B2B2B",
"welcomePage.progress.foreground": "#0078D4",
"widget.border": "#313131"
}
}
@@ -0,0 +1,194 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Dark+",
"include": "./dark_vs.json",
"tokenColors": [
{
"name": "Function declarations",
"scope": [
"entity.name.function",
"support.function",
"support.constant.handlebars",
"source.powershell variable.other.member",
"entity.name.operator.custom-literal" // See https://en.cppreference.com/w/cpp/language/user_literal
],
"settings": {
"foreground": "#DCDCAA"
}
},
{
"name": "Types declaration and references",
"scope": [
"support.class",
"support.type",
"entity.name.type",
"entity.name.namespace",
"entity.other.attribute",
"entity.name.scope-resolution",
"entity.name.class",
"storage.type.numeric.go",
"storage.type.byte.go",
"storage.type.boolean.go",
"storage.type.string.go",
"storage.type.uintptr.go",
"storage.type.error.go",
"storage.type.rune.go",
"storage.type.cs",
"storage.type.generic.cs",
"storage.type.modifier.cs",
"storage.type.variable.cs",
"storage.type.annotation.java",
"storage.type.generic.java",
"storage.type.java",
"storage.type.object.array.java",
"storage.type.primitive.array.java",
"storage.type.primitive.java",
"storage.type.token.java",
"storage.type.groovy",
"storage.type.annotation.groovy",
"storage.type.parameters.groovy",
"storage.type.generic.groovy",
"storage.type.object.array.groovy",
"storage.type.primitive.array.groovy",
"storage.type.primitive.groovy"
],
"settings": {
"foreground": "#4EC9B0"
}
},
{
"name": "Types declaration and references, TS grammar specific",
"scope": [
"meta.type.cast.expr",
"meta.type.new.expr",
"support.constant.math",
"support.constant.dom",
"support.constant.json",
"entity.other.inherited-class",
"punctuation.separator.namespace.ruby"
],
"settings": {
"foreground": "#4EC9B0"
}
},
{
"name": "Control flow / Special keywords",
"scope": [
"keyword.control",
"source.cpp keyword.operator.new",
"keyword.operator.delete",
"keyword.other.using",
"keyword.other.directive.using",
"keyword.other.operator",
"entity.name.operator"
],
"settings": {
"foreground": "#C586C0"
}
},
{
"name": "Variable and parameter name",
"scope": [
"variable",
"meta.definition.variable.name",
"support.variable",
"entity.name.variable",
"constant.other.placeholder" // placeholders in strings
],
"settings": {
"foreground": "#9CDCFE"
}
},
{
"name": "Constants and enums",
"scope": ["variable.other.constant", "variable.other.enummember"],
"settings": {
"foreground": "#4FC1FF"
}
},
{
"name": "Object keys, TS grammar specific",
"scope": ["meta.object-literal.key"],
"settings": {
"foreground": "#9CDCFE"
}
},
{
"name": "CSS property value",
"scope": [
"support.constant.property-value",
"support.constant.font-name",
"support.constant.media-type",
"support.constant.media",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#CE9178"
}
},
{
"name": "Regular expression groups",
"scope": [
"punctuation.definition.group.regexp",
"punctuation.definition.group.assertion.regexp",
"punctuation.definition.character-class.regexp",
"punctuation.character.set.begin.regexp",
"punctuation.character.set.end.regexp",
"keyword.operator.negation.regexp",
"support.other.parenthesis.regexp"
],
"settings": {
"foreground": "#CE9178"
}
},
{
"scope": [
"constant.character.character-class.regexp",
"constant.other.character-class.set.regexp",
"constant.other.character-class.regexp",
"constant.character.set.regexp"
],
"settings": {
"foreground": "#d16969"
}
},
{
"scope": ["keyword.operator.or.regexp", "keyword.control.anchor.regexp"],
"settings": {
"foreground": "#DCDCAA"
}
},
{
"scope": "keyword.operator.quantifier.regexp",
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": ["constant.character", "constant.other.option"],
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "constant.character.escape",
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": "entity.name.label",
"settings": {
"foreground": "#C8C8C8"
}
}
],
"semanticTokenColors": {
"newOperator": "#C586C0",
"stringLiteral": "#ce9178",
"customLiteral": "#DCDCAA",
"numberLiteral": "#b5cea8"
}
}
@@ -0,0 +1,395 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Dark (Visual Studio)",
"colors": {
"checkbox.border": "#6B6B6B",
"editor.background": "#1E1E1E",
"editor.foreground": "#D4D4D4",
"editor.inactiveSelectionBackground": "#3A3D41",
"editorIndentGuide.background1": "#404040",
"editorIndentGuide.activeBackground1": "#707070",
"editor.selectionHighlightBackground": "#ADD6FF26",
"list.dropBackground": "#383B3D",
"activityBarBadge.background": "#007ACC",
"sideBarTitle.foreground": "#BBBBBB",
"input.placeholderForeground": "#A6A6A6",
"menu.background": "#252526",
"menu.foreground": "#CCCCCC",
"menu.separatorBackground": "#454545",
"menu.border": "#454545",
"menu.selectionBackground": "#0078d4",
"statusBarItem.remoteForeground": "#FFF",
"statusBarItem.remoteBackground": "#16825D",
"ports.iconRunningProcessForeground": "#369432",
"sideBarSectionHeader.background": "#0000",
"sideBarSectionHeader.border": "#ccc3",
"tab.selectedBackground": "#222222",
"tab.selectedForeground": "#ffffffa0",
"tab.lastPinnedBorder": "#ccc3",
"list.activeSelectionIconForeground": "#FFF",
"terminal.inactiveSelectionBackground": "#3A3D41",
"widget.border": "#303031",
"actionBar.toggledBackground": "#383a49"
},
"tokenColors": [
{
"scope": [
"meta.embedded",
"source.groovy.embedded",
"string meta.image.inline.markdown",
"variable.legacy.builtin.python"
],
"settings": {
"foreground": "#D4D4D4"
}
},
{
"scope": "emphasis",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "strong",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": "header",
"settings": {
"foreground": "#000080"
}
},
{
"scope": "comment",
"settings": {
"foreground": "#6A9955"
}
},
{
"scope": "constant.language",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": [
"constant.numeric",
"variable.other.enummember",
"keyword.operator.plus.exponent",
"keyword.operator.minus.exponent"
],
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "constant.regexp",
"settings": {
"foreground": "#646695"
}
},
{
"scope": "entity.name.tag",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": ["entity.name.tag.css", "entity.name.tag.less"],
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#9cdcfe"
}
},
{
"scope": [
"entity.other.attribute-name.class.css",
"source.css entity.other.attribute-name.class",
"entity.other.attribute-name.id.css",
"entity.other.attribute-name.parent-selector.css",
"entity.other.attribute-name.parent.less",
"source.css entity.other.attribute-name.pseudo-class",
"entity.other.attribute-name.pseudo-element.css",
"source.css.less entity.other.attribute-name.id",
"entity.other.attribute-name.scss"
],
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": "invalid",
"settings": {
"foreground": "#f44747"
}
},
{
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"scope": "markup.bold",
"settings": {
"fontStyle": "bold",
"foreground": "#569cd6"
}
},
{
"scope": "markup.heading",
"settings": {
"fontStyle": "bold",
"foreground": "#569cd6"
}
},
{
"scope": "markup.italic",
"settings": {
"fontStyle": "italic",
"foreground": "#C586C0"
}
},
{
"scope": "markup.strikethrough",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "markup.inserted",
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "markup.deleted",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "markup.changed",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "punctuation.definition.quote.begin.markdown",
"settings": {
"foreground": "#6A9955"
}
},
{
"scope": "punctuation.definition.list.begin.markdown",
"settings": {
"foreground": "#6796e6"
}
},
{
"scope": "markup.inline.raw",
"settings": {
"foreground": "#ce9178"
}
},
{
"name": "brackets of XML/HTML tags",
"scope": "punctuation.definition.tag",
"settings": {
"foreground": "#808080"
}
},
{
"scope": ["meta.preprocessor", "entity.name.function.preprocessor"],
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "meta.preprocessor.string",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "meta.preprocessor.numeric",
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "meta.structure.dictionary.key.python",
"settings": {
"foreground": "#9cdcfe"
}
},
{
"scope": "meta.diff.header",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "storage",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": ["storage.modifier", "keyword.operator.noexcept"],
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": ["string", "meta.embedded.assembly"],
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "string.tag",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "string.value",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "string.regexp",
"settings": {
"foreground": "#d16969"
}
},
{
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded"
],
"settings": {
"foreground": "#569cd6"
}
},
{
"name": "Reset JavaScript string interpolation expression",
"scope": ["meta.template.expression"],
"settings": {
"foreground": "#d4d4d4"
}
},
{
"scope": [
"support.type.vendored.property-name",
"support.type.property-name",
"source.css variable",
"source.coffee.embedded"
],
"settings": {
"foreground": "#9cdcfe"
}
},
{
"scope": "keyword",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "keyword.control",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "keyword.operator",
"settings": {
"foreground": "#d4d4d4"
}
},
{
"scope": [
"keyword.operator.new",
"keyword.operator.expression",
"keyword.operator.cast",
"keyword.operator.sizeof",
"keyword.operator.alignof",
"keyword.operator.typeid",
"keyword.operator.alignas",
"keyword.operator.instanceof",
"keyword.operator.logical.python",
"keyword.operator.wordlike"
],
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "keyword.other.unit",
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": ["punctuation.section.embedded.begin.php", "punctuation.section.embedded.end.php"],
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "support.function.git-rebase",
"settings": {
"foreground": "#9cdcfe"
}
},
{
"scope": "constant.sha.git-rebase",
"settings": {
"foreground": "#b5cea8"
}
},
{
"name": "coloring of the Java import and package identifiers",
"scope": [
"storage.modifier.import.java",
"variable.language.wildcard.java",
"storage.modifier.package.java"
],
"settings": {
"foreground": "#d4d4d4"
}
},
{
"name": "this.self",
"scope": "variable.language",
"settings": {
"foreground": "#569cd6"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"newOperator": "#d4d4d4",
"stringLiteral": "#ce9178",
"customLiteral": "#D4D4D4",
"numberLiteral": "#b5cea8"
}
}
@@ -0,0 +1,456 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Dark High Contrast",
"colors": {
"editor.background": "#000000",
"editor.foreground": "#FFFFFF",
"editorIndentGuide.background1": "#FFFFFF",
"editorIndentGuide.activeBackground1": "#FFFFFF",
"sideBarTitle.foreground": "#FFFFFF",
"selection.background": "#008000",
"editor.selectionBackground": "#FFFFFF",
"statusBarItem.remoteBackground": "#00000000",
"ports.iconRunningProcessForeground": "#FFFFFF",
"editorWhitespace.foreground": "#7c7c7c",
"actionBar.toggledBackground": "#383a49"
},
"tokenColors": [
{
"scope": [
"meta.embedded",
"source.groovy.embedded",
"string meta.image.inline.markdown",
"variable.legacy.builtin.python"
],
"settings": {
"foreground": "#FFFFFF"
}
},
{
"scope": "emphasis",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "strong",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": "meta.diff.header",
"settings": {
"foreground": "#000080"
}
},
{
"scope": "comment",
"settings": {
"foreground": "#7ca668"
}
},
{
"scope": "constant.language",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": [
"constant.numeric",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "constant.regexp",
"settings": {
"foreground": "#b46695"
}
},
{
"scope": "constant.character",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "entity.name.tag",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": ["entity.name.tag.css", "entity.name.tag.less"],
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#9cdcfe"
}
},
{
"scope": [
"entity.other.attribute-name.class.css",
"source.css entity.other.attribute-name.class",
"entity.other.attribute-name.id.css",
"entity.other.attribute-name.parent-selector.css",
"entity.other.attribute-name.parent.less",
"source.css entity.other.attribute-name.pseudo-class",
"entity.other.attribute-name.pseudo-element.css",
"source.css.less entity.other.attribute-name.id",
"entity.other.attribute-name.scss"
],
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": "invalid",
"settings": {
"foreground": "#f44747"
}
},
{
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"scope": "markup.bold",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": "markup.heading",
"settings": {
"fontStyle": "bold",
"foreground": "#6796e6"
}
},
{
"scope": "markup.italic",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "markup.strikethrough",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "markup.inserted",
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "markup.deleted",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "markup.changed",
"settings": {
"foreground": "#569cd6"
}
},
{
"name": "brackets of XML/HTML tags",
"scope": ["punctuation.definition.tag"],
"settings": {
"foreground": "#808080"
}
},
{
"scope": "meta.preprocessor",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "meta.preprocessor.string",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "meta.preprocessor.numeric",
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "meta.structure.dictionary.key.python",
"settings": {
"foreground": "#9cdcfe"
}
},
{
"scope": "storage",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "storage.modifier",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "string",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "string.tag",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "string.value",
"settings": {
"foreground": "#ce9178"
}
},
{
"scope": "string.regexp",
"settings": {
"foreground": "#d16969"
}
},
{
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded"
],
"settings": {
"foreground": "#569cd6"
}
},
{
"name": "Reset JavaScript string interpolation expression",
"scope": ["meta.template.expression"],
"settings": {
"foreground": "#ffffff"
}
},
{
"scope": [
"support.type.vendored.property-name",
"support.type.property-name",
"source.css variable",
"source.coffee.embedded"
],
"settings": {
"foreground": "#d4d4d4"
}
},
{
"scope": "keyword",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "keyword.control",
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "keyword.operator",
"settings": {
"foreground": "#d4d4d4"
}
},
{
"scope": [
"keyword.operator.new",
"keyword.operator.expression",
"keyword.operator.cast",
"keyword.operator.sizeof",
"keyword.operator.logical.python"
],
"settings": {
"foreground": "#569cd6"
}
},
{
"scope": "keyword.other.unit",
"settings": {
"foreground": "#b5cea8"
}
},
{
"scope": "support.function.git-rebase",
"settings": {
"foreground": "#d4d4d4"
}
},
{
"scope": "constant.sha.git-rebase",
"settings": {
"foreground": "#b5cea8"
}
},
{
"name": "coloring of the Java import and package identifiers",
"scope": [
"storage.modifier.import.java",
"variable.language.wildcard.java",
"storage.modifier.package.java"
],
"settings": {
"foreground": "#d4d4d4"
}
},
{
"name": "coloring of the TS this",
"scope": "variable.language.this",
"settings": {
"foreground": "#569cd6"
}
},
{
"name": "Function declarations",
"scope": [
"entity.name.function",
"support.function",
"support.constant.handlebars",
"source.powershell variable.other.member"
],
"settings": {
"foreground": "#DCDCAA"
}
},
{
"name": "Types declaration and references",
"scope": [
"support.class",
"support.type",
"entity.name.type",
"entity.name.namespace",
"entity.name.scope-resolution",
"entity.name.class",
"storage.type.cs",
"storage.type.generic.cs",
"storage.type.modifier.cs",
"storage.type.variable.cs",
"storage.type.annotation.java",
"storage.type.generic.java",
"storage.type.java",
"storage.type.object.array.java",
"storage.type.primitive.array.java",
"storage.type.primitive.java",
"storage.type.token.java",
"storage.type.groovy",
"storage.type.annotation.groovy",
"storage.type.parameters.groovy",
"storage.type.generic.groovy",
"storage.type.object.array.groovy",
"storage.type.primitive.array.groovy",
"storage.type.primitive.groovy"
],
"settings": {
"foreground": "#4EC9B0"
}
},
{
"name": "Types declaration and references, TS grammar specific",
"scope": [
"meta.type.cast.expr",
"meta.type.new.expr",
"support.constant.math",
"support.constant.dom",
"support.constant.json",
"entity.other.inherited-class",
"punctuation.separator.namespace.ruby"
],
"settings": {
"foreground": "#4EC9B0"
}
},
{
"name": "Control flow / Special keywords",
"scope": [
"keyword.control",
"source.cpp keyword.operator.new",
"source.cpp keyword.operator.delete",
"keyword.other.using",
"keyword.other.directive.using",
"keyword.other.operator"
],
"settings": {
"foreground": "#C586C0"
}
},
{
"name": "Variable and parameter name",
"scope": ["variable", "meta.definition.variable.name", "support.variable"],
"settings": {
"foreground": "#9CDCFE"
}
},
{
"name": "Object keys, TS grammar specific",
"scope": ["meta.object-literal.key"],
"settings": {
"foreground": "#9CDCFE"
}
},
{
"name": "CSS property value",
"scope": [
"support.constant.property-value",
"support.constant.font-name",
"support.constant.media-type",
"support.constant.media",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#CE9178"
}
},
{
"name": "HC Search Editor context line override",
"scope": "meta.resultLinePrefix.contextLinePrefix.search",
"settings": {
"foreground": "#CBEDCB"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"newOperator": "#FFFFFF",
"stringLiteral": "#ce9178",
"customLiteral": "#DCDCAA",
"numberLiteral": "#b5cea8"
}
}
@@ -0,0 +1,570 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Light High Contrast",
"tokenColors": [
{
"scope": ["meta.embedded", "source.groovy.embedded", "variable.legacy.builtin.python"],
"settings": {
"foreground": "#292929"
}
},
{
"scope": "emphasis",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "strong",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": "meta.diff.header",
"settings": {
"foreground": "#062F4A"
}
},
{
"scope": "comment",
"settings": {
"foreground": "#515151"
}
},
{
"scope": "constant.language",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": [
"constant.numeric",
"variable.other.enummember",
"keyword.operator.plus.exponent",
"keyword.operator.minus.exponent"
],
"settings": {
"foreground": "#096d48"
}
},
{
"scope": "constant.regexp",
"settings": {
"foreground": "#811F3F"
}
},
{
"scope": "entity.name.tag",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "entity.name.selector",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#264F78"
}
},
{
"scope": [
"entity.other.attribute-name.class.css",
"source.css entity.other.attribute-name.class",
"entity.other.attribute-name.id.css",
"entity.other.attribute-name.parent-selector.css",
"entity.other.attribute-name.parent.less",
"source.css entity.other.attribute-name.pseudo-class",
"entity.other.attribute-name.pseudo-element.css",
"source.css.less entity.other.attribute-name.id",
"entity.other.attribute-name.scss"
],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "invalid",
"settings": {
"foreground": "#B5200D"
}
},
{
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"scope": "markup.bold",
"settings": {
"foreground": "#000080",
"fontStyle": "bold"
}
},
{
"scope": "markup.heading",
"settings": {
"foreground": "#0F4A85",
"fontStyle": "bold"
}
},
{
"scope": "markup.italic",
"settings": {
"fontStyle": "italic",
"foreground": "#800080"
}
},
{
"scope": "markup.strikethrough",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "markup.inserted",
"settings": {
"foreground": "#096d48"
}
},
{
"scope": "markup.deleted",
"settings": {
"foreground": "#5A5A5A"
}
},
{
"scope": "markup.changed",
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": [
"punctuation.definition.quote.begin.markdown",
"punctuation.definition.list.begin.markdown"
],
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": "markup.inline.raw",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "punctuation.definition.tag",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": ["meta.preprocessor", "entity.name.function.preprocessor"],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "meta.preprocessor.string",
"settings": {
"foreground": "#b5200d"
}
},
{
"scope": "meta.preprocessor.numeric",
"settings": {
"foreground": "#096d48"
}
},
{
"scope": "meta.structure.dictionary.key.python",
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": "storage",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": ["storage.modifier", "keyword.operator.noexcept"],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": ["string", "meta.embedded.assembly"],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": [
"string.comment.buffered.block.pug",
"string.quoted.pug",
"string.interpolated.pug",
"string.unquoted.plain.in.yaml",
"string.unquoted.plain.out.yaml",
"string.unquoted.block.yaml",
"string.quoted.single.yaml",
"string.quoted.double.xml",
"string.quoted.single.xml",
"string.unquoted.cdata.xml",
"string.quoted.double.html",
"string.quoted.single.html",
"string.unquoted.html",
"string.quoted.single.handlebars",
"string.quoted.double.handlebars"
],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "string.regexp",
"settings": {
"foreground": "#811F3F"
}
},
{
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded"
],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": ["meta.template.expression"],
"settings": {
"foreground": "#000000"
}
},
{
"scope": [
"support.constant.property-value",
"support.constant.font-name",
"support.constant.media-type",
"support.constant.media",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": [
"support.type.vendored.property-name",
"support.type.property-name",
"source.css variable",
"source.coffee.embedded"
],
"settings": {
"foreground": "#264F78"
}
},
{
"scope": ["support.type.property-name.json"],
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": "keyword",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "keyword.control",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "keyword.operator",
"settings": {
"foreground": "#000000"
}
},
{
"scope": [
"keyword.operator.new",
"keyword.operator.expression",
"keyword.operator.cast",
"keyword.operator.sizeof",
"keyword.operator.alignof",
"keyword.operator.typeid",
"keyword.operator.alignas",
"keyword.operator.instanceof",
"keyword.operator.logical.python",
"keyword.operator.wordlike"
],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "keyword.other.unit",
"settings": {
"foreground": "#096d48"
}
},
{
"scope": ["punctuation.section.embedded.begin.php", "punctuation.section.embedded.end.php"],
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "support.function.git-rebase",
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": "constant.sha.git-rebase",
"settings": {
"foreground": "#096d48"
}
},
{
"scope": [
"storage.modifier.import.java",
"variable.language.wildcard.java",
"storage.modifier.package.java"
],
"settings": {
"foreground": "#000000"
}
},
{
"scope": "variable.language",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": [
"entity.name.function",
"support.function",
"support.constant.handlebars",
"source.powershell variable.other.member",
"entity.name.operator.custom-literal"
],
"settings": {
"foreground": "#5e2cbc"
}
},
{
"scope": [
"support.class",
"support.type",
"entity.name.type",
"entity.name.namespace",
"entity.other.attribute",
"entity.name.scope-resolution",
"entity.name.class",
"storage.type.numeric.go",
"storage.type.byte.go",
"storage.type.boolean.go",
"storage.type.string.go",
"storage.type.uintptr.go",
"storage.type.error.go",
"storage.type.rune.go",
"storage.type.cs",
"storage.type.generic.cs",
"storage.type.modifier.cs",
"storage.type.variable.cs",
"storage.type.annotation.java",
"storage.type.generic.java",
"storage.type.java",
"storage.type.object.array.java",
"storage.type.primitive.array.java",
"storage.type.primitive.java",
"storage.type.token.java",
"storage.type.groovy",
"storage.type.annotation.groovy",
"storage.type.parameters.groovy",
"storage.type.generic.groovy",
"storage.type.object.array.groovy",
"storage.type.primitive.array.groovy",
"storage.type.primitive.groovy"
],
"settings": {
"foreground": "#185E73"
}
},
{
"scope": [
"meta.type.cast.expr",
"meta.type.new.expr",
"support.constant.math",
"support.constant.dom",
"support.constant.json",
"entity.other.inherited-class",
"punctuation.separator.namespace.ruby"
],
"settings": {
"foreground": "#185E73"
}
},
{
"scope": [
"keyword.control",
"source.cpp keyword.operator.new",
"source.cpp keyword.operator.delete",
"keyword.other.using",
"keyword.other.directive.using",
"keyword.other.operator",
"entity.name.operator"
],
"settings": {
"foreground": "#b5200d"
}
},
{
"scope": [
"variable",
"meta.definition.variable.name",
"support.variable",
"entity.name.variable",
"constant.other.placeholder"
],
"settings": {
"foreground": "#001080"
}
},
{
"scope": ["variable.other.constant", "variable.other.enummember"],
"settings": {
"foreground": "#02715D"
}
},
{
"scope": ["meta.object-literal.key"],
"settings": {
"foreground": "#001080"
}
},
{
"scope": [
"support.constant.property-value",
"support.constant.font-name",
"support.constant.media-type",
"support.constant.media",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#0451A5"
}
},
{
"scope": [
"punctuation.definition.group.regexp",
"punctuation.definition.group.assertion.regexp",
"punctuation.definition.character-class.regexp",
"punctuation.character.set.begin.regexp",
"punctuation.character.set.end.regexp",
"keyword.operator.negation.regexp",
"support.other.parenthesis.regexp"
],
"settings": {
"foreground": "#D16969"
}
},
{
"scope": [
"constant.character.character-class.regexp",
"constant.other.character-class.set.regexp",
"constant.other.character-class.regexp",
"constant.character.set.regexp"
],
"settings": {
"foreground": "#811F3F"
}
},
{
"scope": "keyword.operator.quantifier.regexp",
"settings": {
"foreground": "#000000"
}
},
{
"scope": ["keyword.operator.or.regexp", "keyword.control.anchor.regexp"],
"settings": {
"foreground": "#EE0000"
}
},
{
"scope": "constant.character",
"settings": {
"foreground": "#0F4A85"
}
},
{
"scope": "constant.character.escape",
"settings": {
"foreground": "#EE0000"
}
},
{
"scope": "entity.name.label",
"settings": {
"foreground": "#000000"
}
},
{
"scope": "token.info-token",
"settings": {
"foreground": "#316BCD"
}
},
{
"scope": "token.warn-token",
"settings": {
"foreground": "#CD9731"
}
},
{
"scope": "token.error-token",
"settings": {
"foreground": "#CD3131"
}
},
{
"scope": "token.debug-token",
"settings": {
"foreground": "#800080"
}
}
],
"colors": {
"actionBar.toggledBackground": "#dddddd",
"statusBarItem.remoteBackground": "#FFFFFF",
"statusBarItem.remoteForeground": "#000000"
}
}
@@ -0,0 +1,152 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Light Modern",
"include": "./light_plus.json",
"colors": {
"activityBar.activeBorder": "#005FB8",
"activityBar.background": "#F8F8F8",
"activityBar.border": "#E5E5E5",
"activityBar.foreground": "#1F1F1F",
"activityBar.inactiveForeground": "#616161",
"activityBarBadge.background": "#005FB8",
"activityBarBadge.foreground": "#FFFFFF",
"badge.background": "#CCCCCC",
"badge.foreground": "#3B3B3B",
"button.background": "#005FB8",
"button.border": "#0000001a",
"button.foreground": "#FFFFFF",
"button.hoverBackground": "#0258A8",
"button.secondaryBackground": "#E5E5E5",
"button.secondaryForeground": "#3B3B3B",
"button.secondaryHoverBackground": "#CCCCCC",
"chat.slashCommandBackground": "#ADCEFF7A",
"chat.slashCommandForeground": "#26569E",
"chat.editedFileForeground": "#895503",
"checkbox.background": "#F8F8F8",
"checkbox.border": "#CECECE",
"descriptionForeground": "#3B3B3B",
"dropdown.background": "#FFFFFF",
"dropdown.border": "#CECECE",
"dropdown.foreground": "#3B3B3B",
"dropdown.listBackground": "#FFFFFF",
"editor.background": "#FFFFFF",
"editor.foreground": "#3B3B3B",
"editor.inactiveSelectionBackground": "#E5EBF1",
"editor.selectionHighlightBackground": "#ADD6FF80",
"editorGroup.border": "#E5E5E5",
"editorGroupHeader.tabsBackground": "#F8F8F8",
"editorGroupHeader.tabsBorder": "#E5E5E5",
"editorGutter.addedBackground": "#2EA043",
"editorGutter.deletedBackground": "#F85149",
"editorGutter.modifiedBackground": "#005FB8",
"editorIndentGuide.background1": "#D3D3D3",
"editorLineNumber.activeForeground": "#171184",
"editorLineNumber.foreground": "#6E7681",
"editorOverviewRuler.border": "#E5E5E5",
"editorSuggestWidget.background": "#F8F8F8",
"editorWidget.background": "#F8F8F8",
"errorForeground": "#F85149",
"focusBorder": "#005FB8",
"foreground": "#3B3B3B",
"icon.foreground": "#3B3B3B",
"input.background": "#FFFFFF",
"input.border": "#CECECE",
"input.foreground": "#3B3B3B",
"input.placeholderForeground": "#767676",
"inputOption.activeBackground": "#BED6ED",
"inputOption.activeBorder": "#005FB8",
"inputOption.activeForeground": "#000000",
"keybindingLabel.foreground": "#3B3B3B",
"list.activeSelectionBackground": "#E8E8E8",
"list.activeSelectionForeground": "#000000",
"list.activeSelectionIconForeground": "#000000",
"list.hoverBackground": "#F2F2F2",
"list.focusAndSelectionOutline": "#005FB8",
"menu.border": "#CECECE",
"menu.selectionBackground": "#005FB8",
"menu.selectionForeground": "#ffffff",
"notebook.cellBorderColor": "#E5E5E5",
"notebook.selectedCellBackground": "#C8DDF150",
"notificationCenterHeader.background": "#FFFFFF",
"notificationCenterHeader.foreground": "#3B3B3B",
"notifications.background": "#FFFFFF",
"notifications.border": "#E5E5E5",
"notifications.foreground": "#3B3B3B",
"panel.background": "#F8F8F8",
"panel.border": "#E5E5E5",
"panelInput.border": "#E5E5E5",
"panelTitle.activeBorder": "#005FB8",
"panelTitle.activeForeground": "#3B3B3B",
"panelTitle.inactiveForeground": "#3B3B3B",
"peekViewEditor.matchHighlightBackground": "#BB800966",
"peekViewResult.background": "#FFFFFF",
"peekViewResult.matchHighlightBackground": "#BB800966",
"pickerGroup.border": "#E5E5E5",
"pickerGroup.foreground": "#8B949E",
"ports.iconRunningProcessForeground": "#369432",
"progressBar.background": "#005FB8",
"quickInput.background": "#F8F8F8",
"quickInput.foreground": "#3B3B3B",
"searchEditor.textInputBorder": "#CECECE",
"settings.dropdownBackground": "#FFFFFF",
"settings.dropdownBorder": "#CECECE",
"settings.headerForeground": "#1F1F1F",
"settings.modifiedItemIndicator": "#BB800966",
"settings.numberInputBorder": "#CECECE",
"settings.textInputBorder": "#CECECE",
"sideBar.background": "#F8F8F8",
"sideBar.border": "#E5E5E5",
"sideBar.foreground": "#3B3B3B",
"sideBarSectionHeader.background": "#F8F8F8",
"sideBarSectionHeader.border": "#E5E5E5",
"sideBarSectionHeader.foreground": "#3B3B3B",
"sideBarTitle.foreground": "#3B3B3B",
"statusBar.background": "#F8F8F8",
"statusBar.foreground": "#3B3B3B",
"statusBar.border": "#E5E5E5",
"statusBarItem.hoverBackground": "#1F1F1F11",
"statusBarItem.hoverForeground": "#000000",
"statusBarItem.compactHoverBackground": "#CCCCCC",
"statusBar.debuggingBackground": "#FD716C",
"statusBar.debuggingForeground": "#000000",
"statusBar.focusBorder": "#005FB8",
"statusBar.noFolderBackground": "#F8F8F8",
"statusBarItem.errorBackground": "#C72E0F",
"statusBarItem.focusBorder": "#005FB8",
"statusBarItem.prominentBackground": "#6E768166",
"statusBarItem.remoteBackground": "#005FB8",
"statusBarItem.remoteForeground": "#FFFFFF",
"tab.activeBackground": "#FFFFFF",
"tab.activeBorder": "#F8F8F8",
"tab.activeBorderTop": "#005FB8",
"tab.activeForeground": "#3B3B3B",
"tab.selectedBorderTop": "#68a3da",
"tab.border": "#E5E5E5",
"tab.hoverBackground": "#FFFFFF",
"tab.inactiveBackground": "#F8F8F8",
"tab.inactiveForeground": "#868686",
"tab.lastPinnedBorder": "#D4D4D4",
"tab.unfocusedActiveBorder": "#F8F8F8",
"tab.unfocusedActiveBorderTop": "#E5E5E5",
"tab.unfocusedHoverBackground": "#F8F8F8",
"terminalCursor.foreground": "#005FB8",
"terminal.foreground": "#3B3B3B",
"terminal.inactiveSelectionBackground": "#E5EBF1",
"terminal.tab.activeBorder": "#005FB8",
"textBlockQuote.background": "#F8F8F8",
"textBlockQuote.border": "#E5E5E5",
"textCodeBlock.background": "#F8F8F8",
"textLink.activeForeground": "#005FB8",
"textLink.foreground": "#005FB8",
"textPreformat.foreground": "#3B3B3B",
"textPreformat.background": "#0000001F",
"textSeparator.foreground": "#21262D",
"titleBar.activeBackground": "#F8F8F8",
"titleBar.activeForeground": "#1E1E1E",
"titleBar.border": "#E5E5E5",
"titleBar.inactiveBackground": "#F8F8F8",
"titleBar.inactiveForeground": "#8B949E",
"welcomePage.tileBackground": "#F3F3F3",
"widget.border": "#E5E5E5"
}
}
@@ -0,0 +1,196 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Light+",
"include": "./light_vs.json",
"tokenColors": [
// adds rules to the light vs rules
{
"name": "Function declarations",
"scope": [
"entity.name.function",
"support.function",
"support.constant.handlebars",
"source.powershell variable.other.member",
"entity.name.operator.custom-literal" // See https://en.cppreference.com/w/cpp/language/user_literal
],
"settings": {
"foreground": "#795E26"
}
},
{
"name": "Types declaration and references",
"scope": [
"support.class",
"support.type",
"entity.name.type",
"entity.name.namespace",
"entity.other.attribute",
"entity.name.scope-resolution",
"entity.name.class",
"storage.type.numeric.go",
"storage.type.byte.go",
"storage.type.boolean.go",
"storage.type.string.go",
"storage.type.uintptr.go",
"storage.type.error.go",
"storage.type.rune.go",
"storage.type.cs",
"storage.type.generic.cs",
"storage.type.modifier.cs",
"storage.type.variable.cs",
"storage.type.annotation.java",
"storage.type.generic.java",
"storage.type.java",
"storage.type.object.array.java",
"storage.type.primitive.array.java",
"storage.type.primitive.java",
"storage.type.token.java",
"storage.type.groovy",
"storage.type.annotation.groovy",
"storage.type.parameters.groovy",
"storage.type.generic.groovy",
"storage.type.object.array.groovy",
"storage.type.primitive.array.groovy",
"storage.type.primitive.groovy"
],
"settings": {
"foreground": "#267f99"
}
},
{
"name": "Types declaration and references, TS grammar specific",
"scope": [
"meta.type.cast.expr",
"meta.type.new.expr",
"support.constant.math",
"support.constant.dom",
"support.constant.json",
"entity.other.inherited-class",
"punctuation.separator.namespace.ruby"
],
"settings": {
"foreground": "#267f99"
}
},
{
"name": "Control flow / Special keywords",
"scope": [
"keyword.control",
"source.cpp keyword.operator.new",
"source.cpp keyword.operator.delete",
"keyword.other.using",
"keyword.other.directive.using",
"keyword.other.operator",
"entity.name.operator"
],
"settings": {
"foreground": "#AF00DB"
}
},
{
"name": "Variable and parameter name",
"scope": [
"variable",
"meta.definition.variable.name",
"support.variable",
"entity.name.variable",
"constant.other.placeholder" // placeholders in strings
],
"settings": {
"foreground": "#001080"
}
},
{
"name": "Constants and enums",
"scope": ["variable.other.constant", "variable.other.enummember"],
"settings": {
"foreground": "#0070C1"
}
},
{
"name": "Object keys, TS grammar specific",
"scope": ["meta.object-literal.key"],
"settings": {
"foreground": "#001080"
}
},
{
"name": "CSS property value",
"scope": [
"support.constant.property-value",
"support.constant.font-name",
"support.constant.media-type",
"support.constant.media",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#0451a5"
}
},
{
"name": "Regular expression groups",
"scope": [
"punctuation.definition.group.regexp",
"punctuation.definition.group.assertion.regexp",
"punctuation.definition.character-class.regexp",
"punctuation.character.set.begin.regexp",
"punctuation.character.set.end.regexp",
"keyword.operator.negation.regexp",
"support.other.parenthesis.regexp"
],
"settings": {
"foreground": "#d16969"
}
},
{
"scope": [
"constant.character.character-class.regexp",
"constant.other.character-class.set.regexp",
"constant.other.character-class.regexp",
"constant.character.set.regexp"
],
"settings": {
"foreground": "#811f3f"
}
},
{
"scope": "keyword.operator.quantifier.regexp",
"settings": {
"foreground": "#000000"
}
},
{
"scope": ["keyword.operator.or.regexp", "keyword.control.anchor.regexp"],
"settings": {
"foreground": "#EE0000"
}
},
{
"scope": ["constant.character", "constant.other.option"],
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "constant.character.escape",
"settings": {
"foreground": "#EE0000"
}
},
{
"scope": "entity.name.label",
"settings": {
"foreground": "#000000"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"newOperator": "#AF00DB",
"stringLiteral": "#a31515",
"customLiteral": "#795E26",
"numberLiteral": "#098658"
}
}
@@ -0,0 +1,424 @@
{
"$schema": "vscode://schemas/color-theme",
"name": "Light (Visual Studio)",
"colors": {
"checkbox.border": "#919191",
"editor.background": "#FFFFFF",
"editor.foreground": "#000000",
"editor.inactiveSelectionBackground": "#E5EBF1",
"editorIndentGuide.background1": "#D3D3D3",
"editorIndentGuide.activeBackground1": "#939393",
"editor.selectionHighlightBackground": "#ADD6FF80",
"editorSuggestWidget.background": "#F3F3F3",
"activityBarBadge.background": "#007ACC",
"sideBarTitle.foreground": "#6F6F6F",
"list.hoverBackground": "#E8E8E8",
"menu.border": "#D4D4D4",
"input.placeholderForeground": "#767676",
"searchEditor.textInputBorder": "#CECECE",
"settings.textInputBorder": "#CECECE",
"settings.numberInputBorder": "#CECECE",
"statusBarItem.remoteForeground": "#FFF",
"statusBarItem.remoteBackground": "#16825D",
"ports.iconRunningProcessForeground": "#369432",
"sideBarSectionHeader.background": "#0000",
"sideBarSectionHeader.border": "#61616130",
"tab.selectedForeground": "#333333b3",
"tab.selectedBackground": "#ffffffa5",
"tab.lastPinnedBorder": "#61616130",
"notebook.cellBorderColor": "#E8E8E8",
"notebook.selectedCellBackground": "#c8ddf150",
"statusBarItem.errorBackground": "#c72e0f",
"list.activeSelectionIconForeground": "#FFF",
"list.focusAndSelectionOutline": "#90C2F9",
"terminal.inactiveSelectionBackground": "#E5EBF1",
"widget.border": "#d4d4d4",
"actionBar.toggledBackground": "#dddddd",
"diffEditor.unchangedRegionBackground": "#f8f8f8",
"agentsNewSessionButton.border": "#D8D8D8",
"agentsChatInput.border": "#D8D8D8"
},
"tokenColors": [
{
"scope": [
"meta.embedded",
"source.groovy.embedded",
"string meta.image.inline.markdown",
"variable.legacy.builtin.python"
],
"settings": {
"foreground": "#000000ff"
}
},
{
"scope": "emphasis",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "strong",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": "meta.diff.header",
"settings": {
"foreground": "#000080"
}
},
{
"scope": "comment",
"settings": {
"foreground": "#008000"
}
},
{
"scope": "constant.language",
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": [
"constant.numeric",
"variable.other.enummember",
"keyword.operator.plus.exponent",
"keyword.operator.minus.exponent"
],
"settings": {
"foreground": "#098658"
}
},
{
"scope": "constant.regexp",
"settings": {
"foreground": "#811f3f"
}
},
{
"name": "css tags in selectors, xml tags",
"scope": "entity.name.tag",
"settings": {
"foreground": "#800000"
}
},
{
"scope": "entity.name.selector",
"settings": {
"foreground": "#800000"
}
},
{
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#e50000"
}
},
{
"scope": [
"entity.other.attribute-name.class.css",
"source.css entity.other.attribute-name.class",
"entity.other.attribute-name.id.css",
"entity.other.attribute-name.parent-selector.css",
"entity.other.attribute-name.parent.less",
"source.css entity.other.attribute-name.pseudo-class",
"entity.other.attribute-name.pseudo-element.css",
"source.css.less entity.other.attribute-name.id",
"entity.other.attribute-name.scss"
],
"settings": {
"foreground": "#800000"
}
},
{
"scope": "invalid",
"settings": {
"foreground": "#cd3131"
}
},
{
"scope": "markup.underline",
"settings": {
"fontStyle": "underline"
}
},
{
"scope": "markup.bold",
"settings": {
"fontStyle": "bold",
"foreground": "#000080"
}
},
{
"scope": "markup.heading",
"settings": {
"fontStyle": "bold",
"foreground": "#800000"
}
},
{
"scope": "markup.italic",
"settings": {
"fontStyle": "italic",
"foreground": "#800080"
}
},
{
"scope": "markup.strikethrough",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "markup.inserted",
"settings": {
"foreground": "#098658"
}
},
{
"scope": "markup.deleted",
"settings": {
"foreground": "#a31515"
}
},
{
"scope": "markup.changed",
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": [
"punctuation.definition.quote.begin.markdown",
"punctuation.definition.list.begin.markdown"
],
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": "markup.inline.raw",
"settings": {
"foreground": "#800000"
}
},
{
"name": "brackets of XML/HTML tags",
"scope": "punctuation.definition.tag",
"settings": {
"foreground": "#800000"
}
},
{
"scope": ["meta.preprocessor", "entity.name.function.preprocessor"],
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "meta.preprocessor.string",
"settings": {
"foreground": "#a31515"
}
},
{
"scope": "meta.preprocessor.numeric",
"settings": {
"foreground": "#098658"
}
},
{
"scope": "meta.structure.dictionary.key.python",
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": "storage",
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "storage.type",
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": ["storage.modifier", "keyword.operator.noexcept"],
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": ["string", "meta.embedded.assembly"],
"settings": {
"foreground": "#a31515"
}
},
{
"scope": [
"string.comment.buffered.block.pug",
"string.quoted.pug",
"string.interpolated.pug",
"string.unquoted.plain.in.yaml",
"string.unquoted.plain.out.yaml",
"string.unquoted.block.yaml",
"string.quoted.single.yaml",
"string.quoted.double.xml",
"string.quoted.single.xml",
"string.unquoted.cdata.xml",
"string.quoted.double.html",
"string.quoted.single.html",
"string.unquoted.html",
"string.quoted.single.handlebars",
"string.quoted.double.handlebars"
],
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "string.regexp",
"settings": {
"foreground": "#811f3f"
}
},
{
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded"
],
"settings": {
"foreground": "#0000ff"
}
},
{
"name": "Reset JavaScript string interpolation expression",
"scope": ["meta.template.expression"],
"settings": {
"foreground": "#000000"
}
},
{
"scope": [
"support.constant.property-value",
"support.constant.font-name",
"support.constant.media-type",
"support.constant.media",
"constant.other.color.rgb-value",
"constant.other.rgb-value",
"support.constant.color"
],
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": [
"support.type.vendored.property-name",
"support.type.property-name",
"source.css variable",
"source.coffee.embedded"
],
"settings": {
"foreground": "#e50000"
}
},
{
"scope": ["support.type.property-name.json"],
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": "keyword",
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "keyword.control",
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "keyword.operator",
"settings": {
"foreground": "#000000"
}
},
{
"scope": [
"keyword.operator.new",
"keyword.operator.expression",
"keyword.operator.cast",
"keyword.operator.sizeof",
"keyword.operator.alignof",
"keyword.operator.typeid",
"keyword.operator.alignas",
"keyword.operator.instanceof",
"keyword.operator.logical.python",
"keyword.operator.wordlike"
],
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "keyword.other.unit",
"settings": {
"foreground": "#098658"
}
},
{
"scope": ["punctuation.section.embedded.begin.php", "punctuation.section.embedded.end.php"],
"settings": {
"foreground": "#800000"
}
},
{
"scope": "support.function.git-rebase",
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": "constant.sha.git-rebase",
"settings": {
"foreground": "#098658"
}
},
{
"name": "coloring of the Java import and package identifiers",
"scope": [
"storage.modifier.import.java",
"variable.language.wildcard.java",
"storage.modifier.package.java"
],
"settings": {
"foreground": "#000000"
}
},
{
"name": "this.self",
"scope": "variable.language",
"settings": {
"foreground": "#0000ff"
}
}
],
"semanticHighlighting": true,
"semanticTokenColors": {
"newOperator": "#0000ff",
"stringLiteral": "#a31515",
"customLiteral": "#000000",
"numberLiteral": "#098658"
}
}
@@ -0,0 +1,482 @@
// This theme's colors are based on the original Monokai:
// #1e1f1c (tab well, borders)
// #272822 (editor background)
// #414339 (selection)
// #75715e (focus)
// #f8f8f2 (editor foreground)
{
"type": "dark",
"colors": {
"dropdown.background": "#414339",
"list.activeSelectionBackground": "#75715E",
"quickInputList.focusBackground": "#414339",
"dropdown.listBackground": "#1e1f1c",
"list.inactiveSelectionBackground": "#414339",
"list.hoverBackground": "#3e3d32",
"list.dropBackground": "#414339",
"list.highlightForeground": "#f8f8f2",
"button.background": "#75715E",
"editor.background": "#272822",
"editor.foreground": "#f8f8f2",
"selection.background": "#878b9180",
"editor.selectionHighlightBackground": "#575b6180",
"editor.selectionBackground": "#878b9180",
"minimap.selectionHighlight": "#878b9180",
"editor.wordHighlightBackground": "#4a4a7680",
"editor.wordHighlightStrongBackground": "#6a6a9680",
"editor.lineHighlightBackground": "#3e3d32",
"editorLineNumber.activeForeground": "#c2c2bf",
"editorCursor.foreground": "#f8f8f0",
"editorWhitespace.foreground": "#464741",
"editorIndentGuide.background": "#464741",
"editorIndentGuide.activeBackground": "#767771",
"editorGroupHeader.tabsBackground": "#1e1f1c",
"editorGroup.dropBackground": "#41433980",
"tab.inactiveBackground": "#34352f",
"tab.border": "#1e1f1c",
"tab.inactiveForeground": "#ccccc7", // needs to be bright so it's readable when another editor group is focused
"tab.lastPinnedBorder": "#414339",
"widget.shadow": "#00000098",
"progressBar.background": "#75715E",
"badge.background": "#75715E",
"badge.foreground": "#f8f8f2",
"editorLineNumber.foreground": "#90908a",
"panelTitle.activeForeground": "#f8f8f2",
"panelTitle.activeBorder": "#75715E",
"panelTitle.inactiveForeground": "#75715E",
"panel.border": "#414339",
"settings.focusedRowBackground": "#4143395A",
"titleBar.activeBackground": "#1e1f1c",
"statusBar.background": "#414339",
"statusBar.noFolderBackground": "#414339",
"statusBar.debuggingBackground": "#75715E",
"statusBarItem.remoteBackground": "#AC6218",
"ports.iconRunningProcessForeground": "#ccccc7",
"activityBar.background": "#272822",
"activityBar.foreground": "#f8f8f2",
"sideBar.background": "#1e1f1c",
"sideBarSectionHeader.background": "#272822",
"menu.background": "#1e1f1c",
"menu.foreground": "#cccccc",
"pickerGroup.foreground": "#75715E",
"input.background": "#414339",
"inputOption.activeBorder": "#75715E",
"focusBorder": "#99947c",
"editorWidget.background": "#1e1f1c",
"debugToolBar.background": "#1e1f1c",
"diffEditor.insertedTextBackground": "#4b661680", // middle of #272822 and #a6e22e
"diffEditor.removedTextBackground": "#90274A70", // middle of #272822 and #f92672
"inputValidation.errorBackground": "#90274A", // middle of #272822 and #f92672
"inputValidation.errorBorder": "#f92672",
"inputValidation.warningBackground": "#848528", // middle of #272822 and #e2e22e
"inputValidation.warningBorder": "#e2e22e",
"inputValidation.infoBackground": "#546190", // middle of #272822 and #819aff
"inputValidation.infoBorder": "#819aff",
"editorHoverWidget.background": "#414339",
"editorHoverWidget.border": "#75715E",
"editorSuggestWidget.background": "#272822",
"editorSuggestWidget.border": "#75715E",
"editorGroup.border": "#34352f",
"peekView.border": "#75715E",
"peekViewEditor.background": "#272822",
"peekViewResult.background": "#1e1f1c",
"peekViewTitle.background": "#1e1f1c",
"peekViewResult.selectionBackground": "#414339",
"peekViewResult.matchHighlightBackground": "#75715E",
"peekViewEditor.matchHighlightBackground": "#75715E",
"terminal.ansiBlack": "#333333",
"terminal.ansiRed": "#C4265E", // the bright color with ~75% transparent on the background
"terminal.ansiGreen": "#86B42B",
"terminal.ansiYellow": "#B3B42B",
"terminal.ansiBlue": "#6A7EC8",
"terminal.ansiMagenta": "#8C6BC8",
"terminal.ansiCyan": "#56ADBC",
"terminal.ansiWhite": "#e3e3dd",
"terminal.ansiBrightBlack": "#666666",
"terminal.ansiBrightRed": "#f92672",
"terminal.ansiBrightGreen": "#A6E22E",
"terminal.ansiBrightYellow": "#e2e22e", // hue shifted #A6E22E
"terminal.ansiBrightBlue": "#819aff", // hue shifted #AE81FF
"terminal.ansiBrightMagenta": "#AE81FF",
"terminal.ansiBrightCyan": "#66D9EF",
"terminal.ansiBrightWhite": "#f8f8f2"
},
"tokenColors": [
{
"settings": {
"foreground": "#F8F8F2"
}
},
{
"scope": [
"meta.embedded",
"source.groovy.embedded",
"string meta.image.inline.markdown",
"variable.legacy.builtin.python"
],
"settings": {
"foreground": "#F8F8F2"
}
},
{
"name": "Comment",
"scope": "comment",
"settings": {
"foreground": "#88846f"
}
},
{
"name": "String",
"scope": "string",
"settings": {
"foreground": "#E6DB74"
}
},
{
"name": "Template Definition",
"scope": ["punctuation.definition.template-expression", "punctuation.section.embedded"],
"settings": {
"foreground": "#F92672"
}
},
{
"name": "Reset JavaScript string interpolation expression",
"scope": ["meta.template.expression"],
"settings": {
"foreground": "#F8F8F2"
}
},
{
"name": "Number",
"scope": "constant.numeric",
"settings": {
"foreground": "#AE81FF"
}
},
{
"name": "Built-in constant",
"scope": "constant.language",
"settings": {
"foreground": "#AE81FF"
}
},
{
"name": "User-defined constant",
"scope": "constant.character, constant.other",
"settings": {
"foreground": "#AE81FF"
}
},
{
"name": "Variable",
"scope": "variable",
"settings": {
"fontStyle": "",
"foreground": "#F8F8F2"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#F92672"
}
},
{
"name": "Storage",
"scope": "storage",
"settings": {
"fontStyle": "",
"foreground": "#F92672"
}
},
{
"name": "Storage type",
"scope": "storage.type",
"settings": {
"fontStyle": "italic",
"foreground": "#66D9EF"
}
},
{
"name": "Class name",
"scope": "entity.name.type, entity.name.class, entity.name.namespace, entity.name.scope-resolution",
"settings": {
"fontStyle": "underline",
"foreground": "#A6E22E"
}
},
{
"name": "Inherited class",
"scope": ["entity.other.inherited-class", "punctuation.separator.namespace.ruby"],
"settings": {
"fontStyle": "italic underline",
"foreground": "#A6E22E"
}
},
{
"name": "Function name",
"scope": "entity.name.function",
"settings": {
"fontStyle": "",
"foreground": "#A6E22E"
}
},
{
"name": "Function argument",
"scope": "variable.parameter",
"settings": {
"fontStyle": "italic",
"foreground": "#FD971F"
}
},
{
"name": "Tag name",
"scope": "entity.name.tag",
"settings": {
"fontStyle": "",
"foreground": "#F92672"
}
},
{
"name": "Tag attribute",
"scope": "entity.other.attribute-name",
"settings": {
"fontStyle": "",
"foreground": "#A6E22E"
}
},
{
"name": "Library function",
"scope": "support.function",
"settings": {
"fontStyle": "",
"foreground": "#66D9EF"
}
},
{
"name": "Library constant",
"scope": "support.constant",
"settings": {
"fontStyle": "",
"foreground": "#66D9EF"
}
},
{
"name": "Library class/type",
"scope": "support.type, support.class",
"settings": {
"fontStyle": "italic",
"foreground": "#66D9EF"
}
},
{
"name": "Library variable",
"scope": "support.other.variable",
"settings": {
"fontStyle": ""
}
},
{
"name": "Invalid",
"scope": "invalid",
"settings": {
"fontStyle": "",
"foreground": "#F44747"
}
},
{
"name": "Invalid deprecated",
"scope": "invalid.deprecated",
"settings": {
"foreground": "#F44747"
}
},
{
"name": "JSON String",
"scope": "meta.structure.dictionary.json string.quoted.double.json",
"settings": {
"foreground": "#CFCFC2"
}
},
{
"name": "diff.header",
"scope": "meta.diff, meta.diff.header",
"settings": {
"foreground": "#75715E"
}
},
{
"name": "diff.deleted",
"scope": "markup.deleted",
"settings": {
"foreground": "#F92672"
}
},
{
"name": "diff.inserted",
"scope": "markup.inserted",
"settings": {
"foreground": "#A6E22E"
}
},
{
"name": "diff.changed",
"scope": "markup.changed",
"settings": {
"foreground": "#E6DB74"
}
},
{
"scope": "constant.numeric.line-number.find-in-files - match",
"settings": {
"foreground": "#AE81FFA0"
}
},
{
"scope": "entity.name.filename.find-in-files",
"settings": {
"foreground": "#E6DB74"
}
},
{
"name": "Markup Quote",
"scope": "markup.quote",
"settings": {
"foreground": "#F92672"
}
},
{
"name": "Markup Lists",
"scope": "markup.list",
"settings": {
"foreground": "#E6DB74"
}
},
{
"name": "Markup Styling",
"scope": "markup.bold, markup.italic",
"settings": {
"foreground": "#66D9EF"
}
},
{
"name": "Markup Inline",
"scope": "markup.inline.raw",
"settings": {
"fontStyle": "",
"foreground": "#FD971F"
}
},
{
"name": "Markup Headings",
"scope": "markup.heading",
"settings": {
"foreground": "#A6E22E"
}
},
{
"name": "Markup Setext Header",
"scope": "markup.heading.setext",
"settings": {
"foreground": "#A6E22E",
"fontStyle": "bold"
}
},
{
"name": "Markup Headings",
"scope": "markup.heading.markdown",
"settings": {
"fontStyle": "bold"
}
},
{
"name": "Markdown Quote",
"scope": "markup.quote.markdown",
"settings": {
"fontStyle": "italic",
"foreground": "#75715E"
}
},
{
"name": "Markdown Bold",
"scope": "markup.bold.markdown",
"settings": {
"fontStyle": "bold"
}
},
{
"name": "Markdown Link Title/Description",
"scope": "string.other.link.title.markdown,string.other.link.description.markdown",
"settings": {
"foreground": "#AE81FF"
}
},
{
"name": "Markdown Underline Link/Image",
"scope": "markup.underline.link.markdown,markup.underline.link.image.markdown",
"settings": {
"foreground": "#E6DB74"
}
},
{
"name": "Markdown Emphasis",
"scope": "markup.italic.markdown",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "markup.strikethrough",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"name": "Markdown Punctuation Definition Link",
"scope": "markup.list.unnumbered.markdown, markup.list.numbered.markdown",
"settings": {
"foreground": "#f8f8f2"
}
},
{
"name": "Markdown List Punctuation",
"scope": ["punctuation.definition.list.begin.markdown"],
"settings": {
"foreground": "#A6E22E"
}
},
{
"scope": "token.info-token",
"settings": {
"foreground": "#6796e6"
}
},
{
"scope": "token.warn-token",
"settings": {
"foreground": "#cd9731"
}
},
{
"scope": "token.error-token",
"settings": {
"foreground": "#f44747"
}
},
{
"scope": "token.debug-token",
"settings": {
"foreground": "#b267e6"
}
},
{
"name": "this.self",
"scope": "variable.language",
"settings": {
"foreground": "#FD971F"
}
}
],
"semanticHighlighting": true
}
@@ -0,0 +1,473 @@
{
"name": "Solarized (light)",
"tokenColors": [
{
"settings": {
"foreground": "#657B83"
}
},
{
"scope": [
"meta.embedded",
"source.groovy.embedded",
"string meta.image.inline.markdown",
"variable.legacy.builtin.python"
],
"settings": {
"foreground": "#657B83"
}
},
{
"name": "Comment",
"scope": "comment",
"settings": {
"fontStyle": "italic",
"foreground": "#93A1A1"
}
},
{
"name": "String",
"scope": "string",
"settings": {
"foreground": "#2AA198"
}
},
{
"name": "Regexp",
"scope": "string.regexp",
"settings": {
"foreground": "#DC322F"
}
},
{
"name": "Number",
"scope": "constant.numeric",
"settings": {
"foreground": "#D33682"
}
},
{
"name": "Variable",
"scope": ["variable.language", "variable.other"],
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Keyword",
"scope": "keyword",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Storage",
"scope": "storage",
"settings": {
"fontStyle": "bold",
"foreground": "#586E75"
}
},
{
"name": "Class name",
"scope": [
"entity.name.class",
"entity.name.type",
"entity.name.namespace",
"entity.name.scope-resolution"
],
"settings": {
"fontStyle": "",
"foreground": "#CB4B16"
}
},
{
"name": "Function name",
"scope": "entity.name.function",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Variable start",
"scope": "punctuation.definition.variable",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Embedded code markers",
"scope": ["punctuation.section.embedded.begin", "punctuation.section.embedded.end"],
"settings": {
"foreground": "#DC322F"
}
},
{
"name": "Built-in constant",
"scope": ["constant.language", "meta.preprocessor"],
"settings": {
"foreground": "#B58900"
}
},
{
"name": "Support.construct",
"scope": ["support.function.construct", "keyword.other.new"],
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "User-defined constant",
"scope": ["constant.character", "constant.other"],
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "Inherited class",
"scope": ["entity.other.inherited-class", "punctuation.separator.namespace.ruby"],
"settings": {
"foreground": "#6C71C4"
}
},
{
"name": "Function argument",
"scope": "variable.parameter",
"settings": {}
},
{
"name": "Tag name",
"scope": "entity.name.tag",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Tag start/end",
"scope": "punctuation.definition.tag",
"settings": {
"foreground": "#93A1A1"
}
},
{
"name": "Tag attribute",
"scope": "entity.other.attribute-name",
"settings": {
"foreground": "#93A1A1"
}
},
{
"name": "Library function",
"scope": "support.function",
"settings": {
"foreground": "#268BD2"
}
},
{
"name": "Continuation",
"scope": "punctuation.separator.continuation",
"settings": {
"foreground": "#DC322F"
}
},
{
"name": "Library constant",
"scope": ["support.constant", "support.variable"],
"settings": {}
},
{
"name": "Library class/type",
"scope": ["support.type", "support.class"],
"settings": {
"foreground": "#859900"
}
},
{
"name": "Library Exception",
"scope": "support.type.exception",
"settings": {
"foreground": "#CB4B16"
}
},
{
"name": "Library variable",
"scope": "support.other.variable",
"settings": {}
},
{
"name": "Invalid",
"scope": "invalid",
"settings": {
"foreground": "#DC322F"
}
},
{
"name": "diff: header",
"scope": ["meta.diff", "meta.diff.header"],
"settings": {
"fontStyle": "italic",
"foreground": "#268BD2"
}
},
{
"name": "diff: deleted",
"scope": "markup.deleted",
"settings": {
"fontStyle": "",
"foreground": "#DC322F"
}
},
{
"name": "diff: changed",
"scope": "markup.changed",
"settings": {
"fontStyle": "",
"foreground": "#CB4B16"
}
},
{
"name": "diff: inserted",
"scope": "markup.inserted",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Markup Quote",
"scope": "markup.quote",
"settings": {
"foreground": "#859900"
}
},
{
"name": "Markup Lists",
"scope": "markup.list",
"settings": {
"foreground": "#B58900"
}
},
{
"name": "Markup Styling",
"scope": ["markup.bold", "markup.italic"],
"settings": {
"foreground": "#D33682"
}
},
{
"name": "Markup: Strong",
"scope": "markup.bold",
"settings": {
"fontStyle": "bold"
}
},
{
"name": "Markup: Emphasis",
"scope": "markup.italic",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "markup.strikethrough",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"name": "Markup Inline",
"scope": "markup.inline.raw",
"settings": {
"fontStyle": "",
"foreground": "#2AA198"
}
},
{
"name": "Markup Headings",
"scope": "markup.heading",
"settings": {
"fontStyle": "bold",
"foreground": "#268BD2"
}
},
{
"name": "Markup Setext Header",
"scope": "markup.heading.setext",
"settings": {
"fontStyle": "",
"foreground": "#268BD2"
}
}
],
"colors": {
// Base
// "foreground": "",
"focusBorder": "#b49471",
// "contrastActiveBorder": "",
// "contrastBorder": "",
// "widget.shadow": "",
"input.background": "#DDD6C1",
// "input.border": "",
"input.foreground": "#586E75",
"input.placeholderForeground": "#586E75AA",
"inputOption.activeBorder": "#D3AF86",
// "inputValidation.infoBorder": "",
// "inputValidation.infoBackground": "",
// "inputValidation.warningBackground": "",
// "inputValidation.warningBorder": "",
// "inputValidation.errorBackground": "",
// "inputValidation.errorBorder": "",
"badge.background": "#B58900AA",
"progressBar.background": "#B58900",
"dropdown.background": "#EEE8D5",
// "dropdown.foreground": "",
"dropdown.border": "#D3AF86",
"button.background": "#AC9D57",
// "button.foreground": "",
"selection.background": "#878b9180",
"list.activeSelectionBackground": "#DFCA88",
"list.activeSelectionForeground": "#6C6C6C",
"quickInputList.focusBackground": "#DFCA8866",
"list.hoverBackground": "#DFCA8844",
"list.inactiveSelectionBackground": "#D1CBB8",
"list.highlightForeground": "#B58900",
// "scrollbar.shadow": "",
// "scrollbarSlider.activeBackground": "",
// "scrollbarSlider.background": "",
// "scrollbarSlider.hoverBackground": "",
// Editor
"editor.background": "#FDF6E3",
"editor.foreground": "#657B83",
"notebook.cellEditorBackground": "#F7F0E0",
"editorWidget.background": "#EEE8D5",
"editorCursor.foreground": "#657B83",
"editorWhitespace.foreground": "#586E7580",
"editor.lineHighlightBackground": "#EEE8D5",
"editor.selectionBackground": "#EEE8D5",
"minimap.selectionHighlight": "#EEE8D5",
"editorIndentGuide.background": "#586E7580",
"editorIndentGuide.activeBackground": "#081E2580",
"editorHoverWidget.background": "#CCC4B0",
"editorLineNumber.activeForeground": "#567983",
// "editorHoverWidget.border": "",
// "editorLineNumber.foreground": "",
// "editorMarkerNavigation.background": "",
// "editorMarkerNavigationError.background": "",
// "editorMarkerNavigationWarning.background": "",
// "editorLink.activeForeground": "",
// "editor.findMatchBackground": "",
// "editor.findMatchHighlightBackground": "",
// "editor.findRangeHighlightBackground": "",
// "editor.hoverHighlightBackground": "",
// "editor.inactiveSelectionBackground": "",
// "editor.lineHighlightBorder": "",
// "editor.rangeHighlightBackground": "",
// "editor.selectionHighlightBackground": "",
// "editor.wordHighlightBackground": "",
// "editor.wordHighlightStrongBackground": "",
// Editor: Suggest Widget
// "editorSuggestWidget.background": "",
// "editorSuggestWidget.border": "",
// "editorSuggestWidget.foreground": "",
// "editorSuggestWidget.highlightForeground": "",
// "editorSuggestWidget.selectedBackground": "",
// Editor: Peek View
"peekViewResult.background": "#EEE8D5",
// "peekViewResult.lineForeground": "",
// "peekViewResult.selectionBackground": "",
// "peekViewResult.selectionForeground": "",
"peekViewEditor.background": "#FFFBF2",
"peekViewTitle.background": "#EEE8D5",
"peekView.border": "#B58900",
"peekViewEditor.matchHighlightBackground": "#7744AA40",
// "peekViewResult.fileForeground": "",
// "peekViewResult.matchHighlightBackground": "",
// "peekViewTitleLabel.foreground": "",
// "peekViewTitleDescription.foreground": "",
// Editor: Diff
// "diffEditor.insertedTextBackground": "",
// "diffEditor.insertedTextBorder": "",
// "diffEditor.removedTextBackground": "",
// "diffEditor.removedTextBorder": "",
// Workbench: Title
"titleBar.activeBackground": "#EEE8D5",
// "titleBar.activeForeground": "",
// "titleBar.inactiveBackground": "",
// "titleBar.inactiveForeground": "",
// Workbench: Editors
// "editorGroupHeader.noTabsBackground": "",
"editorGroup.border": "#DDD6C1",
"editorGroup.dropBackground": "#DDD6C1AA",
"editorGroupHeader.tabsBackground": "#D9D2C2",
// Workbench: Tabs
"tab.border": "#DDD6C1",
"tab.activeBackground": "#FDF6E3",
"tab.inactiveForeground": "#586E75",
"tab.inactiveBackground": "#D3CBB7",
"tab.activeModifiedBorder": "#cb4b16",
// "tab.activeBackground": "",
// "tab.activeForeground": "",
// "tab.inactiveForeground": "",
"tab.lastPinnedBorder": "#FDF6E3",
// Workbench: Activity Bar
"activityBar.background": "#DDD6C1",
"activityBar.foreground": "#584c27",
"activityBarBadge.background": "#B58900",
// "activityBarBadge.foreground": "",
// Workbench: Panel
// "panel.background": "",
"panel.border": "#DDD6C1",
// "panelTitle.activeBorder": "",
// "panelTitle.activeForeground": "",
// "panelTitle.inactiveForeground": "",
// Workbench: Side Bar
"sideBar.background": "#EEE8D5",
"sideBarTitle.foreground": "#586E75",
// "sideBarSectionHeader.background": "",
// Workbench: Status Bar
"statusBar.foreground": "#586E75",
"statusBar.background": "#EEE8D5",
"statusBar.debuggingBackground": "#EEE8D5",
"statusBar.noFolderBackground": "#EEE8D5",
// "statusBar.foreground": "",
"statusBarItem.remoteBackground": "#AC9D57",
"ports.iconRunningProcessForeground": "#2AA19899",
"statusBarItem.prominentBackground": "#DDD6C1",
"statusBarItem.prominentHoverBackground": "#DDD6C199",
// "statusBarItem.activeBackground": "",
// "statusBarItem.hoverBackground": "",
// Workbench: Debug
"debugToolBar.background": "#DDD6C1",
"debugExceptionWidget.background": "#DDD6C1",
"debugExceptionWidget.border": "#AB395B",
// Workbench: Quick Open
"pickerGroup.border": "#2AA19899",
"pickerGroup.foreground": "#2AA19899",
// Extensions
"extensionButton.prominentBackground": "#b58900",
"extensionButton.prominentHoverBackground": "#584c27aa",
// Workbench: Terminal
// Colors sourced from the official palette http://ethanschoonover.com/solarized
"terminal.ansiBlack": "#073642",
"terminal.ansiRed": "#dc322f",
"terminal.ansiGreen": "#859900",
"terminal.ansiYellow": "#b58900",
"terminal.ansiBlue": "#268bd2",
"terminal.ansiMagenta": "#d33682",
"terminal.ansiCyan": "#2aa198",
"terminal.ansiWhite": "#eee8d5",
"terminal.ansiBrightBlack": "#002b36",
"terminal.ansiBrightRed": "#cb4b16",
"terminal.ansiBrightGreen": "#586e75",
"terminal.ansiBrightYellow": "#657b83",
"terminal.ansiBrightBlue": "#839496",
"terminal.ansiBrightMagenta": "#6c71c4",
"terminal.ansiBrightCyan": "#93a1a1",
"terminal.ansiBrightWhite": "#fdf6e3",
// Set terminal background explicitly, otherwise selection becomes invisible when the
// terminal is in the side bar
"terminal.background": "#FDF6E3",
// Interactive Playground
"walkThrough.embeddedEditorBackground": "#00000014"
},
"semanticHighlighting": true
}
+137
View File
@@ -0,0 +1,137 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>VS Code Theme Sequence</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#vscode-theme-sequence {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="vscode-theme-sequence"
data-composition-id="vscode-theme-sequence"
data-start="0"
data-width="1920"
data-height="1080"
>
<div
id="clip-light-2026"
data-composition-id="vscode-light-2026"
data-composition-src="compositions/light-2026.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-dark-2026"
data-composition-id="vscode-dark-2026"
data-composition-src="compositions/dark-2026.html"
data-start="11"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-dark-plus"
data-composition-id="vscode-dark-plus"
data-composition-src="compositions/dark-plus.html"
data-start="22"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-dark-modern"
data-composition-id="vscode-dark-modern"
data-composition-src="compositions/dark-modern.html"
data-start="33"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-light-plus"
data-composition-id="vscode-light-plus"
data-composition-src="compositions/light-plus.html"
data-start="44"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-light-modern"
data-composition-id="vscode-light-modern"
data-composition-src="compositions/light-modern.html"
data-start="55"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-visual-studio-dark"
data-composition-id="vscode-visual-studio-dark"
data-composition-src="compositions/visual-studio-dark.html"
data-start="66"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-visual-studio-light"
data-composition-id="vscode-visual-studio-light"
data-composition-src="compositions/visual-studio-light.html"
data-start="77"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-high-contrast"
data-composition-id="vscode-high-contrast"
data-composition-src="compositions/high-contrast.html"
data-start="88"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-high-contrast-light"
data-composition-id="vscode-high-contrast-light"
data-composition-src="compositions/high-contrast-light.html"
data-start="99"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-solarized-light"
data-composition-id="vscode-solarized-light"
data-composition-src="compositions/solarized-light.html"
data-start="110"
data-duration="11"
data-track-index="1"
></div>
<div
id="clip-monokai"
data-composition-id="vscode-monokai"
data-composition-src="compositions/monokai.html"
data-start="121"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["vscode-theme-sequence"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,115 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "vscode-theme-visualizer",
"type": "hyperframes:example",
"title": "VS Code Theme Visualizer",
"description": "Faithful VS Code workbench recreation with per-character typing animation across 12 built-in themes. Activity bar, sidebar, tabs, editor, terminal, and status bar — all driven by official theme JSON files.",
"tags": ["code", "developer", "showcase", "vscode", "themes"],
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 132,
"files": [
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/dark-2026.html",
"target": "compositions/dark-2026.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/dark-modern.html",
"target": "compositions/dark-modern.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/dark-plus.html",
"target": "compositions/dark-plus.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/high-contrast-light.html",
"target": "compositions/high-contrast-light.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/high-contrast.html",
"target": "compositions/high-contrast.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/light-2026.html",
"target": "compositions/light-2026.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/light-modern.html",
"target": "compositions/light-modern.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/light-plus.html",
"target": "compositions/light-plus.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/monokai.html",
"target": "compositions/monokai.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/solarized-light.html",
"target": "compositions/solarized-light.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/visual-studio-dark.html",
"target": "compositions/visual-studio-dark.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/visual-studio-light.html",
"target": "compositions/visual-studio-light.html",
"type": "hyperframes:composition"
},
{
"path": "assets/background.jpeg",
"target": "assets/background.jpeg",
"type": "hyperframes:asset"
},
{
"path": "assets/vscode-sequence.css",
"target": "assets/vscode-sequence.css",
"type": "hyperframes:style"
},
{
"path": "assets/vscode-sequence-runtime.js",
"target": "assets/vscode-sequence-runtime.js",
"type": "hyperframes:asset"
},
{
"path": "assets/vscode-theme-registry.js",
"target": "assets/vscode-theme-registry.js",
"type": "hyperframes:asset"
},
{
"path": "scripts/build-compositions.mjs",
"target": "scripts/build-compositions.mjs",
"type": "hyperframes:asset"
},
{
"path": "scripts/build-theme-registry.mjs",
"target": "scripts/build-theme-registry.mjs",
"type": "hyperframes:asset"
},
{
"path": "DESIGN.md",
"target": "DESIGN.md",
"type": "hyperframes:asset"
}
]
}
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Dark 2026 Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-dark-2026 {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-dark-2026"
data-composition-id="render-dark-2026"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-dark-2026"
data-composition-id="vscode-dark-2026"
data-composition-src="../compositions/dark-2026.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-dark-2026"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Dark Modern Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-dark-modern {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-dark-modern"
data-composition-id="render-dark-modern"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-dark-modern"
data-composition-id="vscode-dark-modern"
data-composition-src="../compositions/dark-modern.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-dark-modern"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Dark+ Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-dark-plus {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-dark-plus"
data-composition-id="render-dark-plus"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-dark-plus"
data-composition-id="vscode-dark-plus"
data-composition-src="../compositions/dark-plus.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-dark-plus"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Default High Contrast Light Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-high-contrast-light {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-high-contrast-light"
data-composition-id="render-high-contrast-light"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-high-contrast-light"
data-composition-id="vscode-high-contrast-light"
data-composition-src="../compositions/high-contrast-light.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-high-contrast-light"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Default High Contrast Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-high-contrast {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-high-contrast"
data-composition-id="render-high-contrast"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-high-contrast"
data-composition-id="vscode-high-contrast"
data-composition-src="../compositions/high-contrast.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-high-contrast"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Light 2026 Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-light-2026 {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-light-2026"
data-composition-id="render-light-2026"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-light-2026"
data-composition-id="vscode-light-2026"
data-composition-src="../compositions/light-2026.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-light-2026"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Light Modern Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-light-modern {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-light-modern"
data-composition-id="render-light-modern"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-light-modern"
data-composition-id="vscode-light-modern"
data-composition-src="../compositions/light-modern.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-light-modern"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Light+ Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-light-plus {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-light-plus"
data-composition-id="render-light-plus"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-light-plus"
data-composition-id="vscode-light-plus"
data-composition-src="../compositions/light-plus.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-light-plus"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Monokai Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-monokai {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-monokai"
data-composition-id="render-monokai"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-monokai"
data-composition-id="vscode-monokai"
data-composition-src="../compositions/monokai.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-monokai"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Solarized Light Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-solarized-light {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-solarized-light"
data-composition-id="render-solarized-light"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-solarized-light"
data-composition-id="vscode-solarized-light"
data-composition-src="../compositions/solarized-light.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-solarized-light"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Visual Studio Dark Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-visual-studio-dark {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-visual-studio-dark"
data-composition-id="render-visual-studio-dark"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-visual-studio-dark"
data-composition-id="vscode-visual-studio-dark"
data-composition-src="../compositions/visual-studio-dark.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-visual-studio-dark"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,50 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Visual Studio Light Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-visual-studio-light {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div
id="render-visual-studio-light"
data-composition-id="render-visual-studio-light"
data-start="0"
data-duration="11"
data-width="1920"
data-height="1080"
>
<div
id="clip-visual-studio-light"
data-composition-id="vscode-visual-studio-light"
data-composition-src="../compositions/visual-studio-light.html"
data-start="0"
data-duration="11"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-visual-studio-light"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
@@ -0,0 +1,932 @@
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const projectRoot = path.resolve(__dirname, "..");
const repoRoot = path.resolve(projectRoot, "../../..");
const assetsDir = path.join(projectRoot, "assets");
const compositionsDir = path.join(projectRoot, "compositions");
const renderEntriesDir = path.join(projectRoot, "render-entries");
const blocksDir = path.join(repoRoot, "registry", "blocks");
fs.mkdirSync(compositionsDir, { recursive: true });
fs.mkdirSync(renderEntriesDir, { recursive: true });
const registrySource = fs.readFileSync(path.join(assetsDir, "vscode-theme-registry.js"), "utf8");
const registryBody = registrySource
.replace(/^.*window\.VSCODE_THEME_REGISTRY\s*=\s*/s, "")
.replace(/;\s*$/, "");
const registry = new Function("return (" + registryBody + ")")();
const clipDuration = 11;
const css = String.raw`* {
box-sizing: border-box;
letter-spacing: 0;
}
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
.vscode-theme-scene {
--activity-bg: #181818;
--activity-fg: #d7d7d7;
--activity-muted: #868686;
--activity-active: #0078d4;
--sidebar-bg: #181818;
--sidebar-fg: #cccccc;
--sidebar-border: #2b2b2b;
--tab-bg: #181818;
--tab-active-bg: #1f1f1f;
--tab-active-fg: #ffffff;
--tab-inactive-fg: #9d9d9d;
--tab-border: #2b2b2b;
--editor-bg: #1f1f1f;
--editor-fg: #cccccc;
--editor-line: rgba(255, 255, 255, 0.04);
--gutter-fg: #6e7681;
--gutter-active-fg: #cccccc;
--panel-bg: #181818;
--panel-border: #2b2b2b;
--status-bg: #181818;
--status-fg: #cccccc;
--status-border: #2b2b2b;
--title-bg: #181818;
--title-fg: #cccccc;
--token-comment: #6a9955;
--token-keyword: #c586c0;
--token-function: #dcdcaa;
--token-string: #ce9178;
--token-number: #b5cea8;
--token-variable: #9cdcfe;
--token-parameter: #9cdcfe;
--token-operator: #d4d4d4;
--token-punctuation: #d4d4d4;
--token-class-name: #4ec9b0;
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background:
linear-gradient(180deg, rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 0.32)),
url("../assets/background.jpeg") center / cover no-repeat;
color: var(--editor-fg);
}
.scene-content {
position: relative;
z-index: 1;
width: 100%;
height: 100%;
padding: 54px 70px 92px;
display: flex;
flex-direction: column;
gap: 16px;
perspective: 2200px;
perspective-origin: 56% 52%;
}
.header {
display: flex;
align-items: end;
justify-content: space-between;
min-height: 66px;
text-shadow:
0 2px 12px rgba(0, 0, 0, 0.42),
0 14px 34px rgba(0, 0, 0, 0.32);
}
.kicker {
margin: 0 0 7px;
color: var(--gutter-fg);
font-size: 15px;
font-weight: 650;
text-transform: uppercase;
text-shadow:
0 2px 8px rgba(0, 0, 0, 0.48),
0 10px 26px rgba(0, 0, 0, 0.36);
}
.title {
margin: 0;
color: var(--editor-fg);
font-size: 44px;
line-height: 1;
font-weight: 760;
}
.source-note {
width: 510px;
color: var(--gutter-fg);
font-size: 16px;
line-height: 1.35;
text-align: right;
text-shadow:
0 2px 10px rgba(0, 0, 0, 0.46),
0 12px 30px rgba(0, 0, 0, 0.34);
}
.workbench {
height: 824px;
display: grid;
grid-template-columns: 54px 290px 1fr;
grid-template-rows: 36px 1fr 26px;
overflow: hidden;
border: 1px solid var(--sidebar-border);
border-radius: 8px;
background: var(--editor-bg);
box-shadow: 0 34px 90px rgba(0, 0, 0, 0.42);
transform: translateZ(0);
transform-origin: 82% 50%;
transform-style: preserve-3d;
will-change: transform;
}
.titlebar {
grid-column: 1 / -1;
display: grid;
grid-template-columns: 120px 1fr 210px;
align-items: center;
background: var(--title-bg);
color: var(--title-fg);
border-bottom: 1px solid var(--tab-border);
font-size: 12px;
}
.traffic {
display: flex;
gap: 8px;
padding-left: 18px;
}
.traffic span {
width: 12px;
height: 12px;
border-radius: 999px;
}
.traffic span:nth-child(1) { background: #ff5f57; }
.traffic span:nth-child(2) { background: #ffbd2e; }
.traffic span:nth-child(3) { background: #28c840; }
.window-title {
justify-self: center;
opacity: 0.84;
}
.command-center {
justify-self: end;
width: 176px;
height: 22px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid color-mix(in srgb, var(--title-fg), transparent 78%);
border-radius: 5px;
color: color-mix(in srgb, var(--title-fg), transparent 18%);
}
.activity {
grid-row: 2 / 3;
background: var(--activity-bg);
border-right: 1px solid var(--sidebar-border);
display: flex;
flex-direction: column;
align-items: center;
padding: 10px 0;
gap: 18px;
}
.activity-icon {
width: 28px;
height: 28px;
color: var(--activity-muted);
}
.activity-icon.active {
color: var(--activity-fg);
border-left: 2px solid var(--activity-active);
padding-left: 4px;
}
.sidebar {
grid-row: 2 / 3;
background: var(--sidebar-bg);
color: var(--sidebar-fg);
border-right: 1px solid var(--sidebar-border);
display: flex;
flex-direction: column;
min-width: 0;
}
.sidebar-title {
height: 38px;
display: flex;
align-items: center;
padding: 0 20px;
color: var(--sidebar-fg);
font-size: 11px;
text-transform: uppercase;
}
.section-title {
height: 24px;
display: flex;
align-items: center;
gap: 6px;
padding: 0 14px;
background: color-mix(in srgb, var(--sidebar-bg), var(--sidebar-fg) 5%);
border-top: 1px solid var(--sidebar-border);
border-bottom: 1px solid var(--sidebar-border);
color: var(--sidebar-fg);
font-size: 11px;
font-weight: 700;
}
.tree {
padding: 8px 0;
font-size: 13px;
line-height: 24px;
}
.tree-row {
height: 24px;
display: flex;
align-items: center;
gap: 7px;
padding: 0 10px 0 18px;
color: color-mix(in srgb, var(--sidebar-fg), transparent 8%);
white-space: nowrap;
}
.tree-row.child {
padding-left: 34px;
}
.tree-row.selected {
background: color-mix(in srgb, var(--sidebar-fg), transparent 88%);
color: var(--sidebar-fg);
}
.editor-area {
grid-row: 2 / 3;
display: grid;
grid-template-rows: 36px 30px 1fr 138px;
min-width: 0;
background: var(--editor-bg);
}
.tabs {
display: flex;
background: var(--tab-bg);
border-bottom: 1px solid var(--tab-border);
}
.tab {
width: 205px;
height: 36px;
display: flex;
align-items: center;
gap: 8px;
padding: 0 13px;
border-right: 1px solid var(--tab-border);
background: var(--tab-active-bg);
color: var(--tab-active-fg);
border-top: 2px solid var(--activity-active);
font-size: 13px;
}
.tab.inactive {
background: var(--tab-bg);
color: var(--tab-inactive-fg);
border-top-color: transparent;
}
.breadcrumbs {
display: flex;
align-items: center;
gap: 7px;
padding: 0 18px;
color: var(--gutter-fg);
border-bottom: 1px solid color-mix(in srgb, var(--tab-border), transparent 20%);
font-size: 12px;
}
.editor {
position: relative;
overflow: hidden;
background: var(--editor-bg);
color: var(--editor-fg);
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 18px;
line-height: 1.52;
}
.active-line {
position: absolute;
left: 0;
right: 0;
top: 0;
height: 28px;
background: var(--editor-line);
will-change: transform;
}
.code {
position: relative;
padding: 20px 36px 18px 0;
}
.line {
height: 28px;
display: grid;
grid-template-columns: 72px 1fr;
align-items: center;
}
.line-number {
padding-right: 18px;
color: var(--gutter-fg);
text-align: right;
user-select: none;
}
.line.is-active .line-number {
color: var(--gutter-active-fg);
}
.line-code {
white-space: pre;
}
.char {
opacity: 0;
}
.tok-comment { color: var(--token-comment); }
.tok-keyword { color: var(--token-keyword); }
.tok-function { color: var(--token-function); }
.tok-string { color: var(--token-string); }
.tok-number { color: var(--token-number); }
.tok-variable { color: var(--token-variable); }
.tok-parameter { color: var(--token-parameter); }
.tok-operator { color: var(--token-operator); }
.tok-punctuation { color: var(--token-punctuation); }
.tok-class-name { color: var(--token-class-name); }
.caret {
position: absolute;
left: 0;
top: 0;
z-index: 3;
display: block;
width: 2px;
height: 22px;
background: var(--editor-fg);
pointer-events: none;
will-change: transform, opacity;
}
.terminal {
display: grid;
grid-template-rows: 32px 1fr;
background: var(--panel-bg);
border-top: 1px solid var(--panel-border);
color: var(--editor-fg);
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
font-size: 14px;
}
.panel-tabs {
display: flex;
align-items: center;
gap: 22px;
padding: 0 18px;
border-bottom: 1px solid var(--panel-border);
color: var(--gutter-fg);
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 12px;
text-transform: uppercase;
}
.panel-tabs .active {
color: var(--editor-fg);
border-bottom: 1px solid var(--activity-active);
height: 32px;
display: flex;
align-items: center;
}
.terminal-body {
padding: 12px 20px;
color: var(--editor-fg);
line-height: 1.8;
}
.prompt {
color: var(--token-function);
}
.statusbar {
grid-column: 1 / -1;
display: flex;
align-items: center;
justify-content: space-between;
background: var(--status-bg);
color: var(--status-fg);
border-top: 1px solid var(--status-border);
font-size: 12px;
}
.status-left,
.status-right {
display: flex;
align-items: center;
gap: 18px;
padding: 0 12px;
}
.remote {
align-self: stretch;
display: flex;
align-items: center;
padding: 0 12px;
margin-left: -12px;
background: var(--status-remote-bg, var(--activity-active));
color: var(--status-remote-fg, #ffffff);
}
svg {
display: block;
}
`;
const runtime = String.raw`(() => {
const codeLines = [
[{ text: "# A small functional toolkit", token: "comment" }],
[{ text: "def", token: "keyword" }, { text: " ", token: "plain" }, { text: "pluck_deep", token: "function" }, { text: "(", token: "punctuation" }, { text: "key", token: "parameter" }, { text: "):", token: "punctuation" }],
[{ text: " ", token: "plain" }, { text: "return", token: "keyword" }, { text: " ", token: "plain" }, { text: "lambda", token: "keyword" }, { text: " ", token: "plain" }, { text: "obj", token: "parameter" }, { text: ": ", token: "punctuation" }, { text: "reduce", token: "function" }, { text: "(", token: "punctuation" }, { text: "lambda", token: "keyword" }, { text: " ", token: "plain" }, { text: "acc", token: "parameter" }, { text: ", ", token: "punctuation" }, { text: "k", token: "parameter" }, { text: ": ", token: "punctuation" }, { text: "acc", token: "variable" }, { text: "[", token: "punctuation" }, { text: "k", token: "variable" }, { text: "]", token: "punctuation" }, { text: ", ", token: "punctuation" }, { text: "key", token: "variable" }, { text: ".split", token: "function" }, { text: "(", token: "punctuation" }, { text: "'.'", token: "string" }, { text: "), ", token: "punctuation" }, { text: "obj", token: "variable" }, { text: ")", token: "punctuation" }],
[],
[{ text: "def", token: "keyword" }, { text: " ", token: "plain" }, { text: "compose", token: "function" }, { text: "(", token: "punctuation" }, { text: "*", token: "operator" }, { text: "fns", token: "parameter" }, { text: "):", token: "punctuation" }],
[{ text: " ", token: "plain" }, { text: "return", token: "keyword" }, { text: " ", token: "plain" }, { text: "lambda", token: "keyword" }, { text: " ", token: "plain" }, { text: "res", token: "parameter" }, { text: ": ", token: "punctuation" }, { text: "reduce", token: "function" }, { text: "(", token: "punctuation" }, { text: "lambda", token: "keyword" }, { text: " ", token: "plain" }, { text: "acc", token: "parameter" }, { text: ", ", token: "punctuation" }, { text: "fn", token: "parameter" }, { text: ": ", token: "punctuation" }, { text: "fn", token: "function" }, { text: "(", token: "punctuation" }, { text: "acc", token: "variable" }, { text: "), ", token: "punctuation" }, { text: "fns", token: "variable" }, { text: ", ", token: "punctuation" }, { text: "res", token: "variable" }, { text: ")", token: "punctuation" }],
[],
[{ text: "def", token: "keyword" }, { text: " ", token: "plain" }, { text: "unfold", token: "function" }, { text: "(", token: "punctuation" }, { text: "f", token: "parameter" }, { text: ", ", token: "punctuation" }, { text: "seed", token: "parameter" }, { text: "):", token: "punctuation" }],
[{ text: " ", token: "plain" }, { text: "\"\"\"Build a list by repeatedly applying f to a seed.\"\"\"", token: "string" }],
[{ text: " acc", token: "variable" }, { text: " = ", token: "operator" }, { text: "[]", token: "punctuation" }],
[{ text: " while", token: "keyword" }, { text: " ", token: "plain" }, { text: "True", token: "className" }, { text: ":", token: "punctuation" }],
[{ text: " result", token: "variable" }, { text: " = ", token: "operator" }, { text: "f", token: "function" }, { text: "(", token: "punctuation" }, { text: "seed", token: "variable" }, { text: ")", token: "punctuation" }],
[{ text: " if", token: "keyword" }, { text: " ", token: "plain" }, { text: "result", token: "variable" }, { text: " is ", token: "keyword" }, { text: "None", token: "className" }, { text: ":", token: "punctuation" }],
[{ text: " return", token: "keyword" }, { text: " ", token: "plain" }, { text: "acc", token: "variable" }],
[{ text: " acc", token: "variable" }, { text: ".append", token: "function" }, { text: "(", token: "punctuation" }, { text: "result", token: "variable" }, { text: "[", token: "punctuation" }, { text: "0", token: "number" }, { text: "])", token: "punctuation" }],
[{ text: " seed", token: "variable" }, { text: " = ", token: "operator" }, { text: "result", token: "variable" }, { text: "[", token: "punctuation" }, { text: "1", token: "number" }, { text: "]", token: "punctuation" }],
[],
];
const fallback = {
"activityBar.background": "#181818",
"activityBar.foreground": "#d7d7d7",
"activityBar.inactiveForeground": "#868686",
"activityBar.activeBorder": "#0078d4",
"sideBar.background": "#181818",
"sideBar.foreground": "#cccccc",
"sideBar.border": "#2b2b2b",
"tab.activeBackground": "#1f1f1f",
"tab.activeForeground": "#ffffff",
"tab.inactiveBackground": "#181818",
"tab.inactiveForeground": "#9d9d9d",
"tab.border": "#2b2b2b",
"editor.background": "#1f1f1f",
"editor.foreground": "#cccccc",
"editor.lineHighlightBackground": "#ffffff0a",
"editorLineNumber.foreground": "#6e7681",
"editorLineNumber.activeForeground": "#cccccc",
"panel.background": "#181818",
"panel.border": "#2b2b2b",
"statusBar.background": "#181818",
"statusBar.foreground": "#cccccc",
"statusBar.border": "#2b2b2b",
"titleBar.activeBackground": "#181818",
"titleBar.activeForeground": "#cccccc",
};
function color(theme, key) {
return theme.colors[key] || fallback[key] || theme.colors.foreground || "#cccccc";
}
function solarizedGrey(theme) {
return theme.colors["tab.inactiveForeground"] || theme.colors["editor.foreground"] || "#586E75";
}
function setVar(root, name, value) {
root.style.setProperty(name, value);
}
function applyTheme(root, theme) {
const solarizedUiGrey = theme.id === "solarized-light" ? solarizedGrey(theme) : null;
setVar(root, "--activity-bg", color(theme, "activityBar.background"));
setVar(root, "--activity-fg", solarizedUiGrey || color(theme, "activityBar.foreground"));
setVar(root, "--activity-muted", solarizedUiGrey || color(theme, "activityBar.inactiveForeground"));
setVar(root, "--activity-active", color(theme, "activityBar.activeBorder"));
setVar(root, "--sidebar-bg", color(theme, "sideBar.background"));
setVar(root, "--sidebar-fg", solarizedUiGrey || color(theme, "sideBar.foreground"));
setVar(root, "--sidebar-border", color(theme, "sideBar.border"));
setVar(root, "--tab-bg", color(theme, "tab.inactiveBackground"));
setVar(root, "--tab-active-bg", color(theme, "tab.activeBackground"));
setVar(root, "--tab-active-fg", solarizedUiGrey || color(theme, "tab.activeForeground"));
setVar(root, "--tab-inactive-fg", solarizedUiGrey || color(theme, "tab.inactiveForeground"));
setVar(root, "--tab-border", color(theme, "tab.border"));
setVar(root, "--editor-bg", color(theme, "editor.background"));
setVar(root, "--editor-fg", color(theme, "editor.foreground"));
setVar(root, "--editor-line", color(theme, "editor.lineHighlightBackground"));
setVar(root, "--gutter-fg", color(theme, "editorLineNumber.foreground"));
setVar(root, "--gutter-active-fg", color(theme, "editorLineNumber.activeForeground"));
setVar(root, "--panel-bg", color(theme, "panel.background"));
setVar(root, "--panel-border", color(theme, "panel.border"));
setVar(root, "--status-bg", color(theme, "statusBar.background"));
setVar(root, "--status-fg", color(theme, "statusBar.foreground"));
setVar(root, "--status-border", color(theme, "statusBar.border"));
setVar(root, "--status-remote-bg", color(theme, "statusBarItem.remoteBackground"));
setVar(root, "--status-remote-fg", solarizedUiGrey || color(theme, "statusBarItem.remoteForeground"));
setVar(root, "--title-bg", color(theme, "titleBar.activeBackground"));
setVar(root, "--title-fg", solarizedUiGrey || color(theme, "titleBar.activeForeground"));
setVar(root, "--token-comment", theme.tokens.comment);
setVar(root, "--token-keyword", theme.tokens.keyword);
setVar(root, "--token-function", theme.tokens.function);
setVar(root, "--token-string", theme.tokens.string);
setVar(root, "--token-number", theme.tokens.number);
setVar(root, "--token-variable", theme.tokens.variable);
setVar(root, "--token-parameter", theme.tokens.parameter);
setVar(root, "--token-operator", theme.tokens.operator);
setVar(root, "--token-punctuation", theme.tokens.punctuation);
setVar(root, "--token-class-name", theme.tokens.className);
}
function renderCode(root) {
const code = root.querySelector(".code");
codeLines.forEach((segments, index) => {
const line = document.createElement("div");
line.className = "line";
line.dataset.lineIndex = String(index);
const lineNumber = document.createElement("span");
lineNumber.className = "line-number";
lineNumber.textContent = String(index + 1);
line.appendChild(lineNumber);
const lineCode = document.createElement("span");
lineCode.className = "line-code";
segments.forEach((segment) => {
[...segment.text].forEach((char) => {
const span = document.createElement("span");
span.className = segment.token === "plain" ? "char" : "char tok-" + segment.token.replace(/[A-Z]/g, (match) => "-" + match.toLowerCase());
span.dataset.lineIndex = String(index);
span.textContent = char;
lineCode.appendChild(span);
});
});
line.appendChild(lineCode);
code.appendChild(line);
});
const caret = document.createElement("span");
caret.className = "caret";
root.querySelector(".editor").appendChild(caret);
}
function caretPointForElement(editor, el) {
const editorBox = editor.getBoundingClientRect();
const charBox = el.getBoundingClientRect();
return {
x: charBox.right - editorBox.left + 2,
y: charBox.top - editorBox.top + 3,
};
}
function caretPointForLineStart(editor, line) {
const editorBox = editor.getBoundingClientRect();
const lineBox = line.getBoundingClientRect();
const codeBox = line.querySelector(".line-code").getBoundingClientRect();
return {
x: codeBox.left - editorBox.left,
y: lineBox.top - editorBox.top + 3,
};
}
function lineHighlightY(editor, line) {
const editorBox = editor.getBoundingClientRect();
const lineBox = line.getBoundingClientRect();
return lineBox.top - editorBox.top;
}
function buildTimeline(root, compositionId) {
const tl = gsap.timeline({ paused: true });
const editor = root.querySelector(".editor");
const caret = root.querySelector(".caret");
const activeLine = root.querySelector(".active-line");
const lineEls = gsap.utils.toArray(root.querySelectorAll(".line"));
const lineStartTimes = [];
const charSchedule = [];
let cursorTime = 0.95;
lineEls.forEach((line, lineIndex) => {
const lineChars = gsap.utils.toArray(line.querySelectorAll(".char"));
lineStartTimes[lineIndex] = cursorTime;
lineChars.forEach((char, charIndex) => {
charSchedule.push({ char, time: cursorTime + charIndex * 0.012 });
});
cursorTime += Math.max(lineChars.length * 0.012, 0.08) + 0.045;
});
gsap.set(activeLine, { y: lineHighlightY(editor, lineEls[0]) });
gsap.set(caret, caretPointForLineStart(editor, lineEls[0]));
tl.from(root.querySelector(".header"), { y: 24, opacity: 0, duration: 0.45, ease: "power3.out" }, 0);
tl.from(root.querySelector(".workbench"), { y: 42, opacity: 0, scale: 0.986, duration: 0.58, ease: "power3.out" }, 0.1);
tl.from(activeLine, { opacity: 0, duration: 0.22, ease: "power2.out" }, 0.74);
lineStartTimes.forEach((time, lineIndex) => {
const line = lineEls[lineIndex];
tl.set(activeLine, { y: lineHighlightY(editor, line) }, time);
tl.set(caret, caretPointForLineStart(editor, line), time);
tl.call(() => {
lineEls.forEach((item) => item.classList.toggle("is-active", item === line));
}, [], time);
});
charSchedule.forEach(({ char, time }) => {
tl.set(char, { opacity: 1 }, time);
tl.set(caret, caretPointForElement(editor, char), time + 0.002);
});
tl.to(root.querySelector(".caret"), { opacity: 0, duration: 0.34, repeat: 25, yoyo: true, ease: "steps(1)" }, 0.95);
tl.from(root.querySelector(".terminal"), { y: 140, opacity: 0, duration: 0.56, ease: "power3.out" }, 7.55);
tl.from(root.querySelector(".terminal-body").children, { opacity: 0, y: 8, duration: 0.24, stagger: 0.16, ease: "power2.out" }, 8.05);
tl.to(root.querySelector(".workbench"), { rotateY: -10.5, z: 74, duration: 0.72, ease: "power2.inOut" }, 9.35);
tl.to(root.querySelector(".workbench"), { rotateY: 0, z: 0, duration: 0.62, ease: "power2.inOut" }, 10.08);
window.__timelines = window.__timelines || {};
window.__timelines[compositionId] = tl;
const previewTime = new URLSearchParams(window.location.search).get("t");
if (previewTime !== null) {
tl.time(Number(previewTime));
}
}
window.createVSCodeThemeComposition = (compositionId, themeOrId) => {
const root =
document.querySelector('[data-composition-id="' + compositionId + '"] .vscode-theme-scene') ||
document.querySelector('.vscode-theme-scene[data-composition-id="' + compositionId + '"]') ||
document.querySelector('[data-composition-id="' + compositionId + '"]');
const theme = typeof themeOrId === "string"
? window.VSCODE_THEME_REGISTRY.find((item) => item.id === themeOrId)
: themeOrId;
if (!root || !theme) return;
root.querySelector(".theme-label").textContent = theme.label;
root.querySelector(".theme-source").textContent = theme.sourceFile;
applyTheme(root, theme);
renderCode(root);
buildTimeline(root, compositionId);
};
})();
`;
function compositionMarkup(compositionId, theme) {
return `<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>${theme.label} VS Code Theme Composition</title>
</head>
<body>
<template id="${compositionId}-template">
<div class="vscode-theme-scene" data-composition-id="${compositionId}" data-width="1920" data-height="1080">
<main class="scene-content">
<section class="header">
<div>
<p class="kicker">Official VS Code built-in theme</p>
<h1 class="title"><span class="theme-label">${theme.label}</span></h1>
</div>
<p class="source-note">
Typing \`functional_toolkit.py\` with workbench colors from
<span class="theme-source">${theme.sourceFile}</span>.
</p>
</section>
${workbenchMarkup()}
</main>
<style>
${css}
</style>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<script>
${runtime}
</script>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["${compositionId}"] = window.__timelines["${compositionId}"] || gsap.timeline({ paused: true });
window.createVSCodeThemeComposition("${compositionId}", ${JSON.stringify(theme)});
</script>
</div>
</template>
</body>
</html>
`;
}
function workbenchMarkup() {
return `<section class="workbench">
<div class="titlebar">
<div class="traffic"><span></span><span></span><span></span></div>
<div class="window-title">functional-toolkit - Visual Studio Code</div>
<div class="command-center">Search</div>
</div>
<aside class="activity" aria-label="Activity bar">
<svg class="activity-icon active" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M4 4h7v7H4V4Zm9 0h7v7h-7V4ZM4 13h7v7H4v-7Zm9 0h7v7h-7v-7Z" /></svg>
<svg class="activity-icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="2" d="m21 21-5.2-5.2M10.5 18a7.5 7.5 0 1 1 0-15 7.5 7.5 0 0 1 0 15Z" /></svg>
<svg class="activity-icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="2" d="M8 18 3 12l5-6m8 12 5-6-5-6" /></svg>
<svg class="activity-icon" viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="2" d="M12 3v18m0-18 6 6m-6-6L6 9m6 12 6-6m-6 6-6-6" /></svg>
</aside>
<aside class="sidebar">
<div class="sidebar-title">Explorer</div>
<div class="section-title">⌄ Functional Toolkit</div>
<div class="tree">
<div class="tree-row">⌄ src</div>
<div class="tree-row child selected">◇ functional_toolkit.py</div>
<div class="tree-row child">◇ test_toolkit.py</div>
<div class="tree-row">◇ pyproject.toml</div>
<div class="tree-row">◇ README.md</div>
</div>
</aside>
<section class="editor-area">
<div class="tabs">
<div class="tab">◇ functional_toolkit.py</div>
<div class="tab inactive">README.md</div>
</div>
<div class="breadcrumbs">functional-toolkit src functional_toolkit.py</div>
<div class="editor">
<div class="active-line"></div>
<div class="code"></div>
</div>
<div class="terminal">
<div class="panel-tabs"><span class="active">Terminal</span><span>Problems</span><span>Output</span></div>
<div class="terminal-body">
<div><span class="prompt">functional-toolkit %</span> python -m pytest</div>
<div>collected 3 items</div>
<div>tests/test_toolkit.py ... <span class="tok-comment">passed</span></div>
</div>
</div>
</section>
<footer class="statusbar">
<div class="status-left">
<span class="remote">main</span>
<span>0 errors</span>
<span>0 warnings</span>
</div>
<div class="status-right">
<span>Ln 17, Col 1</span>
<span>Spaces: 4</span>
<span>UTF-8</span>
<span>Python 3.12</span>
</div>
</footer>
</section>`;
}
function rootIndexMarkup() {
const clips = registry
.map((theme, index) => {
const compositionId = `vscode-${theme.id}`;
return ` <div
id="clip-${theme.id}"
data-composition-id="${compositionId}"
data-composition-src="compositions/${theme.id}.html"
data-start="${index * clipDuration}"
data-duration="${clipDuration}"
data-track-index="1"
></div>`;
})
.join("\n");
return `<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>VS Code Theme Sequence</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#vscode-theme-sequence {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div id="vscode-theme-sequence" data-composition-id="vscode-theme-sequence" data-start="0" data-width="1920" data-height="1080">
${clips}
<script>
window.__timelines = window.__timelines || {};
window.__timelines["vscode-theme-sequence"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
`;
}
function renderEntryMarkup(theme) {
const compositionId = `vscode-${theme.id}`;
return `<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>${theme.label} Render Entry</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
html,
body {
margin: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
#render-${theme.id} {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
background: #000000;
}
</style>
</head>
<body>
<div id="render-${theme.id}" data-composition-id="render-${theme.id}" data-start="0" data-duration="${clipDuration}" data-width="1920" data-height="1080">
<div
id="clip-${theme.id}"
data-composition-id="${compositionId}"
data-composition-src="../compositions/${theme.id}.html"
data-start="0"
data-duration="${clipDuration}"
data-track-index="1"
></div>
<script>
window.__timelines = window.__timelines || {};
window.__timelines["render-${theme.id}"] = gsap.timeline({ paused: true });
</script>
</div>
</body>
</html>
`;
}
fs.writeFileSync(path.join(assetsDir, "vscode-sequence.css"), css);
fs.writeFileSync(path.join(assetsDir, "vscode-sequence-runtime.js"), runtime);
for (const theme of registry) {
const compositionId = `vscode-${theme.id}`;
fs.writeFileSync(
path.join(compositionsDir, `${theme.id}.html`),
compositionMarkup(compositionId, theme),
);
fs.writeFileSync(path.join(renderEntriesDir, `${theme.id}.html`), renderEntryMarkup(theme));
const blockName = `code-snippet-${theme.id}`;
const blockDir = path.join(blocksDir, blockName);
fs.mkdirSync(blockDir, { recursive: true });
fs.writeFileSync(
path.join(blockDir, `${blockName}.html`),
compositionMarkup(compositionId, theme),
);
}
fs.writeFileSync(path.join(projectRoot, "index.html"), rootIndexMarkup());
console.log(
`Wrote ${registry.length} themed compositions, render entries, block HTMLs, and root sequence`,
);
@@ -0,0 +1,237 @@
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const projectRoot = path.resolve(__dirname, "..");
const themeDir = path.join(projectRoot, "assets", "vscode-themes");
const outFile = path.join(projectRoot, "assets", "vscode-theme-registry.js");
const themeEntries = [
["light-2026", "Light 2026", "2026-light.json"],
["dark-2026", "Dark 2026", "2026-dark.json"],
["dark-plus", "Dark+", "dark_plus.json"],
["dark-modern", "Dark Modern", "dark_modern.json"],
["light-plus", "Light+", "light_plus.json"],
["light-modern", "Light Modern", "light_modern.json"],
["visual-studio-dark", "Visual Studio Dark", "dark_vs.json"],
["visual-studio-light", "Visual Studio Light", "light_vs.json"],
["high-contrast", "Default High Contrast", "hc_black.json"],
["high-contrast-light", "Default High Contrast Light", "hc_light.json"],
["solarized-light", "Solarized Light", "solarized-light-color-theme.json"],
["monokai", "Monokai", "monokai-color-theme.json"],
];
const workbenchKeys = [
"activityBar.activeBorder",
"activityBar.background",
"activityBar.border",
"activityBar.foreground",
"activityBar.inactiveForeground",
"editor.background",
"editor.foreground",
"editor.lineHighlightBackground",
"editor.selectionBackground",
"editorGroup.border",
"editorGroupHeader.tabsBackground",
"editorGroupHeader.tabsBorder",
"editorLineNumber.activeForeground",
"editorLineNumber.foreground",
"foreground",
"icon.foreground",
"panel.background",
"panel.border",
"sideBar.background",
"sideBar.border",
"sideBar.foreground",
"sideBarSectionHeader.background",
"sideBarSectionHeader.border",
"sideBarSectionHeader.foreground",
"sideBarTitle.foreground",
"statusBar.background",
"statusBar.border",
"statusBar.foreground",
"statusBarItem.remoteBackground",
"statusBarItem.remoteForeground",
"tab.activeBackground",
"tab.activeBorder",
"tab.activeBorderTop",
"tab.activeForeground",
"tab.border",
"tab.inactiveBackground",
"tab.inactiveForeground",
"terminal.background",
"terminal.foreground",
"terminalCursor.foreground",
"titleBar.activeBackground",
"titleBar.activeForeground",
];
const tokenScopes = {
comment: ["comment", "punctuation.definition.comment"],
keyword: ["keyword", "storage", "storage.type"],
function: ["entity.name.function", "support.function"],
string: ["string", "punctuation.definition.string"],
number: ["constant.numeric"],
variable: ["variable", "variable.other"],
parameter: ["variable.parameter", "meta.function.parameters"],
operator: ["keyword.operator"],
punctuation: ["punctuation", "meta.brace"],
className: ["entity.name.type", "support.class", "support.type"],
};
const fallbackColors = {
comment: "#6A9955",
keyword: "#C586C0",
function: "#DCDCAA",
string: "#CE9178",
number: "#B5CEA8",
variable: "#9CDCFE",
parameter: "#9CDCFE",
operator: "#D4D4D4",
punctuation: "#D4D4D4",
className: "#4EC9B0",
};
function stripJsonComments(source) {
let output = "";
let inString = false;
let escaped = false;
for (let i = 0; i < source.length; i += 1) {
const char = source[i];
const next = source[i + 1];
if (inString) {
output += char;
escaped = char === "\\" && !escaped;
if (char === '"' && !escaped) inString = false;
if (char !== "\\") escaped = false;
continue;
}
if (char === '"') {
inString = true;
output += char;
continue;
}
if (char === "/" && next === "/") {
while (i < source.length && source[i] !== "\n") i += 1;
output += "\n";
continue;
}
if (char === "/" && next === "*") {
i += 2;
while (i < source.length && !(source[i] === "*" && source[i + 1] === "/")) i += 1;
i += 1;
continue;
}
output += char;
}
return output;
}
function stripTrailingCommas(source) {
let output = "";
let inString = false;
let escaped = false;
for (let i = 0; i < source.length; i += 1) {
const char = source[i];
if (inString) {
output += char;
escaped = char === "\\" && !escaped;
if (char === '"' && !escaped) inString = false;
if (char !== "\\") escaped = false;
continue;
}
if (char === '"') {
inString = true;
output += char;
continue;
}
if (char === ",") {
let j = i + 1;
while (/\s/.test(source[j])) j += 1;
if (source[j] === "}" || source[j] === "]") continue;
}
output += char;
}
return output;
}
function readTheme(fileName, seen = new Set()) {
const filePath = path.join(themeDir, fileName);
if (seen.has(filePath)) throw new Error(`Circular theme include: ${fileName}`);
seen.add(filePath);
const raw = fs.readFileSync(filePath, "utf8");
const theme = JSON.parse(stripTrailingCommas(stripJsonComments(raw)));
let parent = { colors: {}, tokenColors: [], semanticTokenColors: {} };
if (theme.include) {
parent = readTheme(path.basename(theme.include), seen);
}
return {
name: theme.name || parent.name,
type: theme.type || parent.type,
colors: { ...parent.colors, ...(theme.colors || {}) },
tokenColors: [...(parent.tokenColors || []), ...(theme.tokenColors || [])],
semanticTokenColors: {
...(parent.semanticTokenColors || {}),
...(theme.semanticTokenColors || {}),
},
};
}
function scopeList(scope) {
if (!scope) return [];
if (Array.isArray(scope)) return scope;
return String(scope)
.split(",")
.map((item) => item.trim());
}
function scopeMatches(actual, wanted) {
return actual === wanted || actual.startsWith(`${wanted}.`) || wanted.startsWith(`${actual}.`);
}
function findTokenColor(theme, wantedScopes) {
for (let i = theme.tokenColors.length - 1; i >= 0; i -= 1) {
const tokenColor = theme.tokenColors[i];
const foreground = tokenColor.settings?.foreground;
if (!foreground) continue;
const scopes = scopeList(tokenColor.scope);
if (scopes.some((scope) => wantedScopes.some((wanted) => scopeMatches(scope, wanted)))) {
return foreground;
}
}
return null;
}
function pickColors(colors) {
const picked = {};
for (const key of workbenchKeys) {
if (colors[key]) picked[key] = colors[key];
}
return picked;
}
const registry = themeEntries.map(([id, label, file]) => {
const theme = readTheme(file);
const tokens = {};
for (const [tokenName, scopes] of Object.entries(tokenScopes)) {
tokens[tokenName] = findTokenColor(theme, scopes) || fallbackColors[tokenName];
}
return {
id,
label,
sourceFile: file,
uiTheme: file.includes("light") || file.includes("2026-light") ? "vs" : "vs-dark",
colors: pickColors(theme.colors),
tokens,
};
});
const generated = `// Generated by scripts/build-theme-registry.mjs from official VS Code theme JSON.\nwindow.VSCODE_THEME_REGISTRY = ${JSON.stringify(registry, null, 2)};\n`;
fs.writeFileSync(outFile, generated);
console.log(`Wrote ${path.relative(projectRoot, outFile)} with ${registry.length} themes`);
+271
View File
@@ -0,0 +1,271 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Warm Grain - Hyperframes</title>
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
<style>
body,
html {
margin: 0;
padding: 0;
width: 1920px;
height: 1080px;
overflow: hidden;
background-color: #f5f0e0; /* Cream background */
font-family: "Outfit", sans-serif;
}
#main-composition {
position: relative;
width: 1920px;
height: 1080px;
overflow: hidden;
}
/* Paper texture and Grain overlay */
#grain-overlay-comp {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 100;
}
/* Grain animation */
@keyframes grain-noise {
0%,
100% {
transform: translate(0, 0);
}
10% {
transform: translate(-5%, -5%);
}
20% {
transform: translate(-10%, 5%);
}
30% {
transform: translate(5%, -10%);
}
40% {
transform: translate(-5%, 15%);
}
50% {
transform: translate(-10%, 5%);
}
60% {
transform: translate(15%, 0);
}
70% {
transform: translate(0, 10%);
}
80% {
transform: translate(-15%, 0);
}
90% {
transform: translate(10%, 5%);
}
}
.grain-texture {
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: url("https://www.transparenttextures.com/patterns/natural-paper.png");
opacity: 0.15;
animation: grain-noise 0.5s steps(1) infinite;
}
#a-roll {
position: absolute;
border-radius: 16px;
object-fit: cover;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}
.comp-layer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
}
</style>
</head>
<body>
<div
id="main-composition"
data-composition-id="main-video"
data-width="1920"
data-height="1080"
data-start="0"
data-duration="__VIDEO_DURATION__"
>
<!-- Background Layer -->
<div
id="grain-overlay-comp"
data-composition-id="grain-overlay"
data-width="1920"
data-height="1080"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="100"
>
<div class="grain-texture"></div>
<script>
const grainTl = gsap.timeline({ paused: true });
window.__timelines = window.__timelines || {};
window.__timelines["grain-overlay"] = grainTl;
</script>
</div>
<!-- A-Roll Video (muted — audio is separate) -->
<video
id="a-roll"
src="__VIDEO_SRC__"
muted
playsinline
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="0"
></video>
<audio
id="a-roll-audio"
src="__VIDEO_SRC__"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="5"
data-volume="1"
></audio>
<!-- Compositions -->
<div
id="intro-layer"
class="comp-layer"
data-composition-id="intro"
data-composition-src="compositions/intro.html"
data-start="0"
data-duration="2.5"
data-track-index="1"
></div>
<div
id="graphics-layer"
class="comp-layer"
data-composition-id="graphics"
data-composition-src="compositions/graphics.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="2"
></div>
<div
id="captions-layer"
class="comp-layer"
data-composition-id="captions"
data-composition-src="compositions/captions.html"
data-start="0"
data-duration="__VIDEO_DURATION__"
data-track-index="3"
></div>
<script>
const tl = gsap.timeline({ paused: true });
// A-Roll Framing Strategy
// 1. 0s-1.8s: Intro scale up from small (60%) to medium (80%) - Shifted right slightly to clear speaker card
// 2. 1.8s-4.6s: Grid view / Shift Left (x: 600, scale: 70%) for 47% graphic
// 3. 4.6s-8.8s: Shift Center-Bottom (y: 800, scale: 70%) for 62% graphic (top)
// 4. 8.8s-14s: Shift Right (x: 1320, scale: 75%) for Editing Skills graphic (left)
// 5. 14s-17s: Final Reveal (Center, scale: 100%)
// Initial state
gsap.set("#a-roll", {
x: 1100,
y: 540,
xPercent: -50,
yPercent: -50,
width: 1920 * 0.6,
height: 1080 * 0.6,
});
// 1. Intro Scale Up (0s - 1.8s)
tl.to(
"#a-roll",
{
x: 1200,
width: 1920 * 0.8,
height: 1080 * 0.8,
duration: 1.8,
ease: "power2.inOut",
},
0,
);
// 2. Moment 1: 47% Graphic Trigger (1.8s) - Shift Left
tl.to(
"#a-roll",
{
x: 600,
y: 540,
width: 1920 * 0.7,
height: 1080 * 0.7,
duration: 0.5,
ease: "power2.inOut",
},
1.8,
);
// 3. Moment 2: 62% Graphic Trigger (4.6s) - Shift Center-Bottom
tl.to(
"#a-roll",
{
x: 960,
y: 750,
width: 1920 * 0.7,
height: 1080 * 0.7,
duration: 0.5,
ease: "power2.inOut",
},
4.6,
);
// 4. Moment 3: Editing Skills Trigger (8.8s) - Shift Right
tl.to(
"#a-roll",
{
x: 1320,
y: 540,
width: 1920 * 0.75,
height: 1080 * 0.75,
duration: 0.5,
ease: "power2.inOut",
},
8.8,
);
// 5. Final Reveal (14s - 17s)
tl.to(
"#a-roll",
{
x: 960,
y: 540,
width: 1920 * 1.0,
height: 1080 * 1.0,
duration: 1.0,
ease: "power2.inOut",
},
14,
);
window.__timelines["main-video"] = tl;
</script>
</div>
</body>
</html>
@@ -0,0 +1,34 @@
{
"$schema": "https://hyperframes.heygen.com/schema/registry-item.json",
"name": "warm-grain",
"type": "hyperframes:example",
"title": "Warm Grain",
"description": "Cream aesthetic with grain texture",
"dimensions": {
"width": 1920,
"height": 1080
},
"duration": 10,
"files": [
{
"path": "compositions/captions.html",
"target": "compositions/captions.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/graphics.html",
"target": "compositions/graphics.html",
"type": "hyperframes:composition"
},
{
"path": "compositions/intro.html",
"target": "compositions/intro.html",
"type": "hyperframes:composition"
},
{
"path": "index.html",
"target": "index.html",
"type": "hyperframes:composition"
}
]
}