Skip to content

Conversation

@timok1m
Copy link
Contributor

@timok1m timok1m commented Jan 6, 2026

Self Checklist

  • I wrote a PR title in English and added an appropriate label to the PR.
  • I wrote the commit message in English and to follow the Conventional Commits specification.
  • I added the changeset about the changes that needed to be released. (or didn't have to)
  • I wrote or updated documentation related to the changes. (or didn't have to)
  • I wrote or updated tests related to the changes. (or didn't have to)
  • I tested the changes in various browsers. (or didn't have to)
    • Windows: Chrome, Edge, (Optional) Firefox
    • macOS: Chrome, Edge, Safari, (Optional) Firefox

Related Issue

Summary

V3 베지어 토큰을 추가하고, 베지어 컴포넌트에서 사용하는 토큰을 모두 V3로 마이그레이션합니다.

Details

  • 새로운 디자인 시스템 정의를 위해 토큰 시스템을 재정의하여 V3 토큰을 추가합니다.
  • 베지어 컴포넌트들이 사용하던 토큰을 V3로 마이그레이션 했습니다.
  • stylelint-bezier나 베지어 컴포넌트의 props type에서는 V3 토큰도 함께 허용하도록 확장하여 하위호환성을 유지하여 마이너 버전을 배포합니다.

Breaking change? (Yes/No)

No

References

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • V3 베지어 토큰 추가 및 모든 컴포넌트에서 사용 가능하도록 업데이트
    • 새로운 토큰 기반 스타일링 시스템 지원
    • 베타 토큰 프로바이더 추가로 향상된 테마 관리 지원
  • 개선 사항

    • 디자인 토큰 네이밍 시스템 정규화
    • 컴포넌트 컬러 및 스타일링 토큰 일관성 개선
    • 토큰 참조 검증 및 빌드 프로세스 강화

✏️ Tip: You can customize this high-level summary in your review settings.

timok1m and others added 27 commits December 18, 2025 16:42
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
토큰 V3 마이그레이션을 위해 프리릴리즈 모드로 진입합니다.

## Details

<!-- Please elaborate description of the changes -->
- #2578 를 참고하여 프리릴리즈 모드에
진입합니다.
- 작업 내용은 위 PR과 동일하되, beta 브랜치를 사용합니다.
- 기존 alpha 브랜치는 작업을 진행하다 pending 된 상태로 보여져서 우선 새 브랜치에서 작업합니다.
- 추후 토큰 마이그레이션이 모두 완료된 이후 두 브랜치를 모두 정리합니다. 

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->

V3 토큰을 추가합니다. 기존 토큰과의 구분을 위해 `--beta` 프리픽스와 함께 제공합니다. 

## Details

<!-- Please elaborate description of the changes -->
- 지금 PR을 기준으로 베지어 토큰은 총 3개의 버전을 가지고 있습니다.
  - v1: stable 토큰으로, 별도의 프리픽스 없이 제공되는 토큰
- v2: alpha 프리픽스와 함께 제공되는 토큰으로, 디자인 시스템 개편을 위해 일부 도입된 바 있으나 현재 잠정 중단된 상태
- v3: beta 프리픽스와 함께 제공되는 토큰으로, v1과 v2를 deprecated 처리하고 시스템 내에서 사용하는 토큰을
v3로 통일하고자 합니다.
- 프리릴리즈 시점에는 v1, v2 deprecated 없이 v3 토큰만 추가하기 때문에 breaking change가 없습니다.
- 이후 PR에서는 bezier-react 등 타 패키지들에 대해서 v3 토큰으로 마이그레이션을 진행할 예정입니다. 

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Add v3 tokens with --beta prefix
([#2733](#2733)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
stylelint-bezier가 v3 토큰도 커버할 수 있도록 추가합니다. 

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
bezier-react, bezier-figma-plugin 내부에서 사용하고 있는 스타일 토큰을 v3 토큰으로 마이그레이션
합니다.

## Details

<!-- Please elaborate description of the changes -->
- codemod를 사용하지 않고 마이그레이션 테이블을 생성한 뒤 cursor로 일괄 작업했습니다. (비슷한 형태로 스크립트
작성)
- v1, v2, v3 토큰이 존재하는 상태에서 bezier-react 내에서 사용하는 토큰을 모두 v3로 교체한 뒤 patch
업데이트 진행할 예정입니다.
- 마이그레이션이 모두 완료되었을 때, v1 과 v2 토큰을 모두 제거(deprecated) 시키고 major 버전을 업데이트
합니다.
- 우선 현재 시점에는 프리릴리즈로 테스트 합니다.

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->

No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Migrate style tokens to beta tokens
([#2737](#2737)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

- Update stylelint to cover v3 token
([#2735](#2735)) by
@timok1m

## [email protected]

### Patch Changes

- Migrate style tokens to beta tokens
([#2737](#2737)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…d config (#2738)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
- #2737 작업에서 불필요하게 추가된 md
파일을 제거합니다.
- 또한 로컬 테스트를 위해 `rollup.config.mjs`에서 `nodeExternals.deps`를 true로 변경했던
것을 리버트 합니다.

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary
- #2738 의 작업 내용을 반영하여 새
버전을 퍼블리시 하기 위해 changeset을 추가합니다.

<!-- Please brief explanation of the changes made -->

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Fix build configuration to include all dependencies used by
bezier-react. Revert incorrect changes that were committed during
testing and redeploy.
([#2740](#2740)) by
@timok1m

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…issions during development (#2742)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [ ] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [ ] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [ ] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [ ] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [ ] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
- 마이그레이션 시 편의를 위해 v3 토큰만을 허용하도록 변경합니다.
- 이를 통해 누락된 v1, v2 토큰 사용처를 쉽게 판별할 수 있습니다. 

## Details

<!-- Please elaborate description of the changes -->
- 0.2.11-beta.2 버전이 이 변경 사항을 포함하게 됩니다.
- 0.2.11-beta.1 버전은 v1, v2, v3 토큰을 모두 유효한 토큰으로 판단하는 버전입니다.
- 최종적으로는 major 버전이 업데이트 되고, beta 프리픽스를 제거한 상태로 코드가 정리되어야 합니다. 

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
Yes
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Restrict stylelint-bezier to validate only v3 tokens to detect
migration omissions during development.
([#2742](#2742)) by
@timok1m

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
- 다크모드에서 일부 컬러 토큰이 잘못 정의된 경우를 확인하고, 이를 수정합니다.

## Details
- text-success: cobalt.200 → cobalt.300
- text-warning: warning.200 → warning.300

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
#2744)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
StartsWithPrefix 타입에서 exact match 도 처리하도록 수정합니다.

## Details

<!-- Please elaborate description of the changes -->
- v2 토큰 시스템에서는 prefix 로 시작함과 동시에 해당 문자열이 그대로 토큰 네이밍인 경우가 있습니다.
- `--beta-color-surface`가 그 예시입니다.
- 기존 StartsWithPrefix 타입은 `${prefix}-*`에 대해서만 처리하고 있으므로
`--beta-color-surface` 토큰이 누락되는 문제점이 발생합니다.
- 새로운 토큰 시스템 상 토큰 네이밍 depth가 항상 일정하다는 보장이 없습니다. (`color-text-neutral`,
`color-text-neutral-heavy` 와 같은 형식)
- StartsWithPrefix에서 기존 동작에 더해 `${prefix}` exact match도 처리하도록 로직을 수정합니다.

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary
bezier-react가 beta 토큰을 export 하도록 수정합니다.
<!-- Please brief explanation of the changes made -->

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Modify bezier-react to exports beta-tokens
([#2747](#2747)) by
@timok1m

- Update StartsWithPrefix to include both prefix-\* and exact prefix
matches, enabling 'surface' token to be properly typed in
SurfaceSemanticColor.
([#2744](#2744)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Update dark mode colors for text-success and text-warning.
(text-success: cobalt.200 → cobalt.300, text-warning: warning.200 →
warning.300)
([#2745](#2745)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
`betaTokenCssVar` 를 통해서 토큰 이름을 변환할 때 `--beta-color-surface` 이름이
`--surface`로 잘못 변환되는 문제를 수정합니다.
## Details

<!-- Please elaborate description of the changes -->
- #2744 에서 type에 대한 수정을
진행했습니다. utils 쪽에서도 동일한 문제가 있어 이를 수정합니다.
- `betaTokenCssVar`에서 surface 컬러 토큰에 대한 처리가 가능하도록 로직을 수정합니다. \
- 관련 테스트 코드를 추가했습니다.
### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
beta-tokens에서 export 하는 타입이 tokens에서 export 하는 타입 이름과 중복되어 confict 나는
문제를 해결합니다.
## Details

<!-- Please elaborate description of the changes -->
- beta-tokens에서 export 하는 타입에 'beta' 프리픽스를 추가합니다.
### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [ ] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [ ] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [ ] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [ ] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [ ] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
- 디자인팀과 논의하여, %를 나타내는 `-p` 토큰을 일부 제거합니다.
- `opacity-disabled` 에서 사용하는 40-p를 제외하고 `42-p`, `100-p`를 제거합니다. 

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
beta 토큰이 추가됨에 따라, 사용처에서 beta 토큰을 사용할 수 있도록 token provider와 커스텀 훅을 추가합니다.

## Details

<!-- Please elaborate description of the changes -->
- `BetaTokenProvider`를 생성하고 `AppProvider`, `ThemeProvider`에
`BetaTokenProvider`를 추가합니다.
- `useBetaTokens`를 추가합니다.
- 사용처의 코드를 마이그레이션 합니다.

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
Avatar, AlphaAvatar 컴포넌트에서 사용하는 radius를 token based 에서 하드 코딩된 스트링으로
변경합니다.
% 단위의 토큰을 관리하는 기능을 피그마에서 제공하지 않기 때문에, 해당 토큰을 활용하는 케이스를 최소화 합니다.

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Add beta prefix to beta-tokens types to resolve naming conflicts
([#2750](#2750)) by
@timok1m

- Add BetaTokenProvider, useBetaTokens and migrate the codebase.
([#2751](#2751)) by
@timok1m

- Fixes the issue where backgroundColor="surface" was generating
incorrect CSS variable name.
([#2748](#2748)) by
@timok1m

- Replace useTokens().global.radius usage with individual '42%' styling
in avatar components
([#2753](#2753)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Remove unused 42-p, 100-p dimension tokens
([#2752](#2752)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
사용처에서 beta-tokens의 필요한 타입을 바로 import 해서 사용할 수 있도록 namespace를 제거합니다.
## Details

<!-- Please elaborate description of the changes -->
- 마이그레이션 용이성을 위해 기존 tokens의 타입을 쓸 때와 동일하게 namespace 없이 타입을 가져올 수 있어야
합니다.
- 이를 위해 beta-tokens에서 export 하는 타입 이름에 Beta 프리픽스를 추가했습니다.
  - #2750 
### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Remove BetaTokens namespace to allow direct use of required types
([#2754](#2754)) by
@timok1m

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…2756)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary
v3 토큰 이름에서 'beta' 프리픽스를 제거하고, bezier-react에 이 변경 사항을 반영합니다.
<!-- Please brief explanation of the changes made -->

## Details

<!-- Please elaborate description of the changes -->
- 최초 배포 시 v3 토큰만 추가하여 minor 배포를 수행할 계획입니다.
- 이후 major 버전 배포를 진행하며 기존 v1, v2 토큰을 drop합니다. 
- 이 때 최종적으로 v3 토큰에서는 'beta' 프리픽스가 제거되어야 합니다.
- 불필요하게 두 번 마이그레이션 하지 않도록 v3 토큰에서 프리픽스를 제거합니다.
  - semantic 토큰의 이름은 v1과 겹치지 않습니다.
  - global 토큰의 이름 역시 v3에서는 색상 앞에 color 라는 프리픽스를 붙이고 있어 v1과 겹치지 않습니다.
  - 일부 radius 이름이 겹치지만 실질적으로 의미하는 값이 같으므로 문제가 되지 않을 것이라고 판단했습니다. 
### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Update v3 token name from with 'beta' prefix to no prefix
([#2756](#2756)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Update v3 token name from with 'beta' prefix to no prefix
([#2756](#2756)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
마이그레이션 과정에서 Button 컴포넌트에서 호버 상태 스타일링이 어긋난 부분을 수정합니다.
## Details

<!-- Please elaborate description of the changes -->
- 호버 상태일 때 -hovered 컬러 토큰을 적용합니다.

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Fix Button's hover state styling
([#2758](#2758)) by
@timok1m

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@timok1m timok1m self-assigned this Jan 6, 2026
@changeset-bot
Copy link

changeset-bot bot commented Jan 6, 2026

🦋 Changeset detected

Latest commit: 8e741ca

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 4 packages
Name Type
@channel.io/stylelint-bezier Minor
@channel.io/bezier-tokens Minor
@channel.io/bezier-react Minor
bezier-figma-plugin Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@channeltalk
Copy link

channeltalk bot commented Jan 6, 2026

@coderabbitai
Copy link

coderabbitai bot commented Jan 6, 2026

개요

V3 베타 토큰 시스템을 도입하고 베지어 컴포넌트를 업데이트하여 새로운 토큰 네이밍 규칙을 지원합니다. 토큰 제공자, 타입 정의, 스타일 유틸리티를 추가하고 수백 개의 컴포넌트 파일에서 토큰 참조를 전환합니다.

변경사항

코호트 / 파일(들) 요약
베타 토큰 프로바이더
packages/bezier-react/src/components/BetaTokenProvider/TokenProvider.tsx, TokenProvider.types.ts, index.ts
테마별 베타 토큰 컨텍스트를 제공하는 새로운 TokenProvider 컴포넌트 추가. ThemeSpecificTokens, TokenContextValue, TokenProviderProps 인터페이스 정의.
베타 토큰 타입 정의
packages/bezier-react/src/types/beta-tokens.ts
18개의 베타 토큰 타입 별칭 추가 (BetaSemanticColor, BetaGlobalColor, BetaRadius 등). 베지어 토큰의 베타 세트에서 파생된 포괄적인 토큰 타입 유틸리티.
토큰 시스템 인프라
packages/bezier-react/src/utils/style.ts, style.test.ts
colorTokenCssVar 새 함수 추가로 베타 시맨틱 색상 토큰 처리. tokenCssVar 시그니처 확장하여 BetaFlattenAllToken 지원.
글로벌 props 확장
packages/bezier-react/src/types/props.ts, props-helpers.ts, utils.ts
ColorProps, LayoutProps, 클래스 이름 헬퍼(getElevationClassName, getRadiusClassName, getZIndexClassName)를 베타 토큰 유니온으로 확장.
AppProvider 업데이트
packages/bezier-react/src/components/AppProvider/AppProvider.tsx, ThemeProvider/ThemeProvider.tsx, ThemeProvider/index.ts
BetaTokenProvider 추가하여 AlphaTokenProvider 내부에 중첩. 새로운 useBetaTokens() 훅 내보내기.
컴포넌트 토큰 마이그레이션 (UI)
packages/bezier-react/src/components/{Avatar,AvatarGroup,Banner,BaseButton,Button,Checkbox,Divider,FormHelperText,Help,Icon,...}/*
레거시 토큰(txt-*, bgtxt-*, bg-* 등)에서 새 베타 토큰(text-*, icon-*, fill-*, border-* 등)으로 색상 토큰 교체. 컴포넌트 모듈 및 로직 파일 수백 개 업데이트.
z-index 및 elevation 토큰 업데이트
packages/bezier-react/src/components/{AvatarGroup,CheckableAvatar,SegmentedControl,Status,Overlay,...}/*.module.scss
z-index 토큰을 --z-index-*에서 --layer-z-index-*로, elevation을 --ev-*에서 --elevation-*로 변경.
모션/전환 토큰 업데이트
packages/bezier-react/src/components/{Icon,Button,ToggleButton,Tabs,...}/*.module.scss
전환 타이밍을 --transition-s/--transition-m에서 --motion-transition-fast/--motion-transition-default로 업데이트.
스타일 유틸리티 모듈
packages/bezier-react/src/styles/_base.scss, _tokens.scss, components/{elevation,radius,z-index,typography}.module.scss
베타 토큰 CSS 임포트 추가. 토큰 경로를 dist/scss에서 dist/beta/scss로 변경. 제너레이션 로직을 light-theme 네임스페이스로 조정.
베타 토큰 제공자
packages/bezier-tokens/src/beta/global/{color,dimension,layer,motion,typography}.json
포괄적인 색상 팔레트, 차원, 레이어, 모션 토큰 추가.
베타 시맨틱 토큰
packages/bezier-tokens/src/beta/semantic/{backdrop,border,elevation,layer,motion,opacity,radius,state,typography}.jsondark-theme/color.json, light-theme/color.json
다크 테마와 라이트 테마를 위한 포괄적인 시맨틱 토큰 세트. 배경, 텍스트, 아이콘, 채우기, 테두리, 상태 토큰 포함.
토큰 빌드 인프라
packages/bezier-tokens/scripts/build-tokens.ts, lib/format.ts, lib/transform.ts, lib/utils.ts
베타 토큰 빌드 변형 추가. betaCustomJsCjs, betaCustomJsEsm, betaCustomCss 포매터 추가. removeNormalSuffix, dimensionPx 변환 추가. toPx 유틸리티 함수 추가.
토큰 검증
packages/bezier-tokens/scripts/validate-token-references.ts
새로운 토큰 참조 검증 스크립트로 손실된 토큰 참조 감지.
패키지 구성
packages/bezier-tokens/package.json
"./beta" 내보내기 경로 추가. 빌드 스크립트에 validate:tokens 추가.
버전 및 변경로그 업데이트
.changeset/young-nights-hide.md, packages/bezier-react/CHANGELOG.md, packages/bezier-tokens/CHANGELOG.md, packages/stylelint-bezier/CHANGELOG.md, packages/bezier-figma-plugin/CHANGELOG.md
모든 패키지의 버전을 베타 버전으로 범프. 각 패키지의 변경사항 기록 문서화.

시퀀스 다이어그램

sequenceDiagram
    participant App as 애플리케이션
    participant AppProvider as AppProvider
    participant AlphaTokenProvider as AlphaTokenProvider
    participant BetaTokenProvider as BetaTokenProvider
    participant Component as 컴포넌트
    participant ColorTokenCssVar as colorTokenCssVar()

    App->>AppProvider: children 렌더링
    AppProvider->>AlphaTokenProvider: 래핑
    AlphaTokenProvider->>BetaTokenProvider: 래핑
    BetaTokenProvider->>BetaTokenProvider: 테마 토큰 준비<br/>(light/dark)
    BetaTokenProvider->>Component: 컨텍스트 제공
    Component->>Component: 베타 시맨틱 색상 선택
    Component->>ColorTokenCssVar: color-text-neutral<br/>색상 토큰 전달
    ColorTokenCssVar->>ColorTokenCssVar: color- 접두사 추가
    ColorTokenCssVar->>Component: --color-text-neutral<br/>CSS 변수 반환
    Component->>Component: 스타일에 CSS 변수 적용
Loading

예상 코드 리뷰 노력

🎯 4 (복잡함) | ⏱️ ~60분

🐰 새로운 베타 토큰의 춤을 보네요,
색상과 모션이 조화로워요.
수백 개 컴포넌트가 반짝이며,
우리의 디자인 체계는 더욱 우아해지고,
V3 토큰의 마법이 피어납니다! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 변경 사항의 핵심을 명확하게 설명합니다. V3 토큰 추가와 베지어-리액트 컴포넌트 마이그레이션이라는 주요 변경 사항을 간결하게 요약했습니다.
Description check ✅ Passed PR 설명은 템플릿의 주요 섹션을 충실히 작성했습니다. 자체 체크리스트, 요약(Summary), 상세 설명(Details), 변경 여부(Breaking change)를 모두 포함했습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link

codecov bot commented Jan 6, 2026

Codecov Report

❌ Patch coverage is 85.00000% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.80%. Comparing base (8eda986) to head (8e741ca).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...ezier-react/src/components/TextField/TextField.tsx 0.00% 2 Missing ⚠️
...act/src/components/ThemeProvider/ThemeProvider.tsx 33.33% 2 Missing ⚠️
packages/bezier-react/src/types/props-helpers.ts 50.00% 2 Missing ⚠️
...src/components/BetaTokenProvider/TokenProvider.tsx 87.50% 1 Missing ⚠️
...er-react/src/components/BetaTokenProvider/index.ts 66.66% 1 Missing ⚠️
...bezier-react/src/components/ThemeProvider/index.ts 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2764      +/-   ##
==========================================
+ Coverage   79.33%   81.80%   +2.47%     
==========================================
  Files         146      149       +3     
  Lines        2913     2957      +44     
  Branches      926      934       +8     
==========================================
+ Hits         2311     2419     +108     
+ Misses        567      504      -63     
+ Partials       35       34       -1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
Copy link
Contributor

github-actions bot commented Jan 6, 2026

Chromatic Report

🚀 Congratulations! Your build was successful!

timok1m and others added 10 commits January 6, 2026 22:01
…o accept BetaDimSemanticColor (#2765)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [x] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
- 누락되었던 text-accent-olive 색상을 추가하고 backgroundColor props에서
BetaDimSemanticColor를 받도록 확장합니다.
## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Add text-accent-olive token, and update BetaBackgroundSemanticColor to
accept BetaDimSemanticColor
([#2765](#2765)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Add text-accent-olive token, and update BetaBackgroundSemanticColor to
accept BetaDimSemanticColor
([#2765](#2765)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…ier component colors (#2767)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
- grey 토큰의 색상이 다크모드에서 전반적으로 변경되었습니다.
- monochrome-dark 버튼에서 활용할 inverse 색상 토큰이 추가되었습니다.
- Button 컴포넌트의 색상이 일부 수정되었습니다.
  - primary > monochrome-dark의 color가 text-inverse로 변경
  - floating > monochrome-* 의 background-color가 surface-highest로 변경
- 상호 작용 요소 (Button, Tab, Tag) 의 focus-visible 색상을 변경합니다. 
- TextField의 error 상태 box-shadow가 제대로 적용되지 않는 문제를 수정합니다. 

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Add invese color tokens and update grey-\* color value. Update bezier
component colors
([#2767](#2767)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Add invese color tokens and update grey-\* color value. Update bezier
component colors
([#2767](#2767)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…t's background color (#2769)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary
추가된 v3 토큰을 반영하고 버튼 컴포넌트의 배경색을 수정합니다.

<!-- Please brief explanation of the changes made -->

## Details

- 글로벌 토큰의 값이 변경됩니다.
  - 사유: 다크모드에서 아이콘 & 텍스트의 가독성 개선
  - color-green-300: #51C371
  - color-red-300: #F36868
  - color-navy-300: #7E89CD
  - color-blue-300: #8082FF
- 글로벌 토큰이 추가됩니다.
- 사유: SegmentedControl > Selected, Button > Floating > Primary >
monochrome-* 배경색을 표현하기 위함
  - color-grey-25: #FDFDFD 
  - color-grey-650: #5A5A5F
- SegmentedControl, Button 컴포넌트의 배경 색을 수정합니다.
- Modal 컴포넌트에서 Button의 focus outline 색상을 수정합니다. 

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->

## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

- Update token values for dark mode visibility and edit Button
component's background color
([#2769](#2769)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Update token values for dark mode visibility and edit Button
component's background color
([#2769](#2769)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…ility (#2771)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->

마이너 배포를 위해 하위호환성을 지키도록 코드를 수정합니다. 

## Details

<!-- Please elaborate description of the changes -->
- 이번 프리릴리즈는 마이너 배포를 위한 프리릴리즈 입니다.
- 마이너 배포를 위해 breaking change가 발생하지 않도록 코드를 수정합니다.
  - 베지어 컴포넌트의 LayoutProps에서 v3 토큰만 허용하던 것을 v1 토큰도 함께 허용하도록 확장합니다.
  - 스타일린트에서 v3 토큰만 유효하도록 판단하도록 했던 것을 기존에 허용하던 v1, v2 도 허용하도록 확장합니다.

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
…2773)

<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary

<!-- Please brief explanation of the changes made -->
flattenBetaToken를 추가하는 과정에서 flattenAlphaToken가 재귀적으로 flattenBetaToken를
수행하도록 잘못 수정한 문제를 바로잡습니다.

## Details

<!-- Please elaborate description of the changes -->
- changeset 퍼블리시 이전에 작업을 미리 브랜치에 머지하도록 하여 버전 배포 시에는 올바른 코드가 들어갈 수 있도록
합니다.
### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to beta, this PR will
be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

`beta` is currently in **pre mode** so this branch has prereleases
rather than normal releases. If you want to exit prereleases, run
`changeset pre exit` on `beta`.

⚠️⚠️⚠️⚠️⚠️⚠️

# Releases
## @channel.io/[email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Patch Changes

- Edit bezier-react's props and stylelint to maintain backward
compatibility
([#2771](#2771)) by
@timok1m

## @channel.io/[email protected]

### Patch Changes

- Edit bezier-react's props and stylelint to maintain backward
compatibility
([#2771](#2771)) by
@timok1m

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
<!--
  How to write a good PR title:
- Follow [the Conventional Commits
specification](https://www.conventionalcommits.org/en/v1.0.0/).
  - Give as much context as necessary and as little as possible
  - Prefix it with [WIP] while it’s a work in progress
-->

## Self Checklist

- [x] I wrote a PR title in **English** and added an appropriate
**label** to the PR.
- [x] I wrote the commit message in **English** and to follow [**the
Conventional Commits
specification**](https://www.conventionalcommits.org/en/v1.0.0/).
- [x] I [added the
**changeset**](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md)
about the changes that needed to be released. (or didn't have to)
- [x] I wrote or updated **documentation** related to the changes. (or
didn't have to)
- [x] I wrote or updated **tests** related to the changes. (or didn't
have to)
- [ ] I tested the changes in various browsers. (or didn't have to)
  - Windows: Chrome, Edge, (Optional) Firefox
  - macOS: Chrome, Edge, Safari, (Optional) Firefox

## Related Issue

<!-- Please link to issue if one exists -->

<!-- Fixes #0000 -->

## Summary
prerelease 모드를 종료하고 마이너 배포를 위한 changeset 을 추가합니다. 

prerelease에 대하여 확신이 없어서 수동으로 pre.json와 prerelease에 사용된 md 파일을 제거했습니다. 
혹시 yarn changeset pre exit 을 통해서 pre.json의 mode가 exit으로 변경되면 이 것을 자동으로
수행한다면 알려주세요!
<!-- Please brief explanation of the changes made -->

## Details

<!-- Please elaborate description of the changes -->

### Breaking change? (Yes/No)

<!-- If Yes, please describe the impact and migration path for users -->
No
## References

<!-- Please list any other resources or points the reviewer should be
aware of -->
@timok1m timok1m marked this pull request as ready for review January 9, 2026 08:55
@timok1m timok1m merged commit 78fb492 into main Jan 9, 2026
8 of 10 checks passed
@timok1m timok1m deleted the beta branch January 9, 2026 09:02
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
packages/bezier-react/src/components/Slider/Slider.module.scss (1)

25-35: border-radius 중복 선언으로 토큰이 항상 무시됩니다(3px가 최종 적용).
현재 border-radius: var(--radius-3); 다음 줄의 border-radius: 3px;가 덮어써서 v3 radius 토큰이 적용되지 않습니다. “fallback” 의도라면 var()의 fallback 문법으로 합치는 편이 안전합니다.

Proposed diff
 .SliderPrimitiveTrack {
   position: relative;

   flex: 1;

   height: 6px;

   background-color: var(--color-fill-neutral-heavy);
-  border-radius: var(--radius-3);
-  border-radius: 3px;
+  border-radius: var(--radius-3, 3px);
 }
packages/bezier-react/src/components/AlphaIconButton/IconButton.module.scss (1)

180-180: TODO 주석이 현재 v3 토큰 마이그레이션과 맞지 않습니다.

이 PR에서 v3 토큰으로 마이그레이션하고 있으므로, "v2 token" 언급은 오래된 정보입니다. 디자인 명세가 확정되었다면 해당 TODO를 해결하거나, v3 토큰을 참조하도록 주석을 업데이트해 주세요.

packages/bezier-react/src/components/Toast/Toast.module.scss (1)

132-150: Close 버튼 hover 배경색을 설계 시스템의 호버 토큰으로 업데이트하세요.

현재 background-color가 기본/hover 모두 --color-fill-neutral-light로 동일해서 hover 피드백이 텍스트 색 변화에만 의존합니다. 다른 컴포넌트(Button, AlphaIconButton 등)와의 일관성을 위해 hover 상태에서 --color-fill-neutral-light-hovered를 사용하세요.

packages/bezier-react/src/components/Modal/Modal.tsx (1)

272-281: 라이트/다크 테마 모두에서 WCAG AA 대비 기준 미충족

typo="13" + bold 조합은 WCAG에서 "큰 텍스트"(large text)로 분류되지 않으므로 4.5:1의 대비 비율이 필요합니다. 현재 색상 조합에서:

  • 라이트 테마: 2.85:1 (기준 미달)
  • 다크 테마: 3.66:1 (기준 미달)

두 테마 모두 접근성 기준을 충족하지 않습니다. text-neutral-lighter 대신 더 진한 토큰 사용을 권장합니다.

packages/bezier-react/src/components/LegacyStack/LegacyStack.stories.tsx (1)

205-216: text-neutral-light 토큰의 대비(가독성) 확인이 필요합니다.

밝은 배경에서 이 토큰의 실제 대비를 확인해 주세요. Storybook에서 라이트/다크 테마(또는 배경색)별로 텍스트 가독성을 검증하시기 바랍니다.

🤖 Fix all issues with AI agents
In @packages/bezier-react/CHANGELOG.md:
- Line 23: Fix the typo in the CHANGELOG entry: replace "invese" with "inverse"
in the changed line that currently reads "Add invese color tokens and update
grey- * color value. Update bezier component colors ..." so the text becomes
"Add inverse color tokens and update grey-* color value. Update bezier component
colors ...".

In @packages/bezier-react/src/components/AlphaButton/Button.module.scss:
- Line 142: The CSS contains a syntax error: the declaration for the "pink"
token uses var(--color-text-accent-pink,) with an extraneous trailing comma;
remove the trailing comma or provide a valid fallback value inside the var() so
the "pink" property becomes var(--color-text-accent-pink) or
var(--color-text-accent-pink, <fallback>), fixing the invalid CSS in
Button.module.scss.

In
@packages/bezier-react/src/components/AlphaToggleButton/ToggleButton.module.scss:
- Around line 61-62: Remove the redundant box-shadow declaration in
ToggleButton.module.scss: the first box-shadow: var(--state-input-default) is
immediately overridden by the inset declaration on the following line; either
delete the first fallback if it's unnecessary or merge the two values into a
single comma-separated box-shadow if both effects are required, updating the
rules where box-shadow appears in the AlphaToggleButton/ToggleButton styles.

In @packages/bezier-react/src/components/BaseTagBadge/BaseTagBadge.module.scss:
- Around line 22-60: The olive variant sets --b-tag-badge-color to a fill token
by mistake; update the .variant-olive block so --b-tag-badge-color uses the
correct text token (consistent with other variants) instead of a color-fill
token. Locate the &:where(.variant-olive) rule and replace the current value
assigned to --b-tag-badge-color with the proper --color-text-accent-olive (or
the project's equivalent text token) so text color matches other variants.

In
@packages/bezier-react/src/components/CheckableAvatar/CheckableAvatar.module.scss:
- Around line 78-80: The CSS uses a non-existent design token
--color-text-accent-green-hovered (seen in CheckableAvatar.module.scss and
referenced by Checkbox, RadioGroup, FloatingButton), so either add a new token
key text.accent.green.hovered to the v3 token JSON
(packages/bezier-tokens/src/beta/semantic/light-theme/color.json) with the
appropriate color value, or change the SCSS to use the existing token
--color-text-accent-green (replace occurrences of
--color-text-accent-green-hovered with --color-text-accent-green) so all
components reference a defined token.

In @packages/bezier-react/src/components/Icon/Icon.stories.tsx:
- Around line 198-206: useBetaTokens() is being called inside the map callback
which violates React hook rules; move the hook to the component top level (call
useBetaTokens() once and extract semantic colors into a local variable like
semanticColors), then map over Object.keys(semanticColors) to render ListItem;
keep the onClick as setColor(semanticName as BetaSemanticColor) so the rest of
the logic (ListItem, setColor, BetaSemanticColor) remains unchanged.

In @packages/bezier-react/src/components/SectionLabel/SectionLabel.tsx:
- Line 61: The SectionLabel component currently uses the low-contrast token
color="text-neutral-lighter" for the icon and the label text; replace that token
on the icon (the color prop set to "text-neutral-lighter") and wherever the
label text is rendered in SectionLabel with a higher-contrast token (e.g.,
text-neutral or text-neutral-default/text-neutral-medium) so both the icon and
label meet WCAG contrast requirements; update the token references in the
SectionLabel component code (icon color prop and the label text element) and
verify the chosen token yields sufficient contrast for normal and large text.

In @packages/bezier-react/src/components/Tag/Tag.tsx:
- Line 56: The Tag component is using an invalid token name "text-neutral" for
the color prop; update the color prop usage in Tag.tsx (the Tag component's
color prop) to a valid specific variant such as "text-neutral-heaviest" or
"text-neutral-normal" (use one of these if you need the previous
txt-black-darkest mapping), or choose
"text-neutral-light"/"text-neutral-lighter" depending on the intended contrast;
replace the lone "text-neutral" occurrence accordingly so the component uses a
supported token.

In @packages/bezier-react/src/components/Text/Text.module.scss:
- Line 13: Replace the hardcoded font-weight in Text.module.scss (font-weight:
400) with the corresponding typography token CSS variable used across the
codebase (e.g. var(--typography-text-weight-regular) or the token mapping for
typography.font-weight.400) so font-weight is consistent with other typography
props; ensure the Text component uses the same variable naming convention as
AlphaToggleButton (which uses --typography-text-weight-bold) and update any
related class/variant that currently uses 700 to reference the existing bold
variable instead, or document the intentional deviation if this is a planned
migration.

In @packages/bezier-tokens/scripts/lib/format.ts:
- Around line 225-370: The three beta formatters (betaCustomJsCjs,
betaCustomJsEsm, betaCustomCss) duplicate logic from the alpha formatters;
extract the shared categorization and ref-aware token serialization into factory
helpers (e.g., createRefAwareJsCjsFormatter, createRefAwareJsEsmFormatter,
createRefAwareCssFormatter) that accept a prefix ('alpha'|'beta') or options and
return a CustomFormat, then replace the duplicated exports with calls to those
factories (export const betaCustomJsCjs = createRefAwareJsCjsFormatter('beta'),
etc.); ensure the factories reuse dictionary.allTokens reduction,
processTokensWithHovered usage, reference resolution via
dictionary.usesReference/getReferences, and JSON/string assembly so behavior
remains identical while removing the duplicated code.

In @packages/bezier-tokens/scripts/lib/transform.ts:
- Around line 31-48: The transformer in the dimensionPx token incorrectly
asserts a non-string value as string; change the branch in the transformer for
typeof value !== 'string' to return the original value unchanged (remove the "as
string" cast) so you don't lie about the runtime type, keeping the function's
behavior and letting non-string values pass through untouched; locate the
transformer inside the dimensionPx object (and keep using toPx(trimmed) for
string handling).

In @packages/bezier-tokens/scripts/lib/utils.ts:
- Around line 15-22: The toPx function returns the original value when the regex
test fails, which preserves unwanted surrounding whitespace; change that return
to use the trimmed string instead (use the local trimmed variable) so
non-matching inputs like " 10px " return "10px" rather than the raw value;
ensure the regex check and subsequent logic consistently operate on trimmed
rather than the original value.

In @packages/bezier-tokens/src/beta/semantic/backdrop.json:
- Around line 1-12: The tokens under the "backdrop" object ("large" and "small")
use a non-standard "type": "backdrop" which Style Dictionary/CSSTransforms
doesn't recognize, so no output is generated; fix by either changing the token
types to a supported type (e.g., replace "type": "backdrop" with "type":
"dimension" or "size" so the "{dimension.60}" and "{dimension.6}" references are
emitted), or register and wire a custom CSSTransform named "backdrop" into your
Style Dictionary build (implement the transform and add it to transforms array)
so tokens named "backdrop.large"/"backdrop.small" are processed.

In @packages/bezier-tokens/src/beta/semantic/border.json:
- Around line 14-57: The border dropShadow offsets are inverted: for tokens
"bottom", "right", "left", and "top" the dimension signs must be flipped so
shadows render on the intended side; update the offset values as follows—in
"bottom" change offsetY from {dimension.1-m} to {dimension.1}, in "right" change
offsetX from {dimension.1-m} to {dimension.1}, in "left" change offsetX from
{dimension.1} to {dimension.1-m}, and in "top" change offsetY from {dimension.1}
to {dimension.1-m} so the dropShadow simulates borders correctly.

In @packages/bezier-tokens/src/beta/semantic/state.json:
- Around line 1-13: state.error currently references the warning palette via
"value.color": "{color.state.warning.normal}"; confirm whether this mapping is
intentional and if not, update the token to reference the correct error color
(e.g. "{color.state.error.normal}" or the canonical error token used elsewhere),
adjust any related tokens/variants (state.error.type/value) and update
docs/tests to reflect the corrected mapping so naming and semantics remain
consistent.
🧹 Nitpick comments (26)
packages/bezier-react/src/components/AlphaToggleEmojiButtonGroup/ToggleEmojiButtonGroup.module.scss (1)

45-57: [data-state='on'] + :hover 조합 의도 확인 (현재 on 상태가 hover를 덮어씀)

Line 49-56 구조상 :hover보다 [data-state='on']가 뒤에 있어서, “on 이면서 hover”일 때도 Line 54-56 스타일(파란 배경/인셋)이 유지됩니다. “on-hover”에 별도 색/쉐도우가 필요하면 조합 셀렉터를 추가하는 게 안전합니다.
또한 Line 47의 var(--state-input-default)가 여러 레이어(외곽/인셋/블러 등)를 포함한다면, on 상태에서 Line 55로 완전히 교체되며 일부 레이어가 사라질 수 있어 실제 렌더링을 한 번 확인하는 걸 권장합니다.

제안(diff): on-hover가 필요할 때만
   &:where(.variant-primary) {
     background-color: var(--color-fill-grey);
     box-shadow: var(--state-input-default);

     &:where(&:hover) {
       background-color: var(--color-fill-grey-heavy);
     }

     &:where([data-state='on']) {
       background-color: var(--color-fill-accent-blue);
       box-shadow: 0 0 0 1px var(--color-fill-accent-blue-heavier) inset;
     }
+
+    /* optional: on + hover 조합이 별도 톤을 가져야 한다면 */
+    &:where([data-state='on']):where(&:hover) {
+      background-color: var(--color-fill-accent-blue);
+      box-shadow: 0 0 0 1px var(--color-fill-accent-blue-heavier) inset;
+    }
   }
packages/bezier-tokens/src/beta/semantic/state.json (1)

68-125: input.active/error에서 3레이어(기본 elevation + 상태 dropShadow + 상태 innerShadow) 패턴이 명확합니다

중복되는 “기본 elevation 레이어”가 여러 상태에 반복되므로, 도구가 허용한다면 추후 공통 토큰(예: state.input.base)로 추출해 중복을 줄이는 것도 고려할 만합니다(선택).

packages/bezier-tokens/src/beta/semantic/motion.json (1)

6-7: 네이밍 컨벤션 일관성 확인

글로벌 토큰에서는 "timing-function" (케밥-케이스)을 사용하지만, 시맨틱 토큰의 value 객체에서는 "timingFunction" (카멜-케이스)을 사용하고 있습니다. 이는 디자인 토큰 표준에서 토큰 이름(경로)과 복합 값의 속성 이름을 구분하기 위한 의도적인 선택일 수 있지만, 일관성을 위해 확인해 주세요.

Also applies to: 13-14, 20-21

packages/bezier-react/src/components/TextField/TextField.test.tsx (2)

300-324: 하드코딩된 setTimeout 대신 waitFor 사용을 고려하세요.

Line 309의 하드코딩된 setTimeout(resolve, 10) 지연은 느린 CI 환경이나 컴포넌트 타이밍 변경 시 테스트를 불안정하게 만들 수 있습니다. @testing-library/reactwaitFor를 사용하면 더 견고한 테스트가 됩니다.

♻️ 제안하는 개선 방법
+import { waitFor } from '@testing-library/react'

   it('should select all text on mount when selectAllOnInit is true', async () => {
     const { getByRole } = renderComponent({
       value: 'test value',
       selectAllOnInit: true,
     })
     const input = getByRole('textbox') as HTMLInputElement

-    // Wait for setTimeout in the component
-    await new Promise((resolve) => setTimeout(resolve, 10))
-
-    expect(input.selectionStart).toBe(0)
-    expect(input.selectionEnd).toBe('test value'.length)
+    await waitFor(() => {
+      expect(input.selectionStart).toBe(0)
+      expect(input.selectionEnd).toBe('test value'.length)
+    })
   })

326-354: 하드코딩된 setTimeout 대신 waitFor 사용을 고려하세요.

Line 337의 하드코딩된 지연은 selectAllOnInit 테스트와 동일한 취약점을 가지고 있습니다. 더 견고한 테스트를 위해 waitFor를 사용하는 것이 좋습니다.

♻️ 제안하는 개선 방법
   it('should select all text on focus when selectAllOnFocus is true', async () => {
     const { getByRole } = renderComponent({
       value: 'test value',
       selectAllOnFocus: true,
     })
     const input = getByRole('textbox') as HTMLInputElement

     input.focus()

-    // Wait for setTimeout in the component
-    await new Promise((resolve) => setTimeout(resolve, 10))
-
-    expect(input.selectionStart).toBe(0)
-    expect(input.selectionEnd).toBe('test value'.length)
+    await waitFor(() => {
+      expect(input.selectionStart).toBe(0)
+      expect(input.selectionEnd).toBe('test value'.length)
+    })
   })
packages/bezier-figma-plugin/src/ui/components/ExtractSuccess.tsx (1)

25-26: 타입 에러 억제를 제거하는 것을 고려해보세요.

@ts-expect-error 주석이 사용되고 있습니다. as="a" 사용 시 Text 컴포넌트가 앵커 속성을 올바르게 타입 지원하지 않는 것으로 보입니다.

♻️ 타입 안전성 개선 제안

Bezier의 Text 컴포넌트가 as prop에 대한 적절한 타입 오버로드를 제공하는지 확인하고, 필요시 별도 이슈로 추적하는 것을 권장합니다.

packages/bezier-react/src/components/AlphaIconButton/IconButton.module.scss (1)

153-157: 아이콘에 --color-text-* 토큰 대신 --color-icon-* 토큰 사용을 고려해 주세요.

Line 142와 148에서는 .ButtonIcon--color-icon-* 토큰을 사용하고 있지만, 여기서는 --color-text-absolute-white를 사용하고 있습니다. 일관성을 위해 --color-icon-absolute-white 토큰이 존재한다면 해당 토큰 사용을 권장합니다.

♻️ 제안하는 수정 사항
  &:where(.variant-tertiary, .variant-secondary):where(.color-white-absolute) {
    & :where(.ButtonIcon) {
-      color: var(--color-text-absolute-white);
+      color: var(--color-icon-absolute-white);
    }
  }
packages/bezier-tokens/scripts/lib/utils.ts (1)

20-21: extractNumber 폴백 로직을 단순화할 수 있습니다.

Line 17의 정규식이 이미 숫자 형식을 검증했으므로, extractNumber(trimmed)는 항상 값을 반환해야 합니다. 따라서 삼항 연산자의 폴백 ${trimmed}px는 불필요한 중복입니다.

♻️ 제안된 리팩토링
 export const toPx = (value: string) => {
   const trimmed = value.trim()
   if (!/^[+-]?\d+(\.\d+)?$/.test(trimmed)) {
     return trimmed
   }
-  const numeric = extractNumber(trimmed)
-  return numeric ? `${numeric}px` : `${trimmed}px`
+  return `${extractNumber(trimmed)}px`
 }
packages/bezier-tokens/src/beta/semantic/border.json (1)

58-90: white- 토큰의 네이밍 컨벤션을 검토하세요.*

white-high, white-higher, white-highest 토큰들은 {color.surface.*} 토큰을 참조하고 있지만, 이름에 "white"가 포함되어 있습니다. 다크 모드에서는 surface 색상이 흰색이 아닐 수 있으므로, 네이밍이 오해를 불러일으킬 수 있습니다.

더 명확한 네이밍을 고려하세요 (예: surface-high, surface-higher, surface-highest).

packages/bezier-react/src/styles/components/radius.module.scss (1)

2-8: 깊은 node_modules 상대경로 일관성 개선 및 null 가드 추가 권장

현재 코드는 @use '../../../../../node_modules/@channel.io/bezier-tokens/dist/beta/scss'로 깊은 상대경로를 사용하고 있는데, 레포 내 다른 CSS 임포트(../../node_modules/...)와 경로 패턴이 일관성 없어 빌드 구성이나 모노레포 레이아웃 변경 시 취약합니다. 또한 map.keys(map.get($tokens, 'light-theme', 'radius'))에서 토큰이 누락되면 null 에러로 에러 메시지가 불명확해집니다. elevation, z-index 파일에서도 동일한 패턴이 사용되므로, 함께 개선하면 좋습니다. 동일 구조의 @error 가드를 추가하여 실패 시점을 명확히 하는 것을 권장합니다.

packages/bezier-react/src/components/Modal/Modal.module.scss (1)

104-107: 포커스 링은 :focus-visible로 좁히는 것도 고려해볼 만합니다.
현재는 마우스 클릭 포커스에도 outline이 노출될 수 있어 UX가 흔들릴 수 있습니다(키보드/프로그램matic 포커스는 유지).

Proposed diff
-  & [data-bezier-component='Button']:where(:focus) {
+  & [data-bezier-component='Button']:where(:focus-visible) {
     outline: 3px solid var(--color-state-action-light);
   }
packages/bezier-tokens/src/beta/global/typography.json (1)

103-111: 폰트 굵기 정의가 확인되었습니다.

400(regular)과 700(bold) 두 가지 굵기만 정의되어 있습니다. 디자인 시스템이 의도적으로 간단하게 유지하는 것으로 보이지만, 필요시 중간 굵기(500 또는 600)를 추가하는 것도 고려해볼 수 있습니다.

packages/bezier-react/src/components/TextArea/TextArea.module.scss (1)

28-31: (옵션) border가 없는데 border-color transition이 남아있습니다.

현재 border: none;이라 border-color 트랜지션은 효과가 없어서 제거해도 됩니다.

정리 제안(diff)
   transition:
-    border-color var(--motion-transition-fast),
     box-shadow var(--motion-transition-fast);
packages/bezier-tokens/scripts/validate-token-references.ts (1)

149-175: src 디렉토리 경로가 하드코딩되어 있습니다.

Line 150에서 src 디렉토리 경로가 하드코딩되어 있습니다. 현재 프로젝트 구조에서는 문제없지만, 향후 재사용성을 위해 CLI 인자로 받도록 개선할 수 있습니다.

♻️ 제안: 디렉토리 경로를 CLI 인자로 받기
 function main() {
-  const srcDir = join(process.cwd(), 'src')
+  const srcDir = join(process.cwd(), process.argv[2] || 'src')
   const jsonFiles = findJsonFiles(srcDir)
packages/bezier-react/src/components/BetaTokenProvider/TokenProvider.types.ts (1)

7-20: 공개 API 인터페이스에 JSDoc 추가를 고려하세요.

새로운 공개 인터페이스(ThemeSpecificTokens, TokenContextValue, TokenProviderProps)에 JSDoc 주석을 추가하면 개발자 경험과 IDE 자동완성이 개선됩니다. 각 인터페이스의 목적과 사용 방법을 문서화하는 것이 좋습니다.

</invoke comment_end -->

packages/bezier-tokens/scripts/build-tokens.ts (1)

114-150: 포맷 선택 로직을 헬퍼 함수로 추출하는 것을 고려하세요.

중첩된 삼항 연산자가 세 번 반복됩니다(cjs, esm, css). 가독성을 위해 포맷 선택 로직을 별도 헬퍼 함수로 추출할 수 있습니다.

♻️ 제안된 리팩토링
+function selectFormat(
+  useBeta: boolean,
+  useAlpha: boolean,
+  betaFormat: string,
+  alphaFormat: string,
+  defaultFormat: string
+): string {
+  if (useBeta) return betaFormat
+  if (useAlpha) return alphaFormat
+  return defaultFormat
+}
+
 function defineConfig({
   useAlpha = false,
   useBeta = false,
   source,
   reference = [],
   basePath,
   destination,
   options,
 }: DefineConfigOptions): Config {
   const transforms = CustomTransforms.map(({ name }) => name)
 
   return {
     source: [...source, ...reference],
     platforms: {
       'web/cjs': defineWebPlatform({
         buildPath: `${basePath}/${BUILD_PATH.CJS}/`,
         files: [
           {
             destination: `${destination}.js`,
-            format: useBeta
-              ? betaCustomJsCjs.name
-              : useAlpha
-                ? alphaCustomJsCjs.name
-                : customJsCjs.name,
+            format: selectFormat(
+              useBeta,
+              useAlpha,
+              betaCustomJsCjs.name,
+              alphaCustomJsCjs.name,
+              customJsCjs.name
+            ),
             filter: ({ filePath }) =>
               source.some((src) => minimatch(filePath, src)),
           },
         ],
         transforms,
       }),
.changeset/young-nights-hide.md (1)

7-7: 체인지셋 설명의 문법을 개선할 수 있습니다.

설명이 명확하지만, 문법을 약간 개선할 수 있습니다.

♻️ 제안하는 문법 개선
-Add V3 bezier tokens and update bezier components allow to use V3 tokens.
+Add V3 bezier tokens and update bezier components to allow using V3 tokens.

또는:

-Add V3 bezier tokens and update bezier components allow to use V3 tokens.
+Add V3 bezier tokens and update bezier components to support V3 tokens.
packages/bezier-react/src/components/AlphaAvatar/Avatar.tsx (1)

50-52: 훅을 상수로 단순화하는 것을 고려하세요.

useAvatarRadiusToken이 이제 상수 값 '42%'만 반환하므로, 토큰 시스템에서 더 이상 값을 파생하지 않습니다. 이 훅을 단순한 상수 export로 리팩토링하는 것을 고려해볼 수 있습니다.

♻️ 제안하는 리팩토링
-export function useAvatarRadiusToken() {
-  return '42%' as const
-}
+export const AVATAR_BORDER_RADIUS = '42%' as const

그리고 사용처에서:

-const AVATAR_BORDER_RADIUS = useAvatarRadiusToken()
+const AVATAR_BORDER_RADIUS = useAlphaAvatarRadiusToken()

또는 직접 상수를 사용:

-const AVATAR_BORDER_RADIUS = useAvatarRadiusToken()
+// AVATAR_BORDER_RADIUS 상수를 import하여 사용
packages/bezier-react/src/utils/style.test.ts (1)

1-8: colorTokenCssVar 테스트 케이스 추가는 좋습니다.

beta/v1 포맷 분기(특히 color- prefix 규칙)를 테스트로 고정한 건 회귀 방지에 도움이 됩니다. 다만 현재 케이스가 전부 as any라서, 가능하면 BetaSemanticColor/SemanticColor 기반의 fixture(타입 안전한 배열)로 바꾸면 의도가 더 선명해질 것 같습니다.

Also applies to: 61-106

packages/bezier-react/src/components/Select/Select.tsx (1)

118-129: Placeholder 색을 하드코딩할지(현재), 아니면 textColor와 연동할지 의도 확인.

현재 placeholder는 항상 color="text-neutral-lighter"인데, 디자인 의도가 “placeholder는 항상 lighter”가 맞다면 괜찮고, 그렇지 않다면 textColor/별도 prop으로 제어 가능하게 하는 편이 일관적일 수 있습니다.

packages/stylelint-bezier/src/plugins/validate-token/index.ts (2)

49-70: flattenBetaTokenflattenAlphaToken의 정확한 복제본입니다.

두 함수가 동일한 로직을 가지고 있어 코드 중복이 발생합니다. 단일 함수로 통합하여 유지보수성을 개선할 수 있습니다.

♻️ 제안된 리팩토링
-function flattenAlphaToken(obj: object, result: Record<string, unknown> = {}) {
+function flattenTokenWithValue(obj: object, result: Record<string, unknown> = {}) {
   for (const [key, value] of Object.entries(obj)) {
     if (
       typeof value === 'object' &&
       value !== null &&
       // eslint-disable-next-line @typescript-eslint/no-explicit-any
       (value as any).value !== undefined &&
       !Array.isArray(value)
     ) {
       // eslint-disable-next-line @typescript-eslint/no-explicit-any
       result[key] = (value as any).value
     } else if (
       typeof value === 'object' &&
       value !== null &&
       !Array.isArray(value)
     ) {
-      flattenAlphaToken(value, result)
+      flattenTokenWithValue(value, result)
     }
   }

   return result
 }

-function flattenBetaToken(obj: object, result: Record<string, unknown> = {}) {
-  for (const [key, value] of Object.entries(obj)) {
-    if (
-      typeof value === 'object' &&
-      value !== null &&
-      // eslint-disable-next-line @typescript-eslint/no-explicit-any
-      (value as any).value !== undefined &&
-      !Array.isArray(value)
-    ) {
-      // eslint-disable-next-line @typescript-eslint/no-explicit-any
-      result[key] = (value as any).value
-    } else if (
-      typeof value === 'object' &&
-      value !== null &&
-      !Array.isArray(value)
-    ) {
-      flattenBetaToken(value, result)
-    }
-  }
-
-  return result
-}

 const allTokens = {
   ...flattenObject(tokens.global),
   ...flattenObject(tokens.lightTheme),
-  ...flattenAlphaToken(alphaTokens.global),
-  ...flattenAlphaToken(alphaTokens.lightTheme),
-  ...flattenBetaToken(betaTokens.global),
-  ...flattenBetaToken(betaTokens.lightTheme),
+  ...flattenTokenWithValue(alphaTokens.global),
+  ...flattenTokenWithValue(alphaTokens.lightTheme),
+  ...flattenTokenWithValue(betaTokens.global),
+  ...flattenTokenWithValue(betaTokens.lightTheme),
 }

31-36: 타입 안전성 개선을 고려해 보세요.

토큰 구조에 대한 적절한 TypeScript 인터페이스를 정의하면 eslint-disable 주석과 any 타입 캐스팅을 제거할 수 있습니다.

interface TokenWithValue {
  value: unknown
  [key: string]: unknown
}

function hasValue(value: unknown): value is TokenWithValue {
  return typeof value === 'object' && value !== null && 'value' in value
}
packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.test.tsx (1)

110-120: 아이콘 크기 검증이 누락되었습니다.

테스트 설명은 "xxxs icon size" 및 "xs icon size"를 언급하지만, 실제로는 아이콘 존재 여부만 확인합니다. 아이콘 크기 클래스나 스타일을 검증하는 assertion을 추가하는 것이 좋습니다.

packages/bezier-react/src/types/props.ts (1)

391-398: TODO 주석이 명확하게 문서화되어 있습니다.

BetaTextSemanticColor가 v1 컴포넌트 호환성을 위해 backgroundColor에 포함된다는 점이 명시되어 있어 향후 정리 시 참고하기 좋습니다. 다음 메이저 릴리스에서 이 호환성 레이어를 제거할 계획이 있는지 확인하고, 필요하다면 이슈를 생성하여 추적하는 것을 권장합니다.

이 TODO를 추적하기 위한 이슈를 생성해 드릴까요?

packages/bezier-react/src/types/beta-tokens.ts (2)

9-10: TODO: theme name을 bezier-tokens에서 import하도록 개선 필요

theme name이 하드코딩되어 있습니다. 향후 bezier-tokens 패키지에서 중앙화된 상수를 import하는 것이 일관성과 유지보수성 측면에서 더 좋습니다.

이 작업을 처리하기 위한 이슈를 생성하거나 구현을 도와드릴까요?


27-33: internal use 표시와 export 간의 불일치

코멘트에서 "internal use only"라고 명시되어 있으나 타입이 export되고 있습니다. 만약 정말로 내부 사용 전용이라면 export를 제거하는 것을 고려하세요. 다만 다른 export된 타입에서 참조가 필요한 경우, 코멘트를 수정하여 "Primarily for internal use; prefer BetaSemanticColor for props" 같이 더 명확하게 표현하는 것이 좋습니다.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8eda986 and 8e741ca.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (158)
  • .changeset/young-nights-hide.md
  • packages/bezier-figma-plugin/CHANGELOG.md
  • packages/bezier-figma-plugin/package.json
  • packages/bezier-figma-plugin/src/ui/components/ExtractSuccess.tsx
  • packages/bezier-react/.storybook/preview.module.scss
  • packages/bezier-react/CHANGELOG.md
  • packages/bezier-react/package.json
  • packages/bezier-react/src/components/AlphaAvatar/Avatar.module.scss
  • packages/bezier-react/src/components/AlphaAvatar/Avatar.tsx
  • packages/bezier-react/src/components/AlphaAvatarGroup/AvatarGroup.module.scss
  • packages/bezier-react/src/components/AlphaAvatarGroup/AvatarGroup.tsx
  • packages/bezier-react/src/components/AlphaButton/Button.module.scss
  • packages/bezier-react/src/components/AlphaFloatingButton/FloatingButton.module.scss
  • packages/bezier-react/src/components/AlphaFloatingIconButton/FloatingIconButton.module.scss
  • packages/bezier-react/src/components/AlphaIconButton/IconButton.module.scss
  • packages/bezier-react/src/components/AlphaLoader/Loader.module.scss
  • packages/bezier-react/src/components/AlphaStatusBadge/AlphaStatusBadge.stories.tsx
  • packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.module.scss
  • packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.test.tsx
  • packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.tsx
  • packages/bezier-react/src/components/AlphaToggleButton/ToggleButton.module.scss
  • packages/bezier-react/src/components/AlphaToggleButtonGroup/AlphaToggleButtonGroup.stories.tsx
  • packages/bezier-react/src/components/AlphaToggleEmojiButtonGroup/AlphaToggleEmojiButtonGroup.stories.tsx
  • packages/bezier-react/src/components/AlphaToggleEmojiButtonGroup/ToggleEmojiButtonGroup.module.scss
  • packages/bezier-react/src/components/AppProvider/AppProvider.tsx
  • packages/bezier-react/src/components/Avatar/Avatar.tsx
  • packages/bezier-react/src/components/AvatarGroup/AvatarGroup.module.scss
  • packages/bezier-react/src/components/AvatarGroup/AvatarGroup.tsx
  • packages/bezier-react/src/components/Banner/Banner.module.scss
  • packages/bezier-react/src/components/BaseButton/BaseButton.module.scss
  • packages/bezier-react/src/components/BaseTagBadge/BaseTagBadge.module.scss
  • packages/bezier-react/src/components/BetaTokenProvider/TokenProvider.tsx
  • packages/bezier-react/src/components/BetaTokenProvider/TokenProvider.types.ts
  • packages/bezier-react/src/components/BetaTokenProvider/index.ts
  • packages/bezier-react/src/components/Box/Box.stories.tsx
  • packages/bezier-react/src/components/Box/Box.tsx
  • packages/bezier-react/src/components/Button/Button.module.scss
  • packages/bezier-react/src/components/Button/Button.stories.tsx
  • packages/bezier-react/src/components/Center/Center.stories.tsx
  • packages/bezier-react/src/components/CheckableAvatar/CheckableAvatar.module.scss
  • packages/bezier-react/src/components/CheckableAvatar/CheckableAvatar.tsx
  • packages/bezier-react/src/components/Checkbox/Checkbox.module.scss
  • packages/bezier-react/src/components/Checkbox/Checkbox.tsx
  • packages/bezier-react/src/components/Divider/Divider.module.scss
  • packages/bezier-react/src/components/FormHelperText/FormHelperText.tsx
  • packages/bezier-react/src/components/FormLabel/FormLabel.tsx
  • packages/bezier-react/src/components/Help/Help.module.scss
  • packages/bezier-react/src/components/Help/Help.tsx
  • packages/bezier-react/src/components/Icon/Icon.mdx
  • packages/bezier-react/src/components/Icon/Icon.module.scss
  • packages/bezier-react/src/components/Icon/Icon.stories.tsx
  • packages/bezier-react/src/components/Icon/Icon.test.tsx
  • packages/bezier-react/src/components/Icon/Icon.tsx
  • packages/bezier-react/src/components/KeyValueItem/KeyValueItem.module.scss
  • packages/bezier-react/src/components/KeyValueItem/KeyValueItem.test.tsx
  • packages/bezier-react/src/components/KeyValueItem/KeyValueItem.tsx
  • packages/bezier-react/src/components/LegacyIcon/LegacyIcon.tsx
  • packages/bezier-react/src/components/LegacyIcon/LegacyIcon.types.ts
  • packages/bezier-react/src/components/LegacyIcon/utils.ts
  • packages/bezier-react/src/components/LegacyStack/LegacyStack.stories.tsx
  • packages/bezier-react/src/components/LegacyTooltip/LegacyTooltip.module.scss
  • packages/bezier-react/src/components/LegacyTooltip/LegacyTooltip.stories.tsx
  • packages/bezier-react/src/components/LegacyTooltip/LegacyTooltipContent.tsx
  • packages/bezier-react/src/components/ListItem/ListItem.module.scss
  • packages/bezier-react/src/components/ListItem/ListItem.tsx
  • packages/bezier-react/src/components/Modal/Modal.module.scss
  • packages/bezier-react/src/components/Modal/Modal.tsx
  • packages/bezier-react/src/components/NavGroup/NavGroup.stories.tsx
  • packages/bezier-react/src/components/NavGroup/NavGroup.test.tsx
  • packages/bezier-react/src/components/NavGroup/NavGroup.tsx
  • packages/bezier-react/src/components/NavItem/NavItem.module.scss
  • packages/bezier-react/src/components/NavItem/NavItem.stories.tsx
  • packages/bezier-react/src/components/NavItem/NavItem.test.tsx
  • packages/bezier-react/src/components/NavItem/NavItem.tsx
  • packages/bezier-react/src/components/OutlineItem/OutlineItem.module.scss
  • packages/bezier-react/src/components/OutlineItem/OutlineItem.tsx
  • packages/bezier-react/src/components/Overlay/Overlay.module.scss
  • packages/bezier-react/src/components/Overlay/Overlay.stories.tsx
  • packages/bezier-react/src/components/ProgressBar/ProgressBar.module.scss
  • packages/bezier-react/src/components/ProgressBar/ProgressBar.stories.tsx
  • packages/bezier-react/src/components/RadioGroup/RadioGroup.module.scss
  • packages/bezier-react/src/components/RadioGroup/RadioGroup.tsx
  • packages/bezier-react/src/components/SectionLabel/SectionLabel.tsx
  • packages/bezier-react/src/components/SegmentedControl/SegmentedControl.module.scss
  • packages/bezier-react/src/components/SegmentedControl/SegmentedControl.stories.tsx
  • packages/bezier-react/src/components/Select/Select.module.scss
  • packages/bezier-react/src/components/Select/Select.tsx
  • packages/bezier-react/src/components/Select/Select.types.ts
  • packages/bezier-react/src/components/Slider/Slider.module.scss
  • packages/bezier-react/src/components/SmoothCornersBox/SmoothCornersBox.stories.tsx
  • packages/bezier-react/src/components/SmoothCornersBox/SmoothCornersBox.test.tsx
  • packages/bezier-react/src/components/SmoothCornersBox/SmoothCornersBox.tsx
  • packages/bezier-react/src/components/SmoothCornersBox/SmoothCornersBox.types.ts
  • packages/bezier-react/src/components/Spinner/Spinner.test.tsx
  • packages/bezier-react/src/components/Spinner/Spinner.tsx
  • packages/bezier-react/src/components/Stack/Stack.stories.tsx
  • packages/bezier-react/src/components/Status/Status.module.scss
  • packages/bezier-react/src/components/Status/Status.stories.tsx
  • packages/bezier-react/src/components/Status/Status.test.tsx
  • packages/bezier-react/src/components/Status/Status.tsx
  • packages/bezier-react/src/components/Switch/Switch.module.scss
  • packages/bezier-react/src/components/Tabs/Tabs.module.scss
  • packages/bezier-react/src/components/Tabs/Tabs.stories.tsx
  • packages/bezier-react/src/components/Tag/Tag.module.scss
  • packages/bezier-react/src/components/Tag/Tag.tsx
  • packages/bezier-react/src/components/Text/Text.module.scss
  • packages/bezier-react/src/components/Text/Text.stories.tsx
  • packages/bezier-react/src/components/Text/Text.tsx
  • packages/bezier-react/src/components/Text/Text.types.ts
  • packages/bezier-react/src/components/TextArea/TextArea.module.scss
  • packages/bezier-react/src/components/TextField/TextField.module.scss
  • packages/bezier-react/src/components/TextField/TextField.test.tsx
  • packages/bezier-react/src/components/TextField/TextField.tsx
  • packages/bezier-react/src/components/ThemeProvider/ThemeProvider.tsx
  • packages/bezier-react/src/components/ThemeProvider/index.ts
  • packages/bezier-react/src/components/Toast/Toast.module.scss
  • packages/bezier-react/src/components/Toast/Toast.tsx
  • packages/bezier-react/src/components/Tooltip/Tooltip.module.scss
  • packages/bezier-react/src/components/Tooltip/Tooltip.tsx
  • packages/bezier-react/src/index.ts
  • packages/bezier-react/src/styles/_base.scss
  • packages/bezier-react/src/styles/_tokens.scss
  • packages/bezier-react/src/styles/components/elevation.module.scss
  • packages/bezier-react/src/styles/components/radius.module.scss
  • packages/bezier-react/src/styles/components/z-index.module.scss
  • packages/bezier-react/src/styles/mixins/_typography.scss
  • packages/bezier-react/src/types/beta-tokens.ts
  • packages/bezier-react/src/types/props-helpers.ts
  • packages/bezier-react/src/types/props.ts
  • packages/bezier-react/src/types/utils.ts
  • packages/bezier-react/src/utils/style.test.ts
  • packages/bezier-react/src/utils/style.ts
  • packages/bezier-tokens/CHANGELOG.md
  • packages/bezier-tokens/package.json
  • packages/bezier-tokens/scripts/build-tokens.ts
  • packages/bezier-tokens/scripts/lib/format.ts
  • packages/bezier-tokens/scripts/lib/transform.ts
  • packages/bezier-tokens/scripts/lib/utils.ts
  • packages/bezier-tokens/scripts/validate-token-references.ts
  • packages/bezier-tokens/src/beta/global/color.json
  • packages/bezier-tokens/src/beta/global/dimension.json
  • packages/bezier-tokens/src/beta/global/layer.json
  • packages/bezier-tokens/src/beta/global/motion.json
  • packages/bezier-tokens/src/beta/global/typography.json
  • packages/bezier-tokens/src/beta/semantic/backdrop.json
  • packages/bezier-tokens/src/beta/semantic/border.json
  • packages/bezier-tokens/src/beta/semantic/dark-theme/color.json
  • packages/bezier-tokens/src/beta/semantic/elevation.json
  • packages/bezier-tokens/src/beta/semantic/layer.json
  • packages/bezier-tokens/src/beta/semantic/light-theme/color.json
  • packages/bezier-tokens/src/beta/semantic/motion.json
  • packages/bezier-tokens/src/beta/semantic/opacity.json
  • packages/bezier-tokens/src/beta/semantic/radius.json
  • packages/bezier-tokens/src/beta/semantic/state.json
  • packages/bezier-tokens/src/beta/semantic/typography.json
  • packages/stylelint-bezier/CHANGELOG.md
  • packages/stylelint-bezier/package.json
  • packages/stylelint-bezier/src/plugins/validate-token/index.ts
💤 Files with no reviewable changes (1)
  • packages/bezier-react/src/components/KeyValueItem/KeyValueItem.test.tsx
🧰 Additional context used
🧬 Code graph analysis (29)
packages/bezier-react/src/components/Text/Text.types.ts (2)
packages/bezier-react/src/types/tokens.ts (1)
  • SemanticColor (31-31)
packages/bezier-react/src/types/beta-tokens.ts (1)
  • BetaSemanticColor (38-41)
packages/bezier-react/src/components/TextField/TextField.test.tsx (2)
packages/bezier-react/src/utils/test.tsx (1)
  • render (16-25)
packages/bezier-react/src/components/TextField/TextField.tsx (1)
  • TextField (164-445)
packages/bezier-react/src/components/AvatarGroup/AvatarGroup.tsx (1)
packages/bezier-react/src/components/Icon/Icon.tsx (1)
  • Icon (16-51)
packages/bezier-react/src/components/Tabs/Tabs.stories.tsx (3)
packages/bezier-react/src/components/Text/Text.tsx (1)
  • Text (28-76)
packages/bezier-react/src/components/Tabs/Tabs.tsx (1)
  • TabContent (223-235)
packages/bezier-react/src/components/Tabs/index.ts (1)
  • TabContent (4-4)
packages/bezier-react/src/components/SmoothCornersBox/SmoothCornersBox.tsx (1)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/Select/Select.types.ts (2)
packages/bezier-react/src/types/tokens.ts (1)
  • ZIndex (29-29)
packages/bezier-react/src/types/beta-tokens.ts (1)
  • BetaZIndex (123-126)
packages/bezier-react/src/components/Spinner/Spinner.test.tsx (2)
packages/bezier-react/src/components/Spinner/Spinner.tsx (1)
  • SPINNER_TEST_ID (14-14)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/Text/Text.tsx (1)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/Spinner/Spinner.tsx (1)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/Button/Button.stories.tsx (2)
packages/bezier-react/src/components/Text/Text.tsx (1)
  • Text (28-76)
packages/bezier-react/src/components/Text/index.ts (1)
  • Text (1-1)
packages/bezier-react/src/components/Status/Status.test.tsx (3)
packages/bezier-react/src/utils/test.tsx (1)
  • render (16-25)
packages/bezier-react/src/components/Status/Status.tsx (1)
  • Status (34-65)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.test.tsx (3)
packages/bezier-react/src/utils/test.tsx (1)
  • render (16-25)
packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.tsx (1)
  • StatusBadge (31-79)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/Tooltip/Tooltip.tsx (1)
packages/bezier-react/src/components/Text/Text.tsx (1)
  • Text (28-76)
packages/bezier-react/src/components/BetaTokenProvider/TokenProvider.tsx (4)
packages/bezier-react/src/utils/react.ts (1)
  • createContext (31-49)
packages/bezier-react/src/components/BetaTokenProvider/TokenProvider.types.ts (3)
  • TokenContextValue (12-15)
  • ThemeSpecificTokens (7-10)
  • TokenProviderProps (17-20)
packages/bezier-react/src/types/beta-tokens.ts (1)
  • BetaThemeName (10-10)
packages/bezier-react/src/components/BetaTokenProvider/index.ts (2)
  • TokenProvider (2-2)
  • TokenProviderProps (5-5)
packages/bezier-react/src/components/SmoothCornersBox/SmoothCornersBox.types.ts (1)
packages/bezier-react/src/types/beta-tokens.ts (1)
  • BetaSemanticColor (38-41)
packages/bezier-react/src/components/Icon/Icon.tsx (1)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/NavGroup/NavGroup.test.tsx (3)
packages/bezier-react/src/utils/test.tsx (1)
  • render (16-25)
packages/bezier-react/src/components/NavGroup/NavGroup.tsx (1)
  • NavGroup (34-125)
packages/bezier-react/src/components/NavItem/NavItem.tsx (1)
  • NavItem (35-101)
packages/bezier-react/src/utils/style.test.ts (1)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/AlphaStatusBadge/StatusBadge.tsx (2)
packages/bezier-react/src/types/beta-tokens.ts (1)
  • BetaSemanticColor (38-41)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/components/AlphaAvatarGroup/AvatarGroup.tsx (1)
packages/bezier-react/src/components/Icon/Icon.tsx (1)
  • Icon (16-51)
packages/bezier-react/src/types/props-helpers.ts (3)
packages/bezier-react/src/types/tokens.ts (2)
  • Elevation (41-44)
  • ZIndex (29-29)
packages/bezier-react/src/types/beta-tokens.ts (3)
  • BetaElevation (115-118)
  • BetaRadius (99-102)
  • BetaZIndex (123-126)
packages/bezier-react/src/utils/style.ts (1)
  • colorTokenCssVar (69-95)
packages/bezier-react/src/utils/style.ts (2)
packages/bezier-react/src/types/tokens.ts (2)
  • FlattenAllToken (19-19)
  • SemanticColor (31-31)
packages/bezier-react/src/types/beta-tokens.ts (2)
  • BetaFlattenAllToken (23-25)
  • BetaSemanticColor (38-41)
packages/bezier-react/src/types/beta-tokens.ts (1)
packages/bezier-react/src/types/utils.ts (3)
  • ExtractKeys (16-16)
  • RemovePrefix (1-4)
  • StartsWithPrefix (6-14)
packages/bezier-react/src/components/Icon/Icon.stories.tsx (6)
packages/bezier-react/src/types/beta-tokens.ts (1)
  • BetaSemanticColor (38-41)
packages/bezier-react/src/components/ThemeProvider/ThemeProvider.tsx (1)
  • useBetaTokens (48-50)
packages/bezier-react/src/components/ThemeProvider/index.ts (1)
  • useBetaTokens (9-9)
packages/bezier-react/src/components/ListItem/ListItem.tsx (1)
  • ListItem (30-130)
packages/bezier-react/src/components/Text/Text.tsx (1)
  • Text (28-76)
packages/bezier-react/src/components/Icon/Icon.tsx (1)
  • Icon (16-51)
packages/bezier-react/src/components/ThemeProvider/ThemeProvider.tsx (2)
packages/bezier-react/src/components/ThemeProvider/index.ts (1)
  • useBetaTokens (9-9)
packages/bezier-react/src/components/BetaTokenProvider/index.ts (1)
  • useBetaTokenContext (3-3)
packages/bezier-react/src/components/Icon/Icon.test.tsx (1)
packages/bezier-react/src/components/Icon/Icon.tsx (1)
  • ICON_TEST_ID (14-14)
packages/bezier-tokens/scripts/lib/transform.ts (1)
packages/bezier-tokens/scripts/lib/utils.ts (1)
  • toPx (15-22)
packages/bezier-react/src/components/AlphaAvatar/Avatar.tsx (2)
packages/bezier-react/src/components/Avatar/Avatar.tsx (1)
  • useAvatarRadiusToken (26-28)
packages/bezier-react/src/components/AlphaAvatar/index.ts (1)
  • useAvatarRadiusToken (3-3)
packages/bezier-react/src/types/props.ts (2)
packages/bezier-react/src/types/tokens.ts (7)
  • SemanticColor (31-31)
  • BackgroundSemanticColor (32-32)
  • BackgroundTextSemanticColor (33-36)
  • BorderSemanticColor (38-38)
  • Radius (24-24)
  • Elevation (41-44)
  • ZIndex (29-29)
packages/bezier-react/src/types/beta-tokens.ts (7)
  • BetaSemanticColor (38-41)
  • BetaBackgroundSemanticColor (68-71)
  • BetaTextSemanticColor (46-46)
  • BetaBorderSemanticColor (75-78)
  • BetaRadius (99-102)
  • BetaElevation (115-118)
  • BetaZIndex (123-126)


### Patch Changes

- Add invese color tokens and update grey-\* color value. Update bezier component colors ([#2767](https://github.com/channel-io/bezier-react/pull/2767)) by @timok1m
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

오타: "invese"는 "inverse"로 수정해야 합니다.

✏️ 오타 수정
-- Add invese color tokens and update grey-\* color value. Update bezier component colors ([#2767](https://github.com/channel-io/bezier-react/pull/2767)) by @timok1m
+- Add inverse color tokens and update grey-\* color value. Update bezier component colors ([#2767](https://github.com/channel-io/bezier-react/pull/2767)) by @timok1m
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Add invese color tokens and update grey-\* color value. Update bezier component colors ([#2767](https://github.com/channel-io/bezier-react/pull/2767)) by @timok1m
- Add inverse color tokens and update grey-\* color value. Update bezier component colors ([#2767](https://github.com/channel-io/bezier-react/pull/2767)) by @timok1m
🤖 Prompt for AI Agents
In @packages/bezier-react/CHANGELOG.md at line 23, Fix the typo in the CHANGELOG
entry: replace "invese" with "inverse" in the changed line that currently reads
"Add invese color tokens and update grey- * color value. Update bezier component
colors ..." so the text becomes "Add inverse color tokens and update grey-*
color value. Update bezier component colors ...".

red: var(--color-text-accent-red),
orange: var(--color-text-accent-orange),
green: var(--color-text-accent-green),
pink: var(--color-text-accent-pink,),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

CSS 구문 오류: var() 내부에 불필요한 쉼표가 있습니다.

var(--color-text-accent-pink,)에서 쉼표 뒤에 fallback 값이 없습니다. 이는 의도하지 않은 동작을 유발할 수 있습니다.

🐛 수정 제안
-      pink: var(--color-text-accent-pink,),
+      pink: var(--color-text-accent-pink),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pink: var(--color-text-accent-pink,),
pink: var(--color-text-accent-pink),
🤖 Prompt for AI Agents
In @packages/bezier-react/src/components/AlphaButton/Button.module.scss at line
142, The CSS contains a syntax error: the declaration for the "pink" token uses
var(--color-text-accent-pink,) with an extraneous trailing comma; remove the
trailing comma or provide a valid fallback value inside the var() so the "pink"
property becomes var(--color-text-accent-pink) or var(--color-text-accent-pink,
<fallback>), fixing the invalid CSS in Button.module.scss.

Comment on lines +54 to +62
it('should use text-accent-yellow when doNotDisturb is true and online is false', () => {
const { container } = renderStatusBadge({
online: false,
doNotDisturb: true,
})
const badge = container.querySelector('div')
const expectedColor = colorTokenCssVar('surface-high')
expect(badge).toHaveStyle(`--b-status-bg-color: ${expectedColor}`)
})
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

테스트 설명이 실제 검증 내용과 일치하지 않습니다.

테스트 이름은 "text-accent-yellow"를 언급하지만, 실제로는 backgroundColorsurface-high인지 확인합니다. 이 테스트는 iconColor 로직이 아닌 backgroundColor 로직을 테스트하므로 혼란을 줄 수 있습니다.

✏️ 테스트 설명 수정 제안
-    it('should use text-accent-yellow when doNotDisturb is true and online is false', () => {
+    it('should use surface-high for background when doNotDisturb is true', () => {

Comment on lines +61 to +62
box-shadow: var(--state-input-default);
box-shadow: 0 0 0 1px var(--color-fill-accent-blue-heavier) inset;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

중복된 box-shadow 선언을 확인하세요.

61번 라인의 box-shadow: var(--state-input-default);가 62번 라인의 인셋 그림자 선언에 의해 즉시 재정의됩니다. 첫 번째 선언이 의도적인 폴백인지, 아니면 리팩토링 과정에서 남겨진 불필요한 코드인지 확인이 필요합니다.

🐛 제안된 수정

불필요한 경우 첫 번째 선언을 제거하세요:

     &:where(.variant-primary) {
       background-color: var(--color-fill-accent-blue);
-      box-shadow: var(--state-input-default);
       box-shadow: 0 0 0 1px var(--color-fill-accent-blue-heavier) inset;
     }

또는 두 그림자를 결합하려는 의도였다면 쉼표로 구분하세요:

     &:where(.variant-primary) {
       background-color: var(--color-fill-accent-blue);
-      box-shadow: var(--state-input-default);
-      box-shadow: 0 0 0 1px var(--color-fill-accent-blue-heavier) inset;
+      box-shadow: var(--state-input-default), 0 0 0 1px var(--color-fill-accent-blue-heavier) inset;
     }
🤖 Prompt for AI Agents
In
@packages/bezier-react/src/components/AlphaToggleButton/ToggleButton.module.scss
around lines 61 - 62, Remove the redundant box-shadow declaration in
ToggleButton.module.scss: the first box-shadow: var(--state-input-default) is
immediately overridden by the inset declaration on the following line; either
delete the first fallback if it's unnecessary or merge the two values into a
single comma-separated box-shadow if both effects are required, updating the
rules where box-shadow appears in the AlphaToggleButton/ToggleButton styles.

Comment on lines 22 to 60
&:where(.variant-default) {
--b-tag-badge-background-color: var(--bg-black-lighter);
--b-tag-badge-color: var(--txt-black-darkest);
--b-tag-badge-background-color: var(--color-fill-neutral-light);
--b-tag-badge-color: var(--color-text-neutral);
}

&:where(.variant-monochrome-light) {
--b-tag-badge-background-color: var(--bg-black-lighter);
--b-tag-badge-color: var(--txt-black-dark);
--b-tag-badge-background-color: var(--color-fill-neutral-light);
--b-tag-badge-color: var(--color-text-neutral-lighter);
}

&:where(.variant-monochrome-dark) {
--b-tag-badge-background-color: var(--bg-black-darker);
--b-tag-badge-color: var(--bgtxt-absolute-white-dark);
--b-tag-badge-background-color: var(--color-fill-neutral-heavier);
--b-tag-badge-color: var(--color-text-absolute-white);
}

&:where(.variant-blue) {
--b-tag-badge-background-color: var(--bgtxt-blue-lighter);
--b-tag-badge-color: var(--bgtxt-blue-normal);
--b-tag-badge-background-color: var(--color-fill-accent-blue-heavy);
--b-tag-badge-color: var(--color-text-accent-blue);
}

&:where(.variant-cobalt) {
--b-tag-badge-background-color: var(--bgtxt-cobalt-lighter);
--b-tag-badge-color: var(--bgtxt-cobalt-normal);
--b-tag-badge-background-color: var(--color-fill-accent-cobalt-heavy);
--b-tag-badge-color: var(--color-text-accent-cobalt);
}

&:where(.variant-teal) {
--b-tag-badge-background-color: var(--bgtxt-teal-lighter);
--b-tag-badge-color: var(--bgtxt-teal-normal);
--b-tag-badge-background-color: var(--color-fill-accent-teal-heavy);
--b-tag-badge-color: var(--color-text-accent-teal);
}

&:where(.variant-green) {
--b-tag-badge-background-color: var(--bgtxt-green-lighter);
--b-tag-badge-color: var(--bgtxt-green-normal);
--b-tag-badge-background-color: var(--color-fill-accent-green-heavy);
--b-tag-badge-color: var(--color-text-accent-green);
}

&:where(.variant-olive) {
--b-tag-badge-background-color: var(--bgtxt-olive-lighter);
--b-tag-badge-color: var(--bgtxt-olive-normal);
--b-tag-badge-background-color: var(--color-fill-accent-olive-heavy);
--b-tag-badge-color: var(--color-fill-accent-olive-heavier);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

olive variant의 텍스트 컬러가 color-text-*가 아니라 color-fill-*로 설정되어 있어 보입니다(오타 가능성 큼).

Line 59에서 --b-tag-badge-color에 fill 토큰을 넣고 있어서, 실제 텍스트 컬러가 의도와 다르게 나올 가능성이 큽니다. 다른 variant들과 패턴도 불일치합니다.

수정 제안(diff)
   &:where(.variant-olive) {
     --b-tag-badge-background-color: var(--color-fill-accent-olive-heavy);
-    --b-tag-badge-color: var(--color-fill-accent-olive-heavier);
+    --b-tag-badge-color: var(--color-text-accent-olive);
   }
🤖 Prompt for AI Agents
In @packages/bezier-react/src/components/BaseTagBadge/BaseTagBadge.module.scss
around lines 22 - 60, The olive variant sets --b-tag-badge-color to a fill token
by mistake; update the .variant-olive block so --b-tag-badge-color uses the
correct text token (consistent with other variants) instead of a color-fill
token. Locate the &:where(.variant-olive) rule and replace the current value
assigned to --b-tag-badge-color with the proper --color-text-accent-olive (or
the project's equivalent text token) so text color matches other variants.

Comment on lines +15 to +22
export const toPx = (value: string) => {
const trimmed = value.trim()
if (!/^[+-]?\d+(\.\d+)?$/.test(trimmed)) {
return value
}
const numeric = extractNumber(trimmed)
return numeric ? `${numeric}px` : `${trimmed}px`
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

비정형 입력값 처리 시 원본 값 대신 트림된 값을 반환해야 합니다.

Line 18에서 정규식 테스트를 통과하지 못한 경우 value를 반환하는데, 이는 함수 시작 시 수행한 trim() 결과를 무시합니다. 공백이 포함된 입력값(예: " 10px ")이 전달되면 공백이 그대로 보존된 값이 반환됩니다.

🐛 제안된 수정
 export const toPx = (value: string) => {
   const trimmed = value.trim()
   if (!/^[+-]?\d+(\.\d+)?$/.test(trimmed)) {
-    return value
+    return trimmed
   }
   const numeric = extractNumber(trimmed)
   return numeric ? `${numeric}px` : `${trimmed}px`
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const toPx = (value: string) => {
const trimmed = value.trim()
if (!/^[+-]?\d+(\.\d+)?$/.test(trimmed)) {
return value
}
const numeric = extractNumber(trimmed)
return numeric ? `${numeric}px` : `${trimmed}px`
}
export const toPx = (value: string) => {
const trimmed = value.trim()
if (!/^[+-]?\d+(\.\d+)?$/.test(trimmed)) {
return trimmed
}
const numeric = extractNumber(trimmed)
return numeric ? `${numeric}px` : `${trimmed}px`
}
🤖 Prompt for AI Agents
In @packages/bezier-tokens/scripts/lib/utils.ts around lines 15 - 22, The toPx
function returns the original value when the regex test fails, which preserves
unwanted surrounding whitespace; change that return to use the trimmed string
instead (use the local trimmed variable) so non-matching inputs like " 10px "
return "10px" rather than the raw value; ensure the regex check and subsequent
logic consistently operate on trimmed rather than the original value.

Comment on lines +1 to +12
{
"backdrop": {
"large": {
"value": "{dimension.60}",
"type": "backdrop"
},
"small": {
"value": "{dimension.6}",
"type": "backdrop"
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Search for backdrop type handling in the codebase
rg -n --type=ts --type=js '"backdrop"' -C 3

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Search for token type definitions and schema files
fd -e json -e ts -e js | grep -E '(schema|type|token)' | head -20

Repository: channel-io/bezier-react

Length of output: 1536


🏁 Script executed:

# Look for backdrop specific references
rg -n 'backdrop' --type=ts --type=js --type=json | head -30

Repository: channel-io/bezier-react

Length of output: 303


🏁 Script executed:

# Search for token builder/validator files
fd -e ts -e js | xargs rg -l 'token.*builder\|validator' | head -10

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Find all files in bezier-tokens related to token building/processing
find packages/bezier-tokens -type f \( -name "*.ts" -o -name "*.js" \) | head -20

Repository: channel-io/bezier-react

Length of output: 490


🏁 Script executed:

# Look for type definitions/schema files
find packages/bezier-tokens -type f \( -name "*.ts" -o -name "*.json" \) | grep -iE '(type|schema|define)' | head -20

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Search for token builder or processor logic
rg -n 'type.*backdrop\|backdrop.*type' packages/bezier-tokens/ -C 3

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check the token type definitions in bezier-tokens
find packages/bezier-tokens -name "*.json" | xargs rg -l 'type' | head -10

Repository: channel-io/bezier-react

Length of output: 589


🏁 Script executed:

# Look for token generation or output files
find packages/bezier-tokens -type d -name 'dist' -o -name 'build' -o -name 'generated'

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Read the build-tokens.ts to understand the processing pipeline
cat packages/bezier-tokens/scripts/build-tokens.ts

Repository: channel-io/bezier-react

Length of output: 8822


🏁 Script executed:

# Read the transform.ts which likely handles token transformation
cat packages/bezier-tokens/scripts/lib/transform.ts

Repository: channel-io/bezier-react

Length of output: 4358


🏁 Script executed:

# Look for where token types are defined or validated
rg -n 'type.*:' packages/bezier-tokens/scripts/ -A 2 -B 2

Repository: channel-io/bezier-react

Length of output: 5018


🏁 Script executed:

# Check for any JSON files that might define valid token types
find packages/bezier-tokens -name "*.json" -type f | xargs grep -l '"type"' | head -10

Repository: channel-io/bezier-react

Length of output: 627


🏁 Script executed:

# Look for backdrop type in any configuration or type definition
rg -n 'backdrop' packages/bezier-tokens/

Repository: channel-io/bezier-react

Length of output: 303


🏁 Script executed:

# Check if there are any generated output files with backdrop tokens
find packages/bezier-tokens/dist -type f -name "*.css" -o -name "*.js" -o -name "*.mjs" 2>/dev/null | head -5

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Look for validation logic
cat packages/bezier-tokens/scripts/validate-token-references.ts

Repository: channel-io/bezier-react

Length of output: 4869


🏁 Script executed:

# Search for any mention of valid token types or schema
rg -n 'valid.*type\|type.*valid\|backdrop' packages/bezier-tokens/scripts/ -B 2 -A 2

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check the beta semantic directory to see all token files
ls -la packages/bezier-tokens/src/beta/semantic/

Repository: channel-io/bezier-react

Length of output: 856


🏁 Script executed:

# Look for any type restrictions or schema definitions
find packages/bezier-tokens -name "*.json" -type f -exec grep -l '"type".*:' {} \; | xargs head -30

Repository: channel-io/bezier-react

Length of output: 19217


🏁 Script executed:

# Check if backdrop CSS variables exist in generated files
find packages/bezier-tokens/dist -type f \( -name "*.css" -o -name "*.js" -o -name "*.mjs" \) 2>/dev/null | head -10

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Search for any mention of backdrop in generated output or documentation
rg -n 'backdrop' packages/bezier-tokens/dist/ 2>/dev/null || echo "No backdrop found in dist"

Repository: channel-io/bezier-react

Length of output: 92


🏁 Script executed:

# Look for any comments or TODOs about backdrop type
rg -n 'backdrop' packages/bezier-tokens/src/ --type=ts --type=js --type=json -B 2 -A 2

Repository: channel-io/bezier-react

Length of output: 875


🏁 Script executed:

# Check if there's any documentation about supported token types
find packages/bezier-tokens -name "*.md" -o -name "README*" | head -5

Repository: channel-io/bezier-react

Length of output: 135


🏁 Script executed:

# Look at the full backdrop.json file again with context
cat -n packages/bezier-tokens/src/beta/semantic/backdrop.json

Repository: channel-io/bezier-react

Length of output: 332


🏁 Script executed:

# Check README for information about token types
head -50 packages/bezier-tokens/README.md

Repository: channel-io/bezier-react

Length of output: 1157


🏁 Script executed:

# Search for how tokens are filtered or processed
rg -n 'filter.*type\|type.*filter' packages/bezier-tokens/scripts/ -B 2 -A 2

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Look for where backdrop tokens might be excluded or filtered out
rg -n 'backdrop\|exclude\|ignore' packages/bezier-tokens/ --type=ts --type=js -B 2 -A 2

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check if Style Dictionary has any documentation comment or type checking
rg -n 'StyleDictionary\|token.*type' packages/bezier-tokens/scripts/build-tokens.ts -B 1 -A 1

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Look at a working token type (like shadow) to understand the pattern
cat packages/bezier-tokens/src/beta/semantic/elevation.json | head -40

Repository: channel-io/bezier-react

Length of output: 1049


🏁 Script executed:

# Check if there are any build logs or error messages about backdrop
cat packages/bezier-tokens/CHANGELOG.md | head -50

Repository: channel-io/bezier-react

Length of output: 1640


🏁 Script executed:

# Search more broadly for backdrop references in the entire repo
rg -n 'backdrop' packages/bezier-tokens/ --type=json --type=ts --type=js --type=md

Repository: channel-io/bezier-react

Length of output: 303


🏁 Script executed:

# Check if there's a specific type schema or validation
find packages/bezier-tokens -type f \( -name "*.json" -o -name "*.ts" \) | xargs grep -l '"type"' | xargs grep -l 'schema\|valid' 2>/dev/null || echo "No schema found"

Repository: channel-io/bezier-react

Length of output: 149


🏁 Script executed:

# Verify that other semantic tokens DO appear in generated output
rg -n 'elevation' packages/bezier-tokens/dist/ 2>/dev/null || echo "No elevation found"
rg -n 'border' packages/bezier-tokens/dist/ 2>/dev/null | head -5 || echo "No border found"

Repository: channel-io/bezier-react

Length of output: 85


🏁 Script executed:

# List actual files in the dist directory
find packages/bezier-tokens/dist -type f | head -20

Repository: channel-io/bezier-react

Length of output: 129


🏁 Script executed:

# Check what files are actually generated
ls -la packages/bezier-tokens/dist/ 2>/dev/null || echo "dist not found"

Repository: channel-io/bezier-react

Length of output: 81


🏁 Script executed:

# Try building and check what happens
cd packages/bezier-tokens && npm run build 2>&1 | head -50

Repository: channel-io/bezier-react

Length of output: 558


🏁 Script executed:

# Look for any recent changes or PRs mentioning backdrop
git log --all --oneline --grep="backdrop" 2>/dev/null | head -10

Repository: channel-io/bezier-react

Length of output: 139


🏁 Script executed:

# Check git history of backdrop.json file
git log --oneline packages/bezier-tokens/src/beta/semantic/backdrop.json 2>/dev/null | head -10

Repository: channel-io/bezier-react

Length of output: 136


🏁 Script executed:

# Check the full git history for backdrop.json
git log --all --pretty=format:"%h %s" -- packages/bezier-tokens/src/beta/semantic/backdrop.json 2>/dev/null

Repository: channel-io/bezier-react

Length of output: 136


🏁 Script executed:

# Get more detail on that commit
git show 8e741ca5 --stat 2>/dev/null | head -50

Repository: channel-io/bezier-react

Length of output: 1912


🏁 Script executed:

# Check if backdrop.json was added in a recent PR
git log --all --oneline -20 -- packages/bezier-tokens/src/beta/semantic/ 2>/dev/null

Repository: channel-io/bezier-react

Length of output: 136


🏁 Script executed:

# Look at the specific commit that mentions backdrop
git log -p --all -- packages/bezier-tokens/src/beta/semantic/backdrop.json 2>/dev/null | head -100

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check if "backdrop" type is mentioned anywhere in issues or discussions
rg -n 'backdrop' . --type=md --type=txt 2>/dev/null | head -20

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check if other semantic tokens without explicit transformers work
rg -n '"type"' packages/bezier-tokens/src/beta/semantic/ --type=json | cut -d: -f3 | sort | uniq -c | sort -rn

Repository: channel-io/bezier-react

Length of output: 273


🏁 Script executed:

# List all unique token types in beta semantic
find packages/bezier-tokens/src/beta/semantic -name "*.json" -type f | xargs cat | grep -o '"type"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"\([^"]*\)".*/\1/' | sort | uniq

Repository: channel-io/bezier-react

Length of output: 145


🏁 Script executed:

# Check CSSTransforms more carefully for all handled types
rg -n 'matcher.*token\.type' packages/bezier-tokens/scripts/lib/transform.ts -A 1

Repository: channel-io/bezier-react

Length of output: 519


🏁 Script executed:

# Check all the transformer matchers for all types
rg -n 'matcher:' packages/bezier-tokens/scripts/lib/transform.ts -A 1 | grep -E 'matcher:|type.*==='

Repository: channel-io/bezier-react

Length of output: 572


🏁 Script executed:

# Look for opacity, radius, z-index handling
rg -n '"opacity"|"radius"|"z-index"' packages/bezier-tokens/scripts/lib/transform.ts

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check if there are any issues or comments about missing backdrop transformer
rg -n 'TODO|FIXME|XXX|backdrop' packages/bezier-tokens/scripts/

Repository: channel-io/bezier-react

Length of output: 945


🏁 Script executed:

# Look at the full dimension transformer to understand how it works
sed -n '31,48p' packages/bezier-tokens/scripts/lib/transform.ts

Repository: channel-io/bezier-react

Length of output: 593


🏁 Script executed:

# Check what type transformers exist and which types DON'T have transformers
echo "=== Types in beta semantic ===" && \
find packages/bezier-tokens/src/beta/semantic -name "*.json" -exec grep -h '"type"' {} \; | sed 's/.*"\([^"]*\)".*/\1/' | sort | uniq -c && \
echo "" && \
echo "=== Explicit transformers in CSSTransforms ===" && \
grep -E "matcher.*token\.type ===" packages/bezier-tokens/scripts/lib/transform.ts | sed 's/.*token\.type === /  /' | sort

Repository: channel-io/bezier-react

Length of output: 371


🏁 Script executed:

# Check Style Dictionary documentation or package to understand default handling
cat packages/bezier-tokens/package.json | grep -A 5 '"style-dictionary"'

Repository: channel-io/bezier-react

Length of output: 164


🏁 Script executed:

# Search for any comments about types or filtering
rg -n 'type\|Type' packages/bezier-tokens/scripts/lib/format.ts -B 1 -A 1 | head -40

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Verify Style Dictionary's supported token types
cat packages/bezier-tokens/package.json | grep -E '"name"|"version"|"style-dictionary"' | head -3

Repository: channel-io/bezier-react

Length of output: 168


🏁 Script executed:

# Check if backdrop tokens with type "backdrop" would be filtered out by Style Dictionary
rg -n 'backdrop' packages/bezier-tokens/ --type=json --type=ts | wc -l

Repository: channel-io/bezier-react

Length of output: 68


🏁 Script executed:

# Look at how other non-transformed types like color, opacity, radius are handled
rg -n 'color\|opacity\|radius' packages/bezier-tokens/src/beta/semantic/ --type=json | grep '"type"' | head -10

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Check if there's any filtering based on type in the build process
rg -n 'filter\|filterGroup\|type.*match' packages/bezier-tokens/scripts/build-tokens.ts -B 2 -A 2

Repository: channel-io/bezier-react

Length of output: 49


🏁 Script executed:

# Final check: confirm backdrop tokens don't appear in output by checking any cached/example output
find packages/bezier-tokens -type f -name "*.css" -o -name "*.mjs" -o -name "*.js" 2>/dev/null | xargs grep -l 'backdrop' 2>/dev/null || echo "No backdrop in output files"

Repository: channel-io/bezier-react

Length of output: 94


backdrop 타입이 Style Dictionary에서 지원되지 않아 토큰이 생성되지 않습니다.

backdrop 타입은 등록된 커스텀 변환기(CSSTransforms)에 없으며, Style Dictionary의 표준 타입도 아닙니다. 결과적으로 {dimension.*} 참조가 해석되어도 최종 CSS/JS 산출물에 backdrop 관련 변수가 생성되지 않습니다.

backdrop 타입에 대한 명시적인 변환기를 추가하거나, 기존 표준 타입(color, dimension 등)으로 변경해야 합니다.

🤖 Prompt for AI Agents
In @packages/bezier-tokens/src/beta/semantic/backdrop.json around lines 1 - 12,
The tokens under the "backdrop" object ("large" and "small") use a non-standard
"type": "backdrop" which Style Dictionary/CSSTransforms doesn't recognize, so no
output is generated; fix by either changing the token types to a supported type
(e.g., replace "type": "backdrop" with "type": "dimension" or "size" so the
"{dimension.60}" and "{dimension.6}" references are emitted), or register and
wire a custom CSSTransform named "backdrop" into your Style Dictionary build
(implement the transform and add it to transforms array) so tokens named
"backdrop.large"/"backdrop.small" are processed.

Comment on lines +14 to +57
"bottom": {
"value": {
"color": "{color.border.neutral.normal}",
"type": "dropShadow",
"offsetX": "0",
"offsetY": "{dimension.1-m}",
"blur": "0",
"spread": "0"
},
"type": "shadow"
},
"right": {
"value": {
"color": "{color.border.neutral.normal}",
"type": "dropShadow",
"offsetX": "{dimension.1-m}",
"offsetY": "0",
"blur": "0",
"spread": "0"
},
"type": "shadow"
},
"left": {
"value": {
"color": "{color.border.neutral.normal}",
"type": "dropShadow",
"offsetX": "{dimension.1}",
"offsetY": "0",
"blur": "0",
"spread": "0"
},
"type": "shadow"
},
"top": {
"value": {
"color": "{color.border.neutral.normal}",
"type": "dropShadow",
"offsetX": "0",
"offsetY": "{dimension.1}",
"blur": "0",
"spread": "0"
},
"type": "shadow"
},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, let's find the dimension token definitions
find packages/bezier-tokens -name "*.json" | head -20

Repository: channel-io/bezier-react

Length of output: 1123


🏁 Script executed:

# Look for dimension token definitions
rg "dimension" packages/bezier-tokens/src -l | head -10

Repository: channel-io/bezier-react

Length of output: 594


🏁 Script executed:

# Search for dimension.1 and dimension.1-m definitions
rg -n "1(-m)?" packages/bezier-tokens/src/beta/semantic/dimension.json 2>/dev/null || rg -rn '"1"' packages/bezier-tokens/src/beta -A 2 -B 2 | grep -i dimension

Repository: channel-io/bezier-react

Length of output: 483


🏁 Script executed:

# Let's examine the structure more carefully - find all dimension related files
fd -e json packages/bezier-tokens/src | grep -i dimension

Repository: channel-io/bezier-react

Length of output: 476


🏁 Script executed:

# Check the actual content of the border.json file to see the exact structure
cat -n packages/bezier-tokens/src/beta/semantic/border.json | head -100

Repository: channel-io/bezier-react

Length of output: 2765


🏁 Script executed:

# Also check what dimension files exist
find packages/bezier-tokens -name "*dimension*" -type f

Repository: channel-io/bezier-react

Length of output: 120


🏁 Script executed:

cat -n packages/bezier-tokens/src/beta/global/dimension.json

Repository: channel-io/bezier-react

Length of output: 3796


방향성 border의 오프셋 값이 모두 반대로 설정되어 있습니다.

dimension 토큰 값 확인:

  • dimension.1 = 1
  • dimension.1-m = -1

dropShadow를 사용한 border 시뮬레이션에서 오프셋 방향은 다음과 같아야 합니다:

  • bottom border → offsetY가 양수 필요 (현재: -1 ✗)
  • top border → offsetY가 음수 필요 (현재: +1 ✗)
  • right border → offsetX가 양수 필요 (현재: -1 ✗)
  • left border → offsetX가 음수 필요 (현재: +1 ✗)

모든 방향성 border(bottom, right, left, top)의 오프셋 값이 반대로 설정되어 있어 border가 의도한 반대편에 표시됩니다. 다음과 같이 수정이 필요합니다:

  • bottom: {dimension.1-m}{dimension.1}
  • right: {dimension.1-m}{dimension.1}
  • left: {dimension.1}{dimension.1-m}
  • top: {dimension.1}{dimension.1-m}
🤖 Prompt for AI Agents
In @packages/bezier-tokens/src/beta/semantic/border.json around lines 14 - 57,
The border dropShadow offsets are inverted: for tokens "bottom", "right",
"left", and "top" the dimension signs must be flipped so shadows render on the
intended side; update the offset values as follows—in "bottom" change offsetY
from {dimension.1-m} to {dimension.1}, in "right" change offsetX from
{dimension.1-m} to {dimension.1}, in "left" change offsetX from {dimension.1} to
{dimension.1-m}, and in "top" change offsetY from {dimension.1} to
{dimension.1-m} so the dropShadow simulates borders correctly.

Comment on lines +1 to +723
{
"color": {
"text": {
"action": {
"value": "{color.blue.400}",
"type": "color"
},
"success": {
"value": "{color.green.400}",
"type": "color"
},
"highlight": {
"value": "{color.cobalt.400}",
"type": "color"
},
"warning": {
"value": "{color.orange.400}",
"type": "color"
},
"critical": {
"value": "{color.red.400}",
"type": "color"
},
"neutral": {
"heaviest": {
"value": "{color.black.100}",
"type": "color"
},
"normal": {
"value": "{color.black.85}",
"type": "color"
},
"light": {
"value": "{color.black.60}",
"type": "color"
},
"lighter": {
"value": "{color.black.40}",
"type": "color"
}
},
"accent": {
"blue": {
"value": "{color.blue.400}",
"type": "color"
},
"cobalt": {
"value": "{color.cobalt.400}",
"type": "color"
},
"green": {
"value": "{color.green.400}",
"type": "color"
},
"red": {
"value": "{color.red.400}",
"type": "color"
},
"orange": {
"value": "{color.orange.400}",
"type": "color"
},
"yellow": {
"value": "{color.yellow.400}",
"type": "color"
},
"olive": {
"value": "{color.olive.300}",
"type": "color"
},
"teal": {
"value": "{color.teal.400}",
"type": "color"
},
"navy": {
"value": "{color.navy.400}",
"type": "color"
},
"purple": {
"value": "{color.purple.400}",
"type": "color"
},
"pink": {
"value": "{color.pink.400}",
"type": "color"
}
},
"absolute": {
"white": {
"value": "{color.white.100}",
"type": "color"
},
"black": {
"value": "{color.black.100}",
"type": "color"
}
},
"inverse": {
"value": "{color.white.100}",
"type": "color"
}
},
"icon": {
"action": {
"value": "{color.blue.400}",
"type": "color"
},
"success": {
"value": "{color.green.400}",
"type": "color"
},
"highlight": {
"value": "{color.cobalt.400}",
"type": "color"
},
"warning": {
"value": "{color.orange.400}",
"type": "color"
},
"critical": {
"value": "{color.red.400}",
"type": "color"
},
"neutral": {
"normal": {
"value": "{color.black.40}",
"type": "color"
},
"heavy": {
"value": "{color.black.60}",
"type": "color"
},
"heavier": {
"value": "{color.black.85}",
"type": "color"
}
},
"accent": {
"blue": {
"value": "{color.blue.400}",
"type": "color"
},
"cobalt": {
"value": "{color.cobalt.400}",
"type": "color"
},
"green": {
"value": "{color.green.400}",
"type": "color"
},
"red": {
"value": "{color.red.400}",
"type": "color"
},
"orange": {
"value": "{color.orange.400}",
"type": "color"
},
"yellow": {
"value": "{color.yellow.400}",
"type": "color"
},
"olive": {
"value": "{color.olive.400}",
"type": "color"
},
"teal": {
"value": "{color.teal.400}",
"type": "color"
},
"navy": {
"value": "{color.navy.400}",
"type": "color"
},
"purple": {
"value": "{color.purple.400}",
"type": "color"
},
"pink": {
"value": "{color.pink.400}",
"type": "color"
}
},
"absolute": {
"white": {
"value": "{color.white.100}",
"type": "color"
},
"black": {
"value": "{color.black.100}",
"type": "color"
}
},
"inverse": {
"heavier": { "value": "{color.white.100}", "type": "color" }
}
},
"fill": {
"neutral": {
"heaviest": {
"value": "{color.black.85}",
"type": "color"
},
"heavier": {
"value": "{color.black.40}",
"type": "color"
},
"heavy": {
"value": "{color.black.15}",
"type": "color"
},
"light": {
"value": "{color.black.5}",
"type": "color"
},
"lighter": {
"value": "{color.black.3}",
"type": "color"
},
"lightest": {
"value": "{color.black.1}",
"type": "color"
},
"transparent": {
"value": "{color.black.0}",
"type": "color"
}
},
"action": {
"normal": {
"value": "{color.blue.400}",
"type": "color"
},
"light": {
"value": "{color.blue.400-20}",
"type": "color"
},
"lighter": {
"value": "{color.blue.400-10}",
"type": "color"
},
"transparent": {
"value": "{color.blue.400-0}",
"type": "color"
}
},
"success": {
"normal": {
"value": "{color.green.400}",
"type": "color"
},
"light": {
"value": "{color.green.400-20}",
"type": "color"
},
"lighter": {
"value": "{color.green.400-10}",
"type": "color"
},
"transparent": {
"value": "{color.green.400-0}",
"type": "color"
}
},
"highlight": {
"normal": {
"value": "{color.cobalt.400}",
"type": "color"
},
"light": {
"value": "{color.cobalt.400-20}",
"type": "color"
},
"lighter": {
"value": "{color.cobalt.400-10}",
"type": "color"
},
"transparent": {
"value": "{color.cobalt.400-0}",
"type": "color"
}
},
"warning": {
"normal": {
"value": "{color.orange.400}",
"type": "color"
},
"light": {
"value": "{color.orange.400-20}",
"type": "color"
},
"lighter": {
"value": "{color.orange.400-10}",
"type": "color"
},
"transparent": {
"value": "{color.orange.400-0}",
"type": "color"
}
},
"critical": {
"normal": {
"value": "{color.red.400}",
"type": "color"
},
"light": {
"value": "{color.red.400-20}",
"type": "color"
},
"lighter": {
"value": "{color.red.400-10}",
"type": "color"
},
"transparent": {
"value": "{color.red.400-0}",
"type": "color"
}
},
"grey": {
"normal": {
"value": "{color.grey.50}",
"type": "color"
},
"heavy": {
"value": "{color.grey.100}",
"type": "color"
},
"heavier": {
"value": "{color.grey.200}",
"type": "color"
}
},
"accent": {
"blue": {
"normal": {
"value": "{color.blue.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.blue.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.blue.400}",
"type": "color"
},
"transparent": {
"value": "{color.blue.400-0}",
"type": "color"
}
},
"cobalt": {
"normal": {
"value": "{color.cobalt.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.cobalt.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.cobalt.400}",
"type": "color"
},
"transparent": {
"value": "{color.cobalt.400-0}",
"type": "color"
}
},
"green": {
"normal": {
"value": "{color.green.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.green.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.green.400}",
"type": "color"
},
"transparent": {
"value": "{color.green.400-0}",
"type": "color"
}
},
"red": {
"normal": {
"value": "{color.red.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.red.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.red.400}",
"type": "color"
},
"transparent": {
"value": "{color.red.400-0}",
"type": "color"
}
},
"orange": {
"normal": {
"value": "{color.orange.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.orange.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.orange.400}",
"type": "color"
},
"transparent": {
"value": "{color.orange.400-0}",
"type": "color"
}
},
"yellow": {
"normal": {
"value": "{color.yellow.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.yellow.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.yellow.400}",
"type": "color"
},
"transparent": {
"value": "{color.yellow.400-0}",
"type": "color"
}
},
"olive": {
"normal": {
"value": "{color.olive.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.olive.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.olive.400}",
"type": "color"
},
"transparent": {
"value": "{color.olive.400-0}",
"type": "color"
}
},
"teal": {
"normal": {
"value": "{color.teal.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.teal.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.teal.400}",
"type": "color"
},
"transparent": {
"value": "{color.teal.400-0}",
"type": "color"
}
},
"navy": {
"normal": {
"value": "{color.navy.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.navy.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.navy.400}",
"type": "color"
},
"transparent": {
"value": "{color.navy.400-0}",
"type": "color"
}
},
"purple": {
"normal": {
"value": "{color.purple.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.purple.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.purple.400}",
"type": "color"
},
"transparent": {
"value": "{color.purple.400-0}",
"type": "color"
}
},
"pink": {
"normal": {
"value": "{color.pink.400-10}",
"type": "color"
},
"heavy": {
"value": "{color.pink.400-20}",
"type": "color"
},
"heavier": {
"value": "{color.pink.400}",
"type": "color"
},
"transparent": {
"value": "{color.pink.400-0}",
"type": "color"
}
}
},
"absolute": {
"white": {
"normal": { "value": "{color.white.100}", "type": "color" },
"light": { "value": "{color.white.20}", "type": "color" },
"transparent": { "value": "{color.white.0}", "type": "color" }
},
"black": {
"normal": { "value": "{color.black.100}", "type": "color" },
"light": { "value": "{color.black.20}", "type": "color" },
"transparent": { "value": "{color.black.0}", "type": "color" }
}
},
"bright": {
"value": "{color.grey.25}",
"type": "color"
}
},
"border": {
"neutral": {
"normal": {
"value": "{color.black.8}",
"type": "color"
},
"heavy": {
"value": "{color.black.15}",
"type": "color"
},
"heavier": {
"value": "{color.black.40}",
"type": "color"
}
},
"detach": {
"normal": {
"value": "{color.white.100}",
"type": "color"
},
"highest": {
"value": "{color.white.100}",
"type": "color"
},
"higher": {
"value": "{color.white.100}",
"type": "color"
},
"high": {
"value": "{color.white.100}",
"type": "color"
},
"low": {
"value": "{color.grey.50}",
"type": "color"
}
},
"absolute": {
"white": {
"value": "{color.white.100}",
"type": "color"
}
}
},
"surface": {
"normal": {
"value": "{color.white.100}",
"type": "color"
},
"highest": {
"value": "{color.white.100}",
"type": "color"
},
"higher": {
"value": "{color.white.100}",
"type": "color"
},
"high": {
"value": "{color.white.100}",
"type": "color"
},
"low": {
"value": "{color.grey.50}",
"type": "color"
},
"glass": {
"normal": {
"value": "{color.white.90}",
"type": "color"
},
"highest": {
"value": "{color.grey.200-90}",
"type": "color"
},
"higher": {
"value": "{color.grey.100-90}",
"type": "color"
},
"high": {
"value": "{color.white.90}",
"type": "color"
}
}
},
"dim": {
"absolute": {
"black": {
"normal": {
"value": "{color.black.40}",
"type": "color"
},
"heavy": {
"value": "{color.black.60}",
"type": "color"
}
},
"white": {
"normal": {
"value": "{color.white.40}",
"type": "color"
},
"heavy": {
"value": "{color.white.60}",
"type": "color"
}
}
}
},
"gradient": {
"green": {
"normal": {
"value": "{color.green.400}",
"type": "color"
},
"heavy": {
"value": "{color.green.300}",
"type": "color"
}
}
},
"state": {
"default": {
"value": "{color.black.15}",
"type": "color"
},
"action": {
"normal": {
"value": "{color.blue.400}",
"type": "color"
},
"light": {
"value": "{color.blue.400-30}",
"type": "color"
}
},
"warning": {
"normal": {
"value": "{color.orange.400}",
"type": "color"
},
"light": {
"value": "{color.orange.400-30}",
"type": "color"
}
}
},
"elevation": {
"xlarge": {
"value": "{color.black.30}",
"type": "color"
},
"large": {
"value": "{color.black.22}",
"type": "color"
},
"medium": {
"value": "{color.black.15}",
"type": "color"
},
"small": {
"value": "{color.black.8}",
"type": "color"
},
"base": {
"value": "{color.black.5}",
"type": "color"
},
"base-inner": {
"value": "{color.white.12}",
"type": "color"
}
}
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

토큰 계층/네이밍이 컴포넌트에서 쓰는 형태(--color-fill-, --color-text-)와 잘 맞습니다.

다만 text.accent.olive{color.olive.300}인데 icon.accent.olive{color.olive.400}로 톤이 달라서 의도된 스펙인지(또는 오타인지)만 확인 부탁드립니다.

Comment on lines +1 to +13
{
"state": {
"error": {
"value": {
"color": "{color.state.warning.normal}",
"type": "dropShadow",
"offsetX": "0",
"offsetY": "0",
"blur": "0",
"spread": "{dimension.1}"
},
"type": "shadow"
},
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

state.error의 컬러 토큰 의미(Warning vs Error) 확인 필요

state.error{color.state.warning.normal}을 참조하고 있는데, 디자인 시스템에서 “error 상태 = warning 팔레트”가 의도된 매핑인지 확인해 주세요(추후 상태 토큰 네이밍/의미 충돌 여지).

🤖 Prompt for AI Agents
In @packages/bezier-tokens/src/beta/semantic/state.json around lines 1 - 13,
state.error currently references the warning palette via "value.color":
"{color.state.warning.normal}"; confirm whether this mapping is intentional and
if not, update the token to reference the correct error color (e.g.
"{color.state.error.normal}" or the canonical error token used elsewhere),
adjust any related tokens/variants (state.error.type/value) and update
docs/tests to reflect the corrected mapping so naming and semantics remain
consistent.

timok1m pushed a commit that referenced this pull request Jan 9, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @channel.io/[email protected]

### Minor Changes

- Add V3 bezier tokens and update bezier components allow to use V3
tokens. ([#2764](#2764))
by @timok1m

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## @channel.io/[email protected]

### Minor Changes

- Add V3 bezier tokens and update bezier components allow to use V3
tokens. ([#2764](#2764))
by @timok1m

## @channel.io/[email protected]

### Minor Changes

- Add V3 bezier tokens and update bezier components allow to use V3
tokens. ([#2764](#2764))
by @timok1m

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]

## [email protected]

### Patch Changes

-   Updated dependencies
    -   @channel.io/[email protected]


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## 릴리스 노트

* **새로운 기능**
  * V3 Bezier 토큰 추가 및 컴포넌트 지원 확대
  * Bezier React 3.6.0 및 Bezier Tokens 0.4.0 릴리스

* **버그 수정 및 개선**
  * 패키지 의존성 업데이트로 안정성 향상
  * Figma 플러그인 0.7.19 정식 릴리스
  * Stylelint Bezier 0.3.0으로 업그레이드

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants