Skip to content

Align StreamDesign.Colors with Figma design token system#6272

Merged
andremion merged 25 commits intov7from
redesign/chrome-tokens-and-more
Mar 20, 2026
Merged

Align StreamDesign.Colors with Figma design token system#6272
andremion merged 25 commits intov7from
redesign/chrome-tokens-and-more

Conversation

@andremion
Copy link
Contributor

@andremion andremion commented Mar 19, 2026

Goal

Align the Compose SDK's StreamDesign.Colors API with the Figma design token system to establish a 1:1 mapping between code and design. Every constructor parameter, derived property, and KDoc comment in StreamDesign.kt should trace directly to a Figma semantic token — making handoff between design and engineering predictable and auditable.

Implementation

1. Introduce ColorScale and ChromeScale types

Figma defines two intermediate alias scales — brand (accent ramp, 11 stops) and chrome (neutral gray ramp, 13 stops) — that sit between raw primitives and semantic tokens. Previously, the SDK flattened these into ~24 individual Color parameters, losing the scale relationship.

New data class types replace those loose params:

// Before — 11 loose params
public val brandS50: Color,
public val brandS100: Color,
//
public val brandS900: Color,

// After — single scale object
public val brand: ColorScale,

ColorScale.from(brandColor) generates an 11-stop ramp from a single color via Oklab lerp, and inverted() creates the dark-theme counterpart:

val purple = StreamDesign.ColorScale.from(brandColor = Color(0xFF6200EE))
val light  = StreamDesign.Colors.default(brand = purple)
val dark   = StreamDesign.Colors.defaultDark(brand = purple.inverted())

2. Rename tokens for Figma traceability

All token names now mirror the Figma semantic path. A developer can read a token name and find the exact Figma variable:

Figma path Code name
border.core.opacity-subtle borderCoreOpacitySubtle
background.utility.disabled backgroundUtilityDisabled
background.core.elevation-* backgroundCoreElevation*
avatar.presence.border avatarPresenceBorder
control.chip.text controlChipText

3. Semantic vs component token split

Constructor parameters contain only semantic-level tokens (reusable across components), while component-level tokens (aliases of semantic tokens) are internal derived body vals. Integrators use the constructor params for theming via .copy() or factory parameters; component tokens are implementation details of the SDK.

Result: 2 objects + 60 colors = 62 constructor params (was 74), 90 internal derived body vals (was 76 public).

4. Factory methods accept brand/chrome and use scale references

default() and defaultDark() accept optional brand and chrome parameters, and reference brand.sX / chrome.sX instead of resolved primitives, matching the Figma alias chain:

// Before — resolved primitive, no traceability
textPrimary = StreamPrimitiveColors.slate900,       // light
textPrimary = StreamPrimitiveColors.neutral50,       // dark

// After — traces to Figma {chrome.900}
textPrimary = chrome.s900,                           // both themes

Tokens that Figma references via raw primitives (e.g., {red.500}, {yellow.50}) or raw rgba values (scrim, overlays) remain as StreamPrimitiveColors.*.

5. Remove dead SDK-only tokens

Removed tokens that had no Figma counterpart and were either unused or pointed to the wrong underlying value:

  • inputBorderDefault, inputBorderHover, inputBorderSelected — mismatched Figma; usages updated to reference the correct underlying tokens directly
  • chipBg, composerBg — dead code, no Figma equivalent

6. Reorder constructor params and derived vals

Constructor params follow the Figma token hierarchy:

scales → accent → text → background → border → avatar → skeleton

Derived body vals are organized alphabetically within component groups:

badge → button → chat → control → input → reaction → avatar

7. Align all KDoc with Figma JSON comments

Cross-referenced every @param tag and derived val comment against Figma's "comment" fields. Fixes fall into three categories:

  • Mismatches (6) — KDoc contradicted Figma intent (e.g. backgroundCoreSurface said "buttons", Figma says "Standard section background"; borderUtilityActive said "active/selected", Figma says "Focus ring or focus border")
  • Missing context (6) — important Figma caveats omitted (e.g. backgroundCoreOnAccent was missing "Do not use for general UI surfaces"; avatarPresenceBorder was missing high-contrast behavior note)
  • Wording alignment (12+) — stripped inconsistent "Used for" prefixes, matched Figma phrasing verbatim

