Compare commits

...

4 Commits

Author SHA1 Message Date
Nick Gerleman
ed5d2ffc2d Set version to 3.0.3 2024-04-09 16:13:40 -07:00
Willson Haw
8a9758a2cc Add JavaScript bindings for YGHasNewLayout (#1631)
Summary:
Adds JavaScript bindings for YGHasNewLayout which introduces
two new node methods: `hasNewLayout()` and `markLayoutSeen()`.

Closes https://github.com/facebook/yoga/issues/681

Pull Request resolved: https://github.com/facebook/yoga/pull/1631

Reviewed By: joevilches

Differential Revision: D55213296

Pulled By: NickGerleman

fbshipit-source-id: 161288c3f54c2b82a6b2b842387916fe8713c2c9
2024-04-09 16:04:35 -07:00
Bela Bohlender
334eebc484 Entry point without TLA for js package (#1638)
Summary:
Follow up on https://github.com/facebook/yoga/issues/1637

TLDR: tooling for TLA is not there yet; An additional entry point without top-level-await is appropriate

- adds ./load entry to js package
- uses .js file extensions to prevent requiring [allowImportingTsExtensions](https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions)

Pull Request resolved: https://github.com/facebook/yoga/pull/1638

Reviewed By: joevilches

Differential Revision: D55614636

Pulled By: NickGerleman

fbshipit-source-id: 126a94aa68d22d32b938282cfa1a5059bb9df337
2024-04-09 16:03:21 -07:00
Nick Gerleman
5b106e5dd5 Bump README 2024-04-03 20:28:56 -07:00
12 changed files with 139 additions and 5 deletions

View File

@@ -6,7 +6,7 @@
Pod::Spec.new do |spec|
spec.name = 'Yoga'
spec.version = '3.0.2'
spec.version = '3.0.3'
spec.license = { :type => 'MIT', :file => "LICENSE" }
spec.homepage = 'https://yogalayout.dev/'
spec.documentation_url = 'https://yogalayout.dev/docs'

View File

@@ -11,4 +11,4 @@ android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M
VERSION_NAME=3.0.2
VERSION_NAME=3.0.3

View File

@@ -29,3 +29,12 @@ node.free();
## Requirements
`yoga-layout` requires a toolchain that supports ES Modules and top-level await.
If top-level-await is not supported, use the `yoga-layout/load` entry point instead. This requires to load yoga manually:
```ts
import {loadYoga, Align} from 'yoga-layout/load';
const node = (await loadYoga).Node.create();
node.setAlignContent(Align.Center);
```

View File

@@ -1,6 +1,6 @@
{
"name": "yoga-layout",
"version": "3.0.2",
"version": "3.0.3",
"description": "An embeddable and performant flexbox layout engine with bindings for multiple languages",
"license": "MIT",
"author": "Meta Open Source",
@@ -11,6 +11,10 @@
},
"type": "module",
"main": "./src/index.ts",
"exports": {
".": "./src/index.ts",
"./load": "./src/load.ts"
},
"files": [
"binaries/**",
"src/**"

View File

@@ -413,6 +413,14 @@ bool Node::isDirty(void) const {
return YGNodeIsDirty(m_node);
}
void Node::markLayoutSeen() {
YGNodeSetHasNewLayout(m_node, false);
}
bool Node::hasNewLayout(void) const {
return YGNodeGetHasNewLayout(m_node);
}
void Node::calculateLayout(double width, double height, int direction) {
YGNodeCalculateLayout(
m_node, width, height, static_cast<YGDirection>(direction));

View File

@@ -195,6 +195,8 @@ class Node {
public: // Dirtiness accessors
void markDirty(void);
bool isDirty(void) const;
void markLayoutSeen();
bool hasNewLayout(void) const;
public: // Layout mutators
void calculateLayout(double width, double height, int direction);

View File

@@ -175,6 +175,9 @@ EMSCRIPTEN_BINDINGS(YOGA_LAYOUT) {
.function("markDirty", &Node::markDirty)
.function("isDirty", &Node::isDirty)
.function("markLayoutSeen", &Node::markLayoutSeen)
.function("hasNewLayout", &Node::hasNewLayout)
.function("calculateLayout", &Node::calculateLayout)
.function("getComputedLeft", &Node::getComputedLeft)

25
javascript/src/load.ts Normal file
View File

@@ -0,0 +1,25 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
// @ts-ignore untyped from Emscripten
import loadYogaImpl from '../binaries/yoga-wasm-base64-esm.js';
import wrapAssembly from './wrapAssembly.ts';
export type {
Config,
DirtiedFunction,
MeasureFunction,
Node,
Yoga,
} from './wrapAssembly.ts';
export async function loadYoga() {
return wrapAssembly(await loadYogaImpl());
}
export * from './generated/YGEnums.ts';

View File

@@ -119,6 +119,8 @@ export type Node = {
isDirty(): boolean;
isReferenceBaseline(): boolean;
markDirty(): void;
hasNewLayout(): boolean;
markLayoutSeen(): void;
removeChild(child: Node): void;
reset(): void;
setAlignContent(alignContent: Align): void;

View File

@@ -0,0 +1,81 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import Yoga from 'yoga-layout';
test('new_layout_can_be_marked_seen', () => {
const root = Yoga.Node.create();
root.markLayoutSeen();
expect(root.hasNewLayout()).toBe(false);
});
test('new_layout_calculating_layout_marks_layout_as_unseen', () => {
const root = Yoga.Node.create();
root.markLayoutSeen();
root.calculateLayout(undefined, undefined);
expect(root.hasNewLayout()).toBe(true);
});
test('new_layout_calculated_layout_can_be_marked_seen', () => {
const root = Yoga.Node.create();
root.calculateLayout(undefined, undefined);
root.markLayoutSeen();
expect(root.hasNewLayout()).toBe(false);
});
test('new_layout_recalculating_layout_does_mark_as_unseen', () => {
const root = Yoga.Node.create();
root.calculateLayout(undefined, undefined);
root.markLayoutSeen();
root.calculateLayout(undefined, undefined);
expect(root.hasNewLayout()).toBe(true);
});
test('new_layout_reset_also_resets_layout_seen', () => {
const root = Yoga.Node.create();
root.markLayoutSeen();
root.reset();
expect(root.hasNewLayout()).toBe(true);
});
test('new_layout_children_sets_new_layout', () => {
const root = Yoga.Node.create();
root.setAlignItems(Yoga.ALIGN_FLEX_START);
root.setWidth(100);
root.setHeight(100);
const root_child0 = Yoga.Node.create();
root_child0.setAlignItems(Yoga.ALIGN_FLEX_START);
root_child0.setWidth(50);
root_child0.setHeight(20);
root.insertChild(root_child0, 0);
const root_child1 = Yoga.Node.create();
root_child1.setAlignItems(Yoga.ALIGN_FLEX_START);
root_child1.setWidth(50);
root_child1.setHeight(20);
root.insertChild(root_child1, 0);
expect(root.hasNewLayout()).toEqual(true);
expect(root_child0.hasNewLayout()).toEqual(true);
expect(root_child1.hasNewLayout()).toEqual(true);
root.markLayoutSeen();
root_child0.markLayoutSeen();
root_child1.markLayoutSeen();
expect(root.hasNewLayout()).toEqual(false);
expect(root_child0.hasNewLayout()).toEqual(false);
expect(root_child1.hasNewLayout()).toEqual(false);
root_child1.setHeight(30);
root.calculateLayout(undefined, undefined);
expect(root.hasNewLayout()).toEqual(true);
expect(root_child0.hasNewLayout()).toEqual(true);
expect(root_child1.hasNewLayout()).toEqual(true);
});

View File

@@ -27,7 +27,7 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-live": "^4.1.5",
"yoga-layout": "3.0.2"
"yoga-layout": "3.0.3"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.0.0",

View File

@@ -1,4 +1,4 @@
# Yoga documentation and playground
# Yoga legacy documentation and playground
This site uses [gatsby.js](https://www.gatsbyjs.org/) as static site generator. Which transforms all markdown and react code to static HTML and JS files.