Skip to content

feat(react-sdk): migrate Button component to design token - #2408

Merged
jdimovska merged 13 commits into
mainfrom
migrate-button-token-design
Sep 7, 2026
Merged

feat(react-sdk): migrate Button component to design token#2408
jdimovska merged 13 commits into
mainfrom
migrate-button-token-design

Conversation

@jdimovska

@jdimovska jdimovska commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

💡 Overview

Migrates the button family to the new design system.

Before this PR there were three unrelated components: .str-video__button was a full-width CTA, IconButton rendered a bare padded icon with no background or state, and only CompositeButton produced the round call-control pill. They are now one token-driven primitive — .str-video__button carries the pill itself, IconButton is its icon-only shape, and CompositeButton composes it into the call control with an optional caption and split menu. Button is exported for the first time.

Maps onto Figma's Core / Web / Button and Video / Web / Call Control Button.

📝 Implementation notes

  • variant = Figma's Style, appearance = Type, activearia-pressed = Selected.
  • Hover/pressed/selected are stacked background-image layers, reproducing Figma's Core / Interaction Overlay. Focus is outline at offset 0 — Figma's focus stroke is outside-aligned.
  • The split caret is absolutely positioned over the action's trailing edge, so the action spans the full pill and its overlay covers the whole control.
  • Sizing comes from the button-visual-height tokens: block-size pinned, min-inline-size a floor. The inline axis can't be pinned — it collapses the split button from 68×40 to 52×40.
  • Buttons still inherit the host font. Adopting the DS font family affects every text element, so it's a separate change.

⚠️ Breaking changes

removed replacement
TextButton Button
IconButtonWithMenuProps CompositeButtonProps
IconButton enabled active
variant="success" | "danger" | "active" "destructive", or active
  • Classes: str-video__text-button, str-video__button__icon,
    str-video__call-controls__button*, str-video__composite-button__button*,
    str-video__menu-toggle-button*. Replaced by str-video__button--* and
    str-video__composite-button__{group,action,caret}.
  • Variables: the eight --str-video__composite-button__button-group*
    theming hooks. Buttons are themed through the design tokens now.
  • Spacing re-based: --str-video__spacing-* keep their names but shift one
    step — xs 6→8, sm 8→12, md 12→16, lg 16→20, xl 20→24.
  • Icon-only insets changed (at lg, 8px → 16px), so a button sized around
    its own padding changes size.

🎫 Ticket: https://linear.app/stream/issue/REACT-1131/migrate-the-button-component-to-design-tokens

📑 Docs: https://github.com/GetStream/docs-content/pull/

@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 116 files, which is 16 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: db03d88e-9f31-43c5-af2e-ab7060f207bd

📥 Commits

Reviewing files that changed from the base of the PR and between bd53a13 and 4b9431f.