🎨 UI Changes

The only UI change is on the media badge, which now has the correct background color on dark mode.

Testing

  • Run the compose sample and verify that no UI is changed, apart from the media badge background on dark mode.

Summary by CodeRabbit

Release Notes

  • Style

    • Updated UI component background colors and visual styling across multiple screens and dialogs.
    • Refined theme color token usage for buttons, indicators, and interactive elements.
  • New Features

    • Introduced a new color scale–based theming architecture for improved consistency and customization.
  • Tests

    • Updated test snapshots to reflect refreshed theme styling.

@andremion andremion added the pr:ignore-for-release Exclude from release notes label Mar 19, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 19, 2026

PR checklist ✅

All required conditions are satisfied:

  • Title length is OK (or ignored by label).
  • At least one pr: label exists.
  • Sections ### Goal, ### Implementation, and ### Testing are filled.

🎉 Great job! This PR is ready for review.

@github-actions
Copy link
Contributor

github-actions bot commented Mar 19, 2026

SDK Size Comparison 📏

SDK Before After Difference Status
stream-chat-android-client 5.25 MB 5.68 MB 0.43 MB 🟡
stream-chat-android-ui-components 10.60 MB 10.98 MB 0.38 MB 🟡
stream-chat-android-compose 12.81 MB 12.08 MB -0.73 MB 🚀

@andremion andremion force-pushed the redesign/chrome-tokens-and-more branch from e7750e3 to 5efd281 Compare March 19, 2026 16:30
@andremion andremion marked this pull request as ready for review March 19, 2026 16:48
@andremion andremion requested a review from a team as a code owner March 19, 2026 16:48
@coderabbitai
Copy link

coderabbitai bot commented Mar 19, 2026

Walkthrough

Comprehensive theme color token refactoring introducing a new scale-based architecture with ColorScale and ChromeScale types. Replaces granular color tokens throughout the codebase with a smaller semantic set, including migrations like backgroundElevationElevation* to backgroundCoreElevation* and backgroundCoreSelected to backgroundUtilitySelected.

Changes

