Make layout tokens customisable via Appearance.tokens#4114
Conversation
Convert the public Chat layout tokens in DesignSystemTokens from read-only computed properties to settable public lazy var, matching the customisation pattern of colorPalette/fonts/images on Appearance. Consumers can now override individual tokens, e.g. Appearance.default.tokens.messageBubbleRadiusAttachment = 20. Refs IOS-1728
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
✅ Files skipped from review due to trivial changes (1)
📝 WalkthroughWalkthroughThis PR converts design token properties in ChangesDesign Token Properties Refactoring
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
2deaff6 to
f4ab229
Compare
SDK Performance
|
Public Interface @MainActor public final class DesignSystemTokens
- public var buttonHitTargetMinHeight: CGFloat
+ public lazy var buttonHitTargetMinHeight: CGFloat
- public var buttonHitTargetMinWidth: CGFloat
+ public lazy var buttonHitTargetMinWidth: CGFloat
- public var buttonPaddingXIconOnlyLg: CGFloat
+ public lazy var buttonPaddingXIconOnlyLg: CGFloat
- public var buttonPaddingXIconOnlyMd: CGFloat
+ public lazy var buttonPaddingXIconOnlyMd: CGFloat
- public var buttonPaddingXIconOnlySm: CGFloat
+ public lazy var buttonPaddingXIconOnlySm: CGFloat
- public var buttonPaddingXIconOnlyXs: CGFloat
+ public lazy var buttonPaddingXIconOnlyXs: CGFloat
- public var buttonPaddingXWithLabelLg: CGFloat
+ public lazy var buttonPaddingXWithLabelLg: CGFloat
- public var buttonPaddingXWithLabelMd: CGFloat
+ public lazy var buttonPaddingXWithLabelMd: CGFloat
- public var buttonPaddingXWithLabelSm: CGFloat
+ public lazy var buttonPaddingXWithLabelSm: CGFloat
- public var buttonPaddingXWithLabelXs: CGFloat
+ public lazy var buttonPaddingXWithLabelXs: CGFloat
- public var buttonPaddingYLg: CGFloat
+ public lazy var buttonPaddingYLg: CGFloat
- public var buttonPaddingYMd: CGFloat
+ public lazy var buttonPaddingYMd: CGFloat
- public var buttonPaddingYSm: CGFloat
+ public lazy var buttonPaddingYSm: CGFloat
- public var buttonPaddingYXs: CGFloat
+ public lazy var buttonPaddingYXs: CGFloat
- public var buttonRadiusFull: CGFloat
+ public lazy var buttonRadiusFull: CGFloat
- public var buttonRadiusLg: CGFloat
+ public lazy var buttonRadiusLg: CGFloat
- public var buttonRadiusMd: CGFloat
+ public lazy var buttonRadiusMd: CGFloat
- public var buttonRadiusSm: CGFloat
+ public lazy var buttonRadiusSm: CGFloat
- public var buttonVisualHeightLg: CGFloat
+ public lazy var buttonVisualHeightLg: CGFloat
- public var buttonVisualHeightMd: CGFloat
+ public lazy var buttonVisualHeightMd: CGFloat
- public var buttonVisualHeightSm: CGFloat
+ public lazy var buttonVisualHeightSm: CGFloat
- public var buttonVisualHeightXs: CGFloat
+ public lazy var buttonVisualHeightXs: CGFloat
- public var composerRadiusFixed: CGFloat
+ public lazy var composerRadiusFixed: CGFloat
- public var composerRadiusFloating: CGFloat
+ public lazy var composerRadiusFloating: CGFloat
- public var darkElevation1: BoxShadow
+ public lazy var darkElevation1: BoxShadow
- public var darkElevation2: BoxShadow
+ public lazy var darkElevation2: BoxShadow
- public var darkElevation3: BoxShadow
+ public lazy var darkElevation3: BoxShadow
- public var darkElevation4: BoxShadow
+ public lazy var darkElevation4: BoxShadow
- public var deviceRadius: CGFloat
+ public lazy var deviceRadius: CGFloat
- public var deviceSafeAreaBottom: CGFloat
+ public lazy var deviceSafeAreaBottom: CGFloat
- public var deviceSafeAreaTop: CGFloat
+ public lazy var deviceSafeAreaTop: CGFloat
- public var iconSizeLg: CGFloat
+ public lazy var iconSizeLg: CGFloat
- public var iconSizeMd: CGFloat
+ public lazy var iconSizeMd: CGFloat
- public var iconSizeSm: CGFloat
+ public lazy var iconSizeSm: CGFloat
- public var iconSizeXs: CGFloat
+ public lazy var iconSizeXs: CGFloat
- public var iconStrokeDefault: CGFloat
+ public lazy var iconStrokeDefault: CGFloat
- public var iconStrokeEmphasis: CGFloat
+ public lazy var iconStrokeEmphasis: CGFloat
- public var iconStrokeSubtle: CGFloat
+ public lazy var iconStrokeSubtle: CGFloat
- public var lightElevation1: BoxShadow
+ public lazy var lightElevation1: BoxShadow
- public var lightElevation2: BoxShadow
+ public lazy var lightElevation2: BoxShadow
- public var lightElevation3: BoxShadow
+ public lazy var lightElevation3: BoxShadow
- public var lightElevation4: BoxShadow
+ public lazy var lightElevation4: BoxShadow
- public var messageBubbleRadiusAttachment: CGFloat
+ public lazy var messageBubbleRadiusAttachment: CGFloat
- public var messageBubbleRadiusAttachmentInline: CGFloat
+ public lazy var messageBubbleRadiusAttachmentInline: CGFloat
- public var messageBubbleRadiusGroupBottom: CGFloat
+ public lazy var messageBubbleRadiusGroupBottom: CGFloat
- public var messageBubbleRadiusGroupMiddle: CGFloat
+ public lazy var messageBubbleRadiusGroupMiddle: CGFloat
- public var messageBubbleRadiusGroupTop: CGFloat
+ public lazy var messageBubbleRadiusGroupTop: CGFloat
- public var messageBubbleRadiusTail: CGFloat
+ public lazy var messageBubbleRadiusTail: CGFloat
- public var radius2xl: CGFloat
+ public lazy var radius2xl: CGFloat
- public var radius3xl: CGFloat
+ public lazy var radius3xl: CGFloat
- public var radius4xl: CGFloat
+ public lazy var radius4xl: CGFloat
- public var radiusLg: CGFloat
+ public lazy var radiusLg: CGFloat
- public var radiusMax: CGFloat
+ public lazy var radiusMax: CGFloat
- public var radiusMd: CGFloat
+ public lazy var radiusMd: CGFloat
- public var radiusNone: CGFloat
+ public lazy var radiusNone: CGFloat
- public var radiusSm: CGFloat
+ public lazy var radiusSm: CGFloat
- public var radiusXl: CGFloat
+ public lazy var radiusXl: CGFloat
- public var radiusXs: CGFloat
+ public lazy var radiusXs: CGFloat
- public var radiusXxs: CGFloat
+ public lazy var radiusXxs: CGFloat
- public var spacing2xl: CGFloat
+ public lazy var spacing2xl: CGFloat
- public var spacing3xl: CGFloat
+ public lazy var spacing3xl: CGFloat
- public var spacingLg: CGFloat
+ public lazy var spacingLg: CGFloat
- public var spacingMd: CGFloat
+ public lazy var spacingMd: CGFloat
- public var spacingNone: CGFloat
+ public lazy var spacingNone: CGFloat
- public var spacingSm: CGFloat
+ public lazy var spacingSm: CGFloat
- public var spacingXl: CGFloat
+ public lazy var spacingXl: CGFloat
- public var spacingXs: CGFloat
+ public lazy var spacingXs: CGFloat
- public var spacingXxs: CGFloat
+ public lazy var spacingXxs: CGFloat
- public var spacingXxxs: CGFloat
+ public lazy var spacingXxxs: CGFloat |
SDK Size
|
StreamChatCommonUI XCSize
|
|



🔗 Issue Links
IOS-1728
🎯 Goal
Let integrators customise the SDK's layout tokens (radii, padding, sizing, elevation) by overriding values on
Appearance.tokens.📝 Summary
Appearance.DesignSystemTokensfrom read-only computed properties to settablepublic lazy var, so individual values can be overridden.// MARK: -section headers (Button, Composer, Dark, Device, Icon, Light, Message, Radius, Spacing), matchingAppearance.ColorPalette.🛠 Implementation
DesignSystemTokensis already a@MainActor public final class. Switching the layout tokens from computedvar { … }tolazy var = …keeps each default (which references foundation constants or other tokens) while making them assignable — e.g.Appearance.default.tokens.messageBubbleRadiusAttachment = 20.lazyis required because the defaults reference other instance members.design-system-tokensrepo; the generator was updated with the samelazy var+ grouping change so future regenerations stay in sync.🎨 Showcase
N/A — no visual change; this exposes customisation points.
🧪 Manual Testing Notes
Override a token before first use and confirm the UI reflects it, e.g. set
Appearance.default.tokens.messageBubbleRadiusAttachment = 0and observe attachment bubble corners become square.☑️ Contributor Checklist
docs-contentrepoSummary by CodeRabbit