Conversation
workflow: benchmarks/perfComparison of performance test results, measured in operations per second. Larger is better.
|
workflow: benchmarks/sizeComparison of minified (terser) and compressed (brotli) size results, measured in bytes. Smaller is better.
|
52d003a to
4d0f089
Compare
| } & ((value: V) => StyleXStyles); | ||
|
|
||
| type InlineCSS = { | ||
| [Key in keyof Properties<string | number>]: InlineValue< |
There was a problem hiding this comment.
It looks like everything in Properties is optional and the Required utility type can help.
| [Key in keyof Properties<string | number>]: InlineValue< | |
| [Key in keyof Required<Properties<string | number>>]: InlineValue< |
It would be cool if StyleXCSSTypes.js also used csstype or at least the same thing.
nmn
left a comment
There was a problem hiding this comment.
Good start, but a few changes are needed.
| if (typeof prop === 'string') { | ||
| return valueProxy(prop); | ||
| } | ||
| return undefined; |
There was a problem hiding this comment.
You can probably just throw here directly and not define valueProxy at all.
There was a problem hiding this comment.
Also, let's add Flow types to this and auto-generate the TS types from that.
| if (specifier.type === 'ImportNamespaceSpecifier') { | ||
| state.inlineCSSImports.set(specifier.local.name, '*'); | ||
| } else if (specifier.type === 'ImportDefaultSpecifier') { | ||
| state.inlineCSSImports.set(specifier.local.name, '*'); |
There was a problem hiding this comment.
ESM doesn't allow an arbitrary proxy for exports from a package. So maybe we ONLY allow a named or default import here?
I think limiting this to a named import makes the most sense right now.
| import * as css from '@stylexjs/inline-css'; | ||
| stylex.props(css.display.flex); |
There was a problem hiding this comment.
| import * as css from '@stylexjs/inline-css'; | |
| stylex.props(css.display.flex); | |
| import {css} from '@stylexjs/inline-css'; | |
| stylex.props(css.display.flex); |
packages/@stylexjs/babel-plugin/__tests__/transform-stylex-props-test.js
Outdated
Show resolved
Hide resolved
| module.exports = inlineCSS; | ||
| module.exports.default = inlineCSS; |
There was a problem hiding this comment.
I feel like it's rare at this point to see frontend code be published CJS-only. Could this be written in ESM and then use babel at build time to create a CJS version?
I have a similar nitpick about styleq but I see there is an open PR for that. One advantage is that it would make the @stylexjs/stylex rollup bundle slightly smaller.
4d0f089 to
fc6cd07
Compare
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
packages/@stylexjs/babel-plugin/__tests__/transform-stylex-props-test.js
Outdated
Show resolved
Hide resolved
| k1xSpc: "x78zum5", | ||
| $$css: true | ||
| }; | ||
| stylex.props(_temp, styles.opacity(0.5));" |
There was a problem hiding this comment.
Can you add a few more tests with this kind of pattern. I want to see what happens to inline styles when applied conditionally but stylex.props cannot be pre-compiled more.
Also, to validate the hoisting logic, can you make add some examples where the stylex.props() exists inside of a function and not the top level.
packages/@stylexjs/babel-plugin/__tests__/validation-stylex-create-test.js
Outdated
Show resolved
Hide resolved
fc6cd07 to
fb5a7ae
Compare
fb5a7ae to
2b1d063
Compare
- Rename package from inline-css to utility-styles - Update package.json, README, types, and source files - Update stylex package dependency and re-export
- utility-styles/babel-transform.js: transforms css.display.flex → { display: 'flex' }
- babel-plugin/stylex-props.js: compiles raw objects using styleXCreateSet
- No dependency on @stylexjs/shared refactor (uses ../shared)
- All 797 tests pass
- Rename package from @stylexjs/utility-styles to @stylexjs/atoms - Update all imports and references in babel-plugin - Update stylex package dependency and re-export - Fix type definitions to be compatible with stylex.props() - Update test descriptions and imports
- Fix TypeScript types: Atoms now uses mapped type over keyof CSSProperties with -? to remove optionality, so s.colorr errors and s.color doesn't require an undefined check - Fix state.inlineCSSImports → state.atomImports mismatch in babel-transform - Remove dead code: inlineCSSImports field, css named import checks, and unreachable atoms handling inside importSources guard - Rename INLINE_CSS_SOURCES → ATOMS_SOURCES throughout - Add compile-time CSS property validation respecting propertyValidationMode - Move VALID_CSS_PROPERTIES set to @stylexjs/shared for single source of truth - Remove circular dependency: stylex no longer depends on or re-exports atoms - Export CSSProperties from StyleXTypes.d.ts so atoms can import it - Document normalizeValue underscore-stripping behavior - Document compileRawStyleObjects scope
The gen-types tool (flow-api-translator) cannot handle runtime code with type annotations, causing build failures. Move the VALID_CSS_PROPERTIES set back into atoms/babel-transform.js directly and remove the @stylexjs/shared dependency from atoms.
2b1d063 to
10a7ed5
Compare
6aafaba to
8fc23f8
Compare
8fc23f8 to
672c256
Compare
672c256 to
08c99c7
Compare
|
(Edit: for those interested, I have a WIP PR where I thought I could get away with codegen-ing Fwiw when this PR is released, I'm hoping to port our truss "DSL on top of emotion" over to this/stylex, by doing things like (very proof-of-concept): // in our Css.ts file
class CssBuilder {
styles = {}
get df() {
return new CssBuilder({ ...this.styles, ...x.display.flex });
}
get aic() {
return new CssBuilder({ ...this.styles, ...x.alignItems.center });
}
get $() {
return this.styles;
}
}
export const Css = new CssBuilder();
// in a Component.tsx file
// use/write a `css` prop that calls `stylex.props(...)` on the hash from $
return <div css={Css.df.aic.$} />
// Hope that this is semantically the same as the PR's
return <div {...stylesx.props(x.display.flex, x.alignItems.center)} />With the admittedly naive hope/assumption that each Feel free to ignore me, but if you have any "that just might work" / "ofc that will obviously not work" / etc feedback, I'd appreciate it -- thank you! |
Implementation
Adding support for inline styles authoring with a new
@stylexjs/atomspackage. This allows you to write styles inline instylex.props()that are pre-compiled within the props visitor using much of thecreatelogic for static and dynamic styles.This is something we went back and forth on a few times, but ultimately felt that it's good to provide the optionality. We still recommend (and want to bake in enough friction) for people to use
stylex.createnamespaces for the majority of usecases for readability/maintainability reasons.The naming of all the above is up for discussion, as well as what styles we should build into this API. I'm also using
Propertiestype from estree for type checking for a first pass, but there might be something better we can use.Testing
Style types:
Tested within docs page the above +
Deferring to follow ups: