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>
…h Emotion Refs #690 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>
…ed parameters Refs #690 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 #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…e runtime Refs #688 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…ins and inline css() by styles Refs #688, #690 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…ClassNames cx calls, read style functions of props Refs #690, #695 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #690, #695 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #688, #690 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>
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:
|
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>
Merge updated parent PR 727 (12328b9), containing main 11790be. Conflicted file: packages/bun-plugin/src/plugin.ts. Preserve PR 728's readJsxImportSource alias discovery and main PR 703's compiledPackages scanner, Bun.build stylesheet deferral, runtime writes and debug policy; keep main PR 704 plugin CSS behavior. WASM/root builds and real Bun stylesheet regression passed; no snapshots were hand-merged. 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 #688, #690, #695, #685 (정적으로 읽을 수 있는 합성의 남은 한계).
이 브랜치는
main기반이며 #736과 #745의 커밋을 모두 포함합니다. 두 PR과 그 선행 의존성(#740은 이들을 통해 전이적으로 포함)이 먼저 병합되어야 하고, 이 PR은 #736과 #745 뒤에 병합해야 합니다. 자동 병합은 사용하지 않습니다.요약
jsx(UI['Child'], ...))의cssprop에서 named import와 같은 경로로 읽습니다.css, 정확히 읽을 수 있는 배열 spread를 클래스 문자열이 아니라 스타일 단위로 합성합니다. 알려진 mixin은 중첩 선택자,@media,@layer안에서도, 조건으로 고른 경우에도 D1로 합성합니다.?:,&&,||,??)를 속성별 조건으로 컴파일합니다.||는 falsy,??는 nullish 기준을 그대로 따릅니다.rest,style,className등)과 충돌하지 않습니다.const에 묶인 styled 콜백(화살표/function)을 함수 실행 없이 인라인 콜백과 같이 읽습니다.@layer블록을 객체'@layer'와 같은 레이어 메타데이터로 읽습니다 (Refs [전수조사/E] CSS 생성 정확성: 순서, layer, theme, 유효하지 않은 CSS #685).Patch입니다.동작
합성은 D1입니다. 속성 + 선택자 + 브레이크포인트 + 레이어가 같으면 뒤의 선언이 이기고, 다른 선택자/반응형 단계/레이어의 선언은 남습니다. props의
className이나 외부 클래스처럼 런타임만 아는 합성은 기존대로 CSS 캐스케이드를 따릅니다.Namespace 컴포넌트
${UI.Child},[UI.Child],<UI.Child css={...}>, 컴파일된jsx(UI['Child'], { css })가 같은 정의에 도달합니다. 이름 문자열이 아니라 실제 import 바인딩을 읽으므로 같은 이름의 매개변수는 import 정의로 바뀌지 않습니다. type import, 없는 export, 동적 멤버는 값 정의가 되지 않습니다.공개 WASM API로 컴파일한 뒤 SSR한 결과는
<span>이고 색은blue하나만 남으며, 기반의padding은 유지됩니다(게이트 2). namespacecssprop의 실제 SSR 출력:알려진 mixin과 모듈 계산
다른 모듈의 알려진 정의도 합성합니다.
probe-imported-known.log의 실제 출력(B정의의 원문 줄 그대로, 4줄 모두):같은 로그의 CSS 중 이 파일의 원자 규칙(테마
@layer t앞부분은 생략):중첩 레이어 안의 mixin과 조건 mixin:
Layered는 색이blue하나이고padding은 레이어가 붙은 클래스로 남습니다.Conditional은on이 true/false 모두 색이blue이며padding은on일 때만 붙습니다(게이트 3).정확한 계산(
scaled(2)등)은 기존 Boa의 닫힌 계산 필터로만 읽습니다. 모듈 전체나 알 수 없는 효과는 실행하지 않습니다.전체 규칙 조건
두 컴포넌트 모두
on이면red, 아니면blue입니다(게이트 5; 이 게이트는 색 단언만 기록하며 HTML 원문은 남기지 않았습니다).선택되지 않은 분기와 분기에 없는 속성은 앞의 스타일을 지우지 않습니다. 아래는 위
Or/Nullish의 출력이 아니라, 수동 QA의 별도Toggle픽스처(&&조건으로 규칙 전체를 고르는 경우)의 실제 SSR 출력으로, 꺼진 분기에서 앞의blue와padding이 유지됨을 보여줍니다:원래 함수가 읽는 props는 변환 전에 기록하여 기본 DOM 전달 정책에서
on같은 스타일 입력이 요소로 새지 않게 합니다.함수 안의 구조, 이름 위생, 평가 시점
rest/style/className으로 이름 붙인 지역 값도 생성 코드의 구조 분해 이름과 충돌하지 않고purple이 렌더링됩니다(게이트 1). 희소 배열의 빈 칸은 건너뜁니다(게이트 6). 값은 원래 데이터 경로에서 한 번만 읽습니다:평가 시점은 원래 JS와 같습니다. 나중에 호출되는 콜백 안에서 뒤에 선언된
const를 읽는 것은 정상이고, 즉시 호출(IIFE)로 TDZ에 걸리는 코드는 위치가 있는 빌드 오류입니다(게이트 7).변수에 바인딩된 styled 콜백
const rules = p => ({ ... }); styled.div(rules)처럼 모듈/지역의 읽기 전용const에 묶인 화살표·function 콜백을 인라인 콜백과 같은 경로로 읽습니다. 함수를 실행하거나 모르는 구조를 추측하지 않고 선언만 정적으로 따라갑니다. 캡처한 이름은 어휘 위생을 지켜 원래 공개 export와 live binding을 그대로 둡니다. 숫자 단위(Emotion px, native 간격 배율)는 사용하는 곳마다 라이브러리 정보로 정하며, 콜백 초기화 식을 전역으로 고쳐 쓰지 않고 매개변수와 데이터로 쓰는 값도 바꾸지 않습니다.callback-units-green의 실제 SSR 출력(같은 규칙의 nativestyled는p:3이12px):리뷰에서 고친 네 가지
기능 리뷰가 찾은 문제를 고쳤고, 각각 회귀 테스트가 있습니다.
libs/extractor/src/local_shape_hygiene_w27_tests.rs,bound_callback_alias_tests.rs.libs/extractor/src/bound_callback_export_tests.rs.||/??피연산자의 Emotion px. 규칙을 담는 양쪽 피연산자가 모두 px가 됩니다.&&의 왼쪽은 조건으로 남고, 매개변수/기본값/데이터 인자는 바꾸지 않습니다. 회귀:libs/extractor/src/import_alias_visit.rs,bound_callback_numeric_tests.rs,numeric_context_w27_tests.rs. 추가 전체 추출 회귀 24건은 생성된 클래스 선택을 실제로 평가하여 Emotion/styled-components의3px/4px, native의12px/16px와 단위 없는 값/0/커스텀 변수를 비교합니다.undefined의 전체 규칙. 실제 전역undefined,void 0,null은 빈 규칙이지만, 같은 이름의 지역/가린 바인딩이 빌드가 알 수 없는 규칙 구조이면 원래 콜백 위치의 빌드 오류입니다. 스칼라 값은 CSS 변수로 남고, 도달할 수 없는 분기는 건너뜁니다. 회귀:libs/extractor/src/extractor/w27_props_rule_choices_regressions.rs.CSS 텍스트의 레이어 (Refs #685)
probe-layers.log의 실제 출력:같은 로그의 CSS 중 테마
@layer t블록 뒤의 컴포넌트 레이어 부분 전체(원문은 한 줄이며, 가독성을 위해 최상위@layer블록 경계에서만 줄을 나눴고 문자는 바꾸지 않았습니다):composed의 클래스 목록에서base의red는 뒤의blue로 대체되고(시트에는.color-0-red-_at_layer_s_base-255규칙이 남아 있지만 위composed클래스 목록에는 붙지 않습니다)other의green은 남습니다. 중첩은base.reset이 되며, 동적 CSS 변수에도 레이어가 유지됩니다. 레이어 이름은 텍스트/객체가 같은 CSS 식별자 검증과 정규화를 쓰고, escaped dot과 중첩 dot을 구분합니다. 레이어 순서는globalCss에 선언합니다. 레이어 이름이 데이터로만 쓰이는 객체(data['@layer'].inherit)는 스타일 규칙으로 오인하지 않으며 콜백은 한 번만 호출됩니다(게이트 4).새로 생기는 오류
모두
파일:줄:열, 문제가 된 코드, 필요한 조건을 담은 빌드 오류입니다.globalCss텍스트의 순서 선언과 익명 레이어 처리는 그대로입니다.@media/@layer안에 넣으면, 그 mixin이 감싸는 선택자/media/레이어 문맥을 함께 가져야 한다는 위치 있는 오류를 냅니다. 알려진 mixin은 위처럼 합성됩니다.callback-final):undefined를 빌드가 알 수 없는 전체 규칙 구조로 쓰면 원래 콜백 위치의 오류입니다(전역undefined/void 0/null은 그대로 허용).cssprop이 합성할 수 없는 조건으로 기반 스타일을 덮으면 named import와 같은 기존 overlap 오류를 냅니다.남는 한계
styled(Link), 런타임 컴포넌트 팩터리, 빌드가 읽을 수 없는 모듈/외부 클래스, 런타임에만 선택되는 전체 규칙 키는 정확한 정의를 만들 수 없습니다. 외부 클래스와 props의className합성은 CSS 캐스케이드를 따르고, 알 수 없는 규칙 구조는 빌드 오류입니다.fix/emotion-fallback-arrays,main기반, EMO-15)이 Emotion/styled-components/vanilla-extract의 property-array를 브라우저 fallback으로 고칩니다. 이 PR은 그 작업을 중복하지 않으며, 두 스택이 병합된 뒤 결합 동작을 확인합니다. 브레이크포인트 보존 테스트는 의도에 맞게 native@devup-ui/react를 사용합니다.styled(tag, styles)의 공개 계약은 기존대로 객체만 받습니다. 이 PR은 타입이나 API를 넓히지 않습니다.검증
최종 Linux CI 37201011483 성공 (HEAD
ab459f82c29227fbec348c0ea8f2374db7dafec0). 네 job 모두 success:benchmark111432518222,publish111432518305,landing-next-e2e111432518313,vinext-rsc-css-e2e111432518330. Codecov/patch도 success입니다.--fail-under 100: 100.00% (13283/13283). 첫 실행의 미커버 16줄은 모두 닫혔습니다. 변경하지 않은 파이프라인 파일composition.rs도 117/117로 추가 확인했습니다.main과 병합한 커밋을 실행하기 때문입니다. bun-plugin preload 회귀 6 pass, 0 fail.publish의 landing E2E: 기본 130 passed,singleCss130 passed.변경한 Rust 파일 53개의 Linux 커버리지 (경로는
libs/extractor/src/기준)git diff --name-only 743e59a5 HEAD -- libs/extractor/src의.rs53개입니다. 35개는 publish 로그의|| 파일: covered/total행이 있고 모두 covered = total입니다. 나머지 18개는 테스트 전용 모듈이라 tarpaulin이 파일별 행을 내지 않으므로 N/A로 적습니다(100%로 추정하지 않으며 제외 설정은 추가하지 않았습니다).아래는 로컬 결과와 이력입니다.
Choice, color,Choice, getColor이름 유지 확인), 콜백 숫자 단위 4/4(Emotion3px, native12px,lineHeight2), 기존 게이트 7/7, 바인딩 콜백 7/7, 수동 QA 16건. 위 코드/CSS/오류 발췌는 이 실행들의 실제 출력입니다. live binding은 Rust 테스트로 따로 확인했습니다.cargo test --workspace2882개(extractor unit 2166개와 integration 3개 포함) 0 fail,INSTA_FORCE_PASS없이 실행.cargo check --workspace도 통과했습니다.-D warningsexit 0,cargo fmt검사 통과, lint 오류 0(베이스부터 있던 경고 2개만), Bun 테스트 5491개 0 fail.bun lint, LLVM tarpaulin,bun test)을 각각 통과한 논리 커밋 4개:c0a88f2d숫자 논리 피연산자,aaae7acf합성·캡처 파이프라인과 직접 회귀,a3ea3a20Patch changepack,ab459f82미커버 16줄 회귀 보강. 훅을 생략하지 않았습니다.--fail-under 100에 실패했습니다. 뒤의 Bun 테스트는 실행되지 않았으므로 Linux Bun 결과로 주장하지 않습니다.benchmark,landing-next-e2e,vinext-rsc-css-e2e는 모두 성공했습니다. 실제 미커버 분기 16줄을 겨냥한 회귀 47건을 보강해 로컬에서 모두 통과했습니다. 방문자의 spread 선검사 뒤 도달할 수 없던 중복 arm만 제거했고, 함수형 최상위 opaque class callback 경로는 실제로 도달하므로 그대로 두고 회귀로 검증했습니다. 커버리지 제외, 스타일링 런타임, 새 의존성, 커리하지 않은 API 확장은 없습니다.ab459f82는 정상 전체 훅을 통과해 푸시했고, 후속 Linux CI 37201011483이 위와 같이 성공했습니다.2026-10-08 main 11790bef를 병합하여 업데이트했습니다. 충돌 없이 갱신된 부모 PR의 변경과 main의 변경을 모두 보존했습니다.