diff --git a/animation.go b/animation.go index b170980..f383c1c 100644 --- a/animation.go +++ b/animation.go @@ -231,6 +231,7 @@ type AnimationProperty interface { Resume() writeTransitionString(tag PropertyName, buffer *strings.Builder) + writeAnimationString(tag PropertyName, buffer *strings.Builder, indent string) animationCSS(session Session) string transitionCSS(buffer *strings.Builder, session Session) hasAnimatedProperty() bool @@ -521,6 +522,11 @@ func animationSet(properties Properties, tag PropertyName, value any) []Property } } } + + if len(obj.Tag()) > 0 { + result.Tag = PropertyName(obj.Tag()) + } + if result.From != nil && result.To != nil { return result, true } @@ -753,6 +759,72 @@ func (animation *animationData) writeTransitionString(tag PropertyName, buffer * buffer.WriteString(" }") } +func (animation *animationData) writeAnimationString(tag PropertyName, buffer *strings.Builder, indent string) { + buffer.WriteString(indent) + + writeAnimation := func(animation AnimationProperty, buffer *strings.Builder, indent string) { + buffer.WriteString("_{") + + indent2 := indent + "\t" + for _, tag := range animation.AllTags() { + if tag != PropertyTag { + if value := animation.Get(tag); value != nil { + buffer.WriteString("\n" + indent2) + buffer.WriteString(string(tag)) + buffer.WriteString(" = ") + writePropertyValue(buffer, tag, value, indent2) + buffer.WriteRune(',') + } + } + } + + writeProperty := func(prop AnimatedProperty, indent string) { + buffer.WriteString(string(prop.Tag)) + buffer.WriteString("{\n") + indent2 := indent + "\t" + buffer.WriteString(indent2) + buffer.WriteString("from = ") + writePropertyValue(buffer, "from", prop.From, indent2) + buffer.WriteString(",\n") + buffer.WriteString(indent2) + buffer.WriteString("to = ") + writePropertyValue(buffer, "to", prop.To, indent2) + for key, value := range prop.KeyFrames { + buffer.WriteString(",\n") + buffer.WriteString(indent2) + tag := strconv.Itoa(key) + "%" + buffer.WriteString(tag) + buffer.WriteString(" = ") + writePropertyValue(buffer, PropertyName(tag), value, indent2) + } + buffer.WriteString(",\n") + buffer.WriteString(indent) + buffer.WriteString("},") + } + + if props, ok := animation.Get(PropertyTag).([]AnimatedProperty); ok && props != nil && len(props) > 0 { + buffer.WriteString("\n" + indent2) + buffer.WriteString(string(PropertyTag)) + buffer.WriteString(" = ") + if len(props) > 1 { + buffer.WriteString("[\n") + for _, prop := range props { + buffer.WriteString(indent2) + writeProperty(prop, indent2+"\t") + buffer.WriteString("\n") + } + buffer.WriteString(indent2 + "],") + } else { + writeProperty(props[0], indent2) + } + } + buffer.WriteRune('\n') + buffer.WriteString(indent + "},\n") + } + + writeAnimation(animation, buffer, indent) +} + func timingFunctionCSS(properties Properties, tag PropertyName, session Session) string { if timingFunction, ok := stringProperty(properties, tag, session); ok { if timingFunction, ok = session.resolveConstants(timingFunction); ok && isTimingFunctionValid(timingFunction) { diff --git a/viewStyle.go b/viewStyle.go index 4986545..667e53c 100644 --- a/viewStyle.go +++ b/viewStyle.go @@ -567,6 +567,7 @@ func supportedPropertyValue(value any) bool { case []BackgroundGradientPoint: case []BackgroundGradientAngle: case map[PropertyName]AnimationProperty: + case []AnimationProperty: default: return false } @@ -806,6 +807,22 @@ func writePropertyValue(buffer *strings.Builder, tag PropertyName, value any, in buffer.WriteString(indent) buffer.WriteRune(']') } + case []AnimationProperty: + switch count := len(value); count { + case 0: + buffer.WriteString("[]") + + default: + buffer.WriteString("[\n") + indent2 := indent + "\t" + for _, anim := range value { + if anim != nil { + anim.writeAnimationString(Animation, buffer, indent2) + } + } + buffer.WriteString(indent) + buffer.WriteRune(']') + } } } @@ -871,7 +888,7 @@ func writeViewStyle(name string, view Properties, buffer *strings.Builder, inden finalTags := []PropertyName{ PerspectiveOriginX, PerspectiveOriginY, BackfaceVisible, TransformOriginX, TransformOriginY, TransformOriginZ, - Transform, Clip, Filter, BackdropFilter, Summary, Content, Transition} + Transform, Clip, Filter, BackdropFilter, Summary, Content, Transition, Animation} for _, tag := range finalTags { removeTag(tag) }