Repository navigation
fix(components): make the UI kit, theme helpers and reset-css behave for real users - #741
Merged
Merged
Conversation
…typed values Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…ore test order Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…i-kit-behavior # Conflicts: # packages/components/src/components/Checkbox/index.tsx # packages/components/src/components/Radio/index.tsx
…-behavior # Conflicts: # packages/components/src/components/Checkbox/index.tsx # packages/components/src/components/Select/__tests__/index.browser.test.tsx # packages/components/src/components/Select/index.tsx
…for real users Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…me cannot read as a style function Refs #692 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
|
…button by their content or the caller Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Merge main history while preserving this PR implementation. No manual conflict resolutions.
Refs #692; preserve theme listener cleanup and restored test globals Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #692 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 #692 (RT-07~RT-19, RT-27, RT-28)
이 PR은 열린 UI 키트 PR #720 #721 #723 #724 #725를 합친 통합 base 위에 쌓여 있습니다(merge 커밋 5개 + 고유 커밋
48fc98f2). 이 PR의 CI는main대상으로 도므로 diff에 위 PR들의 변경이 함께 보이고, #720 #721 #723 #724 #725가 먼저 병합되어야 합니다. 병합 충돌은 Checkbox(forwardRef+props.id우선 id)와 Radio(ref+ 올바른:focus-visiblesolid outline), Select(위치 effect + 키보드/포커스 effect를 둘 다 유지)에서 났고 양쪽 동작을 모두 보존하도록 풀었습니다. 병합 직후bun test5478 pass를 확인한 뒤에 고유 변경을 시작했습니다.요약
항목마다 통합 base에서 먼저 확인했고, 이미 고쳐진 것은 고치지 않고 아래에 적었습니다. 컴포넌트는 스타일링은 그대로 빌드 타임이고 동작 JS만 바뀝니다.
항목별 결과
base(#720 등)에서 이미 해결됨
onOpenChange(false)로 가고 제어형일 때는 내부 상태를 바꾸지 않습니다(fix(react,components): support React 18 peers and drop React 19-only APIs #720). 동작 계약(소유자에게 알림, 제어형 유지, 비제어형 닫힘, 내부 클릭 무시,openprop 추종)을 테스트로 고정했습니다.이 PR에서 수정
position: fixed인데 문서 크기와 비교하던 것을innerWidth/innerHeight(뷰포트)와 비교하고, 한쪽 inset을 쓸 때 반대쪽을 비웁니다. 아래/위/오른쪽 충돌과 resize 시 전환 테스트.SelectTrigger asChild: 자식onClick/onKeyDown을 열기 동작과 합성(자식 → 트리거에 준 핸들러 → 열기,preventDefault면 중단),className병합, 트리거의 상태 aria(aria-expanded등)가 항상 우선, 자식의aria-label은 유지, 자식 ref와 트리거ref를 합성(React 18/19 모두).SelectTrigger는forwardRef로 바뀌었습니다.value)은 알리기만 합니다.onClick/onChange는 합성되고(preventDefault면 중단)disabled/value/type은 불변 props가 뒤에 와서 경계 비활성화를 덮어쓸 수 없습니다. text 모드는 입력 전용 속성(type,readOnly,value,onChange)이 없는<output>으로 렌더링합니다.aria-label("button"/"input"/"textarea") 제거: 보이는 텍스트나 연결된<label>이 이름이 됩니다. 아이콘만 있는 버튼은 호출하는 쪽이aria-label을 줍니다. Input의 장식 아이콘은aria-hidden.ole=listbox인 컨테이너는 트리거를 ^Gria-labelledby로 가리키며(호출자가 준 트리거 id나 ^GsChild 자식의 id를 따라감), 호출자가 ^Gria-label/^Gria-labelledby를 주면 그것이 우선합니다. #725의 테스트 선택자는
ole/^Gria-haspopup으로 바꿨습니다.
{target:{value:''}}이벤트 대신 값을 비우고 실제input이벤트를 발생시켜 React가 진짜ChangeEvent를 만들게 합니다(제어형/비제어형 모두, 포커스 복귀). 소유자가 값을 유지하면 지워지지 않습니다.aria-invalid, 에러 메시지에id와role="alert", 컨트롤의aria-describedby에 사용자 값과 메시지 id 병합. 에러가 없으면 아무것도 주장하지 않습니다.inputBackground,inputDisabledBackground,inputDisabledText,inputPlaceholder,primaryBackground; TextareadisabledBackground,disabledText; Select 팝업--inputBackground). 키는 추가만 했고 기존 키는 그대로입니다. 컨테이너에서 변수를 상속하는지 테스트.aria-busy, 기본으로 비활성화되어 중복 활성화 불가(disableWhileLoading={false}로 끌 수 있음), 화면에 보이지 않는role="status"문구(loadingLabel, 기본 "Loading").ThemeScript:nonce를 포함한 표준 script props를 전달하고, 저장소/matchMedia읽기가 던져도 중단되지 않고 기본 테마를 설정합니다(생성된 스크립트를 실제로 실행해 검증).getTheme/setTheme/initTheme:document가 없으면(SSR) 아무것도 하지 않고(getTheme은null), 저장소 쓰기가 막혀도 현재 페이지에는 적용됩니다.setTheme로 명시한 선택)가 있으면 그것이 우선, 없으면auto일 때 시스템 설정을 따르고 변경도 따라갑니다. 다른 탭이 저장한 테마(storage이벤트)와 삭제도 따라갑니다.ThemeScript에 같은 리스너가 들어 있고,initTheme은 추종을 멈추는 함수를 반환합니다(반환 타입void→() => void, 기존 호출은 그대로 동작).clip: rect(0,0,0,0)추가. 실제 추출 CSS가 sanitize.css 13의 두 규칙과 같은지 테스트.bun-test-env-dom이 기본인 이 저장소 방식(happy-dom)을 따랐습니다.새로 생기는 오류
빌드 에러는 없습니다. 타입/동작 변경:
Button/Input/Textarea에 더 이상 기본aria-label이 없고, Input의 에러 메시지는aria-label="error-message"대신role="alert"로 조회됩니다(스냅샷/쿼리 갱신).남는 한계
SelectOption(aria-label="Select option")과SelectContainer("Select container")도 모든 옵션의 이름을 같은 문구로 덮어씁니다. RT-12와 같은 문제지만 #725의 설계와 기존 테스트가 이 라벨에 기대고 있어 이번에 건드리지 않았습니다.useId,forwardRef,version으로 ref 위치 판별).elementRef는 버전 인자로 두 분기를 모두 단위 테스트합니다.forwardRef,Context.Provider,useContext)에서 오며 기존 2개 외에 이 PR이 추가한 것은SelectTrigger의forwardRef하나입니다(React 18에서 ref를 받으려면 필요).검증
bun test5558 pass / 0 fail, 커버리지 100%.bun lint오류 0.cargo test --workspace,cargo fmt/clippy -D warnings(lint 스크립트 포함) 통과. Rust 변경 없음.packages/components,packages/react(ThemeScript, 테마 헬퍼),packages/reset-css. 체인지팩 Patch(components, react, reset-css).2026-10-08 업데이트: main 11790bef를 merge commit으로 병합했습니다; 충돌 파일: 없음; 충돌 없이 자동 병합했고, 이미 포함된 squash 원본은 조상 확인 후 ours 전략으로 중복 적용하지 않았습니다.
bf3c92b6(fix(extractor): preserve conditional-spread precedence in styled objects #776, test: restore global state and scoped spies #778)부터 최신76b1a150(fix(extractor): compile styled components in non-JSX source modules #777, feat(extractor): alias @emotion/css css, cx, keyframes and injectGlobal #716, feat(plugins): deterministic class and file numbering #743, fix: repair main tests, docs lint and Tailwind test isolation #780 포함)까지 두 부모 merge commita0418cc5로 병합했습니다. 유일한 충돌packages/react/src/utils/__tests__/init-theme.browser.test.ts에서 #741의 반환된 listener 정리 함수 실행과 main의 DOM data-theme·localStorage 원래 값 복원 및 테스트별 matchMedia spy의 try/finally 복원을 모두 유지했으며 광역 mock.restore는 되살리지 않았습니다. 새 WASM/루트 빌드·Rust 3,085개·Bun 5,994개(함수/줄 100%)·실제 DOM의 저장값 초기화/storage 변경/리스너 정지/명시적 테마 프로브·전체 훅이 통과했습니다. 기존 snapshot 변경·업데이트 자체의 새 build error·추가 한계 없음.2026-10-18 갱신: 갱신된 #723
f4aeeece→#72409e12da7→#7250ef74846를 순서대로 두 부모 merge commit49de18bc→c7369616→dfdf810898df0eea9e86a8468e0cdf0ffcd0f25c로 병합하고 각 부모 2개와 main3ca6182f포함을 확인했습니다; #724의 사용자 검토값outline: '2px solid $primary'를 그대로 보존했습니다; #723 병합의 충돌 Select/Stepperindex.browser.test.tsx.snap은 HEAD baseline에서 테스트로만 재생성해 Select 4개/Stepper 1개 항목의 class 공백 이동만 수용했고 정규화 비교로 DOM·속성·class 토큰 동일성을 확인했습니다; #725 병합의 Selectindex.tsx/browser test/snapshot 충돌은 #741의 viewport 충돌·반대 inset 초기화·단일 React18 위치 effect/정리·aria-labelledby/보이는 옵션 이름·asChild 합성과 #725의 focus/키보드/resize+고정 id를 모두 유지해 원래 #741 내용과 동일하게 해결했습니다(중복 구형 위치 effect 및 구형 generic aria-label 쿼리 재도입 없음); 새 Rust snapshot 후보·수동 snapshot 병합·build error·dependency는 없고 각 merge의 정식 hook이 통과했으며 최종 기본 stack/jobs=2/6GiB Rust workspace·fmt/clippy·fresh WASM/root 및 12GiB hook이 434.1초/peak 4,175,093,760 bytes로 통과했습니다(Bun 6,019개/0 fail/함수·라인 100%); 실제 React18 Chromium은 옵션 first/second의 generic aria-label 없음과 접근 가능한 고유 이름·트리거로 이름 붙인 listbox·키보드/포커스·native refs·두 label·토글·Stepper·1px solid focus 및 desktop/mobile 캡처를 확인해 #725에서 발견한 기존 옵션 이름 문제도 이미 승인된 #741의 RT-12 수정으로 해결됨을 검증했습니다.; 최종 headdfdf810898df0eea9e86a8468e0cdf0ffcd0f25c의 CI 39064574689는 5개 job 전체 SUCCESS이고 Linux Rust 100%(13464/13464), Bun 6019 pass/0 fail/함수·라인 100% 및 별도 preload 9 pass/0 fail을 확인했습니다.