Skip to content

Commit 6fd9c83

Browse files
committed
Refresh movement pages and mannequin startup
1 parent 3c9edf7 commit 6fd9c83

79 files changed

Lines changed: 3146 additions & 2816 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/posecode-render/src/index.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ export interface ViewerOptions {
8383
* skeleton, rebuilt to the character's exact proportions (see character.ts).
8484
*/
8585
characterUrl?: string;
86+
/**
87+
* Show the procedural figure while `characterUrl` loads. Defaults to true
88+
* for embeds and offline-friendly consumers. Set false when a brief empty
89+
* stage is preferable to flashing the procedural figure before the skinned
90+
* character appears. The procedural figure is still revealed if loading
91+
* fails, so the viewer never remains permanently blank.
92+
*/
93+
showProceduralWhileLoading?: boolean;
8694
/**
8795
* Mocap clip library: clip name (as written in a document's `clip "<name>"`
8896
* directive) → FBX/GLB asset URL. When a loaded document names a clip found
@@ -174,6 +182,9 @@ export function createViewer(
174182

175183
let mannequin: Mannequin = buildMannequin();
176184
enableShadows(mannequin.root);
185+
if (opts.characterUrl && opts.showProceduralWhileLoading === false) {
186+
setMannequinMeshesVisible(mannequin.root, false);
187+
}
177188
scene.add(mannequin.root);
178189

179190
// Skinned character layer (optional). While loading (and on failure) the
@@ -768,8 +779,9 @@ export function createViewer(
768779
else char.sync(mannequin);
769780
})
770781
.catch(() => {
771-
// Keep the procedural figure. Deliberately silent: an offline embed
772-
// or a blocked CDN should degrade, not error.
782+
// Reveal the fallback if it was hidden during loading. Deliberately
783+
// silent: an offline embed or blocked CDN should degrade, not error.
784+
setMannequinMeshesVisible(mannequin.root, true);
773785
});
774786
}
775787

@@ -785,6 +797,12 @@ function enableShadows(root: THREE.Object3D): void {
785797
});
786798
}
787799

800+
function setMannequinMeshesVisible(root: THREE.Object3D, visible: boolean): void {
801+
root.traverse((obj) => {
802+
if ((obj as THREE.Mesh).isMesh) obj.visible = visible;
803+
});
804+
}
805+
788806
/** Free GPU resources for a discarded subtree (prop set swapped on reload). */
789807
function disposeTree(root: THREE.Object3D): void {
790808
root.traverse((obj) => {

playground/public/llm-guide.html

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -26,41 +26,43 @@
2626
rel="stylesheet"
2727
/>
2828
<style>
29-
:root{--bg:#0a0d12;--panel:#0f141b;--panel-2:#141a23;--border:#1e2530;--border-2:#2a323f;
30-
--text:#e9eef4;--text-2:#9aa6b4;--muted:#616d7c;--accent:#c6f24a;--accent-2:#a9e02f;
31-
--accent-ink:#0a0d12;--accent-glow:rgba(198,242,74,.45);--accent-wash:rgba(198,242,74,.1);
32-
--accent-line:rgba(198,242,74,.35);--mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,monospace;
33-
--sans:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;--radius:10px;}
29+
:root{--bg:#0b0c0d;--panel:#111315;--panel-2:#171a1d;--border:#292d30;--border-2:#3a3f43;
30+
--text:#f2f1eb;--text-2:#aaa9a2;--muted:#74746f;--accent:#d4ff3f;
31+
--accent-ink:#0b0c0d;--accent-line:rgba(212,255,63,.42);
32+
--mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,monospace;
33+
--sans:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;--radius:3px;}
3434
*{box-sizing:border-box}
3535
html,body{margin:0}
3636
body{background:var(--bg);color:var(--text);font-family:var(--sans);line-height:1.6;
3737
-webkit-font-smoothing:antialiased;}
3838
a{color:var(--accent);text-decoration:none}
3939
a:hover{text-decoration:underline}
40-
.wrap{max-width:840px;margin:0 auto;padding:0 24px}
41-
header.site-nav{border-bottom:1px solid var(--border);padding:16px 0;margin-bottom:8px}
40+
.wrap{max-width:1180px;margin:0 auto;padding:0 28px}
41+
header.site-nav{position:sticky;top:0;z-index:10;border-bottom:1px solid var(--border);padding:18px 0;
42+
background:rgba(11,12,13,.94);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
4243
header.site-nav .wrap{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px}
4344
.brand{display:flex;align-items:center;gap:9px;color:var(--text);font-weight:800;font-size:18px}
4445
.brand .logo{color:var(--accent)}
45-
nav.links{display:flex;gap:18px;font-size:13.5px;font-weight:600;flex-wrap:wrap}
46+
nav.links{display:flex;gap:24px;font-size:13.5px;font-weight:600;flex-wrap:wrap}
4647
nav.links a{color:var(--text-2)}
4748
nav.links a:hover{color:var(--text)}
48-
main{padding:36px 0 64px}
49+
main{padding-top:clamp(54px,8vw,96px);padding-bottom:80px}
4950
.eyebrow{font-family:var(--mono);font-size:12px;font-weight:600;letter-spacing:2px;
50-
text-transform:uppercase;color:var(--accent);margin:0 0 12px}
51-
h1{font-size:clamp(28px,4.5vw,42px);font-weight:900;letter-spacing:-1px;line-height:1.1;margin:0 0 14px}
52-
h2{font-size:22px;font-weight:800;letter-spacing:-.3px;margin:36px 0 12px}
51+
text-transform:uppercase;color:var(--text-2);margin:0 0 16px}
52+
h1{max-width:13ch;font-size:clamp(46px,7vw,82px);font-weight:900;letter-spacing:-.055em;
53+
line-height:.94;margin:0 0 24px;text-wrap:balance}
54+
h2{font-size:clamp(24px,3vw,34px);font-weight:800;letter-spacing:-.035em;margin:58px 0 18px}
5355
h3{font-size:17px;font-weight:700;margin:24px 0 8px}
5456
h4{font-size:14px;font-weight:700;margin:18px 0 6px}
55-
p{color:var(--text-2);margin:0 0 14px}
57+
p{max-width:760px;color:var(--text-2);font-size:16px;margin:0 0 18px}
5658
.meta-line{font-family:var(--mono);font-size:12.5px;color:var(--muted);margin:0 0 22px;
5759
letter-spacing:.2px}
5860
.meta-line b{color:var(--text-2);font-weight:600}
5961
code{font-family:var(--mono);font-size:.92em;background:var(--panel-2);border:1px solid var(--border);
60-
padding:1px 6px;border-radius:5px;color:var(--text)}
62+
padding:1px 6px;border-radius:2px;color:var(--text)}
6163
pre.code-block{font-family:var(--mono);font-size:12.5px;line-height:1.55;color:var(--text-2);
62-
background:var(--panel);border:1px solid var(--border-2);border-radius:var(--radius);
63-
padding:16px 18px;overflow:auto;margin:0 0 18px}
64+
background:#0e1011;border:1px solid var(--border-2);border-radius:2px;
65+
padding:20px 22px;overflow:auto;margin:0 0 18px}
6466
pre.code-block code{background:none;border:none;padding:0;color:inherit}
6567
.table-wrap{overflow-x:auto;margin:0 0 18px}
6668
table{border-collapse:collapse;width:100%;font-size:13.5px}
@@ -70,33 +72,35 @@
7072
ul,ol{color:var(--text-2);padding-left:22px;margin:0 0 16px}
7173
li{margin-bottom:6px}
7274
hr{border:none;border-top:1px solid var(--border);margin:28px 0}
73-
.card{border:1px solid var(--border);border-radius:var(--radius);
74-
background:linear-gradient(180deg,var(--panel),transparent);padding:20px 22px;margin:0 0 16px}
75+
.card{border:1px solid var(--border);border-radius:0;background:transparent;padding:20px 22px;margin:0 0 16px}
7576
.btn{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:14px;
76-
color:var(--accent-ink);background:linear-gradient(180deg,var(--accent),var(--accent-2));
77-
border-radius:8px;padding:11px 18px;text-decoration:none}
78-
.btn:hover{filter:brightness(1.06);text-decoration:none}
79-
.steps{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:12px}
80-
.steps li{border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;
81-
background:var(--panel)}
77+
color:var(--accent-ink);background:var(--accent);border-radius:3px;padding:12px 19px;text-decoration:none}
78+
.btn:hover{filter:none;transform:translateY(-1px);text-decoration:none}
79+
.steps{list-style:none;padding:0;margin:0 0 22px;border-top:1px solid var(--border)}
80+
.steps li{border-bottom:1px solid var(--border);padding:20px 0;background:transparent}
8281
.steps .step-name{font-weight:700;color:var(--text);display:block;margin-bottom:4px}
8382
.steps .step-cue{color:var(--text-2);font-size:13.5px}
8483
.steps .step-dur{font-family:var(--mono);font-size:11px;color:var(--muted);margin-left:8px}
85-
.chip-list{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 8px}
86-
.chip-list a{font-size:12.5px;font-weight:600;color:var(--text-2);background:var(--panel-2);
87-
border:1px solid var(--border-2);border-radius:999px;padding:5px 12px}
88-
.chip-list a:hover{color:var(--text);text-decoration:none;border-color:var(--accent-line)}
89-
.domain-group{margin-bottom:26px}
84+
.chip-list{display:flex;flex-wrap:wrap;gap:0;margin:0 0 8px;border-top:1px solid var(--border);border-left:1px solid var(--border)}
85+
.chip-list a{font-size:12.5px;font-weight:600;color:var(--text-2);background:transparent;
86+
border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:8px 13px}
87+
.chip-list a:hover{color:var(--bg);background:var(--text);text-decoration:none}
88+
.domain-group{margin:64px 0 0}
9089
.domain-group h2{margin-top:0}
91-
.move-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
92-
.move-card{display:block;border:1px solid var(--border);border-radius:var(--radius);
93-
padding:13px 15px;background:var(--panel)}
94-
.move-card:hover{border-color:var(--accent-line);text-decoration:none}
95-
.move-card .mc-name{display:block;font-weight:700;color:var(--text);font-size:13.5px}
96-
.move-card .mc-meta{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
97-
footer.site-footer{border-top:1px solid var(--border);padding:26px 0 40px;margin-top:20px}
90+
.move-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;border-top:1px solid var(--border);border-left:1px solid var(--border)}
91+
.move-card{display:flex;min-height:126px;flex-direction:column;justify-content:space-between;
92+
border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:19px 20px;background:transparent}
93+
.move-card:hover{background:var(--text);text-decoration:none}
94+
.move-card .mc-name{display:block;font-weight:700;color:var(--text);font-size:16px;letter-spacing:-.2px}
95+
.move-card .mc-meta{display:block;font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-top:16px}
96+
.move-card:hover .mc-name{color:var(--bg)}
97+
.move-card:hover .mc-meta{color:#555853}
98+
footer.site-footer{border-top:1px solid var(--border);padding:34px 0 48px;margin-top:20px}
9899
footer.site-footer p{font-size:12.5px;color:var(--muted);margin:0 0 6px;max-width:70ch}
99-
@media(max-width:600px){.wrap{padding:0 18px}}
100+
@media(max-width:820px){nav.links a:nth-child(n+4){display:none}.move-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
101+
@media(max-width:600px){.wrap{padding-left:18px;padding-right:18px}header.site-nav{padding:14px 0}
102+
nav.links{gap:14px}nav.links a:nth-child(n+3){display:none}main{padding-top:48px}h1{font-size:clamp(44px,14vw,62px)}
103+
.move-grid{grid-template-columns:1fr}.move-card{min-height:104px}.domain-group{margin-top:48px}}
100104
</style>
101105

102106
<script>

playground/public/moves/arm-circles.html

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -26,41 +26,43 @@
2626
rel="stylesheet"
2727
/>
2828
<style>
29-
:root{--bg:#0a0d12;--panel:#0f141b;--panel-2:#141a23;--border:#1e2530;--border-2:#2a323f;
30-
--text:#e9eef4;--text-2:#9aa6b4;--muted:#616d7c;--accent:#c6f24a;--accent-2:#a9e02f;
31-
--accent-ink:#0a0d12;--accent-glow:rgba(198,242,74,.45);--accent-wash:rgba(198,242,74,.1);
32-
--accent-line:rgba(198,242,74,.35);--mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,monospace;
33-
--sans:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;--radius:10px;}
29+
:root{--bg:#0b0c0d;--panel:#111315;--panel-2:#171a1d;--border:#292d30;--border-2:#3a3f43;
30+
--text:#f2f1eb;--text-2:#aaa9a2;--muted:#74746f;--accent:#d4ff3f;
31+
--accent-ink:#0b0c0d;--accent-line:rgba(212,255,63,.42);
32+
--mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,monospace;
33+
--sans:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;--radius:3px;}
3434
*{box-sizing:border-box}
3535
html,body{margin:0}
3636
body{background:var(--bg);color:var(--text);font-family:var(--sans);line-height:1.6;
3737
-webkit-font-smoothing:antialiased;}
3838
a{color:var(--accent);text-decoration:none}
3939
a:hover{text-decoration:underline}
40-
.wrap{max-width:840px;margin:0 auto;padding:0 24px}
41-
header.site-nav{border-bottom:1px solid var(--border);padding:16px 0;margin-bottom:8px}
40+
.wrap{max-width:1180px;margin:0 auto;padding:0 28px}
41+
header.site-nav{position:sticky;top:0;z-index:10;border-bottom:1px solid var(--border);padding:18px 0;
42+
background:rgba(11,12,13,.94);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px)}
4243
header.site-nav .wrap{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px}
4344
.brand{display:flex;align-items:center;gap:9px;color:var(--text);font-weight:800;font-size:18px}
4445
.brand .logo{color:var(--accent)}
45-
nav.links{display:flex;gap:18px;font-size:13.5px;font-weight:600;flex-wrap:wrap}
46+
nav.links{display:flex;gap:24px;font-size:13.5px;font-weight:600;flex-wrap:wrap}
4647
nav.links a{color:var(--text-2)}
4748
nav.links a:hover{color:var(--text)}
48-
main{padding:36px 0 64px}
49+
main{padding-top:clamp(54px,8vw,96px);padding-bottom:80px}
4950
.eyebrow{font-family:var(--mono);font-size:12px;font-weight:600;letter-spacing:2px;
50-
text-transform:uppercase;color:var(--accent);margin:0 0 12px}
51-
h1{font-size:clamp(28px,4.5vw,42px);font-weight:900;letter-spacing:-1px;line-height:1.1;margin:0 0 14px}
52-
h2{font-size:22px;font-weight:800;letter-spacing:-.3px;margin:36px 0 12px}
51+
text-transform:uppercase;color:var(--text-2);margin:0 0 16px}
52+
h1{max-width:13ch;font-size:clamp(46px,7vw,82px);font-weight:900;letter-spacing:-.055em;
53+
line-height:.94;margin:0 0 24px;text-wrap:balance}
54+
h2{font-size:clamp(24px,3vw,34px);font-weight:800;letter-spacing:-.035em;margin:58px 0 18px}
5355
h3{font-size:17px;font-weight:700;margin:24px 0 8px}
5456
h4{font-size:14px;font-weight:700;margin:18px 0 6px}
55-
p{color:var(--text-2);margin:0 0 14px}
57+
p{max-width:760px;color:var(--text-2);font-size:16px;margin:0 0 18px}
5658
.meta-line{font-family:var(--mono);font-size:12.5px;color:var(--muted);margin:0 0 22px;
5759
letter-spacing:.2px}
5860
.meta-line b{color:var(--text-2);font-weight:600}
5961
code{font-family:var(--mono);font-size:.92em;background:var(--panel-2);border:1px solid var(--border);
60-
padding:1px 6px;border-radius:5px;color:var(--text)}
62+
padding:1px 6px;border-radius:2px;color:var(--text)}
6163
pre.code-block{font-family:var(--mono);font-size:12.5px;line-height:1.55;color:var(--text-2);
62-
background:var(--panel);border:1px solid var(--border-2);border-radius:var(--radius);
63-
padding:16px 18px;overflow:auto;margin:0 0 18px}
64+
background:#0e1011;border:1px solid var(--border-2);border-radius:2px;
65+
padding:20px 22px;overflow:auto;margin:0 0 18px}
6466
pre.code-block code{background:none;border:none;padding:0;color:inherit}
6567
.table-wrap{overflow-x:auto;margin:0 0 18px}
6668
table{border-collapse:collapse;width:100%;font-size:13.5px}
@@ -70,33 +72,35 @@
7072
ul,ol{color:var(--text-2);padding-left:22px;margin:0 0 16px}
7173
li{margin-bottom:6px}
7274
hr{border:none;border-top:1px solid var(--border);margin:28px 0}
73-
.card{border:1px solid var(--border);border-radius:var(--radius);
74-
background:linear-gradient(180deg,var(--panel),transparent);padding:20px 22px;margin:0 0 16px}
75+
.card{border:1px solid var(--border);border-radius:0;background:transparent;padding:20px 22px;margin:0 0 16px}
7576
.btn{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:14px;
76-
color:var(--accent-ink);background:linear-gradient(180deg,var(--accent),var(--accent-2));
77-
border-radius:8px;padding:11px 18px;text-decoration:none}
78-
.btn:hover{filter:brightness(1.06);text-decoration:none}
79-
.steps{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:12px}
80-
.steps li{border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;
81-
background:var(--panel)}
77+
color:var(--accent-ink);background:var(--accent);border-radius:3px;padding:12px 19px;text-decoration:none}
78+
.btn:hover{filter:none;transform:translateY(-1px);text-decoration:none}
79+
.steps{list-style:none;padding:0;margin:0 0 22px;border-top:1px solid var(--border)}
80+
.steps li{border-bottom:1px solid var(--border);padding:20px 0;background:transparent}
8281
.steps .step-name{font-weight:700;color:var(--text);display:block;margin-bottom:4px}
8382
.steps .step-cue{color:var(--text-2);font-size:13.5px}
8483
.steps .step-dur{font-family:var(--mono);font-size:11px;color:var(--muted);margin-left:8px}
85-
.chip-list{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 8px}
86-
.chip-list a{font-size:12.5px;font-weight:600;color:var(--text-2);background:var(--panel-2);
87-
border:1px solid var(--border-2);border-radius:999px;padding:5px 12px}
88-
.chip-list a:hover{color:var(--text);text-decoration:none;border-color:var(--accent-line)}
89-
.domain-group{margin-bottom:26px}
84+
.chip-list{display:flex;flex-wrap:wrap;gap:0;margin:0 0 8px;border-top:1px solid var(--border);border-left:1px solid var(--border)}
85+
.chip-list a{font-size:12.5px;font-weight:600;color:var(--text-2);background:transparent;
86+
border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:8px 13px}
87+
.chip-list a:hover{color:var(--bg);background:var(--text);text-decoration:none}
88+
.domain-group{margin:64px 0 0}
9089
.domain-group h2{margin-top:0}
91-
.move-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
92-
.move-card{display:block;border:1px solid var(--border);border-radius:var(--radius);
93-
padding:13px 15px;background:var(--panel)}
94-
.move-card:hover{border-color:var(--accent-line);text-decoration:none}
95-
.move-card .mc-name{display:block;font-weight:700;color:var(--text);font-size:13.5px}
96-
.move-card .mc-meta{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
97-
footer.site-footer{border-top:1px solid var(--border);padding:26px 0 40px;margin-top:20px}
90+
.move-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;border-top:1px solid var(--border);border-left:1px solid var(--border)}
91+
.move-card{display:flex;min-height:126px;flex-direction:column;justify-content:space-between;
92+
border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:19px 20px;background:transparent}
93+
.move-card:hover{background:var(--text);text-decoration:none}
94+
.move-card .mc-name{display:block;font-weight:700;color:var(--text);font-size:16px;letter-spacing:-.2px}
95+
.move-card .mc-meta{display:block;font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-top:16px}
96+
.move-card:hover .mc-name{color:var(--bg)}
97+
.move-card:hover .mc-meta{color:#555853}
98+
footer.site-footer{border-top:1px solid var(--border);padding:34px 0 48px;margin-top:20px}
9899
footer.site-footer p{font-size:12.5px;color:var(--muted);margin:0 0 6px;max-width:70ch}
99-
@media(max-width:600px){.wrap{padding:0 18px}}
100+
@media(max-width:820px){nav.links a:nth-child(n+4){display:none}.move-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
101+
@media(max-width:600px){.wrap{padding-left:18px;padding-right:18px}header.site-nav{padding:14px 0}
102+
nav.links{gap:14px}nav.links a:nth-child(n+3){display:none}main{padding-top:48px}h1{font-size:clamp(44px,14vw,62px)}
103+
.move-grid{grid-template-columns:1fr}.move-card{min-height:104px}.domain-group{margin-top:48px}}
100104
</style>
101105
<script type="application/ld+json">{"@context":"https://schema.org","@type":"HowTo","name":"How to do a Arm circles","description":"How to do the arm circles (warm-up): 3 phases targeting the deltoids, body weight, beginner level. Animated 3D guide generated from Posecode, a text-to-motion language for LLMs.","step":[{"@type":"HowToStep","name":"Up & forward","text":"Sweep the arms up and forward"},{"@type":"HowToStep","name":"Out to sides","text":"Open the arms out wide to the sides"},{"@type":"HowToStep","name":"Down & round","text":"Lower and continue the circle back to the start"}]}</script>
102106
<script>

0 commit comments

Comments
 (0)