Convert Figma logo to code with AI

facebook logoyoga

Yoga is an embeddable layout engine targeting web standards.

17,210
1,419
17,210
92

Top Related Projects

Flexbox for Android

Cross-platform React UI packages

UI Components Library for React Native

Material Design for React Native (Android & iOS)

Quick Overview

Yoga is a cross-platform layout engine developed by Facebook. It implements Flexbox, a powerful layout system that allows for flexible and responsive designs across different screen sizes and devices. Yoga is designed to be fast, small, and easy to integrate into various platforms and programming languages.

Pros

  • Cross-platform compatibility (works on iOS, Android, Web, and more)
  • High performance and small footprint
  • Extensive test coverage ensuring reliability
  • Easy integration with existing projects and frameworks

Cons

  • Learning curve for developers unfamiliar with Flexbox concepts
  • Limited to Flexbox layout system (doesn't support Grid or other CSS layouts)
  • Occasional discrepancies with browser implementations of Flexbox
  • Requires manual updates to stay in sync with latest Flexbox specifications

Code Examples

  1. Creating a simple flex container:
YGNodeRef root = YGNodeNew();
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
YGNodeStyleSetWidth(root, 100);
YGNodeStyleSetHeight(root, 100);
  1. Adding child nodes to a container:
YGNodeRef child1 = YGNodeNew();
YGNodeStyleSetWidth(child1, 50);
YGNodeStyleSetHeight(child1, 50);
YGNodeInsertChild(root, child1, 0);

YGNodeRef child2 = YGNodeNew();
YGNodeStyleSetWidth(child2, 50);
YGNodeStyleSetHeight(child2, 50);
YGNodeInsertChild(root, child2, 1);
  1. Calculating layout:
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);

float childWidth = YGNodeLayoutGetWidth(child1);
float childHeight = YGNodeLayoutGetHeight(child1);
float childX = YGNodeLayoutGetLeft(child1);
float childY = YGNodeLayoutGetTop(child1);

Getting Started

To use Yoga in your project, follow these steps:

  1. Clone the repository:

    git clone https://github.com/facebook/yoga.git
    
  2. Build the library:

    cd yoga
    ./scripts/build.sh
    
  3. Include Yoga in your project:

    • For C++: Add #include <yoga/Yoga.h> to your source files
    • For other languages, refer to the language-specific bindings in the repository
  4. Link against the built library in your project's build system

  5. Start using Yoga's API to create and manipulate layout nodes in your application

For more detailed instructions and language-specific guides, refer to the official documentation in the repository.

Competitor Comparisons

Flexbox for Android

Pros of flexbox-layout

  • Native Android implementation, potentially better performance on Android devices
  • Closer integration with Android's view system and lifecycle
  • Simpler API for Android developers already familiar with the platform

Cons of flexbox-layout

  • Limited to Android platform, not cross-platform like Yoga
  • Less actively maintained, with fewer recent updates
  • Smaller community and ecosystem compared to Yoga

Code Comparison

Yoga:

YogaNode root = new YogaNode();
root.setFlexDirection(YogaFlexDirection.ROW);
root.setJustifyContent(YogaJustify.SPACE_BETWEEN);

flexbox-layout:

FlexboxLayout flexboxLayout = new FlexboxLayout(context);
flexboxLayout.setFlexDirection(FlexDirection.ROW);
flexboxLayout.setJustifyContent(JustifyContent.SPACE_BETWEEN);

Both libraries offer similar APIs for setting flex properties, but Yoga's implementation is more platform-agnostic, while flexbox-layout is tailored specifically for Android. Yoga's cross-platform nature makes it more versatile for projects targeting multiple platforms, while flexbox-layout may offer a more seamless experience for Android-only development. The choice between the two depends on the project's requirements and target platforms.

Cross-platform React UI packages

Pros of React Native Web

  • Enables running React Native components and APIs on the web
  • Provides a more comprehensive solution for cross-platform development
  • Offers better integration with existing web technologies and frameworks

Cons of React Native Web

  • Larger bundle size compared to Yoga's lightweight approach
  • May have performance overhead due to additional abstraction layers
  • Potentially more complex setup and configuration process

Code Comparison

