diff --git a/src/rojos/rojo-animator.ts b/src/rojos/rojo-animator.ts
new file mode 100644
index 0000000..c20f52a
--- /dev/null
+++ b/src/rojos/rojo-animator.ts
@@ -0,0 +1,164 @@
+const InkscapeNS = "http://www.inkscape.org/namespaces/inkscape";
+
+const N = "(-?[\\d.eE+]+)";
+const S = "[,\\s]+";
+
+const TranslateRE = new RegExp( `translate\\(\\s*${ N }${ S }${ N }\\s*\\)` );
+const MatrixRE = new RegExp( `matrix\\(\\s*${ N }${ S }${ N }${ S }${ N }${ S }${ N }${ S }${ N }${ S }${ N }\\s*\\)` );
+const RotateRE = new RegExp( `rotate\\(\\s*${ N }(?:${ S }${ N }${ S }${ N })?\\s*\\)` );
+
+function applyTransformStr( s: string, x: number, y: number ): [ number, number ]
+{
+ if ( null == s || "" === s ) { return [ x, y ]; }
+
+ let m = s.match( TranslateRE );
+
+ if ( null != m )
+ {
+ return [ x + parseFloat( m[ 1 ] ), y + parseFloat( m[ 2 ] ) ];
+ }
+
+ m = s.match( MatrixRE );
+
+ if ( null != m )
+ {
+ const a = parseFloat( m[ 1 ] ), b = parseFloat( m[ 2 ] );
+ const c = parseFloat( m[ 3 ] ), d = parseFloat( m[ 4 ] );
+ const e = parseFloat( m[ 5 ] ), f = parseFloat( m[ 6 ] );
+ return [ a * x + c * y + e, b * x + d * y + f ];
+ }
+
+ m = s.match( RotateRE );
+
+ if ( null != m )
+ {
+ const angle = parseFloat( m[ 1 ] ) * Math.PI / 180;
+ const cos = Math.cos( angle );
+ const sin = Math.sin( angle );
+ const cx = null != m[ 2 ] ? parseFloat( m[ 2 ] ) : 0;
+ const cy = null != m[ 3 ] ? parseFloat( m[ 3 ] ) : 0;
+ const dx = x - cx;
+ const dy = y - cy;
+ return [ cx + dx * cos - dy * sin, cy + dx * sin + dy * cos ];
+ }
+
+ return [ x, y ];
+}
+
+export class BoneData
+{
+ group: SVGGElement = null;
+ name: string = "";
+ restTransform: string = "";
+ pivotLocalX: number = 0;
+ pivotLocalY: number = 0;
+}
+
+export class RojoAnimator
+{
+ svgRoot: SVGSVGElement = null;
+ Bones: Map
File tree rename/delete, locale generator rewrite, locale documentation,
doc/ renamed to workspace/, fixed navigation header system,
- Guides/Actions workspace restructure, and Update History action rewrite.
+ Guides/Actions workspace restructure, Update History action rewrite,
+ and Rojo chibi bone animator prototype.
@@ -205,6 +204,44 @@
+ A 2D skeletal animation prototype was started for an in-app chibi character
+ intended to accompany AI agent interactions. The source artwork is an Inkscape
+ SVG (
+
+ Update History Action: Commit and Push
Rojo Chibi Bone Animator Prototype
+ src/rojos/rojo-base.svg) where each body part is a
+ <g> labelled *-transform and contains a
+ <circle> labelled *-pivot that marks the
+ rotation point. The pivot circle carries an inverse transform so its
+ cx/cy sits at the exact world-space pivot regardless of the
+ bone's own transform.
+ src/rojos/rojo-animator.ts provides RojoAnimator,
+ which walks all *-transform groups on load, applies the pivot
+ circle's transform to its cx/cy to recover the local-space pivot,
+ removes the circles, and strips Inkscape namespaced attributes. At runtime,
+ setBoneAngle(name, degrees) writes
+ restTransform translate(lx,ly) rotate(θ) translate(-lx,-ly)
+ directly onto the group element — no graphics library required. The parser
+ handles all three transform types present in the SVG:
+ translate, matrix, and rotate(angle,cx,cy).
+ public/rojos/rojo-demo.html fetches the SVG, injects it into
+ the page, and runs a requestAnimationFrame loop with three
+ switchable animations: Idle (breathing sway), Walk
+ (legs and arms in opposite phase), and Wave (right arm wave).
+ server/localeGenerator.ts — complete rewrite (per-directory output)
src/locales/generated/ — new: generated locale classes
src/locales/LocaleManager.ts — static $ changed to static get $
- CLAUDE.md — updated to point to workspace/outline/index.html
+ CLAUDE.md — updated to point to workspace/outline/index.html
+ workspace/index.html — updated: added Guides and Actions cards
+ src/rojos/rojo-base.svg — new: Inkscape chibi character with bone/pivot structure
+ src/rojos/rojo-animator.ts — new: SVG bone animator (pivot parser + setBoneAngle)
+ public/rojos/rojo-base.svg — new: copy of SVG for static serving
+ public/rojos/rojo-demo.html — new: interactive animation demo (idle/walk/wave)
File tree rename/delete (right-click context menu), locale generator rewrite (per-directory output, new naming conventions), locale documentation, doc/ renamed to workspace/, fixed navigation header system, Guides/Actions workspace restructure, Update History action rewrite (commit/push with confirmation).
+File tree rename/delete (right-click context menu), locale generator rewrite (per-directory output, new naming conventions), locale documentation, doc/ renamed to workspace/, fixed navigation header system, Guides/Actions workspace restructure, Update History action rewrite, Rojo chibi bone animator prototype (SVG pivot system, no graphics library).
- Explains Roject's goals, features and future plans and actions that are used for
- the project.
+ Explains Roject's goals, features and future plans for the project.
Read more about the outline
+ Context, rules, workflows and examples for how to do things.
+
+
+ Read more about the guides
+
+ Named tasks and steps for recurring topics.
+
+
+ Read more about the actions
+
@@ -40,6 +59,11 @@