package d2isometricimg

import 

// Sequence time remains the compiled Z coordinate. Only the material depth
// changes: groups are regions below the timeline, activations are inked rails,
// and notes are folded pages above messages. None of these semantic children
// turn an actor header into a container or enlarge its source footprint.
func ( *meshBuilder) ( d2isometric.Node,  string) {
	switch .SequenceRole {
	case "group":
		 := len(.animatedNodes)
		 := nativeClassicNode()
		 := d2isometric.Board{
			ID: .ID, SourceID: .ID, Kind: "sequence-group",
			Level:    .Metadata.Original.Level,
			Position: .Position, Size: .Size,
		}
		// The compiler's multiply wash preserves overlapping source scopes
		// without an opaque slab hiding activations or lifelines.
		.hierarchyBoard(, &, .Fill, .Opacity)
		 := nativeFaceSource(, .Fill)
		.canonicalNodeContent(, , .Fill, .29)
		if len(.animatedNodes) >  {
			.animatedNodes[].last = len(.triangles)
		}
	case "span":
		// Nested caps remain below the common message plane: a message may
		// intentionally cross another actor's activation. Tiny offsets retain
		// the source nesting order without hiding those interior crossings.
		 := .28 + float64(max(0, min(128, .Metadata.Original.Level)))*.00001
		.Size.Y = ( - .10) / 1.15
		// An authored 3D modifier extends the body downward, keeping its cap
		// below messages rather than obscuring a later source paint layer.
		.Position.Y =  - nativeCanonicalHeight(, .scale) + .Size.Y/2
		.node(, )
	case "note":
		.Position.Y = .16 + .Size.Y/2
		.hierarchyNode(, )
	default:
		.hierarchyNode(, )
	}
}