diff --git a/crates/figma_import/src/figma_schema.rs b/crates/figma_import/src/figma_schema.rs index bed1fa832..fb767a8ec 100644 --- a/crates/figma_import/src/figma_schema.rs +++ b/crates/figma_import/src/figma_schema.rs @@ -1274,6 +1274,19 @@ impl BoundVariables { } None } + + pub(crate) fn get_var_from_hash(&self, hash_name: &str, var_name: &str) -> Option { + let var_hash = self.variables.get(hash_name); + if let Some(var) = var_hash { + if let VariableAliasOrList::Map(map) = var { + let var = map.get(var_name); + if let Some(var) = var { + return Some(var.id.clone()); + } + } + } + None + } } // We use the "untagged" serde attribute because the value of a variable is diff --git a/crates/figma_import/src/transform_flexbox.rs b/crates/figma_import/src/transform_flexbox.rs index 11e997740..2232254a3 100644 --- a/crates/figma_import/src/transform_flexbox.rs +++ b/crates/figma_import/src/transform_flexbox.rs @@ -1464,19 +1464,50 @@ fn visit_node( // Collect the corner radii values to be saved into the view. If the corner radii are set // to variables, they will be set to NumOrVar::Var. Otherwise they will be set to NumOrVar::Num. let corner_radius = if let Some(vars) = &node.bound_variables { - let top_left = NumOrVarType::from_var(vars, "topLeftRadius", corner_radius_values[0]); - let top_right = NumOrVarType::from_var(vars, "topRightRadius", corner_radius_values[1]); - let bottom_right = - NumOrVarType::from_var(vars, "bottomRightRadius", corner_radius_values[2]); - let bottom_left = NumOrVarType::from_var(vars, "bottomLeftRadius", corner_radius_values[3]); + let corner_values = if vars.has_var("rectangleCornerRadii") { + ( + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_TOP_LEFT_CORNER_RADIUS", + corner_radius_values[0], + ), + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_TOP_RIGHT_CORNER_RADIUS", + corner_radius_values[1], + ), + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_BOTTOM_LEFT_CORNER_RADIUS", + corner_radius_values[2], + ), + NumOrVarType::from_var_hash( + vars, + "rectangleCornerRadii", + "RECTANGLE_BOTTOM_RIGHT_CORNER_RADIUS", + corner_radius_values[3], + ), + ) + } else { + ( + NumOrVarType::from_var(vars, "topLeftRadius", corner_radius_values[0]), + NumOrVarType::from_var(vars, "topRightRadius", corner_radius_values[1]), + NumOrVarType::from_var(vars, "bottomRightRadius", corner_radius_values[2]), + NumOrVarType::from_var(vars, "bottomLeftRadius", corner_radius_values[3]), + ) + }; if vars.has_var("topLeftRadius") || vars.has_var("topRightRadius") || vars.has_var("bottomRightRadius") || vars.has_var("bottomLeftRadius") + || vars.has_var("rectangleCornerRadii") { has_corner_radius = true; } - [top_left, top_right, bottom_right, bottom_left] + [corner_values.0, corner_values.1, corner_values.2, corner_values.3] } else { [ NumOrVarType::Num(corner_radius_values[0]), diff --git a/crates/figma_import/src/variable_utils.rs b/crates/figma_import/src/variable_utils.rs index 13ce3faed..d6814c733 100644 --- a/crates/figma_import/src/variable_utils.rs +++ b/crates/figma_import/src/variable_utils.rs @@ -31,6 +31,13 @@ pub(crate) trait FromFigmaVar { var_name: &str, var_value: VarType, ) -> Self; + + fn from_var_hash( + bound_variables: &figma_schema::BoundVariables, + hash_name: &str, + var_name: &str, + var_value: VarType, + ) -> Self; } // Create a NumOrVar from Figma variable name and number value impl FromFigmaVar for NumOrVarType { @@ -46,6 +53,19 @@ impl FromFigmaVar for NumOrVarType { NumOrVarType::Num(var_value) } } + fn from_var_hash( + bound_variables: &figma_schema::BoundVariables, + hash_name: &str, + var_name: &str, + var_value: f32, + ) -> Self { + let var = bound_variables.get_var_from_hash(hash_name, var_name); + if let Some(var) = var { + NumOrVarType::Var(NumVar { id: var, fallback: var_value }) + } else { + NumOrVarType::Num(var_value) + } + } } // Create a ColorOrVar from Figma variable name and color value impl FromFigmaVar<&FloatColor> for ColorOrVar { @@ -61,6 +81,15 @@ impl FromFigmaVar<&FloatColor> for ColorOrVar { ColorOrVar::new_color(color.into()) } } + fn from_var_hash( + _bound_variables: &figma_schema::BoundVariables, + _hash_name: &str, + _var_name: &str, + color: &FloatColor, + ) -> Self { + // Currently, no color variables from a hash are yet supported + ColorOrVar::new_color(color.into()) + } } // Create a VariableValue from figma_schema::VariableValue diff --git a/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf b/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf index a981e4394..f74732053 100644 Binary files a/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf and b/integration-tests/validation/src/main/assets/figma/VariablesTestDoc_HhGxvL4aHhP8ALsLNz56TP.dcf differ