Cohort / File(s) Summary
Theme Architecture Foundation
stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamDesign.kt, stream-chat-android-compose/api/stream-chat-android-compose.api, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamPrimitiveColors.kt
Refactored StreamDesign.Colors constructor to accept ColorScale and ChromeScale objects; added two new public scale types (ColorScale with 11-step brand ramp and ChromeScale with 13-step neutral ramp); consolidated 60+ previously public granular color tokens into derived internal values; updated public API surface with new getters for scales and reduced semantic tokens; added neutral200 primitive color.
Sample App & Docs - Background Elevation Token Replacements
stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/add/AddChannelScreen.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/add/component/SearchUserTextField.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/add/group/AddGroupChannelScreen.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/list/ChannelsActivity.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/reminders/MessageReminderDialogs.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/channel/AddMembersDialog.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/chats/ChatsActivity.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/AppBottomBar.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/AppToolbar.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/Pane.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/DurationDropdownMenu.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/login/CustomLoginActivity.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/profile/UserProfileScreen.kt, stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/guides/AddingCustomAttachments.kt, stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/messages/MessageList.kt, stream-chat-android-ui-guides/src/main/java/io/getstream/chat/android/guides/catalog/compose/customattachments/CustomChatComponentFactory.kt
Replaced backgroundElevationElevation0/1/2 with backgroundCoreElevation0/1/2 across toolbar, dialog, surface, and component backgrounds.
Sample App - Utility & Selected State Token Replacements
stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/SharedLocationItem.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/LocationComponentFactory.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/login/UserLoginActivity.kt, stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/profile/UserProfilePushPreferencesScreen.kt
Replaced backgroundCoreDisabled with backgroundUtilityDisabled; replaced backgroundCoreSelected with backgroundUtilitySelected; updated location sharing colors and button/toggle styling.
Core Library - Background Elevation Token Replacements
stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/MediaAttachmentContent.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryPreviewActivity.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryPreviewOptionsMenu.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryPreviewScreen.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/internal/MediaGalleryPhotosMenu.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/attachments/ChannelMediaAttachmentsGrid.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/info/ChannelInfoMemberInfoModalSheet.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/header/ChannelListHeader.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/PullToRefreshBox.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/SimpleDialog.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/SimpleMenu.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/common/ContextualMenu.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/common/MediaBadges.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageReactions.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/PollMessageContent.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/ScrollToBottomButton.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollAnswers.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollOptionVotesDialog.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/selectedmessage/MessageMenuHeader.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/selectedmessage/ReactionsMenu.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/AttachmentPicker.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/AttachmentSystemPicker.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/MessageComposer.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/AudioRecordingButton.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/MessageComposerLeadingContent.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/suggestions/SuggestionsMenu.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/header/MessageListHeader.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt
Replaced backgroundElevationElevation0/1/2 with backgroundCoreElevation0/1/2 in dialogs, bottom sheets, surfaces, buttons, and header backgrounds across attachment picker, message composer, reactions, polls, and channel components.
Core Library - Selection & Disabled State Token Replacements
stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/list/ChannelItem.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButtonStyle.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/common/RadioControls.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/AttachmentTypePicker.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollSwitchList.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/MessageComposerInputTrailingContent.kt
Replaced backgroundCoreSelected with backgroundUtilitySelected; replaced backgroundCoreDisabled with backgroundUtilityDisabled in button states, radio/checkbox controls, reaction toggles, and poll switches.
Core Library - Avatar & Presence Token Replacements
stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/OnlineIndicator.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/avatar/Avatar.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/avatar/ChannelAvatar.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/avatar/OnlineIndicator.kt
Replaced presenceBorder with avatarPresenceBorder; replaced presenceBgOnline/presenceBgOffline with avatarPresenceBgOnline/avatarPresenceBgOffline; replaced borderCoreOpacity10 with borderCoreOpacitySubtle; updated avatar border and background styling.
Core Library - Border & Control Token Replacements
stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/attachments/images/ImagesPicker.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/composer/ComposerLinkPreview.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/composer/MessageInput.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageInput.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollVoteItem.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/selectedmessage/ReactionCountRow.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionList.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollQuestionInput.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/AudioRecordingContent.kt, stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/MessageComposerInputCenterBottomContent.kt
Replaced controlRadioCheckIconSelected with controlRadioCheckIcon; replaced borderCoreOpacity10 with borderCoreOpacitySubtle; replaced inputBorderDefault with borderCoreDefault; replaced textOnAccent with buttonPrimaryTextOnAccent/textInverse; replaced icon and badge color tokens in poll and composer controls.
Tests
stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/channel/info/ChannelInfoMemberInfoModalSheetTest.kt
Updated snapshot test expectations to reflect backgroundElevationElevation1backgroundCoreElevation1 color token replacement in ModalBottomSheet across four test cases.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Suggested reviewers

  • gpunto
  • aleksandar-apostolov

Poem

🐰 The color scales bloom in harmonious arrays,
Where Core meets Utility in semantic ways,
Each token finds its place in the palette bright,
From avatarPresenceBorder to elevation's light! 🎨✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 18.18% 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 The title clearly summarizes the main change: aligning StreamDesign.Colors with Figma design token system, which is the primary objective of the PR.
Description check ✅ Passed The pull request description is comprehensive and well-structured, covering Goal, Implementation, UI Changes, and Testing sections that align with the template requirements.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch redesign/chrome-tokens-and-more
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Tip

CodeRabbit can use OpenGrep to find security vulnerabilities and bugs across 17+ programming languages.

OpenGrep is compatible with Semgrep configurations. Add an opengrep.yml or semgrep.yml configuration file to your project to enable OpenGrep analysis.

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: 3

🧹 Nitpick comments (2)
stream-chat-android-compose/api/stream-chat-android-compose.api (1)

