Repository navigation
Conversation
…rations css(a, b) composing classes whose styles the build knows, bound to css() in the file or exported by another module, merges their atoms per property, selector, breakpoint and layer, conditions included, instead of joining classes whose winner the stylesheet order picked. vanilla-extract style([...]) passes each composed style as its own argument, keeping a style composed again later. Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…asurable Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…JSX spreads win Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…led order and JSX element className Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…uate shouldForwardProp at build time Refs #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…ring Refs #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #691 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #690 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
… and conditional styles Refs #690 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Contributor
Changepacks@devup-ui/wasm@1.0.83 → 1.0.84 - bindings/devup-ui-wasm/package.jsonPatch
@devup-ui/bun-plugin@1.0.22 → 1.0.23 - packages/bun-plugin/package.jsonPatch
@devup-ui/components@0.1.60 → 0.1.61 - packages/components/package.jsonPatch
@devup-ui/eslint-plugin@1.0.22 → 1.0.23 - packages/eslint-plugin/package.jsonPatch
@devup-ui/next-plugin@1.0.90 → 1.0.91 - packages/next-plugin/package.jsonPatch
@devup-ui/plugin-utils@1.0.17 → 1.0.18 - packages/plugin-utils/package.jsonPatch
@devup-ui/react@1.0.44 → 1.0.45 - packages/react/package.jsonPatch
@devup-ui/reset-css@1.0.31 → 1.0.32 - packages/reset-css/package.jsonPatch
@devup-ui/rsbuild-plugin@1.0.67 → 1.0.68 - packages/rsbuild-plugin/package.jsonPatch
@devup-ui/vite-plugin@1.0.73 → 1.0.74 - packages/vite-plugin/package.jsonPatch
@devup-ui/webpack-plugin@1.0.71 → 1.0.72 - packages/webpack-plugin/package.jsonPatch
|
Codecov Report✅ All modified and coverable lines are covered by tests.
🚀 New features to boost your workflow:
|
This was referenced Oct 2, 2026
Open
No conflicted files; preserve composition changes and main ESLint checks.
No conflicted files; combine updated parent and PR changes.
No conflicted files; combine updated parent and PR changes.
Conflicted file: libs/extractor/src/lib.rs. Retain both composition helper and regression tests from PR 706 and Tailwind per-class regression tests from main 11790be; take rewritten main Tailwind implementation with Rust 1.99 assertions. bun.lock regenerated by bun install; no snapshots were hand-merged. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Merge updated parent PR 706 (30247ba), containing main 11790be. Conflicted file: libs/extractor/src/prop_modify_utils.rs. Preserve PR 707's last-written className/style spread semantics and no spread_props parameter with capacity 2, together with main's per-class Tailwind compiler. No snapshots were hand-merged. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688 #707 #776 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688 #707 Keep the visitor unchanged at module scope so coverage analysis does not invent an uncovered nested declaration Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688 #710 #707 Retain inherited captures for withComponent and as in JSX and TypeScript renderers Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #691 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #691 #695 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #690 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #682 #695 #688 #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #682 #695 #688 #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #682 #695 #688 #689 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #690 (D 필수 — EMO-01, EMO-05 일부). #722 위에 쌓은 브랜치입니다(#706→#707→#710→#711→#722가 병합되면 차이는 커밋 하나).
문제
cssprop이 어떤 형태로도 컴파일되지 않았습니다.<div css={{ color: 'red' }} />는 그대로 남고 CSS가 나오지 않았습니다.@emotion/react/jsx-runtime으로 컴파일된 코드의jsx('div', { css })와css()결과를 넘긴css={style}도 마찬가지였습니다.@emotion/react의jsx가 런타임 의존성으로 남았습니다.수정
@emotion/reactalias가 켜져 있을 때)cssprop은 항상 컴파일합니다.@emotion/react나@emotion/styled(하위 경로 포함)를 import하거나@jsxImportSource @emotion/reactpragma가 있으면 모든 요소의cssprop을 컴파일합니다.@emotion/react/jsx-runtime·jsx-dev-runtime의jsx/jsxs/jsxDEV와@emotion/react의jsx/createElement호출도 같은 규칙을 따릅니다.include라이브러리의 컴파일된 코드도 포함됩니다.&&/||/??는 합성입니다. 뒤의 부분이 같은 속성·선택자·breakpoint·layer를 덮어씁니다(D1 정적 합성).css()클래스는 스타일로 합성합니다. 그 밖의 식별자와 멤버는 런타임 클래스로 붙입니다.css태그 템플릿의 mixin(${base};)은 그 자리에서 텍스트를 나눠 합성하고, 인라인css(...)호출은 인자를 합성 부분으로 펼칩니다.theme => ({ ... })는 값 위치의theme.a.b를var(--a-b)로 읽습니다. 구조 분해(({ colors }) => ...)와theme.space[2]도 읽습니다.px입니다. 최상위 상수에서 읽은 숫자도 같고,lineHeight같은 단위 없는 속성은 숫자로 둡니다.style에 넣습니다.className에 붙고, 변수는 기존style아래에 병합됩니다. 스프레드 위치에 따른className/style최종값(JSX-01 규칙)을 따릅니다.className에 파일이 아는css()클래스가 있으면 Emotion의 registered class처럼cssprop을 덮어씁니다.cssprop을 합성합니다.cssprop을 합성합니다. 조건은 태그를 렌더링하고 attrs·props 읽기·런타임 값이 없으며, 요소에 스프레드·as·forwardedAs가 없는 것입니다. 그 밖에는 스타일이 겹치지 않을 때className으로 넘깁니다.@emotion/react/jsx-runtime(dev 포함) import는react/jsx-runtime으로,@jsxImportSource @emotion/reactpragma는react로 바뀝니다.@emotion/react의jsx/createElement는@devup-ui/react/compat의jsx(ReactcreateElement)로 바뀝니다.@devup-ui/react/compat/css-prop이React.Attributes에css를 추가하고,compat/emotion이 이를 참조합니다.@emotion/react선언에jsx와createElement를 추가했습니다.clone_in이 바인딩 정보를 잃었습니다. 그래서css(a, b)의 부분이 읽는 바인딩(예: keyframes 이름)이 읽히지 않았습니다.clone_in_with_semantic_ids로 고쳤습니다.동작 변화
<div css={...}>가 이제 클래스로 컴파일됩니다. Emotion 신호가 없는 파일의 사용자 컴포넌트(<Custom css={...}>)는 이전처럼 그대로 둡니다.<Box css>는 이전에 객체만 우연히 중첩 스타일로 처리되었습니다. 이제 위 규칙(합성,px, CSS 텍스트)을 따릅니다.css(yellow, fade)처럼 합성 부분이 아는 바인딩을 읽으면 그 값이 클래스 문자열에 들어갑니다. 런타임 결과는 같으며, 기존 테스트 1건의 기대값을 갱신했습니다.새로 생기는 오류
모두
파일:줄:열, 코드, 원인, 해결 방법을 함께 보여 줍니다.cssprop 부분(호출, JSX 요소, 스프레드 등).let/var로 선언한 스타일 객체·배열·함수·텍스트를 부분으로 사용. 인라인으로 쓰거나 최상위const로 선언하도록 안내합니다.theme을 읽음(theme.spacing(2),theme.colors[key], 조건 등).styled(Component)(...)로 옮기도록 안내합니다.남는 한계
props.className등)와의 우선순위는 CSS 특성을 따릅니다(K 문서화).className과style을 모두 전달해야 합니다(D8, K 문서화).jsxImportSource만으로 Emotion을 쓰는 파일은 신호가 없어 사용자 컴포넌트를 컴파일하지 않고, 번들러가 Emotion JSX 런타임을 import합니다. tsconfig를 읽는 후속 PR에서 처리합니다.hasDevupUI게이트는 alias를 모릅니다(H 범위).cssprop 객체의 속성 배열 처리를 확인해야 합니다.확인
cargo clippy -D warnings(Rust 1.99),cargo test --workspace(extractor 1463건) 통과.bun test5475건 통과, 커버리지 100%.bun lint통과.css-prop-*12개를 probe로 확인했습니다.@types/react)에서cssprop 타입 검사를 확인했습니다.2026-10-08 main 11790bef를 병합하여 업데이트했습니다. 충돌 없이 갱신된 부모 PR의 변경과 main의 변경을 모두 보존했습니다.
2026-10-15 갱신: 부모 #722 5ef8d41 및 포함된 main 76b1a15059d3d1b26c8ac20bb622a36cc937a7a4을 병합했습니다. 충돌 파일 lib.rs, visit.rs, packages/react/src/compat/index.ts는 CSS prop 기능과 부모의 namespace 변환·실제 target·forwardRef·필터링을 함께 보존했고, 캡처가 남는 고정 native 컴포넌트는 원래 render/closure를 유지한 채 빌드가 완성한 class만 비공개 prop으로 전달하도록 통합했습니다. 키 예약은 원본 식별자·JSX 이름·정적 객체/멤버 키 및 문법 래퍼까지 회피하며 비공개 prop은 DOM 전달 전에 제거됩니다. emotion_css_prop_on_every_element.snap은 부모의 TS용 JSX helper 출력만 다시 생성해 수용했으며 CSS/스타일 집합은 그대로입니다. import_alias_visit.rs의 불필요한 borrow도 제거했습니다. 새로 생기는 오류 없음.
병합 검증 추가
겹치는 color를 CSS prop의 blue로 정적으로 교체해도 원래 캡처 callback은 매 render마다 실행됩니다:
등록된 호출자 class가 전체 color atom을 덮는 경우에도 빈 비공개 class를 명시적으로 전달하므로 green 기본값이 되살아나지 않습니다:
2026-10-16 갱신: 확정 main a6ecc125를 포함한 갱신된 #722 50c98563를 병합했습니다. 충돌 파일 visit.rs/emotion.d.ts는 CSS-prop/private-slot 관련 기존 helper와 main compile_cva를 합치고 CacheProvider 및 jsx/createElement를 모두 보존하여 해결했습니다. 자동 병합된 vanilla_extract.rs/dead_properties/origin.rs 두 호출부는 기존 alias 결과의 code/edits 필드를 그대로 받도록 Aliased 구조체 API에 기계적으로 맞췄습니다. 두 부모 2002f72/50c98563 확인, 새로 생기는 오류 없음.
main #717의 raw Emotion 배열은 CSS fallback이며 Devup responsive 배열과 다릅니다. coordinator 승인 후 fresh 공개 WASM의 TSX/TS × raw/등록된 Devup css 네 경우를 먼저 검증했습니다. 기존 responsive 테스트는 등록된 direct-Devup css 결과를 입력하도록 고치고 관찰 코드와 모든 기존 assertion은 바이트 비교로 그대로 보존했으며, 원래 raw 입력은 별도 fallback 회귀로 추가했습니다. 이 과정은 production 정책/renderer/guard를 바꾸지 않습니다. 생성된 emotion_css_prop_on_every_element 스냅샷 한 개만 재생성 결과 그대로 승인했습니다(assertion_line만 제거): Wide의 aliased margin:[1,2]가 level0 margin:1px;margin:2px fallback이 되고 기존 level1 margin8px가 없어지며 class 번호만 결정론적으로 이동합니다. forwardRef/props 필터 구조와 나머지 스냅샷은 그대로입니다.
기본 스택/CARGO_BUILD_JOBS=2/전체 트리 6 GiB에서 focused 17개, 정상 Rust workspace 4,441개/실패 0개, fmt 및 Rust 1.99 all-target Clippy(-D warnings)가 통과했습니다. fresh WASM/root build 후 실제 WASM/React 82개 검증(부모 20개+CSS-prop 40개+wrapped-key 18개+배열 의미 4개)이 통과했습니다. 이 중 부모 20개와 CSS-prop 40개는 실제 SSR을 포함하며, ref는 값/identity 전달을 확인한 것이고 DOM 부착을 주장하지 않습니다. 혼합 렌더의 캡처 평가·빈 문자열 slot 대체·등록 class 우선순위·동적 CSS 변수/inline style·원래 key 보존·private slot 비누출을 확인했습니다.
전체 commit hook은 기본 스택/12 GiB 한도로 통과했습니다(460.422초, 전체 Job 피크 3.379 GiB). 기존 React 마이그레이션 경고 9개/새 오류 0개, Bun 5,910개/실패 0개/함수·라인 커버리지 100%입니다. Windows Rust coverage 97.87%(19381/19803)는 Linux 100% 증거로 쓰지 않으며 새 head CI에서 별도 확인합니다. 최초 hook의 export 정렬/CRLF 오류는 emotion.d.ts만 ESLint 정리 후 새 commit 시도로 해결했습니다. LSP는 기존 미설치/daemon timeout으로 사용 불가이며 clean으로 주장하지 않습니다. 커밋 후에도 WASM/root build를 다시 통과했습니다. 새 head 76a1796a의 Linux CI 확인은 아래 별도 덧붙입니다.
실제 WASM/공개 API 검증 출력:
2026-10-16 CI 확인: head 76a1796a4c2276a2e9865b49bdea518dd485d5c8의 run 38859790488은 모든 job 및 Codecov가 통과했습니다. publish job 116839231289 실제 로그에서 Linux Rust 100.00% coverage, 13856/13856 lines covered, Bun 5910개/실패 0개/전체 커버리지 100%를 확인했습니다. 확정 main a6ecc12 포함 및 현재 merge 상태는 최신 PR audit로 재확인했습니다.