⛔ Files ignored due to path filters (1)
  • packages/styling/src/tokens/generated/light.scss is excluded by !**/generated/**
📒 Files selected for processing (116)
  • packages/react-sdk/src/components/Button/Button.tsx
  • packages/react-sdk/src/components/Button/CompositeButton.tsx
  • packages/react-sdk/src/components/Button/IconButton.tsx
  • packages/react-sdk/src/components/Button/TextButton.tsx
  • packages/react-sdk/src/components/Button/index.ts
  • packages/react-sdk/src/components/CallControls/AcceptCallButton.tsx
  • packages/react-sdk/src/components/CallControls/CancelCallButton.tsx
  • packages/react-sdk/src/components/CallControls/ReactionsButton.tsx
  • packages/react-sdk/src/components/CallControls/RecordCallButton.tsx
  • packages/react-sdk/src/components/CallControls/ScreenShareButton.tsx
  • packages/react-sdk/src/components/CallControls/ToggleAudioButton.tsx
  • packages/react-sdk/src/components/CallControls/ToggleAudioOutputButton.tsx
  • packages/react-sdk/src/components/CallControls/ToggleVideoButton.tsx
  • packages/react-sdk/src/components/CallParticipantsList/BlockedUserListing.tsx
  • packages/react-sdk/src/components/CallParticipantsList/CallParticipantListHeader.tsx
  • packages/react-sdk/src/components/CallParticipantsList/CallParticipantListingItem.tsx
  • packages/react-sdk/src/components/CallParticipantsList/CallParticipantsList.tsx
  • packages/react-sdk/src/components/CallRecordingList/CallRecordingListHeader.tsx
  • packages/react-sdk/src/components/DeviceSettings/DeviceSettings.tsx
  • packages/react-sdk/src/core/components/CallLayout/PaginatedGridLayout.tsx
  • packages/react-sdk/src/core/components/CallLayout/PipLayout/Grid.tsx
  • packages/react-sdk/src/core/components/CallLayout/SpeakerLayout.tsx
  • packages/react-sdk/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx
  • packages/react-sdk/src/embedded/livestream/viewer/ViewerLobby.tsx
  • packages/react-sdk/src/embedded/shared/CallFeedback/RatingScreen.tsx
  • packages/react-sdk/src/embedded/shared/JoinError/JoinError.tsx
  • packages/react-sdk/src/embedded/shared/Lobby/Lobby.tsx
  • packages/styling/src/Button/Button-layout.scss
  • packages/styling/src/Button/Button-theme.scss
  • packages/styling/src/Button/CompositeButton.scss
  • packages/styling/src/Button/index.scss
  • packages/styling/src/CallControls/CallControls-layout.scss
  • packages/styling/src/CallControls/CancelCallButton.scss
  • packages/styling/src/CallLayout/PipLayout-layout.scss
  • packages/styling/src/CallLayout/SpeakerLayout-layout.scss
  • packages/styling/src/CallParticipantList/CallParticiantListingItem-layout.scss
  • packages/styling/src/CallParticipantList/CallParticiantListingItem-theme.scss
  • packages/styling/src/CallParticipantList/CallParticipantList-layout.scss
  • packages/styling/src/CallRecodingList/CallRecordingList-layout.scss
  • packages/styling/src/CallRecodingList/CallRecordingList-theme.scss
  • packages/styling/src/CallStats.scss
  • packages/styling/src/DeviceSettings/DeviceSettings-layout.scss
  • packages/styling/src/DropdownSelect/DropdownSelect.scss
  • packages/styling/src/Embedded/call/CallLayout-layout.scss
  • packages/styling/src/Embedded/livestream/Livestream-layout.scss
  • packages/styling/src/Embedded/shared/BlurToggleButton/BlurToggleButton-layout.scss
  • packages/styling/src/Embedded/shared/CallControls/CallControls-layout.scss
  • packages/styling/src/Embedded/shared/ConnectionNotification/ConnectionNotification-layout.scss
  • packages/styling/src/Embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.scss
  • packages/styling/src/Embedded/shared/Feedback/CallFeedback-layout.scss
  • packages/styling/src/Embedded/shared/Feedback/CallFeedback-theme.scss
  • packages/styling/src/Embedded/shared/JoinError/JoinError-layout.scss
  • packages/styling/src/Embedded/shared/Lobby/Lobby-layout.scss
  • packages/styling/src/Embedded/shared/Lobby/Lobby-theme.scss
  • packages/styling/src/Icon/Icon-theme.scss
  • packages/styling/src/Menu/GenericMenu-layout.scss
  • packages/styling/src/ParticipantView/ParticipantView-layout.scss
  • packages/styling/src/ScreenShareOverlay/ScreenShareOverlay-layout.scss
  • packages/styling/src/ScreenShareOverlay/ScreenShareOverlay-theme.scss
  • packages/styling/src/Tooltip/Tooltip-layout.scss
  • packages/styling/src/_global-theme-variables.scss
  • packages/styling/src/_icons.scss
  • sample-apps/react/livestream-app/src/viewers/ui/ViewerHeader.tsx
  • sample-apps/react/react-dogfood/components/ActiveCall.tsx
  • sample-apps/react/react-dogfood/components/AdaptivePipGrid.tsx
  • sample-apps/react/react-dogfood/components/CallLayout/CallParticipantsScreenView.tsx
  • sample-apps/react/react-dogfood/components/CallStatsWrapper.tsx
  • sample-apps/react/react-dogfood/components/ChatUI.tsx
  • sample-apps/react/react-dogfood/components/ClosedCaptions.tsx
  • sample-apps/react/react-dogfood/components/InviteLinkButton.tsx
  • sample-apps/react/react-dogfood/components/InvitePanel/InvitePanel.tsx
  • sample-apps/react/react-dogfood/components/Settings/SettingsTabModal.tsx
  • sample-apps/react/react-dogfood/components/Settings/VideoEffects.tsx
  • sample-apps/react/react-dogfood/components/ToggleDeveloperButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleDocumentationButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleEffectsButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleFeedbackButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleHiFiButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleLayoutButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleMoreOptionsListButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleNoiseCancellationButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleParticipantListButton.tsx
  • sample-apps/react/react-dogfood/components/ToggleParticipantsPreview.tsx
  • sample-apps/react/react-dogfood/components/VisionAgent/AIAgentStatusPanel.tsx
  • sample-apps/react/react-dogfood/context/TourContext.tsx
  • sample-apps/react/react-dogfood/style/AdaptivePipGrid.scss
  • sample-apps/react/react-dogfood/style/Button/Button.scss
  • sample-apps/react/react-dogfood/style/CallControls/CallControls-layout.scss
  • sample-apps/react/react-dogfood/style/CallHeader/CallHeader-layout.scss
  • sample-apps/react/react-dogfood/style/ClosedCaptions.scss
  • sample-apps/react/react-dogfood/style/Debug/Debug.scss
  • sample-apps/react/react-dogfood/style/DevMenu/DevMenu.scss
  • sample-apps/react/react-dogfood/style/Feedback/Feedback.scss
  • sample-apps/react/react-dogfood/style/IncomingVideoSettings.scss
  • sample-apps/react/react-dogfood/style/Input/Input.scss
  • sample-apps/react/react-dogfood/style/InvitePanel/InvitePanel.scss
  • sample-apps/react/react-dogfood/style/LayoutSelector/LayoutSelector.scss
  • sample-apps/react/react-dogfood/style/Link/Link.scss
  • sample-apps/react/react-dogfood/style/PreCallTest.scss
  • sample-apps/react/react-dogfood/style/SettingsTabModal.scss
  • sample-apps/react/react-dogfood/style/ToggleDocumentationButton.scss
  • sample-apps/react/react-dogfood/style/ToggleMoreOptionsListButton/ToggleMoreOptionsListButton-layout.scss
  • sample-apps/react/react-dogfood/style/ToggleParticipantsPreview/ToggleParticipantsPreview.scss
  • sample-apps/react/react-dogfood/style/TourPanel.scss
  • sample-apps/react/react-dogfood/style/VisionAgent/index.scss
  • sample-apps/react/react-dogfood/style/authentication.scss
  • sample-apps/react/react-dogfood/style/chat.scss
  • sample-apps/react/react-dogfood/style/error.scss
  • sample-apps/react/react-dogfood/style/home.scss
  • sample-apps/react/react-dogfood/style/icons.scss
  • sample-apps/react/react-dogfood/style/layout.scss
  • sample-apps/react/react-dogfood/style/leave.scss
  • sample-apps/react/react-dogfood/style/livestream.scss
  • sample-apps/react/react-dogfood/style/lobby.scss
  • sample-apps/react/react-dogfood/style/ringing.scss
  • sample-apps/react/zoom-clone/src/components/Preview.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

@jdimovska
jdimovska marked this pull request as draft September 3, 2026 20:05
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

Bundle size

Built package output. Sizes in KB; delta vs main@bd53a13.

Package Unminified Minified Δ min vs main
@stream-io/video-react-sdk 373.2 KB 228.9 KB +3.9 KB (+1.7%)
↳ install total (+ client + react-bindings) 1195.0 KB 519.6 KB +3.9 KB (+0.7%)
@stream-io/video-react-sdk (embedded) (cjs) 209.3 KB 125.7 KB +729 B (+0.6%)

@jdimovska
jdimovska marked this pull request as ready for review September 6, 2026 21:48
@jdimovska
jdimovska requested a review from oliverlaz September 7, 2026 07:29
Base automatically changed from introduce-design-tokens to main September 7, 2026 11:57
# Conflicts:
#	packages/styling/src/ParticipantView/ParticipantView-layout.scss
#	packages/styling/src/_icons.scss
#	packages/styling/src/tokens/generated/light.scss
@jdimovska
jdimovska merged commit 9b21d19 into main Sep 7, 2026
16 checks passed
@jdimovska
jdimovska deleted the migrate-button-token-design branch September 7, 2026 12:09
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.

2 participants