6324-6361: Consider adding an old→new token mapping to the v7 migration notes.

This public rename set is large enough (avatarPresenceBorder, backgroundCoreElevation*, backgroundUtilitySelected, borderCoreOpacity*, plus brand/chrome) that downstream theme overrides will be much easier to update with a short mapping table in the changelog or migration doc.

Based on learnings, in PRs against major version branches (e.g., v7), maintainers prefer documenting migration paths covering function signature changes and renamed/removed composables.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@stream-chat-android-compose/api/stream-chat-android-compose.api` around lines
6324 - 6361, Add an explicit old→new token mapping to the v7 migration notes
covering the public renames shown (e.g., avatarPresenceBorder →
getAvatarPresenceBorder-0d7_KjU, backgroundCoreElevation0..4 →
getBackgroundCoreElevation0-0d7_KjU .. getBackgroundCoreElevation4-0d7_KjU,
backgroundUtilitySelected → getBackgroundUtilitySelected-0d7_KjU,
borderCoreOpacityStrong/Subtle → getBorderCoreOpacityStrong-0d7_KjU /
getBorderCoreOpacitySubtle-0d7_KjU, brand → getBrand (StreamDesign$ColorScale),
chrome → getChrome (StreamDesign$ChromeScale), plus chat-related tokens like
getChatPollProgressFillOutgoing-0d7_KjU and reply indicator tokens) and list
each old name alongside its new API symbol; update the v7 changelog/migration
doc with a concise table or bullet list mapping every renamed token so
downstream theme overrides can be updated easily.
stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamDesign.kt (1)

17-18: Narrow the suppression scope.

Moving MagicNumber and LongMethod to file scope now hides future findings anywhere in this public API file. Please keep the suppressions on the specific factory declarations that need them and add a short rationale there.

As per coding guidelines, **/*.kt: "Use @OptIn annotations explicitly; avoid suppressions unless documented".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamDesign.kt`
around lines 17 - 18, Remove the file-level `@file`:Suppress("MagicNumber",
"LongMethod") in StreamDesign.kt and instead apply `@Suppress`("MagicNumber")
and/or `@Suppress`("LongMethod") directly on the specific factory declarations
that actually trigger these warnings (the theme/factory functions in this file).
Add a short rationale comment above each suppression (e.g., "// Suppress
MagicNumber: design tokens/constants expressed as raw numbers for theme factory"
or "// Suppress LongMethod: factory builds many palette entries; splitting
reduces clarity") so the scope is narrow and documented.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamDesign.kt`:
- Around line 682-694: ColorScale.from currently always builds stops with s50 as
lightest and s900 as darkest, which breaks dark-mode ordering used by
defaultDark(); update the API so generated brand scales match the intended theme
orientation—either add an explicit parameter (e.g., ColorScale.from(brandColor,
isDark: Boolean)) or provide a dedicated factory (e.g.,
ColorScale.fromDark/ColorScale.fromLight) and use it in places that expect
reversed stops (refer to ColorScale.from, ColorScale.defaultDark,
ColorScale.defaultLight and tokens like chatBgOutgoing/chatTextOutgoing) so that
when dark branding is required the s50..s900 ordering is reversed to match
defaultDark()’s orientation.
- Around line 78-80: The KDoc for backgroundCoreOnAccent claims it "must remain
white across themes" but defaultDark() maps backgroundCoreOnAccent to chrome.s0
while ChromeScale.defaultDark() defines s0 as black; update either the docs or
the mapping so they match: either change the KDoc to reflect that
backgroundCoreOnAccent follows the chrome.s0 (non-white) behavior, or change
defaultDark() to map backgroundCoreOnAccent to a white token (e.g., a
chrome.s100/white-equivalent) and ensure ChromeScale.defaultDark() defines the
matching s* value as white; inspect and update the implementations of
backgroundCoreOnAccent, defaultDark(), and ChromeScale.defaultDark() so the
token semantics and docs are consistent (also apply the same fix at the other
occurrences noted).
- Around line 454-457: The public factory functions that build Colors (e.g., the
default() and dark/defaultDark() factories) currently instantiate
ColorScale.defaultLight()/defaultDark() and
ChromeScale.defaultLight()/defaultDark() internally, preventing callers from
supplying custom scales; change those factory signatures (the public fun
default() and the corresponding dark variant around lines 530-533) to accept
parameters brand: ColorScale = ColorScale.defaultLight() and chrome: ChromeScale
= ChromeScale.defaultLight() (and analogously for the dark factory using
defaultDark()), then use those parameters when constructing and deriving token
values so callers can pass custom scales while preserving existing defaults.

---

Nitpick comments:
In `@stream-chat-android-compose/api/stream-chat-android-compose.api`:
- Around line 6324-6361: Add an explicit old→new token mapping to the v7
migration notes covering the public renames shown (e.g., avatarPresenceBorder →
getAvatarPresenceBorder-0d7_KjU, backgroundCoreElevation0..4 →
getBackgroundCoreElevation0-0d7_KjU .. getBackgroundCoreElevation4-0d7_KjU,
backgroundUtilitySelected → getBackgroundUtilitySelected-0d7_KjU,
borderCoreOpacityStrong/Subtle → getBorderCoreOpacityStrong-0d7_KjU /
getBorderCoreOpacitySubtle-0d7_KjU, brand → getBrand (StreamDesign$ColorScale),
chrome → getChrome (StreamDesign$ChromeScale), plus chat-related tokens like
getChatPollProgressFillOutgoing-0d7_KjU and reply indicator tokens) and list
each old name alongside its new API symbol; update the v7 changelog/migration
doc with a concise table or bullet list mapping every renamed token so
downstream theme overrides can be updated easily.

In
`@stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamDesign.kt`:
- Around line 17-18: Remove the file-level `@file`:Suppress("MagicNumber",
"LongMethod") in StreamDesign.kt and instead apply `@Suppress`("MagicNumber")
and/or `@Suppress`("LongMethod") directly on the specific factory declarations
that actually trigger these warnings (the theme/factory functions in this file).
Add a short rationale comment above each suppression (e.g., "// Suppress
MagicNumber: design tokens/constants expressed as raw numbers for theme factory"
or "// Suppress LongMethod: factory builds many palette entries; splitting
reduces clarity") so the scope is narrow and documented.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 58ea5316-231b-4d2e-bc8f-e952521d35ae

📥 Commits

Reviewing files that changed from the base of the PR and between 3e6a67c and c12dd78.

⛔ Files ignored due to path filters (9)
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.attachments.images_ImagesPickerTest_add_more.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.components.attachments.images_ImagesPickerTest_selection.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.attachments_AttachmentMediaPickerTest_selection.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_message_composer_attachments.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages.composer.internal.attachments_MessageComposerAttachmentsTest_video_attachment_item.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_MessageComposerInputTest_attachments.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_MessageComposerInputTest_attachments_and_link.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_MessageComposerInputTest_edit,_attachments,_and_link.png is excluded by !**/*.png
  • stream-chat-android-compose/src/test/snapshots/images/io.getstream.chat.android.compose.ui.messages_MessageComposerInputTest_reply,_attachments,_and_link.png is excluded by !**/*.png
📒 Files selected for processing (72)
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/add/AddChannelScreen.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/add/component/SearchUserTextField.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/add/group/AddGroupChannelScreen.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/channel/list/ChannelsActivity.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/feature/reminders/MessageReminderDialogs.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/channel/AddMembersDialog.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/chats/ChatsActivity.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/AppBottomBar.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/AppToolbar.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/Pane.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/component/SharedLocationItem.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/DurationDropdownMenu.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/location/LocationComponentFactory.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/login/CustomLoginActivity.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/login/UserLoginActivity.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/profile/UserProfilePushPreferencesScreen.kt
  • stream-chat-android-compose-sample/src/main/java/io/getstream/chat/android/compose/sample/ui/profile/UserProfileScreen.kt
  • stream-chat-android-compose/api/stream-chat-android-compose.api
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/content/MediaAttachmentContent.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryPreviewActivity.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryPreviewOptionsMenu.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/MediaGalleryPreviewScreen.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/attachments/preview/internal/MediaGalleryPhotosMenu.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/attachments/ChannelMediaAttachmentsGrid.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channel/info/ChannelInfoMemberInfoModalSheet.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/header/ChannelListHeader.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/channels/list/ChannelItem.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/OnlineIndicator.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/PullToRefreshBox.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/SimpleDialog.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/SimpleMenu.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/attachments/images/ImagesPicker.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/avatar/Avatar.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/avatar/ChannelAvatar.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/avatar/OnlineIndicator.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/button/StreamButtonStyle.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/common/ContextualMenu.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/common/MediaBadges.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/common/RadioControls.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/composer/ComposerLinkPreview.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/composer/MessageInput.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/MessageReactions.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/PollMessageContent.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/messages/ScrollToBottomButton.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollAnswers.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollOptionVotesDialog.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/poll/PollVoteItem.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/reactions/ReactionToggle.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/selectedmessage/MessageMenuHeader.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/selectedmessage/ReactionCountRow.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/components/selectedmessage/ReactionsMenu.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/AttachmentPicker.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/AttachmentSystemPicker.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/AttachmentTypePicker.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollOptionList.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollQuestionInput.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/attachments/poll/PollSwitchList.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/MessageComposer.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/AudioRecordingButton.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/AudioRecordingContent.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/MessageComposerInputCenterBottomContent.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/MessageComposerInputTrailingContent.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/MessageComposerLeadingContent.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/composer/internal/suggestions/SuggestionsMenu.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/messages/header/MessageListHeader.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/ChatComponentFactory.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamDesign.kt
  • stream-chat-android-compose/src/main/java/io/getstream/chat/android/compose/ui/theme/StreamPrimitiveColors.kt
  • stream-chat-android-compose/src/test/kotlin/io/getstream/chat/android/compose/ui/channel/info/ChannelInfoMemberInfoModalSheetTest.kt
  • stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/guides/AddingCustomAttachments.kt
  • stream-chat-android-docs/src/main/kotlin/io/getstream/chat/docs/kotlin/compose/messages/MessageList.kt
  • stream-chat-android-ui-guides/src/main/java/io/getstream/chat/android/guides/catalog/compose/customattachments/CustomChatComponentFactory.kt

Copy link
Contributor

@VelikovPetar VelikovPetar left a comment

Choose a reason for hiding this comment

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

LGTM!

Maybe @gpunto can also have a look, as I wasn't fully included in this part - in case I am missing anything!

@andremion andremion force-pushed the redesign/chrome-tokens-and-more branch from c12dd78 to cf0b053 Compare March 20, 2026 09:04
@andremion andremion requested a review from gpunto March 20, 2026 09:06
Copy link
Contributor

@gpunto gpunto left a comment

Choose a reason for hiding this comment

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

Looks good!

@andremion
Copy link
Contributor Author

Jurgen is making some changes in Figma so we can avoid exposing the only 4 remaining component tokens.
I will make PR ready when it is done.

@andremion andremion marked this pull request as draft March 20, 2026 09:14
@andremion
Copy link
Contributor Author

Now, it remains only one. Waiting for Jurgen's response...

…atBgIncoming`, `controlRemoveBg`) from the primary constructor to derived properties with default values.
…was renamed to backgroundCoreElevation1 in the design token reorganization.
…hatReplyIndicatorOutgoing`, and `controlPlaybackThumbBgDefault` to the end of the `Colors` class and its default factory methods to match the updated organizational structure.
@andremion andremion force-pushed the redesign/chrome-tokens-and-more branch from 066b041 to 0ed6835 Compare March 20, 2026 13:08
@andremion andremion marked this pull request as ready for review March 20, 2026 13:12
@andremion andremion enabled auto-merge (squash) March 20, 2026 13:12
@sonarqubecloud
Copy link

@andremion andremion merged commit 41ca6d8 into v7 Mar 20, 2026
15 checks passed
@andremion andremion deleted the redesign/chrome-tokens-and-more branch March 20, 2026 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr:ignore-for-release Exclude from release notes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants