Skip to content

StyleX adds logical properties classes when it should not #796

Open
@zaydek

Description

Describe the issue

Related to #752.

This was very confusing for me to discover. I believe StyleX has a bug when replacing logical properties.

See the following code for example:

import * as stylex from "@stylexjs/stylex";
import { CSSPropertiesWithExtras } from "@stylexjs/stylex/lib/StyleXTypes";

const styles = stylex.create({
  idea: (args: { width?: CSSPropertiesWithExtras["width"] }) => ({
    width: args.width,
  }),
});

export function Idea() {
  return (
    <div {...stylex.props(styles.idea({ width: 64 }))}>
      <div {...stylex.props(styles.idea({}))}>Hello</div>
    </div>
  );
}

Output (this is correct)::

<div class="idea__styles.idea width-x1bl4301" style="--width: 64px;">
  <div class="idea__styles.idea">Hello</div>
</div>

Now see what happens when we use inline-size instead of width:

import * as stylex from "@stylexjs/stylex";
import { CSSPropertiesWithExtras } from "@stylexjs/stylex/lib/StyleXTypes";

const styles = stylex.create({
  idea: (args: { inlineSize?: CSSPropertiesWithExtras["inlineSize"] }) => ({
    inlineSize: args.inlineSize,
  }),
});

export function Idea() {
  return (
    <div {...stylex.props(styles.idea({ inlineSize: 64 }))}>
      <div {...stylex.props(styles.idea({}))}>Hello</div>
    </div>
  );
}

Output (I believe this is incorrect):

<div class="idea__styles.idea width-x1avlqir" style="--inlineSize: 64px;">
  <div class="idea__styles.idea width-x1avlqir">Hello</div>
                                ^^^^^^^^^^^^^^
</div>

When using logical properties, it looks like StyleX is adding the class when it should not, because in this case inlineSize is undefined and therefore the class should be omitted altogether. This was causing me a lot of problems because it took me a while to figure out it seems to be a side effect of logical properties and not all properties.

I'll try disabling styleResolution: 'legacy-expand-shorthands' and see if this problem goes away on its own.

Expected behavior

See above

Steps to reproduce

See above

Test case

No response

Additional comments

No response

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions