Loading editor/widgets/article/article.cpp +21 −0 Changes for editor/widgets/article/article.cpp: 21 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -91,6 +91,11 @@ extern "C" { std::string verticalAlign = ""; std::string m_verticalAlign = ""; // Flex layout: main-axis direction and cross-axis alignment std::string direction = ""; std::string m_direction = ""; std::string alignItems = ""; // Visibility bool hidden = false; bool m_hidden = false; Loading Loading @@ -231,6 +236,10 @@ extern "C" { addField("border_style", "Border", "text", "e.g. 1px solid #ccc", "desktop"); addField("opacity", "Opacity", "text", "0.0 - 1.0", "desktop"); addField("vertical_align", "Vertical Align", "select", nullptr, "desktop", mkOpts({"top","center","bottom"})); addField("direction", "Direction", "select", nullptr, "desktop", mkOpts({"vertical","horizontal"})); addField("m_direction", "Mobile Direction", "select", nullptr, "mobile", mkOpts({"vertical","horizontal"})); addField("align_items", "Align Items", "select", nullptr, "all", mkOpts({"", "flex-start","center","flex-end","stretch","baseline"})); addField("hidden", "Hidden", "checkbox", nullptr, "desktop", nullptr, "simple"); { json_object *hf = json_object_array_get_idx(arr, json_object_array_length(arr) - 1); Loading Loading @@ -305,6 +314,9 @@ extern "C" { element->SetAttribute("vertical_align", verticalAlign.c_str()); element->SetAttribute("m_vertical_align", m_verticalAlign.c_str()); element->SetAttribute("direction", direction.c_str()); element->SetAttribute("m_direction", m_direction.c_str()); element->SetAttribute("align_items", alignItems.c_str()); element->SetAttribute("hidden", hidden ? "true" : "false"); element->SetAttribute("m_hidden", m_hidden ? "true" : "false"); Loading Loading @@ -430,6 +442,12 @@ extern "C" { if (val) verticalAlign = val; val = xml_data->Attribute("m_vertical_align"); if (val) m_verticalAlign = val; val = xml_data->Attribute("direction"); if (val) direction = val; val = xml_data->Attribute("m_direction"); if (val) m_direction = val; val = xml_data->Attribute("align_items"); if (val) alignItems = val; const char* loaded_hidden = xml_data->Attribute("hidden"); if (loaded_hidden) hidden = (strcmp(loaded_hidden, "true") == 0); Loading Loading @@ -492,6 +510,9 @@ extern "C" { json_object_object_add(obj, "m_height", json_object_new_string(m_height.c_str())); json_object_object_add(obj, "vertical_align", json_object_new_string(verticalAlign.c_str())); json_object_object_add(obj, "m_vertical_align", json_object_new_string(m_verticalAlign.c_str())); json_object_object_add(obj, "direction", json_object_new_string(direction.c_str())); json_object_object_add(obj, "m_direction", json_object_new_string(m_direction.c_str())); json_object_object_add(obj, "align_items", json_object_new_string(alignItems.c_str())); json_object_object_add(obj, "hidden", json_object_new_boolean(hidden)); json_object_object_add(obj, "m_hidden", json_object_new_boolean(m_hidden)); json_object_object_add(obj, "custom_css", json_object_new_string(customCss.c_str())); Loading editor/widgets/section/section.cpp +47 −5 Changes for editor/widgets/section/section.cpp: 47 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -101,6 +101,11 @@ extern "C" { std::string verticalAlign = ""; std::string m_verticalAlign = ""; // Flex layout: main-axis direction and cross-axis alignment std::string direction = ""; std::string m_direction = ""; std::string alignItems = ""; // Shape divider: a decorative SVG (wave/oval) cut into the // section's top or bottom edge, e.g. to end a hero section // without a hard horizontal line. Loading Loading @@ -259,6 +264,9 @@ extern "C" { addField("border_style", "Border", "text", "e.g. 1px solid #ccc", "desktop"); addField("opacity", "Opacity", "text", "0.0 - 1.0", "desktop"); addField("vertical_align", "Vertical Align", "select", nullptr, "desktop", mkOpts({"top","center","bottom"})); addField("direction", "Direction", "select", nullptr, "desktop", mkOpts({"vertical","horizontal"})); addField("align_items", "Align Items", "select", nullptr, "all", mkOpts({"", "flex-start","center","flex-end","stretch","baseline"})); addField("shape_divider_type", "Shape Divider", "select", nullptr, "desktop", mkOpts({"none","wave","oval"}), "simple"); addField("shape_divider_position", "Shape Divider Position", "select", nullptr, "desktop", mkOpts({"bottom","top","both"}), "simple"); addField("shape_divider_color", "Shape Divider Color", "color_var", nullptr, "desktop", nullptr, "simple"); Loading Loading @@ -290,6 +298,7 @@ extern "C" { addField("m_border_style", "Mobile Border", "text", "e.g. 1px solid #ccc", "mobile"); addField("m_opacity", "Mobile Opacity", "text", "0.0 - 1.0", "mobile"); addField("m_vertical_align", "Mobile Vertical Align", "select", nullptr, "mobile", mkOpts({"top","center","bottom"})); addField("m_direction", "Mobile Direction", "select", nullptr, "mobile", mkOpts({"vertical","horizontal"})); addField("m_hidden", "Mobile Hidden", "checkbox", nullptr, "mobile", nullptr, "simple"); { json_object *mhf = json_object_array_get_idx(arr, json_object_array_length(arr) - 1); Loading Loading @@ -381,6 +390,11 @@ extern "C" { element->SetAttribute("vertical_align", verticalAlign.c_str()); element->SetAttribute("m_vertical_align", m_verticalAlign.c_str()); // Flex layout element->SetAttribute("direction", direction.c_str()); element->SetAttribute("m_direction", m_direction.c_str()); element->SetAttribute("align_items", alignItems.c_str()); // Shape divider element->SetAttribute("shape_divider_type", shapeDividerType.c_str()); element->SetAttribute("shape_divider_position", shapeDividerPosition.c_str()); Loading Loading @@ -552,6 +566,14 @@ extern "C" { val = xml_data->Attribute("m_vertical_align"); if (val) m_verticalAlign = val; // Flex layout val = xml_data->Attribute("direction"); if (val) direction = val; val = xml_data->Attribute("m_direction"); if (val) m_direction = val; val = xml_data->Attribute("align_items"); if (val) alignItems = val; // Shape divider val = xml_data->Attribute("shape_divider_type"); if (val) shapeDividerType = val; Loading Loading @@ -628,6 +650,9 @@ extern "C" { json_object_object_add(obj, "m_height", json_object_new_string(m_height.c_str())); json_object_object_add(obj, "vertical_align", json_object_new_string(verticalAlign.c_str())); json_object_object_add(obj, "m_vertical_align", json_object_new_string(m_verticalAlign.c_str())); json_object_object_add(obj, "direction", json_object_new_string(direction.c_str())); json_object_object_add(obj, "m_direction", json_object_new_string(m_direction.c_str())); json_object_object_add(obj, "align_items", json_object_new_string(alignItems.c_str())); json_object_object_add(obj, "shape_divider_type", json_object_new_string(shapeDividerType.c_str())); json_object_object_add(obj, "shape_divider_position", json_object_new_string(shapeDividerPosition.c_str())); json_object_object_add(obj, "shape_divider_color", json_object_new_string(shapeDividerColor.c_str())); Loading Loading @@ -832,6 +857,18 @@ extern "C" { val = json_object_get_string(val_obj); if (val) m_verticalAlign = val; } if (json_object_object_get_ex(obj, "direction", &val_obj)) { val = json_object_get_string(val_obj); if (val) direction = val; } if (json_object_object_get_ex(obj, "m_direction", &val_obj)) { val = json_object_get_string(val_obj); if (val) m_direction = val; } if (json_object_object_get_ex(obj, "align_items", &val_obj)) { val = json_object_get_string(val_obj); if (val) alignItems = val; } if (json_object_object_get_ex(obj, "shape_divider_type", &val_obj)) { val = json_object_get_string(val_obj); if (val && val[0]) shapeDividerType = val; Loading Loading @@ -940,11 +977,13 @@ extern "C" { if (!height.empty()) { style += " height: " + height + ";"; } if (!verticalAlign.empty()) { style += " display: flex; flex-direction: column;"; if (!verticalAlign.empty() || !direction.empty() || !alignItems.empty()) { style += " display: flex; flex-direction: " + std::string(direction == "horizontal" ? "row" : "column") + ";"; if (verticalAlign == "top") style += " justify-content: flex-start;"; else if (verticalAlign == "center") style += " justify-content: center;"; else if (verticalAlign == "bottom") style += " justify-content: flex-end;"; if (!alignItems.empty()) style += " align-items: " + alignItems + ";"; } bool hasShapeDivider = (shapeDividerType == "wave" || shapeDividerType == "oval"); if (hasShapeDivider) { Loading Loading @@ -1039,15 +1078,18 @@ extern "C" { if (!m_width.empty()) mobileCSS += " width: " + m_width + " !important;"; else if (width.find("px") != std::string::npos) mobileCSS += " width: 100% !important;"; if (!m_height.empty()) mobileCSS += " height: " + m_height + " !important;"; if (!m_verticalAlign.empty()) { mobileCSS += " display: flex !important; flex-direction: column !important;"; if (!m_verticalAlign.empty() || !m_direction.empty()) { std::string effectiveDirection = !m_direction.empty() ? m_direction : direction; mobileCSS += " display: flex !important; flex-direction: " + std::string(effectiveDirection == "horizontal" ? "row" : "column") + " !important;"; if (m_verticalAlign == "top") mobileCSS += " justify-content: flex-start !important;"; else if (m_verticalAlign == "center") mobileCSS += " justify-content: center !important;"; else if (m_verticalAlign == "bottom") mobileCSS += " justify-content: flex-end !important;"; } if (m_hidden) mobileCSS += " display: none !important;"; else if (hidden) { if (!m_verticalAlign.empty() || !verticalAlign.empty()) if (!m_verticalAlign.empty() || !verticalAlign.empty() || !m_direction.empty() || !direction.empty() || !alignItems.empty()) mobileCSS += " display: flex !important;"; else mobileCSS += " display: block !important;"; Loading Loading
editor/widgets/article/article.cpp +21 −0 Changes for editor/widgets/article/article.cpp: 21 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -91,6 +91,11 @@ extern "C" { std::string verticalAlign = ""; std::string m_verticalAlign = ""; // Flex layout: main-axis direction and cross-axis alignment std::string direction = ""; std::string m_direction = ""; std::string alignItems = ""; // Visibility bool hidden = false; bool m_hidden = false; Loading Loading @@ -231,6 +236,10 @@ extern "C" { addField("border_style", "Border", "text", "e.g. 1px solid #ccc", "desktop"); addField("opacity", "Opacity", "text", "0.0 - 1.0", "desktop"); addField("vertical_align", "Vertical Align", "select", nullptr, "desktop", mkOpts({"top","center","bottom"})); addField("direction", "Direction", "select", nullptr, "desktop", mkOpts({"vertical","horizontal"})); addField("m_direction", "Mobile Direction", "select", nullptr, "mobile", mkOpts({"vertical","horizontal"})); addField("align_items", "Align Items", "select", nullptr, "all", mkOpts({"", "flex-start","center","flex-end","stretch","baseline"})); addField("hidden", "Hidden", "checkbox", nullptr, "desktop", nullptr, "simple"); { json_object *hf = json_object_array_get_idx(arr, json_object_array_length(arr) - 1); Loading Loading @@ -305,6 +314,9 @@ extern "C" { element->SetAttribute("vertical_align", verticalAlign.c_str()); element->SetAttribute("m_vertical_align", m_verticalAlign.c_str()); element->SetAttribute("direction", direction.c_str()); element->SetAttribute("m_direction", m_direction.c_str()); element->SetAttribute("align_items", alignItems.c_str()); element->SetAttribute("hidden", hidden ? "true" : "false"); element->SetAttribute("m_hidden", m_hidden ? "true" : "false"); Loading Loading @@ -430,6 +442,12 @@ extern "C" { if (val) verticalAlign = val; val = xml_data->Attribute("m_vertical_align"); if (val) m_verticalAlign = val; val = xml_data->Attribute("direction"); if (val) direction = val; val = xml_data->Attribute("m_direction"); if (val) m_direction = val; val = xml_data->Attribute("align_items"); if (val) alignItems = val; const char* loaded_hidden = xml_data->Attribute("hidden"); if (loaded_hidden) hidden = (strcmp(loaded_hidden, "true") == 0); Loading Loading @@ -492,6 +510,9 @@ extern "C" { json_object_object_add(obj, "m_height", json_object_new_string(m_height.c_str())); json_object_object_add(obj, "vertical_align", json_object_new_string(verticalAlign.c_str())); json_object_object_add(obj, "m_vertical_align", json_object_new_string(m_verticalAlign.c_str())); json_object_object_add(obj, "direction", json_object_new_string(direction.c_str())); json_object_object_add(obj, "m_direction", json_object_new_string(m_direction.c_str())); json_object_object_add(obj, "align_items", json_object_new_string(alignItems.c_str())); json_object_object_add(obj, "hidden", json_object_new_boolean(hidden)); json_object_object_add(obj, "m_hidden", json_object_new_boolean(m_hidden)); json_object_object_add(obj, "custom_css", json_object_new_string(customCss.c_str())); Loading
editor/widgets/section/section.cpp +47 −5 Changes for editor/widgets/section/section.cpp: 47 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -101,6 +101,11 @@ extern "C" { std::string verticalAlign = ""; std::string m_verticalAlign = ""; // Flex layout: main-axis direction and cross-axis alignment std::string direction = ""; std::string m_direction = ""; std::string alignItems = ""; // Shape divider: a decorative SVG (wave/oval) cut into the // section's top or bottom edge, e.g. to end a hero section // without a hard horizontal line. Loading Loading @@ -259,6 +264,9 @@ extern "C" { addField("border_style", "Border", "text", "e.g. 1px solid #ccc", "desktop"); addField("opacity", "Opacity", "text", "0.0 - 1.0", "desktop"); addField("vertical_align", "Vertical Align", "select", nullptr, "desktop", mkOpts({"top","center","bottom"})); addField("direction", "Direction", "select", nullptr, "desktop", mkOpts({"vertical","horizontal"})); addField("align_items", "Align Items", "select", nullptr, "all", mkOpts({"", "flex-start","center","flex-end","stretch","baseline"})); addField("shape_divider_type", "Shape Divider", "select", nullptr, "desktop", mkOpts({"none","wave","oval"}), "simple"); addField("shape_divider_position", "Shape Divider Position", "select", nullptr, "desktop", mkOpts({"bottom","top","both"}), "simple"); addField("shape_divider_color", "Shape Divider Color", "color_var", nullptr, "desktop", nullptr, "simple"); Loading Loading @@ -290,6 +298,7 @@ extern "C" { addField("m_border_style", "Mobile Border", "text", "e.g. 1px solid #ccc", "mobile"); addField("m_opacity", "Mobile Opacity", "text", "0.0 - 1.0", "mobile"); addField("m_vertical_align", "Mobile Vertical Align", "select", nullptr, "mobile", mkOpts({"top","center","bottom"})); addField("m_direction", "Mobile Direction", "select", nullptr, "mobile", mkOpts({"vertical","horizontal"})); addField("m_hidden", "Mobile Hidden", "checkbox", nullptr, "mobile", nullptr, "simple"); { json_object *mhf = json_object_array_get_idx(arr, json_object_array_length(arr) - 1); Loading Loading @@ -381,6 +390,11 @@ extern "C" { element->SetAttribute("vertical_align", verticalAlign.c_str()); element->SetAttribute("m_vertical_align", m_verticalAlign.c_str()); // Flex layout element->SetAttribute("direction", direction.c_str()); element->SetAttribute("m_direction", m_direction.c_str()); element->SetAttribute("align_items", alignItems.c_str()); // Shape divider element->SetAttribute("shape_divider_type", shapeDividerType.c_str()); element->SetAttribute("shape_divider_position", shapeDividerPosition.c_str()); Loading Loading @@ -552,6 +566,14 @@ extern "C" { val = xml_data->Attribute("m_vertical_align"); if (val) m_verticalAlign = val; // Flex layout val = xml_data->Attribute("direction"); if (val) direction = val; val = xml_data->Attribute("m_direction"); if (val) m_direction = val; val = xml_data->Attribute("align_items"); if (val) alignItems = val; // Shape divider val = xml_data->Attribute("shape_divider_type"); if (val) shapeDividerType = val; Loading Loading @@ -628,6 +650,9 @@ extern "C" { json_object_object_add(obj, "m_height", json_object_new_string(m_height.c_str())); json_object_object_add(obj, "vertical_align", json_object_new_string(verticalAlign.c_str())); json_object_object_add(obj, "m_vertical_align", json_object_new_string(m_verticalAlign.c_str())); json_object_object_add(obj, "direction", json_object_new_string(direction.c_str())); json_object_object_add(obj, "m_direction", json_object_new_string(m_direction.c_str())); json_object_object_add(obj, "align_items", json_object_new_string(alignItems.c_str())); json_object_object_add(obj, "shape_divider_type", json_object_new_string(shapeDividerType.c_str())); json_object_object_add(obj, "shape_divider_position", json_object_new_string(shapeDividerPosition.c_str())); json_object_object_add(obj, "shape_divider_color", json_object_new_string(shapeDividerColor.c_str())); Loading Loading @@ -832,6 +857,18 @@ extern "C" { val = json_object_get_string(val_obj); if (val) m_verticalAlign = val; } if (json_object_object_get_ex(obj, "direction", &val_obj)) { val = json_object_get_string(val_obj); if (val) direction = val; } if (json_object_object_get_ex(obj, "m_direction", &val_obj)) { val = json_object_get_string(val_obj); if (val) m_direction = val; } if (json_object_object_get_ex(obj, "align_items", &val_obj)) { val = json_object_get_string(val_obj); if (val) alignItems = val; } if (json_object_object_get_ex(obj, "shape_divider_type", &val_obj)) { val = json_object_get_string(val_obj); if (val && val[0]) shapeDividerType = val; Loading Loading @@ -940,11 +977,13 @@ extern "C" { if (!height.empty()) { style += " height: " + height + ";"; } if (!verticalAlign.empty()) { style += " display: flex; flex-direction: column;"; if (!verticalAlign.empty() || !direction.empty() || !alignItems.empty()) { style += " display: flex; flex-direction: " + std::string(direction == "horizontal" ? "row" : "column") + ";"; if (verticalAlign == "top") style += " justify-content: flex-start;"; else if (verticalAlign == "center") style += " justify-content: center;"; else if (verticalAlign == "bottom") style += " justify-content: flex-end;"; if (!alignItems.empty()) style += " align-items: " + alignItems + ";"; } bool hasShapeDivider = (shapeDividerType == "wave" || shapeDividerType == "oval"); if (hasShapeDivider) { Loading Loading @@ -1039,15 +1078,18 @@ extern "C" { if (!m_width.empty()) mobileCSS += " width: " + m_width + " !important;"; else if (width.find("px") != std::string::npos) mobileCSS += " width: 100% !important;"; if (!m_height.empty()) mobileCSS += " height: " + m_height + " !important;"; if (!m_verticalAlign.empty()) { mobileCSS += " display: flex !important; flex-direction: column !important;"; if (!m_verticalAlign.empty() || !m_direction.empty()) { std::string effectiveDirection = !m_direction.empty() ? m_direction : direction; mobileCSS += " display: flex !important; flex-direction: " + std::string(effectiveDirection == "horizontal" ? "row" : "column") + " !important;"; if (m_verticalAlign == "top") mobileCSS += " justify-content: flex-start !important;"; else if (m_verticalAlign == "center") mobileCSS += " justify-content: center !important;"; else if (m_verticalAlign == "bottom") mobileCSS += " justify-content: flex-end !important;"; } if (m_hidden) mobileCSS += " display: none !important;"; else if (hidden) { if (!m_verticalAlign.empty() || !verticalAlign.empty()) if (!m_verticalAlign.empty() || !verticalAlign.empty() || !m_direction.empty() || !direction.empty() || !alignItems.empty()) mobileCSS += " display: flex !important;"; else mobileCSS += " display: block !important;"; Loading