React Native Web:

import { View, Text, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
});

Yoga:

YGNodeStyleSetFlex(root, 1);
YGNodeStyleSetAlignItems(root, YGAlignCenter);
YGNodeStyleSetJustifyContent(root, YGJustifyCenter);

React Native Web provides a more React-like syntax and abstraction, while Yoga offers lower-level control over layout properties. React Native Web is better suited for developers looking to build cross-platform applications with a focus on web compatibility, whereas Yoga is ideal for those needing a lightweight, performant layout engine with fine-grained control.

UI Components Library for React Native

Pros of react-native-ui-lib

  • Comprehensive UI component library specifically for React Native
  • Includes pre-built, customizable components for faster development
  • Offers a theming system for consistent styling across the app

Cons of react-native-ui-lib

  • Larger bundle size due to the extensive component library
  • May have a steeper learning curve for developers new to the library
  • Less flexible for custom layouts compared to Yoga's low-level approach

Code Comparison

react-native-ui-lib:

import { View, Text, Button } from 'react-native-ui-lib';

const MyComponent = () => (
  <View>
    <Text>Hello World</Text>
    <Button label="Click me" onPress={() => {}} />
  </View>
);

Yoga:

import { View, Text } from 'react-native';
import { YogaLayout } from 'yoga-layout-react-native';

const MyComponent = () => (
  <YogaLayout>
    <View>
      <Text>Hello World</Text>
    </View>
  </YogaLayout>
);

Summary

react-native-ui-lib provides a rich set of pre-built components and theming capabilities, making it easier to create consistent UIs quickly. However, it may result in larger bundle sizes and less flexibility for custom layouts. Yoga, on the other hand, focuses on low-level layout primitives, offering more control over layout but requiring more manual implementation of UI components.

Material Design for React Native (Android & iOS)

Pros of React Native Paper

  • Provides a comprehensive set of pre-built UI components specifically for React Native
  • Offers a consistent Material Design look and feel across iOS and Android
  • Includes theming support for easy customization of app appearance

Cons of React Native Paper

  • Limited to React Native development, while Yoga can be used in various platforms
  • May have a steeper learning curve for developers unfamiliar with Material Design principles
  • Potentially larger bundle size due to the inclusion of many pre-built components

Code Comparison

React Native Paper:

import { Button } from 'react-native-paper';

const MyComponent = () => (
  <Button mode="contained" onPress={() => console.log('Pressed')}>
    Press me
  </Button>
);

Yoga:

YGNodeRef root = YGNodeNew();
YGNodeStyleSetWidth(root, 100);
YGNodeStyleSetHeight(root, 100);
YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);

While React Native Paper focuses on providing ready-to-use UI components, Yoga is a lower-level layout engine that can be used to create custom layouts across various platforms. React Native Paper is more suitable for rapid development of Material Design-based React Native apps, while Yoga offers more flexibility and cross-platform compatibility for layout calculations.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Yoga Support Ukraine CocoaPods npm Maven Central

Yoga is an embeddable and performant flexbox layout engine with bindings for multiple languages.

Building

Yoga's main implementation targets C++ 20 with accompanying build logic in CMake. A wrapper is provided to build the main library and run unit tests.

./unit_tests <Debug|Release>

While not required, this script will use ninja if it is installed for faster builds.

Yoga is additionally part of the vcpkg collection of ports maintained by Microsoft and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

Adding Tests

Many of Yoga's tests are automatically generated, using HTML fixtures describing node structure. These are rendered in Chrome to generate an expected layout result for the tree. New fixtures can be added to gentest/fixtures.

<div id="my_test" style="width: 100px; height: 100px; align-items: center;">
  <div style="width: 50px; height: 50px;"></div>
</div>

To generate new tests from added fixtures:

  1. Ensure you have yarn classic installed.
  2. Run yarn install to install dependencies for the test generator.
  3. Run yarn gentest in the yoga directory.

Debugging

Yoga provides a VSCode "launch.json" configuration which allows debugging unit tests. Simply add your breakpoints, and run "Debug C++ Unit tests (lldb)" (or "Debug C++ Unit tests (vsdbg)" on Windows).

NPM DownloadsLast 30 Days