Skip to content

Commit 4daf396

Browse files
committed
movements: add desk & office posture reset presets (#21)
Adds three new desk/office wellness movements to the library: - seated-torso-twist: gentle seated rotation for the mid-back and obliques - shoulder-blade-retraction: scapular retraction / rowing squeeze - wrist-forearm-rolls: standing wrist circles with forearm pronation/supination Each stays within the parser ROM bounds (0 clamp warnings) and passes the biomechanical invariant eval. Registered in the playground preset library and static movement pages regenerated. Signed-off-by: Claude <noreply@anthropic.com>
1 parent 75be13e commit 4daf396

13 files changed

Lines changed: 750 additions & 9 deletions

playground/public/moves/chest-opener.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ <h2>The .posecode source</h2>
172172
</code></pre>
173173

174174
<h2>More desk &amp; posture movements</h2>
175-
<div class="chip-list"><a href="/moves/posture.html">Desk posture reset</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/neck-side-stretch.html">Neck side stretch</a></div>
175+
<div class="chip-list"><a href="/moves/posture.html">Desk posture reset</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/neck-side-stretch.html">Neck side stretch</a><a href="/moves/seated-torso-twist.html">Seated torso twist</a><a href="/moves/shoulder-blade-retraction.html">Shoulder blade retractions</a><a href="/moves/wrist-forearm-rolls.html">Wrist &amp; forearm rolls</a></div>
176176
</main>
177177
<footer class="site-footer">
178178
<div class="wrap">

playground/public/moves/index.html

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
<head>
44
<meta charset="UTF-8" />
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6-
<title>47 Launch-Ready Posecode Movement Examples | Posecode</title>
6+
<title>50 Launch-Ready Posecode Movement Examples | Posecode</title>
77
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" />
88
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
9-
<meta name="description" content="Browse 47 launch-ready Posecode movement examples across fitness, physiotherapy, yoga, dance, and martial arts, each with inspectable source and a link to live 3D playback." />
9+
<meta name="description" content="Browse 50 launch-ready Posecode movement examples across fitness, physiotherapy, yoga, dance, and martial arts, each with inspectable source and a link to live 3D playback." />
1010
<link rel="canonical" href="https://www.posecode.org/moves/" />
1111
<meta name="theme-color" content="#0a0d12" />
12-
<meta property="og:title" content="47 Launch-Ready Posecode Movement Examples | Posecode" />
13-
<meta property="og:description" content="Browse 47 launch-ready Posecode movement examples across fitness, physiotherapy, yoga, dance, and martial arts, each with inspectable source and a link to live 3D playback." />
12+
<meta property="og:title" content="50 Launch-Ready Posecode Movement Examples | Posecode" />
13+
<meta property="og:description" content="Browse 50 launch-ready Posecode movement examples across fitness, physiotherapy, yoga, dance, and martial arts, each with inspectable source and a link to live 3D playback." />
1414
<meta property="og:type" content="website" />
1515
<meta property="og:url" content="https://www.posecode.org/moves/" />
1616
<meta property="og:site_name" content="Posecode" />
@@ -120,7 +120,7 @@
120120
<main class="wrap">
121121

122122
<p class="eyebrow">Movement library</p>
123-
<h1>47 launch-ready movements, written as text</h1>
123+
<h1>50 launch-ready movements, written as text</h1>
124124
<p>Launch-ready examples grouped by practice. Each page shows the phases, cues, and exact
125125
<code>.posecode</code> source, with a link that opens live 3D playback. Experimental
126126
previews are deliberately excluded from these static pages; opt into them from the
@@ -291,6 +291,18 @@ <h2>Desk &amp; posture</h2>
291291
<span class="mc-name">Neck side stretch</span>
292292
<span class="mc-meta">Neck · Body weight · Beginner</span>
293293
</a>
294+
<a class="move-card" href="/moves/seated-torso-twist.html">
295+
<span class="mc-name">Seated torso twist</span>
296+
<span class="mc-meta">Obliques · Chair · Beginner</span>
297+
</a>
298+
<a class="move-card" href="/moves/shoulder-blade-retraction.html">
299+
<span class="mc-name">Shoulder blade retractions</span>
300+
<span class="mc-meta">Rhomboids · Body weight · Beginner</span>
301+
</a>
302+
<a class="move-card" href="/moves/wrist-forearm-rolls.html">
303+
<span class="mc-name">Wrist &amp; forearm rolls</span>
304+
<span class="mc-meta">Forearm flexors · Body weight · Beginner</span>
305+
</a>
294306
</div>
295307
</div>
296308

playground/public/moves/neck-side-stretch.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ <h2>The .posecode source</h2>
177177
</code></pre>
178178

179179
<h2>More desk &amp; posture movements</h2>
180-
<div class="chip-list"><a href="/moves/chest-opener.html">Chest opener</a><a href="/moves/posture.html">Desk posture reset</a><a href="/moves/twist.html">Standing spinal twist</a></div>
180+
<div class="chip-list"><a href="/moves/chest-opener.html">Chest opener</a><a href="/moves/posture.html">Desk posture reset</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/seated-torso-twist.html">Seated torso twist</a><a href="/moves/shoulder-blade-retraction.html">Shoulder blade retractions</a><a href="/moves/wrist-forearm-rolls.html">Wrist &amp; forearm rolls</a></div>
181181
</main>
182182
<footer class="site-footer">
183183
<div class="wrap">

playground/public/moves/posture.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ <h2>The .posecode source</h2>
174174
</code></pre>
175175

176176
<h2>More desk &amp; posture movements</h2>
177-
<div class="chip-list"><a href="/moves/chest-opener.html">Chest opener</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/neck-side-stretch.html">Neck side stretch</a></div>
177+
<div class="chip-list"><a href="/moves/chest-opener.html">Chest opener</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/neck-side-stretch.html">Neck side stretch</a><a href="/moves/seated-torso-twist.html">Seated torso twist</a><a href="/moves/shoulder-blade-retraction.html">Shoulder blade retractions</a><a href="/moves/wrist-forearm-rolls.html">Wrist &amp; forearm rolls</a></div>
178178
</main>
179179
<footer class="site-footer">
180180
<div class="wrap">
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>Seated torso twist: Posecode Movement Example | Posecode</title>
7+
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" />
8+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
9+
<meta name="description" content="Seated torso twist is a beginner-level desk &amp; posture Posecode example with 3 inspectable phases and a link to live 3D playback." />
10+
<link rel="canonical" href="https://www.posecode.org/moves/seated-torso-twist.html" />
11+
<meta name="theme-color" content="#0a0d12" />
12+
<meta property="og:title" content="Seated torso twist: Posecode Movement Example | Posecode" />
13+
<meta property="og:description" content="Seated torso twist is a beginner-level desk &amp; posture Posecode example with 3 inspectable phases and a link to live 3D playback." />
14+
<meta property="og:type" content="website" />
15+
<meta property="og:url" content="https://www.posecode.org/moves/seated-torso-twist.html" />
16+
<meta property="og:site_name" content="Posecode" />
17+
<meta property="og:image" content="https://www.posecode.org/og.png" />
18+
<meta name="twitter:image" content="https://www.posecode.org/og.png" />
19+
<meta name="twitter:card" content="summary_large_image" />
20+
<link rel="preconnect" href="https://fonts.googleapis.com" />
21+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
22+
<link
23+
href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap"
24+
rel="stylesheet"
25+
/>
26+
<style>
27+
:root{--bg:#0a0d12;--panel:#0f141b;--panel-2:#141a23;--border:#1e2530;--border-2:#2a323f;
28+
--text:#e9eef4;--text-2:#9aa6b4;--muted:#616d7c;--accent:#c6f24a;--accent-2:#a9e02f;
29+
--accent-ink:#0a0d12;--accent-glow:rgba(198,242,74,.45);--accent-wash:rgba(198,242,74,.1);
30+
--accent-line:rgba(198,242,74,.35);--mono:"JetBrains Mono",ui-monospace,"SF Mono",Menlo,monospace;
31+
--sans:"Hanken Grotesk",system-ui,-apple-system,"Segoe UI",sans-serif;--radius:10px;}
32+
*{box-sizing:border-box}
33+
html,body{margin:0}
34+
body{background:var(--bg);color:var(--text);font-family:var(--sans);line-height:1.6;
35+
-webkit-font-smoothing:antialiased;}
36+
a{color:var(--accent);text-decoration:none}
37+
a:hover{text-decoration:underline}
38+
.wrap{max-width:840px;margin:0 auto;padding:0 24px}
39+
header.site-nav{border-bottom:1px solid var(--border);padding:16px 0;margin-bottom:8px}
40+
header.site-nav .wrap{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px}
41+
.brand{display:flex;align-items:center;gap:9px;color:var(--text);font-weight:800;font-size:18px}
42+
.brand .logo{color:var(--accent)}
43+
nav.links{display:flex;gap:18px;font-size:13.5px;font-weight:600;flex-wrap:wrap}
44+
nav.links a{color:var(--text-2)}
45+
nav.links a:hover{color:var(--text)}
46+
main{padding:36px 0 64px}
47+
.eyebrow{font-family:var(--mono);font-size:12px;font-weight:600;letter-spacing:2px;
48+
text-transform:uppercase;color:var(--accent);margin:0 0 12px}
49+
h1{font-size:clamp(28px,4.5vw,42px);font-weight:900;letter-spacing:-1px;line-height:1.1;margin:0 0 14px}
50+
h2{font-size:22px;font-weight:800;letter-spacing:-.3px;margin:36px 0 12px}
51+
h3{font-size:17px;font-weight:700;margin:24px 0 8px}
52+
h4{font-size:14px;font-weight:700;margin:18px 0 6px}
53+
p{color:var(--text-2);margin:0 0 14px}
54+
.meta-line{font-family:var(--mono);font-size:12.5px;color:var(--muted);margin:0 0 22px;
55+
letter-spacing:.2px}
56+
.meta-line b{color:var(--text-2);font-weight:600}
57+
code{font-family:var(--mono);font-size:.92em;background:var(--panel-2);border:1px solid var(--border);
58+
padding:1px 6px;border-radius:5px;color:var(--text)}
59+
pre.code-block{font-family:var(--mono);font-size:12.5px;line-height:1.55;color:var(--text-2);
60+
background:var(--panel);border:1px solid var(--border-2);border-radius:var(--radius);
61+
padding:16px 18px;overflow:auto;margin:0 0 18px}
62+
pre.code-block code{background:none;border:none;padding:0;color:inherit}
63+
.table-wrap{overflow-x:auto;margin:0 0 18px}
64+
table{border-collapse:collapse;width:100%;font-size:13.5px}
65+
th,td{text-align:left;padding:8px 12px;border-bottom:1px solid var(--border)}
66+
th{color:var(--text);font-weight:700;background:var(--panel-2)}
67+
td{color:var(--text-2)}
68+
ul,ol{color:var(--text-2);padding-left:22px;margin:0 0 16px}
69+
li{margin-bottom:6px}
70+
hr{border:none;border-top:1px solid var(--border);margin:28px 0}
71+
.card{border:1px solid var(--border);border-radius:var(--radius);
72+
background:linear-gradient(180deg,var(--panel),transparent);padding:20px 22px;margin:0 0 16px}
73+
.btn{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:14px;
74+
color:var(--accent-ink);background:linear-gradient(180deg,var(--accent),var(--accent-2));
75+
border-radius:8px;padding:11px 18px;text-decoration:none}
76+
.btn:hover{filter:brightness(1.06);text-decoration:none}
77+
.steps{list-style:none;padding:0;margin:0 0 22px;display:flex;flex-direction:column;gap:12px}
78+
.steps li{border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;
79+
background:var(--panel)}
80+
.steps .step-name{font-weight:700;color:var(--text);display:block;margin-bottom:4px}
81+
.steps .step-cue{color:var(--text-2);font-size:13.5px}
82+
.steps .step-dur{font-family:var(--mono);font-size:11px;color:var(--muted);margin-left:8px}
83+
.chip-list{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 8px}
84+
.chip-list a{font-size:12.5px;font-weight:600;color:var(--text-2);background:var(--panel-2);
85+
border:1px solid var(--border-2);border-radius:999px;padding:5px 12px}
86+
.chip-list a:hover{color:var(--text);text-decoration:none;border-color:var(--accent-line)}
87+
.domain-group{margin-bottom:26px}
88+
.domain-group h2{margin-top:0}
89+
.move-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
90+
.move-card{display:block;border:1px solid var(--border);border-radius:var(--radius);
91+
padding:13px 15px;background:var(--panel)}
92+
.move-card:hover{border-color:var(--accent-line);text-decoration:none}
93+
.move-card .mc-name{display:block;font-weight:700;color:var(--text);font-size:13.5px}
94+
.move-card .mc-meta{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
95+
footer.site-footer{border-top:1px solid var(--border);padding:26px 0 40px;margin-top:20px}
96+
footer.site-footer p{font-size:12.5px;color:var(--muted);margin:0 0 6px;max-width:70ch}
97+
@media(max-width:600px){.wrap{padding:0 18px}}
98+
</style>
99+
<link rel="stylesheet" href="/content-theme.css" />
100+
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Seated torso twist: a Posecode movement example","description":"Seated torso twist is a beginner-level desk & posture Posecode example with 3 inspectable phases and a link to live 3D playback."}</script>
101+
<script>
102+
window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
103+
</script>
104+
<script defer src="/_vercel/insights/script.js"></script>
105+
</head>
106+
<body>
107+
<header class="site-nav">
108+
<div class="wrap">
109+
<a class="brand" href="/"><svg class="logo" aria-hidden="true" viewBox="0 0 100 100" width="18" height="18" fill="none"><g stroke="currentColor" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"><path d="M50 34V55"/><path d="M50 35L34 26L23 15"/><path d="M50 35L66 26L77 15"/><path d="M50 54L36 72L28 88"/><path d="M50 54L64 72L72 88"/></g><circle cx="50" cy="20" r="10" fill="currentColor"/></svg> Posecode</a>
110+
<nav class="links" aria-label="Primary">
111+
<a href="/play">Playground</a>
112+
<a href="/moves/">Movement library</a>
113+
<a href="/spec.html">Language spec</a>
114+
<a href="/llm-guide.html">LLM guide</a>
115+
<a href="mailto:hello@posecode.org?subject=Posecode%20Feedback">Feedback</a>
116+
<a href="https://github.com/posecode-dev/posecode" target="_blank" rel="noopener">GitHub</a>
117+
</nav>
118+
</div>
119+
</header>
120+
<main class="wrap">
121+
122+
<p class="eyebrow">Desk &amp; posture · Core</p>
123+
<h1>Seated torso twist</h1>
124+
<p class="meta-line"><b>Target</b> Obliques &nbsp;·&nbsp; <b>Equipment</b> Chair
125+
&nbsp;·&nbsp; <b>Level</b> Beginner &nbsp;·&nbsp; <b>Reps</b> 3</p>
126+
<p>Seated torso twist is a beginner-level desk &amp; posture movement targeting the
127+
obliques, written in <a href="/">Posecode</a>, a small open-source language
128+
that capable language models can use to describe human movement as text.
129+
Authored joint targets and reach-IK solves are constrained to Posecode's configured
130+
per-axis bounds. Those bounds constrain the visualization, but they do not certify
131+
that a complete movement is safe or clinically correct.
132+
This page documents a code example; it is not exercise instruction.</p>
133+
134+
<a class="btn" href="/play/seated-torso-twist">▶ Open Seated torso twist in the playground →</a>
135+
136+
<h2>Movement phases</h2>
137+
<p>Phase cues are display-only coaching text. The executable joint and
138+
contact directives in the source below determine the animation.</p>
139+
<ol class="steps">
140+
<li>
141+
<span class="step-name">Twist right<span class="step-dur">2.6s · flow</span></span>
142+
<span class="step-cue">Sit tall, then rotate the ribs and gaze to the right</span>
143+
</li>
144+
<li>
145+
<span class="step-name">Twist left<span class="step-dur">3s · flow</span></span>
146+
<span class="step-cue">Pass through center and rotate to the left</span>
147+
</li>
148+
<li>
149+
<span class="step-name">Center<span class="step-dur">1.8s · settle</span></span>
150+
<span class="step-cue">Unwind back to a tall, neutral seat</span>
151+
</li>
152+
</ol>
153+
154+
<h2>The .posecode source</h2>
155+
<p>This is the exact text used by the linked playground animation: phases and joint
156+
angles, not 3D transforms.</p>
157+
<pre class="code-block"><code>posecode stretch &quot;Seated torso twist&quot;
158+
rig humanoid
159+
pose start = seated
160+
161+
step &quot;Twist right&quot; 2.6s flow:
162+
spine: twist-right 35
163+
chest: twist-right 30
164+
neck: twist-right 40
165+
shoulders: abduct 30
166+
elbows: flex 45
167+
cue &quot;Sit tall, then rotate the ribs and gaze to the right&quot;
168+
169+
step &quot;Twist left&quot; 3s flow:
170+
spine: twist-left 35
171+
chest: twist-left 30
172+
neck: twist-left 40
173+
shoulders: abduct 30
174+
elbows: flex 45
175+
cue &quot;Pass through center and rotate to the left&quot;
176+
177+
step &quot;Center&quot; 1.8s settle:
178+
spine: twist-left 0
179+
chest: twist-left 0
180+
neck: twist-left 0
181+
shoulders: abduct 0
182+
elbows: flex 0
183+
cue &quot;Unwind back to a tall, neutral seat&quot;
184+
185+
repeat 3
186+
</code></pre>
187+
188+
<h2>More desk &amp; posture movements</h2>
189+
<div class="chip-list"><a href="/moves/chest-opener.html">Chest opener</a><a href="/moves/posture.html">Desk posture reset</a><a href="/moves/twist.html">Standing spinal twist</a><a href="/moves/neck-side-stretch.html">Neck side stretch</a><a href="/moves/shoulder-blade-retraction.html">Shoulder blade retractions</a><a href="/moves/wrist-forearm-rolls.html">Wrist &amp; forearm rolls</a></div>
190+
</main>
191+
<footer class="site-footer">
192+
<div class="wrap">
193+
<p>Range-of-motion values are general literature data, not medical advice. Consult a
194+
qualified professional for physiotherapy or exercise prescription.</p>
195+
<p>
196+
<a href="/">Posecode</a>, open source under Apache-2.0 and AGPL-3.0 &nbsp;·&nbsp;
197+
<a href="https://github.com/posecode-dev/posecode/blob/main/docs/legal/LICENSING.md" target="_blank" rel="noopener">Licensing</a> &nbsp;·&nbsp;
198+
<a href="mailto:hello@posecode.org?subject=Posecode%20Feedback">Feedback</a> &nbsp;·&nbsp;
199+
<a href="https://github.com/posecode-dev/posecode/issues" target="_blank" rel="noopener">GitHub Issues</a>
200+
</p>
201+
</div>
202+
</footer>
203+
</body>
204+
</html>

0 commit comments

Comments
 (0)